@openclaw/gateway-protocol 2026.8.1-beta.2 → 2026.8.1

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.
@@ -1,13 +1,5 @@
1
1
  import { Static, Type } from "typebox";
2
-
3
2
  //#region src/schema/frames.d.ts
4
- declare const GATEWAY_SERVER_CAPS: {
5
- readonly BOARD_WIDGET_PUT_CANVAS_DOC: "board-widget-put-canvas-doc";
6
- readonly CHAT_SEND_ROUTING_CONTRACT: "chat-send-routing-contract";
7
- readonly SYSTEM_AGENT_WIZARD_CANCEL: "openclaw-chat-wizard-cancel";
8
- readonly SYSTEM_AGENT_SETUP_MODEL_REF: "openclaw-setup-model-ref";
9
- readonly TASK_SUGGESTIONS_ACCEPT_MODES: "taskSuggestions.acceptModes";
10
- };
11
3
  /**
12
4
  * Top-level gateway frame schemas.
13
5
  *
@@ -35,16 +27,21 @@ declare const ConnectParamsSchema: Type.TObject<{
35
27
  platform: Type.TString;
36
28
  deviceFamily: Type.TOptional<Type.TString>;
37
29
  modelIdentifier: Type.TOptional<Type.TString>;
30
+ /** Self-reported IANA zone. Bounded because the longest real name is well under this cap. */
31
+ timeZone: Type.TOptional<Type.TString>;
38
32
  mode: Type.TEnum<["webchat", "cli", "worker", "test", "probe", "ui", "backend", "node"]>;
39
33
  instanceId: Type.TOptional<Type.TString>;
40
34
  }>;
41
35
  caps: Type.TOptional<Type.TArray<Type.TString>>;
42
- commands: Type.TOptional<Type.TArray<Type.TString>>; /** Additive Computer Use declaration; the owning core contract validates its bounded shape. */
43
- computerUse: Type.TOptional<Type.TUnknown>; /** Additive node-local worker build identity; presence advertises session hosting. */
36
+ commands: Type.TOptional<Type.TArray<Type.TString>>;
37
+ /** Additive Computer Use declaration; the owning core contract validates its bounded shape. */
38
+ computerUse: Type.TOptional<Type.TUnknown>;
39
+ /** @deprecated Accepted for the shipped v1 node-host envelope; current hosts use runner inventory. */
44
40
  workerRuns: Type.TOptional<Type.TObject<{
45
41
  bundleHash: Type.TString;
46
42
  openclawVersion: Type.TString;
47
43
  protocolFeatures: Type.TArray<Type.TString>;
44
+ bundlePrewarm: Type.TOptional<Type.TInteger>;
48
45
  }>>;
49
46
  permissions: Type.TOptional<Type.TRecord<"^.*$", Type.TBoolean>>;
50
47
  pathEnv: Type.TOptional<Type.TString>;
@@ -75,6 +72,7 @@ declare const HelloOkSchema: Type.TObject<{
75
72
  server: Type.TObject<{
76
73
  version: Type.TString;
77
74
  buildId: Type.TOptional<Type.TString>;
75
+ bootId: Type.TOptional<Type.TString>;
78
76
  controlUiBuildSource: Type.TOptional<Type.TUnion<[Type.TLiteral<"bundled">, Type.TLiteral<"configured">]>>;
79
77
  connId: Type.TString;
80
78
  }>;
@@ -91,18 +89,25 @@ declare const HelloOkSchema: Type.TObject<{
91
89
  platform: Type.TOptional<Type.TString>;
92
90
  deviceFamily: Type.TOptional<Type.TString>;
93
91
  modelIdentifier: Type.TOptional<Type.TString>;
92
+ timeZone: Type.TOptional<Type.TString>;
94
93
  mode: Type.TOptional<Type.TString>;
95
94
  lastInputSeconds: Type.TOptional<Type.TInteger>;
96
95
  reason: Type.TOptional<Type.TString>;
97
96
  tags: Type.TOptional<Type.TArray<Type.TString>>;
98
97
  text: Type.TOptional<Type.TString>;
99
98
  ts: Type.TInteger;
99
+ onlineSince: Type.TOptional<Type.TInteger>;
100
+ lastActivityAt: Type.TOptional<Type.TInteger>;
100
101
  deviceId: Type.TOptional<Type.TString>;
101
102
  roles: Type.TOptional<Type.TArray<Type.TString>>;
102
103
  scopes: Type.TOptional<Type.TArray<Type.TString>>;
103
104
  instanceId: Type.TOptional<Type.TString>;
104
105
  user: Type.TOptional<Type.TObject<{
105
106
  id: Type.TString;
107
+ identity: Type.TOptional<Type.TObject<{
108
+ type: Type.TLiteral<"profile">;
109
+ id: Type.TString;
110
+ }>>;
106
111
  email: Type.TOptional<Type.TString>;
107
112
  name: Type.TOptional<Type.TString>;
108
113
  avatarUrl: Type.TOptional<Type.TString>;
@@ -238,6 +243,7 @@ declare const HelloOkSchema: Type.TObject<{
238
243
  stateDir: Type.TOptional<Type.TString>;
239
244
  sessionDefaults: Type.TOptional<Type.TObject<{
240
245
  defaultAgentId: Type.TString;
246
+ modelConfigured: Type.TOptional<Type.TBoolean>;
241
247
  ownership: Type.TOptional<Type.TUnion<[Type.TLiteral<"sole">, Type.TLiteral<"legacy">, Type.TLiteral<"explicit">]>>;
242
248
  selectionRequired: Type.TOptional<Type.TBoolean>;
243
249
  mainKey: Type.TString;
@@ -322,6 +328,7 @@ declare const HelloOkSchema: Type.TObject<{
322
328
  description: Type.TOptional<Type.TString>;
323
329
  icon: Type.TOptional<Type.TString>;
324
330
  path: Type.TOptional<Type.TString>;
331
+ placement: Type.TOptional<Type.TString>;
325
332
  requiresGatewayAuth: Type.TOptional<Type.TBoolean>;
326
333
  group: Type.TOptional<Type.TUnion<[Type.TLiteral<"control">, Type.TLiteral<"agent">]>>;
327
334
  order: Type.TOptional<Type.TNumber>;
@@ -332,9 +339,6 @@ declare const HelloOkSchema: Type.TObject<{
332
339
  label: Type.TString;
333
340
  }>>>;
334
341
  pluginSurfaceUrls: Type.TOptional<Type.TRecord<"^.*$", Type.TString>>;
335
- deviceAuthMigration: Type.TOptional<Type.TObject<{
336
- pending: Type.TLiteral<true>;
337
- }>>;
338
342
  auth: Type.TObject<{
339
343
  deviceToken: Type.TOptional<Type.TString>;
340
344
  recoveryMigrationAllowed: Type.TOptional<Type.TLiteral<true>>;
@@ -440,4 +444,4 @@ type GatewayFrame = Static<typeof GatewayFrameSchema>;
440
444
  type TickEvent = Static<typeof TickEventSchema>;
441
445
  type ShutdownEvent = Static<typeof ShutdownEventSchema>;
442
446
  //#endregion
443
- export { ShutdownEventSchema as _, EventFrame as a, GatewayFrame as c, HelloOkSchema as d, RequestFrame as f, ShutdownEvent as g, ResponseFrameSchema as h, ErrorShapeSchema as i, GatewayFrameSchema as l, ResponseFrame as m, ConnectParamsSchema as n, EventFrameSchema as o, RequestFrameSchema as p, ErrorShape as r, GATEWAY_SERVER_CAPS as s, ConnectParams as t, HelloOk as u, TickEvent as v, TickEventSchema as y };
447
+ export { TickEvent as _, EventFrame as a, GatewayFrameSchema as c, RequestFrame as d, RequestFrameSchema as f, ShutdownEventSchema as g, ShutdownEvent as h, ErrorShapeSchema as i, HelloOk as l, ResponseFrameSchema as m, ConnectParamsSchema as n, EventFrameSchema as o, ResponseFrame as p, ErrorShape as r, GatewayFrame as s, ConnectParams as t, HelloOkSchema as u, TickEventSchema as v };
@@ -0,0 +1,102 @@
1
+ //#region src/gateway-error-details.d.ts
2
+ /** Gateway JSON-RPC style error codes shared by clients and server handlers. */
3
+ declare const ErrorCodes: {
4
+ /** @deprecated Retained for source compatibility; no current server emitter. */
5
+ readonly NOT_LINKED: "NOT_LINKED";
6
+ /** Device exists but still needs an explicit pairing approval. */
7
+ readonly NOT_PAIRED: "NOT_PAIRED";
8
+ /** @deprecated Retained for source compatibility; no current server emitter. */
9
+ readonly AGENT_TIMEOUT: "AGENT_TIMEOUT";
10
+ /** Request payload failed protocol validation or method preconditions. */
11
+ readonly INVALID_REQUEST: "INVALID_REQUEST";
12
+ /** Authenticated caller lacks permission for the requested operation. */
13
+ readonly FORBIDDEN: "FORBIDDEN";
14
+ /** Approval resolution referenced a missing or expired approval request. */
15
+ readonly APPROVAL_NOT_FOUND: "APPROVAL_NOT_FOUND";
16
+ /** Gateway service or required backend is temporarily unavailable. */
17
+ readonly UNAVAILABLE: "UNAVAILABLE";
18
+ };
19
+ /** Closed set of canonical gateway error code strings. */
20
+ type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];
21
+ /** Stable discriminants for structured method-level failures. */
22
+ declare const GatewayErrorDetailCodes: {
23
+ readonly CRON_JOB_NOT_FOUND: "CRON_JOB_NOT_FOUND";
24
+ readonly MISSING_SCOPE: "MISSING_SCOPE";
25
+ readonly MCP_APP_VIEW_EXPIRED: "MCP_APP_VIEW_EXPIRED";
26
+ readonly OUTBOUND_DELIVERY_QUEUED: "OUTBOUND_DELIVERY_QUEUED";
27
+ readonly USER_PREFS_LIMIT_EXCEEDED: "USER_PREFS_LIMIT_EXCEEDED";
28
+ readonly SESSION_COMPANION_BUSY: "SESSION_COMPANION_BUSY";
29
+ readonly SKILL_PROPOSAL_REVISION_CHANGED: "SKILL_PROPOSAL_REVISION_CHANGED";
30
+ readonly PROJECT_CLONE_FAILED: "PROJECT_CLONE_FAILED";
31
+ readonly UNKNOWN_AGENT_ID: "UNKNOWN_AGENT_ID";
32
+ readonly WIZARD_NOT_FOUND: "WIZARD_NOT_FOUND";
33
+ readonly SETUP_ADMISSION_BUSY: "SETUP_ADMISSION_BUSY";
34
+ };
35
+ /** Missing cron automation identified by its exact store key. */
36
+ type CronJobNotFoundErrorDetails = {
37
+ code: typeof GatewayErrorDetailCodes.CRON_JOB_NOT_FOUND;
38
+ jobId: string;
39
+ };
40
+ /** Missing operator-scope details shared by WebSocket and HTTP responses. */
41
+ type MissingScopeErrorDetails = {
42
+ code: typeof GatewayErrorDetailCodes.MISSING_SCOPE;
43
+ missingScope: string;
44
+ requiredScopes: string[];
45
+ };
46
+ type McpAppViewExpiredErrorDetails = {
47
+ code: typeof GatewayErrorDetailCodes.MCP_APP_VIEW_EXPIRED;
48
+ };
49
+ type OutboundDeliveryQueuedErrorDetails = {
50
+ code: typeof GatewayErrorDetailCodes.OUTBOUND_DELIVERY_QUEUED;
51
+ };
52
+ /** Per-profile preference quota details returned by users.prefs.set. */
53
+ type UserPrefsLimitExceededErrorDetails = {
54
+ code: typeof GatewayErrorDetailCodes.USER_PREFS_LIMIT_EXCEEDED;
55
+ limit: number;
56
+ currentCount: number;
57
+ };
58
+ /** Unknown agent details carried by agent-scoped method validation failures. */
59
+ type UnknownAgentIdErrorDetails = {
60
+ code: typeof GatewayErrorDetailCodes.UNKNOWN_AGENT_ID;
61
+ agentId: string;
62
+ };
63
+ /** Setup rejected before its task or wizard session was admitted. */
64
+ type SetupAdmissionBusyErrorDetails = {
65
+ code: typeof GatewayErrorDetailCodes.SETUP_ADMISSION_BUSY;
66
+ };
67
+ /** Missing or expired process-local setup wizard session. */
68
+ type WizardNotFoundErrorDetails = {
69
+ code: typeof GatewayErrorDetailCodes.WIZARD_NOT_FOUND;
70
+ };
71
+ type ProjectCloneFailureCause = "invalid_url" | "auth_required" | "not_found" | "network" | "target_exists" | "clone_failed";
72
+ type ProjectCloneErrorDetails = {
73
+ code: typeof GatewayErrorDetailCodes.PROJECT_CLONE_FAILED;
74
+ cause: ProjectCloneFailureCause;
75
+ };
76
+ /** Optimistic-concurrency mismatch for an operator-reviewed Skill Workshop draft. */
77
+ type SkillProposalRevisionChangedErrorDetails = {
78
+ code: typeof GatewayErrorDetailCodes.SKILL_PROPOSAL_REVISION_CHANGED;
79
+ expectedRevisionHash: string;
80
+ currentRevisionHash: string;
81
+ };
82
+ /** Structured details emitted by method-level failures. */
83
+ type GatewayErrorDetails = CronJobNotFoundErrorDetails | MissingScopeErrorDetails | McpAppViewExpiredErrorDetails | OutboundDeliveryQueuedErrorDetails | UserPrefsLimitExceededErrorDetails | SkillProposalRevisionChangedErrorDetails | ProjectCloneErrorDetails | UnknownAgentIdErrorDetails | WizardNotFoundErrorDetails | SetupAdmissionBusyErrorDetails;
84
+ /** Reads a typed cron lookup miss without parsing operator-facing prose. */
85
+ declare function readCronJobNotFoundError(error: unknown): CronJobNotFoundErrorDetails | null;
86
+ /** Builds the canonical stale-draft details shared by Skill Workshop RPCs. */
87
+ declare function buildSkillProposalRevisionChangedErrorDetails(params: {
88
+ expectedRevisionHash: string;
89
+ currentRevisionHash: string;
90
+ }): SkillProposalRevisionChangedErrorDetails;
91
+ /** Reads a stale Skill Workshop decision without parsing operator-facing prose. */
92
+ declare function readSkillProposalRevisionChangedError(error: unknown): SkillProposalRevisionChangedErrorDetails | null;
93
+ /** Reads validated missing-scope details from an untrusted protocol payload. */
94
+ declare function readMissingScopeErrorDetails(details: unknown): MissingScopeErrorDetails | null;
95
+ declare function isMcpAppViewExpiredError(error: unknown): boolean;
96
+ /**
97
+ * Reads a method-level missing-scope failure, preferring structured details.
98
+ * The message fallback keeps clients compatible with gateways predating structured details.
99
+ */
100
+ declare function readMissingScopeError(error: unknown): MissingScopeErrorDetails | null;
101
+ //#endregion
102
+ export { isMcpAppViewExpiredError as _, GatewayErrorDetails as a, readMissingScopeErrorDetails as b, OutboundDeliveryQueuedErrorDetails as c, SetupAdmissionBusyErrorDetails as d, SkillProposalRevisionChangedErrorDetails as f, buildSkillProposalRevisionChangedErrorDetails as g, WizardNotFoundErrorDetails as h, GatewayErrorDetailCodes as i, ProjectCloneErrorDetails as l, UserPrefsLimitExceededErrorDetails as m, ErrorCode as n, McpAppViewExpiredErrorDetails as o, UnknownAgentIdErrorDetails as p, ErrorCodes as r, MissingScopeErrorDetails as s, CronJobNotFoundErrorDetails as t, ProjectCloneFailureCause as u, readCronJobNotFoundError as v, readSkillProposalRevisionChangedError as x, readMissingScopeError as y };
@@ -1,2 +1,2 @@
1
- import { a as McpAppViewExpiredErrorDetails, c as ProjectCloneFailureCause, d as WizardNotFoundErrorDetails, f as isMcpAppViewExpiredError, i as GatewayErrorDetails, l as UnknownAgentIdErrorDetails, m as readMissingScopeErrorDetails, n as ErrorCodes, o as MissingScopeErrorDetails, p as readMissingScopeError, r as GatewayErrorDetailCodes, s as ProjectCloneErrorDetails, t as ErrorCode, u as UserPrefsLimitExceededErrorDetails } from "./gateway-error-details-BXoMHq1i.mjs";
2
- export { ErrorCode, ErrorCodes, GatewayErrorDetailCodes, GatewayErrorDetails, McpAppViewExpiredErrorDetails, MissingScopeErrorDetails, ProjectCloneErrorDetails, ProjectCloneFailureCause, UnknownAgentIdErrorDetails, UserPrefsLimitExceededErrorDetails, WizardNotFoundErrorDetails, isMcpAppViewExpiredError, readMissingScopeError, readMissingScopeErrorDetails };
1
+ import { _ as isMcpAppViewExpiredError, a as GatewayErrorDetails, b as readMissingScopeErrorDetails, c as OutboundDeliveryQueuedErrorDetails, d as SetupAdmissionBusyErrorDetails, f as SkillProposalRevisionChangedErrorDetails, g as buildSkillProposalRevisionChangedErrorDetails, h as WizardNotFoundErrorDetails, i as GatewayErrorDetailCodes, l as ProjectCloneErrorDetails, m as UserPrefsLimitExceededErrorDetails, n as ErrorCode, o as McpAppViewExpiredErrorDetails, p as UnknownAgentIdErrorDetails, r as ErrorCodes, s as MissingScopeErrorDetails, t as CronJobNotFoundErrorDetails, u as ProjectCloneFailureCause, v as readCronJobNotFoundError, x as readSkillProposalRevisionChangedError, y as readMissingScopeError } from "./gateway-error-details-GvUeus2z.mjs";
2
+ export { CronJobNotFoundErrorDetails, ErrorCode, ErrorCodes, GatewayErrorDetailCodes, GatewayErrorDetails, McpAppViewExpiredErrorDetails, MissingScopeErrorDetails, OutboundDeliveryQueuedErrorDetails, ProjectCloneErrorDetails, ProjectCloneFailureCause, SetupAdmissionBusyErrorDetails, SkillProposalRevisionChangedErrorDetails, UnknownAgentIdErrorDetails, UserPrefsLimitExceededErrorDetails, WizardNotFoundErrorDetails, buildSkillProposalRevisionChangedErrorDetails, isMcpAppViewExpiredError, readCronJobNotFoundError, readMissingScopeError, readMissingScopeErrorDetails, readSkillProposalRevisionChangedError };
@@ -1,4 +1,4 @@
1
- import { t as asProtocolRecord } from "./protocol-value-normalization-Bexl3yr1.mjs";
1
+ import { t as asNullableRecord } from "./record-coerce-BKHrZ46I.mjs";
2
2
  //#region src/gateway-error-details.ts
3
3
  /** Gateway JSON-RPC style error codes shared by clients and server handlers. */
4
4
  const ErrorCodes = {
@@ -19,18 +19,53 @@ const ErrorCodes = {
19
19
  };
20
20
  /** Stable discriminants for structured method-level failures. */
21
21
  const GatewayErrorDetailCodes = {
22
+ CRON_JOB_NOT_FOUND: "CRON_JOB_NOT_FOUND",
22
23
  MISSING_SCOPE: "MISSING_SCOPE",
23
24
  MCP_APP_VIEW_EXPIRED: "MCP_APP_VIEW_EXPIRED",
25
+ OUTBOUND_DELIVERY_QUEUED: "OUTBOUND_DELIVERY_QUEUED",
24
26
  USER_PREFS_LIMIT_EXCEEDED: "USER_PREFS_LIMIT_EXCEEDED",
25
27
  SESSION_COMPANION_BUSY: "SESSION_COMPANION_BUSY",
28
+ SKILL_PROPOSAL_REVISION_CHANGED: "SKILL_PROPOSAL_REVISION_CHANGED",
26
29
  PROJECT_CLONE_FAILED: "PROJECT_CLONE_FAILED",
27
30
  UNKNOWN_AGENT_ID: "UNKNOWN_AGENT_ID",
28
- WIZARD_NOT_FOUND: "WIZARD_NOT_FOUND"
31
+ WIZARD_NOT_FOUND: "WIZARD_NOT_FOUND",
32
+ SETUP_ADMISSION_BUSY: "SETUP_ADMISSION_BUSY"
29
33
  };
30
34
  const LEGACY_MISSING_SCOPE_PATTERN = /\bmissing scope:\s*([a-z0-9._-]+)/i;
35
+ const SHA256_PATTERN = /^[a-fA-F0-9]{64}$/;
36
+ /** Reads a typed cron lookup miss without parsing operator-facing prose. */
37
+ function readCronJobNotFoundError(error) {
38
+ const details = asNullableRecord(asNullableRecord(error)?.details);
39
+ if (details?.code !== GatewayErrorDetailCodes.CRON_JOB_NOT_FOUND) return null;
40
+ const jobId = typeof details.jobId === "string" ? details.jobId.trim() : "";
41
+ return jobId ? {
42
+ code: GatewayErrorDetailCodes.CRON_JOB_NOT_FOUND,
43
+ jobId
44
+ } : null;
45
+ }
46
+ /** Builds the canonical stale-draft details shared by Skill Workshop RPCs. */
47
+ function buildSkillProposalRevisionChangedErrorDetails(params) {
48
+ return {
49
+ code: GatewayErrorDetailCodes.SKILL_PROPOSAL_REVISION_CHANGED,
50
+ expectedRevisionHash: params.expectedRevisionHash,
51
+ currentRevisionHash: params.currentRevisionHash
52
+ };
53
+ }
54
+ /** Reads a stale Skill Workshop decision without parsing operator-facing prose. */
55
+ function readSkillProposalRevisionChangedError(error) {
56
+ const details = asNullableRecord(asNullableRecord(error)?.details);
57
+ if (details?.code !== GatewayErrorDetailCodes.SKILL_PROPOSAL_REVISION_CHANGED) return null;
58
+ const expectedRevisionHash = typeof details.expectedRevisionHash === "string" ? details.expectedRevisionHash : "";
59
+ const currentRevisionHash = typeof details.currentRevisionHash === "string" ? details.currentRevisionHash : "";
60
+ if (!SHA256_PATTERN.test(expectedRevisionHash) || !SHA256_PATTERN.test(currentRevisionHash)) return null;
61
+ return buildSkillProposalRevisionChangedErrorDetails({
62
+ expectedRevisionHash,
63
+ currentRevisionHash
64
+ });
65
+ }
31
66
  /** Reads validated missing-scope details from an untrusted protocol payload. */
32
67
  function readMissingScopeErrorDetails(details) {
33
- const record = asProtocolRecord(details);
68
+ const record = asNullableRecord(details);
34
69
  if (record?.code !== GatewayErrorDetailCodes.MISSING_SCOPE) return null;
35
70
  const missingScope = typeof record.missingScope === "string" ? record.missingScope.trim() : "";
36
71
  const requiredScopes = Array.isArray(record.requiredScopes) ? record.requiredScopes.map((scope) => typeof scope === "string" ? scope.trim() : "") : [];
@@ -42,14 +77,14 @@ function readMissingScopeErrorDetails(details) {
42
77
  };
43
78
  }
44
79
  function isMcpAppViewExpiredError(error) {
45
- return asProtocolRecord(asProtocolRecord(error)?.details)?.code === GatewayErrorDetailCodes.MCP_APP_VIEW_EXPIRED;
80
+ return asNullableRecord(asNullableRecord(error)?.details)?.code === GatewayErrorDetailCodes.MCP_APP_VIEW_EXPIRED;
46
81
  }
47
82
  /**
48
83
  * Reads a method-level missing-scope failure, preferring structured details.
49
84
  * The message fallback keeps clients compatible with gateways predating structured details.
50
85
  */
51
86
  function readMissingScopeError(error) {
52
- const record = asProtocolRecord(error);
87
+ const record = asNullableRecord(error);
53
88
  if (!record) return null;
54
89
  const structured = readMissingScopeErrorDetails(record.details);
55
90
  if (structured) return structured;
@@ -64,4 +99,4 @@ function readMissingScopeError(error) {
64
99
  } : null;
65
100
  }
66
101
  //#endregion
67
- export { ErrorCodes, GatewayErrorDetailCodes, isMcpAppViewExpiredError, readMissingScopeError, readMissingScopeErrorDetails };
102
+ export { ErrorCodes, GatewayErrorDetailCodes, buildSkillProposalRevisionChangedErrorDetails, isMcpAppViewExpiredError, readCronJobNotFoundError, readMissingScopeError, readMissingScopeErrorDetails, readSkillProposalRevisionChangedError };