crewly 1.5.19 → 1.5.20

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 (87) hide show
  1. package/config/orchestrator_tasks/prompts/orchestrator-prompt.md +46 -0
  2. package/config/risk-policies/no-local-browser.policy.md +43 -0
  3. package/config/sops/xhs-requirement-log.v1.md +238 -0
  4. package/dist/backend/backend/src/controllers/mission/mission-policy.routes.d.ts.map +1 -1
  5. package/dist/backend/backend/src/controllers/mission/mission-policy.routes.js +152 -19
  6. package/dist/backend/backend/src/controllers/mission/mission-policy.routes.js.map +1 -1
  7. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +23 -0
  8. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
  9. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +89 -0
  10. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
  11. package/dist/backend/backend/src/index.d.ts.map +1 -1
  12. package/dist/backend/backend/src/index.js +37 -0
  13. package/dist/backend/backend/src/index.js.map +1 -1
  14. package/dist/backend/backend/src/scripts/backfill-mission-priority.d.ts +43 -0
  15. package/dist/backend/backend/src/scripts/backfill-mission-priority.d.ts.map +1 -0
  16. package/dist/backend/backend/src/scripts/backfill-mission-priority.js +90 -0
  17. package/dist/backend/backend/src/scripts/backfill-mission-priority.js.map +1 -0
  18. package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
  19. package/dist/backend/backend/src/services/agent/agent-registration.service.js +3 -0
  20. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  21. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts.map +1 -1
  22. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.js +2 -0
  23. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.js.map +1 -1
  24. package/dist/backend/backend/src/services/ai/prompt-modules/team-norms.module.d.ts +16 -3
  25. package/dist/backend/backend/src/services/ai/prompt-modules/team-norms.module.d.ts.map +1 -1
  26. package/dist/backend/backend/src/services/ai/prompt-modules/team-norms.module.js +116 -19
  27. package/dist/backend/backend/src/services/ai/prompt-modules/team-norms.module.js.map +1 -1
  28. package/dist/backend/backend/src/services/core/storage.service.d.ts +33 -0
  29. package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
  30. package/dist/backend/backend/src/services/core/storage.service.js +54 -0
  31. package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
  32. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +28 -3
  33. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  34. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +139 -79
  35. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  36. package/dist/backend/backend/src/services/template/template.service.d.ts.map +1 -1
  37. package/dist/backend/backend/src/services/template/template.service.js +1 -0
  38. package/dist/backend/backend/src/services/template/template.service.js.map +1 -1
  39. package/dist/backend/backend/src/services/v3/service-contract-gate.service.d.ts +88 -0
  40. package/dist/backend/backend/src/services/v3/service-contract-gate.service.d.ts.map +1 -0
  41. package/dist/backend/backend/src/services/v3/service-contract-gate.service.js +138 -0
  42. package/dist/backend/backend/src/services/v3/service-contract-gate.service.js.map +1 -0
  43. package/dist/backend/backend/src/services/v3/team-trigger-reconciler.service.d.ts +77 -0
  44. package/dist/backend/backend/src/services/v3/team-trigger-reconciler.service.d.ts.map +1 -0
  45. package/dist/backend/backend/src/services/v3/team-trigger-reconciler.service.js +177 -0
  46. package/dist/backend/backend/src/services/v3/team-trigger-reconciler.service.js.map +1 -0
  47. package/dist/backend/backend/src/types/index.d.ts +28 -0
  48. package/dist/backend/backend/src/types/index.d.ts.map +1 -1
  49. package/dist/backend/backend/src/types/index.js.map +1 -1
  50. package/dist/backend/backend/src/types/team-template.types.d.ts +2 -0
  51. package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -1
  52. package/dist/backend/backend/src/types/team-template.types.js.map +1 -1
  53. package/dist/backend/backend/src/types/v2/mission.types.d.ts +51 -0
  54. package/dist/backend/backend/src/types/v2/mission.types.d.ts.map +1 -1
  55. package/dist/backend/backend/src/types/v2/mission.types.js +66 -0
  56. package/dist/backend/backend/src/types/v2/mission.types.js.map +1 -1
  57. package/dist/backend/backend/src/types/v2/trigger.types.d.ts +16 -0
  58. package/dist/backend/backend/src/types/v2/trigger.types.d.ts.map +1 -1
  59. package/dist/backend/backend/src/types/v2/trigger.types.js +2 -0
  60. package/dist/backend/backend/src/types/v2/trigger.types.js.map +1 -1
  61. package/dist/backend/backend/src/types/v2/work-item.types.d.ts +10 -0
  62. package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  63. package/dist/backend/backend/src/types/v2/work-item.types.js +11 -1
  64. package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
  65. package/dist/cli/backend/src/services/core/storage.service.d.ts +33 -0
  66. package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
  67. package/dist/cli/backend/src/services/core/storage.service.js +54 -0
  68. package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
  69. package/dist/cli/backend/src/types/index.d.ts +28 -0
  70. package/dist/cli/backend/src/types/index.d.ts.map +1 -1
  71. package/dist/cli/backend/src/types/index.js.map +1 -1
  72. package/dist/cli/backend/src/types/team-template.types.d.ts +2 -0
  73. package/dist/cli/backend/src/types/team-template.types.d.ts.map +1 -1
  74. package/dist/cli/backend/src/types/team-template.types.js.map +1 -1
  75. package/dist/cli/backend/src/types/v2/trigger.types.d.ts +201 -0
  76. package/dist/cli/backend/src/types/v2/trigger.types.d.ts.map +1 -0
  77. package/dist/cli/backend/src/types/v2/trigger.types.js +174 -0
  78. package/dist/cli/backend/src/types/v2/trigger.types.js.map +1 -0
  79. package/dist/cli/backend/src/types/v2/work-item.types.d.ts +11 -1
  80. package/dist/cli/backend/src/types/v2/work-item.types.d.ts.map +1 -1
  81. package/dist/cli/backend/src/types/v2/work-item.types.js +14 -11
  82. package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
  83. package/frontend/dist/assets/{index-e3de7a8c.css → index-47564020.css} +1 -1
  84. package/frontend/dist/assets/index-5e804749.js +5220 -0
  85. package/frontend/dist/index.html +2 -2
  86. package/package.json +1 -1
  87. package/frontend/dist/assets/index-f6bc685f.js +0 -4924
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-assembly.service.js","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/prompt-assembly.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAmB,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAMN,cAAc,GACd,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,oBAAoB,GAAG,KAAK,CAAC;AAEnC;;GAEG;AACH,MAAM,gBAAgB,GAAG,aAAa,CAAC;AAEvC;;GAEG;AACH,MAAM,aAAa,GAAG,GAAG,CAAC;AAE1B;;;GAGG;AACH,MAAM,sBAAsB,GAAwB,IAAI,GAAG,CAAC;IAC3D,UAAU;IACV,MAAM;IACN,eAAe;IACf,UAAU;CACV,CAAC,CAAC;AAUH;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,OAAO,qBAAqB;IACzB,MAAM,CAAkB;IACxB,OAAO,GAAmB,EAAE,CAAC;IAC7B,gBAAgB,CAAS;IAEjC,YAAY,cAAsB,oBAAoB;QACrD,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,qBAAqB,CAAC,uBAAuB,CAAC,CAAC;QACzF,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC;QACpC,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACK,sBAAsB;QAC7B,IAAI,CAAC,OAAO,GAAG;YACd,IAAI,cAAc,EAAE;YACpB,IAAI,UAAU,EAAE;YAChB,IAAI,mBAAmB,EAAE;YACzB,IAAI,cAAc,EAAE;YACpB,IAAI,kBAAkB,EAAE;YACxB,IAAI,qBAAqB,EAAE;YAC3B,IAAI,qBAAqB,EAAE;YAC3B,IAAI,mBAAmB,EAAE;YACzB,IAAI,uBAAuB,EAAE;YAC7B,IAAI,sBAAsB,EAAE;YAC5B,IAAI,mBAAmB,EAAE;YACzB,IAAI,eAAe,EAAE;YACrB,IAAI,0BAA0B,EAAE;YAChC,IAAI,gBAAgB,EAAE;YACtB,IAAI,uBAAuB,EAAE;YAC7B,IAAI,eAAe,EAAE;SACrB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,SAAS,CAAC,MAAoB;QAC7B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACH,YAAY,CAAC,IAAY;QACxB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC5D,CAAC;IAED;;;;OAIG;IACH,UAAU;QACT,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;IAED;;;;;OAKG;IACH,WAAW,CAAC,MAAe;QAC1B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC;QAChC,CAAC;QACD,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC9B,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,QAAQ,CAAC,MAAoB;QAClC,MAAM,KAAK,GAA0B,EAAE,CAAC;QACxC,MAAM,SAAS,GAA0B,EAAE,CAAC;QAE5C,wEAAwE;QACxE,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAEzE,wCAAwC;QACxC,KAAK,MAAM,MAAM,IAAI,MAAM,EAAE,CAAC;YAC7B,qEAAqE;YACrE,IAAI,MAAM,CAAC,QAAQ,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,MAAM,CAAC,IAAI,sBAAsB,EAAE;oBAC/D,WAAW,EAAE,MAAM,CAAC,WAAW;iBAC/B,CAAC,CAAC;gBACH,SAAS;YACV,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,MAAM,CAAC,IAAI,iCAAiC,EAAE;oBAC1E,WAAW,EAAE,MAAM,CAAC,WAAW;iBAC/B,CAAC,CAAC;gBACH,SAAS;YACV,CAAC;YAED,IAAI,CAAC;gBACJ,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC3C,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC/B,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;oBACvC,KAAK,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE;wBACvB,eAAe,EAAE,MAAM;wBACvB,WAAW,EAAE,MAAM,CAAC,WAAW;wBAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ;qBACzB,CAAC,CAAC;gBACJ,CAAC;YACF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,MAAM,CAAC,IAAI,mBAAmB,EAAE;oBAC5D,WAAW,EAAE,MAAM,CAAC,WAAW;oBAC/B,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC7D,CAAC,CAAC;gBACH,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;oBACzB,MAAM,KAAK,CAAC;gBACb,CAAC;YACF,CAAC;QACF,CAAC;QAED,uDAAuD;QACvD,IAAI,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;QAEvE,IAAI,WAAW,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACzC,wFAAwF;YACxF,MAAM,kBAAkB,GAAG,KAAK;iBAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;iBACnC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;iBAC5B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;YAE1C,0DAA0D;YAC1D,KAAK,MAAM,IAAI,IAAI,kBAAkB,EAAE,CAAC;gBACvC,IAAI,WAAW,IAAI,IAAI,CAAC,gBAAgB;oBAAE,MAAM;gBAEhD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACnC,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;gBACzE,MAAM,aAAa,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;gBACrD,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAe,GAAG,aAAa,CAAC;gBAEzD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;oBACjB,WAAW,IAAI,OAAO,CAAC;oBACvB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG;wBACnB,GAAG,QAAQ;wBACX,OAAO,EAAE,cAAc;wBACvB,eAAe,EAAE,aAAa;qBAC9B,CAAC;oBACF,SAAS,CAAC,IAAI,CAAC;wBACd,IAAI,EAAE,QAAQ,CAAC,IAAI;wBACnB,cAAc,EAAE,QAAQ,CAAC,eAAe;wBACxC,WAAW,EAAE,aAAa;wBAC1B,MAAM,EAAE,SAAS;qBACjB,CAAC,CAAC;oBAEH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,QAAQ,CAAC,IAAI,kBAAkB,EAAE;wBAC5D,WAAW,EAAE,MAAM,CAAC,WAAW;wBAC/B,cAAc,EAAE,QAAQ,CAAC,eAAe;wBACxC,aAAa;wBACb,WAAW;qBACX,CAAC,CAAC;gBACJ,CAAC;YACF,CAAC;YAED,mDAAmD;YACnD,IAAI,WAAW,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACzC,0DAA0D;gBAC1D,MAAM,SAAS,GAAG,KAAK;qBACrB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;qBACnC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;qBAC5B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;gBAE1C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;oBAC9B,IAAI,WAAW,IAAI,IAAI,CAAC,gBAAgB;wBAAE,MAAM;oBAEhD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACnC,WAAW,IAAI,QAAQ,CAAC,eAAe,CAAC;oBAExC,8DAA8D;oBAC9D,MAAM,gBAAgB,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAC;oBAC9E,IAAI,gBAAgB,IAAI,CAAC,EAAE,CAAC;wBAC3B,SAAS,CAAC,gBAAgB,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC;wBAC5C,SAAS,CAAC,gBAAgB,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC;oBAChD,CAAC;yBAAM,CAAC;wBACP,SAAS,CAAC,IAAI,CAAC;4BACd,IAAI,EAAE,QAAQ,CAAC,IAAI;4BACnB,cAAc,EAAE,QAAQ,CAAC,eAAe;4BACxC,WAAW,EAAE,CAAC;4BACd,MAAM,EAAE,SAAS;yBACjB,CAAC,CAAC;oBACJ,CAAC;oBAED,sCAAsC;oBACtC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC;oBAErE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,QAAQ,CAAC,IAAI,oBAAoB,EAAE;wBAC9D,WAAW,EAAE,MAAM,CAAC,WAAW;wBAC/B,WAAW,EAAE,QAAQ,CAAC,eAAe;wBACrC,WAAW;qBACX,CAAC,CAAC;gBACJ,CAAC;YACF,CAAC;QACF,CAAC;QAED,oDAAoD;QACpD,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC/D,MAAM,gBAAgB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;QAErF,MAAM,MAAM,GAAmB;YAC9B,WAAW,EAAE,gBAAgB;YAC7B,eAAe,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACzC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,eAAe,EAAE,CAAC,CAAC,eAAe;aAClC,CAAC,CAAC;YACH,SAAS;SACT,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE;YAC5C,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,WAAW,EAAE,YAAY,CAAC,MAAM;YAChC,WAAW,EAAE,gBAAgB;YAC7B,MAAM,EAAE,IAAI,CAAC,gBAAgB;YAC7B,cAAc,EAAE,SAAS,CAAC,MAAM;YAChC,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SACxC,CAAC,CAAC;QAEH,OAAO;YACN,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC;YACjE,MAAM;SACN,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,mBAAmB,CAAC,MAAoB;QAM7C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACvD,OAAO;YACN,MAAM;YACN,OAAO,EAAE,MAAM,CAAC,eAAe;YAC/B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,SAAS,EAAE,MAAM,CAAC,SAAS;SAC3B,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACK,WAAW,CAAC,OAAe,EAAE,QAAgB;QACpD,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC;QAC3D,IAAI,YAAY,IAAI,OAAO,CAAC,MAAM;YAAE,OAAO,OAAO,CAAC;QAEnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,MAAM,IAAI,GAAa,EAAE,CAAC;QAE1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,IAAI,WAAW,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,YAAY,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrE,MAAM;YACP,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChB,WAAW,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,iBAAiB;QAClD,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;CACD"}
1
+ {"version":3,"file":"prompt-assembly.service.js","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/prompt-assembly.service.ts"],"names":[],"mappings":"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"}
@@ -38,10 +38,23 @@ export declare class TeamNormsModule implements PromptModule {
38
38
  */
39
39
  shouldInclude(config: ModuleConfig): boolean;
40
40
  /**
41
- * Build the team norms prompt section by loading all .md files from the norms directory.
41
+ * Build the team norms prompt section by loading relevant .md files from
42
+ * the norms directory.
42
43
  *
43
- * @param config - Module configuration with teamNormsPath
44
- * @returns Formatted markdown section with all team norms
44
+ * Selection is a two-stage pipeline designed to keep the marketing team's
45
+ * 50+ SOP files from blowing the prompt budget:
46
+ *
47
+ * 1. **Filter**: parse each file's YAML frontmatter, skip `deprecated: true`
48
+ * and skip files whose `appliesTo` does not include the agent's role.
49
+ * 2. **Rank + cap**: sort survivors by descending `priority` (default 0),
50
+ * then alphabetically for stable ordering, then keep at most
51
+ * `MAX_NORM_FILES`.
52
+ *
53
+ * Frontmatter is stripped from the emitted content — agents see the SOP
54
+ * body, not the routing metadata.
55
+ *
56
+ * @param config - Module configuration with teamNormsPath and role
57
+ * @returns Formatted markdown section with the applicable norms
45
58
  */
46
59
  build(config: ModuleConfig): Promise<string>;
47
60
  }
@@ -1 +1 @@
1
- {"version":3,"file":"team-norms.module.d.ts","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/team-norms.module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAO/E;;;;;;;;;;;;;GAaG;AACH,qBAAa,eAAgB,YAAW,YAAY;IAClD,IAAI,SAAgB;IACpB,QAAQ,SAAO;IACf,SAAS,SAAQ;IACjB,WAAW,UAAQ;IAEnB;;;;;OAKG;IACH,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO;IAU5C;;;;;OAKG;IACG,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;CA0CnD"}
1
+ {"version":3,"file":"team-norms.module.d.ts","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/team-norms.module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AA2F/E;;;;;;;;;;;;;GAaG;AACH,qBAAa,eAAgB,YAAW,YAAY;IAClD,IAAI,SAAgB;IACpB,QAAQ,SAAO;IACf,SAAS,SAAQ;IACjB,WAAW,UAAQ;IAEnB;;;;;OAKG;IACH,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO;IAU5C;;;;;;;;;;;;;;;;;;OAkBG;IACG,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;CA+DnD"}
@@ -14,8 +14,76 @@ import * as fs from 'fs';
14
14
  import * as path from 'path';
15
15
  /**
16
16
  * Maximum number of norm files to load per team to prevent prompt bloat.
17
+ * Applied AFTER frontmatter filtering, so deprecated/off-role norms do not
18
+ * consume a slot.
17
19
  */
18
20
  const MAX_NORM_FILES = 5;
21
+ /**
22
+ * Parse a `---`-delimited YAML frontmatter block at the start of the file.
23
+ * Returns the parsed fields plus the remaining content. Only supports the
24
+ * handful of simple scalar/sequence forms we care about — intentionally
25
+ * avoids adding a YAML dependency to this hot path.
26
+ */
27
+ function parseFrontmatter(raw) {
28
+ if (!raw.startsWith('---')) {
29
+ return { meta: {}, content: raw };
30
+ }
31
+ const lines = raw.split('\n');
32
+ // Find the closing --- (first delimiter is line 0)
33
+ let end = -1;
34
+ for (let i = 1; i < lines.length; i++) {
35
+ if (lines[i].trim() === '---') {
36
+ end = i;
37
+ break;
38
+ }
39
+ }
40
+ if (end === -1) {
41
+ return { meta: {}, content: raw };
42
+ }
43
+ const meta = {};
44
+ for (const line of lines.slice(1, end)) {
45
+ const m = /^([A-Za-z_][\w-]*)\s*:\s*(.*)$/.exec(line);
46
+ if (!m)
47
+ continue;
48
+ const key = m[1];
49
+ let value = m[2].trim();
50
+ // Strip inline comment
51
+ const hashIdx = value.indexOf(' #');
52
+ if (hashIdx >= 0)
53
+ value = value.slice(0, hashIdx).trim();
54
+ if (key === 'deprecated') {
55
+ meta.deprecated = /^(true|yes|1)$/i.test(value);
56
+ }
57
+ else if (key === 'appliesTo') {
58
+ // Accept: `appliesTo: [a, b]` | `appliesTo: a` | `appliesTo: a, b`
59
+ const stripped = value.replace(/^\[|\]$/g, '');
60
+ meta.appliesTo = stripped
61
+ .split(',')
62
+ .map((s) => s.trim().replace(/^["']|["']$/g, ''))
63
+ .filter(Boolean);
64
+ }
65
+ else if (key === 'priority') {
66
+ const n = Number(value);
67
+ if (!Number.isNaN(n))
68
+ meta.priority = n;
69
+ }
70
+ }
71
+ return { meta, content: lines.slice(end + 1).join('\n') };
72
+ }
73
+ /**
74
+ * Decides whether a norm applies to the current agent given parsed frontmatter.
75
+ * Universal (no `appliesTo`) norms always apply. Role-scoped norms apply when
76
+ * the agent's role is listed.
77
+ */
78
+ function normApplies(meta, role) {
79
+ if (meta.deprecated)
80
+ return false;
81
+ if (!meta.appliesTo || meta.appliesTo.length === 0)
82
+ return true;
83
+ if (!role)
84
+ return false;
85
+ return meta.appliesTo.includes(role);
86
+ }
19
87
  /**
20
88
  * TeamNormsModule loads all markdown norm files from the team's norms directory
21
89
  * and injects them as team-level SOPs into the agent prompt.
@@ -53,43 +121,72 @@ export class TeamNormsModule {
53
121
  }
54
122
  }
55
123
  /**
56
- * Build the team norms prompt section by loading all .md files from the norms directory.
124
+ * Build the team norms prompt section by loading relevant .md files from
125
+ * the norms directory.
126
+ *
127
+ * Selection is a two-stage pipeline designed to keep the marketing team's
128
+ * 50+ SOP files from blowing the prompt budget:
57
129
  *
58
- * @param config - Module configuration with teamNormsPath
59
- * @returns Formatted markdown section with all team norms
130
+ * 1. **Filter**: parse each file's YAML frontmatter, skip `deprecated: true`
131
+ * and skip files whose `appliesTo` does not include the agent's role.
132
+ * 2. **Rank + cap**: sort survivors by descending `priority` (default 0),
133
+ * then alphabetically for stable ordering, then keep at most
134
+ * `MAX_NORM_FILES`.
135
+ *
136
+ * Frontmatter is stripped from the emitted content — agents see the SOP
137
+ * body, not the routing metadata.
138
+ *
139
+ * @param config - Module configuration with teamNormsPath and role
140
+ * @returns Formatted markdown section with the applicable norms
60
141
  */
61
142
  async build(config) {
62
143
  const normsPath = config.teamNormsPath;
63
144
  const sections = ['## Team Norms & SOPs\n'];
64
145
  try {
65
- const dirExists = await fs.promises.access(normsPath).then(() => true).catch(() => false);
146
+ const dirExists = await fs.promises
147
+ .access(normsPath)
148
+ .then(() => true)
149
+ .catch(() => false);
66
150
  if (!dirExists) {
67
151
  return '';
68
152
  }
69
153
  const allEntries = await fs.promises.readdir(normsPath);
70
- const entries = allEntries
71
- .filter((f) => f.endsWith('.md'))
72
- .sort()
73
- .slice(0, MAX_NORM_FILES);
74
- if (entries.length === 0) {
75
- return '';
76
- }
77
- for (const entry of entries) {
154
+ const mdFiles = allEntries.filter((f) => f.endsWith('.md')).sort();
155
+ const candidates = [];
156
+ for (const entry of mdFiles) {
78
157
  const filePath = path.join(normsPath, entry);
79
158
  try {
80
- const content = (await fs.promises.readFile(filePath, 'utf-8')).trim();
81
- if (content) {
82
- sections.push(content);
83
- sections.push(''); // blank line separator
84
- }
159
+ const raw = await fs.promises.readFile(filePath, 'utf-8');
160
+ const { meta, content } = parseFrontmatter(raw);
161
+ if (!normApplies(meta, config.role))
162
+ continue;
163
+ const trimmed = content.trim();
164
+ if (!trimmed)
165
+ continue;
166
+ candidates.push({
167
+ fileName: entry,
168
+ content: trimmed,
169
+ priority: meta.priority ?? 0,
170
+ });
85
171
  }
86
172
  catch {
87
- // Skip unreadable files
173
+ // Skip unreadable files silently — one bad file shouldn't kill the module.
88
174
  }
89
175
  }
90
- if (sections.length <= 1) {
176
+ if (candidates.length === 0) {
91
177
  return '';
92
178
  }
179
+ // Stage 2: rank by priority desc, then filename asc, then cap.
180
+ candidates.sort((a, b) => {
181
+ if (a.priority !== b.priority)
182
+ return b.priority - a.priority;
183
+ return a.fileName.localeCompare(b.fileName);
184
+ });
185
+ const chosen = candidates.slice(0, MAX_NORM_FILES);
186
+ for (const item of chosen) {
187
+ sections.push(item.content);
188
+ sections.push(''); // blank line separator
189
+ }
93
190
  return sections.join('\n');
94
191
  }
95
192
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"team-norms.module.js","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/team-norms.module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B;;GAEG;AACH,MAAM,cAAc,GAAG,CAAC,CAAC;AAEzB;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,eAAe;IAC1B,IAAI,GAAG,YAAY,CAAC;IACpB,QAAQ,GAAG,GAAG,CAAC;IACf,SAAS,GAAG,IAAI,CAAC;IACjB,WAAW,GAAG,IAAI,CAAC;IAEnB;;;;;OAKG;IACH,aAAa,CAAC,MAAoB;QAChC,IAAI,CAAC,MAAM,CAAC,aAAa;YAAE,OAAO,KAAK,CAAC;QACxC,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC;gBACxC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,KAAK,CAAC,MAAoB;QAC9B,MAAM,SAAS,GAAG,MAAM,CAAC,aAAc,CAAC;QACxC,MAAM,QAAQ,GAAa,CAAC,wBAAwB,CAAC,CAAC;QAEtD,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;YAC1F,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACxD,MAAM,OAAO,GAAG,UAAU;iBACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;iBAChC,IAAI,EAAE;iBACN,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;YAE5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;gBAC7C,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBACvE,IAAI,OAAO,EAAE,CAAC;wBACZ,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;wBACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,uBAAuB;oBAC5C,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,wBAAwB;gBAC1B,CAAC;YACH,CAAC;YAED,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACzB,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"team-norms.module.js","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/team-norms.module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B;;;;GAIG;AACH,MAAM,cAAc,GAAG,CAAC,CAAC;AAmBzB;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,GAAW;IAInC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IACpC,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9B,mDAAmD;IACnD,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,EAAE,CAAC;YAC9B,GAAG,GAAG,CAAC,CAAC;YACR,MAAM;QACR,CAAC;IACH,CAAC;IACD,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;QACf,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IACpC,CAAC;IAED,MAAM,IAAI,GAAoB,EAAE,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,GAAG,gCAAgC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACjB,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACxB,uBAAuB;QACvB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,OAAO,IAAI,CAAC;YAAE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAEzD,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YACzB,IAAI,CAAC,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;YAC/B,mEAAmE;YACnE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAC/C,IAAI,CAAC,SAAS,GAAG,QAAQ;iBACtB,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;iBAChD,MAAM,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC;aAAM,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAC5D,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,IAAqB,EAAE,IAAwB;IAClE,IAAI,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAClC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAChE,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACvC,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,eAAe;IAC1B,IAAI,GAAG,YAAY,CAAC;IACpB,QAAQ,GAAG,GAAG,CAAC;IACf,SAAS,GAAG,IAAI,CAAC;IACjB,WAAW,GAAG,IAAI,CAAC;IAEnB;;;;;OAKG;IACH,aAAa,CAAC,MAAoB;QAChC,IAAI,CAAC,MAAM,CAAC,aAAa;YAAE,OAAO,KAAK,CAAC;QACxC,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC;gBACxC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,KAAK,CAAC,KAAK,CAAC,MAAoB;QAC9B,MAAM,SAAS,GAAG,MAAM,CAAC,aAAc,CAAC;QACxC,MAAM,QAAQ,GAAa,CAAC,wBAAwB,CAAC,CAAC;QAEtD,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,QAAQ;iBAChC,MAAM,CAAC,SAAS,CAAC;iBACjB,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;iBAChB,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;YACtB,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACxD,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAQnE,MAAM,UAAU,GAAgB,EAAE,CAAC;YAEnC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;gBAC7C,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBAC1D,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;oBAChD,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;wBAAE,SAAS;oBAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;oBAC/B,IAAI,CAAC,OAAO;wBAAE,SAAS;oBACvB,UAAU,CAAC,IAAI,CAAC;wBACd,QAAQ,EAAE,KAAK;wBACf,OAAO,EAAE,OAAO;wBAChB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,CAAC;qBAC7B,CAAC,CAAC;gBACL,CAAC;gBAAC,MAAM,CAAC;oBACP,2EAA2E;gBAC7E,CAAC;YACH,CAAC;YAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5B,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,+DAA+D;YAC/D,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACvB,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ;oBAAE,OAAO,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;gBAC9D,OAAO,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;YAEnD,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;gBAC1B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,uBAAuB;YAC5C,CAAC;YAED,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;CACF"}
@@ -1,6 +1,19 @@
1
1
  import { FSWatcher } from 'fs';
2
2
  import { Team, TeamMember, Project, Ticket, TicketFilter, ScheduledCheck, ScheduledMessage, MessageDeliveryLog } from '../../types/index.js';
3
3
  import { type AgentStatus, type WorkingStatus, type RuntimeType } from '../../constants.js';
4
+ /**
5
+ * Storage-level events emitted after a team is persisted or removed.
6
+ * Subscribers (e.g. {@link TeamTriggerReconciler}) use these to converge
7
+ * side systems without pulling StorageService into a cross-cutting tangle.
8
+ */
9
+ export type StorageEvent = {
10
+ kind: 'team-saved';
11
+ team: Team;
12
+ } | {
13
+ kind: 'team-deleted';
14
+ teamId: string;
15
+ };
16
+ export type StorageListener = (event: StorageEvent) => Promise<void> | void;
4
17
  export declare class StorageService {
5
18
  private static instance;
6
19
  private static instanceHome;
@@ -23,6 +36,12 @@ export declare class StorageService {
23
36
  /** Debounce timer for teams backup to avoid I/O storms */
24
37
  private backupDebounceTimer;
25
38
  private readonly BACKUP_DEBOUNCE_MS;
39
+ /**
40
+ * Listeners registered via {@link onStorageEvent}. Empty by default so
41
+ * existing call-sites pay zero cost; listeners are fired-and-forgotten
42
+ * to keep save/delete latency unchanged.
43
+ */
44
+ private listeners;
26
45
  constructor(crewlyHome?: string);
27
46
  /**
28
47
  * Get singleton instance of StorageService to prevent multiple instances
@@ -158,6 +177,20 @@ export declare class StorageService {
158
177
  * @param id - The team ID to delete
159
178
  */
160
179
  deleteTeam(id: string): Promise<void>;
180
+ /**
181
+ * Register a listener for storage lifecycle events. Returns an unsubscribe
182
+ * function. Listeners are invoked fire-and-forget; errors are logged and
183
+ * never propagated to the save/delete caller.
184
+ *
185
+ * @param listener - Callback invoked for every saved/deleted team
186
+ * @returns Unsubscribe function
187
+ */
188
+ onStorageEvent(listener: StorageListener): () => void;
189
+ /**
190
+ * Fire all registered listeners without awaiting their completion. Any
191
+ * error inside a listener is isolated to that listener.
192
+ */
193
+ private emit;
161
194
  getProjects(): Promise<Project[]>;
162
195
  addProject(projectPath: string): Promise<Project>;
163
196
  saveProject(project: Project): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"storage.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/core/storage.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"storage.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/core/storage.service.ts"],"names":[],"mappings":"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"}
@@ -32,6 +32,12 @@ export class StorageService {
32
32
  /** Debounce timer for teams backup to avoid I/O storms */
33
33
  backupDebounceTimer = null;
34
34
  BACKUP_DEBOUNCE_MS = 2000;
35
+ /**
36
+ * Listeners registered via {@link onStorageEvent}. Empty by default so
37
+ * existing call-sites pay zero cost; listeners are fired-and-forgotten
38
+ * to keep save/delete latency unchanged.
39
+ */
40
+ listeners = [];
35
41
  constructor(crewlyHome) {
36
42
  this.logger = LoggerService.getInstance().createComponentLogger('StorageService');
37
43
  this.crewlyHome = crewlyHome || path.join(os.homedir(), '.crewly');
@@ -433,6 +439,9 @@ export class StorageService {
433
439
  });
434
440
  // Update teams backup (fire-and-forget, non-blocking)
435
441
  this.updateTeamsBackup();
442
+ // Notify listeners (e.g. TeamTriggerReconciler). Fire-and-forget so
443
+ // slow subscribers never block the save path.
444
+ this.emit({ kind: 'team-saved', team });
436
445
  }
437
446
  catch (error) {
438
447
  this.logger.error('Error saving team', {
@@ -563,6 +572,9 @@ export class StorageService {
563
572
  else {
564
573
  this.logger.warn('Team directory not found for deletion', { teamId: id, teamDir });
565
574
  }
575
+ // Always fire the event so listeners can clean up even if the directory
576
+ // had already been removed out-of-band.
577
+ this.emit({ kind: 'team-deleted', teamId: id });
566
578
  }
567
579
  catch (error) {
568
580
  this.logger.error('Error deleting team', {
@@ -572,6 +584,48 @@ export class StorageService {
572
584
  throw error;
573
585
  }
574
586
  }
587
+ // ---------------------------------------------------------------------------
588
+ // Storage event subscriptions
589
+ // ---------------------------------------------------------------------------
590
+ /**
591
+ * Register a listener for storage lifecycle events. Returns an unsubscribe
592
+ * function. Listeners are invoked fire-and-forget; errors are logged and
593
+ * never propagated to the save/delete caller.
594
+ *
595
+ * @param listener - Callback invoked for every saved/deleted team
596
+ * @returns Unsubscribe function
597
+ */
598
+ onStorageEvent(listener) {
599
+ this.listeners.push(listener);
600
+ return () => {
601
+ this.listeners = this.listeners.filter((l) => l !== listener);
602
+ };
603
+ }
604
+ /**
605
+ * Fire all registered listeners without awaiting their completion. Any
606
+ * error inside a listener is isolated to that listener.
607
+ */
608
+ emit(event) {
609
+ for (const listener of this.listeners) {
610
+ try {
611
+ const result = listener(event);
612
+ if (result && typeof result.catch === 'function') {
613
+ result.catch((err) => {
614
+ this.logger.warn('Storage listener failed (async)', {
615
+ event: event.kind,
616
+ error: err instanceof Error ? err.message : String(err),
617
+ });
618
+ });
619
+ }
620
+ }
621
+ catch (err) {
622
+ this.logger.warn('Storage listener failed (sync)', {
623
+ event: event.kind,
624
+ error: err instanceof Error ? err.message : String(err),
625
+ });
626
+ }
627
+ }
628
+ }
575
629
  // Project management
576
630
  async getProjects() {
577
631
  try {