crewly 1.9.0 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/config/roles/orchestrator/prompt.md +53 -2
  2. package/config/skills/agent/core/get-sops/SKILL.md +6 -2
  3. package/config/skills/agent/core/get-sops/execute.sh +26 -1
  4. package/config/skills/agent/core/get-team-norms/SKILL.md +69 -0
  5. package/config/skills/agent/core/list-my-crons/SKILL.md +67 -0
  6. package/config/skills/agent/core/list-my-crons/execute.sh +77 -0
  7. package/config/skills/agent/core/schedule-followup/SKILL.md +13 -0
  8. package/config/skills/agent/core/update-sop/SKILL.md +73 -0
  9. package/config/skills/agent/core/update-sop/execute.sh +115 -0
  10. package/config/skills/agent/core/update-team-norm/SKILL.md +67 -0
  11. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts +2 -0
  12. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts.map +1 -1
  13. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js +50 -1
  14. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js.map +1 -1
  15. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.d.ts +2 -0
  16. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.d.ts.map +1 -1
  17. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.js +6 -2
  18. package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.js.map +1 -1
  19. package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
  20. package/dist/backend/backend/src/controllers/slack/slack.controller.js +10 -0
  21. package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
  22. package/dist/backend/backend/src/controllers/system/system.controller.d.ts.map +1 -1
  23. package/dist/backend/backend/src/controllers/system/system.controller.js +2 -1
  24. package/dist/backend/backend/src/controllers/system/system.controller.js.map +1 -1
  25. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +29 -5
  26. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
  27. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +106 -9
  28. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
  29. package/dist/backend/backend/src/controllers/team/team.controller.d.ts +17 -0
  30. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  31. package/dist/backend/backend/src/controllers/team/team.controller.js +32 -0
  32. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  33. package/dist/backend/backend/src/controllers/wiki/wiki.controller.d.ts +45 -0
  34. package/dist/backend/backend/src/controllers/wiki/wiki.controller.d.ts.map +1 -1
  35. package/dist/backend/backend/src/controllers/wiki/wiki.controller.js +364 -46
  36. package/dist/backend/backend/src/controllers/wiki/wiki.controller.js.map +1 -1
  37. package/dist/backend/backend/src/controllers/wiki/wiki.routes.d.ts.map +1 -1
  38. package/dist/backend/backend/src/controllers/wiki/wiki.routes.js +9 -1
  39. package/dist/backend/backend/src/controllers/wiki/wiki.routes.js.map +1 -1
  40. package/dist/backend/backend/src/index.d.ts.map +1 -1
  41. package/dist/backend/backend/src/index.js +80 -73
  42. package/dist/backend/backend/src/index.js.map +1 -1
  43. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  44. package/dist/backend/backend/src/routes/api.routes.js +12 -6
  45. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  46. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +13 -4
  47. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
  48. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +47 -11
  49. package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
  50. package/dist/backend/backend/src/services/chat-v2/chat-v2.providers.d.ts +28 -0
  51. package/dist/backend/backend/src/services/chat-v2/chat-v2.providers.d.ts.map +1 -1
  52. package/dist/backend/backend/src/services/chat-v2/chat-v2.providers.js +49 -0
  53. package/dist/backend/backend/src/services/chat-v2/chat-v2.providers.js.map +1 -1
  54. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +60 -2
  55. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  56. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +93 -3
  57. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  58. package/dist/backend/backend/src/services/chat-v2/legacy-dto.utils.d.ts +25 -0
  59. package/dist/backend/backend/src/services/chat-v2/legacy-dto.utils.d.ts.map +1 -1
  60. package/dist/backend/backend/src/services/chat-v2/legacy-dto.utils.js +33 -0
  61. package/dist/backend/backend/src/services/chat-v2/legacy-dto.utils.js.map +1 -1
  62. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts +28 -0
  63. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts.map +1 -1
  64. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js +48 -0
  65. package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js.map +1 -1
  66. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +21 -0
  67. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
  68. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +30 -0
  69. package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
  70. package/dist/backend/backend/src/services/chat-v2/types.d.ts +14 -0
  71. package/dist/backend/backend/src/services/chat-v2/types.d.ts.map +1 -1
  72. package/dist/backend/backend/src/services/chat-v2/types.js.map +1 -1
  73. package/dist/backend/backend/src/services/core/retry.util.d.ts +67 -0
  74. package/dist/backend/backend/src/services/core/retry.util.d.ts.map +1 -0
  75. package/dist/backend/backend/src/services/core/retry.util.js +62 -0
  76. package/dist/backend/backend/src/services/core/retry.util.js.map +1 -0
  77. package/dist/backend/backend/src/services/index.d.ts +0 -1
  78. package/dist/backend/backend/src/services/index.d.ts.map +1 -1
  79. package/dist/backend/backend/src/services/index.js +0 -1
  80. package/dist/backend/backend/src/services/index.js.map +1 -1
  81. package/dist/backend/backend/src/services/intent-task/intent-task-follow-up.service.d.ts +26 -108
  82. package/dist/backend/backend/src/services/intent-task/intent-task-follow-up.service.d.ts.map +1 -1
  83. package/dist/backend/backend/src/services/intent-task/intent-task-follow-up.service.js +26 -214
  84. package/dist/backend/backend/src/services/intent-task/intent-task-follow-up.service.js.map +1 -1
  85. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts +11 -0
  86. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
  87. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +69 -12
  88. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
  89. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +10 -0
  90. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
  91. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +21 -0
  92. package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
  93. package/dist/backend/backend/src/services/slack/slack.service.d.ts +12 -0
  94. package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
  95. package/dist/backend/backend/src/services/slack/slack.service.js +53 -1
  96. package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
  97. package/dist/backend/backend/src/services/sop/sop.service.d.ts +10 -0
  98. package/dist/backend/backend/src/services/sop/sop.service.d.ts.map +1 -1
  99. package/dist/backend/backend/src/services/sop/sop.service.js +71 -10
  100. package/dist/backend/backend/src/services/sop/sop.service.js.map +1 -1
  101. package/dist/backend/backend/src/services/wiki/sop-catalog.service.d.ts +83 -0
  102. package/dist/backend/backend/src/services/wiki/sop-catalog.service.d.ts.map +1 -0
  103. package/dist/backend/backend/src/services/wiki/sop-catalog.service.js +185 -0
  104. package/dist/backend/backend/src/services/wiki/sop-catalog.service.js.map +1 -0
  105. package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.d.ts.map +1 -1
  106. package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.js +12 -0
  107. package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.js.map +1 -1
  108. package/dist/backend/backend/src/services/wiki/wiki-overlay.resolver.d.ts +43 -0
  109. package/dist/backend/backend/src/services/wiki/wiki-overlay.resolver.d.ts.map +1 -0
  110. package/dist/backend/backend/src/services/wiki/wiki-overlay.resolver.js +67 -0
  111. package/dist/backend/backend/src/services/wiki/wiki-overlay.resolver.js.map +1 -0
  112. package/dist/backend/backend/src/services/wiki/wiki-search.service.d.ts +79 -19
  113. package/dist/backend/backend/src/services/wiki/wiki-search.service.d.ts.map +1 -1
  114. package/dist/backend/backend/src/services/wiki/wiki-search.service.js +275 -106
  115. package/dist/backend/backend/src/services/wiki/wiki-search.service.js.map +1 -1
  116. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts.map +1 -1
  117. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js +13 -0
  118. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js.map +1 -1
  119. package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts +13 -0
  120. package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts.map +1 -1
  121. package/dist/backend/backend/src/services/workflow/cron-task.service.js +77 -8
  122. package/dist/backend/backend/src/services/workflow/cron-task.service.js.map +1 -1
  123. package/dist/backend/backend/src/types/sop.types.d.ts +7 -0
  124. package/dist/backend/backend/src/types/sop.types.d.ts.map +1 -1
  125. package/dist/backend/backend/src/types/sop.types.js.map +1 -1
  126. package/dist/backend/backend/src/types/v2/work-item.types.d.ts +7 -0
  127. package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  128. package/dist/backend/backend/src/types/v2/work-item.types.js +1 -1
  129. package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
  130. package/dist/cli/backend/src/types/sop.types.d.ts +7 -0
  131. package/dist/cli/backend/src/types/sop.types.d.ts.map +1 -1
  132. package/dist/cli/backend/src/types/sop.types.js.map +1 -1
  133. package/dist/cli/backend/src/types/v2/work-item.types.d.ts +7 -0
  134. package/dist/cli/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  135. package/dist/cli/backend/src/types/v2/work-item.types.js +1 -1
  136. package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
  137. package/frontend/dist/assets/index-4099a91c.js +4961 -0
  138. package/frontend/dist/assets/index-44266b5d.css +42 -0
  139. package/frontend/dist/index.html +2 -2
  140. package/package.json +1 -1
  141. package/frontend/dist/assets/index-068bb4f6.css +0 -42
  142. package/frontend/dist/assets/index-c24ceb15.js +0 -4960
@@ -1 +1 @@
1
- {"version":3,"file":"wiki.routes.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/wiki/wiki.routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AA4BjC;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CA6BzC"}
1
+ {"version":3,"file":"wiki.routes.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/wiki/wiki.routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAkCjC;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAqCzC"}
@@ -4,7 +4,7 @@
4
4
  * @module controllers/wiki/wiki.routes
5
5
  */
6
6
  import { Router } from 'express';
7
- import { ingest, queryVault, queueAdd, queueList, queueClaim, queueClaimNext, queueProcess, queueSkip, queueStats, bookkeep, bookkeepTriggerNow, listVaults, getVaultTree, getPage, searchVault, getBacklinks, lintVault, getRecent, reflectTriggerNow, migrateScan, migrateApply, migrateOssSops, cleanupScan, cleanupApply, } from './wiki.controller.js';
7
+ import { ingest, queryVault, queueAdd, queueList, queueClaim, queueClaimNext, queueProcess, queueSkip, queueStats, bookkeep, bookkeepTriggerNow, listVaults, getVaultTree, getPage, searchVault, searchAllVaults, listSopCatalog, installSop, uninstallSop, writeOverlayPage, deleteOverlayPage, getBacklinks, lintVault, getRecent, reflectTriggerNow, migrateScan, migrateApply, migrateOssSops, cleanupScan, cleanupApply, } from './wiki.controller.js';
8
8
  /**
9
9
  * Creates the wiki router.
10
10
  *
@@ -41,6 +41,14 @@ export function createWikiRouter() {
41
41
  router.get('/tree', getVaultTree);
42
42
  router.get('/page', getPage);
43
43
  router.get('/search', searchVault);
44
+ router.get('/search-all', searchAllVaults);
45
+ // SOP catalog (marketplace): browse config/sops + install/uninstall per team.
46
+ router.get('/sop-catalog', listSopCatalog);
47
+ router.post('/sop-catalog/install', installSop);
48
+ router.post('/sop-catalog/uninstall', uninstallSop);
49
+ // Owner-authored overlay pages (team norms + custom SOPs).
50
+ router.post('/overlay-page', writeOverlayPage);
51
+ router.delete('/overlay-page', deleteOverlayPage);
44
52
  router.get('/backlinks', getBacklinks);
45
53
  router.get('/recent', getRecent);
46
54
  router.post('/migrate/scan', migrateScan);
@@ -1 +1 @@
1
- {"version":3,"file":"wiki.routes.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/wiki/wiki.routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EACL,MAAM,EACN,UAAU,EACV,QAAQ,EACR,SAAS,EACT,UAAU,EACV,cAAc,EACd,YAAY,EACZ,SAAS,EACT,UAAU,EACV,QAAQ,EACR,kBAAkB,EAClB,UAAU,EACV,YAAY,EACZ,OAAO,EACP,WAAW,EACX,YAAY,EACZ,SAAS,EACT,SAAS,EACT,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,cAAc,EACd,WAAW,EACX,YAAY,GACb,MAAM,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAClC,yEAAyE;IACzE,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;IACvC,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC;IACjD,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAChC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAChC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;IAC5C,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,YAAY,CAAC,CAAC;IAChD,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;IAC1C,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACnC,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,kBAAkB,CAAC,CAAC;IACzD,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,iBAAiB,CAAC,CAAC;IACvD,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAChC,yCAAyC;IACzC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAClC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAClC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7B,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACnC,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IACvC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACjC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;IAC1C,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;IAC5C,MAAM,CAAC,IAAI,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC;IACjD,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;IAC1C,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;IAC5C,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"wiki.routes.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/wiki/wiki.routes.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../backend/src/index.ts"],"names":[],"mappings":";AAwCA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAuIjD,qBAAa,YAAY;IACxB,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAqE;IAEnF,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,gBAAgB,CAAoB;IAC5C,OAAO,CAAC,uBAAuB,CAA2B;IAC1D,OAAO,CAAC,sBAAsB,CAA0B;IACxD,OAAO,CAAC,4BAA4B,CAAgC;IACpE,OAAO,CAAC,uBAAuB,CAA2B;IAC1D,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO,CAAC,eAAe,CAAmB;IAC1C,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,qBAAqB,CAAyB;IACtD,OAAO,CAAC,wBAAwB,CAA4B;IAC5D,OAAO,CAAC,eAAe,CAAmB;IAC1C,qEAAqE;IACrE,OAAO,CAAC,qBAAqB,CAAsC;IACnE,kGAAkG;IAClG,OAAO,CAAC,sBAAsB,CAAuC;IAGrE,OAAO,CAAC,+BAA+B,CAAgD;IACvF,+FAA+F;IAC/F,OAAO,CAAC,oBAAoB,CAAqC;IACjE,8HAA8H;IAC9H,OAAO,CAAC,0BAA0B,CAA2C;IAC7E,OAAO,CAAC,6BAA6B,CAA8C;IACnF,OAAO,CAAC,wBAAwB,CAAyC;IACzE,OAAO,CAAC,2BAA2B,CAA+B;IAClE,OAAO,CAAC,0BAA0B,CAA8B;IAChE,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,kBAAkB,CAA0C;IAKpE,OAAO,CAAC,aAAa,CAAuE;IAC5F,OAAO,CAAC,gBAAgB,CAET;IAGf,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,wBAAwB,CAA+B;gBAEnD,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC;IA2D3C,OAAO,CAAC,kBAAkB;IA6qB1B,OAAO,CAAC,mBAAmB;IAmD3B,OAAO,CAAC,eAAe;IA6HvB,OAAO,CAAC,kBAAkB;IAwBpB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkrC5B;;;OAGG;YACW,2BAA2B;IA8BzC;;;OAGG;YACW,8BAA8B;IAsB5C;;;OAGG;YACW,gCAAgC;IAsB9C;;;OAGG;YACW,8BAA8B;IAsB5C;;;;OAIG;YACW,8BAA8B;IA2F5C;;;;;OAKG;YACW,iCAAiC;IAyJ/C;;;;OAIG;YACW,2BAA2B;YA0B3B,qBAAqB;YAsBrB,eAAe;YA4Ef,kBAAkB;IAgBhC,OAAO,CAAC,WAAW,CAAK;IAExB,OAAO,CAAC,sBAAsB;IAqD9B,OAAO,CAAC,qBAAqB;IAsC7B;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IA0D1B;;;;;;;;;OASG;IACH,OAAO,CAAC,qBAAqB;IAqH7B,OAAO,CAAC,cAAc;IAchB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAiT/B,SAAS,IAAI,aAAa;CAG1B;AAeD,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../backend/src/index.ts"],"names":[],"mappings":";AAwCA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAuIjD,qBAAa,YAAY;IACxB,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAqE;IAEnF,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,gBAAgB,CAAoB;IAC5C,OAAO,CAAC,uBAAuB,CAA2B;IAC1D,OAAO,CAAC,sBAAsB,CAA0B;IACxD,OAAO,CAAC,4BAA4B,CAAgC;IACpE,OAAO,CAAC,uBAAuB,CAA2B;IAC1D,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO,CAAC,eAAe,CAAmB;IAC1C,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,qBAAqB,CAAyB;IACtD,OAAO,CAAC,wBAAwB,CAA4B;IAC5D,OAAO,CAAC,eAAe,CAAmB;IAC1C,qEAAqE;IACrE,OAAO,CAAC,qBAAqB,CAAsC;IACnE,kGAAkG;IAClG,OAAO,CAAC,sBAAsB,CAAuC;IAGrE,OAAO,CAAC,+BAA+B,CAAgD;IACvF,+FAA+F;IAC/F,OAAO,CAAC,oBAAoB,CAAqC;IACjE,8HAA8H;IAC9H,OAAO,CAAC,0BAA0B,CAA2C;IAC7E,OAAO,CAAC,6BAA6B,CAA8C;IACnF,OAAO,CAAC,wBAAwB,CAAyC;IACzE,OAAO,CAAC,2BAA2B,CAA+B;IAClE,OAAO,CAAC,0BAA0B,CAA8B;IAChE,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,kBAAkB,CAA0C;IAKpE,OAAO,CAAC,aAAa,CAAuE;IAC5F,OAAO,CAAC,gBAAgB,CAET;IAGf,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,wBAAwB,CAA+B;gBAEnD,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC;IA2D3C,OAAO,CAAC,kBAAkB;IA6qB1B,OAAO,CAAC,mBAAmB;IAmD3B,OAAO,CAAC,eAAe;IA6HvB,OAAO,CAAC,kBAAkB;IAwBpB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2pC5B;;;OAGG;YACW,2BAA2B;IA8BzC;;;OAGG;YACW,8BAA8B;IAsB5C;;;OAGG;YACW,gCAAgC;IAsB9C;;;OAGG;YACW,8BAA8B;IAsB5C;;;;OAIG;YACW,8BAA8B;IA+H5C;;;;;OAKG;YACW,iCAAiC;IAyJ/C;;;;OAIG;YACW,2BAA2B;YA0B3B,qBAAqB;YAsBrB,eAAe;YA4Ef,kBAAkB;IAgBhC,OAAO,CAAC,WAAW,CAAK;IAExB,OAAO,CAAC,sBAAsB;IAqD9B,OAAO,CAAC,qBAAqB;IAsC7B;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IA0D1B;;;;;;;;;OASG;IACH,OAAO,CAAC,qBAAqB;IAqH7B,OAAO,CAAC,cAAc;IAchB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAiT/B,SAAS,IAAI,aAAa;CAG1B;AAeD,eAAe,YAAY,CAAC"}
@@ -20,12 +20,12 @@ import { createApiRoutes } from './routes/api.routes.js';
20
20
  import { TerminalGateway, setTerminalGateway } from './websocket/terminal.gateway.js';
21
21
  import { initializeChatGateway } from './websocket/chat.gateway.js';
22
22
  import { LoggerService } from './services/core/logger.service.js';
23
+ import { retryWithBackoff } from './services/core/retry.util.js';
23
24
  import { CREWLY_CONSTANTS, ORCHESTRATOR_SESSION_NAME, ORCHESTRATOR_ROLE, ORCHESTRATOR_WINDOW_NAME, MESSAGE_QUEUE_CONSTANTS, RUNTIME_TYPES, AUDITOR_CONSTANTS, AUDITOR_SCHEDULER_CONSTANTS, } from './constants.js';
24
25
  import { getSettingsService } from './services/settings/index.js';
25
26
  import { MemoryService } from './services/memory/memory.service.js';
26
27
  import { getImprovementStartupService } from './services/orchestrator/improvement-startup.service.js';
27
28
  import { initializeSlackIfConfigured, shutdownSlack } from './services/slack/index.js';
28
- import { resolveTeamByIdOrSlug, slugifyTeamName } from './services/workflow/team-identifier-resolver.js';
29
29
  import { initializeWhatsAppIfConfigured, shutdownWhatsApp } from './services/whatsapp/index.js';
30
30
  import { initializeGoogleChatIfConfigured } from './services/messaging/google-chat-initializer.js';
31
31
  import { initializeTelegramIfConfigured, shutdownTelegram } from './services/telegram/index.js';
@@ -1283,6 +1283,14 @@ export class CrewlyServer {
1283
1283
  // needs the list of session names for a given channel
1284
1284
  // to fan-out a user message to every huddle member.
1285
1285
  huddleMembersFor: (channelId) => chatService.queryHuddleMembersForDispatch(channelId),
1286
+ // Activate-on-send: messaging an offline agent wakes it, then
1287
+ // the dispatcher retries delivery. User-initiated, so it uses
1288
+ // the wake-gate-free activation path.
1289
+ activateAgent: async (agentSession) => {
1290
+ const { activateAgentBySession } = await import('./controllers/team/team.controller.js');
1291
+ const res = await activateAgentBySession(this.apiController, agentSession);
1292
+ return res.success;
1293
+ },
1286
1294
  });
1287
1295
  this.chatV2Gateway = chatGateway;
1288
1296
  this.chatV2Dispatcher = chatDispatcher;
@@ -1552,82 +1560,49 @@ export class CrewlyServer {
1552
1560
  error: err instanceof Error ? err.message : String(err),
1553
1561
  });
1554
1562
  }
1555
- // #286: Start cron task service with agent status/start callbacks
1563
+ // #286/#678: Cron fires ENQUEUE a WorkItem into the task pool instead
1564
+ // of writing straight to the agent's terminal. The pool's wake-mesh
1565
+ // (WorkItemDispatchSubscriber push + AgentAutoClaim pull + reconciler
1566
+ // self-heal) then assigns + delivers it — so a cron firing for an
1567
+ // OFFLINE agent becomes a durable queued item that gets woken, instead
1568
+ // of being silently dropped (#678). No agent-status/auto-start callbacks
1569
+ // are wired: the cron now ALWAYS enqueues regardless of liveness, and
1570
+ // the pool owns online/offline delivery + recovery.
1556
1571
  try {
1557
1572
  const cronTaskService = CronTaskService.getInstance();
1558
- const storageRef = this.storageService;
1559
- const registrationRef = this.apiController.agentRegistrationService;
1573
+ const { TaskPoolService } = await import('./services/task-pool/task-pool.service.js');
1574
+ const { createWorkItem } = await import('./types/v2/work-item.types.js');
1560
1575
  cronTaskService.setExecutionCallback(async (task) => {
1561
- this.logger.info('Executing cron task', { id: task.id, target: task.targetAgent });
1562
- await registrationRef.sendMessageToAgent(task.targetAgent, `[CRON_TASK:${task.id}] ${task.taskDescription}`);
1563
- });
1564
- // Issue #307: cron tasks created with `targetTeamId` set to a
1565
- // name slug (e.g. "stock-ops-team") instead of the UUID would
1566
- // silently 404 on every fire — `teams.find(t => t.id === teamId)`
1567
- // returned undefined and both callbacks returned `false` with
1568
- // no log surface. `resolveTeamByIdOrSlug` (imported statically
1569
- // at the top of the file) tries UUID first, then falls back
1570
- // to a slug match against `name`. Misses now surface a distinct
1571
- // warn-log with the available slugs so the cause is visible
1572
- // instead of hiding behind the generic "agent offline" warn
1573
- // from cron-task.service.
1574
- cronTaskService.setAgentStatusCallback(async (sessionName, teamId) => {
1575
- // Handle orchestrator separately — it's not in regular teams
1576
- if (sessionName === CREWLY_CONSTANTS.SESSIONS.ORCHESTRATOR_NAME || teamId === 'orchestrator') {
1577
- const orchStatus = await storageRef.getOrchestratorStatus();
1578
- return orchStatus?.agentStatus === 'active' || orchStatus?.agentStatus === 'started';
1579
- }
1580
- const teams = await storageRef.getTeams();
1581
- const team = resolveTeamByIdOrSlug(teams, teamId);
1582
- if (!team) {
1583
- this.logger.warn('CronTask: targetTeamId resolves to no team', {
1584
- sessionName,
1585
- targetTeamId: teamId,
1586
- availableSlugs: teams.slice(0, 10).map((t) => slugifyTeamName(t.name)),
1587
- hint: 'Set targetTeamId to either the team UUID or one of availableSlugs (lowercase, spaces→-)',
1588
- });
1589
- return false;
1590
- }
1591
- const member = team.members.find((m) => m.sessionName === sessionName);
1592
- if (!member)
1593
- return false;
1594
- // #286 Root Cause C: treat both 'active' and 'started' as online
1595
- return member.agentStatus === 'active' || member.agentStatus === 'started';
1596
- });
1597
- cronTaskService.setAgentStartCallback(async (sessionName, teamId) => {
1598
- try {
1599
- const teams = await storageRef.getTeams();
1600
- const team = resolveTeamByIdOrSlug(teams, teamId);
1601
- if (!team) {
1602
- this.logger.warn('CronTask auto-start: targetTeamId resolves to no team', {
1603
- sessionName,
1604
- targetTeamId: teamId,
1605
- availableSlugs: teams.slice(0, 10).map((t) => slugifyTeamName(t.name)),
1606
- hint: 'Set targetTeamId to either the team UUID or one of availableSlugs (lowercase, spaces→-)',
1607
- });
1608
- return false;
1609
- }
1610
- const member = team.members.find((m) => m.sessionName === sessionName);
1611
- if (!member)
1612
- return false;
1613
- await registrationRef.createAgentSession({
1614
- sessionName: member.sessionName,
1615
- role: member.role,
1616
- // Use the resolved team's UUID — not the user-supplied identifier
1617
- // — so downstream agent-registration always sees the canonical id.
1618
- teamId: team.id,
1619
- memberId: member.id,
1620
- });
1621
- return true;
1622
- }
1623
- catch {
1624
- return false;
1625
- }
1576
+ // Deterministic id per fire slot: re-evaluating the same due slot
1577
+ // is a no-op (addToPool dedups by id), but each scheduled
1578
+ // occurrence is a fresh WorkItem. `task.nextRunAt` is still the
1579
+ // firing slot here the service advances it AFTER this returns.
1580
+ const slot = task.nextRunAt ?? new Date().toISOString();
1581
+ const workItem = createWorkItem({
1582
+ id: `cron-${task.id}-${slot}`,
1583
+ type: 'cron_run',
1584
+ owner: 'orchestrator',
1585
+ target: task.targetAgent,
1586
+ title: `Cron: ${task.taskDescription.slice(0, 80)}`,
1587
+ description: task.taskDescription,
1588
+ metadata: {
1589
+ source: 'cron',
1590
+ cronTaskId: task.id,
1591
+ targetTeamId: task.targetTeamId,
1592
+ firedSlot: slot,
1593
+ },
1594
+ });
1595
+ await TaskPoolService.getInstance().addToPool(workItem);
1596
+ this.logger.info('Cron task enqueued as WorkItem', {
1597
+ id: task.id,
1598
+ workItemId: workItem.id,
1599
+ target: task.targetAgent,
1600
+ });
1626
1601
  });
1627
1602
  // Self-heal stale nextRunAt values from pre-timezone-fix versions
1628
1603
  await cronTaskService.recalculateAllNextRunTimes();
1629
1604
  cronTaskService.start();
1630
- this.logger.info('CronTaskService started');
1605
+ this.logger.info('CronTaskService started (cron fires → task pool WorkItems)');
1631
1606
  }
1632
1607
  catch (cronErr) {
1633
1608
  this.logger.warn('CronTaskService initialization failed (non-critical)', {
@@ -2265,18 +2240,50 @@ export class CrewlyServer {
2265
2240
  }
2266
2241
  }
2267
2242
  }
2268
- // Create orchestrator agent session
2269
- const result = await this.apiController.agentRegistrationService.createAgentSession({
2243
+ // Create orchestrator agent session, with bounded retry + backoff.
2244
+ //
2245
+ // #686: a single `createAgentSession` failure here used to be a
2246
+ // one-shot WARN + return — the orchestrator then stayed inactive
2247
+ // with NO retry and NO health signal, leaving the system in a
2248
+ // silent "假死" state (inbound messages queue forever, /health still
2249
+ // reports healthy). Transient failures are common at boot (e.g. a
2250
+ // momentary PTY spawn-slot exhaustion like #611, or a downstream
2251
+ // dependency still warming up after a process restart), so we retry
2252
+ // with a linear backoff before giving up. The reconciler's
2253
+ // hybrid-wake is the longer-term self-heal (it now restarts the orc
2254
+ // via /orchestrator/setup, #679), but boot-time retry avoids leaving
2255
+ // the orc dead until the next inbound message arrives.
2256
+ const MAX_AUTOSTART_ATTEMPTS = 5;
2257
+ const AUTOSTART_BACKOFF_MS = 3_000;
2258
+ const result = await retryWithBackoff(() => this.apiController.agentRegistrationService.createAgentSession({
2270
2259
  sessionName: ORCHESTRATOR_SESSION_NAME,
2271
2260
  role: ORCHESTRATOR_ROLE,
2272
2261
  projectPath: this.config.crewlyHome,
2273
2262
  windowName: ORCHESTRATOR_WINDOW_NAME,
2274
2263
  runtimeType,
2275
2264
  forceRecreate: true,
2265
+ }), {
2266
+ maxAttempts: MAX_AUTOSTART_ATTEMPTS,
2267
+ backoffMs: AUTOSTART_BACKOFF_MS,
2268
+ isSuccess: r => r.success,
2269
+ onRetry: ({ attempt, maxAttempts, retryInMs, result: r }) => {
2270
+ this.logger.warn('Auto-start orchestrator failed to create session — retrying', {
2271
+ error: r.error,
2272
+ attempt,
2273
+ maxAttempts,
2274
+ retryInMs,
2275
+ });
2276
+ },
2276
2277
  });
2277
2278
  if (!result.success) {
2278
- this.logger.warn('Auto-start orchestrator failed to create session', {
2279
+ // Exhausted all retries. Log loudly at ERROR (not WARN) so the
2280
+ // failure is greppable in pm2/console output and not mistaken for
2281
+ // a benign skip. The orchestrator stays inactive; recovery now
2282
+ // falls to the reconciler's hybrid-wake on the next queued
2283
+ // inbound WorkItem (#679 routing fix).
2284
+ this.logger.error('Auto-start orchestrator FAILED after all retries — orchestrator is INACTIVE', {
2279
2285
  error: result.error,
2286
+ attempts: MAX_AUTOSTART_ATTEMPTS,
2280
2287
  });
2281
2288
  return;
2282
2289
  }