@salesforce/graphiti 11.21.0 → 11.22.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.
- package/CHANGELOG.md +6 -0
- package/dist/intent/build-aggregate.js +7 -6
- package/dist/intent/build-aggregate.js.map +1 -1
- package/dist/intent/types.d.ts +3 -3
- package/dist/schemas/input-schemas.d.ts +9 -9
- package/dist/schemas/input-schemas.js +12 -11
- package/dist/schemas/input-schemas.js.map +1 -1
- package/package.json +1 -1
- package/src/intent/__tests__/build-aggregate.spec.ts +85 -0
- package/src/intent/build-aggregate.ts +21 -6
- package/src/intent/types.ts +3 -3
- package/src/mcp/tools/__tests__/sf-gql-aggregate.spec.ts +220 -1
- package/src/schemas/input-schemas.ts +20 -11
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [11.22.0](https://github.com/salesforce-experience-platform-emu/webapps/compare/v11.21.0...v11.22.0) (2026-07-10)
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
- **graphiti:** promote whole aggregate filter/orderBy/first argument to one optional $var @W-23400202 ([#741](https://github.com/salesforce-experience-platform-emu/webapps/issues/741)) ([d068185](https://github.com/salesforce-experience-platform-emu/webapps/commit/d068185c78e40bcb88c7bf4706f951f6c3072070))
|
|
11
|
+
|
|
6
12
|
## [11.21.0](https://github.com/salesforce-experience-platform-emu/webapps/compare/v11.20.0...v11.21.0) (2026-07-10)
|
|
7
13
|
|
|
8
14
|
**Note:** Version bump only for package @salesforce/graphiti
|
|
@@ -8,7 +8,7 @@ import { getSchemaWithPriming } from "./get-schema-with-priming.js";
|
|
|
8
8
|
import { assertGraphqlName } from "../lib/graphql-name.js";
|
|
9
9
|
import { addVariable, createSession, createSiblingFieldInstance, deepSetArg, selectLeaf, } from "../lib/session.js";
|
|
10
10
|
import { aggregatePath } from "../lib/uiapi.js";
|
|
11
|
-
import { normalizeOrderBy,
|
|
11
|
+
import { normalizeOrderBy, promoteArg } from "../lib/variable-promotion.js";
|
|
12
12
|
const FIELD_REQUIRED_FNS = new Set(["sum", "avg", "min", "max"]);
|
|
13
13
|
/**
|
|
14
14
|
* Build a UIAPI aggregate query against a Salesforce org. Implements
|
|
@@ -53,19 +53,20 @@ export async function buildAggregate(spec, deps) {
|
|
|
53
53
|
addVariable(session, "after", "String");
|
|
54
54
|
deepSetArg(session, connectionPath, "after", [], "$after");
|
|
55
55
|
if (spec.filter) {
|
|
56
|
-
|
|
57
|
-
deepSetArg(session, connectionPath, "where", [],
|
|
56
|
+
const { rendered } = promoteArg(session, schema, connectionPath, "where", spec.filter, extraWarnings);
|
|
57
|
+
deepSetArg(session, connectionPath, "where", [], rendered);
|
|
58
58
|
}
|
|
59
59
|
const orderBy = normalizeOrderBy(spec.orderBy);
|
|
60
60
|
if (Array.isArray(spec.orderBy) && spec.orderBy.length > 1) {
|
|
61
61
|
extraWarnings.push("orderBy: array collapsed to first element. UIAPI accepts a single orderBy object — use multiple keys in one object for multi-field ordering (e.g. { Industry: { order: DESC }, Name: { order: ASC } }).");
|
|
62
62
|
}
|
|
63
63
|
if (orderBy) {
|
|
64
|
-
|
|
65
|
-
deepSetArg(session, connectionPath, "orderBy", [],
|
|
64
|
+
const { rendered } = promoteArg(session, schema, connectionPath, "orderBy", orderBy, extraWarnings);
|
|
65
|
+
deepSetArg(session, connectionPath, "orderBy", [], rendered);
|
|
66
66
|
}
|
|
67
67
|
if (spec.first !== undefined) {
|
|
68
|
-
|
|
68
|
+
const { rendered } = promoteArg(session, schema, connectionPath, "first", spec.first);
|
|
69
|
+
deepSetArg(session, connectionPath, "first", [], rendered);
|
|
69
70
|
}
|
|
70
71
|
selectLeaf(session, [...connectionPath, "pageInfo", "hasNextPage"]);
|
|
71
72
|
selectLeaf(session, [...connectionPath, "pageInfo", "endCursor"]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-aggregate.js","sourceRoot":"","sources":["../../src/intent/build-aggregate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAOpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,OAAO,EACN,WAAW,EACX,aAAa,EACb,0BAA0B,EAC1B,UAAU,EAEV,UAAU,GACV,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"build-aggregate.js","sourceRoot":"","sources":["../../src/intent/build-aggregate.ts"],"names":[],"mappings":"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"}
|
package/dist/intent/types.d.ts
CHANGED
|
@@ -68,9 +68,9 @@ export interface AggregateSpec {
|
|
|
68
68
|
object: string;
|
|
69
69
|
groupBy?: GroupByElement[];
|
|
70
70
|
aggregations?: AggregationSpec[];
|
|
71
|
-
filter?: Record<string, unknown
|
|
72
|
-
orderBy?: Record<string, unknown> | Record<string, unknown>[];
|
|
73
|
-
first?: number;
|
|
71
|
+
filter?: Record<string, unknown> | string;
|
|
72
|
+
orderBy?: Record<string, unknown> | Record<string, unknown>[] | string;
|
|
73
|
+
first?: number | string;
|
|
74
74
|
operationName?: string;
|
|
75
75
|
}
|
|
76
76
|
export type DiscoverMode = "list_objects" | "describe_object" | "describe_field";
|
|
@@ -191,17 +191,17 @@ export declare const AGGREGATE_INPUT: z.ZodObject<{
|
|
|
191
191
|
field: string;
|
|
192
192
|
alias?: string | undefined;
|
|
193
193
|
}>]>, "many">>;
|
|
194
|
-
filter: z.ZodOptional<z.
|
|
195
|
-
orderBy: z.ZodOptional<z.
|
|
196
|
-
first: z.ZodOptional<z.
|
|
194
|
+
filter: z.ZodOptional<z.ZodEffects<z.ZodTypeAny, any, unknown>>;
|
|
195
|
+
orderBy: z.ZodOptional<z.ZodEffects<z.ZodTypeAny, any, unknown>>;
|
|
196
|
+
first: z.ZodOptional<z.ZodEffects<z.ZodTypeAny, any, unknown>>;
|
|
197
197
|
operationName: z.ZodOptional<z.ZodString>;
|
|
198
198
|
}, "strip", z.ZodTypeAny, {
|
|
199
199
|
object: string;
|
|
200
200
|
org: string;
|
|
201
|
-
filter?:
|
|
201
|
+
filter?: any;
|
|
202
202
|
operationName?: string | undefined;
|
|
203
|
-
orderBy?:
|
|
204
|
-
first?:
|
|
203
|
+
orderBy?: any;
|
|
204
|
+
first?: any;
|
|
205
205
|
groupBy?: (string | {
|
|
206
206
|
function: "CALENDAR_MONTH" | "CALENDAR_QUARTER" | "CALENDAR_YEAR" | "DAY_IN_MONTH" | "DAY_IN_WEEK" | "DAY_IN_YEAR" | "FISCAL_MONTH" | "FISCAL_QUARTER" | "FISCAL_YEAR" | "HOUR_IN_DAY" | "CALENDAR_MONTH_IN_YEAR" | "FISCAL_MONTH_IN_YEAR" | "WEEK_IN_YEAR";
|
|
207
207
|
field: string;
|
|
@@ -218,10 +218,10 @@ export declare const AGGREGATE_INPUT: z.ZodObject<{
|
|
|
218
218
|
}, {
|
|
219
219
|
object: string;
|
|
220
220
|
org: string;
|
|
221
|
-
filter?:
|
|
221
|
+
filter?: unknown;
|
|
222
222
|
operationName?: string | undefined;
|
|
223
|
-
orderBy?:
|
|
224
|
-
first?:
|
|
223
|
+
orderBy?: unknown;
|
|
224
|
+
first?: unknown;
|
|
225
225
|
groupBy?: (string | {
|
|
226
226
|
function: "CALENDAR_MONTH" | "CALENDAR_QUARTER" | "CALENDAR_YEAR" | "DAY_IN_MONTH" | "DAY_IN_WEEK" | "DAY_IN_YEAR" | "FISCAL_MONTH" | "FISCAL_QUARTER" | "FISCAL_YEAR" | "HOUR_IN_DAY" | "CALENDAR_MONTH_IN_YEAR" | "FISCAL_MONTH_IN_YEAR" | "WEEK_IN_YEAR";
|
|
227
227
|
field: string;
|
|
@@ -151,20 +151,21 @@ export const AGGREGATE_INPUT = z.object({
|
|
|
151
151
|
.array(aggregationSchema)
|
|
152
152
|
.optional()
|
|
153
153
|
.describe("List of aggregation functions to compute. Each entry projects under its alias (or default `<function><PascalCaseField>`)."),
|
|
154
|
-
filter: z
|
|
155
|
-
.record(z.unknown())
|
|
154
|
+
filter: jsonCoercible(z.union([z.record(z.unknown()), varPlaceholder(), jsonLiteralString(), quotedString()]))
|
|
156
155
|
.optional()
|
|
157
|
-
.describe(
|
|
158
|
-
orderBy: z
|
|
159
|
-
|
|
156
|
+
.describe('<Object>_Filter applied to every aggregation. String leaves matching $varName promote to typed query variables. Pass a single "$varName" string to promote the WHOLE filter to one optional <Object>_Filter variable (bind it to null for "no filter → all buckets").'),
|
|
157
|
+
orderBy: jsonCoercible(z.union([
|
|
158
|
+
z.record(z.unknown()),
|
|
159
|
+
z.array(z.record(z.unknown())),
|
|
160
|
+
varPlaceholder(),
|
|
161
|
+
jsonLiteralString(),
|
|
162
|
+
quotedString(),
|
|
163
|
+
]))
|
|
160
164
|
.optional()
|
|
161
|
-
.describe(
|
|
162
|
-
first: z
|
|
163
|
-
.number()
|
|
164
|
-
.int()
|
|
165
|
-
.positive()
|
|
165
|
+
.describe('<Object>_OrderBy. Singleton object preferred; arrays are collapsed to the first entry. String leaves matching $varName promote to typed query variables. Pass a single "$varName" string to promote the whole orderBy to one optional <Object>_OrderBy variable.'),
|
|
166
|
+
first: jsonCoercible(z.union([z.number().int().positive(), varPlaceholder(), intLiteralString(), quotedString()]))
|
|
166
167
|
.optional()
|
|
167
|
-
.describe(
|
|
168
|
+
.describe('Connection page size (top-N pattern). No default — omit for all buckets. Pass a single "$varName" string to promote it to an optional Int variable.'),
|
|
168
169
|
operationName: graphqlName("Override the GraphQL operation name. Defaults to <Object>Aggregate.").optional(),
|
|
169
170
|
});
|
|
170
171
|
// --- sf_gql_raw -------------------------------------------------------------
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-schemas.js","sourceRoot":"","sources":["../../src/schemas/input-schemas.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"input-schemas.js","sourceRoot":"","sources":["../../src/schemas/input-schemas.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -482,6 +482,91 @@ describe("intent/build-aggregate", () => {
|
|
|
482
482
|
expect(out.query).toMatch(/\$min\s*:\s*Float/);
|
|
483
483
|
});
|
|
484
484
|
|
|
485
|
+
it("promotes a whole-argument $filter to a typed <Object>_Filter variable", async () => {
|
|
486
|
+
const out = await buildAggregate(
|
|
487
|
+
{
|
|
488
|
+
org: ORG,
|
|
489
|
+
object: "Account",
|
|
490
|
+
groupBy: [],
|
|
491
|
+
aggregations: [{ function: "count" }],
|
|
492
|
+
filter: "$filter",
|
|
493
|
+
},
|
|
494
|
+
noopPrimeDeps(),
|
|
495
|
+
);
|
|
496
|
+
const filter = out.variables.find((v) => v.name === "filter");
|
|
497
|
+
expect(filter).toBeDefined();
|
|
498
|
+
expect(filter!.type).toBe("Account_Filter");
|
|
499
|
+
expect(filter!.required).toBe(false);
|
|
500
|
+
expect(out.query).toMatch(/where\s*:\s*\$filter\b/);
|
|
501
|
+
});
|
|
502
|
+
|
|
503
|
+
it("promotes a whole-argument $orderBy to a typed <Object>_OrderBy variable", async () => {
|
|
504
|
+
const out = await buildAggregate(
|
|
505
|
+
{
|
|
506
|
+
org: ORG,
|
|
507
|
+
object: "Account",
|
|
508
|
+
groupBy: ["Industry"],
|
|
509
|
+
aggregations: [{ function: "count" }],
|
|
510
|
+
orderBy: "$sort",
|
|
511
|
+
},
|
|
512
|
+
noopPrimeDeps(),
|
|
513
|
+
);
|
|
514
|
+
const sort = out.variables.find((v) => v.name === "sort");
|
|
515
|
+
expect(sort).toBeDefined();
|
|
516
|
+
expect(sort!.type).toBe("Account_OrderBy");
|
|
517
|
+
expect(sort!.required).toBe(false);
|
|
518
|
+
expect(out.query).toMatch(/orderBy\s*:\s*\$sort\b/);
|
|
519
|
+
});
|
|
520
|
+
|
|
521
|
+
it("promotes a whole-argument $first to a typed Int variable", async () => {
|
|
522
|
+
const out = await buildAggregate(
|
|
523
|
+
{
|
|
524
|
+
org: ORG,
|
|
525
|
+
object: "Account",
|
|
526
|
+
groupBy: ["Industry"],
|
|
527
|
+
aggregations: [{ function: "count" }],
|
|
528
|
+
first: "$first",
|
|
529
|
+
},
|
|
530
|
+
noopPrimeDeps(),
|
|
531
|
+
);
|
|
532
|
+
const v = out.variables.find((x) => x.name === "first");
|
|
533
|
+
expect(v).toBeDefined();
|
|
534
|
+
expect(v!.type).toBe("Int");
|
|
535
|
+
expect(v!.required).toBe(false);
|
|
536
|
+
expect(out.query).toMatch(/first\s*:\s*\$first\b/);
|
|
537
|
+
});
|
|
538
|
+
|
|
539
|
+
it("numeric first still renders as a literal after whole-arg support", async () => {
|
|
540
|
+
const out = await buildAggregate(
|
|
541
|
+
{
|
|
542
|
+
org: ORG,
|
|
543
|
+
object: "Account",
|
|
544
|
+
groupBy: ["Industry"],
|
|
545
|
+
aggregations: [{ function: "count" }],
|
|
546
|
+
first: 5,
|
|
547
|
+
},
|
|
548
|
+
noopPrimeDeps(),
|
|
549
|
+
);
|
|
550
|
+
expect(out.variables.find((x) => x.name === "first")).toBeUndefined();
|
|
551
|
+
expect(out.query).toMatch(/first\s*:\s*5\b/);
|
|
552
|
+
});
|
|
553
|
+
|
|
554
|
+
it("leaf filter promotion still works after whole-arg support", async () => {
|
|
555
|
+
const out = await buildAggregate(
|
|
556
|
+
{
|
|
557
|
+
org: ORG,
|
|
558
|
+
object: "Order",
|
|
559
|
+
groupBy: [],
|
|
560
|
+
aggregations: [{ function: "count" }],
|
|
561
|
+
filter: { Status: { eq: "$status" } },
|
|
562
|
+
},
|
|
563
|
+
noopPrimeDeps(),
|
|
564
|
+
);
|
|
565
|
+
expect(out.variables.find((v) => v.name === "status")).toBeDefined();
|
|
566
|
+
expect(out.query).toMatch(/\$status\b/);
|
|
567
|
+
expect(out.query).not.toMatch(/where\s*:\s*\$status\b/); // leaf, not whole-arg
|
|
568
|
+
});
|
|
569
|
+
|
|
485
570
|
it("filter without $vars renders inline values", async () => {
|
|
486
571
|
const out = await buildAggregate(
|
|
487
572
|
{
|
|
@@ -23,7 +23,7 @@ import {
|
|
|
23
23
|
selectLeaf,
|
|
24
24
|
} from "../lib/session.js";
|
|
25
25
|
import { aggregatePath } from "../lib/uiapi.js";
|
|
26
|
-
import { normalizeOrderBy,
|
|
26
|
+
import { normalizeOrderBy, promoteArg } from "../lib/variable-promotion.js";
|
|
27
27
|
|
|
28
28
|
const FIELD_REQUIRED_FNS = new Set<AggregationSpec["function"]>(["sum", "avg", "min", "max"]);
|
|
29
29
|
|
|
@@ -76,8 +76,15 @@ export async function buildAggregate(spec: AggregateSpec, deps?: PrimeDeps): Pro
|
|
|
76
76
|
deepSetArg(session, connectionPath, "after", [], "$after");
|
|
77
77
|
|
|
78
78
|
if (spec.filter) {
|
|
79
|
-
|
|
80
|
-
|
|
79
|
+
const { rendered } = promoteArg(
|
|
80
|
+
session,
|
|
81
|
+
schema,
|
|
82
|
+
connectionPath,
|
|
83
|
+
"where",
|
|
84
|
+
spec.filter,
|
|
85
|
+
extraWarnings,
|
|
86
|
+
);
|
|
87
|
+
deepSetArg(session, connectionPath, "where", [], rendered);
|
|
81
88
|
}
|
|
82
89
|
|
|
83
90
|
const orderBy = normalizeOrderBy(spec.orderBy);
|
|
@@ -87,12 +94,20 @@ export async function buildAggregate(spec: AggregateSpec, deps?: PrimeDeps): Pro
|
|
|
87
94
|
);
|
|
88
95
|
}
|
|
89
96
|
if (orderBy) {
|
|
90
|
-
|
|
91
|
-
|
|
97
|
+
const { rendered } = promoteArg(
|
|
98
|
+
session,
|
|
99
|
+
schema,
|
|
100
|
+
connectionPath,
|
|
101
|
+
"orderBy",
|
|
102
|
+
orderBy,
|
|
103
|
+
extraWarnings,
|
|
104
|
+
);
|
|
105
|
+
deepSetArg(session, connectionPath, "orderBy", [], rendered);
|
|
92
106
|
}
|
|
93
107
|
|
|
94
108
|
if (spec.first !== undefined) {
|
|
95
|
-
|
|
109
|
+
const { rendered } = promoteArg(session, schema, connectionPath, "first", spec.first);
|
|
110
|
+
deepSetArg(session, connectionPath, "first", [], rendered);
|
|
96
111
|
}
|
|
97
112
|
|
|
98
113
|
selectLeaf(session, [...connectionPath, "pageInfo", "hasNextPage"]);
|
package/src/intent/types.ts
CHANGED
|
@@ -94,9 +94,9 @@ export interface AggregateSpec {
|
|
|
94
94
|
object: string;
|
|
95
95
|
groupBy?: GroupByElement[];
|
|
96
96
|
aggregations?: AggregationSpec[];
|
|
97
|
-
filter?: Record<string, unknown
|
|
98
|
-
orderBy?: Record<string, unknown> | Record<string, unknown>[];
|
|
99
|
-
first?: number;
|
|
97
|
+
filter?: Record<string, unknown> | string;
|
|
98
|
+
orderBy?: Record<string, unknown> | Record<string, unknown>[] | string;
|
|
99
|
+
first?: number | string;
|
|
100
100
|
operationName?: string;
|
|
101
101
|
}
|
|
102
102
|
|
|
@@ -26,12 +26,14 @@ const SCHEMA = buildSchema(`
|
|
|
26
26
|
type Query { uiapi: UIAPI! }
|
|
27
27
|
type UIAPI { aggregate: RecordQueryAggregate! }
|
|
28
28
|
type RecordQueryAggregate {
|
|
29
|
-
Account(first: Int, after: String, where: Account_Filter, groupBy: Account_GroupBy): AccountAggregateConnection
|
|
29
|
+
Account(first: Int, after: String, where: Account_Filter, orderBy: Account_OrderBy, groupBy: Account_GroupBy): AccountAggregateConnection
|
|
30
30
|
}
|
|
31
31
|
input Account_Filter { Industry: PicklistOperators }
|
|
32
32
|
input Account_GroupBy { Industry: GroupByClause }
|
|
33
|
+
input Account_OrderBy { Industry: OrderByValue }
|
|
33
34
|
input PicklistOperators { eq: String }
|
|
34
35
|
input GroupByClause { group: Boolean }
|
|
36
|
+
input OrderByValue { order: String }
|
|
35
37
|
|
|
36
38
|
type AccountAggregateConnection {
|
|
37
39
|
edges: [AccountAggregateEdge!]!
|
|
@@ -176,6 +178,223 @@ describe("mcp/tools/sf-gql-aggregate", () => {
|
|
|
176
178
|
}
|
|
177
179
|
});
|
|
178
180
|
|
|
181
|
+
it("tools/call accepts a whole-argument $filter placeholder", async () => {
|
|
182
|
+
const { client, server } = await connect();
|
|
183
|
+
try {
|
|
184
|
+
const result = await client.callTool({
|
|
185
|
+
name: "sf_gql_aggregate",
|
|
186
|
+
arguments: {
|
|
187
|
+
org: ORG,
|
|
188
|
+
object: "Account",
|
|
189
|
+
groupBy: ["Industry"],
|
|
190
|
+
aggregations: [{ function: "count" }],
|
|
191
|
+
filter: "$filter",
|
|
192
|
+
},
|
|
193
|
+
});
|
|
194
|
+
expect(result.isError).toBeFalsy();
|
|
195
|
+
const content = result.content as { type: string; text?: string }[];
|
|
196
|
+
const parsed = JSON.parse(content[0]?.text ?? "{}") as {
|
|
197
|
+
query: string;
|
|
198
|
+
variables: { name: string; type: string }[];
|
|
199
|
+
};
|
|
200
|
+
expect(parsed.query).toMatch(/where\s*:\s*\$filter\b/);
|
|
201
|
+
expect(parsed.variables.find((v) => v.name === "filter")?.type).toBe("Account_Filter");
|
|
202
|
+
} finally {
|
|
203
|
+
await client.close();
|
|
204
|
+
await server.close();
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
it("tools/call rejects a malformed whole-argument filter placeholder", async () => {
|
|
209
|
+
const { client, server } = await connect();
|
|
210
|
+
try {
|
|
211
|
+
const result = await client.callTool({
|
|
212
|
+
name: "sf_gql_aggregate",
|
|
213
|
+
arguments: {
|
|
214
|
+
org: ORG,
|
|
215
|
+
object: "Account",
|
|
216
|
+
groupBy: ["Industry"],
|
|
217
|
+
aggregations: [{ function: "count" }],
|
|
218
|
+
filter: "not-a-placeholder",
|
|
219
|
+
},
|
|
220
|
+
});
|
|
221
|
+
expect(result.isError).toBe(true);
|
|
222
|
+
} finally {
|
|
223
|
+
await client.close();
|
|
224
|
+
await server.close();
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
it("tools/list advertises orderBy/filter/first $var branch inline (no lost $ref branches)", async () => {
|
|
229
|
+
const { client, server } = await connect();
|
|
230
|
+
try {
|
|
231
|
+
const list = await client.listTools();
|
|
232
|
+
const tool = list.tools.find((t) => t.name === "sf_gql_aggregate");
|
|
233
|
+
const props = (tool!.inputSchema as { properties: Record<string, unknown> }).properties;
|
|
234
|
+
|
|
235
|
+
// The filter/orderBy/first unions must be self-contained: their advertised
|
|
236
|
+
// JSON Schema must not rely on $ref to express the string branch, because
|
|
237
|
+
// the MCP SDK's converter resolves $refs in ways that have dropped that
|
|
238
|
+
// branch (regressing client-side validation of "$var" inputs). The
|
|
239
|
+
// per-use-site varPlaceholder() factory in AGGREGATE_INPUT exists to keep
|
|
240
|
+
// these branches inlined — this test guards against a DRY refactor to a
|
|
241
|
+
// shared instance silently reintroducing $refs on these args.
|
|
242
|
+
// (Note: aggregations[].alias legitimately emits a $ref elsewhere in the
|
|
243
|
+
// schema — a shared field deduped by zod-to-json-schema, unrelated to and
|
|
244
|
+
// harmless for the $var-promotion path — so we assert per-arg, not whole.)
|
|
245
|
+
for (const key of ["orderBy", "filter", "first"]) {
|
|
246
|
+
const schema = JSON.stringify(props[key]);
|
|
247
|
+
expect(schema, `${key} must not express its union via $ref`).not.toContain("$ref");
|
|
248
|
+
expect(schema, `${key} must inline a string $var branch`).toMatch(/"type":"string"/);
|
|
249
|
+
expect(schema, `${key} must carry the $var regex pattern`).toContain("\\\\$"); // pattern ^\$...
|
|
250
|
+
}
|
|
251
|
+
} finally {
|
|
252
|
+
await client.close();
|
|
253
|
+
await server.close();
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
it("accepts a whole-argument $first string and $orderBy string", async () => {
|
|
258
|
+
const { client, server } = await connect();
|
|
259
|
+
try {
|
|
260
|
+
const res = await client.callTool({
|
|
261
|
+
name: "sf_gql_aggregate",
|
|
262
|
+
arguments: {
|
|
263
|
+
org: ORG,
|
|
264
|
+
object: "Account",
|
|
265
|
+
groupBy: ["Industry"],
|
|
266
|
+
aggregations: [{ function: "count" }],
|
|
267
|
+
first: "$first",
|
|
268
|
+
orderBy: "$orderBy",
|
|
269
|
+
},
|
|
270
|
+
});
|
|
271
|
+
expect(res.isError).toBeFalsy();
|
|
272
|
+
const content = res.content as { type: string; text?: string }[];
|
|
273
|
+
const out = JSON.parse(content[0]?.text ?? "{}") as {
|
|
274
|
+
query: string;
|
|
275
|
+
variables: { name: string; type: string }[];
|
|
276
|
+
};
|
|
277
|
+
expect(out.query).toMatch(/first\s*:\s*\$first\b/);
|
|
278
|
+
expect(out.query).toMatch(/orderBy\s*:\s*\$orderBy\b/);
|
|
279
|
+
expect(out.variables.find((v) => v.name === "first")).toBeDefined();
|
|
280
|
+
expect(out.variables.find((v) => v.name === "orderBy")?.type).toBe("Account_OrderBy");
|
|
281
|
+
} finally {
|
|
282
|
+
await client.close();
|
|
283
|
+
await server.close();
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
it("rejects an invalid $first placeholder", async () => {
|
|
288
|
+
const { client, server } = await connect();
|
|
289
|
+
try {
|
|
290
|
+
const result = await client.callTool({
|
|
291
|
+
name: "sf_gql_aggregate",
|
|
292
|
+
arguments: { org: ORG, object: "Account", first: "$1bad" },
|
|
293
|
+
});
|
|
294
|
+
expect(result.isError).toBe(true);
|
|
295
|
+
} finally {
|
|
296
|
+
await client.close();
|
|
297
|
+
await server.close();
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
it("accepts a JSON-stringified filter object (model serialization tolerance)", async () => {
|
|
302
|
+
const { client, server } = await connect();
|
|
303
|
+
try {
|
|
304
|
+
const res = await client.callTool({
|
|
305
|
+
name: "sf_gql_aggregate",
|
|
306
|
+
arguments: {
|
|
307
|
+
org: ORG,
|
|
308
|
+
object: "Account",
|
|
309
|
+
groupBy: ["Industry"],
|
|
310
|
+
aggregations: [{ function: "count" }],
|
|
311
|
+
filter: '{"Industry":{"eq":"$q"}}',
|
|
312
|
+
},
|
|
313
|
+
});
|
|
314
|
+
const content = res.content as { type: string; text?: string }[];
|
|
315
|
+
const out = JSON.parse(content[0]?.text ?? "{}") as {
|
|
316
|
+
query: string;
|
|
317
|
+
variables: { name: string }[];
|
|
318
|
+
};
|
|
319
|
+
// coerced to object, leaf $q promoted
|
|
320
|
+
expect(out.variables.find((v) => v.name === "q")).toBeDefined();
|
|
321
|
+
expect(out.query).toMatch(/Industry\s*:\s*\{\s*eq\s*:\s*\$q/);
|
|
322
|
+
} finally {
|
|
323
|
+
await client.close();
|
|
324
|
+
await server.close();
|
|
325
|
+
}
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
it("accepts a stringified number for first", async () => {
|
|
329
|
+
const { client, server } = await connect();
|
|
330
|
+
try {
|
|
331
|
+
const res = await client.callTool({
|
|
332
|
+
name: "sf_gql_aggregate",
|
|
333
|
+
arguments: { org: ORG, object: "Account", first: "25" },
|
|
334
|
+
});
|
|
335
|
+
const content = res.content as { type: string; text?: string }[];
|
|
336
|
+
const out = JSON.parse(content[0]?.text ?? "{}") as { query: string };
|
|
337
|
+
expect(out.query).toMatch(/first\s*:\s*25\b/);
|
|
338
|
+
} finally {
|
|
339
|
+
await client.close();
|
|
340
|
+
await server.close();
|
|
341
|
+
}
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
it("accepts a double-quoted $var placeholder (model double-stringify)", async () => {
|
|
345
|
+
const { client, server } = await connect();
|
|
346
|
+
try {
|
|
347
|
+
const res = await client.callTool({
|
|
348
|
+
name: "sf_gql_aggregate",
|
|
349
|
+
arguments: {
|
|
350
|
+
org: ORG,
|
|
351
|
+
object: "Account",
|
|
352
|
+
groupBy: ["Industry"],
|
|
353
|
+
aggregations: [{ function: "count" }],
|
|
354
|
+
filter: '"$filter"',
|
|
355
|
+
},
|
|
356
|
+
});
|
|
357
|
+
const content = res.content as { type: string; text?: string }[];
|
|
358
|
+
const out = JSON.parse(content[0]?.text ?? "{}") as {
|
|
359
|
+
query: string;
|
|
360
|
+
variables: { name: string }[];
|
|
361
|
+
};
|
|
362
|
+
expect(out.query).toMatch(/where\s*:\s*\$filter\b/);
|
|
363
|
+
expect(out.variables.find((v) => v.name === "filter")).toBeDefined();
|
|
364
|
+
} finally {
|
|
365
|
+
await client.close();
|
|
366
|
+
await server.close();
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
it("rejects a non-JSON garbage string for filter", async () => {
|
|
371
|
+
const { client, server } = await connect();
|
|
372
|
+
try {
|
|
373
|
+
const result = await client.callTool({
|
|
374
|
+
name: "sf_gql_aggregate",
|
|
375
|
+
arguments: { org: ORG, object: "Account", filter: "not json{" },
|
|
376
|
+
});
|
|
377
|
+
expect(result.isError).toBe(true);
|
|
378
|
+
} finally {
|
|
379
|
+
await client.close();
|
|
380
|
+
await server.close();
|
|
381
|
+
}
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
it("rejects garbage string for first (abc)", async () => {
|
|
385
|
+
const { client, server } = await connect();
|
|
386
|
+
try {
|
|
387
|
+
const result = await client.callTool({
|
|
388
|
+
name: "sf_gql_aggregate",
|
|
389
|
+
arguments: { org: ORG, object: "Account", first: "abc" },
|
|
390
|
+
});
|
|
391
|
+
expect(result.isError).toBe(true);
|
|
392
|
+
} finally {
|
|
393
|
+
await client.close();
|
|
394
|
+
await server.close();
|
|
395
|
+
}
|
|
396
|
+
});
|
|
397
|
+
|
|
179
398
|
it("tools/call rejects invalid GraphQL Names in object/operationName", async () => {
|
|
180
399
|
const { client, server } = await connect();
|
|
181
400
|
try {
|
|
@@ -205,24 +205,33 @@ export const AGGREGATE_INPUT = z.object({
|
|
|
205
205
|
.describe(
|
|
206
206
|
"List of aggregation functions to compute. Each entry projects under its alias (or default `<function><PascalCaseField>`).",
|
|
207
207
|
),
|
|
208
|
-
filter:
|
|
209
|
-
.record(z.unknown())
|
|
208
|
+
filter: jsonCoercible(
|
|
209
|
+
z.union([z.record(z.unknown()), varPlaceholder(), jsonLiteralString(), quotedString()]),
|
|
210
|
+
)
|
|
210
211
|
.optional()
|
|
211
212
|
.describe(
|
|
212
|
-
|
|
213
|
+
'<Object>_Filter applied to every aggregation. String leaves matching $varName promote to typed query variables. Pass a single "$varName" string to promote the WHOLE filter to one optional <Object>_Filter variable (bind it to null for "no filter → all buckets").',
|
|
213
214
|
),
|
|
214
|
-
orderBy:
|
|
215
|
-
.union([
|
|
215
|
+
orderBy: jsonCoercible(
|
|
216
|
+
z.union([
|
|
217
|
+
z.record(z.unknown()),
|
|
218
|
+
z.array(z.record(z.unknown())),
|
|
219
|
+
varPlaceholder(),
|
|
220
|
+
jsonLiteralString(),
|
|
221
|
+
quotedString(),
|
|
222
|
+
]),
|
|
223
|
+
)
|
|
216
224
|
.optional()
|
|
217
225
|
.describe(
|
|
218
|
-
|
|
226
|
+
'<Object>_OrderBy. Singleton object preferred; arrays are collapsed to the first entry. String leaves matching $varName promote to typed query variables. Pass a single "$varName" string to promote the whole orderBy to one optional <Object>_OrderBy variable.',
|
|
219
227
|
),
|
|
220
|
-
first:
|
|
221
|
-
.number()
|
|
222
|
-
|
|
223
|
-
.positive()
|
|
228
|
+
first: jsonCoercible(
|
|
229
|
+
z.union([z.number().int().positive(), varPlaceholder(), intLiteralString(), quotedString()]),
|
|
230
|
+
)
|
|
224
231
|
.optional()
|
|
225
|
-
.describe(
|
|
232
|
+
.describe(
|
|
233
|
+
'Connection page size (top-N pattern). No default — omit for all buckets. Pass a single "$varName" string to promote it to an optional Int variable.',
|
|
234
|
+
),
|
|
226
235
|
operationName: graphqlName(
|
|
227
236
|
"Override the GraphQL operation name. Defaults to <Object>Aggregate.",
|
|
228
237
|
).optional(),
|