@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.
- package/dist/atlassian.js +10 -9
- package/dist/{chunk-NPYLOZAP.js → chunk-5LYFSZ7O.js} +12 -12
- package/dist/{chunk-6TCVR53X.js → chunk-O5LEQHDM.js} +2 -2
- package/dist/{chunk-QP3BIGSC.js → chunk-OO4AEMQB.js} +7633 -7650
- package/dist/chunk-OO4AEMQB.js.map +1 -0
- package/dist/chunk-P3HLDT77.js +59 -0
- package/dist/chunk-P3HLDT77.js.map +1 -0
- package/dist/chunk-SSWEWU3V.js +348 -0
- package/dist/chunk-SSWEWU3V.js.map +1 -0
- package/dist/chunk-TEMFILR7.js +143 -0
- package/dist/chunk-TEMFILR7.js.map +1 -0
- package/dist/connect.d.ts +325 -0
- package/dist/connect.js +182 -0
- package/dist/connect.js.map +1 -0
- package/dist/connection-authority.js +28 -334
- package/dist/connection-authority.js.map +1 -1
- package/dist/editable-artifact-codec-registry.js +2 -2
- package/dist/editable-artifact-live.js +2 -2
- package/dist/editable-artifact-serialized-commit.js +3 -3
- package/dist/editable-artifacts.js +24 -24
- package/dist/external-identities.d.ts +620 -0
- package/dist/external-identities.js +34 -0
- package/dist/external-identities.js.map +1 -0
- package/dist/google-drive.js +12 -11
- package/dist/google-drive.js.map +1 -1
- package/dist/host-mcp-bindings.d.ts +297 -0
- package/dist/host-mcp-bindings.js +195 -0
- package/dist/host-mcp-bindings.js.map +1 -0
- package/dist/index.d.ts +149 -71
- package/dist/index.js +85 -81
- package/dist/personal-github.js +10 -9
- package/dist/personal-github.js.map +1 -1
- package/package.json +13 -1
- package/src/connect.ts +202 -0
- package/src/external-identities.ts +213 -0
- package/src/host-mcp-bindings.ts +226 -0
- package/src/index.ts +158 -68
- package/dist/chunk-QP3BIGSC.js.map +0 -1
- /package/dist/{chunk-NPYLOZAP.js.map → chunk-5LYFSZ7O.js.map} +0 -0
- /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
|
-
*
|
|
6793
|
-
*
|
|
6794
|
-
*
|
|
6795
|
-
*
|
|
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
|
-
*
|
|
6820
|
-
*
|
|
6821
|
-
*
|
|
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
|
|
6826
|
-
.
|
|
6827
|
-
|
|
6828
|
-
|
|
6829
|
-
|
|
6830
|
-
|
|
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
|
|
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
|
-
*
|
|
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", "
|
|
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
|
-
|
|
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
|
-
/**
|
|
12274
|
-
|
|
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
|
-
*
|
|
12491
|
-
*
|
|
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
|
-
.
|
|
12496
|
-
|
|
12497
|
-
|
|
12498
|
-
|
|
12499
|
-
|
|
12500
|
-
|
|
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
|
-
/**
|
|
14853
|
-
|
|
14854
|
-
endUser:
|
|
14855
|
-
/** Typed Memory selector. `user` requires
|
|
14856
|
-
*
|
|
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
|
-
//
|
|
15055
|
-
//
|
|
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()
|