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.
Files changed (118) hide show
  1. package/config/roles/team-leader/tl-addon.md +7 -0
  2. package/config/skills/team-leader/propose-tier-change/SKILL.md +62 -0
  3. package/config/skills/team-leader/propose-tier-change/execute.sh +64 -0
  4. package/config/skills/team-leader/propose-tier-change/execute.test.sh +75 -0
  5. package/dist/backend/backend/src/constants.d.ts +46 -0
  6. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  7. package/dist/backend/backend/src/constants.js +53 -0
  8. package/dist/backend/backend/src/constants.js.map +1 -1
  9. package/dist/backend/backend/src/controllers/request-types.d.ts +2 -0
  10. package/dist/backend/backend/src/controllers/request-types.d.ts.map +1 -1
  11. package/dist/backend/backend/src/controllers/team/team-model-tiers.controller.d.ts +41 -0
  12. package/dist/backend/backend/src/controllers/team/team-model-tiers.controller.d.ts.map +1 -0
  13. package/dist/backend/backend/src/controllers/team/team-model-tiers.controller.js +112 -0
  14. package/dist/backend/backend/src/controllers/team/team-model-tiers.controller.js.map +1 -0
  15. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  16. package/dist/backend/backend/src/controllers/team/team.controller.js +12 -0
  17. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  18. package/dist/backend/backend/src/controllers/team/team.routes.d.ts.map +1 -1
  19. package/dist/backend/backend/src/controllers/team/team.routes.js +6 -0
  20. package/dist/backend/backend/src/controllers/team/team.routes.js.map +1 -1
  21. package/dist/backend/backend/src/index.d.ts.map +1 -1
  22. package/dist/backend/backend/src/index.js +5 -0
  23. package/dist/backend/backend/src/index.js.map +1 -1
  24. package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
  25. package/dist/backend/backend/src/services/ai/prompt-builder.service.js +16 -0
  26. package/dist/backend/backend/src/services/ai/prompt-builder.service.js.map +1 -1
  27. package/dist/backend/backend/src/services/ai/prompt-modules/index.d.ts +1 -0
  28. package/dist/backend/backend/src/services/ai/prompt-modules/index.d.ts.map +1 -1
  29. package/dist/backend/backend/src/services/ai/prompt-modules/index.js +1 -0
  30. package/dist/backend/backend/src/services/ai/prompt-modules/index.js.map +1 -1
  31. package/dist/backend/backend/src/services/ai/prompt-modules/model-tiers.module.d.ts +34 -0
  32. package/dist/backend/backend/src/services/ai/prompt-modules/model-tiers.module.d.ts.map +1 -0
  33. package/dist/backend/backend/src/services/ai/prompt-modules/model-tiers.module.js +54 -0
  34. package/dist/backend/backend/src/services/ai/prompt-modules/model-tiers.module.js.map +1 -0
  35. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts.map +1 -1
  36. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.js +2 -0
  37. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-assembly.service.js.map +1 -1
  38. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +13 -0
  39. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +1 -1
  40. package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +1 -1
  41. package/dist/backend/backend/src/services/decisions/decision.service.d.ts +2 -0
  42. package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  43. package/dist/backend/backend/src/services/decisions/decision.service.js +1 -0
  44. package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
  45. package/dist/backend/backend/src/services/model-tiers/model-tier.service.d.ts +251 -0
  46. package/dist/backend/backend/src/services/model-tiers/model-tier.service.d.ts.map +1 -0
  47. package/dist/backend/backend/src/services/model-tiers/model-tier.service.js +701 -0
  48. package/dist/backend/backend/src/services/model-tiers/model-tier.service.js.map +1 -0
  49. package/dist/backend/backend/src/services/model-tiers/model-tier.store.d.ts +82 -0
  50. package/dist/backend/backend/src/services/model-tiers/model-tier.store.d.ts.map +1 -0
  51. package/dist/backend/backend/src/services/model-tiers/model-tier.store.js +80 -0
  52. package/dist/backend/backend/src/services/model-tiers/model-tier.store.js.map +1 -0
  53. package/dist/backend/backend/src/services/model-tiers/model-tier.wiring.d.ts +28 -0
  54. package/dist/backend/backend/src/services/model-tiers/model-tier.wiring.d.ts.map +1 -0
  55. package/dist/backend/backend/src/services/model-tiers/model-tier.wiring.js +56 -0
  56. package/dist/backend/backend/src/services/model-tiers/model-tier.wiring.js.map +1 -0
  57. package/dist/backend/backend/src/services/model-tiers/tier-quality.d.ts +102 -0
  58. package/dist/backend/backend/src/services/model-tiers/tier-quality.d.ts.map +1 -0
  59. package/dist/backend/backend/src/services/model-tiers/tier-quality.js +116 -0
  60. package/dist/backend/backend/src/services/model-tiers/tier-quality.js.map +1 -0
  61. package/dist/backend/backend/src/services/model-tiers/tier-usage-report.d.ts +86 -0
  62. package/dist/backend/backend/src/services/model-tiers/tier-usage-report.d.ts.map +1 -0
  63. package/dist/backend/backend/src/services/model-tiers/tier-usage-report.js +148 -0
  64. package/dist/backend/backend/src/services/model-tiers/tier-usage-report.js.map +1 -0
  65. package/dist/backend/backend/src/services/skill/skill-permission.service.d.ts.map +1 -1
  66. package/dist/backend/backend/src/services/skill/skill-permission.service.js +1 -0
  67. package/dist/backend/backend/src/services/skill/skill-permission.service.js.map +1 -1
  68. package/dist/backend/backend/src/types/decision.types.d.ts +41 -1
  69. package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
  70. package/dist/backend/backend/src/types/index.d.ts +20 -0
  71. package/dist/backend/backend/src/types/index.d.ts.map +1 -1
  72. package/dist/backend/backend/src/types/index.js.map +1 -1
  73. package/dist/backend/backend/src/utils/member-default-model.utils.d.ts +24 -8
  74. package/dist/backend/backend/src/utils/member-default-model.utils.d.ts.map +1 -1
  75. package/dist/backend/backend/src/utils/member-default-model.utils.js +33 -7
  76. package/dist/backend/backend/src/utils/member-default-model.utils.js.map +1 -1
  77. package/dist/backend/backend/src/utils/model-tier.utils.d.ts +68 -0
  78. package/dist/backend/backend/src/utils/model-tier.utils.d.ts.map +1 -0
  79. package/dist/backend/backend/src/utils/model-tier.utils.js +111 -0
  80. package/dist/backend/backend/src/utils/model-tier.utils.js.map +1 -0
  81. package/dist/backend/build-info.json +2 -2
  82. package/dist/cli/backend/src/constants.d.ts +46 -0
  83. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  84. package/dist/cli/backend/src/constants.js +53 -0
  85. package/dist/cli/backend/src/constants.js.map +1 -1
  86. package/dist/cli/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
  87. package/dist/cli/backend/src/services/ai/prompt-builder.service.js +16 -0
  88. package/dist/cli/backend/src/services/ai/prompt-builder.service.js.map +1 -1
  89. package/dist/cli/backend/src/services/ai/prompt-modules/model-tiers.module.d.ts +34 -0
  90. package/dist/cli/backend/src/services/ai/prompt-modules/model-tiers.module.d.ts.map +1 -0
  91. package/dist/cli/backend/src/services/ai/prompt-modules/model-tiers.module.js +54 -0
  92. package/dist/cli/backend/src/services/ai/prompt-modules/model-tiers.module.js.map +1 -0
  93. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.d.ts.map +1 -1
  94. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.js +2 -0
  95. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-assembly.service.js.map +1 -1
  96. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +13 -0
  97. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +1 -1
  98. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +1 -1
  99. package/dist/cli/backend/src/services/decisions/decision.service.d.ts +2 -0
  100. package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  101. package/dist/cli/backend/src/services/decisions/decision.service.js +1 -0
  102. package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
  103. package/dist/cli/backend/src/types/decision.types.d.ts +41 -1
  104. package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -1
  105. package/dist/cli/backend/src/types/index.d.ts +20 -0
  106. package/dist/cli/backend/src/types/index.d.ts.map +1 -1
  107. package/dist/cli/backend/src/types/index.js.map +1 -1
  108. package/dist/cli/backend/src/utils/member-default-model.utils.d.ts +24 -8
  109. package/dist/cli/backend/src/utils/member-default-model.utils.d.ts.map +1 -1
  110. package/dist/cli/backend/src/utils/member-default-model.utils.js +33 -7
  111. package/dist/cli/backend/src/utils/member-default-model.utils.js.map +1 -1
  112. package/dist/cli/backend/src/utils/model-tier.utils.d.ts +68 -0
  113. package/dist/cli/backend/src/utils/model-tier.utils.d.ts.map +1 -0
  114. package/dist/cli/backend/src/utils/model-tier.utils.js +111 -0
  115. package/dist/cli/backend/src/utils/model-tier.utils.js.map +1 -0
  116. package/frontend/dist/assets/{index-7e5ebf78.js → index-368419df.js} +266 -266
  117. package/frontend/dist/index.html +1 -1
  118. 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":"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"}
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);