@koda-sl/baker-bridge 0.38.3-dev.26436071 → 0.39.2
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 +38 -24
- package/dist/cli.d.ts +1 -1
- package/dist/cli.js +1 -1
- package/dist/hono/agent.d.ts +2 -5
- package/dist/hono/agent.d.ts.map +1 -1
- package/dist/hono/agent.js +23 -43
- package/dist/hono/agent.js.map +1 -1
- package/dist/hono/attachments.d.ts +16 -0
- package/dist/hono/attachments.d.ts.map +1 -1
- package/dist/hono/attachments.js +88 -2
- package/dist/hono/attachments.js.map +1 -1
- package/dist/hono/attachments.test.d.ts +2 -0
- package/dist/hono/attachments.test.d.ts.map +1 -0
- package/dist/hono/attachments.test.js +40 -0
- package/dist/hono/attachments.test.js.map +1 -0
- package/dist/hono/callback.js +2 -2
- package/dist/hono/callback.js.map +1 -1
- package/dist/hono/flow-strip.d.ts +4 -0
- package/dist/hono/flow-strip.d.ts.map +1 -0
- package/dist/hono/flow-strip.js +125 -0
- package/dist/hono/flow-strip.js.map +1 -0
- package/dist/hono/flow-strip.test.d.ts +2 -0
- package/dist/hono/flow-strip.test.d.ts.map +1 -0
- package/dist/hono/flow-strip.test.js +225 -0
- package/dist/hono/flow-strip.test.js.map +1 -0
- package/dist/hono/model-router.d.ts +3 -1
- package/dist/hono/model-router.d.ts.map +1 -1
- package/dist/hono/model-router.js +10 -9
- package/dist/hono/model-router.js.map +1 -1
- package/dist/hono/model-router.test.d.ts +2 -0
- package/dist/hono/model-router.test.d.ts.map +1 -0
- package/dist/hono/model-router.test.js +46 -0
- package/dist/hono/model-router.test.js.map +1 -0
- package/dist/hono/publish-recovery.d.ts +12 -0
- package/dist/hono/publish-recovery.d.ts.map +1 -0
- package/dist/hono/publish-recovery.js +40 -0
- package/dist/hono/publish-recovery.js.map +1 -0
- package/dist/hono/server.d.ts.map +1 -1
- package/dist/hono/server.js +20 -1
- package/dist/hono/server.js.map +1 -1
- package/dist/hono/types.d.ts +0 -7
- package/dist/hono/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/hono/memory.d.ts +0 -12
- package/dist/hono/memory.d.ts.map +0 -1
- package/dist/hono/memory.js +0 -203
- package/dist/hono/memory.js.map +0 -1
- package/dist/hono/memory.test.d.ts +0 -2
- package/dist/hono/memory.test.d.ts.map +0 -1
- package/dist/hono/memory.test.js +0 -242
- package/dist/hono/memory.test.js.map +0 -1
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
function pick(obj, keys) {
|
|
2
|
+
const result = {};
|
|
3
|
+
for (const key of keys) {
|
|
4
|
+
if (key in obj) {
|
|
5
|
+
result[key] = obj[key];
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
return result;
|
|
9
|
+
}
|
|
10
|
+
const HUBSPOT_FIELD_KEYS = [
|
|
11
|
+
"name",
|
|
12
|
+
"label",
|
|
13
|
+
"fieldType",
|
|
14
|
+
"objectTypeId",
|
|
15
|
+
"required",
|
|
16
|
+
"hidden",
|
|
17
|
+
"placeholder",
|
|
18
|
+
"description",
|
|
19
|
+
"options",
|
|
20
|
+
];
|
|
21
|
+
const HUBSPOT_FIELD_GROUP_KEYS = ["fields"];
|
|
22
|
+
const HUBSPOT_EXTERNAL_KEYS = [
|
|
23
|
+
"id",
|
|
24
|
+
"name",
|
|
25
|
+
"portalId",
|
|
26
|
+
"fieldGroups",
|
|
27
|
+
"legalConsentOptions",
|
|
28
|
+
"configuration",
|
|
29
|
+
"embedType",
|
|
30
|
+
];
|
|
31
|
+
const LEGAL_CONSENT_KEYS = {
|
|
32
|
+
none: ["type"],
|
|
33
|
+
legitimate_interest: ["type", "lawfulBasis", "privacyText", "subscriptionTypeIds"],
|
|
34
|
+
explicit_consent_to_process: ["type", "privacyText", "communicationsCheckboxes"],
|
|
35
|
+
implicit_consent_to_process: ["type", "privacyText", "communicationsCheckboxes"],
|
|
36
|
+
};
|
|
37
|
+
const COMMUNICATION_CHECKBOX_KEYS = ["label", "required", "subscriptionTypeId"];
|
|
38
|
+
const CONFIGURATION_KEYS = ["postSubmitAction"];
|
|
39
|
+
function stripHubSpotField(field) {
|
|
40
|
+
if (!field || typeof field !== "object")
|
|
41
|
+
return field;
|
|
42
|
+
return pick(field, HUBSPOT_FIELD_KEYS);
|
|
43
|
+
}
|
|
44
|
+
function stripHubSpotFieldGroup(group) {
|
|
45
|
+
if (!group || typeof group !== "object")
|
|
46
|
+
return group;
|
|
47
|
+
const g = group;
|
|
48
|
+
const stripped = pick(g, HUBSPOT_FIELD_GROUP_KEYS);
|
|
49
|
+
if (Array.isArray(stripped.fields)) {
|
|
50
|
+
stripped.fields = stripped.fields.map(stripHubSpotField);
|
|
51
|
+
}
|
|
52
|
+
return stripped;
|
|
53
|
+
}
|
|
54
|
+
function stripLegalConsentOptions(options) {
|
|
55
|
+
if (!options || typeof options !== "object")
|
|
56
|
+
return options;
|
|
57
|
+
const o = options;
|
|
58
|
+
const type = String(o.type ?? "");
|
|
59
|
+
const keys = LEGAL_CONSENT_KEYS[type];
|
|
60
|
+
if (!keys)
|
|
61
|
+
return options;
|
|
62
|
+
const stripped = pick(o, keys);
|
|
63
|
+
if (Array.isArray(stripped.communicationsCheckboxes)) {
|
|
64
|
+
stripped.communicationsCheckboxes = stripped.communicationsCheckboxes.map((cb) => pick(cb, COMMUNICATION_CHECKBOX_KEYS));
|
|
65
|
+
}
|
|
66
|
+
return stripped;
|
|
67
|
+
}
|
|
68
|
+
function stripConfiguration(config) {
|
|
69
|
+
if (!config || typeof config !== "object")
|
|
70
|
+
return config;
|
|
71
|
+
return pick(config, CONFIGURATION_KEYS);
|
|
72
|
+
}
|
|
73
|
+
function stripHubSpotExternal(external) {
|
|
74
|
+
if (!external || typeof external !== "object")
|
|
75
|
+
return external;
|
|
76
|
+
const e = external;
|
|
77
|
+
const stripped = pick(e, HUBSPOT_EXTERNAL_KEYS);
|
|
78
|
+
if (Array.isArray(stripped.fieldGroups)) {
|
|
79
|
+
stripped.fieldGroups = stripped.fieldGroups.map(stripHubSpotFieldGroup);
|
|
80
|
+
}
|
|
81
|
+
if (stripped.legalConsentOptions !== undefined) {
|
|
82
|
+
stripped.legalConsentOptions = stripLegalConsentOptions(stripped.legalConsentOptions);
|
|
83
|
+
}
|
|
84
|
+
if (stripped.configuration !== undefined) {
|
|
85
|
+
stripped.configuration = stripConfiguration(stripped.configuration);
|
|
86
|
+
}
|
|
87
|
+
return stripped;
|
|
88
|
+
}
|
|
89
|
+
function stripNodeExternal(node) {
|
|
90
|
+
const nodeData = node.nodeData;
|
|
91
|
+
if (!nodeData || typeof nodeData !== "object")
|
|
92
|
+
return node;
|
|
93
|
+
const type = nodeData.type;
|
|
94
|
+
if (type !== "hubspot")
|
|
95
|
+
return node;
|
|
96
|
+
const form = nodeData.form;
|
|
97
|
+
if (!form || typeof form !== "object")
|
|
98
|
+
return node;
|
|
99
|
+
if (form.external === null || form.external === undefined)
|
|
100
|
+
return node;
|
|
101
|
+
return {
|
|
102
|
+
...node,
|
|
103
|
+
nodeData: {
|
|
104
|
+
...nodeData,
|
|
105
|
+
form: {
|
|
106
|
+
...form,
|
|
107
|
+
external: stripHubSpotExternal(form.external),
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
function walkAndStrip(node) {
|
|
113
|
+
const stripped = stripNodeExternal(node);
|
|
114
|
+
if (Array.isArray(stripped.children)) {
|
|
115
|
+
return {
|
|
116
|
+
...stripped,
|
|
117
|
+
children: stripped.children.map(walkAndStrip),
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
return stripped;
|
|
121
|
+
}
|
|
122
|
+
export function stripNodeExternals(tree) {
|
|
123
|
+
return walkAndStrip(tree);
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=flow-strip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow-strip.js","sourceRoot":"","sources":["../../src/hono/flow-strip.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow-strip.test.d.ts","sourceRoot":"","sources":["../../src/hono/flow-strip.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { stripNodeExternals } from "./flow-strip.js";
|
|
3
|
+
function ext(result) {
|
|
4
|
+
return result.nodeData.form.external;
|
|
5
|
+
}
|
|
6
|
+
function hubspotNode(external) {
|
|
7
|
+
return {
|
|
8
|
+
id: "node-1",
|
|
9
|
+
name: "HubSpot Form",
|
|
10
|
+
children: [],
|
|
11
|
+
nodeData: {
|
|
12
|
+
type: "hubspot",
|
|
13
|
+
form: {
|
|
14
|
+
autofilledFields: {},
|
|
15
|
+
external,
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
sideEffects: [],
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
describe("stripNodeExternals", () => {
|
|
22
|
+
it("strips unknown fields from HubSpot external", () => {
|
|
23
|
+
const tree = hubspotNode({
|
|
24
|
+
id: "form-1",
|
|
25
|
+
name: "Contact",
|
|
26
|
+
portalId: 123,
|
|
27
|
+
fieldGroups: [],
|
|
28
|
+
providerId: "should-be-removed",
|
|
29
|
+
archived: false,
|
|
30
|
+
createdAt: "2025-01-01",
|
|
31
|
+
updatedAt: "2025-01-01",
|
|
32
|
+
formType: "hubspot",
|
|
33
|
+
displayOptions: { theme: "default" },
|
|
34
|
+
});
|
|
35
|
+
const result = stripNodeExternals(tree);
|
|
36
|
+
const external = ext(result);
|
|
37
|
+
expect(external).toEqual({
|
|
38
|
+
id: "form-1",
|
|
39
|
+
name: "Contact",
|
|
40
|
+
portalId: 123,
|
|
41
|
+
fieldGroups: [],
|
|
42
|
+
});
|
|
43
|
+
expect(external).not.toHaveProperty("providerId");
|
|
44
|
+
expect(external).not.toHaveProperty("archived");
|
|
45
|
+
expect(external).not.toHaveProperty("displayOptions");
|
|
46
|
+
});
|
|
47
|
+
it("preserves scaffold-known HubSpot fields", () => {
|
|
48
|
+
const tree = hubspotNode({
|
|
49
|
+
id: "form-1",
|
|
50
|
+
name: "Contact",
|
|
51
|
+
portalId: 123,
|
|
52
|
+
fieldGroups: [
|
|
53
|
+
{
|
|
54
|
+
fields: [
|
|
55
|
+
{
|
|
56
|
+
name: "email",
|
|
57
|
+
label: "Email",
|
|
58
|
+
fieldType: "email",
|
|
59
|
+
objectTypeId: "0-1",
|
|
60
|
+
required: true,
|
|
61
|
+
hidden: false,
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
legalConsentOptions: { type: "none" },
|
|
67
|
+
configuration: { postSubmitAction: { type: "thank_you", value: "Thanks" } },
|
|
68
|
+
embedType: "v4",
|
|
69
|
+
});
|
|
70
|
+
const result = stripNodeExternals(tree);
|
|
71
|
+
const external = ext(result);
|
|
72
|
+
expect(external.id).toBe("form-1");
|
|
73
|
+
expect(external.embedType).toBe("v4");
|
|
74
|
+
expect(external.fieldGroups[0].fields[0].name).toBe("email");
|
|
75
|
+
expect(external.legalConsentOptions).toEqual({ type: "none" });
|
|
76
|
+
expect(external.configuration).toEqual({
|
|
77
|
+
postSubmitAction: { type: "thank_you", value: "Thanks" },
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
it("strips extra fields from fieldGroups", () => {
|
|
81
|
+
const tree = hubspotNode({
|
|
82
|
+
id: "form-1",
|
|
83
|
+
name: "Contact",
|
|
84
|
+
portalId: 123,
|
|
85
|
+
fieldGroups: [
|
|
86
|
+
{
|
|
87
|
+
fields: [
|
|
88
|
+
{
|
|
89
|
+
name: "email",
|
|
90
|
+
label: "Email",
|
|
91
|
+
fieldType: "email",
|
|
92
|
+
objectTypeId: "0-1",
|
|
93
|
+
required: true,
|
|
94
|
+
hidden: false,
|
|
95
|
+
validation: { blockedEmailDomains: [], useDefaultBlockList: false },
|
|
96
|
+
defaultValue: "",
|
|
97
|
+
dependentFields: [],
|
|
98
|
+
},
|
|
99
|
+
],
|
|
100
|
+
groupType: "default_group",
|
|
101
|
+
richText: "<p>hello</p>",
|
|
102
|
+
richTextType: "text",
|
|
103
|
+
},
|
|
104
|
+
],
|
|
105
|
+
});
|
|
106
|
+
const result = stripNodeExternals(tree);
|
|
107
|
+
const group = ext(result).fieldGroups[0];
|
|
108
|
+
expect(group).not.toHaveProperty("groupType");
|
|
109
|
+
expect(group).not.toHaveProperty("richText");
|
|
110
|
+
expect(group.fields[0]).not.toHaveProperty("validation");
|
|
111
|
+
expect(group.fields[0]).not.toHaveProperty("defaultValue");
|
|
112
|
+
expect(group.fields[0]).not.toHaveProperty("dependentFields");
|
|
113
|
+
});
|
|
114
|
+
it("strips extra fields from configuration", () => {
|
|
115
|
+
const tree = hubspotNode({
|
|
116
|
+
id: "form-1",
|
|
117
|
+
name: "Contact",
|
|
118
|
+
portalId: 123,
|
|
119
|
+
fieldGroups: [],
|
|
120
|
+
configuration: {
|
|
121
|
+
postSubmitAction: { type: "thank_you", value: "Thanks" },
|
|
122
|
+
allowLinkToResetKnownValues: true,
|
|
123
|
+
archivable: true,
|
|
124
|
+
cloneable: true,
|
|
125
|
+
language: "en",
|
|
126
|
+
recaptchaEnabled: false,
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
const result = stripNodeExternals(tree);
|
|
130
|
+
const config = ext(result).configuration;
|
|
131
|
+
expect(config).toEqual({
|
|
132
|
+
postSubmitAction: { type: "thank_you", value: "Thanks" },
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
it("strips extra fields from legalConsentOptions", () => {
|
|
136
|
+
const tree = hubspotNode({
|
|
137
|
+
id: "form-1",
|
|
138
|
+
name: "Contact",
|
|
139
|
+
portalId: 123,
|
|
140
|
+
fieldGroups: [],
|
|
141
|
+
legalConsentOptions: {
|
|
142
|
+
type: "explicit_consent_to_process",
|
|
143
|
+
privacyText: "We care about your privacy.",
|
|
144
|
+
communicationsCheckboxes: [{ label: "Subscribe", required: false, subscriptionTypeId: 1, extraField: true }],
|
|
145
|
+
communicationConsentText: "should be stripped",
|
|
146
|
+
consentToProcessCheckboxLabel: "should be stripped",
|
|
147
|
+
consentToProcessText: "should be stripped",
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
const result = stripNodeExternals(tree);
|
|
151
|
+
const consent = ext(result).legalConsentOptions;
|
|
152
|
+
expect(consent).toEqual({
|
|
153
|
+
type: "explicit_consent_to_process",
|
|
154
|
+
privacyText: "We care about your privacy.",
|
|
155
|
+
communicationsCheckboxes: [{ label: "Subscribe", required: false, subscriptionTypeId: 1 }],
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
it("passes non-HubSpot nodes through untouched", () => {
|
|
159
|
+
const tree = {
|
|
160
|
+
id: "node-1",
|
|
161
|
+
name: "Custom Form",
|
|
162
|
+
children: [],
|
|
163
|
+
nodeData: {
|
|
164
|
+
type: "customForm",
|
|
165
|
+
form: {
|
|
166
|
+
autofilledFields: {},
|
|
167
|
+
external: { fields: [], extraThing: "should stay" },
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
sideEffects: [],
|
|
171
|
+
};
|
|
172
|
+
const result = stripNodeExternals(tree);
|
|
173
|
+
expect(result.nodeData.form.external).toHaveProperty("extraThing", "should stay");
|
|
174
|
+
});
|
|
175
|
+
it("passes side effects through untouched", () => {
|
|
176
|
+
const tree = {
|
|
177
|
+
...hubspotNode({ id: "f1", name: "F", portalId: 1, fieldGroups: [] }),
|
|
178
|
+
sideEffects: [{ id: "se1", type: "meta", tagIds: ["t1"], eventType: "standard", eventName: "Lead" }],
|
|
179
|
+
};
|
|
180
|
+
const result = stripNodeExternals(tree);
|
|
181
|
+
expect(result.sideEffects).toEqual(tree.sideEffects);
|
|
182
|
+
});
|
|
183
|
+
it("walks children recursively", () => {
|
|
184
|
+
const tree = {
|
|
185
|
+
id: "root",
|
|
186
|
+
name: "Root",
|
|
187
|
+
children: [
|
|
188
|
+
hubspotNode({
|
|
189
|
+
id: "form-2",
|
|
190
|
+
name: "Nested",
|
|
191
|
+
portalId: 456,
|
|
192
|
+
fieldGroups: [],
|
|
193
|
+
archived: true,
|
|
194
|
+
providerId: "remove-me",
|
|
195
|
+
}),
|
|
196
|
+
],
|
|
197
|
+
nodeData: { type: "text" },
|
|
198
|
+
sideEffects: [],
|
|
199
|
+
};
|
|
200
|
+
const result = stripNodeExternals(tree);
|
|
201
|
+
const child = result.children[0];
|
|
202
|
+
const childExternal = child.nodeData.form.external;
|
|
203
|
+
expect(childExternal).toEqual({
|
|
204
|
+
id: "form-2",
|
|
205
|
+
name: "Nested",
|
|
206
|
+
portalId: 456,
|
|
207
|
+
fieldGroups: [],
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
it("handles null external gracefully", () => {
|
|
211
|
+
const tree = {
|
|
212
|
+
id: "node-1",
|
|
213
|
+
name: "HubSpot Form",
|
|
214
|
+
children: [],
|
|
215
|
+
nodeData: {
|
|
216
|
+
type: "hubspot",
|
|
217
|
+
form: { autofilledFields: {}, external: null },
|
|
218
|
+
},
|
|
219
|
+
sideEffects: [],
|
|
220
|
+
};
|
|
221
|
+
const result = stripNodeExternals(tree);
|
|
222
|
+
expect(result.nodeData.form.external).toBeNull();
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
//# sourceMappingURL=flow-strip.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow-strip.test.js","sourceRoot":"","sources":["../../src/hono/flow-strip.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
export declare const DEFAULT_MODEL = "claude-opus-4-6";
|
|
2
|
+
export declare function normalizeModel(model: string): string;
|
|
1
3
|
interface SelectModelResult {
|
|
2
4
|
model: string;
|
|
3
5
|
messages: Array<{
|
|
@@ -7,7 +9,7 @@ interface SelectModelResult {
|
|
|
7
9
|
}
|
|
8
10
|
/**
|
|
9
11
|
* Use NotDiamond to select the optimal Claude model for a given prompt.
|
|
10
|
-
* Set NOTDIAMOND_ENABLED=true to enable routing; defaults to
|
|
12
|
+
* Set NOTDIAMOND_ENABLED=true to enable routing; defaults to Opus 4.6 otherwise.
|
|
11
13
|
*/
|
|
12
14
|
export declare function selectModel(prompt: string): Promise<SelectModelResult>;
|
|
13
15
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-router.d.ts","sourceRoot":"","sources":["../../src/hono/model-router.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"model-router.d.ts","sourceRoot":"","sources":["../../src/hono/model-router.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,aAAa,oBAAoB,CAAC;AAE/C,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAYpD;AAYD,UAAU,iBAAiB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpD;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA8C5E"}
|
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
import { env } from "./env.js";
|
|
2
2
|
import { buildRepoContext } from "./repo-context.js";
|
|
3
3
|
const NOTDIAMOND_API_URL = "https://api.notdiamond.ai/v2/modelRouter/modelSelect";
|
|
4
|
+
// OpenRouter-formatted IDs sent to NotDiamond's selection API.
|
|
4
5
|
const CANDIDATE_MODELS = [
|
|
5
6
|
{ model: "anthropic/claude-haiku-4.5" },
|
|
6
7
|
{ model: "anthropic/claude-sonnet-4.6" },
|
|
7
8
|
{ model: "anthropic/claude-opus-4.6" },
|
|
8
9
|
];
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
// Anthropic-native ID expected by the Claude Agent SDK `query({ options: { model } })`.
|
|
11
|
+
export const DEFAULT_MODEL = "claude-opus-4-6";
|
|
12
|
+
export function normalizeModel(model) {
|
|
11
13
|
const lower = model.toLowerCase();
|
|
12
14
|
if (lower.includes("opus")) {
|
|
13
|
-
return "
|
|
15
|
+
return "claude-opus-4-6";
|
|
14
16
|
}
|
|
15
17
|
if (lower.includes("haiku")) {
|
|
16
|
-
return "
|
|
18
|
+
return "claude-haiku-4-5";
|
|
17
19
|
}
|
|
18
20
|
if (lower.includes("sonnet")) {
|
|
19
|
-
return "
|
|
21
|
+
return "claude-sonnet-4-6";
|
|
20
22
|
}
|
|
21
23
|
return model;
|
|
22
24
|
}
|
|
@@ -30,7 +32,7 @@ function getRepoContext() {
|
|
|
30
32
|
}
|
|
31
33
|
/**
|
|
32
34
|
* Use NotDiamond to select the optimal Claude model for a given prompt.
|
|
33
|
-
* Set NOTDIAMOND_ENABLED=true to enable routing; defaults to
|
|
35
|
+
* Set NOTDIAMOND_ENABLED=true to enable routing; defaults to Opus 4.6 otherwise.
|
|
34
36
|
*/
|
|
35
37
|
export async function selectModel(prompt) {
|
|
36
38
|
const systemPrompt = await getRepoContext();
|
|
@@ -51,7 +53,6 @@ export async function selectModel(prompt) {
|
|
|
51
53
|
body: JSON.stringify({
|
|
52
54
|
messages,
|
|
53
55
|
llm_providers: CANDIDATE_MODELS,
|
|
54
|
-
tradeoff: "latency",
|
|
55
56
|
}),
|
|
56
57
|
});
|
|
57
58
|
if (!response.ok) {
|
|
@@ -61,7 +62,7 @@ export async function selectModel(prompt) {
|
|
|
61
62
|
const result = (await response.json());
|
|
62
63
|
const selectedModel = result.providers[0]?.model;
|
|
63
64
|
if (!selectedModel) {
|
|
64
|
-
console.warn("[model-router] No model returned, falling back to
|
|
65
|
+
console.warn("[model-router] No model returned, falling back to opus");
|
|
65
66
|
return { model: DEFAULT_MODEL, messages };
|
|
66
67
|
}
|
|
67
68
|
const normalized = normalizeModel(selectedModel);
|
|
@@ -69,7 +70,7 @@ export async function selectModel(prompt) {
|
|
|
69
70
|
return { model: normalized, messages };
|
|
70
71
|
}
|
|
71
72
|
catch (error) {
|
|
72
|
-
console.error("[model-router] Routing failed, falling back to
|
|
73
|
+
console.error("[model-router] Routing failed, falling back to opus:", error instanceof Error ? error.message : error);
|
|
73
74
|
return { model: DEFAULT_MODEL, messages };
|
|
74
75
|
}
|
|
75
76
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-router.js","sourceRoot":"","sources":["../../src/hono/model-router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,kBAAkB,GAAG,sDAAsD,CAAC;AAElF,MAAM,gBAAgB,GAAG;IACvB,EAAE,KAAK,EAAE,4BAA4B,EAAE;IACvC,EAAE,KAAK,EAAE,6BAA6B,EAAE;IACxC,EAAE,KAAK,EAAE,2BAA2B,EAAE;CACvC,CAAC;AAEF,MAAM,aAAa,GAAG,
|
|
1
|
+
{"version":3,"file":"model-router.js","sourceRoot":"","sources":["../../src/hono/model-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-router.test.d.ts","sourceRoot":"","sources":["../../src/hono/model-router.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
// Stub env before importing model-router so env validation passes.
|
|
3
|
+
vi.mock("./env.ts", () => ({
|
|
4
|
+
env: {
|
|
5
|
+
BAKER_CONVEX_SITE_URL: "https://example.convex.site",
|
|
6
|
+
BAKER_API_KEY: "bk_test",
|
|
7
|
+
AUTH_TOKEN: "tok",
|
|
8
|
+
INTERNAL_SECRET_KEY: "0".repeat(64),
|
|
9
|
+
NOTDIAMOND_ENABLED: false,
|
|
10
|
+
},
|
|
11
|
+
}));
|
|
12
|
+
import { DEFAULT_MODEL, normalizeModel } from "./model-router.js";
|
|
13
|
+
// The Claude Agent SDK's `query({ options: { model } })` expects native
|
|
14
|
+
// Anthropic IDs (no `anthropic/` prefix, dashes-only versions). Passing
|
|
15
|
+
// NotDiamond / OpenRouter formatted IDs makes the SDK silently fall back to
|
|
16
|
+
// its CLI default (Sonnet). normalizeModel bridges the two formats.
|
|
17
|
+
describe("normalizeModel", () => {
|
|
18
|
+
it("strips the anthropic/ prefix and converts dotted Opus version to dashes", () => {
|
|
19
|
+
expect(normalizeModel("anthropic/claude-opus-4.6")).toBe("claude-opus-4-6");
|
|
20
|
+
});
|
|
21
|
+
it("normalizes Sonnet (already dashed) by stripping the prefix", () => {
|
|
22
|
+
expect(normalizeModel("anthropic/claude-sonnet-4-6")).toBe("claude-sonnet-4-6");
|
|
23
|
+
});
|
|
24
|
+
it("normalizes Haiku by stripping the prefix", () => {
|
|
25
|
+
expect(normalizeModel("anthropic/claude-haiku-4-5")).toBe("claude-haiku-4-5");
|
|
26
|
+
});
|
|
27
|
+
it("normalizes dated Haiku variants returned by NotDiamond", () => {
|
|
28
|
+
expect(normalizeModel("anthropic/claude-haiku-4-5-20251001")).toBe("claude-haiku-4-5");
|
|
29
|
+
});
|
|
30
|
+
it("ignores casing", () => {
|
|
31
|
+
expect(normalizeModel("ANTHROPIC/Claude-OPUS-4.6")).toBe("claude-opus-4-6");
|
|
32
|
+
});
|
|
33
|
+
it("returns the input unchanged when no family keyword matches", () => {
|
|
34
|
+
expect(normalizeModel("anthropic/gpt-5")).toBe("anthropic/gpt-5");
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe("DEFAULT_MODEL", () => {
|
|
38
|
+
// Locks the fallback to the SDK-native format. If this regresses to the
|
|
39
|
+
// OpenRouter/NotDiamond form, the SDK silently picks Sonnet instead of Opus.
|
|
40
|
+
it("uses the Claude Agent SDK-native format", () => {
|
|
41
|
+
expect(DEFAULT_MODEL).toBe("claude-opus-4-6");
|
|
42
|
+
expect(DEFAULT_MODEL).not.toMatch(/^anthropic\//);
|
|
43
|
+
expect(DEFAULT_MODEL).not.toMatch(/\./);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=model-router.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-router.test.js","sourceRoot":"","sources":["../../src/hono/model-router.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAElD,mEAAmE;AACnE,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IACzB,GAAG,EAAE;QACH,qBAAqB,EAAE,6BAA6B;QACpD,aAAa,EAAE,SAAS;QACxB,UAAU,EAAE,KAAK;QACjB,mBAAmB,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACnC,kBAAkB,EAAE,KAAK;KAC1B;CACF,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAElE,wEAAwE;AACxE,wEAAwE;AACxE,4EAA4E;AAC5E,oEAAoE;AAEpE,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,CAAC,cAAc,CAAC,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,CAAC,cAAc,CAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,cAAc,CAAC,4BAA4B,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,cAAc,CAAC,qCAAqC,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;QACxB,MAAM,CAAC,cAAc,CAAC,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,wEAAwE;IACxE,6EAA6E;IAC7E,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9C,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAClD,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Best-effort recovery for publishes abandoned mid-flow.
|
|
3
|
+
*
|
|
4
|
+
* When the bridge aborts a session (user clicks stop), the SDK's Stop hooks
|
|
5
|
+
* don't fire because the bridge uses the query() API, not the CLI harness.
|
|
6
|
+
* This module executes the existing recover-stalled-publish.mjs hook script
|
|
7
|
+
* directly to revert the chat status and clean up local resources.
|
|
8
|
+
*
|
|
9
|
+
* Source of truth: __tooling__/hooks/base/recover-stalled-publish.mjs
|
|
10
|
+
*/
|
|
11
|
+
export declare function recoverStalledPublish(): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=publish-recovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish-recovery.d.ts","sourceRoot":"","sources":["../../src/hono/publish-recovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAuB3D"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Best-effort recovery for publishes abandoned mid-flow.
|
|
3
|
+
*
|
|
4
|
+
* When the bridge aborts a session (user clicks stop), the SDK's Stop hooks
|
|
5
|
+
* don't fire because the bridge uses the query() API, not the CLI harness.
|
|
6
|
+
* This module executes the existing recover-stalled-publish.mjs hook script
|
|
7
|
+
* directly to revert the chat status and clean up local resources.
|
|
8
|
+
*
|
|
9
|
+
* Source of truth: __tooling__/hooks/base/recover-stalled-publish.mjs
|
|
10
|
+
*/
|
|
11
|
+
import { execFile } from "node:child_process";
|
|
12
|
+
import { existsSync } from "node:fs";
|
|
13
|
+
const PUBLISH_STATE_FILE = ".cache/publish-state.json";
|
|
14
|
+
const HOOK_SCRIPT = "__tooling__/hooks/base/recover-stalled-publish.mjs";
|
|
15
|
+
const HOOK_TIMEOUT_MS = 35_000;
|
|
16
|
+
export async function recoverStalledPublish() {
|
|
17
|
+
try {
|
|
18
|
+
if (!existsSync(PUBLISH_STATE_FILE)) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
if (!existsSync(HOOK_SCRIPT)) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
await new Promise((resolve) => {
|
|
25
|
+
const child = execFile("node", [HOOK_SCRIPT], { timeout: HOOK_TIMEOUT_MS }, (err) => {
|
|
26
|
+
if (err) {
|
|
27
|
+
console.error("[publish-recovery] hook script failed:", err.message);
|
|
28
|
+
}
|
|
29
|
+
resolve();
|
|
30
|
+
});
|
|
31
|
+
child.stdin?.end();
|
|
32
|
+
child.stdout?.resume();
|
|
33
|
+
child.stderr?.resume();
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
console.error("[publish-recovery] unexpected error:", err instanceof Error ? err.message : err);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=publish-recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish-recovery.js","sourceRoot":"","sources":["../../src/hono/publish-recovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,MAAM,kBAAkB,GAAG,2BAA2B,CAAC;AACvD,MAAM,WAAW,GAAG,oDAAoD,CAAC;AACzE,MAAM,eAAe,GAAG,MAAM,CAAC;AAE/B,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,CAAC,GAAiB,EAAE,EAAE;gBAChG,IAAI,GAAG,EAAE,CAAC;oBACR,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;gBACvE,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;YACnB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;YACvB,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAClG,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/hono/server.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/hono/server.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AA0B5B,wBAAgB,YAAY;;iBAkOR,OAAO,CAAC,IAAI,CAAC;gBASd,OAAO,CAAC,IAAI,CAAC;EAiB/B"}
|
package/dist/hono/server.js
CHANGED
|
@@ -8,8 +8,10 @@ import { abortSession, getOrCreateSession, getSlashCommands } from "./agent.js";
|
|
|
8
8
|
import { processAsync } from "./callback.js";
|
|
9
9
|
import { env } from "./env.js";
|
|
10
10
|
import { createFlowEncoder } from "./flow-crypto.js";
|
|
11
|
+
import { stripNodeExternals } from "./flow-strip.js";
|
|
11
12
|
import { extractTitle, stripFrontmatter } from "./markdown.js";
|
|
12
13
|
const FLOWS_DIR = join(process.cwd(), "src/lib/flow-engine/flows");
|
|
14
|
+
const PAGES_DIR = join(process.cwd(), "src/pages");
|
|
13
15
|
const COMPANY_FILE = join(process.cwd(), "COMPANY.md");
|
|
14
16
|
const BRAND_FILE = join(process.cwd(), "src/brand/BRAND.md");
|
|
15
17
|
const CONTENT_DIR = join(process.cwd(), "src/content");
|
|
@@ -85,7 +87,8 @@ export function createServer() {
|
|
|
85
87
|
return c.json({ error: "Invalid JSON body" }, 400);
|
|
86
88
|
}
|
|
87
89
|
try {
|
|
88
|
-
const
|
|
90
|
+
const stripped = stripNodeExternals(body);
|
|
91
|
+
const encoded = encodeFlowTree(stripped);
|
|
89
92
|
await mkdir(dir, { recursive: true });
|
|
90
93
|
await writeFile(filePath, JSON.stringify(encoded, null, 2), "utf-8");
|
|
91
94
|
return c.body(null, 204);
|
|
@@ -132,6 +135,22 @@ export function createServer() {
|
|
|
132
135
|
const title = extractTitle(raw, entry);
|
|
133
136
|
return c.json({ content: stripFrontmatter(raw), title });
|
|
134
137
|
});
|
|
138
|
+
app.get("/landings/:slug/definition", async (c) => {
|
|
139
|
+
const slug = c.req.param("slug");
|
|
140
|
+
if (slug.includes("/") || slug.includes("..")) {
|
|
141
|
+
return c.json({ error: "Invalid slug" }, 400);
|
|
142
|
+
}
|
|
143
|
+
const filePath = join(PAGES_DIR, slug, "_definition.md");
|
|
144
|
+
let raw;
|
|
145
|
+
try {
|
|
146
|
+
raw = await readFile(filePath, "utf-8");
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
return c.json({ error: "Definition not found" }, 404);
|
|
150
|
+
}
|
|
151
|
+
const title = extractTitle(raw, slug);
|
|
152
|
+
return c.json({ content: stripFrontmatter(raw), title });
|
|
153
|
+
});
|
|
135
154
|
app.get("/documents/:slug", async (c) => {
|
|
136
155
|
const slug = c.req.param("slug");
|
|
137
156
|
if (slug.includes("/") || slug.includes("..")) {
|