crewly 1.15.0 → 1.17.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 (311) hide show
  1. package/README.md +39 -5
  2. package/config/roles/developer/prompt.md +1 -1
  3. package/config/roles/orchestrator/prompt.md +20 -5
  4. package/config/runtime_scripts/runtime-config.json +7 -0
  5. package/config/skills/agent/core/calendar-create/SKILL.md +62 -0
  6. package/config/skills/agent/core/calendar-create/execute.sh +91 -0
  7. package/config/skills/agent/core/calendar-create/execute.test.sh +80 -0
  8. package/config/skills/agent/core/calendar-list/SKILL.md +58 -0
  9. package/config/skills/agent/core/calendar-list/execute.sh +88 -0
  10. package/config/skills/agent/core/calendar-list/execute.test.sh +71 -0
  11. package/config/skills/agent/core/count-json/SKILL.md +61 -0
  12. package/config/skills/agent/core/count-json/execute.sh +52 -0
  13. package/config/skills/agent/core/count-json/execute.test.sh +35 -0
  14. package/config/skills/agent/core/gmail-read/SKILL.md +61 -0
  15. package/config/skills/agent/core/gmail-read/execute.sh +62 -0
  16. package/config/skills/agent/core/gmail-read/execute.test.sh +68 -0
  17. package/config/skills/agent/core/gmail-search/SKILL.md +64 -0
  18. package/config/skills/agent/core/gmail-search/execute.sh +70 -0
  19. package/config/skills/agent/core/gmail-search/execute.test.sh +67 -0
  20. package/config/skills/agent/core/gmail-send/SKILL.md +69 -0
  21. package/config/skills/agent/core/gmail-send/execute.sh +114 -0
  22. package/config/skills/agent/core/gmail-send/execute.test.sh +83 -0
  23. package/config/skills/agent/core/record-prediction/SKILL.md +61 -0
  24. package/config/skills/agent/core/record-prediction/execute.sh +90 -0
  25. package/config/skills/agent/core/record-prediction/execute.test.sh +67 -0
  26. package/config/skills/agent/core/resolve-prediction/SKILL.md +61 -0
  27. package/config/skills/agent/core/resolve-prediction/execute.sh +87 -0
  28. package/config/skills/agent/core/resolve-prediction/execute.test.sh +74 -0
  29. package/config/skills/agent/core/set-focus/SKILL.md +64 -0
  30. package/config/skills/agent/core/set-focus/execute.sh +73 -0
  31. package/config/skills/agent/core/set-focus/execute.test.sh +67 -0
  32. package/config/skills/agent/core/suppress-noise/SKILL.md +59 -0
  33. package/config/skills/agent/core/suppress-noise/execute.sh +68 -0
  34. package/config/skills/agent/core/suppress-noise/execute.test.sh +58 -0
  35. package/config/skills/orchestrator/list-missions/SKILL.md +47 -0
  36. package/config/skills/orchestrator/list-missions/execute.sh +34 -0
  37. package/config/skills/orchestrator/list-missions/execute.test.sh +33 -0
  38. package/config/slack-master-app-manifest.json +64 -0
  39. package/dist/backend/backend/src/constants.d.ts +186 -0
  40. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  41. package/dist/backend/backend/src/constants.js +196 -0
  42. package/dist/backend/backend/src/constants.js.map +1 -1
  43. package/dist/backend/backend/src/controllers/agent-self-improvement/agent-self-improvement.controller.d.ts +76 -0
  44. package/dist/backend/backend/src/controllers/agent-self-improvement/agent-self-improvement.controller.d.ts.map +1 -0
  45. package/dist/backend/backend/src/controllers/agent-self-improvement/agent-self-improvement.controller.js +262 -0
  46. package/dist/backend/backend/src/controllers/agent-self-improvement/agent-self-improvement.controller.js.map +1 -0
  47. package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -1
  48. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +3 -1
  49. package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -1
  50. package/dist/backend/backend/src/controllers/google/google.controller.d.ts +100 -0
  51. package/dist/backend/backend/src/controllers/google/google.controller.d.ts.map +1 -0
  52. package/dist/backend/backend/src/controllers/google/google.controller.js +293 -0
  53. package/dist/backend/backend/src/controllers/google/google.controller.js.map +1 -0
  54. package/dist/backend/backend/src/controllers/google/google.routes.d.ts +26 -0
  55. package/dist/backend/backend/src/controllers/google/google.routes.d.ts.map +1 -0
  56. package/dist/backend/backend/src/controllers/google/google.routes.js +38 -0
  57. package/dist/backend/backend/src/controllers/google/google.routes.js.map +1 -0
  58. package/dist/backend/backend/src/controllers/oauth/oauth.routes.d.ts.map +1 -1
  59. package/dist/backend/backend/src/controllers/oauth/oauth.routes.js +31 -0
  60. package/dist/backend/backend/src/controllers/oauth/oauth.routes.js.map +1 -1
  61. package/dist/backend/backend/src/controllers/request-types.d.ts +6 -2
  62. package/dist/backend/backend/src/controllers/request-types.d.ts.map +1 -1
  63. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
  64. package/dist/backend/backend/src/controllers/slack/slack.controller.js +209 -2
  65. package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
  66. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  67. package/dist/backend/backend/src/controllers/team/team.controller.js +4 -0
  68. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  69. package/dist/backend/backend/src/index.d.ts +1 -0
  70. package/dist/backend/backend/src/index.d.ts.map +1 -1
  71. package/dist/backend/backend/src/index.js +92 -8
  72. package/dist/backend/backend/src/index.js.map +1 -1
  73. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  74. package/dist/backend/backend/src/routes/api.routes.js +10 -0
  75. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  76. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +10 -0
  77. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  78. package/dist/backend/backend/src/services/agent/agent-registration.service.js +32 -4
  79. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  80. package/dist/backend/backend/src/services/agent/opencode-runtime.service.d.ts +114 -0
  81. package/dist/backend/backend/src/services/agent/opencode-runtime.service.d.ts.map +1 -0
  82. package/dist/backend/backend/src/services/agent/opencode-runtime.service.js +185 -0
  83. package/dist/backend/backend/src/services/agent/opencode-runtime.service.js.map +1 -0
  84. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
  85. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +22 -1
  86. package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  87. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts +1 -1
  88. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  89. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +15 -3
  90. package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  91. package/dist/backend/backend/src/services/agent/runtime-service.factory.d.ts.map +1 -1
  92. package/dist/backend/backend/src/services/agent/runtime-service.factory.js +9 -0
  93. package/dist/backend/backend/src/services/agent/runtime-service.factory.js.map +1 -1
  94. package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts +23 -0
  95. package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
  96. package/dist/backend/backend/src/services/ai/prompt-builder.service.js +45 -0
  97. package/dist/backend/backend/src/services/ai/prompt-builder.service.js.map +1 -1
  98. package/dist/backend/backend/src/services/ai/prompt-modules/memory-reference.module.d.ts +43 -3
  99. package/dist/backend/backend/src/services/ai/prompt-modules/memory-reference.module.d.ts.map +1 -1
  100. package/dist/backend/backend/src/services/ai/prompt-modules/memory-reference.module.js +85 -4
  101. package/dist/backend/backend/src/services/ai/prompt-modules/memory-reference.module.js.map +1 -1
  102. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +2 -0
  103. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +1 -1
  104. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +1 -1
  105. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  106. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +6 -0
  107. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  108. package/dist/backend/backend/src/services/ai/self-improvement/agent-memory-provider.d.ts +45 -0
  109. package/dist/backend/backend/src/services/ai/self-improvement/agent-memory-provider.d.ts.map +1 -0
  110. package/dist/backend/backend/src/services/ai/self-improvement/agent-memory-provider.js +59 -0
  111. package/dist/backend/backend/src/services/ai/self-improvement/agent-memory-provider.js.map +1 -0
  112. package/dist/backend/backend/src/services/ai/self-improvement/consolidation-scheduler.service.d.ts +137 -0
  113. package/dist/backend/backend/src/services/ai/self-improvement/consolidation-scheduler.service.d.ts.map +1 -0
  114. package/dist/backend/backend/src/services/ai/self-improvement/consolidation-scheduler.service.js +216 -0
  115. package/dist/backend/backend/src/services/ai/self-improvement/consolidation-scheduler.service.js.map +1 -0
  116. package/dist/backend/backend/src/services/ai/self-improvement/prediction-calibration.service.d.ts +4 -1
  117. package/dist/backend/backend/src/services/ai/self-improvement/prediction-calibration.service.d.ts.map +1 -1
  118. package/dist/backend/backend/src/services/ai/self-improvement/prediction-calibration.service.js +3 -1
  119. package/dist/backend/backend/src/services/ai/self-improvement/prediction-calibration.service.js.map +1 -1
  120. package/dist/backend/backend/src/services/cloud/cloud-initializer.d.ts +8 -0
  121. package/dist/backend/backend/src/services/cloud/cloud-initializer.d.ts.map +1 -1
  122. package/dist/backend/backend/src/services/cloud/cloud-initializer.js +25 -0
  123. package/dist/backend/backend/src/services/cloud/cloud-initializer.js.map +1 -1
  124. package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
  125. package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
  126. package/dist/backend/backend/src/services/cloud/cloud-sync.types.js +1 -0
  127. package/dist/backend/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
  128. package/dist/backend/backend/src/services/google/calendar.service.d.ts +98 -0
  129. package/dist/backend/backend/src/services/google/calendar.service.d.ts.map +1 -0
  130. package/dist/backend/backend/src/services/google/calendar.service.js +125 -0
  131. package/dist/backend/backend/src/services/google/calendar.service.js.map +1 -0
  132. package/dist/backend/backend/src/services/google/gmail.service.d.ts +165 -0
  133. package/dist/backend/backend/src/services/google/gmail.service.d.ts.map +1 -0
  134. package/dist/backend/backend/src/services/google/gmail.service.js +296 -0
  135. package/dist/backend/backend/src/services/google/gmail.service.js.map +1 -0
  136. package/dist/backend/backend/src/services/google/google-api.client.d.ts +44 -0
  137. package/dist/backend/backend/src/services/google/google-api.client.d.ts.map +1 -0
  138. package/dist/backend/backend/src/services/google/google-api.client.js +104 -0
  139. package/dist/backend/backend/src/services/google/google-api.client.js.map +1 -0
  140. package/dist/backend/backend/src/services/google/google-workspace-token.service.d.ts +159 -0
  141. package/dist/backend/backend/src/services/google/google-workspace-token.service.d.ts.map +1 -0
  142. package/dist/backend/backend/src/services/google/google-workspace-token.service.js +274 -0
  143. package/dist/backend/backend/src/services/google/google-workspace-token.service.js.map +1 -0
  144. package/dist/backend/backend/src/services/mcp-tool-definitions.d.ts +1 -1
  145. package/dist/backend/backend/src/services/mcp-tool-definitions.js +1 -1
  146. package/dist/backend/backend/src/services/mcp-tool-definitions.js.map +1 -1
  147. package/dist/backend/backend/src/services/runtime-adapter.d.ts +10 -1
  148. package/dist/backend/backend/src/services/runtime-adapter.d.ts.map +1 -1
  149. package/dist/backend/backend/src/services/runtime-adapter.js +12 -1
  150. package/dist/backend/backend/src/services/runtime-adapter.js.map +1 -1
  151. package/dist/backend/backend/src/services/settings/settings.service.d.ts.map +1 -1
  152. package/dist/backend/backend/src/services/settings/settings.service.js +1 -0
  153. package/dist/backend/backend/src/services/settings/settings.service.js.map +1 -1
  154. package/dist/backend/backend/src/services/slack/slack-agent-identity.service.d.ts +12 -1
  155. package/dist/backend/backend/src/services/slack/slack-agent-identity.service.d.ts.map +1 -1
  156. package/dist/backend/backend/src/services/slack/slack-agent-identity.service.js +30 -0
  157. package/dist/backend/backend/src/services/slack/slack-agent-identity.service.js.map +1 -1
  158. package/dist/backend/backend/src/services/slack/slack-cloud-config.service.d.ts +186 -0
  159. package/dist/backend/backend/src/services/slack/slack-cloud-config.service.d.ts.map +1 -0
  160. package/dist/backend/backend/src/services/slack/slack-cloud-config.service.js +409 -0
  161. package/dist/backend/backend/src/services/slack/slack-cloud-config.service.js.map +1 -0
  162. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts +95 -1
  163. package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
  164. package/dist/backend/backend/src/services/slack/slack-initializer.js +284 -4
  165. package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
  166. package/dist/backend/backend/src/services/slack/slack-instance-registry.service.d.ts +178 -0
  167. package/dist/backend/backend/src/services/slack/slack-instance-registry.service.d.ts.map +1 -0
  168. package/dist/backend/backend/src/services/slack/slack-instance-registry.service.js +392 -0
  169. package/dist/backend/backend/src/services/slack/slack-instance-registry.service.js.map +1 -0
  170. package/dist/backend/backend/src/services/slack/slack.service.d.ts +76 -1
  171. package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
  172. package/dist/backend/backend/src/services/slack/slack.service.js +234 -47
  173. package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
  174. package/dist/backend/backend/src/services/v3/fallback-trigger-cleanup.subscriber.d.ts +78 -0
  175. package/dist/backend/backend/src/services/v3/fallback-trigger-cleanup.subscriber.d.ts.map +1 -0
  176. package/dist/backend/backend/src/services/v3/fallback-trigger-cleanup.subscriber.js +129 -0
  177. package/dist/backend/backend/src/services/v3/fallback-trigger-cleanup.subscriber.js.map +1 -0
  178. package/dist/backend/backend/src/services/v3/kr-skill-measurer.service.d.ts +117 -0
  179. package/dist/backend/backend/src/services/v3/kr-skill-measurer.service.d.ts.map +1 -0
  180. package/dist/backend/backend/src/services/v3/kr-skill-measurer.service.js +214 -0
  181. package/dist/backend/backend/src/services/v3/kr-skill-measurer.service.js.map +1 -0
  182. package/dist/backend/backend/src/services/v3/mission-reminder.service.d.ts +6 -0
  183. package/dist/backend/backend/src/services/v3/mission-reminder.service.d.ts.map +1 -1
  184. package/dist/backend/backend/src/services/v3/mission-reminder.service.js +33 -0
  185. package/dist/backend/backend/src/services/v3/mission-reminder.service.js.map +1 -1
  186. package/dist/backend/backend/src/services/v3/okr-owner-guidance.service.d.ts +116 -0
  187. package/dist/backend/backend/src/services/v3/okr-owner-guidance.service.d.ts.map +1 -0
  188. package/dist/backend/backend/src/services/v3/okr-owner-guidance.service.js +254 -0
  189. package/dist/backend/backend/src/services/v3/okr-owner-guidance.service.js.map +1 -0
  190. package/dist/backend/backend/src/types/index.d.ts +11 -1
  191. package/dist/backend/backend/src/types/index.d.ts.map +1 -1
  192. package/dist/backend/backend/src/types/index.js.map +1 -1
  193. package/dist/backend/backend/src/types/settings.types.d.ts +1 -1
  194. package/dist/backend/backend/src/types/settings.types.d.ts.map +1 -1
  195. package/dist/backend/backend/src/types/settings.types.js +7 -0
  196. package/dist/backend/backend/src/types/settings.types.js.map +1 -1
  197. package/dist/backend/backend/src/types/slack.types.d.ts +141 -2
  198. package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -1
  199. package/dist/backend/backend/src/types/slack.types.js.map +1 -1
  200. package/dist/backend/backend/src/types/team-template.types.d.ts +2 -2
  201. package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -1
  202. package/dist/backend/backend/src/types/team-template.types.js +1 -1
  203. package/dist/backend/backend/src/types/team-template.types.js.map +1 -1
  204. package/dist/backend/backend/src/types/v2/mission.types.d.ts +2 -0
  205. package/dist/backend/backend/src/types/v2/mission.types.d.ts.map +1 -1
  206. package/dist/backend/backend/src/types/v2/mission.types.js.map +1 -1
  207. package/dist/backend/backend/src/utils/terminal-string-ops.d.ts +2 -0
  208. package/dist/backend/backend/src/utils/terminal-string-ops.d.ts.map +1 -1
  209. package/dist/backend/backend/src/utils/terminal-string-ops.js +14 -0
  210. package/dist/backend/backend/src/utils/terminal-string-ops.js.map +1 -1
  211. package/dist/backend/build-info.json +2 -2
  212. package/dist/cli/backend/src/constants.d.ts +186 -0
  213. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  214. package/dist/cli/backend/src/constants.js +196 -0
  215. package/dist/cli/backend/src/constants.js.map +1 -1
  216. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +10 -0
  217. package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  218. package/dist/cli/backend/src/services/agent/agent-registration.service.js +32 -4
  219. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  220. package/dist/cli/backend/src/services/agent/opencode-runtime.service.d.ts +114 -0
  221. package/dist/cli/backend/src/services/agent/opencode-runtime.service.d.ts.map +1 -0
  222. package/dist/cli/backend/src/services/agent/opencode-runtime.service.js +185 -0
  223. package/dist/cli/backend/src/services/agent/opencode-runtime.service.js.map +1 -0
  224. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
  225. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +22 -1
  226. package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
  227. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts +1 -1
  228. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
  229. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js +15 -3
  230. package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
  231. package/dist/cli/backend/src/services/agent/runtime-service.factory.d.ts.map +1 -1
  232. package/dist/cli/backend/src/services/agent/runtime-service.factory.js +9 -0
  233. package/dist/cli/backend/src/services/agent/runtime-service.factory.js.map +1 -1
  234. package/dist/cli/backend/src/services/ai/prompt-builder.service.d.ts +23 -0
  235. package/dist/cli/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
  236. package/dist/cli/backend/src/services/ai/prompt-builder.service.js +45 -0
  237. package/dist/cli/backend/src/services/ai/prompt-builder.service.js.map +1 -1
  238. package/dist/cli/backend/src/services/ai/prompt-modules/memory-reference.module.d.ts +43 -3
  239. package/dist/cli/backend/src/services/ai/prompt-modules/memory-reference.module.d.ts.map +1 -1
  240. package/dist/cli/backend/src/services/ai/prompt-modules/memory-reference.module.js +85 -4
  241. package/dist/cli/backend/src/services/ai/prompt-modules/memory-reference.module.js.map +1 -1
  242. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +2 -0
  243. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +1 -1
  244. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +1 -1
  245. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
  246. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +6 -0
  247. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  248. package/dist/cli/backend/src/services/ai/self-improvement/agent-memory-provider.d.ts +45 -0
  249. package/dist/cli/backend/src/services/ai/self-improvement/agent-memory-provider.d.ts.map +1 -0
  250. package/dist/cli/backend/src/services/ai/self-improvement/agent-memory-provider.js +59 -0
  251. package/dist/cli/backend/src/services/ai/self-improvement/agent-memory-provider.js.map +1 -0
  252. package/dist/cli/backend/src/services/ai/self-improvement/attention.service.d.ts +74 -0
  253. package/dist/cli/backend/src/services/ai/self-improvement/attention.service.d.ts.map +1 -0
  254. package/dist/cli/backend/src/services/ai/self-improvement/attention.service.js +132 -0
  255. package/dist/cli/backend/src/services/ai/self-improvement/attention.service.js.map +1 -0
  256. package/dist/cli/backend/src/services/ai/self-improvement/memory-consolidation.service.d.ts +107 -0
  257. package/dist/cli/backend/src/services/ai/self-improvement/memory-consolidation.service.d.ts.map +1 -0
  258. package/dist/cli/backend/src/services/ai/self-improvement/memory-consolidation.service.js +183 -0
  259. package/dist/cli/backend/src/services/ai/self-improvement/memory-consolidation.service.js.map +1 -0
  260. package/dist/cli/backend/src/services/ai/self-improvement/prediction-calibration.service.d.ts +100 -0
  261. package/dist/cli/backend/src/services/ai/self-improvement/prediction-calibration.service.d.ts.map +1 -0
  262. package/dist/cli/backend/src/services/ai/self-improvement/prediction-calibration.service.js +130 -0
  263. package/dist/cli/backend/src/services/ai/self-improvement/prediction-calibration.service.js.map +1 -0
  264. package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
  265. package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
  266. package/dist/cli/backend/src/services/cloud/cloud-sync.types.js +1 -0
  267. package/dist/cli/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
  268. package/dist/cli/backend/src/services/mcp-tool-definitions.d.ts +1 -1
  269. package/dist/cli/backend/src/services/mcp-tool-definitions.js +1 -1
  270. package/dist/cli/backend/src/services/mcp-tool-definitions.js.map +1 -1
  271. package/dist/cli/backend/src/services/settings/settings.service.d.ts.map +1 -1
  272. package/dist/cli/backend/src/services/settings/settings.service.js +1 -0
  273. package/dist/cli/backend/src/services/settings/settings.service.js.map +1 -1
  274. package/dist/cli/backend/src/services/slack/slack-agent-identity.service.d.ts +12 -1
  275. package/dist/cli/backend/src/services/slack/slack-agent-identity.service.d.ts.map +1 -1
  276. package/dist/cli/backend/src/services/slack/slack-agent-identity.service.js +30 -0
  277. package/dist/cli/backend/src/services/slack/slack-agent-identity.service.js.map +1 -1
  278. package/dist/cli/backend/src/services/slack/slack.service.d.ts +76 -1
  279. package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
  280. package/dist/cli/backend/src/services/slack/slack.service.js +234 -47
  281. package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
  282. package/dist/cli/backend/src/types/index.d.ts +11 -1
  283. package/dist/cli/backend/src/types/index.d.ts.map +1 -1
  284. package/dist/cli/backend/src/types/index.js.map +1 -1
  285. package/dist/cli/backend/src/types/settings.types.d.ts +1 -1
  286. package/dist/cli/backend/src/types/settings.types.d.ts.map +1 -1
  287. package/dist/cli/backend/src/types/settings.types.js +7 -0
  288. package/dist/cli/backend/src/types/settings.types.js.map +1 -1
  289. package/dist/cli/backend/src/types/slack.types.d.ts +141 -2
  290. package/dist/cli/backend/src/types/slack.types.d.ts.map +1 -1
  291. package/dist/cli/backend/src/types/slack.types.js.map +1 -1
  292. package/dist/cli/backend/src/types/team-template.types.d.ts +2 -2
  293. package/dist/cli/backend/src/types/team-template.types.d.ts.map +1 -1
  294. package/dist/cli/backend/src/types/team-template.types.js +1 -1
  295. package/dist/cli/backend/src/types/team-template.types.js.map +1 -1
  296. package/dist/cli/backend/src/types/v2/mission.types.d.ts +2 -0
  297. package/dist/cli/backend/src/types/v2/mission.types.d.ts.map +1 -1
  298. package/dist/cli/backend/src/types/v2/mission.types.js.map +1 -1
  299. package/dist/cli/backend/src/utils/terminal-string-ops.d.ts +2 -0
  300. package/dist/cli/backend/src/utils/terminal-string-ops.d.ts.map +1 -1
  301. package/dist/cli/backend/src/utils/terminal-string-ops.js +14 -0
  302. package/dist/cli/backend/src/utils/terminal-string-ops.js.map +1 -1
  303. package/dist/cli/cli/src/commands/onboard.d.ts +2 -2
  304. package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
  305. package/dist/cli/cli/src/commands/onboard.js +15 -7
  306. package/dist/cli/cli/src/commands/onboard.js.map +1 -1
  307. package/frontend/dist/assets/{index-203224f9.js → index-c87332bf.js} +278 -278
  308. package/frontend/dist/assets/index-f6b4230e.css +42 -0
  309. package/frontend/dist/index.html +2 -2
  310. package/package.json +1 -1
  311. package/frontend/dist/assets/index-dcaf6c88.css +0 -42
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Fallback Trigger Cleanup — cancels a delegation's "fallback check" timer
3
+ * the moment the delegated WorkItem reaches a terminal status.
4
+ *
5
+ * `delegate-task` arms a one-shot time trigger named
6
+ * `fallback-<target>-<wi8>` whose action creates a self-targeted "Fallback
7
+ * check on <target> for task <wi8>" WorkItem for the orchestrator. Nothing
8
+ * ever cancelled it, so on steamfun-ops it fired after every delegation
9
+ * whether the work was long verified or not: 26 of 65 real WorkItems in
10
+ * three days were these checks, each one a full orchestrator turn
11
+ * (2026-09-18). The skill's default was raised to 2 h; this subscriber
12
+ * removes the timer as soon as the work is done, verified or cancelled so it
13
+ * never fires for finished work at all.
14
+ *
15
+ * @module services/v3/fallback-trigger-cleanup.subscriber
16
+ */
17
+ import { LoggerService } from '../core/logger.service.js';
18
+ import { formatError } from '../../utils/format-error.js';
19
+ import { TriggerEngine } from './trigger-engine.service.js';
20
+ /** Events after which a delegation's fallback timer is pointless. */
21
+ export const FALLBACK_CLEANUP_EVENTS = [
22
+ 'task:done',
23
+ 'task:verified',
24
+ 'task:cancelled',
25
+ ];
26
+ /** Length of the WorkItem-id prefix `delegate-task` puts in the trigger name. */
27
+ const WI_ID_PREFIX_LENGTH = 8;
28
+ /**
29
+ * Name `delegate-task` gives the fallback timer for a WorkItem.
30
+ *
31
+ * @param workItemId - Full WorkItem id
32
+ * @param target - Session the work was delegated to
33
+ * @returns The trigger name
34
+ */
35
+ export function fallbackTriggerName(workItemId, target) {
36
+ return `fallback-${target}-${workItemId.slice(0, WI_ID_PREFIX_LENGTH)}`;
37
+ }
38
+ /**
39
+ * Whether a trigger is the fallback timer for the given WorkItem, regardless
40
+ * of target (the event may not carry the target session).
41
+ *
42
+ * @param trigger - Candidate trigger
43
+ * @param workItemId - Full WorkItem id
44
+ * @returns True when the name matches `fallback-*-<wi8>`
45
+ */
46
+ export function isFallbackTriggerFor(trigger, workItemId) {
47
+ const name = trigger.name ?? '';
48
+ return name.startsWith('fallback-') && name.endsWith(`-${workItemId.slice(0, WI_ID_PREFIX_LENGTH)}`);
49
+ }
50
+ /**
51
+ * Subscribes to task terminal events and cancels matching fallback timers.
52
+ */
53
+ export class FallbackTriggerCleanupSubscriber {
54
+ logger;
55
+ eventBus;
56
+ triggers;
57
+ unsubscribers = [];
58
+ started = false;
59
+ constructor(deps) {
60
+ this.logger = LoggerService.getInstance().createComponentLogger('FallbackTriggerCleanup');
61
+ this.eventBus = deps.eventBus;
62
+ this.triggers = deps.triggers;
63
+ }
64
+ /**
65
+ * Production wiring.
66
+ *
67
+ * @param eventBus - The process event bus
68
+ * @returns A subscriber bound to the trigger engine singleton
69
+ */
70
+ static boot(eventBus) {
71
+ return new FallbackTriggerCleanupSubscriber({ eventBus, triggers: TriggerEngine.getInstance() });
72
+ }
73
+ /** Subscribe. Idempotent. */
74
+ start() {
75
+ if (this.started)
76
+ return;
77
+ this.started = true;
78
+ for (const eventType of FALLBACK_CLEANUP_EVENTS) {
79
+ this.unsubscribers.push(this.eventBus.onInProcess(eventType, (e) => {
80
+ void this.handle(e).catch((err) => {
81
+ this.logger.warn('Fallback trigger cleanup failed', { eventType, error: formatError(err) });
82
+ });
83
+ }));
84
+ }
85
+ this.logger.info('FallbackTriggerCleanup subscribed', { eventTypes: [...FALLBACK_CLEANUP_EVENTS] });
86
+ }
87
+ /** Unsubscribe. Safe to call twice. */
88
+ stop() {
89
+ for (const u of this.unsubscribers) {
90
+ try {
91
+ u();
92
+ }
93
+ catch {
94
+ // ignore
95
+ }
96
+ }
97
+ this.unsubscribers = [];
98
+ this.started = false;
99
+ }
100
+ /**
101
+ * Cancel every live fallback timer for the event's WorkItem.
102
+ *
103
+ * @param event - A task terminal event
104
+ * @returns Number of triggers cancelled
105
+ */
106
+ async handle(event) {
107
+ const workItemId = event.workItemId;
108
+ if (!workItemId)
109
+ return 0;
110
+ let cancelled = 0;
111
+ for (const trigger of this.triggers.list()) {
112
+ if (trigger.status !== 'active' && trigger.status !== 'paused')
113
+ continue;
114
+ if (!isFallbackTriggerFor(trigger, workItemId))
115
+ continue;
116
+ if (await this.triggers.cancel(trigger.id)) {
117
+ cancelled += 1;
118
+ this.logger.info('Cancelled fallback timer for finished WorkItem', {
119
+ workItemId,
120
+ triggerId: trigger.id,
121
+ name: trigger.name,
122
+ event: event.type,
123
+ });
124
+ }
125
+ }
126
+ return cancelled;
127
+ }
128
+ }
129
+ //# sourceMappingURL=fallback-trigger-cleanup.subscriber.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallback-trigger-cleanup.subscriber.js","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/fallback-trigger-cleanup.subscriber.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * KR Skill Measurer — fills `measurementSource: 'skill_output'` Key Results
3
+ * from a skill's JSON output.
4
+ *
5
+ * Until 2026-09-18 a KR's value had exactly three ways to change and all of
6
+ * them were a hand-made API call, so "tickets waiting for acceptance" or
7
+ * "build pass rate" could only be tracked by someone remembering to type the
8
+ * number in. A KR configured as
9
+ *
10
+ * ```json
11
+ * { "measurementSource": "skill_output",
12
+ * "measurementConfig": { "skill": "steamfun-ticket-count",
13
+ * "args": { "status": "review" },
14
+ * "jsonPath": ".count" } }
15
+ * ```
16
+ *
17
+ * is now measured on every mission sweep: the named skill's `execute.sh` is
18
+ * run with the JSON args, the number at `jsonPath` is read from its stdout
19
+ * and recorded as a measurement (deduped when unchanged since the last one).
20
+ *
21
+ * Safety: `skill` is a bare name (`[a-z0-9-]`) resolved against the known
22
+ * skill roots only — never a path — and runs with a hard timeout and a
23
+ * bounded output size. This is the same trust boundary as an agent running
24
+ * the skill itself, not a new one.
25
+ *
26
+ * @module services/v3/kr-skill-measurer.service
27
+ */
28
+ import { KRTrackingService } from './kr-tracking.service.js';
29
+ import type { KeyResult } from '../../types/v2/key-result.types.js';
30
+ /** Shape of `measurementConfig` for a `skill_output` KR. */
31
+ export interface SkillOutputMeasurementConfig {
32
+ /** Bare skill directory name, e.g. `steamfun-ticket-count`. */
33
+ skill: string;
34
+ /** JSON object passed to the skill as its single argument. */
35
+ args?: Record<string, unknown>;
36
+ /** Dot path into the skill's JSON stdout, e.g. `.count` or `.data.total`. Default `.value`. */
37
+ jsonPath?: string;
38
+ }
39
+ /** What one measurement attempt produced. */
40
+ export interface SkillMeasurementOutcome {
41
+ krId: string;
42
+ status: 'recorded' | 'unchanged' | 'skipped' | 'failed';
43
+ value?: number;
44
+ reason?: string;
45
+ }
46
+ /** Runs a resolved skill and returns its stdout. Injectable for tests. */
47
+ export type SkillRunner = (executePath: string, argsJson: string, timeoutMs: number) => Promise<string>;
48
+ /**
49
+ * Default runner: `bash <execute.sh> '<json>'` with a timeout and output cap.
50
+ *
51
+ * @param executePath - Absolute path of the skill's execute.sh
52
+ * @param argsJson - JSON argument string
53
+ * @param timeoutMs - Kill the skill after this long
54
+ * @returns stdout
55
+ */
56
+ export declare const defaultSkillRunner: SkillRunner;
57
+ /**
58
+ * Read a dot path (`.a.b.c`, leading dot optional) out of parsed JSON.
59
+ *
60
+ * @param value - Parsed JSON
61
+ * @param jsonPath - Dot path
62
+ * @returns The value at the path, or undefined
63
+ */
64
+ export declare function readJsonPath(value: unknown, jsonPath: string): unknown;
65
+ /**
66
+ * Coerce a skill output value to a number: numbers as is, booleans to 1/0,
67
+ * numeric strings parsed. Anything else is undefined.
68
+ *
69
+ * @param raw - Value read from the skill output
70
+ * @returns A finite number or undefined
71
+ */
72
+ export declare function coerceMeasurement(raw: unknown): number | undefined;
73
+ /**
74
+ * Measures `skill_output` Key Results by running their skill.
75
+ */
76
+ export declare class KRSkillMeasurerService {
77
+ private static instance;
78
+ private readonly logger;
79
+ private readonly runner;
80
+ private readonly skillRoots;
81
+ private readonly krTracking;
82
+ /**
83
+ * @param opts - Test seams: skill roots to search, a runner, a KR service
84
+ */
85
+ constructor(opts?: {
86
+ skillRoots?: string[];
87
+ runner?: SkillRunner;
88
+ krTracking?: KRTrackingService;
89
+ projectRoot?: string;
90
+ });
91
+ static getInstance(): KRSkillMeasurerService;
92
+ static setInstance(next: KRSkillMeasurerService | null): void;
93
+ /**
94
+ * Resolve a bare skill name to its `execute.sh`, searching the known roots.
95
+ *
96
+ * @param skill - Bare directory name
97
+ * @returns Absolute path, or null when the name is invalid or not found
98
+ */
99
+ resolveSkill(skill: string): string | null;
100
+ /**
101
+ * Measure every `skill_output` KR of a mission. Failure-soft: one KR's
102
+ * error never stops the others, and nothing throws to the sweep.
103
+ *
104
+ * @param missionId - Mission whose KRs to measure
105
+ * @returns One outcome per skill_output KR
106
+ */
107
+ measureMission(missionId: string): Promise<SkillMeasurementOutcome[]>;
108
+ /**
109
+ * Measure one KR. Exposed for the manual `POST …/measure-now` path.
110
+ *
111
+ * @param missionId - Owning mission
112
+ * @param kr - The KR (must be `skill_output`)
113
+ * @returns The outcome
114
+ */
115
+ measureOne(missionId: string, kr: KeyResult): Promise<SkillMeasurementOutcome>;
116
+ }
117
+ //# sourceMappingURL=kr-skill-measurer.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kr-skill-measurer.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/kr-skill-measurer.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAOH,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAGpE,4DAA4D;AAC5D,MAAM,WAAW,4BAA4B;IAC3C,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,6CAA6C;AAC7C,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,0EAA0E;AAC1E,MAAM,MAAM,WAAW,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAIxG;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,EAAE,WAa7B,CAAC;AAEL;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAQtE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAQlE;AAED;;GAEG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAuC;IAC9D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAW;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAE/C;;OAEG;gBACS,IAAI,GAAE;QAAE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,UAAU,CAAC,EAAE,iBAAiB,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO;IAe5H,MAAM,CAAC,WAAW,IAAI,sBAAsB;IAK5C,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,sBAAsB,GAAG,IAAI,GAAG,IAAI;IAI7D;;;;;OAKG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAS1C;;;;;;OAMG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAmB3E;;;;;;OAMG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,uBAAuB,CAAC;CAuCrF"}
@@ -0,0 +1,214 @@
1
+ /**
2
+ * KR Skill Measurer — fills `measurementSource: 'skill_output'` Key Results
3
+ * from a skill's JSON output.
4
+ *
5
+ * Until 2026-09-18 a KR's value had exactly three ways to change and all of
6
+ * them were a hand-made API call, so "tickets waiting for acceptance" or
7
+ * "build pass rate" could only be tracked by someone remembering to type the
8
+ * number in. A KR configured as
9
+ *
10
+ * ```json
11
+ * { "measurementSource": "skill_output",
12
+ * "measurementConfig": { "skill": "steamfun-ticket-count",
13
+ * "args": { "status": "review" },
14
+ * "jsonPath": ".count" } }
15
+ * ```
16
+ *
17
+ * is now measured on every mission sweep: the named skill's `execute.sh` is
18
+ * run with the JSON args, the number at `jsonPath` is read from its stdout
19
+ * and recorded as a measurement (deduped when unchanged since the last one).
20
+ *
21
+ * Safety: `skill` is a bare name (`[a-z0-9-]`) resolved against the known
22
+ * skill roots only — never a path — and runs with a hard timeout and a
23
+ * bounded output size. This is the same trust boundary as an agent running
24
+ * the skill itself, not a new one.
25
+ *
26
+ * @module services/v3/kr-skill-measurer.service
27
+ */
28
+ import { execFile } from 'child_process';
29
+ import * as fs from 'fs';
30
+ import * as os from 'os';
31
+ import * as path from 'path';
32
+ import { LoggerService } from '../core/logger.service.js';
33
+ import { KRTrackingService } from './kr-tracking.service.js';
34
+ import { KR_SKILL_MEASURER_CONSTANTS } from '../../constants.js';
35
+ const SKILL_NAME_RE = /^[a-z0-9][a-z0-9-]{0,63}$/;
36
+ /**
37
+ * Default runner: `bash <execute.sh> '<json>'` with a timeout and output cap.
38
+ *
39
+ * @param executePath - Absolute path of the skill's execute.sh
40
+ * @param argsJson - JSON argument string
41
+ * @param timeoutMs - Kill the skill after this long
42
+ * @returns stdout
43
+ */
44
+ export const defaultSkillRunner = (executePath, argsJson, timeoutMs) => new Promise((resolve, reject) => {
45
+ execFile('bash', [executePath, argsJson], {
46
+ timeout: timeoutMs,
47
+ maxBuffer: KR_SKILL_MEASURER_CONSTANTS.MAX_OUTPUT_BYTES,
48
+ cwd: path.dirname(executePath),
49
+ env: { ...process.env, CREWLY_SKILL_FULL_OUTPUT: '1' },
50
+ }, (err, stdout) => (err ? reject(err) : resolve(String(stdout))));
51
+ });
52
+ /**
53
+ * Read a dot path (`.a.b.c`, leading dot optional) out of parsed JSON.
54
+ *
55
+ * @param value - Parsed JSON
56
+ * @param jsonPath - Dot path
57
+ * @returns The value at the path, or undefined
58
+ */
59
+ export function readJsonPath(value, jsonPath) {
60
+ const parts = jsonPath.replace(/^\./, '').split('.').filter(Boolean);
61
+ let cur = value;
62
+ for (const part of parts) {
63
+ if (cur === null || typeof cur !== 'object')
64
+ return undefined;
65
+ cur = cur[part];
66
+ }
67
+ return cur;
68
+ }
69
+ /**
70
+ * Coerce a skill output value to a number: numbers as is, booleans to 1/0,
71
+ * numeric strings parsed. Anything else is undefined.
72
+ *
73
+ * @param raw - Value read from the skill output
74
+ * @returns A finite number or undefined
75
+ */
76
+ export function coerceMeasurement(raw) {
77
+ if (typeof raw === 'number')
78
+ return Number.isFinite(raw) ? raw : undefined;
79
+ if (typeof raw === 'boolean')
80
+ return raw ? 1 : 0;
81
+ if (typeof raw === 'string' && raw.trim() !== '') {
82
+ const n = Number(raw);
83
+ return Number.isFinite(n) ? n : undefined;
84
+ }
85
+ return undefined;
86
+ }
87
+ /**
88
+ * Measures `skill_output` Key Results by running their skill.
89
+ */
90
+ export class KRSkillMeasurerService {
91
+ static instance = null;
92
+ logger;
93
+ runner;
94
+ skillRoots;
95
+ krTracking;
96
+ /**
97
+ * @param opts - Test seams: skill roots to search, a runner, a KR service
98
+ */
99
+ constructor(opts = {}) {
100
+ this.logger = LoggerService.getInstance().createComponentLogger('KRSkillMeasurer');
101
+ this.runner = opts.runner ?? defaultSkillRunner;
102
+ this.krTracking = opts.krTracking ?? KRTrackingService.getInstance();
103
+ const projectRoot = opts.projectRoot ?? process.cwd();
104
+ this.skillRoots = opts.skillRoots ?? [
105
+ path.join(os.homedir(), '.crewly', 'skills', 'agent'),
106
+ path.join(os.homedir(), '.crewly', 'marketplace', 'skills'),
107
+ path.join(projectRoot, 'config', 'skills', 'agent'),
108
+ path.join(projectRoot, 'config', 'skills', 'agent', 'core'),
109
+ path.join(projectRoot, 'config', 'skills', 'orchestrator'),
110
+ path.join(projectRoot, 'config', 'skills', 'team-leader'),
111
+ ];
112
+ }
113
+ static getInstance() {
114
+ if (!this.instance)
115
+ this.instance = new KRSkillMeasurerService();
116
+ return this.instance;
117
+ }
118
+ static setInstance(next) {
119
+ this.instance = next;
120
+ }
121
+ /**
122
+ * Resolve a bare skill name to its `execute.sh`, searching the known roots.
123
+ *
124
+ * @param skill - Bare directory name
125
+ * @returns Absolute path, or null when the name is invalid or not found
126
+ */
127
+ resolveSkill(skill) {
128
+ if (!SKILL_NAME_RE.test(skill))
129
+ return null;
130
+ for (const root of this.skillRoots) {
131
+ const candidate = path.join(root, skill, 'execute.sh');
132
+ if (fs.existsSync(candidate))
133
+ return candidate;
134
+ }
135
+ return null;
136
+ }
137
+ /**
138
+ * Measure every `skill_output` KR of a mission. Failure-soft: one KR's
139
+ * error never stops the others, and nothing throws to the sweep.
140
+ *
141
+ * @param missionId - Mission whose KRs to measure
142
+ * @returns One outcome per skill_output KR
143
+ */
144
+ async measureMission(missionId) {
145
+ let krs;
146
+ try {
147
+ krs = await this.krTracking.listByMission(missionId);
148
+ }
149
+ catch (err) {
150
+ this.logger.warn('Could not list KRs for skill measurement', {
151
+ missionId,
152
+ error: err instanceof Error ? err.message : String(err),
153
+ });
154
+ return [];
155
+ }
156
+ const outcomes = [];
157
+ for (const kr of krs) {
158
+ if (kr.measurementSource !== 'skill_output')
159
+ continue;
160
+ outcomes.push(await this.measureOne(missionId, kr));
161
+ }
162
+ return outcomes;
163
+ }
164
+ /**
165
+ * Measure one KR. Exposed for the manual `POST …/measure-now` path.
166
+ *
167
+ * @param missionId - Owning mission
168
+ * @param kr - The KR (must be `skill_output`)
169
+ * @returns The outcome
170
+ */
171
+ async measureOne(missionId, kr) {
172
+ const cfg = (kr.measurementConfig ?? {});
173
+ if (typeof cfg.skill !== 'string') {
174
+ return { krId: kr.id, status: 'skipped', reason: 'measurementConfig.skill missing' };
175
+ }
176
+ const executePath = this.resolveSkill(cfg.skill);
177
+ if (!executePath) {
178
+ return { krId: kr.id, status: 'failed', reason: `skill not found: ${cfg.skill}` };
179
+ }
180
+ let stdout;
181
+ try {
182
+ stdout = await this.runner(executePath, JSON.stringify(cfg.args ?? {}), KR_SKILL_MEASURER_CONSTANTS.TIMEOUT_MS);
183
+ }
184
+ catch (err) {
185
+ const reason = err instanceof Error ? err.message : String(err);
186
+ this.logger.warn('skill_output measurement failed', { missionId, krId: kr.id, skill: cfg.skill, reason });
187
+ return { krId: kr.id, status: 'failed', reason };
188
+ }
189
+ let parsed;
190
+ try {
191
+ const start = stdout.search(/[[{]/);
192
+ parsed = JSON.parse(start >= 0 ? stdout.slice(start) : stdout);
193
+ }
194
+ catch {
195
+ return { krId: kr.id, status: 'failed', reason: 'skill output is not JSON' };
196
+ }
197
+ const value = coerceMeasurement(readJsonPath(parsed, cfg.jsonPath ?? KR_SKILL_MEASURER_CONSTANTS.DEFAULT_JSON_PATH));
198
+ if (value === undefined) {
199
+ return { krId: kr.id, status: 'failed', reason: `no number at ${cfg.jsonPath ?? KR_SKILL_MEASURER_CONSTANTS.DEFAULT_JSON_PATH}` };
200
+ }
201
+ if (kr.measurements.length > 0 && kr.current === value) {
202
+ return { krId: kr.id, status: 'unchanged', value };
203
+ }
204
+ try {
205
+ await this.krTracking.recordMeasurement(missionId, kr.id, value, 'skill_output', `skill ${cfg.skill}`);
206
+ }
207
+ catch (err) {
208
+ return { krId: kr.id, status: 'failed', reason: err instanceof Error ? err.message : String(err) };
209
+ }
210
+ this.logger.info('KR measured from skill output', { missionId, krId: kr.id, skill: cfg.skill, value });
211
+ return { krId: kr.id, status: 'recorded', value };
212
+ }
213
+ }
214
+ //# sourceMappingURL=kr-skill-measurer.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kr-skill-measurer.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/kr-skill-measurer.service.ts"],"names":[],"mappings":"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"}
@@ -112,6 +112,12 @@ export declare class MissionReminderService {
112
112
  reviewsAutoContinued: number;
113
113
  /** Missions flagged stale this sweep (`mission:stale` published, staleCycles bumped). */
114
114
  staleFlagged: number;
115
+ /** KRs re-measured from skill output this sweep */
116
+ skillMeasured: number;
117
+ /** Pending proposals the owner was nudged about this sweep */
118
+ proposalsNudged: number;
119
+ /** Whether the weekly digest went out this sweep */
120
+ digestSent: boolean;
115
121
  }>;
116
122
  /**
117
123
  * Result of {@link maybeCreateReviewWorkItem} — `'created'` when a new
@@ -1 +1 @@
1
- {"version":3,"file":"mission-reminder.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/mission-reminder.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAWH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAUzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAOvE,YAAY,EAAE,YAAY,EAAE,CAAC;AAuE7B;;GAEG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAuC;IAC9D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IACtD;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,CAAgC;IAEhD;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB,CAAK;IAE9B;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAgC;IAEhD;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IAExD,6EAA6E;IAC7E,OAAO,CAAC,WAAW,CAAqB;IAExC,6EAA6E;IAC7E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAE/C,OAAO;IAMP;;;;;;OAMG;IACH,IAAW,qBAAqB,IAAI,MAAM,CAEzC;IAED;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAOnB,MAAM,CAAC,WAAW,IAAI,sBAAsB;IAO5C,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B;;;;;OAKG;IACH,kBAAkB,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI;IAIrD;;;;;;;;;;;;;;;;;;;OAmBG;IACG,QAAQ,CAAC,KAAK,GAAE,OAAe,GAAG,OAAO,CAAC;QAC9C,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,wFAAwF;QACxF,oBAAoB,EAAE,MAAM,CAAC;QAC7B,yFAAyF;QACzF,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IAsHF;;;;;;;;OAQG;YACW,yBAAyB;IAoLvC;;;;OAIG;YACW,gBAAgB;IAa9B;;;;;;;;;;OAUG;YACW,WAAW;IAyDzB,mEAAmE;IACnE,OAAO,CAAC,mBAAmB;IAO3B;;;;;;;;;;;OAWG;YACW,sBAAsB;IAmBpC;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,iBAAiB;IAkBzB;;;;;;;;;;;;OAYG;YACW,sBAAsB;IAcpC;;OAEG;YACW,YAAY;IAoC1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAoB7B;;OAEG;YACW,gBAAgB;IAqB9B;;;;;OAKG;YACW,qBAAqB;IAuBnC;;OAEG;YACW,WAAW;IASzB;;OAEG;YACW,WAAW;CAI1B"}
1
+ {"version":3,"file":"mission-reminder.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/mission-reminder.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAaH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAUzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAOvE,YAAY,EAAE,YAAY,EAAE,CAAC;AAuE7B;;GAEG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAuC;IAC9D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IACtD;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,CAAgC;IAEhD;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB,CAAK;IAE9B;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAgC;IAEhD;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IAExD,6EAA6E;IAC7E,OAAO,CAAC,WAAW,CAAqB;IAExC,6EAA6E;IAC7E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAE/C,OAAO;IAMP;;;;;;OAMG;IACH,IAAW,qBAAqB,IAAI,MAAM,CAEzC;IAED;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAOnB,MAAM,CAAC,WAAW,IAAI,sBAAsB;IAO5C,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B;;;;;OAKG;IACH,kBAAkB,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI;IAIrD;;;;;;;;;;;;;;;;;;;OAmBG;IACG,QAAQ,CAAC,KAAK,GAAE,OAAe,GAAG,OAAO,CAAC;QAC9C,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,wFAAwF;QACxF,oBAAoB,EAAE,MAAM,CAAC;QAC7B,yFAAyF;QACzF,YAAY,EAAE,MAAM,CAAC;QACrB,mDAAmD;QACnD,aAAa,EAAE,MAAM,CAAC;QACtB,8DAA8D;QAC9D,eAAe,EAAE,MAAM,CAAC;QACxB,oDAAoD;QACpD,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IAoJF;;;;;;;;OAQG;YACW,yBAAyB;IAoLvC;;;;OAIG;YACW,gBAAgB;IAa9B;;;;;;;;;;OAUG;YACW,WAAW;IAyDzB,mEAAmE;IACnE,OAAO,CAAC,mBAAmB;IAO3B;;;;;;;;;;;OAWG;YACW,sBAAsB;IAmBpC;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,iBAAiB;IAkBzB;;;;;;;;;;;;OAYG;YACW,sBAAsB;IAcpC;;OAEG;YACW,YAAY;IAoC1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAoB7B;;OAEG;YACW,gBAAgB;IAqB9B;;;;;OAKG;YACW,qBAAqB;IAuBnC;;OAEG;YACW,WAAW;IASzB;;OAEG;YACW,WAAW;CAI1B"}
@@ -22,6 +22,8 @@ import { StorageService } from '../core/storage.service.js';
22
22
  import { KRTrackingService } from './kr-tracking.service.js';
23
23
  import { OKRReviewService } from './okr-review.service.js';
24
24
  import { MissionPeriodService } from './mission-period.service.js';
25
+ import { KRSkillMeasurerService } from './kr-skill-measurer.service.js';
26
+ import { OKROwnerGuidanceService } from './okr-owner-guidance.service.js';
25
27
  import { getSlackOrchestratorBridge } from '../slack/slack-orchestrator-bridge.js';
26
28
  import { TaskPoolService } from '../task-pool/task-pool.service.js';
27
29
  import { isMissionExecutable } from '../../types/v2/mission.types.js';
@@ -211,7 +213,24 @@ export class MissionReminderService {
211
213
  reviewsSkipped: 0,
212
214
  reviewsAutoContinued: 0,
213
215
  staleFlagged: 0,
216
+ skillMeasured: 0,
217
+ proposalsNudged: 0,
218
+ digestSent: false,
214
219
  };
220
+ // Owner guidance runs on every sweep and looks at ALL missions (pending
221
+ // proposals included — those are exactly what the owner must hear about).
222
+ try {
223
+ const guidance = await OKROwnerGuidanceService.getInstance()?.run();
224
+ if (guidance) {
225
+ result.proposalsNudged = guidance.nudged;
226
+ result.digestSent = guidance.digestSent;
227
+ }
228
+ }
229
+ catch (err) {
230
+ this.logger.warn('Owner guidance failed (non-fatal)', {
231
+ error: err instanceof Error ? err.message : String(err),
232
+ });
233
+ }
215
234
  this.logger.info('Starting Mission OKR reminder sweep', { count: missions.length });
216
235
  // One pool read per sweep for the stale detector (not per mission).
217
236
  let poolItems = null;
@@ -244,6 +263,20 @@ export class MissionReminderService {
244
263
  });
245
264
  }
246
265
  }
266
+ // Refresh skill-measured KRs before reading progress, so the sweep
267
+ // reviews this hour's numbers rather than whatever was typed in last.
268
+ try {
269
+ const measured = await KRSkillMeasurerService.getInstance().measureMission(mission.id);
270
+ const recorded = measured.filter((m) => m.status === 'recorded').length;
271
+ if (recorded > 0)
272
+ result.skillMeasured += recorded;
273
+ }
274
+ catch (err) {
275
+ this.logger.warn('skill_output measurement failed for mission', {
276
+ missionId: mission.id,
277
+ error: err instanceof Error ? err.message : String(err),
278
+ });
279
+ }
247
280
  let summary = null;
248
281
  try {
249
282
  // Get OKR progress summary — needed for both the reminder DM