@koda-sl/baker-bridge 0.162.0 → 0.163.0

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.
@@ -1,3 +1,4 @@
1
+ import type { RuntimeOpenRouterTags } from "./openrouter-attribution.ts";
1
2
  /** Pinned: the thresholds its callers act on were measured against this version. */
2
3
  export declare const JEV_MODEL = "typesafe/jev-1.13";
3
4
  /** Asks each statement as a yes/no question; the probability of yes for each, or null when unanswered. */
@@ -12,5 +13,7 @@ export declare function readNouls(body: unknown, ids: readonly string[]): number
12
13
  * request), or null when Jev could not answer: no key, a timeout, an outage. There is no
13
14
  * route to fall back to, so the caller decides what null means.
14
15
  */
15
- export declare const jevJudge: (key: string | undefined) => Judge;
16
+ export declare const jevJudge: (key: string | undefined,
17
+ /** Where the call comes from, for OpenRouter (`openrouter-attribution.ts`). */
18
+ openRouterTags: RuntimeOpenRouterTags) => Judge;
16
19
  //# sourceMappingURL=jev.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"jev.d.ts","sourceRoot":"","sources":["../../src/hono/jev.ts"],"names":[],"mappings":"AAUA,oFAAoF;AACpF,eAAO,MAAM,SAAS,sBAAsB,CAAC;AAK7C,0GAA0G;AAC1G,MAAM,MAAM,KAAK,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC,KAAK,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;AACxF,MAAM,MAAM,WAAW,GAAG;IAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC;AAInE,iGAAiG;AACjG,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,CAUhF;AAED;;;;GAIG;AACH,eAAO,MAAM,QAAQ,QACb,MAAM,GAAG,SAAS,KAAG,KAuB1B,CAAC"}
1
+ {"version":3,"file":"jev.d.ts","sourceRoot":"","sources":["../../src/hono/jev.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEzE,oFAAoF;AACpF,eAAO,MAAM,SAAS,sBAAsB,CAAC;AAK7C,0GAA0G;AAC1G,MAAM,MAAM,KAAK,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC,KAAK,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;AACxF,MAAM,MAAM,WAAW,GAAG;IAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC;AAInE,iGAAiG;AACjG,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,CAUhF;AAED;;;;GAIG;AACH,eAAO,MAAM,QAAQ,QAEZ,MAAM,GAAG,SAAS;AACvB,+EAA+E;gBAC/D,qBAAqB,KACpC,KAwBF,CAAC"}
package/dist/hono/jev.js CHANGED
@@ -32,7 +32,9 @@ export function readNouls(body, ids) {
32
32
  * request), or null when Jev could not answer: no key, a timeout, an outage. There is no
33
33
  * route to fall back to, so the caller decides what null means.
34
34
  */
35
- export const jevJudge = (key) => async (questions) => {
35
+ export const jevJudge = (key,
36
+ /** Where the call comes from, for OpenRouter (`openrouter-attribution.ts`). */
37
+ openRouterTags) => async (questions) => {
36
38
  if (questions.length === 0)
37
39
  return [];
38
40
  if (!key)
@@ -41,8 +43,9 @@ export const jevJudge = (key) => async (questions) => {
41
43
  try {
42
44
  const response = await fetch(ENDPOINT, {
43
45
  method: "POST",
44
- headers: { authorization: `Bearer ${key}`, "content-type": "application/json" },
46
+ headers: { ...openRouterTags.headers, authorization: `Bearer ${key}`, "content-type": "application/json" },
45
47
  body: JSON.stringify({
48
+ ...openRouterTags.fields,
46
49
  model: JEV_MODEL,
47
50
  state: {},
48
51
  questions: Object.fromEntries(questions.map((q, i) => [ids[i], { type: "noul", instructions: q.instructions }])),
@@ -1 +1 @@
1
- {"version":3,"file":"jev.js","sourceRoot":"","sources":["../../src/hono/jev.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,oFAAoF;AACpF,MAAM,CAAC,MAAM,SAAS,GAAG,mBAAmB,CAAC;AAC7C,MAAM,QAAQ,GAAG,wCAAwC,CAAC;AAC1D,sGAAsG;AACtG,MAAM,UAAU,GAAG,KAAK,CAAC;AAMzB,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;AAE1F,iGAAiG;AACjG,MAAM,UAAU,SAAS,CAAC,IAAa,EAAE,GAAsB;IAC7D,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;QAC3C,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GACnB,CAAC,GAAuB,EAAS,EAAE,CACnC,KAAK,EAAE,SAAS,EAAE,EAAE;IAClB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;YACrC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/E,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,SAAS;gBAChB,KAAK,EAAE,EAAE;gBACT,SAAS,EAAE,MAAM,CAAC,WAAW,CAC3B,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAClF;aACF,CAAC;YACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC;SACxC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAC9B,OAAO,SAAS,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC"}
1
+ {"version":3,"file":"jev.js","sourceRoot":"","sources":["../../src/hono/jev.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,oFAAoF;AACpF,MAAM,CAAC,MAAM,SAAS,GAAG,mBAAmB,CAAC;AAC7C,MAAM,QAAQ,GAAG,wCAAwC,CAAC;AAC1D,sGAAsG;AACtG,MAAM,UAAU,GAAG,KAAK,CAAC;AAMzB,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;AAE1F,iGAAiG;AACjG,MAAM,UAAU,SAAS,CAAC,IAAa,EAAE,GAAsB;IAC7D,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;QAC3C,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GACnB,CACE,GAAuB;AACvB,+EAA+E;AAC/E,cAAqC,EAC9B,EAAE,CACX,KAAK,EAAE,SAAS,EAAE,EAAE;IAClB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACtC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;YACrC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,GAAG,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,UAAU,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC1G,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,GAAG,cAAc,CAAC,MAAM;gBACxB,KAAK,EAAE,SAAS;gBAChB,KAAK,EAAE,EAAE;gBACT,SAAS,EAAE,MAAM,CAAC,WAAW,CAC3B,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAClF;aACF,CAAC;YACF,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC;SACxC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAC9B,OAAO,SAAS,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { describe, expect, it } from "vitest";
2
2
  import { jevJudge, readNouls } from "./jev.js";
3
+ import { runtimeOpenRouterTags } from "./openrouter-attribution.js";
3
4
  describe("readNouls", () => {
4
5
  it("reads each yes/no answer asked, in order; null for a reply that does not answer them all", () => {
5
6
  expect(readNouls({ answers: { q0: { noul: 0.93 }, q1: { noul: 0.02 } } }, ["q0", "q1"])).toEqual([0.93, 0.02]);
@@ -9,7 +10,7 @@ describe("readNouls", () => {
9
10
  });
10
11
  describe("jevJudge", () => {
11
12
  it("answers nothing without a key, so the caller's fallback decides", async () => {
12
- expect(await jevJudge("")([{ instructions: { question: "Is this a question?" } }])).toBeNull();
13
+ expect(await jevJudge("", runtimeOpenRouterTags({}, { service: "bridge", feature: "bridge.toolCallGuard" }))([{ instructions: { question: "Is this a question?" } }])).toBeNull();
13
14
  });
14
15
  });
15
16
  //# sourceMappingURL=jev.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"jev.test.js","sourceRoot":"","sources":["../../src/hono/jev.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE/C,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,0FAA0F,EAAE,GAAG,EAAE;QAClG,MAAM,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC/G,MAAM,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAChF,MAAM,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,CAAC,MAAM,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,QAAQ,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACjG,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"jev.test.js","sourceRoot":"","sources":["../../src/hono/jev.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,0FAA0F,EAAE,GAAG,EAAE;QAClG,MAAM,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC/G,MAAM,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAChF,MAAM,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,CACJ,MAAM,QAAQ,CACZ,EAAE,EACF,qBAAqB,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAClF,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,QAAQ,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC,CAC3D,CAAC,QAAQ,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The tag on every OpenRouter request made from the Runtime by the bridge and by the
3
+ * agent it runs: which part of Baker sent it, from which environment, for which
4
+ * company, Session and person. A request without it did not come from Baker.
5
+ *
6
+ * A copy of `@baker/openrouter-attribution`'s shape, because the bridge is published
7
+ * on its own and imports no workspace package; keep the two in step. The backend puts
8
+ * the Runtime's facts in its environment (`BAKER_ENVIRONMENT`, `BAKER_DEPLOYMENT`,
9
+ * `BAKER_RUNTIME_COMPANY_ID`, `BAKER_ORGANIZATION_ID`, `BAKER_CHAT_ID`).
10
+ */
11
+ type RuntimeEnv = Readonly<Record<string, string | undefined>>;
12
+ export type RuntimeOpenRouterService = "agent" | "bridge";
13
+ export interface RuntimeOpenRouterTags {
14
+ headers: Record<string, string>;
15
+ fields: {
16
+ user: string;
17
+ session_id?: string;
18
+ trace: Record<string, string>;
19
+ };
20
+ }
21
+ /** Pure. `sessionId` groups the calls in OpenRouter: the thread for the agent, the chat otherwise. */
22
+ export declare function runtimeOpenRouterTags(env: RuntimeEnv, call: {
23
+ service: RuntimeOpenRouterService;
24
+ feature: string;
25
+ sessionId?: string;
26
+ userId?: string;
27
+ }): RuntimeOpenRouterTags;
28
+ /** `ANTHROPIC_CUSTOM_HEADERS` for the Claude Code CLI: one `Name: value` per line. */
29
+ export declare function anthropicCustomHeaders(headers: Readonly<Record<string, string>>): string;
30
+ export {};
31
+ //# sourceMappingURL=openrouter-attribution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter-attribution.d.ts","sourceRoot":"","sources":["../../src/hono/openrouter-attribution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,KAAK,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;AAE/D,MAAM,MAAM,wBAAwB,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE1D,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;CAC9E;AASD,sGAAsG;AACtG,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,UAAU,EACf,IAAI,EAAE;IAAE,OAAO,EAAE,wBAAwB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAChG,qBAAqB,CA6CvB;AAED,sFAAsF;AACtF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAIxF"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * The tag on every OpenRouter request made from the Runtime by the bridge and by the
3
+ * agent it runs: which part of Baker sent it, from which environment, for which
4
+ * company, Session and person. A request without it did not come from Baker.
5
+ *
6
+ * A copy of `@baker/openrouter-attribution`'s shape, because the bridge is published
7
+ * on its own and imports no workspace package; keep the two in step. The backend puts
8
+ * the Runtime's facts in its environment (`BAKER_ENVIRONMENT`, `BAKER_DEPLOYMENT`,
9
+ * `BAKER_RUNTIME_COMPANY_ID`, `BAKER_ORGANIZATION_ID`, `BAKER_CHAT_ID`).
10
+ */
11
+ const KNOWN_ENVIRONMENTS = ["production", "preview", "development", "test", "local"];
12
+ function environmentOf(env) {
13
+ const value = env.BAKER_ENVIRONMENT?.trim().toLowerCase();
14
+ return value && KNOWN_ENVIRONMENTS.includes(value) ? value : "unknown";
15
+ }
16
+ /** Pure. `sessionId` groups the calls in OpenRouter: the thread for the agent, the chat otherwise. */
17
+ export function runtimeOpenRouterTags(env, call) {
18
+ const environment = environmentOf(env);
19
+ const title = `Baker ${call.service} (${environment})`;
20
+ const sessionId = call.sessionId ?? env.BAKER_CHAT_ID;
21
+ const companyId = env.BAKER_RUNTIME_COMPANY_ID;
22
+ const optional = {
23
+ deployment: env.BAKER_DEPLOYMENT,
24
+ company_id: companyId,
25
+ organization_id: env.BAKER_ORGANIZATION_ID,
26
+ chat_id: env.BAKER_CHAT_ID,
27
+ user_id: call.userId,
28
+ };
29
+ const trace = {
30
+ trace_name: call.feature,
31
+ generation_name: call.feature,
32
+ feature: call.feature,
33
+ service: call.service,
34
+ environment,
35
+ };
36
+ for (const [key, value] of Object.entries(optional)) {
37
+ if (value)
38
+ trace[key] = value;
39
+ }
40
+ return {
41
+ headers: {
42
+ "HTTP-Referer": `https://${call.service}.${environment}.withbaker.com`,
43
+ "X-OpenRouter-Title": title,
44
+ "X-Title": title,
45
+ ...(sessionId ? { "x-session-id": sessionId } : {}),
46
+ },
47
+ fields: {
48
+ // The one field OpenRouter keeps beside the app and session: what, for which company and
49
+ // chat, by whom. The chat is here because the agent's session is its thread, not the chat.
50
+ user: [
51
+ call.feature,
52
+ companyId && `company:${companyId}`,
53
+ env.BAKER_CHAT_ID && `chat:${env.BAKER_CHAT_ID}`,
54
+ call.userId && `user:${call.userId}`,
55
+ ]
56
+ .filter(Boolean)
57
+ .join(" | ")
58
+ .slice(0, 256),
59
+ ...(sessionId ? { session_id: sessionId } : {}),
60
+ trace,
61
+ },
62
+ };
63
+ }
64
+ /** `ANTHROPIC_CUSTOM_HEADERS` for the Claude Code CLI: one `Name: value` per line. */
65
+ export function anthropicCustomHeaders(headers) {
66
+ return Object.entries(headers)
67
+ .map(([name, value]) => `${name}: ${value}`)
68
+ .join("\n");
69
+ }
70
+ //# sourceMappingURL=openrouter-attribution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter-attribution.js","sourceRoot":"","sources":["../../src/hono/openrouter-attribution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH,MAAM,kBAAkB,GAAG,CAAC,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAErF,SAAS,aAAa,CAAC,GAAe;IACpC,MAAM,KAAK,GAAG,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1D,OAAO,KAAK,IAAI,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACzE,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,qBAAqB,CACnC,GAAe,EACf,IAAiG;IAEjG,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,SAAS,IAAI,CAAC,OAAO,KAAK,WAAW,GAAG,CAAC;IACvD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,aAAa,CAAC;IACtD,MAAM,SAAS,GAAG,GAAG,CAAC,wBAAwB,CAAC;IAC/C,MAAM,QAAQ,GAAuC;QACnD,UAAU,EAAE,GAAG,CAAC,gBAAgB;QAChC,UAAU,EAAE,SAAS;QACrB,eAAe,EAAE,GAAG,CAAC,qBAAqB;QAC1C,OAAO,EAAE,GAAG,CAAC,aAAa;QAC1B,OAAO,EAAE,IAAI,CAAC,MAAM;KACrB,CAAC;IACF,MAAM,KAAK,GAA2B;QACpC,UAAU,EAAE,IAAI,CAAC,OAAO;QACxB,eAAe,EAAE,IAAI,CAAC,OAAO;QAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,WAAW;KACZ,CAAC;IACF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,IAAI,KAAK;YAAE,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAChC,CAAC;IACD,OAAO;QACL,OAAO,EAAE;YACP,cAAc,EAAE,WAAW,IAAI,CAAC,OAAO,IAAI,WAAW,gBAAgB;YACtE,oBAAoB,EAAE,KAAK;YAC3B,SAAS,EAAE,KAAK;YAChB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpD;QACD,MAAM,EAAE;YACN,yFAAyF;YACzF,2FAA2F;YAC3F,IAAI,EAAE;gBACJ,IAAI,CAAC,OAAO;gBACZ,SAAS,IAAI,WAAW,SAAS,EAAE;gBACnC,GAAG,CAAC,aAAa,IAAI,QAAQ,GAAG,CAAC,aAAa,EAAE;gBAChD,IAAI,CAAC,MAAM,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE;aACrC;iBACE,MAAM,CAAC,OAAO,CAAC;iBACf,IAAI,CAAC,KAAK,CAAC;iBACX,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;YAChB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,KAAK;SACN;KACF,CAAC;AACJ,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,sBAAsB,CAAC,OAAyC;IAC9E,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;SAC3B,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,KAAK,EAAE,CAAC;SAC3C,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=openrouter-attribution.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter-attribution.test.d.ts","sourceRoot":"","sources":["../../src/hono/openrouter-attribution.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,48 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { anthropicCustomHeaders, runtimeOpenRouterTags } from "./openrouter-attribution.js";
3
+ const env = {
4
+ BAKER_ENVIRONMENT: "production",
5
+ BAKER_DEPLOYMENT: "happy-otter-123",
6
+ BAKER_RUNTIME_COMPANY_ID: "c1",
7
+ BAKER_ORGANIZATION_ID: "o1",
8
+ BAKER_CHAT_ID: "chat1",
9
+ };
10
+ describe("runtimeOpenRouterTags", () => {
11
+ it("tags the agent's model calls with the Runtime's environment, company, Session and person", () => {
12
+ const tags = runtimeOpenRouterTags(env, { service: "agent", feature: "agent.turn", sessionId: "t1", userId: "u1" });
13
+ expect(tags.headers).toEqual({
14
+ "HTTP-Referer": "https://agent.production.withbaker.com",
15
+ "X-OpenRouter-Title": "Baker agent (production)",
16
+ "X-Title": "Baker agent (production)",
17
+ "x-session-id": "t1",
18
+ });
19
+ expect(tags.fields).toEqual({
20
+ user: "agent.turn | company:c1 | chat:chat1 | user:u1",
21
+ session_id: "t1",
22
+ trace: {
23
+ trace_name: "agent.turn",
24
+ generation_name: "agent.turn",
25
+ feature: "agent.turn",
26
+ service: "agent",
27
+ environment: "production",
28
+ deployment: "happy-otter-123",
29
+ company_id: "c1",
30
+ organization_id: "o1",
31
+ chat_id: "chat1",
32
+ user_id: "u1",
33
+ },
34
+ });
35
+ });
36
+ it("names the company without a person, and calls the environment unknown when the Runtime does not say its environment", () => {
37
+ const tags = runtimeOpenRouterTags({ BAKER_RUNTIME_COMPANY_ID: "c1" }, { service: "bridge", feature: "jev" });
38
+ expect(tags.fields.user).toBe("jev | company:c1");
39
+ expect(tags.fields.trace.environment).toBe("unknown");
40
+ expect(tags.headers["HTTP-Referer"]).toBe("https://bridge.unknown.withbaker.com");
41
+ });
42
+ });
43
+ describe("anthropicCustomHeaders", () => {
44
+ it("writes headers the way Claude Code reads ANTHROPIC_CUSTOM_HEADERS: one `Name: value` per line", () => {
45
+ expect(anthropicCustomHeaders({ "X-Title": "Baker agent (production)", "x-session-id": "t1" })).toBe("X-Title: Baker agent (production)\nx-session-id: t1");
46
+ });
47
+ });
48
+ //# sourceMappingURL=openrouter-attribution.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter-attribution.test.js","sourceRoot":"","sources":["../../src/hono/openrouter-attribution.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAE5F,MAAM,GAAG,GAAG;IACV,iBAAiB,EAAE,YAAY;IAC/B,gBAAgB,EAAE,iBAAiB;IACnC,wBAAwB,EAAE,IAAI;IAC9B,qBAAqB,EAAE,IAAI;IAC3B,aAAa,EAAE,OAAO;CACvB,CAAC;AAEF,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,0FAA0F,EAAE,GAAG,EAAE;QAClG,MAAM,IAAI,GAAG,qBAAqB,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACpH,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;YAC3B,cAAc,EAAE,wCAAwC;YACxD,oBAAoB,EAAE,0BAA0B;YAChD,SAAS,EAAE,0BAA0B;YACrC,cAAc,EAAE,IAAI;SACrB,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YAC1B,IAAI,EAAE,gDAAgD;YACtD,UAAU,EAAE,IAAI;YAChB,KAAK,EAAE;gBACL,UAAU,EAAE,YAAY;gBACxB,eAAe,EAAE,YAAY;gBAC7B,OAAO,EAAE,YAAY;gBACrB,OAAO,EAAE,OAAO;gBAChB,WAAW,EAAE,YAAY;gBACzB,UAAU,EAAE,iBAAiB;gBAC7B,UAAU,EAAE,IAAI;gBAChB,eAAe,EAAE,IAAI;gBACrB,OAAO,EAAE,OAAO;gBAChB,OAAO,EAAE,IAAI;aACd;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qHAAqH,EAAE,GAAG,EAAE;QAC7H,MAAM,IAAI,GAAG,qBAAqB,CAAC,EAAE,wBAAwB,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9G,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,+FAA+F,EAAE,GAAG,EAAE;QACvG,MAAM,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,0BAA0B,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAClG,qDAAqD,CACtD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -40,10 +40,16 @@ export declare const MODEL_CAPABILITIES_ENV = "CLAUDE_CODE_MODEL_CAPABILITIES";
40
40
  export declare const BEDROCK_SERVABLE_CAPABILITIES = "-per_turn_effort";
41
41
  /**
42
42
  * Build the `CLAUDE_CODE_EXTRA_BODY` JSON that pins this conversation to one
43
- * OpenRouter provider instance, prefers Bedrock, and keeps OpenRouter's `web`
44
- * plugin off. Our per-thread `session_id` and the plugin opt-out are
45
- * authoritative and override any inherited ones; other inherited fields
46
- * (including `provider`) are kept.
43
+ * OpenRouter provider instance, prefers Bedrock, keeps OpenRouter's `web`
44
+ * plugin off, and tags every request with whom and where it came from. Our
45
+ * per-thread `session_id`, the tag and the plugin opt-out are authoritative and
46
+ * override any inherited ones; other inherited fields (including `provider`)
47
+ * are kept.
47
48
  */
48
- export declare function buildAgentExtraBody(threadId: string, inherited?: string): string;
49
+ export declare function buildAgentExtraBody(threadId: string, inherited?: string,
50
+ /** Who the turn runs for and from where (`openrouter-attribution.ts`); ours wins over an inherited one. */
51
+ attribution?: {
52
+ user: string;
53
+ trace: Record<string, string>;
54
+ }): string;
49
55
  //# sourceMappingURL=openrouter-session.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"openrouter-session.d.ts","sourceRoot":"","sources":["../../src/hono/openrouter-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,cAAc,2BAA2B,CAAC;AA8BvD;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,sBAAsB,mCAAmC,CAAC;AACvE,eAAO,MAAM,6BAA6B,qBAAqB,CAAC;AAwDhE;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAQhF"}
1
+ {"version":3,"file":"openrouter-session.d.ts","sourceRoot":"","sources":["../../src/hono/openrouter-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,cAAc,2BAA2B,CAAC;AA8BvD;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,sBAAsB,mCAAmC,CAAC;AACvE,eAAO,MAAM,6BAA6B,qBAAqB,CAAC;AAwDhE;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM;AAClB,2GAA2G;AAC3G,WAAW,CAAC,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAC5D,MAAM,CASR"}
@@ -116,16 +116,20 @@ function parseInheritedExtraBody(inherited) {
116
116
  }
117
117
  /**
118
118
  * Build the `CLAUDE_CODE_EXTRA_BODY` JSON that pins this conversation to one
119
- * OpenRouter provider instance, prefers Bedrock, and keeps OpenRouter's `web`
120
- * plugin off. Our per-thread `session_id` and the plugin opt-out are
121
- * authoritative and override any inherited ones; other inherited fields
122
- * (including `provider`) are kept.
119
+ * OpenRouter provider instance, prefers Bedrock, keeps OpenRouter's `web`
120
+ * plugin off, and tags every request with whom and where it came from. Our
121
+ * per-thread `session_id`, the tag and the plugin opt-out are authoritative and
122
+ * override any inherited ones; other inherited fields (including `provider`)
123
+ * are kept.
123
124
  */
124
- export function buildAgentExtraBody(threadId, inherited) {
125
+ export function buildAgentExtraBody(threadId, inherited,
126
+ /** Who the turn runs for and from where (`openrouter-attribution.ts`); ours wins over an inherited one. */
127
+ attribution) {
125
128
  const parsed = parseInheritedExtraBody(inherited);
126
129
  return JSON.stringify({
127
130
  provider: PREFERRED_PROVIDER,
128
131
  ...parsed,
132
+ ...(attribution ? { user: attribution.user, trace: attribution.trace } : {}),
129
133
  session_id: threadId,
130
134
  plugins: [...inheritedPluginsWithoutWeb(parsed), WEB_PLUGIN_DISABLED],
131
135
  });
@@ -1 +1 @@
1
- {"version":3,"file":"openrouter-session.js","sourceRoot":"","sources":["../../src/hono/openrouter-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,wBAAwB,CAAC;AAEvD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,kBAAkB,GAAG;IACzB,KAAK,EAAE,CAAC,gBAAgB,EAAE,0BAA0B,EAAE,0BAA0B,CAAC;IACjF,eAAe,EAAE,IAAI;CACtB,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,gCAAgC,CAAC;AACvE,MAAM,CAAC,MAAM,6BAA6B,GAAG,kBAAkB,CAAC;AAEhE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,mBAAmB,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAE1D;;;;GAIG;AACH,SAAS,0BAA0B,CAAC,SAAkC;IACpE,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;IAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAQ,OAAqB,CAAC,MAAM,CAClC,CAAC,MAAM,EAAE,EAAE,CACT,MAAM,KAAK,IAAI;QACf,OAAO,MAAM,KAAK,QAAQ;QAC1B,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QACtB,CAAC,CAAC,IAAI,IAAI,MAAM,IAAI,MAAM,CAAC,EAAE,KAAK,KAAK,CAAC,CAC3C,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,SAA6B;IAC5D,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC9C,yEAAyE;QACzE,kEAAkE;QAClE,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACnE,OAAO,MAAiC,CAAC;QAC3C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,4EAA4E;IAC9E,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,SAAkB;IACtE,MAAM,MAAM,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,QAAQ,EAAE,kBAAkB;QAC5B,GAAG,MAAM;QACT,UAAU,EAAE,QAAQ;QACpB,OAAO,EAAE,CAAC,GAAG,0BAA0B,CAAC,MAAM,CAAC,EAAE,mBAAmB,CAAC;KACtE,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"openrouter-session.js","sourceRoot":"","sources":["../../src/hono/openrouter-session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,wBAAwB,CAAC;AAEvD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,kBAAkB,GAAG;IACzB,KAAK,EAAE,CAAC,gBAAgB,EAAE,0BAA0B,EAAE,0BAA0B,CAAC;IACjF,eAAe,EAAE,IAAI;CACtB,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,gCAAgC,CAAC;AACvE,MAAM,CAAC,MAAM,6BAA6B,GAAG,kBAAkB,CAAC;AAEhE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,mBAAmB,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAE1D;;;;GAIG;AACH,SAAS,0BAA0B,CAAC,SAAkC;IACpE,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;IAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAQ,OAAqB,CAAC,MAAM,CAClC,CAAC,MAAM,EAAE,EAAE,CACT,MAAM,KAAK,IAAI;QACf,OAAO,MAAM,KAAK,QAAQ;QAC1B,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QACtB,CAAC,CAAC,IAAI,IAAI,MAAM,IAAI,MAAM,CAAC,EAAE,KAAK,KAAK,CAAC,CAC3C,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,SAA6B;IAC5D,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC9C,yEAAyE;QACzE,kEAAkE;QAClE,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACnE,OAAO,MAAiC,CAAC;QAC3C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,4EAA4E;IAC9E,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAAgB,EAChB,SAAkB;AAClB,2GAA2G;AAC3G,WAA6D;IAE7D,MAAM,MAAM,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,QAAQ,EAAE,kBAAkB;QAC5B,GAAG,MAAM;QACT,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,UAAU,EAAE,QAAQ;QACpB,OAAO,EAAE,CAAC,GAAG,0BAA0B,CAAC,MAAM,CAAC,EAAE,mBAAmB,CAAC;KACtE,CAAC,CAAC;AACL,CAAC"}
@@ -67,4 +67,13 @@ describe("buildAgentExtraBody", () => {
67
67
  expect(EXTRA_BODY_ENV).toBe("CLAUDE_CODE_EXTRA_BODY");
68
68
  });
69
69
  });
70
+ describe("buildAgentExtraBody attribution", () => {
71
+ it("carries who the turn runs for and from where, without moving the session pin", () => {
72
+ const tag = { user: "user:u1", trace: { feature: "agent.turn", service: "agent" } };
73
+ const body = JSON.parse(buildAgentExtraBody("thread_abc123", JSON.stringify({ user: "stale" }), tag));
74
+ expect(body.user).toBe("user:u1");
75
+ expect(body.trace).toEqual({ feature: "agent.turn", service: "agent" });
76
+ expect(body.session_id).toBe("thread_abc123");
77
+ });
78
+ });
70
79
  //# sourceMappingURL=openrouter-session.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"openrouter-session.test.js","sourceRoot":"","sources":["../../src/hono/openrouter-session.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openrouter-session.test.js","sourceRoot":"","sources":["../../src/hono/openrouter-session.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9E,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,MAAM,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,GAAG,EAAE;QACzF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC;YAC5B,KAAK,EAAE,CAAC,gBAAgB,EAAE,0BAA0B,EAAE,0BAA0B,CAAC;YACjF,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,eAAe,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7E,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC;QACzE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QAC5D,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC,CAAC;QAClE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC;QACzE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC,CAAC;QAC3E,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC;QACzE,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;YACnB,QAAQ,EAAE;gBACR,KAAK,EAAE,CAAC,gBAAgB,EAAE,0BAA0B,EAAE,0BAA0B,CAAC;gBACjF,eAAe,EAAE,IAAI;aACtB;YACD,UAAU,EAAE,eAAe;YAC3B,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;SACzC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mFAAmF,EAAE,GAAG,EAAE;QAC3F,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QACtF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC;QACzE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0FAA0F,EAAE,GAAG,EAAE;QAClG,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9F,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC;QACzE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mFAAmF,EAAE,GAAG,EAAE;QAC3F,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC;QAChG,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC;QACzE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;QACtF,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;QACpF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QACtG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACxE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@koda-sl/baker-bridge",
3
- "version": "0.162.0",
3
+ "version": "0.163.0",
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",