crewly 1.5.22 → 1.6.0
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/orchestrator/prompt.md +182 -25
- package/config/skills/agent/core/cancel-followup/SKILL.md +38 -0
- package/config/skills/agent/core/cancel-followup/execute.sh +111 -0
- package/config/skills/agent/core/cancel-followup/execute.test.sh +42 -0
- package/config/skills/agent/core/list-my-followups/SKILL.md +36 -0
- package/config/skills/agent/core/list-my-followups/execute.sh +93 -0
- package/config/skills/agent/core/list-my-followups/execute.test.sh +41 -0
- package/config/skills/agent/core/schedule-followup/SKILL.md +53 -0
- package/config/skills/agent/core/schedule-followup/execute.sh +195 -0
- package/config/skills/agent/core/schedule-followup/execute.test.sh +48 -0
- package/config/skills/agent/core/watch-for-event/SKILL.md +60 -0
- package/config/skills/agent/core/watch-for-event/execute.sh +177 -0
- package/config/skills/agent/core/watch-for-event/execute.test.sh +43 -0
- package/config/skills/orchestrator/credential-manager/SKILL.md +218 -0
- package/config/skills/orchestrator/credential-manager/execute.sh +166 -0
- package/dist/backend/backend/src/controllers/credentials/credentials.controller.d.ts +80 -0
- package/dist/backend/backend/src/controllers/credentials/credentials.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/credentials/credentials.controller.js +365 -0
- package/dist/backend/backend/src/controllers/credentials/credentials.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/credentials/credentials.routes.d.ts +26 -0
- package/dist/backend/backend/src/controllers/credentials/credentials.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/credentials/credentials.routes.js +40 -0
- package/dist/backend/backend/src/controllers/credentials/credentials.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +23 -14
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
- package/dist/backend/backend/src/scripts/backfill-mission-priority.d.ts +3 -1
- package/dist/backend/backend/src/scripts/backfill-mission-priority.d.ts.map +1 -1
- package/dist/backend/backend/src/scripts/backfill-mission-priority.js +16 -4
- package/dist/backend/backend/src/scripts/backfill-mission-priority.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-proxy.service.js +1 -1
- package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -1
- package/dist/backend/backend/src/services/credential/credential-store.service.d.ts +161 -0
- package/dist/backend/backend/src/services/credential/credential-store.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/credential/credential-store.service.js +298 -0
- package/dist/backend/backend/src/services/credential/credential-store.service.js.map +1 -0
- package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts +117 -0
- package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts.map +1 -0
- package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js +293 -0
- package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js.map +1 -0
- package/dist/backend/backend/src/services/project/task.service.d.ts +18 -2
- package/dist/backend/backend/src/services/project/task.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project/task.service.js +69 -53
- package/dist/backend/backend/src/services/project/task.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/contract-matcher.d.ts +20 -0
- package/dist/backend/backend/src/services/v3/contract-matcher.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/contract-matcher.js +33 -0
- package/dist/backend/backend/src/services/v3/contract-matcher.js.map +1 -0
- package/dist/backend/backend/src/services/v3/escalation.service.d.ts +20 -1
- package/dist/backend/backend/src/services/v3/escalation.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/escalation.service.js +97 -28
- package/dist/backend/backend/src/services/v3/escalation.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/service-contract-gate.service.d.ts +6 -4
- package/dist/backend/backend/src/services/v3/service-contract-gate.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/service-contract-gate.service.js +18 -28
- package/dist/backend/backend/src/services/v3/service-contract-gate.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/team-trigger-reconciler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/team-trigger-reconciler.service.js +14 -9
- package/dist/backend/backend/src/services/v3/team-trigger-reconciler.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts +34 -1
- package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/trigger-engine.service.js +115 -5
- package/dist/backend/backend/src/services/v3/trigger-engine.service.js.map +1 -1
- package/dist/backend/backend/src/types/credential.types.d.ts +185 -0
- package/dist/backend/backend/src/types/credential.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/credential.types.js +76 -0
- package/dist/backend/backend/src/types/credential.types.js.map +1 -0
- package/dist/backend/backend/src/utils/encryption.utils.d.ts +57 -0
- package/dist/backend/backend/src/utils/encryption.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/encryption.utils.js +162 -0
- package/dist/backend/backend/src/utils/encryption.utils.js.map +1 -0
- package/dist/cli/backend/src/services/credential/credential-store.service.d.ts +161 -0
- package/dist/cli/backend/src/services/credential/credential-store.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/credential/credential-store.service.js +298 -0
- package/dist/cli/backend/src/services/credential/credential-store.service.js.map +1 -0
- package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts +117 -0
- package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts.map +1 -0
- package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js +293 -0
- package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js.map +1 -0
- package/dist/cli/backend/src/services/settings/settings.service.d.ts +168 -0
- package/dist/cli/backend/src/services/settings/settings.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/settings/settings.service.js +312 -0
- package/dist/cli/backend/src/services/settings/settings.service.js.map +1 -0
- package/dist/cli/backend/src/services/skill/skill-executor.service.d.ts +159 -0
- package/dist/cli/backend/src/services/skill/skill-executor.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/skill/skill-executor.service.js +626 -0
- package/dist/cli/backend/src/services/skill/skill-executor.service.js.map +1 -0
- package/dist/cli/backend/src/services/skill/skill.service.d.ts +273 -0
- package/dist/cli/backend/src/services/skill/skill.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/skill/skill.service.js +655 -0
- package/dist/cli/backend/src/services/skill/skill.service.js.map +1 -0
- package/dist/cli/backend/src/types/credential.types.d.ts +185 -0
- package/dist/cli/backend/src/types/credential.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/credential.types.js +76 -0
- package/dist/cli/backend/src/types/credential.types.js.map +1 -0
- package/dist/cli/backend/src/utils/encryption.utils.d.ts +57 -0
- package/dist/cli/backend/src/utils/encryption.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/encryption.utils.js +162 -0
- package/dist/cli/backend/src/utils/encryption.utils.js.map +1 -0
- package/dist/cli/backend/src/utils/skill-md-parser.d.ts +38 -0
- package/dist/cli/backend/src/utils/skill-md-parser.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/skill-md-parser.js +47 -0
- package/dist/cli/backend/src/utils/skill-md-parser.js.map +1 -0
- package/frontend/dist/assets/{index-dc92ab64.css → index-6aaa0630.css} +1 -1
- package/frontend/dist/assets/{index-76d76633.js → index-9e6d97d1.js} +334 -328
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/config/experts/empathetic-resolver/expert.json +0 -11
- package/config/experts/empathetic-resolver.md +0 -32
- package/config/experts/pragmatic-architect/expert.json +0 -11
- package/config/experts/pragmatic-architect.md +0 -32
- package/config/experts/viral-alchemist/expert.json +0 -11
- package/config/experts/viral-alchemist.md +0 -32
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/project/task.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"task.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/project/task.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contract-rule matching predicate shared by the service contract gate and
|
|
3
|
+
* any caller that wants to pre-filter requests against a team's accepts /
|
|
4
|
+
* avoids list.
|
|
5
|
+
*
|
|
6
|
+
* Keeping the predicate in one module guarantees gate decisions and skill-side
|
|
7
|
+
* filtering can't drift — both paths call the same `matchRule`.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Case-insensitive substring match. Accepts either direction — a rule
|
|
11
|
+
* matches if either string contains the other. This tolerates both tightly
|
|
12
|
+
* scoped rules (`"bugfix"`) and verbose request phrasing (`"urgent frontend
|
|
13
|
+
* bugfix in checkout"`).
|
|
14
|
+
*
|
|
15
|
+
* @param requestType - The incoming request phrase to classify.
|
|
16
|
+
* @param rules - The team's accepts/avoids list.
|
|
17
|
+
* @returns The first rule that matched, or `null` when no rule applies.
|
|
18
|
+
*/
|
|
19
|
+
export declare function matchRule(requestType: string, rules: readonly string[]): string | null;
|
|
20
|
+
//# sourceMappingURL=contract-matcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract-matcher.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/contract-matcher.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CACvB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,SAAS,MAAM,EAAE,GACvB,MAAM,GAAG,IAAI,CAWf"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contract-rule matching predicate shared by the service contract gate and
|
|
3
|
+
* any caller that wants to pre-filter requests against a team's accepts /
|
|
4
|
+
* avoids list.
|
|
5
|
+
*
|
|
6
|
+
* Keeping the predicate in one module guarantees gate decisions and skill-side
|
|
7
|
+
* filtering can't drift — both paths call the same `matchRule`.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Case-insensitive substring match. Accepts either direction — a rule
|
|
11
|
+
* matches if either string contains the other. This tolerates both tightly
|
|
12
|
+
* scoped rules (`"bugfix"`) and verbose request phrasing (`"urgent frontend
|
|
13
|
+
* bugfix in checkout"`).
|
|
14
|
+
*
|
|
15
|
+
* @param requestType - The incoming request phrase to classify.
|
|
16
|
+
* @param rules - The team's accepts/avoids list.
|
|
17
|
+
* @returns The first rule that matched, or `null` when no rule applies.
|
|
18
|
+
*/
|
|
19
|
+
export function matchRule(requestType, rules) {
|
|
20
|
+
const needle = requestType.trim().toLowerCase();
|
|
21
|
+
if (!needle)
|
|
22
|
+
return null;
|
|
23
|
+
for (const rule of rules) {
|
|
24
|
+
const hay = rule.trim().toLowerCase();
|
|
25
|
+
if (!hay)
|
|
26
|
+
continue;
|
|
27
|
+
if (needle.includes(hay) || hay.includes(needle)) {
|
|
28
|
+
return rule;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=contract-matcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract-matcher.js","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/contract-matcher.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS,CACvB,WAAmB,EACnB,KAAwB;IAExB,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAChD,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACtC,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACjD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
* @module services/v3/escalation.service
|
|
19
19
|
*/
|
|
20
20
|
import { PolicyEnforcementService, type EscalationResult } from '../policy/policy-enforcement.service.js';
|
|
21
|
+
import type { WorkItem } from '../../types/v2/work-item.types.js';
|
|
21
22
|
import type { Mission, EscalationContext, EscalationRule } from '../../types/v2/index.js';
|
|
22
23
|
/**
|
|
23
24
|
* Result of a single Mission's escalation evaluation.
|
|
@@ -72,6 +73,15 @@ export declare class EscalationService {
|
|
|
72
73
|
private actionHandler;
|
|
73
74
|
private triggerId;
|
|
74
75
|
private started;
|
|
76
|
+
/**
|
|
77
|
+
* The wrapper function this service installed on the TriggerEngine via
|
|
78
|
+
* `setActionHandler`. Kept so we can detect "was I already installed?"
|
|
79
|
+
* on re-entry and avoid building a growing delegation chain. Each
|
|
80
|
+
* restart that skipped `stop()` (crash, test teardown gaps) would
|
|
81
|
+
* otherwise wrap the previous wrapper as its "originalHandler",
|
|
82
|
+
* stacking closures forever.
|
|
83
|
+
*/
|
|
84
|
+
private installedHandler;
|
|
75
85
|
/**
|
|
76
86
|
* Creates a new EscalationService.
|
|
77
87
|
*
|
|
@@ -108,6 +118,12 @@ export declare class EscalationService {
|
|
|
108
118
|
* @returns Summary of the evaluation cycle
|
|
109
119
|
*/
|
|
110
120
|
evaluate(): Promise<EscalationCycleSummary>;
|
|
121
|
+
/**
|
|
122
|
+
* Loads the task pool once per evaluation cycle. Extracted so `evaluate`
|
|
123
|
+
* can bucket items by missionId before calling
|
|
124
|
+
* {@link buildEscalationContext} for each mission.
|
|
125
|
+
*/
|
|
126
|
+
private loadMissionWorkItems;
|
|
111
127
|
/**
|
|
112
128
|
* Builds an EscalationContext for a Mission by aggregating runtime data.
|
|
113
129
|
*
|
|
@@ -117,9 +133,12 @@ export declare class EscalationService {
|
|
|
117
133
|
* - Failures: count of failed WorkItems linked to this mission
|
|
118
134
|
*
|
|
119
135
|
* @param mission - The Mission to build context for
|
|
136
|
+
* @param missionItems - Pre-filtered WorkItems belonging to the mission.
|
|
137
|
+
* Pass an empty array when the mission has no items or the pool
|
|
138
|
+
* could not be loaded — the function does not re-fetch.
|
|
120
139
|
* @returns Populated EscalationContext
|
|
121
140
|
*/
|
|
122
|
-
buildEscalationContext(mission: Mission):
|
|
141
|
+
buildEscalationContext(mission: Mission, missionItems: WorkItem[]): EscalationContext;
|
|
123
142
|
/**
|
|
124
143
|
* Executes the required actions from an escalation result.
|
|
125
144
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"escalation.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/escalation.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,EAAE,wBAAwB,EAAE,KAAK,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAI1G,OAAO,KAAK,EACV,OAAO,EACP,iBAAiB,EACjB,cAAc,EACf,MAAM,yBAAyB,CAAC;AAmBjC;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,UAAU,EAAE,gBAAgB,CAAC;IAC7B,gCAAgC;IAChC,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,0CAA0C;IAC1C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,wDAAwD;IACxD,oBAAoB,EAAE,MAAM,CAAC;IAC7B,6DAA6D;IAC7D,OAAO,EAAE,uBAAuB,EAAE,CAAC;IACnC,sCAAsC;IACtC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,MAAM,uBAAuB,GAAG,CACpC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,OAAO,KACjC,OAAO,CAAC,IAAI,CAAC,CAAC;AAMnB;;;;;;;;;;;;;GAaG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA2B;IACzD,OAAO,CAAC,aAAa,CAAwC;IAC7D,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,OAAO,CAAS;
|
|
1
|
+
{"version":3,"file":"escalation.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/escalation.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,EAAE,wBAAwB,EAAE,KAAK,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAI1G,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAElE,OAAO,KAAK,EACV,OAAO,EACP,iBAAiB,EACjB,cAAc,EACf,MAAM,yBAAyB,CAAC;AAmBjC;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,UAAU,EAAE,gBAAgB,CAAC;IAC7B,gCAAgC;IAChC,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,0CAA0C;IAC1C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,wDAAwD;IACxD,oBAAoB,EAAE,MAAM,CAAC;IAC7B,6DAA6D;IAC7D,OAAO,EAAE,uBAAuB,EAAE,CAAC;IACnC,sCAAsC;IACtC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,MAAM,uBAAuB,GAAG,CACpC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,OAAO,KACjC,OAAO,CAAC,IAAI,CAAC,CAAC;AAMnB;;;;;;;;;;;;;GAaG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA2B;IACzD,OAAO,CAAC,aAAa,CAAwC;IAC7D,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,OAAO,CAAS;IACxB;;;;;;;OAOG;IACH,OAAO,CAAC,gBAAgB,CAAuE;IAE/F;;;;;OAKG;gBAED,WAAW,EAAE,MAAM,EACnB,aAAa,CAAC,EAAE,wBAAwB;IAQ1C;;;;;OAKG;IACH,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI;IAIxD;;;;;OAKG;IACG,KAAK,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkEnD;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAc3B;;OAEG;IACH,SAAS,IAAI,OAAO;IAQpB;;;;;OAKG;IACG,QAAQ,IAAI,OAAO,CAAC,sBAAsB,CAAC;IAsFjD;;;;OAIG;YACW,oBAAoB;IAWlC;;;;;;;;;;;;;OAaG;IACH,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,iBAAiB;IA0BrF;;;;;;;;;OASG;YACW,wBAAwB;IAyCtC;;;;;OAKG;YACW,qBAAqB;IAiDnC;;;;OAIG;IACG,kBAAkB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;CA6B/C"}
|
|
@@ -58,6 +58,15 @@ export class EscalationService {
|
|
|
58
58
|
actionHandler = null;
|
|
59
59
|
triggerId = null;
|
|
60
60
|
started = false;
|
|
61
|
+
/**
|
|
62
|
+
* The wrapper function this service installed on the TriggerEngine via
|
|
63
|
+
* `setActionHandler`. Kept so we can detect "was I already installed?"
|
|
64
|
+
* on re-entry and avoid building a growing delegation chain. Each
|
|
65
|
+
* restart that skipped `stop()` (crash, test teardown gaps) would
|
|
66
|
+
* otherwise wrap the previous wrapper as its "originalHandler",
|
|
67
|
+
* stacking closures forever.
|
|
68
|
+
*/
|
|
69
|
+
installedHandler = null;
|
|
61
70
|
/**
|
|
62
71
|
* Creates a new EscalationService.
|
|
63
72
|
*
|
|
@@ -104,22 +113,33 @@ export class EscalationService {
|
|
|
104
113
|
runReconciler: true, // Re-used as a "run escalation" signal
|
|
105
114
|
},
|
|
106
115
|
createdBy: 'system',
|
|
116
|
+
// Stable name makes create() idempotent — repeated boots reuse the
|
|
117
|
+
// same trigger instead of stacking duplicates. See TriggerEngine.create.
|
|
118
|
+
name: 'system:escalation',
|
|
107
119
|
maxIdleFires: 50, // Allow many idle fires since not all cycles trigger
|
|
108
120
|
});
|
|
109
121
|
this.triggerId = trigger.id;
|
|
110
122
|
// Register a custom action handler on the TriggerEngine that intercepts
|
|
111
|
-
// our trigger and runs the evaluation loop.
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
+
// our trigger and runs the evaluation loop. If a second `start()` runs
|
|
124
|
+
// without a matching `stop()` (crash recovery, test singleton reuse),
|
|
125
|
+
// `currentHandler` could already be OUR previous wrapper — wrapping it
|
|
126
|
+
// again would build a delegation chain that grows by one closure per
|
|
127
|
+
// restart. Detect that and reuse the prior install instead of stacking.
|
|
128
|
+
const currentHandler = triggerEngine['actionHandler'];
|
|
129
|
+
if (currentHandler !== this.installedHandler) {
|
|
130
|
+
const originalHandler = currentHandler;
|
|
131
|
+
this.installedHandler = async (trigger, action) => {
|
|
132
|
+
if (trigger.id === this.triggerId) {
|
|
133
|
+
await this.evaluate();
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
// Delegate to original handler for other triggers
|
|
137
|
+
if (originalHandler) {
|
|
138
|
+
await originalHandler(trigger, action);
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
triggerEngine.setActionHandler(this.installedHandler);
|
|
142
|
+
}
|
|
123
143
|
this.started = true;
|
|
124
144
|
this.logger.info('EscalationService started', {
|
|
125
145
|
triggerId: this.triggerId,
|
|
@@ -169,9 +189,27 @@ export class EscalationService {
|
|
|
169
189
|
const results = [];
|
|
170
190
|
try {
|
|
171
191
|
const missions = await this.loadActiveMissions();
|
|
192
|
+
// Fetch the task pool once per cycle and bucket by missionId so each
|
|
193
|
+
// mission's context build is a simple Map lookup instead of a full
|
|
194
|
+
// scan of the (potentially thousands of items) pool. Previously N
|
|
195
|
+
// missions × O(pool) made the cycle quadratic on large workspaces.
|
|
196
|
+
const allItems = await this.loadMissionWorkItems();
|
|
197
|
+
const itemsByMission = new Map();
|
|
198
|
+
for (const wi of allItems) {
|
|
199
|
+
if (!wi.missionId)
|
|
200
|
+
continue;
|
|
201
|
+
const bucket = itemsByMission.get(wi.missionId);
|
|
202
|
+
if (bucket) {
|
|
203
|
+
bucket.push(wi);
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
itemsByMission.set(wi.missionId, [wi]);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
172
209
|
for (const mission of missions) {
|
|
173
210
|
try {
|
|
174
|
-
const
|
|
211
|
+
const missionItems = itemsByMission.get(mission.id) ?? [];
|
|
212
|
+
const context = this.buildEscalationContext(mission, missionItems);
|
|
175
213
|
const escalation = this.policyService.evaluateEscalationRules(mission.policy.escalationRules, context);
|
|
176
214
|
if (escalation.triggered) {
|
|
177
215
|
const actionsExecuted = await this.executeEscalationActions(mission, escalation);
|
|
@@ -222,6 +260,22 @@ export class EscalationService {
|
|
|
222
260
|
// ---------------------------------------------------------------------------
|
|
223
261
|
// Context Building
|
|
224
262
|
// ---------------------------------------------------------------------------
|
|
263
|
+
/**
|
|
264
|
+
* Loads the task pool once per evaluation cycle. Extracted so `evaluate`
|
|
265
|
+
* can bucket items by missionId before calling
|
|
266
|
+
* {@link buildEscalationContext} for each mission.
|
|
267
|
+
*/
|
|
268
|
+
async loadMissionWorkItems() {
|
|
269
|
+
try {
|
|
270
|
+
return await TaskPoolService.getInstance().getAllItems();
|
|
271
|
+
}
|
|
272
|
+
catch (err) {
|
|
273
|
+
this.logger.warn('Failed to load task pool for escalation (treating as empty)', {
|
|
274
|
+
error: err instanceof Error ? err.message : String(err),
|
|
275
|
+
});
|
|
276
|
+
return [];
|
|
277
|
+
}
|
|
278
|
+
}
|
|
225
279
|
/**
|
|
226
280
|
* Builds an EscalationContext for a Mission by aggregating runtime data.
|
|
227
281
|
*
|
|
@@ -231,21 +285,23 @@ export class EscalationService {
|
|
|
231
285
|
* - Failures: count of failed WorkItems linked to this mission
|
|
232
286
|
*
|
|
233
287
|
* @param mission - The Mission to build context for
|
|
288
|
+
* @param missionItems - Pre-filtered WorkItems belonging to the mission.
|
|
289
|
+
* Pass an empty array when the mission has no items or the pool
|
|
290
|
+
* could not be loaded — the function does not re-fetch.
|
|
234
291
|
* @returns Populated EscalationContext
|
|
235
292
|
*/
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
293
|
+
buildEscalationContext(mission, missionItems) {
|
|
294
|
+
// Single pass over the pre-filtered slice gives us both the cost sum
|
|
295
|
+
// and the failure count without double-iterating.
|
|
296
|
+
let currentCost = 0;
|
|
297
|
+
let failureCount = 0;
|
|
298
|
+
for (const wi of missionItems) {
|
|
299
|
+
currentCost += wi.cost ?? 0;
|
|
300
|
+
if (wi.status === 'failed')
|
|
301
|
+
failureCount += 1;
|
|
302
|
+
}
|
|
244
303
|
const createdAt = new Date(mission.createdAt).getTime();
|
|
245
|
-
const
|
|
246
|
-
const hoursElapsed = (now - createdAt) / (1000 * 60 * 60);
|
|
247
|
-
// Count failures
|
|
248
|
-
const failureCount = missionItems.filter((wi) => wi.status === 'failed').length;
|
|
304
|
+
const hoursElapsed = (Date.now() - createdAt) / (1000 * 60 * 60);
|
|
249
305
|
return {
|
|
250
306
|
currentCost,
|
|
251
307
|
hoursElapsed,
|
|
@@ -310,19 +366,32 @@ export class EscalationService {
|
|
|
310
366
|
const allItems = await taskPool.getAllItems();
|
|
311
367
|
const activeItems = allItems.filter((wi) => wi.missionId === missionId &&
|
|
312
368
|
(wi.status === 'queued' || wi.status === 'running'));
|
|
369
|
+
let succeeded = 0;
|
|
370
|
+
const failures = [];
|
|
313
371
|
for (const item of activeItems) {
|
|
314
372
|
try {
|
|
315
373
|
// queued → blocked requires queued→running→blocked or direct update
|
|
316
374
|
await taskPool.updateItemStatus(item.id, 'blocked');
|
|
375
|
+
succeeded += 1;
|
|
317
376
|
}
|
|
318
|
-
catch {
|
|
319
|
-
// Some transitions may not be valid —
|
|
377
|
+
catch (err) {
|
|
378
|
+
// Some transitions may not be valid — track so we don't report
|
|
379
|
+
// a falsely optimistic `pausedCount`.
|
|
380
|
+
failures.push({
|
|
381
|
+
itemId: item.id,
|
|
382
|
+
error: err instanceof Error ? err.message : String(err),
|
|
383
|
+
});
|
|
320
384
|
}
|
|
321
385
|
}
|
|
322
386
|
this.logger.info('Paused mission WorkItems', {
|
|
323
387
|
missionId,
|
|
324
|
-
|
|
388
|
+
attempted: activeItems.length,
|
|
389
|
+
succeeded,
|
|
390
|
+
failed: failures.length,
|
|
325
391
|
});
|
|
392
|
+
if (failures.length > 0) {
|
|
393
|
+
this.logger.debug('Work-item pause failures', { missionId, failures });
|
|
394
|
+
}
|
|
326
395
|
}
|
|
327
396
|
catch (err) {
|
|
328
397
|
this.logger.warn('Failed to pause mission WorkItems (non-fatal)', {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"escalation.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/escalation.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,aAAa,EAAwB,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,wBAAwB,EAAyB,MAAM,yCAAyC,CAAC;AAC1G,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"escalation.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/escalation.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,19 +19,21 @@
|
|
|
19
19
|
* - **Same-team requests skip the gate.** Teams don't contract with
|
|
20
20
|
* themselves; internal work flows normally.
|
|
21
21
|
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* be called from
|
|
22
|
+
* Wired into the task-pool `addItem` flow via `maybeEnforceContract` in
|
|
23
|
+
* `controllers/task-pool/task-pool.controller.ts`. The service itself is
|
|
24
|
+
* stateless and standalone so it can also be called from skills or a
|
|
25
|
+
* future ServiceGateway layer.
|
|
25
26
|
*
|
|
26
27
|
* @module services/v3/service-contract-gate.service
|
|
27
28
|
*/
|
|
28
29
|
import type { Team } from '../../types/index.js';
|
|
30
|
+
export { matchRule } from './contract-matcher.js';
|
|
29
31
|
/**
|
|
30
32
|
* Reason codes for a rejected request. Callers use these to produce a
|
|
31
33
|
* targeted error message (e.g. "out of scope" vs "ambiguous, please
|
|
32
34
|
* specify a supported service type").
|
|
33
35
|
*/
|
|
34
|
-
export type GateRejectionReason = 'missing_target' | 'no_contract' | 'empty_contract' | 'in_avoids' | 'no_match';
|
|
36
|
+
export type GateRejectionReason = 'missing_target' | 'missing_request_type' | 'no_contract' | 'empty_contract' | 'in_avoids' | 'no_match';
|
|
35
37
|
/**
|
|
36
38
|
* The decision returned by the gate.
|
|
37
39
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-contract-gate.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/service-contract-gate.service.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"service-contract-gate.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/service-contract-gate.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAIjD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAMlD;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAC3B,gBAAgB,GAChB,sBAAsB,GACtB,aAAa,GACb,gBAAgB,GAChB,WAAW,GACX,UAAU,CAAC;AAEf;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB;IACE,OAAO,EAAE,QAAQ,CAAC;IAClB,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;CACrB,GACD;IACE,OAAO,EAAE,QAAQ,CAAC;IAClB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEN;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,MAAM,EAAE,IAAI,GAAG,SAAS,CAAC;IACzB,0EAA0E;IAC1E,WAAW,EAAE,MAAM,CAAC;CACrB;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,mBAAmB;IAC9B;;;;;OAKG;IACH,KAAK,CAAC,GAAG,EAAE,WAAW,GAAG,YAAY;CAiEtC"}
|
|
@@ -19,12 +19,15 @@
|
|
|
19
19
|
* - **Same-team requests skip the gate.** Teams don't contract with
|
|
20
20
|
* themselves; internal work flows normally.
|
|
21
21
|
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* be called from
|
|
22
|
+
* Wired into the task-pool `addItem` flow via `maybeEnforceContract` in
|
|
23
|
+
* `controllers/task-pool/task-pool.controller.ts`. The service itself is
|
|
24
|
+
* stateless and standalone so it can also be called from skills or a
|
|
25
|
+
* future ServiceGateway layer.
|
|
25
26
|
*
|
|
26
27
|
* @module services/v3/service-contract-gate.service
|
|
27
28
|
*/
|
|
29
|
+
import { matchRule } from './contract-matcher.js';
|
|
30
|
+
export { matchRule } from './contract-matcher.js';
|
|
28
31
|
// ---------------------------------------------------------------------------
|
|
29
32
|
// Service
|
|
30
33
|
// ---------------------------------------------------------------------------
|
|
@@ -65,6 +68,16 @@ export class ServiceContractGate {
|
|
|
65
68
|
message: 'Target team could not be resolved.',
|
|
66
69
|
};
|
|
67
70
|
}
|
|
71
|
+
// A missing requestType is a caller bug (no metadata in the WorkItem),
|
|
72
|
+
// not a policy decision. Surface it explicitly so the caller doesn't
|
|
73
|
+
// misread "no_match" as "the target team rejected my work".
|
|
74
|
+
if (!req.requestType || !req.requestType.trim()) {
|
|
75
|
+
return {
|
|
76
|
+
outcome: 'reject',
|
|
77
|
+
reason: 'missing_request_type',
|
|
78
|
+
message: 'Cross-team requests must supply a non-empty `requestType` (or a title/description fallback).',
|
|
79
|
+
};
|
|
80
|
+
}
|
|
68
81
|
const contract = req.toTeam.serviceContract;
|
|
69
82
|
if (!contract) {
|
|
70
83
|
return {
|
|
@@ -74,7 +87,7 @@ export class ServiceContractGate {
|
|
|
74
87
|
};
|
|
75
88
|
}
|
|
76
89
|
// `avoids` wins over `accepts` — fail closed on negative signal.
|
|
77
|
-
const avoidHit =
|
|
90
|
+
const avoidHit = matchRule(req.requestType, contract.avoids ?? []);
|
|
78
91
|
if (avoidHit) {
|
|
79
92
|
return {
|
|
80
93
|
outcome: 'reject',
|
|
@@ -91,7 +104,7 @@ export class ServiceContractGate {
|
|
|
91
104
|
message: `Team "${req.toTeam.name}" has a service contract with no accepted task types.`,
|
|
92
105
|
};
|
|
93
106
|
}
|
|
94
|
-
const acceptHit =
|
|
107
|
+
const acceptHit = matchRule(req.requestType, accepts);
|
|
95
108
|
if (acceptHit) {
|
|
96
109
|
return { outcome: 'accept', matchedRule: acceptHit };
|
|
97
110
|
}
|
|
@@ -102,29 +115,6 @@ export class ServiceContractGate {
|
|
|
102
115
|
};
|
|
103
116
|
}
|
|
104
117
|
}
|
|
105
|
-
// ---------------------------------------------------------------------------
|
|
106
|
-
// Matching helpers
|
|
107
|
-
// ---------------------------------------------------------------------------
|
|
108
|
-
/**
|
|
109
|
-
* Case-insensitive substring match. Accepts either direction — a rule
|
|
110
|
-
* matches if either string contains the other. This tolerates both tightly
|
|
111
|
-
* scoped rules ("bugfix") and verbose request phrasing ("urgent frontend
|
|
112
|
-
* bugfix in checkout").
|
|
113
|
-
*/
|
|
114
|
-
function matchAny(requestType, rules) {
|
|
115
|
-
const needle = requestType.trim().toLowerCase();
|
|
116
|
-
if (!needle)
|
|
117
|
-
return null;
|
|
118
|
-
for (const rule of rules) {
|
|
119
|
-
const hay = rule.trim().toLowerCase();
|
|
120
|
-
if (!hay)
|
|
121
|
-
continue;
|
|
122
|
-
if (needle.includes(hay) || hay.includes(needle)) {
|
|
123
|
-
return rule;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
return null;
|
|
127
|
-
}
|
|
128
118
|
/**
|
|
129
119
|
* Build a helpful rejection message that lists what the team does accept,
|
|
130
120
|
* so the caller can reframe or re-route.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-contract-gate.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/service-contract-gate.service.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"service-contract-gate.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/service-contract-gate.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"team-trigger-reconciler.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/team-trigger-reconciler.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAmB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"team-trigger-reconciler.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/team-trigger-reconciler.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAmB,MAAM,sBAAsB,CAAC;AAGlE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAOjE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,4CAA4C;IAC5C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,4EAA4E;IAC5E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,8EAA8E;IAC9E,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,qDAAqD;IACrD,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAMD;;;;;;;;;;GAUG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;gBAE7B,MAAM,EAAE,aAAa;IAOjC;;;;;;OAMG;IACG,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA+EtD;;;;;;OAMG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBpD,OAAO,CAAC,aAAa;IAarB;;;;OAIG;IACH,OAAO,CAAC,QAAQ;CAqBjB"}
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
*
|
|
17
17
|
* @module services/v3/team-trigger-reconciler.service
|
|
18
18
|
*/
|
|
19
|
+
import { DEFAULT_MAX_IDLE_FIRES } from '../../types/v2/trigger.types.js';
|
|
19
20
|
import { LoggerService } from '../core/logger.service.js';
|
|
20
21
|
// ---------------------------------------------------------------------------
|
|
21
22
|
// Service
|
|
@@ -66,9 +67,9 @@ export class TeamTriggerReconciler {
|
|
|
66
67
|
}
|
|
67
68
|
// Pull current engine-side triggers for this team.
|
|
68
69
|
const currentByName = new Map();
|
|
69
|
-
for (const
|
|
70
|
-
if (
|
|
71
|
-
currentByName.set(
|
|
70
|
+
for (const trigger of this.engine.list()) {
|
|
71
|
+
if (trigger.teamId === team.id && trigger.name) {
|
|
72
|
+
currentByName.set(trigger.name, trigger);
|
|
72
73
|
}
|
|
73
74
|
}
|
|
74
75
|
// 1) Delete engine triggers whose name disappeared from the spec.
|
|
@@ -125,9 +126,9 @@ export class TeamTriggerReconciler {
|
|
|
125
126
|
*/
|
|
126
127
|
async unregisterAll(teamId) {
|
|
127
128
|
let removed = 0;
|
|
128
|
-
for (const
|
|
129
|
-
if (
|
|
130
|
-
await this.engine.delete(
|
|
129
|
+
for (const trigger of this.engine.list()) {
|
|
130
|
+
if (trigger.teamId === teamId) {
|
|
131
|
+
await this.engine.delete(trigger.id);
|
|
131
132
|
removed += 1;
|
|
132
133
|
}
|
|
133
134
|
}
|
|
@@ -167,9 +168,13 @@ export class TeamTriggerReconciler {
|
|
|
167
168
|
config: spec.config,
|
|
168
169
|
action: spec.action,
|
|
169
170
|
maxFires: spec.maxFires,
|
|
170
|
-
// When
|
|
171
|
-
//
|
|
172
|
-
|
|
171
|
+
// When the spec omits `maxIdleFires`, compare against the factory
|
|
172
|
+
// default — NOT the running trigger's current value. Mirroring the
|
|
173
|
+
// running value silently hides convergence bugs: if the operator
|
|
174
|
+
// authored the spec with `maxIdleFires: 50`, then later dropped the
|
|
175
|
+
// field intending to fall back to the default, the old value would
|
|
176
|
+
// stick forever because runtime == desired.
|
|
177
|
+
maxIdleFires: spec.maxIdleFires ?? DEFAULT_MAX_IDLE_FIRES,
|
|
173
178
|
};
|
|
174
179
|
return JSON.stringify(runtime) !== JSON.stringify(desired);
|
|
175
180
|
}
|