crewly 1.20.30 → 1.20.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +22 -4
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/utils/tool-call-markup.utils.d.ts +45 -0
- package/dist/backend/backend/src/utils/tool-call-markup.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/tool-call-markup.utils.js +83 -0
- package/dist/backend/backend/src/utils/tool-call-markup.utils.js.map +1 -0
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.js +22 -4
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/utils/tool-call-markup.utils.d.ts +45 -0
- package/dist/cli/backend/src/utils/tool-call-markup.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/tool-call-markup.utils.js +83 -0
- package/dist/cli/backend/src/utils/tool-call-markup.utils.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strip tool-call markup an LLM emitted as prose.
|
|
3
|
+
*
|
|
4
|
+
* Models occasionally write their function-call envelope into the *text*
|
|
5
|
+
* part of a turn instead of (or as well as) making a real tool call. For a
|
|
6
|
+
* PTY runtime nobody sees it, but the in-process Crewly Agent forwards its
|
|
7
|
+
* text straight to Slack and chat, so the user gets a wall of
|
|
8
|
+
* `<invoke name="Bash">…` instead of an answer (2026-09-19, #crewly-support).
|
|
9
|
+
*
|
|
10
|
+
* This removes those envelopes — `function_calls` wrappers, `invoke`
|
|
11
|
+
* blocks and stray `parameter` tags, with or without a namespace prefix —
|
|
12
|
+
* while leaving fenced code blocks untouched, so an agent that is
|
|
13
|
+
* deliberately *explaining* the syntax keeps its example.
|
|
14
|
+
*
|
|
15
|
+
* @module utils/tool-call-markup
|
|
16
|
+
*/
|
|
17
|
+
/** Result of {@link stripToolCallMarkup}. */
|
|
18
|
+
export interface StrippedText {
|
|
19
|
+
/** The text with tool-call envelopes removed and whitespace tidied. */
|
|
20
|
+
text: string;
|
|
21
|
+
/** True when something was removed. */
|
|
22
|
+
stripped: boolean;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Whether a string contains something that looks like a tool-call envelope.
|
|
26
|
+
*
|
|
27
|
+
* @param raw - Candidate text
|
|
28
|
+
* @returns True when an `invoke` / `function_calls` tag is present
|
|
29
|
+
*/
|
|
30
|
+
export declare function hasToolCallMarkup(raw: string): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Remove tool-call markup from an agent's text response.
|
|
33
|
+
*
|
|
34
|
+
* Fenced code blocks (``` … ```) are passed through untouched: markup
|
|
35
|
+
* inside them is an example the agent meant to show.
|
|
36
|
+
*
|
|
37
|
+
* @param raw - The agent's text
|
|
38
|
+
* @returns The cleaned text and whether anything was removed
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* stripToolCallMarkup('Working on it.\n<invoke name="Bash">…</invoke>')
|
|
42
|
+
* // → { text: 'Working on it.', stripped: true }
|
|
43
|
+
*/
|
|
44
|
+
export declare function stripToolCallMarkup(raw: string): StrippedText;
|
|
45
|
+
//# sourceMappingURL=tool-call-markup.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-call-markup.utils.d.ts","sourceRoot":"","sources":["../../../../../backend/src/utils/tool-call-markup.utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AA+BH,6CAA6C;AAC7C,MAAM,WAAW,YAAY;IAC3B,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAwB7D"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strip tool-call markup an LLM emitted as prose.
|
|
3
|
+
*
|
|
4
|
+
* Models occasionally write their function-call envelope into the *text*
|
|
5
|
+
* part of a turn instead of (or as well as) making a real tool call. For a
|
|
6
|
+
* PTY runtime nobody sees it, but the in-process Crewly Agent forwards its
|
|
7
|
+
* text straight to Slack and chat, so the user gets a wall of
|
|
8
|
+
* `<invoke name="Bash">…` instead of an answer (2026-09-19, #crewly-support).
|
|
9
|
+
*
|
|
10
|
+
* This removes those envelopes — `function_calls` wrappers, `invoke`
|
|
11
|
+
* blocks and stray `parameter` tags, with or without a namespace prefix —
|
|
12
|
+
* while leaving fenced code blocks untouched, so an agent that is
|
|
13
|
+
* deliberately *explaining* the syntax keeps its example.
|
|
14
|
+
*
|
|
15
|
+
* @module utils/tool-call-markup
|
|
16
|
+
*/
|
|
17
|
+
/** Tag names that only ever appear in a tool-call envelope. */
|
|
18
|
+
const ENVELOPE_TAGS = ['function_calls', 'invoke', 'parameter'];
|
|
19
|
+
/**
|
|
20
|
+
* A tag like `<invoke …>`, `</invoke>`, `<||antml||invoke>` —
|
|
21
|
+
* any junk/namespace before the name, anything but `<`/`>` after it.
|
|
22
|
+
*
|
|
23
|
+
* @param name - Tag name
|
|
24
|
+
* @param closing - Match the closing form
|
|
25
|
+
* @returns The pattern source
|
|
26
|
+
*/
|
|
27
|
+
function tagSource(name, closing) {
|
|
28
|
+
return `<${closing ? '\\s*/' : ''}[^<>]{0,40}?\\b${name}\\b[^<>]*>`;
|
|
29
|
+
}
|
|
30
|
+
/** Well-formed `<x>…</x>` blocks for the wrapper tags. */
|
|
31
|
+
const BLOCK_PATTERNS = ['function_calls', 'invoke'].map((name) => new RegExp(`${tagSource(name, false)}[\\s\\S]*?${tagSource(name, true)}`, 'gi'));
|
|
32
|
+
/** An opening wrapper tag with no close — the output was cut off mid-call. */
|
|
33
|
+
const UNCLOSED_PATTERN = new RegExp(`(?:${tagSource('function_calls', false)}|${tagSource('invoke', false)})[\\s\\S]*$`, 'i');
|
|
34
|
+
/** Any leftover lone tag. */
|
|
35
|
+
const LONE_TAG_PATTERN = new RegExp(ENVELOPE_TAGS.map((name) => `${tagSource(name, false)}|${tagSource(name, true)}`).join('|'), 'gi');
|
|
36
|
+
/**
|
|
37
|
+
* Whether a string contains something that looks like a tool-call envelope.
|
|
38
|
+
*
|
|
39
|
+
* @param raw - Candidate text
|
|
40
|
+
* @returns True when an `invoke` / `function_calls` tag is present
|
|
41
|
+
*/
|
|
42
|
+
export function hasToolCallMarkup(raw) {
|
|
43
|
+
return new RegExp(`${tagSource('function_calls', false)}|${tagSource('invoke', false)}`, 'i').test(raw ?? '');
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Remove tool-call markup from an agent's text response.
|
|
47
|
+
*
|
|
48
|
+
* Fenced code blocks (``` … ```) are passed through untouched: markup
|
|
49
|
+
* inside them is an example the agent meant to show.
|
|
50
|
+
*
|
|
51
|
+
* @param raw - The agent's text
|
|
52
|
+
* @returns The cleaned text and whether anything was removed
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* stripToolCallMarkup('Working on it.\n<invoke name="Bash">…</invoke>')
|
|
56
|
+
* // → { text: 'Working on it.', stripped: true }
|
|
57
|
+
*/
|
|
58
|
+
export function stripToolCallMarkup(raw) {
|
|
59
|
+
const input = raw ?? '';
|
|
60
|
+
if (!input)
|
|
61
|
+
return { text: '', stripped: false };
|
|
62
|
+
// Split on fences so the segments at odd indexes are fenced code.
|
|
63
|
+
const segments = input.split(/(```[\s\S]*?```)/g);
|
|
64
|
+
const cleaned = segments
|
|
65
|
+
.map((segment, i) => {
|
|
66
|
+
if (i % 2 === 1)
|
|
67
|
+
return segment; // fenced code — leave alone
|
|
68
|
+
let out = segment;
|
|
69
|
+
for (const pattern of BLOCK_PATTERNS)
|
|
70
|
+
out = out.replace(pattern, '');
|
|
71
|
+
out = out.replace(UNCLOSED_PATTERN, '');
|
|
72
|
+
return out.replace(LONE_TAG_PATTERN, '');
|
|
73
|
+
})
|
|
74
|
+
.join('');
|
|
75
|
+
const text = cleaned
|
|
76
|
+
.split('\n')
|
|
77
|
+
.map((line) => line.replace(/[ \t]+$/, ''))
|
|
78
|
+
.join('\n')
|
|
79
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
80
|
+
.trim();
|
|
81
|
+
return { text, stripped: text !== input.trim() };
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=tool-call-markup.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-call-markup.utils.js","sourceRoot":"","sources":["../../../../../backend/src/utils/tool-call-markup.utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-registration.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/agent-registration.service.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,iCAAiC,EAAE,MAAM,yDAAyD,CAAC;AAK5G,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,OAAO,EACN,gBAAgB,EAMhB,WAAW,EAQX,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-registration.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/agent-registration.service.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,iCAAiC,EAAE,MAAM,yDAAyD,CAAC;AAK5G,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,OAAO,EACN,gBAAgB,EAMhB,WAAW,EAQX,MAAM,oBAAoB,CAAC;AA4D5B,MAAM,WAAW,kBAAkB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;aACnB,QAAQ,EAAE,OAAO;gBAAjB,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM;CAc/D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,IAAI,MAAM,CAQzF;AAED;;;;;;;;;GASG;AACH,qBAAa,wBAAwB;IACpC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,WAAW,CAAS;IAG5B,OAAO,CAAC,WAAW,CAA6B;IAGhD,OAAO,CAAC,oBAAoB,CAA4G;IAGxI,OAAO,CAAC,4BAA4B,CAAsC;IAG1E,OAAO,CAAC,yBAAyB,CAA+C;IAGhF,OAAO,CAAC,kBAAkB,CAAkC;IAI5D,OAAO,CAAC,kBAAkB,CAKpB;IAKN,OAAO,CAAC,oBAAoB,CAAoC;IAIhE,OAAO,CAAC,mBAAmB,CAAuD;IAIlF,OAAO,CAAC,iBAAiB,CAAwD;IAEjF,0EAA0E;IAC1E,OAAO,CAAC,gBAAgB,CAA+E;IAEvG,qFAAqF;IACrF,OAAO,CAAC,eAAe,CAAmK;IAK1L,OAAO,CAAC,MAAM,KAAK,wBAAwB,GAE1C;gBAGA,kBAAkB,EAAE,OAAO,EAAE,+CAA+C;IAC5E,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,cAAc,EAAE,cAAc;IAmB/B;;;;OAIG;IACH,mBAAmB,CAAC,SAAS,EAAE;QAAE,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;KAAE,GAAG,IAAI;IAIpG;;;;OAIG;IACH,kBAAkB,CAAC,QAAQ,EAAE;QAAE,SAAS,CAAC,KAAK,EAAE,OAAO,gCAAgC,EAAE,uBAAuB,GAAG,OAAO,gCAAgC,EAAE,iBAAiB,CAAA;KAAE,GAAG,IAAI;IAItL;;;;;OAKG;IACH,yBAAyB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IASpD;;OAEG;YACW,gBAAgB;IA2B9B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAW5B;;;;;;;;;OASG;YACW,yBAAyB;IA+BvC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,4BAA4B;IAsDpC;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,OAAO,CAAC,6BAA6B;IA0KrC;;OAEG;IACH,OAAO,CAAC,eAAe;IAwBvB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;;;;;;;;OASG;YACW,mBAAmB;IA2DjC;;;;;;OAMG;YACW,iBAAiB;IAgB/B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;;;;;OAMG;IACH,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,iCAAiC,GAAG,SAAS;IAIvF;;;;;;;;OAQG;IACH,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAKtD;;;;;;;;;;OAUG;YACW,mBAAmB;IAoDjC;;;;;;;;;;OAUG;IACH;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IAKzB;;;;;;;;;OASG;IACH,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,+BAA+B;IAoCvC;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAIxB;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;;OAGG;YACW,qBAAqB;IAkBnC;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAOrC;IAEH;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAgB;IAEzD,sEAAsE;IACtE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IAExD;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA6B;IAE7D;;;;;;;;;;OAUG;YACW,0BAA0B;IAqCxC;;;OAGG;YACW,oBAAoB;IAuBlC;;;OAGG;IACG,+BAA+B,CACpC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,GAAE,MAAoD,EAC7D,QAAQ,CAAC,EAAE,MAAM,EACjB,WAAW,GAAE,WAAuC,EACpD,YAAY,CAAC,EAAE,MAAM,EAAE,EACvB,wBAAwB,CAAC,EAAE,MAAM,EAAE,GACjC,OAAO,CAAC;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IAkFF;;;OAGG;YACW,qBAAqB;IA8CnC;;;OAGG;YACW,mBAAmB;IAqJjC;;;;;;;;;;;OAWG;YACW,uBAAuB;IAmDrC;;;;;;;;;;;;;OAaG;YACW,0BAA0B;IA6DxC;;;;OAIG;YACW,2BAA2B;IAwDzC;;;;;;;;;;;;;OAaG;YACW,wBAAwB;IA0DtC;;;;;;;OAOG;IACH,OAAO,CAAC,0BAA0B;IAMlC;;;;;;;;;;;OAWG;YACW,uBAAuB;IAiDrC;;;OAGG;YACW,iBAAiB;IAmO/B;;;;;;;;;OASG;YACW,oBAAoB;IA0DlC;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,0BAA0B;IAqDlC;;OAEG;IACH;;;;;;;OAOG;YACW,uBAAuB;YASvB,sBAAsB;IAsapC;;;;;;;;;;;OAWG;YACW,eAAe;IAsC7B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,qBAAqB;IAQ7B;;OAEG;YACW,mBAAmB;IA8BjC;;OAEG;YACW,sBAAsB;IAiCpC;;;;OAIG;YACW,mCAAmC;IAgJjD;;OAEG;YACW,uBAAuB;IA8BrC;;;;;;;;;OASG;IACG,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IA8B/C;;OAEG;YACW,yBAAyB;IA0BvC;;;;OAIG;IACG,kBAAkB,CAAC,MAAM,EAAE;QAChC,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB;;;;WAIG;QACH,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB;;;;;WAKG;QACH,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAC;KACpC,GAAG,OAAO,CAAC;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IAkDF;;;;OAIG;YACW,uBAAuB;IA2lBrC;;;;;OAKG;IACG,qBAAqB,CAC1B,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE,MAAkB,GACtB,OAAO,CAAC;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IAuFF;;;;;;;OAOG;YACW,mBAAmB;IAYjC;;;;;;;;;;;;;;;;;;;;;OAqBG;IACG,kBAAkB,CACvB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,WAAW,GACvB,OAAO,CAAC;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,OAAO,CAAC;KACjB,CAAC;IAqSF;;;;;;;;;;;OAWG;IACG,iBAAiB,CACtB,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,MAAqD,EAChE,WAAW,CAAC,EAAE,WAAW,GACvB,OAAO,CAAC,OAAO,CAAC;IAsGnB;;;;;;;;;OASG;YACW,oBAAoB;IAqzBlC;;;;;;;;;;OAUG;YACW,sBAAsB;IAmDpC;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,sBAAsB;IAyD9B;;;;;;;OAOG;YACW,sBAAsB;IA2BpC;;;;;;;;;;OAUG;IACH,yBAAyB,IAAI,IAAI;IAsBjC;;OAEG;IACH,wBAAwB,IAAI,IAAI;IAQhC;;;;;;;;OAQG;YACW,oBAAoB;IAqKlC;;;;;OAKG;IACH,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAK/C;;;;;;;OAOG;IACH,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAuB5D;;;;;;;;OAQG;IACH,OAAO,CAAC,gBAAgB;IAkDxB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,mBAAmB;IA0B3B;;;;;;;;;OASG;YACW,qBAAqB;IA+BnC;;;;;OAKG;IACG,cAAc,CACnB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,GACT,OAAO,CAAC;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IAyCF;;;;;;OAMG;IACG,gBAAgB,CACrB,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,GAAE,MAAa,GACpB,OAAO,CAAC;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,CAAC,EAAE;YACN,KAAK,EAAE;gBACN,WAAW,EAAE,MAAM,CAAC;gBACpB,IAAI,CAAC,EAAE,MAAM,CAAC;gBACd,OAAO,EAAE,OAAO,CAAC;gBACjB,MAAM,EAAE,CAAC,OAAO,gBAAgB,CAAC,cAAc,CAAC,CAAC,MAAM,OAAO,gBAAgB,CAAC,cAAc,CAAC,CAAC;aAC/F,CAAC;YACF,SAAS,EAAE,MAAM,CAAC;SAClB,CAAC;QACF,KAAK,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IAuCF;;;;;;;;;;;;;OAaG;YACW,kBAAkB;IAsLhC;;;;;;;;;OASG;IACG,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAW3E"}
|
|
@@ -11,6 +11,7 @@ import { CREWLY_CONSTANTS, ENV_CONSTANTS, AGENT_TIMEOUTS, ORCHESTRATOR_SESSION_N
|
|
|
11
11
|
import { WEB_CONSTANTS } from '../../../../config/constants.js';
|
|
12
12
|
import { delay } from '../../utils/async.utils.js';
|
|
13
13
|
import { buildRuntimeModelFlags } from '../../utils/runtime-model-flags.utils.js';
|
|
14
|
+
import { stripToolCallMarkup } from '../../utils/tool-call-markup.utils.js';
|
|
14
15
|
import { getSettingsService } from '../settings/settings.service.js';
|
|
15
16
|
import { SessionMemoryService } from '../memory/session-memory.service.js';
|
|
16
17
|
import { ActiveWorkBriefingService } from './active-work-briefing.service.js';
|
|
@@ -3248,8 +3249,25 @@ Loop until done, blocked, or explicitly reassigned:
|
|
|
3248
3249
|
// reply via reply_slack tool during processing. If so, skip routing
|
|
3249
3250
|
// to avoid duplicates. If not, route normally to ensure delivery.
|
|
3250
3251
|
const agentAlreadyReplied = result.toolCalls?.some(tc => tc.toolName === 'reply_slack' || tc.toolName === 'reply-slack') ?? false;
|
|
3251
|
-
|
|
3252
|
-
|
|
3252
|
+
// A model sometimes writes its function-call envelope into the
|
|
3253
|
+
// *text* part as well as making the real call. The PTY runtimes
|
|
3254
|
+
// never surface that, but this runtime forwards text straight to
|
|
3255
|
+
// Slack and chat — so strip it before anyone sees it
|
|
3256
|
+
// (2026-09-19: an orc reply reached #crewly-support as a wall of
|
|
3257
|
+
// `<invoke name="Bash">…`). An answer that is nothing but markup
|
|
3258
|
+
// is not posted at all: the delivery enforcer then nudges the
|
|
3259
|
+
// agent, which beats showing the user the envelope.
|
|
3260
|
+
const { text: replyText, stripped: replyHadMarkup } = stripToolCallMarkup(result.text ?? '');
|
|
3261
|
+
if (replyHadMarkup) {
|
|
3262
|
+
this.logger.warn('Stripped tool-call markup from in-process agent response', {
|
|
3263
|
+
sessionName,
|
|
3264
|
+
rawLength: result.text?.length ?? 0,
|
|
3265
|
+
cleanLength: replyText.length,
|
|
3266
|
+
dropped: replyText.length === 0,
|
|
3267
|
+
});
|
|
3268
|
+
}
|
|
3269
|
+
if (replyText && incomingConversationId && !agentAlreadyReplied) {
|
|
3270
|
+
this.routeInProcessResponseToChat(sessionName, replyText, incomingConversationId);
|
|
3253
3271
|
}
|
|
3254
3272
|
else if (agentAlreadyReplied) {
|
|
3255
3273
|
this.logger.debug('Skipping chat routing — agent already replied via reply_slack', {
|
|
@@ -3265,8 +3283,8 @@ Loop until done, blocked, or explicitly reassigned:
|
|
|
3265
3283
|
//
|
|
3266
3284
|
// Skipped when the agent already called reply_slack (which posts via
|
|
3267
3285
|
// /slack/send) to prevent double-posting on the same thread.
|
|
3268
|
-
if (slackMetadata?.channelId &&
|
|
3269
|
-
this.routeInProcessResponseToSlack(sessionName,
|
|
3286
|
+
if (slackMetadata?.channelId && replyText && !agentAlreadyReplied) {
|
|
3287
|
+
this.routeInProcessResponseToSlack(sessionName, replyText, {
|
|
3270
3288
|
channelId: slackMetadata.channelId,
|
|
3271
3289
|
threadTs: slackMetadata.threadTs,
|
|
3272
3290
|
});
|