mirror of
https://bitbucket.org/siakitem/my-pi.git
synced 2026-08-28 16:45:22 +00:00
228 lines
6.2 KiB
TypeScript
228 lines
6.2 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
|
|
import { buildUiPrompt } from "#src/permission-ui-prompt";
|
|
import type { PromptRequestFacts } from "#src/presentation/prompt-payload";
|
|
import { makePromptPayload } from "#test/helpers/prompt-details-fixtures";
|
|
|
|
/** A payload whose request facts carry the given overrides. */
|
|
function payloadWith(request: Partial<PromptRequestFacts> = {}) {
|
|
return makePromptPayload({
|
|
request: { ...makePromptPayload().request, ...request },
|
|
});
|
|
}
|
|
|
|
describe("buildUiPrompt", () => {
|
|
it("normalizes a skill prompt to the skill surface and skill-name value", () => {
|
|
const payload = payloadWith({ surface: "skill", value: "deploy-helper" });
|
|
expect(
|
|
buildUiPrompt({
|
|
requestId: "req-2",
|
|
source: "skill_input",
|
|
agentName: null,
|
|
payload,
|
|
skillName: "deploy-helper",
|
|
}),
|
|
).toEqual({
|
|
requestId: "req-2",
|
|
source: "skill_input",
|
|
surface: "skill",
|
|
value: "deploy-helper",
|
|
agentName: null,
|
|
request: payload.request,
|
|
forwarding: null,
|
|
});
|
|
});
|
|
|
|
it("derives value with command > path > target > skillName > toolName precedence", () => {
|
|
expect(
|
|
buildUiPrompt({
|
|
requestId: "req-3",
|
|
source: "tool_call",
|
|
agentName: null,
|
|
payload: makePromptPayload(),
|
|
toolName: "read",
|
|
path: "/etc/hosts",
|
|
target: "ignored",
|
|
}).value,
|
|
).toBe("/etc/hosts");
|
|
});
|
|
|
|
it("derives surface and value from direct fields and defaults forwarding to null", () => {
|
|
const payload = payloadWith({
|
|
surface: "bash",
|
|
toolName: "bash",
|
|
value: "git push",
|
|
matchedPattern: "git *",
|
|
});
|
|
expect(
|
|
buildUiPrompt({
|
|
requestId: "req-u1",
|
|
source: "tool_call",
|
|
agentName: "Explore",
|
|
payload,
|
|
toolName: "bash",
|
|
command: "git push",
|
|
}),
|
|
).toEqual({
|
|
requestId: "req-u1",
|
|
source: "tool_call",
|
|
surface: "bash",
|
|
value: "git push",
|
|
agentName: "Explore",
|
|
request: payload.request,
|
|
forwarding: null,
|
|
});
|
|
});
|
|
|
|
it("carries the payload's invariant core verbatim, with no evidence or annotations", () => {
|
|
const payload = makePromptPayload({
|
|
kind: "bash",
|
|
request: {
|
|
requester: { agentName: "Explore", forwarded: false, sessionId: null },
|
|
surface: "bash",
|
|
toolName: "bash",
|
|
invokedToolName: "exec_command",
|
|
value: "git push",
|
|
matchedPattern: "git *",
|
|
commandContext: "subshell",
|
|
executedUnit: "git push --force",
|
|
},
|
|
evidence: [{ label: "full command", text: "secret-ish", detail: null }],
|
|
annotations: [{ source: "judge", text: "advisory" }],
|
|
});
|
|
|
|
const event = buildUiPrompt({
|
|
requestId: "req-core",
|
|
source: "tool_call",
|
|
agentName: "Explore",
|
|
payload,
|
|
toolName: "bash",
|
|
command: "git push",
|
|
});
|
|
|
|
expect(event.request).toEqual({
|
|
requester: { agentName: "Explore", forwarded: false, sessionId: null },
|
|
surface: "bash",
|
|
toolName: "bash",
|
|
invokedToolName: "exec_command",
|
|
value: "git push",
|
|
matchedPattern: "git *",
|
|
commandContext: "subshell",
|
|
executedUnit: "git push --force",
|
|
});
|
|
// The bus is the narrowest renderer (ADR 0011 §6): no evidence reaches it.
|
|
expect(event).not.toHaveProperty("message");
|
|
expect(event).not.toHaveProperty("evidence");
|
|
expect(event).not.toHaveProperty("annotations");
|
|
});
|
|
|
|
it("uses explicit surface and value overrides in place of the derived projection", () => {
|
|
const payload = payloadWith({ surface: "external_directory" });
|
|
expect(
|
|
buildUiPrompt({
|
|
requestId: "req-u2",
|
|
source: "tool_call",
|
|
agentName: "Explore",
|
|
payload,
|
|
toolName: "bash",
|
|
command: "git push",
|
|
surface: "external_directory",
|
|
value: "/etc/hosts",
|
|
}),
|
|
).toEqual({
|
|
requestId: "req-u2",
|
|
source: "tool_call",
|
|
surface: "external_directory",
|
|
value: "/etc/hosts",
|
|
agentName: "Explore",
|
|
request: payload.request,
|
|
forwarding: null,
|
|
});
|
|
});
|
|
|
|
it("treats an explicit null surface/value override as intentional, not a fallback trigger", () => {
|
|
const payload = makePromptPayload();
|
|
expect(
|
|
buildUiPrompt({
|
|
requestId: "req-u3",
|
|
source: "tool_call",
|
|
agentName: null,
|
|
payload,
|
|
toolName: "bash",
|
|
command: "git push",
|
|
surface: null,
|
|
value: null,
|
|
}),
|
|
).toEqual({
|
|
requestId: "req-u3",
|
|
source: "tool_call",
|
|
surface: null,
|
|
value: null,
|
|
agentName: null,
|
|
request: payload.request,
|
|
forwarding: null,
|
|
});
|
|
});
|
|
|
|
it("passes forwarding context through alongside explicit display fields", () => {
|
|
const payload = payloadWith({
|
|
requester: {
|
|
agentName: "Explore",
|
|
forwarded: true,
|
|
sessionId: "child-session",
|
|
},
|
|
surface: "bash",
|
|
toolName: "bash",
|
|
value: "git push",
|
|
});
|
|
expect(
|
|
buildUiPrompt({
|
|
requestId: "req-u4",
|
|
source: "tool_call",
|
|
agentName: "Explore",
|
|
payload,
|
|
surface: "bash",
|
|
value: "git push",
|
|
forwarding: {
|
|
requesterAgentName: "Explore",
|
|
requesterSessionId: "child-session",
|
|
},
|
|
}),
|
|
).toEqual({
|
|
requestId: "req-u4",
|
|
source: "tool_call",
|
|
surface: "bash",
|
|
value: "git push",
|
|
agentName: "Explore",
|
|
request: payload.request,
|
|
forwarding: {
|
|
requesterAgentName: "Explore",
|
|
requesterSessionId: "child-session",
|
|
},
|
|
});
|
|
});
|
|
|
|
it("passes forwarding context with null requester identity through unchanged", () => {
|
|
const payload = makePromptPayload();
|
|
expect(
|
|
buildUiPrompt({
|
|
requestId: "req-fwd-null",
|
|
source: "tool_call",
|
|
agentName: null,
|
|
payload,
|
|
surface: null,
|
|
value: null,
|
|
forwarding: { requesterAgentName: null, requesterSessionId: null },
|
|
}),
|
|
).toEqual({
|
|
requestId: "req-fwd-null",
|
|
source: "tool_call",
|
|
surface: null,
|
|
value: null,
|
|
agentName: null,
|
|
request: payload.request,
|
|
forwarding: { requesterAgentName: null, requesterSessionId: null },
|
|
});
|
|
});
|
|
});
|