@zengxingyuan/aamp-acp-bridge 0.1.28-dev.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +136 -0
- package/dist/acpx-client.d.ts +80 -0
- package/dist/acpx-client.js +460 -0
- package/dist/acpx-client.js.map +1 -0
- package/dist/agent-bridge.d.ts +68 -0
- package/dist/agent-bridge.js +949 -0
- package/dist/agent-bridge.js.map +1 -0
- package/dist/agent-bridge.test.d.ts +1 -0
- package/dist/agent-bridge.test.js +22 -0
- package/dist/agent-bridge.test.js.map +1 -0
- package/dist/bridge.d.ts +25 -0
- package/dist/bridge.js +70 -0
- package/dist/bridge.js.map +1 -0
- package/dist/cli/init.d.ts +9 -0
- package/dist/cli/init.js +532 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/config.d.ts +178 -0
- package/dist/config.js +73 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +225 -0
- package/dist/index.js.map +1 -0
- package/dist/pairing.d.ts +39 -0
- package/dist/pairing.js +135 -0
- package/dist/pairing.js.map +1 -0
- package/dist/prompt-builder.d.ts +22 -0
- package/dist/prompt-builder.js +427 -0
- package/dist/prompt-builder.js.map +1 -0
- package/dist/prompt-builder.test.d.ts +1 -0
- package/dist/prompt-builder.test.js +69 -0
- package/dist/prompt-builder.test.js.map +1 -0
- package/dist/storage.d.ts +7 -0
- package/dist/storage.js +97 -0
- package/dist/storage.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pairing.js","sourceRoot":"","sources":["../src/pairing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { StructuredResultField, TaskDispatch } from 'aamp-sdk';
|
|
2
|
+
export interface ResultAttachmentRef {
|
|
3
|
+
path: string;
|
|
4
|
+
filename?: string;
|
|
5
|
+
contentType?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Convert an AAMP TaskDispatch into a prompt string for an ACP agent.
|
|
9
|
+
*/
|
|
10
|
+
export declare function buildPrompt(task: TaskDispatch, threadContextText?: string, agentName?: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Parse an ACP agent response to detect HELP requests and extract file paths.
|
|
13
|
+
* Returns { isHelp, question, output, files }.
|
|
14
|
+
*/
|
|
15
|
+
export declare function parseResponse(output: string): {
|
|
16
|
+
isHelp: boolean;
|
|
17
|
+
question?: string;
|
|
18
|
+
output: string;
|
|
19
|
+
files: string[];
|
|
20
|
+
structuredResult?: StructuredResultField[];
|
|
21
|
+
attachments?: ResultAttachmentRef[];
|
|
22
|
+
};
|
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
const STRUCTURED_RESULT_MARKER = 'AAMP_RESULT_JSON:';
|
|
2
|
+
function isCliTranscriptHeader(line) {
|
|
3
|
+
return /^\[(acpx|client|tool|done|error|warning)\](?:\s|$)/i.test(line);
|
|
4
|
+
}
|
|
5
|
+
function buildStructuredResultInstructions() {
|
|
6
|
+
return [
|
|
7
|
+
`Structured result handoff:`,
|
|
8
|
+
`- If the task asks for structuredResult, field backfill, Meego field output, attachments, or aamp_send_result, include a final ${STRUCTURED_RESULT_MARKER} block.`,
|
|
9
|
+
`- The block must be valid JSON and may include output, structuredResult, and attachments.`,
|
|
10
|
+
`- Attachment entries should include filename, contentType, and path.`,
|
|
11
|
+
`- Use this shape:`,
|
|
12
|
+
`${STRUCTURED_RESULT_MARKER}`,
|
|
13
|
+
'```json',
|
|
14
|
+
'{"output":"Human-readable summary.","attachments":[{"filename":"file.zip","contentType":"application/zip","path":"/absolute/path/to/file.zip"}],"structuredResult":[{"fieldKey":"<fieldKey>","fieldTypeKey":"<fieldTypeKey>","value":"<field value>"}]}',
|
|
15
|
+
'```',
|
|
16
|
+
`- For attachment fields, also reference attached files with attachmentFilenames.`,
|
|
17
|
+
`- The bridge strips this block from the visible reply, sends structuredResult as X-AAMP-StructuredResult, and sends attachments as email attachments.`,
|
|
18
|
+
].join('\n');
|
|
19
|
+
}
|
|
20
|
+
function sanitizeAgentResponse(output) {
|
|
21
|
+
const trimmed = output.trim();
|
|
22
|
+
if (!trimmed)
|
|
23
|
+
return '';
|
|
24
|
+
if (!trimmed.split(/\r?\n/).some((line) => isCliTranscriptHeader(line))) {
|
|
25
|
+
return trimmed;
|
|
26
|
+
}
|
|
27
|
+
const lines = trimmed.replace(/\r\n/g, '\n').split('\n');
|
|
28
|
+
const textBlocks = [];
|
|
29
|
+
let currentBlock = [];
|
|
30
|
+
let skippingTranscriptDetails = false;
|
|
31
|
+
const flushBlock = () => {
|
|
32
|
+
const block = currentBlock.join('\n').trim();
|
|
33
|
+
if (block)
|
|
34
|
+
textBlocks.push(block);
|
|
35
|
+
currentBlock = [];
|
|
36
|
+
};
|
|
37
|
+
for (const line of lines) {
|
|
38
|
+
if (isCliTranscriptHeader(line)) {
|
|
39
|
+
flushBlock();
|
|
40
|
+
skippingTranscriptDetails = true;
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (skippingTranscriptDetails) {
|
|
44
|
+
if (!line || /^[ \t]+/.test(line)) {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
skippingTranscriptDetails = false;
|
|
48
|
+
}
|
|
49
|
+
currentBlock.push(line);
|
|
50
|
+
}
|
|
51
|
+
flushBlock();
|
|
52
|
+
return textBlocks.at(-1) ?? '';
|
|
53
|
+
}
|
|
54
|
+
function asRecord(value) {
|
|
55
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
56
|
+
return null;
|
|
57
|
+
return value;
|
|
58
|
+
}
|
|
59
|
+
function asString(value) {
|
|
60
|
+
return typeof value === 'string' && value.trim() ? value.trim() : undefined;
|
|
61
|
+
}
|
|
62
|
+
function normalizeStructuredResultField(value) {
|
|
63
|
+
const record = asRecord(value);
|
|
64
|
+
if (!record)
|
|
65
|
+
return null;
|
|
66
|
+
const fieldKey = asString(record.fieldKey);
|
|
67
|
+
const fieldTypeKey = asString(record.fieldTypeKey);
|
|
68
|
+
const fieldAlias = asString(record.fieldAlias);
|
|
69
|
+
const index = asString(record.index);
|
|
70
|
+
const attachmentFilenames = Array.isArray(record.attachmentFilenames)
|
|
71
|
+
&& record.attachmentFilenames.every((item) => typeof item === 'string')
|
|
72
|
+
? record.attachmentFilenames
|
|
73
|
+
: undefined;
|
|
74
|
+
const hasValue = Object.prototype.hasOwnProperty.call(record, 'value');
|
|
75
|
+
if (!fieldKey && !fieldTypeKey && !fieldAlias && !index && !attachmentFilenames?.length && !hasValue) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
...(fieldKey ? { fieldKey } : {}),
|
|
80
|
+
...(fieldTypeKey ? { fieldTypeKey } : {}),
|
|
81
|
+
...(hasValue ? { value: record.value } : {}),
|
|
82
|
+
...(fieldAlias ? { fieldAlias } : {}),
|
|
83
|
+
...(index ? { index } : {}),
|
|
84
|
+
...(attachmentFilenames ? { attachmentFilenames } : {}),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function normalizeStructuredResult(value) {
|
|
88
|
+
if (!Array.isArray(value))
|
|
89
|
+
return undefined;
|
|
90
|
+
const fields = value
|
|
91
|
+
.map((item) => normalizeStructuredResultField(item))
|
|
92
|
+
.filter((item) => item != null);
|
|
93
|
+
return fields.length ? fields : undefined;
|
|
94
|
+
}
|
|
95
|
+
function normalizeAttachmentRef(value) {
|
|
96
|
+
if (typeof value === 'string' && value.trim()) {
|
|
97
|
+
return { path: value.trim() };
|
|
98
|
+
}
|
|
99
|
+
const record = asRecord(value);
|
|
100
|
+
if (!record)
|
|
101
|
+
return null;
|
|
102
|
+
const path = asString(record.path ?? record.filePath ?? record.file);
|
|
103
|
+
if (!path)
|
|
104
|
+
return null;
|
|
105
|
+
const filename = asString(record.filename ?? record.name);
|
|
106
|
+
const contentType = asString(record.contentType ?? record.mimeType ?? record.type);
|
|
107
|
+
return {
|
|
108
|
+
path,
|
|
109
|
+
...(filename ? { filename } : {}),
|
|
110
|
+
...(contentType ? { contentType } : {}),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function normalizeAttachments(value) {
|
|
114
|
+
if (typeof value === 'string') {
|
|
115
|
+
const attachment = normalizeAttachmentRef(value);
|
|
116
|
+
return attachment ? [attachment] : undefined;
|
|
117
|
+
}
|
|
118
|
+
if (!Array.isArray(value))
|
|
119
|
+
return undefined;
|
|
120
|
+
const attachments = value
|
|
121
|
+
.map((item) => normalizeAttachmentRef(item))
|
|
122
|
+
.filter((item) => item != null);
|
|
123
|
+
return attachments.length ? attachments : undefined;
|
|
124
|
+
}
|
|
125
|
+
function parseStructuredPayload(value) {
|
|
126
|
+
const record = asRecord(value);
|
|
127
|
+
const structuredResult = Array.isArray(value)
|
|
128
|
+
? normalizeStructuredResult(value)
|
|
129
|
+
: normalizeStructuredResult(record?.structuredResult ?? record?.structured_result);
|
|
130
|
+
const attachments = normalizeAttachments(record?.attachments ?? record?.attachment);
|
|
131
|
+
const output = asString(record?.output);
|
|
132
|
+
if (!output && !structuredResult?.length && !attachments?.length)
|
|
133
|
+
return null;
|
|
134
|
+
return {
|
|
135
|
+
...(output ? { output } : {}),
|
|
136
|
+
...(structuredResult ? { structuredResult } : {}),
|
|
137
|
+
...(attachments ? { attachments } : {}),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
function extractBalancedJsonRange(source) {
|
|
141
|
+
const start = source.search(/[\[{]/);
|
|
142
|
+
if (start < 0)
|
|
143
|
+
return null;
|
|
144
|
+
const stack = [];
|
|
145
|
+
let inString = false;
|
|
146
|
+
let escaped = false;
|
|
147
|
+
for (let i = start; i < source.length; i += 1) {
|
|
148
|
+
const char = source[i];
|
|
149
|
+
if (inString) {
|
|
150
|
+
if (escaped) {
|
|
151
|
+
escaped = false;
|
|
152
|
+
}
|
|
153
|
+
else if (char === '\\') {
|
|
154
|
+
escaped = true;
|
|
155
|
+
}
|
|
156
|
+
else if (char === '"') {
|
|
157
|
+
inString = false;
|
|
158
|
+
}
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
if (char === '"') {
|
|
162
|
+
inString = true;
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
if (char === '{' || char === '[') {
|
|
166
|
+
stack.push(char);
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
if (char !== '}' && char !== ']')
|
|
170
|
+
continue;
|
|
171
|
+
const opener = stack.pop();
|
|
172
|
+
if ((char === '}' && opener !== '{') || (char === ']' && opener !== '[')) {
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
if (stack.length === 0) {
|
|
176
|
+
return {
|
|
177
|
+
jsonText: source.slice(start, i + 1),
|
|
178
|
+
start,
|
|
179
|
+
end: i + 1,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
function extractJsonFromMaybeFence(source) {
|
|
186
|
+
const trimmedStart = source.search(/\S/);
|
|
187
|
+
if (trimmedStart < 0)
|
|
188
|
+
return null;
|
|
189
|
+
const body = source.slice(trimmedStart);
|
|
190
|
+
const fenceMatch = /^```(?:json)?\s*\n?([\s\S]*?)\n?```/i.exec(body);
|
|
191
|
+
if (fenceMatch) {
|
|
192
|
+
const jsonText = fenceMatch[1].trim();
|
|
193
|
+
return {
|
|
194
|
+
jsonText,
|
|
195
|
+
start: trimmedStart,
|
|
196
|
+
end: trimmedStart + fenceMatch[0].length,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
return extractBalancedJsonRange(source);
|
|
200
|
+
}
|
|
201
|
+
function parsePayloadJson(jsonText) {
|
|
202
|
+
try {
|
|
203
|
+
return parseStructuredPayload(JSON.parse(jsonText));
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
function extractMarkedStructuredPayload(text) {
|
|
210
|
+
const markerIndex = text.lastIndexOf(STRUCTURED_RESULT_MARKER);
|
|
211
|
+
if (markerIndex < 0)
|
|
212
|
+
return null;
|
|
213
|
+
const before = text.slice(0, markerIndex).trim();
|
|
214
|
+
const after = text.slice(markerIndex + STRUCTURED_RESULT_MARKER.length);
|
|
215
|
+
const jsonRange = extractJsonFromMaybeFence(after);
|
|
216
|
+
if (!jsonRange)
|
|
217
|
+
return null;
|
|
218
|
+
const payload = parsePayloadJson(jsonRange.jsonText);
|
|
219
|
+
if (!payload)
|
|
220
|
+
return null;
|
|
221
|
+
const trailing = after.slice(jsonRange.end).trim();
|
|
222
|
+
const visibleOutput = payload.output ?? [before, trailing].filter(Boolean).join('\n\n').trim();
|
|
223
|
+
return {
|
|
224
|
+
output: visibleOutput,
|
|
225
|
+
...(payload.structuredResult ? { structuredResult: payload.structuredResult } : {}),
|
|
226
|
+
...(payload.attachments ? { attachments: payload.attachments } : {}),
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
function extractWholeJsonStructuredPayload(text) {
|
|
230
|
+
const trimmed = text.trim();
|
|
231
|
+
const range = extractJsonFromMaybeFence(trimmed);
|
|
232
|
+
if (!range || range.start !== 0 || range.end !== trimmed.length)
|
|
233
|
+
return null;
|
|
234
|
+
const payload = parsePayloadJson(range.jsonText);
|
|
235
|
+
if (!payload)
|
|
236
|
+
return null;
|
|
237
|
+
return {
|
|
238
|
+
output: payload.output ?? '',
|
|
239
|
+
...(payload.structuredResult ? { structuredResult: payload.structuredResult } : {}),
|
|
240
|
+
...(payload.attachments ? { attachments: payload.attachments } : {}),
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
function extractLooseStructuredResult(text) {
|
|
244
|
+
const match = /(?:^|\n)\s*structuredResult\s*:\s*/i.exec(text);
|
|
245
|
+
if (!match)
|
|
246
|
+
return null;
|
|
247
|
+
const valueStart = match.index + match[0].length;
|
|
248
|
+
const after = text.slice(valueStart);
|
|
249
|
+
const range = extractBalancedJsonRange(after);
|
|
250
|
+
if (!range)
|
|
251
|
+
return null;
|
|
252
|
+
const structuredResult = normalizeStructuredResult(JSON.parse(range.jsonText));
|
|
253
|
+
if (!structuredResult?.length)
|
|
254
|
+
return null;
|
|
255
|
+
const before = text.slice(0, match.index).trim();
|
|
256
|
+
const trailing = after.slice(range.end).trim();
|
|
257
|
+
return {
|
|
258
|
+
output: [before, trailing].filter(Boolean).join('\n\n').trim(),
|
|
259
|
+
structuredResult,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
function extractResultPayload(text) {
|
|
263
|
+
const marked = extractMarkedStructuredPayload(text);
|
|
264
|
+
if (marked)
|
|
265
|
+
return marked;
|
|
266
|
+
const wholeJson = extractWholeJsonStructuredPayload(text);
|
|
267
|
+
if (wholeJson)
|
|
268
|
+
return wholeJson;
|
|
269
|
+
try {
|
|
270
|
+
const loose = extractLooseStructuredResult(text);
|
|
271
|
+
if (loose)
|
|
272
|
+
return loose;
|
|
273
|
+
}
|
|
274
|
+
catch {
|
|
275
|
+
// Fall through to plain text if a loose structuredResult block is malformed.
|
|
276
|
+
}
|
|
277
|
+
return { output: text.trim() };
|
|
278
|
+
}
|
|
279
|
+
function hasPromptRules(task) {
|
|
280
|
+
return Boolean(task.promptRules?.trim());
|
|
281
|
+
}
|
|
282
|
+
function isConversationalTask(task) {
|
|
283
|
+
if (hasPromptRules(task))
|
|
284
|
+
return false;
|
|
285
|
+
const source = task.dispatchContext?.source?.trim().toLowerCase();
|
|
286
|
+
return source === 'feishu' || source === 'wechat' || source === 'ios';
|
|
287
|
+
}
|
|
288
|
+
function displayAgentName(task, agentName) {
|
|
289
|
+
const trimmed = agentName?.trim();
|
|
290
|
+
if (trimmed)
|
|
291
|
+
return trimmed;
|
|
292
|
+
return task.to.split('@')[0] || 'the connected agent';
|
|
293
|
+
}
|
|
294
|
+
function renderTaskPromptRules(promptRules) {
|
|
295
|
+
const override = promptRules?.trim();
|
|
296
|
+
if (override)
|
|
297
|
+
return [override];
|
|
298
|
+
return [
|
|
299
|
+
`Execution rules:`,
|
|
300
|
+
`- Treat the Description section and any prior thread context below as the only task context you were given.`,
|
|
301
|
+
`- If that context does not contain the actual user request or is otherwise insufficient, respond with HELP instead of trying to reconstruct the task from local files, account state, or remote services.`,
|
|
302
|
+
`- Do not search outside the current working directory unless the task explicitly asks you to inspect a specific external path.`,
|
|
303
|
+
`- Do not inspect the filesystem, credentials, mailbox state, home directory, or network just to figure out what the task probably meant.`,
|
|
304
|
+
`- For simple chat messages that are fully present in the prompt, answer them directly without workspace exploration.`,
|
|
305
|
+
``,
|
|
306
|
+
`Please complete this task and output your result directly.`,
|
|
307
|
+
`Keep your final reply limited to the final user-facing result.`,
|
|
308
|
+
`Do not include planning notes, thought process, tool logs, or intermediate progress updates in the final reply.`,
|
|
309
|
+
`If you cannot complete the task and need more information, start your response with "HELP:" followed by your question.`,
|
|
310
|
+
``,
|
|
311
|
+
buildStructuredResultInstructions(),
|
|
312
|
+
``,
|
|
313
|
+
`If you create any files as part of this task, list each file path at the end of your response in this exact format:`,
|
|
314
|
+
`FILE:/absolute/path/to/file`,
|
|
315
|
+
];
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Convert an AAMP TaskDispatch into a prompt string for an ACP agent.
|
|
319
|
+
*/
|
|
320
|
+
export function buildPrompt(task, threadContextText, agentName) {
|
|
321
|
+
const agentDisplayName = displayAgentName(task, agentName);
|
|
322
|
+
const dispatchContextLines = task.dispatchContext && Object.keys(task.dispatchContext).length > 0
|
|
323
|
+
? `Dispatch Context:\n${Object.entries(task.dispatchContext).map(([key, value]) => ` - ${key}: ${value}`).join('\n')}`
|
|
324
|
+
: '';
|
|
325
|
+
const parts = isConversationalTask(task)
|
|
326
|
+
? [
|
|
327
|
+
`## AAMP Conversation Turn`,
|
|
328
|
+
``,
|
|
329
|
+
`This task came from a chat surface (${task.dispatchContext?.source ?? 'unknown'}).`,
|
|
330
|
+
`You are ${agentDisplayName}. AAMP and AAMP App are only the transport/client channel, not your identity.`,
|
|
331
|
+
`Treat it as an ongoing conversation turn, not a ticket or work order.`,
|
|
332
|
+
`Reply naturally to the user's latest message and keep the conversation moving.`,
|
|
333
|
+
``,
|
|
334
|
+
`Identity rules:`,
|
|
335
|
+
`- Do not introduce yourself as AAMP, AAMP App, or an AAMP assistant.`,
|
|
336
|
+
`- If you mention who you are, identify as ${agentDisplayName}.`,
|
|
337
|
+
``,
|
|
338
|
+
`Behavior rules:`,
|
|
339
|
+
`- A normal conversational reply is the default.`,
|
|
340
|
+
`- Greetings, acknowledgements, short follow-up questions, and direct answers are all valid replies.`,
|
|
341
|
+
`- Do not ask for clarification just because the user message is short or casual.`,
|
|
342
|
+
`- Only start your response with "HELP:" when you are truly blocked and cannot produce any meaningful reply without specific missing information.`,
|
|
343
|
+
``,
|
|
344
|
+
`Task ID: ${task.taskId}`,
|
|
345
|
+
`From: ${task.from}`,
|
|
346
|
+
`Agent: ${agentDisplayName}`,
|
|
347
|
+
`Title: ${task.title}`,
|
|
348
|
+
`Priority: ${task.priority}`,
|
|
349
|
+
dispatchContextLines,
|
|
350
|
+
task.bodyText ? `Latest user message:\n${task.bodyText}` : '',
|
|
351
|
+
threadContextText?.trim() ? threadContextText : '',
|
|
352
|
+
task.expiresAt ? `Expires At: ${task.expiresAt}` : '',
|
|
353
|
+
``,
|
|
354
|
+
`Execution rules:`,
|
|
355
|
+
`- Treat the Latest user message section and any prior thread context below as the only conversation context you were given.`,
|
|
356
|
+
`- If that context does not contain the actual user request or is otherwise insufficient, respond with HELP instead of trying to reconstruct intent from local files, account state, or remote services.`,
|
|
357
|
+
`- Do not search outside the current working directory unless the user message explicitly asks you to inspect a specific external path.`,
|
|
358
|
+
`- Do not inspect the filesystem, credentials, mailbox state, home directory, or network just to guess what the user probably meant.`,
|
|
359
|
+
`- For simple chat messages that are fully present in the prompt, answer them directly without workspace exploration.`,
|
|
360
|
+
``,
|
|
361
|
+
`Keep your final reply limited to the final user-facing message.`,
|
|
362
|
+
`Do not include planning notes, thought process, tool logs, or intermediate progress updates in the final reply.`,
|
|
363
|
+
``,
|
|
364
|
+
buildStructuredResultInstructions(),
|
|
365
|
+
``,
|
|
366
|
+
`If you create any files as part of this task, list each file path at the end of your response in this exact format:`,
|
|
367
|
+
`FILE:/absolute/path/to/file`,
|
|
368
|
+
]
|
|
369
|
+
: [
|
|
370
|
+
`## AAMP Task`,
|
|
371
|
+
` `,
|
|
372
|
+
`You are ${agentDisplayName}. AAMP and AAMP App are only the transport/client channel, not your identity.`,
|
|
373
|
+
`Do not introduce yourself as AAMP, AAMP App, or an AAMP assistant. If you mention who you are, identify as ${agentDisplayName}.`,
|
|
374
|
+
` `,
|
|
375
|
+
`Task ID: ${task.taskId}`,
|
|
376
|
+
`From: ${task.from}`,
|
|
377
|
+
`Agent: ${agentDisplayName}`,
|
|
378
|
+
`Title: ${task.title}`,
|
|
379
|
+
`Priority: ${task.priority}`,
|
|
380
|
+
dispatchContextLines,
|
|
381
|
+
` `,
|
|
382
|
+
task.bodyText ? `Description:\n${task.bodyText}` : '',
|
|
383
|
+
threadContextText?.trim() ? threadContextText : '',
|
|
384
|
+
task.expiresAt ? `Expires At: ${task.expiresAt}` : '',
|
|
385
|
+
` `,
|
|
386
|
+
...renderTaskPromptRules(task.promptRules),
|
|
387
|
+
];
|
|
388
|
+
return parts.filter(Boolean).join('\n');
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Parse an ACP agent response to detect HELP requests and extract file paths.
|
|
392
|
+
* Returns { isHelp, question, output, files }.
|
|
393
|
+
*/
|
|
394
|
+
export function parseResponse(output) {
|
|
395
|
+
const trimmed = sanitizeAgentResponse(output);
|
|
396
|
+
if (trimmed.startsWith('HELP:')) {
|
|
397
|
+
return {
|
|
398
|
+
isHelp: true,
|
|
399
|
+
question: trimmed.slice(5).trim(),
|
|
400
|
+
output: '',
|
|
401
|
+
files: [],
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
// Extract FILE: lines
|
|
405
|
+
const files = [];
|
|
406
|
+
const lines = trimmed.split('\n');
|
|
407
|
+
const outputLines = [];
|
|
408
|
+
for (const line of lines) {
|
|
409
|
+
if (line.startsWith('FILE:')) {
|
|
410
|
+
const path = line.slice(5).trim();
|
|
411
|
+
if (path)
|
|
412
|
+
files.push(path);
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
outputLines.push(line);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
const structured = extractResultPayload(outputLines.join('\n').trim());
|
|
419
|
+
return {
|
|
420
|
+
isHelp: false,
|
|
421
|
+
output: structured.output,
|
|
422
|
+
files,
|
|
423
|
+
...(structured.structuredResult ? { structuredResult: structured.structuredResult } : {}),
|
|
424
|
+
...(structured.attachments ? { attachments: structured.attachments } : {}),
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
//# sourceMappingURL=prompt-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../src/prompt-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { test } from 'node:test';
|
|
3
|
+
import { buildPrompt, parseResponse } from './prompt-builder.js';
|
|
4
|
+
function buildTask(overrides = {}) {
|
|
5
|
+
return {
|
|
6
|
+
protocolVersion: '1.1',
|
|
7
|
+
intent: 'task.dispatch',
|
|
8
|
+
taskId: 'task-1',
|
|
9
|
+
title: 'Feishu Task: 成都今天的天气怎样?',
|
|
10
|
+
priority: 'normal',
|
|
11
|
+
dispatchContext: overrides.dispatchContext,
|
|
12
|
+
from: 'bridge@meshmail.ai',
|
|
13
|
+
to: 'codex@meshmail.ai',
|
|
14
|
+
messageId: 'message-1',
|
|
15
|
+
subject: 'task dispatch',
|
|
16
|
+
bodyText: 'This Feishu task must be executed through the required runtime.',
|
|
17
|
+
...overrides,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
test('buildPrompt requires the dispatchContext required_skill path before direct answers', () => {
|
|
21
|
+
const prompt = buildPrompt(buildTask({
|
|
22
|
+
dispatchContext: {
|
|
23
|
+
source: 'feishu-task',
|
|
24
|
+
required_skill: 'example-required-skill',
|
|
25
|
+
},
|
|
26
|
+
promptRules: [
|
|
27
|
+
'Execution rules:',
|
|
28
|
+
'- Use dispatchContext.required_skill before producing a final answer.',
|
|
29
|
+
].join('\n'),
|
|
30
|
+
}), undefined, 'codex');
|
|
31
|
+
assert.match(prompt, /Execution rules:\n- Use dispatchContext\.required_skill before producing a final answer\./);
|
|
32
|
+
assert.doesNotMatch(prompt.replaceAll('required_skill: example-required-skill', ''), /example-required-skill/);
|
|
33
|
+
assert.doesNotMatch(prompt, /For simple chat messages that are fully present in the prompt, answer them directly/i);
|
|
34
|
+
assert.doesNotMatch(prompt, /Please complete this task and output your result directly/);
|
|
35
|
+
assert.doesNotMatch(prompt, /Structured result handoff:/);
|
|
36
|
+
});
|
|
37
|
+
test('buildPrompt keeps simple direct-answer guidance when no required skill is present', () => {
|
|
38
|
+
const prompt = buildPrompt(buildTask({ dispatchContext: { source: 'feishu-task' } }), undefined, 'codex');
|
|
39
|
+
assert.doesNotMatch(prompt, /Required skill execution:/);
|
|
40
|
+
assert.match(prompt, /For simple chat messages that are fully present in the prompt, answer them directly/i);
|
|
41
|
+
});
|
|
42
|
+
test('buildPrompt replaces default task prompt rules when promptRules are provided', () => {
|
|
43
|
+
const prompt = buildPrompt(buildTask({
|
|
44
|
+
promptRules: [
|
|
45
|
+
'Feishu task rules:',
|
|
46
|
+
'- Use the Feishu task runtime before any direct answer.',
|
|
47
|
+
'- Return HELP when the runtime cannot load the task.',
|
|
48
|
+
'- Do not emit structured AAMP output unless explicitly requested.',
|
|
49
|
+
].join('\n'),
|
|
50
|
+
}), undefined, 'codex');
|
|
51
|
+
assert.match(prompt, /Feishu task rules:\n- Use the Feishu task runtime before any direct answer\./);
|
|
52
|
+
assert.match(prompt, /- Return HELP when the runtime cannot load the task\./);
|
|
53
|
+
assert.match(prompt, /- Do not emit structured AAMP output unless explicitly requested\./);
|
|
54
|
+
assert.doesNotMatch(prompt, /Treat the Description section and any prior thread context below as the only task context/);
|
|
55
|
+
assert.doesNotMatch(prompt, /Please complete this task and output your result directly/);
|
|
56
|
+
assert.doesNotMatch(prompt, /Structured result handoff:/);
|
|
57
|
+
});
|
|
58
|
+
test('parseResponse extracts output-only AAMP_RESULT_JSON blocks', () => {
|
|
59
|
+
const parsed = parseResponse([
|
|
60
|
+
'AAMP_RESULT_JSON:',
|
|
61
|
+
'',
|
|
62
|
+
'',
|
|
63
|
+
'{"output":"ERROR: runtime action qualify_polled_task failed with MISSING_REQUIRED_FIELDS"}',
|
|
64
|
+
].join('\n'));
|
|
65
|
+
assert.equal(parsed.output, 'ERROR: runtime action qualify_polled_task failed with MISSING_REQUIRED_FIELDS');
|
|
66
|
+
assert.equal(parsed.isHelp, false);
|
|
67
|
+
assert.deepEqual(parsed.files, []);
|
|
68
|
+
});
|
|
69
|
+
//# sourceMappingURL=prompt-builder.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-builder.test.js","sourceRoot":"","sources":["../src/prompt-builder.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function getBridgeHomeDir(): string;
|
|
2
|
+
export declare function getDefaultConfigPath(): string;
|
|
3
|
+
export declare function getDefaultCredentialsPath(agentName: string): string;
|
|
4
|
+
export declare function getLegacyDefaultCredentialsPath(agentName: string): string;
|
|
5
|
+
export declare function isLegacyDefaultCredentialsPath(pathValue: string | undefined, agentName: string): boolean;
|
|
6
|
+
export declare function resolveConfigPath(pathValue?: string): string;
|
|
7
|
+
export declare function resolveCredentialsFile(pathValue: string | undefined, agentName: string): string;
|