crewly 1.20.127 → 1.20.129
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.
- package/config/templates/growth-marketing-team.json +12 -1
- package/config/templates/personal-assistant-team.json +28 -0
- package/dist/backend/backend/src/constants.d.ts +75 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +81 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts +49 -0
- package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.js +135 -106
- package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/onboarding/index.d.ts +1 -0
- package/dist/backend/backend/src/controllers/onboarding/index.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/onboarding/index.js +1 -0
- package/dist/backend/backend/src/controllers/onboarding/index.js.map +1 -1
- package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.controller.d.ts +38 -0
- package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.controller.js +106 -0
- package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.routes.d.ts +24 -0
- package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.routes.js +34 -0
- package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.routes.js.map +1 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +48 -1
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +5 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +33 -0
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js +63 -0
- package/dist/backend/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/relogin-agent-resumer.service.d.ts +76 -0
- package/dist/backend/backend/src/services/agent/relogin-agent-resumer.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/relogin-agent-resumer.service.js +108 -0
- package/dist/backend/backend/src/services/agent/relogin-agent-resumer.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +10 -0
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
- package/dist/backend/backend/src/services/harness/harness-relogin.service.d.ts +361 -0
- package/dist/backend/backend/src/services/harness/harness-relogin.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-relogin.service.js +756 -0
- package/dist/backend/backend/src/services/harness/harness-relogin.service.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness.service.d.ts +16 -1
- package/dist/backend/backend/src/services/harness/harness.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/harness.service.js +28 -1
- package/dist/backend/backend/src/services/harness/harness.service.js.map +1 -1
- package/dist/backend/backend/src/services/harness/harness.types.d.ts +16 -1
- package/dist/backend/backend/src/services/harness/harness.types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/harness/harness.types.js.map +1 -1
- package/dist/backend/backend/src/services/harness/login-expiry-rules.d.ts +75 -0
- package/dist/backend/backend/src/services/harness/login-expiry-rules.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/login-expiry-rules.js +159 -0
- package/dist/backend/backend/src/services/harness/login-expiry-rules.js.map +1 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.d.ts +45 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.d.ts.map +1 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.js +103 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.js.map +1 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.d.ts +301 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.js +365 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.js.map +1 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-state.store.d.ts +89 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-state.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-state.store.js +122 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-state.store.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +21 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +39 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-relogin-dm.service.d.ts +80 -0
- package/dist/backend/backend/src/services/slack/slack-relogin-dm.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-relogin-dm.service.js +127 -0
- package/dist/backend/backend/src/services/slack/slack-relogin-dm.service.js.map +1 -0
- package/dist/backend/backend/src/services/template/template.service.d.ts +15 -1
- package/dist/backend/backend/src/services/template/template.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/template/template.service.js +22 -1
- package/dist/backend/backend/src/services/template/template.service.js.map +1 -1
- package/dist/backend/backend/src/types/team-template.types.d.ts +30 -0
- package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/team-template.types.js +24 -0
- package/dist/backend/backend/src/types/team-template.types.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +75 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +81 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts +33 -0
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js +63 -0
- package/dist/cli/backend/src/services/agent/oauth-relogin-monitor.service.js.map +1 -1
- package/dist/cli/backend/src/services/harness/harness-relogin.service.d.ts +361 -0
- package/dist/cli/backend/src/services/harness/harness-relogin.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-relogin.service.js +756 -0
- package/dist/cli/backend/src/services/harness/harness-relogin.service.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness.service.d.ts +16 -1
- package/dist/cli/backend/src/services/harness/harness.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/harness.service.js +28 -1
- package/dist/cli/backend/src/services/harness/harness.service.js.map +1 -1
- package/dist/cli/backend/src/services/harness/harness.types.d.ts +16 -1
- package/dist/cli/backend/src/services/harness/harness.types.d.ts.map +1 -1
- package/dist/cli/backend/src/services/harness/harness.types.js.map +1 -1
- package/dist/cli/backend/src/services/harness/login-expiry-rules.d.ts +75 -0
- package/dist/cli/backend/src/services/harness/login-expiry-rules.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/login-expiry-rules.js +159 -0
- package/dist/cli/backend/src/services/harness/login-expiry-rules.js.map +1 -0
- package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.d.ts +301 -0
- package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.js +365 -0
- package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.js.map +1 -0
- package/dist/cli/backend/src/services/onboarding/onboarding-state.store.d.ts +89 -0
- package/dist/cli/backend/src/services/onboarding/onboarding-state.store.d.ts.map +1 -0
- package/dist/cli/backend/src/services/onboarding/onboarding-state.store.js +122 -0
- package/dist/cli/backend/src/services/onboarding/onboarding-state.store.js.map +1 -0
- package/dist/cli/backend/src/services/skill/skill-tier.service.d.ts +116 -0
- package/dist/cli/backend/src/services/skill/skill-tier.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/skill/skill-tier.service.js +155 -0
- package/dist/cli/backend/src/services/skill/skill-tier.service.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts +21 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +39 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/cli/backend/src/services/template/template.service.d.ts +152 -0
- package/dist/cli/backend/src/services/template/template.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/template/template.service.js +506 -0
- package/dist/cli/backend/src/services/template/template.service.js.map +1 -0
- package/dist/cli/backend/src/types/team-template.types.d.ts +30 -0
- package/dist/cli/backend/src/types/team-template.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/team-template.types.js +24 -0
- package/dist/cli/backend/src/types/team-template.types.js.map +1 -1
- package/dist/cli/cli/src/commands/onboard-checklist.d.ts +152 -0
- package/dist/cli/cli/src/commands/onboard-checklist.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/onboard-checklist.js +241 -0
- package/dist/cli/cli/src/commands/onboard-checklist.js.map +1 -0
- package/dist/cli/cli/src/commands/onboard.d.ts +87 -6
- package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/onboard.js +203 -37
- package/dist/cli/cli/src/commands/onboard.js.map +1 -1
- package/dist/cli/cli/src/constants.d.ts +5 -0
- package/dist/cli/cli/src/constants.d.ts.map +1 -1
- package/dist/cli/cli/src/constants.js +5 -0
- package/dist/cli/cli/src/constants.js.map +1 -1
- package/dist/cli/cli/src/index.js +2 -1
- package/dist/cli/cli/src/index.js.map +1 -1
- package/dist/cli/cli/src/utils/templates.d.ts +27 -0
- package/dist/cli/cli/src/utils/templates.d.ts.map +1 -1
- package/dist/cli/cli/src/utils/templates.js +29 -0
- package/dist/cli/cli/src/utils/templates.js.map +1 -1
- package/frontend/dist/assets/index-2bdb57b9.css +42 -0
- package/frontend/dist/assets/{index-aaf65055.js → index-5b98bf77.js} +285 -285
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/frontend/dist/assets/index-0a2f783c.css +0 -42
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding-checklist.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/onboarding/onboarding-checklist.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAyH9F,6CAA6C;AAC7C,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAKpB;IAJrB;;;OAGG;IACH,YAAqB,IAAyB,EAAE,OAAe;QAC9D,KAAK,CAAC,OAAO,CAAC,CAAC;QADK,SAAI,GAAJ,IAAI,CAAqB;QAE7C,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAC/B,CAAC;CACD;AAoCD,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAEhF;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IAC1C,OAAO,KAAK;SACV,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC3B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB;IACtC,MAAM,SAAS,GAAG,GAAG,oBAAoB,CAAC,KAAK,CAAC,WAAW,GAAG,oBAAoB,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;IAC1G,OAAO,GAAG,eAAe,CAAC,iBAAiB,GAAG,oBAAoB,CAAC,KAAK,CAAC,iBAAiB,aAAa,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC;AACxI,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,IAAsC;IACzF,MAAM,KAAK,GAAa,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;IACjE,IAAI,IAAI,EAAE,CAAC;QACV,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,EAAE,oBAAoB,CAAC,CAAC;IACzE,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,iBAAiB,CAAC,QAAsB,EAAE,UAA8B;IAChF,OAAO;QACN,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACxC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1D,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW;YACvE,IAAI,EAAE,IAAI,CAAC,IAAI;SACf,CAAC,CAAC,CACH;QACD,WAAW,EAAE,CAAC,GAAG,UAAU,CAAC,WAAW,CAAC;KACxC,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,SAAS,CAAC,KAAc;IAChC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAEhF;;GAEG;AACH,MAAM,OAAO,0BAA0B;IAIT;IAH7B;;OAEG;IACH,YAA6B,IAA6B;QAA7B,SAAI,GAAJ,IAAI,CAAyB;IAAG,CAAC;IAE9D;;;;;;;OAOG;IACH,KAAK,CAAC,YAAY;QACjB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAoB,MAAM,OAAO,CAAC,GAAG,CAAC;YAChD,IAAI,CAAC,WAAW,EAAE;YAClB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YACpB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;YACzB,IAAI,CAAC,SAAS,EAAE;YAChB,IAAI,CAAC,SAAS,EAAE;SAChB,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QACrD,OAAO;YACN,KAAK;YACL,SAAS;YACT,KAAK,EAAE,KAAK,CAAC,MAAM;YACnB,OAAO,EAAE,SAAS,KAAK,KAAK,CAAC,MAAM;YACnC,SAAS,EAAE,KAAK,CAAC,WAAW,KAAK,IAAI;YACrC,WAAW,EAAE,KAAK,CAAC,WAAW;SAC9B,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,YAAY;QACX,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI;aACxB,SAAS,EAAE;aACX,sBAAsB,EAAE;aACxB,MAAM,CAAC,CAAC,CAAC,EAA0D,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;aACrF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,oBAAoB,CAAC,aAAa,CAAC;QACjD,QAAQ,CAAC,IAAI,CAAC;YACb,EAAE,EAAE,oBAAoB,CAAC,gBAAgB;YACzC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,WAAW,EAAE,KAAK,CAAC,OAAO;YAC1B,WAAW,EAAE,KAAK;YAClB,OAAO,EAAE,EAAE;YACX,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC;SACnC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,iBAAiB,CAAC,SAAiB;QACxC,IAAI,SAAS,KAAK,oBAAoB,CAAC,gBAAgB,EAAE,CAAC;YACzD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;YAC1C,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,aAAa,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;YACrF,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAClD,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YACvC,MAAM,IAAI,eAAe,CAAC,iBAAiB,EAAE,IAAI,SAAS,yBAAyB,CAAC,CAAC;QACtF,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC,EAAE,CAAC,CAAC;QACzF,IAAI,QAAQ;YAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAEnE,MAAM,MAAM,GAAG,MAAM,CAAC,sBAAsB,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QACzE,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,eAAe,CAAC,iBAAiB,EAAE,IAAI,SAAS,yBAAyB,CAAC,CAAC;QAClG,MAAM,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,iBAAiB,CAAC,mBAAmB,CAAC;QAC3F,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC5C,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAC1C,MAAM,CAAC,WAAW,GAAG,OAAoC,CAAC;YAC1D,MAAM,CAAC,WAAW,GAAG,GAAG,QAAQ,IAAI,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,QAAQ,IAAI,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACvG,CAAC;QACD,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACxD,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,aAAa,CAAC,IAAa,EAAE,MAAgB;QAClD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,eAAe,CAAC,cAAc,EAAE,qCAAqC,CAAC,CAAC;QAClF,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,GAAG,oBAAoB,CAAC,qBAAqB,EAAE,CAAC;YAC9D,MAAM,IAAI,eAAe,CAAC,cAAc,EAAE,6BAA6B,oBAAoB,CAAC,qBAAqB,aAAa,CAAC,CAAC;QACjI,CAAC;QACD,IAAI,IAAI,GAAgB,IAAI,CAAC;QAC7B,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;YAC9D,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC;YAC1E,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,eAAe,CAAC,cAAc,EAAE,SAAS,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC5F,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE;YAClF,MAAM,EAAE,oBAAoB,CAAC,iBAAiB;YAC9C,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpC,CAAC,CAAC;QACH,IAAI,MAAM,GAAkB,IAAI,CAAC;QACjC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;YACzF,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACrF,CAAC;QACD,OAAO;YACN,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,IAAI;YACxB,MAAM;YACN,OAAO,EAAE,IAAI,CAAC,KAAK;SACnB,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,qBAAqB,CAAC,IAAY,EAAE,MAAqB;QAC9D,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,oBAAoB,CAAC,qBAAqB,EAAE,CAAC;YAC1F,MAAM,IAAI,eAAe,CAAC,cAAc,EAAE,qCAAqC,CAAC,CAAC;QAClF,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;QAChD,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,gBAAgB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;IACtG,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,uBAAuB;QAC5B,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC1D,IAAI,CAAC,gBAAgB;YAAE,OAAO,IAAI,CAAC;QACnC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QACpI,OAAO,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,YAAY,CAAC,SAAkB;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;QAC1C,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACpG,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAED,8EAA8E;IAC9E,QAAQ;IACR,8EAA8E;IAE9E,4BAA4B;IACpB,KAAK,CAAC,WAAW;QACxB,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,KAAK,IAAI,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,UAAU,KAAK,YAAY,CAAC;YAClG,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QAClI,CAAC;IACF,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,QAAQ,CAAC,KAAsB;QAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,KAAK,IAAI,CAAC;QAC3C,IAAI,CAAC;YACJ,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;YACvH,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;QAClF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QAC3F,CAAC;IACF,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,aAAa,CAAC,KAAsB;QACjD,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,MAAM,IAAI,IAAI,CAAC;QAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,gBAAgB,KAAK,IAAI,CAAC;QAChD,IAAI,CAAC;YACJ,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YACrD,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,IAAI,gBAAgB,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,EAAE,CAAC;QACvH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QACnI,CAAC;IACF,CAAC;IAED,0BAA0B;IAClB,KAAK,CAAC,SAAS;QACtB,MAAM,kBAAkB,GAAG,uBAAuB,EAAE,CAAC;QACrD,IAAI,CAAC;YACJ,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACtD,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,kBAAkB,EAAE,EAAE,CAAC;QACnH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QAC5H,CAAC;IACF,CAAC;IAED,0BAA0B;IAClB,KAAK,CAAC,SAAS;QACtB,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC;YACJ,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACR,8BAA8B;QAC/B,CAAC;QACD,IAAI,CAAC;YACJ,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC/C,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,EAAE,CAAC;QAChF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;QAC5G,CAAC;IACF,CAAC;CACD"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Onboarding state store — `<crewlyHome>/onboarding.json`.
|
|
3
|
+
*
|
|
4
|
+
* Holds the few things the first-run checklist cannot read from the rest of
|
|
5
|
+
* the system (specs/onboarding-harness-login.md, Phase 3):
|
|
6
|
+
*
|
|
7
|
+
* - `dismissedAt`: the owner hid the dashboard checklist card;
|
|
8
|
+
* - `blankChosenAt`: the owner chose "Blank" (the orchestrator only), which
|
|
9
|
+
* completes the team step without a team;
|
|
10
|
+
* - `firstTask`: a first task that was handed to the orchestrator;
|
|
11
|
+
* - `pendingFirstTask`: a first task typed in `crewly onboard` while the
|
|
12
|
+
* backend was down, delivered when the backend starts.
|
|
13
|
+
*
|
|
14
|
+
* Everything else (harness login, teams, Cloud, Slack) is read live.
|
|
15
|
+
* Writes are atomic (temp file + rename) and serialized per store.
|
|
16
|
+
*
|
|
17
|
+
* @module services/onboarding/onboarding-state.store
|
|
18
|
+
*/
|
|
19
|
+
/** A first task handed to the orchestrator. */
|
|
20
|
+
export interface SentFirstTask {
|
|
21
|
+
/** ISO time it was handed over */
|
|
22
|
+
sentAt: string;
|
|
23
|
+
/** Team it was meant for (null = the orchestrator itself) */
|
|
24
|
+
teamId: string | null;
|
|
25
|
+
/** Chat conversation it was recorded in */
|
|
26
|
+
conversationId: string | null;
|
|
27
|
+
}
|
|
28
|
+
/** A first task waiting for the backend to start. */
|
|
29
|
+
export interface PendingFirstTask {
|
|
30
|
+
/** The owner's words */
|
|
31
|
+
text: string;
|
|
32
|
+
/** Team it is meant for (null = the orchestrator itself) */
|
|
33
|
+
teamId: string | null;
|
|
34
|
+
/** ISO time it was typed */
|
|
35
|
+
createdAt: string;
|
|
36
|
+
}
|
|
37
|
+
/** Contents of `onboarding.json`. */
|
|
38
|
+
export interface OnboardingState {
|
|
39
|
+
dismissedAt: string | null;
|
|
40
|
+
blankChosenAt: string | null;
|
|
41
|
+
firstTask: SentFirstTask | null;
|
|
42
|
+
pendingFirstTask: PendingFirstTask | null;
|
|
43
|
+
}
|
|
44
|
+
/** State of a machine that never saw onboarding. */
|
|
45
|
+
export declare const EMPTY_ONBOARDING_STATE: OnboardingState;
|
|
46
|
+
/**
|
|
47
|
+
* Normalize parsed JSON into a complete state (unknown / malformed fields are dropped).
|
|
48
|
+
*
|
|
49
|
+
* @param raw - Parsed file contents
|
|
50
|
+
* @returns A complete state
|
|
51
|
+
*/
|
|
52
|
+
export declare function normalizeOnboardingState(raw: unknown): OnboardingState;
|
|
53
|
+
/**
|
|
54
|
+
* File-backed onboarding state.
|
|
55
|
+
*/
|
|
56
|
+
export declare class OnboardingStateStore {
|
|
57
|
+
private readonly filePath;
|
|
58
|
+
/** Serializes read-modify-write cycles */
|
|
59
|
+
private chain;
|
|
60
|
+
/**
|
|
61
|
+
* @param crewlyHome - Crewly home dir (defaults to `CREWLY_HOME` / `~/.crewly`)
|
|
62
|
+
*/
|
|
63
|
+
constructor(crewlyHome?: string);
|
|
64
|
+
/**
|
|
65
|
+
* Path of the state file.
|
|
66
|
+
*
|
|
67
|
+
* @returns Absolute path
|
|
68
|
+
*/
|
|
69
|
+
getFilePath(): string;
|
|
70
|
+
/**
|
|
71
|
+
* Read the state. A missing or unreadable file reads as empty.
|
|
72
|
+
*
|
|
73
|
+
* @returns The state
|
|
74
|
+
*/
|
|
75
|
+
read(): Promise<OnboardingState>;
|
|
76
|
+
/**
|
|
77
|
+
* Apply a change and write the result atomically.
|
|
78
|
+
*
|
|
79
|
+
* @param change - Returns the fields to change
|
|
80
|
+
* @returns The state after the change
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```ts
|
|
84
|
+
* await store.update(() => ({ dismissedAt: new Date().toISOString() }));
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
update(change: (current: OnboardingState) => Partial<OnboardingState>): Promise<OnboardingState>;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=onboarding-state.store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding-state.store.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/onboarding/onboarding-state.store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAOH,+CAA+C;AAC/C,MAAM,WAAW,aAAa;IAC7B,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,2CAA2C;IAC3C,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,qDAAqD;AACrD,MAAM,WAAW,gBAAgB;IAChC,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,qCAAqC;AACrC,MAAM,WAAW,eAAe;IAC/B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,aAAa,GAAG,IAAI,CAAC;IAChC,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC1C;AAED,oDAAoD;AACpD,eAAO,MAAM,sBAAsB,EAAE,eAKnC,CAAC;AAYH;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,eAAe,CAiBtE;AAED;;GAEG;AACH,qBAAa,oBAAoB;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,0CAA0C;IAC1C,OAAO,CAAC,KAAK,CAAuC;IAEpD;;OAEG;gBACS,UAAU,GAAE,MAA4B;IAIpD;;;;OAIG;IACH,WAAW,IAAI,MAAM;IAIrB;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,eAAe,CAAC;IAQtC;;;;;;;;;;OAUG;IACH,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;CAchG"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Onboarding state store — `<crewlyHome>/onboarding.json`.
|
|
3
|
+
*
|
|
4
|
+
* Holds the few things the first-run checklist cannot read from the rest of
|
|
5
|
+
* the system (specs/onboarding-harness-login.md, Phase 3):
|
|
6
|
+
*
|
|
7
|
+
* - `dismissedAt`: the owner hid the dashboard checklist card;
|
|
8
|
+
* - `blankChosenAt`: the owner chose "Blank" (the orchestrator only), which
|
|
9
|
+
* completes the team step without a team;
|
|
10
|
+
* - `firstTask`: a first task that was handed to the orchestrator;
|
|
11
|
+
* - `pendingFirstTask`: a first task typed in `crewly onboard` while the
|
|
12
|
+
* backend was down, delivered when the backend starts.
|
|
13
|
+
*
|
|
14
|
+
* Everything else (harness login, teams, Cloud, Slack) is read live.
|
|
15
|
+
* Writes are atomic (temp file + rename) and serialized per store.
|
|
16
|
+
*
|
|
17
|
+
* @module services/onboarding/onboarding-state.store
|
|
18
|
+
*/
|
|
19
|
+
import { promises as fs } from 'fs';
|
|
20
|
+
import * as path from 'path';
|
|
21
|
+
import { ONBOARDING_CONSTANTS } from '../../constants.js';
|
|
22
|
+
import { getCrewlyHomePath } from '../core/crewly-home.utils.js';
|
|
23
|
+
/** State of a machine that never saw onboarding. */
|
|
24
|
+
export const EMPTY_ONBOARDING_STATE = Object.freeze({
|
|
25
|
+
dismissedAt: null,
|
|
26
|
+
blankChosenAt: null,
|
|
27
|
+
firstTask: null,
|
|
28
|
+
pendingFirstTask: null,
|
|
29
|
+
});
|
|
30
|
+
/**
|
|
31
|
+
* Read an ISO string field, or null.
|
|
32
|
+
*
|
|
33
|
+
* @param value - Candidate
|
|
34
|
+
* @returns The string, or null
|
|
35
|
+
*/
|
|
36
|
+
function asString(value) {
|
|
37
|
+
return typeof value === 'string' && value.length > 0 ? value : null;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Normalize parsed JSON into a complete state (unknown / malformed fields are dropped).
|
|
41
|
+
*
|
|
42
|
+
* @param raw - Parsed file contents
|
|
43
|
+
* @returns A complete state
|
|
44
|
+
*/
|
|
45
|
+
export function normalizeOnboardingState(raw) {
|
|
46
|
+
if (!raw || typeof raw !== 'object')
|
|
47
|
+
return { ...EMPTY_ONBOARDING_STATE };
|
|
48
|
+
const o = raw;
|
|
49
|
+
const task = o.firstTask;
|
|
50
|
+
const pending = o.pendingFirstTask;
|
|
51
|
+
return {
|
|
52
|
+
dismissedAt: asString(o.dismissedAt),
|
|
53
|
+
blankChosenAt: asString(o.blankChosenAt),
|
|
54
|
+
firstTask: task && typeof task === 'object' && asString(task.sentAt)
|
|
55
|
+
? { sentAt: task.sentAt, teamId: asString(task.teamId), conversationId: asString(task.conversationId) }
|
|
56
|
+
: null,
|
|
57
|
+
pendingFirstTask: pending && typeof pending === 'object' && asString(pending.text) && asString(pending.createdAt)
|
|
58
|
+
? { text: pending.text, teamId: asString(pending.teamId), createdAt: pending.createdAt }
|
|
59
|
+
: null,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* File-backed onboarding state.
|
|
64
|
+
*/
|
|
65
|
+
export class OnboardingStateStore {
|
|
66
|
+
filePath;
|
|
67
|
+
/** Serializes read-modify-write cycles */
|
|
68
|
+
chain = Promise.resolve();
|
|
69
|
+
/**
|
|
70
|
+
* @param crewlyHome - Crewly home dir (defaults to `CREWLY_HOME` / `~/.crewly`)
|
|
71
|
+
*/
|
|
72
|
+
constructor(crewlyHome = getCrewlyHomePath()) {
|
|
73
|
+
this.filePath = path.join(crewlyHome, ONBOARDING_CONSTANTS.STATE_FILE);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Path of the state file.
|
|
77
|
+
*
|
|
78
|
+
* @returns Absolute path
|
|
79
|
+
*/
|
|
80
|
+
getFilePath() {
|
|
81
|
+
return this.filePath;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Read the state. A missing or unreadable file reads as empty.
|
|
85
|
+
*
|
|
86
|
+
* @returns The state
|
|
87
|
+
*/
|
|
88
|
+
async read() {
|
|
89
|
+
try {
|
|
90
|
+
return normalizeOnboardingState(JSON.parse(await fs.readFile(this.filePath, 'utf-8')));
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return { ...EMPTY_ONBOARDING_STATE };
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Apply a change and write the result atomically.
|
|
98
|
+
*
|
|
99
|
+
* @param change - Returns the fields to change
|
|
100
|
+
* @returns The state after the change
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* ```ts
|
|
104
|
+
* await store.update(() => ({ dismissedAt: new Date().toISOString() }));
|
|
105
|
+
* ```
|
|
106
|
+
*/
|
|
107
|
+
update(change) {
|
|
108
|
+
const run = async () => {
|
|
109
|
+
const current = await this.read();
|
|
110
|
+
const next = { ...current, ...change(current) };
|
|
111
|
+
await fs.mkdir(path.dirname(this.filePath), { recursive: true });
|
|
112
|
+
const tmp = `${this.filePath}.${process.pid}.${Date.now()}.tmp`;
|
|
113
|
+
await fs.writeFile(tmp, `${JSON.stringify(next, null, 2)}\n`, 'utf-8');
|
|
114
|
+
await fs.rename(tmp, this.filePath);
|
|
115
|
+
return next;
|
|
116
|
+
};
|
|
117
|
+
const result = this.chain.then(run, run);
|
|
118
|
+
this.chain = result.catch(() => undefined);
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=onboarding-state.store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding-state.store.js","sourceRoot":"","sources":["../../../../../../backend/src/services/onboarding/onboarding-state.store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Tier Service
|
|
3
|
+
*
|
|
4
|
+
* Handles paid skill tier checking and graceful degradation.
|
|
5
|
+
* Resolves which skills an agent can access based on their cloud tier,
|
|
6
|
+
* substituting premium skills with free fallbacks when the user's tier
|
|
7
|
+
* is insufficient.
|
|
8
|
+
*
|
|
9
|
+
* Tier hierarchy: free < pro < enterprise
|
|
10
|
+
*
|
|
11
|
+
* @module services/skill/skill-tier.service
|
|
12
|
+
*/
|
|
13
|
+
import { CloudTier } from '../../constants.js';
|
|
14
|
+
/**
|
|
15
|
+
* Metadata about a skill's tier requirements and fallback.
|
|
16
|
+
* Mirrors the optional fields added to skill.json.
|
|
17
|
+
*/
|
|
18
|
+
export interface SkillTierInfo {
|
|
19
|
+
/** Skill identifier */
|
|
20
|
+
id: string;
|
|
21
|
+
/** Minimum tier required to use this skill. Defaults to 'free' if omitted. */
|
|
22
|
+
requiredTier?: CloudTier;
|
|
23
|
+
/** Skill ID to use as a free-tier fallback when tier is insufficient */
|
|
24
|
+
fallbackSkill?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* A skill that was successfully resolved (either direct access or via fallback).
|
|
28
|
+
*/
|
|
29
|
+
export interface ResolvedSkill {
|
|
30
|
+
/** The skill ID that should actually be used */
|
|
31
|
+
id: string;
|
|
32
|
+
/** How this skill was resolved */
|
|
33
|
+
source: 'direct' | 'degraded';
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* A skill that could not be used at the user's current tier.
|
|
37
|
+
*/
|
|
38
|
+
export interface DegradedSkill {
|
|
39
|
+
/** The original premium skill ID */
|
|
40
|
+
original: string;
|
|
41
|
+
/** The fallback skill ID, or null if no fallback exists */
|
|
42
|
+
fallback: string | null;
|
|
43
|
+
/** The tier required for the original skill */
|
|
44
|
+
requiredTier: CloudTier;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Result of resolving a set of skills against a user's tier.
|
|
48
|
+
*/
|
|
49
|
+
export interface ResolvedSkillSet {
|
|
50
|
+
/** Skills the agent can use (direct + degraded-with-fallback) */
|
|
51
|
+
skills: ResolvedSkill[];
|
|
52
|
+
/** Skills that were downgraded or removed due to insufficient tier */
|
|
53
|
+
degraded: DegradedSkill[];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Service for checking skill tier requirements and performing graceful degradation.
|
|
57
|
+
*
|
|
58
|
+
* When an agent's assigned skills include premium skills that exceed the user's
|
|
59
|
+
* cloud tier, this service substitutes them with free-tier fallbacks (if available)
|
|
60
|
+
* or removes them entirely, producing a degradation notice for the agent prompt.
|
|
61
|
+
*/
|
|
62
|
+
export declare class SkillTierService {
|
|
63
|
+
private static instance;
|
|
64
|
+
private readonly logger;
|
|
65
|
+
private constructor();
|
|
66
|
+
/**
|
|
67
|
+
* Get the singleton instance of SkillTierService.
|
|
68
|
+
*
|
|
69
|
+
* @returns The SkillTierService singleton
|
|
70
|
+
*/
|
|
71
|
+
static getInstance(): SkillTierService;
|
|
72
|
+
/**
|
|
73
|
+
* Reset the singleton instance (for testing).
|
|
74
|
+
*/
|
|
75
|
+
static resetInstance(): void;
|
|
76
|
+
/**
|
|
77
|
+
* Check whether a user's tier is sufficient for a required tier.
|
|
78
|
+
*
|
|
79
|
+
* @param userTier - The user's current cloud tier
|
|
80
|
+
* @param requiredTier - The minimum tier required
|
|
81
|
+
* @returns true if userTier >= requiredTier in the hierarchy
|
|
82
|
+
*/
|
|
83
|
+
isTierSufficient(userTier: CloudTier, requiredTier: CloudTier): boolean;
|
|
84
|
+
/**
|
|
85
|
+
* Resolve a set of assigned skills against the user's tier.
|
|
86
|
+
*
|
|
87
|
+
* For each skill:
|
|
88
|
+
* - If no requiredTier or requiredTier <= userTier → included as 'direct'
|
|
89
|
+
* - If requiredTier > userTier and fallbackSkill exists → replaced with fallback as 'degraded'
|
|
90
|
+
* - If requiredTier > userTier and no fallback → excluded and listed in degraded
|
|
91
|
+
*
|
|
92
|
+
* @param assignedSkills - Array of skill tier info objects
|
|
93
|
+
* @param userTier - The user's current cloud tier
|
|
94
|
+
* @returns Resolved skill set with accessible skills and degradation info
|
|
95
|
+
*/
|
|
96
|
+
resolveSkills(assignedSkills: SkillTierInfo[], userTier: CloudTier): ResolvedSkillSet;
|
|
97
|
+
/**
|
|
98
|
+
* Build a human-readable degradation notice for injection into agent prompts.
|
|
99
|
+
*
|
|
100
|
+
* @param degraded - Array of degraded skills from resolveSkills()
|
|
101
|
+
* @param userTier - The user's current tier (for display)
|
|
102
|
+
* @returns Markdown-formatted notice string, or empty string if no degradations
|
|
103
|
+
*/
|
|
104
|
+
buildDegradationNotice(degraded: DegradedSkill[], userTier: CloudTier): string;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Get the singleton SkillTierService instance.
|
|
108
|
+
*
|
|
109
|
+
* @returns The SkillTierService singleton
|
|
110
|
+
*/
|
|
111
|
+
export declare function getSkillTierService(): SkillTierService;
|
|
112
|
+
/**
|
|
113
|
+
* Reset the SkillTierService singleton (for testing).
|
|
114
|
+
*/
|
|
115
|
+
export declare function resetSkillTierService(): void;
|
|
116
|
+
//# sourceMappingURL=skill-tier.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-tier.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/skill/skill-tier.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,SAAS,EAAmB,MAAM,oBAAoB,CAAC;AAahE;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC7B,uBAAuB;IACvB,EAAE,EAAE,MAAM,CAAC;IAEX,8EAA8E;IAC9E,YAAY,CAAC,EAAE,SAAS,CAAC;IAEzB,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,gDAAgD;IAChD,EAAE,EAAE,MAAM,CAAC;IAEX,kCAAkC;IAClC,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IAEjB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAExB,+CAA+C;IAC/C,YAAY,EAAE,SAAS,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,iEAAiE;IACjE,MAAM,EAAE,aAAa,EAAE,CAAC;IAExB,sEAAsE;IACtE,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAiC;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IAEzC,OAAO;IAIP;;;;OAIG;IACH,MAAM,CAAC,WAAW,IAAI,gBAAgB;IAOtC;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B;;;;;;OAMG;IACH,gBAAgB,CAAC,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,GAAG,OAAO;IAMvE;;;;;;;;;;;OAWG;IACH,aAAa,CAAC,cAAc,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,SAAS,GAAG,gBAAgB;IAsCrF;;;;;;OAMG;IACH,sBAAsB,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,QAAQ,EAAE,SAAS,GAAG,MAAM;CAyB9E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CAEtD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Tier Service
|
|
3
|
+
*
|
|
4
|
+
* Handles paid skill tier checking and graceful degradation.
|
|
5
|
+
* Resolves which skills an agent can access based on their cloud tier,
|
|
6
|
+
* substituting premium skills with free fallbacks when the user's tier
|
|
7
|
+
* is insufficient.
|
|
8
|
+
*
|
|
9
|
+
* Tier hierarchy: free < pro < enterprise
|
|
10
|
+
*
|
|
11
|
+
* @module services/skill/skill-tier.service
|
|
12
|
+
*/
|
|
13
|
+
import { CLOUD_CONSTANTS } from '../../constants.js';
|
|
14
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
15
|
+
/**
|
|
16
|
+
* Numeric weight for each tier, used for comparison.
|
|
17
|
+
* Higher number = higher tier.
|
|
18
|
+
*/
|
|
19
|
+
const TIER_HIERARCHY = {
|
|
20
|
+
[CLOUD_CONSTANTS.TIERS.FREE]: 0,
|
|
21
|
+
[CLOUD_CONSTANTS.TIERS.PRO]: 1,
|
|
22
|
+
[CLOUD_CONSTANTS.TIERS.ENTERPRISE]: 2,
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Service for checking skill tier requirements and performing graceful degradation.
|
|
26
|
+
*
|
|
27
|
+
* When an agent's assigned skills include premium skills that exceed the user's
|
|
28
|
+
* cloud tier, this service substitutes them with free-tier fallbacks (if available)
|
|
29
|
+
* or removes them entirely, producing a degradation notice for the agent prompt.
|
|
30
|
+
*/
|
|
31
|
+
export class SkillTierService {
|
|
32
|
+
static instance = null;
|
|
33
|
+
logger;
|
|
34
|
+
constructor() {
|
|
35
|
+
this.logger = LoggerService.getInstance().createComponentLogger('SkillTierService');
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get the singleton instance of SkillTierService.
|
|
39
|
+
*
|
|
40
|
+
* @returns The SkillTierService singleton
|
|
41
|
+
*/
|
|
42
|
+
static getInstance() {
|
|
43
|
+
if (!SkillTierService.instance) {
|
|
44
|
+
SkillTierService.instance = new SkillTierService();
|
|
45
|
+
}
|
|
46
|
+
return SkillTierService.instance;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Reset the singleton instance (for testing).
|
|
50
|
+
*/
|
|
51
|
+
static resetInstance() {
|
|
52
|
+
SkillTierService.instance = null;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Check whether a user's tier is sufficient for a required tier.
|
|
56
|
+
*
|
|
57
|
+
* @param userTier - The user's current cloud tier
|
|
58
|
+
* @param requiredTier - The minimum tier required
|
|
59
|
+
* @returns true if userTier >= requiredTier in the hierarchy
|
|
60
|
+
*/
|
|
61
|
+
isTierSufficient(userTier, requiredTier) {
|
|
62
|
+
const userLevel = TIER_HIERARCHY[userTier] ?? 0;
|
|
63
|
+
const requiredLevel = TIER_HIERARCHY[requiredTier] ?? 0;
|
|
64
|
+
return userLevel >= requiredLevel;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Resolve a set of assigned skills against the user's tier.
|
|
68
|
+
*
|
|
69
|
+
* For each skill:
|
|
70
|
+
* - If no requiredTier or requiredTier <= userTier → included as 'direct'
|
|
71
|
+
* - If requiredTier > userTier and fallbackSkill exists → replaced with fallback as 'degraded'
|
|
72
|
+
* - If requiredTier > userTier and no fallback → excluded and listed in degraded
|
|
73
|
+
*
|
|
74
|
+
* @param assignedSkills - Array of skill tier info objects
|
|
75
|
+
* @param userTier - The user's current cloud tier
|
|
76
|
+
* @returns Resolved skill set with accessible skills and degradation info
|
|
77
|
+
*/
|
|
78
|
+
resolveSkills(assignedSkills, userTier) {
|
|
79
|
+
const skills = [];
|
|
80
|
+
const degraded = [];
|
|
81
|
+
for (const skill of assignedSkills) {
|
|
82
|
+
const requiredTier = skill.requiredTier || CLOUD_CONSTANTS.TIERS.FREE;
|
|
83
|
+
if (this.isTierSufficient(userTier, requiredTier)) {
|
|
84
|
+
skills.push({ id: skill.id, source: 'direct' });
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
const degradedEntry = {
|
|
88
|
+
original: skill.id,
|
|
89
|
+
fallback: skill.fallbackSkill || null,
|
|
90
|
+
requiredTier: requiredTier,
|
|
91
|
+
};
|
|
92
|
+
degraded.push(degradedEntry);
|
|
93
|
+
if (skill.fallbackSkill) {
|
|
94
|
+
skills.push({ id: skill.fallbackSkill, source: 'degraded' });
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (degraded.length > 0) {
|
|
99
|
+
this.logger.info('Skills degraded due to insufficient tier', {
|
|
100
|
+
userTier,
|
|
101
|
+
degradedCount: degraded.length,
|
|
102
|
+
degraded: degraded.map(d => ({
|
|
103
|
+
original: d.original,
|
|
104
|
+
fallback: d.fallback,
|
|
105
|
+
requiredTier: d.requiredTier,
|
|
106
|
+
})),
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
return { skills, degraded };
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Build a human-readable degradation notice for injection into agent prompts.
|
|
113
|
+
*
|
|
114
|
+
* @param degraded - Array of degraded skills from resolveSkills()
|
|
115
|
+
* @param userTier - The user's current tier (for display)
|
|
116
|
+
* @returns Markdown-formatted notice string, or empty string if no degradations
|
|
117
|
+
*/
|
|
118
|
+
buildDegradationNotice(degraded, userTier) {
|
|
119
|
+
if (degraded.length === 0) {
|
|
120
|
+
return '';
|
|
121
|
+
}
|
|
122
|
+
const lines = [
|
|
123
|
+
'## Premium Skills Notice',
|
|
124
|
+
'',
|
|
125
|
+
`Your team template includes the following premium skills but current account is **${userTier}** tier:`,
|
|
126
|
+
'',
|
|
127
|
+
];
|
|
128
|
+
for (const d of degraded) {
|
|
129
|
+
if (d.fallback) {
|
|
130
|
+
lines.push(`- **${d.original}** → downgraded to \`${d.fallback}\` (requires ${d.requiredTier})`);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
lines.push(`- **${d.original}** → not available (requires ${d.requiredTier})`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
lines.push('');
|
|
137
|
+
lines.push('Upgrade at https://crewlyai.com/pricing');
|
|
138
|
+
return lines.join('\n');
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Get the singleton SkillTierService instance.
|
|
143
|
+
*
|
|
144
|
+
* @returns The SkillTierService singleton
|
|
145
|
+
*/
|
|
146
|
+
export function getSkillTierService() {
|
|
147
|
+
return SkillTierService.getInstance();
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Reset the SkillTierService singleton (for testing).
|
|
151
|
+
*/
|
|
152
|
+
export function resetSkillTierService() {
|
|
153
|
+
SkillTierService.resetInstance();
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=skill-tier.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-tier.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/skill/skill-tier.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* @module services/slack/bridge
|
|
8
8
|
*/
|
|
9
9
|
import { EventEmitter } from 'events';
|
|
10
|
-
import { SlackNotification, ParsedSlackCommand } from '../../types/slack.types.js';
|
|
10
|
+
import { SlackIncomingMessage, SlackNotification, ParsedSlackCommand } from '../../types/slack.types.js';
|
|
11
11
|
import type { MessageQueueService } from '../messaging/message-queue.service.js';
|
|
12
12
|
import type { SlackThreadStoreService } from './slack-thread-store.service.js';
|
|
13
13
|
import { suppressTrivialOrShort, suppressFileOnly } from '../v3/ticket-intake.service.js';
|
|
@@ -75,6 +75,13 @@ export declare class SlackOrchestratorBridge extends EventEmitter {
|
|
|
75
75
|
private initialized;
|
|
76
76
|
/** Track if we've already logged the missing scope warning */
|
|
77
77
|
private loggedMissingScope;
|
|
78
|
+
/**
|
|
79
|
+
* Offered every inbound message before anything else (logging, file
|
|
80
|
+
* download, thread store, routing). Returns true when it consumed the
|
|
81
|
+
* message — used by the harness re-login so an owner's login code is
|
|
82
|
+
* never logged, stored or forwarded to the orchestrator.
|
|
83
|
+
*/
|
|
84
|
+
private inboundInterceptor;
|
|
78
85
|
/**
|
|
79
86
|
* Pending completion reactions keyed by "channelId:threadTs".
|
|
80
87
|
* Stores the original message ts so that the ✅ reaction is added to the
|
|
@@ -106,6 +113,19 @@ export declare class SlackOrchestratorBridge extends EventEmitter {
|
|
|
106
113
|
* @returns True if initialized
|
|
107
114
|
*/
|
|
108
115
|
isInitialized(): boolean;
|
|
116
|
+
/**
|
|
117
|
+
* Set (or clear) the inbound interceptor. See {@link inboundInterceptor}.
|
|
118
|
+
*
|
|
119
|
+
* @param interceptor - Returns true when it consumed the message, or null to clear
|
|
120
|
+
*/
|
|
121
|
+
setInboundInterceptor(interceptor: ((message: SlackIncomingMessage) => boolean) | null): void;
|
|
122
|
+
/**
|
|
123
|
+
* Offer a message to the inbound interceptor. Never logs the text.
|
|
124
|
+
*
|
|
125
|
+
* @param message - Inbound Slack message
|
|
126
|
+
* @returns True when the interceptor consumed it
|
|
127
|
+
*/
|
|
128
|
+
private interceptInbound;
|
|
109
129
|
/**
|
|
110
130
|
* Set the message queue service for enqueuing messages to the orchestrator.
|
|
111
131
|
* Called during server initialization.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack-orchestrator-bridge.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-orchestrator-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAkBtC,OAAO,
|
|
1
|
+
{"version":3,"file":"slack-orchestrator-bridge.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-orchestrator-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -119,6 +119,13 @@ export class SlackOrchestratorBridge extends EventEmitter {
|
|
|
119
119
|
initialized = false;
|
|
120
120
|
/** Track if we've already logged the missing scope warning */
|
|
121
121
|
loggedMissingScope = false;
|
|
122
|
+
/**
|
|
123
|
+
* Offered every inbound message before anything else (logging, file
|
|
124
|
+
* download, thread store, routing). Returns true when it consumed the
|
|
125
|
+
* message — used by the harness re-login so an owner's login code is
|
|
126
|
+
* never logged, stored or forwarded to the orchestrator.
|
|
127
|
+
*/
|
|
128
|
+
inboundInterceptor = null;
|
|
122
129
|
/**
|
|
123
130
|
* Pending completion reactions keyed by "channelId:threadTs".
|
|
124
131
|
* Stores the original message ts so that the ✅ reaction is added to the
|
|
@@ -178,6 +185,34 @@ export class SlackOrchestratorBridge extends EventEmitter {
|
|
|
178
185
|
isInitialized() {
|
|
179
186
|
return this.initialized;
|
|
180
187
|
}
|
|
188
|
+
/**
|
|
189
|
+
* Set (or clear) the inbound interceptor. See {@link inboundInterceptor}.
|
|
190
|
+
*
|
|
191
|
+
* @param interceptor - Returns true when it consumed the message, or null to clear
|
|
192
|
+
*/
|
|
193
|
+
setInboundInterceptor(interceptor) {
|
|
194
|
+
this.inboundInterceptor = interceptor;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Offer a message to the inbound interceptor. Never logs the text.
|
|
198
|
+
*
|
|
199
|
+
* @param message - Inbound Slack message
|
|
200
|
+
* @returns True when the interceptor consumed it
|
|
201
|
+
*/
|
|
202
|
+
interceptInbound(message) {
|
|
203
|
+
if (!this.inboundInterceptor)
|
|
204
|
+
return false;
|
|
205
|
+
try {
|
|
206
|
+
if (!this.inboundInterceptor(message))
|
|
207
|
+
return false;
|
|
208
|
+
this.logger.info('Inbound Slack message consumed by the harness re-login', { channelId: message.channelId });
|
|
209
|
+
return true;
|
|
210
|
+
}
|
|
211
|
+
catch (err) {
|
|
212
|
+
this.logger.warn('Inbound interceptor failed (message routed normally)', { error: err instanceof Error ? err.message : String(err) });
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
181
216
|
/**
|
|
182
217
|
* Set the message queue service for enqueuing messages to the orchestrator.
|
|
183
218
|
* Called during server initialization.
|
|
@@ -221,6 +256,10 @@ export class SlackOrchestratorBridge extends EventEmitter {
|
|
|
221
256
|
* @param message - Incoming Slack message
|
|
222
257
|
*/
|
|
223
258
|
async handleSlackMessage(message) {
|
|
259
|
+
// Before the log line below: a consumed message (an owner's login code)
|
|
260
|
+
// must not appear in logs, the thread store or the orchestrator.
|
|
261
|
+
if (this.interceptInbound(message))
|
|
262
|
+
return;
|
|
224
263
|
this.logger.info('Received message', {
|
|
225
264
|
preview: (message.text || '').substring(0, 50),
|
|
226
265
|
hasImages: message.hasImages,
|