sqlew 3.6.9 → 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.
Files changed (383) hide show
  1. package/CHANGELOG.md +398 -1
  2. package/README.md +58 -39
  3. package/assets/config.example.toml +93 -0
  4. package/assets/kanban-visualizer.png +0 -0
  5. package/assets/sample-agents/sqlew-architect.md +32 -13
  6. package/assets/sample-agents/sqlew-researcher.md +70 -17
  7. package/assets/sample-agents/sqlew-scrum-master.md +60 -25
  8. package/assets/schema.sql +2 -2
  9. package/dist/adapters/auth/auth-factory.d.ts +86 -0
  10. package/dist/adapters/auth/auth-factory.d.ts.map +1 -0
  11. package/dist/adapters/auth/auth-factory.js +103 -0
  12. package/dist/adapters/auth/auth-factory.js.map +1 -0
  13. package/dist/adapters/auth/auth-types.d.ts +30 -0
  14. package/dist/adapters/auth/auth-types.d.ts.map +1 -0
  15. package/dist/adapters/auth/auth-types.js +30 -0
  16. package/dist/adapters/auth/auth-types.js.map +1 -0
  17. package/dist/adapters/auth/base-auth-provider.d.ts +327 -0
  18. package/dist/adapters/auth/base-auth-provider.d.ts.map +1 -0
  19. package/dist/adapters/auth/base-auth-provider.js +111 -0
  20. package/dist/adapters/auth/base-auth-provider.js.map +1 -0
  21. package/dist/adapters/auth/direct-auth-provider.d.ts +356 -0
  22. package/dist/adapters/auth/direct-auth-provider.d.ts.map +1 -0
  23. package/dist/adapters/auth/direct-auth-provider.js +406 -0
  24. package/dist/adapters/auth/direct-auth-provider.js.map +1 -0
  25. package/dist/adapters/base-adapter.d.ts +638 -0
  26. package/dist/adapters/base-adapter.d.ts.map +1 -0
  27. package/dist/adapters/base-adapter.js +557 -0
  28. package/dist/adapters/base-adapter.js.map +1 -0
  29. package/dist/adapters/index.d.ts +13 -2
  30. package/dist/adapters/index.d.ts.map +1 -1
  31. package/dist/adapters/index.js +27 -5
  32. package/dist/adapters/index.js.map +1 -1
  33. package/dist/adapters/mysql-adapter.d.ts +547 -6
  34. package/dist/adapters/mysql-adapter.d.ts.map +1 -1
  35. package/dist/adapters/mysql-adapter.js +651 -32
  36. package/dist/adapters/mysql-adapter.js.map +1 -1
  37. package/dist/adapters/postgresql-adapter.d.ts +15 -4
  38. package/dist/adapters/postgresql-adapter.d.ts.map +1 -1
  39. package/dist/adapters/postgresql-adapter.js +19 -2
  40. package/dist/adapters/postgresql-adapter.js.map +1 -1
  41. package/dist/adapters/sqlite-adapter.d.ts +35 -5
  42. package/dist/adapters/sqlite-adapter.d.ts.map +1 -1
  43. package/dist/adapters/sqlite-adapter.js +57 -18
  44. package/dist/adapters/sqlite-adapter.js.map +1 -1
  45. package/dist/cli/db-dump.d.ts +32 -0
  46. package/dist/cli/db-dump.d.ts.map +1 -0
  47. package/dist/cli/db-dump.js +409 -0
  48. package/dist/cli/db-dump.js.map +1 -0
  49. package/dist/cli.js +24 -14
  50. package/dist/cli.js.map +1 -1
  51. package/dist/config/example-generator.d.ts.map +1 -1
  52. package/dist/config/example-generator.js +4 -3
  53. package/dist/config/example-generator.js.map +1 -1
  54. package/dist/config/knex/bootstrap/20251025020452_create_master_tables.d.ts.map +1 -0
  55. package/dist/{migrations → config}/knex/bootstrap/20251025020452_create_master_tables.js +7 -2
  56. package/dist/config/knex/bootstrap/20251025020452_create_master_tables.js.map +1 -0
  57. package/dist/config/knex/bootstrap/20251025021152_create_transaction_tables.d.ts.map +1 -0
  58. package/dist/{migrations → config}/knex/bootstrap/20251025021152_create_transaction_tables.js +49 -50
  59. package/dist/config/knex/bootstrap/20251025021152_create_transaction_tables.js.map +1 -0
  60. package/dist/config/knex/bootstrap/20251025021351_create_indexes.d.ts.map +1 -0
  61. package/dist/config/knex/bootstrap/20251025021351_create_indexes.js.map +1 -0
  62. package/dist/config/knex/bootstrap/20251025021416_seed_master_data.d.ts.map +1 -0
  63. package/dist/{migrations → config}/knex/bootstrap/20251025021416_seed_master_data.js +11 -6
  64. package/dist/config/knex/bootstrap/20251025021416_seed_master_data.js.map +1 -0
  65. package/dist/config/knex/bootstrap/20251025070349_create_views.d.ts.map +1 -0
  66. package/dist/{migrations → config}/knex/bootstrap/20251025070349_create_views.js +66 -14
  67. package/dist/config/knex/bootstrap/20251025070349_create_views.js.map +1 -0
  68. package/dist/config/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.d.ts.map +1 -0
  69. package/dist/config/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.js +22 -0
  70. package/dist/config/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.js.map +1 -0
  71. package/dist/config/knex/enhancements/20251025082220_fix_task_dependencies_columns.d.ts.map +1 -0
  72. package/dist/config/knex/enhancements/20251025082220_fix_task_dependencies_columns.js.map +1 -0
  73. package/dist/config/knex/enhancements/20251025090000_create_help_system_tables.d.ts.map +1 -0
  74. package/dist/{migrations → config}/knex/enhancements/20251025090000_create_help_system_tables.js +6 -0
  75. package/dist/config/knex/enhancements/20251025090000_create_help_system_tables.js.map +1 -0
  76. package/dist/config/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.d.ts.map +1 -0
  77. package/dist/{migrations → config}/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.js +6 -0
  78. package/dist/config/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.js.map +1 -0
  79. package/dist/config/knex/enhancements/20251025100000_seed_help_metadata.d.ts.map +1 -0
  80. package/dist/{migrations → config}/knex/enhancements/20251025100000_seed_help_metadata.js +6 -0
  81. package/dist/config/knex/enhancements/20251025100000_seed_help_metadata.js.map +1 -0
  82. package/dist/config/knex/enhancements/20251025100100_seed_remaining_use_cases.d.ts.map +1 -0
  83. package/dist/config/knex/enhancements/20251025100100_seed_remaining_use_cases.js.map +1 -0
  84. package/dist/config/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.d.ts.map +1 -0
  85. package/dist/{migrations → config}/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.js +7 -0
  86. package/dist/config/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.js.map +1 -0
  87. package/dist/config/knex/enhancements/20251027000000_add_agent_reuse_system.d.ts.map +1 -0
  88. package/dist/config/knex/enhancements/20251027000000_add_agent_reuse_system.js +62 -0
  89. package/dist/config/knex/enhancements/20251027000000_add_agent_reuse_system.js.map +1 -0
  90. package/dist/config/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.d.ts.map +1 -0
  91. package/dist/config/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.js.map +1 -0
  92. package/dist/config/knex/enhancements/20251027020000_update_agent_reusability.d.ts.map +1 -0
  93. package/dist/{migrations → config}/knex/enhancements/20251027020000_update_agent_reusability.js +6 -0
  94. package/dist/config/knex/enhancements/20251027020000_update_agent_reusability.js.map +1 -0
  95. package/dist/config/knex/enhancements/20251028000000_simplify_agent_system.d.ts.map +1 -0
  96. package/dist/{migrations → config}/knex/enhancements/20251028000000_simplify_agent_system.js +6 -0
  97. package/dist/config/knex/enhancements/20251028000000_simplify_agent_system.js.map +1 -0
  98. package/dist/config/knex/enhancements/20251031000000_drop_orphaned_message_view.d.ts +13 -0
  99. package/dist/config/knex/enhancements/20251031000000_drop_orphaned_message_view.d.ts.map +1 -0
  100. package/dist/config/knex/enhancements/20251031000000_drop_orphaned_message_view.js +48 -0
  101. package/dist/config/knex/enhancements/20251031000000_drop_orphaned_message_view.js.map +1 -0
  102. package/dist/config/knex/enhancements/20251104000003_rename_constraints_created_by_to_agent_id.d.ts +24 -0
  103. package/dist/config/knex/enhancements/20251104000003_rename_constraints_created_by_to_agent_id.d.ts.map +1 -0
  104. package/dist/config/knex/enhancements/20251104000003_rename_constraints_created_by_to_agent_id.js +189 -0
  105. package/dist/config/knex/enhancements/20251104000003_rename_constraints_created_by_to_agent_id.js.map +1 -0
  106. package/dist/config/knex/enhancements/20251105000000_add_token_usage_table.d.ts +16 -0
  107. package/dist/config/knex/enhancements/20251105000000_add_token_usage_table.d.ts.map +1 -0
  108. package/dist/config/knex/enhancements/20251105000000_add_token_usage_table.js +65 -0
  109. package/dist/config/knex/enhancements/20251105000000_add_token_usage_table.js.map +1 -0
  110. package/dist/config/knex/enhancements/20251105000001_rename_decision_context_decided_by_to_agent_id.d.ts +23 -0
  111. package/dist/config/knex/enhancements/20251105000001_rename_decision_context_decided_by_to_agent_id.d.ts.map +1 -0
  112. package/dist/config/knex/enhancements/20251105000001_rename_decision_context_decided_by_to_agent_id.js +118 -0
  113. package/dist/config/knex/enhancements/20251105000001_rename_decision_context_decided_by_to_agent_id.js.map +1 -0
  114. package/dist/config/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.d.ts.map +1 -0
  115. package/dist/config/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.js.map +1 -0
  116. package/dist/config/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.d.ts.map +1 -0
  117. package/dist/config/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.js.map +1 -0
  118. package/dist/config/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.d.ts.map +1 -0
  119. package/dist/config/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.js.map +1 -0
  120. package/dist/config/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.d.ts.map +1 -0
  121. package/dist/config/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.js.map +1 -0
  122. package/dist/config/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.d.ts.map +1 -0
  123. package/dist/config/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.js.map +1 -0
  124. package/dist/config/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.d.ts.map +1 -0
  125. package/dist/config/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.js.map +1 -0
  126. package/dist/config/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.d.ts.map +1 -0
  127. package/dist/config/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.js.map +1 -0
  128. package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.d.ts +49 -0
  129. package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.d.ts.map +1 -0
  130. package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.js +864 -0
  131. package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.js.map +1 -0
  132. package/dist/config/loader.d.ts +23 -3
  133. package/dist/config/loader.d.ts.map +1 -1
  134. package/dist/config/loader.js +155 -8
  135. package/dist/config/loader.js.map +1 -1
  136. package/dist/config/types.d.ts +261 -2
  137. package/dist/config/types.d.ts.map +1 -1
  138. package/dist/config/types.js.map +1 -1
  139. package/dist/config/writer.d.ts +65 -0
  140. package/dist/config/writer.d.ts.map +1 -0
  141. package/dist/config/writer.js +139 -0
  142. package/dist/config/writer.js.map +1 -0
  143. package/dist/database.d.ts +11 -2
  144. package/dist/database.d.ts.map +1 -1
  145. package/dist/database.js +65 -8
  146. package/dist/database.js.map +1 -1
  147. package/dist/index.js +186 -32
  148. package/dist/index.js.map +1 -1
  149. package/dist/knexfile.d.ts.map +1 -1
  150. package/dist/knexfile.js +88 -12
  151. package/dist/knexfile.js.map +1 -1
  152. package/dist/tests/all-features.test.js +15 -3
  153. package/dist/tests/all-features.test.js.map +1 -1
  154. package/dist/tests/config-loader.test.d.ts +6 -0
  155. package/dist/tests/config-loader.test.d.ts.map +1 -0
  156. package/dist/tests/config-loader.test.js +201 -0
  157. package/dist/tests/config-loader.test.js.map +1 -0
  158. package/dist/tests/connection-manager-integration.test.d.ts +2 -0
  159. package/dist/tests/connection-manager-integration.test.d.ts.map +1 -0
  160. package/dist/tests/connection-manager-integration.test.js +431 -0
  161. package/dist/tests/connection-manager-integration.test.js.map +1 -0
  162. package/dist/tests/connection-manager.test.d.ts +2 -0
  163. package/dist/tests/connection-manager.test.d.ts.map +1 -0
  164. package/dist/tests/connection-manager.test.js +361 -0
  165. package/dist/tests/connection-manager.test.js.map +1 -0
  166. package/dist/tests/dump-import.test.d.ts +15 -0
  167. package/dist/tests/dump-import.test.d.ts.map +1 -0
  168. package/dist/tests/dump-import.test.js +430 -0
  169. package/dist/tests/dump-import.test.js.map +1 -0
  170. package/dist/tests/migration-idempotency.test.d.ts +2 -0
  171. package/dist/tests/migration-idempotency.test.d.ts.map +1 -0
  172. package/dist/tests/migration-idempotency.test.js +330 -0
  173. package/dist/tests/migration-idempotency.test.js.map +1 -0
  174. package/dist/tests/migration-upgrade-paths.test.d.ts +2 -0
  175. package/dist/tests/migration-upgrade-paths.test.d.ts.map +1 -0
  176. package/dist/tests/migration-upgrade-paths.test.js +248 -0
  177. package/dist/tests/migration-upgrade-paths.test.js.map +1 -0
  178. package/dist/tests/multi-project-migration.test.d.ts +17 -0
  179. package/dist/tests/multi-project-migration.test.d.ts.map +1 -0
  180. package/dist/tests/multi-project-migration.test.js +399 -0
  181. package/dist/tests/multi-project-migration.test.js.map +1 -0
  182. package/dist/tests/multi-project.test.d.ts +5 -0
  183. package/dist/tests/multi-project.test.d.ts.map +1 -0
  184. package/dist/tests/multi-project.test.js +238 -0
  185. package/dist/tests/multi-project.test.js.map +1 -0
  186. package/dist/tests/schema-migration.test.d.ts +8 -0
  187. package/dist/tests/schema-migration.test.d.ts.map +1 -0
  188. package/dist/tests/schema-migration.test.js +108 -0
  189. package/dist/tests/schema-migration.test.js.map +1 -0
  190. package/dist/tests/sql-dump-converters.test.d.ts +7 -0
  191. package/dist/tests/sql-dump-converters.test.d.ts.map +1 -0
  192. package/dist/tests/sql-dump-converters.test.js +314 -0
  193. package/dist/tests/sql-dump-converters.test.js.map +1 -0
  194. package/dist/tests/sql-dump-cross-database.test.d.ts +21 -0
  195. package/dist/tests/sql-dump-cross-database.test.d.ts.map +1 -0
  196. package/dist/tests/sql-dump-cross-database.test.js +314 -0
  197. package/dist/tests/sql-dump-cross-database.test.js.map +1 -0
  198. package/dist/tests/sql-dump-default-conversions.test.d.ts +8 -0
  199. package/dist/tests/sql-dump-default-conversions.test.d.ts.map +1 -0
  200. package/dist/tests/sql-dump-default-conversions.test.js +141 -0
  201. package/dist/tests/sql-dump-default-conversions.test.js.map +1 -0
  202. package/dist/tests/sql-dump-fk-constraints.test.d.ts +13 -0
  203. package/dist/tests/sql-dump-fk-constraints.test.d.ts.map +1 -0
  204. package/dist/tests/sql-dump-fk-constraints.test.js +381 -0
  205. package/dist/tests/sql-dump-fk-constraints.test.js.map +1 -0
  206. package/dist/tests/sql-dump-indexes.test.d.ts +12 -0
  207. package/dist/tests/sql-dump-indexes.test.d.ts.map +1 -0
  208. package/dist/tests/sql-dump-indexes.test.js +269 -0
  209. package/dist/tests/sql-dump-indexes.test.js.map +1 -0
  210. package/dist/tests/sql-dump-integration.test.d.ts +16 -0
  211. package/dist/tests/sql-dump-integration.test.d.ts.map +1 -0
  212. package/dist/tests/sql-dump-integration.test.js +342 -0
  213. package/dist/tests/sql-dump-integration.test.js.map +1 -0
  214. package/dist/tests/sql-dump-table-ordering.test.d.ts +8 -0
  215. package/dist/tests/sql-dump-table-ordering.test.d.ts.map +1 -0
  216. package/dist/tests/sql-dump-table-ordering.test.js +253 -0
  217. package/dist/tests/sql-dump-table-ordering.test.js.map +1 -0
  218. package/dist/tests/tasks.link-file-backward-compat.test.js +11 -1
  219. package/dist/tests/tasks.link-file-backward-compat.test.js.map +1 -1
  220. package/dist/tests/tasks.watch-files-action.test.js +11 -1
  221. package/dist/tests/tasks.watch-files-action.test.js.map +1 -1
  222. package/dist/tests/type-conversion.test.d.ts +8 -0
  223. package/dist/tests/type-conversion.test.d.ts.map +1 -0
  224. package/dist/tests/type-conversion.test.js +312 -0
  225. package/dist/tests/type-conversion.test.js.map +1 -0
  226. package/dist/tests/utils/test-helpers.d.ts +93 -0
  227. package/dist/tests/utils/test-helpers.d.ts.map +1 -0
  228. package/dist/tests/utils/test-helpers.js +407 -0
  229. package/dist/tests/utils/test-helpers.js.map +1 -0
  230. package/dist/tools/config.d.ts +58 -0
  231. package/dist/tools/config.d.ts.map +1 -0
  232. package/dist/tools/config.js +281 -0
  233. package/dist/tools/config.js.map +1 -0
  234. package/dist/tools/constraints.d.ts.map +1 -1
  235. package/dist/tools/constraints.js +138 -122
  236. package/dist/tools/constraints.js.map +1 -1
  237. package/dist/tools/context.d.ts.map +1 -1
  238. package/dist/tools/context.js +216 -109
  239. package/dist/tools/context.js.map +1 -1
  240. package/dist/tools/files.d.ts.map +1 -1
  241. package/dist/tools/files.js +123 -102
  242. package/dist/tools/files.js.map +1 -1
  243. package/dist/tools/tasks.d.ts.map +1 -1
  244. package/dist/tools/tasks.js +583 -521
  245. package/dist/tools/tasks.js.map +1 -1
  246. package/dist/tools/utils.d.ts +5 -0
  247. package/dist/tools/utils.d.ts.map +1 -1
  248. package/dist/tools/utils.js +176 -122
  249. package/dist/tools/utils.js.map +1 -1
  250. package/dist/types.d.ts +9 -26
  251. package/dist/types.d.ts.map +1 -1
  252. package/dist/utils/cleanup.d.ts +3 -0
  253. package/dist/utils/cleanup.d.ts.map +1 -1
  254. package/dist/utils/cleanup.js +14 -2
  255. package/dist/utils/cleanup.js.map +1 -1
  256. package/dist/utils/connection-manager.d.ts +59 -0
  257. package/dist/utils/connection-manager.d.ts.map +1 -0
  258. package/dist/utils/connection-manager.js +178 -0
  259. package/dist/utils/connection-manager.js.map +1 -0
  260. package/dist/utils/debug-logger.d.ts +8 -4
  261. package/dist/utils/debug-logger.d.ts.map +1 -1
  262. package/dist/utils/debug-logger.js +27 -7
  263. package/dist/utils/debug-logger.js.map +1 -1
  264. package/dist/utils/error-handler.d.ts +12 -2
  265. package/dist/utils/error-handler.d.ts.map +1 -1
  266. package/dist/utils/error-handler.js +22 -21
  267. package/dist/utils/error-handler.js.map +1 -1
  268. package/dist/utils/parameter-validator.d.ts.map +1 -1
  269. package/dist/utils/parameter-validator.js +36 -15
  270. package/dist/utils/parameter-validator.js.map +1 -1
  271. package/dist/utils/project-context.d.ts +111 -0
  272. package/dist/utils/project-context.d.ts.map +1 -0
  273. package/dist/utils/project-context.js +187 -0
  274. package/dist/utils/project-context.js.map +1 -0
  275. package/dist/utils/project-root.d.ts +79 -0
  276. package/dist/utils/project-root.d.ts.map +1 -0
  277. package/dist/utils/project-root.js +108 -0
  278. package/dist/utils/project-root.js.map +1 -0
  279. package/dist/utils/sql-dump-converters.d.ts +188 -0
  280. package/dist/utils/sql-dump-converters.d.ts.map +1 -0
  281. package/dist/utils/sql-dump-converters.js +311 -0
  282. package/dist/utils/sql-dump-converters.js.map +1 -0
  283. package/dist/utils/sql-dump.d.ts +102 -0
  284. package/dist/utils/sql-dump.d.ts.map +1 -0
  285. package/dist/utils/sql-dump.js +1550 -0
  286. package/dist/utils/sql-dump.js.map +1 -0
  287. package/dist/utils/vcs-adapter.d.ts +42 -0
  288. package/dist/utils/vcs-adapter.d.ts.map +1 -1
  289. package/dist/utils/vcs-adapter.js +154 -0
  290. package/dist/utils/vcs-adapter.js.map +1 -1
  291. package/dist/watcher/file-watcher.d.ts.map +1 -1
  292. package/dist/watcher/file-watcher.js +48 -49
  293. package/dist/watcher/file-watcher.js.map +1 -1
  294. package/dist/watcher/gitignore-parser.d.ts.map +1 -1
  295. package/dist/watcher/gitignore-parser.js +2 -1
  296. package/dist/watcher/gitignore-parser.js.map +1 -1
  297. package/docs/BASEADAPTER_IMPLEMENTATION.md +399 -0
  298. package/docs/DATABASE_AUTH.md +445 -0
  299. package/docs/DATABASE_MIGRATION.md +247 -0
  300. package/docs/MULTI_PROJECT_ARCHITECTURE.md +497 -0
  301. package/package.json +12 -4
  302. package/dist/migrations/knex/bootstrap/20251025020452_create_master_tables.d.ts.map +0 -1
  303. package/dist/migrations/knex/bootstrap/20251025020452_create_master_tables.js.map +0 -1
  304. package/dist/migrations/knex/bootstrap/20251025021152_create_transaction_tables.d.ts.map +0 -1
  305. package/dist/migrations/knex/bootstrap/20251025021152_create_transaction_tables.js.map +0 -1
  306. package/dist/migrations/knex/bootstrap/20251025021351_create_indexes.d.ts.map +0 -1
  307. package/dist/migrations/knex/bootstrap/20251025021351_create_indexes.js.map +0 -1
  308. package/dist/migrations/knex/bootstrap/20251025021416_seed_master_data.d.ts.map +0 -1
  309. package/dist/migrations/knex/bootstrap/20251025021416_seed_master_data.js.map +0 -1
  310. package/dist/migrations/knex/bootstrap/20251025070349_create_views.d.ts.map +0 -1
  311. package/dist/migrations/knex/bootstrap/20251025070349_create_views.js.map +0 -1
  312. package/dist/migrations/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.d.ts.map +0 -1
  313. package/dist/migrations/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.js +0 -15
  314. package/dist/migrations/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.js.map +0 -1
  315. package/dist/migrations/knex/enhancements/20251025082220_fix_task_dependencies_columns.d.ts.map +0 -1
  316. package/dist/migrations/knex/enhancements/20251025082220_fix_task_dependencies_columns.js.map +0 -1
  317. package/dist/migrations/knex/enhancements/20251025090000_create_help_system_tables.d.ts.map +0 -1
  318. package/dist/migrations/knex/enhancements/20251025090000_create_help_system_tables.js.map +0 -1
  319. package/dist/migrations/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.d.ts.map +0 -1
  320. package/dist/migrations/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.js.map +0 -1
  321. package/dist/migrations/knex/enhancements/20251025100000_seed_help_metadata.d.ts.map +0 -1
  322. package/dist/migrations/knex/enhancements/20251025100000_seed_help_metadata.js.map +0 -1
  323. package/dist/migrations/knex/enhancements/20251025100100_seed_remaining_use_cases.d.ts.map +0 -1
  324. package/dist/migrations/knex/enhancements/20251025100100_seed_remaining_use_cases.js.map +0 -1
  325. package/dist/migrations/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.d.ts.map +0 -1
  326. package/dist/migrations/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.js.map +0 -1
  327. package/dist/migrations/knex/enhancements/20251027000000_add_agent_reuse_system.d.ts.map +0 -1
  328. package/dist/migrations/knex/enhancements/20251027000000_add_agent_reuse_system.js +0 -34
  329. package/dist/migrations/knex/enhancements/20251027000000_add_agent_reuse_system.js.map +0 -1
  330. package/dist/migrations/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.d.ts.map +0 -1
  331. package/dist/migrations/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.js.map +0 -1
  332. package/dist/migrations/knex/enhancements/20251027020000_update_agent_reusability.d.ts.map +0 -1
  333. package/dist/migrations/knex/enhancements/20251027020000_update_agent_reusability.js.map +0 -1
  334. package/dist/migrations/knex/enhancements/20251028000000_simplify_agent_system.d.ts.map +0 -1
  335. package/dist/migrations/knex/enhancements/20251028000000_simplify_agent_system.js.map +0 -1
  336. package/dist/migrations/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.d.ts.map +0 -1
  337. package/dist/migrations/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.js.map +0 -1
  338. package/dist/migrations/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.d.ts.map +0 -1
  339. package/dist/migrations/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.js.map +0 -1
  340. package/dist/migrations/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.d.ts.map +0 -1
  341. package/dist/migrations/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.js.map +0 -1
  342. package/dist/migrations/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.d.ts.map +0 -1
  343. package/dist/migrations/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.js.map +0 -1
  344. package/dist/migrations/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.d.ts.map +0 -1
  345. package/dist/migrations/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.js.map +0 -1
  346. package/dist/migrations/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.d.ts.map +0 -1
  347. package/dist/migrations/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.js.map +0 -1
  348. package/dist/migrations/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.d.ts.map +0 -1
  349. package/dist/migrations/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.js.map +0 -1
  350. /package/dist/{migrations → config}/knex/bootstrap/20251025020452_create_master_tables.d.ts +0 -0
  351. /package/dist/{migrations → config}/knex/bootstrap/20251025021152_create_transaction_tables.d.ts +0 -0
  352. /package/dist/{migrations → config}/knex/bootstrap/20251025021351_create_indexes.d.ts +0 -0
  353. /package/dist/{migrations → config}/knex/bootstrap/20251025021351_create_indexes.js +0 -0
  354. /package/dist/{migrations → config}/knex/bootstrap/20251025021416_seed_master_data.d.ts +0 -0
  355. /package/dist/{migrations → config}/knex/bootstrap/20251025070349_create_views.d.ts +0 -0
  356. /package/dist/{migrations → config}/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.d.ts +0 -0
  357. /package/dist/{migrations → config}/knex/enhancements/20251025082220_fix_task_dependencies_columns.d.ts +0 -0
  358. /package/dist/{migrations → config}/knex/enhancements/20251025082220_fix_task_dependencies_columns.js +0 -0
  359. /package/dist/{migrations → config}/knex/enhancements/20251025090000_create_help_system_tables.d.ts +0 -0
  360. /package/dist/{migrations → config}/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.d.ts +0 -0
  361. /package/dist/{migrations → config}/knex/enhancements/20251025100000_seed_help_metadata.d.ts +0 -0
  362. /package/dist/{migrations → config}/knex/enhancements/20251025100100_seed_remaining_use_cases.d.ts +0 -0
  363. /package/dist/{migrations → config}/knex/enhancements/20251025100100_seed_remaining_use_cases.js +0 -0
  364. /package/dist/{migrations → config}/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.d.ts +0 -0
  365. /package/dist/{migrations → config}/knex/enhancements/20251027000000_add_agent_reuse_system.d.ts +0 -0
  366. /package/dist/{migrations → config}/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.d.ts +0 -0
  367. /package/dist/{migrations → config}/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.js +0 -0
  368. /package/dist/{migrations → config}/knex/enhancements/20251027020000_update_agent_reusability.d.ts +0 -0
  369. /package/dist/{migrations → config}/knex/enhancements/20251028000000_simplify_agent_system.d.ts +0 -0
  370. /package/dist/{migrations → config}/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.d.ts +0 -0
  371. /package/dist/{migrations → config}/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.js +0 -0
  372. /package/dist/{migrations → config}/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.d.ts +0 -0
  373. /package/dist/{migrations → config}/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.js +0 -0
  374. /package/dist/{migrations → config}/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.d.ts +0 -0
  375. /package/dist/{migrations → config}/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.js +0 -0
  376. /package/dist/{migrations → config}/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.d.ts +0 -0
  377. /package/dist/{migrations → config}/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.js +0 -0
  378. /package/dist/{migrations → config}/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.d.ts +0 -0
  379. /package/dist/{migrations → config}/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.js +0 -0
  380. /package/dist/{migrations → config}/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.d.ts +0 -0
  381. /package/dist/{migrations → config}/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.js +0 -0
  382. /package/dist/{migrations → config}/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.d.ts +0 -0
  383. /package/dist/{migrations → config}/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.js +0 -0
@@ -0,0 +1,557 @@
1
+ /**
2
+ * @fileoverview Base adapter for database connections with authentication integration.
3
+ *
4
+ * This module provides the foundation for all database adapters in the multi-RDBMS system.
5
+ * It integrates authentication providers (SSH tunneling, direct connections, cloud IAM) with
6
+ * Knex.js-based database connections, managing the complete connection lifecycle.
7
+ *
8
+ * **Key Responsibilities:**
9
+ * - Authentication provider integration via factory
10
+ * - Connection lifecycle management (connect → authenticate → establish → cleanup)
11
+ * - Knex.js instance management and access control
12
+ * - Transaction support delegation
13
+ * - Abstract methods for adapter-specific initialization
14
+ *
15
+ * **Connection Flow:**
16
+ * 1. Constructor: Initialize with DatabaseConfig
17
+ * 2. connect(): Authenticate via provider, establish Knex connection
18
+ * 3. initialize(): Adapter-specific setup (pragmas, schemas, etc.)
19
+ * 4. getKnex(): Access Knex instance for queries
20
+ * 5. disconnect(): Close Knex connection
21
+ * 6. cleanup(): Release authentication resources (tunnels, tokens)
22
+ *
23
+ * **Architecture:**
24
+ * ```
25
+ * BaseAdapter (abstract)
26
+ * ├── Authentication Layer: BaseAuthProvider integration
27
+ * ├── Connection Layer: Knex.js management
28
+ * └── Adapter-Specific: Abstract methods for subclasses
29
+ *
30
+ * Concrete Adapters:
31
+ * ├── SQLiteAdapter (no auth required)
32
+ * ├── PostgreSQLAdapter (with auth integration)
33
+ * └── MySQLAdapter (with auth integration)
34
+ * ```
35
+ *
36
+ * @module adapters/base-adapter
37
+ * @since v3.7.0
38
+ */
39
+ import knexLib from 'knex';
40
+ import { createAuthProvider } from './auth/auth-factory.js';
41
+ const { knex } = knexLib;
42
+ /**
43
+ * Abstract base class for database adapters with authentication integration.
44
+ *
45
+ * This class provides common functionality for all database adapters, integrating
46
+ * authentication providers with Knex.js connections. Subclasses implement
47
+ * database-specific features (SQLite pragmas, PostgreSQL settings, MySQL config).
48
+ *
49
+ * **Design Principles:**
50
+ * - Separation of concerns: Auth provider handles authentication, adapter handles DB operations
51
+ * - Lazy initialization: Knex instance created only after successful authentication
52
+ * - Resource safety: Explicit cleanup for both auth providers and DB connections
53
+ * - Fail-fast validation: Auth provider validates config before connection attempt
54
+ * - Backward compatibility: Maintains DatabaseAdapter interface contract
55
+ *
56
+ * **Authentication Integration:**
57
+ * - SQLite: No authentication provider (null), direct file connection
58
+ * - PostgreSQL/MySQL: Auth provider handles tunneling/IAM/direct auth
59
+ * - SSH tunneling: Provider establishes tunnel, returns localhost connection params
60
+ * - Cloud IAM: Provider generates temporary tokens, returns params with SSL config
61
+ *
62
+ * **Error Handling:**
63
+ * - Constructor: Config validation (throws if invalid)
64
+ * - connect(): Authentication failures, connection failures
65
+ * - getKnex(): Throws if called before connect()
66
+ * - cleanup(): Swallows errors to prevent cascading failures
67
+ *
68
+ * @abstract
69
+ * @implements {DatabaseAdapter}
70
+ *
71
+ * @example
72
+ * // Implementing a PostgreSQL adapter
73
+ * class PostgreSQLAdapter extends BaseAdapter {
74
+ * readonly supportsReturning = true;
75
+ * readonly supportsJSON = true;
76
+ * readonly databaseName = 'postgresql' as const;
77
+ *
78
+ * async initialize(): Promise<void> {
79
+ * const knex = this.getKnex();
80
+ * // PostgreSQL-specific initialization
81
+ * await knex.raw('SET statement_timeout = 30000');
82
+ * await knex.raw('SET timezone = "UTC"');
83
+ * }
84
+ *
85
+ * getDialect(): string {
86
+ * return 'pg';
87
+ * }
88
+ *
89
+ * // Implement other DatabaseAdapter methods...
90
+ * }
91
+ *
92
+ * @example
93
+ * // Using the adapter with authentication
94
+ * const config: DatabaseConfig = {
95
+ * type: 'postgres',
96
+ * connection: {
97
+ * host: 'db.internal',
98
+ * port: 5432,
99
+ * database: 'production'
100
+ * },
101
+ * auth: {
102
+ * type: 'ssh',
103
+ * user: 'postgres',
104
+ * password: 'secret',
105
+ * ssh: {
106
+ * host: 'bastion.example.com',
107
+ * username: 'deploy',
108
+ * privateKeyPath: '/path/to/key.pem'
109
+ * }
110
+ * }
111
+ * };
112
+ *
113
+ * const adapter = new PostgreSQLAdapter(config);
114
+ * try {
115
+ * await adapter.connect();
116
+ * const knex = adapter.getKnex();
117
+ * const users = await knex('users').select('*');
118
+ * console.log(users);
119
+ * } finally {
120
+ * await adapter.disconnect();
121
+ * await adapter.cleanup();
122
+ * }
123
+ *
124
+ * @example
125
+ * // Transaction support
126
+ * const adapter = new PostgreSQLAdapter(config);
127
+ * await adapter.connect();
128
+ *
129
+ * try {
130
+ * await adapter.transaction(async (trx) => {
131
+ * await trx('accounts').where({ id: 1 }).update({ balance: 100 });
132
+ * await trx('accounts').where({ id: 2 }).update({ balance: 200 });
133
+ * });
134
+ * } finally {
135
+ * await adapter.disconnect();
136
+ * await adapter.cleanup();
137
+ * }
138
+ *
139
+ * @example
140
+ * // SQLite adapter (no authentication)
141
+ * class SQLiteAdapter extends BaseAdapter {
142
+ * async connect(): Promise<Knex> {
143
+ * // SQLite doesn't need authentication provider
144
+ * // Override connect to bypass auth flow
145
+ * const config: Knex.Config = {
146
+ * client: 'better-sqlite3',
147
+ * connection: {
148
+ * filename: this.config.connection.database
149
+ * },
150
+ * useNullAsDefault: true
151
+ * };
152
+ *
153
+ * this.knex = knex(config);
154
+ * await this.initialize();
155
+ * return this.knex;
156
+ * }
157
+ *
158
+ * getDialect(): string {
159
+ * return 'sqlite3';
160
+ * }
161
+ * }
162
+ */
163
+ export class BaseAdapter {
164
+ /**
165
+ * Database configuration containing connection and authentication settings.
166
+ * @protected
167
+ * @readonly
168
+ */
169
+ config;
170
+ /**
171
+ * Authentication provider instance for handling credentials, tunnels, and tokens.
172
+ * Null for databases that don't require authentication (e.g., SQLite).
173
+ * @protected
174
+ */
175
+ authProvider = null;
176
+ /**
177
+ * Knex.js instance for database operations.
178
+ * Null until connect() is called successfully.
179
+ * @protected
180
+ */
181
+ knexInstance = null;
182
+ /**
183
+ * Creates a new database adapter instance.
184
+ *
185
+ * @param {DatabaseConfig} config - Database configuration object
186
+ *
187
+ * @throws {Error} If database type is unsupported
188
+ *
189
+ * @example
190
+ * const adapter = new PostgreSQLAdapter({
191
+ * type: 'postgres',
192
+ * connection: { host: 'localhost', port: 5432, database: 'mydb' },
193
+ * auth: { type: 'direct', user: 'postgres', password: 'postgres' }
194
+ * });
195
+ */
196
+ constructor(config) {
197
+ this.config = config;
198
+ }
199
+ // ============================================================================
200
+ // Connection Management
201
+ // ============================================================================
202
+ /**
203
+ * Establishes database connection with authentication.
204
+ *
205
+ * This method orchestrates the complete connection flow:
206
+ * 1. Create authentication provider (if required)
207
+ * 2. Validate authentication configuration
208
+ * 3. Authenticate and obtain connection parameters
209
+ * 4. Create Knex instance with authenticated params
210
+ * 5. Call initialize() for adapter-specific setup
211
+ *
212
+ * **Authentication Flow:**
213
+ * - Direct: Use credentials as-is
214
+ * - SSH: Establish tunnel, connect to localhost
215
+ * - AWS/GCP IAM: Generate token, connect with SSL
216
+ *
217
+ * **Important Notes:**
218
+ * - This method is idempotent: calling twice reuses existing connection
219
+ * - Auth provider resources remain allocated until cleanup() is called
220
+ * - Knex instance is accessible via getKnex() after successful connection
221
+ * - Subclasses can override for special handling (e.g., SQLite)
222
+ *
223
+ * @returns {Promise<Knex>} Knex instance for database operations
224
+ *
225
+ * @throws {Error} 'Database already connected' - if connection exists
226
+ * @throws {Error} Auth provider validation errors
227
+ * @throws {Error} Authentication failures (invalid credentials, network issues)
228
+ * @throws {Error} Knex connection failures (database unreachable, invalid database name)
229
+ * @throws {Error} Initialization failures (adapter-specific setup errors)
230
+ *
231
+ * @example
232
+ * // Standard usage
233
+ * const adapter = new PostgreSQLAdapter(config);
234
+ * try {
235
+ * const knex = await adapter.connect();
236
+ * console.log('Connected successfully');
237
+ * } catch (error) {
238
+ * console.error('Connection failed:', error.message);
239
+ * await adapter.cleanup();
240
+ * throw error;
241
+ * }
242
+ *
243
+ * @example
244
+ * // Idempotent connection
245
+ * const adapter = new PostgreSQLAdapter(config);
246
+ * const knex1 = await adapter.connect(); // Establishes connection
247
+ * const knex2 = await adapter.connect(); // Returns same instance
248
+ * console.log(knex1 === knex2); // true
249
+ */
250
+ async connect() {
251
+ // Idempotent: return existing connection if already established
252
+ if (this.knexInstance) {
253
+ return this.knexInstance;
254
+ }
255
+ // Create authentication provider (null for SQLite)
256
+ this.authProvider = createAuthProvider(this.config);
257
+ // Authenticate and get connection parameters
258
+ let connParams = null;
259
+ if (this.authProvider !== null) {
260
+ // Validate authentication configuration
261
+ this.authProvider.validate();
262
+ // Authenticate to get connection parameters
263
+ connParams = await this.authProvider.authenticate();
264
+ }
265
+ // Build Knex configuration
266
+ const knexConfig = this.buildKnexConfig(connParams);
267
+ // Create Knex instance
268
+ this.knexInstance = knex(knexConfig);
269
+ // Perform adapter-specific initialization
270
+ await this.initialize();
271
+ return this.knexInstance;
272
+ }
273
+ /**
274
+ * Closes the database connection.
275
+ *
276
+ * This method closes the Knex connection pool, releasing all database connections.
277
+ * It does NOT release authentication provider resources (SSH tunnels, tokens) -
278
+ * call cleanup() to release those.
279
+ *
280
+ * **Resource Lifecycle:**
281
+ * - disconnect() → Closes Knex connection pool
282
+ * - cleanup() → Releases auth provider resources (tunnels, tokens)
283
+ * - Both must be called for complete cleanup
284
+ *
285
+ * **Important Notes:**
286
+ * - This method is idempotent: safe to call multiple times
287
+ * - Pending queries are allowed to complete before closing
288
+ * - After disconnect(), getKnex() will throw an error
289
+ * - Auth provider resources remain allocated until cleanup()
290
+ *
291
+ * @returns {Promise<void>}
292
+ *
293
+ * @example
294
+ * // Complete cleanup flow
295
+ * const adapter = new PostgreSQLAdapter(config);
296
+ * try {
297
+ * await adapter.connect();
298
+ * // ... use database ...
299
+ * } finally {
300
+ * await adapter.disconnect(); // Close DB connection
301
+ * await adapter.cleanup(); // Release auth resources
302
+ * }
303
+ *
304
+ * @example
305
+ * // Idempotent disconnect
306
+ * await adapter.disconnect(); // Closes connection
307
+ * await adapter.disconnect(); // Safe - no-op
308
+ */
309
+ async disconnect() {
310
+ if (this.knexInstance) {
311
+ await this.knexInstance.destroy();
312
+ this.knexInstance = null;
313
+ }
314
+ }
315
+ /**
316
+ * Releases authentication provider resources.
317
+ *
318
+ * This method releases resources allocated during authentication:
319
+ * - SSH tunnels: Closes SSH connection and releases local port
320
+ * - Cloud IAM: Invalidates cached tokens
321
+ * - Direct connections: No-op (no resources to release)
322
+ *
323
+ * **Important Notes:**
324
+ * - This method MUST be called after disconnect() to prevent resource leaks
325
+ * - Errors during cleanup are caught and logged, not thrown
326
+ * - This method is idempotent: safe to call multiple times
327
+ * - Auth provider is set to null after cleanup
328
+ *
329
+ * **Resource Leak Prevention:**
330
+ * Always call cleanup() in a finally block to ensure resources are released
331
+ * even if database operations fail.
332
+ *
333
+ * @returns {Promise<void>}
334
+ *
335
+ * @example
336
+ * // Proper cleanup flow
337
+ * const adapter = new PostgreSQLAdapter(config);
338
+ * try {
339
+ * await adapter.connect();
340
+ * // ... database operations ...
341
+ * } finally {
342
+ * await adapter.disconnect();
343
+ * await adapter.cleanup();
344
+ * }
345
+ *
346
+ * @example
347
+ * // Error handling during cleanup
348
+ * try {
349
+ * await adapter.cleanup();
350
+ * } catch (error) {
351
+ * // Cleanup errors are logged but not thrown to prevent cascading failures
352
+ * console.error('Cleanup failed:', error);
353
+ * }
354
+ */
355
+ async cleanup() {
356
+ if (this.authProvider) {
357
+ try {
358
+ await this.authProvider.cleanup();
359
+ }
360
+ catch (error) {
361
+ // Log cleanup errors but don't throw - connection is already closed
362
+ console.error('Auth provider cleanup failed:', error);
363
+ }
364
+ this.authProvider = null;
365
+ }
366
+ }
367
+ /**
368
+ * Returns the Knex.js instance for database operations.
369
+ *
370
+ * This method provides access to the underlying Knex instance for executing
371
+ * queries, building query chains, and accessing raw connections.
372
+ *
373
+ * **Important Notes:**
374
+ * - Must call connect() before calling this method
375
+ * - Throws error if connection not established
376
+ * - Returns same instance across multiple calls
377
+ *
378
+ * @returns {Knex} Knex instance for database operations
379
+ *
380
+ * @throws {Error} 'Database not connected. Call connect() first.' - if not connected
381
+ *
382
+ * @example
383
+ * // Standard usage
384
+ * const adapter = new PostgreSQLAdapter(config);
385
+ * await adapter.connect();
386
+ * const knex = adapter.getKnex();
387
+ * const users = await knex('users').select('*');
388
+ *
389
+ * @example
390
+ * // Query builder
391
+ * const knex = adapter.getKnex();
392
+ * const query = knex('orders')
393
+ * .where('status', 'pending')
394
+ * .andWhere('created_at', '>', '2024-01-01')
395
+ * .orderBy('created_at', 'desc');
396
+ *
397
+ * @example
398
+ * // Raw queries
399
+ * const knex = adapter.getKnex();
400
+ * const result = await knex.raw('SELECT * FROM users WHERE id = ?', [userId]);
401
+ */
402
+ getKnex() {
403
+ if (!this.knexInstance) {
404
+ throw new Error('Database not connected. Call connect() first.');
405
+ }
406
+ return this.knexInstance;
407
+ }
408
+ // ============================================================================
409
+ // Transaction Support
410
+ // ============================================================================
411
+ /**
412
+ * Executes a callback within a database transaction.
413
+ *
414
+ * This method delegates to Knex's transaction management, providing:
415
+ * - Automatic commit on success
416
+ * - Automatic rollback on error
417
+ * - Optional isolation level configuration
418
+ *
419
+ * **Transaction Isolation Levels:**
420
+ * - 'serializable': Strongest isolation, prevents all anomalies
421
+ * - 'repeatable read': Prevents non-repeatable reads and phantom reads
422
+ * - 'read committed': Prevents dirty reads (default for most databases)
423
+ *
424
+ * **Important Notes:**
425
+ * - All database operations within callback must use the trx parameter
426
+ * - Do not mix transaction queries with non-transaction queries
427
+ * - Nested transactions use savepoints (if supported by database)
428
+ *
429
+ * @param {Function} callback - Async function receiving transaction object
430
+ * @param {Object} [options] - Transaction options
431
+ * @param {string} [options.isolationLevel] - Transaction isolation level
432
+ * @returns {Promise<T>} Result from callback function
433
+ *
434
+ * @throws {Error} If callback throws (transaction is rolled back)
435
+ *
436
+ * @example
437
+ * // Bank transfer transaction
438
+ * await adapter.transaction(async (trx) => {
439
+ * await trx('accounts')
440
+ * .where({ id: fromAccount })
441
+ * .decrement('balance', amount);
442
+ *
443
+ * await trx('accounts')
444
+ * .where({ id: toAccount })
445
+ * .increment('balance', amount);
446
+ *
447
+ * await trx('transfers').insert({
448
+ * from_account: fromAccount,
449
+ * to_account: toAccount,
450
+ * amount
451
+ * });
452
+ * });
453
+ *
454
+ * @example
455
+ * // Transaction with isolation level
456
+ * await adapter.transaction(async (trx) => {
457
+ * const balance = await trx('accounts')
458
+ * .where({ id: accountId })
459
+ * .first('balance');
460
+ *
461
+ * if (balance.balance >= amount) {
462
+ * await trx('accounts')
463
+ * .where({ id: accountId })
464
+ * .decrement('balance', amount);
465
+ * }
466
+ * }, { isolationLevel: 'serializable' });
467
+ *
468
+ * @example
469
+ * // Error handling (automatic rollback)
470
+ * try {
471
+ * await adapter.transaction(async (trx) => {
472
+ * await trx('users').insert({ name: 'Alice' });
473
+ * throw new Error('Something went wrong');
474
+ * await trx('logs').insert({ message: 'Never executed' });
475
+ * });
476
+ * } catch (error) {
477
+ * console.log('Transaction rolled back:', error.message);
478
+ * }
479
+ */
480
+ async transaction(callback, options) {
481
+ const knex = this.getKnex();
482
+ return await knex.transaction(callback, options);
483
+ }
484
+ // ============================================================================
485
+ // Protected Helper Methods
486
+ // ============================================================================
487
+ /**
488
+ * Builds Knex configuration from connection parameters.
489
+ *
490
+ * This method converts ConnectionParams (returned by auth provider) into
491
+ * Knex.Config format. Subclasses can override to customize configuration.
492
+ *
493
+ * **Default Behavior:**
494
+ * - Uses dialect from getDialect()
495
+ * - Passes connection params to Knex
496
+ * - Configures SSL if present
497
+ * - Merges additional params
498
+ *
499
+ * @protected
500
+ * @param {ConnectionParams | null} connParams - Connection parameters from auth provider
501
+ * @returns {Knex.Config} Knex configuration object
502
+ *
503
+ * @example
504
+ * // Custom configuration in subclass
505
+ * protected buildKnexConfig(connParams: ConnectionParams | null): Knex.Config {
506
+ * const baseConfig = super.buildKnexConfig(connParams);
507
+ * return {
508
+ * ...baseConfig,
509
+ * pool: {
510
+ * min: 2,
511
+ * max: 10,
512
+ * afterCreate: (conn, done) => {
513
+ * // Custom connection setup
514
+ * done(null, conn);
515
+ * }
516
+ * }
517
+ * };
518
+ * }
519
+ */
520
+ buildKnexConfig(connParams) {
521
+ if (!connParams) {
522
+ // SQLite or other file-based databases
523
+ return {
524
+ client: this.getDialect(),
525
+ connection: {
526
+ filename: this.config.connection.database,
527
+ },
528
+ useNullAsDefault: true,
529
+ };
530
+ }
531
+ // Client-server databases with authentication
532
+ const connectionConfig = {
533
+ host: connParams.host,
534
+ port: connParams.port,
535
+ database: connParams.database,
536
+ user: connParams.user,
537
+ };
538
+ // Add password if present
539
+ if (connParams.password) {
540
+ connectionConfig.password = connParams.password;
541
+ }
542
+ // Add SSL configuration if present
543
+ if (connParams.ssl) {
544
+ connectionConfig.ssl = connParams.ssl;
545
+ }
546
+ // Merge additional parameters
547
+ if (connParams.additionalParams) {
548
+ Object.assign(connectionConfig, connParams.additionalParams);
549
+ }
550
+ return {
551
+ client: this.getDialect(),
552
+ connection: connectionConfig,
553
+ useNullAsDefault: this.getDialect() === 'sqlite3',
554
+ };
555
+ }
556
+ }
557
+ //# sourceMappingURL=base-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-adapter.js","sourceRoot":"","sources":["../../src/adapters/base-adapter.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,22 @@
1
1
  export type { DatabaseAdapter } from './types.js';
2
+ export type { DatabaseConfig, AuthConfig, SSLConfig, ConnectionConfig } from '../config/types.js';
3
+ export { BaseAdapter } from './base-adapter.js';
2
4
  import { SQLiteAdapter } from './sqlite-adapter.js';
3
5
  import { PostgreSQLAdapter } from './postgresql-adapter.js';
4
6
  import { MySQLAdapter } from './mysql-adapter.js';
5
7
  import type { DatabaseAdapter } from './types.js';
8
+ import type { DatabaseConfig } from '../config/types.js';
6
9
  export { SQLiteAdapter, PostgreSQLAdapter, MySQLAdapter };
7
10
  /**
8
- * Factory function to create database adapter
11
+ * Factory function to create database adapter.
12
+ *
13
+ * NOTE: This factory maintains backward compatibility with the old signature
14
+ * that only accepts database type. For new code with authentication, create
15
+ * adapters directly with DatabaseConfig.
16
+ *
17
+ * @param databaseType - Database type identifier
18
+ * @param config - Optional database configuration (for new auth-aware code)
19
+ * @returns Database adapter instance
9
20
  */
10
- export declare function createDatabaseAdapter(databaseType: 'sqlite' | 'postgresql' | 'mysql'): DatabaseAdapter;
21
+ export declare function createDatabaseAdapter(databaseType: 'sqlite' | 'postgresql' | 'mysql', config?: DatabaseConfig): DatabaseAdapter;
11
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAEA,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,YAAY,EAAE,CAAC;AAE1D;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,QAAQ,GAAG,YAAY,GAAG,OAAO,GAC9C,eAAe,CAWjB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAEA,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGlG,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,YAAY,EAAE,CAAC;AAE1D;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,QAAQ,GAAG,YAAY,GAAG,OAAO,EAC/C,MAAM,CAAC,EAAE,cAAc,GACtB,eAAe,CAwBjB"}
@@ -1,19 +1,41 @@
1
+ // Export base adapter
2
+ export { BaseAdapter } from './base-adapter.js';
1
3
  // Import adapter implementations
2
4
  import { SQLiteAdapter } from './sqlite-adapter.js';
3
5
  import { PostgreSQLAdapter } from './postgresql-adapter.js';
4
6
  import { MySQLAdapter } from './mysql-adapter.js';
5
7
  export { SQLiteAdapter, PostgreSQLAdapter, MySQLAdapter };
6
8
  /**
7
- * Factory function to create database adapter
9
+ * Factory function to create database adapter.
10
+ *
11
+ * NOTE: This factory maintains backward compatibility with the old signature
12
+ * that only accepts database type. For new code with authentication, create
13
+ * adapters directly with DatabaseConfig.
14
+ *
15
+ * @param databaseType - Database type identifier
16
+ * @param config - Optional database configuration (for new auth-aware code)
17
+ * @returns Database adapter instance
8
18
  */
9
- export function createDatabaseAdapter(databaseType) {
19
+ export function createDatabaseAdapter(databaseType, config) {
20
+ // Build default config if not provided (backward compatibility)
21
+ const defaultConfig = config || {
22
+ type: databaseType === 'postgresql' ? 'postgres' : databaseType,
23
+ connection: {
24
+ host: '',
25
+ port: 0,
26
+ database: '',
27
+ },
28
+ auth: {
29
+ type: 'direct',
30
+ },
31
+ };
10
32
  switch (databaseType) {
11
33
  case 'sqlite':
12
- return new SQLiteAdapter();
34
+ return new SQLiteAdapter(defaultConfig);
13
35
  case 'postgresql':
14
- return new PostgreSQLAdapter();
36
+ return new PostgreSQLAdapter(defaultConfig);
15
37
  case 'mysql':
16
- return new MySQLAdapter();
38
+ return new MySQLAdapter(defaultConfig);
17
39
  default:
18
40
  throw new Error(`Unsupported database type: ${databaseType}`);
19
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAIA,iCAAiC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,YAAY,EAAE,CAAC;AAE1D;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,YAA+C;IAE/C,QAAQ,YAAY,EAAE,CAAC;QACrB,KAAK,QAAQ;YACX,OAAO,IAAI,aAAa,EAAE,CAAC;QAC7B,KAAK,YAAY;YACf,OAAO,IAAI,iBAAiB,EAAE,CAAC;QACjC,KAAK,OAAO;YACV,OAAO,IAAI,YAAY,EAAE,CAAC;QAC5B;YACE,MAAM,IAAI,KAAK,CAAC,8BAA8B,YAAY,EAAE,CAAC,CAAC;IAClE,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAKA,sBAAsB;AACtB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,iCAAiC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIlD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,YAAY,EAAE,CAAC;AAE1D;;;;;;;;;;GAUG;AACH,MAAM,UAAU,qBAAqB,CACnC,YAA+C,EAC/C,MAAuB;IAEvB,gEAAgE;IAChE,MAAM,aAAa,GAAmB,MAAM,IAAI;QAC9C,IAAI,EAAE,YAAY,KAAK,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY;QAC/D,UAAU,EAAE;YACV,IAAI,EAAE,EAAE;YACR,IAAI,EAAE,CAAC;YACP,QAAQ,EAAE,EAAE;SACb;QACD,IAAI,EAAE;YACJ,IAAI,EAAE,QAAQ;SACf;KACF,CAAC;IAEF,QAAQ,YAAY,EAAE,CAAC;QACrB,KAAK,QAAQ;YACX,OAAO,IAAI,aAAa,CAAC,aAAa,CAAC,CAAC;QAC1C,KAAK,YAAY;YACf,OAAO,IAAI,iBAAiB,CAAC,aAAa,CAAC,CAAC;QAC9C,KAAK,OAAO;YACV,OAAO,IAAI,YAAY,CAAC,aAAa,CAAC,CAAC;QACzC;YACE,MAAM,IAAI,KAAK,CAAC,8BAA8B,YAAY,EAAE,CAAC,CAAC;IAClE,CAAC;AACH,CAAC"}