crewly 1.20.128 → 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 +45 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +51 -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 +17 -0
- 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/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/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/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 +45 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +51 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- 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/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,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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"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template Service
|
|
3
|
+
*
|
|
4
|
+
* Loads, lists, and applies team templates from config/templates/.
|
|
5
|
+
* Supports both the new TeamTemplate format (with verificationPipeline)
|
|
6
|
+
* and legacy flat JSON format (backward compatible).
|
|
7
|
+
*
|
|
8
|
+
* @module services/template/template
|
|
9
|
+
*/
|
|
10
|
+
import type { TeamTemplate, TemplateOnboarding } from '../../types/team-template.types.js';
|
|
11
|
+
import type { Team } from '../../types/index.js';
|
|
12
|
+
import { type CloudTier } from '../../constants.js';
|
|
13
|
+
/** Result of creating a team from a template */
|
|
14
|
+
export interface CreateFromTemplateResult {
|
|
15
|
+
/** The created team */
|
|
16
|
+
team: Team;
|
|
17
|
+
/** Template ID used */
|
|
18
|
+
templateId: string;
|
|
19
|
+
/** Number of members created */
|
|
20
|
+
memberCount: number;
|
|
21
|
+
}
|
|
22
|
+
/** Template source — local disk */
|
|
23
|
+
export type TemplateSource = 'local';
|
|
24
|
+
/** Minimal template summary for listing */
|
|
25
|
+
export interface TemplateSummary {
|
|
26
|
+
id: string;
|
|
27
|
+
name: string;
|
|
28
|
+
description: string;
|
|
29
|
+
category: string;
|
|
30
|
+
hierarchical: boolean;
|
|
31
|
+
roleCount: number;
|
|
32
|
+
version: string;
|
|
33
|
+
tags?: string[];
|
|
34
|
+
icon?: string;
|
|
35
|
+
/** Where this template was loaded from */
|
|
36
|
+
source: TemplateSource;
|
|
37
|
+
/** Minimum tier required to use this template */
|
|
38
|
+
requiredTier?: CloudTier;
|
|
39
|
+
/** First-run starter metadata (only on onboarding starters) */
|
|
40
|
+
onboarding?: TemplateOnboarding;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* TemplateService manages team templates.
|
|
44
|
+
* Loads templates from config/templates/ directory, provides
|
|
45
|
+
* listing/querying, and creates teams from templates.
|
|
46
|
+
*
|
|
47
|
+
* Singleton pattern matching other Crewly services.
|
|
48
|
+
*/
|
|
49
|
+
export declare class TemplateService {
|
|
50
|
+
private static instance;
|
|
51
|
+
/** Loaded templates indexed by ID */
|
|
52
|
+
private templates;
|
|
53
|
+
/** Templates directory path */
|
|
54
|
+
private templatesDir;
|
|
55
|
+
/** Whether templates have been loaded */
|
|
56
|
+
private loaded;
|
|
57
|
+
private constructor();
|
|
58
|
+
/**
|
|
59
|
+
* Get the singleton instance.
|
|
60
|
+
*
|
|
61
|
+
* @param templatesDir - Optional override for templates directory
|
|
62
|
+
* @returns The singleton instance
|
|
63
|
+
*/
|
|
64
|
+
static getInstance(templatesDir?: string): TemplateService;
|
|
65
|
+
/**
|
|
66
|
+
* Clear the singleton instance (for testing).
|
|
67
|
+
*/
|
|
68
|
+
static clearInstance(): void;
|
|
69
|
+
/**
|
|
70
|
+
* Load all templates from the templates directory.
|
|
71
|
+
* Scans for template.json files in subdirectories and
|
|
72
|
+
* legacy flat JSON files at the root level.
|
|
73
|
+
*
|
|
74
|
+
* @returns Number of templates loaded
|
|
75
|
+
*/
|
|
76
|
+
loadTemplates(): number;
|
|
77
|
+
/**
|
|
78
|
+
* List local templates as summaries.
|
|
79
|
+
*
|
|
80
|
+
* @returns Array of local template summaries
|
|
81
|
+
*/
|
|
82
|
+
listTemplates(): TemplateSummary[];
|
|
83
|
+
/**
|
|
84
|
+
* The first-run starter templates (those with `onboarding` metadata),
|
|
85
|
+
* ordered by `onboarding.order`.
|
|
86
|
+
*
|
|
87
|
+
* @returns Starter templates, first-shown first
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* ```ts
|
|
91
|
+
* const [recommended] = TemplateService.getInstance().listOnboardingStarters();
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
listOnboardingStarters(): TeamTemplate[];
|
|
95
|
+
/**
|
|
96
|
+
* Get a specific template by ID.
|
|
97
|
+
*
|
|
98
|
+
* @param id - Template ID
|
|
99
|
+
* @returns The template, or null if not found
|
|
100
|
+
*/
|
|
101
|
+
getTemplate(id: string): TeamTemplate | null;
|
|
102
|
+
/**
|
|
103
|
+
* Create a team from a template.
|
|
104
|
+
* Generates TeamMember objects with IDs, session names,
|
|
105
|
+
* and hierarchy fields based on the template's role definitions.
|
|
106
|
+
*
|
|
107
|
+
* @param templateId - ID of the template to use
|
|
108
|
+
* @param teamName - Name for the new team
|
|
109
|
+
* @param nameOverrides - Optional map of role to custom name
|
|
110
|
+
* @returns The created team result, or null if template not found
|
|
111
|
+
*/
|
|
112
|
+
createTeamFromTemplate(templateId: string, teamName: string, nameOverrides?: Record<string, string>, userTier?: CloudTier): CreateFromTemplateResult | null;
|
|
113
|
+
/**
|
|
114
|
+
* Copy norms files from a template to the team's norms directory.
|
|
115
|
+
*
|
|
116
|
+
* Copies config/templates/{templateId}/norms/*.md to ~/.crewly/teams/{teamId}/norms/.
|
|
117
|
+
* Also copies the norms config from template.json into the team's config.json.
|
|
118
|
+
*
|
|
119
|
+
* @param templateId - Source template ID
|
|
120
|
+
* @param teamId - Target team ID
|
|
121
|
+
*/
|
|
122
|
+
private copyTeamNorms;
|
|
123
|
+
/**
|
|
124
|
+
* Load the raw template.json for a template (including norms config).
|
|
125
|
+
*
|
|
126
|
+
* @param templateId - Template ID
|
|
127
|
+
* @returns Parsed template.json or null
|
|
128
|
+
*/
|
|
129
|
+
private loadTemplateJson;
|
|
130
|
+
/**
|
|
131
|
+
* Get the number of loaded templates.
|
|
132
|
+
*
|
|
133
|
+
* @returns Template count
|
|
134
|
+
*/
|
|
135
|
+
getTemplateCount(): number;
|
|
136
|
+
/**
|
|
137
|
+
* Load a new-format template.json file.
|
|
138
|
+
*
|
|
139
|
+
* @param filePath - Absolute path to the template.json file
|
|
140
|
+
* @param dirName - Directory name containing the template
|
|
141
|
+
*/
|
|
142
|
+
private loadTemplateFile;
|
|
143
|
+
/**
|
|
144
|
+
* Load a legacy flat JSON template (e.g., web-dev-team.json).
|
|
145
|
+
* Converts to TeamTemplate format with sensible defaults.
|
|
146
|
+
*
|
|
147
|
+
* @param filePath - Absolute path to the JSON file
|
|
148
|
+
* @param fileName - File name of the template
|
|
149
|
+
*/
|
|
150
|
+
private loadLegacyTemplate;
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=template.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/template/template.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,YAAY,EAAgB,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAEzG,OAAO,KAAK,EAAc,IAAI,EAAkB,MAAM,sBAAsB,CAAC;AAE7E,OAAO,EAAE,KAAK,SAAS,EAAmB,MAAM,oBAAoB,CAAC;AA8BrE,gDAAgD;AAChD,MAAM,WAAW,wBAAwB;IACvC,uBAAuB;IACvB,IAAI,EAAE,IAAI,CAAC;IACX,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,mCAAmC;AACnC,MAAM,MAAM,cAAc,GAAG,OAAO,CAAC;AAErC,2CAA2C;AAC3C,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,MAAM,EAAE,cAAc,CAAC;IACvB,iDAAiD;IACjD,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,+DAA+D;IAC/D,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC;AAMD;;;;;;GAMG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAgC;IAEvD,qCAAqC;IACrC,OAAO,CAAC,SAAS,CAAwC;IAEzD,+BAA+B;IAC/B,OAAO,CAAC,YAAY,CAAS;IAE7B,yCAAyC;IACzC,OAAO,CAAC,MAAM,CAAkB;IAEhC,OAAO;IAIP;;;;;OAKG;IACH,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,eAAe;IAO1D;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B;;;;;;OAMG;IACH,aAAa,IAAI,MAAM;IA8BvB;;;;OAIG;IACH,aAAa,IAAI,eAAe,EAAE;IAmBlC;;;;;;;;;;OAUG;IACH,sBAAsB,IAAI,YAAY,EAAE;IAQxC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAK5C;;;;;;;;;OASG;IACH,sBAAsB,CACpB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACtC,QAAQ,CAAC,EAAE,SAAS,GACnB,wBAAwB,GAAG,IAAI;IAyIlC;;;;;;;;OAQG;IACH,OAAO,CAAC,aAAa;IAiDrB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAUxB;;;;OAIG;IACH,gBAAgB,IAAI,MAAM;IAQ1B;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;CAyG3B"}
|