devchain-cli 0.10.5 → 0.11.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 (354) hide show
  1. package/README.md +13 -7
  2. package/dist/cli.js +32 -28
  3. package/dist/drizzle/0048_sessions_transcript_fields.sql +6 -0
  4. package/dist/drizzle/0049_provider_models_and_agent_model_override.sql +24 -0
  5. package/dist/drizzle/meta/_journal.json +14 -0
  6. package/dist/node_modules/@devchain/shared/schemas/export-schema.d.ts +25 -0
  7. package/dist/node_modules/@devchain/shared/schemas/export-schema.d.ts.map +1 -1
  8. package/dist/node_modules/@devchain/shared/schemas/export-schema.js +9 -3
  9. package/dist/node_modules/@devchain/shared/schemas/export-schema.js.map +1 -1
  10. package/dist/node_modules/@devchain/shared/tsconfig.tsbuildinfo +1 -1
  11. package/dist/server/app.main.module.js +2 -0
  12. package/dist/server/app.main.module.js.map +1 -1
  13. package/dist/server/app.normal.module.js +2 -0
  14. package/dist/server/app.normal.module.js.map +1 -1
  15. package/dist/server/modules/agents/controllers/agents.controller.d.ts +1 -0
  16. package/dist/server/modules/agents/controllers/agents.controller.js +3 -0
  17. package/dist/server/modules/agents/controllers/agents.controller.js.map +1 -1
  18. package/dist/server/modules/chat/dtos/chat.dto.d.ts +4 -4
  19. package/dist/server/modules/core/services/preflight.service.js +7 -0
  20. package/dist/server/modules/core/services/preflight.service.js.map +1 -1
  21. package/dist/server/modules/core/services/provider-mcp-ensure.service.js +8 -0
  22. package/dist/server/modules/core/services/provider-mcp-ensure.service.js.map +1 -1
  23. package/dist/server/modules/documents/controllers/documents.controller.d.ts +2 -2
  24. package/dist/server/modules/documents/controllers/documents.controller.js.map +1 -1
  25. package/dist/server/modules/epics/controllers/epic-comments.controller.d.ts +2 -2
  26. package/dist/server/modules/epics/controllers/epic-comments.controller.js.map +1 -1
  27. package/dist/server/modules/events/catalog/claude.hooks.session.started.d.ts +4 -4
  28. package/dist/server/modules/events/catalog/index.d.ts +115 -4
  29. package/dist/server/modules/events/catalog/index.js +6 -0
  30. package/dist/server/modules/events/catalog/index.js.map +1 -1
  31. package/dist/server/modules/events/catalog/session.transcript.discovered.d.ts +24 -0
  32. package/dist/server/modules/events/catalog/session.transcript.discovered.js +15 -0
  33. package/dist/server/modules/events/catalog/session.transcript.discovered.js.map +1 -0
  34. package/dist/server/modules/events/catalog/session.transcript.ended.d.ts +51 -0
  35. package/dist/server/modules/events/catalog/session.transcript.ended.js +20 -0
  36. package/dist/server/modules/events/catalog/session.transcript.ended.js.map +1 -0
  37. package/dist/server/modules/events/catalog/session.transcript.updated.d.ts +51 -0
  38. package/dist/server/modules/events/catalog/session.transcript.updated.js +20 -0
  39. package/dist/server/modules/events/catalog/session.transcript.updated.js.map +1 -0
  40. package/dist/server/modules/events/subscribers/chat-message-delivery.subscriber.d.ts +2 -2
  41. package/dist/server/modules/events/subscribers/chat-message-delivery.subscriber.js.map +1 -1
  42. package/dist/server/modules/events/subscribers/index.js +2 -0
  43. package/dist/server/modules/events/subscribers/index.js.map +1 -1
  44. package/dist/server/modules/events/subscribers/review-comment-notifier.subscriber.d.ts +2 -2
  45. package/dist/server/modules/events/subscribers/review-comment-notifier.subscriber.js.map +1 -1
  46. package/dist/server/modules/events/subscribers/transcript-broadcaster.subscriber.d.ts +12 -0
  47. package/dist/server/modules/events/subscribers/transcript-broadcaster.subscriber.js +88 -0
  48. package/dist/server/modules/events/subscribers/transcript-broadcaster.subscriber.js.map +1 -0
  49. package/dist/server/modules/guests/services/guest-health.service.d.ts +2 -2
  50. package/dist/server/modules/guests/services/guest-health.service.js.map +1 -1
  51. package/dist/server/modules/hooks/dtos/hook-event.dto.d.ts +4 -4
  52. package/dist/server/modules/hooks/services/hooks.service.d.ts +2 -2
  53. package/dist/server/modules/hooks/services/hooks.service.js.map +1 -1
  54. package/dist/server/modules/mcp/dtos/mcp.dto.js +8 -3
  55. package/dist/server/modules/mcp/dtos/mcp.dto.js.map +1 -1
  56. package/dist/server/modules/mcp/services/handlers/activity-tools.d.ts +4 -0
  57. package/dist/server/modules/mcp/services/handlers/activity-tools.js +193 -0
  58. package/dist/server/modules/mcp/services/handlers/activity-tools.js.map +1 -0
  59. package/dist/server/modules/mcp/services/handlers/chat-tools.d.ts +6 -0
  60. package/dist/server/modules/mcp/services/handlers/chat-tools.js +605 -0
  61. package/dist/server/modules/mcp/services/handlers/chat-tools.js.map +1 -0
  62. package/dist/server/modules/mcp/services/handlers/document-tools.d.ts +6 -0
  63. package/dist/server/modules/mcp/services/handlers/document-tools.js +141 -0
  64. package/dist/server/modules/mcp/services/handlers/document-tools.js.map +1 -0
  65. package/dist/server/modules/mcp/services/handlers/epic-tools.d.ts +11 -0
  66. package/dist/server/modules/mcp/services/handlers/epic-tools.js +913 -0
  67. package/dist/server/modules/mcp/services/handlers/epic-tools.js.map +1 -0
  68. package/dist/server/modules/mcp/services/handlers/prompt-tools.d.ts +4 -0
  69. package/dist/server/modules/mcp/services/handlers/prompt-tools.js +109 -0
  70. package/dist/server/modules/mcp/services/handlers/prompt-tools.js.map +1 -0
  71. package/dist/server/modules/mcp/services/handlers/record-tools.d.ts +8 -0
  72. package/dist/server/modules/mcp/services/handlers/record-tools.js +114 -0
  73. package/dist/server/modules/mcp/services/handlers/record-tools.js.map +1 -0
  74. package/dist/server/modules/mcp/services/handlers/review-tools.d.ts +8 -0
  75. package/dist/server/modules/mcp/services/handlers/review-tools.js +672 -0
  76. package/dist/server/modules/mcp/services/handlers/review-tools.js.map +1 -0
  77. package/dist/server/modules/mcp/services/handlers/session-tools.d.ts +4 -0
  78. package/dist/server/modules/mcp/services/handlers/session-tools.js +114 -0
  79. package/dist/server/modules/mcp/services/handlers/session-tools.js.map +1 -0
  80. package/dist/server/modules/mcp/services/handlers/skill-tools.d.ts +4 -0
  81. package/dist/server/modules/mcp/services/handlers/skill-tools.js +124 -0
  82. package/dist/server/modules/mcp/services/handlers/skill-tools.js.map +1 -0
  83. package/dist/server/modules/mcp/services/handlers/types.d.ts +33 -0
  84. package/dist/server/modules/mcp/services/handlers/types.js +3 -0
  85. package/dist/server/modules/mcp/services/handlers/types.js.map +1 -0
  86. package/dist/server/modules/mcp/services/mappers/dto-mappers.d.ts +14 -0
  87. package/dist/server/modules/mcp/services/mappers/dto-mappers.js +138 -0
  88. package/dist/server/modules/mcp/services/mappers/dto-mappers.js.map +1 -0
  89. package/dist/server/modules/mcp/services/mcp-provider-registration.service.d.ts +8 -0
  90. package/dist/server/modules/mcp/services/mcp-provider-registration.service.js +258 -51
  91. package/dist/server/modules/mcp/services/mcp-provider-registration.service.js.map +1 -1
  92. package/dist/server/modules/mcp/services/mcp.service.d.ts +6 -66
  93. package/dist/server/modules/mcp/services/mcp.service.js +97 -3329
  94. package/dist/server/modules/mcp/services/mcp.service.js.map +1 -1
  95. package/dist/server/modules/mcp/services/utils/document-link-resolver.d.ts +10 -0
  96. package/dist/server/modules/mcp/services/utils/document-link-resolver.js +124 -0
  97. package/dist/server/modules/mcp/services/utils/document-link-resolver.js.map +1 -0
  98. package/dist/server/modules/mcp/services/utils/resolve-epic-id.d.ts +3 -0
  99. package/dist/server/modules/mcp/services/utils/resolve-epic-id.js +40 -0
  100. package/dist/server/modules/mcp/services/utils/resolve-epic-id.js.map +1 -0
  101. package/dist/server/modules/mcp/services/utils/resource-resolver.d.ts +10 -0
  102. package/dist/server/modules/mcp/services/utils/resource-resolver.js +124 -0
  103. package/dist/server/modules/mcp/services/utils/resource-resolver.js.map +1 -0
  104. package/dist/server/modules/mcp/services/utils/session-context-resolver.d.ts +14 -0
  105. package/dist/server/modules/mcp/services/utils/session-context-resolver.js +169 -0
  106. package/dist/server/modules/mcp/services/utils/session-context-resolver.js.map +1 -0
  107. package/dist/server/modules/mcp/tool-definitions.js +12 -3
  108. package/dist/server/modules/mcp/tool-definitions.js.map +1 -1
  109. package/dist/server/modules/profiles/controllers/provider-configs.controller.d.ts +2 -2
  110. package/dist/server/modules/profiles/controllers/provider-configs.controller.js.map +1 -1
  111. package/dist/server/modules/profiles/dto.d.ts +2 -2
  112. package/dist/server/modules/projects/controllers/projects.controller.d.ts +32 -28
  113. package/dist/server/modules/projects/controllers/projects.controller.js +12 -7
  114. package/dist/server/modules/projects/controllers/projects.controller.js.map +1 -1
  115. package/dist/server/modules/projects/dtos/export.dto.d.ts +7 -0
  116. package/dist/server/modules/projects/dtos/export.dto.js +1 -0
  117. package/dist/server/modules/projects/dtos/export.dto.js.map +1 -1
  118. package/dist/server/modules/projects/helpers/profile-mapping.helpers.d.ts +102 -0
  119. package/dist/server/modules/projects/helpers/profile-mapping.helpers.js +369 -0
  120. package/dist/server/modules/projects/helpers/profile-mapping.helpers.js.map +1 -0
  121. package/dist/server/modules/projects/helpers/project-export.d.ts +141 -0
  122. package/dist/server/modules/projects/helpers/project-export.js +314 -0
  123. package/dist/server/modules/projects/helpers/project-export.js.map +1 -0
  124. package/dist/server/modules/projects/helpers/project-import.d.ts +132 -0
  125. package/dist/server/modules/projects/helpers/project-import.js +600 -0
  126. package/dist/server/modules/projects/helpers/project-import.js.map +1 -0
  127. package/dist/server/modules/projects/helpers/project-presets.helpers.d.ts +26 -0
  128. package/dist/server/modules/projects/helpers/project-presets.helpers.js +110 -0
  129. package/dist/server/modules/projects/helpers/project-presets.helpers.js.map +1 -0
  130. package/dist/server/modules/projects/helpers/project-runtime.helpers.d.ts +69 -0
  131. package/dist/server/modules/projects/helpers/project-runtime.helpers.js +201 -0
  132. package/dist/server/modules/projects/helpers/project-runtime.helpers.js.map +1 -0
  133. package/dist/server/modules/projects/helpers/project-template-manifest.helpers.d.ts +16 -0
  134. package/dist/server/modules/projects/helpers/project-template-manifest.helpers.js +107 -0
  135. package/dist/server/modules/projects/helpers/project-template-manifest.helpers.js.map +1 -0
  136. package/dist/server/modules/projects/helpers/template-file.helpers.d.ts +9 -0
  137. package/dist/server/modules/projects/helpers/template-file.helpers.js +92 -0
  138. package/dist/server/modules/projects/helpers/template-file.helpers.js.map +1 -0
  139. package/dist/server/modules/projects/helpers/template-loader.d.ts +85 -0
  140. package/dist/server/modules/projects/helpers/template-loader.js +406 -0
  141. package/dist/server/modules/projects/helpers/template-loader.js.map +1 -0
  142. package/dist/server/modules/projects/services/main-project-bootstrap.service.js +4 -0
  143. package/dist/server/modules/projects/services/main-project-bootstrap.service.js.map +1 -1
  144. package/dist/server/modules/projects/services/projects.service.d.ts +23 -49
  145. package/dist/server/modules/projects/services/projects.service.js +46 -1848
  146. package/dist/server/modules/projects/services/projects.service.js.map +1 -1
  147. package/dist/server/modules/prompts/controllers/prompts.controller.d.ts +2 -2
  148. package/dist/server/modules/prompts/controllers/prompts.controller.js.map +1 -1
  149. package/dist/server/modules/providers/adapters/index.d.ts +1 -0
  150. package/dist/server/modules/providers/adapters/index.js +1 -0
  151. package/dist/server/modules/providers/adapters/index.js.map +1 -1
  152. package/dist/server/modules/providers/adapters/opencode.adapter.d.ts +16 -0
  153. package/dist/server/modules/providers/adapters/opencode.adapter.js +64 -0
  154. package/dist/server/modules/providers/adapters/opencode.adapter.js.map +1 -0
  155. package/dist/server/modules/providers/adapters/provider-adapter.factory.d.ts +2 -1
  156. package/dist/server/modules/providers/adapters/provider-adapter.factory.js +5 -2
  157. package/dist/server/modules/providers/adapters/provider-adapter.factory.js.map +1 -1
  158. package/dist/server/modules/providers/adapters/provider-adapter.interface.d.ts +1 -0
  159. package/dist/server/modules/providers/adapters/provider-adapters.module.js +2 -1
  160. package/dist/server/modules/providers/adapters/provider-adapters.module.js.map +1 -1
  161. package/dist/server/modules/providers/controllers/provider-models.controller.d.ts +22 -0
  162. package/dist/server/modules/providers/controllers/provider-models.controller.js +173 -0
  163. package/dist/server/modules/providers/controllers/provider-models.controller.js.map +1 -0
  164. package/dist/server/modules/providers/providers.module.js +2 -1
  165. package/dist/server/modules/providers/providers.module.js.map +1 -1
  166. package/dist/server/modules/records/controllers/records.controller.d.ts +2 -2
  167. package/dist/server/modules/records/controllers/records.controller.js.map +1 -1
  168. package/dist/server/modules/registry/services/template-upgrade.service.js +1 -9
  169. package/dist/server/modules/registry/services/template-upgrade.service.js.map +1 -1
  170. package/dist/server/modules/session-reader/adapters/claude-session-reader.adapter.d.ts +21 -0
  171. package/dist/server/modules/session-reader/adapters/claude-session-reader.adapter.js +207 -0
  172. package/dist/server/modules/session-reader/adapters/claude-session-reader.adapter.js.map +1 -0
  173. package/dist/server/modules/session-reader/adapters/codex-session-reader.adapter.d.ts +22 -0
  174. package/dist/server/modules/session-reader/adapters/codex-session-reader.adapter.js +214 -0
  175. package/dist/server/modules/session-reader/adapters/codex-session-reader.adapter.js.map +1 -0
  176. package/dist/server/modules/session-reader/adapters/gemini-session-reader.adapter.d.ts +23 -0
  177. package/dist/server/modules/session-reader/adapters/gemini-session-reader.adapter.js +224 -0
  178. package/dist/server/modules/session-reader/adapters/gemini-session-reader.adapter.js.map +1 -0
  179. package/dist/server/modules/session-reader/adapters/session-reader-adapter.factory.d.ts +9 -0
  180. package/dist/server/modules/session-reader/adapters/session-reader-adapter.factory.js +40 -0
  181. package/dist/server/modules/session-reader/adapters/session-reader-adapter.factory.js.map +1 -0
  182. package/dist/server/modules/session-reader/adapters/session-reader-adapter.interface.d.ts +37 -0
  183. package/dist/server/modules/session-reader/adapters/session-reader-adapter.interface.js +3 -0
  184. package/dist/server/modules/session-reader/adapters/session-reader-adapter.interface.js.map +1 -0
  185. package/dist/server/modules/session-reader/adapters/utils/estimate-content-tokens.d.ts +11 -0
  186. package/dist/server/modules/session-reader/adapters/utils/estimate-content-tokens.js +77 -0
  187. package/dist/server/modules/session-reader/adapters/utils/estimate-content-tokens.js.map +1 -0
  188. package/dist/server/modules/session-reader/adapters/utils/file-search.util.d.ts +1 -0
  189. package/dist/server/modules/session-reader/adapters/utils/file-search.util.js +22 -0
  190. package/dist/server/modules/session-reader/adapters/utils/file-search.util.js.map +1 -0
  191. package/dist/server/modules/session-reader/builders/chunk-builder.d.ts +5 -0
  192. package/dist/server/modules/session-reader/builders/chunk-builder.js +131 -0
  193. package/dist/server/modules/session-reader/builders/chunk-builder.js.map +1 -0
  194. package/dist/server/modules/session-reader/builders/semantic-step-extractor.d.ts +3 -0
  195. package/dist/server/modules/session-reader/builders/semantic-step-extractor.js +93 -0
  196. package/dist/server/modules/session-reader/builders/semantic-step-extractor.js.map +1 -0
  197. package/dist/server/modules/session-reader/builders/turn-builder.d.ts +3 -0
  198. package/dist/server/modules/session-reader/builders/turn-builder.js +102 -0
  199. package/dist/server/modules/session-reader/builders/turn-builder.js.map +1 -0
  200. package/dist/server/modules/session-reader/controllers/session-reader.controller.d.ts +430 -0
  201. package/dist/server/modules/session-reader/controllers/session-reader.controller.js +252 -0
  202. package/dist/server/modules/session-reader/controllers/session-reader.controller.js.map +1 -0
  203. package/dist/server/modules/session-reader/data/pricing.json +5001 -0
  204. package/dist/server/modules/session-reader/dtos/index.d.ts +2 -0
  205. package/dist/server/modules/session-reader/dtos/index.js +10 -0
  206. package/dist/server/modules/session-reader/dtos/index.js.map +1 -0
  207. package/dist/server/modules/session-reader/dtos/unified-chunk.types.d.ts +92 -0
  208. package/dist/server/modules/session-reader/dtos/unified-chunk.types.js +19 -0
  209. package/dist/server/modules/session-reader/dtos/unified-chunk.types.js.map +1 -0
  210. package/dist/server/modules/session-reader/dtos/unified-session.types.d.ts +118 -0
  211. package/dist/server/modules/session-reader/dtos/unified-session.types.js +23 -0
  212. package/dist/server/modules/session-reader/dtos/unified-session.types.js.map +1 -0
  213. package/dist/server/modules/session-reader/parsers/claude-jsonl.parser.d.ts +15 -0
  214. package/dist/server/modules/session-reader/parsers/claude-jsonl.parser.js +363 -0
  215. package/dist/server/modules/session-reader/parsers/claude-jsonl.parser.js.map +1 -0
  216. package/dist/server/modules/session-reader/parsers/codex-jsonl.parser.d.ts +16 -0
  217. package/dist/server/modules/session-reader/parsers/codex-jsonl.parser.js +622 -0
  218. package/dist/server/modules/session-reader/parsers/codex-jsonl.parser.js.map +1 -0
  219. package/dist/server/modules/session-reader/parsers/gemini-json.parser.d.ts +15 -0
  220. package/dist/server/modules/session-reader/parsers/gemini-json.parser.js +380 -0
  221. package/dist/server/modules/session-reader/parsers/gemini-json.parser.js.map +1 -0
  222. package/dist/server/modules/session-reader/services/pricing.interface.d.ts +9 -0
  223. package/dist/server/modules/session-reader/services/pricing.interface.js +24 -0
  224. package/dist/server/modules/session-reader/services/pricing.interface.js.map +1 -0
  225. package/dist/server/modules/session-reader/services/pricing.service.d.ts +21 -0
  226. package/dist/server/modules/session-reader/services/pricing.service.js +106 -0
  227. package/dist/server/modules/session-reader/services/pricing.service.js.map +1 -0
  228. package/dist/server/modules/session-reader/services/session-cache.service.d.ts +24 -0
  229. package/dist/server/modules/session-reader/services/session-cache.service.js +203 -0
  230. package/dist/server/modules/session-reader/services/session-cache.service.js.map +1 -0
  231. package/dist/server/modules/session-reader/services/session-reader.service.d.ts +56 -0
  232. package/dist/server/modules/session-reader/services/session-reader.service.js +305 -0
  233. package/dist/server/modules/session-reader/services/session-reader.service.js.map +1 -0
  234. package/dist/server/modules/session-reader/services/subagent-locator.service.d.ts +10 -0
  235. package/dist/server/modules/session-reader/services/subagent-locator.service.js +102 -0
  236. package/dist/server/modules/session-reader/services/subagent-locator.service.js.map +1 -0
  237. package/dist/server/modules/session-reader/services/subagent-resolver.service.d.ts +22 -0
  238. package/dist/server/modules/session-reader/services/subagent-resolver.service.js +211 -0
  239. package/dist/server/modules/session-reader/services/subagent-resolver.service.js.map +1 -0
  240. package/dist/server/modules/session-reader/services/transcript-path-validator.service.d.ts +7 -0
  241. package/dist/server/modules/session-reader/services/transcript-path-validator.service.js +150 -0
  242. package/dist/server/modules/session-reader/services/transcript-path-validator.service.js.map +1 -0
  243. package/dist/server/modules/session-reader/services/transcript-persistence.listener.d.ts +30 -0
  244. package/dist/server/modules/session-reader/services/transcript-persistence.listener.js +336 -0
  245. package/dist/server/modules/session-reader/services/transcript-persistence.listener.js.map +1 -0
  246. package/dist/server/modules/session-reader/services/transcript-watcher.service.d.ts +28 -0
  247. package/dist/server/modules/session-reader/services/transcript-watcher.service.js +325 -0
  248. package/dist/server/modules/session-reader/services/transcript-watcher.service.js.map +1 -0
  249. package/dist/server/modules/session-reader/session-reader.module.d.ts +13 -0
  250. package/dist/server/modules/session-reader/session-reader.module.js +82 -0
  251. package/dist/server/modules/session-reader/session-reader.module.js.map +1 -0
  252. package/dist/server/modules/sessions/dtos/sessions.dto.d.ts +2 -0
  253. package/dist/server/modules/sessions/dtos/sessions.dto.js.map +1 -1
  254. package/dist/server/modules/sessions/services/sessions-message-pool.service.d.ts +2 -2
  255. package/dist/server/modules/sessions/services/sessions-message-pool.service.js.map +1 -1
  256. package/dist/server/modules/sessions/services/sessions.service.js +19 -4
  257. package/dist/server/modules/sessions/services/sessions.service.js.map +1 -1
  258. package/dist/server/modules/sessions/utils/profile-options.d.ts +1 -0
  259. package/dist/server/modules/sessions/utils/profile-options.js +18 -0
  260. package/dist/server/modules/sessions/utils/profile-options.js.map +1 -1
  261. package/dist/server/modules/settings/controllers/settings.controller.d.ts +2 -2
  262. package/dist/server/modules/settings/controllers/settings.controller.js.map +1 -1
  263. package/dist/server/modules/settings/dtos/settings.dto.d.ts +14 -2
  264. package/dist/server/modules/settings/dtos/settings.dto.js +1 -0
  265. package/dist/server/modules/settings/dtos/settings.dto.js.map +1 -1
  266. package/dist/server/modules/skills/services/skill-source-registry.service.d.ts +2 -2
  267. package/dist/server/modules/skills/services/skill-source-registry.service.js.map +1 -1
  268. package/dist/server/modules/statuses/controllers/statuses.controller.d.ts +2 -2
  269. package/dist/server/modules/statuses/controllers/statuses.controller.js.map +1 -1
  270. package/dist/server/modules/storage/db/schema.d.ts +176 -0
  271. package/dist/server/modules/storage/db/schema.js +17 -1
  272. package/dist/server/modules/storage/db/schema.js.map +1 -1
  273. package/dist/server/modules/storage/interfaces/storage.interface.d.ts +53 -9
  274. package/dist/server/modules/storage/interfaces/storage.interface.js.map +1 -1
  275. package/dist/server/modules/storage/local/delegates/agent-profile.delegate.d.ts +39 -0
  276. package/dist/server/modules/storage/local/delegates/agent-profile.delegate.js +286 -0
  277. package/dist/server/modules/storage/local/delegates/agent-profile.delegate.js.map +1 -0
  278. package/dist/server/modules/storage/local/delegates/agent.delegate.d.ts +21 -0
  279. package/dist/server/modules/storage/local/delegates/agent.delegate.js +210 -0
  280. package/dist/server/modules/storage/local/delegates/agent.delegate.js.map +1 -0
  281. package/dist/server/modules/storage/local/delegates/base-storage.delegate.d.ts +12 -0
  282. package/dist/server/modules/storage/local/delegates/base-storage.delegate.js +19 -0
  283. package/dist/server/modules/storage/local/delegates/base-storage.delegate.js.map +1 -0
  284. package/dist/server/modules/storage/local/delegates/document.delegate.d.ts +20 -0
  285. package/dist/server/modules/storage/local/delegates/document.delegate.js +267 -0
  286. package/dist/server/modules/storage/local/delegates/document.delegate.js.map +1 -0
  287. package/dist/server/modules/storage/local/delegates/epic.delegate.d.ts +38 -0
  288. package/dist/server/modules/storage/local/delegates/epic.delegate.js +686 -0
  289. package/dist/server/modules/storage/local/delegates/epic.delegate.js.map +1 -0
  290. package/dist/server/modules/storage/local/delegates/guest.delegate.d.ts +14 -0
  291. package/dist/server/modules/storage/local/delegates/guest.delegate.js +172 -0
  292. package/dist/server/modules/storage/local/delegates/guest.delegate.js.map +1 -0
  293. package/dist/server/modules/storage/local/delegates/profile-provider-config.delegate.d.ts +17 -0
  294. package/dist/server/modules/storage/local/delegates/profile-provider-config.delegate.js +249 -0
  295. package/dist/server/modules/storage/local/delegates/profile-provider-config.delegate.js.map +1 -0
  296. package/dist/server/modules/storage/local/delegates/project.delegate.d.ts +16 -0
  297. package/dist/server/modules/storage/local/delegates/project.delegate.js +630 -0
  298. package/dist/server/modules/storage/local/delegates/project.delegate.js.map +1 -0
  299. package/dist/server/modules/storage/local/delegates/prompt.delegate.d.ts +17 -0
  300. package/dist/server/modules/storage/local/delegates/prompt.delegate.js +318 -0
  301. package/dist/server/modules/storage/local/delegates/prompt.delegate.js.map +1 -0
  302. package/dist/server/modules/storage/local/delegates/provider-model.delegate.d.ts +15 -0
  303. package/dist/server/modules/storage/local/delegates/provider-model.delegate.js +210 -0
  304. package/dist/server/modules/storage/local/delegates/provider-model.delegate.js.map +1 -0
  305. package/dist/server/modules/storage/local/delegates/provider.delegate.d.ts +18 -0
  306. package/dist/server/modules/storage/local/delegates/provider.delegate.js +151 -0
  307. package/dist/server/modules/storage/local/delegates/provider.delegate.js.map +1 -0
  308. package/dist/server/modules/storage/local/delegates/record.delegate.d.ts +16 -0
  309. package/dist/server/modules/storage/local/delegates/record.delegate.js +190 -0
  310. package/dist/server/modules/storage/local/delegates/record.delegate.js.map +1 -0
  311. package/dist/server/modules/storage/local/delegates/review.delegate.d.ts +25 -0
  312. package/dist/server/modules/storage/local/delegates/review.delegate.js +426 -0
  313. package/dist/server/modules/storage/local/delegates/review.delegate.js.map +1 -0
  314. package/dist/server/modules/storage/local/delegates/skill-source.delegate.d.ts +28 -0
  315. package/dist/server/modules/storage/local/delegates/skill-source.delegate.js +347 -0
  316. package/dist/server/modules/storage/local/delegates/skill-source.delegate.js.map +1 -0
  317. package/dist/server/modules/storage/local/delegates/status.delegate.d.ts +12 -0
  318. package/dist/server/modules/storage/local/delegates/status.delegate.js +130 -0
  319. package/dist/server/modules/storage/local/delegates/status.delegate.js.map +1 -0
  320. package/dist/server/modules/storage/local/delegates/subscriber.delegate.d.ts +11 -0
  321. package/dist/server/modules/storage/local/delegates/subscriber.delegate.js +144 -0
  322. package/dist/server/modules/storage/local/delegates/subscriber.delegate.js.map +1 -0
  323. package/dist/server/modules/storage/local/delegates/tag.delegate.d.ts +11 -0
  324. package/dist/server/modules/storage/local/delegates/tag.delegate.js +102 -0
  325. package/dist/server/modules/storage/local/delegates/tag.delegate.js.map +1 -0
  326. package/dist/server/modules/storage/local/delegates/watcher.delegate.d.ts +12 -0
  327. package/dist/server/modules/storage/local/delegates/watcher.delegate.js +183 -0
  328. package/dist/server/modules/storage/local/delegates/watcher.delegate.js.map +1 -0
  329. package/dist/server/modules/storage/local/helpers/storage-helpers.d.ts +32 -0
  330. package/dist/server/modules/storage/local/helpers/storage-helpers.js +276 -0
  331. package/dist/server/modules/storage/local/helpers/storage-helpers.js.map +1 -0
  332. package/dist/server/modules/storage/local/local-storage.service.d.ts +30 -22
  333. package/dist/server/modules/storage/local/local-storage.service.js +227 -3627
  334. package/dist/server/modules/storage/local/local-storage.service.js.map +1 -1
  335. package/dist/server/modules/storage/models/domain.models.d.ts +14 -1
  336. package/dist/server/modules/subscribers/services/subscribers.service.d.ts +2 -2
  337. package/dist/server/modules/subscribers/services/subscribers.service.js.map +1 -1
  338. package/dist/server/modules/watchers/services/watchers.service.d.ts +2 -2
  339. package/dist/server/templates/3-agents-dev.json +209 -191
  340. package/dist/server/templates/5-agents-dev.json +243 -198
  341. package/dist/server/test-setup.js +14 -12
  342. package/dist/server/test-setup.js.map +1 -1
  343. package/dist/server/tsconfig.tsbuildinfo +1 -1
  344. package/dist/server/ui/assets/{ReviewDetailPage-DNFeBzB6.js → ReviewDetailPage-DJyH8bKk.js} +1 -1
  345. package/dist/server/ui/assets/{ReviewsPage-DCM_dJlA.js → ReviewsPage-DHvmyjjG.js} +1 -1
  346. package/dist/server/ui/assets/index-cHqKW6LQ.css +32 -0
  347. package/dist/server/ui/assets/index-f0KXZKs1.js +1011 -0
  348. package/dist/server/ui/assets/{useReviewSubscription-Bx6D-cpf.js → useReviewSubscription-CUbCp0An.js} +32 -35
  349. package/dist/server/ui/index.html +2 -2
  350. package/dist/templates/3-agents-dev.json +209 -191
  351. package/dist/templates/5-agents-dev.json +243 -198
  352. package/package.json +15 -2
  353. package/dist/server/ui/assets/index-BgvrDIBb.js +0 -972
  354. package/dist/server/ui/assets/index-CzjcxP26.css +0 -32
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.doesProjectMatchPresetWithHelper = doesProjectMatchPresetWithHelper;
4
+ exports.applyPresetWithHelper = applyPresetWithHelper;
5
+ const error_types_1 = require("../../../common/errors/error-types");
6
+ const logger_1 = require("../../../common/logging/logger");
7
+ const profile_mapping_helpers_1 = require("./profile-mapping.helpers");
8
+ const logger = (0, logger_1.createLogger)('ProjectsService');
9
+ async function doesProjectMatchPresetWithHelper(projectId, preset, deps) {
10
+ const agentsRes = await deps.storage.listAgents(projectId, { limit: 1000, offset: 0 });
11
+ const agentsByName = new Map(agentsRes.items.map((agent) => [agent.name.toLowerCase(), agent]));
12
+ const uniqueProviderConfigIds = new Set();
13
+ for (const agent of agentsRes.items) {
14
+ if (agent.providerConfigId) {
15
+ uniqueProviderConfigIds.add(agent.providerConfigId);
16
+ }
17
+ }
18
+ const allProviderConfigs = uniqueProviderConfigIds.size > 0
19
+ ? await deps.storage.listProfileProviderConfigsByIds(Array.from(uniqueProviderConfigIds))
20
+ : [];
21
+ const providerConfigNames = new Map(allProviderConfigs.map((config) => [config.id, config.name]));
22
+ for (const agentConfig of preset.agentConfigs) {
23
+ const agent = agentsByName.get(agentConfig.agentName.trim().toLowerCase());
24
+ if (!agent) {
25
+ return false;
26
+ }
27
+ const currentProviderConfigName = providerConfigNames.get(agent.providerConfigId ?? '');
28
+ if (currentProviderConfigName?.toLowerCase() !==
29
+ agentConfig.providerConfigName.trim().toLowerCase()) {
30
+ return false;
31
+ }
32
+ const expectedModelOverride = agentConfig.modelOverride ?? null;
33
+ const currentModelOverride = agent.modelOverride ?? null;
34
+ if (currentModelOverride !== expectedModelOverride) {
35
+ return false;
36
+ }
37
+ }
38
+ return true;
39
+ }
40
+ async function applyPresetWithHelper(projectId, presetName, deps, nameMaps) {
41
+ logger.info({ projectId, presetName }, 'applyPreset');
42
+ const warnings = [];
43
+ const presets = deps.settings.getProjectPresets(projectId);
44
+ const selectedPreset = presets.find((preset) => preset.name === presetName);
45
+ if (!selectedPreset) {
46
+ throw new error_types_1.NotFoundError('Preset', presetName);
47
+ }
48
+ if (!selectedPreset.agentConfigs || !Array.isArray(selectedPreset.agentConfigs)) {
49
+ throw new error_types_1.ValidationError(`Preset "${presetName}" has invalid or missing agentConfigs`, {
50
+ presetName,
51
+ });
52
+ }
53
+ const agentsRes = await deps.storage.listAgents(projectId, { limit: 1000, offset: 0 });
54
+ const agentNameToId = nameMaps?.agentNameToId ?? buildAgentNameToIdMap(agentsRes.items);
55
+ const configLookupMap = nameMaps?.configLookupMap ?? (await buildProjectConfigLookupMap(projectId, deps.storage));
56
+ let applied = 0;
57
+ const agentsById = new Map(agentsRes.items.map((agent) => [agent.id, agent]));
58
+ for (const agentConfig of selectedPreset.agentConfigs) {
59
+ const agentId = agentNameToId.get(agentConfig.agentName.trim().toLowerCase());
60
+ if (!agentId) {
61
+ warnings.push(`Agent "${agentConfig.agentName}" not found in project`);
62
+ continue;
63
+ }
64
+ const agent = agentsById.get(agentId);
65
+ if (!agent) {
66
+ continue;
67
+ }
68
+ const lookupKey = (0, profile_mapping_helpers_1.buildProviderConfigLookupKey)(agent.profileId, agentConfig.providerConfigName);
69
+ const providerConfigId = configLookupMap.get(lookupKey);
70
+ if (!providerConfigId) {
71
+ warnings.push(`Provider config "${agentConfig.providerConfigName}" not found for agent "${agentConfig.agentName}"`);
72
+ continue;
73
+ }
74
+ const modelOverride = agentConfig.modelOverride ?? null;
75
+ await deps.storage.updateAgent(agentId, { providerConfigId, modelOverride });
76
+ applied++;
77
+ logger.debug({ projectId, agentId, agentName: agentConfig.agentName, providerConfigId, modelOverride }, 'Applied preset: updated agent provider config and model override');
78
+ }
79
+ const fullMatch = warnings.length === 0 && applied === selectedPreset.agentConfigs.length;
80
+ if (fullMatch) {
81
+ await deps.settings.setProjectActivePreset(projectId, presetName);
82
+ logger.info({ projectId, presetName }, 'Active preset set (full match)');
83
+ }
84
+ logger.info({ projectId, presetName, applied, warnings: warnings.length }, 'Preset applied');
85
+ return { applied, warnings };
86
+ }
87
+ function buildAgentNameToIdMap(agents) {
88
+ const map = new Map();
89
+ for (const agent of agents) {
90
+ map.set(agent.name.toLowerCase(), agent.id);
91
+ }
92
+ return map;
93
+ }
94
+ async function buildProjectConfigLookupMap(projectId, storage) {
95
+ const configLookupMap = new Map();
96
+ const profilesRes = await storage.listAgentProfiles({
97
+ projectId,
98
+ limit: 1000,
99
+ offset: 0,
100
+ });
101
+ for (const profile of profilesRes.items) {
102
+ const configs = await storage.listProfileProviderConfigsByProfile(profile.id);
103
+ for (const config of configs) {
104
+ const lookupKey = (0, profile_mapping_helpers_1.buildProviderConfigLookupKey)(profile.id, config.name);
105
+ configLookupMap.set(lookupKey, config.id);
106
+ }
107
+ }
108
+ return configLookupMap;
109
+ }
110
+ //# sourceMappingURL=project-presets.helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-presets.helpers.js","sourceRoot":"","sources":["../../../../src/modules/projects/helpers/project-presets.helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import type { SettingsService } from '../../settings/services/settings.service';
2
+ import type { StorageService } from '../../storage/interfaces/storage.interface';
3
+ import type { WatchersService } from '../../watchers/services/watchers.service';
4
+ import type { ProjectSettingsTemplateInput } from './profile-mapping.helpers';
5
+ export interface WatcherTemplateInput {
6
+ id?: string;
7
+ name: string;
8
+ description?: string | null;
9
+ enabled: boolean;
10
+ scope: 'all' | 'agent' | 'profile' | 'provider';
11
+ scopeFilterName?: string | null;
12
+ pollIntervalMs: number;
13
+ viewportLines: number;
14
+ idleAfterSeconds?: number;
15
+ condition: {
16
+ type: 'contains' | 'regex' | 'not_contains';
17
+ pattern: string;
18
+ flags?: string;
19
+ };
20
+ cooldownMs: number;
21
+ cooldownMode: 'time' | 'until_clear';
22
+ eventName: string;
23
+ }
24
+ export interface SubscriberTemplateInput {
25
+ id?: string;
26
+ name: string;
27
+ description?: string | null;
28
+ enabled: boolean;
29
+ eventName: string;
30
+ eventFilter?: {
31
+ field: string;
32
+ operator: 'equals' | 'contains' | 'regex';
33
+ value: string;
34
+ } | null;
35
+ actionType: string;
36
+ actionInputs: Record<string, {
37
+ source: 'event_field' | 'custom';
38
+ eventField?: string;
39
+ customValue?: string;
40
+ }>;
41
+ delayMs: number;
42
+ cooldownMs: number;
43
+ retryOnError: boolean;
44
+ groupName?: string | null;
45
+ position?: number;
46
+ priority?: number;
47
+ }
48
+ export interface ScopeLookupMaps {
49
+ agentNameToId: Map<string, string>;
50
+ profileNameToId: Map<string, string>;
51
+ providerNameToId: Map<string, string>;
52
+ profileNameRemapMap?: Map<string, string>;
53
+ }
54
+ export declare function createWatchersFromPayloadWithHelper(projectId: string, watchers: WatcherTemplateInput[], maps: ScopeLookupMaps, watchersService: Pick<WatchersService, 'createWatcher'>): Promise<{
55
+ created: number;
56
+ watcherIdMap: Record<string, string>;
57
+ }>;
58
+ export declare function createSubscribersFromPayloadWithHelper(projectId: string, subscribers: SubscriberTemplateInput[], storage: Pick<StorageService, 'createSubscriber'>): Promise<{
59
+ created: number;
60
+ subscriberIdMap: Record<string, string>;
61
+ }>;
62
+ export declare function applyProjectSettingsWithHelper(projectId: string, projectSettings: ProjectSettingsTemplateInput | undefined, maps: {
63
+ promptTitleToId: Map<string, string>;
64
+ statusLabelToId: Map<string, string>;
65
+ }, archiveStatusId: string | null, settings: SettingsService): Promise<{
66
+ initialPromptSet: boolean;
67
+ }>;
68
+ export declare function normalizeProfileOptions(options: unknown): string | null;
69
+ export declare function getImportErrorMessage(error: unknown): string;
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createWatchersFromPayloadWithHelper = createWatchersFromPayloadWithHelper;
4
+ exports.createSubscribersFromPayloadWithHelper = createSubscribersFromPayloadWithHelper;
5
+ exports.applyProjectSettingsWithHelper = applyProjectSettingsWithHelper;
6
+ exports.normalizeProfileOptions = normalizeProfileOptions;
7
+ exports.getImportErrorMessage = getImportErrorMessage;
8
+ const logger_1 = require("../../../common/logging/logger");
9
+ const logger = (0, logger_1.createLogger)('ProjectsService');
10
+ async function createWatchersFromPayloadWithHelper(projectId, watchers, maps, watchersService) {
11
+ const watcherIdMap = {};
12
+ let created = 0;
13
+ for (const watcher of watchers) {
14
+ let scopeFilterId = null;
15
+ if (watcher.scopeFilterName && watcher.scope !== 'all') {
16
+ const scopeFilterNameLower = watcher.scopeFilterName.trim().toLowerCase();
17
+ switch (watcher.scope) {
18
+ case 'agent':
19
+ scopeFilterId = maps.agentNameToId.get(scopeFilterNameLower) ?? null;
20
+ break;
21
+ case 'profile': {
22
+ scopeFilterId = maps.profileNameToId.get(scopeFilterNameLower) ?? null;
23
+ if (!scopeFilterId && maps.profileNameRemapMap) {
24
+ const remappedName = maps.profileNameRemapMap.get(scopeFilterNameLower);
25
+ if (remappedName) {
26
+ scopeFilterId = maps.profileNameToId.get(remappedName) ?? null;
27
+ if (scopeFilterId) {
28
+ logger.info({
29
+ projectId,
30
+ watcherName: watcher.name,
31
+ originalProfile: watcher.scopeFilterName,
32
+ remappedProfile: remappedName,
33
+ }, 'Watcher profile scope remapped due to provider family selection');
34
+ }
35
+ }
36
+ }
37
+ break;
38
+ }
39
+ case 'provider':
40
+ scopeFilterId = maps.providerNameToId.get(scopeFilterNameLower) ?? null;
41
+ break;
42
+ }
43
+ if (!scopeFilterId) {
44
+ logger.warn({
45
+ projectId,
46
+ watcherName: watcher.name,
47
+ scope: watcher.scope,
48
+ scopeFilterName: watcher.scopeFilterName,
49
+ }, 'Could not resolve scope filter, setting scope to "all"');
50
+ }
51
+ }
52
+ const createdWatcher = await watchersService.createWatcher({
53
+ projectId,
54
+ name: watcher.name,
55
+ description: watcher.description ?? null,
56
+ enabled: watcher.enabled,
57
+ scope: scopeFilterId ? watcher.scope : 'all',
58
+ scopeFilterId,
59
+ pollIntervalMs: watcher.pollIntervalMs,
60
+ viewportLines: watcher.viewportLines,
61
+ idleAfterSeconds: watcher.idleAfterSeconds ?? 0,
62
+ condition: watcher.condition,
63
+ cooldownMs: watcher.cooldownMs,
64
+ cooldownMode: watcher.cooldownMode,
65
+ eventName: watcher.eventName,
66
+ });
67
+ if (watcher.id) {
68
+ watcherIdMap[watcher.id] = createdWatcher.id;
69
+ }
70
+ created++;
71
+ }
72
+ return { created, watcherIdMap };
73
+ }
74
+ async function createSubscribersFromPayloadWithHelper(projectId, subscribers, storage) {
75
+ const subscriberIdMap = {};
76
+ let created = 0;
77
+ for (const subscriber of subscribers) {
78
+ const createdSubscriber = await storage.createSubscriber({
79
+ projectId,
80
+ name: subscriber.name,
81
+ description: subscriber.description ?? null,
82
+ enabled: subscriber.enabled,
83
+ eventName: subscriber.eventName,
84
+ eventFilter: subscriber.eventFilter ?? null,
85
+ actionType: subscriber.actionType,
86
+ actionInputs: subscriber.actionInputs,
87
+ delayMs: subscriber.delayMs,
88
+ cooldownMs: subscriber.cooldownMs,
89
+ retryOnError: subscriber.retryOnError,
90
+ groupName: subscriber.groupName ?? null,
91
+ position: subscriber.position ?? 0,
92
+ priority: subscriber.priority ?? 0,
93
+ });
94
+ if (subscriber.id) {
95
+ subscriberIdMap[subscriber.id] = createdSubscriber.id;
96
+ }
97
+ created++;
98
+ }
99
+ return { created, subscriberIdMap };
100
+ }
101
+ async function applyProjectSettingsWithHelper(projectId, projectSettings, maps, archiveStatusId, settings) {
102
+ let initialPromptSet = false;
103
+ if (projectSettings) {
104
+ if (projectSettings.initialPromptTitle) {
105
+ const promptId = maps.promptTitleToId.get(projectSettings.initialPromptTitle.toLowerCase());
106
+ if (promptId) {
107
+ await settings.updateSettings({
108
+ projectId,
109
+ initialSessionPromptId: promptId,
110
+ });
111
+ initialPromptSet = true;
112
+ logger.info({ projectId, promptTitle: projectSettings.initialPromptTitle }, 'Applied initial prompt from projectSettings');
113
+ }
114
+ }
115
+ if (projectSettings.autoCleanStatusLabels && projectSettings.autoCleanStatusLabels.length > 0) {
116
+ const autoCleanStatusIds = projectSettings.autoCleanStatusLabels
117
+ .map((label) => maps.statusLabelToId.get(label.toLowerCase()))
118
+ .filter((id) => Boolean(id));
119
+ if (autoCleanStatusIds.length > 0) {
120
+ const currentSettings = settings.getSettings();
121
+ const existingAutoClean = currentSettings.autoClean?.statusIds ?? {};
122
+ await settings.updateSettings({
123
+ autoClean: {
124
+ statusIds: { ...existingAutoClean, [projectId]: autoCleanStatusIds },
125
+ },
126
+ });
127
+ logger.info({ projectId, autoCleanStatusIds }, 'Applied autoClean statuses from projectSettings');
128
+ }
129
+ }
130
+ else if (archiveStatusId) {
131
+ const currentSettings = settings.getSettings();
132
+ const existingAutoClean = currentSettings.autoClean?.statusIds ?? {};
133
+ await settings.updateSettings({
134
+ autoClean: {
135
+ statusIds: { ...existingAutoClean, [projectId]: [archiveStatusId] },
136
+ },
137
+ });
138
+ logger.info({ projectId, archiveStatusId }, 'Auto-configured Archive status for auto-clean (fallback)');
139
+ }
140
+ if (projectSettings.epicAssignedTemplate) {
141
+ await settings.updateSettings({
142
+ events: {
143
+ epicAssigned: { template: projectSettings.epicAssignedTemplate },
144
+ },
145
+ });
146
+ logger.info({ projectId }, 'Applied epicAssigned template from projectSettings');
147
+ }
148
+ if (projectSettings.messagePoolSettings) {
149
+ await settings.setProjectPoolSettings(projectId, projectSettings.messagePoolSettings);
150
+ logger.info({ projectId, poolSettings: projectSettings.messagePoolSettings }, 'Applied message pool settings from projectSettings');
151
+ }
152
+ }
153
+ else if (archiveStatusId) {
154
+ const currentSettings = settings.getSettings();
155
+ const existingAutoClean = currentSettings.autoClean?.statusIds ?? {};
156
+ await settings.updateSettings({
157
+ autoClean: {
158
+ statusIds: { ...existingAutoClean, [projectId]: [archiveStatusId] },
159
+ },
160
+ });
161
+ logger.info({ projectId, archiveStatusId }, 'Auto-configured Archive status for auto-clean');
162
+ }
163
+ return { initialPromptSet };
164
+ }
165
+ function normalizeProfileOptions(options) {
166
+ if (typeof options === 'string') {
167
+ return options;
168
+ }
169
+ if (options && typeof options === 'object') {
170
+ try {
171
+ return JSON.stringify(options);
172
+ }
173
+ catch {
174
+ return null;
175
+ }
176
+ }
177
+ return null;
178
+ }
179
+ function getImportErrorMessage(error) {
180
+ const errorCode = error?.code;
181
+ if (errorCode === 'SQLITE_CONSTRAINT_FOREIGNKEY') {
182
+ return 'Import failed: Cannot delete items that are still referenced. Check for cross-project agents using these profiles.';
183
+ }
184
+ if (errorCode === 'SQLITE_CONSTRAINT_UNIQUE') {
185
+ return 'Import failed: Duplicate entry detected.';
186
+ }
187
+ if (error instanceof Error) {
188
+ if (error.message.includes('FOREIGN KEY constraint failed')) {
189
+ return 'Import failed: Cannot delete items that are still referenced. Check for cross-project agents using these profiles.';
190
+ }
191
+ if (error.message.includes('UNIQUE constraint failed')) {
192
+ return 'Import failed: Duplicate entry detected.';
193
+ }
194
+ if (error.message.startsWith('Import failed')) {
195
+ return error.message;
196
+ }
197
+ return `Import failed: ${error.message}`;
198
+ }
199
+ return 'Import failed: An unexpected error occurred.';
200
+ }
201
+ //# sourceMappingURL=project-runtime.helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-runtime.helpers.js","sourceRoot":"","sources":["../../../../src/modules/projects/helpers/project-runtime.helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type ManifestData } from '@devchain/shared';
2
+ import type { SettingsService } from '../../settings/services/settings.service';
3
+ import type { UnifiedTemplateService } from '../../registry/services/unified-template.service';
4
+ interface ManifestDeps {
5
+ settings: SettingsService;
6
+ unifiedTemplateService: UnifiedTemplateService;
7
+ }
8
+ export declare function getTemplateManifestForProjectWithHelper(projectId: string, deps: ManifestDeps): Promise<ManifestData | null>;
9
+ export declare function getBundledUpgradeVersionWithHelper(templateSlug: string, installedVersion: string | null, unifiedTemplateService: Pick<UnifiedTemplateService, 'getBundledTemplate'>): string | null;
10
+ export declare function getBundledUpgradesForProjectsWithHelper(projects: Array<{
11
+ projectId: string;
12
+ templateSlug: string | null;
13
+ installedVersion: string | null;
14
+ source: 'bundled' | 'registry' | 'file' | null;
15
+ }>, unifiedTemplateService: Pick<UnifiedTemplateService, 'getBundledTemplate'>): Map<string, string | null>;
16
+ export {};
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getTemplateManifestForProjectWithHelper = getTemplateManifestForProjectWithHelper;
4
+ exports.getBundledUpgradeVersionWithHelper = getBundledUpgradeVersionWithHelper;
5
+ exports.getBundledUpgradesForProjectsWithHelper = getBundledUpgradesForProjectsWithHelper;
6
+ const shared_1 = require("@devchain/shared");
7
+ const logger_1 = require("../../../common/logging/logger");
8
+ const logger = (0, logger_1.createLogger)('ProjectsService');
9
+ async function getTemplateManifestForProjectWithHelper(projectId, deps) {
10
+ const metadata = deps.settings.getProjectTemplateMetadata(projectId);
11
+ if (!metadata?.templateSlug) {
12
+ logger.debug({ projectId }, 'No template metadata for project');
13
+ return null;
14
+ }
15
+ try {
16
+ if (metadata.source === 'file') {
17
+ logger.debug({ projectId, templateSlug: metadata.templateSlug }, 'File-based template - no manifest available');
18
+ return null;
19
+ }
20
+ if (metadata.source === 'bundled') {
21
+ const template = deps.unifiedTemplateService.getBundledTemplate(metadata.templateSlug);
22
+ return template.content._manifest ?? null;
23
+ }
24
+ const template = await deps.unifiedTemplateService.getTemplate(metadata.templateSlug, metadata.installedVersion ?? undefined);
25
+ if (template.source !== 'registry') {
26
+ logger.debug({
27
+ projectId,
28
+ templateSlug: metadata.templateSlug,
29
+ expectedSource: 'registry',
30
+ actualSource: template.source,
31
+ }, 'Template source mismatch - registry template not available, rejecting bundled fallback');
32
+ return null;
33
+ }
34
+ return template.content._manifest ?? null;
35
+ }
36
+ catch (error) {
37
+ logger.debug({ projectId, templateSlug: metadata.templateSlug, error }, 'Failed to fetch template manifest for project');
38
+ return null;
39
+ }
40
+ }
41
+ function getBundledUpgradeVersionWithHelper(templateSlug, installedVersion, unifiedTemplateService) {
42
+ if (!installedVersion) {
43
+ return null;
44
+ }
45
+ try {
46
+ const bundled = unifiedTemplateService.getBundledTemplate(templateSlug);
47
+ const manifest = bundled.content._manifest;
48
+ const bundledVersion = manifest?.version;
49
+ if (!bundledVersion) {
50
+ return null;
51
+ }
52
+ if (!(0, shared_1.isValidSemVer)(installedVersion) || !(0, shared_1.isValidSemVer)(bundledVersion)) {
53
+ logger.warn({ templateSlug, installedVersion, bundledVersion }, 'Invalid semver version detected, skipping upgrade check');
54
+ return null;
55
+ }
56
+ if ((0, shared_1.isLessThan)(installedVersion, bundledVersion)) {
57
+ return bundledVersion;
58
+ }
59
+ return null;
60
+ }
61
+ catch {
62
+ return null;
63
+ }
64
+ }
65
+ function getBundledUpgradesForProjectsWithHelper(projects, unifiedTemplateService) {
66
+ const result = new Map();
67
+ const bundledVersionCache = new Map();
68
+ for (const project of projects) {
69
+ if (project.source !== 'bundled' || !project.templateSlug) {
70
+ result.set(project.projectId, null);
71
+ continue;
72
+ }
73
+ if (!bundledVersionCache.has(project.templateSlug)) {
74
+ try {
75
+ const bundled = unifiedTemplateService.getBundledTemplate(project.templateSlug);
76
+ const manifest = bundled.content._manifest;
77
+ bundledVersionCache.set(project.templateSlug, manifest?.version ?? null);
78
+ }
79
+ catch {
80
+ bundledVersionCache.set(project.templateSlug, null);
81
+ }
82
+ }
83
+ const bundledVersion = bundledVersionCache.get(project.templateSlug);
84
+ if (!bundledVersion || !project.installedVersion) {
85
+ result.set(project.projectId, null);
86
+ continue;
87
+ }
88
+ if (!(0, shared_1.isValidSemVer)(project.installedVersion) || !(0, shared_1.isValidSemVer)(bundledVersion)) {
89
+ logger.warn({
90
+ projectId: project.projectId,
91
+ templateSlug: project.templateSlug,
92
+ installedVersion: project.installedVersion,
93
+ bundledVersion,
94
+ }, 'Invalid semver version detected, skipping upgrade check');
95
+ result.set(project.projectId, null);
96
+ continue;
97
+ }
98
+ if ((0, shared_1.isLessThan)(project.installedVersion, bundledVersion)) {
99
+ result.set(project.projectId, bundledVersion);
100
+ }
101
+ else {
102
+ result.set(project.projectId, null);
103
+ }
104
+ }
105
+ return result;
106
+ }
107
+ //# sourceMappingURL=project-template-manifest.helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-template-manifest.helpers.js","sourceRoot":"","sources":["../../../../src/modules/projects/helpers/project-template-manifest.helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface ListedTemplateInfo {
2
+ id: string;
3
+ fileName: string;
4
+ }
5
+ export declare function findTemplatesDirectory(callerDir: string): string | null;
6
+ export declare function listTemplatesWithHelper(callerDir: string): ListedTemplateInfo[];
7
+ export declare function getTemplateContentWithHelper(callerDir: string, templateId: string): unknown;
8
+ export declare function slugify(value: string): string;
9
+ export declare function deriveSlugFromPath(filePath: string): string;
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findTemplatesDirectory = findTemplatesDirectory;
4
+ exports.listTemplatesWithHelper = listTemplatesWithHelper;
5
+ exports.getTemplateContentWithHelper = getTemplateContentWithHelper;
6
+ exports.slugify = slugify;
7
+ exports.deriveSlugFromPath = deriveSlugFromPath;
8
+ const error_types_1 = require("../../../common/errors/error-types");
9
+ const logger_1 = require("../../../common/logging/logger");
10
+ const templates_directory_1 = require("../../../common/templates-directory");
11
+ const fs_1 = require("fs");
12
+ const path_1 = require("path");
13
+ const logger = (0, logger_1.createLogger)('ProjectsService');
14
+ function findTemplatesDirectory(callerDir) {
15
+ const templatesDir = (0, templates_directory_1.resolveTemplatesDirectory)(callerDir);
16
+ if (templatesDir) {
17
+ logger.debug({ path: templatesDir }, 'Found templates directory');
18
+ return templatesDir;
19
+ }
20
+ logger.warn('Templates directory not found in known locations');
21
+ return null;
22
+ }
23
+ function listTemplatesWithHelper(callerDir) {
24
+ logger.info('listTemplates');
25
+ const templatesDir = findTemplatesDirectory(callerDir);
26
+ if (!templatesDir) {
27
+ logger.error('Templates directory not found');
28
+ throw new error_types_1.StorageError('Templates directory not found', {
29
+ hint: 'Templates directory is not available in this deployment',
30
+ });
31
+ }
32
+ try {
33
+ const files = (0, fs_1.readdirSync)(templatesDir);
34
+ const jsonFiles = files.filter((file) => file.endsWith('.json'));
35
+ const templates = jsonFiles.map((fileName) => ({
36
+ id: fileName.replace(/\.json$/, ''),
37
+ fileName,
38
+ }));
39
+ logger.info({ templatesDir, count: templates.length }, 'Listed project templates');
40
+ return templates;
41
+ }
42
+ catch (error) {
43
+ logger.error({ error, templatesDir }, 'Failed to read templates directory');
44
+ throw new error_types_1.StorageError('Failed to read templates directory', {
45
+ hint: 'Error accessing templates',
46
+ });
47
+ }
48
+ }
49
+ function getTemplateContentWithHelper(callerDir, templateId) {
50
+ logger.info({ templateId }, 'getTemplateContent');
51
+ const templatesDir = findTemplatesDirectory(callerDir);
52
+ if (!templatesDir) {
53
+ throw new error_types_1.StorageError('Templates directory not found', {
54
+ hint: 'Templates directory is not available in this deployment',
55
+ });
56
+ }
57
+ const templateIdRegex = /^[a-zA-Z0-9_-]+$/;
58
+ if (!templateIdRegex.test(templateId)) {
59
+ throw new error_types_1.ValidationError('Invalid template ID: must contain only alphanumeric characters, hyphens, and underscores', { templateId });
60
+ }
61
+ const resolvedTemplatesDir = (0, path_1.resolve)(templatesDir);
62
+ const templatePath = (0, path_1.resolve)(templatesDir, `${templateId}.json`);
63
+ if (!templatePath.startsWith(resolvedTemplatesDir + path_1.sep)) {
64
+ logger.warn({ templateId, templatePath, templatesDir: resolvedTemplatesDir }, 'Path traversal attempt detected');
65
+ throw new error_types_1.ValidationError('Invalid template ID: path traversal not allowed', { templateId });
66
+ }
67
+ if (!(0, fs_1.existsSync)(templatePath)) {
68
+ throw new error_types_1.NotFoundError('Template', templateId);
69
+ }
70
+ try {
71
+ const content = (0, fs_1.readFileSync)(templatePath, 'utf-8');
72
+ return JSON.parse(content);
73
+ }
74
+ catch (error) {
75
+ logger.error({ error, templatePath }, 'Failed to read template file');
76
+ throw new error_types_1.StorageError('Failed to read template file', {
77
+ hint: 'Template file exists but cannot be read or parsed',
78
+ });
79
+ }
80
+ }
81
+ function slugify(value) {
82
+ return value
83
+ .toLowerCase()
84
+ .replace(/[^a-z0-9]+/g, '-')
85
+ .replace(/(^-|-$)/g, '');
86
+ }
87
+ function deriveSlugFromPath(filePath) {
88
+ const filename = (0, path_1.basename)(filePath);
89
+ const nameWithoutExt = filename.replace(/\.json$/i, '');
90
+ return slugify(nameWithoutExt);
91
+ }
92
+ //# sourceMappingURL=template-file.helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-file.helpers.js","sourceRoot":"","sources":["../../../../src/modules/projects/helpers/template-file.helpers.ts"],"names":[],"mappings":"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"}