crewly 1.16.0 → 1.17.1
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/README.md +33 -1
- package/config/roles/orchestrator/prompt.md +20 -5
- package/config/skills/agent/core/calendar-create/SKILL.md +62 -0
- package/config/skills/agent/core/calendar-create/execute.sh +91 -0
- package/config/skills/agent/core/calendar-create/execute.test.sh +80 -0
- package/config/skills/agent/core/calendar-list/SKILL.md +58 -0
- package/config/skills/agent/core/calendar-list/execute.sh +88 -0
- package/config/skills/agent/core/calendar-list/execute.test.sh +71 -0
- package/config/skills/agent/core/gmail-read/SKILL.md +61 -0
- package/config/skills/agent/core/gmail-read/execute.sh +62 -0
- package/config/skills/agent/core/gmail-read/execute.test.sh +68 -0
- package/config/skills/agent/core/gmail-search/SKILL.md +64 -0
- package/config/skills/agent/core/gmail-search/execute.sh +70 -0
- package/config/skills/agent/core/gmail-search/execute.test.sh +67 -0
- package/config/skills/agent/core/gmail-send/SKILL.md +69 -0
- package/config/skills/agent/core/gmail-send/execute.sh +114 -0
- package/config/skills/agent/core/gmail-send/execute.test.sh +83 -0
- package/config/skills/orchestrator/list-missions/SKILL.md +47 -0
- package/config/skills/orchestrator/list-missions/execute.sh +34 -0
- package/config/skills/orchestrator/list-missions/execute.test.sh +33 -0
- package/config/slack-master-app-manifest.json +64 -0
- package/dist/backend/backend/src/constants.d.ts +125 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +125 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +3 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/google/google.controller.d.ts +100 -0
- package/dist/backend/backend/src/controllers/google/google.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/google/google.controller.js +293 -0
- package/dist/backend/backend/src/controllers/google/google.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/google/google.routes.d.ts +26 -0
- package/dist/backend/backend/src/controllers/google/google.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/google/google.routes.js +38 -0
- package/dist/backend/backend/src/controllers/google/google.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.js +209 -2
- package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +58 -8
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +4 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-initializer.d.ts +8 -0
- package/dist/backend/backend/src/services/cloud/cloud-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-initializer.js +25 -0
- package/dist/backend/backend/src/services/cloud/cloud-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.js +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
- package/dist/backend/backend/src/services/core/crewly-home.utils.d.ts +49 -0
- package/dist/backend/backend/src/services/core/crewly-home.utils.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/crewly-home.utils.js +86 -0
- package/dist/backend/backend/src/services/core/crewly-home.utils.js.map +1 -1
- package/dist/backend/backend/src/services/google/calendar.service.d.ts +98 -0
- package/dist/backend/backend/src/services/google/calendar.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/google/calendar.service.js +125 -0
- package/dist/backend/backend/src/services/google/calendar.service.js.map +1 -0
- package/dist/backend/backend/src/services/google/gmail.service.d.ts +165 -0
- package/dist/backend/backend/src/services/google/gmail.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/google/gmail.service.js +296 -0
- package/dist/backend/backend/src/services/google/gmail.service.js.map +1 -0
- package/dist/backend/backend/src/services/google/google-api.client.d.ts +44 -0
- package/dist/backend/backend/src/services/google/google-api.client.d.ts.map +1 -0
- package/dist/backend/backend/src/services/google/google-api.client.js +104 -0
- package/dist/backend/backend/src/services/google/google-api.client.js.map +1 -0
- package/dist/backend/backend/src/services/google/google-workspace-token.service.d.ts +159 -0
- package/dist/backend/backend/src/services/google/google-workspace-token.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/google/google-workspace-token.service.js +274 -0
- package/dist/backend/backend/src/services/google/google-workspace-token.service.js.map +1 -0
- package/dist/backend/backend/src/services/memory/mission-context.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/memory/mission-context.service.js +2 -1
- package/dist/backend/backend/src/services/memory/mission-context.service.js.map +1 -1
- package/dist/backend/backend/src/services/memory/project-memory.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/memory/project-memory.service.js +3 -2
- package/dist/backend/backend/src/services/memory/project-memory.service.js.map +1 -1
- package/dist/backend/backend/src/services/memory/session-memory.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/memory/session-memory.service.js +2 -1
- package/dist/backend/backend/src/services/memory/session-memory.service.js.map +1 -1
- package/dist/backend/backend/src/services/project/task.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project/task.service.js +2 -3
- package/dist/backend/backend/src/services/project/task.service.js.map +1 -1
- package/dist/backend/backend/src/services/project/ticket-editor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project/ticket-editor.service.js +2 -3
- package/dist/backend/backend/src/services/project/ticket-editor.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-identity.service.d.ts +12 -1
- package/dist/backend/backend/src/services/slack/slack-agent-identity.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-identity.service.js +30 -0
- package/dist/backend/backend/src/services/slack/slack-agent-identity.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-cloud-config.service.d.ts +186 -0
- package/dist/backend/backend/src/services/slack/slack-cloud-config.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-cloud-config.service.js +409 -0
- package/dist/backend/backend/src/services/slack/slack-cloud-config.service.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts +95 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.js +284 -4
- package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-instance-registry.service.d.ts +178 -0
- package/dist/backend/backend/src/services/slack/slack-instance-registry.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-instance-registry.service.js +392 -0
- package/dist/backend/backend/src/services/slack/slack-instance-registry.service.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack.service.d.ts +76 -1
- package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.js +234 -47
- package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/escalation-router.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/escalation-router.service.js +2 -1
- package/dist/backend/backend/src/services/v3/escalation-router.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/mission-paths.d.ts +17 -0
- package/dist/backend/backend/src/services/v3/mission-paths.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/mission-paths.js +21 -2
- package/dist/backend/backend/src/services/v3/mission-paths.js.map +1 -1
- package/dist/backend/backend/src/services/v3/mission-reminder.service.d.ts +4 -0
- package/dist/backend/backend/src/services/v3/mission-reminder.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/mission-reminder.service.js +17 -0
- package/dist/backend/backend/src/services/v3/mission-reminder.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/okr-owner-guidance.service.d.ts +116 -0
- package/dist/backend/backend/src/services/v3/okr-owner-guidance.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/okr-owner-guidance.service.js +254 -0
- package/dist/backend/backend/src/services/v3/okr-owner-guidance.service.js.map +1 -0
- package/dist/backend/backend/src/services/v3/request.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/request.service.js +2 -1
- package/dist/backend/backend/src/services/v3/request.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/task-projection.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/task-projection.service.js +2 -1
- package/dist/backend/backend/src/services/v3/task-projection.service.js.map +1 -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 +2 -1
- package/dist/backend/backend/src/services/v3/trigger-engine.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/v3-data.service.js +2 -1
- package/dist/backend/backend/src/services/v3/v3-data.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js +6 -1
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js +3 -1
- package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js.map +1 -1
- package/dist/backend/backend/src/types/slack.types.d.ts +141 -2
- package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/slack.types.js.map +1 -1
- package/dist/backend/backend/src/types/v2/mission.types.d.ts +2 -0
- package/dist/backend/backend/src/types/v2/mission.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/mission.types.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +125 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +125 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.js +1 -0
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
- package/dist/cli/backend/src/services/core/crewly-home.utils.d.ts +49 -0
- package/dist/cli/backend/src/services/core/crewly-home.utils.d.ts.map +1 -1
- package/dist/cli/backend/src/services/core/crewly-home.utils.js +86 -0
- package/dist/cli/backend/src/services/core/crewly-home.utils.js.map +1 -1
- package/dist/cli/backend/src/services/memory/mission-context.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/memory/mission-context.service.js +2 -1
- package/dist/cli/backend/src/services/memory/mission-context.service.js.map +1 -1
- package/dist/cli/backend/src/services/memory/project-memory.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/memory/project-memory.service.js +3 -2
- package/dist/cli/backend/src/services/memory/project-memory.service.js.map +1 -1
- package/dist/cli/backend/src/services/memory/session-memory.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/memory/session-memory.service.js +2 -1
- package/dist/cli/backend/src/services/memory/session-memory.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-agent-identity.service.d.ts +12 -1
- package/dist/cli/backend/src/services/slack/slack-agent-identity.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-agent-identity.service.js +30 -0
- package/dist/cli/backend/src/services/slack/slack-agent-identity.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.d.ts +76 -1
- package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.js +234 -47
- package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/cli/backend/src/services/v3/escalation-router.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/v3/escalation-router.service.js +2 -1
- package/dist/cli/backend/src/services/v3/escalation-router.service.js.map +1 -1
- package/dist/cli/backend/src/services/v3/mission-paths.d.ts +17 -0
- package/dist/cli/backend/src/services/v3/mission-paths.d.ts.map +1 -1
- package/dist/cli/backend/src/services/v3/mission-paths.js +21 -2
- package/dist/cli/backend/src/services/v3/mission-paths.js.map +1 -1
- package/dist/cli/backend/src/services/v3/request.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/v3/request.service.js +2 -1
- package/dist/cli/backend/src/services/v3/request.service.js.map +1 -1
- package/dist/cli/backend/src/services/v3/v3-data.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/v3/v3-data.service.js +2 -1
- package/dist/cli/backend/src/services/v3/v3-data.service.js.map +1 -1
- package/dist/cli/backend/src/types/slack.types.d.ts +141 -2
- package/dist/cli/backend/src/types/slack.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/slack.types.js.map +1 -1
- package/dist/cli/backend/src/types/v2/mission.types.d.ts +2 -0
- package/dist/cli/backend/src/types/v2/mission.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/mission.types.js.map +1 -1
- package/frontend/dist/assets/{index-019817e2.js → index-c87332bf.js} +273 -273
- package/frontend/dist/assets/{index-a56613e7.css → index-f6b4230e.css} +1 -1
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-instance-registry.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-instance-registry.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slack Instance Registry Service — tells Crewly Cloud what this instance
|
|
3
|
+
* can handle, so Slack traffic reaches the right machine.
|
|
4
|
+
*
|
|
5
|
+
* Several OSS instances of one Crewly account may run at once (laptop,
|
|
6
|
+
* VPS, …). Cloud receives every Slack event for the account's workspace and
|
|
7
|
+
* routes it by a registry: which instance owns which team channel and which
|
|
8
|
+
* agent sessions, and which instance is the **primary** (DMs to the master
|
|
9
|
+
* bot and unmapped channels). This service keeps that registry fresh:
|
|
10
|
+
*
|
|
11
|
+
* - `PUT /api/cloud/slack/instances/:instanceId` on boot, on every team
|
|
12
|
+
* save (debounced) and every 5 minutes, with the team → channel mapping
|
|
13
|
+
* from `SlackTeamChannelService` and each team's member session names;
|
|
14
|
+
* - `POST /api/cloud/slack/agents/sync` with the team roster on boot and
|
|
15
|
+
* when a team is created, so Cloud provisions the per-agent apps; the
|
|
16
|
+
* returned `installUrls` (agents still needing their one-time install
|
|
17
|
+
* click) are kept for Settings.
|
|
18
|
+
*
|
|
19
|
+
* `instanceId` is the Cloud device id (`DeviceIdentityService`), the relay
|
|
20
|
+
* `queueId` comes from `CloudSyncService`, and `primary` is
|
|
21
|
+
* `CREWLY_SLACK_PRIMARY=1` or the persisted Settings toggle
|
|
22
|
+
* (`~/.crewly/slack-instance.json`).
|
|
23
|
+
*
|
|
24
|
+
* @module services/slack/slack-instance-registry.service
|
|
25
|
+
*/
|
|
26
|
+
import * as path from 'path';
|
|
27
|
+
import { promises as fs } from 'fs';
|
|
28
|
+
import { getCrewlyHomePath } from '../core/crewly-home.utils.js';
|
|
29
|
+
import { atomicWriteJson, safeReadJson } from '../../utils/file-io.utils.js';
|
|
30
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
31
|
+
import { SLACK_CLOUD_CONSTANTS } from '../../constants.js';
|
|
32
|
+
import { SlackIdentityCloudError } from './slack-agent-identity.service.js';
|
|
33
|
+
import { teamChannelMembers } from './slack-team-channel.service.js';
|
|
34
|
+
/**
|
|
35
|
+
* Read the Crewly version from package.json (best-effort).
|
|
36
|
+
*
|
|
37
|
+
* @returns Version string or 'unknown'
|
|
38
|
+
*/
|
|
39
|
+
async function readCrewlyVersion() {
|
|
40
|
+
try {
|
|
41
|
+
const raw = await fs.readFile(path.join(process.cwd(), 'package.json'), 'utf-8');
|
|
42
|
+
const pkg = JSON.parse(raw);
|
|
43
|
+
return pkg.version || 'unknown';
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return 'unknown';
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Service — see module docs.
|
|
51
|
+
*/
|
|
52
|
+
export class SlackInstanceRegistryService {
|
|
53
|
+
logger;
|
|
54
|
+
deps;
|
|
55
|
+
settingsPath;
|
|
56
|
+
fetchImpl;
|
|
57
|
+
settings = null;
|
|
58
|
+
instanceId = null;
|
|
59
|
+
deviceName = null;
|
|
60
|
+
version = null;
|
|
61
|
+
heartbeatTimer = null;
|
|
62
|
+
debounceTimer = null;
|
|
63
|
+
unsubscribeStorage = null;
|
|
64
|
+
pendingInstalls = [];
|
|
65
|
+
lastHeartbeatAt = null;
|
|
66
|
+
lastError = null;
|
|
67
|
+
started = false;
|
|
68
|
+
/** Consecutive heartbeats skipped because the relay queue was not registered yet */
|
|
69
|
+
queueWaitRetries = 0;
|
|
70
|
+
constructor(deps) {
|
|
71
|
+
this.deps = deps;
|
|
72
|
+
this.settingsPath =
|
|
73
|
+
deps.settingsPath ?? path.join(getCrewlyHomePath(), SLACK_CLOUD_CONSTANTS.INSTANCE_SETTINGS_FILENAME);
|
|
74
|
+
this.fetchImpl = deps.fetchImpl ?? fetch;
|
|
75
|
+
this.logger = LoggerService.getInstance().createComponentLogger('SlackInstanceRegistry');
|
|
76
|
+
}
|
|
77
|
+
// -------------------------------------------------------------------------
|
|
78
|
+
// Lifecycle
|
|
79
|
+
// -------------------------------------------------------------------------
|
|
80
|
+
/**
|
|
81
|
+
* Boot: heartbeat + agent sync now, then heartbeat every 5 minutes and on
|
|
82
|
+
* every team save. Idempotent; never throws (Cloud failures are logged).
|
|
83
|
+
*/
|
|
84
|
+
async start() {
|
|
85
|
+
if (this.started)
|
|
86
|
+
return;
|
|
87
|
+
this.started = true;
|
|
88
|
+
this.unsubscribeStorage = this.deps.storage.onStorageEvent((event) => this.handleStorageEvent(event));
|
|
89
|
+
const setI = this.deps.setInterval ?? setInterval;
|
|
90
|
+
this.heartbeatTimer = setI(() => {
|
|
91
|
+
void this.heartbeat();
|
|
92
|
+
}, SLACK_CLOUD_CONSTANTS.REGISTRY_HEARTBEAT_INTERVAL_MS);
|
|
93
|
+
this.heartbeatTimer.unref?.();
|
|
94
|
+
await this.heartbeat();
|
|
95
|
+
await this.syncAgents();
|
|
96
|
+
}
|
|
97
|
+
/** Undo {@link start}. */
|
|
98
|
+
stop() {
|
|
99
|
+
if (!this.started)
|
|
100
|
+
return;
|
|
101
|
+
this.unsubscribeStorage?.();
|
|
102
|
+
this.unsubscribeStorage = null;
|
|
103
|
+
if (this.heartbeatTimer) {
|
|
104
|
+
(this.deps.clearInterval ?? clearInterval)(this.heartbeatTimer);
|
|
105
|
+
this.heartbeatTimer = null;
|
|
106
|
+
}
|
|
107
|
+
if (this.debounceTimer) {
|
|
108
|
+
(this.deps.clearTimeout ?? clearTimeout)(this.debounceTimer);
|
|
109
|
+
this.debounceTimer = null;
|
|
110
|
+
}
|
|
111
|
+
this.started = false;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* React to team lifecycle: every save re-registers (debounced — status
|
|
115
|
+
* writes fire this too); a created team also provisions its agents.
|
|
116
|
+
*
|
|
117
|
+
* @param event - Storage event
|
|
118
|
+
*/
|
|
119
|
+
async handleStorageEvent(event) {
|
|
120
|
+
if (event.kind === 'team-saved' && event.created) {
|
|
121
|
+
await this.syncAgents();
|
|
122
|
+
}
|
|
123
|
+
this.scheduleHeartbeat();
|
|
124
|
+
}
|
|
125
|
+
// -------------------------------------------------------------------------
|
|
126
|
+
// Cloud calls
|
|
127
|
+
// -------------------------------------------------------------------------
|
|
128
|
+
/**
|
|
129
|
+
* Build the registry payload from the current teams, channel mappings
|
|
130
|
+
* and settings.
|
|
131
|
+
*
|
|
132
|
+
* @returns The `PUT /instances/:id` body
|
|
133
|
+
*/
|
|
134
|
+
async buildPayload() {
|
|
135
|
+
const [{ deviceName }, teams, primary, version] = await Promise.all([
|
|
136
|
+
this.resolveIdentity(),
|
|
137
|
+
this.deps.storage.getTeams(),
|
|
138
|
+
this.isPrimary(),
|
|
139
|
+
this.resolveVersion(),
|
|
140
|
+
]);
|
|
141
|
+
const teamChannels = this.deps.getTeamChannels();
|
|
142
|
+
return {
|
|
143
|
+
deviceName,
|
|
144
|
+
relayQueueId: this.deps.sync.getQueueId() ?? '',
|
|
145
|
+
primary,
|
|
146
|
+
teams: teams.map((team) => {
|
|
147
|
+
const channelId = teamChannels?.findByTeamId(team.id)?.slackChannelId;
|
|
148
|
+
return {
|
|
149
|
+
teamId: team.id,
|
|
150
|
+
name: team.name,
|
|
151
|
+
...(channelId ? { channelId } : {}),
|
|
152
|
+
agents: teamChannelMembers(team).map((m) => m.sessionName),
|
|
153
|
+
};
|
|
154
|
+
}),
|
|
155
|
+
crewlyVersion: version,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* `PUT /api/cloud/slack/instances/:instanceId`. Skipped (false) when not
|
|
160
|
+
* signed in to Cloud or before the relay queue is registered.
|
|
161
|
+
*
|
|
162
|
+
* @returns True when Cloud accepted the registration
|
|
163
|
+
*/
|
|
164
|
+
async heartbeat() {
|
|
165
|
+
if (!this.isAvailable())
|
|
166
|
+
return false;
|
|
167
|
+
if (!this.deps.sync.getQueueId()) {
|
|
168
|
+
// Cloud Sync registers its queue asynchronously right after login;
|
|
169
|
+
// retry on the short debounce a few times, then leave it to the
|
|
170
|
+
// 5-minute cadence (and team saves).
|
|
171
|
+
this.logger.debug('Relay queue not registered yet — skipping Slack registry heartbeat');
|
|
172
|
+
if (this.started && this.queueWaitRetries < SLACK_CLOUD_CONSTANTS.QUEUE_WAIT_MAX_RETRIES) {
|
|
173
|
+
this.queueWaitRetries += 1;
|
|
174
|
+
this.scheduleHeartbeat();
|
|
175
|
+
}
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
try {
|
|
179
|
+
const { deviceId } = await this.resolveIdentity();
|
|
180
|
+
const payload = await this.buildPayload();
|
|
181
|
+
await this.cloudRequest('PUT', `${SLACK_CLOUD_CONSTANTS.INSTANCES_PATH}/${encodeURIComponent(deviceId)}`, payload);
|
|
182
|
+
this.queueWaitRetries = 0;
|
|
183
|
+
this.lastHeartbeatAt = new Date(this.now()).toISOString();
|
|
184
|
+
this.lastError = null;
|
|
185
|
+
this.logger.debug('Slack instance registered', {
|
|
186
|
+
instanceId: deviceId,
|
|
187
|
+
teams: payload.teams.length,
|
|
188
|
+
primary: payload.primary,
|
|
189
|
+
});
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
this.lastError = err instanceof Error ? err.message : String(err);
|
|
194
|
+
this.logger.warn('Slack instance registry heartbeat failed', { error: this.lastError });
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* `POST /api/cloud/slack/agents/sync` with every team's roster; keeps the
|
|
200
|
+
* returned pending install links.
|
|
201
|
+
*
|
|
202
|
+
* @returns Cloud's answer, or null when skipped / failed
|
|
203
|
+
*/
|
|
204
|
+
async syncAgents() {
|
|
205
|
+
if (!this.isAvailable())
|
|
206
|
+
return null;
|
|
207
|
+
try {
|
|
208
|
+
const teams = await this.deps.storage.getTeams();
|
|
209
|
+
const payload = {
|
|
210
|
+
teams: teams.map((team) => ({
|
|
211
|
+
teamId: team.id,
|
|
212
|
+
name: team.name,
|
|
213
|
+
agents: teamChannelMembers(team).map((m) => ({
|
|
214
|
+
agentSession: m.sessionName,
|
|
215
|
+
displayName: m.name || m.sessionName,
|
|
216
|
+
...(m.avatar ? { avatar: m.avatar } : {}),
|
|
217
|
+
})),
|
|
218
|
+
})),
|
|
219
|
+
};
|
|
220
|
+
const result = await this.cloudRequest('POST', SLACK_CLOUD_CONSTANTS.AGENTS_SYNC_PATH, payload);
|
|
221
|
+
this.pendingInstalls = Array.isArray(result?.installUrls)
|
|
222
|
+
? result.installUrls.filter((u) => u && typeof u.agentSession === 'string' && typeof u.url === 'string')
|
|
223
|
+
: [];
|
|
224
|
+
this.lastError = null;
|
|
225
|
+
if (this.pendingInstalls.length > 0) {
|
|
226
|
+
this.logger.info('Slack agent apps waiting for their install click', {
|
|
227
|
+
agents: this.pendingInstalls.map((p) => p.agentSession),
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
return { installUrls: [...this.pendingInstalls] };
|
|
231
|
+
}
|
|
232
|
+
catch (err) {
|
|
233
|
+
this.lastError = err instanceof Error ? err.message : String(err);
|
|
234
|
+
this.logger.warn('Slack agent sync failed', { error: this.lastError });
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
// -------------------------------------------------------------------------
|
|
239
|
+
// Primary flag
|
|
240
|
+
// -------------------------------------------------------------------------
|
|
241
|
+
/**
|
|
242
|
+
* Whether this instance is the account's primary: `CREWLY_SLACK_PRIMARY`
|
|
243
|
+
* (`1`/`true`) wins, otherwise the persisted Settings toggle.
|
|
244
|
+
*
|
|
245
|
+
* @returns True when primary
|
|
246
|
+
*/
|
|
247
|
+
async isPrimary() {
|
|
248
|
+
const raw = ((this.deps.env ?? process.env)[SLACK_CLOUD_CONSTANTS.PRIMARY_ENV_VAR] ?? '').trim().toLowerCase();
|
|
249
|
+
if (raw === '1' || raw === 'true')
|
|
250
|
+
return true;
|
|
251
|
+
const settings = await this.loadSettings();
|
|
252
|
+
return settings.primary;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Persist the Settings toggle and re-register immediately so Cloud moves
|
|
256
|
+
* the flag (it clears `primary` on the account's other instances).
|
|
257
|
+
*
|
|
258
|
+
* @param primary - The new value
|
|
259
|
+
*/
|
|
260
|
+
async setPrimary(primary) {
|
|
261
|
+
const settings = await this.loadSettings();
|
|
262
|
+
settings.primary = primary;
|
|
263
|
+
await fs.mkdir(path.dirname(this.settingsPath), { recursive: true });
|
|
264
|
+
await atomicWriteJson(this.settingsPath, settings);
|
|
265
|
+
await this.heartbeat();
|
|
266
|
+
}
|
|
267
|
+
// -------------------------------------------------------------------------
|
|
268
|
+
// Read model
|
|
269
|
+
// -------------------------------------------------------------------------
|
|
270
|
+
/**
|
|
271
|
+
* Agents still needing their one-time install click (from the last sync).
|
|
272
|
+
*
|
|
273
|
+
* @returns Copies
|
|
274
|
+
*/
|
|
275
|
+
getPendingInstalls() {
|
|
276
|
+
return this.pendingInstalls.map((p) => ({ ...p }));
|
|
277
|
+
}
|
|
278
|
+
/** @returns The Cloud device id once resolved */
|
|
279
|
+
getInstanceId() {
|
|
280
|
+
return this.instanceId;
|
|
281
|
+
}
|
|
282
|
+
/** @returns ISO timestamp of the last accepted heartbeat */
|
|
283
|
+
getLastHeartbeatAt() {
|
|
284
|
+
return this.lastHeartbeatAt;
|
|
285
|
+
}
|
|
286
|
+
/** @returns Last Cloud failure, if the most recent call failed */
|
|
287
|
+
getLastError() {
|
|
288
|
+
return this.lastError;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Whether Cloud can be reached.
|
|
292
|
+
*
|
|
293
|
+
* @returns True when signed in with a token and url
|
|
294
|
+
*/
|
|
295
|
+
isAvailable() {
|
|
296
|
+
return this.deps.cloud.isConnected() && !!this.deps.cloud.getToken() && !!this.deps.cloud.getCloudUrl();
|
|
297
|
+
}
|
|
298
|
+
// -------------------------------------------------------------------------
|
|
299
|
+
// Internals
|
|
300
|
+
// -------------------------------------------------------------------------
|
|
301
|
+
scheduleHeartbeat() {
|
|
302
|
+
if (this.debounceTimer)
|
|
303
|
+
return;
|
|
304
|
+
const setT = this.deps.setTimeout ?? setTimeout;
|
|
305
|
+
this.debounceTimer = setT(() => {
|
|
306
|
+
this.debounceTimer = null;
|
|
307
|
+
void this.heartbeat();
|
|
308
|
+
}, SLACK_CLOUD_CONSTANTS.TEAM_SAVED_DEBOUNCE_MS);
|
|
309
|
+
this.debounceTimer.unref?.();
|
|
310
|
+
}
|
|
311
|
+
async resolveIdentity() {
|
|
312
|
+
if (this.instanceId && this.deviceName)
|
|
313
|
+
return { deviceId: this.instanceId, deviceName: this.deviceName };
|
|
314
|
+
const identity = await this.deps.identity.getOrCreateIdentity();
|
|
315
|
+
this.instanceId = identity.deviceId;
|
|
316
|
+
this.deviceName = identity.deviceName;
|
|
317
|
+
return identity;
|
|
318
|
+
}
|
|
319
|
+
async resolveVersion() {
|
|
320
|
+
if (this.version)
|
|
321
|
+
return this.version;
|
|
322
|
+
this.version = this.deps.version ?? (await readCrewlyVersion());
|
|
323
|
+
return this.version;
|
|
324
|
+
}
|
|
325
|
+
async loadSettings() {
|
|
326
|
+
if (this.settings)
|
|
327
|
+
return this.settings;
|
|
328
|
+
const raw = await safeReadJson(this.settingsPath, null);
|
|
329
|
+
this.settings = { version: 1, primary: raw?.primary === true };
|
|
330
|
+
return this.settings;
|
|
331
|
+
}
|
|
332
|
+
now() {
|
|
333
|
+
return this.deps.now?.() ?? Date.now();
|
|
334
|
+
}
|
|
335
|
+
async cloudRequest(method, suffix, body) {
|
|
336
|
+
const token = this.deps.cloud.getToken();
|
|
337
|
+
const base = this.deps.cloud.getCloudUrl();
|
|
338
|
+
if (!token || !base) {
|
|
339
|
+
throw new SlackIdentityCloudError(401, 'not_logged_in', 'Not logged in to Crewly Cloud');
|
|
340
|
+
}
|
|
341
|
+
const url = `${base.replace(/\/$/, '')}${SLACK_CLOUD_CONSTANTS.CLOUD_PATH}${suffix}`;
|
|
342
|
+
const controller = new AbortController();
|
|
343
|
+
const timer = setTimeout(() => controller.abort(), SLACK_CLOUD_CONSTANTS.REQUEST_TIMEOUT_MS);
|
|
344
|
+
try {
|
|
345
|
+
const res = await this.fetchImpl(url, {
|
|
346
|
+
method,
|
|
347
|
+
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
|
|
348
|
+
body: JSON.stringify(body),
|
|
349
|
+
signal: controller.signal,
|
|
350
|
+
});
|
|
351
|
+
const text = await res.text();
|
|
352
|
+
let parsed = {};
|
|
353
|
+
try {
|
|
354
|
+
parsed = JSON.parse(text);
|
|
355
|
+
}
|
|
356
|
+
catch {
|
|
357
|
+
parsed = {};
|
|
358
|
+
}
|
|
359
|
+
if (!res.ok || parsed.success !== true) {
|
|
360
|
+
throw new SlackIdentityCloudError(res.status, parsed.code ?? `http_${res.status}`, parsed.error ?? `Cloud request failed (${res.status})`);
|
|
361
|
+
}
|
|
362
|
+
return parsed.data;
|
|
363
|
+
}
|
|
364
|
+
catch (err) {
|
|
365
|
+
if (err instanceof SlackIdentityCloudError)
|
|
366
|
+
throw err;
|
|
367
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
368
|
+
throw new SlackIdentityCloudError(502, 'network', `Cloud unreachable: ${message}`);
|
|
369
|
+
}
|
|
370
|
+
finally {
|
|
371
|
+
clearTimeout(timer);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
let instance = null;
|
|
376
|
+
/**
|
|
377
|
+
* Install the process-wide instance (composition root).
|
|
378
|
+
*
|
|
379
|
+
* @param service - The service or null
|
|
380
|
+
*/
|
|
381
|
+
export function setSlackInstanceRegistryService(service) {
|
|
382
|
+
instance = service;
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* The process-wide instance, or null before wiring.
|
|
386
|
+
*
|
|
387
|
+
* @returns The service or null
|
|
388
|
+
*/
|
|
389
|
+
export function getSlackInstanceRegistryService() {
|
|
390
|
+
return instance;
|
|
391
|
+
}
|
|
392
|
+
//# sourceMappingURL=slack-instance-registry.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-instance-registry.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack-instance-registry.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* @module services/slack
|
|
8
8
|
*/
|
|
9
9
|
import { EventEmitter } from 'events';
|
|
10
|
-
import type { SlackConfig, SlackIncomingMessage, SlackOutgoingMessage, SlackServiceStatus, SlackConversationContext, SlackNotification, SlackBlock, SlackChannelInfo } from '../../types/slack.types.js';
|
|
10
|
+
import type { SlackConfig, SlackIncomingMessage, SlackOutgoingMessage, SlackServiceStatus, SlackConversationContext, SlackNotification, SlackBlock, SlackChannelInfo, SlackTransport, SlackRawInboundEvent, SlackInboundMeta, SlackCloudEventEnvelope } from '../../types/slack.types.js';
|
|
11
11
|
/**
|
|
12
12
|
* Events emitted by SlackService
|
|
13
13
|
*/
|
|
@@ -29,6 +29,21 @@ interface FileUploadOptions {
|
|
|
29
29
|
initialComment?: string;
|
|
30
30
|
threadTs?: string;
|
|
31
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* The slice of CloudSyncService the cloud transport listens on: relay
|
|
34
|
+
* messages of type `slack_event` carry a {@link SlackCloudEventEnvelope}.
|
|
35
|
+
*/
|
|
36
|
+
export interface SlackCloudEventSource {
|
|
37
|
+
on(event: 'message', handler: (msg: SlackCloudRelayMessage) => void): unknown;
|
|
38
|
+
off(event: 'message', handler: (msg: SlackCloudRelayMessage) => void): unknown;
|
|
39
|
+
}
|
|
40
|
+
/** Minimal relay message shape (see `cloud-sync.types.ts` IncomingMessage). */
|
|
41
|
+
export interface SlackCloudRelayMessage {
|
|
42
|
+
id?: string;
|
|
43
|
+
type: string;
|
|
44
|
+
payload: unknown;
|
|
45
|
+
fromDeviceName?: string;
|
|
46
|
+
}
|
|
32
47
|
/**
|
|
33
48
|
* SlackService class for managing Slack bot operations
|
|
34
49
|
*/
|
|
@@ -67,13 +82,73 @@ export declare class SlackService extends EventEmitter {
|
|
|
67
82
|
private lastPingAt;
|
|
68
83
|
/** Number of consecutive health-check ping failures */
|
|
69
84
|
private consecutivePingFailures;
|
|
85
|
+
/** Inbound transport the service was initialised with */
|
|
86
|
+
private transport;
|
|
87
|
+
/** Relay source the cloud transport is attached to (see attachCloudTransport) */
|
|
88
|
+
private cloudSource;
|
|
89
|
+
/** Bound relay listener so it can be detached */
|
|
90
|
+
private cloudListener;
|
|
70
91
|
/**
|
|
71
92
|
* Initialize the Slack service with configuration
|
|
72
93
|
*
|
|
94
|
+
* With `config.transport === 'cloud'` no Socket Mode connection is opened:
|
|
95
|
+
* Crewly Cloud owns the Slack app and pushes events through the relay (see
|
|
96
|
+
* {@link attachCloudTransport}); only a Web API client is created for
|
|
97
|
+
* outbound calls, and the service reports connected as soon as a bot
|
|
98
|
+
* token is present.
|
|
99
|
+
*
|
|
73
100
|
* @param config - Slack bot configuration
|
|
74
101
|
* @returns Promise that resolves when connected
|
|
75
102
|
*/
|
|
76
103
|
initialize(config: SlackConfig): Promise<void>;
|
|
104
|
+
/**
|
|
105
|
+
* Cloud transport bootstrap: build a bare Web API client from the bot
|
|
106
|
+
* token (no Bolt app, no socket, no reconnect loop). The bot user id from
|
|
107
|
+
* the Cloud config seeds the cache so routing never needs `auth.test`.
|
|
108
|
+
*
|
|
109
|
+
* @param config - Config with `transport: 'cloud'`
|
|
110
|
+
* @throws When the Web API client cannot be constructed
|
|
111
|
+
*/
|
|
112
|
+
private initializeCloudTransport;
|
|
113
|
+
/**
|
|
114
|
+
* The inbound transport this service was initialised with.
|
|
115
|
+
*
|
|
116
|
+
* @returns `socket` (Bolt Socket Mode) or `cloud` (relay push)
|
|
117
|
+
*/
|
|
118
|
+
getTransport(): SlackTransport;
|
|
119
|
+
/**
|
|
120
|
+
* Shared inbound handler for both transports. Turns a raw Slack `message`
|
|
121
|
+
* or `app_mention` event into a {@link SlackIncomingMessage}, applies the
|
|
122
|
+
* allow-list, bumps counters and emits `message` — exactly what the Socket
|
|
123
|
+
* Mode listeners did before the split, so a Cloud-pushed event routes the
|
|
124
|
+
* same way as one received over the socket.
|
|
125
|
+
*
|
|
126
|
+
* @param event - Raw Slack event object
|
|
127
|
+
* @param meta - Which transport delivered it (defaults to `socket`)
|
|
128
|
+
* @returns The emitted message, or null when the event was dropped
|
|
129
|
+
*/
|
|
130
|
+
handleInboundEvent(event: SlackRawInboundEvent, meta?: SlackInboundMeta): SlackIncomingMessage | null;
|
|
131
|
+
/**
|
|
132
|
+
* Cloud transport entry point: unwrap a `slack_event` envelope and hand
|
|
133
|
+
* the raw event to {@link handleInboundEvent}. Reproduces what Bolt does
|
|
134
|
+
* for free on the socket path — its `ignoreSelf` middleware and the
|
|
135
|
+
* subtype filtering — so the master bot never reacts to its own posts and
|
|
136
|
+
* edits/joins/bot chatter never reach routing.
|
|
137
|
+
*
|
|
138
|
+
* @param envelope - The relay message `data`
|
|
139
|
+
* @returns The emitted message, or null when dropped
|
|
140
|
+
*/
|
|
141
|
+
handleCloudEnvelope(envelope: SlackCloudEventEnvelope): SlackIncomingMessage | null;
|
|
142
|
+
/**
|
|
143
|
+
* Subscribe to a relay source (CloudSyncService) and route every
|
|
144
|
+
* `slack_event` message into {@link handleCloudEnvelope}. Idempotent —
|
|
145
|
+
* re-attaching replaces the previous subscription.
|
|
146
|
+
*
|
|
147
|
+
* @param source - Emitter of relay `message` events
|
|
148
|
+
*/
|
|
149
|
+
attachCloudTransport(source: SlackCloudEventSource): void;
|
|
150
|
+
/** Undo {@link attachCloudTransport}. */
|
|
151
|
+
detachCloudTransport(): void;
|
|
77
152
|
/**
|
|
78
153
|
* Set up Slack event handlers
|
|
79
154
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,KAAK,EACV,WAAW,EACX,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,wBAAwB,EACxB,iBAAiB,EACjB,UAAU,EAEV,gBAAgB,
|
|
1
|
+
{"version":3,"file":"slack.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/slack/slack.service.ts"],"names":[],"mappings":"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"}
|