@salesforce/graphiti 10.10.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/AGENT_GUIDE.md +424 -0
- package/CHANGELOG.md +448 -0
- package/LICENSE.txt +82 -0
- package/README.md +204 -0
- package/TASK.md +249 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.js +683 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/args.d.ts +13 -0
- package/dist/commands/args.js +207 -0
- package/dist/commands/args.js.map +1 -0
- package/dist/commands/build.d.ts +11 -0
- package/dist/commands/build.js +209 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/connect.d.ts +8 -0
- package/dist/commands/connect.js +55 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/describe.d.ts +6 -0
- package/dist/commands/describe.js +229 -0
- package/dist/commands/describe.js.map +1 -0
- package/dist/commands/meta.d.ts +9 -0
- package/dist/commands/meta.js +140 -0
- package/dist/commands/meta.js.map +1 -0
- package/dist/commands/navigate.d.ts +14 -0
- package/dist/commands/navigate.js +105 -0
- package/dist/commands/navigate.js.map +1 -0
- package/dist/commands/query-helpers.d.ts +80 -0
- package/dist/commands/query-helpers.js +865 -0
- package/dist/commands/query-helpers.js.map +1 -0
- package/dist/commands/query.d.ts +26 -0
- package/dist/commands/query.js +901 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/review.d.ts +18 -0
- package/dist/commands/review.js +533 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/session-mgmt.d.ts +25 -0
- package/dist/commands/session-mgmt.js +206 -0
- package/dist/commands/session-mgmt.js.map +1 -0
- package/dist/commands/type.d.ts +6 -0
- package/dist/commands/type.js +342 -0
- package/dist/commands/type.js.map +1 -0
- package/dist/commands/validate-input.d.ts +6 -0
- package/dist/commands/validate-input.js +32 -0
- package/dist/commands/validate-input.js.map +1 -0
- package/dist/intent/build-aggregate.d.ts +33 -0
- package/dist/intent/build-aggregate.js +134 -0
- package/dist/intent/build-aggregate.js.map +1 -0
- package/dist/intent/build-create.d.ts +14 -0
- package/dist/intent/build-create.js +16 -0
- package/dist/intent/build-create.js.map +1 -0
- package/dist/intent/build-delete.d.ts +30 -0
- package/dist/intent/build-delete.js +53 -0
- package/dist/intent/build-delete.js.map +1 -0
- package/dist/intent/build-detail.d.ts +32 -0
- package/dist/intent/build-detail.js +80 -0
- package/dist/intent/build-detail.js.map +1 -0
- package/dist/intent/build-discover.d.ts +30 -0
- package/dist/intent/build-discover.js +149 -0
- package/dist/intent/build-discover.js.map +1 -0
- package/dist/intent/build-list.d.ts +28 -0
- package/dist/intent/build-list.js +75 -0
- package/dist/intent/build-list.js.map +1 -0
- package/dist/intent/build-mutation.d.ts +23 -0
- package/dist/intent/build-mutation.js +54 -0
- package/dist/intent/build-mutation.js.map +1 -0
- package/dist/intent/build-output.d.ts +27 -0
- package/dist/intent/build-output.js +60 -0
- package/dist/intent/build-output.js.map +1 -0
- package/dist/intent/build-raw.d.ts +23 -0
- package/dist/intent/build-raw.js +54 -0
- package/dist/intent/build-raw.js.map +1 -0
- package/dist/intent/build-update.d.ts +14 -0
- package/dist/intent/build-update.js +16 -0
- package/dist/intent/build-update.js.map +1 -0
- package/dist/intent/get-schema-with-priming.d.ts +26 -0
- package/dist/intent/get-schema-with-priming.js +32 -0
- package/dist/intent/get-schema-with-priming.js.map +1 -0
- package/dist/intent/select-child-relationship.d.ts +19 -0
- package/dist/intent/select-child-relationship.js +38 -0
- package/dist/intent/select-child-relationship.js.map +1 -0
- package/dist/intent/types.d.ts +159 -0
- package/dist/intent/types.js +21 -0
- package/dist/intent/types.js.map +1 -0
- package/dist/lib/apply-command.d.ts +15 -0
- package/dist/lib/apply-command.js +238 -0
- package/dist/lib/apply-command.js.map +1 -0
- package/dist/lib/auth.d.ts +38 -0
- package/dist/lib/auth.js +113 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/codegen.d.ts +32 -0
- package/dist/lib/codegen.js +700 -0
- package/dist/lib/codegen.js.map +1 -0
- package/dist/lib/command-registry.d.ts +59 -0
- package/dist/lib/command-registry.js +366 -0
- package/dist/lib/command-registry.js.map +1 -0
- package/dist/lib/formatter.d.ts +76 -0
- package/dist/lib/formatter.js +419 -0
- package/dist/lib/formatter.js.map +1 -0
- package/dist/lib/fs-utils.d.ts +23 -0
- package/dist/lib/fs-utils.js +46 -0
- package/dist/lib/fs-utils.js.map +1 -0
- package/dist/lib/graphql-name.d.ts +27 -0
- package/dist/lib/graphql-name.js +32 -0
- package/dist/lib/graphql-name.js.map +1 -0
- package/dist/lib/interactive.d.ts +6 -0
- package/dist/lib/interactive.js +562 -0
- package/dist/lib/interactive.js.map +1 -0
- package/dist/lib/introspect.d.ts +40 -0
- package/dist/lib/introspect.js +280 -0
- package/dist/lib/introspect.js.map +1 -0
- package/dist/lib/object-info.d.ts +79 -0
- package/dist/lib/object-info.js +313 -0
- package/dist/lib/object-info.js.map +1 -0
- package/dist/lib/path-selection.d.ts +50 -0
- package/dist/lib/path-selection.js +146 -0
- package/dist/lib/path-selection.js.map +1 -0
- package/dist/lib/prime-schema.d.ts +59 -0
- package/dist/lib/prime-schema.js +158 -0
- package/dist/lib/prime-schema.js.map +1 -0
- package/dist/lib/query-builder.d.ts +10 -0
- package/dist/lib/query-builder.js +168 -0
- package/dist/lib/query-builder.js.map +1 -0
- package/dist/lib/query-commands.d.ts +19 -0
- package/dist/lib/query-commands.js +262 -0
- package/dist/lib/query-commands.js.map +1 -0
- package/dist/lib/session.d.ts +205 -0
- package/dist/lib/session.js +1075 -0
- package/dist/lib/session.js.map +1 -0
- package/dist/lib/tokenize.d.ts +12 -0
- package/dist/lib/tokenize.js +48 -0
- package/dist/lib/tokenize.js.map +1 -0
- package/dist/lib/uiapi.d.ts +109 -0
- package/dist/lib/uiapi.js +159 -0
- package/dist/lib/uiapi.js.map +1 -0
- package/dist/lib/validator.d.ts +27 -0
- package/dist/lib/validator.js +100 -0
- package/dist/lib/validator.js.map +1 -0
- package/dist/lib/variable-promotion.d.ts +69 -0
- package/dist/lib/variable-promotion.js +95 -0
- package/dist/lib/variable-promotion.js.map +1 -0
- package/dist/lib/walker.d.ts +147 -0
- package/dist/lib/walker.js +723 -0
- package/dist/lib/walker.js.map +1 -0
- package/dist/mcp/server.d.ts +7 -0
- package/dist/mcp/server.js +34 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/stdio.d.ts +7 -0
- package/dist/mcp/stdio.js +25 -0
- package/dist/mcp/stdio.js.map +1 -0
- package/dist/mcp/tools/echo.d.ts +7 -0
- package/dist/mcp/tools/echo.js +17 -0
- package/dist/mcp/tools/echo.js.map +1 -0
- package/dist/mcp/tools/sf-gql-aggregate.d.ts +11 -0
- package/dist/mcp/tools/sf-gql-aggregate.js +75 -0
- package/dist/mcp/tools/sf-gql-aggregate.js.map +1 -0
- package/dist/mcp/tools/sf-gql-create.d.ts +11 -0
- package/dist/mcp/tools/sf-gql-create.js +35 -0
- package/dist/mcp/tools/sf-gql-create.js.map +1 -0
- package/dist/mcp/tools/sf-gql-delete.d.ts +11 -0
- package/dist/mcp/tools/sf-gql-delete.js +31 -0
- package/dist/mcp/tools/sf-gql-delete.js.map +1 -0
- package/dist/mcp/tools/sf-gql-detail.d.ts +11 -0
- package/dist/mcp/tools/sf-gql-detail.js +58 -0
- package/dist/mcp/tools/sf-gql-detail.js.map +1 -0
- package/dist/mcp/tools/sf-gql-discover.d.ts +9 -0
- package/dist/mcp/tools/sf-gql-discover.js +51 -0
- package/dist/mcp/tools/sf-gql-discover.js.map +1 -0
- package/dist/mcp/tools/sf-gql-list.d.ts +11 -0
- package/dist/mcp/tools/sf-gql-list.js +53 -0
- package/dist/mcp/tools/sf-gql-list.js.map +1 -0
- package/dist/mcp/tools/sf-gql-raw.d.ts +11 -0
- package/dist/mcp/tools/sf-gql-raw.js +39 -0
- package/dist/mcp/tools/sf-gql-raw.js.map +1 -0
- package/dist/mcp/tools/sf-gql-update.d.ts +11 -0
- package/dist/mcp/tools/sf-gql-update.js +35 -0
- package/dist/mcp/tools/sf-gql-update.js.map +1 -0
- package/dist/mcp/tools/shared/zod-schemas.d.ts +49 -0
- package/dist/mcp/tools/shared/zod-schemas.js +46 -0
- package/dist/mcp/tools/shared/zod-schemas.js.map +1 -0
- package/package.json +36 -0
- package/ralph-loop.sh +120 -0
- package/scripts/smoke-orderby.sh +190 -0
- package/src/__tests__/helpers/prime-deps.ts +46 -0
- package/src/__tests__/helpers/schema.ts +73 -0
- package/src/__tests__/helpers/stdout.ts +33 -0
- package/src/__tests__/setup.ts +19 -0
- package/src/cli.ts +764 -0
- package/src/commands/__tests__/query.spec.ts +137 -0
- package/src/commands/args.ts +306 -0
- package/src/commands/build.ts +288 -0
- package/src/commands/connect.ts +60 -0
- package/src/commands/describe.ts +246 -0
- package/src/commands/meta.ts +171 -0
- package/src/commands/navigate.ts +134 -0
- package/src/commands/query-helpers.ts +1202 -0
- package/src/commands/query.ts +1085 -0
- package/src/commands/review.ts +670 -0
- package/src/commands/session-mgmt.ts +256 -0
- package/src/commands/type.ts +437 -0
- package/src/commands/validate-input.ts +38 -0
- package/src/intent/__tests__/build-aggregate.spec.ts +931 -0
- package/src/intent/__tests__/build-create-validation.spec.ts +135 -0
- package/src/intent/__tests__/build-delete.spec.ts +121 -0
- package/src/intent/__tests__/build-detail.spec.ts +333 -0
- package/src/intent/__tests__/build-discover.spec.ts +432 -0
- package/src/intent/__tests__/build-list.spec.ts +284 -0
- package/src/intent/__tests__/build-mutation.spec.ts +108 -0
- package/src/intent/__tests__/build-output.spec.ts +55 -0
- package/src/intent/__tests__/build-raw.spec.ts +153 -0
- package/src/intent/__tests__/build-update-validation.spec.ts +134 -0
- package/src/intent/build-aggregate.ts +182 -0
- package/src/intent/build-create.ts +19 -0
- package/src/intent/build-delete.ts +62 -0
- package/src/intent/build-detail.ts +95 -0
- package/src/intent/build-discover.ts +199 -0
- package/src/intent/build-list.ts +91 -0
- package/src/intent/build-mutation.ts +75 -0
- package/src/intent/build-output.ts +72 -0
- package/src/intent/build-raw.ts +61 -0
- package/src/intent/build-update.ts +19 -0
- package/src/intent/get-schema-with-priming.ts +43 -0
- package/src/intent/select-child-relationship.ts +48 -0
- package/src/intent/types.ts +181 -0
- package/src/lib/__tests__/apply-command.parity.spec.ts +97 -0
- package/src/lib/__tests__/apply-command.spec.ts +171 -0
- package/src/lib/__tests__/auth.spec.ts +292 -0
- package/src/lib/__tests__/formatter.spec.ts +86 -0
- package/src/lib/__tests__/graphql-name.spec.ts +64 -0
- package/src/lib/__tests__/introspect.spec.ts +399 -0
- package/src/lib/__tests__/object-info.spec.ts +124 -0
- package/src/lib/__tests__/path-selection.spec.ts +219 -0
- package/src/lib/__tests__/prime-schema.spec.ts +269 -0
- package/src/lib/__tests__/query-builder.spec.ts +95 -0
- package/src/lib/__tests__/query-commands.spec.ts +74 -0
- package/src/lib/__tests__/session.spec.ts +292 -0
- package/src/lib/__tests__/tokenize.spec.ts +33 -0
- package/src/lib/__tests__/uiapi.spec.ts +192 -0
- package/src/lib/__tests__/variable-promotion.spec.ts +211 -0
- package/src/lib/__tests__/walker.spec.ts +250 -0
- package/src/lib/apply-command.ts +286 -0
- package/src/lib/auth.ts +157 -0
- package/src/lib/codegen.ts +899 -0
- package/src/lib/command-registry.ts +434 -0
- package/src/lib/formatter.ts +587 -0
- package/src/lib/fs-utils.ts +46 -0
- package/src/lib/graphql-name.ts +35 -0
- package/src/lib/interactive.ts +634 -0
- package/src/lib/introspect.ts +320 -0
- package/src/lib/object-info.ts +409 -0
- package/src/lib/path-selection.ts +162 -0
- package/src/lib/prime-schema.ts +195 -0
- package/src/lib/query-builder.ts +193 -0
- package/src/lib/query-commands.ts +290 -0
- package/src/lib/session.ts +1304 -0
- package/src/lib/tokenize.ts +43 -0
- package/src/lib/uiapi.ts +176 -0
- package/src/lib/validator.ts +143 -0
- package/src/lib/variable-promotion.ts +145 -0
- package/src/lib/walker.ts +975 -0
- package/src/mcp/__tests__/server.spec.ts +155 -0
- package/src/mcp/server.ts +38 -0
- package/src/mcp/stdio.ts +29 -0
- package/src/mcp/tools/__tests__/sf-gql-aggregate.spec.ts +173 -0
- package/src/mcp/tools/__tests__/sf-gql-create.spec.ts +235 -0
- package/src/mcp/tools/__tests__/sf-gql-delete.spec.ts +194 -0
- package/src/mcp/tools/__tests__/sf-gql-detail.spec.ts +246 -0
- package/src/mcp/tools/__tests__/sf-gql-discover.spec.ts +320 -0
- package/src/mcp/tools/__tests__/sf-gql-list.spec.ts +128 -0
- package/src/mcp/tools/__tests__/sf-gql-raw.spec.ts +141 -0
- package/src/mcp/tools/__tests__/sf-gql-update.spec.ts +207 -0
- package/src/mcp/tools/echo.ts +24 -0
- package/src/mcp/tools/sf-gql-aggregate.ts +102 -0
- package/src/mcp/tools/sf-gql-create.ts +55 -0
- package/src/mcp/tools/sf-gql-delete.ts +49 -0
- package/src/mcp/tools/sf-gql-detail.ts +85 -0
- package/src/mcp/tools/sf-gql-discover.ts +67 -0
- package/src/mcp/tools/sf-gql-list.ts +73 -0
- package/src/mcp/tools/sf-gql-raw.ts +56 -0
- package/src/mcp/tools/sf-gql-update.ts +55 -0
- package/src/mcp/tools/shared/zod-schemas.ts +55 -0
- package/tsconfig.json +18 -0
- package/vitest.config.ts +14 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026, Salesforce, Inc.,
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* For full license text, see the LICENSE.txt file
|
|
5
|
+
*/
|
|
6
|
+
import { type GraphQLSchema } from "graphql";
|
|
7
|
+
import { type ChildRelationshipSpec } from "./types.js";
|
|
8
|
+
import { type QuerySession } from "../lib/session.js";
|
|
9
|
+
/**
|
|
10
|
+
* Render a UIAPI child relationship onto an existing query session as
|
|
11
|
+
* `<rel> { edges { node { ... } } }`, with optional `first` / `filter` /
|
|
12
|
+
* `orderBy` arguments on the connection. `$varName` leaves in `filter` and
|
|
13
|
+
* `orderBy` promote to typed query variables (same machinery as the top-level
|
|
14
|
+
* connection).
|
|
15
|
+
*
|
|
16
|
+
* Shared by `buildList` and `buildDetail`. Behavior is identical between
|
|
17
|
+
* callers — the connection node path is the only thing that varies.
|
|
18
|
+
*/
|
|
19
|
+
export declare function selectChildRelationship(session: QuerySession, schema: GraphQLSchema, parentNodePath: string[], child: ChildRelationshipSpec): void;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026, Salesforce, Inc.,
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* For full license text, see the LICENSE.txt file
|
|
5
|
+
*/
|
|
6
|
+
import { selectDottedFieldPath } from "../lib/path-selection.js";
|
|
7
|
+
import { deepSetArg } from "../lib/session.js";
|
|
8
|
+
import { normalizeOrderBy, promoteVariables } from "../lib/variable-promotion.js";
|
|
9
|
+
/**
|
|
10
|
+
* Render a UIAPI child relationship onto an existing query session as
|
|
11
|
+
* `<rel> { edges { node { ... } } }`, with optional `first` / `filter` /
|
|
12
|
+
* `orderBy` arguments on the connection. `$varName` leaves in `filter` and
|
|
13
|
+
* `orderBy` promote to typed query variables (same machinery as the top-level
|
|
14
|
+
* connection).
|
|
15
|
+
*
|
|
16
|
+
* Shared by `buildList` and `buildDetail`. Behavior is identical between
|
|
17
|
+
* callers — the connection node path is the only thing that varies.
|
|
18
|
+
*/
|
|
19
|
+
export function selectChildRelationship(session, schema, parentNodePath, child) {
|
|
20
|
+
const childConnectionPath = [...parentNodePath, child.relationshipName];
|
|
21
|
+
const childNodePath = [...childConnectionPath, "edges", "node"];
|
|
22
|
+
for (const field of child.fields) {
|
|
23
|
+
selectDottedFieldPath(session, schema, childNodePath, field);
|
|
24
|
+
}
|
|
25
|
+
if (child.first !== undefined) {
|
|
26
|
+
deepSetArg(session, childConnectionPath, "first", [], String(child.first));
|
|
27
|
+
}
|
|
28
|
+
if (child.filter) {
|
|
29
|
+
promoteVariables(session, schema, childConnectionPath, "where", child.filter);
|
|
30
|
+
deepSetArg(session, childConnectionPath, "where", [], JSON.stringify(child.filter));
|
|
31
|
+
}
|
|
32
|
+
const childOrderBy = normalizeOrderBy(child.orderBy);
|
|
33
|
+
if (childOrderBy) {
|
|
34
|
+
promoteVariables(session, schema, childConnectionPath, "orderBy", childOrderBy);
|
|
35
|
+
deepSetArg(session, childConnectionPath, "orderBy", [], JSON.stringify(childOrderBy));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=select-child-relationship.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select-child-relationship.js","sourceRoot":"","sources":["../../src/intent/select-child-relationship.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAqB,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAElF;;;;;;;;;GASG;AACH,MAAM,UAAU,uBAAuB,CACtC,OAAqB,EACrB,MAAqB,EACrB,cAAwB,EACxB,KAA4B;IAE5B,MAAM,mBAAmB,GAAG,CAAC,GAAG,cAAc,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACxE,MAAM,aAAa,GAAG,CAAC,GAAG,mBAAmB,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAEhE,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAClC,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,UAAU,CAAC,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAClB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC9E,UAAU,CAAC,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACrF,CAAC;IACD,MAAM,YAAY,GAAG,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrD,IAAI,YAAY,EAAE,CAAC;QAClB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QAChF,UAAU,CAAC,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC;IACvF,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026, Salesforce, Inc.,
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* For full license text, see the LICENSE.txt file
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Shared envelope returned by every typed intent function. The MCP tool
|
|
8
|
+
* adapter JSON-stringifies this into the tool-call result; library
|
|
9
|
+
* consumers (CLI, eval harness) use it directly. Per FR-3 of the spec.
|
|
10
|
+
*/
|
|
11
|
+
export interface ToolOutput {
|
|
12
|
+
query: string;
|
|
13
|
+
variables: VariableInfo[];
|
|
14
|
+
types: string;
|
|
15
|
+
warnings: string[];
|
|
16
|
+
}
|
|
17
|
+
export interface VariableInfo {
|
|
18
|
+
name: string;
|
|
19
|
+
type: string;
|
|
20
|
+
required: boolean;
|
|
21
|
+
description?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface ChildRelationshipSpec {
|
|
24
|
+
relationshipName: string;
|
|
25
|
+
fields: string[];
|
|
26
|
+
first?: number;
|
|
27
|
+
filter?: Record<string, unknown>;
|
|
28
|
+
orderBy?: Record<string, unknown> | Record<string, unknown>[];
|
|
29
|
+
}
|
|
30
|
+
export interface ListSpec {
|
|
31
|
+
org: string;
|
|
32
|
+
object: string;
|
|
33
|
+
fields: string[];
|
|
34
|
+
parentFields?: string[];
|
|
35
|
+
childRelationships?: ChildRelationshipSpec[];
|
|
36
|
+
filter?: Record<string, unknown>;
|
|
37
|
+
orderBy?: Record<string, unknown> | Record<string, unknown>[];
|
|
38
|
+
first?: number;
|
|
39
|
+
scope?: string;
|
|
40
|
+
operationName?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface DetailSpec {
|
|
43
|
+
org: string;
|
|
44
|
+
object: string;
|
|
45
|
+
fields: string[];
|
|
46
|
+
parentFields?: string[];
|
|
47
|
+
childRelationships?: ChildRelationshipSpec[];
|
|
48
|
+
/** Variable name (without leading `$`) for the record Id; default `"id"`. Declared as `<name>: ID!` per FR-5.5. */
|
|
49
|
+
idVariable?: string;
|
|
50
|
+
/** GraphQL operation name; default `<Object>Detail`. */
|
|
51
|
+
operationName?: string;
|
|
52
|
+
}
|
|
53
|
+
export type AggregationFunction = "count" | "countDistinct" | "sum" | "avg" | "min" | "max";
|
|
54
|
+
export declare const GROUP_BY_FUNCTIONS: readonly ["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"];
|
|
55
|
+
export type GroupByFunction = (typeof GROUP_BY_FUNCTIONS)[number];
|
|
56
|
+
export interface GroupByDateElement {
|
|
57
|
+
field: string;
|
|
58
|
+
function: GroupByFunction;
|
|
59
|
+
}
|
|
60
|
+
export type GroupByElement = string | GroupByDateElement;
|
|
61
|
+
export interface AggregationSpec {
|
|
62
|
+
function: AggregationFunction;
|
|
63
|
+
field?: string;
|
|
64
|
+
alias?: string;
|
|
65
|
+
}
|
|
66
|
+
export interface AggregateSpec {
|
|
67
|
+
org: string;
|
|
68
|
+
object: string;
|
|
69
|
+
groupBy?: GroupByElement[];
|
|
70
|
+
aggregations?: AggregationSpec[];
|
|
71
|
+
filter?: Record<string, unknown>;
|
|
72
|
+
orderBy?: Record<string, unknown> | Record<string, unknown>[];
|
|
73
|
+
first?: number;
|
|
74
|
+
operationName?: string;
|
|
75
|
+
}
|
|
76
|
+
export type DiscoverMode = "list_objects" | "describe_object" | "describe_field";
|
|
77
|
+
export interface DiscoverSpec {
|
|
78
|
+
org: string;
|
|
79
|
+
mode: DiscoverMode;
|
|
80
|
+
object?: string;
|
|
81
|
+
field?: string;
|
|
82
|
+
search?: string;
|
|
83
|
+
}
|
|
84
|
+
export interface FieldDescription {
|
|
85
|
+
name: string;
|
|
86
|
+
label: string;
|
|
87
|
+
type: string;
|
|
88
|
+
filterable: boolean;
|
|
89
|
+
sortable: boolean;
|
|
90
|
+
nameField: boolean;
|
|
91
|
+
compound: boolean;
|
|
92
|
+
defaultedOnCreate: boolean;
|
|
93
|
+
picklistValues?: string[];
|
|
94
|
+
}
|
|
95
|
+
export interface ObjectDescription {
|
|
96
|
+
name: string;
|
|
97
|
+
fields: FieldDescription[];
|
|
98
|
+
childRelationships: {
|
|
99
|
+
relationshipName: string;
|
|
100
|
+
childObject: string;
|
|
101
|
+
}[];
|
|
102
|
+
parentReferences: {
|
|
103
|
+
field: string;
|
|
104
|
+
targetObjects: string[];
|
|
105
|
+
}[];
|
|
106
|
+
filterableFields: string[];
|
|
107
|
+
orderByExample: Record<string, unknown>;
|
|
108
|
+
requiredOnCreate: string[];
|
|
109
|
+
}
|
|
110
|
+
export type DiscoverOutput = {
|
|
111
|
+
mode: "list_objects";
|
|
112
|
+
objects: {
|
|
113
|
+
name: string;
|
|
114
|
+
label?: string;
|
|
115
|
+
}[];
|
|
116
|
+
warnings?: string[];
|
|
117
|
+
} | {
|
|
118
|
+
mode: "describe_object";
|
|
119
|
+
object: ObjectDescription;
|
|
120
|
+
warnings?: string[];
|
|
121
|
+
} | {
|
|
122
|
+
mode: "describe_field";
|
|
123
|
+
field: FieldDescription;
|
|
124
|
+
warnings?: string[];
|
|
125
|
+
};
|
|
126
|
+
export interface CreateSpec {
|
|
127
|
+
org: string;
|
|
128
|
+
object: string;
|
|
129
|
+
returnFields?: string[];
|
|
130
|
+
inputVariable?: string;
|
|
131
|
+
operationName?: string;
|
|
132
|
+
}
|
|
133
|
+
export interface UpdateSpec {
|
|
134
|
+
org: string;
|
|
135
|
+
object: string;
|
|
136
|
+
returnFields?: string[];
|
|
137
|
+
inputVariable?: string;
|
|
138
|
+
operationName?: string;
|
|
139
|
+
}
|
|
140
|
+
export interface DeleteSpec {
|
|
141
|
+
org: string;
|
|
142
|
+
object: string;
|
|
143
|
+
inputVariable?: string;
|
|
144
|
+
operationName?: string;
|
|
145
|
+
}
|
|
146
|
+
export type RawOperation = "query" | "mutation" | "aggregate";
|
|
147
|
+
export interface RawSpec {
|
|
148
|
+
org: string;
|
|
149
|
+
/**
|
|
150
|
+
* CLI-style commands applied in order to a transient session. v1 supports
|
|
151
|
+
* `select <path[:alias]>`, `set [<path>] <key>=<value>`, and
|
|
152
|
+
* `var $name <path> [default]`. See FR-12.
|
|
153
|
+
*/
|
|
154
|
+
commands: string[];
|
|
155
|
+
/** Operation root; default `"query"`. Sets the `createSession` operation. */
|
|
156
|
+
operation?: RawOperation;
|
|
157
|
+
/** Codegen type prefix / operation name override (FR-12.3). */
|
|
158
|
+
typeName?: string;
|
|
159
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026, Salesforce, Inc.,
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* For full license text, see the LICENSE.txt file
|
|
5
|
+
*/
|
|
6
|
+
export const GROUP_BY_FUNCTIONS = [
|
|
7
|
+
"CALENDAR_MONTH",
|
|
8
|
+
"CALENDAR_QUARTER",
|
|
9
|
+
"CALENDAR_YEAR",
|
|
10
|
+
"DAY_IN_MONTH",
|
|
11
|
+
"DAY_IN_WEEK",
|
|
12
|
+
"DAY_IN_YEAR",
|
|
13
|
+
"FISCAL_MONTH",
|
|
14
|
+
"FISCAL_QUARTER",
|
|
15
|
+
"FISCAL_YEAR",
|
|
16
|
+
"HOUR_IN_DAY",
|
|
17
|
+
"CALENDAR_MONTH_IN_YEAR",
|
|
18
|
+
"FISCAL_MONTH_IN_YEAR",
|
|
19
|
+
"WEEK_IN_YEAR",
|
|
20
|
+
];
|
|
21
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/intent/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwDH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IACjC,gBAAgB;IAChB,kBAAkB;IAClB,eAAe;IACf,cAAc;IACd,aAAa;IACb,aAAa;IACb,cAAc;IACd,gBAAgB;IAChB,aAAa;IACb,aAAa;IACb,wBAAwB;IACxB,sBAAsB;IACtB,cAAc;CACL,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026, Salesforce, Inc.,
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* For full license text, see the LICENSE.txt file
|
|
5
|
+
*/
|
|
6
|
+
import { type GraphQLSchema } from "graphql";
|
|
7
|
+
import { type QuerySession } from "./session.js";
|
|
8
|
+
/**
|
|
9
|
+
* Apply one CLI-style command to a transient in-memory session. Mutates
|
|
10
|
+
* `session` in place. Throws on any failure (unknown verb, malformed tokens,
|
|
11
|
+
* unresolvable path) so the caller can fail the whole `commands[]` sequence.
|
|
12
|
+
*
|
|
13
|
+
* v1 supports `select`, `set`, and `var` (FR-12.1, live CLI grammar).
|
|
14
|
+
*/
|
|
15
|
+
export declare function applyCommand(session: QuerySession, schema: GraphQLSchema, cmd: string): void;
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026, Salesforce, Inc.,
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* For full license text, see the LICENSE.txt file
|
|
5
|
+
*/
|
|
6
|
+
import { tokenizeCommand } from "./tokenize.js";
|
|
7
|
+
import { defineAtPath } from "../commands/args.js";
|
|
8
|
+
import { selectLeafInSession, assignViaPath } from "../commands/query-helpers.js";
|
|
9
|
+
/**
|
|
10
|
+
* Apply one CLI-style command to a transient in-memory session. Mutates
|
|
11
|
+
* `session` in place. Throws on any failure (unknown verb, malformed tokens,
|
|
12
|
+
* unresolvable path) so the caller can fail the whole `commands[]` sequence.
|
|
13
|
+
*
|
|
14
|
+
* v1 supports `select`, `set`, and `var` (FR-12.1, live CLI grammar).
|
|
15
|
+
*/
|
|
16
|
+
export function applyCommand(session, schema, cmd) {
|
|
17
|
+
const tokens = tokenizeCommand(cmd);
|
|
18
|
+
if (tokens.length === 0) {
|
|
19
|
+
throw new Error("empty command");
|
|
20
|
+
}
|
|
21
|
+
const verb = tokens[0];
|
|
22
|
+
const rest = tokens.slice(1);
|
|
23
|
+
// The ported helpers (defineAtPath, assignViaPath→emitObjectInfoWarnings,
|
|
24
|
+
// selectLeafInSession) emit console.log/info for CLI feedback — i.e. to
|
|
25
|
+
// STDOUT. In an MCP stdio server stdout is the JSON-RPC frame stream
|
|
26
|
+
// (see mcp/stdio.ts); any stray write corrupts it. Silence the stdout-bound
|
|
27
|
+
// console methods for the duration. console.warn/error (stderr) are left
|
|
28
|
+
// intact — stderr is safe and may carry diagnostics. applyCommand is
|
|
29
|
+
// synchronous, so the finally-restore cannot interleave with other work.
|
|
30
|
+
const origLog = console.log;
|
|
31
|
+
const origInfo = console.info;
|
|
32
|
+
const noop = () => {
|
|
33
|
+
/* swallow stdout-bound CLI feedback — see comment above */
|
|
34
|
+
};
|
|
35
|
+
console.log = noop;
|
|
36
|
+
console.info = noop;
|
|
37
|
+
try {
|
|
38
|
+
switch (verb) {
|
|
39
|
+
case "select":
|
|
40
|
+
applySelect(session, rest);
|
|
41
|
+
return;
|
|
42
|
+
case "set":
|
|
43
|
+
applySet(session, rest);
|
|
44
|
+
return;
|
|
45
|
+
case "var":
|
|
46
|
+
applyVar(session, rest);
|
|
47
|
+
return;
|
|
48
|
+
default:
|
|
49
|
+
throw new Error(`unknown command '${verb}' (sf_gql_raw v1 supports: select, set, var)`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
finally {
|
|
53
|
+
console.log = origLog;
|
|
54
|
+
console.info = origInfo;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function applySelect(session, rest) {
|
|
58
|
+
// Ported from commands/query.ts `select` case. Splits each token into
|
|
59
|
+
// `spec[:alias]`, honoring `.on:Type` fragment syntax (a trailing `:alias`
|
|
60
|
+
// only counts when it has no `.`/`/`/`:` chars). Console feedback and the
|
|
61
|
+
// CLI's `--optional` / `opts.as` paths are intentionally dropped (FR-12 v1).
|
|
62
|
+
const selectItems = [];
|
|
63
|
+
for (const rawToken of rest) {
|
|
64
|
+
if (rawToken.startsWith("--"))
|
|
65
|
+
continue;
|
|
66
|
+
const subTokens = rawToken.includes(" ") ? rawToken.split(/\s+/).filter(Boolean) : [rawToken];
|
|
67
|
+
for (const token of subTokens) {
|
|
68
|
+
const colonIdx = token.lastIndexOf(":");
|
|
69
|
+
const afterColon = colonIdx > 0 ? token.slice(colonIdx + 1) : "";
|
|
70
|
+
if (colonIdx > 0 && afterColon.length > 0 && !/[./:]/.test(afterColon)) {
|
|
71
|
+
selectItems.push({ spec: token.slice(0, colonIdx), alias: afterColon });
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
selectItems.push({ spec: token });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (selectItems.length === 0) {
|
|
79
|
+
throw new Error("select requires at least one <path[:alias]>");
|
|
80
|
+
}
|
|
81
|
+
for (const item of selectItems) {
|
|
82
|
+
selectLeafInSession(session, item.spec, item.alias);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function applySet(session, rest) {
|
|
86
|
+
// Ported from commands/query.ts `set` case (the 170-line shorthand parser).
|
|
87
|
+
// Transform: queryAssign→assignViaPath, queryDefine→defineAtPath, cursor
|
|
88
|
+
// pageInfo→selectLeafInSession, console+return→throw, drop --default's
|
|
89
|
+
// console feedback. Parity-tested against the dispatcher (Task 8).
|
|
90
|
+
//
|
|
91
|
+
// No schema param: assignViaPath/defineAtPath resolve the schema from the
|
|
92
|
+
// session. `isDefault` (below) only affected a dropped console message and the
|
|
93
|
+
// /variables/ context path the raw tool never enters — so it is computed for
|
|
94
|
+
// parse parity but intentionally has no effect here.
|
|
95
|
+
const isDefault = rest.includes("--default");
|
|
96
|
+
const filtered = rest.filter((r) => r !== "--default" && !r.startsWith("--"));
|
|
97
|
+
const hasCursor = filtered.includes("cursor");
|
|
98
|
+
const filteredNoCursor = hasCursor ? filtered.filter((t) => t !== "cursor") : filtered;
|
|
99
|
+
const specs = [];
|
|
100
|
+
const deferredVarDefs = [];
|
|
101
|
+
const hasKeyValue = filteredNoCursor.some((t) => t.includes("=") && !t.startsWith("$") && !t.startsWith("{") && !t.startsWith("["));
|
|
102
|
+
let cursorFieldPrefix = "";
|
|
103
|
+
if (hasKeyValue) {
|
|
104
|
+
let fieldPrefix = "";
|
|
105
|
+
let startIdx = 0;
|
|
106
|
+
if (filteredNoCursor.length > 0 && !filteredNoCursor[0].includes("=")) {
|
|
107
|
+
fieldPrefix = filteredNoCursor[0];
|
|
108
|
+
startIdx = 1;
|
|
109
|
+
}
|
|
110
|
+
cursorFieldPrefix = fieldPrefix;
|
|
111
|
+
for (let i = startIdx; i < filteredNoCursor.length; i++) {
|
|
112
|
+
const token = filteredNoCursor[i];
|
|
113
|
+
const eqIdx = token.indexOf("=");
|
|
114
|
+
if (eqIdx > 0) {
|
|
115
|
+
let key = token.slice(0, eqIdx);
|
|
116
|
+
let val = token.slice(eqIdx + 1);
|
|
117
|
+
// orderBy shorthand: orderBy=Field:DESC → orderBy.Field.order=DESC
|
|
118
|
+
if (key === "orderBy" || key.endsWith("/orderBy") || key.endsWith(".orderBy")) {
|
|
119
|
+
const orderMatch = val.match(/^(\w+):(ASC|DESC)$/i);
|
|
120
|
+
if (orderMatch) {
|
|
121
|
+
key = `${key}.${orderMatch[1]}.order`;
|
|
122
|
+
val = orderMatch[2].toUpperCase();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// where shorthand: where.Field=Value → where={"Field":{"eq":"Value"}}
|
|
126
|
+
// Also supports where.Field.op=Value and where.Field=$var (deferred binding).
|
|
127
|
+
const whereMatch = key.match(/^(.*?)?where\.(\w+)(?:\.(\w+))?$/);
|
|
128
|
+
if (whereMatch) {
|
|
129
|
+
const prefix = whereMatch[1] || "";
|
|
130
|
+
const field = whereMatch[2];
|
|
131
|
+
const op = whereMatch[3] ||
|
|
132
|
+
(val.includes("%") && !val.startsWith("$") && !val.startsWith("{") ? "like" : "eq");
|
|
133
|
+
if (val.startsWith("$")) {
|
|
134
|
+
let resolvedPrefix = fieldPrefix;
|
|
135
|
+
if (resolvedPrefix &&
|
|
136
|
+
!resolvedPrefix.startsWith("/") &&
|
|
137
|
+
!resolvedPrefix.startsWith("query/") &&
|
|
138
|
+
!resolvedPrefix.startsWith("@args")) {
|
|
139
|
+
resolvedPrefix = `query/${resolvedPrefix}`;
|
|
140
|
+
}
|
|
141
|
+
const varPath = resolvedPrefix
|
|
142
|
+
? `${resolvedPrefix}/@args/${prefix}where/${field}/${op}`
|
|
143
|
+
: `${prefix}where/${field}/${op}`;
|
|
144
|
+
deferredVarDefs.push([val, varPath]);
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
key = `${prefix}where`;
|
|
148
|
+
let parsedVal = val;
|
|
149
|
+
if (val === "null")
|
|
150
|
+
parsedVal = null;
|
|
151
|
+
else if (val === "true")
|
|
152
|
+
parsedVal = true;
|
|
153
|
+
else if (val === "false")
|
|
154
|
+
parsedVal = false;
|
|
155
|
+
else if (/^-?\d+(\.\d+)?$/.test(val))
|
|
156
|
+
parsedVal = Number(val);
|
|
157
|
+
else
|
|
158
|
+
parsedVal = val;
|
|
159
|
+
val = JSON.stringify({ [field]: { [op]: parsedVal } });
|
|
160
|
+
}
|
|
161
|
+
let resolvedPrefix = fieldPrefix;
|
|
162
|
+
if (resolvedPrefix &&
|
|
163
|
+
!resolvedPrefix.startsWith("/") &&
|
|
164
|
+
!resolvedPrefix.startsWith("query/") &&
|
|
165
|
+
!resolvedPrefix.startsWith("@args")) {
|
|
166
|
+
resolvedPrefix = `query/${resolvedPrefix}`;
|
|
167
|
+
}
|
|
168
|
+
const fullPath = resolvedPrefix ? `${resolvedPrefix}/@args/${key}` : key;
|
|
169
|
+
specs.push({ path: fullPath, value: val });
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
if (i + 1 < filteredNoCursor.length) {
|
|
173
|
+
let resolvedPrefix = fieldPrefix;
|
|
174
|
+
if (resolvedPrefix &&
|
|
175
|
+
!resolvedPrefix.startsWith("/") &&
|
|
176
|
+
!resolvedPrefix.startsWith("query/") &&
|
|
177
|
+
!resolvedPrefix.startsWith("@args")) {
|
|
178
|
+
resolvedPrefix = `query/${resolvedPrefix}`;
|
|
179
|
+
}
|
|
180
|
+
const path = resolvedPrefix ? `${resolvedPrefix}/@args/${token}` : token;
|
|
181
|
+
specs.push({ path, value: filteredNoCursor[i + 1] });
|
|
182
|
+
i++;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
else if (filteredNoCursor.length > 0) {
|
|
188
|
+
for (let i = 0; i < filteredNoCursor.length; i += 2) {
|
|
189
|
+
const dotPath = filteredNoCursor[i];
|
|
190
|
+
const value = filteredNoCursor[i + 1];
|
|
191
|
+
if (!dotPath || value === undefined) {
|
|
192
|
+
throw new Error("set: usage is `set [<field-path>] <key>=<value> ...` or `set <path> <value>`");
|
|
193
|
+
}
|
|
194
|
+
specs.push({ path: dotPath, value });
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (specs.length === 0 && !hasCursor && deferredVarDefs.length === 0) {
|
|
198
|
+
throw new Error("set: usage is `set [<field-path>] <key>=<value> ...` or `set <path> <value>`");
|
|
199
|
+
}
|
|
200
|
+
for (const { path: dotPath, value } of specs) {
|
|
201
|
+
assignViaPath(session, dotPath, value);
|
|
202
|
+
}
|
|
203
|
+
for (const [varName, varPath] of deferredVarDefs) {
|
|
204
|
+
defineAtPath(session, varName.replace(/^\$/, ""), varPath);
|
|
205
|
+
}
|
|
206
|
+
if (hasCursor) {
|
|
207
|
+
const prefix = cursorFieldPrefix || filteredNoCursor[0] || "";
|
|
208
|
+
if (!prefix) {
|
|
209
|
+
throw new Error("set cursor requires a field path prefix, e.g. `set uiapi/query/Case cursor`");
|
|
210
|
+
}
|
|
211
|
+
const cursorPath = `${prefix}/@args/after`;
|
|
212
|
+
defineAtPath(session, "after", cursorPath);
|
|
213
|
+
try {
|
|
214
|
+
selectLeafInSession(session, `${prefix}/pageInfo/hasNextPage`);
|
|
215
|
+
selectLeafInSession(session, `${prefix}/pageInfo/endCursor`);
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
// pageInfo may already be selected or path may not resolve — ignore (matches CLI).
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
void isDefault;
|
|
222
|
+
}
|
|
223
|
+
function applyVar(session, rest) {
|
|
224
|
+
// Ported from commands/query.ts `var` case → queryDefine → defineAtPath.
|
|
225
|
+
// Raw always supplies a path (no `cd`, so no current-args-position form).
|
|
226
|
+
const varName = rest[0];
|
|
227
|
+
if (!varName) {
|
|
228
|
+
throw new Error("var requires a name, e.g. var $id <path> [default]");
|
|
229
|
+
}
|
|
230
|
+
const pathArg = rest[1];
|
|
231
|
+
if (!pathArg) {
|
|
232
|
+
throw new Error(`var ${varName} requires a schema path, e.g. var ${varName} uiapi/query/Case/@args/where/Id/eq`);
|
|
233
|
+
}
|
|
234
|
+
const cleanName = varName.replace(/^\$/, "");
|
|
235
|
+
const defaultValue = rest[2];
|
|
236
|
+
defineAtPath(session, cleanName, pathArg, defaultValue);
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=apply-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-command.js","sourceRoot":"","sources":["../../src/lib/apply-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026, Salesforce, Inc.,
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* For full license text, see the LICENSE.txt file
|
|
5
|
+
*/
|
|
6
|
+
export interface OrgAuth {
|
|
7
|
+
/**
|
|
8
|
+
* Captured at resolution time as a liveness check (a missing token means the
|
|
9
|
+
* auth has expired). NOT used to authenticate requests: the HTTP layer builds
|
|
10
|
+
* a `Connection` from the alias and lets `@salesforce/core` inject/refresh the
|
|
11
|
+
* token. Retained for callers that surface token state.
|
|
12
|
+
*/
|
|
13
|
+
accessToken: string;
|
|
14
|
+
instanceUrl: string;
|
|
15
|
+
username: string;
|
|
16
|
+
orgId: string;
|
|
17
|
+
alias: string;
|
|
18
|
+
}
|
|
19
|
+
export interface OrgListEntry {
|
|
20
|
+
alias: string;
|
|
21
|
+
username: string;
|
|
22
|
+
instanceUrl: string;
|
|
23
|
+
orgId: string;
|
|
24
|
+
type: "scratch" | "non-scratch";
|
|
25
|
+
isConnected: boolean;
|
|
26
|
+
}
|
|
27
|
+
export declare function clearOrgAuthCache(): void;
|
|
28
|
+
/**
|
|
29
|
+
* Reads Salesforce org credentials via @salesforce/core.
|
|
30
|
+
* Results are memoized for the lifetime of the process so repeated calls
|
|
31
|
+
* within the same command (or an interactive session) only resolve once.
|
|
32
|
+
*/
|
|
33
|
+
export declare function getOrgAuth(orgAlias: string): Promise<OrgAuth>;
|
|
34
|
+
/**
|
|
35
|
+
* Lists available Salesforce orgs via AuthInfo.listAllAuthorizations().
|
|
36
|
+
* Marks orgs that have a cached graphiti schema or session.
|
|
37
|
+
*/
|
|
38
|
+
export declare function listOrgs(): Promise<OrgListEntry[]>;
|
package/dist/lib/auth.js
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026, Salesforce, Inc.,
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
* For full license text, see the LICENSE.txt file
|
|
5
|
+
*/
|
|
6
|
+
import fs from "fs";
|
|
7
|
+
import path from "path";
|
|
8
|
+
import { Org, AuthInfo } from "@salesforce/core";
|
|
9
|
+
import { graphitiHome } from "./fs-utils.js";
|
|
10
|
+
// `--target-org` accepts both aliases and usernames; SF usernames are email-shaped
|
|
11
|
+
// (e.g. `dev+build1@scratch-org-12.example.com`), so the charset must include
|
|
12
|
+
// `@`, `.`, `+`. Leading hyphen and leading dot are still forbidden to defend
|
|
13
|
+
// against `--target-org -foo` flag injection and path-relative parsing quirks.
|
|
14
|
+
// Length cap follows RFC 5321 (253) since SF usernames can be long.
|
|
15
|
+
const ORG_ALIAS_RE = /^[A-Za-z0-9_][A-Za-z0-9_.+@-]{0,252}$/;
|
|
16
|
+
function assertValidOrgAlias(orgAlias) {
|
|
17
|
+
if (typeof orgAlias !== "string" || !ORG_ALIAS_RE.test(orgAlias)) {
|
|
18
|
+
throw new Error("Invalid org alias or username. Must be 1-253 characters, start with [A-Za-z0-9_], and contain only [A-Za-z0-9_.+@-].");
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const authCache = new Map();
|
|
22
|
+
export function clearOrgAuthCache() {
|
|
23
|
+
authCache.clear();
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Reads Salesforce org credentials via @salesforce/core.
|
|
27
|
+
* Results are memoized for the lifetime of the process so repeated calls
|
|
28
|
+
* within the same command (or an interactive session) only resolve once.
|
|
29
|
+
*/
|
|
30
|
+
export async function getOrgAuth(orgAlias) {
|
|
31
|
+
assertValidOrgAlias(orgAlias);
|
|
32
|
+
const cached = authCache.get(orgAlias);
|
|
33
|
+
if (cached)
|
|
34
|
+
return cached;
|
|
35
|
+
let connection;
|
|
36
|
+
try {
|
|
37
|
+
const org = await Org.create({ aliasOrUsername: orgAlias });
|
|
38
|
+
connection = org.getConnection();
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
42
|
+
throw new Error(`Failed to get org info for "${orgAlias}". Is the alias correct? Have you run \`sf org login web --alias ${orgAlias}\`?\n${msg}`);
|
|
43
|
+
}
|
|
44
|
+
const fields = connection.getAuthInfo().getFields();
|
|
45
|
+
if (!connection.accessToken || !connection.instanceUrl) {
|
|
46
|
+
throw new Error(`Missing accessToken or instanceUrl for "${orgAlias}". Token may have expired -- try \`sf org login web --alias ${orgAlias}\` to re-authenticate.`);
|
|
47
|
+
}
|
|
48
|
+
const auth = {
|
|
49
|
+
accessToken: connection.accessToken,
|
|
50
|
+
instanceUrl: connection.instanceUrl.replace(/\/+$/, ""),
|
|
51
|
+
username: fields.username ?? "unknown",
|
|
52
|
+
orgId: fields.orgId ?? "unknown",
|
|
53
|
+
alias: orgAlias,
|
|
54
|
+
};
|
|
55
|
+
authCache.set(orgAlias, auth);
|
|
56
|
+
return auth;
|
|
57
|
+
}
|
|
58
|
+
function getConnectedOrgAliases() {
|
|
59
|
+
const schemasDir = path.join(graphitiHome(), "schemas");
|
|
60
|
+
const sessionsDir = path.join(graphitiHome(), "sessions");
|
|
61
|
+
const aliases = new Set();
|
|
62
|
+
if (fs.existsSync(sessionsDir)) {
|
|
63
|
+
for (const file of fs.readdirSync(sessionsDir).filter((f) => f.endsWith(".json"))) {
|
|
64
|
+
try {
|
|
65
|
+
const raw = JSON.parse(fs.readFileSync(path.join(sessionsDir, file), "utf-8"));
|
|
66
|
+
if (raw.orgAlias)
|
|
67
|
+
aliases.add(raw.orgAlias);
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
/* skip corrupt sessions */
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (fs.existsSync(schemasDir)) {
|
|
75
|
+
if (fs.readdirSync(schemasDir).some((f) => f.endsWith(".json"))) {
|
|
76
|
+
aliases.add("__has_schemas__");
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return aliases;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Lists available Salesforce orgs via AuthInfo.listAllAuthorizations().
|
|
83
|
+
* Marks orgs that have a cached graphiti schema or session.
|
|
84
|
+
*/
|
|
85
|
+
export async function listOrgs() {
|
|
86
|
+
let auths;
|
|
87
|
+
try {
|
|
88
|
+
auths = await AuthInfo.listAllAuthorizations();
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
92
|
+
throw new Error(`Failed to list orgs: ${msg}`);
|
|
93
|
+
}
|
|
94
|
+
const connected = getConnectedOrgAliases();
|
|
95
|
+
const entries = [];
|
|
96
|
+
for (const a of auths) {
|
|
97
|
+
const aliases = a.aliases ?? [];
|
|
98
|
+
const displayId = aliases[0] ?? a.username;
|
|
99
|
+
if (!displayId)
|
|
100
|
+
continue; // neither alias nor username — skip
|
|
101
|
+
const isConnected = aliases.some((al) => connected.has(al)) || (!!a.username && connected.has(a.username));
|
|
102
|
+
entries.push({
|
|
103
|
+
alias: displayId,
|
|
104
|
+
username: a.username ?? "unknown",
|
|
105
|
+
instanceUrl: (a.instanceUrl ?? "").replace(/\/+$/, ""),
|
|
106
|
+
orgId: a.orgId ?? "",
|
|
107
|
+
type: a.isScratchOrg ? "scratch" : "non-scratch",
|
|
108
|
+
isConnected,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return entries;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=auth.js.map
|