@koda-sl/baker-bridge 0.106.0 → 0.107.0-dev.eac0b5d73
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
CHANGED
|
@@ -270,7 +270,7 @@ Every turn also carries an in-process SDK MCP server named `baker_ui` hosting in
|
|
|
270
270
|
|
|
271
271
|
Its second tool, `request_flow_input`, is the **blocking form-configuration form**: the agent invokes it to configure the confidential parts of a flow ("Form") it cannot author itself — side-effect credentials/connections (`encryptedConfig`, `oauthProviderId`) and widget third-party field definitions (`nodeData.form.external` for HubSpot/Calendly/HighLevel/SavvyCal). The agent authors the surrounding structure in `_data.json` and references it by `nodeId`/`sideEffectId`. Same `canUseTool` park pattern: the bridge POSTs `/api/chat/flow-input-request`, the dashboard renders a tabbed form (secret inputs / OAuth connect+account picker / live resource picker), and on submit Convex delivers the resolved values to `POST /flow-input-decision`. Unlike tags, the resolved values are written **into the branch flow file** through the encrypting `writeFlow` (read → patch node/side-effect → write); the model only ever sees a redacted result: `{ status, nodeId, sideEffectId?, secretFieldsSet, destination?, connected?, fields?, note? }`. `destination` is the non-secret half of what the user chose — the spreadsheet, the sheet, the portal, the Calendly event — so an agent that has just configured an integration does not have to spend a turn on `baker flows show --full` to learn what it configured, and does not map columns against a guess. For a widget node, `fields` carries the autofill keys the picked resource accepts — literally the left-hand side of an `autofilledFields` entry, adapter prefix included, so a SavvyCal custom field arrives as `questions.<id>` because that is what its adapter reads. They come from each provider's own field container (`fieldGroups[].fields[]`, `customQuestions[]`, `customParams.formFields[]`, `customFormFields[]`, `fields[]`, `customFields[]`) rather than from a search for name-shaped strings, so a select's option labels and the resource's own title are not among them (a HubSpot form's `name` is "Contact us"; it is reported under `destination`). A widget with no field list of its own returns none rather than a guess. Both targets go through the same filter: only plain strings and numbers are echoed, and anything in that type's secret list is redacted to a name in `secretFieldsSet`. A few non-secret keys are withheld from `destination` on top of that, because they are not an answer either — an `httpWebhook`'s basic-auth `username` is not a typed credential, so it is not in the secret list, but echoing it hands the model half a credential and nothing on the side effect is addressed by it. Leaked secret values in `prefilledConfig` are stripped bridge-side (and again backend-side). Live wait matches `AskUserQuestion` (15 min); like all blocking prompts, the form itself never expires — the thread parks and a later submission recovers the turn.
|
|
272
272
|
|
|
273
|
-
Its third tool, `request_connection`, is the **blocking connection request**: the agent invokes it when a data platform the task needs — Google Ads, LinkedIn Ads, Meta Ads, X Ads, Google Analytics 4, Google Search Console, or Google Tag Manager — is not connected yet, instead of telling the user to go to Settings. Same `canUseTool` park pattern: the bridge POSTs `/api/chat/connection-input-request`, the dashboard renders one tab per platform with the OAuth connect button and the account/property/site/container picker, and on submit Convex delivers the outcome to `POST /connection-input-decision`. Nothing confidential passes through the bridge or the model: the dashboard writes the selection onto the company's connection, and the resolution carries only `{ status, platform, accountLabel?, selected[] }`. Live wait matches `AskUserQuestion` (15 min).
|
|
273
|
+
Its third tool, `request_connection`, is the **blocking connection request**: the agent invokes it when a data platform the task needs — Google Ads, LinkedIn Ads, Meta Ads, X Ads, Google Analytics 4, Google Search Console, or Google Tag Manager — is not connected yet, instead of telling the user to go to Settings. Same `canUseTool` park pattern: the bridge POSTs `/api/chat/connection-input-request`, the dashboard renders one tab per platform with the OAuth connect button and the account/property/site/container picker, and on submit Convex delivers the outcome to `POST /connection-input-decision`. Nothing confidential passes through the bridge or the model: the dashboard writes the selection onto the company's connection, and the resolution carries only `{ status, platform, accountLabel?, selected[] }`. Live wait matches `AskUserQuestion` (15 min). It can also ask for a Shopify store (`platform: "shopify"`): the card asks for the store's address and sends the user to Shopify to approve Baker.
|
|
274
274
|
|
|
275
275
|
Its fourth tool, `request_avatar_casting`, is the **blocking face picker**: an avatar invented from a description gets several casting portraits rendered, the user picks one in the dashboard, and the identity sheet every later render grounds on is fused from that one. Same `canUseTool` park pattern — the bridge POSTs `/api/chat/avatar-casting-request`, Convex renders the candidates and parks the thread, and the pick is delivered to `POST /avatar-casting-decision` as `{ status: "cast", avatarHandle, imageId }` or `{ status: "declined", avatarHandle, reason? }`.
|
|
276
276
|
|
|
@@ -12,7 +12,7 @@ export declare const CONNECTION_INPUT_TOOL_NAME = "mcp__baker_ui__request_connec
|
|
|
12
12
|
* backend: a platform live in one and missing from another is a door that
|
|
13
13
|
* looks open from one side only.
|
|
14
14
|
*/
|
|
15
|
-
export declare const CONNECTION_PLATFORMS: readonly ["google-ads", "linkedin", "meta", "google-analytics", "google-search-console", "google-tag-manager", "x-ads", "hubspot", "google-drive", "highlevel", "pipedrive", "calendly", "savvycal"];
|
|
15
|
+
export declare const CONNECTION_PLATFORMS: readonly ["google-ads", "linkedin", "meta", "google-analytics", "google-search-console", "google-tag-manager", "x-ads", "hubspot", "google-drive", "highlevel", "pipedrive", "calendly", "savvycal", "shopify"];
|
|
16
16
|
export type ConnectionPlatform = (typeof CONNECTION_PLATFORMS)[number];
|
|
17
17
|
declare const connectionRequestShape: z.ZodObject<{
|
|
18
18
|
platform: z.ZodEnum<{
|
|
@@ -28,6 +28,7 @@ declare const connectionRequestShape: z.ZodObject<{
|
|
|
28
28
|
meta: "meta";
|
|
29
29
|
pipedrive: "pipedrive";
|
|
30
30
|
savvycal: "savvycal";
|
|
31
|
+
shopify: "shopify";
|
|
31
32
|
"x-ads": "x-ads";
|
|
32
33
|
}>;
|
|
33
34
|
reason: z.ZodString;
|
|
@@ -47,6 +48,7 @@ export declare const connectionInputToolShape: {
|
|
|
47
48
|
meta: "meta";
|
|
48
49
|
pipedrive: "pipedrive";
|
|
49
50
|
savvycal: "savvycal";
|
|
51
|
+
shopify: "shopify";
|
|
50
52
|
"x-ads": "x-ads";
|
|
51
53
|
}>;
|
|
52
54
|
reason: z.ZodString;
|
|
@@ -68,6 +70,7 @@ export declare const connectionInputResultSchema: z.ZodDiscriminatedUnion<[z.Zod
|
|
|
68
70
|
meta: "meta";
|
|
69
71
|
pipedrive: "pipedrive";
|
|
70
72
|
savvycal: "savvycal";
|
|
73
|
+
shopify: "shopify";
|
|
71
74
|
"x-ads": "x-ads";
|
|
72
75
|
}>;
|
|
73
76
|
accountLabel: z.ZodOptional<z.ZodString>;
|
|
@@ -88,6 +91,7 @@ export declare const connectionInputResultSchema: z.ZodDiscriminatedUnion<[z.Zod
|
|
|
88
91
|
meta: "meta";
|
|
89
92
|
pipedrive: "pipedrive";
|
|
90
93
|
savvycal: "savvycal";
|
|
94
|
+
shopify: "shopify";
|
|
91
95
|
"x-ads": "x-ads";
|
|
92
96
|
}>;
|
|
93
97
|
reason: z.ZodOptional<z.ZodString>;
|
|
@@ -109,6 +113,7 @@ export declare const connectionInputResolutionSchema: z.ZodObject<{
|
|
|
109
113
|
meta: "meta";
|
|
110
114
|
pipedrive: "pipedrive";
|
|
111
115
|
savvycal: "savvycal";
|
|
116
|
+
shopify: "shopify";
|
|
112
117
|
"x-ads": "x-ads";
|
|
113
118
|
}>;
|
|
114
119
|
accountLabel: z.ZodOptional<z.ZodString>;
|
|
@@ -129,6 +134,7 @@ export declare const connectionInputResolutionSchema: z.ZodObject<{
|
|
|
129
134
|
meta: "meta";
|
|
130
135
|
pipedrive: "pipedrive";
|
|
131
136
|
savvycal: "savvycal";
|
|
137
|
+
shopify: "shopify";
|
|
132
138
|
"x-ads": "x-ads";
|
|
133
139
|
}>;
|
|
134
140
|
reason: z.ZodOptional<z.ZodString>;
|
|
@@ -160,6 +166,7 @@ export declare function createConnectionInputTool(): import("@anthropic-ai/claud
|
|
|
160
166
|
meta: "meta";
|
|
161
167
|
pipedrive: "pipedrive";
|
|
162
168
|
savvycal: "savvycal";
|
|
169
|
+
shopify: "shopify";
|
|
163
170
|
"x-ads": "x-ads";
|
|
164
171
|
}>;
|
|
165
172
|
reason: z.ZodString;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection-input.d.ts","sourceRoot":"","sources":["../../src/hono/connection-input.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"connection-input.d.ts","sourceRoot":"","sources":["../../src/hono/connection-input.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,0BAA0B,sCAAsC,CAAC;AAE9E;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,oBAAoB,YAC/B,YAAY,EACZ,UAAU,EACV,MAAM,EACN,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,OAAO,EACP,SAAS,EACT,cAAc,EACd,WAAW,EACX,WAAW,EACX,UAAU,EACV,UAAU,EACV,SAAS,CACD,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvE,QAAA,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;iBAK1B,CAAC;AAEH,eAAO,MAAM,wBAAwB;IACnC,WAAW;;;;;;;;;;;;;;;;;;;IAKX,UAAU;CAKX,CAAC;AAIF,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BAgBtC,CAAC;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAA8D,CAAC;AAC3G,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAC;AAExF,wFAAwF;AACxF,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,OAAO,GAAG,yBAAyB,GAAG,IAAI,CAG/F;AAED,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE5E;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,OAAO,GAAG,sBAAsB,EAAE,CAgB1F;AASD,wBAAgB,yBAAyB;;;;;;;;;;;;;;;;;;;;;GAUxC"}
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
* user to connect — or reconnect — anything the Integrations page connects: an
|
|
5
5
|
* ad or data platform (Google Ads, LinkedIn Ads, Meta Ads, X Ads, GA4, Search
|
|
6
6
|
* Console, Tag Manager), where they also pick which accounts it may read, or a
|
|
7
|
-
* tool (HubSpot, Google Drive, GoHighLevel, Pipedrive, Calendly, SavvyCal),
|
|
8
|
-
*
|
|
7
|
+
* tool (HubSpot, Google Drive, GoHighLevel, Pipedrive, Calendly, SavvyCal), or a
|
|
8
|
+
* Shopify store (the card asks for the store's address), where connecting is
|
|
9
|
+
* the whole answer — without the user leaving the chat.
|
|
9
10
|
*
|
|
10
11
|
* Nothing confidential passes through the model: the bridge parks the turn in
|
|
11
12
|
* `canUseTool`, the dashboard runs the OAuth popup and writes the selection onto
|
|
@@ -46,6 +47,7 @@ export const CONNECTION_PLATFORMS = [
|
|
|
46
47
|
"pipedrive",
|
|
47
48
|
"calendly",
|
|
48
49
|
"savvycal",
|
|
50
|
+
"shopify",
|
|
49
51
|
];
|
|
50
52
|
const connectionRequestShape = z.object({
|
|
51
53
|
platform: z.enum(CONNECTION_PLATFORMS).describe("Which platform the user needs to connect"),
|
|
@@ -113,7 +115,7 @@ export function normalizeConnectionInputToolInput(input) {
|
|
|
113
115
|
return requests;
|
|
114
116
|
}
|
|
115
117
|
const CONNECTION_INPUT_TOOL_DESCRIPTION = [
|
|
116
|
-
"Ask the user to connect — or reconnect — one of Baker's connections, inside the chat: an ad or data platform (Google Ads, LinkedIn Ads, Meta Ads, X Ads, Google Analytics 4, Google Search Console, Google Tag Manager), where they also pick which accounts Baker may read, or a tool (HubSpot, Google Drive, GoHighLevel, Pipedrive, Calendly, SavvyCal). BLOCKS until they resolve it in the dashboard.",
|
|
118
|
+
"Ask the user to connect — or reconnect — one of Baker's connections, inside the chat: an ad or data platform (Google Ads, LinkedIn Ads, Meta Ads, X Ads, Google Analytics 4, Google Search Console, Google Tag Manager), where they also pick which accounts Baker may read, or a tool (HubSpot, Google Drive, GoHighLevel, Pipedrive, Calendly, SavvyCal), or their Shopify store (`shopify`: they type its address and approve Baker in Shopify). BLOCKS until they resolve it in the dashboard.",
|
|
117
119
|
"Use it the moment a command tells you a platform isn't connected, OR that it is connected but does not allow what you asked (a `request_connection` fix, `HUBSPOT_RECONNECT_REQUIRED`, a read-only connection) — the card shows Reconnect when the connection exists. Never tell the user to go to Settings instead. Each entry in `connections` becomes a tab, so ask for everything the task needs in ONE call.",
|
|
118
120
|
"`reason` is shown to the user: say what connecting unlocks in their terms ('so I can see which campaigns are actually converting', 'so I can count a contact becoming a customer'), never in technical terms.",
|
|
119
121
|
"A declined tab is not an error — carry on with what you can do without it and say what stays unavailable. A connected result may list `cannotRead`: things the connection still does not allow — do not promise those. Results name only the account and what was selected; no credentials ever reach you.",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection-input.js","sourceRoot":"","sources":["../../src/hono/connection-input.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"connection-input.js","sourceRoot":"","sources":["../../src/hono/connection-input.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@koda-sl/baker-bridge",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.107.0-dev.eac0b5d73",
|
|
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",
|