baa-conductor


baa-conductor / apps / conductor-daemon / src
im_wower  ·  2026-03-28

artifacts.test.js

  1import assert from "node:assert/strict";
  2import test from "node:test";
  3
  4import {
  5  DEFAULT_BAA_DELIVERY_INLINE_THRESHOLD,
  6  DEFAULT_BAA_DELIVERY_SUMMARY_LENGTH,
  7  renderBaaDeliveryMessageText
  8} from "../dist/index.js";
  9
 10function createExecutionResult(overrides = {}) {
 11  return {
 12    artifact: null,
 13    data: null,
 14    dedupeKey: "dedupe-default",
 15    details: null,
 16    error: null,
 17    httpStatus: 200,
 18    instructionId: "inst_default",
 19    message: null,
 20    ok: true,
 21    requestId: "req-default",
 22    route: {
 23      key: "local.default",
 24      method: "POST",
 25      path: "/v1/default"
 26    },
 27    target: "conductor",
 28    tool: "status",
 29    ...overrides
 30  };
 31}
 32
 33function createProcessResult(executions, instructions = []) {
 34  return {
 35    blocks: [],
 36    duplicates: [],
 37    executions,
 38    instructions,
 39    status: executions.length === 0 ? "no_instructions" : "executed"
 40  };
 41}
 42
 43test("renderBaaDeliveryMessageText renders plain-text execution details", () => {
 44  const rendered = renderBaaDeliveryMessageText(
 45    {
 46      assistantMessageId: "msg-render-plain",
 47      conversationId: "conv-render-plain",
 48      platform: "chatgpt",
 49      processResult: createProcessResult(
 50        [
 51          createExecutionResult({
 52            artifact: {
 53              resultText: JSON.stringify({
 54                data: {
 55                  a: 1,
 56                  b: 2
 57                },
 58                details: {
 59                  retryable: false
 60                },
 61                message: "command completed",
 62                ok: true
 63              }, null, 2),
 64              url: "https://conductor.makefile.so/artifact/exec/inst_render_01.txt"
 65            },
 66            data: {
 67              b: 2,
 68              a: 1
 69            },
 70            details: {
 71              retryable: false
 72            },
 73            instructionId: "inst_render_01",
 74            message: "command completed",
 75            route: {
 76              key: "local.exec",
 77              method: "POST",
 78              path: "/v1/exec"
 79            },
 80            tool: "exec"
 81          })
 82        ],
 83        [
 84          {
 85            blockIndex: 3,
 86            dedupeBasis: {
 87              assistant_message_id: "msg-render-plain",
 88              block_index: 3,
 89              conversation_id: "conv-render-plain",
 90              params: null,
 91              platform: "chatgpt",
 92              target: "conductor",
 93              tool: "exec",
 94              version: "baa.v1"
 95            },
 96            dedupeKey: "dedupe-default",
 97            envelopeVersion: "baa.v1",
 98            instructionId: "inst_render_01",
 99            params: null,
100            paramsKind: "none",
101            platform: "chatgpt",
102            rawBlock: "```baa```",
103            rawInstruction: "@conductor::exec",
104            target: "conductor",
105            tool: "exec",
106            assistantMessageId: "msg-render-plain",
107            conversationId: "conv-render-plain"
108          }
109        ]
110      )
111    }
112  );
113
114  assert.equal(rendered.executionCount, 1);
115  assert.equal(rendered.messageTruncated, false);
116  assert.match(rendered.messageText, /\[BAA 执行结果\]/u);
117  assert.match(rendered.messageText, /assistant_message_id: msg-render-plain/u);
118  assert.match(rendered.messageText, /instruction_id: inst_render_01/u);
119  assert.match(rendered.messageText, /"retryable": false/u);
120  assert.match(
121    rendered.messageText,
122    /完整结果:https:\/\/conductor\.makefile\.so\/artifact\/exec\/inst_render_01\.txt/u
123  );
124});
125
126test("renderBaaDeliveryMessageText truncates overlong output and appends artifact URL", () => {
127  const stdout = `${"A".repeat(DEFAULT_BAA_DELIVERY_INLINE_THRESHOLD)}TRUNCATED_TAIL_MARKER`;
128  const rendered = renderBaaDeliveryMessageText(
129    {
130      assistantMessageId: "msg-render-truncated",
131      conversationId: "conv-render-truncated",
132      platform: "claude",
133      processResult: createProcessResult([
134        createExecutionResult({
135          artifact: {
136            resultText: stdout,
137            url: "https://conductor.makefile.so/artifact/exec/inst_render_truncated.txt"
138          },
139          data: {
140            result: {
141              stdout
142            }
143          },
144          instructionId: "inst_render_truncated",
145          route: {
146            key: "local.exec",
147            method: "POST",
148            path: "/v1/exec"
149          },
150          tool: "exec"
151        })
152      ])
153    }
154  );
155
156  assert.equal(rendered.messageLineLimit, DEFAULT_BAA_DELIVERY_INLINE_THRESHOLD);
157  assert.equal(rendered.messageTruncated, true);
158  assert.ok(rendered.messageCharCount < stdout.length);
159  assert.match(rendered.messageText, new RegExp(`A{${DEFAULT_BAA_DELIVERY_SUMMARY_LENGTH}}`, "u"));
160  assert.doesNotMatch(rendered.messageText, /TRUNCATED_TAIL_MARKER/u);
161  assert.match(
162    rendered.messageText,
163    /完整结果:https:\/\/conductor\.makefile\.so\/artifact\/exec\/inst_render_truncated\.txt/u
164  );
165});