@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 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, TurnInitiator, 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, TurnExecutionPolicyV1, GoalSpec, SessionMcpServerMetadata, CreateSessionResponse, SessionMcpApprovalPolicy, UpdateSessionMcpApprovalPolicyResponse, UpdateSessionToolPolicyRequest, ConnectionMetadata, OpenGeniSlackBotConnectionMetadata, WorkspaceMember, NewSessionDraft, SessionControlRequest, SessionControlResponse, WorkspaceInferenceControlRequest, WorkspaceInferenceControlResponse, DeleteSessionQueueItemRequest, SessionQueueMutationResponse, EditSessionQueueItemRequest, ComposerDraft, MoveSessionQueueItemRequest, SaveComposerDraftRequest, SteerSessionQueueItemRequest } from '@opengeni/contracts';
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?: string;
110
- triggerWorkflowId?: string;
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
- if (ref.subjectScope === "subject") {
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: "workspace",
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
- if (!normalized.connectionId) {
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.connectionId does not reference a visible connection"
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: "agent runtime connection refs must reference workspace-shared connections in I1"
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 connectionId !== "string" || typeof providerDomain !== "string" || typeof kind !== "string") {
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,