crewly 1.9.0 → 1.11.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 +53 -2
- package/config/skills/agent/core/get-sops/SKILL.md +6 -2
- package/config/skills/agent/core/get-sops/execute.sh +26 -1
- package/config/skills/agent/core/get-team-norms/SKILL.md +69 -0
- package/config/skills/agent/core/list-my-crons/SKILL.md +67 -0
- package/config/skills/agent/core/list-my-crons/execute.sh +77 -0
- package/config/skills/agent/core/schedule-followup/SKILL.md +13 -0
- package/config/skills/agent/core/update-sop/SKILL.md +73 -0
- package/config/skills/agent/core/update-sop/execute.sh +115 -0
- package/config/skills/agent/core/update-team-norm/SKILL.md +67 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts +2 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js +50 -1
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.d.ts +2 -0
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.js +6 -2
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.js +10 -0
- package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/system/system.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/system/system.controller.js +2 -1
- package/dist/backend/backend/src/controllers/system/system.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +29 -5
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +106 -9
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts +17 -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 +32 -0
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/wiki/wiki.controller.d.ts +45 -0
- package/dist/backend/backend/src/controllers/wiki/wiki.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/wiki/wiki.controller.js +364 -46
- package/dist/backend/backend/src/controllers/wiki/wiki.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/wiki/wiki.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/wiki/wiki.routes.js +9 -1
- package/dist/backend/backend/src/controllers/wiki/wiki.routes.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +80 -73
- 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 +12 -6
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +13 -4
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +47 -11
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.providers.d.ts +28 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.providers.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.providers.js +49 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.providers.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +60 -2
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +93 -3
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/legacy-dto.utils.d.ts +25 -0
- package/dist/backend/backend/src/services/chat-v2/legacy-dto.utils.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/legacy-dto.utils.js +33 -0
- package/dist/backend/backend/src/services/chat-v2/legacy-dto.utils.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts +28 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js +48 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/channel.store.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +21 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +30 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/types.d.ts +14 -0
- package/dist/backend/backend/src/services/chat-v2/types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/types.js.map +1 -1
- package/dist/backend/backend/src/services/core/retry.util.d.ts +67 -0
- package/dist/backend/backend/src/services/core/retry.util.d.ts.map +1 -0
- package/dist/backend/backend/src/services/core/retry.util.js +62 -0
- package/dist/backend/backend/src/services/core/retry.util.js.map +1 -0
- package/dist/backend/backend/src/services/index.d.ts +0 -1
- package/dist/backend/backend/src/services/index.d.ts.map +1 -1
- package/dist/backend/backend/src/services/index.js +0 -1
- package/dist/backend/backend/src/services/index.js.map +1 -1
- package/dist/backend/backend/src/services/intent-task/intent-task-follow-up.service.d.ts +26 -108
- package/dist/backend/backend/src/services/intent-task/intent-task-follow-up.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/intent-task/intent-task-follow-up.service.js +26 -214
- package/dist/backend/backend/src/services/intent-task/intent-task-follow-up.service.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts +11 -0
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +69 -12
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts +10 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +21 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.d.ts +12 -0
- package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.js +53 -1
- package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/backend/backend/src/services/sop/sop.service.d.ts +10 -0
- package/dist/backend/backend/src/services/sop/sop.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/sop/sop.service.js +71 -10
- package/dist/backend/backend/src/services/sop/sop.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/sop-catalog.service.d.ts +83 -0
- package/dist/backend/backend/src/services/wiki/sop-catalog.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/sop-catalog.service.js +185 -0
- package/dist/backend/backend/src/services/wiki/sop-catalog.service.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.js +12 -0
- package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-overlay.resolver.d.ts +43 -0
- package/dist/backend/backend/src/services/wiki/wiki-overlay.resolver.d.ts.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-overlay.resolver.js +67 -0
- package/dist/backend/backend/src/services/wiki/wiki-overlay.resolver.js.map +1 -0
- package/dist/backend/backend/src/services/wiki/wiki-search.service.d.ts +79 -19
- package/dist/backend/backend/src/services/wiki/wiki-search.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-search.service.js +275 -106
- package/dist/backend/backend/src/services/wiki/wiki-search.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 +13 -0
- package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js.map +1 -1
- package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts +13 -0
- package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/workflow/cron-task.service.js +77 -8
- package/dist/backend/backend/src/services/workflow/cron-task.service.js.map +1 -1
- package/dist/backend/backend/src/types/sop.types.d.ts +7 -0
- package/dist/backend/backend/src/types/sop.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/sop.types.js.map +1 -1
- package/dist/backend/backend/src/types/v2/work-item.types.d.ts +7 -0
- package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/work-item.types.js +1 -1
- package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
- package/dist/cli/backend/src/types/sop.types.d.ts +7 -0
- package/dist/cli/backend/src/types/sop.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/sop.types.js.map +1 -1
- package/dist/cli/backend/src/types/v2/work-item.types.d.ts +7 -0
- package/dist/cli/backend/src/types/v2/work-item.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/work-item.types.js +1 -1
- package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
- package/frontend/dist/assets/index-4099a91c.js +4961 -0
- package/frontend/dist/assets/index-44266b5d.css +42 -0
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/frontend/dist/assets/index-068bb4f6.css +0 -42
- package/frontend/dist/assets/index-c24ceb15.js +0 -4960
|
@@ -8,14 +8,14 @@
|
|
|
8
8
|
* → controller broadcasts WS message frame (user bubble)
|
|
9
9
|
* → controller calls ChatV2Dispatcher.dispatchToAgent(channel, messageDTO)
|
|
10
10
|
* → sendMessageToAgent(agent_session, "[CHAT:<id>] <content>\n<hint>")
|
|
11
|
-
* → agent processes + calls `reply-
|
|
11
|
+
* → agent processes + calls `reply-chat` skill
|
|
12
12
|
* → skill POSTs back to /api/chat/channels/:id/messages as the agent
|
|
13
13
|
* → same controller path → WS message frame (agent bubble)
|
|
14
14
|
*
|
|
15
15
|
* This service is intentionally thin — a couple of dozen lines of glue
|
|
16
16
|
* around the AgentRegistrationService's `sendMessageToAgent` primitive.
|
|
17
17
|
* The dispatch prompt is extracted so tests can assert the format, which
|
|
18
|
-
* is the contract the `reply-
|
|
18
|
+
* is the contract the `reply-chat` skill relies on.
|
|
19
19
|
*
|
|
20
20
|
* @module services/chat-v2/chat-v2.dispatcher.service
|
|
21
21
|
*/
|
|
@@ -109,7 +109,7 @@ export interface ChatV2DispatcherOptions {
|
|
|
109
109
|
agentSink: AgentMessageSink;
|
|
110
110
|
/**
|
|
111
111
|
* Override the prompt formatter for tests / future customization. The
|
|
112
|
-
* default matches the `reply-
|
|
112
|
+
* default matches the `reply-chat` skill's parser exactly.
|
|
113
113
|
*/
|
|
114
114
|
formatPrompt?: (args: FormatPromptArgs) => string;
|
|
115
115
|
/**
|
|
@@ -132,6 +132,14 @@ export interface ChatV2DispatcherOptions {
|
|
|
132
132
|
* Order doesn't matter — the dispatcher loops over the whole list.
|
|
133
133
|
*/
|
|
134
134
|
huddleMembersFor?: (channelId: string) => readonly string[];
|
|
135
|
+
/**
|
|
136
|
+
* Activate-on-send hook. When a DM dispatch fails because the agent's
|
|
137
|
+
* session doesn't exist (inactive), the dispatcher calls this to start the
|
|
138
|
+
* agent, then retries delivery once. Returns true when the agent is now
|
|
139
|
+
* active. User-initiated, so it bypasses the orchestrator wake-gate by
|
|
140
|
+
* design. When omitted, inactive sends just queue (legacy behavior).
|
|
141
|
+
*/
|
|
142
|
+
activateAgent?: (agentSession: string) => Promise<boolean>;
|
|
135
143
|
}
|
|
136
144
|
/** Inputs to the prompt formatter. */
|
|
137
145
|
export interface FormatPromptArgs {
|
|
@@ -155,7 +163,7 @@ export interface FormatPromptArgs {
|
|
|
155
163
|
* Default prompt formatter the agent sees when a user sends in their
|
|
156
164
|
* chat channel.
|
|
157
165
|
*
|
|
158
|
-
* Format is intentionally stable and tag-prefixed so the `reply-
|
|
166
|
+
* Format is intentionally stable and tag-prefixed so the `reply-chat`
|
|
159
167
|
* skill (and future tooling) can reliably extract the channelId without
|
|
160
168
|
* regex ambiguity. The `回复:` hint line gives the agent a one-step
|
|
161
169
|
* instruction on how to reply.
|
|
@@ -171,6 +179,7 @@ export declare class ChatV2DispatcherService {
|
|
|
171
179
|
private readonly formatPrompt;
|
|
172
180
|
private readonly mentionResolver?;
|
|
173
181
|
private readonly huddleMembersFor?;
|
|
182
|
+
private readonly activateAgent?;
|
|
174
183
|
private readonly logger;
|
|
175
184
|
constructor(options: ChatV2DispatcherOptions);
|
|
176
185
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-v2.dispatcher.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/chat-v2/chat-v2.dispatcher.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,KAAK,EACV,qBAAqB,EAErB,aAAa,EACd,MAAM,+BAA+B,CAAC;AAOvC;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,kBAAkB,CAChB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACtF;AAED,4CAA4C;AAC5C,MAAM,WAAW,cAAc;IAC7B,8EAA8E;IAC9E,UAAU,EAAE,OAAO,CAAC;IACpB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,+DAA+D;AAC/D,MAAM,WAAW,sBAAsB;IACrC,iEAAiE;IACjE,MAAM,EAAE,aAAa,CAAC;IACtB,6EAA6E;IAC7E,UAAU,EAAE,OAAO,CAAC;IACpB,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,qBAAqB;IACpC,mCAAmC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,YAAY,EAAE,UAAU,GAAG,UAAU,CAAC;IACtC,iEAAiE;IACjE,UAAU,EAAE,OAAO,CAAC;IACpB,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;;;OAMG;IACH,QAAQ,EAAE,IAAI,GAAG,kBAAkB,GAAG,kBAAkB,GAAG,MAAM,CAAC;IAClE,4DAA4D;IAC5D,UAAU,EAAE,OAAO,CAAC;IACpB,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B;;;OAGG;IACH,eAAe,CAAC,EAAE,sBAAsB,EAAE,CAAC;IAC3C;;;;OAIG;IACH,cAAc,CAAC,EAAE,qBAAqB,EAAE,CAAC;CAC1C;AAED,+DAA+D;AAC/D,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,gBAAgB,CAAC;IAC5B;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,MAAM,CAAC;IAClD;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,qBAAqB,CAAC;IACxC;;;;;;;;;OASG;IACH,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,SAAS,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-v2.dispatcher.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/chat-v2/chat-v2.dispatcher.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,14 +8,14 @@
|
|
|
8
8
|
* → controller broadcasts WS message frame (user bubble)
|
|
9
9
|
* → controller calls ChatV2Dispatcher.dispatchToAgent(channel, messageDTO)
|
|
10
10
|
* → sendMessageToAgent(agent_session, "[CHAT:<id>] <content>\n<hint>")
|
|
11
|
-
* → agent processes + calls `reply-
|
|
11
|
+
* → agent processes + calls `reply-chat` skill
|
|
12
12
|
* → skill POSTs back to /api/chat/channels/:id/messages as the agent
|
|
13
13
|
* → same controller path → WS message frame (agent bubble)
|
|
14
14
|
*
|
|
15
15
|
* This service is intentionally thin — a couple of dozen lines of glue
|
|
16
16
|
* around the AgentRegistrationService's `sendMessageToAgent` primitive.
|
|
17
17
|
* The dispatch prompt is extracted so tests can assert the format, which
|
|
18
|
-
* is the contract the `reply-
|
|
18
|
+
* is the contract the `reply-chat` skill relies on.
|
|
19
19
|
*
|
|
20
20
|
* @module services/chat-v2/chat-v2.dispatcher.service
|
|
21
21
|
*/
|
|
@@ -27,7 +27,7 @@ import { LoggerService } from '../core/logger.service.js';
|
|
|
27
27
|
* Default prompt formatter the agent sees when a user sends in their
|
|
28
28
|
* chat channel.
|
|
29
29
|
*
|
|
30
|
-
* Format is intentionally stable and tag-prefixed so the `reply-
|
|
30
|
+
* Format is intentionally stable and tag-prefixed so the `reply-chat`
|
|
31
31
|
* skill (and future tooling) can reliably extract the channelId without
|
|
32
32
|
* regex ambiguity. The `回复:` hint line gives the agent a one-step
|
|
33
33
|
* instruction on how to reply.
|
|
@@ -41,8 +41,8 @@ export function defaultFormatPrompt(args) {
|
|
|
41
41
|
// to "optional" for non-@'d members.
|
|
42
42
|
const mode = responseMode ?? 'required';
|
|
43
43
|
const replyHint = mode === 'optional'
|
|
44
|
-
? `回复本频道: 你在此 huddle 中收到此消息但未被 @ — 如有必要可用 \`reply-
|
|
45
|
-
: `回复本频道: 用 \`reply-
|
|
44
|
+
? `回复本频道: 你在此 huddle 中收到此消息但未被 @ — 如有必要可用 \`reply-chat\` skill (conversationId="${channelId}") 回复,否则不回复也可以。`
|
|
45
|
+
: `回复本频道: 用 \`reply-chat\` skill, 参数 conversationId="${channelId}"、content="<your reply>"。`;
|
|
46
46
|
return [
|
|
47
47
|
`[CHAT:${channelId}]${idHint} <${senderId}@${channelName}>`,
|
|
48
48
|
``,
|
|
@@ -65,12 +65,14 @@ export class ChatV2DispatcherService {
|
|
|
65
65
|
formatPrompt;
|
|
66
66
|
mentionResolver;
|
|
67
67
|
huddleMembersFor;
|
|
68
|
+
activateAgent;
|
|
68
69
|
logger;
|
|
69
70
|
constructor(options) {
|
|
70
71
|
this.agentSink = options.agentSink;
|
|
71
72
|
this.formatPrompt = options.formatPrompt ?? defaultFormatPrompt;
|
|
72
73
|
this.mentionResolver = options.mentionResolver;
|
|
73
74
|
this.huddleMembersFor = options.huddleMembersFor;
|
|
75
|
+
this.activateAgent = options.activateAgent;
|
|
74
76
|
this.logger = LoggerService.getInstance().createComponentLogger('ChatV2Dispatcher');
|
|
75
77
|
}
|
|
76
78
|
/**
|
|
@@ -354,12 +356,46 @@ export class ChatV2DispatcherService {
|
|
|
354
356
|
return { dispatched: false, error: errMsg };
|
|
355
357
|
}
|
|
356
358
|
if (!result.success) {
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
359
|
+
// Auto-activate on send: the agent's session doesn't exist (inactive).
|
|
360
|
+
// When an activation hook is wired, start the agent and retry delivery
|
|
361
|
+
// once — so messaging an offline agent wakes it and delivers, instead
|
|
362
|
+
// of silently queueing. This is user-initiated, so it bypasses the
|
|
363
|
+
// orchestrator wake-gate by design.
|
|
364
|
+
if (this.activateAgent) {
|
|
365
|
+
this.logger.info('chat-v2 dispatch: agent inactive — activating on send', {
|
|
366
|
+
channelId: channel.id,
|
|
367
|
+
agentSession: channel.agentSession,
|
|
368
|
+
});
|
|
369
|
+
let activated = false;
|
|
370
|
+
try {
|
|
371
|
+
activated = await this.activateAgent(channel.agentSession);
|
|
372
|
+
}
|
|
373
|
+
catch (err) {
|
|
374
|
+
this.logger.warn('chat-v2 activate-on-send failed', {
|
|
375
|
+
agentSession: channel.agentSession,
|
|
376
|
+
err: err instanceof Error ? err.message : String(err),
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
if (activated) {
|
|
380
|
+
try {
|
|
381
|
+
result = await this.agentSink.sendMessageToAgent(channel.agentSession, prompt);
|
|
382
|
+
}
|
|
383
|
+
catch (err) {
|
|
384
|
+
return {
|
|
385
|
+
dispatched: false,
|
|
386
|
+
error: err instanceof Error ? err.message : String(err),
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
if (!result.success) {
|
|
392
|
+
this.logger.warn('chat-v2 dispatch reported failure', {
|
|
393
|
+
channelId: channel.id,
|
|
394
|
+
agentSession: channel.agentSession,
|
|
395
|
+
err: result.error,
|
|
396
|
+
});
|
|
397
|
+
return { dispatched: false, error: result.error ?? 'unknown sink failure' };
|
|
398
|
+
}
|
|
363
399
|
}
|
|
364
400
|
this.logger.debug('chat-v2 dispatched', {
|
|
365
401
|
channelId: channel.id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-v2.dispatcher.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/chat-v2/chat-v2.dispatcher.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAQH,OAAO,EAAE,aAAa,EAAmB,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-v2.dispatcher.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/chat-v2/chat-v2.dispatcher.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -111,4 +111,32 @@ export declare function createOssAgentPresenceProvider(storage: IStorageServiceL
|
|
|
111
111
|
isAgentActive?: IsAgentActiveFn;
|
|
112
112
|
now?: () => number;
|
|
113
113
|
}): IAgentPresenceProvider;
|
|
114
|
+
/**
|
|
115
|
+
* SYNCHRONOUS presence for the channel-LIST path.
|
|
116
|
+
*
|
|
117
|
+
* `ChatV2Service.toChannelDTO` is synchronous and `listChannels` builds many
|
|
118
|
+
* DTOs at once, so the channel rows (which drive the DM presence dots) need a
|
|
119
|
+
* sync `getPresence`. The async {@link createOssAgentPresenceProvider} backs
|
|
120
|
+
* the richer `/presence/:id` endpoint, but it was never wired into the service
|
|
121
|
+
* — so every DM dot fell back to `DEFAULT_PRESENCE` ('offline') regardless of
|
|
122
|
+
* whether the agent was actually running.
|
|
123
|
+
*
|
|
124
|
+
* This factory returns a sync presence keyed on runtime liveness — the SAME
|
|
125
|
+
* "is the agent's child process alive" signal behind the Dashboard's
|
|
126
|
+
* "Running Agents" count (`isAgentActive` → `getSessionBackendSync`) — so a DM
|
|
127
|
+
* dot turns green exactly when the agent is running. Busy/idle refinement needs
|
|
128
|
+
* the async team-status read and stays in the `/presence` provider; here online
|
|
129
|
+
* vs offline is what the dot needs.
|
|
130
|
+
*
|
|
131
|
+
* @param opts.isAliveSync - Liveness override (tests pass a stub).
|
|
132
|
+
* @param opts.now - Clock override (tests freeze `lastSeenAt`).
|
|
133
|
+
* @returns A sync `(agentSession) => { status, lastSeenAt }` for `getPresence`.
|
|
134
|
+
*/
|
|
135
|
+
export declare function createOssSyncPresence(opts?: {
|
|
136
|
+
isAliveSync?: (agentSession: string) => boolean;
|
|
137
|
+
now?: () => number;
|
|
138
|
+
}): (agentSession: string) => {
|
|
139
|
+
status: ChatAgentPresenceDTO['status'];
|
|
140
|
+
lastSeenAt: number | null;
|
|
141
|
+
};
|
|
114
142
|
//# sourceMappingURL=chat-v2.providers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-v2.providers.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/chat-v2/chat-v2.providers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EACV,uBAAuB,EACvB,sBAAsB,EACtB,oBAAoB,EACrB,MAAM,iDAAiD,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-v2.providers.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/chat-v2/chat-v2.providers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EACV,uBAAuB,EACvB,sBAAsB,EACtB,oBAAoB,EACrB,MAAM,iDAAiD,CAAC;AAGzD;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,IAAI,OAAO,CACjB,KAAK,CAAC;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,KAAK,CAAC;YACb,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,IAAI,EAAE,MAAM,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,WAAW,EAAE,MAAM,CAAC;YACpB,aAAa,EAAE,MAAM,CAAC;YACtB,MAAM,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC,CAAC;KACJ,CAAC,CACH,CAAC;CACH;AAED;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAExE;;;;;;;;;;GAUG;AACH,MAAM,MAAM,0BAA0B,GAAG,MAAM,OAAO,CAAC;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,IAAI,CAAC,CAAC;AAEV;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,mBAAmB,EAC5B,IAAI,GAAE;IACJ,yBAAyB,CAAC,EAAE,0BAA0B,CAAC;CACnD,GACL,uBAAuB,CA2DzB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,OAAO,EACjB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,GACpB,oBAAoB,CAAC,QAAQ,CAAC,CAOhC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,mBAAmB,EAC5B,IAAI,GAAE;IACJ,aAAa,CAAC,EAAE,eAAe,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACf,GACL,sBAAsB,CAiDxB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,GAAE;IAC1C,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;IAChD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACf,GAAG,CAAC,YAAY,EAAE,MAAM,KAAK;IAAE,MAAM,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CA2BvG"}
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
*
|
|
20
20
|
* @module services/chat-v2/chat-v2.providers
|
|
21
21
|
*/
|
|
22
|
+
import { getSessionBackendSync } from '../session/index.js';
|
|
22
23
|
/**
|
|
23
24
|
* Build the production `IAgentDirectoryProvider`. Flattens
|
|
24
25
|
* `StorageService.getTeams()` into the narrow controller-facing shape,
|
|
@@ -179,4 +180,52 @@ export function createOssAgentPresenceProvider(storage, opts = {}) {
|
|
|
179
180
|
},
|
|
180
181
|
};
|
|
181
182
|
}
|
|
183
|
+
/**
|
|
184
|
+
* SYNCHRONOUS presence for the channel-LIST path.
|
|
185
|
+
*
|
|
186
|
+
* `ChatV2Service.toChannelDTO` is synchronous and `listChannels` builds many
|
|
187
|
+
* DTOs at once, so the channel rows (which drive the DM presence dots) need a
|
|
188
|
+
* sync `getPresence`. The async {@link createOssAgentPresenceProvider} backs
|
|
189
|
+
* the richer `/presence/:id` endpoint, but it was never wired into the service
|
|
190
|
+
* — so every DM dot fell back to `DEFAULT_PRESENCE` ('offline') regardless of
|
|
191
|
+
* whether the agent was actually running.
|
|
192
|
+
*
|
|
193
|
+
* This factory returns a sync presence keyed on runtime liveness — the SAME
|
|
194
|
+
* "is the agent's child process alive" signal behind the Dashboard's
|
|
195
|
+
* "Running Agents" count (`isAgentActive` → `getSessionBackendSync`) — so a DM
|
|
196
|
+
* dot turns green exactly when the agent is running. Busy/idle refinement needs
|
|
197
|
+
* the async team-status read and stays in the `/presence` provider; here online
|
|
198
|
+
* vs offline is what the dot needs.
|
|
199
|
+
*
|
|
200
|
+
* @param opts.isAliveSync - Liveness override (tests pass a stub).
|
|
201
|
+
* @param opts.now - Clock override (tests freeze `lastSeenAt`).
|
|
202
|
+
* @returns A sync `(agentSession) => { status, lastSeenAt }` for `getPresence`.
|
|
203
|
+
*/
|
|
204
|
+
export function createOssSyncPresence(opts = {}) {
|
|
205
|
+
const now = opts.now ?? Date.now;
|
|
206
|
+
const isLive = opts.isAliveSync ??
|
|
207
|
+
((agentSession) => {
|
|
208
|
+
try {
|
|
209
|
+
const backend = getSessionBackendSync();
|
|
210
|
+
return (!!backend &&
|
|
211
|
+
backend.sessionExists(agentSession) &&
|
|
212
|
+
!!backend.isChildProcessAlive?.(agentSession));
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
return false;
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
return (agentSession) => {
|
|
219
|
+
let live = false;
|
|
220
|
+
try {
|
|
221
|
+
live = isLive(agentSession);
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
// toChannelDTO must never throw on presence (it'd blank the whole
|
|
225
|
+
// channel list) — degrade to offline.
|
|
226
|
+
live = false;
|
|
227
|
+
}
|
|
228
|
+
return { status: live ? 'online' : 'offline', lastSeenAt: live ? now() : null };
|
|
229
|
+
};
|
|
230
|
+
}
|
|
182
231
|
//# sourceMappingURL=chat-v2.providers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-v2.providers.js","sourceRoot":"","sources":["../../../../../../backend/src/services/chat-v2/chat-v2.providers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;
|
|
1
|
+
{"version":3,"file":"chat-v2.providers.js","sourceRoot":"","sources":["../../../../../../backend/src/services/chat-v2/chat-v2.providers.ts"],"names":[],"mappings":"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"}
|
|
@@ -109,6 +109,13 @@ export interface ListChannelsArgs {
|
|
|
109
109
|
* team_id) drop out of the result.
|
|
110
110
|
*/
|
|
111
111
|
teamId?: string;
|
|
112
|
+
/**
|
|
113
|
+
* Include "bridged" channels (Slack inbound, owned by `'system'`) in the
|
|
114
|
+
* result. Defaults to true. Only applies to the unfiltered list (no
|
|
115
|
+
* `type`/`teamId` filter) — bridged threads are surfaced alongside the
|
|
116
|
+
* user's own DMs/channels in the consolidated chat list.
|
|
117
|
+
*/
|
|
118
|
+
includeBridged?: boolean;
|
|
112
119
|
}
|
|
113
120
|
/** Arguments for `sendMessage`. */
|
|
114
121
|
export interface SendMessageArgs {
|
|
@@ -223,10 +230,21 @@ export declare class ChatV2Service extends EventEmitter {
|
|
|
223
230
|
private readonly db;
|
|
224
231
|
private readonly channels;
|
|
225
232
|
private readonly messages;
|
|
226
|
-
private
|
|
233
|
+
private presence;
|
|
227
234
|
private readonly validateTeamMembership;
|
|
228
235
|
private readonly now;
|
|
229
236
|
constructor(options: ChatV2ServiceOptions);
|
|
237
|
+
/**
|
|
238
|
+
* Wire (or replace) the synchronous presence provider used by the channel
|
|
239
|
+
* DTO mapper — i.e. what drives the DM presence dots in the conversation
|
|
240
|
+
* list. Settable POST-construction because the singleton is first-constructed
|
|
241
|
+
* by whichever caller wins the race (slack bridge, ws gateway, replay, …),
|
|
242
|
+
* usually with no presence wired; the composition root then calls this once
|
|
243
|
+
* so the dots reflect real agent liveness regardless of construction order.
|
|
244
|
+
*
|
|
245
|
+
* @param getPresence - Sync presence lookup (e.g. `createOssSyncPresence()`)
|
|
246
|
+
*/
|
|
247
|
+
setPresenceProvider(getPresence: ChatV2ServiceOptions['getPresence']): void;
|
|
230
248
|
/** Release the DB handle. Safe to call during graceful shutdown / in tests. */
|
|
231
249
|
close(): void;
|
|
232
250
|
/**
|
|
@@ -370,6 +388,35 @@ export declare class ChatV2Service extends EventEmitter {
|
|
|
370
388
|
channel: ChatChannelDTO;
|
|
371
389
|
created: boolean;
|
|
372
390
|
};
|
|
391
|
+
/**
|
|
392
|
+
* Find-or-create the canonical `type='channel'` channel for a team.
|
|
393
|
+
*
|
|
394
|
+
* Backs the consolidated team-chat surface: opening a team's workspace
|
|
395
|
+
* deep-link must always land on a real channel, but nothing else
|
|
396
|
+
* auto-creates one. This is idempotent — if the team already has any
|
|
397
|
+
* active channel it is returned untouched; otherwise a single default
|
|
398
|
+
* channel (e.g. `#general`) is created. The same tenant/validation rules
|
|
399
|
+
* as the public {@link createChannel} apply (the caller must pass team
|
|
400
|
+
* membership when a `validateTeamMembership` check is wired).
|
|
401
|
+
*
|
|
402
|
+
* @param args - Ensure args
|
|
403
|
+
* @param args.teamId - The team to ensure a channel for (required)
|
|
404
|
+
* @param args.name - Display name for a freshly created channel; defaults to `#general`
|
|
405
|
+
* @param args.purpose - Optional channel purpose
|
|
406
|
+
* @param args.principal - The authenticated caller
|
|
407
|
+
* @returns The existing or freshly created channel, with `created` flag
|
|
408
|
+
* @throws {ChatError} `validation_error` (400) when `teamId` is blank
|
|
409
|
+
* @throws {ChatError} `forbidden_team` (403) when the caller fails the membership check
|
|
410
|
+
*/
|
|
411
|
+
ensureTeamChannel(args: {
|
|
412
|
+
teamId: string;
|
|
413
|
+
name?: string;
|
|
414
|
+
purpose?: string;
|
|
415
|
+
principal: ChatPrincipal;
|
|
416
|
+
}): {
|
|
417
|
+
channel: ChatChannelDTO;
|
|
418
|
+
created: boolean;
|
|
419
|
+
};
|
|
373
420
|
/**
|
|
374
421
|
* Server-internal idempotent helper used by migration / bridge code to
|
|
375
422
|
* map a legacy conversationId (e.g. `slack-D0AC7-1234`, `web-conv-abc`)
|
|
@@ -649,7 +696,18 @@ export declare class ChatV2Service extends EventEmitter {
|
|
|
649
696
|
/** Fetch the channel and enforce caller = owner. */
|
|
650
697
|
private requireOwnedChannel;
|
|
651
698
|
/**
|
|
652
|
-
* Fetch the channel and allow if the caller is the owner OR the bound agent
|
|
699
|
+
* Fetch the channel and allow if the caller is the owner OR the bound agent
|
|
700
|
+
* OR the channel is a shared bridged Slack conversation.
|
|
701
|
+
*
|
|
702
|
+
* Slack-bridged channels (`slack-…`, persisted under the synthetic `'system'`
|
|
703
|
+
* owner by the inbound bridge) belong to no single Crewly user — exactly like
|
|
704
|
+
* {@link ChannelStore.listBridged} surfaces them in the consolidated list
|
|
705
|
+
* regardless of owner, this lets the web user READ them (e.g. the team-chat
|
|
706
|
+
* surface merges them inline into the Orchestrator timeline). Writes are still
|
|
707
|
+
* gated downstream by {@link resolveSender}, which throws `forbidden` unless
|
|
708
|
+
* the caller is the owner or bound agent — so this read allowance does not let
|
|
709
|
+
* a user post into a bridged channel.
|
|
710
|
+
*
|
|
653
711
|
* Used for read + send; agents must always be acting from their own session.
|
|
654
712
|
*/
|
|
655
713
|
private requireReadableChannel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-v2.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/chat-v2/chat-v2.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAML,KAAK,iBAAiB,EACtB,KAAK,cAAc,EAEnB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAE1B,KAAK,aAAa,EAClB,KAAK,cAAc,EACpB,MAAM,YAAY,CAAC;AAMpB,+CAA+C;AAC/C,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,YAAY,CAAC;IACrB,+DAA+D;IAC/D,EAAE,CAAC,EAAE,YAAY,CAAC;IAClB,0FAA0F;IAC1F,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK;QACtC,MAAM,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,CAAC;QAClD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;KAC3B,CAAC;IACF;;;;;;;;;;;;;;;;;OAiBG;IACH,sBAAsB,CAAC,EAAE,CACvB,SAAS,EAAE,aAAa,EACxB,MAAM,EAAE,MAAM,KACX,OAAO,CAAC;IACb,gCAAgC;IAChC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,oEAAoE;AACpE,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG;QACjC,MAAM,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,CAAC;QAClD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;KAC3B,CAAC;CACH;AAMD,qCAAqC;AACrC,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,aAAa,CAAC;IACzB;;;OAGG;IACH,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,gDAAgD;AAChD,MAAM,WAAW,gBAAgB;IAC/B,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;OAMG;IACH,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,EAAE,aAAa,CAAC;CAC1B;AAED,oCAAoC;AACpC,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,aAAa,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-v2.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/chat-v2/chat-v2.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -70,6 +70,19 @@ export class ChatV2Service extends EventEmitter {
|
|
|
70
70
|
this.validateTeamMembership = options.validateTeamMembership;
|
|
71
71
|
this.now = options.now ?? Date.now;
|
|
72
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* Wire (or replace) the synchronous presence provider used by the channel
|
|
75
|
+
* DTO mapper — i.e. what drives the DM presence dots in the conversation
|
|
76
|
+
* list. Settable POST-construction because the singleton is first-constructed
|
|
77
|
+
* by whichever caller wins the race (slack bridge, ws gateway, replay, …),
|
|
78
|
+
* usually with no presence wired; the composition root then calls this once
|
|
79
|
+
* so the dots reflect real agent liveness regardless of construction order.
|
|
80
|
+
*
|
|
81
|
+
* @param getPresence - Sync presence lookup (e.g. `createOssSyncPresence()`)
|
|
82
|
+
*/
|
|
83
|
+
setPresenceProvider(getPresence) {
|
|
84
|
+
this.presence = getPresence;
|
|
85
|
+
}
|
|
73
86
|
/** Release the DB handle. Safe to call during graceful shutdown / in tests. */
|
|
74
87
|
close() {
|
|
75
88
|
try {
|
|
@@ -401,6 +414,44 @@ export class ChatV2Service extends EventEmitter {
|
|
|
401
414
|
});
|
|
402
415
|
return { channel, created: true };
|
|
403
416
|
}
|
|
417
|
+
/**
|
|
418
|
+
* Find-or-create the canonical `type='channel'` channel for a team.
|
|
419
|
+
*
|
|
420
|
+
* Backs the consolidated team-chat surface: opening a team's workspace
|
|
421
|
+
* deep-link must always land on a real channel, but nothing else
|
|
422
|
+
* auto-creates one. This is idempotent — if the team already has any
|
|
423
|
+
* active channel it is returned untouched; otherwise a single default
|
|
424
|
+
* channel (e.g. `#general`) is created. The same tenant/validation rules
|
|
425
|
+
* as the public {@link createChannel} apply (the caller must pass team
|
|
426
|
+
* membership when a `validateTeamMembership` check is wired).
|
|
427
|
+
*
|
|
428
|
+
* @param args - Ensure args
|
|
429
|
+
* @param args.teamId - The team to ensure a channel for (required)
|
|
430
|
+
* @param args.name - Display name for a freshly created channel; defaults to `#general`
|
|
431
|
+
* @param args.purpose - Optional channel purpose
|
|
432
|
+
* @param args.principal - The authenticated caller
|
|
433
|
+
* @returns The existing or freshly created channel, with `created` flag
|
|
434
|
+
* @throws {ChatError} `validation_error` (400) when `teamId` is blank
|
|
435
|
+
* @throws {ChatError} `forbidden_team` (403) when the caller fails the membership check
|
|
436
|
+
*/
|
|
437
|
+
ensureTeamChannel(args) {
|
|
438
|
+
const teamId = (args.teamId ?? '').trim();
|
|
439
|
+
if (teamId.length === 0) {
|
|
440
|
+
throw new ChatError(CHAT_ERROR_CODES.VALIDATION, 400, 'teamId is required');
|
|
441
|
+
}
|
|
442
|
+
const existing = this.channels.findActiveChannelByTeam(teamId);
|
|
443
|
+
if (existing) {
|
|
444
|
+
return { channel: this.toChannelDTO(existing), created: false };
|
|
445
|
+
}
|
|
446
|
+
const channel = this.createChannel({
|
|
447
|
+
name: (args.name ?? '#general').trim(),
|
|
448
|
+
purpose: args.purpose,
|
|
449
|
+
principal: args.principal,
|
|
450
|
+
type: 'channel',
|
|
451
|
+
teamId,
|
|
452
|
+
});
|
|
453
|
+
return { channel, created: true };
|
|
454
|
+
}
|
|
404
455
|
/**
|
|
405
456
|
* Server-internal idempotent helper used by migration / bridge code to
|
|
406
457
|
* map a legacy conversationId (e.g. `slack-D0AC7-1234`, `web-conv-abc`)
|
|
@@ -618,6 +669,17 @@ export class ChatV2Service extends EventEmitter {
|
|
|
618
669
|
type: args.type,
|
|
619
670
|
teamId: teamIdFilter,
|
|
620
671
|
});
|
|
672
|
+
// Surface bridged (Slack) threads alongside the user's own channels on
|
|
673
|
+
// the unfiltered list. They are owned by `'system'`, so listByOwner
|
|
674
|
+
// never returns them; merge + dedupe by id (the user's own row wins).
|
|
675
|
+
const includeBridged = (args.includeBridged ?? true) && args.type === undefined && teamIdFilter === undefined;
|
|
676
|
+
if (includeBridged) {
|
|
677
|
+
const seen = new Set(rows.map((r) => r.id));
|
|
678
|
+
const bridged = this.channels
|
|
679
|
+
.listBridged({ includeArchived: args.includeArchived, limit: args.limit })
|
|
680
|
+
.filter((r) => !seen.has(r.id));
|
|
681
|
+
return [...rows, ...bridged].map((r) => this.toChannelDTO(r));
|
|
682
|
+
}
|
|
621
683
|
return rows.map((r) => this.toChannelDTO(r));
|
|
622
684
|
}
|
|
623
685
|
/**
|
|
@@ -964,9 +1026,25 @@ export class ChatV2Service extends EventEmitter {
|
|
|
964
1026
|
limit: args.limit,
|
|
965
1027
|
direction: args.direction,
|
|
966
1028
|
});
|
|
1029
|
+
// Slack-style thread reply counts: one aggregate query for the whole
|
|
1030
|
+
// channel, then attach `replyCount`/`lastReplyAt` to the root-message
|
|
1031
|
+
// DTOs on this page. Root messages are those whose own `threadId` is
|
|
1032
|
+
// unset; replies never carry a count.
|
|
1033
|
+
const threadSummary = this.messages.threadReplySummary(args.channelId);
|
|
1034
|
+
const messages = page.rows.map((r) => {
|
|
1035
|
+
const dto = this.toMessageDTO(r, []);
|
|
1036
|
+
if (dto.threadId === undefined) {
|
|
1037
|
+
const summary = threadSummary.get(dto.id);
|
|
1038
|
+
if (summary) {
|
|
1039
|
+
dto.replyCount = summary.replyCount;
|
|
1040
|
+
dto.lastReplyAt = new Date(summary.lastReplyAtMs).toISOString();
|
|
1041
|
+
}
|
|
1042
|
+
}
|
|
1043
|
+
return dto;
|
|
1044
|
+
});
|
|
967
1045
|
return {
|
|
968
1046
|
channelId: args.channelId,
|
|
969
|
-
messages
|
|
1047
|
+
messages,
|
|
970
1048
|
nextCursor: page.nextCursor,
|
|
971
1049
|
prevCursor: page.prevCursor,
|
|
972
1050
|
};
|
|
@@ -986,7 +1064,18 @@ export class ChatV2Service extends EventEmitter {
|
|
|
986
1064
|
return row;
|
|
987
1065
|
}
|
|
988
1066
|
/**
|
|
989
|
-
* Fetch the channel and allow if the caller is the owner OR the bound agent
|
|
1067
|
+
* Fetch the channel and allow if the caller is the owner OR the bound agent
|
|
1068
|
+
* OR the channel is a shared bridged Slack conversation.
|
|
1069
|
+
*
|
|
1070
|
+
* Slack-bridged channels (`slack-…`, persisted under the synthetic `'system'`
|
|
1071
|
+
* owner by the inbound bridge) belong to no single Crewly user — exactly like
|
|
1072
|
+
* {@link ChannelStore.listBridged} surfaces them in the consolidated list
|
|
1073
|
+
* regardless of owner, this lets the web user READ them (e.g. the team-chat
|
|
1074
|
+
* surface merges them inline into the Orchestrator timeline). Writes are still
|
|
1075
|
+
* gated downstream by {@link resolveSender}, which throws `forbidden` unless
|
|
1076
|
+
* the caller is the owner or bound agent — so this read allowance does not let
|
|
1077
|
+
* a user post into a bridged channel.
|
|
1078
|
+
*
|
|
990
1079
|
* Used for read + send; agents must always be acting from their own session.
|
|
991
1080
|
*/
|
|
992
1081
|
requireReadableChannel(channelId, principal) {
|
|
@@ -996,7 +1085,8 @@ export class ChatV2Service extends EventEmitter {
|
|
|
996
1085
|
}
|
|
997
1086
|
const isOwner = row.owner_user_id === principal.userId;
|
|
998
1087
|
const isBoundAgent = !!principal.agentSession && principal.agentSession === row.agent_session;
|
|
999
|
-
|
|
1088
|
+
const isSharedBridged = row.id.startsWith('slack-');
|
|
1089
|
+
if (!isOwner && !isBoundAgent && !isSharedBridged) {
|
|
1000
1090
|
throw new ChatError(CHAT_ERROR_CODES.CHANNEL_NOT_FOUND, 404, 'Channel not found');
|
|
1001
1091
|
}
|
|
1002
1092
|
if (row.archived_at) {
|