crewly 1.20.274 → 1.20.276
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/roles/team-leader/tl-addon.md +7 -0
- package/config/skills/team-leader/propose-tier-change/SKILL.md +62 -0
- package/config/skills/team-leader/propose-tier-change/execute.sh +64 -0
- package/config/skills/team-leader/propose-tier-change/execute.test.sh +75 -0
- package/dist/backend/backend/src/constants.d.ts +46 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +53 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/request-types.d.ts +2 -0
- package/dist/backend/backend/src/controllers/request-types.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team-model-tiers.controller.d.ts +41 -0
- package/dist/backend/backend/src/controllers/team/team-model-tiers.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/team/team-model-tiers.controller.js +112 -0
- package/dist/backend/backend/src/controllers/team/team-model-tiers.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.js +12 -0
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.routes.js +6 -0
- package/dist/backend/backend/src/controllers/team/team.routes.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +5 -0
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-builder.service.js +16 -0
- package/dist/backend/backend/src/services/ai/prompt-builder.service.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/index.d.ts +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/index.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/index.js +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/index.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/model-tiers.module.d.ts +34 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/model-tiers.module.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/model-tiers.module.js +54 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/model-tiers.module.js.map +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.js +2 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +13 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts +2 -0
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.service.js +1 -0
- package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/backend/backend/src/services/model-tiers/model-tier.service.d.ts +251 -0
- package/dist/backend/backend/src/services/model-tiers/model-tier.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/model-tiers/model-tier.service.js +701 -0
- package/dist/backend/backend/src/services/model-tiers/model-tier.service.js.map +1 -0
- package/dist/backend/backend/src/services/model-tiers/model-tier.store.d.ts +82 -0
- package/dist/backend/backend/src/services/model-tiers/model-tier.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/model-tiers/model-tier.store.js +80 -0
- package/dist/backend/backend/src/services/model-tiers/model-tier.store.js.map +1 -0
- package/dist/backend/backend/src/services/model-tiers/model-tier.wiring.d.ts +28 -0
- package/dist/backend/backend/src/services/model-tiers/model-tier.wiring.d.ts.map +1 -0
- package/dist/backend/backend/src/services/model-tiers/model-tier.wiring.js +56 -0
- package/dist/backend/backend/src/services/model-tiers/model-tier.wiring.js.map +1 -0
- package/dist/backend/backend/src/services/model-tiers/tier-quality.d.ts +102 -0
- package/dist/backend/backend/src/services/model-tiers/tier-quality.d.ts.map +1 -0
- package/dist/backend/backend/src/services/model-tiers/tier-quality.js +116 -0
- package/dist/backend/backend/src/services/model-tiers/tier-quality.js.map +1 -0
- package/dist/backend/backend/src/services/model-tiers/tier-usage-report.d.ts +86 -0
- package/dist/backend/backend/src/services/model-tiers/tier-usage-report.d.ts.map +1 -0
- package/dist/backend/backend/src/services/model-tiers/tier-usage-report.js +148 -0
- package/dist/backend/backend/src/services/model-tiers/tier-usage-report.js.map +1 -0
- package/dist/backend/backend/src/services/skill/skill-permission.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/skill/skill-permission.service.js +1 -0
- package/dist/backend/backend/src/services/skill/skill-permission.service.js.map +1 -1
- package/dist/backend/backend/src/types/decision.types.d.ts +41 -1
- package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/index.d.ts +20 -0
- package/dist/backend/backend/src/types/index.d.ts.map +1 -1
- package/dist/backend/backend/src/types/index.js.map +1 -1
- package/dist/backend/backend/src/utils/member-default-model.utils.d.ts +24 -8
- package/dist/backend/backend/src/utils/member-default-model.utils.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/member-default-model.utils.js +33 -7
- package/dist/backend/backend/src/utils/member-default-model.utils.js.map +1 -1
- package/dist/backend/backend/src/utils/model-tier.utils.d.ts +68 -0
- package/dist/backend/backend/src/utils/model-tier.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/model-tier.utils.js +111 -0
- package/dist/backend/backend/src/utils/model-tier.utils.js.map +1 -0
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +46 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +53 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-builder.service.js +16 -0
- package/dist/cli/backend/src/services/ai/prompt-builder.service.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/model-tiers.module.d.ts +34 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/model-tiers.module.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/model-tiers.module.js +54 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/model-tiers.module.js.map +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.js +2 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +13 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision.service.d.ts +2 -0
- package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision.service.js +1 -0
- package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/cli/backend/src/types/decision.types.d.ts +41 -1
- package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/index.d.ts +20 -0
- package/dist/cli/backend/src/types/index.d.ts.map +1 -1
- package/dist/cli/backend/src/types/index.js.map +1 -1
- package/dist/cli/backend/src/utils/member-default-model.utils.d.ts +24 -8
- package/dist/cli/backend/src/utils/member-default-model.utils.d.ts.map +1 -1
- package/dist/cli/backend/src/utils/member-default-model.utils.js +33 -7
- package/dist/cli/backend/src/utils/member-default-model.utils.js.map +1 -1
- package/dist/cli/backend/src/utils/model-tier.utils.d.ts +68 -0
- package/dist/cli/backend/src/utils/model-tier.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/model-tier.utils.js +111 -0
- package/dist/cli/backend/src/utils/model-tier.utils.js.map +1 -0
- package/frontend/dist/assets/{index-7e5ebf78.js → index-368419df.js} +266 -266
- package/frontend/dist/index.html +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model tiers and "Optimize usage" (crewly#1173, specs/2026-10-08-model-tiers.md):
|
|
3
|
+
*
|
|
4
|
+
* - `GET /api/teams/:id/model-tiers` — toggle, tier maps, members' tiers, review state.
|
|
5
|
+
* - `PUT /api/teams/:id/model-tiers` — owner: `{ optimizeUsage?, tierModels?, memberTiers? }`.
|
|
6
|
+
* - `POST /api/teams/:id/model-tiers/review` — owner or the team's lead: start a review now.
|
|
7
|
+
* - `POST /api/teams/model-tiers/proposals` — the lead's `propose-tier-change` skill
|
|
8
|
+
* (`{ member, tier, reason }` | `{ routing }` | `{ submit: true }` | `{ clear: true }`).
|
|
9
|
+
*
|
|
10
|
+
* @module controllers/team/team-model-tiers.controller
|
|
11
|
+
*/
|
|
12
|
+
import type { Request, Response } from 'express';
|
|
13
|
+
/**
|
|
14
|
+
* GET /api/teams/:id/model-tiers
|
|
15
|
+
*
|
|
16
|
+
* @param req - `:id` = team id
|
|
17
|
+
* @param res - 200 `{ success, data: TierSettingsView }`
|
|
18
|
+
*/
|
|
19
|
+
export declare function getTeamModelTiers(req: Request, res: Response): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* PUT /api/teams/:id/model-tiers — owner only.
|
|
22
|
+
*
|
|
23
|
+
* @param req - Body `{ optimizeUsage?, tierModels?, memberTiers? }`
|
|
24
|
+
* @param res - 200 `{ success, data }`; 400 invalid; 401/403 not the owner
|
|
25
|
+
*/
|
|
26
|
+
export declare function updateTeamModelTiers(req: Request, res: Response): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* POST /api/teams/:id/model-tiers/review — the owner, or the team's own lead.
|
|
29
|
+
*
|
|
30
|
+
* @param req - `:id` = team id
|
|
31
|
+
* @param res - 200 `{ success, data: { reviewId, lead, delivered } }`; 403 another agent; 409 no lead / card open
|
|
32
|
+
*/
|
|
33
|
+
export declare function startTeamModelTierReview(req: Request, res: Response): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* POST /api/teams/model-tiers/proposals — the lead's skill.
|
|
36
|
+
*
|
|
37
|
+
* @param req - Caller = X-Agent-Session; body = one proposal action
|
|
38
|
+
* @param res - 200 `{ success, data }`; 400 / 403 / 409 with the reason
|
|
39
|
+
*/
|
|
40
|
+
export declare function proposeTierChange(req: Request, res: Response): Promise<void>;
|
|
41
|
+
//# sourceMappingURL=team-model-tiers.controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-model-tiers.controller.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/team/team-model-tiers.controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAsBjD;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAQlF;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAUrF;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBzF;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CASlF"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model tiers and "Optimize usage" (crewly#1173, specs/2026-10-08-model-tiers.md):
|
|
3
|
+
*
|
|
4
|
+
* - `GET /api/teams/:id/model-tiers` — toggle, tier maps, members' tiers, review state.
|
|
5
|
+
* - `PUT /api/teams/:id/model-tiers` — owner: `{ optimizeUsage?, tierModels?, memberTiers? }`.
|
|
6
|
+
* - `POST /api/teams/:id/model-tiers/review` — owner or the team's lead: start a review now.
|
|
7
|
+
* - `POST /api/teams/model-tiers/proposals` — the lead's `propose-tier-change` skill
|
|
8
|
+
* (`{ member, tier, reason }` | `{ routing }` | `{ submit: true }` | `{ clear: true }`).
|
|
9
|
+
*
|
|
10
|
+
* @module controllers/team/team-model-tiers.controller
|
|
11
|
+
*/
|
|
12
|
+
import { rejectNonOwner } from '../../middleware/caller-identity.middleware.js';
|
|
13
|
+
import { getModelTierService, ModelTierError } from '../../services/model-tiers/model-tier.service.js';
|
|
14
|
+
import { isOwnerCaller, readAgentSessionHeader } from '../../utils/agent-caller.utils.js';
|
|
15
|
+
import { isTeamLead } from '../../utils/team.utils.js';
|
|
16
|
+
import { StorageService } from '../../services/core/storage.service.js';
|
|
17
|
+
/** The running service, or a 503. */
|
|
18
|
+
function serviceOr503(res) {
|
|
19
|
+
const s = getModelTierService();
|
|
20
|
+
if (!s)
|
|
21
|
+
res.status(503).json({ success: false, error: 'Model tiers are not running yet (decision cards start a few seconds after boot)' });
|
|
22
|
+
return s;
|
|
23
|
+
}
|
|
24
|
+
function fail(res, err) {
|
|
25
|
+
if (err instanceof ModelTierError) {
|
|
26
|
+
res.status(err.status).json({ success: false, error: err.message });
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
res.status(500).json({ success: false, error: err instanceof Error ? err.message : String(err) });
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* GET /api/teams/:id/model-tiers
|
|
33
|
+
*
|
|
34
|
+
* @param req - `:id` = team id
|
|
35
|
+
* @param res - 200 `{ success, data: TierSettingsView }`
|
|
36
|
+
*/
|
|
37
|
+
export async function getTeamModelTiers(req, res) {
|
|
38
|
+
const s = serviceOr503(res);
|
|
39
|
+
if (!s)
|
|
40
|
+
return;
|
|
41
|
+
try {
|
|
42
|
+
res.json({ success: true, data: await s.settings(req.params.id) });
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
fail(res, err);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* PUT /api/teams/:id/model-tiers — owner only.
|
|
50
|
+
*
|
|
51
|
+
* @param req - Body `{ optimizeUsage?, tierModels?, memberTiers? }`
|
|
52
|
+
* @param res - 200 `{ success, data }`; 400 invalid; 401/403 not the owner
|
|
53
|
+
*/
|
|
54
|
+
export async function updateTeamModelTiers(req, res) {
|
|
55
|
+
if (rejectNonOwner(req, res, { success: false, error: 'Only the owner changes model tiers and "Optimize usage". A team lead proposes changes with propose-tier-change.' }))
|
|
56
|
+
return;
|
|
57
|
+
const s = serviceOr503(res);
|
|
58
|
+
if (!s)
|
|
59
|
+
return;
|
|
60
|
+
try {
|
|
61
|
+
const body = (req.body ?? {});
|
|
62
|
+
res.json({ success: true, data: await s.updateSettings(req.params.id, { optimizeUsage: body.optimizeUsage, tierModels: body.tierModels, memberTiers: body.memberTiers }) });
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
fail(res, err);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* POST /api/teams/:id/model-tiers/review — the owner, or the team's own lead.
|
|
70
|
+
*
|
|
71
|
+
* @param req - `:id` = team id
|
|
72
|
+
* @param res - 200 `{ success, data: { reviewId, lead, delivered } }`; 403 another agent; 409 no lead / card open
|
|
73
|
+
*/
|
|
74
|
+
export async function startTeamModelTierReview(req, res) {
|
|
75
|
+
const s = serviceOr503(res);
|
|
76
|
+
if (!s)
|
|
77
|
+
return;
|
|
78
|
+
try {
|
|
79
|
+
if (!isOwnerCaller(req)) {
|
|
80
|
+
const session = readAgentSessionHeader(req);
|
|
81
|
+
const team = (await StorageService.getInstance().getTeams()).find((t) => t.id === req.params.id);
|
|
82
|
+
const me = team?.members.find((m) => !!session && (m.sessionName === session || m.agentId === session));
|
|
83
|
+
if (!team || !me || !isTeamLead(team, me)) {
|
|
84
|
+
res.status(403).json({ success: false, error: "Only the owner or this team's lead starts a tier review" });
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
res.json({ success: true, data: await s.startReview(req.params.id, 'on_demand') });
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
fail(res, err);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* POST /api/teams/model-tiers/proposals — the lead's skill.
|
|
96
|
+
*
|
|
97
|
+
* @param req - Caller = X-Agent-Session; body = one proposal action
|
|
98
|
+
* @param res - 200 `{ success, data }`; 400 / 403 / 409 with the reason
|
|
99
|
+
*/
|
|
100
|
+
export async function proposeTierChange(req, res) {
|
|
101
|
+
const s = serviceOr503(res);
|
|
102
|
+
if (!s)
|
|
103
|
+
return;
|
|
104
|
+
try {
|
|
105
|
+
const body = (req.body ?? {});
|
|
106
|
+
res.json({ success: true, data: await s.propose(readAgentSessionHeader(req), body) });
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
fail(res, err);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=team-model-tiers.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-model-tiers.controller.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/team/team-model-tiers.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"team.controller.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/team/team.controller.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAiB9C,OAAO,EAAE,IAAI,EAAE,UAAU,EAAiC,MAAM,sBAAsB,CAAC;AA2BvF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+CAA+C,CAAC;
|
|
1
|
+
{"version":3,"file":"team.controller.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/team/team.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,7 @@ import { getChatV2Service } from '../../services/chat-v2/chat-v2.singleton.js';
|
|
|
22
22
|
import { OAuthReloginMonitorService } from '../../services/agent/oauth-relogin-monitor.service.js';
|
|
23
23
|
import { normalizeMemberSkills } from '../../services/ai/prompt-builder.service.js';
|
|
24
24
|
import { isSafeModelId, isSafeReasoningEffort } from '../../utils/runtime-model-flags.utils.js';
|
|
25
|
+
import { isModelTier } from '../../utils/model-tier.utils.js';
|
|
25
26
|
import { evaluateColdLaunch, isDormantTeam, isHarnessParkedResume, isPreAuthorizedSchedule, COMMITMENT_APPROVAL_LOOKBACK_MS, } from '../../services/orchestrator/commitment-approval-guard.js';
|
|
26
27
|
import { isOwnerDashboardRequest, readAgentSessionHeader } from '../../utils/agent-caller.utils.js';
|
|
27
28
|
import { getCallerIdentity, isOwnerCaller, rejectNonOwner, sendOwnerAuthRequired } from '../../middleware/caller-identity.middleware.js';
|
|
@@ -1711,6 +1712,15 @@ export async function updateTeamMember(req, res) {
|
|
|
1711
1712
|
return;
|
|
1712
1713
|
}
|
|
1713
1714
|
}
|
|
1715
|
+
// Model tier (crewly#1173): the owner's call; a lead proposes with propose-tier-change.
|
|
1716
|
+
if ('tier' in updates) {
|
|
1717
|
+
if (rejectNonOwner(req, res, { success: false, error: 'Only the owner sets a member\'s tier. A team lead proposes it with propose-tier-change.' }))
|
|
1718
|
+
return;
|
|
1719
|
+
if (updates.tier && !isModelTier(updates.tier)) {
|
|
1720
|
+
res.status(400).json({ success: false, error: 'tier must be strong, mid or weak (or empty to clear)' });
|
|
1721
|
+
return;
|
|
1722
|
+
}
|
|
1723
|
+
}
|
|
1714
1724
|
// An empty string clears the per-agent model / effort override.
|
|
1715
1725
|
const modelUpdates = pickModelFields(updates);
|
|
1716
1726
|
const updatedMember = { ...team.members[memberIndex], ...updates, ...modelUpdates, updatedAt: new Date().toISOString() };
|
|
@@ -1720,6 +1730,8 @@ export async function updateTeamMember(req, res) {
|
|
|
1720
1730
|
delete updatedMember.reasoningEffort;
|
|
1721
1731
|
if ('dedicatedTo' in updates && !updates.dedicatedTo)
|
|
1722
1732
|
delete updatedMember.dedicatedTo;
|
|
1733
|
+
if ('tier' in updates && !updates.tier)
|
|
1734
|
+
delete updatedMember.tier;
|
|
1723
1735
|
team.members[memberIndex] = updatedMember;
|
|
1724
1736
|
team.updatedAt = new Date().toISOString();
|
|
1725
1737
|
await this.storageService.saveTeam(team);
|