@koda-sl/baker-bridge 0.92.2-dev.bb28562ac → 0.92.3-dev.bb28562ac
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/dist/hono/avatar-casting.d.ts +16 -0
- package/dist/hono/avatar-casting.d.ts.map +1 -1
- package/dist/hono/avatar-casting.js +32 -1
- package/dist/hono/avatar-casting.js.map +1 -1
- package/dist/hono/avatar-casting.test.d.ts +2 -0
- package/dist/hono/avatar-casting.test.d.ts.map +1 -0
- package/dist/hono/avatar-casting.test.js +24 -0
- package/dist/hono/avatar-casting.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -17,6 +17,22 @@ export type AvatarCastingRequest = {
|
|
|
17
17
|
};
|
|
18
18
|
/** `canUseTool` sees RAW model input; a leading `@` is tolerated because that is how the handle reads. */
|
|
19
19
|
export declare function normalizeAvatarCastingToolInput(input: unknown): AvatarCastingRequest | null;
|
|
20
|
+
/**
|
|
21
|
+
* What the agent reads when the picker closes.
|
|
22
|
+
*
|
|
23
|
+
* A decline used to come back as the bare `{"status":"declined"}` object, and the
|
|
24
|
+
* remedy for it lived only in the tool description — thousands of tokens up the
|
|
25
|
+
* context, written before the turn began. Measured on a real session, the agent read
|
|
26
|
+
* that object and replied "the casting portraits should be showing on your screen
|
|
27
|
+
* right now — just pick the one that looks right", to a user who had just rejected
|
|
28
|
+
* all four and whose picker was gone. That is a dead end: the avatar has no face, the
|
|
29
|
+
* turn is over, and the only instruction on screen cannot be followed.
|
|
30
|
+
*
|
|
31
|
+
* So the remedy travels with the result. Same reasoning as a CLI `error.fix`: a
|
|
32
|
+
* failure the agent has to act on carries its own next step, rather than relying on
|
|
33
|
+
* it remembering one.
|
|
34
|
+
*/
|
|
35
|
+
export declare function avatarCastingToolText(resolution: unknown): string;
|
|
20
36
|
export declare function createAvatarCastingTool(): import("@anthropic-ai/claude-agent-sdk").SdkMcpToolDefinition<{
|
|
21
37
|
avatarHandle: z.ZodString;
|
|
22
38
|
resolution: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avatar-casting.d.ts","sourceRoot":"","sources":["../../src/hono/avatar-casting.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,wBAAwB,0CAA0C,CAAC;AAahF,eAAO,MAAM,yBAAyB;;;;;;;;6BAGpC,CAAC;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,sFAAsF;AACtF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,GAAG,IAAI,CAGnF;AAED,MAAM,MAAM,oBAAoB,GAAG;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5D,0GAA0G;AAC1G,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,GAAG,IAAI,CAU3F;AAUD,wBAAgB,uBAAuB;;;GAUtC"}
|
|
1
|
+
{"version":3,"file":"avatar-casting.d.ts","sourceRoot":"","sources":["../../src/hono/avatar-casting.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,wBAAwB,0CAA0C,CAAC;AAahF,eAAO,MAAM,yBAAyB;;;;;;;;6BAGpC,CAAC;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,sFAAsF;AACtF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,GAAG,IAAI,CAGnF;AAED,MAAM,MAAM,oBAAoB,GAAG;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;AAE5D,0GAA0G;AAC1G,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,GAAG,IAAI,CAU3F;AAUD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,CAgBjE;AAED,wBAAgB,uBAAuB;;;GAUtC"}
|
|
@@ -50,10 +50,41 @@ const AVATAR_CASTING_TOOL_DESCRIPTION = [
|
|
|
50
50
|
"Not for an avatar built from photographs of a real person: that face already exists and there is nothing to choose between.",
|
|
51
51
|
"You cannot see the candidates and must not choose for the user. If they decline them all, sharpen the subject description with `baker avatars update` and call it again.",
|
|
52
52
|
].join(" ");
|
|
53
|
+
/**
|
|
54
|
+
* What the agent reads when the picker closes.
|
|
55
|
+
*
|
|
56
|
+
* A decline used to come back as the bare `{"status":"declined"}` object, and the
|
|
57
|
+
* remedy for it lived only in the tool description — thousands of tokens up the
|
|
58
|
+
* context, written before the turn began. Measured on a real session, the agent read
|
|
59
|
+
* that object and replied "the casting portraits should be showing on your screen
|
|
60
|
+
* right now — just pick the one that looks right", to a user who had just rejected
|
|
61
|
+
* all four and whose picker was gone. That is a dead end: the avatar has no face, the
|
|
62
|
+
* turn is over, and the only instruction on screen cannot be followed.
|
|
63
|
+
*
|
|
64
|
+
* So the remedy travels with the result. Same reasoning as a CLI `error.fix`: a
|
|
65
|
+
* failure the agent has to act on carries its own next step, rather than relying on
|
|
66
|
+
* it remembering one.
|
|
67
|
+
*/
|
|
68
|
+
export function avatarCastingToolText(resolution) {
|
|
69
|
+
const payload = JSON.stringify(resolution);
|
|
70
|
+
const parsed = avatarCastingResultSchema.safeParse(resolution);
|
|
71
|
+
if (!parsed.success || parsed.data.status !== "declined") {
|
|
72
|
+
return payload;
|
|
73
|
+
}
|
|
74
|
+
const { avatarHandle, reason } = parsed.data;
|
|
75
|
+
return [
|
|
76
|
+
payload,
|
|
77
|
+
"",
|
|
78
|
+
`The user turned down every casting portrait for @${avatarHandle}${reason ? `: ${reason}` : "."}`,
|
|
79
|
+
"The picker is gone from their screen — asking them to pick one of those faces is a dead end, and so is saying the avatar is waiting on them.",
|
|
80
|
+
`Sharpen the look with \`baker avatars update --handle ${avatarHandle} --subject "..."\` using whatever they said was wrong, then call request_avatar_casting again for the same handle.`,
|
|
81
|
+
"If they gave no reason, ask them what to change before recasting — do not spend another round guessing.",
|
|
82
|
+
].join("\n");
|
|
83
|
+
}
|
|
53
84
|
export function createAvatarCastingTool() {
|
|
54
85
|
return tool("request_avatar_casting", AVATAR_CASTING_TOOL_DESCRIPTION, avatarCastingToolShape, (args) => {
|
|
55
86
|
const resolution = args.resolution ?? { status: "declined" };
|
|
56
|
-
return Promise.resolve({ content: [{ type: "text", text:
|
|
87
|
+
return Promise.resolve({ content: [{ type: "text", text: avatarCastingToolText(resolution) }] });
|
|
57
88
|
});
|
|
58
89
|
}
|
|
59
90
|
//# sourceMappingURL=avatar-casting.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avatar-casting.js","sourceRoot":"","sources":["../../src/hono/avatar-casting.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,wBAAwB,GAAG,uCAAuC,CAAC;AAEhF,MAAM,sBAAsB,GAAG;IAC7B,YAAY,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,8FAA8F,CAAC;IAC3G,UAAU,EAAE,CAAC;SACV,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;SAC/B,QAAQ,EAAE;SACV,QAAQ,CAAC,kFAAkF,CAAC;CAChG,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,kBAAkB,CAAC,QAAQ,EAAE;IACtE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IACtF,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;CACrG,CAAC,CAAC;AAGH,sFAAsF;AACtF,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,MAAM,MAAM,GAAG,yBAAyB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC1D,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7C,CAAC;AAID,0GAA0G;AAC1G,MAAM,UAAU,+BAA+B,CAAC,KAAc;IAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,GAAG,GAAG,KAAmC,CAAC;IAChD,IAAI,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACvE,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC;AAED,MAAM,+BAA+B,GAAG;IACtC,qNAAqN;IACrN,oLAAoL;IACpL,iQAAiQ;IACjQ,6HAA6H;IAC7H,0KAA0K;CAC3K,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEZ,MAAM,UAAU,uBAAuB;IACrC,OAAO,IAAI,CACT,wBAAwB,EACxB,+BAA+B,EAC/B,sBAAsB,EACtB,CAAC,IAAI,EAA+D,EAAE;QACpE,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QAC7D,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"avatar-casting.js","sourceRoot":"","sources":["../../src/hono/avatar-casting.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar-casting.test.d.ts","sourceRoot":"","sources":["../../src/hono/avatar-casting.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { avatarCastingToolText } from "./avatar-casting.js";
|
|
3
|
+
describe("avatarCastingToolText", () => {
|
|
4
|
+
it("tells the agent to recast rather than to ask again for a picker that is gone", () => {
|
|
5
|
+
const text = avatarCastingToolText({ status: "declined", avatarHandle: "marcos" });
|
|
6
|
+
expect(text).toContain('"status":"declined"');
|
|
7
|
+
expect(text).toContain("baker avatars update");
|
|
8
|
+
expect(text).toContain("request_avatar_casting");
|
|
9
|
+
expect(text).toContain("marcos");
|
|
10
|
+
});
|
|
11
|
+
it("carries the reason the faces were turned down so the next round can use it", () => {
|
|
12
|
+
const text = avatarCastingToolText({
|
|
13
|
+
status: "declined",
|
|
14
|
+
avatarHandle: "marcos",
|
|
15
|
+
reason: "all four looked too young",
|
|
16
|
+
});
|
|
17
|
+
expect(text).toContain("all four looked too young");
|
|
18
|
+
});
|
|
19
|
+
it("says nothing extra once a face has been cast", () => {
|
|
20
|
+
const text = avatarCastingToolText({ status: "cast", avatarHandle: "marcos", imageId: "img_1" });
|
|
21
|
+
expect(text).toBe(JSON.stringify({ status: "cast", avatarHandle: "marcos", imageId: "img_1" }));
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
//# sourceMappingURL=avatar-casting.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar-casting.test.js","sourceRoot":"","sources":["../../src/hono/avatar-casting.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;QACtF,MAAM,IAAI,GAAG,qBAAqB,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC;QAEnF,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,MAAM,IAAI,GAAG,qBAAqB,CAAC;YACjC,MAAM,EAAE,UAAU;YAClB,YAAY,EAAE,QAAQ;YACtB,MAAM,EAAE,2BAA2B;SACpC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,IAAI,GAAG,qBAAqB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAEjG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAClG,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.92.
|
|
3
|
+
"version": "0.92.3-dev.bb28562ac",
|
|
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",
|