@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,5 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
|
-
import {
|
|
2
|
+
import { normalizeTagInputToolInput, parseTagChangeResolution, sanitizeTagChanges, unknownPrefillMessage, } from "./tag-input.js";
|
|
3
3
|
describe("unknownPrefillMessage", () => {
|
|
4
4
|
it("names the invented fields and the real ones for a code tag", () => {
|
|
5
5
|
const message = unknownPrefillMessage([
|
|
@@ -51,17 +51,6 @@ describe("normalizeTagInputToolInput", () => {
|
|
|
51
51
|
});
|
|
52
52
|
});
|
|
53
53
|
describe("sanitizeTagChanges", () => {
|
|
54
|
-
it("keeps a secret field that names a saved credential, since the placeholder is not a value", () => {
|
|
55
|
-
const [sanitized] = sanitizeTagChanges([
|
|
56
|
-
{
|
|
57
|
-
mode: "create",
|
|
58
|
-
tagType: "meta",
|
|
59
|
-
prefilledConfig: { pixelId: "123", accessToken: "{{credential:meta-token}}" },
|
|
60
|
-
},
|
|
61
|
-
]);
|
|
62
|
-
expect(sanitized.prefilledConfig).toEqual({ pixelId: "123", accessToken: "{{credential:meta-token}}" });
|
|
63
|
-
expect(sanitized.requestedSecretFields).toBeUndefined();
|
|
64
|
-
});
|
|
65
54
|
it("moves leaked secret prefill values into requested fields, dropping the value", () => {
|
|
66
55
|
const [sanitized] = sanitizeTagChanges([
|
|
67
56
|
{ mode: "create", tagType: "meta", prefilledConfig: { pixelId: "123", accessToken: "EAAB-leak" } },
|
|
@@ -129,11 +118,4 @@ describe("parseTagChangeResolution", () => {
|
|
|
129
118
|
expect(parseTagChangeResolution(null)).toBeNull();
|
|
130
119
|
});
|
|
131
120
|
});
|
|
132
|
-
describe("bakerUiTools", () => {
|
|
133
|
-
it("offers request_credential only in a Runtime with Credentials", () => {
|
|
134
|
-
const names = (credentials) => bakerUiTools({ credentials }).map((definition) => definition.name);
|
|
135
|
-
expect(names(false)).not.toContain("request_credential");
|
|
136
|
-
expect(names(true)).toContain("request_credential");
|
|
137
|
-
});
|
|
138
|
-
});
|
|
139
121
|
//# sourceMappingURL=tag-input.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tag-input.test.js","sourceRoot":"","sources":["../../src/hono/tag-input.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"tag-input.test.js","sourceRoot":"","sources":["../../src/hono/tag-input.test.ts"],"names":[],"mappings":"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"}
|
package/dist/hono/types.d.ts
CHANGED
|
@@ -61,8 +61,6 @@ export interface AsyncMessageRequest {
|
|
|
61
61
|
history?: DispatchHistorySnapshot;
|
|
62
62
|
turnId: string;
|
|
63
63
|
currentReference?: CurrentReference;
|
|
64
|
-
/** The saved credentials the message names as `{{credential:NAME}}`: metadata only, never a value. */
|
|
65
|
-
credentials?: PromptCredential[];
|
|
66
64
|
currentSender?: DispatchSender;
|
|
67
65
|
planMode?: boolean;
|
|
68
66
|
/**
|
|
@@ -105,11 +103,5 @@ export interface ReviewTurn {
|
|
|
105
103
|
publishSummary: string;
|
|
106
104
|
};
|
|
107
105
|
}
|
|
108
|
-
/** A credential a message names, as Convex describes it. */
|
|
109
|
-
export type PromptCredential = {
|
|
110
|
-
name: string;
|
|
111
|
-
label: string;
|
|
112
|
-
allowedHosts: string[];
|
|
113
|
-
};
|
|
114
106
|
export {};
|
|
115
107
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/hono/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/hono/types.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,yBAAyB;IACjC,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yGAAyG;IACzG,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,yBAAyB,EAAE,CAAC;IAC1C,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,uEAAuE;AACvE,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,cAAc,EAAE,CAAC;IACxC,OAAO,CAAC,EAAE,uBAAuB,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/hono/types.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,yBAAyB;IACjC,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yGAAyG;IACzG,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,yBAAyB,EAAE,CAAC;IAC1C,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,uEAAuE;AACvE,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,cAAc,EAAE,CAAC;IACxC,OAAO,CAAC,EAAE,uBAAuB,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,aAAa,CAAC,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED,uEAAuE;AACvE,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC;IACf,mFAAmF;IACnF,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,gFAAgF;IAChF,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,gFAAgF;IAChF,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE;QACT,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,WAAW,GAAG,WAAW,CAAC;QACnC,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;CACH"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@koda-sl/baker-bridge",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.119.0-dev.4248c4e66",
|
|
4
4
|
"description": "HTTP server wrapping the Claude Agent SDK. Persists chat events to Convex; the dashboard subscribes via Convex realtime",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
8
|
-
"baker-bridge": "dist/cli.js"
|
|
9
|
-
"baker-credential-broker": "dist/broker/main.js"
|
|
8
|
+
"baker-bridge": "dist/cli.js"
|
|
10
9
|
},
|
|
11
10
|
"exports": {
|
|
12
11
|
"./hono": {
|
|
@@ -46,7 +45,6 @@
|
|
|
46
45
|
"@t3-oss/env-core": "^0.13.10",
|
|
47
46
|
"hono": "^4.12.25",
|
|
48
47
|
"image-size": "^2.0.2",
|
|
49
|
-
"mockttp": "4.6.3",
|
|
50
48
|
"unbash": "4.0.11",
|
|
51
49
|
"zod": "^4.3.6"
|
|
52
50
|
},
|
|
@@ -54,7 +52,6 @@
|
|
|
54
52
|
"@types/node": "25.3.0",
|
|
55
53
|
"tsx": "^4.0.0",
|
|
56
54
|
"typescript": "^7.0.2",
|
|
57
|
-
"undici": "7.29.0",
|
|
58
55
|
"vite": "7.3.2",
|
|
59
56
|
"vitest": "^4.1.8"
|
|
60
57
|
},
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import type { ResolvedCredential } from "./credential-text.ts";
|
|
2
|
-
export type CredentialUse = {
|
|
3
|
-
name: string;
|
|
4
|
-
host: string;
|
|
5
|
-
};
|
|
6
|
-
/**
|
|
7
|
-
* Baker refused the broker's token: Credentials were switched off, the company
|
|
8
|
-
* suspended, or the Runtime is no longer active. Unlike a failed request, this
|
|
9
|
-
* is an answer — the broker must stop using what it holds.
|
|
10
|
-
*/
|
|
11
|
-
export declare class CredentialsRefused extends Error {
|
|
12
|
-
readonly status: number;
|
|
13
|
-
constructor(status: number);
|
|
14
|
-
}
|
|
15
|
-
export type BakerBrokerApi = {
|
|
16
|
-
fetchCredentials(): Promise<ResolvedCredential[]>;
|
|
17
|
-
reportUsage(uses: CredentialUse[]): Promise<void>;
|
|
18
|
-
};
|
|
19
|
-
export declare function createBakerBrokerApi(options: {
|
|
20
|
-
siteUrl: string;
|
|
21
|
-
token: string;
|
|
22
|
-
}): BakerBrokerApi;
|
|
23
|
-
//# sourceMappingURL=baker-api.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"baker-api.d.ts","sourceRoot":"","sources":["../../src/broker/baker-api.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAS/D,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM;IAAnC,YAAqB,MAAM,EAAE,MAAM,EAElC;CACF;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,gBAAgB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAClD,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD,CAAC;AAIF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,cAAc,CA0BhG"}
|
package/dist/broker/baker-api.js
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The broker's two calls to Baker: fetch the company's credentials (the only
|
|
3
|
-
* route that ever returns a value) and report which were used where. The
|
|
4
|
-
* shapes mirror `brokerResolveResponseSchema` / `brokerUsageRequestSchema` in
|
|
5
|
-
* `@baker/api/credentials`, which the published bridge cannot import.
|
|
6
|
-
* Success is `{ ok: true, data }`; a failure is any non-2xx status with
|
|
7
|
-
* `{ code, error }`.
|
|
8
|
-
*/
|
|
9
|
-
import { z } from "zod";
|
|
10
|
-
const resolveResponseSchema = z.object({
|
|
11
|
-
credentials: z.array(z.object({ name: z.string(), value: z.string(), allowedHosts: z.array(z.string()) })),
|
|
12
|
-
});
|
|
13
|
-
const successSchema = z.object({ ok: z.literal(true), data: z.unknown().optional() });
|
|
14
|
-
const failureSchema = z.object({ code: z.string() });
|
|
15
|
-
/**
|
|
16
|
-
* Baker refused the broker's token: Credentials were switched off, the company
|
|
17
|
-
* suspended, or the Runtime is no longer active. Unlike a failed request, this
|
|
18
|
-
* is an answer — the broker must stop using what it holds.
|
|
19
|
-
*/
|
|
20
|
-
export class CredentialsRefused extends Error {
|
|
21
|
-
status;
|
|
22
|
-
constructor(status) {
|
|
23
|
-
super(`Baker refused the broker (${status})`);
|
|
24
|
-
this.status = status;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
const TIMEOUT_MS = 10_000;
|
|
28
|
-
export function createBakerBrokerApi(options) {
|
|
29
|
-
async function post(path, body) {
|
|
30
|
-
const response = await fetch(new URL(path, options.siteUrl), {
|
|
31
|
-
method: "POST",
|
|
32
|
-
headers: { authorization: `Broker ${options.token}`, "content-type": "application/json" },
|
|
33
|
-
body: JSON.stringify(body),
|
|
34
|
-
signal: AbortSignal.timeout(TIMEOUT_MS),
|
|
35
|
-
});
|
|
36
|
-
const payload = await response.json().catch(() => null);
|
|
37
|
-
if (response.status === 401 || response.status === 403)
|
|
38
|
-
throw new CredentialsRefused(response.status);
|
|
39
|
-
if (!response.ok) {
|
|
40
|
-
const code = failureSchema.safeParse(payload).data?.code ?? "UNKNOWN";
|
|
41
|
-
throw new Error(`${path} answered ${response.status} ${code}`);
|
|
42
|
-
}
|
|
43
|
-
return successSchema.parse(payload).data;
|
|
44
|
-
}
|
|
45
|
-
return {
|
|
46
|
-
async fetchCredentials() {
|
|
47
|
-
const data = resolveResponseSchema.parse(await post("/api/runtime/credentials/resolve", {}));
|
|
48
|
-
return data.credentials;
|
|
49
|
-
},
|
|
50
|
-
async reportUsage(uses) {
|
|
51
|
-
await post("/api/runtime/credentials/usage", { uses });
|
|
52
|
-
},
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
//# sourceMappingURL=baker-api.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"baker-api.js","sourceRoot":"","sources":["../../src/broker/baker-api.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;CAC3G,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AACtF,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAIrD;;;;GAIG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IACtB,MAAM;IAA3B,YAAqB,MAAc;QACjC,KAAK,CAAC,6BAA6B,MAAM,GAAG,CAAC,CAAC;sBAD3B,MAAM;IAE3B,CAAC;CACF;AAOD,MAAM,UAAU,GAAG,MAAM,CAAC;AAE1B,MAAM,UAAU,oBAAoB,CAAC,OAA2C;IAC9E,KAAK,UAAU,IAAI,CAAC,IAAY,EAAE,IAAa;QAC7C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE;YAC3D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,KAAK,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YACzF,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC;SACxC,CAAC,CAAC;QACH,MAAM,OAAO,GAAY,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACjE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;YAAE,MAAM,IAAI,kBAAkB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACtG,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,SAAS,CAAC;YACtE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,aAAa,QAAQ,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;IAC3C,CAAC;IAED,OAAO;QACL,KAAK,CAAC,gBAAgB;YACpB,MAAM,IAAI,GAAG,qBAAqB,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAC,CAAC;YAC7F,OAAO,IAAI,CAAC,WAAW,CAAC;QAC1B,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,IAAI;YACpB,MAAM,IAAI,CAAC,gCAAgC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export declare const DEFAULT_BROKER_SOCKET = "/run/baker/broker.sock";
|
|
2
|
-
export type BrokerClientOptions = {
|
|
3
|
-
socketPath?: string;
|
|
4
|
-
timeoutMs?: number;
|
|
5
|
-
};
|
|
6
|
-
/** Whether a broker runs in this sandbox: its socket exists. */
|
|
7
|
-
export declare function brokerRunning(options?: BrokerClientOptions): boolean;
|
|
8
|
-
/** `text` with every stored credential value replaced by its placeholder. */
|
|
9
|
-
export declare function scrubViaBroker(text: string, options?: BrokerClientOptions): Promise<string>;
|
|
10
|
-
//# sourceMappingURL=broker-client.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"broker-client.d.ts","sourceRoot":"","sources":["../../src/broker/broker-client.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,qBAAqB,2BAA2B,CAAC;AAG9D,MAAM,MAAM,mBAAmB,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAM9E,gEAAgE;AAChE,wBAAgB,aAAa,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAExE;AA+BD,6EAA6E;AAC7E,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CAQrG"}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The bridge's side of the broker socket. Dependency-free on purpose: the
|
|
3
|
-
* bridge imports it on the hot path of every tool result.
|
|
4
|
-
*
|
|
5
|
-
* When no broker runs (no socket file — local dev, or a Runtime without
|
|
6
|
-
* credentials) every call is a fast no-op and `scrubViaBroker` returns the
|
|
7
|
-
* text unchanged. Any other failure (timeout, 413, 429, a crashed broker) is
|
|
8
|
-
* thrown so the caller decides whether to hold the text back.
|
|
9
|
-
*/
|
|
10
|
-
import { existsSync } from "node:fs";
|
|
11
|
-
import { request } from "node:http";
|
|
12
|
-
export const DEFAULT_BROKER_SOCKET = "/run/baker/broker.sock";
|
|
13
|
-
const DEFAULT_TIMEOUT_MS = 2_000;
|
|
14
|
-
function isMissingSocket(error) {
|
|
15
|
-
return error instanceof Error && "code" in error && error.code === "ENOENT";
|
|
16
|
-
}
|
|
17
|
-
/** Whether a broker runs in this sandbox: its socket exists. */
|
|
18
|
-
export function brokerRunning(options = {}) {
|
|
19
|
-
return existsSync(options.socketPath ?? DEFAULT_BROKER_SOCKET);
|
|
20
|
-
}
|
|
21
|
-
function call(path, body, options) {
|
|
22
|
-
const socketPath = options.socketPath ?? DEFAULT_BROKER_SOCKET;
|
|
23
|
-
if (!brokerRunning(options))
|
|
24
|
-
return Promise.resolve(null);
|
|
25
|
-
return new Promise((resolve, reject) => {
|
|
26
|
-
const req = request({
|
|
27
|
-
socketPath,
|
|
28
|
-
path,
|
|
29
|
-
method: "POST",
|
|
30
|
-
headers: { "content-type": "application/json", "content-length": Buffer.byteLength(body) },
|
|
31
|
-
timeout: options.timeoutMs ?? DEFAULT_TIMEOUT_MS,
|
|
32
|
-
}, (res) => {
|
|
33
|
-
const chunks = [];
|
|
34
|
-
res.on("data", (chunk) => chunks.push(chunk));
|
|
35
|
-
res.on("end", () => {
|
|
36
|
-
const text = Buffer.concat(chunks).toString("utf8");
|
|
37
|
-
if (res.statusCode === 200)
|
|
38
|
-
resolve(text);
|
|
39
|
-
else
|
|
40
|
-
reject(new Error(`credential broker ${path} answered ${res.statusCode}`));
|
|
41
|
-
});
|
|
42
|
-
res.on("error", reject);
|
|
43
|
-
});
|
|
44
|
-
req.on("timeout", () => req.destroy(new Error(`credential broker ${path} timed out`)));
|
|
45
|
-
req.on("error", (error) => (isMissingSocket(error) ? resolve(null) : reject(error)));
|
|
46
|
-
req.end(body);
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
/** `text` with every stored credential value replaced by its placeholder. */
|
|
50
|
-
export async function scrubViaBroker(text, options = {}) {
|
|
51
|
-
const response = await call("/scrub", JSON.stringify({ text }), options);
|
|
52
|
-
if (response === null)
|
|
53
|
-
return text;
|
|
54
|
-
const parsed = JSON.parse(response);
|
|
55
|
-
if (typeof parsed === "object" && parsed !== null && "text" in parsed && typeof parsed.text === "string") {
|
|
56
|
-
return parsed.text;
|
|
57
|
-
}
|
|
58
|
-
throw new Error("credential broker /scrub answered without text");
|
|
59
|
-
}
|
|
60
|
-
//# sourceMappingURL=broker-client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"broker-client.js","sourceRoot":"","sources":["../../src/broker/broker-client.ts"],"names":[],"mappings":"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"}
|
package/dist/broker/ca.d.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
export declare const DEFAULT_CA_DIR = "/etc/baker-ca";
|
|
2
|
-
export declare const SYSTEM_CA_BUNDLE = "/etc/ssl/certs/ca-certificates.crt";
|
|
3
|
-
export type CertificateAuthority = {
|
|
4
|
-
keyPath: string;
|
|
5
|
-
certPath: string;
|
|
6
|
-
key: string;
|
|
7
|
-
cert: string;
|
|
8
|
-
};
|
|
9
|
-
/**
|
|
10
|
-
* Env for every process the agent runs. `NODE_EXTRA_CA_CERTS` adds our CA to
|
|
11
|
-
* Node's roots; the other three *replace* a client's bundle, so they name the
|
|
12
|
-
* system bundle, which carries our CA once `update-ca-certificates` ran.
|
|
13
|
-
*/
|
|
14
|
-
export declare function agentProxyEnv(options: {
|
|
15
|
-
port: number;
|
|
16
|
-
caCertPath: string;
|
|
17
|
-
/** Hosts that bypass the broker entirely, e.g. the model gateway carrying the agent's own conversation. */
|
|
18
|
-
noProxyHosts: readonly string[];
|
|
19
|
-
}): Record<string, string>;
|
|
20
|
-
/**
|
|
21
|
-
* Reuses the CA in `dir`, or creates one (key 0600, cert 0644). With
|
|
22
|
-
* `installSystemTrust`, also adds the cert to the system bundle — needs root;
|
|
23
|
-
* a failure is logged, not thrown, so the proxy still starts.
|
|
24
|
-
*/
|
|
25
|
-
export declare function ensureCertificateAuthority(options: {
|
|
26
|
-
dir?: string;
|
|
27
|
-
installSystemTrust: boolean;
|
|
28
|
-
log?: (message: string) => void;
|
|
29
|
-
}): Promise<CertificateAuthority>;
|
|
30
|
-
/**
|
|
31
|
-
* Writes the certificate to `target` as a new file. The system trust directory
|
|
32
|
-
* is under /usr/local, which the agent can write, and the broker is root: a
|
|
33
|
-
* copy would follow a link the agent planted there onto any file. Removing the
|
|
34
|
-
* name first drops such a link, and an exclusive create refuses one planted
|
|
35
|
-
* again in between rather than following it.
|
|
36
|
-
*/
|
|
37
|
-
export declare function placeTrustedCert(certPath: string, target: string): Promise<void>;
|
|
38
|
-
//# sourceMappingURL=ca.d.ts.map
|
package/dist/broker/ca.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ca.d.ts","sourceRoot":"","sources":["../../src/broker/ca.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,cAAc,kBAAkB,CAAC;AAC9C,eAAO,MAAM,gBAAgB,uCAAuC,CAAC;AAKrE,MAAM,MAAM,oBAAoB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpG;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,2GAA2G;IAC3G,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBzB;AASD;;;;GAIG;AACH,wBAAsB,0BAA0B,CAAC,OAAO,EAAE;IACxD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,OAAO,CAAC;IAC5B,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAahC;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGtF"}
|
package/dist/broker/ca.js
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The broker's certificate authority — what lets it read HTTPS the agent sends
|
|
3
|
-
* through it — and the environment that points the agent's clients at it.
|
|
4
|
-
*/
|
|
5
|
-
import { execFile } from "node:child_process";
|
|
6
|
-
import { mkdir, readFile, rm, stat, writeFile } from "node:fs/promises";
|
|
7
|
-
import { join } from "node:path";
|
|
8
|
-
import { promisify } from "node:util";
|
|
9
|
-
import { generateCACertificate } from "mockttp";
|
|
10
|
-
export const DEFAULT_CA_DIR = "/etc/baker-ca";
|
|
11
|
-
export const SYSTEM_CA_BUNDLE = "/etc/ssl/certs/ca-certificates.crt";
|
|
12
|
-
/** By absolute path: the broker runs as root and must never resolve a binary through PATH. */
|
|
13
|
-
const UPDATE_CA_CERTIFICATES = "/usr/sbin/update-ca-certificates";
|
|
14
|
-
const SYSTEM_TRUST_PATH = "/usr/local/share/ca-certificates/baker-credential-broker.crt";
|
|
15
|
-
/**
|
|
16
|
-
* Env for every process the agent runs. `NODE_EXTRA_CA_CERTS` adds our CA to
|
|
17
|
-
* Node's roots; the other three *replace* a client's bundle, so they name the
|
|
18
|
-
* system bundle, which carries our CA once `update-ca-certificates` ran.
|
|
19
|
-
*/
|
|
20
|
-
export function agentProxyEnv(options) {
|
|
21
|
-
const proxy = `http://127.0.0.1:${options.port}`;
|
|
22
|
-
const noProxy = ["localhost", "127.0.0.1", "::1", ...options.noProxyHosts].join(",");
|
|
23
|
-
return {
|
|
24
|
-
HTTPS_PROXY: proxy,
|
|
25
|
-
HTTP_PROXY: proxy,
|
|
26
|
-
https_proxy: proxy,
|
|
27
|
-
http_proxy: proxy,
|
|
28
|
-
NO_PROXY: noProxy,
|
|
29
|
-
no_proxy: noProxy,
|
|
30
|
-
NODE_USE_ENV_PROXY: "1",
|
|
31
|
-
NODE_EXTRA_CA_CERTS: options.caCertPath,
|
|
32
|
-
REQUESTS_CA_BUNDLE: SYSTEM_CA_BUNDLE,
|
|
33
|
-
SSL_CERT_FILE: SYSTEM_CA_BUNDLE,
|
|
34
|
-
CURL_CA_BUNDLE: SYSTEM_CA_BUNDLE,
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
function exists(path) {
|
|
38
|
-
return stat(path).then(() => true, () => false);
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Reuses the CA in `dir`, or creates one (key 0600, cert 0644). With
|
|
42
|
-
* `installSystemTrust`, also adds the cert to the system bundle — needs root;
|
|
43
|
-
* a failure is logged, not thrown, so the proxy still starts.
|
|
44
|
-
*/
|
|
45
|
-
export async function ensureCertificateAuthority(options) {
|
|
46
|
-
const dir = options.dir ?? DEFAULT_CA_DIR;
|
|
47
|
-
const keyPath = join(dir, "ca.key");
|
|
48
|
-
const certPath = join(dir, "ca.pem");
|
|
49
|
-
if (!(await exists(keyPath)) || !(await exists(certPath))) {
|
|
50
|
-
const ca = await generateCACertificate({ subject: { commonName: "Baker Credential Broker" }, bits: 2048 });
|
|
51
|
-
await mkdir(dir, { recursive: true, mode: 0o755 });
|
|
52
|
-
await writeFile(keyPath, ca.key, { mode: 0o600 });
|
|
53
|
-
await writeFile(certPath, ca.cert, { mode: 0o644 });
|
|
54
|
-
options.log?.(`created certificate authority in ${dir}`);
|
|
55
|
-
}
|
|
56
|
-
if (options.installSystemTrust)
|
|
57
|
-
await installSystemTrust(certPath, options.log);
|
|
58
|
-
return { keyPath, certPath, key: await readFile(keyPath, "utf8"), cert: await readFile(certPath, "utf8") };
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Writes the certificate to `target` as a new file. The system trust directory
|
|
62
|
-
* is under /usr/local, which the agent can write, and the broker is root: a
|
|
63
|
-
* copy would follow a link the agent planted there onto any file. Removing the
|
|
64
|
-
* name first drops such a link, and an exclusive create refuses one planted
|
|
65
|
-
* again in between rather than following it.
|
|
66
|
-
*/
|
|
67
|
-
export async function placeTrustedCert(certPath, target) {
|
|
68
|
-
await rm(target, { force: true });
|
|
69
|
-
await writeFile(target, await readFile(certPath), { flag: "wx", mode: 0o644 });
|
|
70
|
-
}
|
|
71
|
-
async function installSystemTrust(certPath, log) {
|
|
72
|
-
try {
|
|
73
|
-
await placeTrustedCert(certPath, SYSTEM_TRUST_PATH);
|
|
74
|
-
await promisify(execFile)(UPDATE_CA_CERTIFICATES);
|
|
75
|
-
}
|
|
76
|
-
catch (error) {
|
|
77
|
-
log?.(`could not add the certificate authority to the system bundle: ${String(error)}`);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
//# sourceMappingURL=ca.js.map
|
package/dist/broker/ca.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ca.js","sourceRoot":"","sources":["../../src/broker/ca.ts"],"names":[],"mappings":"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"}
|
package/dist/broker/ca.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ca.test.d.ts","sourceRoot":"","sources":["../../src/broker/ca.test.ts"],"names":[],"mappings":""}
|
package/dist/broker/ca.test.js
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { lstatSync, mkdtempSync, readFileSync, statSync, symlinkSync, writeFileSync } from "node:fs";
|
|
2
|
-
import { tmpdir } from "node:os";
|
|
3
|
-
import { join } from "node:path";
|
|
4
|
-
import { describe, expect, it } from "vitest";
|
|
5
|
-
import { agentProxyEnv, ensureCertificateAuthority, placeTrustedCert } from "./ca.js";
|
|
6
|
-
describe("agentProxyEnv", () => {
|
|
7
|
-
it("routes every client through the broker and trusts its CA without dropping the system roots", () => {
|
|
8
|
-
const env = agentProxyEnv({ port: 8877, caCertPath: "/etc/baker-ca/ca.pem", noProxyHosts: [] });
|
|
9
|
-
expect(env).toEqual({
|
|
10
|
-
HTTPS_PROXY: "http://127.0.0.1:8877",
|
|
11
|
-
HTTP_PROXY: "http://127.0.0.1:8877",
|
|
12
|
-
https_proxy: "http://127.0.0.1:8877",
|
|
13
|
-
http_proxy: "http://127.0.0.1:8877",
|
|
14
|
-
NO_PROXY: "localhost,127.0.0.1,::1",
|
|
15
|
-
no_proxy: "localhost,127.0.0.1,::1",
|
|
16
|
-
NODE_USE_ENV_PROXY: "1",
|
|
17
|
-
NODE_EXTRA_CA_CERTS: "/etc/baker-ca/ca.pem",
|
|
18
|
-
REQUESTS_CA_BUNDLE: "/etc/ssl/certs/ca-certificates.crt",
|
|
19
|
-
SSL_CERT_FILE: "/etc/ssl/certs/ca-certificates.crt",
|
|
20
|
-
CURL_CA_BUNDLE: "/etc/ssl/certs/ca-certificates.crt",
|
|
21
|
-
});
|
|
22
|
-
});
|
|
23
|
-
it("keeps the named hosts off the broker, so the agent's own model traffic is never rewritten", () => {
|
|
24
|
-
const env = agentProxyEnv({ port: 8877, caCertPath: "/etc/baker-ca/ca.pem", noProxyHosts: ["openrouter.ai"] });
|
|
25
|
-
expect([env.NO_PROXY, env.no_proxy]).toEqual([
|
|
26
|
-
"localhost,127.0.0.1,::1,openrouter.ai",
|
|
27
|
-
"localhost,127.0.0.1,::1,openrouter.ai",
|
|
28
|
-
]);
|
|
29
|
-
});
|
|
30
|
-
});
|
|
31
|
-
describe("ensureCertificateAuthority", () => {
|
|
32
|
-
it("creates a private key once and reuses it on the next start", async () => {
|
|
33
|
-
const dir = join(mkdtempSync(join(tmpdir(), "baker-ca-")), "ca");
|
|
34
|
-
const first = await ensureCertificateAuthority({ dir, installSystemTrust: false });
|
|
35
|
-
const second = await ensureCertificateAuthority({ dir, installSystemTrust: false });
|
|
36
|
-
expect(second).toEqual(first);
|
|
37
|
-
expect(statSync(first.keyPath).mode & 0o777).toBe(0o600);
|
|
38
|
-
expect(statSync(first.certPath).mode & 0o777).toBe(0o644);
|
|
39
|
-
expect(readFileSync(first.certPath, "utf8")).toContain("BEGIN CERTIFICATE");
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
describe("placeTrustedCert", () => {
|
|
43
|
-
it("replaces a link the agent planted where the certificate goes, and never writes through it", async () => {
|
|
44
|
-
// The trust directory is under /usr/local, which the agent can write; the broker is root.
|
|
45
|
-
const dir = mkdtempSync(join(tmpdir(), "baker-trust-"));
|
|
46
|
-
const victim = join(dir, "sudoers");
|
|
47
|
-
writeFileSync(victim, "user ALL=(ALL) ALL\n");
|
|
48
|
-
const target = join(dir, "baker-credential-broker.crt");
|
|
49
|
-
symlinkSync(victim, target);
|
|
50
|
-
const cert = join(dir, "ca.pem");
|
|
51
|
-
writeFileSync(cert, "-----BEGIN CERTIFICATE-----\n");
|
|
52
|
-
await placeTrustedCert(cert, target);
|
|
53
|
-
expect(readFileSync(victim, "utf8")).toBe("user ALL=(ALL) ALL\n");
|
|
54
|
-
expect(lstatSync(target).isSymbolicLink()).toBe(false);
|
|
55
|
-
expect(readFileSync(target, "utf8")).toBe("-----BEGIN CERTIFICATE-----\n");
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
//# sourceMappingURL=ca.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ca.test.js","sourceRoot":"","sources":["../../src/broker/ca.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { ResolvedCredential } from "./credential-text.ts";
|
|
2
|
-
export declare const CREDENTIAL_TTL_MS = 10000;
|
|
3
|
-
/** Each fetch decrypts every credential the company has; a refusal loop may force one this often at most. */
|
|
4
|
-
export declare const MIN_REFRESH_INTERVAL_MS = 5000;
|
|
5
|
-
export type FetchCredentials = () => Promise<ResolvedCredential[]>;
|
|
6
|
-
export type CredentialCache = {
|
|
7
|
-
get(): Promise<ResolvedCredential[] | null>;
|
|
8
|
-
/** Every value to scrub: the current table plus any value that has left it. */
|
|
9
|
-
scrubbable(): Promise<ResolvedCredential[]>;
|
|
10
|
-
/**
|
|
11
|
-
* Drops the table so the next read fetches it again — unless an early
|
|
12
|
-
* refresh already happened within 5 seconds. Returns whether it dropped it.
|
|
13
|
-
*/
|
|
14
|
-
refresh(): boolean;
|
|
15
|
-
/** How many credentials the last fetch returned (0 before the first). */
|
|
16
|
-
size(): number;
|
|
17
|
-
};
|
|
18
|
-
export declare function createCredentialCache(options: {
|
|
19
|
-
fetchCredentials: FetchCredentials;
|
|
20
|
-
now?: () => number;
|
|
21
|
-
ttlMs?: number;
|
|
22
|
-
log?: (message: string) => void;
|
|
23
|
-
}): CredentialCache;
|
|
24
|
-
//# sourceMappingURL=credential-cache.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"credential-cache.d.ts","sourceRoot":"","sources":["../../src/broker/credential-cache.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,eAAO,MAAM,iBAAiB,QAAS,CAAC;AACxC,6GAA6G;AAC7G,eAAO,MAAM,uBAAuB,OAAQ,CAAC;AAE7C,MAAM,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;AAEnE,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,IAAI,OAAO,CAAC,kBAAkB,EAAE,GAAG,IAAI,CAAC,CAAC;IAC5C,+EAA+E;IAC/E,UAAU,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC5C;;;OAGG;IACH,OAAO,IAAI,OAAO,CAAC;IACnB,yEAAyE;IACzE,IAAI,IAAI,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE;IAC7C,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,GAAG,eAAe,CAsDlB"}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The broker's copy of the company's credentials, fetched from Baker on first
|
|
3
|
-
* need and kept for 10 seconds. Concurrent reads share one fetch. A failed
|
|
4
|
-
* fetch keeps the last good table until the next refresh, but a refusal
|
|
5
|
-
* (`CredentialsRefused`) drops it: Baker has said no. Before any fetch
|
|
6
|
-
* has succeeded there is no table (null), which callers must treat as
|
|
7
|
-
* "credentials unavailable", not "no credentials".
|
|
8
|
-
*
|
|
9
|
-
* A value that leaves the table — refused or removed — may still be on its
|
|
10
|
-
* way back in a response to a request that carried it, so `scrubbable()`
|
|
11
|
-
* keeps scrubbing it for the broker's lifetime. It is never sent again.
|
|
12
|
-
*/
|
|
13
|
-
import { CredentialsRefused } from "./baker-api.js";
|
|
14
|
-
export const CREDENTIAL_TTL_MS = 10_000;
|
|
15
|
-
/** Each fetch decrypts every credential the company has; a refusal loop may force one this often at most. */
|
|
16
|
-
export const MIN_REFRESH_INTERVAL_MS = 5_000;
|
|
17
|
-
export function createCredentialCache(options) {
|
|
18
|
-
const now = options.now ?? Date.now;
|
|
19
|
-
const ttlMs = options.ttlMs ?? CREDENTIAL_TTL_MS;
|
|
20
|
-
let entry = null;
|
|
21
|
-
let lastGood = null;
|
|
22
|
-
let lastRefreshAt = Number.NEGATIVE_INFINITY;
|
|
23
|
-
const retired = new Map();
|
|
24
|
-
function replaceTable(next) {
|
|
25
|
-
const kept = new Set(next?.map((credential) => credential.value));
|
|
26
|
-
for (const credential of lastGood ?? []) {
|
|
27
|
-
if (!kept.has(credential.value))
|
|
28
|
-
retired.set(credential.value, credential);
|
|
29
|
-
}
|
|
30
|
-
for (const value of kept)
|
|
31
|
-
retired.delete(value);
|
|
32
|
-
lastGood = next;
|
|
33
|
-
}
|
|
34
|
-
function get() {
|
|
35
|
-
if (entry === null || now() - entry.at >= ttlMs) {
|
|
36
|
-
const table = options.fetchCredentials().then((credentials) => {
|
|
37
|
-
replaceTable(credentials);
|
|
38
|
-
return credentials;
|
|
39
|
-
}, (error) => {
|
|
40
|
-
if (error instanceof CredentialsRefused) {
|
|
41
|
-
options.log?.(`${error.message}; dropping ${lastGood?.length ?? 0} cached credentials`);
|
|
42
|
-
replaceTable(null);
|
|
43
|
-
return null;
|
|
44
|
-
}
|
|
45
|
-
options.log?.(`credential fetch failed, keeping ${lastGood?.length ?? 0} cached: ${String(error)}`);
|
|
46
|
-
return lastGood;
|
|
47
|
-
});
|
|
48
|
-
entry = { at: now(), table };
|
|
49
|
-
}
|
|
50
|
-
return entry.table;
|
|
51
|
-
}
|
|
52
|
-
return {
|
|
53
|
-
get,
|
|
54
|
-
async scrubbable() {
|
|
55
|
-
return [...((await get()) ?? []), ...retired.values()];
|
|
56
|
-
},
|
|
57
|
-
refresh() {
|
|
58
|
-
if (now() - lastRefreshAt < MIN_REFRESH_INTERVAL_MS)
|
|
59
|
-
return false;
|
|
60
|
-
lastRefreshAt = now();
|
|
61
|
-
entry = null;
|
|
62
|
-
return true;
|
|
63
|
-
},
|
|
64
|
-
size() {
|
|
65
|
-
return lastGood?.length ?? 0;
|
|
66
|
-
},
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
//# sourceMappingURL=credential-cache.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"credential-cache.js","sourceRoot":"","sources":["../../src/broker/credential-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"credential-cache.test.d.ts","sourceRoot":"","sources":["../../src/broker/credential-cache.test.ts"],"names":[],"mappings":""}
|