@opengeni/sdk 0.26.1 → 0.28.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -21,6 +21,8 @@ const client = new OpenGeniClient({
21
21
  const session = await client.createSession(workspaceId, {
22
22
  initialMessage: "Investigate the failing deploy on staging",
23
23
  resources: [{ kind: "repository", uri: "https://github.com/acme/app.git", ref: "main" }],
24
+ // Exact model-visible first-party surface; permissions remain independent.
25
+ firstPartyMcpTools: ["set_session_title"],
24
26
  });
25
27
 
26
28
  for await (const event of client.streamEvents(workspaceId, session.id)) {
@@ -30,6 +32,32 @@ for await (const event of client.streamEvents(workspaceId, session.id)) {
30
32
  }
31
33
  ```
32
34
 
35
+ Omit `firstPartyMcpTools` for the minimal self-management default. An explicit
36
+ `[]` exposes no broad first-party tools; attached resources and separately
37
+ selected `files`/`docs` MCP servers are unaffected.
38
+
39
+ ## MCP tool output normalization
40
+
41
+ MCP transports and event stores can represent the same tool result as a direct
42
+ object, JSON text, a text content block, or nested `result`,
43
+ `structuredContent`, and `content` envelopes. Use the shared zero-dependency
44
+ normalizer when an embedding host needs one stable interpretation:
45
+
46
+ ```ts
47
+ import { normalizeMcpOutput } from "@opengeni/sdk";
48
+
49
+ const normalized = normalizeMcpOutput(toolOutput);
50
+
51
+ normalized.value; // canonical machine-readable value
52
+ normalized.text; // presentation text
53
+ normalized.isError; // preserved across recognized nested envelopes
54
+ normalized.raw; // original evidence
55
+ ```
56
+
57
+ Malformed text and unknown objects pass through without throwing. Envelope
58
+ recognition is deliberately conservative: an ordinary domain object is not
59
+ unwrapped merely because it has a field named `result`.
60
+
33
61
  ## Error handling
34
62
 
35
63
  Non-2xx responses throw `OpenGeniApiError` with stable transport metadata:
package/dist/index.d.ts CHANGED
@@ -473,12 +473,14 @@ type CreateConnectionRequest = {
473
473
  expiresAt?: string | null | undefined;
474
474
  metadata?: Record<string, unknown> | undefined;
475
475
  };
476
- type ConnectOpenGeniSlackBotRequest = {
477
- /** Write-only Slack bot token. It is never returned by the API. */
478
- token: string;
476
+ type OpenGeniSlackBotInstallRequest = {
479
477
  /** Existing OpenGeni Slack bot connection to reinstall in place. */
480
478
  connectionId?: string | undefined;
481
479
  };
480
+ type OpenGeniSlackBotInstallStart = {
481
+ authorizationUrl: string;
482
+ expiresAt: string;
483
+ };
482
484
  type UpdateConnectionRequest = {
483
485
  providerDomain?: string | undefined;
484
486
  subjectId?: string | null | undefined;
@@ -544,6 +546,7 @@ type Session = {
544
546
  titleSource: "user" | "agent" | null;
545
547
  instructions: string | null;
546
548
  resources: ResourceRef[];
549
+ skills: SessionSkill[];
547
550
  tools: ToolRef[];
548
551
  toolPolicy?: SessionToolPolicy | undefined;
549
552
  toolPolicyVersion?: number | undefined;
@@ -564,6 +567,7 @@ type Session = {
564
567
  rigId: string | null;
565
568
  rigVersionId: string | null;
566
569
  firstPartyMcpPermissions: string[] | null;
570
+ firstPartyMcpTools: FirstPartyMcpToolName[] | null;
567
571
  mcpServers: SessionMcpServerMetadata[];
568
572
  parentSessionId: string | null;
569
573
  /** Immutable server-authored nested-agent lineage and policy snapshot. */
@@ -722,7 +726,7 @@ type SessionHumanInputRequest = {
722
726
  createdAt: string;
723
727
  updatedAt: string;
724
728
  };
725
- declare const SESSION_EVENT_TYPES: readonly ["session.created", "session.event.envelope_omitted", "session.status.changed", "session.requiresAction", "session.humanInput.requested", "session.context.compaction.requested", "session.context.compacted", "session.context.compaction.skipped", "session.context.cleared", "user.message", "user.pause", "user.approvalDecision", "user.humanInputResponse", "turn.queued", "turn.started", "turn.completed", "turn.failed", "turn.cancelled", "turn.superseded", "turn.recovery.requested", "turn.capacity_waiting", "agent.message.delta", "agent.message.completed", "agent.reasoning.delta", "agent.toolCall.created", "agent.toolCall.output", "agent.model.request", "agent.model.usage", "tool.auth_needed", "credential.auth_needed", "agent.updated", "rig.setup.started", "rig.setup.completed", "rig.setup.skipped", "rig.setup.failed", "sandbox.operation.started", "sandbox.operation.completed", "sandbox.operation.failed", "sandbox.command.output.delta", "artifact.created", "goal.set", "goal.updated", "goal.completed", "goal.paused", "goal.resumed", "goal.cleared", "goal.continuation", "system.update.pending", "system.update.delivered", "session.control.paused", "session.control.resumed", "session.control.steer_requested", "workspace.inference.paused", "workspace.inference.resumed", "session.queue.changed", "session.queue.prompt.cancelled", "session.queue.history", "turn.event.rejected_late", "memory.saved", "memory.corrected", "stream.url.rotated", "stream.opened", "stream.closed", "stream.revoked", "recording.started", "recording.available", "recording.failed", "fs.changed", "git.changed", "terminal.pty.started", "terminal.pty.output.delta", "terminal.pty.exited", "session.title_set", "session.mcp.approval_policy.updated", "session.tool_policy.updated", "codex.account.switched", "codex.credential.selected", "codex.fleet.decision", "codex.capacity.waiting", "codex.capacity.resumed", "codex.capacity.superseded", "sandbox.box.created", "sandbox.box.lost", "sandbox.box.terminated", "sandbox.box.snapshot", "sandbox.env.drift", "session.route.reconciled", "workspace.revision.captured", "workspace.revision.degraded", "machine.op.failed", "machine.op.recovered", "machine.link.lost", "machine.link.restored", "machine.runner.restarted"];
729
+ declare const SESSION_EVENT_TYPES: readonly ["session.created", "session.event.envelope_omitted", "session.status.changed", "session.requiresAction", "session.humanInput.requested", "session.context.compaction.requested", "session.context.compacted", "session.context.compaction.skipped", "session.context.cleared", "user.message", "user.pause", "user.approvalDecision", "user.humanInputResponse", "turn.queued", "turn.started", "turn.completed", "turn.failed", "turn.cancelled", "turn.superseded", "turn.recovery.requested", "turn.capacity_waiting", "agent.message.delta", "agent.message.completed", "agent.reasoning.delta", "agent.toolCall.created", "agent.toolCall.output", "agent.model.request", "agent.model.usage", "tool.auth_needed", "credential.auth_needed", "agent.updated", "rig.setup.started", "rig.setup.completed", "rig.setup.skipped", "rig.setup.failed", "sandbox.operation.started", "sandbox.operation.completed", "sandbox.operation.failed", "sandbox.command.output.delta", "artifact.created", "goal.set", "goal.updated", "goal.completed", "goal.paused", "goal.resumed", "goal.cleared", "goal.continuation", "system.update.pending", "system.update.delivered", "system.update.superseded", "system.update.cancelled", "system.update.settled", "session.control.paused", "session.control.resumed", "session.control.steer_requested", "workspace.inference.paused", "workspace.inference.resumed", "session.queue.changed", "session.queue.prompt.cancelled", "session.queue.history", "turn.event.rejected_late", "memory.saved", "memory.corrected", "stream.url.rotated", "stream.opened", "stream.closed", "stream.revoked", "recording.started", "recording.available", "recording.failed", "fs.changed", "git.changed", "terminal.pty.started", "terminal.pty.output.delta", "terminal.pty.exited", "session.title_set", "session.mcp.approval_policy.updated", "session.tool_policy.updated", "codex.account.switched", "codex.credential.selected", "codex.fleet.decision", "codex.capacity.waiting", "codex.capacity.resumed", "codex.capacity.superseded", "sandbox.box.created", "sandbox.box.lost", "sandbox.box.terminated", "sandbox.box.snapshot", "sandbox.env.drift", "session.route.reconciled", "workspace.revision.captured", "workspace.revision.degraded", "machine.op.failed", "machine.op.recovered", "machine.link.lost", "machine.link.restored", "machine.runner.restarted"];
726
730
  type KnownSessionEventType = (typeof SESSION_EVENT_TYPES)[number];
727
731
  /**
728
732
  * Event types the SDK knows about today, kept open so a newer OpenGeni server
@@ -1404,6 +1408,8 @@ type CreateSessionRequest = {
1404
1408
  turnInstructions?: string | undefined;
1405
1409
  instructions?: string | undefined;
1406
1410
  resources?: ResourceRef[] | undefined;
1411
+ /** Inline skills fixed onto this session; omitted children inherit them. */
1412
+ skills?: SessionSkill[] | undefined;
1407
1413
  tools?: ToolRef[] | undefined;
1408
1414
  metadata?: Record<string, unknown> | undefined;
1409
1415
  model?: string | undefined;
@@ -1421,6 +1427,7 @@ type CreateSessionRequest = {
1421
1427
  expectedNewSessionDraftRevision?: number | undefined;
1422
1428
  maxNestedAgentDepth?: number | undefined;
1423
1429
  firstPartyMcpPermissions?: string[] | undefined;
1430
+ firstPartyMcpTools?: FirstPartyMcpToolName[] | undefined;
1424
1431
  mcpServers?: SessionMcpServerInput[] | undefined;
1425
1432
  sandbox?: "shared" | "new" | {
1426
1433
  groupId: string;
@@ -1433,6 +1440,7 @@ type KnownPermission = (typeof KNOWN_PERMISSIONS)[number];
1433
1440
  * can introduce permissions without breaking older SDK consumers.
1434
1441
  */
1435
1442
  type Permission = KnownPermission | (string & {});
1443
+ type FirstPartyMcpToolName = "set_session_title" | "goal_set" | "goal_update" | "goal_complete" | "goal_pause" | "memory_search" | "memory_save" | "memory_correct" | "sandboxes_list" | "sandbox_attach" | "sandbox_swap" | "run_on" | "sandbox_provision" | "rig_list" | "rig_get" | "rig_propose_change" | "rig_verify" | "rig_promote" | "sessions_list" | "session_get" | "session_events" | "session_create" | "session_send_message" | "session_pause" | "session_resume" | "session_steer" | "set_other_session_title" | "variable_set_list" | "environment_list" | "variable_set_set_variable" | "environment_set_variable" | "github_connect_link" | "github_token" | "github_repositories_list" | "social_connections_list" | "social_posts_recent" | "social_daily_analysis_context" | "scheduled_tasks_list" | "scheduled_tasks_get" | "scheduled_tasks_create" | "scheduled_tasks_update" | "scheduled_tasks_pause" | "scheduled_tasks_resume" | "scheduled_tasks_trigger" | "scheduled_tasks_delete" | "scheduled_task_runs_list" | "slack_bot_list_channels" | "slack_bot_channel_history" | "slack_bot_list_users" | "slack_bot_post_message";
1436
1444
  type ProductAccessMode = "local" | "configured" | "managed";
1437
1445
  type ModelCapabilitySupportV1 = "supported" | "unsupported" | "unknown";
1438
1446
  type ModelCapabilityStateV1 = {
@@ -2049,10 +2057,18 @@ type SessionQueueSnapshot = {
2049
2057
  /** The latest interrupted attempt has not yet durably proved physical quiescence. */
2050
2058
  stoppingPreviousAttempt: boolean;
2051
2059
  items: SessionTurn[];
2060
+ /** Canonical pending machine inputs. Events only invalidate this snapshot. */
2061
+ pendingInputs: SessionPendingInputPreview[];
2062
+ /** Exact next bounded input batch that will join an already-waiting prompt. */
2063
+ pendingInputAttachment: {
2064
+ turnId: string;
2065
+ inputIds: string[];
2066
+ } | null;
2052
2067
  };
2068
+ type SessionPendingInputPreview = Pick<SessionSystemUpdate, "id" | "sessionId" | "kind" | "classification" | "sourceId" | "summary" | "createdAt">;
2053
2069
  type SystemUpdateClassification = "success" | "failure" | "action_required" | "info";
2054
2070
  type SessionSystemUpdateKind = "scheduled_occurrence" | "goal_continuation" | "agent_message" | "agent_steer_instruction" | "child_terminal_result";
2055
- type SessionSystemUpdateState = "pending" | "deferred" | "delivered" | "cancelled" | "superseded" | "failed";
2071
+ type SessionSystemUpdateState = "pending" | "delivered" | "cancelled" | "superseded" | "failed";
2056
2072
  type SessionSystemUpdate = {
2057
2073
  id: string;
2058
2074
  sessionId: string;
@@ -2065,6 +2081,7 @@ type SessionSystemUpdate = {
2065
2081
  lineage: Record<string, unknown>;
2066
2082
  state: SessionSystemUpdateState;
2067
2083
  deliveredTurnId: string | null;
2084
+ deliveredHistoryItemId: string | null;
2068
2085
  deliveredAt: string | null;
2069
2086
  createdAt: string;
2070
2087
  };
@@ -2660,6 +2677,7 @@ type CapabilityPackSkill = {
2660
2677
  description?: string | undefined;
2661
2678
  files: CapabilityPackSkillFile[];
2662
2679
  };
2680
+ type SessionSkill = CapabilityPackSkill;
2663
2681
  type CapabilityPackVariableSetSpec = {
2664
2682
  description: string;
2665
2683
  requiredVariables: string[];
@@ -2809,9 +2827,10 @@ type CapabilityCatalogItem = {
2809
2827
  enabledReason: string | null;
2810
2828
  /** The connection backing this enabled installation, or null when none is involved. */
2811
2829
  connectionRef: {
2812
- connectionId: string;
2830
+ connectionId?: string | undefined;
2813
2831
  providerDomain: string;
2814
2832
  kind: string;
2833
+ subjectScope?: "subject" | "workspace" | undefined;
2815
2834
  } | null;
2816
2835
  metadata: Record<string, unknown>;
2817
2836
  createdAt?: string | undefined;
@@ -3844,8 +3863,8 @@ declare class OpenGeniClient {
3844
3863
  }): Promise<DiscoverMcpCapabilitiesResponse>;
3845
3864
  listConnections(workspaceId: string): Promise<ConnectionMetadata[]>;
3846
3865
  createConnection(workspaceId: string, request: CreateConnectionRequest): Promise<ConnectionMetadata>;
3847
- /** Validate and store/reinstall the workspace-shared OpenGeni Slack bot credential. */
3848
- connectOpenGeniSlackBot(workspaceId: string, request: ConnectOpenGeniSlackBotRequest): Promise<ConnectionMetadata>;
3866
+ /** Start the public Slack installation flow for the workspace-shared OpenGeni bot. */
3867
+ startOpenGeniSlackBotInstall(workspaceId: string, request?: OpenGeniSlackBotInstallRequest): Promise<OpenGeniSlackBotInstallStart>;
3849
3868
  updateConnection(workspaceId: string, connectionId: string, request: UpdateConnectionRequest): Promise<ConnectionMetadata>;
3850
3869
  deleteConnection(workspaceId: string, connectionId: string): Promise<ConnectionMetadata>;
3851
3870
  /** Start an OAuth connection flow; redirect the user to the returned `authorizationUrl`. */
@@ -4051,6 +4070,22 @@ type SseMessage = {
4051
4070
  };
4052
4071
  declare function parseSseStream(stream: ReadableStream<Uint8Array>): AsyncGenerator<SseMessage, void, void>;
4053
4072
 
4073
+ /**
4074
+ * A transport-tolerant MCP tool result.
4075
+ *
4076
+ * `value` is the canonical machine-readable payload after recognized MCP/JSON
4077
+ * envelopes are removed. `text` is the best presentation string without
4078
+ * discarding structured data. `raw` always retains the original evidence.
4079
+ */
4080
+ type NormalizedMcpOutput = Readonly<{
4081
+ raw: unknown;
4082
+ value: unknown;
4083
+ text: string;
4084
+ isError: boolean;
4085
+ }>;
4086
+ /** Normalize common direct, JSON, and standard MCP result envelopes without throwing. */
4087
+ declare function normalizeMcpOutput(output: unknown): NormalizedMcpOutput;
4088
+
4054
4089
  /**
4055
4090
  * Translate the negotiated desktop capability into the WebSocket URL the noVNC
4056
4091
  * RFB client connects to. The scoped provider token is ALREADY embedded in the
@@ -4171,4 +4206,4 @@ declare function ttydInputFrame(data: string): string;
4171
4206
  /** Build a client→server RESIZE frame: "1" + JSON.stringify({ columns, rows }). */
4172
4207
  declare function ttydResizeFrame(columns: number, rows: number): string;
4173
4208
 
4174
- export { type AccessContext, type AccessGrant, type AccountGrant, type AccountRole, type AcknowledgeStreamRequest, type AcknowledgeStreamResponse, type ActivateWorkspaceInstructionPolicyRequest, type AddDocumentRequest, type AddWorkspaceMemberRequest, type AgentMessageCompletedPayload, type AgentTextDeltaPayload, type AgentToolCallCreatedPayload, type AgentToolCallOutputPayload, type ApiKey, type AttachViewerRequest, type AttachViewerResponse, type BillingBalance, type BillingEntitlementsResponse, type BillingMode, type BillingSummary, type BillingUsageResponse, type CapabilityCatalogItem, type CapabilityCatalogResponse, type CapabilityInstallation, type CapabilityInstallationStatus, type CapabilityKind, type CapabilityPack, type CapabilityPackConnector, type CapabilityPackConnectorAuthModel, type CapabilityPackKnowledge, type CapabilityPackScheduledTaskTemplate, type CapabilityPackSkill, type CapabilityPackSkillFile, type CapabilityPackVariableSetSpec, type CapabilityRuntime, type CapabilitySource, type CapabilityUnavailableReason, type ClientAuthConfig, type ClientConfig, type ClientModel, type ClientSessionEventInput, type CodexAccount, type CodexAccountOverview, type CodexAccountSwitchedPayload, type CodexAccountsResponse, type CodexAllocatorUpdate, type CodexConnectPoll, type CodexConnectStart, type CodexConnectionStatus, type CodexFleetCacheState, type CodexFleetConfidence, type CodexFleetDecisionEventPayload, type CodexFleetDecisionScore, type CodexFleetShadowComparison, type CodexOverviewResponse, type CodexResetCredit, type CodexResetRedemptionRecovery, type CodexRotationSettings, type CodexUsage, type CodexUsageMap, type CodexUsagePayload, type CodexUsageWindow, type CompactSessionContextResult, type CompleteFileUploadResponse, type ComposerDraft, type ComputerUseCapability, type ConnectOpenGeniSlackBotRequest, type ConnectionKind, type ConnectionMetadata, type ConnectionResponse, type ConnectionStatus, type CreateApiKeyRequest, type CreateApiKeyResponse, type CreateCapabilityCatalogItemRequest, type CreateCheckoutRequest, type CreateCheckoutResponse, type CreateConnectionRequest, type CreateDocumentBaseRequest, type CreateFileUploadRequest, type CreateFileUploadResponse, type CreateGitHubAppManifestRequest, type CreateGitHubAppManifestResponse, type CreateKnowledgeDropRequest, type CreateKnowledgeMemoryRequest, type CreateRigRequest, type CreateScheduledTaskRequest, type CreateSessionRequest, type CreateVariableSetRequest, type CreateWorkspaceEnvironmentRequest, type CreateWorkspaceInstructionPolicyDraftRequest, type CreateWorkspaceRequest, DEFAULT_WORKSPACE_TRANSCRIPTION_POLICY, type DeleteSessionQueueItemRequest, type DesktopConnectionState, type DesktopRfbFactory, type DesktopRfbLike, type DesktopStreamCapability, type DesktopStreamEvent, type DeviceEnrollmentApproveRequest, type DeviceEnrollmentApproveResponse, type DeviceEnrollmentDenyRequest, type DeviceEnrollmentDenyResponse, type DeviceEnrollmentLookupMachine, type DeviceEnrollmentLookupRequest, type DeviceEnrollmentLookupResponse, type DiscoverMcpCapabilitiesResponse, type Document, type DocumentBase, type DocumentCuration, type DocumentCurationStatus, type DocumentSearchMode, type DocumentSearchRequest, type DocumentSearchResponse, type DocumentSearchResult, type DocumentStatus, type DocumentVisibility, type EditSessionQueueItemRequest, type EffectiveControlBlocker, type EffectiveControlResumeOption, type EffectiveSessionControl, type EnableCapabilityRequest, type EnablePackRequest, type EnrollTokenExchangeRequest, type EnrollTokenExchangeResponse, type EnrollmentCredentials, type EnrollmentOs, type EntitlementValue, type Entitlements, type EntitlementsMode, type FetchLike, type FileAsset, type FileDownloadUrlResponse, type FileResourceRef, type FileStatus, type FileSystemCapability, type FileUploadData, type FsChangeKind, type FsChangedPayload, type FsDeleteRequest, type FsDeleteResponse, type FsEncoding, type FsListRequest, type FsListResponse, type FsMkdirRequest, type FsMkdirResponse, type FsMoveRequest, type FsMoveResponse, type FsNodeType, type FsReadRequest, type FsReadResponse, type FsTreeNode, type FsWriteRequest, type FsWriteResponse, type GetPackResponse, type GetWorkspaceCaptureFileResponse, type GetWorkspaceCaptureResponse, type GitCapability, type GitChangedPayload, type GitCommit, type GitCredentialBindingId, type GitCredentialProvider, type GitDiffHunk, type GitDiffLine, type GitDiffLineType, type GitDiffRequest, type GitDiffResponse, type GitFileDiff, type GitFileStatus, type GitFileStatusCode, type GitHubAppInfo, type GitHubBindingStatus, type GitHubInstallationBinding, type GitHubInstallationLifecycle, type GitHubRepositoriesResponse, type GitHubRepository, type GitHubRepositoryScope, type GitLogRequest, type GitLogResponse, type GitRepositoryAccess, type GitShowRequest, type GitShowResponse, type GitStatusRequest, type GitStatusResponse, type GoalSpec, type HumanInputAnswer, type HumanInputOption, type HumanInputQuestion, type HumanInputQuestionKind, type HumanInputResponse, type ImportLegacyWorkspaceInstructionPolicyDraftRequest, type IntegrationClientMetadata, KNOWN_PERMISSIONS, KNOWN_USAGE_EVENT_TYPES, type KnowledgeMemory, type KnowledgeMemoryKind, type KnowledgeMemorySearchRequest, type KnowledgeMemoryStatus, type KnowledgeSourceKind, type KnowledgeSourceRef, type KnownPermission, type KnownSessionEventType, type KnownUsageEventType, type LineageNode, type ListApiKeysResponse, type ListConnectionsResponse, type ListPacksResponse, type ListWorkspaceMembersResponse, type MachineKind, type MachineMetricsSeriesResponse, type MachineState, type MachineView, type MachinesResponse, type McpServerConnectionRef, type MetricSample, type MintEnrollTokenRequest, type MintEnrollTokenResponse, type ModelAvailabilityV1, type ModelBillingAttributionV1, type ModelCapabilitiesV1, type ModelCapabilityStateV1, type ModelCapabilitySupportV1, type ModelCredentialReadinessV1, type ModelCredentialSourceV1, type ModelPricingScheduleV1, type ModelPricingV1, type MoveDocumentRequest, type MoveSessionQueueItemRequest, type NewSessionDraft, type NewSessionDraftOptions, type OAuthStartRequest, type OAuthStartResponse, OPENGENI_API_CONTRACT_HEADER, OPENGENI_API_CONTRACT_REVISION, OPENGENI_CORRELATION_HEADER, OpenGeniApiContractMismatchError, OpenGeniApiError, OpenGeniClient, type OpenGeniClientOptions, type OpenGeniRequestOptions, OpenGeniSessionListCursorError, OpenGeniStreamError, type PackInstallation, type PackInstallationStatus, type Permission, type ProductAccessMode, type ProposeRigChangeRequest, type ProxySessionEventStreamOptions, type PtyCloseRequest, type PtyOpenRequest, type PtyOpenResponse, type PtyResizeRequest, type PtyWriteRequest, RETAINED_OUTPUT_DEFAULT_PAGE_BYTES, RETAINED_OUTPUT_MAX_PAGE_BYTES, type ReasoningEffort, type RecordingAvailablePayload, type RecordingCapability, type RecordingCodec, type RecordingContentType, type RecordingFailedPayload, type RecordingFailedReason, type RecordingMode, type RecordingStartedPayload, type RegisterCapabilityPackRequest, type RepositoryResourceRef, type ResourceRef, type RetainedArtifactContent, type RetainedArtifactContentOptions, type RetainedArtifactMetadata, type RetainedArtifactReference, type RetainedArtifactUnavailable, type RetainedOutputKind, type RetainedOutputUnavailableReason, type Rig, type RigChange, type RigChangeKind, type RigChangeStatus, type RigChangeVerification, type RigCheck, type RigCheckResult, type RigDefinitionEditPayload, type RigSetupAppendPayload, type RigVersion, type RollbackWorkspaceInstructionPolicyRequest, SESSION_EVENT_TYPES, type SandboxBackend, type SandboxCapabilityName, type SandboxCommandOutputDeltaPayload, type SandboxOs, type SaveComposerDraftRequest, type SaveNewSessionDraftRequest, type ScheduledTask, type ScheduledTaskAgentConfig, type ScheduledTaskAgentConfigInput, type ScheduledTaskDayOfWeek, type ScheduledTaskOverlapPolicy, type ScheduledTaskRun, type ScheduledTaskRunMode, type ScheduledTaskRunStatus, type ScheduledTaskScheduleSpec, type ScheduledTaskStatus, type ScheduledTaskTriggerType, type SendMessageInput, type ServiceTurnInitiator, type ServiceTurnInitiatorContext, type Session, type SessionCapabilities, type SessionCommandReceipt, type SessionControlResponse, type SessionEffectiveToolPolicy, type SessionEvent, type SessionEventCompactResult, type SessionEventCompactResultOptions, type SessionEventLatestClass, type SessionEventListOptions, type SessionEventPage, type SessionEventPayloadMode, type SessionEventReadDirection, type SessionEventReadMode, type SessionEventResultMode, type SessionEventSemanticClass, type SessionEventStreamTransport, type SessionEventType, type SessionGoal, type SessionGoalCreatedBy, type SessionGoalStatus, type SessionHumanInputRequest, type SessionLineageResponse, type SessionListResponse, type SessionMcpApprovalPolicy, type SessionMcpCredentialUpdateInput, type SessionMcpServerInput, type SessionMcpServerMetadata, type SessionQueueMutationResponse, type SessionQueueSnapshot, type SessionStatus, type SessionStatusChangedPayload, type SessionStructuredCapabilities, type SessionSummary, type SessionSystemUpdate, type SessionSystemUpdateKind, type SessionSystemUpdateState, type SessionToolPolicy, type SessionTurn, type SessionTurnSource, type SessionTurnStatus, type SetWorkspaceEnvironmentVariableRequest, type SseMessage, type SseReStreamOptions, type SteerMessageResult, type SteerSessionQueueItemRequest, type StreamClosedPayload, type StreamConnectionState, type StreamOpenedPayload, type StreamRevokedPayload, type StreamSessionEventsOptions, type StreamUrlRotatedPayload, type SubmitHumanInputResponseRequest, type SwapActiveSandboxRequest, type SwapActiveSandboxResponse, TTYD_SUBPROTOCOL, type TerminalCapability, type TerminalExecRequest, type TerminalExecResponse, type TerminalPtyExitedPayload, type TerminalPtyOutputDeltaPayload, type TerminalPtyStartedPayload, type ToolAuthNeededPayload, type ToolRef, type TranscriptionAdapter, type TranscriptionAdapterDescriptor, type TranscriptionAdapterStartContext, type TranscriptionAuthorization, type TranscriptionCredentialMode, type TranscriptionDiagnostic, type TranscriptionErrorCode, type TranscriptionEvent, type TranscriptionEventListener, type TranscriptionLifecycleStatus, type TranscriptionPolicyBlockReason, type TranscriptionResultMetadata, type TranscriptionSession, type TranscriptionSessionRequest, type TranscriptionSpeaker, type TranscriptionTargetSelection, type TranscriptionTimeSpan, type TranscriptionWord, TtydClientCommand, TtydServerCommand, type TurnInitiator, type UpdateConnectionRequest, type UpdateKnowledgeMemoryRequest, type UpdateRigRequest, type UpdateScheduledTaskRequest, type UpdateSessionGoalRequest, type UpdateSessionMcpApprovalPolicyRequest, type UpdateSessionMcpApprovalPolicyResponse, type UpdateSessionPinRequest, type UpdateSessionRequest, type UpdateSessionToolPolicyRequest, type UpdateVariableSetRequest, type UpdateWorkspaceEnvironmentRequest, type UpdateWorkspaceMemberRequest, type UpdateWorkspaceRequest, type UpdateWorkspaceSettingsRequest, type UploadFileInput, type UsageEvent, type UsageEventType, type UserApprovalDecisionEventInput, type UserHumanInputResponseEventInput, type UserMessageEventInput, type VariableSet, type VariableSetVariableMetadata, type ViewerHeartbeatRequest, type ViewerHeartbeatResponse, type ViewerHolder, type Workspace, type WorkspaceCaptureDegradedReason, type WorkspaceCaptureFile, type WorkspaceCaptureManifest, type WorkspaceCaptureRepo, type WorkspaceCaptureSignedUrl, type WorkspaceCaptureStats, type WorkspaceControlEvent, type WorkspaceControlEventPage, type WorkspaceControlStreamTransport, type WorkspaceEnvironment, type WorkspaceEnvironmentVariableMetadata, type WorkspaceInferenceControlResponse, type WorkspaceInstructionPolicyActivationEvent, type WorkspaceInstructionPolicyActivationResponse, type WorkspaceInstructionPolicyActivationType, type WorkspaceInstructionPolicyConflictResponse, type WorkspaceInstructionPolicyDiffRequest, type WorkspaceInstructionPolicyDiffResponse, type WorkspaceInstructionPolicyDraftProvenanceSource, type WorkspaceInstructionPolicyHead, type WorkspaceInstructionPolicyKind, type WorkspaceInstructionPolicyListOptions, type WorkspaceInstructionPolicyListResponse, type WorkspaceInstructionPolicyProvenanceSource, type WorkspaceInstructionPolicyRevision, type WorkspaceInstructionPolicyRevisionIdentity, type WorkspaceInstructionPolicyScope, type WorkspaceInstructionPolicyTarget, type WorkspaceMember, type WorkspaceMemorySearchMode, type WorkspaceMemorySearchRequest, type WorkspaceMemorySearchResponse, type WorkspaceMemorySearchResult, type WorkspaceModelCatalogModel, type WorkspaceModelCatalogResponse, type WorkspaceRegisteredPack, type WorkspaceRevisionCapturedPayload, type WorkspaceRevisionDegradedPayload, type WorkspaceSettings, type WorkspaceTranscriptionPolicy, type WorkspaceTranscriptionTarget, applyUrlRotation, authorizeTranscriptionAdapter, createTranscriptionSessionRequest, desktopSocketUrl, formatSseEvent, isRetryableStreamError, nextDesktopState, normalizeWorkspaceInstructionPolicyRoleKey, parseSseStream, proxySessionEventStream, resolveWorkspaceTranscriptionPolicy, resumeSequenceFromRequest, sessionEventsToSseResponse, sessionEventsToSseStream, streamSessionEvents, streamWorkspaceControlEvents, terminalSocketUrl, ttydAuthFrame, ttydInputFrame, ttydResizeFrame };
4209
+ export { type AccessContext, type AccessGrant, type AccountGrant, type AccountRole, type AcknowledgeStreamRequest, type AcknowledgeStreamResponse, type ActivateWorkspaceInstructionPolicyRequest, type AddDocumentRequest, type AddWorkspaceMemberRequest, type AgentMessageCompletedPayload, type AgentTextDeltaPayload, type AgentToolCallCreatedPayload, type AgentToolCallOutputPayload, type ApiKey, type AttachViewerRequest, type AttachViewerResponse, type BillingBalance, type BillingEntitlementsResponse, type BillingMode, type BillingSummary, type BillingUsageResponse, type CapabilityCatalogItem, type CapabilityCatalogResponse, type CapabilityInstallation, type CapabilityInstallationStatus, type CapabilityKind, type CapabilityPack, type CapabilityPackConnector, type CapabilityPackConnectorAuthModel, type CapabilityPackKnowledge, type CapabilityPackScheduledTaskTemplate, type CapabilityPackSkill, type CapabilityPackSkillFile, type CapabilityPackVariableSetSpec, type CapabilityRuntime, type CapabilitySource, type CapabilityUnavailableReason, type ClientAuthConfig, type ClientConfig, type ClientModel, type ClientSessionEventInput, type CodexAccount, type CodexAccountOverview, type CodexAccountSwitchedPayload, type CodexAccountsResponse, type CodexAllocatorUpdate, type CodexConnectPoll, type CodexConnectStart, type CodexConnectionStatus, type CodexFleetCacheState, type CodexFleetConfidence, type CodexFleetDecisionEventPayload, type CodexFleetDecisionScore, type CodexFleetShadowComparison, type CodexOverviewResponse, type CodexResetCredit, type CodexResetRedemptionRecovery, type CodexRotationSettings, type CodexUsage, type CodexUsageMap, type CodexUsagePayload, type CodexUsageWindow, type CompactSessionContextResult, type CompleteFileUploadResponse, type ComposerDraft, type ComputerUseCapability, type ConnectionKind, type ConnectionMetadata, type ConnectionResponse, type ConnectionStatus, type CreateApiKeyRequest, type CreateApiKeyResponse, type CreateCapabilityCatalogItemRequest, type CreateCheckoutRequest, type CreateCheckoutResponse, type CreateConnectionRequest, type CreateDocumentBaseRequest, type CreateFileUploadRequest, type CreateFileUploadResponse, type CreateGitHubAppManifestRequest, type CreateGitHubAppManifestResponse, type CreateKnowledgeDropRequest, type CreateKnowledgeMemoryRequest, type CreateRigRequest, type CreateScheduledTaskRequest, type CreateSessionRequest, type CreateVariableSetRequest, type CreateWorkspaceEnvironmentRequest, type CreateWorkspaceInstructionPolicyDraftRequest, type CreateWorkspaceRequest, DEFAULT_WORKSPACE_TRANSCRIPTION_POLICY, type DeleteSessionQueueItemRequest, type DesktopConnectionState, type DesktopRfbFactory, type DesktopRfbLike, type DesktopStreamCapability, type DesktopStreamEvent, type DeviceEnrollmentApproveRequest, type DeviceEnrollmentApproveResponse, type DeviceEnrollmentDenyRequest, type DeviceEnrollmentDenyResponse, type DeviceEnrollmentLookupMachine, type DeviceEnrollmentLookupRequest, type DeviceEnrollmentLookupResponse, type DiscoverMcpCapabilitiesResponse, type Document, type DocumentBase, type DocumentCuration, type DocumentCurationStatus, type DocumentSearchMode, type DocumentSearchRequest, type DocumentSearchResponse, type DocumentSearchResult, type DocumentStatus, type DocumentVisibility, type EditSessionQueueItemRequest, type EffectiveControlBlocker, type EffectiveControlResumeOption, type EffectiveSessionControl, type EnableCapabilityRequest, type EnablePackRequest, type EnrollTokenExchangeRequest, type EnrollTokenExchangeResponse, type EnrollmentCredentials, type EnrollmentOs, type EntitlementValue, type Entitlements, type EntitlementsMode, type FetchLike, type FileAsset, type FileDownloadUrlResponse, type FileResourceRef, type FileStatus, type FileSystemCapability, type FileUploadData, type FsChangeKind, type FsChangedPayload, type FsDeleteRequest, type FsDeleteResponse, type FsEncoding, type FsListRequest, type FsListResponse, type FsMkdirRequest, type FsMkdirResponse, type FsMoveRequest, type FsMoveResponse, type FsNodeType, type FsReadRequest, type FsReadResponse, type FsTreeNode, type FsWriteRequest, type FsWriteResponse, type GetPackResponse, type GetWorkspaceCaptureFileResponse, type GetWorkspaceCaptureResponse, type GitCapability, type GitChangedPayload, type GitCommit, type GitCredentialBindingId, type GitCredentialProvider, type GitDiffHunk, type GitDiffLine, type GitDiffLineType, type GitDiffRequest, type GitDiffResponse, type GitFileDiff, type GitFileStatus, type GitFileStatusCode, type GitHubAppInfo, type GitHubBindingStatus, type GitHubInstallationBinding, type GitHubInstallationLifecycle, type GitHubRepositoriesResponse, type GitHubRepository, type GitHubRepositoryScope, type GitLogRequest, type GitLogResponse, type GitRepositoryAccess, type GitShowRequest, type GitShowResponse, type GitStatusRequest, type GitStatusResponse, type GoalSpec, type HumanInputAnswer, type HumanInputOption, type HumanInputQuestion, type HumanInputQuestionKind, type HumanInputResponse, type ImportLegacyWorkspaceInstructionPolicyDraftRequest, type IntegrationClientMetadata, KNOWN_PERMISSIONS, KNOWN_USAGE_EVENT_TYPES, type KnowledgeMemory, type KnowledgeMemoryKind, type KnowledgeMemorySearchRequest, type KnowledgeMemoryStatus, type KnowledgeSourceKind, type KnowledgeSourceRef, type KnownPermission, type KnownSessionEventType, type KnownUsageEventType, type LineageNode, type ListApiKeysResponse, type ListConnectionsResponse, type ListPacksResponse, type ListWorkspaceMembersResponse, type MachineKind, type MachineMetricsSeriesResponse, type MachineState, type MachineView, type MachinesResponse, type McpServerConnectionRef, type MetricSample, type MintEnrollTokenRequest, type MintEnrollTokenResponse, type ModelAvailabilityV1, type ModelBillingAttributionV1, type ModelCapabilitiesV1, type ModelCapabilityStateV1, type ModelCapabilitySupportV1, type ModelCredentialReadinessV1, type ModelCredentialSourceV1, type ModelPricingScheduleV1, type ModelPricingV1, type MoveDocumentRequest, type MoveSessionQueueItemRequest, type NewSessionDraft, type NewSessionDraftOptions, type NormalizedMcpOutput, type OAuthStartRequest, type OAuthStartResponse, OPENGENI_API_CONTRACT_HEADER, OPENGENI_API_CONTRACT_REVISION, OPENGENI_CORRELATION_HEADER, OpenGeniApiContractMismatchError, OpenGeniApiError, OpenGeniClient, type OpenGeniClientOptions, type OpenGeniRequestOptions, OpenGeniSessionListCursorError, type OpenGeniSlackBotInstallRequest, type OpenGeniSlackBotInstallStart, OpenGeniStreamError, type PackInstallation, type PackInstallationStatus, type Permission, type ProductAccessMode, type ProposeRigChangeRequest, type ProxySessionEventStreamOptions, type PtyCloseRequest, type PtyOpenRequest, type PtyOpenResponse, type PtyResizeRequest, type PtyWriteRequest, RETAINED_OUTPUT_DEFAULT_PAGE_BYTES, RETAINED_OUTPUT_MAX_PAGE_BYTES, type ReasoningEffort, type RecordingAvailablePayload, type RecordingCapability, type RecordingCodec, type RecordingContentType, type RecordingFailedPayload, type RecordingFailedReason, type RecordingMode, type RecordingStartedPayload, type RegisterCapabilityPackRequest, type RepositoryResourceRef, type ResourceRef, type RetainedArtifactContent, type RetainedArtifactContentOptions, type RetainedArtifactMetadata, type RetainedArtifactReference, type RetainedArtifactUnavailable, type RetainedOutputKind, type RetainedOutputUnavailableReason, type Rig, type RigChange, type RigChangeKind, type RigChangeStatus, type RigChangeVerification, type RigCheck, type RigCheckResult, type RigDefinitionEditPayload, type RigSetupAppendPayload, type RigVersion, type RollbackWorkspaceInstructionPolicyRequest, SESSION_EVENT_TYPES, type SandboxBackend, type SandboxCapabilityName, type SandboxCommandOutputDeltaPayload, type SandboxOs, type SaveComposerDraftRequest, type SaveNewSessionDraftRequest, type ScheduledTask, type ScheduledTaskAgentConfig, type ScheduledTaskAgentConfigInput, type ScheduledTaskDayOfWeek, type ScheduledTaskOverlapPolicy, type ScheduledTaskRun, type ScheduledTaskRunMode, type ScheduledTaskRunStatus, type ScheduledTaskScheduleSpec, type ScheduledTaskStatus, type ScheduledTaskTriggerType, type SendMessageInput, type ServiceTurnInitiator, type ServiceTurnInitiatorContext, type Session, type SessionCapabilities, type SessionCommandReceipt, type SessionControlResponse, type SessionEffectiveToolPolicy, type SessionEvent, type SessionEventCompactResult, type SessionEventCompactResultOptions, type SessionEventLatestClass, type SessionEventListOptions, type SessionEventPage, type SessionEventPayloadMode, type SessionEventReadDirection, type SessionEventReadMode, type SessionEventResultMode, type SessionEventSemanticClass, type SessionEventStreamTransport, type SessionEventType, type SessionGoal, type SessionGoalCreatedBy, type SessionGoalStatus, type SessionHumanInputRequest, type SessionLineageResponse, type SessionListResponse, type SessionMcpApprovalPolicy, type SessionMcpCredentialUpdateInput, type SessionMcpServerInput, type SessionMcpServerMetadata, type SessionPendingInputPreview, type SessionQueueMutationResponse, type SessionQueueSnapshot, type SessionStatus, type SessionStatusChangedPayload, type SessionStructuredCapabilities, type SessionSummary, type SessionSystemUpdate, type SessionSystemUpdateKind, type SessionSystemUpdateState, type SessionToolPolicy, type SessionTurn, type SessionTurnSource, type SessionTurnStatus, type SetWorkspaceEnvironmentVariableRequest, type SseMessage, type SseReStreamOptions, type SteerMessageResult, type SteerSessionQueueItemRequest, type StreamClosedPayload, type StreamConnectionState, type StreamOpenedPayload, type StreamRevokedPayload, type StreamSessionEventsOptions, type StreamUrlRotatedPayload, type SubmitHumanInputResponseRequest, type SwapActiveSandboxRequest, type SwapActiveSandboxResponse, TTYD_SUBPROTOCOL, type TerminalCapability, type TerminalExecRequest, type TerminalExecResponse, type TerminalPtyExitedPayload, type TerminalPtyOutputDeltaPayload, type TerminalPtyStartedPayload, type ToolAuthNeededPayload, type ToolRef, type TranscriptionAdapter, type TranscriptionAdapterDescriptor, type TranscriptionAdapterStartContext, type TranscriptionAuthorization, type TranscriptionCredentialMode, type TranscriptionDiagnostic, type TranscriptionErrorCode, type TranscriptionEvent, type TranscriptionEventListener, type TranscriptionLifecycleStatus, type TranscriptionPolicyBlockReason, type TranscriptionResultMetadata, type TranscriptionSession, type TranscriptionSessionRequest, type TranscriptionSpeaker, type TranscriptionTargetSelection, type TranscriptionTimeSpan, type TranscriptionWord, TtydClientCommand, TtydServerCommand, type TurnInitiator, type UpdateConnectionRequest, type UpdateKnowledgeMemoryRequest, type UpdateRigRequest, type UpdateScheduledTaskRequest, type UpdateSessionGoalRequest, type UpdateSessionMcpApprovalPolicyRequest, type UpdateSessionMcpApprovalPolicyResponse, type UpdateSessionPinRequest, type UpdateSessionRequest, type UpdateSessionToolPolicyRequest, type UpdateVariableSetRequest, type UpdateWorkspaceEnvironmentRequest, type UpdateWorkspaceMemberRequest, type UpdateWorkspaceRequest, type UpdateWorkspaceSettingsRequest, type UploadFileInput, type UsageEvent, type UsageEventType, type UserApprovalDecisionEventInput, type UserHumanInputResponseEventInput, type UserMessageEventInput, type VariableSet, type VariableSetVariableMetadata, type ViewerHeartbeatRequest, type ViewerHeartbeatResponse, type ViewerHolder, type Workspace, type WorkspaceCaptureDegradedReason, type WorkspaceCaptureFile, type WorkspaceCaptureManifest, type WorkspaceCaptureRepo, type WorkspaceCaptureSignedUrl, type WorkspaceCaptureStats, type WorkspaceControlEvent, type WorkspaceControlEventPage, type WorkspaceControlStreamTransport, type WorkspaceEnvironment, type WorkspaceEnvironmentVariableMetadata, type WorkspaceInferenceControlResponse, type WorkspaceInstructionPolicyActivationEvent, type WorkspaceInstructionPolicyActivationResponse, type WorkspaceInstructionPolicyActivationType, type WorkspaceInstructionPolicyConflictResponse, type WorkspaceInstructionPolicyDiffRequest, type WorkspaceInstructionPolicyDiffResponse, type WorkspaceInstructionPolicyDraftProvenanceSource, type WorkspaceInstructionPolicyHead, type WorkspaceInstructionPolicyKind, type WorkspaceInstructionPolicyListOptions, type WorkspaceInstructionPolicyListResponse, type WorkspaceInstructionPolicyProvenanceSource, type WorkspaceInstructionPolicyRevision, type WorkspaceInstructionPolicyRevisionIdentity, type WorkspaceInstructionPolicyScope, type WorkspaceInstructionPolicyTarget, type WorkspaceMember, type WorkspaceMemorySearchMode, type WorkspaceMemorySearchRequest, type WorkspaceMemorySearchResponse, type WorkspaceMemorySearchResult, type WorkspaceModelCatalogModel, type WorkspaceModelCatalogResponse, type WorkspaceRegisteredPack, type WorkspaceRevisionCapturedPayload, type WorkspaceRevisionDegradedPayload, type WorkspaceSettings, type WorkspaceTranscriptionPolicy, type WorkspaceTranscriptionTarget, applyUrlRotation, authorizeTranscriptionAdapter, createTranscriptionSessionRequest, desktopSocketUrl, formatSseEvent, isRetryableStreamError, nextDesktopState, normalizeMcpOutput, normalizeWorkspaceInstructionPolicyRoleKey, parseSseStream, proxySessionEventStream, resolveWorkspaceTranscriptionPolicy, resumeSequenceFromRequest, sessionEventsToSseResponse, sessionEventsToSseStream, streamSessionEvents, streamWorkspaceControlEvents, terminalSocketUrl, ttydAuthFrame, ttydInputFrame, ttydResizeFrame };
package/dist/index.js CHANGED
@@ -393,6 +393,9 @@ var SESSION_EVENT_TYPES = [
393
393
  "goal.continuation",
394
394
  "system.update.pending",
395
395
  "system.update.delivered",
396
+ "system.update.superseded",
397
+ "system.update.cancelled",
398
+ "system.update.settled",
396
399
  "session.control.paused",
397
400
  "session.control.resumed",
398
401
  "session.control.steer_requested",
@@ -2126,14 +2129,13 @@ var OpenGeniClient = class {
2126
2129
  );
2127
2130
  return response.connection;
2128
2131
  }
2129
- /** Validate and store/reinstall the workspace-shared OpenGeni Slack bot credential. */
2130
- async connectOpenGeniSlackBot(workspaceId, request) {
2131
- const response = await this.requestJson(
2132
+ /** Start the public Slack installation flow for the workspace-shared OpenGeni bot. */
2133
+ async startOpenGeniSlackBotInstall(workspaceId, request = {}) {
2134
+ return await this.requestJson(
2132
2135
  "POST",
2133
- `/v1/workspaces/${workspaceId}/connections/slack-bot`,
2136
+ `/v1/workspaces/${workspaceId}/connections/slack-bot/install`,
2134
2137
  request
2135
2138
  );
2136
- return response.connection;
2137
2139
  }
2138
2140
  async updateConnection(workspaceId, connectionId, request) {
2139
2141
  const response = await this.requestJson(
@@ -2637,6 +2639,127 @@ function proxySessionEventStream(client, workspaceId, sessionId, options = {}) {
2637
2639
  });
2638
2640
  }
2639
2641
 
2642
+ // src/mcp-output.ts
2643
+ var MAX_MCP_OUTPUT_DEPTH = 8;
2644
+ var RESULT_ENVELOPE_KEYS = /* @__PURE__ */ new Set(["result", "isError", "jsonrpc", "id", "_meta"]);
2645
+ function normalizeMcpOutput(output) {
2646
+ const normalized = normalizeValue(output, 0, /* @__PURE__ */ new Set());
2647
+ return {
2648
+ raw: output,
2649
+ value: normalized.value,
2650
+ text: normalized.text,
2651
+ isError: normalized.isError
2652
+ };
2653
+ }
2654
+ function normalizeValue(value, depth, ancestors) {
2655
+ if (value === null || value === void 0) {
2656
+ return { value, text: "", isError: false };
2657
+ }
2658
+ if (typeof value === "string") {
2659
+ return normalizeText(value, depth, ancestors);
2660
+ }
2661
+ if (typeof value !== "object") {
2662
+ return { value, text: String(value), isError: false };
2663
+ }
2664
+ if (depth >= MAX_MCP_OUTPUT_DEPTH || ancestors.has(value)) {
2665
+ return { value, text: safeStringify(value), isError: false };
2666
+ }
2667
+ ancestors.add(value);
2668
+ try {
2669
+ if (Array.isArray(value)) {
2670
+ return { value, text: safeStringify(value), isError: false };
2671
+ }
2672
+ const record = value;
2673
+ const envelopeError = record.isError === true;
2674
+ if (record.type === "text" && typeof record.text === "string") {
2675
+ const normalized = normalizeText(record.text, depth + 1, ancestors);
2676
+ return {
2677
+ value: normalized.value,
2678
+ text: record.text,
2679
+ isError: envelopeError || normalized.isError
2680
+ };
2681
+ }
2682
+ if ("structuredContent" in record) {
2683
+ const normalized = normalizeValue(record.structuredContent, depth + 1, ancestors);
2684
+ return {
2685
+ value: normalized.value,
2686
+ text: firstMcpText(record.content) ?? normalized.text,
2687
+ isError: envelopeError || normalized.isError
2688
+ };
2689
+ }
2690
+ if (isMcpContent(record.content)) {
2691
+ const text = firstMcpText(record.content);
2692
+ if (text !== null) {
2693
+ const normalized = normalizeText(text, depth + 1, ancestors);
2694
+ return {
2695
+ value: normalized.value,
2696
+ text,
2697
+ isError: envelopeError || normalized.isError
2698
+ };
2699
+ }
2700
+ return {
2701
+ value,
2702
+ text: safeStringify(value),
2703
+ isError: envelopeError
2704
+ };
2705
+ }
2706
+ if (isResultEnvelope(record)) {
2707
+ const normalized = normalizeValue(record.result, depth + 1, ancestors);
2708
+ return {
2709
+ value: normalized.value,
2710
+ text: normalized.text,
2711
+ isError: envelopeError || normalized.isError
2712
+ };
2713
+ }
2714
+ return {
2715
+ value,
2716
+ text: safeStringify(value),
2717
+ isError: envelopeError
2718
+ };
2719
+ } finally {
2720
+ ancestors.delete(value);
2721
+ }
2722
+ }
2723
+ function normalizeText(text, depth, ancestors) {
2724
+ try {
2725
+ const parsed = JSON.parse(text);
2726
+ const normalized = normalizeValue(parsed, depth + 1, ancestors);
2727
+ return {
2728
+ value: normalized.value,
2729
+ text,
2730
+ isError: normalized.isError
2731
+ };
2732
+ } catch {
2733
+ return { value: text, text, isError: false };
2734
+ }
2735
+ }
2736
+ function isMcpContent(value) {
2737
+ return Array.isArray(value) && value.some(
2738
+ (part) => part !== null && typeof part === "object" && typeof part.type === "string"
2739
+ );
2740
+ }
2741
+ function firstMcpText(value) {
2742
+ if (!Array.isArray(value)) {
2743
+ return null;
2744
+ }
2745
+ for (const part of value) {
2746
+ if (part !== null && typeof part === "object" && part.type === "text" && typeof part.text === "string") {
2747
+ return part.text;
2748
+ }
2749
+ }
2750
+ return null;
2751
+ }
2752
+ function isResultEnvelope(record) {
2753
+ return "result" in record && Object.keys(record).every((key) => RESULT_ENVELOPE_KEYS.has(key));
2754
+ }
2755
+ function safeStringify(value) {
2756
+ try {
2757
+ return JSON.stringify(value) ?? "";
2758
+ } catch {
2759
+ return String(value);
2760
+ }
2761
+ }
2762
+
2640
2763
  // src/desktop.ts
2641
2764
  function desktopSocketUrl(cap) {
2642
2765
  if (!cap.url) {
@@ -2967,6 +3090,7 @@ export {
2967
3090
  formatSseEvent,
2968
3091
  isRetryableStreamError,
2969
3092
  nextDesktopState,
3093
+ normalizeMcpOutput,
2970
3094
  normalizeWorkspaceInstructionPolicyRoleKey,
2971
3095
  parseSseStream,
2972
3096
  proxySessionEventStream,