crewly 1.20.365 → 1.20.366
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/skills/agent/core/attach-file/SKILL.md +7 -0
- package/config/skills/agent/core/attach-file/execute.sh +8 -3
- package/config/skills/agent/core/complete-task/SKILL.md +4 -2
- package/config/skills/agent/core/complete-task/execute.sh +9 -1
- package/config/skills/agent/core/complete-task/explicit-id.test.sh +13 -2
- package/config/skills/agent/core/create-task/SKILL.md +2 -0
- package/config/skills/agent/core/create-task/execute.sh +27 -1
- package/config/skills/agent/core/create-task/execute.test.sh +67 -0
- package/config/skills/agent/core/handoff-task/execute.sh +12 -5
- package/config/skills/agent/core/handoff-task/explicit-id.test.sh +70 -0
- package/config/skills/agent/core/reply-channel/SKILL.md +12 -5
- package/config/skills/agent/core/reply-channel/execute.sh +17 -2
- package/config/skills/agent/core/reply-channel/execute.test.sh +15 -2
- package/config/skills/agent/core/slack-post/SKILL.md +3 -3
- package/config/skills/orchestrator/delegate-task/SKILL.md +1 -1
- package/config/skills/orchestrator/reply-slack/execute.sh +6 -2
- package/config/skills/orchestrator/send-pdf-to-slack/SKILL.md +2 -1
- package/config/skills/orchestrator/send-pdf-to-slack/execute.sh +10 -2
- package/config/skills/registry.json +6 -6
- package/config/skills/team-leader/delegate-task/SKILL.md +1 -1
- package/config/skills/team-leader/delegate-task/execute.sh +6 -0
- package/dist/backend/backend/src/constants.d.ts +26 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +26 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.js +7 -3
- package/dist/backend/backend/src/controllers/agent-hooks/agent-hooks.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts +12 -0
- package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.js +56 -7
- package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.d.ts +9 -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 +111 -11
- package/dist/backend/backend/src/controllers/chat-v2/chat-v2.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.js +52 -4
- package/dist/backend/backend/src/controllers/monitoring/terminal.controller.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 +58 -4
- package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
- 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 +36 -2
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +16 -10
- 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 +19 -11
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/agent-message-envelope.d.ts +8 -0
- package/dist/backend/backend/src/services/messaging/agent-message-envelope.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/agent-message-envelope.js +10 -1
- package/dist/backend/backend/src/services/messaging/agent-message-envelope.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-hook-message.d.ts +62 -20
- package/dist/backend/backend/src/services/messaging/owner-hook-message.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-hook-message.js +178 -39
- package/dist/backend/backend/src/services/messaging/owner-hook-message.js.map +1 -1
- package/dist/backend/backend/src/services/orc/agent-mention-post-guard.d.ts +8 -5
- package/dist/backend/backend/src/services/orc/agent-mention-post-guard.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/agent-mention-post-guard.js +13 -10
- package/dist/backend/backend/src/services/orc/agent-mention-post-guard.js.map +1 -1
- package/dist/backend/backend/src/services/orc/message-route.d.ts +129 -0
- package/dist/backend/backend/src/services/orc/message-route.d.ts.map +1 -0
- package/dist/backend/backend/src/services/orc/message-route.js +197 -0
- package/dist/backend/backend/src/services/orc/message-route.js.map +1 -0
- package/dist/backend/backend/src/services/orc/reply-destination-resolver.d.ts +49 -6
- package/dist/backend/backend/src/services/orc/reply-destination-resolver.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/reply-destination-resolver.js +284 -69
- package/dist/backend/backend/src/services/orc/reply-destination-resolver.js.map +1 -1
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts +64 -8
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.js +215 -100
- package/dist/backend/backend/src/services/orc/reply-destination.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/orc/triggered-by.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/triggered-by.js +9 -0
- package/dist/backend/backend/src/services/orc/triggered-by.js.map +1 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.d.ts +2 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.js +1 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.js.map +1 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.d.ts +10 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.js +25 -4
- package/dist/backend/backend/src/services/orc/work-item-destination.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts +1 -0
- package/dist/backend/backend/src/services/project-tickets/project-ticket-workflow.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.js +20 -13
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.d.ts +20 -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 +58 -3
- package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +31 -0
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js +62 -5
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/trace/turn-trigger.d.ts +34 -1
- package/dist/backend/backend/src/services/trace/turn-trigger.d.ts.map +1 -1
- package/dist/backend/backend/src/services/trace/turn-trigger.js +74 -9
- package/dist/backend/backend/src/services/trace/turn-trigger.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +26 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +26 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +16 -10
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +19 -11
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/cli/backend/src/services/messaging/agent-message-envelope.d.ts +8 -0
- package/dist/cli/backend/src/services/messaging/agent-message-envelope.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/agent-message-envelope.js +10 -1
- package/dist/cli/backend/src/services/messaging/agent-message-envelope.js.map +1 -1
- package/dist/cli/backend/src/services/orc/message-route.d.ts +129 -0
- package/dist/cli/backend/src/services/orc/message-route.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orc/message-route.js +197 -0
- package/dist/cli/backend/src/services/orc/message-route.js.map +1 -0
- package/dist/cli/backend/src/services/orc/work-item-destination.d.ts +2 -1
- package/dist/cli/backend/src/services/orc/work-item-destination.d.ts.map +1 -1
- package/dist/cli/backend/src/services/orc/work-item-destination.js +1 -1
- package/dist/cli/backend/src/services/orc/work-item-destination.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.d.ts +20 -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 +58 -3
- package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +31 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js +62 -5
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/backend/src/services/trace/turn-trigger.d.ts +34 -1
- package/dist/cli/backend/src/services/trace/turn-trigger.d.ts.map +1 -1
- package/dist/cli/backend/src/services/trace/turn-trigger.js +74 -9
- package/dist/cli/backend/src/services/trace/turn-trigger.js.map +1 -1
- package/package.json +1 -1
|
@@ -8,13 +8,16 @@
|
|
|
8
8
|
* a cost/timing report about another project, in the middle of the owner's
|
|
9
9
|
* conversation.
|
|
10
10
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* R6 of the message-routing audit (2026-10-18): agents never converse
|
|
12
|
+
* inside an owner thread, whatever prompted the post. The post is taken out
|
|
13
|
+
* of the thread (and delivered privately to the agents it addresses) when
|
|
14
|
+
* BOTH hold:
|
|
14
15
|
* - the owner wrote to the poster in this conversation recently (it is an
|
|
15
16
|
* owner thread, not an agents' room);
|
|
16
17
|
* - the text @-mentions someone, and every @-mention is a known agent (an
|
|
17
18
|
* unknown name or the owner keeps the post).
|
|
19
|
+
* Only the final consolidated answer, written to the owner, goes in the
|
|
20
|
+
* owner's thread.
|
|
18
21
|
*
|
|
19
22
|
* Pure decision; the lookups are injected.
|
|
20
23
|
*
|
|
@@ -51,10 +54,9 @@ export function mentionedNames(text) {
|
|
|
51
54
|
*/
|
|
52
55
|
export function misdirectedAgentMention(input) {
|
|
53
56
|
const { latest } = input;
|
|
54
|
-
if (latest?.kind !== 'agent' || !latest.sender || latest.sender === input.session)
|
|
55
|
-
return null;
|
|
56
57
|
if (!input.ownerAskedHere)
|
|
57
58
|
return null;
|
|
59
|
+
const sender = latest?.kind === 'agent' && latest.sender && latest.sender !== input.session ? latest.sender : undefined;
|
|
58
60
|
const names = mentionedNames(input.content);
|
|
59
61
|
if (names.length === 0)
|
|
60
62
|
return null;
|
|
@@ -66,13 +68,14 @@ export function misdirectedAgentMention(input) {
|
|
|
66
68
|
if (!mentioned.includes(agent))
|
|
67
69
|
mentioned.push(agent);
|
|
68
70
|
}
|
|
69
|
-
const to = mentioned.includes(
|
|
71
|
+
const to = sender && mentioned.includes(sender) ? sender : mentioned[0];
|
|
72
|
+
const from = sender ? `, your latest message came from ${sender} (another agent),` : '';
|
|
70
73
|
return {
|
|
71
|
-
sender:
|
|
74
|
+
...(sender ? { sender } : {}),
|
|
72
75
|
mentioned,
|
|
73
|
-
message: `Not posted: this is the owner's thread
|
|
74
|
-
`
|
|
75
|
-
'
|
|
76
|
+
message: `Not posted: this is the owner's thread${from} and your post only @-mentions agents. Agents do not talk to each other in the owner's thread. ` +
|
|
77
|
+
`Send it to the agent instead: send-message --to ${to} "<your message>". ` +
|
|
78
|
+
'Post in this thread only the final answer to the owner, without the @-mention.',
|
|
76
79
|
};
|
|
77
80
|
}
|
|
78
81
|
//# sourceMappingURL=agent-mention-post-guard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-mention-post-guard.js","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/agent-mention-post-guard.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"agent-mention-post-guard.js","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/agent-mention-post-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,mFAAmF;AACnF,MAAM,OAAO,GAAG,qCAAqC,CAAC;AA0BtD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACxC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAA4B;IAClE,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACzB,IAAI,CAAC,KAAK,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,EAAE,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IACxH,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,KAAK,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QACnD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC;IACD,MAAM,EAAE,GAAG,MAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,mCAAmC,MAAM,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;IACxF,OAAO;QACL,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,SAAS;QACT,OAAO,EACL,yCAAyC,IAAI,iGAAiG;YAC9I,mDAAmD,EAAE,qBAAqB;YAC1E,gFAAgF;KACnF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The destination a message carries: where the answer to it goes
|
|
3
|
+
* (message-routing audit 2026-10-18, invariant).
|
|
4
|
+
*
|
|
5
|
+
* Every input an agent answers names its route: an owner message (its
|
|
6
|
+
* conversation and thread), a work item, or another agent. The route of the
|
|
7
|
+
* input an agent is working from is copied onto everything it sends on:
|
|
8
|
+
* the `[MESSAGE from …]` header of `send-message`, the `parentRoute` of a
|
|
9
|
+
* work item it delegates, and the `[RESULT]` relay its delegate's answer
|
|
10
|
+
* comes back with. So the owner's thread travels across every agent hop,
|
|
11
|
+
* and the final answer lands where the owner asked, without the harness
|
|
12
|
+
* guessing "the newest owner turn" or "the newest work item".
|
|
13
|
+
*
|
|
14
|
+
* Pure helpers: the text token, parsing it back, and the reply command that
|
|
15
|
+
* answers a route.
|
|
16
|
+
*
|
|
17
|
+
* @module services/orc/message-route
|
|
18
|
+
*/
|
|
19
|
+
import type { TurnTrigger } from '../trace/turn-trigger.js';
|
|
20
|
+
import type { TurnOrigin } from './orc-reply-route.service.js';
|
|
21
|
+
/** Where the answer to a message goes. */
|
|
22
|
+
export type MessageRoute =
|
|
23
|
+
/** A work item: its origin decides (owner thread, ticket thread, delegator, …) */
|
|
24
|
+
{
|
|
25
|
+
kind: 'work-item';
|
|
26
|
+
workItemId: string;
|
|
27
|
+
}
|
|
28
|
+
/** An owner message: its conversation and thread (Slack thread key or chat-v2 thread root) */
|
|
29
|
+
| {
|
|
30
|
+
kind: 'owner';
|
|
31
|
+
conversationId: string;
|
|
32
|
+
thread?: string;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Shape check.
|
|
36
|
+
*
|
|
37
|
+
* @param value - Anything
|
|
38
|
+
* @returns True for a {@link MessageRoute}
|
|
39
|
+
*/
|
|
40
|
+
export declare function isMessageRoute(value: unknown): value is MessageRoute;
|
|
41
|
+
/**
|
|
42
|
+
* The text token for a route, e.g. `{route: owner room-1 thread C0A:1.2}`.
|
|
43
|
+
* Text survives every queue a message may wait in, and the harness reads
|
|
44
|
+
* it back with {@link parseRouteToken}.
|
|
45
|
+
*
|
|
46
|
+
* @param route - The route
|
|
47
|
+
* @returns The token
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```typescript
|
|
51
|
+
* formatRouteToken({ kind: 'work-item', workItemId: 'wi-1' }); // '{route: work-item wi-1}'
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export declare function formatRouteToken(route: MessageRoute): string;
|
|
55
|
+
/**
|
|
56
|
+
* The route a text carries (the first token in it).
|
|
57
|
+
*
|
|
58
|
+
* @param text - Delivered text
|
|
59
|
+
* @returns The route, or null when the text carries none
|
|
60
|
+
*/
|
|
61
|
+
export declare function parseRouteToken(text: string): MessageRoute | null;
|
|
62
|
+
/**
|
|
63
|
+
* The reply command that answers a route.
|
|
64
|
+
*
|
|
65
|
+
* @param route - The route
|
|
66
|
+
* @returns An English command line
|
|
67
|
+
*/
|
|
68
|
+
export declare function replyCommandFor(route: MessageRoute): string;
|
|
69
|
+
/**
|
|
70
|
+
* A route in words, for notes to agents.
|
|
71
|
+
*
|
|
72
|
+
* @param route - The route
|
|
73
|
+
* @returns E.g. `work item wi-1` / `the owner's thread C0A:1.2 in conversation room-1`
|
|
74
|
+
*/
|
|
75
|
+
export declare function describeRoute(route: MessageRoute): string;
|
|
76
|
+
/**
|
|
77
|
+
* Whether two routes name the same place.
|
|
78
|
+
*
|
|
79
|
+
* @param a - Route
|
|
80
|
+
* @param b - Route
|
|
81
|
+
* @returns True when equal
|
|
82
|
+
*/
|
|
83
|
+
export declare function sameRoute(a: MessageRoute | null | undefined, b: MessageRoute | null | undefined): boolean;
|
|
84
|
+
/** A place a post landed in (or is expected in). */
|
|
85
|
+
export interface PostPlace {
|
|
86
|
+
/** chat-v2 conversation */
|
|
87
|
+
conversationId?: string;
|
|
88
|
+
/** Thread in it: Slack thread key or chat-v2 thread root id */
|
|
89
|
+
thread?: string;
|
|
90
|
+
/** Slack channel */
|
|
91
|
+
slackChannelId?: string;
|
|
92
|
+
/** Slack thread ts (undefined: top level) */
|
|
93
|
+
threadTs?: string;
|
|
94
|
+
}
|
|
95
|
+
/** Outcome of {@link comparePostPlace}. */
|
|
96
|
+
export type RouteCheckOutcome = 'match' | 'mismatch' | 'unknown';
|
|
97
|
+
/**
|
|
98
|
+
* Compare where a post landed with where the request it answers came from
|
|
99
|
+
* (the regression check of the routing invariant). Places are compared on
|
|
100
|
+
* the Slack thread when both know one, else on the chat conversation and
|
|
101
|
+
* thread; anything the two do not both know is `unknown`, never a mismatch.
|
|
102
|
+
*
|
|
103
|
+
* @param expected - The originating request's place
|
|
104
|
+
* @param landed - Where the post landed
|
|
105
|
+
* @returns The outcome
|
|
106
|
+
*/
|
|
107
|
+
export declare function comparePostPlace(expected: PostPlace | null | undefined, landed: PostPlace | null | undefined): RouteCheckOutcome;
|
|
108
|
+
/**
|
|
109
|
+
* The place an owner route names.
|
|
110
|
+
*
|
|
111
|
+
* @param route - An owner route
|
|
112
|
+
* @returns Its place
|
|
113
|
+
*/
|
|
114
|
+
export declare function placeOfOwnerRoute(route: Extract<MessageRoute, {
|
|
115
|
+
kind: 'owner';
|
|
116
|
+
}>): PostPlace;
|
|
117
|
+
/**
|
|
118
|
+
* The route of what an agent is answering, from its latest routed trigger
|
|
119
|
+
* (turn-trigger.ts `routedTrigger`): the owner message (with the thread its
|
|
120
|
+
* turn origin knows), the route an agent message or result carries, or the
|
|
121
|
+
* work item a dispatch handed over. This is what the agent's own messages
|
|
122
|
+
* carry onward.
|
|
123
|
+
*
|
|
124
|
+
* @param trigger - The agent's latest routed trigger, or null
|
|
125
|
+
* @param origin - Its turn origin (the thread of the owner message), if any
|
|
126
|
+
* @returns The route, or null when the input names none
|
|
127
|
+
*/
|
|
128
|
+
export declare function routeOfTrigger(trigger: TurnTrigger | null, origin?: TurnOrigin): MessageRoute | null;
|
|
129
|
+
//# sourceMappingURL=message-route.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-route.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/message-route.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE/D,0CAA0C;AAC1C,MAAM,MAAM,YAAY;AACtB,kFAAkF;AAChF;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE;AAC3C,8FAA8F;GAC5F;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAK/D;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAQpE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAI5D;AAKD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAKjE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAG3D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAGzD;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,EAAE,CAAC,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAKzG;AAED,oDAAoD;AACpD,MAAM,WAAW,SAAS;IACxB,2BAA2B;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,2CAA2C;AAC3C,MAAM,MAAM,iBAAiB,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;AAEjE;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,GAAG,iBAAiB,CAoBhI;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,GAAG,SAAS,CAO5F;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CAmBpG"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The destination a message carries: where the answer to it goes
|
|
3
|
+
* (message-routing audit 2026-10-18, invariant).
|
|
4
|
+
*
|
|
5
|
+
* Every input an agent answers names its route: an owner message (its
|
|
6
|
+
* conversation and thread), a work item, or another agent. The route of the
|
|
7
|
+
* input an agent is working from is copied onto everything it sends on:
|
|
8
|
+
* the `[MESSAGE from …]` header of `send-message`, the `parentRoute` of a
|
|
9
|
+
* work item it delegates, and the `[RESULT]` relay its delegate's answer
|
|
10
|
+
* comes back with. So the owner's thread travels across every agent hop,
|
|
11
|
+
* and the final answer lands where the owner asked, without the harness
|
|
12
|
+
* guessing "the newest owner turn" or "the newest work item".
|
|
13
|
+
*
|
|
14
|
+
* Pure helpers: the text token, parsing it back, and the reply command that
|
|
15
|
+
* answers a route.
|
|
16
|
+
*
|
|
17
|
+
* @module services/orc/message-route
|
|
18
|
+
*/
|
|
19
|
+
import { MESSAGE_ROUTE_CONSTANTS } from '../../constants.js';
|
|
20
|
+
import { formatSlackThreadKey, parseSlackThreadKey } from '../slack/slack-thread-key.js';
|
|
21
|
+
/** An id the token may carry: no whitespace, no closing brace. */
|
|
22
|
+
const ID = /^[^\s{}]+$/;
|
|
23
|
+
/**
|
|
24
|
+
* Shape check.
|
|
25
|
+
*
|
|
26
|
+
* @param value - Anything
|
|
27
|
+
* @returns True for a {@link MessageRoute}
|
|
28
|
+
*/
|
|
29
|
+
export function isMessageRoute(value) {
|
|
30
|
+
if (!value || typeof value !== 'object')
|
|
31
|
+
return false;
|
|
32
|
+
const v = value;
|
|
33
|
+
if (v.kind === 'work-item')
|
|
34
|
+
return typeof v.workItemId === 'string' && ID.test(v.workItemId);
|
|
35
|
+
if (v.kind === 'owner') {
|
|
36
|
+
return typeof v.conversationId === 'string' && ID.test(v.conversationId) && (v.thread === undefined || (typeof v.thread === 'string' && ID.test(v.thread)));
|
|
37
|
+
}
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The text token for a route, e.g. `{route: owner room-1 thread C0A:1.2}`.
|
|
42
|
+
* Text survives every queue a message may wait in, and the harness reads
|
|
43
|
+
* it back with {@link parseRouteToken}.
|
|
44
|
+
*
|
|
45
|
+
* @param route - The route
|
|
46
|
+
* @returns The token
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* formatRouteToken({ kind: 'work-item', workItemId: 'wi-1' }); // '{route: work-item wi-1}'
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export function formatRouteToken(route) {
|
|
54
|
+
const open = MESSAGE_ROUTE_CONSTANTS.TOKEN_OPEN;
|
|
55
|
+
if (route.kind === 'work-item')
|
|
56
|
+
return `${open}work-item ${route.workItemId}}`;
|
|
57
|
+
return `${open}owner ${route.conversationId}${route.thread ? ` thread ${route.thread}` : ''}}`;
|
|
58
|
+
}
|
|
59
|
+
/** `{route: work-item <id>}` / `{route: owner <conversation>[ thread <thread>]}` */
|
|
60
|
+
const TOKEN_RE = /\{route: (?:work-item ([^\s{}]+)|owner ([^\s{}]+)(?: thread ([^\s{}]+))?)\}/;
|
|
61
|
+
/**
|
|
62
|
+
* The route a text carries (the first token in it).
|
|
63
|
+
*
|
|
64
|
+
* @param text - Delivered text
|
|
65
|
+
* @returns The route, or null when the text carries none
|
|
66
|
+
*/
|
|
67
|
+
export function parseRouteToken(text) {
|
|
68
|
+
const m = TOKEN_RE.exec(typeof text === 'string' ? text : '');
|
|
69
|
+
if (!m)
|
|
70
|
+
return null;
|
|
71
|
+
if (m[1])
|
|
72
|
+
return { kind: 'work-item', workItemId: m[1] };
|
|
73
|
+
return { kind: 'owner', conversationId: m[2], ...(m[3] ? { thread: m[3] } : {}) };
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* The reply command that answers a route.
|
|
77
|
+
*
|
|
78
|
+
* @param route - The route
|
|
79
|
+
* @returns An English command line
|
|
80
|
+
*/
|
|
81
|
+
export function replyCommandFor(route) {
|
|
82
|
+
if (route.kind === 'work-item')
|
|
83
|
+
return `reply --work-item ${route.workItemId} "<message>"`;
|
|
84
|
+
return `reply --conversation ${route.conversationId}${route.thread ? ` --thread ${route.thread}` : ''} "<message>"`;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* A route in words, for notes to agents.
|
|
88
|
+
*
|
|
89
|
+
* @param route - The route
|
|
90
|
+
* @returns E.g. `work item wi-1` / `the owner's thread C0A:1.2 in conversation room-1`
|
|
91
|
+
*/
|
|
92
|
+
export function describeRoute(route) {
|
|
93
|
+
if (route.kind === 'work-item')
|
|
94
|
+
return `work item ${route.workItemId}`;
|
|
95
|
+
return route.thread ? `the owner's thread ${route.thread} in conversation ${route.conversationId}` : `the owner's conversation ${route.conversationId}`;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Whether two routes name the same place.
|
|
99
|
+
*
|
|
100
|
+
* @param a - Route
|
|
101
|
+
* @param b - Route
|
|
102
|
+
* @returns True when equal
|
|
103
|
+
*/
|
|
104
|
+
export function sameRoute(a, b) {
|
|
105
|
+
if (!a || !b || a.kind !== b.kind)
|
|
106
|
+
return false;
|
|
107
|
+
if (a.kind === 'work-item' && b.kind === 'work-item')
|
|
108
|
+
return a.workItemId === b.workItemId;
|
|
109
|
+
if (a.kind === 'owner' && b.kind === 'owner')
|
|
110
|
+
return a.conversationId === b.conversationId && (a.thread ?? '') === (b.thread ?? '');
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Compare where a post landed with where the request it answers came from
|
|
115
|
+
* (the regression check of the routing invariant). Places are compared on
|
|
116
|
+
* the Slack thread when both know one, else on the chat conversation and
|
|
117
|
+
* thread; anything the two do not both know is `unknown`, never a mismatch.
|
|
118
|
+
*
|
|
119
|
+
* @param expected - The originating request's place
|
|
120
|
+
* @param landed - Where the post landed
|
|
121
|
+
* @returns The outcome
|
|
122
|
+
*/
|
|
123
|
+
export function comparePostPlace(expected, landed) {
|
|
124
|
+
if (!expected || !landed)
|
|
125
|
+
return 'unknown';
|
|
126
|
+
const slackOf = (p) => {
|
|
127
|
+
const key = parseSlackThreadKey(p.thread);
|
|
128
|
+
if (key)
|
|
129
|
+
return { ch: key.slackChannelId, ts: key.threadTs };
|
|
130
|
+
return p.slackChannelId ? { ch: p.slackChannelId, ...(p.threadTs ? { ts: p.threadTs } : {}) } : null;
|
|
131
|
+
};
|
|
132
|
+
const e = slackOf(expected);
|
|
133
|
+
const l = slackOf(landed);
|
|
134
|
+
if (e && l)
|
|
135
|
+
return e.ch === l.ch && (e.ts ?? '') === (l.ts ?? '') ? 'match' : 'mismatch';
|
|
136
|
+
if (expected.conversationId && landed.conversationId) {
|
|
137
|
+
if (expected.conversationId !== landed.conversationId)
|
|
138
|
+
return 'mismatch';
|
|
139
|
+
// Same conversation: the thread decides when both name one in the same form.
|
|
140
|
+
const et = expected.thread && !parseSlackThreadKey(expected.thread) ? expected.thread : undefined;
|
|
141
|
+
const lt = landed.thread && !parseSlackThreadKey(landed.thread) ? landed.thread : undefined;
|
|
142
|
+
if (et && lt)
|
|
143
|
+
return et === lt ? 'match' : 'mismatch';
|
|
144
|
+
if (!expected.thread && !landed.thread)
|
|
145
|
+
return 'match';
|
|
146
|
+
return 'unknown';
|
|
147
|
+
}
|
|
148
|
+
return 'unknown';
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* The place an owner route names.
|
|
152
|
+
*
|
|
153
|
+
* @param route - An owner route
|
|
154
|
+
* @returns Its place
|
|
155
|
+
*/
|
|
156
|
+
export function placeOfOwnerRoute(route) {
|
|
157
|
+
const key = parseSlackThreadKey(route.thread);
|
|
158
|
+
return {
|
|
159
|
+
conversationId: route.conversationId,
|
|
160
|
+
...(route.thread ? { thread: key ? formatSlackThreadKey(key.slackChannelId, key.threadTs) : route.thread } : {}),
|
|
161
|
+
...(key ? { slackChannelId: key.slackChannelId, threadTs: key.threadTs } : {}),
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* The route of what an agent is answering, from its latest routed trigger
|
|
166
|
+
* (turn-trigger.ts `routedTrigger`): the owner message (with the thread its
|
|
167
|
+
* turn origin knows), the route an agent message or result carries, or the
|
|
168
|
+
* work item a dispatch handed over. This is what the agent's own messages
|
|
169
|
+
* carry onward.
|
|
170
|
+
*
|
|
171
|
+
* @param trigger - The agent's latest routed trigger, or null
|
|
172
|
+
* @param origin - Its turn origin (the thread of the owner message), if any
|
|
173
|
+
* @returns The route, or null when the input names none
|
|
174
|
+
*/
|
|
175
|
+
export function routeOfTrigger(trigger, origin) {
|
|
176
|
+
if (!trigger)
|
|
177
|
+
return null;
|
|
178
|
+
switch (trigger.triggerKind) {
|
|
179
|
+
case 'owner_message': {
|
|
180
|
+
const conversationId = trigger.conversationId ?? origin?.conversationId;
|
|
181
|
+
if (!conversationId)
|
|
182
|
+
return null;
|
|
183
|
+
const sameAsOrigin = origin?.conversationId === conversationId;
|
|
184
|
+
const thread = trigger.thread ?? (sameAsOrigin ? origin?.slackThreadKey ?? origin?.chatThreadId : undefined);
|
|
185
|
+
return { kind: 'owner', conversationId, ...(thread ? { thread } : {}) };
|
|
186
|
+
}
|
|
187
|
+
case 'agent_message':
|
|
188
|
+
case 'delegated_result':
|
|
189
|
+
return trigger.route ?? null;
|
|
190
|
+
case 'dispatch':
|
|
191
|
+
case 'scheduled':
|
|
192
|
+
return trigger.workItemId ? { kind: 'work-item', workItemId: trigger.workItemId } : null;
|
|
193
|
+
default:
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=message-route.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-route.js","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/message-route.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,9 +19,16 @@
|
|
|
19
19
|
* agent's message (crewly#1375) — never the owner's last thread;
|
|
20
20
|
* 6. the reference the harness last prompted the agent about, when newer
|
|
21
21
|
* than its last owner turn;
|
|
22
|
-
* 7. the
|
|
23
|
-
*
|
|
24
|
-
*
|
|
22
|
+
* 7. the route of the input the agent is answering (message-route.ts): the
|
|
23
|
+
* owner message it was given last (its turn origin), the route a
|
|
24
|
+
* delegated result carries back, or the work item a dispatch handed
|
|
25
|
+
* over; with no such input, the agent's one live work item.
|
|
26
|
+
*
|
|
27
|
+
* Nothing else. There is no guess (message-routing audit 2026-10-18, R2):
|
|
28
|
+
* not the newest owner turn when the input was something else, not the
|
|
29
|
+
* newest of several work items, not the owner DM, not a channel's top
|
|
30
|
+
* level. When nothing names the destination the reply is refused with the
|
|
31
|
+
* ids that would work.
|
|
25
32
|
*
|
|
26
33
|
* Pure decision logic; collaborators are injected
|
|
27
34
|
* (`reply-destination.wiring.ts` wires the real ones).
|
|
@@ -33,6 +40,7 @@ import type { TurnOrigin } from './orc-reply-route.service.js';
|
|
|
33
40
|
import type { TurnTrigger } from '../trace/turn-trigger.js';
|
|
34
41
|
import { type PromptReference, type ReplyReference } from './agent-prompt-reference.service.js';
|
|
35
42
|
import { type WorkDestination } from './work-item-destination.js';
|
|
43
|
+
import { type MessageRoute } from './message-route.js';
|
|
36
44
|
export type { ReplyReference } from './agent-prompt-reference.service.js';
|
|
37
45
|
/** Agent-supplied ids: hints only. */
|
|
38
46
|
export interface ReplyHints {
|
|
@@ -44,7 +52,7 @@ export interface ReplyHints {
|
|
|
44
52
|
slackChannelId?: string;
|
|
45
53
|
}
|
|
46
54
|
/** Which step decided. */
|
|
47
|
-
export type ReplyDestinationSource = 'message' | 'ticket' | 'decision' | 'work-item' | 'hint' | 'prompt' | 'agent-message' | 'turn-origin' | 'current-work' | 'owner-dm';
|
|
55
|
+
export type ReplyDestinationSource = 'message' | 'ticket' | 'decision' | 'work-item' | 'hint' | 'prompt' | 'agent-message' | 'turn-origin' | 'current-work' | 'route' | 'owner-dm';
|
|
48
56
|
/** Where the message goes. */
|
|
49
57
|
export type ReplyDestination =
|
|
50
58
|
/** A chat-v2 conversation the agent belongs to (DM / room / huddle), in `thread` (Slack key or chat-v2 root id) */
|
|
@@ -115,11 +123,19 @@ export interface ResolverDecision {
|
|
|
115
123
|
* agent (with its session), a harness dispatch of work, or anything else.
|
|
116
124
|
*/
|
|
117
125
|
export interface LatestInput {
|
|
118
|
-
kind: 'owner' | 'agent' | 'dispatch' | 'other';
|
|
119
|
-
/** Sending agent, for `agent` */
|
|
126
|
+
kind: 'owner' | 'agent' | 'dispatch' | 'result' | 'other';
|
|
127
|
+
/** Sending agent, for `agent` and `result` */
|
|
120
128
|
sender?: string;
|
|
121
129
|
/** When it was delivered (epoch ms) */
|
|
122
130
|
at: number;
|
|
131
|
+
/** Conversation of an owner message */
|
|
132
|
+
conversationId?: string;
|
|
133
|
+
/** Slack thread key of an owner message, when it named one */
|
|
134
|
+
thread?: string;
|
|
135
|
+
/** The work item a dispatch hands over, or a result is about */
|
|
136
|
+
workItemId?: string;
|
|
137
|
+
/** The route an agent message or a result carries (what the chain answers) */
|
|
138
|
+
route?: MessageRoute;
|
|
123
139
|
}
|
|
124
140
|
/**
|
|
125
141
|
* What the resolver needs to know about an agent's latest input, from its
|
|
@@ -256,4 +272,31 @@ export declare function promptIsCurrent(session: string, prompt: PromptReference
|
|
|
256
272
|
* @returns The destination and the hints that were ignored
|
|
257
273
|
*/
|
|
258
274
|
export declare function resolveReplyDestination(input: ReplyResolveInput, deps: ReplyResolverDeps): Promise<ReplyResolution>;
|
|
275
|
+
/**
|
|
276
|
+
* The owner's turn origin, when the owner message behind it is the latest
|
|
277
|
+
* input that names what the agent answers. Otherwise the origin is just
|
|
278
|
+
* "the agent's last owner thread", which says nothing about this reply.
|
|
279
|
+
*
|
|
280
|
+
* @param origin - The agent's turn origin
|
|
281
|
+
* @param latest - Its latest routed input
|
|
282
|
+
* @returns The origin, or undefined
|
|
283
|
+
*/
|
|
284
|
+
export declare function answeredOwnerOrigin(origin: TurnOrigin | undefined, latest: LatestInput | null): TurnOrigin | undefined;
|
|
285
|
+
/**
|
|
286
|
+
* The agent's live work items (running / accepted), oldest first.
|
|
287
|
+
*
|
|
288
|
+
* @param items - Pool items
|
|
289
|
+
* @param session - Agent
|
|
290
|
+
* @returns Its live items
|
|
291
|
+
*/
|
|
292
|
+
export declare function liveItemsOf(items: readonly WorkItem[], session: string): WorkItem[];
|
|
293
|
+
/**
|
|
294
|
+
* Where a route goes.
|
|
295
|
+
*
|
|
296
|
+
* @param session - Replying agent
|
|
297
|
+
* @param route - The route
|
|
298
|
+
* @param deps - Collaborators
|
|
299
|
+
* @returns The destination (source `route`), or `unresolved`
|
|
300
|
+
*/
|
|
301
|
+
export declare function resolveRoute(session: string, route: MessageRoute, deps: ReplyResolverDeps): Promise<ReplyDestination>;
|
|
259
302
|
//# sourceMappingURL=reply-destination-resolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reply-destination-resolver.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/reply-destination-resolver.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"reply-destination-resolver.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/orc/reply-destination-resolver.ts"],"names":[],"mappings":"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"}
|