crewly 1.8.9 → 1.8.12

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 (245) hide show
  1. package/config/constants.d.ts.map +1 -0
  2. package/config/index.d.ts.map +1 -0
  3. package/config/roles/_common/memory-instructions.md +6 -5
  4. package/config/roles/_common/wiki-instructions.md +49 -0
  5. package/config/roles/architect/prompt.md +2 -2
  6. package/config/roles/backend-developer/prompt.md +2 -2
  7. package/config/roles/designer/prompt.md +2 -2
  8. package/config/roles/developer/prompt.md +2 -2
  9. package/config/roles/frontend-developer/prompt.md +2 -2
  10. package/config/roles/fullstack-dev/prompt.md +2 -2
  11. package/config/roles/generalist/prompt.md +2 -2
  12. package/config/roles/ops/prompt.md +2 -2
  13. package/config/roles/orchestrator/prompt.md +135 -11
  14. package/config/roles/product-manager/prompt.md +2 -2
  15. package/config/roles/qa/prompt.md +2 -2
  16. package/config/roles/qa-engineer/prompt.md +2 -2
  17. package/config/roles/researcher/prompt.md +15 -6
  18. package/config/roles/sales/prompt.md +2 -2
  19. package/config/roles/support/prompt.md +2 -2
  20. package/config/roles/team-leader/prompt.md +17 -2
  21. package/config/roles/tpm/prompt.md +2 -2
  22. package/config/roles/ux-designer/prompt.md +2 -2
  23. package/config/skills/orchestrator/wiki-cleanup/SKILL.md +89 -0
  24. package/config/skills/orchestrator/wiki-cleanup/execute.sh +139 -0
  25. package/config/skills/orchestrator/wiki-lint/SKILL.md +75 -0
  26. package/config/skills/orchestrator/wiki-lint/execute.sh +66 -0
  27. package/config/skills/orchestrator/wiki-migrate/SKILL.md +103 -0
  28. package/config/skills/orchestrator/wiki-migrate/execute.sh +82 -0
  29. package/config/skills/orchestrator/wiki-process-queue/SKILL.md +9 -1
  30. package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts +169 -0
  31. package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +1 -0
  32. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +1779 -0
  33. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +1 -0
  34. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +18 -0
  35. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
  36. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +63 -0
  37. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
  38. package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.d.ts.map +1 -1
  39. package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.js +5 -1
  40. package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.js.map +1 -1
  41. package/dist/backend/backend/src/controllers/wiki/wiki.controller.d.ts +109 -0
  42. package/dist/backend/backend/src/controllers/wiki/wiki.controller.d.ts.map +1 -1
  43. package/dist/backend/backend/src/controllers/wiki/wiki.controller.js +419 -4
  44. package/dist/backend/backend/src/controllers/wiki/wiki.controller.js.map +1 -1
  45. package/dist/backend/backend/src/controllers/wiki/wiki.routes.d.ts.map +1 -1
  46. package/dist/backend/backend/src/controllers/wiki/wiki.routes.js +11 -1
  47. package/dist/backend/backend/src/controllers/wiki/wiki.routes.js.map +1 -1
  48. package/dist/backend/backend/src/index.d.ts.map +1 -1
  49. package/dist/backend/backend/src/index.js +78 -3
  50. package/dist/backend/backend/src/index.js.map +1 -1
  51. package/dist/backend/backend/src/index.js.orc-bak-20260529 +3130 -0
  52. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts +513 -0
  53. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts.map +1 -0
  54. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js +1568 -0
  55. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js.map +1 -0
  56. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts +86 -0
  57. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts.map +1 -0
  58. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js +147 -0
  59. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js.map +1 -0
  60. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts +68 -0
  61. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts.map +1 -0
  62. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js +131 -0
  63. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js.map +1 -0
  64. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts +130 -0
  65. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts.map +1 -0
  66. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js +263 -0
  67. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js.map +1 -0
  68. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts +74 -0
  69. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts.map +1 -0
  70. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js +140 -0
  71. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js.map +1 -0
  72. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts +29 -0
  73. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts.map +1 -0
  74. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js +279 -0
  75. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js.map +1 -0
  76. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts +340 -0
  77. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts.map +1 -0
  78. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js +1176 -0
  79. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js.map +1 -0
  80. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts +79 -0
  81. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts.map +1 -0
  82. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js +145 -0
  83. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js.map +1 -0
  84. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts +79 -0
  85. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts.map +1 -0
  86. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js +218 -0
  87. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js.map +1 -0
  88. package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts +16 -0
  89. package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts.map +1 -0
  90. package/dist/backend/backend/src/services/agent/crewly-agent/index.js +16 -0
  91. package/dist/backend/backend/src/services/agent/crewly-agent/index.js.map +1 -0
  92. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts +135 -0
  93. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts.map +1 -0
  94. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js +185 -0
  95. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js.map +1 -0
  96. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts +141 -0
  97. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts.map +1 -0
  98. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js +310 -0
  99. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js.map +1 -0
  100. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts +91 -0
  101. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts.map +1 -0
  102. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js +143 -0
  103. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js.map +1 -0
  104. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts +103 -0
  105. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts.map +1 -0
  106. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js +256 -0
  107. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js.map +1 -0
  108. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts +143 -0
  109. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts.map +1 -0
  110. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js +264 -0
  111. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js.map +1 -0
  112. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts +13 -0
  113. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts.map +1 -0
  114. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js +91 -0
  115. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js.map +1 -0
  116. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts +135 -0
  117. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts.map +1 -0
  118. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js +1937 -0
  119. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js.map +1 -0
  120. package/dist/backend/backend/src/services/ai/prompt-builder.service.js +1 -1
  121. package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts +429 -0
  122. package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts.map +1 -0
  123. package/dist/backend/backend/src/services/autonomous/auto-assign.service.js +852 -0
  124. package/dist/backend/backend/src/services/autonomous/auto-assign.service.js.map +1 -0
  125. package/dist/backend/backend/src/services/project/task-tracking.service.d.ts +171 -0
  126. package/dist/backend/backend/src/services/project/task-tracking.service.d.ts.map +1 -0
  127. package/dist/backend/backend/src/services/project/task-tracking.service.js +725 -0
  128. package/dist/backend/backend/src/services/project/task-tracking.service.js.map +1 -0
  129. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
  130. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +50 -0
  131. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
  132. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +19 -0
  133. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  134. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +45 -0
  135. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  136. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts.map +1 -1
  137. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js +34 -1
  138. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js.map +1 -1
  139. package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts +118 -0
  140. package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts.map +1 -0
  141. package/dist/backend/backend/src/services/v3/project-task-watcher.service.js +326 -0
  142. package/dist/backend/backend/src/services/v3/project-task-watcher.service.js.map +1 -0
  143. package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.d.ts +72 -0
  144. package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.d.ts.map +1 -0
  145. package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.js +186 -0
  146. package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.js.map +1 -0
  147. package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts +27 -4
  148. package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts.map +1 -1
  149. package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js +133 -10
  150. package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js.map +1 -1
  151. package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.d.ts +18 -1
  152. package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.d.ts.map +1 -1
  153. package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.js +15 -4
  154. package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.js.map +1 -1
  155. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts +74 -0
  156. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts.map +1 -0
  157. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js +154 -0
  158. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js.map +1 -0
  159. package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.d.ts +160 -0
  160. package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.d.ts.map +1 -0
  161. package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.js +399 -0
  162. package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.js.map +1 -0
  163. package/dist/backend/backend/src/services/wiki/wiki-lint.service.d.ts +182 -0
  164. package/dist/backend/backend/src/services/wiki/wiki-lint.service.d.ts.map +1 -0
  165. package/dist/backend/backend/src/services/wiki/wiki-lint.service.js +505 -0
  166. package/dist/backend/backend/src/services/wiki/wiki-lint.service.js.map +1 -0
  167. package/dist/backend/backend/src/services/wiki/wiki-migrate.service.d.ts +232 -0
  168. package/dist/backend/backend/src/services/wiki/wiki-migrate.service.d.ts.map +1 -0
  169. package/dist/backend/backend/src/services/wiki/wiki-migrate.service.js +1416 -0
  170. package/dist/backend/backend/src/services/wiki/wiki-migrate.service.js.map +1 -0
  171. package/dist/backend/backend/src/services/wiki/wiki-recent.service.d.ts +51 -0
  172. package/dist/backend/backend/src/services/wiki/wiki-recent.service.d.ts.map +1 -0
  173. package/dist/backend/backend/src/services/wiki/wiki-recent.service.js +102 -0
  174. package/dist/backend/backend/src/services/wiki/wiki-recent.service.js.map +1 -0
  175. package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.d.ts +104 -0
  176. package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.d.ts.map +1 -0
  177. package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.js +229 -0
  178. package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.js.map +1 -0
  179. package/dist/backend/backend/src/services/wiki/wiki-search.service.d.ts +90 -0
  180. package/dist/backend/backend/src/services/wiki/wiki-search.service.d.ts.map +1 -0
  181. package/dist/backend/backend/src/services/wiki/wiki-search.service.js +190 -0
  182. package/dist/backend/backend/src/services/wiki/wiki-search.service.js.map +1 -0
  183. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts +164 -0
  184. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts.map +1 -0
  185. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js +675 -0
  186. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js.map +1 -0
  187. package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts.map +1 -1
  188. package/dist/backend/backend/src/services/workflow/cron-task.service.js +65 -0
  189. package/dist/backend/backend/src/services/workflow/cron-task.service.js.map +1 -1
  190. package/dist/backend/backend/src/types/auto-assign.types.d.ts +271 -0
  191. package/dist/backend/backend/src/types/auto-assign.types.d.ts.map +1 -0
  192. package/dist/backend/backend/src/types/auto-assign.types.js +136 -0
  193. package/dist/backend/backend/src/types/auto-assign.types.js.map +1 -0
  194. package/dist/backend/backend/src/types/cron-task.types.d.ts +16 -1
  195. package/dist/backend/backend/src/types/cron-task.types.d.ts.map +1 -1
  196. package/dist/backend/backend/src/utils/esm-require.utils.d.ts +111 -0
  197. package/dist/backend/backend/src/utils/esm-require.utils.d.ts.map +1 -0
  198. package/dist/backend/backend/src/utils/esm-require.utils.js +124 -0
  199. package/dist/backend/backend/src/utils/esm-require.utils.js.map +1 -0
  200. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +220 -0
  201. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +1 -0
  202. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js +37 -0
  203. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +1 -0
  204. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts +56 -0
  205. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts.map +1 -0
  206. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js +91 -0
  207. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js.map +1 -0
  208. package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts +159 -0
  209. package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts.map +1 -0
  210. package/dist/cli/backend/src/services/knowledge/learnings-index.service.js +304 -0
  211. package/dist/cli/backend/src/services/knowledge/learnings-index.service.js.map +1 -0
  212. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts +115 -0
  213. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts.map +1 -0
  214. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js +215 -0
  215. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js.map +1 -0
  216. package/dist/cli/backend/src/services/memory/embedding-provider.d.ts +78 -0
  217. package/dist/cli/backend/src/services/memory/embedding-provider.d.ts.map +1 -0
  218. package/dist/cli/backend/src/services/memory/embedding-provider.js +179 -0
  219. package/dist/cli/backend/src/services/memory/embedding-provider.js.map +1 -0
  220. package/dist/cli/backend/src/services/memory/vector-store.service.d.ts +331 -0
  221. package/dist/cli/backend/src/services/memory/vector-store.service.d.ts.map +1 -0
  222. package/dist/cli/backend/src/services/memory/vector-store.service.js +814 -0
  223. package/dist/cli/backend/src/services/memory/vector-store.service.js.map +1 -0
  224. package/dist/cli/backend/src/services/project/task-tracking.service.d.ts +171 -0
  225. package/dist/cli/backend/src/services/project/task-tracking.service.d.ts.map +1 -0
  226. package/dist/cli/backend/src/services/project/task-tracking.service.js +725 -0
  227. package/dist/cli/backend/src/services/project/task-tracking.service.js.map +1 -0
  228. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +19 -0
  229. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  230. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +45 -0
  231. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  232. package/dist/cli/backend/src/types/auto-assign.types.d.ts +271 -0
  233. package/dist/cli/backend/src/types/auto-assign.types.d.ts.map +1 -0
  234. package/dist/cli/backend/src/types/auto-assign.types.js +136 -0
  235. package/dist/cli/backend/src/types/auto-assign.types.js.map +1 -0
  236. package/dist/cli/cli/src/index.js +0 -0
  237. package/frontend/dist/assets/{index-db3f5041.css → index-068bb4f6.css} +10 -1
  238. package/frontend/dist/assets/index-c24ceb15.js +4960 -0
  239. package/frontend/dist/index.html +2 -2
  240. package/package.json +1 -1
  241. package/config/skills/agent/core/query-knowledge/SKILL.md +0 -87
  242. package/config/skills/agent/core/query-knowledge/execute.sh +0 -30
  243. package/config/skills/orchestrator/query-knowledge/SKILL.md +0 -75
  244. package/config/skills/orchestrator/query-knowledge/execute.sh +0 -30
  245. package/frontend/dist/assets/index-cc115bb4.js +0 -4926
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Auto-Assignment Type Definitions
3
+ *
4
+ * Types for the automatic task assignment system.
5
+ *
6
+ * @module types/auto-assign.types
7
+ */
8
+ // ======================
9
+ // Constants
10
+ // ======================
11
+ /**
12
+ * Auto-assignment related constants
13
+ */
14
+ export const AUTO_ASSIGN_CONSTANTS = {
15
+ /** Default configuration values */
16
+ DEFAULTS: {
17
+ MAX_CONCURRENT_TASKS: 1,
18
+ MAX_ASSIGNMENTS_PER_DAY: 50,
19
+ COOLDOWN_BETWEEN_TASKS: 60, // seconds
20
+ IDLE_THRESHOLD_MINUTES: 5,
21
+ },
22
+ /** Task type categories */
23
+ TASK_TYPES: {
24
+ DEVELOPMENT: ['feature', 'fix', 'refactor', 'implement'],
25
+ TESTING: ['test', 'verify', 'qa'],
26
+ FRONTEND: ['ui', 'component', 'style', 'frontend'],
27
+ BACKEND: ['api', 'service', 'database', 'backend'],
28
+ MANAGEMENT: ['planning', 'review', 'coordination', 'documentation'],
29
+ },
30
+ /** Priority levels */
31
+ PRIORITY: {
32
+ CRITICAL: 1,
33
+ HIGH: 2,
34
+ MEDIUM: 5,
35
+ LOW: 10,
36
+ BACKLOG: 20,
37
+ },
38
+ /** Configuration file paths */
39
+ PATHS: {
40
+ CONFIG_FILE: 'auto-assign.yaml',
41
+ CONFIG_DIR: '.crewly/config',
42
+ },
43
+ };
44
+ /**
45
+ * Default role matching rules
46
+ */
47
+ export const DEFAULT_ROLE_MATCHING = [
48
+ {
49
+ role: 'developer',
50
+ taskTypes: ['feature', 'fix', 'refactor', 'test', 'implement'],
51
+ priority: 1,
52
+ },
53
+ {
54
+ role: 'frontend-developer',
55
+ taskTypes: ['feature', 'fix', 'ui', 'component', 'style', 'frontend'],
56
+ priority: 1,
57
+ },
58
+ {
59
+ role: 'backend-developer',
60
+ taskTypes: ['feature', 'fix', 'api', 'service', 'database', 'backend'],
61
+ priority: 1,
62
+ },
63
+ {
64
+ role: 'qa',
65
+ taskTypes: ['test', 'review', 'verify', 'qa'],
66
+ priority: 1,
67
+ exclusive: true,
68
+ },
69
+ {
70
+ role: 'tester',
71
+ taskTypes: ['test', 'review', 'verify'],
72
+ priority: 2,
73
+ },
74
+ {
75
+ role: 'pm',
76
+ taskTypes: ['planning', 'review', 'coordination', 'documentation'],
77
+ priority: 1,
78
+ },
79
+ {
80
+ role: 'tpm',
81
+ taskTypes: ['planning', 'coordination', 'tracking'],
82
+ priority: 1,
83
+ },
84
+ {
85
+ role: 'pgm',
86
+ taskTypes: ['planning', 'management', 'coordination'],
87
+ priority: 1,
88
+ },
89
+ {
90
+ role: 'designer',
91
+ taskTypes: ['design', 'ui', 'ux', 'mockup'],
92
+ priority: 1,
93
+ exclusive: true,
94
+ },
95
+ ];
96
+ /**
97
+ * Default assignment strategy
98
+ */
99
+ export const DEFAULT_ASSIGNMENT_STRATEGY = {
100
+ prioritization: 'priority',
101
+ roleMatching: DEFAULT_ROLE_MATCHING,
102
+ loadBalancing: {
103
+ enabled: true,
104
+ maxConcurrentTasks: AUTO_ASSIGN_CONSTANTS.DEFAULTS.MAX_CONCURRENT_TASKS,
105
+ preferIdleAgents: true,
106
+ },
107
+ dependencies: {
108
+ respectBlocking: true,
109
+ waitForDependencies: true,
110
+ },
111
+ };
112
+ /**
113
+ * Default notification configuration
114
+ */
115
+ export const DEFAULT_NOTIFICATION_CONFIG = {
116
+ notifyOnIdle: true,
117
+ idleThresholdMinutes: AUTO_ASSIGN_CONSTANTS.DEFAULTS.IDLE_THRESHOLD_MINUTES,
118
+ notifyOnNoTasks: true,
119
+ };
120
+ /**
121
+ * Default assignment limits
122
+ */
123
+ export const DEFAULT_ASSIGNMENT_LIMITS = {
124
+ maxAssignmentsPerDay: AUTO_ASSIGN_CONSTANTS.DEFAULTS.MAX_ASSIGNMENTS_PER_DAY,
125
+ cooldownBetweenTasks: AUTO_ASSIGN_CONSTANTS.DEFAULTS.COOLDOWN_BETWEEN_TASKS,
126
+ };
127
+ /**
128
+ * Default complete auto-assignment configuration
129
+ */
130
+ export const DEFAULT_AUTO_ASSIGN_CONFIG = {
131
+ enabled: true,
132
+ strategy: DEFAULT_ASSIGNMENT_STRATEGY,
133
+ notifications: DEFAULT_NOTIFICATION_CONFIG,
134
+ limits: DEFAULT_ASSIGNMENT_LIMITS,
135
+ };
136
+ //# sourceMappingURL=auto-assign.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-assign.types.js","sourceRoot":"","sources":["../../../../../backend/src/types/auto-assign.types.ts"],"names":[],"mappings":"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"}
@@ -46,9 +46,24 @@ export interface CronTask {
46
46
  * - `agent_offline_start_failed` — callback threw or returned false
47
47
  * - `agent_offline_not_ready` — callback succeeded but agent
48
48
  * didn't come online within the wait window
49
- * Issue #305.
49
+ * - `agent_offline_retries_exhausted` — transient retries (#611) ran
50
+ * out; equivalent terminal-skip for the consumer
51
+ * Issue #305 / #611.
50
52
  */
51
53
  lastSkipReason?: string;
54
+ /**
55
+ * Transient-skip retry counter (#611, 2026-05-28). Incremented every
56
+ * time `agent_offline_not_ready` / `agent_offline_start_failed` would
57
+ * have produced a permanent skip; reset to 0 on any successful run.
58
+ * The cron-eval loop reads this to decide whether to push `nextRunAt`
59
+ * out by a short backoff (retry) vs. permanently skip the slot.
60
+ *
61
+ * Why a stored counter and not an in-memory one: cron eval can fire
62
+ * on a fresh process (restart) and we still want the retry budget to
63
+ * survive — otherwise a transient OS spike that happens to coincide
64
+ * with a backend bounce would defeat the retry mechanism entirely.
65
+ */
66
+ transientSkipAttempts?: number;
52
67
  }
53
68
  /**
54
69
  * Storage format for cron-tasks.json.
@@ -1 +1 @@
1
- {"version":3,"file":"cron-task.types.d.ts","sourceRoot":"","sources":["../../../../../backend/src/types/cron-task.types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;GAEG;AACH,MAAM,WAAW,QAAQ;IACxB,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,iEAAiE;IACjE,cAAc,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,eAAe,EAAE,MAAM,CAAC;IACxB,iCAAiC;IACjC,SAAS,EAAE,MAAM,GAAG,cAAc,CAAC;IACnC,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,0DAA0D;IAC1D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,QAAQ,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB"}
1
+ {"version":3,"file":"cron-task.types.d.ts","sourceRoot":"","sources":["../../../../../backend/src/types/cron-task.types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;GAEG;AACH,MAAM,WAAW,QAAQ;IACxB,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,iEAAiE;IACjE,cAAc,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,eAAe,EAAE,MAAM,CAAC;IACxB,iCAAiC;IACjC,SAAS,EAAE,MAAM,GAAG,cAAc,CAAC;IACnC,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,0DAA0D;IAC1D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B;;;;;;;;;OASG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;;;;;;;;OAWG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,QAAQ,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * ESM/CJS-dual-mode helpers for the lazy `nodeRequire` pattern.
3
+ *
4
+ * Background
5
+ * ----------
6
+ * Several services in this codebase use the canonical `nodeRequire` pattern
7
+ * (commit `070cd3e5` — `fix(esm): anchor createRequire to process.argv[1]`)
8
+ * to lazily load modules without forcing every test that transitively imports
9
+ * them to mock the dependency. The pattern looks like:
10
+ *
11
+ * const nodeRequire: NodeRequire =
12
+ * typeof require === 'function'
13
+ * ? require
14
+ * : createRequire(pathToFileURL(process.argv[1] || process.cwd()).href);
15
+ *
16
+ * That pattern works **only** for npm-package targets (e.g.
17
+ * `nodeRequire('better-sqlite3')`) — Node's resolver walks UP from the anchor
18
+ * (`process.argv[1]`) to find `node_modules`, so the anchor's exact location
19
+ * does not matter for package resolution.
20
+ *
21
+ * It silently breaks for **relative project paths** like
22
+ * `nodeRequire('../v3/request.service.js')`. In production ESM, the relative
23
+ * spec is resolved against `process.argv[1]` (the entry script) — NOT against
24
+ * the calling module — so the require fails with `Cannot find module …`. In
25
+ * tests (ts-jest CJS transpile) the per-module `require` parameter is used
26
+ * instead, so the relative spec resolves correctly against the calling file
27
+ * and the bug stays hidden.
28
+ *
29
+ * Symptom that motivated this helper: `core/get-my-active-work` returned 500
30
+ * with "Cannot find module '../v3/request.service.js'" because
31
+ * `ActiveWorkBriefingService.getInstance()` called
32
+ * `nodeRequire('../v3/request.service.js')` from
33
+ * `services/agent/active-work-briefing.service.js` while `nodeRequire` was
34
+ * anchored to `dist/backend/backend/src/index.js`.
35
+ *
36
+ * What this helper does
37
+ * ---------------------
38
+ * `resolveProjectModulePath(testRelativePath, prodPathFromEntryDir)` returns:
39
+ *
40
+ * 1. In test mode (`typeof require === 'function'` — ts-jest CJS) — the
41
+ * `testRelativePath` unchanged, so the per-module CJS require resolves it
42
+ * relative to the calling file (its existing, working behavior).
43
+ * 2. In production ESM — an absolute path computed by joining
44
+ * `path.dirname(process.argv[1])` with `prodPathFromEntryDir`.
45
+ * Absolute paths are accepted by `nodeRequire` regardless of anchor.
46
+ *
47
+ * Why this is two-arg rather than one
48
+ * -----------------------------------
49
+ * We considered single-arg variants:
50
+ * • `import.meta.url` — triggers TS1343 under ts-jest's CJS target. Even with
51
+ * `// @ts-expect-error`, ts-jest's transpile may still fail at parse.
52
+ * • `new Function('return import.meta.url')()` — was tried (PR #323) and is
53
+ * forbidden — `new Function` evaluates in non-module scope where
54
+ * `import.meta` is a SyntaxError. Crashed production at startup.
55
+ * • `eval('import.meta.url')` — works at runtime via direct-eval scope
56
+ * inheritance, but trips ESLint `no-eval` and is fragile across engines.
57
+ * • Stack-trace introspection — gross and slow.
58
+ *
59
+ * Asking the caller to spell out **two** equivalent paths (one usable from the
60
+ * caller's perspective, one usable from the entry script's perspective) is
61
+ * verbose but unambiguous, parse-clean under both TS targets, and free of any
62
+ * runtime tricks.
63
+ *
64
+ * Usage
65
+ * -----
66
+ * // Caller is at `backend/src/services/agent/active-work-briefing.service.ts`
67
+ * // Target is at `backend/src/services/v3/request.service.ts`
68
+ * // Entry script (process.argv[1]) is `dist/backend/backend/src/index.js`
69
+ * // → from the caller's perspective: `../v3/request.service.js`
70
+ * // → from the entry-script-dir's perspective: `services/v3/request.service.js`
71
+ *
72
+ * const spec = resolveProjectModulePath(
73
+ * '../v3/request.service.js',
74
+ * 'services/v3/request.service.js',
75
+ * );
76
+ * const { RequestService } = nodeRequire(spec);
77
+ *
78
+ * Test guard
79
+ * ----------
80
+ * `esm-require.utils.test.ts` exercises both branches and locks the contract
81
+ * (test branch ↔ untouched relative path; prod branch ↔ absolute path joined
82
+ * to `process.argv[1]`'s dirname).
83
+ *
84
+ * @module utils/esm-require.utils
85
+ */
86
+ /**
87
+ * Resolves a project-relative require spec to a string safe to pass to
88
+ * `nodeRequire` in both ts-jest CJS test mode and production ESM mode.
89
+ *
90
+ * @param testRelativePath - The require spec written from the calling file's
91
+ * perspective. Used verbatim in test mode (ts-jest CJS) where each module
92
+ * gets its own `require` and relative resolution Just Works. Example:
93
+ * `'../v3/request.service.js'`.
94
+ * @param prodPathFromEntryDir - The require spec rewritten as a path under
95
+ * `path.dirname(process.argv[1])`. Used in production ESM where
96
+ * `nodeRequire` is anchored to the entry script. Example:
97
+ * `'services/v3/request.service.js'` (under `dist/backend/backend/src/`).
98
+ * @returns A string suitable for `nodeRequire(...)`.
99
+ *
100
+ * @example
101
+ * ```typescript
102
+ * const { RequestService } = nodeRequire(
103
+ * resolveProjectModulePath(
104
+ * '../v3/request.service.js',
105
+ * 'services/v3/request.service.js',
106
+ * ),
107
+ * );
108
+ * ```
109
+ */
110
+ export declare function resolveProjectModulePath(testRelativePath: string, prodPathFromEntryDir: string): string;
111
+ //# sourceMappingURL=esm-require.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"esm-require.utils.d.ts","sourceRoot":"","sources":["../../../../../backend/src/utils/esm-require.utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoFG;AAIH;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,wBAAwB,CACtC,gBAAgB,EAAE,MAAM,EACxB,oBAAoB,EAAE,MAAM,GAC3B,MAAM,CAYR"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * ESM/CJS-dual-mode helpers for the lazy `nodeRequire` pattern.
3
+ *
4
+ * Background
5
+ * ----------
6
+ * Several services in this codebase use the canonical `nodeRequire` pattern
7
+ * (commit `070cd3e5` — `fix(esm): anchor createRequire to process.argv[1]`)
8
+ * to lazily load modules without forcing every test that transitively imports
9
+ * them to mock the dependency. The pattern looks like:
10
+ *
11
+ * const nodeRequire: NodeRequire =
12
+ * typeof require === 'function'
13
+ * ? require
14
+ * : createRequire(pathToFileURL(process.argv[1] || process.cwd()).href);
15
+ *
16
+ * That pattern works **only** for npm-package targets (e.g.
17
+ * `nodeRequire('better-sqlite3')`) — Node's resolver walks UP from the anchor
18
+ * (`process.argv[1]`) to find `node_modules`, so the anchor's exact location
19
+ * does not matter for package resolution.
20
+ *
21
+ * It silently breaks for **relative project paths** like
22
+ * `nodeRequire('../v3/request.service.js')`. In production ESM, the relative
23
+ * spec is resolved against `process.argv[1]` (the entry script) — NOT against
24
+ * the calling module — so the require fails with `Cannot find module …`. In
25
+ * tests (ts-jest CJS transpile) the per-module `require` parameter is used
26
+ * instead, so the relative spec resolves correctly against the calling file
27
+ * and the bug stays hidden.
28
+ *
29
+ * Symptom that motivated this helper: `core/get-my-active-work` returned 500
30
+ * with "Cannot find module '../v3/request.service.js'" because
31
+ * `ActiveWorkBriefingService.getInstance()` called
32
+ * `nodeRequire('../v3/request.service.js')` from
33
+ * `services/agent/active-work-briefing.service.js` while `nodeRequire` was
34
+ * anchored to `dist/backend/backend/src/index.js`.
35
+ *
36
+ * What this helper does
37
+ * ---------------------
38
+ * `resolveProjectModulePath(testRelativePath, prodPathFromEntryDir)` returns:
39
+ *
40
+ * 1. In test mode (`typeof require === 'function'` — ts-jest CJS) — the
41
+ * `testRelativePath` unchanged, so the per-module CJS require resolves it
42
+ * relative to the calling file (its existing, working behavior).
43
+ * 2. In production ESM — an absolute path computed by joining
44
+ * `path.dirname(process.argv[1])` with `prodPathFromEntryDir`.
45
+ * Absolute paths are accepted by `nodeRequire` regardless of anchor.
46
+ *
47
+ * Why this is two-arg rather than one
48
+ * -----------------------------------
49
+ * We considered single-arg variants:
50
+ * • `import.meta.url` — triggers TS1343 under ts-jest's CJS target. Even with
51
+ * `// @ts-expect-error`, ts-jest's transpile may still fail at parse.
52
+ * • `new Function('return import.meta.url')()` — was tried (PR #323) and is
53
+ * forbidden — `new Function` evaluates in non-module scope where
54
+ * `import.meta` is a SyntaxError. Crashed production at startup.
55
+ * • `eval('import.meta.url')` — works at runtime via direct-eval scope
56
+ * inheritance, but trips ESLint `no-eval` and is fragile across engines.
57
+ * • Stack-trace introspection — gross and slow.
58
+ *
59
+ * Asking the caller to spell out **two** equivalent paths (one usable from the
60
+ * caller's perspective, one usable from the entry script's perspective) is
61
+ * verbose but unambiguous, parse-clean under both TS targets, and free of any
62
+ * runtime tricks.
63
+ *
64
+ * Usage
65
+ * -----
66
+ * // Caller is at `backend/src/services/agent/active-work-briefing.service.ts`
67
+ * // Target is at `backend/src/services/v3/request.service.ts`
68
+ * // Entry script (process.argv[1]) is `dist/backend/backend/src/index.js`
69
+ * // → from the caller's perspective: `../v3/request.service.js`
70
+ * // → from the entry-script-dir's perspective: `services/v3/request.service.js`
71
+ *
72
+ * const spec = resolveProjectModulePath(
73
+ * '../v3/request.service.js',
74
+ * 'services/v3/request.service.js',
75
+ * );
76
+ * const { RequestService } = nodeRequire(spec);
77
+ *
78
+ * Test guard
79
+ * ----------
80
+ * `esm-require.utils.test.ts` exercises both branches and locks the contract
81
+ * (test branch ↔ untouched relative path; prod branch ↔ absolute path joined
82
+ * to `process.argv[1]`'s dirname).
83
+ *
84
+ * @module utils/esm-require.utils
85
+ */
86
+ import path from 'path';
87
+ /**
88
+ * Resolves a project-relative require spec to a string safe to pass to
89
+ * `nodeRequire` in both ts-jest CJS test mode and production ESM mode.
90
+ *
91
+ * @param testRelativePath - The require spec written from the calling file's
92
+ * perspective. Used verbatim in test mode (ts-jest CJS) where each module
93
+ * gets its own `require` and relative resolution Just Works. Example:
94
+ * `'../v3/request.service.js'`.
95
+ * @param prodPathFromEntryDir - The require spec rewritten as a path under
96
+ * `path.dirname(process.argv[1])`. Used in production ESM where
97
+ * `nodeRequire` is anchored to the entry script. Example:
98
+ * `'services/v3/request.service.js'` (under `dist/backend/backend/src/`).
99
+ * @returns A string suitable for `nodeRequire(...)`.
100
+ *
101
+ * @example
102
+ * ```typescript
103
+ * const { RequestService } = nodeRequire(
104
+ * resolveProjectModulePath(
105
+ * '../v3/request.service.js',
106
+ * 'services/v3/request.service.js',
107
+ * ),
108
+ * );
109
+ * ```
110
+ */
111
+ export function resolveProjectModulePath(testRelativePath, prodPathFromEntryDir) {
112
+ // The same `typeof require` probe the canonical `nodeRequire` pattern uses.
113
+ // Under ts-jest's CJS transpile, the per-module `require` parameter is
114
+ // defined and is the correct anchor for relative resolution. Under
115
+ // production ESM, `require` is undefined globally and we must hand
116
+ // `nodeRequire` an absolute path.
117
+ if (typeof require === 'function') {
118
+ return testRelativePath;
119
+ }
120
+ const entryScript = process.argv[1] || process.cwd();
121
+ const entryDir = path.dirname(entryScript);
122
+ return path.join(entryDir, prodPathFromEntryDir);
123
+ }
124
+ //# sourceMappingURL=esm-require.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"esm-require.utils.js","sourceRoot":"","sources":["../../../../../backend/src/utils/esm-require.utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoFG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,wBAAwB,CACtC,gBAAwB,EACxB,oBAA4B;IAE5B,4EAA4E;IAC5E,uEAAuE;IACvE,mEAAmE;IACnE,mEAAmE;IACnE,kCAAkC;IAClC,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;QAClC,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IACD,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,220 @@
1
+ /**
2
+ * Interface for modular prompt components.
3
+ *
4
+ * Each module is responsible for one concern (identity, skills, team, etc.)
5
+ * and produces a markdown string that gets assembled into the final agent prompt.
6
+ *
7
+ * Modules are assembled in priority order (1 = highest, assembled first).
8
+ * Non-compactable modules are never truncated when token budget is tight.
9
+ */
10
+ /**
11
+ * Configuration passed to each prompt module during assembly.
12
+ * Contains all the context needed to build module-specific content.
13
+ */
14
+ /**
15
+ * Organizational role derived from team hierarchy.
16
+ * Determines role boundary rules and event subscriptions.
17
+ */
18
+ export type OrgRole = 'orchestrator' | 'team-lead' | 'executor';
19
+ /**
20
+ * Autonomy level controls the decision rights matrix.
21
+ * - directed: Execute assigned tasks only, escalate all ambiguity.
22
+ * - bounded: Make decisions within task/domain scope, log rationale.
23
+ * - domain_autonomous: Monitor domain continuously, make approved decisions without waiting.
24
+ */
25
+ export type AutonomyLevel = 'directed' | 'bounded' | 'domain_autonomous';
26
+ export interface ModuleConfig {
27
+ /** Agent's session name (e.g. 'crewly-product-sam-217bfbbf') */
28
+ sessionName: string;
29
+ /** Agent's member ID (UUID) */
30
+ memberId: string;
31
+ /** Agent's role (e.g. 'developer', 'orchestrator') */
32
+ role: string;
33
+ /** Team ID this agent belongs to */
34
+ teamId?: string;
35
+ /** Absolute path to the project directory */
36
+ projectPath?: string;
37
+ /** Runtime type determines formatting and injection strategy */
38
+ runtimeType?: 'claude-code' | 'gemini-cli' | 'codex' | 'crewly-agent';
39
+ /** Whether this agent can delegate tasks to subordinates */
40
+ canDelegate?: boolean;
41
+ /** Resolved subordinate details for TL agents */
42
+ subordinates?: SubordinateInfoCompat[];
43
+ /** Absolute path to agent skill scripts */
44
+ agentSkillsPath: string;
45
+ /** Absolute path to team-leader skill scripts */
46
+ tlSkillsPath: string;
47
+ /** Absolute path to the project root (where config/ lives) */
48
+ projectRoot: string;
49
+ /** Organizational role derived from team hierarchy (orchestrator, team-lead, executor) */
50
+ orgRole?: OrgRole;
51
+ /** Autonomy level controlling the decision rights matrix */
52
+ autonomyLevel?: AutonomyLevel;
53
+ /** Capability flags (e.g., ['can-decide', 'can-verify']) */
54
+ capabilities?: string[];
55
+ /** Domain SOP name — loads config/domain-sops/{domainSOP}.sop.md */
56
+ domainSOP?: string;
57
+ /** Risk policy name — loads config/risk-policies/{riskPolicy}.policy.md */
58
+ riskPolicy?: string;
59
+ /** Job title for this position: "Frontend Tech Lead" */
60
+ jobTitle?: string;
61
+ /** What this member is responsible for */
62
+ jobDescription?: string;
63
+ /** Member-level ownership scope */
64
+ ownershipScope?: {
65
+ domains: string[];
66
+ deliverables: string[];
67
+ areas?: string[];
68
+ };
69
+ /** Team-level ownership scope */
70
+ teamOwnershipScope?: {
71
+ domains: string[];
72
+ deliverables: string[];
73
+ areas?: string[];
74
+ };
75
+ /** Team's service contract */
76
+ serviceContract?: {
77
+ accepts: string[];
78
+ avoids: string[];
79
+ expectedOutput: string[];
80
+ };
81
+ /** Expert profile ID — loads config/experts/{expertId}.md or Pro expert library */
82
+ expertId?: string;
83
+ /** Team description — injected into agent prompt to guide team-aligned behavior */
84
+ teamDescription?: string;
85
+ /** Team mission / OKR statement — injected into agent prompt for goal alignment */
86
+ teamMission?: string;
87
+ /** Team budget configuration — injected so agents can respect cost constraints */
88
+ teamBudget?: {
89
+ maxTokensPerDay?: number;
90
+ maxUsdPerMonth?: number;
91
+ alertThreshold?: number;
92
+ };
93
+ /** Team quality gate — injected so agents know review requirements */
94
+ teamQualityGate?: {
95
+ reviewerId?: string;
96
+ autoApprove?: boolean;
97
+ minQualityScore?: number;
98
+ };
99
+ /** Absolute path to team norms directory (from template application) */
100
+ teamNormsPath?: string;
101
+ /**
102
+ * Human-readable team slug used for resolving slug-named team files
103
+ * (e.g. `<teamSlug>-team-sub-okr.md` under `.crewly/goals/`).
104
+ * Populated by PromptBuilderService from team metadata when available.
105
+ * Optional — modules MUST tolerate undefined and skip slug-dependent
106
+ * sections silently.
107
+ */
108
+ teamSlug?: string;
109
+ /**
110
+ * Team-graph ancestor IDs (parent, grandparent, ...) used by modules
111
+ * that need to surface inherited org context such as parent-team
112
+ * missions / OKRs. Caller resolves the chain; modules consume it
113
+ * read-only. Empty / undefined means "no ancestors" — modules MUST
114
+ * default to a single-team view rather than error.
115
+ */
116
+ teamAncestorIds?: string[];
117
+ /**
118
+ * When true, the prompt assembler skips non-core modules to reduce token usage
119
+ * during eval runs. Core modules: identity, soul, role-boundary, recovery.
120
+ */
121
+ evalMode?: boolean;
122
+ }
123
+ /**
124
+ * Subordinate info compatible with the existing SubordinateInfo type
125
+ */
126
+ export interface SubordinateInfoCompat {
127
+ name: string;
128
+ sessionName: string;
129
+ role: string;
130
+ memberId: string;
131
+ }
132
+ /**
133
+ * Result of building a single prompt module.
134
+ * Includes the content and metadata for budget tracking.
135
+ */
136
+ export interface ModuleBuildResult {
137
+ /** Module name */
138
+ name: string;
139
+ /** Generated markdown content */
140
+ content: string;
141
+ /** Estimated token count of the content */
142
+ estimatedTokens: number;
143
+ }
144
+ /**
145
+ * Interface that all prompt modules must implement.
146
+ *
147
+ * @example
148
+ * ```typescript
149
+ * class IdentityModule implements PromptModule {
150
+ * name = 'identity';
151
+ * priority = 1;
152
+ * maxTokens = 150;
153
+ * compactable = false;
154
+ *
155
+ * shouldInclude(_config: ModuleConfig): boolean { return true; }
156
+ *
157
+ * async build(config: ModuleConfig): Promise<string> {
158
+ * return `## Your Identity\n- **Session Name:** ${config.sessionName}`;
159
+ * }
160
+ * }
161
+ * ```
162
+ */
163
+ export interface PromptModule {
164
+ /** Module name (used for logging and debugging) */
165
+ name: string;
166
+ /** Assembly priority (1 = highest, assembled first) */
167
+ priority: number;
168
+ /** Token soft cap for this module */
169
+ maxTokens: number;
170
+ /** Whether this module can be skipped when token budget is tight */
171
+ compactable: boolean;
172
+ /** Condition check — return false to skip this module */
173
+ shouldInclude(config: ModuleConfig): boolean;
174
+ /** Build module content as markdown string */
175
+ build(config: ModuleConfig): Promise<string>;
176
+ }
177
+ /**
178
+ * Report returned by PromptAssemblyService.assemble() describing
179
+ * token usage and any truncation that occurred.
180
+ */
181
+ export interface AssemblyReport {
182
+ /** Total estimated tokens in the final prompt */
183
+ totalTokens: number;
184
+ /** Per-module token breakdown */
185
+ moduleBreakdown: ModuleBuildResult[];
186
+ /** Modules that were truncated or removed to fit budget */
187
+ truncated: TruncatedModuleInfo[];
188
+ }
189
+ /**
190
+ * Info about a module that was truncated or removed during assembly.
191
+ */
192
+ export interface TruncatedModuleInfo {
193
+ /** Module name */
194
+ name: string;
195
+ /** Original estimated tokens before truncation */
196
+ originalTokens: number;
197
+ /** Tokens after truncation (0 if fully removed) */
198
+ finalTokens: number;
199
+ /** What happened: 'trimmed' (to 50%) or 'removed' (dropped entirely) */
200
+ action: 'trimmed' | 'removed';
201
+ }
202
+ /**
203
+ * Load a role-specific fragment file from config/roles/{role}/fragments/{fragmentName}.md.
204
+ * Returns null if the file doesn't exist.
205
+ *
206
+ * @param projectRoot - Project root path (where config/ lives)
207
+ * @param role - Agent role (e.g. 'orchestrator')
208
+ * @param fragmentName - Fragment file name without .md extension
209
+ * @returns Fragment content string or null
210
+ */
211
+ export declare function loadRoleFragment(projectRoot: string, role: string, fragmentName: string): string | null;
212
+ /**
213
+ * Estimate token count from a string.
214
+ * Uses the rough heuristic of ~4 characters per token (suitable for English/code mix).
215
+ *
216
+ * @param text - Text to estimate tokens for
217
+ * @returns Estimated token count
218
+ */
219
+ export declare function estimateTokens(text: string): number;
220
+ //# sourceMappingURL=prompt-module.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-module.interface.d.ts","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/prompt-module.interface.ts"],"names":[],"mappings":"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"}