fix(ts-sdk): preserve customCategories names through key conversion (#5741)
This commit is contained in:
@@ -169,7 +169,9 @@ export interface PaginatedMemories {
|
|||||||
|
|
||||||
export interface ProjectResponse {
|
export interface ProjectResponse {
|
||||||
customInstructions?: string;
|
customInstructions?: string;
|
||||||
customCategories?: string[];
|
// The API returns category objects (`[{ "<name>": "<description>" }]`),
|
||||||
|
// not bare strings (see issue #5738).
|
||||||
|
customCategories?: custom_categories[];
|
||||||
[key: string]: any;
|
[key: string]: any;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -99,4 +99,50 @@ describe("camelToSnakeKeys / snakeToCamelKeys", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("user-controlled customCategories names (issue #5738)", () => {
|
||||||
|
it("converts the outer key but leaves multi-word category names on write", () => {
|
||||||
|
expect(
|
||||||
|
camelToSnakeKeys({
|
||||||
|
customCategories: [
|
||||||
|
{ work_life_balance: "desc" },
|
||||||
|
{ AIResearch: "desc" },
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
).toEqual({
|
||||||
|
// outer SDK key is snake_cased, user-defined category names are not
|
||||||
|
custom_categories: [
|
||||||
|
{ work_life_balance: "desc" },
|
||||||
|
{ AIResearch: "desc" },
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("converts the outer key but leaves category names verbatim on read", () => {
|
||||||
|
expect(
|
||||||
|
snakeToCamelKeys({
|
||||||
|
custom_categories: [
|
||||||
|
{ work_life_balance: "desc" },
|
||||||
|
{ AIResearch: "desc" },
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
).toEqual({
|
||||||
|
customCategories: [
|
||||||
|
{ work_life_balance: "desc" },
|
||||||
|
{ AIResearch: "desc" },
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("round-trips category names losslessly (write then read)", () => {
|
||||||
|
const customCategories = [
|
||||||
|
{ work_life_balance: "balance between work and life" },
|
||||||
|
{ AIResearch: "artificial intelligence research" },
|
||||||
|
];
|
||||||
|
const roundTripped = snakeToCamelKeys(
|
||||||
|
camelToSnakeKeys({ customCategories }),
|
||||||
|
);
|
||||||
|
expect(roundTripped.customCategories).toEqual(customCategories);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -29,6 +29,11 @@ const OPAQUE_VALUE_KEYS = new Set([
|
|||||||
"metadata",
|
"metadata",
|
||||||
"structuredDataSchema",
|
"structuredDataSchema",
|
||||||
"structured_data_schema",
|
"structured_data_schema",
|
||||||
|
// Custom-category names are user-controlled keys (`[{ "<name>": "<desc>" }]`).
|
||||||
|
// Listed in both casings so they round-trip verbatim in both directions
|
||||||
|
// (see issue #5738; same class as `metadata`/`structuredDataSchema`).
|
||||||
|
"customCategories",
|
||||||
|
"custom_categories",
|
||||||
]);
|
]);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user