crewly 1.20.406 → 1.20.408
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/dist/backend/backend/src/constants.d.ts +34 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +34 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/activity/activity.controller.d.ts +29 -0
- package/dist/backend/backend/src/controllers/activity/activity.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/activity/activity.controller.js +77 -0
- package/dist/backend/backend/src/controllers/activity/activity.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 +49 -0
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/routes/modules/system.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/modules/system.routes.js +3 -0
- package/dist/backend/backend/src/routes/modules/system.routes.js.map +1 -1
- package/dist/backend/backend/src/services/activity/activity-log.service.d.ts +192 -0
- package/dist/backend/backend/src/services/activity/activity-log.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/activity/activity-log.service.js +343 -0
- package/dist/backend/backend/src/services/activity/activity-log.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.js +7 -0
- package/dist/backend/backend/src/services/agent/agent-heartbeat-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts +13 -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 +39 -0
- package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.wiring.js +2 -0
- package/dist/backend/backend/src/services/decisions/decision.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +8 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +24 -5
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +34 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +34 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/middleware/agent-origin-correction.d.ts +31 -0
- package/dist/cli/backend/src/middleware/agent-origin-correction.d.ts.map +1 -0
- package/dist/cli/backend/src/middleware/agent-origin-correction.js +31 -0
- package/dist/cli/backend/src/middleware/agent-origin-correction.js.map +1 -0
- package/dist/cli/backend/src/middleware/api-token.middleware.d.ts +171 -0
- package/dist/cli/backend/src/middleware/api-token.middleware.d.ts.map +1 -0
- package/dist/cli/backend/src/middleware/api-token.middleware.js +329 -0
- package/dist/cli/backend/src/middleware/api-token.middleware.js.map +1 -0
- package/dist/cli/backend/src/middleware/caller-identity.middleware.d.ts +290 -0
- package/dist/cli/backend/src/middleware/caller-identity.middleware.d.ts.map +1 -0
- package/dist/cli/backend/src/middleware/caller-identity.middleware.js +658 -0
- package/dist/cli/backend/src/middleware/caller-identity.middleware.js.map +1 -0
- package/dist/cli/backend/src/middleware/require-auth.middleware.d.ts +60 -0
- package/dist/cli/backend/src/middleware/require-auth.middleware.d.ts.map +1 -0
- package/dist/cli/backend/src/middleware/require-auth.middleware.js +127 -0
- package/dist/cli/backend/src/middleware/require-auth.middleware.js.map +1 -0
- package/dist/cli/backend/src/services/activity/activity-log.service.d.ts +192 -0
- package/dist/cli/backend/src/services/activity/activity-log.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/activity/activity-log.service.js +343 -0
- package/dist/cli/backend/src/services/activity/activity-log.service.js.map +1 -0
- package/dist/cli/backend/src/services/core/peer-process.service.d.ts +168 -0
- package/dist/cli/backend/src/services/core/peer-process.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/core/peer-process.service.js +352 -0
- package/dist/cli/backend/src/services/core/peer-process.service.js.map +1 -0
- package/dist/cli/backend/src/services/decisions/decision.service.d.ts +13 -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 +39 -0
- package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +8 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +24 -5
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Activity log API (crewly#881).
|
|
3
|
+
*
|
|
4
|
+
* - `GET /api/activity?actorType=&actorId=&action=&targetType=&targetId=&since=&until=&limit=`
|
|
5
|
+
* — owner only, read-only: entries of the append-only activity log, newest
|
|
6
|
+
* first. `action` is exact or a dotted prefix (`team.`); `since` / `until`
|
|
7
|
+
* are ISO timestamps or `YYYY-MM-DD` (until a bare date = end of that day).
|
|
8
|
+
*
|
|
9
|
+
* @module controllers/activity/activity.controller
|
|
10
|
+
*/
|
|
11
|
+
import type { Router } from 'express';
|
|
12
|
+
import { type ActivityLogService, type ActivityQuery } from '../../services/activity/activity-log.service.js';
|
|
13
|
+
/**
|
|
14
|
+
* Parse the query string of GET /api/activity.
|
|
15
|
+
*
|
|
16
|
+
* @param q - `req.query`
|
|
17
|
+
* @returns The query, or an error message for a bad value
|
|
18
|
+
*/
|
|
19
|
+
export declare function parseActivityQuery(q: Record<string, unknown>): ActivityQuery | {
|
|
20
|
+
error: string;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Register the route.
|
|
24
|
+
*
|
|
25
|
+
* @param router - API router (mounted at `/api`)
|
|
26
|
+
* @param log - The log to read (tests inject one)
|
|
27
|
+
*/
|
|
28
|
+
export declare function registerActivityRoutes(router: Router, log?: () => ActivityLogService): void;
|
|
29
|
+
//# sourceMappingURL=activity.controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity.controller.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/controllers/activity/activity.controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAqB,MAAM,EAAE,MAAM,SAAS,CAAC;AAGzD,OAAO,EAAuC,KAAK,kBAAkB,EAAE,KAAK,aAAa,EAAE,MAAM,iDAAiD,CAAC;AAKnJ;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAoChG;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,kBAAmC,GAAG,IAAI,CAc3G"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { ACTIVITY_LOG_CONSTANTS } from '../../constants.js';
|
|
2
|
+
import { requireOwner } from '../../middleware/caller-identity.middleware.js';
|
|
3
|
+
import { getActivityLog, isActivityActorType } from '../../services/activity/activity-log.service.js';
|
|
4
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
5
|
+
const BARE_DATE = /^\d{4}-\d{2}-\d{2}$/;
|
|
6
|
+
/**
|
|
7
|
+
* Parse the query string of GET /api/activity.
|
|
8
|
+
*
|
|
9
|
+
* @param q - `req.query`
|
|
10
|
+
* @returns The query, or an error message for a bad value
|
|
11
|
+
*/
|
|
12
|
+
export function parseActivityQuery(q) {
|
|
13
|
+
const Q = ACTIVITY_LOG_CONSTANTS.QUERY;
|
|
14
|
+
const str = (key) => {
|
|
15
|
+
const v = q[key];
|
|
16
|
+
return typeof v === 'string' && v.trim() ? v.trim() : undefined;
|
|
17
|
+
};
|
|
18
|
+
const date = (key, endOfDay) => {
|
|
19
|
+
const v = str(key);
|
|
20
|
+
if (!v)
|
|
21
|
+
return undefined;
|
|
22
|
+
const ms = Date.parse(v);
|
|
23
|
+
if (Number.isNaN(ms))
|
|
24
|
+
return { error: `${key} must be an ISO timestamp or YYYY-MM-DD` };
|
|
25
|
+
return new Date(BARE_DATE.test(v) && endOfDay ? ms + DAY_MS - 1 : ms).toISOString();
|
|
26
|
+
};
|
|
27
|
+
const actorType = str(Q.ACTOR_TYPE);
|
|
28
|
+
if (actorType !== undefined && !isActivityActorType(actorType))
|
|
29
|
+
return { error: `${Q.ACTOR_TYPE} must be owner, agent or system` };
|
|
30
|
+
const since = date(Q.SINCE, false);
|
|
31
|
+
if (since && typeof since === 'object')
|
|
32
|
+
return since;
|
|
33
|
+
const until = date(Q.UNTIL, true);
|
|
34
|
+
if (until && typeof until === 'object')
|
|
35
|
+
return until;
|
|
36
|
+
let limit;
|
|
37
|
+
const rawLimit = str(Q.LIMIT);
|
|
38
|
+
if (rawLimit !== undefined) {
|
|
39
|
+
limit = Number(rawLimit);
|
|
40
|
+
if (!Number.isInteger(limit) || limit < 1)
|
|
41
|
+
return { error: `${Q.LIMIT} must be a positive integer` };
|
|
42
|
+
limit = Math.min(limit, ACTIVITY_LOG_CONSTANTS.MAX_LIMIT);
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
...(actorType ? { actorType } : {}),
|
|
46
|
+
...(str(Q.ACTOR_ID) ? { actorId: str(Q.ACTOR_ID) } : {}),
|
|
47
|
+
...(str(Q.ACTION) ? { action: str(Q.ACTION) } : {}),
|
|
48
|
+
...(str(Q.TARGET_TYPE) ? { targetType: str(Q.TARGET_TYPE) } : {}),
|
|
49
|
+
...(str(Q.TARGET_ID) ? { targetId: str(Q.TARGET_ID) } : {}),
|
|
50
|
+
...(since ? { since } : {}),
|
|
51
|
+
...(until ? { until } : {}),
|
|
52
|
+
...(limit !== undefined ? { limit } : {}),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Register the route.
|
|
57
|
+
*
|
|
58
|
+
* @param router - API router (mounted at `/api`)
|
|
59
|
+
* @param log - The log to read (tests inject one)
|
|
60
|
+
*/
|
|
61
|
+
export function registerActivityRoutes(router, log = getActivityLog) {
|
|
62
|
+
router.get('/activity', requireOwner, async (req, res) => {
|
|
63
|
+
const query = parseActivityQuery(req.query);
|
|
64
|
+
if ('error' in query) {
|
|
65
|
+
res.status(400).json({ success: false, error: query.error });
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
const entries = await log().list(query);
|
|
70
|
+
res.json({ success: true, data: { count: entries.length, limit: query.limit ?? ACTIVITY_LOG_CONSTANTS.DEFAULT_LIMIT, entries } });
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
res.status(500).json({ success: false, error: err instanceof Error ? err.message : String(err) });
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=activity.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity.controller.js","sourceRoot":"","sources":["../../../../../../backend/src/controllers/activity/activity.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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"}
|
|
@@ -32,6 +32,7 @@ import { usageLimitedView } from '../../services/runtime-fallback/usage-limit-st
|
|
|
32
32
|
import { clearOwnerStopped, markOwnerStopped } from '../../services/agent/owner-stopped.registry.js';
|
|
33
33
|
import { isTeamPausedNow, pausedRefusalMessage } from '../../services/team/team-pause.registry.js';
|
|
34
34
|
import { reportOwnerThreadBlocking } from '../../services/messaging/owner-thread-sentinel.service.js';
|
|
35
|
+
import { actorFromRequest, recordActivity, summarizeChange } from '../../services/activity/activity-log.service.js';
|
|
35
36
|
const logger = LoggerService.getInstance().createComponentLogger('TeamController');
|
|
36
37
|
/**
|
|
37
38
|
* Module-level EventBusService instance, injected at startup.
|
|
@@ -1127,6 +1128,12 @@ export async function createTeam(req, res) {
|
|
|
1127
1128
|
...(qualityGate ? { qualityGate } : {}),
|
|
1128
1129
|
};
|
|
1129
1130
|
await this.storageService.saveTeam(team);
|
|
1131
|
+
recordActivity({
|
|
1132
|
+
actor: actorFromRequest(req),
|
|
1133
|
+
action: 'team.created',
|
|
1134
|
+
target: { type: 'team', id: team.id, name: team.name },
|
|
1135
|
+
after: { members: teamMembers.map((m) => m.name), projectIds: team.projectIds, ...(parentTeamId ? { parentTeamId } : {}), ...(templateId ? { templateId } : {}) },
|
|
1136
|
+
});
|
|
1130
1137
|
for (const member of teamMembers) {
|
|
1131
1138
|
if (member.role === 'tpm') {
|
|
1132
1139
|
// TPM uses file-based workflow (no duplicate messages)
|
|
@@ -1621,6 +1628,12 @@ export async function deleteTeam(req, res) {
|
|
|
1621
1628
|
await this.storageService.saveTeam(child);
|
|
1622
1629
|
}
|
|
1623
1630
|
await this.storageService.deleteTeam(id);
|
|
1631
|
+
recordActivity({
|
|
1632
|
+
actor: actorFromRequest(req),
|
|
1633
|
+
action: 'team.deleted',
|
|
1634
|
+
target: { type: 'team', id, name: team.name },
|
|
1635
|
+
before: { members: (team.members ?? []).map((m) => m.name), projectIds: team.projectIds ?? [] },
|
|
1636
|
+
});
|
|
1624
1637
|
res.json({ success: true, message: 'Team terminated successfully' });
|
|
1625
1638
|
}
|
|
1626
1639
|
catch (error) {
|
|
@@ -1685,6 +1698,12 @@ export async function addTeamMember(req, res) {
|
|
|
1685
1698
|
team.members.push(newMember);
|
|
1686
1699
|
team.updatedAt = new Date().toISOString();
|
|
1687
1700
|
await this.storageService.saveTeam(team);
|
|
1701
|
+
recordActivity({
|
|
1702
|
+
actor: actorFromRequest(req),
|
|
1703
|
+
action: 'team.member.added',
|
|
1704
|
+
target: { type: 'member', id: newMember.id, name: newMember.name },
|
|
1705
|
+
after: { teamId: team.id, team: team.name, role: newMember.role, runtimeType: newMember.runtimeType },
|
|
1706
|
+
});
|
|
1688
1707
|
res.json({ success: true, data: newMember, message: 'Team member added successfully' });
|
|
1689
1708
|
}
|
|
1690
1709
|
catch (error) {
|
|
@@ -1741,9 +1760,16 @@ export async function updateTeamMember(req, res) {
|
|
|
1741
1760
|
delete updatedMember.dedicatedTo;
|
|
1742
1761
|
if ('tier' in updates && !updates.tier)
|
|
1743
1762
|
delete updatedMember.tier;
|
|
1763
|
+
const memberBefore = team.members[memberIndex];
|
|
1744
1764
|
team.members[memberIndex] = updatedMember;
|
|
1745
1765
|
team.updatedAt = new Date().toISOString();
|
|
1746
1766
|
await this.storageService.saveTeam(team);
|
|
1767
|
+
recordActivity({
|
|
1768
|
+
actor: actorFromRequest(req),
|
|
1769
|
+
action: 'team.member.updated',
|
|
1770
|
+
target: { type: 'member', id: updatedMember.id, name: updatedMember.name },
|
|
1771
|
+
...summarizeChange({ ...memberBefore, updatedAt: undefined }, { ...updatedMember, updatedAt: undefined }),
|
|
1772
|
+
});
|
|
1747
1773
|
res.json({ success: true, data: updatedMember, message: 'Team member updated successfully' });
|
|
1748
1774
|
}
|
|
1749
1775
|
catch (error) {
|
|
@@ -1777,6 +1803,12 @@ export async function deleteTeamMember(req, res) {
|
|
|
1777
1803
|
team.members.splice(memberIndex, 1);
|
|
1778
1804
|
team.updatedAt = new Date().toISOString();
|
|
1779
1805
|
await this.storageService.saveTeam(team);
|
|
1806
|
+
recordActivity({
|
|
1807
|
+
actor: actorFromRequest(req),
|
|
1808
|
+
action: 'team.member.removed',
|
|
1809
|
+
target: { type: 'member', id: member.id, name: member.name },
|
|
1810
|
+
before: { teamId: team.id, team: team.name, role: member.role },
|
|
1811
|
+
});
|
|
1780
1812
|
res.json({ success: true, message: 'Team member removed successfully' });
|
|
1781
1813
|
}
|
|
1782
1814
|
catch (error) {
|
|
@@ -2894,6 +2926,13 @@ export async function updateTeamMemberRuntime(req, res) {
|
|
|
2894
2926
|
runtimeType: runtimeType,
|
|
2895
2927
|
updatedAt: new Date().toISOString()
|
|
2896
2928
|
};
|
|
2929
|
+
recordActivity({
|
|
2930
|
+
actor: actorFromRequest(req),
|
|
2931
|
+
action: 'team.member.updated',
|
|
2932
|
+
target: { type: 'member', id: updatedMember.id, name: updatedMember.name },
|
|
2933
|
+
before: { runtimeType: team.members[memberIndex].runtimeType },
|
|
2934
|
+
after: { runtimeType },
|
|
2935
|
+
});
|
|
2897
2936
|
team.members[memberIndex] = updatedMember;
|
|
2898
2937
|
team.updatedAt = new Date().toISOString();
|
|
2899
2938
|
await this.storageService.saveTeam(team);
|
|
@@ -2971,6 +3010,8 @@ export async function updateTeam(req, res) {
|
|
|
2971
3010
|
return;
|
|
2972
3011
|
}
|
|
2973
3012
|
const team = teams[teamIndex];
|
|
3013
|
+
// Activity log (crewly#881): the shallow team fields before this edit; members are logged by their own handlers.
|
|
3014
|
+
const teamBefore = { ...team, members: undefined, updatedAt: undefined };
|
|
2974
3015
|
// Update allowed fields
|
|
2975
3016
|
if (updates.projectIds !== undefined) {
|
|
2976
3017
|
team.projectIds = updates.projectIds;
|
|
@@ -3177,6 +3218,12 @@ export async function updateTeam(req, res) {
|
|
|
3177
3218
|
// Update timestamp
|
|
3178
3219
|
team.updatedAt = new Date().toISOString();
|
|
3179
3220
|
await this.storageService.saveTeam(team);
|
|
3221
|
+
recordActivity({
|
|
3222
|
+
actor: actorFromRequest(req),
|
|
3223
|
+
action: 'team.updated',
|
|
3224
|
+
target: { type: 'team', id: team.id, name: team.name },
|
|
3225
|
+
...summarizeChange(teamBefore, { ...team, members: undefined, updatedAt: undefined }),
|
|
3226
|
+
});
|
|
3180
3227
|
res.json({
|
|
3181
3228
|
success: true,
|
|
3182
3229
|
data: team,
|
|
@@ -3258,6 +3305,7 @@ export async function setTeamLeadHandler(req, res) {
|
|
|
3258
3305
|
const result = setTeamLead(team, member.id, mode);
|
|
3259
3306
|
team.updatedAt = new Date().toISOString();
|
|
3260
3307
|
await this.storageService.saveTeam(team);
|
|
3308
|
+
recordActivity({ actor: actorFromRequest(req), action: 'team.lead.changed', target: { type: 'team', id: team.id, name: team.name }, after: { lead: member.name, memberId: member.id, mode } });
|
|
3261
3309
|
logger.info('Team lead changed', {
|
|
3262
3310
|
teamId: team.id,
|
|
3263
3311
|
teamName: team.name,
|
|
@@ -3323,6 +3371,7 @@ export async function archiveTeam(req, res) {
|
|
|
3323
3371
|
team.updatedAt = new Date().toISOString();
|
|
3324
3372
|
await this.storageService.saveTeam(team);
|
|
3325
3373
|
logger.info(`Team ${archived ? 'archived' : 'unarchived'}`, { teamId: id, teamName: team.name });
|
|
3374
|
+
recordActivity({ actor: actorFromRequest(req), action: archived ? 'team.archived' : 'team.unarchived', target: { type: 'team', id, name: team.name } });
|
|
3326
3375
|
res.json({
|
|
3327
3376
|
success: true,
|
|
3328
3377
|
data: team,
|