@bitkyc08/opencodex 2.77.0 → 2.78.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/bin/ocx.mjs +11 -10
  2. package/gui/dist/assets/App-BtfG5id-.js +54 -0
  3. package/gui/dist/assets/App-lCIslZ1L.css +1 -0
  4. package/gui/dist/assets/{Tray-gloIYNaW.js → Tray-DiJpSub0.js} +1 -1
  5. package/gui/dist/assets/index-Btc3Ogw4.js +94 -0
  6. package/gui/dist/assets/index-DmQB8D_R.css +1 -0
  7. package/gui/dist/assets/quota-summary-B_a96nXj.js +1 -0
  8. package/gui/dist/index.html +2 -2
  9. package/package.json +1 -1
  10. package/src/adapters/anthropic/beta-allowlist.ts +19 -2
  11. package/src/adapters/anthropic/client-identity.ts +13 -4
  12. package/src/adapters/anthropic/native-client-preamble.ts +31 -0
  13. package/src/adapters/anthropic/passthrough.ts +103 -25
  14. package/src/adapters/devin/cloud-direct/chat.ts +7 -2
  15. package/src/adapters/devin/trajectory.ts +49 -0
  16. package/src/adapters/devin.ts +13 -0
  17. package/src/adapters/ollama-native.ts +35 -19
  18. package/src/claude/intercept/client-hello.ts +103 -0
  19. package/src/claude/intercept/model-bindings.ts +3 -2
  20. package/src/claude/intercept/picker-listener.ts +279 -66
  21. package/src/cli/access-audio-input.ts +84 -0
  22. package/src/cli/access-audio-live.ts +99 -0
  23. package/src/cli/access-audio.ts +123 -0
  24. package/src/cli/access-data-client.ts +127 -0
  25. package/src/cli/access-data-plane.ts +104 -0
  26. package/src/cli/access-data-response.ts +76 -0
  27. package/src/cli/access.ts +65 -2
  28. package/src/cli/account-api.ts +30 -6
  29. package/src/cli/account-auth.ts +111 -42
  30. package/src/cli/account-key-quota.ts +118 -0
  31. package/src/cli/account-main.ts +11 -4
  32. package/src/cli/account-next-actions.ts +63 -0
  33. package/src/cli/account-policy-dto.ts +68 -0
  34. package/src/cli/account-policy.ts +167 -0
  35. package/src/cli/account-target.ts +8 -0
  36. package/src/cli/account.ts +34 -8
  37. package/src/cli/agent-runtime-settings.ts +130 -0
  38. package/src/cli/agent-settings.ts +101 -0
  39. package/src/cli/agent.ts +19 -2
  40. package/src/cli/alias.ts +7 -2
  41. package/src/cli/aside-profiles.ts +2 -2
  42. package/src/cli/capabilities-access-remote.ts +147 -0
  43. package/src/cli/capabilities-accounts.ts +195 -0
  44. package/src/cli/capabilities-agents-routing.ts +414 -0
  45. package/src/cli/capabilities-base.ts +783 -0
  46. package/src/cli/capabilities-command.ts +1 -0
  47. package/src/cli/capabilities-integrations.ts +264 -0
  48. package/src/cli/capabilities-lab.ts +214 -0
  49. package/src/cli/capabilities-observe-system.ts +662 -0
  50. package/src/cli/capabilities-provider-models.ts +302 -0
  51. package/src/cli/capabilities.ts +30 -1199
  52. package/src/cli/capability-types.ts +54 -0
  53. package/src/cli/catalog-command-result.ts +57 -0
  54. package/src/cli/chatgpt-command.ts +25 -2
  55. package/src/cli/claude-agent-startup-sync.ts +17 -0
  56. package/src/cli/claude-desktop-profile.ts +100 -0
  57. package/src/cli/claude-desktop.ts +39 -6
  58. package/src/cli/codex-shim-autorestore.ts +2 -1
  59. package/src/cli/codex-shim-readiness.ts +23 -3
  60. package/src/cli/combo-input.ts +88 -0
  61. package/src/cli/combo-result.ts +52 -0
  62. package/src/cli/combo-stats.ts +123 -0
  63. package/src/cli/combo.ts +37 -14
  64. package/src/cli/companion-timeline.ts +142 -0
  65. package/src/cli/companion-usage.ts +146 -0
  66. package/src/cli/companion.ts +12 -3
  67. package/src/cli/config-command.ts +24 -8
  68. package/src/cli/dispatch.ts +52 -79
  69. package/src/cli/doctor.ts +22 -4
  70. package/src/cli/help-catalog.ts +31 -14
  71. package/src/cli/help-recovery.ts +2 -2
  72. package/src/cli/help.ts +25 -11
  73. package/src/cli/index.ts +38 -27
  74. package/src/cli/injection-follow.ts +35 -0
  75. package/src/cli/inspect.ts +5 -0
  76. package/src/cli/integration-aside-sync.ts +69 -0
  77. package/src/cli/integration-cursor.ts +106 -0
  78. package/src/cli/integration-input.ts +60 -0
  79. package/src/cli/integration-journal.ts +49 -0
  80. package/src/cli/integration-plan-dto.ts +156 -0
  81. package/src/cli/integration-preview.ts +215 -0
  82. package/src/cli/integrations.ts +24 -18
  83. package/src/cli/json-input.ts +134 -0
  84. package/src/cli/link.ts +32 -4
  85. package/src/cli/local-sync-result.ts +41 -0
  86. package/src/cli/log-follow.ts +84 -0
  87. package/src/cli/log-view-filter.ts +146 -0
  88. package/src/cli/logout-command.ts +44 -0
  89. package/src/cli/model-picker-ordering.ts +137 -0
  90. package/src/cli/models-custom-input.ts +107 -0
  91. package/src/cli/models-custom-runtime.ts +112 -0
  92. package/src/cli/models-order.ts +194 -0
  93. package/src/cli/models-runtime-subcommands.ts +2 -0
  94. package/src/cli/models-runtime.ts +7 -0
  95. package/src/cli/models.ts +66 -81
  96. package/src/cli/observe-stream.ts +142 -0
  97. package/src/cli/observe.ts +75 -34
  98. package/src/cli/provider-batch.ts +77 -0
  99. package/src/cli/provider-lifecycle-runtime.ts +170 -0
  100. package/src/cli/provider-result.ts +124 -0
  101. package/src/cli/provider-runtime.ts +15 -12
  102. package/src/cli/provider-settings.ts +143 -0
  103. package/src/cli/provider.ts +112 -34
  104. package/src/cli/registry.ts +62 -20
  105. package/src/cli/remote-workspace-hub.ts +83 -0
  106. package/src/cli/remote-workspace.ts +6 -1
  107. package/src/cli/restart-failure.ts +27 -0
  108. package/src/cli/root.ts +12 -0
  109. package/src/cli/route-policy-write.ts +137 -0
  110. package/src/cli/route-policy.ts +8 -0
  111. package/src/cli/runtime-api.ts +56 -79
  112. package/src/cli/secret-args.ts +149 -0
  113. package/src/cli/settings-result.ts +30 -0
  114. package/src/cli/storage.ts +77 -7
  115. package/src/cli/system-command.ts +60 -2
  116. package/src/cli/system-restart-client.ts +20 -3
  117. package/src/cli/system-settings-parity.ts +83 -0
  118. package/src/cli/update-restart-candidate.ts +21 -0
  119. package/src/cli/update-restart-child.ts +81 -0
  120. package/src/cli/update-restart-home.ts +38 -0
  121. package/src/cli/update-restart-transport.ts +193 -0
  122. package/src/cli/update-restart.ts +260 -0
  123. package/src/cli/usage-model-search.ts +58 -0
  124. package/src/cli/usage-report.ts +13 -5
  125. package/src/cli/v2-input.ts +66 -0
  126. package/src/cli/v2-local-output.ts +37 -0
  127. package/src/cli/v2-runtime.ts +90 -0
  128. package/src/cli/v2.ts +102 -144
  129. package/src/clients/config-export/dsh.ts +21 -0
  130. package/src/clients/config-export.ts +7 -1
  131. package/src/codex/catalog/build-entries.ts +1 -1
  132. package/src/codex/catalog/bundled.ts +9 -2
  133. package/src/codex/catalog/heal-observation.ts +66 -0
  134. package/src/codex/catalog/publication-observer.ts +19 -0
  135. package/src/codex/catalog/remote.ts +13 -15
  136. package/src/codex/catalog/restore.ts +19 -6
  137. package/src/codex/catalog/retained-sync.ts +58 -10
  138. package/src/codex/catalog/routed-removal.ts +116 -0
  139. package/src/codex/catalog/write-audit-contract.ts +21 -0
  140. package/src/codex/catalog/write-audit.ts +171 -0
  141. package/src/codex/catalog-self-heal.ts +284 -0
  142. package/src/codex/catalog-write-serialization.ts +71 -7
  143. package/src/codex/codex-home-owner.ts +124 -0
  144. package/src/codex/convergence.ts +55 -15
  145. package/src/codex/features.ts +8 -1
  146. package/src/codex/inject/restore.ts +46 -4
  147. package/src/codex/inject.ts +11 -1
  148. package/src/codex/internal/catalog-writer.ts +120 -13
  149. package/src/codex/journal.ts +49 -13
  150. package/src/codex/management-convergence.ts +3 -0
  151. package/src/codex/quota-types.ts +3 -0
  152. package/src/codex/quota.ts +13 -3
  153. package/src/codex/refresh.ts +20 -9
  154. package/src/codex/runtime.ts +7 -1
  155. package/src/codex/shim-diagnostics.ts +80 -0
  156. package/src/codex/shim-fingerprint.ts +7 -2
  157. package/src/codex/shim-migration.ts +153 -0
  158. package/src/codex/shim-overlay.ts +509 -0
  159. package/src/codex/shim-path-resolution.ts +14 -2
  160. package/src/codex/shim-probe.ts +4 -3
  161. package/src/codex/shim-state-file.ts +93 -7
  162. package/src/codex/shim.ts +15 -68
  163. package/src/codex/sync.ts +24 -4
  164. package/src/combos/failover.ts +19 -0
  165. package/src/combos/index.ts +1 -0
  166. package/src/combos/resolve.ts +12 -0
  167. package/src/config/atomic-write.ts +13 -8
  168. package/src/config/diagnostics.ts +19 -1
  169. package/src/config/load-degrade.ts +3 -0
  170. package/src/config/schema/chatgpt-desktop.ts +22 -0
  171. package/src/config/schema/config-schema.ts +32 -14
  172. package/src/config/schema/leaf-validators.ts +3 -2
  173. package/src/generated/compatibility-version.json +445 -129
  174. package/src/integrations/merge.ts +13 -5
  175. package/src/integrations/mutation-plan.ts +46 -3
  176. package/src/integrations/omp-yaml-source.ts +181 -1
  177. package/src/integrations/ownership-policy.ts +66 -0
  178. package/src/integrations/registry.ts +50 -1
  179. package/src/integrations/state.ts +46 -21
  180. package/src/integrations/target.ts +25 -2
  181. package/src/integrations/writer.ts +89 -31
  182. package/src/lib/package-tree-integrity.ts +42 -1
  183. package/src/lib/proxy-env.ts +3 -0
  184. package/src/lib/test-home-guard.ts +2 -1
  185. package/src/oauth/anthropic-account-refusal.ts +19 -8
  186. package/src/oauth/anthropic-routing.ts +17 -12
  187. package/src/oauth/anthropic.ts +27 -2
  188. package/src/oauth/index.ts +6 -8
  189. package/src/oauth/pool-settings-capability.ts +9 -2
  190. package/src/protocols/plan-snapshot.ts +1 -1
  191. package/src/protocols/settings.ts +28 -4
  192. package/src/server/caller-session-identity.ts +32 -0
  193. package/src/server/claude-messages.ts +11 -4
  194. package/src/server/index/serve-options.ts +12 -7
  195. package/src/server/index.ts +1 -1
  196. package/src/server/management/agent-settings-routes.ts +6 -5
  197. package/src/server/management/context.ts +8 -1
  198. package/src/server/management/cursor-integration-routes.ts +3 -3
  199. package/src/server/management/integration-routes.ts +5 -5
  200. package/src/server/management/model-routes.ts +3 -3
  201. package/src/server/management/native-integration-routes.ts +2 -2
  202. package/src/server/management/oauth-account-routes.ts +96 -30
  203. package/src/server/management/route-registry.ts +25 -24
  204. package/src/server/messages-native-eligibility.ts +3 -6
  205. package/src/server/messages-native-oauth.ts +82 -35
  206. package/src/server/messages-native.ts +78 -16
  207. package/src/server/responses/adapter-dispatch.ts +53 -28
  208. package/src/server/responses/core-auth.ts +10 -4
  209. package/src/server/responses/core-combo.ts +46 -6
  210. package/src/service/cli.ts +6 -1
  211. package/src/service/ownership-mutation-lease.d.mts +26 -0
  212. package/src/service/ownership-mutation-lease.mjs +76 -1
  213. package/src/types/config.ts +2 -0
  214. package/src/types/provider.ts +10 -10
  215. package/src/update/index.ts +2 -1
  216. package/src/update/update-failure-guidance.d.mts +6 -0
  217. package/src/update/update-failure-guidance.mjs +30 -5
  218. package/gui/dist/assets/App-COdEeqSj.css +0 -1
  219. package/gui/dist/assets/App-DEpCJEP_.js +0 -54
  220. package/gui/dist/assets/index-Cd7ittMv.css +0 -1
  221. package/gui/dist/assets/index-DwJKFJm5.js +0 -94
  222. package/gui/dist/assets/quota-summary-DGcEJU3h.js +0 -1
@@ -83,6 +83,7 @@ export async function runCapabilities(argv: string[]): Promise<number> {
83
83
  flags: cap.flags,
84
84
  mutates: cap.mutates,
85
85
  json: cap.json,
86
+ ...(cap.usage !== undefined ? { usage: cap.usage } : {}),
86
87
  ...(cap.details ? { details: cap.details } : {}),
87
88
  })),
88
89
  ...(route === undefined && !mutatingOnly ? { headCapabilities: HEAD_CAPABILITIES } : {}),
@@ -0,0 +1,264 @@
1
+ import type { Capability } from "./capability-types";
2
+
3
+ export const INTEGRATION_CAPABILITIES: readonly Capability[] = [
4
+ {
5
+ command: ["grok", "status"],
6
+ usage: "ocx grok status [--json]",
7
+ summary: "Read Grok model fence state and catalog.",
8
+ routes: [{"method": "GET", "path": "/api/grok"}],
9
+ flags: [{"name": "--json", "value": "boolean", "summary": "Emit the result as JSON."}],
10
+ mutates: false,
11
+ json: "payload",
12
+ details: ["integration grok is an alias of grok; show aliases status. Saving selection and applying the saved fence are separate actions.", "Apply receipts can report changed or skippedReason; success is not a guarantee of a changed client file."],
13
+ },
14
+ {
15
+ command: ["grok", "set"],
16
+ usage: "ocx grok set <model,model...> [--json]",
17
+ summary: "Replace the excluded Grok model list.",
18
+ routes: [{"method": "PUT", "path": "/api/grok/selection"}],
19
+ flags: [{"name": "--json", "value": "boolean", "summary": "Emit the result as JSON."}],
20
+ mutates: true,
21
+ json: "payload",
22
+ details: ["integration grok is an alias of grok; show aliases status. Saving selection and applying the saved fence are separate actions.", "Apply receipts can report changed or skippedReason; success is not a guarantee of a changed client file."],
23
+ },
24
+ {
25
+ command: ["grok", "exclude"],
26
+ usage: "ocx grok exclude <model,model...> [--json]",
27
+ summary: "Add models to the Grok exclusion list.",
28
+ routes: [{"method": "GET", "path": "/api/grok"}, {"method": "PUT", "path": "/api/grok/selection"}],
29
+ flags: [{"name": "--json", "value": "boolean", "summary": "Emit the result as JSON."}],
30
+ mutates: true,
31
+ json: "payload",
32
+ details: ["integration grok is an alias of grok; show aliases status. Saving selection and applying the saved fence are separate actions.", "Apply receipts can report changed or skippedReason; success is not a guarantee of a changed client file."],
33
+ },
34
+ {
35
+ command: ["grok", "include"],
36
+ usage: "ocx grok include <model,model...> [--json]",
37
+ summary: "Remove models from the Grok exclusion list.",
38
+ routes: [{"method": "GET", "path": "/api/grok"}, {"method": "PUT", "path": "/api/grok/selection"}],
39
+ flags: [{"name": "--json", "value": "boolean", "summary": "Emit the result as JSON."}],
40
+ mutates: true,
41
+ json: "payload",
42
+ details: ["integration grok is an alias of grok; show aliases status. Saving selection and applying the saved fence are separate actions.", "Apply receipts can report changed or skippedReason; success is not a guarantee of a changed client file."],
43
+ },
44
+ {
45
+ command: ["grok", "clear"],
46
+ usage: "ocx grok clear [--json]",
47
+ summary: "Clear Grok exclusions.",
48
+ routes: [{"method": "PUT", "path": "/api/grok/selection"}],
49
+ flags: [{"name": "--json", "value": "boolean", "summary": "Emit the result as JSON."}],
50
+ mutates: true,
51
+ json: "payload",
52
+ details: ["integration grok is an alias of grok; show aliases status. Saving selection and applying the saved fence are separate actions.", "Apply receipts can report changed or skippedReason; success is not a guarantee of a changed client file."],
53
+ },
54
+ {
55
+ command: ["grok", "apply"],
56
+ usage: "ocx grok apply [--json]",
57
+ summary: "Apply the saved Grok model fence.",
58
+ routes: [{"method": "POST", "path": "/api/grok/apply"}],
59
+ flags: [{"name": "--json", "value": "boolean", "summary": "Emit the result as JSON."}],
60
+ mutates: true,
61
+ json: "payload",
62
+ details: ["integration grok is an alias of grok; show aliases status. Saving selection and applying the saved fence are separate actions.", "Apply receipts can report changed or skippedReason; success is not a guarantee of a changed client file."],
63
+ },
64
+ {
65
+ command: ["integration", "client", "status"],
66
+ usage: "ocx integration client status [--client <id>] [--profile <id>] [--json]",
67
+ summary: "Read all file integrations, one client or an Aside profile.",
68
+ routes: [{"method": "GET", "path": "/api/client-integrations"}, {"method": "GET", "path": "/api/client-integrations/{clientId}"}, {"method": "GET", "path": "/api/client-integrations/aside/profiles"}, {"method": "GET", "path": "/api/client-integrations/aside/profiles/{profileId}"}],
69
+ flags: [{"name": "--client", "value": "string", "summary": "File integration ID; aside selects profiles."}, {"name": "--profile", "value": "number", "summary": "Aside nonnegative integer account ID; requires --client aside."}, {"name": "--json", "value": "boolean", "summary": "Emit the result as JSON."}],
70
+ mutates: false,
71
+ json: "payload",
72
+ details: ["show and list alias status; omitted Aside profile means the aggregate profile collection."],
73
+ },
74
+ {
75
+ command: ["integration", "client", "history"],
76
+ usage: "ocx integration client history [--client <id>] [--profile <id>] [--json]",
77
+ summary: "Read integration rollback history and snapshot availability.",
78
+ routes: [{"method": "GET", "path": "/api/client-integrations/journal"}, {"method": "GET", "path": "/api/client-integrations/aside/profiles/journal"}, {"method": "GET", "path": "/api/client-integrations/aside/profiles/{profileId}/journal"}],
79
+ flags: [{"name": "--client", "value": "string", "summary": "File integration ID; aside selects profiles."}, {"name": "--profile", "value": "number", "summary": "Aside nonnegative integer account ID; requires --client aside."}, {"name": "--json", "value": "boolean", "summary": "Emit the result as JSON."}],
80
+ mutates: false,
81
+ json: "payload",
82
+ details: ["journal is an alias. Ordinary client filtering uses ?client=; expired snapshots remain visibly expired."],
83
+ },
84
+ {
85
+ command: ["integration","client","enable"],
86
+ usage: "ocx integration client enable --client <id> [--profile <id>] [--overwrite-conflict] [--plan-fingerprint <token>] [--reasoning-default <model=effort> ... | --clear-reasoning-defaults] [--json]",
87
+ summary: "Apply the selected managed file integration.",
88
+ routes: [{"method":"PUT","path":"/api/client-integrations/{clientId}"},{"method":"PUT","path":"/api/client-integrations/aside/profiles"},{"method":"PUT","path":"/api/client-integrations/aside/profiles/{profileId}"}],
89
+ flags: [{"name":"--client","value":"string","summary":"Explicit file integration ID.","required":true},{"name":"--profile","value":"number","summary":"Aside nonnegative integer account ID; requires --client aside."},{"name":"--overwrite-conflict","value":"boolean","summary":"Explicitly permit replacing a conflicting block."},{"name":"--json","value":"boolean","summary":"Emit the result as JSON."},{"name":"--plan-fingerprint","value":"string","summary":"Optional versioned token from a matching preview; stale intent is refused without retry."},{"name":"--reasoning-default","value":"string","summary":"Repeat MODEL=EFFORT to replace the full Droid defaults map; exact model IDs, duplicate keys refused."},{"name":"--clear-reasoning-defaults","value":"boolean","summary":"Droid apply/overwrite only: send an empty map, distinct from omitted inherited defaults."}],
90
+ mutates: true,
91
+ json: "payload",
92
+ details: ["An omitted Aside profile toggles all Aside profiles. Ownership, snapshots, journal and conflict refusals remain server-owned.","Partial Aside failures remain failures after emitting the per-profile result. Never infer permission to overwrite from a refusal.","Bound Aside mutations require one explicit profile. Repeat the exact preview action/profile/options. The token is concurrency evidence, not authorization; stale state requires a new explicit preview.","Droid map omission preserves inheritance; supplied entries replace the full map, clear sends {}. Only Droid apply/overwrite accepts these options."],
93
+ },
94
+ {
95
+ command: ["integration","client","disable"],
96
+ usage: "ocx integration client disable --client <id> [--profile <id>] [--plan-fingerprint <token>] [--json]",
97
+ summary: "Disable the selected managed file integration.",
98
+ routes: [{"method":"PUT","path":"/api/client-integrations/{clientId}"},{"method":"PUT","path":"/api/client-integrations/aside/profiles"},{"method":"PUT","path":"/api/client-integrations/aside/profiles/{profileId}"}],
99
+ flags: [{"name":"--client","value":"string","summary":"Explicit file integration ID.","required":true},{"name":"--profile","value":"number","summary":"Aside nonnegative integer account ID; requires --client aside."},{"name":"--json","value":"boolean","summary":"Emit the result as JSON."},{"name":"--plan-fingerprint","value":"string","summary":"Optional versioned token from a matching preview; stale intent is refused without retry."}],
100
+ mutates: true,
101
+ json: "payload",
102
+ details: ["An omitted Aside profile toggles all Aside profiles. Ownership, snapshots, journal and conflict refusals remain server-owned.","Partial Aside failures remain failures after emitting the per-profile result. Never infer permission to overwrite from a refusal.","Bound Aside mutations require one explicit profile. Repeat the exact preview action/profile/options. The token is concurrency evidence, not authorization; stale state requires a new explicit preview."],
103
+ },
104
+ {
105
+ command: ["integration","client","restore"],
106
+ usage: "ocx integration client restore --op <opId> [--client aside --profile <id>] [--confirm-drift] [--preview | --plan-fingerprint <token>] [--json]",
107
+ summary: "Restore a selected rollback operation, retaining drift refusal.",
108
+ routes: [{"method":"POST","path":"/api/client-integrations/restore"},{"method":"POST","path":"/api/client-integrations/aside/profiles/{profileId}/restore"},{"method":"POST","path":"/api/client-integrations/restore/preview"},{"method":"POST","path":"/api/client-integrations/aside/profiles/{profileId}/preview"}],
109
+ flags: [{"name":"--op","value":"string","summary":"Operation ID; --op-id is an alias.","required":true},{"name":"--client","value":"string","summary":"File integration ID; aside selects profiles."},{"name":"--profile","value":"number","summary":"Aside nonnegative integer account ID; requires --client aside."},{"name":"--confirm-drift","value":"boolean","summary":"Explicitly allow replacing edits made after the snapshot."},{"name":"--json","value":"boolean","summary":"Emit the result as JSON."},{"name":"--preview","value":"boolean","summary":"Inspect restoration without mutating; exclusive with a commit fingerprint."},{"name":"--plan-fingerprint","value":"string","summary":"Optional versioned token from a matching preview; stale intent is refused without retry."}],
110
+ mutates: true,
111
+ json: "payload",
112
+ details: ["With --client, restore requires --profile; only Aside profiles accept that selector. No automatic drift confirmation or retry.","Preview preserves exact opId/profile/confirm-drift intent. Generic restore derives the client on the server; the returned plan does not embed opId or complete command input.","A refused or no-op preview is completed inspection, not applied work. A stale bound mutation exits5 with a fixed re-preview hint; no replacement token is automatically adopted."],
113
+ },
114
+ {
115
+ command: ["claude", "config", "status"],
116
+ usage: "ocx claude config status [--json]",
117
+ summary: "Read effective Claude Code configuration.",
118
+ routes: [{"method": "GET", "path": "/api/claude-code"}],
119
+ flags: [{"name": "--json", "value": "boolean", "summary": "Emit the result as JSON."}],
120
+ mutates: false,
121
+ json: "payload",
122
+ details: ["show is an alias; integration claude forwards to the same handler."],
123
+ },
124
+ {
125
+ command: ["claude", "config", "set"],
126
+ usage: "ocx claude config set [--enabled <on|off>] [--auth-mode <auto|proxy|subscription>] [--system-env <on|off>] [--fast-mode <on|off>] [--auto-context <on|off>] [--compact-window <tokens|default>] [--inject-agents <on|off>] [--small-fast-model <id|->] [--model-map <from=to,...|->] [--blocked-skills <name,name|->] [--web-model <id|->] [--web-backend <openai|anthropic|xai|gemini|exa|->] [--vision-model <id|->] [--vision-backend <openai|anthropic|->] [--json]; or ocx claude config set --first-party <on|off> [--json]",
127
+ summary: "Change Claude Code settings through the runtime owner.",
128
+ routes: [{"method": "PUT", "path": "/api/claude-code"}],
129
+ flags: [{"name": "--enabled", "value": "string", "summary": "on or off."}, {"name": "--auth-mode", "value": "string", "summary": "auto, proxy or subscription."}, {"name": "--system-env", "value": "string", "summary": "on or off."}, {"name": "--fast-mode", "value": "string", "summary": "on or off."}, {"name": "--auto-context", "value": "string", "summary": "on or off."}, {"name": "--compact-window", "value": "string", "summary": "Positive token count or default to clear."}, {"name": "--inject-agents", "value": "string", "summary": "on or off."}, {"name": "--small-fast-model", "value": "string", "summary": "Model ID; - clears."}, {"name": "--model-map", "value": "string", "summary": "Comma-separated from=to mappings; - clears."}, {"name": "--blocked-skills", "value": "string", "summary": "Comma-separated names; - clears."}, {"name": "--web-model", "value": "string", "summary": "Model ID; - clears."}, {"name": "--web-backend", "value": "string", "summary": "openai, anthropic, xai, gemini, exa or -."}, {"name": "--vision-model", "value": "string", "summary": "Model ID; - clears."}, {"name": "--vision-backend", "value": "string", "summary": "openai, anthropic or -."}, {"name": "--first-party", "value": "string", "summary": "on or off; must be the only setting."}, {"name": "--json", "value": "boolean", "summary": "Emit the result as JSON."}],
130
+ mutates: true,
131
+ json: "payload",
132
+ details: ["At least one setting is required. --first-party must be set alone and writes Claude settings immediately.", "Clear both helper model and backend with - to restore inheritance. Preserve shared_proxy_retained warnings."],
133
+ },
134
+ {
135
+ command: ["claude", "desktop", "show"],
136
+ usage: "ocx claude desktop show [--json]",
137
+ summary: "Inspect the desired profile derived on this machine.",
138
+ routes: [],
139
+ flags: [{"name": "--json", "value": "boolean", "summary": "Emit the result as JSON."}],
140
+ mutates: false,
141
+ json: "envelope",
142
+ details: ["Local config/catalog derivation, not GET of the remote desired profile. On a connected client scope is local; apply uses the hub profile. Catalog derivation may discover upstream models."],
143
+ },
144
+ {
145
+ command: ["claude", "desktop", "move"],
146
+ usage: "ocx claude desktop move <provider/model> <opus|fable|sonnet|haiku> [--default]",
147
+ summary: "Move an available route to a local Desktop family.",
148
+ routes: [],
149
+ flags: [{"name": "--default", "value": "boolean", "summary": "Make this route the family default."}],
150
+ mutates: true,
151
+ json: "none",
152
+ details: ["Local profile persistence only; no management HTTP or --json. On connected clients this does not change the hub profile."],
153
+ },
154
+ {
155
+ command: ["claude", "desktop", "default"],
156
+ usage: "ocx claude desktop default <opus|fable|sonnet|haiku> <provider/model|none>",
157
+ summary: "Set or clear a local Desktop family default.",
158
+ routes: [],
159
+ flags: [],
160
+ mutates: true,
161
+ json: "none",
162
+ details: ["Local profile persistence only; none clears the default. Connected Desktop apply uses the hub profile."],
163
+ },
164
+ {
165
+ command: ["claude", "desktop", "export"],
166
+ usage: "ocx claude desktop export <path|->",
167
+ summary: "Export the persisted local Desktop profile.",
168
+ routes: [],
169
+ flags: [],
170
+ mutates: true,
171
+ json: "none",
172
+ details: ["Local file output; - writes JSON to stdout. There is no --json flag. A file destination is overwritten; this is not a GUI draft export."],
173
+ },
174
+ {
175
+ command: ["claude", "desktop", "import"],
176
+ usage: "ocx claude desktop import <path> [--apply]",
177
+ summary: "Import a local Desktop profile, optionally applying it as a static gateway.",
178
+ routes: [{"method": "POST", "path": "/api/claude-desktop/apply"}],
179
+ flags: [{"name": "--apply", "value": "boolean", "summary": "After saving, apply as a static gateway."}],
180
+ mutates: true,
181
+ json: "none",
182
+ details: ["Without --apply this only persists locally. With a live local proxy, gateway apply is delegated by HTTP; otherwise local helpers apply it.", "Connected clients refuse import --apply. A saved profile can remain saved after application fails; no --json mode."],
183
+ },
184
+ {
185
+ command: ["claude", "desktop", "apply"],
186
+ usage: "ocx claude desktop [apply] [--first-party | --gateway [--static|--hybrid|--discovery-only]]",
187
+ summary: "Apply Claude Desktop first-party interception or gateway profile.",
188
+ routes: [{"method": "POST", "path": "/api/claude-desktop/apply"}],
189
+ flags: [{"name": "--first-party", "value": "boolean", "summary": "Keep Desktop on claude.ai and intercept its Code tab."}, {"name": "--gateway", "value": "boolean", "summary": "Apply a third-party gateway profile."}, {"name": "--static", "value": "boolean", "summary": "Static gateway model catalog."}, {"name": "--hybrid", "value": "boolean", "summary": "Hybrid gateway catalog."}, {"name": "--discovery-only", "value": "boolean", "summary": "Discovery-only gateway catalog."}],
190
+ mutates: true,
191
+ json: "none",
192
+ details: ["Uses local helpers or the live local apply route; connected gateway clients use the hub profile download path. No --json mode.", "First-party requires a local hub with interception enabled. Preserve account-risk warnings, trust prompts and ownership refusals; metadata grants no consent.", "Application and committed-marker persistence can diverge; inspect status after application and preserve warnings."],
193
+ },
194
+ {
195
+ command: ["integration","client","preview"],
196
+ usage: "ocx integration client preview --client <id> --operation <apply|overwrite|disable> [--profile <id>] [--reasoning-default <model=effort> ... | --clear-reasoning-defaults] [--json]",
197
+ summary: "Inspect a managed client change before choosing whether to apply it.",
198
+ routes: [{"method":"POST","path":"/api/client-integrations/preview"},{"method":"POST","path":"/api/client-integrations/aside/profiles/{profileId}/preview"}],
199
+ flags: [{"name":"--client","required":true,"value":"string","summary":"Explicit client; profile selectors require aside."},{"name":"--profile","value":"number","summary":"One Aside nonnegative integer profile ID."},{"name":"--operation","required":true,"value":"string","summary":"Required apply, overwrite or disable; Aside requires one profile."},{"name":"--reasoning-default","value":"string","summary":"Repeat MODEL=EFFORT to replace the full Droid defaults map; exact model IDs, duplicate keys refused."},{"name":"--clear-reasoning-defaults","value":"boolean","summary":"Droid apply/overwrite only: send an empty map, distinct from omitted inherited defaults."},{"name":"--json","value":"boolean","summary":"Emit one validated task result as JSON."}],
200
+ mutates: false,
201
+ json: "payload",
202
+ details: ["Uses an existing passive model snapshot; an unavailable preview never secretly refreshes providers or changes client files.","A valid refused plan, including an unbound refusal, is readable inspection. Only an applicable bound token can accompany a later write; repeat the original command intent.","Shows structural paths and consequences, not secret values or a client-file diff."],
203
+ },
204
+ {
205
+ command: ["integration","client","history","remove"],
206
+ usage: "ocx integration client history remove --op <opId> --yes [--client aside [--profile <id>]] [--json]",
207
+ summary: "Retire a selected rollback-history entry and its retained snapshot.",
208
+ routes: [{"method":"DELETE","path":"/api/client-integrations/journal"},{"method":"DELETE","path":"/api/client-integrations/aside/profiles/journal"},{"method":"DELETE","path":"/api/client-integrations/aside/profiles/{profileId}/journal"}],
209
+ flags: [{"name":"--op","required":true,"value":"string","summary":"Exact operation ID to retire."},{"name":"--yes","required":true,"value":"boolean","summary":"Required explicit confirmation of irreversible rollback-history retirement."},{"name":"--client","value":"string","summary":"Explicit client; profile selectors require aside."},{"name":"--profile","value":"number","summary":"One Aside nonnegative integer profile ID."},{"name":"--json","value":"boolean","summary":"Emit one validated task result as JSON."}],
210
+ mutates: true,
211
+ json: "payload",
212
+ details: ["journal remove is an alias. Omitting --client addresses the global journal; --client aside selects Aside history and optional --profile narrows it. Other clients are rejected for deletion scope.","The server protects the latest row and validates ownership. snapshotRemoved:false reports committed retirement with incomplete cleanup and exits1; never retry blindly or claim rollback."],
213
+ },
214
+ {
215
+ command: ["integration","client","sync"],
216
+ usage: "ocx integration client sync --client aside [--json]",
217
+ summary: "Refresh the managed Aside profiles through their existing owner.",
218
+ routes: [{"method":"POST","path":"/api/client-integrations/aside/sync"}],
219
+ flags: [{"name":"--client","required":true,"value":"string","summary":"Explicit client; profile selectors require aside."},{"name":"--json","value":"boolean","summary":"Emit one validated task result as JSON."}],
220
+ mutates: true,
221
+ json: "envelope",
222
+ details: ["Uses the existing local attested synchronization exchange; no new public target/auth option, profile override or broad sync fallback.","Empty results mean no eligible profiles. Partial or malformed outcomes stay nonzero with safe per-profile recovery facts."],
223
+ },
224
+ {
225
+ command: ["claude","desktop","profile","show"],
226
+ usage: "ocx claude desktop profile show [--json]",
227
+ summary: "Read the selected running proxy’s Desktop profile and available models.",
228
+ routes: [{"method":"GET","path":"/api/claude-desktop"}],
229
+ flags: [{"name":"--json","value":"boolean","summary":"Emit one validated task result as JSON."}],
230
+ mutates: false,
231
+ json: "payload",
232
+ details: ["The existing claude desktop show remains local. Runtime profile observation can gather model inventory; it is not guaranteed offline."],
233
+ },
234
+ {
235
+ command: ["claude","desktop","profile","import"],
236
+ usage: "ocx claude desktop profile import <file|-> [--json]",
237
+ summary: "Validate and save a Desktop profile on the selected running proxy.",
238
+ routes: [{"method":"PUT","path":"/api/claude-desktop"}],
239
+ flags: [{"name":"--json","value":"boolean","summary":"Emit one validated task result as JSON."}],
240
+ mutates: true,
241
+ json: "payload",
242
+ details: ["Bounded JSON file or explicit stdin; canonical DesktopProfile validation and the management owner retain availability, concurrent-save and applied-marker rules.","Save only: --apply and native-mode flags are refused, and failed management writes never save a local fallback. Apply separately through the existing Desktop workflow."],
243
+ },
244
+ {
245
+ command: ["integration","native","cursor","status"],
246
+ usage: "ocx integration native cursor status [--json]",
247
+ summary: "Read Cursor installation, gateway requirements and model capabilities.",
248
+ routes: [{"method":"GET","path":"/api/native-integrations/cursor"}],
249
+ flags: [{"name":"--json","value":"boolean","summary":"Emit one validated task result as JSON."}],
250
+ mutates: false,
251
+ json: "payload",
252
+ details: ["Status can gather model inventory but does not install or toggle Cursor. A displayed placeholder does not authorize a credential-required listener."],
253
+ },
254
+ {
255
+ command: ["integration","native","cursor","local-installer"],
256
+ usage: "ocx integration native cursor local-installer [--json]",
257
+ summary: "Read the available Cursor installer link without downloading or installing it.",
258
+ routes: [{"method":"GET","path":"/api/native-integrations/cursor/local-installer"}],
259
+ flags: [{"name":"--json","value":"boolean","summary":"Emit one validated task result as JSON."}],
260
+ mutates: false,
261
+ json: "payload",
262
+ details: ["May fetch the public update manifest. available:false and nullable reason are valid observations; no installation or trust change is performed."],
263
+ },
264
+ ];
@@ -0,0 +1,214 @@
1
+ import type { Capability } from "./capability-types";
2
+
3
+ export const LAB_CAPABILITIES: readonly Capability[] = [
4
+ {
5
+ command: ["lab", "status"],
6
+ usage: "ocx lab status [--json]",
7
+ summary: "Read local Lab projection status.",
8
+ routes: [],
9
+ flags: [{"name": "--json", "value": "boolean", "summary": "Emit the local result as JSON."}],
10
+ mutates: false,
11
+ json: "envelope",
12
+ details: ["Local Lab helpers and storage only; no management HTTP. Remote/live-proxy equivalence is not implied."],
13
+ },
14
+ {
15
+ command: ["lab", "verdicts"],
16
+ usage: "ocx lab verdicts [--subject <subject>] [--layer <layer>] [--suite <suite>] [--verdict <verdict>] [--from <ms>] [--to <ms>] [--limit <n>] [--cursor <cursor>] [--json]",
17
+ summary: "Read local Lab verdicts.",
18
+ routes: [],
19
+ flags: [{"name": "--subject", "value": "string", "summary": "Exact subject ID."}, {"name": "--layer", "value": "string", "summary": "Evidence layer."}, {"name": "--suite", "value": "string", "summary": "Suite ID."}, {"name": "--verdict", "value": "string", "summary": "Compatibility verdict."}, {"name": "--from", "value": "number", "summary": "Inclusive timestamp in milliseconds."}, {"name": "--to", "value": "number", "summary": "Timestamp upper bound in milliseconds."}, {"name": "--limit", "value": "number", "summary": "Positive page size."}, {"name": "--cursor", "value": "string", "summary": "Opaque page cursor."}, {"name": "--json", "value": "boolean", "summary": "Emit the local result as JSON."}],
20
+ mutates: false,
21
+ json: "envelope",
22
+ details: ["Local Lab helpers and storage only; no management HTTP. Remote/live-proxy equivalence is not implied.", "Read commands do not start probes or scheduler ticks."],
23
+ },
24
+ {
25
+ command: ["lab", "subjects"],
26
+ usage: "ocx lab subjects [--kind <kind>] [--limit <n>] [--cursor <cursor>] [--json]",
27
+ summary: "Read local Lab subjects.",
28
+ routes: [],
29
+ flags: [{"name": "--kind", "value": "string", "summary": "Subject kind."}, {"name": "--limit", "value": "number", "summary": "Positive page size."}, {"name": "--cursor", "value": "string", "summary": "Opaque page cursor."}, {"name": "--json", "value": "boolean", "summary": "Emit the local result as JSON."}],
30
+ mutates: false,
31
+ json: "envelope",
32
+ details: ["Local Lab helpers and storage only; no management HTTP. Remote/live-proxy equivalence is not implied.", "Read commands do not start probes or scheduler ticks."],
33
+ },
34
+ {
35
+ command: ["lab", "observations"],
36
+ usage: "ocx lab observations [--subject <subject>] [--layer <layer>] [--suite <suite>] [--scenario <scenario>] [--outcome <outcome>] [--execution-mode <execution-mode>] [--from <ms>] [--to <ms>] [--limit <n>] [--cursor <cursor>] [--json]",
37
+ summary: "Read local Lab observations.",
38
+ routes: [],
39
+ flags: [{"name": "--subject", "value": "string", "summary": "Exact subject ID."}, {"name": "--layer", "value": "string", "summary": "Evidence layer."}, {"name": "--suite", "value": "string", "summary": "Suite ID."}, {"name": "--scenario", "value": "string", "summary": "Scenario ID."}, {"name": "--outcome", "value": "string", "summary": "Observation outcome."}, {"name": "--execution-mode", "value": "string", "summary": "Execution mode."}, {"name": "--from", "value": "number", "summary": "Inclusive timestamp in milliseconds."}, {"name": "--to", "value": "number", "summary": "Timestamp upper bound in milliseconds."}, {"name": "--limit", "value": "number", "summary": "Positive page size."}, {"name": "--cursor", "value": "string", "summary": "Opaque page cursor."}, {"name": "--json", "value": "boolean", "summary": "Emit the local result as JSON."}],
40
+ mutates: false,
41
+ json: "envelope",
42
+ details: ["Local Lab helpers and storage only; no management HTTP. Remote/live-proxy equivalence is not implied.", "Read commands do not start probes or scheduler ticks."],
43
+ },
44
+ {
45
+ command: ["lab", "events"],
46
+ usage: "ocx lab events [--event-kind <event-kind>] [--subject <subject>] [--from <ms>] [--to <ms>] [--excluded <true|false>] [--limit <n>] [--cursor <cursor>] [--json]",
47
+ summary: "Read local Lab events.",
48
+ routes: [],
49
+ flags: [{"name": "--event-kind", "value": "string", "summary": "Event kind."}, {"name": "--subject", "value": "string", "summary": "Exact subject ID."}, {"name": "--from", "value": "number", "summary": "Inclusive timestamp in milliseconds."}, {"name": "--to", "value": "number", "summary": "Timestamp upper bound in milliseconds."}, {"name": "--excluded", "value": "string", "summary": "true or false; takes a value."}, {"name": "--limit", "value": "number", "summary": "Positive page size."}, {"name": "--cursor", "value": "string", "summary": "Opaque page cursor."}, {"name": "--json", "value": "boolean", "summary": "Emit the local result as JSON."}],
50
+ mutates: false,
51
+ json: "envelope",
52
+ details: ["Local Lab helpers and storage only; no management HTTP. Remote/live-proxy equivalence is not implied.", "Read commands do not start probes or scheduler ticks."],
53
+ },
54
+ {
55
+ command: ["lab", "artifacts"],
56
+ usage: "ocx lab artifacts [--status <status>] [--artifact-class <artifact-class>] [--limit <n>] [--cursor <cursor>] [--json]",
57
+ summary: "Read local Lab artifacts.",
58
+ routes: [],
59
+ flags: [{"name": "--status", "value": "string", "summary": "present, corrupt or purged_unavailable."}, {"name": "--artifact-class", "value": "string", "summary": "Artifact class."}, {"name": "--limit", "value": "number", "summary": "Positive page size."}, {"name": "--cursor", "value": "string", "summary": "Opaque page cursor."}, {"name": "--json", "value": "boolean", "summary": "Emit the local result as JSON."}],
60
+ mutates: false,
61
+ json: "envelope",
62
+ details: ["Local Lab helpers and storage only; no management HTTP. Remote/live-proxy equivalence is not implied.", "Read commands do not start probes or scheduler ticks."],
63
+ },
64
+ {
65
+ command: ["lab", "catalog"],
66
+ usage: "ocx lab catalog [--layer <layer>] [--suite <suite>] [--json]",
67
+ summary: "Read local Lab catalog.",
68
+ routes: [],
69
+ flags: [{"name": "--layer", "value": "string", "summary": "Evidence layer."}, {"name": "--suite", "value": "string", "summary": "Suite ID."}, {"name": "--json", "value": "boolean", "summary": "Emit the local result as JSON."}],
70
+ mutates: false,
71
+ json: "envelope",
72
+ details: ["Local Lab helpers and storage only; no management HTTP. Remote/live-proxy equivalence is not implied.", "Read commands do not start probes or scheduler ticks."],
73
+ },
74
+ {
75
+ command: ["lab", "subject"],
76
+ usage: "ocx lab subject <subjectId> [--json]",
77
+ summary: "Inspect one local Lab subject.",
78
+ routes: [],
79
+ flags: [{"name": "--json", "value": "boolean", "summary": "Emit the local result as JSON."}],
80
+ mutates: false,
81
+ json: "envelope",
82
+ details: ["Local Lab helpers and storage only; no management HTTP. Remote/live-proxy equivalence is not implied."],
83
+ },
84
+ {
85
+ command: ["lab", "event"],
86
+ usage: "ocx lab event <eventId> [--json]",
87
+ summary: "Inspect one local Lab event.",
88
+ routes: [],
89
+ flags: [{"name": "--json", "value": "boolean", "summary": "Emit the local result as JSON."}],
90
+ mutates: false,
91
+ json: "envelope",
92
+ details: ["Local Lab helpers and storage only; no management HTTP. Remote/live-proxy equivalence is not implied."],
93
+ },
94
+ {
95
+ command: ["lab", "artifact"],
96
+ usage: "ocx lab artifact <digest> [--json]",
97
+ summary: "Inspect one local Lab artifact.",
98
+ routes: [],
99
+ flags: [{"name": "--json", "value": "boolean", "summary": "Emit the local result as JSON."}],
100
+ mutates: false,
101
+ json: "envelope",
102
+ details: ["Local Lab helpers and storage only; no management HTTP. Remote/live-proxy equivalence is not implied."],
103
+ },
104
+ {
105
+ command: ["lab", "production-signals"],
106
+ usage: "ocx lab production-signals --subject <id> [--limit <n>] [--json]",
107
+ summary: "Read passive production context for one exact Lab route subject.",
108
+ routes: [],
109
+ flags: [{"name": "--subject", "value": "string", "summary": "Exact Lab route subject ID.", "required": true}, {"name": "--limit", "value": "number", "summary": "Positive page size."}, {"name": "--json", "value": "boolean", "summary": "Emit the local result as JSON."}],
110
+ mutates: false,
111
+ json: "envelope",
112
+ details: ["Local Lab helpers and storage only; no management HTTP. Remote/live-proxy equivalence is not implied.", "Passive production context is not verification evidence."],
113
+ },
114
+ {
115
+ command: ["lab", "public", "preview"],
116
+ usage: "ocx lab public preview --event <eventId> [--event <eventId> ...] [--json]",
117
+ summary: "Preview unsigned local public evidence.",
118
+ routes: [],
119
+ flags: [{"name": "--event", "value": "string", "summary": "Event ID; repeat for multiple records.", "required": true}, {"name": "--json", "value": "boolean", "summary": "Emit the local result as JSON."}],
120
+ mutates: false,
121
+ json: "envelope",
122
+ details: ["Local Lab helpers and storage only; no management HTTP. Remote/live-proxy equivalence is not implied.", "No remote publishing occurs. Preview creates no publisher key; export can create local signing identity and bundle files."],
123
+ },
124
+ {
125
+ command: ["lab", "public", "export"],
126
+ usage: "ocx lab public export --event <eventId> [--event <eventId> ...] [--json]",
127
+ summary: "Export signed local public evidence.",
128
+ routes: [],
129
+ flags: [{"name": "--event", "value": "string", "summary": "Event ID; repeat for multiple records.", "required": true}, {"name": "--json", "value": "boolean", "summary": "Emit the local result as JSON."}],
130
+ mutates: true,
131
+ json: "envelope",
132
+ details: ["Local Lab helpers and storage only; no management HTTP. Remote/live-proxy equivalence is not implied.", "No remote publishing occurs. Preview creates no publisher key; export can create local signing identity and bundle files."],
133
+ },
134
+ {
135
+ command: ["lab", "public", "verify"],
136
+ usage: "ocx lab public verify --file <bundle.json> [--json]",
137
+ summary: "Verify a public evidence file.",
138
+ routes: [],
139
+ flags: [{"name": "--file", "value": "string", "summary": "Public evidence bundle path.", "required": true}, {"name": "--json", "value": "boolean", "summary": "Emit the local result as JSON."}],
140
+ mutates: false,
141
+ json: "envelope",
142
+ details: ["Local Lab helpers and storage only; no management HTTP. Remote/live-proxy equivalence is not implied.", "Signature validity proves integrity/continuity, not local verification.", "A verification failure emits its structured summary and then returns nonzero."],
143
+ },
144
+ {
145
+ command: ["lab", "public", "import"],
146
+ usage: "ocx lab public import --file <bundle.json> [--json]",
147
+ summary: "Import public evidence as untrusted community context.",
148
+ routes: [],
149
+ flags: [{"name": "--file", "value": "string", "summary": "Public evidence bundle path.", "required": true}, {"name": "--json", "value": "boolean", "summary": "Emit the local result as JSON."}],
150
+ mutates: true,
151
+ json: "envelope",
152
+ details: ["Local Lab helpers and storage only; no management HTTP. Remote/live-proxy equivalence is not implied.", "Signature validity proves integrity/continuity, not local verification.", "Imported community evidence never becomes locally verified evidence."],
153
+ },
154
+ {
155
+ command: ["lab", "public", "community"],
156
+ usage: "ocx lab public community [--json]",
157
+ summary: "List local untrusted community evidence context.",
158
+ routes: [],
159
+ flags: [{"name": "--json", "value": "boolean", "summary": "Emit the local result as JSON."}],
160
+ mutates: false,
161
+ json: "envelope",
162
+ details: ["Local Lab helpers and storage only; no management HTTP. Remote/live-proxy equivalence is not implied."],
163
+ },
164
+ {
165
+ command: ["lab", "automation", "status"],
166
+ usage: "ocx lab automation [status] [--json]",
167
+ summary: "Read local automation policy, queue and run state.",
168
+ routes: [],
169
+ flags: [{"name": "--json", "value": "boolean", "summary": "Emit the local result as JSON."}],
170
+ mutates: false,
171
+ json: "envelope",
172
+ details: ["Local Lab helpers and storage only; no management HTTP. Remote/live-proxy equivalence is not implied."],
173
+ },
174
+ {
175
+ command: ["lab", "automation", "enable"],
176
+ usage: "ocx lab automation enable [--protocol] [--live] [--json]",
177
+ summary: "Enable local Lab automation layers.",
178
+ routes: [],
179
+ flags: [{"name": "--protocol", "value": "boolean", "summary": "Select protocol conformance."}, {"name": "--live", "value": "boolean", "summary": "Select live route compatibility; may spend upstream quota."}, {"name": "--json", "value": "boolean", "summary": "Emit the local result as JSON."}],
180
+ mutates: true,
181
+ json: "envelope",
182
+ details: ["Local Lab helpers and storage only; no management HTTP. Remote/live-proxy equivalence is not implied.", "These flags already exist in the local handler. With neither flag, preserve current layer selection; with either flag, select only requested layers.", "Persists local policy, reconciles the queue and starts a scheduler in this CLI process; this is not a remote scheduler control API. Task-effectiveness background remains disabled."],
183
+ },
184
+ {
185
+ command: ["lab", "automation", "disable"],
186
+ usage: "ocx lab automation disable [--json]",
187
+ summary: "Disable local Lab automation.",
188
+ routes: [],
189
+ flags: [{"name": "--json", "value": "boolean", "summary": "Emit the local result as JSON."}],
190
+ mutates: true,
191
+ json: "envelope",
192
+ details: ["Local Lab helpers and storage only; no management HTTP. Remote/live-proxy equivalence is not implied.", "Persists disabled policy, reconciles the local queue and stops this process scheduler."],
193
+ },
194
+ {
195
+ command: ["lab", "automation", "runs"],
196
+ usage: "ocx lab automation runs [--limit <n>] [--cursor <c>] [--json]",
197
+ summary: "List locally persisted automation runs.",
198
+ routes: [],
199
+ flags: [{"name": "--limit", "value": "number", "summary": "Positive page size."}, {"name": "--cursor", "value": "string", "summary": "Opaque page cursor."}, {"name": "--json", "value": "boolean", "summary": "Emit the local result as JSON."}],
200
+ mutates: false,
201
+ json: "envelope",
202
+ details: ["Local Lab helpers and storage only; no management HTTP. Remote/live-proxy equivalence is not implied."],
203
+ },
204
+ {
205
+ command: ["lab", "run"],
206
+ usage: "ocx lab run --layer <protocol_conformance|live_route_compatibility|task_effectiveness> --scenario <id> [--provider <name>] [--model <id>] [--json]",
207
+ summary: "Plan and enqueue an explicit local Lab run.",
208
+ routes: [],
209
+ flags: [{"name": "--layer", "value": "string", "summary": "Evidence layer.", "required": true}, {"name": "--scenario", "value": "string", "summary": "Scenario ID.", "required": true}, {"name": "--provider", "value": "string", "summary": "Configured provider name."}, {"name": "--model", "value": "string", "summary": "Model ID."}, {"name": "--json", "value": "boolean", "summary": "Emit the local result as JSON."}],
210
+ mutates: true,
211
+ json: "envelope",
212
+ details: ["Local Lab helpers and storage only; no management HTTP. Remote/live-proxy equivalence is not implied.", "The live-route layer installs a production route executor and can spend upstream quota. Explicit operator authorization is required for probes.", "An enqueued run receipt is not a completed verification. No run-cancel or full policy/routes editor is claimed."],
213
+ },
214
+ ];