@opengeni/core 0.12.2 → 0.12.7
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/index.d.ts +21 -4
- package/dist/index.js +92 -17
- package/dist/index.js.map +1 -1
- package/package.json +8 -8
- package/src/access/index.ts +8 -1
- package/src/dependencies.ts +4 -2
- package/src/domain/capabilities.ts +83 -24
- package/src/domain/sessions.ts +53 -6
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Settings } from '@opengeni/config';
|
|
2
|
-
import { ScheduledTask, Document, GitHubAppApiPort, ConnectionCredentialsPort, SessionAuthorizationPort, Permission, AccessContext, AccessGrant, SessionAuthorizationActor, SessionAuthorizationTarget, SessionAuthorizationOperation, SessionAuthorizationSurface, SessionAuthorizationListScope, LimitAction, LimitDecision,
|
|
2
|
+
import { ScheduledTask, TurnInitiator, Document, GitHubAppApiPort, ConnectionCredentialsPort, SessionAuthorizationPort, Permission, AccessContext, AccessGrant, SessionAuthorizationActor, SessionAuthorizationTarget, SessionAuthorizationOperation, SessionAuthorizationSurface, SessionAuthorizationListScope, LimitAction, LimitDecision, TurnInitiatorContext, SessionTurnSource, CapabilityCatalogItem, CapabilityInstallation, CapabilityCatalogResponse, CreateCapabilityCatalogItemRequest, EnableCapabilityRequest, VariableSet, Rig, RigVersion, CreateRigRequest, RigDefinitionEditPayload, RigChange, ProposeRigChangeRequest, UpdateRigRequest, CapabilityPack, SocialConnection, ScheduledTaskAgentConfig, ToolRef, ResourceRef, SessionEffectiveToolPolicy, SessionToolPolicy, Session, CreateScheduledTaskRequest, UpdateScheduledTaskRequest, SessionSpawnDenial, ReasoningEffort, SessionMcpCredentialUpdateInput, SessionEvent, SessionTurn, SessionSkill, TurnExecutionPolicyV1, GoalSpec, FirstPartyMcpToolName, SessionMcpServerMetadata, CreateSessionResponse, SessionMcpApprovalPolicy, UpdateSessionMcpApprovalPolicyResponse, UpdateSessionToolPolicyRequest, ConnectionMetadata, OpenGeniSlackBotConnectionMetadata, WorkspaceMember, NewSessionDraft, SessionControlRequest, SessionControlResponse, WorkspaceInferenceControlRequest, WorkspaceInferenceControlResponse, DeleteSessionQueueItemRequest, SessionQueueMutationResponse, EditSessionQueueItemRequest, ComposerDraft, MoveSessionQueueItemRequest, SaveComposerDraftRequest, SteerSessionQueueItemRequest } from '@opengeni/contracts';
|
|
3
3
|
export { mergeToolRefs, stableJson } from '@opengeni/contracts';
|
|
4
4
|
import * as _opengeni_db from '@opengeni/db';
|
|
5
5
|
import { Database, SandboxRecord, EnabledMcpCapabilityServer, UpdateScheduledTaskInput, SessionCommandActor, CreateSessionMcpServerInput, UpdateSessionMcpServerCredentialsInput, ConnectionMetadataWithVerification } from '@opengeni/db';
|
|
@@ -106,8 +106,9 @@ type SessionWorkflowClient = {
|
|
|
106
106
|
}) => Promise<void>;
|
|
107
107
|
triggerScheduledTask: (input: {
|
|
108
108
|
task: ScheduledTask;
|
|
109
|
-
agentRunUsageIdempotencyKey
|
|
110
|
-
triggerWorkflowId
|
|
109
|
+
agentRunUsageIdempotencyKey: string;
|
|
110
|
+
triggerWorkflowId: string;
|
|
111
|
+
initiator: TurnInitiator;
|
|
111
112
|
}) => Promise<void>;
|
|
112
113
|
startRigVerification: (input: {
|
|
113
114
|
workspaceId: string;
|
|
@@ -534,6 +535,13 @@ declare function disableCapability(input: {
|
|
|
534
535
|
capabilityId: string;
|
|
535
536
|
}): Promise<CapabilityInstallation>;
|
|
536
537
|
declare function settingsWithEnabledCapabilityMcpServers(db: Database, workspaceId: string, settings: Settings): Promise<Settings>;
|
|
538
|
+
/**
|
|
539
|
+
* Register Codex Apps as an optional runtime MCP when the deployment enables
|
|
540
|
+
* it. Registration only makes the server selectable; the session tool policy
|
|
541
|
+
* decides whether the model sees it, and Codex credential resolution
|
|
542
|
+
* independently decides whether calls can authenticate.
|
|
543
|
+
*/
|
|
544
|
+
declare function settingsWithCodexAppsMcpServer(settings: Settings): Settings;
|
|
537
545
|
declare function settingsWithMcpCapabilityServers(settings: Settings, enabled: EnabledMcpCapabilityServer[]): Settings;
|
|
538
546
|
declare function discoverMcpRegistryCapabilities(input: {
|
|
539
547
|
query?: string;
|
|
@@ -795,6 +803,13 @@ declare class SessionSpawnDeniedError extends Error {
|
|
|
795
803
|
readonly denial: SessionSpawnDenial;
|
|
796
804
|
constructor(denial: SessionSpawnDenial);
|
|
797
805
|
}
|
|
806
|
+
/**
|
|
807
|
+
* Resolve per-session first-party tool visibility without consulting
|
|
808
|
+
* authorization. Top-level omission uses the minimal runtime default (stored
|
|
809
|
+
* as null); child omission snapshots the parent's exact effective selection.
|
|
810
|
+
* Explicit [] is authoritative and must never widen.
|
|
811
|
+
*/
|
|
812
|
+
declare function resolveFirstPartyMcpToolsForCreate(requested: FirstPartyMcpToolName[] | undefined, parentStored: FirstPartyMcpToolName[] | null | undefined): FirstPartyMcpToolName[] | null;
|
|
798
813
|
declare function sessionSpawnDenialEnvelope(error: SessionSpawnDeniedError): {
|
|
799
814
|
readonly error: {
|
|
800
815
|
readonly code: "nested_agent_depth_exceeded" | "nested_agent_depth_override_forbidden";
|
|
@@ -831,6 +846,7 @@ declare function createAndStartSession(input: {
|
|
|
831
846
|
initialMessage: string;
|
|
832
847
|
turnInstructions?: string | null;
|
|
833
848
|
resources: ResourceRef[];
|
|
849
|
+
skills?: SessionSkill[];
|
|
834
850
|
tools: ToolRef[];
|
|
835
851
|
toolPolicy?: SessionToolPolicy;
|
|
836
852
|
clientEventId?: string;
|
|
@@ -853,6 +869,7 @@ declare function createAndStartSession(input: {
|
|
|
853
869
|
goal?: GoalSpec | null;
|
|
854
870
|
instructions?: string | null;
|
|
855
871
|
firstPartyMcpPermissions?: Permission[] | null;
|
|
872
|
+
firstPartyMcpTools?: FirstPartyMcpToolName[] | null;
|
|
856
873
|
mcpServers?: CreateSessionMcpServerInput[];
|
|
857
874
|
sessionMcpServers?: SessionMcpServerMetadata[];
|
|
858
875
|
parentSessionId?: string | null;
|
|
@@ -1169,4 +1186,4 @@ declare function controlHumanWorkspace(deps: {
|
|
|
1169
1186
|
declare function getHumanComposerDraft(deps: SessionAuthorizationCommandDeps, context: HumanSessionCommandContext): Promise<ComposerDraft>;
|
|
1170
1187
|
declare function saveHumanComposerDraft(deps: SessionAuthorizationCommandDeps, context: HumanSessionCommandContext, input: SaveComposerDraftRequest): Promise<ComposerDraft>;
|
|
1171
1188
|
|
|
1172
|
-
export { type AcceptSessionUserMessageDependencies, type AccessDeps, type AgentSessionCommandContext, type ApiRouteDeps, type ApiSandboxClient, type ApiSandboxSession, type AppDependencies, type ChannelARoutingServices, type DocumentIndexClient, type FleetContext, type FleetListResult, type FleetLiveness, type FleetReadinessHold, type FleetSandboxEntry, type FleetServices, type FleetSwapResult, type HumanSessionCommandContext, type LimitCheckInput, type LimitDependencies, MARKETING_SOCIAL_PACK_ID, MAX_CHECKS_PER_RIG, MAX_CREDENTIAL_HOOKS_PER_RIG, MAX_DEFAULT_VARIABLE_SETS_PER_RIG, MAX_ENVIRONMENTS_PER_WORKSPACE, MAX_RIGS_PER_WORKSPACE, MAX_VARIABLES_PER_ENVIRONMENT, type ManagedAuth, type McpCapabilityProbe, type McpCapabilityProbeInput, type McpCapabilityProbeResult, type ObjectStorageDependency, type ProvisionResult, type ResolvedSessionAuthorization, type ResolvedSessionToolPolicy, type ResumeBoxByIdInput, type ResumedSandboxSession, type RigServices, type RigVerificationClassification, type RunOnOp, type RunOnResult, SESSION_AUTHORIZATION_DEFAULT_REAUTHORIZE_MS, SESSION_WORKFLOW_WAKE_DISPATCHER_PERIOD_MS, SESSION_WORKFLOW_WAKE_DISPATCHER_SCHEDULE_ID, SESSION_WORKFLOW_WAKE_DISPATCHER_WORKFLOW_TYPE, SessionAuthorizationDeniedError, type SessionAuthorizationDependencies, SessionAuthorizationUnavailableError, SessionSpawnDeniedError, type SessionToolPolicyInput, type SessionWorkflowClient, acceptSessionUserMessage, activateRigVersionForApi, appendRigSetupCommand, applyCapabilityEnablement, assertAllowedEnvironmentVariableName, assertAllowedVariableSetVariableName, assertConfiguredModel, assertPackSandboxImageCompatible, assertToolRefsSubset, assertWorkspaceDeletable, assertWorkspaceMemberRemovable, assertWorkspaceModelPolicyAllows, availableToolRefs, buildCapabilityCatalog, buildFleetContextForSession, buildMarketingDailyAnalysisAgentConfig, canonicalConfiguredModel, checkLimit, classifyRigVerificationOutcome, controlAgentSessionWorkstream, controlHumanSessionWorkstream, controlHumanWorkspace, createAndStartSession, createCatalogItem, createRigForApi, createRigVersionForApi, createSessionForRequest, createValidatedScheduledTask, deleteHumanQueuePrompt, deleteRigForApi, disableCapability, discoverMcpRegistryCapabilities, editHumanQueuePrompt, enableCapability, enabledCapabilityMcpToolRefs, getActorNewSessionDraft, getCapabilityPack, getHumanComposerDraft, hasPermission, hasReservedOpenGeniSlackBotMetadata, hasReservedOpenGeniSlackBotSessionMetadata, isAuthoritativeGitHubRepositorySelectionError, isBuiltInCapabilityPack, isOpenGeniSlackBotConnection, isTrustedScheduledSlackBotSession, isUserMember, listCapabilityPacks, listFleet, listRigChangesForApi, listRigVersionsForApi, listWorkspaceCapabilityPacks, manualScheduledTaskTriggerUsageKey, manualScheduledTaskTriggerWorkflowId, memberCanAdminister, mergeResourceRefs, moveHumanQueuePrompt, normalizeResources, officialMcpRegistryUrl, openGeniSlackBotMetadata, postUserMessageTurn, promoteSetupAppendChange, promoteVerifiedDefinitionEditChangeForApi, proposeRigChangeForApi, provisionSandbox, readSessionLineage, reasoningEffortForSession, recordRigAuditEvent, recordVariableSetAuditEvent, recordWorkspaceUsage, relayConfigFromSettings, relayDialBaseFromSettings, requireAccessContext, requireAccessGrant, requireEnvironmentEncryption, requireLimit, requireOpenGeniSlackBotConnection, requirePermission, requireQueuedTurnForApi, requireRigChangeForApi, requireRigForApi, requireScheduledTaskForApi, requireSessionAuthorization, requireSessionAuthorizationListScope, requireVariableSetEncryption, requireVariableSetForApi, resolveCapabilityPack, resolveMemberSubjectId, resolveSessionToolPolicy, restoreScheduledTask, rigActorForGrant, routingEnabled, runOnSandbox, saveActorNewSessionDraft, saveHumanComposerDraft, scheduledSlackBotConnectionId, scheduledTaskTemporalScheduleId, scheduledTaskToolsProvided, scheduledTaskTriggerToken, sendAgentSessionMessage, sessionSpawnDenialEnvelope, sessionToolPolicyAllowsDefaultNativeTools, sessionWithEffectiveToolPolicy, settingsWithEnabledCapabilityMcpServers, settingsWithMcpCapabilityServers, settingsWithSessionMcpServerMetadata, steerAgentSession, steerHumanQueuePrompt, swapActiveSandbox, syncCreatedScheduledTask, syncUpdatedScheduledTask, updateRigForApi, updateSessionMcpApprovalPolicy, updateSessionTitle, updateSessionToolPolicy, validateFileResources, validateGitHubRepositorySelection, validateGitHubRepositorySelectionShape, validateGitHubRepositorySelectionShapes, validateMcpCapabilityConnection, validateOpenGeniSlackBotConnectionSelection, validateToolRefs, validateToolRefsForSessionPolicy, validateVariableSetAttachment, validatedScheduledTaskUpdate, withDefaultEnabledCapabilityMcpTools, workflowIdForSession, workspaceSessionToolPolicyDefaultServerIds, workspaceSessionToolPolicyServerIds, wrapChannelABoxWithRouting };
|
|
1189
|
+
export { type AcceptSessionUserMessageDependencies, type AccessDeps, type AgentSessionCommandContext, type ApiRouteDeps, type ApiSandboxClient, type ApiSandboxSession, type AppDependencies, type ChannelARoutingServices, type DocumentIndexClient, type FleetContext, type FleetListResult, type FleetLiveness, type FleetReadinessHold, type FleetSandboxEntry, type FleetServices, type FleetSwapResult, type HumanSessionCommandContext, type LimitCheckInput, type LimitDependencies, MARKETING_SOCIAL_PACK_ID, MAX_CHECKS_PER_RIG, MAX_CREDENTIAL_HOOKS_PER_RIG, MAX_DEFAULT_VARIABLE_SETS_PER_RIG, MAX_ENVIRONMENTS_PER_WORKSPACE, MAX_RIGS_PER_WORKSPACE, MAX_VARIABLES_PER_ENVIRONMENT, type ManagedAuth, type McpCapabilityProbe, type McpCapabilityProbeInput, type McpCapabilityProbeResult, type ObjectStorageDependency, type ProvisionResult, type ResolvedSessionAuthorization, type ResolvedSessionToolPolicy, type ResumeBoxByIdInput, type ResumedSandboxSession, type RigServices, type RigVerificationClassification, type RunOnOp, type RunOnResult, SESSION_AUTHORIZATION_DEFAULT_REAUTHORIZE_MS, SESSION_WORKFLOW_WAKE_DISPATCHER_PERIOD_MS, SESSION_WORKFLOW_WAKE_DISPATCHER_SCHEDULE_ID, SESSION_WORKFLOW_WAKE_DISPATCHER_WORKFLOW_TYPE, SessionAuthorizationDeniedError, type SessionAuthorizationDependencies, SessionAuthorizationUnavailableError, SessionSpawnDeniedError, type SessionToolPolicyInput, type SessionWorkflowClient, acceptSessionUserMessage, activateRigVersionForApi, appendRigSetupCommand, applyCapabilityEnablement, assertAllowedEnvironmentVariableName, assertAllowedVariableSetVariableName, assertConfiguredModel, assertPackSandboxImageCompatible, assertToolRefsSubset, assertWorkspaceDeletable, assertWorkspaceMemberRemovable, assertWorkspaceModelPolicyAllows, availableToolRefs, buildCapabilityCatalog, buildFleetContextForSession, buildMarketingDailyAnalysisAgentConfig, canonicalConfiguredModel, checkLimit, classifyRigVerificationOutcome, controlAgentSessionWorkstream, controlHumanSessionWorkstream, controlHumanWorkspace, createAndStartSession, createCatalogItem, createRigForApi, createRigVersionForApi, createSessionForRequest, createValidatedScheduledTask, deleteHumanQueuePrompt, deleteRigForApi, disableCapability, discoverMcpRegistryCapabilities, editHumanQueuePrompt, enableCapability, enabledCapabilityMcpToolRefs, getActorNewSessionDraft, getCapabilityPack, getHumanComposerDraft, hasPermission, hasReservedOpenGeniSlackBotMetadata, hasReservedOpenGeniSlackBotSessionMetadata, isAuthoritativeGitHubRepositorySelectionError, isBuiltInCapabilityPack, isOpenGeniSlackBotConnection, isTrustedScheduledSlackBotSession, isUserMember, listCapabilityPacks, listFleet, listRigChangesForApi, listRigVersionsForApi, listWorkspaceCapabilityPacks, manualScheduledTaskTriggerUsageKey, manualScheduledTaskTriggerWorkflowId, memberCanAdminister, mergeResourceRefs, moveHumanQueuePrompt, normalizeResources, officialMcpRegistryUrl, openGeniSlackBotMetadata, postUserMessageTurn, promoteSetupAppendChange, promoteVerifiedDefinitionEditChangeForApi, proposeRigChangeForApi, provisionSandbox, readSessionLineage, reasoningEffortForSession, recordRigAuditEvent, recordVariableSetAuditEvent, recordWorkspaceUsage, relayConfigFromSettings, relayDialBaseFromSettings, requireAccessContext, requireAccessGrant, requireEnvironmentEncryption, requireLimit, requireOpenGeniSlackBotConnection, requirePermission, requireQueuedTurnForApi, requireRigChangeForApi, requireRigForApi, requireScheduledTaskForApi, requireSessionAuthorization, requireSessionAuthorizationListScope, requireVariableSetEncryption, requireVariableSetForApi, resolveCapabilityPack, resolveFirstPartyMcpToolsForCreate, resolveMemberSubjectId, resolveSessionToolPolicy, restoreScheduledTask, rigActorForGrant, routingEnabled, runOnSandbox, saveActorNewSessionDraft, saveHumanComposerDraft, scheduledSlackBotConnectionId, scheduledTaskTemporalScheduleId, scheduledTaskToolsProvided, scheduledTaskTriggerToken, sendAgentSessionMessage, sessionSpawnDenialEnvelope, sessionToolPolicyAllowsDefaultNativeTools, sessionWithEffectiveToolPolicy, settingsWithCodexAppsMcpServer, settingsWithEnabledCapabilityMcpServers, settingsWithMcpCapabilityServers, settingsWithSessionMcpServerMetadata, steerAgentSession, steerHumanQueuePrompt, swapActiveSandbox, syncCreatedScheduledTask, syncUpdatedScheduledTask, updateRigForApi, updateSessionMcpApprovalPolicy, updateSessionTitle, updateSessionToolPolicy, validateFileResources, validateGitHubRepositorySelection, validateGitHubRepositorySelectionShape, validateGitHubRepositorySelectionShapes, validateMcpCapabilityConnection, validateOpenGeniSlackBotConnectionSelection, validateToolRefs, validateToolRefsForSessionPolicy, validateVariableSetAttachment, validatedScheduledTaskUpdate, withDefaultEnabledCapabilityMcpTools, workflowIdForSession, workspaceSessionToolPolicyDefaultServerIds, workspaceSessionToolPolicyServerIds, wrapChannelABoxWithRouting };
|
package/dist/index.js
CHANGED
|
@@ -698,6 +698,10 @@ function hasPermission(permissions, permission) {
|
|
|
698
698
|
}
|
|
699
699
|
async function resolveAccessContext(c, deps) {
|
|
700
700
|
if (deps.settings.productAccessMode === "local") {
|
|
701
|
+
const delegated = await delegatedAccessContext(c, deps, "local");
|
|
702
|
+
if (delegated) {
|
|
703
|
+
return delegated;
|
|
704
|
+
}
|
|
701
705
|
return await bootstrapWorkspace(deps.db, {
|
|
702
706
|
accountExternalSource: "opengeni:local",
|
|
703
707
|
accountExternalId: "default",
|
|
@@ -825,6 +829,7 @@ async function delegatedAccessContext(c, deps, mode, token = bearerToken(c)) {
|
|
|
825
829
|
metadata: {
|
|
826
830
|
delegated: true,
|
|
827
831
|
...payload.sessionId ? { sessionId: payload.sessionId } : {},
|
|
832
|
+
...payload.firstPartyMcpTools !== void 0 ? { firstPartyMcpTools: payload.firstPartyMcpTools } : {},
|
|
828
833
|
// Caller identity: the turn that minted this token. Tools classify the
|
|
829
834
|
// CALLER from this instead of re-reading the live active pointer.
|
|
830
835
|
...payload.turnId ? { turnId: payload.turnId } : {},
|
|
@@ -1185,6 +1190,12 @@ import { environmentsEncryptionKeyBytes as environmentsEncryptionKeyBytes2 } fro
|
|
|
1185
1190
|
import {
|
|
1186
1191
|
CapabilityCatalogItem
|
|
1187
1192
|
} from "@opengeni/contracts";
|
|
1193
|
+
import {
|
|
1194
|
+
CODEX_APPS_MCP_SERVER_ID,
|
|
1195
|
+
CODEX_APPS_MCP_SERVER_NAME,
|
|
1196
|
+
CODEX_APPS_MCP_URL,
|
|
1197
|
+
CODEX_APPS_STARTUP_TIMEOUT_MS
|
|
1198
|
+
} from "@opengeni/codex";
|
|
1188
1199
|
import {
|
|
1189
1200
|
decryptVariableSetValue,
|
|
1190
1201
|
decryptedCapabilityHeaders,
|
|
@@ -1200,6 +1211,7 @@ import {
|
|
|
1200
1211
|
getVariableSet as getVariableSet2,
|
|
1201
1212
|
listCapabilityCatalogItems,
|
|
1202
1213
|
listCapabilityInstallations,
|
|
1214
|
+
listConnectionsMetadata,
|
|
1203
1215
|
listEnabledMcpCapabilityServers,
|
|
1204
1216
|
listPackInstallations as listPackInstallations2,
|
|
1205
1217
|
mcpServerIdForCapability,
|
|
@@ -1803,14 +1815,10 @@ function normalizedMcpCredentialHeaders(headers) {
|
|
|
1803
1815
|
return Object.fromEntries(entries);
|
|
1804
1816
|
}
|
|
1805
1817
|
async function validateMcpCapabilityConnectionRef(input, item, ref) {
|
|
1806
|
-
|
|
1807
|
-
throw new HTTPException6(422, {
|
|
1808
|
-
message: "subject-owned connection refs are not supported for agent runtime use yet"
|
|
1809
|
-
});
|
|
1810
|
-
}
|
|
1818
|
+
const subjectScope = ref.subjectScope ?? "workspace";
|
|
1811
1819
|
const normalized = {
|
|
1812
1820
|
providerDomain: ref.providerDomain.trim(),
|
|
1813
|
-
subjectScope
|
|
1821
|
+
subjectScope,
|
|
1814
1822
|
...ref.connectionId ? { connectionId: ref.connectionId } : {},
|
|
1815
1823
|
...ref.provider ? { provider: ref.provider.trim() } : {},
|
|
1816
1824
|
...ref.kind ? { kind: ref.kind } : {},
|
|
@@ -1826,23 +1834,30 @@ async function validateMcpCapabilityConnectionRef(input, item, ref) {
|
|
|
1826
1834
|
message: "MCP capabilities need a remote streamable HTTP endpoint before they can use a connectionRef"
|
|
1827
1835
|
});
|
|
1828
1836
|
}
|
|
1829
|
-
|
|
1830
|
-
return normalized;
|
|
1831
|
-
}
|
|
1832
|
-
const connection = await getConnectionMetadata(
|
|
1837
|
+
let connection = normalized.connectionId ? await getConnectionMetadata(
|
|
1833
1838
|
input.db,
|
|
1834
1839
|
input.workspaceId,
|
|
1835
1840
|
normalized.connectionId,
|
|
1836
1841
|
input.grant.subjectId
|
|
1837
|
-
);
|
|
1842
|
+
) : null;
|
|
1843
|
+
if (!connection && subjectScope === "subject" && !normalized.connectionId) {
|
|
1844
|
+
const visible = await listConnectionsMetadata(
|
|
1845
|
+
input.db,
|
|
1846
|
+
input.workspaceId,
|
|
1847
|
+
input.grant.subjectId
|
|
1848
|
+
);
|
|
1849
|
+
connection = visible.find(
|
|
1850
|
+
(candidate) => candidate.subjectId === input.grant.subjectId && candidate.providerDomain === normalized.providerDomain && (!normalized.kind || candidate.kind === normalized.kind) && candidate.status === "active"
|
|
1851
|
+
) ?? null;
|
|
1852
|
+
}
|
|
1838
1853
|
if (!connection) {
|
|
1839
1854
|
throw new HTTPException6(422, {
|
|
1840
|
-
message: "connectionRef
|
|
1855
|
+
message: "connectionRef does not reference a visible active connection"
|
|
1841
1856
|
});
|
|
1842
1857
|
}
|
|
1843
|
-
if (connection.subjectId !== null) {
|
|
1858
|
+
if (subjectScope === "subject" && connection.subjectId !== input.grant.subjectId || subjectScope === "workspace" && connection.subjectId !== null) {
|
|
1844
1859
|
throw new HTTPException6(422, {
|
|
1845
|
-
message:
|
|
1860
|
+
message: `connectionRef does not reference a ${subjectScope}-owned connection`
|
|
1846
1861
|
});
|
|
1847
1862
|
}
|
|
1848
1863
|
if (connection.status !== "active") {
|
|
@@ -1860,6 +1875,11 @@ async function validateMcpCapabilityConnectionRef(input, item, ref) {
|
|
|
1860
1875
|
message: "connectionRef.kind does not match the referenced connection"
|
|
1861
1876
|
});
|
|
1862
1877
|
}
|
|
1878
|
+
if (subjectScope === "subject") {
|
|
1879
|
+
const genericSubjectRef = { ...normalized, kind: connection.kind };
|
|
1880
|
+
delete genericSubjectRef.connectionId;
|
|
1881
|
+
return genericSubjectRef;
|
|
1882
|
+
}
|
|
1863
1883
|
return normalized;
|
|
1864
1884
|
}
|
|
1865
1885
|
function authDeferredMcpConnectivity() {
|
|
@@ -2016,7 +2036,26 @@ async function disableCapability(input) {
|
|
|
2016
2036
|
}
|
|
2017
2037
|
async function settingsWithEnabledCapabilityMcpServers(db, workspaceId, settings) {
|
|
2018
2038
|
const enabled = await listEnabledMcpCapabilityServers(db, workspaceId);
|
|
2019
|
-
return settingsWithMcpCapabilityServers(settings, enabled);
|
|
2039
|
+
return settingsWithCodexAppsMcpServer(settingsWithMcpCapabilityServers(settings, enabled));
|
|
2040
|
+
}
|
|
2041
|
+
function settingsWithCodexAppsMcpServer(settings) {
|
|
2042
|
+
if (!settings.codexConnectedAppsEnabled || settings.mcpServers.some((server) => server.id === CODEX_APPS_MCP_SERVER_ID)) {
|
|
2043
|
+
return settings;
|
|
2044
|
+
}
|
|
2045
|
+
return {
|
|
2046
|
+
...settings,
|
|
2047
|
+
mcpServers: [
|
|
2048
|
+
...settings.mcpServers,
|
|
2049
|
+
{
|
|
2050
|
+
id: CODEX_APPS_MCP_SERVER_ID,
|
|
2051
|
+
name: CODEX_APPS_MCP_SERVER_NAME,
|
|
2052
|
+
url: CODEX_APPS_MCP_URL,
|
|
2053
|
+
timeoutMs: CODEX_APPS_STARTUP_TIMEOUT_MS,
|
|
2054
|
+
// Availability is credential-specific, so discover on every run.
|
|
2055
|
+
cacheToolsList: false
|
|
2056
|
+
}
|
|
2057
|
+
]
|
|
2058
|
+
};
|
|
2020
2059
|
}
|
|
2021
2060
|
function settingsWithMcpCapabilityServers(settings, enabled) {
|
|
2022
2061
|
if (enabled.length === 0) {
|
|
@@ -2374,8 +2413,14 @@ function installationConnectionRef(config) {
|
|
|
2374
2413
|
if (!ref || typeof ref !== "object") {
|
|
2375
2414
|
return null;
|
|
2376
2415
|
}
|
|
2377
|
-
const { connectionId, providerDomain, kind } = ref;
|
|
2378
|
-
if (typeof
|
|
2416
|
+
const { connectionId, providerDomain, kind, subjectScope } = ref;
|
|
2417
|
+
if (typeof providerDomain !== "string" || typeof kind !== "string") {
|
|
2418
|
+
return null;
|
|
2419
|
+
}
|
|
2420
|
+
if (subjectScope === "subject") {
|
|
2421
|
+
return { providerDomain, kind, subjectScope: "subject" };
|
|
2422
|
+
}
|
|
2423
|
+
if (typeof connectionId !== "string") {
|
|
2379
2424
|
return null;
|
|
2380
2425
|
}
|
|
2381
2426
|
return { connectionId, providerDomain, kind };
|
|
@@ -3332,6 +3377,7 @@ import {
|
|
|
3332
3377
|
import {
|
|
3333
3378
|
CreateSessionRequest,
|
|
3334
3379
|
DEFAULT_FIRST_PARTY_MCP_PERMISSIONS,
|
|
3380
|
+
DEFAULT_FIRST_PARTY_MCP_TOOLS,
|
|
3335
3381
|
OPENGENI_SLACK_BOT_SESSION_METADATA_KEY as OPENGENI_SLACK_BOT_SESSION_METADATA_KEY2,
|
|
3336
3382
|
SessionSpawnDenial,
|
|
3337
3383
|
ServiceTurnInitiator,
|
|
@@ -3454,6 +3500,11 @@ var SessionSpawnDeniedError = class extends Error {
|
|
|
3454
3500
|
this.denial = denial;
|
|
3455
3501
|
}
|
|
3456
3502
|
};
|
|
3503
|
+
function resolveFirstPartyMcpToolsForCreate(requested, parentStored) {
|
|
3504
|
+
if (requested !== void 0) return [...requested];
|
|
3505
|
+
if (parentStored === void 0) return null;
|
|
3506
|
+
return [...parentStored ?? DEFAULT_FIRST_PARTY_MCP_TOOLS];
|
|
3507
|
+
}
|
|
3457
3508
|
function sessionSpawnDeniedMessage(denial) {
|
|
3458
3509
|
if (denial.code === "nested_agent_depth_override_forbidden") {
|
|
3459
3510
|
return `requested nested-agent depth limit ${denial.requestedMaxNestedAgentDepthOverride ?? "unknown"} exceeds inherited limit ${denial.effectiveMaxNestedAgentDepth}; workspace:admin is required to increase it`;
|
|
@@ -3745,6 +3796,7 @@ async function createAndStartSession(input) {
|
|
|
3745
3796
|
initialMessage: input.initialMessage,
|
|
3746
3797
|
initialTurnInstructions: input.turnInstructions ?? null,
|
|
3747
3798
|
resources: input.resources,
|
|
3799
|
+
skills: input.skills ?? [],
|
|
3748
3800
|
tools: input.tools,
|
|
3749
3801
|
...input.toolPolicy ? { toolPolicy: input.toolPolicy } : {},
|
|
3750
3802
|
metadata: sessionMetadata,
|
|
@@ -3757,6 +3809,7 @@ async function createAndStartSession(input) {
|
|
|
3757
3809
|
rigId: input.rigId ?? null,
|
|
3758
3810
|
rigVersionId: input.rigVersionId ?? null,
|
|
3759
3811
|
firstPartyMcpPermissions: input.firstPartyMcpPermissions ?? null,
|
|
3812
|
+
firstPartyMcpTools: input.firstPartyMcpTools ?? null,
|
|
3760
3813
|
instructions: input.instructions ?? null,
|
|
3761
3814
|
parentSessionId: input.parentSessionId ?? null,
|
|
3762
3815
|
createIdempotencyKey: input.createIdempotencyKey,
|
|
@@ -3788,6 +3841,7 @@ async function createAndStartSession(input) {
|
|
|
3788
3841
|
initialMessage: input.initialMessage,
|
|
3789
3842
|
initialTurnInstructions: input.turnInstructions ?? null,
|
|
3790
3843
|
resources: input.resources,
|
|
3844
|
+
skills: input.skills ?? [],
|
|
3791
3845
|
tools: input.tools,
|
|
3792
3846
|
...input.toolPolicy ? { toolPolicy: input.toolPolicy } : {},
|
|
3793
3847
|
metadata: sessionMetadata,
|
|
@@ -3800,6 +3854,7 @@ async function createAndStartSession(input) {
|
|
|
3800
3854
|
rigId: input.rigId ?? null,
|
|
3801
3855
|
rigVersionId: input.rigVersionId ?? null,
|
|
3802
3856
|
firstPartyMcpPermissions: input.firstPartyMcpPermissions ?? null,
|
|
3857
|
+
firstPartyMcpTools: input.firstPartyMcpTools ?? null,
|
|
3803
3858
|
instructions: input.instructions ?? null,
|
|
3804
3859
|
parentSessionId: input.parentSessionId ?? null,
|
|
3805
3860
|
sandboxGroupId: input.sandboxGroupId ?? null,
|
|
@@ -4082,6 +4137,7 @@ async function createSessionForRequest(deps, grant, workspaceId, rawPayload) {
|
|
|
4082
4137
|
const resources = normalizeResources(
|
|
4083
4138
|
hasOwnProperty(rawPayload, "resources") ? payload.resources : parentSession?.resources ?? payload.resources
|
|
4084
4139
|
);
|
|
4140
|
+
const skills = hasOwnProperty(rawPayload, "skills") ? payload.skills : parentSession?.skills ?? payload.skills;
|
|
4085
4141
|
const toolsProvided = hasOwnProperty(rawPayload, "tools");
|
|
4086
4142
|
const requestedTools = validateToolRefs(
|
|
4087
4143
|
toolsProvided ? payload.tools : parentSession?.tools ?? payload.tools,
|
|
@@ -4194,6 +4250,21 @@ async function createSessionForRequest(deps, grant, workspaceId, rawPayload) {
|
|
|
4194
4250
|
message: "goal-bearing sessions require goals:manage in the resulting first-party MCP permission set"
|
|
4195
4251
|
});
|
|
4196
4252
|
}
|
|
4253
|
+
const firstPartyMcpTools = resolveFirstPartyMcpToolsForCreate(
|
|
4254
|
+
payload.firstPartyMcpTools,
|
|
4255
|
+
parentSession ? parentSession.firstPartyMcpTools : void 0
|
|
4256
|
+
);
|
|
4257
|
+
if (payload.goal) {
|
|
4258
|
+
const effectiveTools = firstPartyMcpTools ?? [...DEFAULT_FIRST_PARTY_MCP_TOOLS];
|
|
4259
|
+
const missingGoalTools = ["goal_update", "goal_complete", "goal_pause"].filter(
|
|
4260
|
+
(name) => !effectiveTools.includes(name)
|
|
4261
|
+
);
|
|
4262
|
+
if (missingGoalTools.length > 0) {
|
|
4263
|
+
throw new HTTPException10(422, {
|
|
4264
|
+
message: `goal-bearing sessions require first-party MCP tools: ${missingGoalTools.join(", ")}`
|
|
4265
|
+
});
|
|
4266
|
+
}
|
|
4267
|
+
}
|
|
4197
4268
|
const sandboxChoice = payload.sandbox ?? (parentSessionId ? "shared" : "new");
|
|
4198
4269
|
let sandboxGroupId = null;
|
|
4199
4270
|
let inheritedBackend;
|
|
@@ -4308,6 +4379,7 @@ async function createSessionForRequest(deps, grant, workspaceId, rawPayload) {
|
|
|
4308
4379
|
initialMessage: payload.initialMessage,
|
|
4309
4380
|
turnInstructions: payload.turnInstructions ?? null,
|
|
4310
4381
|
resources,
|
|
4382
|
+
skills,
|
|
4311
4383
|
tools,
|
|
4312
4384
|
toolPolicy,
|
|
4313
4385
|
...payload.clientEventId ? { clientEventId: payload.clientEventId } : {},
|
|
@@ -4339,6 +4411,7 @@ async function createSessionForRequest(deps, grant, workspaceId, rawPayload) {
|
|
|
4339
4411
|
// time. Not surfaced as an event.
|
|
4340
4412
|
instructions: payload.instructions ?? null,
|
|
4341
4413
|
firstPartyMcpPermissions,
|
|
4414
|
+
firstPartyMcpTools,
|
|
4342
4415
|
mcpServers: sessionMcpServers.dbServers,
|
|
4343
4416
|
sessionMcpServers: sessionMcpServers.metadata,
|
|
4344
4417
|
parentSessionId,
|
|
@@ -5809,6 +5882,7 @@ export {
|
|
|
5809
5882
|
requireVariableSetEncryption,
|
|
5810
5883
|
requireVariableSetForApi,
|
|
5811
5884
|
resolveCapabilityPack,
|
|
5885
|
+
resolveFirstPartyMcpToolsForCreate,
|
|
5812
5886
|
resolveMemberSubjectId,
|
|
5813
5887
|
resolveSessionToolPolicy,
|
|
5814
5888
|
restoreScheduledTask,
|
|
@@ -5825,6 +5899,7 @@ export {
|
|
|
5825
5899
|
sessionSpawnDenialEnvelope,
|
|
5826
5900
|
sessionToolPolicyAllowsDefaultNativeTools,
|
|
5827
5901
|
sessionWithEffectiveToolPolicy,
|
|
5902
|
+
settingsWithCodexAppsMcpServer,
|
|
5828
5903
|
settingsWithEnabledCapabilityMcpServers,
|
|
5829
5904
|
settingsWithMcpCapabilityServers,
|
|
5830
5905
|
settingsWithSessionMcpServerMetadata,
|