@koda-sl/baker-bridge 0.118.0 → 0.119.0-dev.4248c4e66
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 +0 -17
- package/dist/hono/agent-session.d.ts +0 -3
- package/dist/hono/agent-session.d.ts.map +1 -1
- package/dist/hono/agent-session.js +0 -15
- package/dist/hono/agent-session.js.map +1 -1
- package/dist/hono/agent.d.ts +0 -2
- package/dist/hono/agent.d.ts.map +1 -1
- package/dist/hono/agent.js +2 -10
- package/dist/hono/agent.js.map +1 -1
- package/dist/hono/avatar-casting.d.ts.map +1 -1
- package/dist/hono/avatar-casting.js +2 -3
- package/dist/hono/avatar-casting.js.map +1 -1
- package/dist/hono/baker-ui-tool-schemas.test.js +4 -30
- package/dist/hono/baker-ui-tool-schemas.test.js.map +1 -1
- package/dist/hono/bridge-job.d.ts +1 -13
- package/dist/hono/bridge-job.d.ts.map +1 -1
- package/dist/hono/bridge-job.js +5 -69
- package/dist/hono/bridge-job.js.map +1 -1
- package/dist/hono/bridge-job.test.js +1 -113
- package/dist/hono/bridge-job.test.js.map +1 -1
- package/dist/hono/connection-input.d.ts +1 -8
- package/dist/hono/connection-input.d.ts.map +1 -1
- package/dist/hono/connection-input.js +4 -6
- package/dist/hono/connection-input.js.map +1 -1
- package/dist/hono/connection-input.test.js +8 -17
- package/dist/hono/connection-input.test.js.map +1 -1
- package/dist/hono/convex.d.ts +0 -8
- package/dist/hono/convex.d.ts.map +1 -1
- package/dist/hono/convex.js +0 -8
- package/dist/hono/convex.js.map +1 -1
- package/dist/hono/flow-input.d.ts.map +1 -1
- package/dist/hono/flow-input.js +2 -3
- package/dist/hono/flow-input.js.map +1 -1
- package/dist/hono/prompt-context.d.ts +1 -8
- package/dist/hono/prompt-context.d.ts.map +1 -1
- package/dist/hono/prompt-context.js +7 -45
- package/dist/hono/prompt-context.js.map +1 -1
- package/dist/hono/prompt-context.test.js +1 -35
- package/dist/hono/prompt-context.test.js.map +1 -1
- package/dist/hono/relay.d.ts +1 -10
- package/dist/hono/relay.d.ts.map +1 -1
- package/dist/hono/relay.js +0 -6
- package/dist/hono/relay.js.map +1 -1
- package/dist/hono/server.d.ts.map +1 -1
- package/dist/hono/server.js +0 -22
- package/dist/hono/server.js.map +1 -1
- package/dist/hono/tag-input.d.ts +3 -122
- package/dist/hono/tag-input.d.ts.map +1 -1
- package/dist/hono/tag-input.js +17 -27
- package/dist/hono/tag-input.js.map +1 -1
- package/dist/hono/tag-input.test.js +1 -19
- package/dist/hono/tag-input.test.js.map +1 -1
- package/dist/hono/types.d.ts +0 -8
- package/dist/hono/types.d.ts.map +1 -1
- package/package.json +2 -5
- package/dist/broker/baker-api.d.ts +0 -23
- package/dist/broker/baker-api.d.ts.map +0 -1
- package/dist/broker/baker-api.js +0 -55
- package/dist/broker/baker-api.js.map +0 -1
- package/dist/broker/broker-client.d.ts +0 -10
- package/dist/broker/broker-client.d.ts.map +0 -1
- package/dist/broker/broker-client.js +0 -60
- package/dist/broker/broker-client.js.map +0 -1
- package/dist/broker/ca.d.ts +0 -38
- package/dist/broker/ca.d.ts.map +0 -1
- package/dist/broker/ca.js +0 -80
- package/dist/broker/ca.js.map +0 -1
- package/dist/broker/ca.test.d.ts +0 -2
- package/dist/broker/ca.test.d.ts.map +0 -1
- package/dist/broker/ca.test.js +0 -58
- package/dist/broker/ca.test.js.map +0 -1
- package/dist/broker/credential-cache.d.ts +0 -24
- package/dist/broker/credential-cache.d.ts.map +0 -1
- package/dist/broker/credential-cache.js +0 -69
- package/dist/broker/credential-cache.js.map +0 -1
- package/dist/broker/credential-cache.test.d.ts +0 -2
- package/dist/broker/credential-cache.test.d.ts.map +0 -1
- package/dist/broker/credential-cache.test.js +0 -120
- package/dist/broker/credential-cache.test.js.map +0 -1
- package/dist/broker/credential-text.d.ts +0 -45
- package/dist/broker/credential-text.d.ts.map +0 -1
- package/dist/broker/credential-text.js +0 -103
- package/dist/broker/credential-text.js.map +0 -1
- package/dist/broker/credential-text.test.d.ts +0 -2
- package/dist/broker/credential-text.test.d.ts.map +0 -1
- package/dist/broker/credential-text.test.js +0 -54
- package/dist/broker/credential-text.test.js.map +0 -1
- package/dist/broker/env.d.ts +0 -19
- package/dist/broker/env.d.ts.map +0 -1
- package/dist/broker/env.js +0 -16
- package/dist/broker/env.js.map +0 -1
- package/dist/broker/main.d.ts +0 -3
- package/dist/broker/main.d.ts.map +0 -1
- package/dist/broker/main.js +0 -51
- package/dist/broker/main.js.map +0 -1
- package/dist/broker/proxy.d.ts +0 -24
- package/dist/broker/proxy.d.ts.map +0 -1
- package/dist/broker/proxy.integration.test.d.ts +0 -2
- package/dist/broker/proxy.integration.test.d.ts.map +0 -1
- package/dist/broker/proxy.integration.test.js +0 -201
- package/dist/broker/proxy.integration.test.js.map +0 -1
- package/dist/broker/proxy.js +0 -147
- package/dist/broker/proxy.js.map +0 -1
- package/dist/broker/rewrite.d.ts +0 -44
- package/dist/broker/rewrite.d.ts.map +0 -1
- package/dist/broker/rewrite.js +0 -291
- package/dist/broker/rewrite.js.map +0 -1
- package/dist/broker/rewrite.test.d.ts +0 -2
- package/dist/broker/rewrite.test.d.ts.map +0 -1
- package/dist/broker/rewrite.test.js +0 -171
- package/dist/broker/rewrite.test.js.map +0 -1
- package/dist/broker/socket-service.d.ts +0 -18
- package/dist/broker/socket-service.d.ts.map +0 -1
- package/dist/broker/socket-service.js +0 -103
- package/dist/broker/socket-service.js.map +0 -1
- package/dist/broker/socket-service.test.d.ts +0 -2
- package/dist/broker/socket-service.test.d.ts.map +0 -1
- package/dist/broker/socket-service.test.js +0 -73
- package/dist/broker/socket-service.test.js.map +0 -1
- package/dist/broker/token-bucket.d.ts +0 -9
- package/dist/broker/token-bucket.d.ts.map +0 -1
- package/dist/broker/token-bucket.js +0 -18
- package/dist/broker/token-bucket.js.map +0 -1
- package/dist/broker/usage-reporter.d.ts +0 -18
- package/dist/broker/usage-reporter.d.ts.map +0 -1
- package/dist/broker/usage-reporter.js +0 -31
- package/dist/broker/usage-reporter.js.map +0 -1
- package/dist/broker/usage-reporter.test.d.ts +0 -2
- package/dist/broker/usage-reporter.test.d.ts.map +0 -1
- package/dist/broker/usage-reporter.test.js +0 -20
- package/dist/broker/usage-reporter.test.js.map +0 -1
- package/dist/hono/blocking-card.d.ts +0 -12
- package/dist/hono/blocking-card.d.ts.map +0 -1
- package/dist/hono/blocking-card.js +0 -12
- package/dist/hono/blocking-card.js.map +0 -1
- package/dist/hono/credential-input.d.ts +0 -39
- package/dist/hono/credential-input.d.ts.map +0 -1
- package/dist/hono/credential-input.js +0 -78
- package/dist/hono/credential-input.js.map +0 -1
- package/dist/hono/credential-scrub.d.ts +0 -41
- package/dist/hono/credential-scrub.d.ts.map +0 -1
- package/dist/hono/credential-scrub.js +0 -152
- package/dist/hono/credential-scrub.js.map +0 -1
- package/dist/hono/credential-scrub.test.d.ts +0 -2
- package/dist/hono/credential-scrub.test.d.ts.map +0 -1
- package/dist/hono/credential-scrub.test.js +0 -105
- package/dist/hono/credential-scrub.test.js.map +0 -1
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import { credentialScrubHooks, scrubToolResponse } from "./credential-scrub.js";
|
|
3
|
-
const fakeScrub = (text) => Promise.resolve(text.split("shpat_secret_value").join("{{credential:shop}}"));
|
|
4
|
-
/** The broker socket refuses a body over 2 MB. */
|
|
5
|
-
const socketScrub = (text) => Buffer.byteLength(JSON.stringify({ text })) > 2 * 1024 * 1024
|
|
6
|
-
? Promise.reject(new Error("credential broker /scrub answered 413"))
|
|
7
|
-
: fakeScrub(text);
|
|
8
|
-
describe("scrubToolResponse", () => {
|
|
9
|
-
it("replaces a credential value anywhere in a tool result, keeping its shape", async () => {
|
|
10
|
-
const response = { stdout: "token=shpat_secret_value\n", stderr: "", nested: [{ body: "x shpat_secret_value" }] };
|
|
11
|
-
await expect(scrubToolResponse(response, fakeScrub)).resolves.toEqual({
|
|
12
|
-
changed: true,
|
|
13
|
-
response: { stdout: "token={{credential:shop}}\n", stderr: "", nested: [{ body: "x {{credential:shop}}" }] },
|
|
14
|
-
});
|
|
15
|
-
});
|
|
16
|
-
it("reports no change when nothing in the result was a credential", async () => {
|
|
17
|
-
await expect(scrubToolResponse({ stdout: "ok" }, fakeScrub)).resolves.toEqual({
|
|
18
|
-
changed: false,
|
|
19
|
-
response: { stdout: "ok" },
|
|
20
|
-
});
|
|
21
|
-
});
|
|
22
|
-
it("leaves large media untouched instead of withholding the whole result", async () => {
|
|
23
|
-
const media = Buffer.alloc(3 * 1024 * 1024, 7).toString("base64");
|
|
24
|
-
const response = [
|
|
25
|
-
{ type: "image", source: { data: media } },
|
|
26
|
-
{ type: "text", text: "shpat_secret_value" },
|
|
27
|
-
];
|
|
28
|
-
const result = await scrubToolResponse(response, socketScrub);
|
|
29
|
-
expect(result).toEqual({
|
|
30
|
-
changed: true,
|
|
31
|
-
response: [
|
|
32
|
-
{ type: "image", source: { data: media } },
|
|
33
|
-
{ type: "text", text: "{{credential:shop}}" },
|
|
34
|
-
],
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
it("checks a result larger than one broker call in several calls", async () => {
|
|
38
|
-
const chunk = `${"log line\n".repeat(80_000)}shpat_secret_value`;
|
|
39
|
-
const response = { outputs: [chunk, chunk, chunk] };
|
|
40
|
-
const result = await scrubToolResponse(response, socketScrub);
|
|
41
|
-
const scrubbedChunk = `${"log line\n".repeat(80_000)}{{credential:shop}}`;
|
|
42
|
-
expect(result).toEqual({ changed: true, response: { outputs: [scrubbedChunk, scrubbedChunk, scrubbedChunk] } });
|
|
43
|
-
});
|
|
44
|
-
it("withholds only a text over 1 MB, and still checks the rest", async () => {
|
|
45
|
-
const response = { stdout: "word ".repeat(210_000), stderr: "shpat_secret_value" };
|
|
46
|
-
const result = await scrubToolResponse(response, socketScrub);
|
|
47
|
-
expect(result).toEqual({
|
|
48
|
-
changed: true,
|
|
49
|
-
response: { stdout: expect.stringContaining("withheld"), stderr: "{{credential:shop}}" },
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
it("scrubs a text that contains the separator byte without misaligning the others", async () => {
|
|
53
|
-
const response = { stdout: "bin\u0000ary shpat_secret_value", stderr: "shpat_secret_value" };
|
|
54
|
-
await expect(scrubToolResponse(response, fakeScrub)).resolves.toEqual({
|
|
55
|
-
changed: true,
|
|
56
|
-
response: { stdout: "bin\u0000ary {{credential:shop}}", stderr: "{{credential:shop}}" },
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
async function runHook(response, options) {
|
|
61
|
-
const hook = credentialScrubHooks(options).PostToolUse?.[0]?.hooks[0];
|
|
62
|
-
if (hook === undefined)
|
|
63
|
-
throw new Error("no PostToolUse hook");
|
|
64
|
-
const output = await hook({
|
|
65
|
-
hook_event_name: "PostToolUse",
|
|
66
|
-
tool_name: "Read",
|
|
67
|
-
tool_input: {},
|
|
68
|
-
tool_response: response,
|
|
69
|
-
tool_use_id: "t1",
|
|
70
|
-
session_id: "s",
|
|
71
|
-
transcript_path: "",
|
|
72
|
-
cwd: "/",
|
|
73
|
-
}, "t1", { signal: new AbortController().signal });
|
|
74
|
-
return "hookSpecificOutput" in output && output.hookSpecificOutput?.hookEventName === "PostToolUse"
|
|
75
|
-
? output.hookSpecificOutput.updatedToolOutput
|
|
76
|
-
: undefined;
|
|
77
|
-
}
|
|
78
|
-
describe("credentialScrubHooks", () => {
|
|
79
|
-
it("withholds a result it could not check in the tool's own shape, which the SDK only accepts", async () => {
|
|
80
|
-
const read = {
|
|
81
|
-
type: "text",
|
|
82
|
-
file: { filePath: "/repo/.env", content: "TOKEN=shpat_secret_value", numLines: 1, startLine: 1, totalLines: 1 },
|
|
83
|
-
};
|
|
84
|
-
const output = await runHook(read, {
|
|
85
|
-
scrub: () => Promise.reject(new Error("credential broker /scrub timed out")),
|
|
86
|
-
brokerRunning: () => true,
|
|
87
|
-
});
|
|
88
|
-
expect(output).toEqual({
|
|
89
|
-
type: "text",
|
|
90
|
-
file: {
|
|
91
|
-
filePath: expect.stringContaining("withheld"),
|
|
92
|
-
content: expect.stringContaining("withheld"),
|
|
93
|
-
numLines: 1,
|
|
94
|
-
startLine: 1,
|
|
95
|
-
totalLines: 1,
|
|
96
|
-
},
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
it("leaves a result alone when no broker runs, however large", async () => {
|
|
100
|
-
const response = { stdout: "word ".repeat(210_000) };
|
|
101
|
-
const output = await runHook(response, { scrub: fakeScrub, brokerRunning: () => false });
|
|
102
|
-
expect(output).toBeUndefined();
|
|
103
|
-
});
|
|
104
|
-
});
|
|
105
|
-
//# sourceMappingURL=credential-scrub.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"credential-scrub.test.js","sourceRoot":"","sources":["../../src/hono/credential-scrub.test.ts"],"names":[],"mappings":"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"}
|