@opengeni/contracts 2.15.2 → 3.0.0-canary.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.
Files changed (40) hide show
  1. package/dist/atlassian.js +10 -9
  2. package/dist/{chunk-NPYLOZAP.js → chunk-5LYFSZ7O.js} +12 -12
  3. package/dist/{chunk-6TCVR53X.js → chunk-O5LEQHDM.js} +2 -2
  4. package/dist/{chunk-QP3BIGSC.js → chunk-OO4AEMQB.js} +7633 -7650
  5. package/dist/chunk-OO4AEMQB.js.map +1 -0
  6. package/dist/chunk-P3HLDT77.js +59 -0
  7. package/dist/chunk-P3HLDT77.js.map +1 -0
  8. package/dist/chunk-SSWEWU3V.js +348 -0
  9. package/dist/chunk-SSWEWU3V.js.map +1 -0
  10. package/dist/chunk-TEMFILR7.js +143 -0
  11. package/dist/chunk-TEMFILR7.js.map +1 -0
  12. package/dist/connect.d.ts +325 -0
  13. package/dist/connect.js +182 -0
  14. package/dist/connect.js.map +1 -0
  15. package/dist/connection-authority.js +28 -334
  16. package/dist/connection-authority.js.map +1 -1
  17. package/dist/editable-artifact-codec-registry.js +2 -2
  18. package/dist/editable-artifact-live.js +2 -2
  19. package/dist/editable-artifact-serialized-commit.js +3 -3
  20. package/dist/editable-artifacts.js +24 -24
  21. package/dist/external-identities.d.ts +620 -0
  22. package/dist/external-identities.js +34 -0
  23. package/dist/external-identities.js.map +1 -0
  24. package/dist/google-drive.js +12 -11
  25. package/dist/google-drive.js.map +1 -1
  26. package/dist/host-mcp-bindings.d.ts +297 -0
  27. package/dist/host-mcp-bindings.js +195 -0
  28. package/dist/host-mcp-bindings.js.map +1 -0
  29. package/dist/index.d.ts +149 -71
  30. package/dist/index.js +85 -81
  31. package/dist/personal-github.js +10 -9
  32. package/dist/personal-github.js.map +1 -1
  33. package/package.json +13 -1
  34. package/src/connect.ts +202 -0
  35. package/src/external-identities.ts +213 -0
  36. package/src/host-mcp-bindings.ts +226 -0
  37. package/src/index.ts +158 -68
  38. package/dist/chunk-QP3BIGSC.js.map +0 -1
  39. /package/dist/{chunk-NPYLOZAP.js.map → chunk-5LYFSZ7O.js.map} +0 -0
  40. /package/dist/{chunk-6TCVR53X.js.map → chunk-O5LEQHDM.js.map} +0 -0
package/src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { SkillReviewReference } from "./skills";
1
+ import { SkillReviewReference, skillReviewHumanInput } from "./skills";
2
2
  export * from "./skills";
3
3
  export * from "./bundled-skills";
4
4
  import { BundledSkillSelection } from "./bundled-skills";
@@ -8,6 +8,25 @@ import { isSafeSkillRelativePath, validateSkillTextFiles } from "./skill-files";
8
8
  export * from "./model-connection-access";
9
9
  export * from "./sandbox-provider-command";
10
10
  import { z } from "zod";
11
+ export const HostMcpCreateSelections = z
12
+ .array(
13
+ z
14
+ .object({
15
+ serverId: z.string().min(1).max(256),
16
+ delegationId: z
17
+ .string()
18
+ .uuid()
19
+ .transform((value) => value.toLowerCase()),
20
+ generation: z.number().int().positive().safe(),
21
+ })
22
+ .strict(),
23
+ )
24
+ .max(128)
25
+ .superRefine((values, ctx) => {
26
+ if (new Set(values.map((value) => value.serverId)).size !== values.length)
27
+ ctx.addIssue({ code: "custom", message: "Duplicate host server selection" });
28
+ });
29
+ export type HostMcpCreateSelection = z.input<typeof HostMcpCreateSelections>[number];
11
30
  import { Permission } from "./permissions";
12
31
  import { ScopedKnowledgeScope } from "./scoped-knowledge";
13
32
  export { siteSessionPath, SiteSessionPathError } from "./site-session-http";
@@ -4093,6 +4112,11 @@ export const McpServerConnectionRef = z
4093
4112
  connectionId: z.string().min(1).optional(),
4094
4113
  /** Host-owned credential authority; omission keeps OpenGeni's native connection authority. */
4095
4114
  authoritySource: z.literal("host").optional(),
4115
+ /** Opt-in durable reference. A live execution validator is mandatory. */
4116
+ hostBinding: z
4117
+ .object({ bindingId: z.string().uuid(), generation: z.number().int().positive().safe() })
4118
+ .strict()
4119
+ .optional(),
4096
4120
  /** Stable provider family (for example github, gitlab, or azure_devops). */
4097
4121
  provider: z.string().min(1).max(128).optional(),
4098
4122
  /** Provider host or tenant domain. */
@@ -4114,6 +4138,12 @@ export const McpServerConnectionRef = z
4114
4138
  path: ["connectionId"],
4115
4139
  });
4116
4140
  }
4141
+ if (reference.hostBinding && reference.authoritySource !== "host")
4142
+ context.addIssue({
4143
+ code: "custom",
4144
+ path: ["hostBinding"],
4145
+ message: "Durable binding requires host authority",
4146
+ });
4117
4147
  if (!reference.selectedResources) return;
4118
4148
  if (!reference.connectionId) {
4119
4149
  context.addIssue({
@@ -4407,7 +4437,39 @@ export type McpCredentialResolution =
4407
4437
  authorizationUrl?: string;
4408
4438
  };
4409
4439
 
4440
+ /** Non-turn authority captured by the authenticated API gateway, never by caller JSON. */
4441
+ export type McpGatewayCredentialAuthority = {
4442
+ kind: "external_user" | "organization_service";
4443
+ subjectId: string;
4444
+ permissions: AccessGrant["permissions"];
4445
+ };
4446
+
4447
+ export type McpGatewayCredentialsRequest = Pick<
4448
+ McpCredentialsRequest,
4449
+ | "accountId"
4450
+ | "workspaceId"
4451
+ | "destinationUrl"
4452
+ | "credentialTarget"
4453
+ | "serverId"
4454
+ | "toolName"
4455
+ | "connectionRef"
4456
+ | "forceRefresh"
4457
+ > & {
4458
+ surface: "workspace_gateway";
4459
+ requestId: string;
4460
+ authority: McpGatewayCredentialAuthority;
4461
+ };
4462
+
4463
+ export type McpGatewayCredentialResolution =
4464
+ | (Omit<Extract<McpCredentialResolution, { status: "ok" }>, "sessionId"> & { requestId: string })
4465
+ | (Omit<Extract<McpCredentialResolution, { status: "auth_needed" }>, "sessionId"> & {
4466
+ requestId: string;
4467
+ });
4468
+
4410
4469
  export type ConnectionCredentialsPort = {
4470
+ /** Restrict an optional remote adapter to explicit host refs. Omission keeps
4471
+ * existing in-process host override and legacy-reference behavior. */
4472
+ mcpAuthoritySource?: "host";
4411
4473
  // Every leg is optional: a host may drive only the credential classes it
4412
4474
  // owns. An unset leg falls through to today's standalone implementation for
4413
4475
  // that leg only.
@@ -4426,6 +4488,11 @@ export type ConnectionCredentialsPort = {
4426
4488
  * used by model-visible MCP tools and the exact-attempt Codemode projection.
4427
4489
  */
4428
4490
  mcpCredentials?(input: McpCredentialsRequest): Promise<McpCredentialResolution>;
4491
+ /** Explicit opt-in for authenticated pre-session discovery and invocation.
4492
+ * Does not call the turn-based mcpCredentials fallback or grant durable use. */
4493
+ mcpGatewayCredentials?(
4494
+ input: McpGatewayCredentialsRequest,
4495
+ ): Promise<McpGatewayCredentialResolution>;
4429
4496
  };
4430
4497
 
4431
4498
  // ============ connection-credential provider — GitHub App API port (BYO-App, §7.6 / GitHub credential prototype remainder) ===
@@ -6789,57 +6856,46 @@ export const SESSION_AUTHORIZATION_LIST_SCOPE_MAX_IDS = 10_000;
6789
6856
 
6790
6857
  /**
6791
6858
  * How far a live agent attempt on a session may reach across the workspace,
6792
- * and how far peer attempts may reach into it. `workspace` is the platform
6793
- * default. `user` limits both directions to sessions carrying the same
6794
- * {@link SessionEndUser} label; `session` limits both to the own root tree.
6795
- * The most restrictive side of a caller/target pair wins. Humans and API keys
6859
+ * under ordinary resource authorization. `workspace` is the platform default.
6860
+ * `user` limits outgoing reach to the same canonical {@link SessionScopeSubjectId};
6861
+ * `session` limits it to the own root tree. Target task scope does not restrict
6862
+ * incoming access; private ownership remains enforced. Humans and API keys
6796
6863
  * are unaffected: this is an agent-to-agent fence enforced only in the core
6797
6864
  * session-authorization seam.
6798
6865
  */
6799
6866
  export const SessionAgentAccess = z.enum(["session", "user", "workspace"]);
6800
6867
  export type SessionAgentAccess = z.infer<typeof SessionAgentAccess>;
6801
6868
 
6802
- export const SESSION_END_USER_SOURCE_MAX_CHARS = 200;
6803
- export const SESSION_END_USER_ID_MAX_CHARS = 1_024;
6804
-
6805
- const NUL_CHARACTER = String.fromCharCode(0);
6806
- const UNPAIRED_SURROGATE_PATTERN =
6807
- /[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/u;
6808
-
6809
- function opaqueEndUserSegment(maxChars: number) {
6810
- return z
6811
- .string()
6812
- .min(1)
6813
- .max(maxChars)
6814
- .refine((value) => !value.includes(NUL_CHARACTER), "must not contain NUL")
6815
- .refine((value) => !UNPAIRED_SURROGATE_PATTERN.test(value), "must be well-formed UTF-16");
6816
- }
6817
-
6818
6869
  /**
6819
- * Opaque end-user label attached to a session by the embedding product. It
6820
- * shares the external-identity shape (`source` + product-owned `id`) so a
6821
- * later join is by pair. It is NOT a subject and grants NO authority: it only
6822
- * scopes `agentAccess: "user"` reach, `memoryScope: "user"` Memory rows, and
6823
- * the session-list `endUserSource`/`endUserId` filter.
6870
+ * Server-derived canonical user for the session's agent-reach boundary.
6871
+ * This is an output/filter value, never caller-supplied creation authority.
6872
+ * Human visibility remains an independent resource authorization check.
6824
6873
  */
6825
- export const SessionEndUser = z
6826
- .object({
6827
- source: opaqueEndUserSegment(SESSION_END_USER_SOURCE_MAX_CHARS),
6828
- id: opaqueEndUserSegment(SESSION_END_USER_ID_MAX_CHARS),
6829
- })
6830
- .strict();
6831
- export type SessionEndUser = z.infer<typeof SessionEndUser>;
6874
+ export const SessionScopeSubjectId = z
6875
+ .string()
6876
+ .min(1)
6877
+ .max(1024)
6878
+ .regex(/^(?:user:|external_user:).+/);
6879
+ export type SessionScopeSubjectId = z.infer<typeof SessionScopeSubjectId>;
6832
6880
 
6833
6881
  /**
6834
6882
  * The typed Workspace Memory selector an agent reads and writes. `workspace`
6835
- * is today's shared memory; `user` and `session` are ADDITIVE private layers
6883
+ * is shared memory; `user` adds a private layer
6836
6884
  * (the agent still reads workspace facts and saves to its narrowest scope);
6837
6885
  * `off` registers no Memory tools for the session. `user` requires an
6838
- * end-user label.
6886
+ * authenticated canonical user on the active turn. Use task notes for task-local data.
6839
6887
  */
6840
- export const SessionMemoryScope = z.enum(["workspace", "user", "session", "off"]);
6888
+ export const SessionMemoryScope = z.enum(["workspace", "user", "off"]);
6841
6889
  export type SessionMemoryScope = z.infer<typeof SessionMemoryScope>;
6842
6890
 
6891
+ /** Read old persisted selectors without promoting task-local data or authority.
6892
+ * New requests must use SessionMemoryScope directly and reject `session`.
6893
+ * Historical Memory rows remain retained; task notes own new task-local facts. */
6894
+ export function storedSessionMemoryScope(value: unknown): SessionMemoryScope {
6895
+ if (value === "session") return "off";
6896
+ return SessionMemoryScope.parse(value ?? "workspace");
6897
+ }
6898
+
6843
6899
  /**
6844
6900
  * The calling agent attempt's own access scope, resolved by OpenGeni from the
6845
6901
  * caller session row (never from the request) and applied as one SQL
@@ -6849,7 +6905,7 @@ export const SessionAgentAccessViewer = z
6849
6905
  .object({
6850
6906
  callerRootSessionId: z.string().uuid(),
6851
6907
  agentAccess: SessionAgentAccess,
6852
- endUser: SessionEndUser.nullable(),
6908
+ scopeSubjectId: SessionScopeSubjectId.nullable(),
6853
6909
  })
6854
6910
  .strict();
6855
6911
  export type SessionAgentAccessViewer = z.infer<typeof SessionAgentAccessViewer>;
@@ -9403,6 +9459,7 @@ const CreateAgentScheduledTaskRequest = /* @__PURE__ */ withVariableSetIdAlias({
9403
9459
  overlapPolicy: ScheduledTaskOverlapPolicy.default("allow_concurrent"),
9404
9460
  targetSessionId: z.string().uuid().nullable().optional(),
9405
9461
  connectionAuthorities: McpConnectionAuthoritySelections.default([]),
9462
+ selectedHostMcpDelegations: HostMcpCreateSelections.optional(),
9406
9463
  agentConfig: ScheduledTaskAgentConfigInput,
9407
9464
  status: ScheduledTaskStatus.default("active"),
9408
9465
  variableSetId: z.string().uuid().nullable().optional(),
@@ -9482,6 +9539,7 @@ export const UpdateScheduledTaskRequest =
9482
9539
  action: ScheduledTaskAction.optional(),
9483
9540
  targetSessionId: z.string().uuid().nullable().optional(),
9484
9541
  connectionAuthorities: McpConnectionAuthoritySelections.optional(),
9542
+ selectedHostMcpDelegations: HostMcpCreateSelections.optional(),
9485
9543
  agentConfig: ScheduledTaskAgentConfigInput.optional(),
9486
9544
  status: ScheduledTaskStatus.optional(),
9487
9545
  variableSetId: z.string().uuid().nullable().optional(),
@@ -10714,6 +10772,8 @@ export type ConnectionOwnership = z.infer<typeof ConnectionOwnership>;
10714
10772
 
10715
10773
  export const SocialConnection = z.object({
10716
10774
  id: z.string().uuid(),
10775
+ /** Present on version-aware deployments; required for observed reconnect. */
10776
+ version: z.number().int().positive().optional(),
10717
10777
  accountId: z.string().uuid(),
10718
10778
  workspaceId: z.string().uuid(),
10719
10779
  provider: SocialProvider,
@@ -10845,6 +10905,8 @@ export const FikenInstallRequest = z.object({
10845
10905
  export type FikenInstallRequest = z.infer<typeof FikenInstallRequest>;
10846
10906
 
10847
10907
  export const FikenOAuthStartRequest = z.object({
10908
+ /** Same-origin product route to return to after provider consent. */
10909
+ returnPath: z.string().min(1).max(2048).optional(),
10848
10910
  /** Existing Fiken connection to re-authorize in place (reconnect). */
10849
10911
  connectionId: z.string().uuid().optional(),
10850
10912
  });
@@ -11046,6 +11108,7 @@ export const OAuthStartRequest = z
11046
11108
  resource: z.string().url().optional(),
11047
11109
  requestedScopes: z.array(z.string().min(1)).default([]),
11048
11110
  returnPath: z.string().min(1).optional(),
11111
+ returnUrl: z.string().min(1).max(4096).optional(),
11049
11112
  connectionId: z.string().uuid().optional(),
11050
11113
  ownership: ConnectionOwnership.optional(),
11051
11114
  oauthClient: z
@@ -12270,8 +12333,8 @@ export const Session = /* @__PURE__ */ defineSkillContractSchema(() =>
12270
12333
  policyRole: WorkspaceInstructionPolicyRoleKeyInput.nullable().default(null),
12271
12334
  /** Agent-to-agent reach declared at create; see {@link SessionAgentAccess}. */
12272
12335
  agentAccess: SessionAgentAccess.default("workspace"),
12273
- /** Opaque product label; null when the create carried none. */
12274
- endUser: SessionEndUser.nullable().default(null),
12336
+ /** Canonical native/asUser scope identity; null for unscoped service work. */
12337
+ scopeSubjectId: SessionScopeSubjectId.nullable().default(null),
12275
12338
  /** Typed Memory selector frozen at create; see {@link SessionMemoryScope}. */
12276
12339
  memoryScope: SessionMemoryScope.default("workspace"),
12277
12340
  resources: z.array(ResourceRef),
@@ -12487,27 +12550,17 @@ export const SessionListResponse = /* @__PURE__ */ defineSkillContractSchema(()
12487
12550
  export type SessionListResponse = z.infer<typeof SessionListResponse>;
12488
12551
 
12489
12552
  /**
12490
- * `GET /v1/organizations/:organizationId/sessions` query. `endUserSource` and
12491
- * `endUserId` must be supplied together; `status` keeps only sessions in that
12492
- * exact lifecycle state.
12553
+ * Organization session queries may filter a canonical scope subject and lifecycle
12554
+ * state. Legacy end-user label filters are rejected.
12493
12555
  */
12494
- export const ListOrganizationSessionsQuery = z
12495
- .object({
12496
- limit: z.coerce.number().int().min(1).max(200).default(50),
12497
- cursor: z.string().min(1).optional(),
12498
- endUserSource: z.string().trim().min(1).max(200).optional(),
12499
- endUserId: z.string().trim().min(1).max(1024).optional(),
12500
- status: SessionStatus.optional(),
12501
- })
12502
- .superRefine((value, context) => {
12503
- if ((value.endUserSource === undefined) !== (value.endUserId === undefined)) {
12504
- context.addIssue({
12505
- code: z.ZodIssueCode.custom,
12506
- message: "endUserSource and endUserId must be supplied together",
12507
- path: ["endUserId"],
12508
- });
12509
- }
12510
- });
12556
+ export const ListOrganizationSessionsQuery = z.object({
12557
+ limit: z.coerce.number().int().min(1).max(200).default(50),
12558
+ cursor: z.string().min(1).optional(),
12559
+ scopeSubjectId: SessionScopeSubjectId.optional(),
12560
+ endUserSource: z.never().optional(),
12561
+ endUserId: z.never().optional(),
12562
+ status: SessionStatus.optional(),
12563
+ });
12511
12564
  export type ListOrganizationSessionsQuery = z.infer<typeof ListOrganizationSessionsQuery>;
12512
12565
 
12513
12566
  /**
@@ -14838,6 +14891,8 @@ export const CreateSessionRequest = /* @__PURE__ */ defineSkillContractSchema(()
14838
14891
  * identity or authorization from the UUID.
14839
14892
  */
14840
14893
  requestedSessionId: z.string().uuid().optional(),
14894
+ /** Explicit external-owner grants for the direct initial turn only. */
14895
+ selectedHostMcpDelegations: HostMcpCreateSelections.optional(),
14841
14896
  /** Top-level omission is workspace-visible. Agent-child omission inherits
14842
14897
  * the exact parent visibility; cross-visibility child creation is rejected.
14843
14898
  * Top-level private creation is an activated managed-cookie owning-human
@@ -14849,12 +14904,11 @@ export const CreateSessionRequest = /* @__PURE__ */ defineSkillContractSchema(()
14849
14904
  * omission and may only narrow it (workspace > user > session); a wider
14850
14905
  * explicit child value is rejected. Never widens human or API-key access. */
14851
14906
  agentAccess: SessionAgentAccess.default("workspace"),
14852
- /** Opaque product label for the human this session serves. A child
14853
- * inherits its parent's label; naming a different pair is rejected. */
14854
- endUser: SessionEndUser.optional(),
14855
- /** Typed Memory selector. `user` requires an end-user label (own or
14856
- * inherited; 422 otherwise). A child inherits its parent's value on
14857
- * omission and may only narrow it (workspace > user > session > off). */
14907
+ /** Identity comes from verified native/asUser authority, never request fields. */
14908
+ scopeSubjectId: z.never().optional(),
14909
+ endUser: z.never().optional(),
14910
+ /** Typed Memory selector. `user` requires canonical user authority. Children
14911
+ * inherit omission and may only narrow (workspace > user > off). */
14858
14912
  memoryScope: SessionMemoryScope.default("workspace"),
14859
14913
  initialMessage: z.string().min(1).optional(),
14860
14914
  // Creates the durable session shell without fabricating a user message or
@@ -15051,9 +15105,8 @@ export const CreateSessionRequest = /* @__PURE__ */ defineSkillContractSchema(()
15051
15105
  message: "new-session attachment authority epoch is derived by the server",
15052
15106
  });
15053
15107
  }
15054
- // memoryScope "user" requires an end-user label, but an agent-created child
15055
- // inherits its parent's label on omission, so that rule is enforced by the
15056
- // core create resolver (422) after inheritance rather than at parse time.
15108
+ // Canonical user authority and child inheritance are resolved by the core
15109
+ // create resolver, which rejects user Memory without that authority.
15057
15110
  }),
15058
15111
  );
15059
15112
  export type CreateSessionRequest = z.infer<typeof CreateSessionRequest>;
@@ -15149,6 +15202,41 @@ export const HumanInputQuestion = z
15149
15202
  });
15150
15203
  export type HumanInputQuestion = z.infer<typeof HumanInputQuestion>;
15151
15204
 
15205
+ /** Only known presentation wire differences are equivalent. This is not
15206
+ * authorization: response admission still binds the immutable source receipt.
15207
+ * Compare original keys as well as parsed values so unknown fields cannot be
15208
+ * hidden by Zod's ordinary object projection during a pending-card re-freeze. */
15209
+ export function canonicalSkillReviewQuestion(
15210
+ question: HumanInputQuestion,
15211
+ ): HumanInputQuestion | null {
15212
+ if (
15213
+ !HumanInputQuestion.safeParse(question).success ||
15214
+ !SkillReviewReference.strict().safeParse(question.skillReview).success
15215
+ )
15216
+ return null;
15217
+ const canonical = skillReviewHumanInput(question.skillReview!).questions[0]!;
15218
+ const normalized = {
15219
+ ...question,
15220
+ allowOther: false,
15221
+ options: question.options.map((option) => {
15222
+ if (option.description != null) return option;
15223
+ const { description: _description, ...rest } = option;
15224
+ return rest;
15225
+ }),
15226
+ };
15227
+ if (
15228
+ normalized.validation == null ||
15229
+ (Object.keys(normalized.validation).every((key) =>
15230
+ ["minSelections", "maxSelections"].includes(key),
15231
+ ) &&
15232
+ normalized.validation.minSelections == null &&
15233
+ normalized.validation.maxSelections == null)
15234
+ ) {
15235
+ delete normalized.validation;
15236
+ }
15237
+ return stableJson(normalized) === stableJson(canonical) ? canonical : null;
15238
+ }
15239
+
15152
15240
  export const HumanInputRequestStatus = z.enum([
15153
15241
  "pending",
15154
15242
  "answered",
@@ -15266,6 +15354,7 @@ export const SessionUserMessagePayload = z
15266
15354
  mcpCredentialUpdates: z.array(SessionMcpCredentialUpdateInput).optional(),
15267
15355
  /** Explicit personal-connection grants for this exact logical turn. */
15268
15356
  connectionAuthorities: McpConnectionAuthoritySelections.default([]),
15357
+ selectedHostMcpDelegations: HostMcpCreateSelections.optional(),
15269
15358
  personalResourceAttachment: PersonalResourceAttachmentIntent.optional(),
15270
15359
  })
15271
15360
  .strict()
@@ -15315,6 +15404,7 @@ export const SteerSessionMessageRequest = z
15315
15404
  mcpCredentialUpdates: z.array(SessionMcpCredentialUpdateInput).optional(),
15316
15405
  /** Explicit personal-connection grants for this exact steered turn. */
15317
15406
  connectionAuthorities: McpConnectionAuthoritySelections.default([]),
15407
+ selectedHostMcpDelegations: HostMcpCreateSelections.optional(),
15318
15408
  personalResourceAttachment: PersonalResourceAttachmentIntent.optional(),
15319
15409
  })
15320
15410
  .strict()