@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.
- package/bin/ocx.mjs +11 -10
- package/gui/dist/assets/App-BtfG5id-.js +54 -0
- package/gui/dist/assets/App-lCIslZ1L.css +1 -0
- package/gui/dist/assets/{Tray-gloIYNaW.js → Tray-DiJpSub0.js} +1 -1
- package/gui/dist/assets/index-Btc3Ogw4.js +94 -0
- package/gui/dist/assets/index-DmQB8D_R.css +1 -0
- package/gui/dist/assets/quota-summary-B_a96nXj.js +1 -0
- package/gui/dist/index.html +2 -2
- package/package.json +1 -1
- package/src/adapters/anthropic/beta-allowlist.ts +19 -2
- package/src/adapters/anthropic/client-identity.ts +13 -4
- package/src/adapters/anthropic/native-client-preamble.ts +31 -0
- package/src/adapters/anthropic/passthrough.ts +103 -25
- package/src/adapters/devin/cloud-direct/chat.ts +7 -2
- package/src/adapters/devin/trajectory.ts +49 -0
- package/src/adapters/devin.ts +13 -0
- package/src/adapters/ollama-native.ts +35 -19
- package/src/claude/intercept/client-hello.ts +103 -0
- package/src/claude/intercept/model-bindings.ts +3 -2
- package/src/claude/intercept/picker-listener.ts +279 -66
- package/src/cli/access-audio-input.ts +84 -0
- package/src/cli/access-audio-live.ts +99 -0
- package/src/cli/access-audio.ts +123 -0
- package/src/cli/access-data-client.ts +127 -0
- package/src/cli/access-data-plane.ts +104 -0
- package/src/cli/access-data-response.ts +76 -0
- package/src/cli/access.ts +65 -2
- package/src/cli/account-api.ts +30 -6
- package/src/cli/account-auth.ts +111 -42
- package/src/cli/account-key-quota.ts +118 -0
- package/src/cli/account-main.ts +11 -4
- package/src/cli/account-next-actions.ts +63 -0
- package/src/cli/account-policy-dto.ts +68 -0
- package/src/cli/account-policy.ts +167 -0
- package/src/cli/account-target.ts +8 -0
- package/src/cli/account.ts +34 -8
- package/src/cli/agent-runtime-settings.ts +130 -0
- package/src/cli/agent-settings.ts +101 -0
- package/src/cli/agent.ts +19 -2
- package/src/cli/alias.ts +7 -2
- package/src/cli/aside-profiles.ts +2 -2
- package/src/cli/capabilities-access-remote.ts +147 -0
- package/src/cli/capabilities-accounts.ts +195 -0
- package/src/cli/capabilities-agents-routing.ts +414 -0
- package/src/cli/capabilities-base.ts +783 -0
- package/src/cli/capabilities-command.ts +1 -0
- package/src/cli/capabilities-integrations.ts +264 -0
- package/src/cli/capabilities-lab.ts +214 -0
- package/src/cli/capabilities-observe-system.ts +662 -0
- package/src/cli/capabilities-provider-models.ts +302 -0
- package/src/cli/capabilities.ts +30 -1199
- package/src/cli/capability-types.ts +54 -0
- package/src/cli/catalog-command-result.ts +57 -0
- package/src/cli/chatgpt-command.ts +25 -2
- package/src/cli/claude-agent-startup-sync.ts +17 -0
- package/src/cli/claude-desktop-profile.ts +100 -0
- package/src/cli/claude-desktop.ts +39 -6
- package/src/cli/codex-shim-autorestore.ts +2 -1
- package/src/cli/codex-shim-readiness.ts +23 -3
- package/src/cli/combo-input.ts +88 -0
- package/src/cli/combo-result.ts +52 -0
- package/src/cli/combo-stats.ts +123 -0
- package/src/cli/combo.ts +37 -14
- package/src/cli/companion-timeline.ts +142 -0
- package/src/cli/companion-usage.ts +146 -0
- package/src/cli/companion.ts +12 -3
- package/src/cli/config-command.ts +24 -8
- package/src/cli/dispatch.ts +52 -79
- package/src/cli/doctor.ts +22 -4
- package/src/cli/help-catalog.ts +31 -14
- package/src/cli/help-recovery.ts +2 -2
- package/src/cli/help.ts +25 -11
- package/src/cli/index.ts +38 -27
- package/src/cli/injection-follow.ts +35 -0
- package/src/cli/inspect.ts +5 -0
- package/src/cli/integration-aside-sync.ts +69 -0
- package/src/cli/integration-cursor.ts +106 -0
- package/src/cli/integration-input.ts +60 -0
- package/src/cli/integration-journal.ts +49 -0
- package/src/cli/integration-plan-dto.ts +156 -0
- package/src/cli/integration-preview.ts +215 -0
- package/src/cli/integrations.ts +24 -18
- package/src/cli/json-input.ts +134 -0
- package/src/cli/link.ts +32 -4
- package/src/cli/local-sync-result.ts +41 -0
- package/src/cli/log-follow.ts +84 -0
- package/src/cli/log-view-filter.ts +146 -0
- package/src/cli/logout-command.ts +44 -0
- package/src/cli/model-picker-ordering.ts +137 -0
- package/src/cli/models-custom-input.ts +107 -0
- package/src/cli/models-custom-runtime.ts +112 -0
- package/src/cli/models-order.ts +194 -0
- package/src/cli/models-runtime-subcommands.ts +2 -0
- package/src/cli/models-runtime.ts +7 -0
- package/src/cli/models.ts +66 -81
- package/src/cli/observe-stream.ts +142 -0
- package/src/cli/observe.ts +75 -34
- package/src/cli/provider-batch.ts +77 -0
- package/src/cli/provider-lifecycle-runtime.ts +170 -0
- package/src/cli/provider-result.ts +124 -0
- package/src/cli/provider-runtime.ts +15 -12
- package/src/cli/provider-settings.ts +143 -0
- package/src/cli/provider.ts +112 -34
- package/src/cli/registry.ts +62 -20
- package/src/cli/remote-workspace-hub.ts +83 -0
- package/src/cli/remote-workspace.ts +6 -1
- package/src/cli/restart-failure.ts +27 -0
- package/src/cli/root.ts +12 -0
- package/src/cli/route-policy-write.ts +137 -0
- package/src/cli/route-policy.ts +8 -0
- package/src/cli/runtime-api.ts +56 -79
- package/src/cli/secret-args.ts +149 -0
- package/src/cli/settings-result.ts +30 -0
- package/src/cli/storage.ts +77 -7
- package/src/cli/system-command.ts +60 -2
- package/src/cli/system-restart-client.ts +20 -3
- package/src/cli/system-settings-parity.ts +83 -0
- package/src/cli/update-restart-candidate.ts +21 -0
- package/src/cli/update-restart-child.ts +81 -0
- package/src/cli/update-restart-home.ts +38 -0
- package/src/cli/update-restart-transport.ts +193 -0
- package/src/cli/update-restart.ts +260 -0
- package/src/cli/usage-model-search.ts +58 -0
- package/src/cli/usage-report.ts +13 -5
- package/src/cli/v2-input.ts +66 -0
- package/src/cli/v2-local-output.ts +37 -0
- package/src/cli/v2-runtime.ts +90 -0
- package/src/cli/v2.ts +102 -144
- package/src/clients/config-export/dsh.ts +21 -0
- package/src/clients/config-export.ts +7 -1
- package/src/codex/catalog/build-entries.ts +1 -1
- package/src/codex/catalog/bundled.ts +9 -2
- package/src/codex/catalog/heal-observation.ts +66 -0
- package/src/codex/catalog/publication-observer.ts +19 -0
- package/src/codex/catalog/remote.ts +13 -15
- package/src/codex/catalog/restore.ts +19 -6
- package/src/codex/catalog/retained-sync.ts +58 -10
- package/src/codex/catalog/routed-removal.ts +116 -0
- package/src/codex/catalog/write-audit-contract.ts +21 -0
- package/src/codex/catalog/write-audit.ts +171 -0
- package/src/codex/catalog-self-heal.ts +284 -0
- package/src/codex/catalog-write-serialization.ts +71 -7
- package/src/codex/codex-home-owner.ts +124 -0
- package/src/codex/convergence.ts +55 -15
- package/src/codex/features.ts +8 -1
- package/src/codex/inject/restore.ts +46 -4
- package/src/codex/inject.ts +11 -1
- package/src/codex/internal/catalog-writer.ts +120 -13
- package/src/codex/journal.ts +49 -13
- package/src/codex/management-convergence.ts +3 -0
- package/src/codex/quota-types.ts +3 -0
- package/src/codex/quota.ts +13 -3
- package/src/codex/refresh.ts +20 -9
- package/src/codex/runtime.ts +7 -1
- package/src/codex/shim-diagnostics.ts +80 -0
- package/src/codex/shim-fingerprint.ts +7 -2
- package/src/codex/shim-migration.ts +153 -0
- package/src/codex/shim-overlay.ts +509 -0
- package/src/codex/shim-path-resolution.ts +14 -2
- package/src/codex/shim-probe.ts +4 -3
- package/src/codex/shim-state-file.ts +93 -7
- package/src/codex/shim.ts +15 -68
- package/src/codex/sync.ts +24 -4
- package/src/combos/failover.ts +19 -0
- package/src/combos/index.ts +1 -0
- package/src/combos/resolve.ts +12 -0
- package/src/config/atomic-write.ts +13 -8
- package/src/config/diagnostics.ts +19 -1
- package/src/config/load-degrade.ts +3 -0
- package/src/config/schema/chatgpt-desktop.ts +22 -0
- package/src/config/schema/config-schema.ts +32 -14
- package/src/config/schema/leaf-validators.ts +3 -2
- package/src/generated/compatibility-version.json +445 -129
- package/src/integrations/merge.ts +13 -5
- package/src/integrations/mutation-plan.ts +46 -3
- package/src/integrations/omp-yaml-source.ts +181 -1
- package/src/integrations/ownership-policy.ts +66 -0
- package/src/integrations/registry.ts +50 -1
- package/src/integrations/state.ts +46 -21
- package/src/integrations/target.ts +25 -2
- package/src/integrations/writer.ts +89 -31
- package/src/lib/package-tree-integrity.ts +42 -1
- package/src/lib/proxy-env.ts +3 -0
- package/src/lib/test-home-guard.ts +2 -1
- package/src/oauth/anthropic-account-refusal.ts +19 -8
- package/src/oauth/anthropic-routing.ts +17 -12
- package/src/oauth/anthropic.ts +27 -2
- package/src/oauth/index.ts +6 -8
- package/src/oauth/pool-settings-capability.ts +9 -2
- package/src/protocols/plan-snapshot.ts +1 -1
- package/src/protocols/settings.ts +28 -4
- package/src/server/caller-session-identity.ts +32 -0
- package/src/server/claude-messages.ts +11 -4
- package/src/server/index/serve-options.ts +12 -7
- package/src/server/index.ts +1 -1
- package/src/server/management/agent-settings-routes.ts +6 -5
- package/src/server/management/context.ts +8 -1
- package/src/server/management/cursor-integration-routes.ts +3 -3
- package/src/server/management/integration-routes.ts +5 -5
- package/src/server/management/model-routes.ts +3 -3
- package/src/server/management/native-integration-routes.ts +2 -2
- package/src/server/management/oauth-account-routes.ts +96 -30
- package/src/server/management/route-registry.ts +25 -24
- package/src/server/messages-native-eligibility.ts +3 -6
- package/src/server/messages-native-oauth.ts +82 -35
- package/src/server/messages-native.ts +78 -16
- package/src/server/responses/adapter-dispatch.ts +53 -28
- package/src/server/responses/core-auth.ts +10 -4
- package/src/server/responses/core-combo.ts +46 -6
- package/src/service/cli.ts +6 -1
- package/src/service/ownership-mutation-lease.d.mts +26 -0
- package/src/service/ownership-mutation-lease.mjs +76 -1
- package/src/types/config.ts +2 -0
- package/src/types/provider.ts +10 -10
- package/src/update/index.ts +2 -1
- package/src/update/update-failure-guidance.d.mts +6 -0
- package/src/update/update-failure-guidance.mjs +30 -5
- package/gui/dist/assets/App-COdEeqSj.css +0 -1
- package/gui/dist/assets/App-DEpCJEP_.js +0 -54
- package/gui/dist/assets/index-Cd7ittMv.css +0 -1
- package/gui/dist/assets/index-DwJKFJm5.js +0 -94
- package/gui/dist/assets/quota-summary-DGcEJU3h.js +0 -1
|
@@ -0,0 +1,783 @@
|
|
|
1
|
+
import type { Capability, HeadCapability } from "./capability-types";
|
|
2
|
+
|
|
3
|
+
export const HEAD_CAPABILITIES: readonly HeadCapability[] = [
|
|
4
|
+
{
|
|
5
|
+
invocations: ["--version", "-v", "version"],
|
|
6
|
+
summary: "Print the CLI version and exit.",
|
|
7
|
+
bannerLine: "ocx --version | -v Print version",
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
invocations: ["help", "--help", "-h"],
|
|
11
|
+
summary: "Print the command list, or one command's usage with `ocx help <command>`.",
|
|
12
|
+
bannerLine: "ocx help [command] Show help for a command",
|
|
13
|
+
},
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Capabilities declared so far. Incomplete by design: later phases add verbs.
|
|
18
|
+
* `ocx capabilities` is the index of what is listed here, not of every CLI command.
|
|
19
|
+
* A capability must not name a route the command does not actually fetch.
|
|
20
|
+
*/
|
|
21
|
+
export const CAPABILITIES: readonly Capability[] = [
|
|
22
|
+
{
|
|
23
|
+
command: ["chatgpt"],
|
|
24
|
+
summary: "Experimental ChatGPT app-server shim: launch, restore or status (macOS only).",
|
|
25
|
+
routes: [], flags: [], mutates: true, json: "none",
|
|
26
|
+
bannerLines: ["ocx chatgpt <sub> Experimental app-server shim: launch|restore|status (macOS)"],
|
|
27
|
+
details: ["Default off; launch requires chatgptDesktop.appServerShim: true. Restore removes the generated launcher."],
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
command: ["link","port"],
|
|
31
|
+
summary: "Allocate a free loopback port for a remote home link.",
|
|
32
|
+
routes: [],
|
|
33
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit the selected port as JSON."}],
|
|
34
|
+
mutates: false,
|
|
35
|
+
json: "envelope",
|
|
36
|
+
usage: "ocx link port [--json]",
|
|
37
|
+
details: ["Local temporary loopback socket allocation; no management API request.","Always emits a CLI-shaped {port} JSON object, even without --json."],
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
command: ["link","issue"],
|
|
41
|
+
summary: "Issue one link credential and record its tunnel metadata.",
|
|
42
|
+
routes: [{"method":"POST","path":"/api/link/issue"}],
|
|
43
|
+
flags: [{"name":"--alias","value":"string","required":true,"summary":"SSH host alias for the linked machine."},{"name":"--tunnel-port","value":"number","required":true,"summary":"Remote loopback port for the reverse tunnel."},{"name":"--json","value":"boolean","summary":"Emit the issue result as JSON."}],
|
|
44
|
+
mutates: true,
|
|
45
|
+
json: "payload",
|
|
46
|
+
details: ["Human-only handoff: issues a credential and prints its plaintext once. Never capture it in an agent transcript. Requires loopback admin authority; tunnel port must be 1024-65535."],
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
command: ["link","status"],
|
|
50
|
+
summary: "Read link listener and tunnel status.",
|
|
51
|
+
routes: [{"method":"GET","path":"/api/link/status"}],
|
|
52
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit the K16 status payload as JSON."}],
|
|
53
|
+
mutates: false,
|
|
54
|
+
json: "payload",
|
|
55
|
+
usage: "ocx link status [--json]",
|
|
56
|
+
details: ["Reads live listener/tunnel metadata; when no proxy is found, falls back to the local link store. Always emits JSON."],
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
command: ["link","revoke"],
|
|
60
|
+
summary: "Revoke a link credential and remove its link record.",
|
|
61
|
+
routes: [{"method":"DELETE","path":"/api/link/{id}"}],
|
|
62
|
+
flags: [{"name":"--link-id","value":"string","required":true,"summary":"Link id to revoke."},{"name":"--json","value":"boolean","summary":"Emit the revoked link id as JSON."},{"name":"--force","value":"boolean","summary":"Explicitly skip remote disconnect while retiring the local link; requires --yes."},{"name":"--yes","value":"boolean","summary":"Confirms force only; refused without --force."}],
|
|
63
|
+
mutates: true,
|
|
64
|
+
json: "envelope",
|
|
65
|
+
details: ["Requires a valid link ID and loopback admin authority. Explicit force additionally requires --yes.","Ordinary revoke always emits {linkId} JSON; forced revoke has human output or a JSON cleanup receipt. Already-revoked link_not_found is idempotent success.","Ordinary revoke retains its no-body and idempotent behavior. Forced success reports remoteCleanup:skipped from invocation intent; already-missing link reports unverified. Neither proves the remote client disconnected.","If forced cleanup was needed, run ocx disconnect on the remote client. No new enrollment, SSH trust or credential action is implied."],
|
|
66
|
+
usage: "ocx link revoke --link-id <id> [--force --yes] [--json]",
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
command: ["remote-workspace","pair"],
|
|
70
|
+
summary: "Enroll this executor with one Hub using a one-time code from stdin and locally approved roots.",
|
|
71
|
+
routes: [],
|
|
72
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit the public local executor status."},{"name":"--pairing-code-stdin","value":"boolean","summary":"Read the one-time pairing code from stdin."},{"name":"--root","value":"string","summary":"Approve an absolute workspace directory; repeatable."},{"name":"--toolchain-root","value":"string","summary":"Approve a read-only toolchain directory; repeatable."},{"name":"--executor-helper","value":"string","summary":"Select a reviewed native helper file."},{"name":"--name","value":"string","summary":"Name this executor."}],
|
|
73
|
+
mutates: true,
|
|
74
|
+
json: "payload",
|
|
75
|
+
details: ["Executor-local state/control; no Hub management API routes.","Pairing consumes a human-provided one-time code from stdin and persists enrollment; approved roots and platform confinement determine capabilities."],
|
|
76
|
+
usage: "ocx remote-workspace pair <hub-url> --pairing-code-stdin --root <absolute-path> [--root <absolute-path> ...] [--toolchain-root <absolute-directory> ...] [--executor-helper <absolute-file>] [--name <device-name>] [--json]",
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
command: ["remote-workspace","agent"],
|
|
80
|
+
summary: "Keep the paired executor connected to its Hub.",
|
|
81
|
+
routes: [],
|
|
82
|
+
flags: [],
|
|
83
|
+
mutates: true,
|
|
84
|
+
json: "none",
|
|
85
|
+
details: ["Executor-local state/control; no Hub management API routes.","Maintains the enrolled executor connection to the Hub until interrupted."],
|
|
86
|
+
usage: "ocx remote-workspace agent",
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
command: ["remote-workspace","status"],
|
|
90
|
+
summary: "Read local executor enrollment and available capabilities without printing credentials.",
|
|
91
|
+
routes: [],
|
|
92
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit the public local executor status."}],
|
|
93
|
+
mutates: false,
|
|
94
|
+
json: "payload",
|
|
95
|
+
details: ["Executor-local state/control; no Hub management API routes.","Reports local enrollment and platform/helper capabilities without credentials; not Hub device/runtime/session inventory."],
|
|
96
|
+
usage: "ocx remote-workspace status [--json]",
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
command: ["models","price"],
|
|
100
|
+
summary: "Read the saved manual price for an exact provider/model selector.",
|
|
101
|
+
routes: [{"method":"GET","path":"/api/providers/{provider}/model-costs"}],
|
|
102
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit provider, modelId, and cost (null for automatic pricing)."}],
|
|
103
|
+
mutates: false,
|
|
104
|
+
json: "envelope",
|
|
105
|
+
details: ["The provider must be configured; everything after the first slash is the exact upstream model ID."],
|
|
106
|
+
usage: "ocx models price <provider/model> [--json]",
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
command: ["models","set-price"],
|
|
110
|
+
summary: "Save four manual USD-per-1M-token rates, or restore automatic pricing for one model.",
|
|
111
|
+
routes: [{"method":"PUT","path":"/api/providers/{provider}/model-costs"}],
|
|
112
|
+
flags: [{"name":"--input","value":"number","summary":"Input rate; required unless --auto is used."},{"name":"--output","value":"number","summary":"Output rate; required unless --auto is used."},{"name":"--cache-read","value":"number","summary":"Cache read rate; defaults to 0."},{"name":"--cache-write","value":"number","summary":"Cache write rate; defaults to 0."},{"name":"--auto","value":"boolean","summary":"Remove this model's override; cannot be combined with rates."},{"name":"--json","value":"boolean","summary":"Emit the saved price or reset result as JSON."}],
|
|
113
|
+
mutates: true,
|
|
114
|
+
json: "envelope",
|
|
115
|
+
details: ["Uses the exact upstream model ID after the first slash. Omitted cache rates default to zero; sibling model prices are preserved."],
|
|
116
|
+
usage: "ocx models set-price <provider/model> (--input <N> --output <N> [--cache-read <N>] [--cache-write <N>]|--auto) [--json]",
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
command: ["models","set"],
|
|
120
|
+
summary: "Save per-model overrides for a routed model, or clear them back to the computed values.",
|
|
121
|
+
routes: [{"method":"PUT","path":"/api/model-settings"}],
|
|
122
|
+
flags: [{"name":"--context-window","value":"string","summary":"Context window in tokens; 0 or - clears the override."},{"name":"--modalities","value":"string","summary":"Comma-separated text,image,audio; - clears the override."},{"name":"--reasoning-efforts","value":"string","summary":"Comma-separated ladder; \"\" for no reasoning, - to inherit."},{"name":"--default-reasoning-effort","value":"string","summary":"Ladder member a request inherits when it omits one; - to inherit."},{"name":"--reset","value":"boolean","summary":"Clear every override on this model; cannot be combined with the options above."},{"name":"--json","value":"boolean","summary":"Emit the saved state as JSON."}],
|
|
123
|
+
mutates: true,
|
|
124
|
+
json: "envelope",
|
|
125
|
+
details: ["Only routed provider/model selectors are supported. At least one option or --reset is required.","Context 0 or - and modalities/default effort - clear to null; reasoning efforts - restores inheritance while an empty string stores an empty ladder.","--reset clears all four overrides with null and cannot be combined with other settings. A saved-but-catalog-refresh-failed receipt must not be mistaken for an unsaved change."],
|
|
126
|
+
usage: "ocx models set <provider/model> [--context-window <tokens|0|->] [--modalities <text,image,audio|->] [--reasoning-efforts <levels|->] [--default-reasoning-effort <level|->] [--reset] [--json]",
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
command: ["status"],
|
|
130
|
+
summary: "Proxy status, injection state, and version skew between this CLI and the running proxy.",
|
|
131
|
+
// No management route: `collectStatus` identity-probes `/healthz` through
|
|
132
|
+
// `findLiveProxy` and reads local config. Declaring `GET /api/status` here was wrong
|
|
133
|
+
// -- that route does not exist, and the registry cross-check caught it.
|
|
134
|
+
routes: [],
|
|
135
|
+
flags: [{ name: "--json", value: "boolean", summary: "Emit the status envelope as JSON." }],
|
|
136
|
+
mutates: false,
|
|
137
|
+
json: "envelope",
|
|
138
|
+
details: ["Reads /healthz plus local config; drives no management API route."],
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
command: ["resolve"],
|
|
142
|
+
summary: "One JSON document naming the config home, the effective port, and the identity-checked proxy liveness verdict.",
|
|
143
|
+
// No management route, same split as status: discovery is the identity-checked
|
|
144
|
+
// /healthz probe inside findLiveProxy plus local config and the home from
|
|
145
|
+
// src/config/paths.ts.
|
|
146
|
+
routes: [],
|
|
147
|
+
flags: [{ name: "--json", value: "boolean", summary: "Emit the resolve document as JSON (the shell contract)." }],
|
|
148
|
+
mutates: false,
|
|
149
|
+
json: "envelope",
|
|
150
|
+
details: [
|
|
151
|
+
"Exit 0 carries a trustworthy verdict (live or proven absent); exit 1 means the CLI could not resolve and a caller must refuse to guess — unknown liveness never reads as absent.",
|
|
152
|
+
"Built for embedding shells (desktop app): the liveness budgets stay owned by src/server/proxy-liveness.ts.",
|
|
153
|
+
],
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
command: ["hub","invite"],
|
|
157
|
+
summary: "Mint a single-use pairing code on a hub and print the exact `ocx connect` line for one more machine.",
|
|
158
|
+
routes: [],
|
|
159
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit code, expiresAt, dataUrl, managementUrl, and command."},{"name":"--data-url","value":"string","summary":"Advertise this data origin instead of hub.dataPublicOrigin or the bind address."},{"name":"--management-url","value":"string","summary":"Confirm the management origin; it must equal hub.managementPublicOrigin."},{"name":"--clients","value":"string","summary":"Pre-select codex and/or claude in the printed connect command."}],
|
|
160
|
+
mutates: true,
|
|
161
|
+
json: "envelope",
|
|
162
|
+
details: ["Hub only: refuses when runtimeRole is not hub, and requires a running attested proxy.","The code is secret, single-use and short-lived; it is bound to hub.managementPublicOrigin and to the connecting machine's loopback browser origin.","The bound browser origin is always printed; when it is not http://localhost:10100 the warning names the port the connecting machine must use.","Refuses when the advertised data origin would be loopback (a loopback or wildcard bind with no hub.dataPublicOrigin and no --data-url) rather than printing a line that dials the other machine itself.","Prints no data-plane token. Remote machines receive their own revocable per-client key from the exchange.","Mints through the attested local pairing-grant route, the same one ocx gui pair uses; no admin token is read."],
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
command: ["connect", "rotate"],
|
|
166
|
+
summary: "Rotate the connected client's data key against the hub, with commit and abort.",
|
|
167
|
+
// One command drives all three: start returns the new secret once, commit promotes it,
|
|
168
|
+
// and abort unwinds a rotation that could not be confirmed. They are not separate verbs
|
|
169
|
+
// because a half-rotation is not a state an operator should be able to leave behind.
|
|
170
|
+
routes: [
|
|
171
|
+
{ method: "POST", path: "/api/keys/rotate" },
|
|
172
|
+
{ method: "POST", path: "/api/keys/rotate/commit" },
|
|
173
|
+
{ method: "DELETE", path: "/api/keys/rotate" },
|
|
174
|
+
],
|
|
175
|
+
flags: [
|
|
176
|
+
{ name: "--pairing-code-stdin", value: "boolean", summary: "Read a one-time pairing code from stdin as the rotation authority." },
|
|
177
|
+
{ name: "--admin-token-stdin", value: "boolean", summary: "Read the hub admin token from stdin as the rotation authority." },
|
|
178
|
+
{ name: "--json", value: "boolean", summary: "Emit the rotation result as JSON." },
|
|
179
|
+
],
|
|
180
|
+
mutates: true,
|
|
181
|
+
json: "payload",
|
|
182
|
+
details: [
|
|
183
|
+
"Requires transient authority on stdin; the credential is never persisted or echoed.",
|
|
184
|
+
"A rotation left pending by a crash is resumed here — startup and status stop rather than guess which key generation is live.",
|
|
185
|
+
],
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
command: ["capabilities"],
|
|
189
|
+
summary: "List the declared CLI capabilities and the management routes they drive.",
|
|
190
|
+
routes: [],
|
|
191
|
+
flags: [
|
|
192
|
+
{ name: "--json", value: "boolean", summary: "Emit the full capability table as JSON." },
|
|
193
|
+
{ name: "--mutating-only", value: "boolean", summary: "Restrict output to capabilities that mutate state." },
|
|
194
|
+
{ name: "--route", value: "string", summary: "Show which capabilities drive a management route." },
|
|
195
|
+
],
|
|
196
|
+
mutates: false,
|
|
197
|
+
json: "envelope",
|
|
198
|
+
details: ["Start here when driving ocx programmatically: it is the declared surface index, not a complete verb list."],
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
command: ["provider","list"],
|
|
202
|
+
summary: "Configured providers with connectivity and selected models.",
|
|
203
|
+
routes: [],
|
|
204
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit the provider list as JSON."},{"name":"--jsonl","value":"boolean","summary":"Emit one configured provider per JSON line."}],
|
|
205
|
+
mutates: false,
|
|
206
|
+
json: "envelope",
|
|
207
|
+
details: ["Local config and registry read, not GET /api/providers. --json and --jsonl are mutually exclusive."],
|
|
208
|
+
usage: "ocx provider list [--json|--jsonl]",
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
command: ["provider","resets"],
|
|
212
|
+
summary: "Recently detected quota resets and whether reset notifications are enabled.",
|
|
213
|
+
routes: [{"method":"GET","path":"/api/quota-resets"}],
|
|
214
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit reset events as JSON."},{"name":"--limit","value":"number","summary":"Limit returned events; defaults to 20, capped at 100."}],
|
|
215
|
+
mutates: false,
|
|
216
|
+
json: "payload",
|
|
217
|
+
usage: "ocx provider resets [--limit <n>] [--json]",
|
|
218
|
+
details: [],
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
command: ["provider","keychain"],
|
|
222
|
+
summary: "Move a provider's API key into the OS keychain, restore it, or report where it lives.",
|
|
223
|
+
routes: [{"method":"GET","path":"/api/providers/keychain"},{"method":"POST","path":"/api/providers/keychain"}],
|
|
224
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit the keychain status or result as JSON."}],
|
|
225
|
+
mutates: true,
|
|
226
|
+
json: "payload",
|
|
227
|
+
details: ["status reads by provider name; store/restore POST {name,action}. These move an existing secret between config and OS keychain; keep credential material out of transcripts."],
|
|
228
|
+
usage: "ocx provider keychain <name> [status|store|restore] [--json]",
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
command: ["companion"],
|
|
232
|
+
summary: "Inspect companion settings, filtered usage and timeline, and configure preferences.",
|
|
233
|
+
routes: [{"method":"GET","path":"/api/companion/settings"},{"method":"PUT","path":"/api/companion/settings"}],
|
|
234
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit companion settings as JSON."}],
|
|
235
|
+
mutates: true,
|
|
236
|
+
json: "payload",
|
|
237
|
+
details: ["show/default reads settings; set key=value and reset write settings. Values parse as JSON when valid.","usage reads today and 30-day totals using saved display filters; partial range failure returns exit1 and keeps available results.","timeline is a separate read of the usage timeline with explicit model selection/provider exclusion and completeness metadata; it does not change settings."],
|
|
238
|
+
usage: "ocx companion show [--json] | ocx companion set <key>=<value> [...] [--json] | ocx companion reset [--json]",
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
command: ["account","login"],
|
|
242
|
+
summary: "Log in to an OAuth provider; Kiro can add a native device account.",
|
|
243
|
+
routes: [{"method":"POST","path":"/api/oauth/login"},{"method":"GET","path":"/api/oauth/status"},{"method":"POST","path":"/api/oauth/login/code"},{"method":"POST","path":"/api/codex-auth/login"},{"method":"GET","path":"/api/codex-auth/login-status"},{"method":"POST","path":"/api/codex-auth/login/code"}],
|
|
244
|
+
flags: [{"name":"--id","value":"string","summary":"Account ID; provider OAuth requires --reauth when supplied."},{"name":"--reauth","value":"boolean","summary":"Reauthenticate an existing account."},{"name":"--device","value":"boolean","summary":"Codex device flow; accepted for already-device-native kimi, nous and github-copilot."},{"name":"--method","value":"string","summary":"Kiro only: builder-id, google or github; add-only and incompatible with --reauth, --id, --device or --code."},{"name":"--code","value":"string","summary":"Use - to read authorization material from stdin."},{"name":"--no-wait","value":"boolean","summary":"Return after flow start."},{"name":"--json","value":"boolean","summary":"Emit the command result as JSON."},{"name":"--open-browser","value":"string","summary":"on or off for browser-capable login; rejected for explicit/native device flows."},{"name":"--add-account","value":"string","summary":"Fresh generic OAuth login only: on forces a fresh flow, off permits existing import preference. Not supported with reauth/Codex/Kiro method."}],
|
|
245
|
+
mutates: true,
|
|
246
|
+
json: "payload",
|
|
247
|
+
usage: "ocx account login <provider> [--id <account-id>] [--reauth] [--device] [--method <builder-id|google|github>] [--code -] [--no-wait] [--open-browser <on|off>] [--add-account <on|off>] [--json]",
|
|
248
|
+
details: ["openai, codex and chatgpt address the Codex pool. Native main uses the separate account main reauth flow.","Login is a human authorization handoff. Codes, verification material and credentials must not be copied into agent transcripts. Legacy argv code input warns about exposure; use stdin.","No --live flag is implemented. Provider OAuth --id requires --reauth; --method is Kiro add-only.","Omitted options preserve each flow's existing defaults. Explicit browser flags are refused for Codex device, known native-device providers and native Kiro method; add-account is refused for reauth/Codex/Kiro method.","Start/code/poll are pinned; human verification remains required. Only public handoff/flow/state fields are printed. Completed-but-validation/catalog-pending outcomes remain visible and nonzero."],
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
command: ["account","history"],
|
|
252
|
+
summary: "Cached quota observations for one stored Codex pool account.",
|
|
253
|
+
routes: [{"method":"GET","path":"/api/codex-auth/quota/history"}],
|
|
254
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit the bounded observation history."},{"name":"--limit","value":"number","summary":"Return the newest 1 to 200 observations."}],
|
|
255
|
+
mutates: false,
|
|
256
|
+
json: "payload",
|
|
257
|
+
details: ["Use account history openai <pool-account-id>. Reads cached observations only; no refresh or warmup. Native main is not included."],
|
|
258
|
+
usage: "ocx account history openai <pool-account-id> [--limit <1-200>] [--json]",
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
command: ["account","main","reauth"],
|
|
262
|
+
summary: "Reauthenticate the native main Codex login with a device code (#3898); headless hubs need no Codex App or keyring.",
|
|
263
|
+
routes: [{"method":"POST","path":"/api/codex-auth/main/reauth-device"},{"method":"GET","path":"/api/codex-auth/main/reauth-device"},{"method":"DELETE","path":"/api/codex-auth/main/reauth-device"}],
|
|
264
|
+
flags: [{"name":"--device","value":"boolean","summary":"Run the device-code flow (the only reauth mode)."},{"name":"--no-wait","value":"boolean","summary":"Print the flow handle and code without waiting for completion."},{"name":"--flow","value":"string","summary":"Flow id for status and cancel."},{"name":"--json","value":"boolean","summary":"Emit the flow status as JSON."}],
|
|
265
|
+
mutates: true,
|
|
266
|
+
json: "payload",
|
|
267
|
+
details: ["Same-identity native main device reauthentication; pool login endpoints are separate. Human authorization is required and credentials are never printed.","Start requires --device; --no-wait returns a flow handle. Follow with account main reauth status --flow <id> or account main reauth cancel --flow <id>. Status/cancel require --flow and reject --device/--no-wait.","Returned verification URLs and device codes are human handoff material; keep them out of agent transcripts."],
|
|
268
|
+
usage: "ocx account main reauth --device [--no-wait] [--json]",
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
command: ["account","list"],
|
|
272
|
+
summary: "List live Codex, OAuth and API-key accounts with optional quota observations.",
|
|
273
|
+
routes: [{"method":"GET","path":"/api/oauth/providers"},{"method":"GET","path":"/api/codex-auth/accounts"},{"method":"GET","path":"/api/codex-auth/active"},{"method":"GET","path":"/api/oauth/accounts"},{"method":"GET","path":"/api/providers/keys"}],
|
|
274
|
+
flags: [{"name":"--all","value":"boolean","summary":"Include notes for providers with no stored accounts."},{"name":"--quota","value":"boolean","summary":"Include quota observations; OAuth and supported API-key providers may probe upstream."},{"name":"--refresh","value":"boolean","summary":"With --quota, bypass quota cache; otherwise has no effect."},{"name":"--json","value":"boolean","summary":"Emit the command result as JSON."}],
|
|
275
|
+
mutates: false,
|
|
276
|
+
json: "envelope",
|
|
277
|
+
details: ["Omitting provider discovers OAuth providers and includes configured families. JSON is {accounts,notes}, not a raw server account array.","Default listing is observational. --quota can probe provider quotas; --refresh is only acted on together with --quota. A refresh observation is not pending-account validation consent."],
|
|
278
|
+
usage: "ocx account list [provider] [--all] [--quota [--refresh]] [--json]",
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
command: ["account","import-orca"],
|
|
282
|
+
summary: "Preview or register read-only links to Orca-managed Codex accounts without another login.",
|
|
283
|
+
routes: [],
|
|
284
|
+
flags: [{"name":"--source","value":"string","required":true,"summary":"Orca data directory containing codex-accounts."},{"name":"--registry","value":"string","required":true,"summary":"The chosen Orca profile's orca-data.json account registry."},{"name":"--apply","value":"boolean","summary":"Register new accounts; requires a stopped proxy. Default is preview."},{"name":"--json","value":"boolean","summary":"Emit counts and fixed invalid-reason codes without credentials or source paths."}],
|
|
285
|
+
mutates: true,
|
|
286
|
+
json: "envelope",
|
|
287
|
+
details: ["Local files only; never copies refresh tokens or changes Orca authentication files.","Skips existing ChatGPT identities. New accounts remain pending until dashboard validation.","Orca must keep the source login available and refreshed; a missing or expired source fails closed.","Mixed eligible and invalid entries exit successfully; an all-invalid result exits nonzero."],
|
|
288
|
+
usage: "ocx account import-orca --source <orca-data-directory> --registry <orca-data.json> [--apply] [--json]",
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
command: ["account","refresh"],
|
|
292
|
+
summary: "Refresh account quotas without model validation; pending Codex accounts require dashboard consent.",
|
|
293
|
+
routes: [{"method":"POST","path":"/api/codex-auth/accounts/refresh"},{"method":"GET","path":"/api/codex-auth/active"},{"method":"GET","path":"/api/provider-quotas"}],
|
|
294
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit the refresh result as JSON."}],
|
|
295
|
+
mutates: true,
|
|
296
|
+
json: "envelope",
|
|
297
|
+
details: ["CLI/admin-token refreshes only observe usage. After quota recovery, a human must click Refresh quotas in the dashboard to authorize model validation. Do not mint a GUI session to work around this consent boundary."],
|
|
298
|
+
usage: "ocx account refresh <provider> [--json]",
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
command: ["account","grok-reset-coupons"],
|
|
302
|
+
summary: "Inspect or redeem Grok billing reset coupons; redemption is journaled and idempotent.",
|
|
303
|
+
routes: [{"method":"GET","path":"/api/grok/reset-coupons"},{"method":"POST","path":"/api/grok/reset-coupons/consume"}],
|
|
304
|
+
flags: [{"name":"--consume","value":"boolean","summary":"Redeem one reset coupon; requires --yes."},{"name":"--yes","value":"boolean","summary":"Explicit confirmation required by --consume."},{"name":"--token-id","value":"string","summary":"Redeem a specific reset token instead of the default selection."},{"name":"--operation-id","value":"string","summary":"UUIDv4 making a redemption idempotent: retries replay the journaled outcome."},{"name":"--json","value":"boolean","summary":"Emit the coupon list or redemption result as JSON."}],
|
|
305
|
+
mutates: true,
|
|
306
|
+
json: "payload",
|
|
307
|
+
details: ["Without --consume this is a read: remaining coupons and their validity windows.","The operation is journaled before the upstream call, so retrying the same --operation-id replays the recorded outcome instead of spending a second coupon."],
|
|
308
|
+
usage: "ocx account grok-reset-coupons [account-id] [--consume --yes [--token-id <token-id>] [--operation-id <uuid>]] [--json]",
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
command: ["usage"],
|
|
312
|
+
summary: "Token and estimated-cost report over a time range.",
|
|
313
|
+
routes: [{"method":"GET","path":"/api/usage"}],
|
|
314
|
+
flags: [{"name":"--range","value":"string","summary":"today | 1d | 7d | 30d | all; default 30d."},{"name":"--surface","value":"string","summary":"all | codex | claude | grok; default all."},{"name":"--since","value":"string","summary":"Inclusive epoch milliseconds or ISO datetime with timezone; requires --until."},{"name":"--until","value":"string","summary":"Inclusive end; requires --since. Custom bounds override --range."},{"name":"--provider","value":"string","summary":"Filter provider."},{"name":"--model","value":"string","summary":"Filter model."},{"name":"--json","value":"boolean","summary":"Emit the result as JSON."},{"name":"--api-key-id","value":"string","summary":"Exact nonblank management key scope; connected clients refuse this before reading their enrolled key."},{"name":"--search","value":"string","summary":"Model-row substring view over model/provider/resolvedModel; top100 by tokens. Whole-report totals stay unchanged."}],
|
|
315
|
+
mutates: false,
|
|
316
|
+
json: "payload",
|
|
317
|
+
details: ["Alias of observe usage. Connected clients read only their enrolled-key Hub report through /v1/usage; caller --api-key-id is refused before key read/transport and never grants management authority.","Nonclient --api-key-id uses /api/usage and requires matching filter acknowledgment. An unknown acknowledged key is empty/matched:false, not404. Custom-window acknowledgment remains required.","--search filters only returned model rows after scope acknowledgment. Blank search selects the top100 model rows; modelView reports match/return counts without recomputing totals."],
|
|
318
|
+
usage: "ocx usage [--range <today|1d|7d|30d|all>] [--surface <all|codex|claude|grok>] [--since <epoch-ms|ISO-datetime>] [--until <epoch-ms|ISO-datetime>] [--provider <name>] [--model <id>] [--api-key-id <id>] [--search <text>] [--json]",
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
command: ["account","pause"],
|
|
322
|
+
summary: "Exclude one account in a Codex, Anthropic or supported generic OAuth pool from automatic selection.",
|
|
323
|
+
routes: [{"method":"GET","path":"/api/codex-auth/accounts"},{"method":"PUT","path":"/api/codex-auth/accounts/pause"},{"method":"GET","path":"/api/oauth/accounts"},{"method":"PUT","path":"/api/oauth/accounts/pause"}],
|
|
324
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit the pause result as JSON."}],
|
|
325
|
+
mutates: true,
|
|
326
|
+
json: "envelope",
|
|
327
|
+
details: ["Codex pause unbinds pinned threads and selects a fallback when possible; with no fallback, a paused-but-selected Codex account still receives requests. Anthropic and generic OAuth pause exclude the account from new requests, failover and refresh, and an all-paused pool answers 403. Credentials and health are preserved; already-sent turns are not cancelled."],
|
|
328
|
+
usage: "ocx account pause <provider> <account-id|alias|main> [--json]",
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
command: ["account","resume"],
|
|
332
|
+
summary: "Return a paused account to a Codex, Anthropic or supported generic OAuth pool.",
|
|
333
|
+
routes: [{"method":"GET","path":"/api/codex-auth/accounts"},{"method":"PUT","path":"/api/codex-auth/accounts/pause"},{"method":"GET","path":"/api/oauth/accounts"},{"method":"PUT","path":"/api/oauth/accounts/pause"}],
|
|
334
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit the resume result as JSON."}],
|
|
335
|
+
mutates: true,
|
|
336
|
+
json: "envelope",
|
|
337
|
+
usage: "ocx account resume <provider> <account-id|alias|main> [--json]",
|
|
338
|
+
details: [],
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
command: ["account","pause-exhausted"],
|
|
342
|
+
summary: "Pause every Codex account whose quota is spent.",
|
|
343
|
+
routes: [{"method":"PUT","path":"/api/codex-auth/accounts/pause-exhausted"}],
|
|
344
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit paused ids and the checked/failed counts as JSON."}],
|
|
345
|
+
mutates: true,
|
|
346
|
+
json: "envelope",
|
|
347
|
+
details: ["Only Codex account pools are supported. Refreshes quota and may partially fail; nonzero failedAccountCount exits 1 and sets ok:false."],
|
|
348
|
+
usage: "ocx account pause-exhausted <provider> [--json]",
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
command: ["account","strategy"],
|
|
352
|
+
summary: "Show or set how an account pool picks the next account.",
|
|
353
|
+
routes: [{"method":"GET","path":"/api/pool/settings"},{"method":"PUT","path":"/api/pool/settings"}],
|
|
354
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit the applied strategy and sticky limit as JSON."}],
|
|
355
|
+
mutates: true,
|
|
356
|
+
json: "envelope",
|
|
357
|
+
details: ["A bare invocation reads and never writes.","The APPLIED value is echoed, not the requested one, so a server-side normalization stays visible.","Values are not re-validated in the CLI: the server owns the strategy names and the 1-100 sticky bound.","One route answers for every pool kind and declares which fields that kind honours in `supported`, so an unsupported field is a stated null rather than an absence. `anthropic` alone carries `quotaWindow`. Generic-provider settings steer selection only while `pool.kernel` is on. The legacy per-pool paths still work and are unchanged."],
|
|
358
|
+
usage: "ocx account strategy <provider> [quota|round-robin|fill-first|least-loaded|reset-first] [--json]",
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
command: ["account","sticky"],
|
|
362
|
+
summary: "Show or set how many consecutive requests stay on one account.",
|
|
363
|
+
routes: [{"method":"GET","path":"/api/pool/settings"},{"method":"PUT","path":"/api/pool/settings"}],
|
|
364
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit the applied strategy and sticky limit as JSON."}],
|
|
365
|
+
mutates: true,
|
|
366
|
+
json: "envelope",
|
|
367
|
+
details: ["Only meaningful under the sticky-capable strategies; the pool strategy is the other half of this setting."],
|
|
368
|
+
usage: "ocx account sticky <provider> [1-100] [--json]",
|
|
369
|
+
},
|
|
370
|
+
{
|
|
371
|
+
command: ["account","routes"],
|
|
372
|
+
summary: "Read, replace, or clear Anthropic OAuth model account routes.",
|
|
373
|
+
routes: [{"method":"GET","path":"/api/pool/settings"},{"method":"PUT","path":"/api/pool/settings"}],
|
|
374
|
+
flags: [{"name":"--file","value":"string","summary":"Read a bounded JSON route array from a local file."},{"name":"--clear","value":"boolean","summary":"Remove the stored routes."},{"name":"--json","value":"boolean","summary":"Emit the unified settings response as JSON."}],
|
|
375
|
+
mutates: true,
|
|
376
|
+
json: "payload",
|
|
377
|
+
details: ["Only anthropic is supported. Omitted --file/--clear reads. --clear sends routes:null; file and clear are mutually exclusive. The local JSON file must be a regular file of at most 64 KiB; the server validates its route array."],
|
|
378
|
+
usage: "ocx account routes anthropic [--file <json-file>|--clear] [--json]",
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
command: ["account","auto-switch"],
|
|
382
|
+
summary: "Show or set the usage percentage at which a pool moves to another account.",
|
|
383
|
+
routes: [{"method":"GET","path":"/api/codex-auth/active"},{"method":"PUT","path":"/api/codex-auth/auto-switch"},{"method":"GET","path":"/api/oauth/accounts/pool"},{"method":"PUT","path":"/api/oauth/accounts/pool"},{"method":"GET","path":"/api/oauth/accounts"},{"method":"PUT","path":"/api/oauth/accounts/auto-switch"},{"method":"GET","path":"/api/codex-auth/accounts"}],
|
|
384
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit the stored threshold and whether it is applied."},{"name":"--account","value":"string","summary":"Per-account scope for openai or anthropic; openai resolves main/exact ID/unambiguous alias from the selected runtime."}],
|
|
385
|
+
mutates: true,
|
|
386
|
+
json: "envelope",
|
|
387
|
+
details: ["Without --account the existing pool-wide operation remains. OpenAI per-account status reads override plus effective threshold; on writes80, off0, inherit null, threshold a validated0–100 integer.","New OpenAI policy writes require successful unambiguous roster evidence and never fall back to a raw unresolved selector. These are routing thresholds, not pool enablement or paid-credit permission."],
|
|
388
|
+
usage: "ocx account auto-switch <provider> <status|on|off|threshold <0-100>|inherit> [--account <id>] [--json]",
|
|
389
|
+
},
|
|
390
|
+
{
|
|
391
|
+
command: ["logs"],
|
|
392
|
+
summary: "Recent request log rows, filterable by provider, model, conversation, account, and status.",
|
|
393
|
+
routes: [{"method":"GET","path":"/api/logs"}],
|
|
394
|
+
flags: [{"name":"--provider","value":"string","summary":"Filter provider, including failover attempts."},{"name":"--model","value":"string","summary":"Filter model, including failover attempts."},{"name":"--status","value":"string","summary":"Filter status code."},{"name":"--conversation","value":"string","summary":"Filter conversation ID."},{"name":"--conversationId","value":"string","summary":"Alias of --conversation."},{"name":"--account","value":"string","summary":"Filter stable account log label."},{"name":"--limit","value":"number","summary":"Positive row limit; default 200."},{"name":"--follow","value":"boolean","summary":"Poll for new rows; add --jsonl to emit JSONL."},{"name":"-f","value":"boolean","summary":"Alias of --follow."},{"name":"--json","value":"boolean","summary":"Emit the result as JSON."},{"name":"--jsonl","value":"boolean","summary":"Emit one row per JSON line; exclusive with --json."},{"name":"--events","value":"boolean","summary":"Versioned snapshot/append JSONL; requires --follow, conflicts with --json. Redundant --jsonl is accepted."}],
|
|
395
|
+
mutates: false,
|
|
396
|
+
json: "payload",
|
|
397
|
+
details: ["Follow uses the server cursor and a bounded ordered window, preserving same-ID amendments and repeated row occurrences. It never enables logging.","--events emits version1 snapshots/appends with cursor and limit for observed-window reconstruction. Legacy row JSONL cannot express removals or resets exactly; neither mode promises lossless history between polls.","Follow limit is1–2000, default200. Polling is serial and cancellable; SIGINT exits130 and SIGTERM143. Malformed/oversized/unavailable responses stop without a fabricated empty snapshot or retry.","Nested explain reads recorded decisions; rebuild-index and index-status touch the local derived index and retain separate declarations."],
|
|
398
|
+
usage: "ocx logs [--provider <name>] [--model <id>] [--status <code>] [--conversation <id>] [--account <label>] [--limit <n>] [--follow] [--json|--jsonl]; ocx logs --follow --events [--limit <1-2000>]",
|
|
399
|
+
},
|
|
400
|
+
{
|
|
401
|
+
command: ["storage","report"],
|
|
402
|
+
summary: "Disk usage under CODEX_HOME, with the log-guard protection report.",
|
|
403
|
+
routes: [{"method":"GET","path":"/api/storage"}],
|
|
404
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit the storage report as JSON."}],
|
|
405
|
+
mutates: false,
|
|
406
|
+
json: "payload",
|
|
407
|
+
bannerLines: ["ocx storage Storage report (default subcommand)"],
|
|
408
|
+
usage: "ocx storage report [--json]",
|
|
409
|
+
details: [],
|
|
410
|
+
},
|
|
411
|
+
{
|
|
412
|
+
command: ["storage","cleanup"],
|
|
413
|
+
summary: "Preview or delete the oldest archived sessions by percentage.",
|
|
414
|
+
routes: [{"method":"POST","path":"/api/storage/cleanup/preview"},{"method":"POST","path":"/api/storage/cleanup"}],
|
|
415
|
+
flags: [{"name":"--percent","value":"number","summary":"Portion of the oldest archived sessions to target (0-100)."},{"name":"--mode","value":"string","summary":"quarantine (recoverable from trash) or permanent."},{"name":"--yes","value":"boolean","summary":"Required to actually delete; without it this is a preview."},{"name":"--json","value":"boolean","summary":"Emit the preview or result as JSON."}],
|
|
416
|
+
mutates: true,
|
|
417
|
+
json: "payload",
|
|
418
|
+
details: ["Without `--yes` it prints what WOULD be freed and exits 0 having changed nothing.","There is no interactive confirmation: a prompt an agent can answer is not a safety boundary.","`--mode quarantine` moves files to trash, so `storage trash restore` can undo it; `permanent` cannot be undone."],
|
|
419
|
+
usage: "ocx storage cleanup --percent <0-100> [--mode <quarantine|permanent>] [--yes] [--json]",
|
|
420
|
+
},
|
|
421
|
+
{
|
|
422
|
+
command: ["storage","trash"],
|
|
423
|
+
summary: "List quarantined cleanup batches, or restore one.",
|
|
424
|
+
routes: [{"method":"GET","path":"/api/storage/trash"},{"method":"POST","path":"/api/storage/trash/restore"}],
|
|
425
|
+
flags: [{"name":"--yes","value":"boolean","summary":"Required for restore, which moves files and reconciles database rows."},{"name":"--json","value":"boolean","summary":"Emit the trash list or restore result as JSON."}],
|
|
426
|
+
mutates: true,
|
|
427
|
+
json: "payload",
|
|
428
|
+
details: ["Restore fails with a named 409 when the destination already exists, rather than overwriting it.","Mixed family: list/default reads quarantine batches; restore moves files and reconciles database rows only with --yes."],
|
|
429
|
+
usage: "ocx storage trash [list] [--json] | ocx storage trash restore <entry-id> --yes [--json]",
|
|
430
|
+
},
|
|
431
|
+
{
|
|
432
|
+
command: ["storage","policy"],
|
|
433
|
+
summary: "Show, change, or run the automatic archived-session cleanup policy.",
|
|
434
|
+
routes: [{"method":"GET","path":"/api/storage/cleanup-policy"},{"method":"PUT","path":"/api/storage/cleanup-policy"},{"method":"POST","path":"/api/storage/cleanup-policy/run"}],
|
|
435
|
+
flags: [{"name":"--enabled","value":"string","summary":"true or false."},{"name":"--percent","value":"number","summary":"Portion of oldest archived sessions each run targets."},{"name":"--mode","value":"string","summary":"quarantine or permanent."},{"name":"--schedule","value":"string","summary":"startup, daily, weekly, or manual."},{"name":"--yes","value":"boolean","summary":"Required for `policy run`, which deletes immediately."},{"name":"--json","value":"boolean","summary":"Emit the policy or run state as JSON."}],
|
|
436
|
+
mutates: true,
|
|
437
|
+
json: "payload",
|
|
438
|
+
details: ["`policy set` never enables implicitly: omitting `--enabled` keeps the stored value.","`policy run` forces a run regardless of schedule, so it needs `--yes`.","Mixed family: show/default reads; set persists submitted fields; run requires --yes and starts immediate cleanup. At least one setting is required by set."],
|
|
439
|
+
usage: "ocx storage policy [show] [--json] | ocx storage policy set [--enabled <true|false>] [--percent <1-100>] [--mode <quarantine|permanent>] [--schedule <startup|daily|weekly|manual>] [--json] | ocx storage policy run --yes [--json]",
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
command: ["inspect", "config"],
|
|
443
|
+
summary: "The effective merged configuration the proxy is running.",
|
|
444
|
+
routes: [{ method: "GET", path: "/api/config" }],
|
|
445
|
+
flags: [{ name: "--json", value: "boolean", summary: "Emit the config as JSON." }],
|
|
446
|
+
mutates: false,
|
|
447
|
+
json: "payload",
|
|
448
|
+
},
|
|
449
|
+
{
|
|
450
|
+
command: ["inspect", "catalog"],
|
|
451
|
+
summary: "The generated model catalog served to clients.",
|
|
452
|
+
routes: [{ method: "GET", path: "/api/catalog" }],
|
|
453
|
+
flags: [{ name: "--json", value: "boolean", summary: "Emit the catalog as JSON." }],
|
|
454
|
+
mutates: false,
|
|
455
|
+
json: "payload",
|
|
456
|
+
},
|
|
457
|
+
{
|
|
458
|
+
command: ["inspect", "routing-analytics"],
|
|
459
|
+
summary: "Aggregate routing outcomes per provider and model.",
|
|
460
|
+
routes: [{ method: "GET", path: "/api/routing-analytics" }],
|
|
461
|
+
flags: [{ name: "--json", value: "boolean", summary: "Emit the analytics payload as JSON." }],
|
|
462
|
+
mutates: false,
|
|
463
|
+
json: "payload",
|
|
464
|
+
},
|
|
465
|
+
{
|
|
466
|
+
command: ["inspect", "pacing"],
|
|
467
|
+
summary: "Request-pacing state for one provider or all of them.",
|
|
468
|
+
routes: [{ method: "GET", path: "/api/provider-request-pacing" }],
|
|
469
|
+
flags: [
|
|
470
|
+
{ name: "--name", value: "string", summary: "Restrict to one provider; omitted means every provider." },
|
|
471
|
+
{ name: "--json", value: "boolean", summary: "Emit the pacing state as JSON." },
|
|
472
|
+
],
|
|
473
|
+
mutates: false,
|
|
474
|
+
json: "payload",
|
|
475
|
+
details: ["An unknown provider name is a 404 rather than an empty result."],
|
|
476
|
+
},
|
|
477
|
+
{
|
|
478
|
+
command: ["inspect", "key-providers"],
|
|
479
|
+
summary: "Providers that authenticate with an API key rather than OAuth.",
|
|
480
|
+
routes: [{ method: "GET", path: "/api/key-providers" }],
|
|
481
|
+
flags: [{ name: "--json", value: "boolean", summary: "Emit the provider list as JSON." }],
|
|
482
|
+
mutates: false,
|
|
483
|
+
json: "payload",
|
|
484
|
+
},
|
|
485
|
+
{
|
|
486
|
+
command: ["inspect", "codex-prompt"],
|
|
487
|
+
summary: "The Codex system prompt state, or the prompt text itself.",
|
|
488
|
+
routes: [
|
|
489
|
+
{ method: "GET", path: "/api/codex-prompt" },
|
|
490
|
+
{ method: "GET", path: "/api/codex-prompt/text" },
|
|
491
|
+
],
|
|
492
|
+
flags: [
|
|
493
|
+
{ name: "--text", value: "boolean", summary: "Print the prompt body verbatim instead of its metadata." },
|
|
494
|
+
{ name: "--json", value: "boolean", summary: "Emit the prompt metadata as JSON." },
|
|
495
|
+
],
|
|
496
|
+
mutates: false,
|
|
497
|
+
json: "payload",
|
|
498
|
+
details: ["Read-only by design: the six mutating prompt routes require a dashboard session."],
|
|
499
|
+
},
|
|
500
|
+
{
|
|
501
|
+
command: ["inspect", "client-config"],
|
|
502
|
+
summary: "The generated configuration snippet for a supported client.",
|
|
503
|
+
routes: [{ method: "GET", path: "/api/client-config" }],
|
|
504
|
+
flags: [
|
|
505
|
+
{ name: "--client", value: "string", summary: "Required client id; the route names every accepted value on error." },
|
|
506
|
+
{ name: "--json", value: "boolean", summary: "Emit the snippet payload as JSON." },
|
|
507
|
+
],
|
|
508
|
+
mutates: false,
|
|
509
|
+
json: "payload",
|
|
510
|
+
},
|
|
511
|
+
{
|
|
512
|
+
command: ["inspect", "star"],
|
|
513
|
+
summary: "Whether this repository is starred by the signed-in GitHub account.",
|
|
514
|
+
// GET only, permanently. The POST spends the operator identity and requires a dashboard
|
|
515
|
+
// session precisely so an agent cannot answer that question for them.
|
|
516
|
+
routes: [{ method: "GET", path: "/api/github/star" }],
|
|
517
|
+
flags: [{ name: "--json", value: "boolean", summary: "Emit the star status as JSON." }],
|
|
518
|
+
mutates: false,
|
|
519
|
+
json: "payload",
|
|
520
|
+
details: ["Starring is never available from the CLI; the verb says so rather than offering a flag that cannot work."],
|
|
521
|
+
},
|
|
522
|
+
{
|
|
523
|
+
command: ["inspect", "windows-tray"],
|
|
524
|
+
summary: "Windows tray helper state.",
|
|
525
|
+
routes: [{ method: "GET", path: "/api/windows-tray" }],
|
|
526
|
+
flags: [{ name: "--json", value: "boolean", summary: "Emit the tray state as JSON." }],
|
|
527
|
+
mutates: false,
|
|
528
|
+
json: "payload",
|
|
529
|
+
},
|
|
530
|
+
{
|
|
531
|
+
command: ["system","codex-app-server"],
|
|
532
|
+
summary: "Codex app-server reachability and process state, as the dashboard sees it.",
|
|
533
|
+
routes: [{"method":"GET","path":"/api/system/codex-app-server"}],
|
|
534
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit the app-server state as JSON."}],
|
|
535
|
+
mutates: false,
|
|
536
|
+
json: "payload",
|
|
537
|
+
details: ["The GUI reads this state directly; without a verb an agent could not tell whether the Codex app-server was reachable at all."],
|
|
538
|
+
usage: "ocx system codex-app-server [--json]",
|
|
539
|
+
},
|
|
540
|
+
{
|
|
541
|
+
command: ["system","codex-cli-update","check"],
|
|
542
|
+
summary: "Inspect a configured Codex CLI candidate and its ownership provenance.",
|
|
543
|
+
routes: [],
|
|
544
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit the redacted provenance report as JSON."}],
|
|
545
|
+
mutates: false,
|
|
546
|
+
json: "envelope",
|
|
547
|
+
details: ["Proof-bound published-launcher context authenticates the configured candidate snapshot, not successful Codex execution; this check does not attest or admit a selected runtime.","On Windows this first slice performs no candidate or configuration filesystem I/O: only a proof-captured absolute environment candidate can receive lexical app-bundle or version-manager labels; every other Windows candidate fails closed.","Makes no package-registry request.","Does not execute Codex or npm, install or repair software, control a process, or write configuration or cache state."],
|
|
548
|
+
usage: "ocx system codex-cli-update check [--json]",
|
|
549
|
+
},
|
|
550
|
+
{
|
|
551
|
+
command: ["system","codex-cli-update","attest"],
|
|
552
|
+
summary: "Observe the selected or explicitly named Windows npm Codex installation files without enabling updates.",
|
|
553
|
+
routes: [],
|
|
554
|
+
flags: [{"name":"--candidate","value":"string","summary":"Absolute npm codex.cmd or package bin/codex.js path; all four paths are all-or-none."},{"name":"--npm-prefix","value":"string","summary":"Absolute prefix containing node_modules/@openai/codex."},{"name":"--npm-cli","value":"string","summary":"Absolute node_modules/npm/bin/npm-cli.js path."},{"name":"--node","value":"string","summary":"Absolute node.exe path; observed, never executed."},{"name":"--json","value":"boolean","summary":"Emit the path-free installation identity observation."}],
|
|
555
|
+
mutates: false,
|
|
556
|
+
json: "envelope",
|
|
557
|
+
details: ["Opt-in Windows x64 local-volume inspection using held native file handles; refuses reparse points, active writers and unsupported layouts.","Without explicit paths, the proof-bound launcher snapshot identifies the selected candidate: the configured CODEX_CLI_PATH or the first codex on the captured PATH, with an OpenCodex wrapper resolving to its codex.opencodex-real backing. Discovery only proposes paths; the held-handle observation remains the authority.","Success binds observed file identities and bytes, not selected-runtime admission or installer ownership.","selectionAttested, managed and applyAllowed remain false. The digest is an observation, not a durable update permit.","Does not run the named Codex/npm/Node files, query a registry, install software, control processes or persist state."],
|
|
558
|
+
usage: "ocx system codex-cli-update attest [--candidate <absolute-path> --npm-prefix <absolute-path> --npm-cli <absolute-path> --node <absolute-path>] [--json]",
|
|
559
|
+
},
|
|
560
|
+
{
|
|
561
|
+
command: ["system","codex-restart"],
|
|
562
|
+
summary: "Restart the Codex desktop app and app-servers.",
|
|
563
|
+
routes: [{"method":"POST","path":"/api/system/codex-restart"}],
|
|
564
|
+
flags: [{"name":"--yes","value":"boolean","summary":"Required: fully quits and relaunches the operator's Codex desktop app, which may discard unsaved composer drafts, model-picker selections, and pending approval prompts; also restarts its app-servers."},{"name":"--json","value":"boolean","summary":"Emit the restart result as JSON."}],
|
|
565
|
+
mutates: true,
|
|
566
|
+
json: "payload",
|
|
567
|
+
details: ["`sync --restart-codex` is not a substitute: it restarts only as a side effect after a catalog or cache write, so it cannot restart a healthy install on request.","Restarts the Codex desktop app as well as the app-servers, through the same module the CLI uses. When the proxy itself runs inside the Codex app it refuses instead, because restarting the app would kill the request.","--yes is mandatory because this interrupts a running editor session and may discard unsaved composer drafts, model-picker selections, and pending approval prompts; it must never happen because an agent guessed a subcommand."],
|
|
568
|
+
usage: "ocx system codex-restart --yes [--json]",
|
|
569
|
+
},
|
|
570
|
+
{
|
|
571
|
+
command: ["claude","config"],
|
|
572
|
+
summary: "Read or update Claude Code settings, including independent CLI first-party routing.",
|
|
573
|
+
routes: [{"method":"GET","path":"/api/claude-code"},{"method":"PUT","path":"/api/claude-code"}],
|
|
574
|
+
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."}],
|
|
575
|
+
mutates: true,
|
|
576
|
+
json: "payload",
|
|
577
|
+
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."],
|
|
578
|
+
usage: "ocx claude config status [--json]; 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]",
|
|
579
|
+
},
|
|
580
|
+
{
|
|
581
|
+
command: ["claude","intercept","start"],
|
|
582
|
+
summary: "Start the local Claude interception pair on demand.",
|
|
583
|
+
routes: [{"method":"POST","path":"/api/claude-intercept/start"}],
|
|
584
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit the management response as JSON."}],
|
|
585
|
+
mutates: true,
|
|
586
|
+
json: "payload",
|
|
587
|
+
usage: "ocx claude intercept start [--json]",
|
|
588
|
+
details: [],
|
|
589
|
+
},
|
|
590
|
+
{
|
|
591
|
+
command: ["claude","desktop","status"],
|
|
592
|
+
summary: "Applied-vs-desired Claude Desktop state, including staleness, drift, and health.",
|
|
593
|
+
routes: [{"method":"GET","path":"/api/claude-desktop/status"}],
|
|
594
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit the live status as JSON."}],
|
|
595
|
+
mutates: false,
|
|
596
|
+
json: "payload",
|
|
597
|
+
details: ["Distinct from `claude desktop show`, which reports what this machine WOULD write; this reports what is actually in effect, which only the running proxy knows."],
|
|
598
|
+
usage: "ocx claude desktop status [--json]",
|
|
599
|
+
},
|
|
600
|
+
{
|
|
601
|
+
command: ["claude","desktop","bind"],
|
|
602
|
+
summary: "First-party: serve a Claude Desktop Code tab picker model with an opencodex route.",
|
|
603
|
+
routes: [{"method":"PUT","path":"/api/claude-desktop/first-party-bindings"}],
|
|
604
|
+
flags: [],
|
|
605
|
+
mutates: true,
|
|
606
|
+
json: "none",
|
|
607
|
+
details: ["Takes a picker model id (claude-sonnet-4-6) and a route in the Desktop route vocabulary (provider/model or native/<slug>); the route must be one the Desktop profile can offer.","Only Claude Code traffic that reaches the proxy through the first-party intercept (Desktop's Code tab, the claude CLI) honours it; ocx claude and the public Messages endpoint are unaffected.","The Desktop picker keeps Anthropic's label; the binding changes which model answers, starting with the next request."],
|
|
608
|
+
usage: "ocx claude desktop bind <picker-model-id> <provider/model|native/slug>",
|
|
609
|
+
},
|
|
610
|
+
{
|
|
611
|
+
command: ["claude","desktop","unbind"],
|
|
612
|
+
summary: "Remove a first-party Claude Desktop Code tab picker binding.",
|
|
613
|
+
routes: [{"method":"PUT","path":"/api/claude-desktop/first-party-bindings"}],
|
|
614
|
+
flags: [],
|
|
615
|
+
mutates: true,
|
|
616
|
+
json: "none",
|
|
617
|
+
details: ["Removing an id that is not bound is a no-op; the remaining bindings are printed."],
|
|
618
|
+
usage: "ocx claude desktop unbind <picker-model-id>",
|
|
619
|
+
},
|
|
620
|
+
{
|
|
621
|
+
command: ["claude","desktop","picker","status"],
|
|
622
|
+
summary: "First-party picker mode: whether Claude Desktop's Code tab lists opencodex models, and what is missing if not.",
|
|
623
|
+
routes: [{"method":"GET","path":"/api/claude-desktop/picker"}],
|
|
624
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit the result as JSON."}],
|
|
625
|
+
mutates: false,
|
|
626
|
+
json: "payload",
|
|
627
|
+
details: ["Reads the live picker when available; otherwise reports local offline picker state. JSON emits the picker DTO, not the enclosing API response. No trust mutation."],
|
|
628
|
+
usage: "ocx claude desktop picker status [--json]",
|
|
629
|
+
},
|
|
630
|
+
{
|
|
631
|
+
command: ["claude","desktop","picker","on"],
|
|
632
|
+
summary: "Turn first-party picker mode on and remember the choice.",
|
|
633
|
+
routes: [{"method":"PUT","path":"/api/claude-desktop/picker"}],
|
|
634
|
+
flags: [],
|
|
635
|
+
mutates: true,
|
|
636
|
+
json: "none",
|
|
637
|
+
details: ["Needs a running proxy, first-party mode and macOS. The first time, macOS asks to trust a local certificate authority limited to claude.ai; when the server cannot show that prompt the command runs the trust step in this terminal.","Claude Desktop then reaches the network through opencodex; fully quit and reopen Desktop afterwards."],
|
|
638
|
+
usage: "ocx claude desktop picker on",
|
|
639
|
+
},
|
|
640
|
+
{
|
|
641
|
+
command: ["claude","desktop","picker","off"],
|
|
642
|
+
summary: "Turn first-party picker mode off, remove its Desktop egress profile and certificate trust, and remember the choice.",
|
|
643
|
+
routes: [{"method":"PUT","path":"/api/claude-desktop/picker"}],
|
|
644
|
+
flags: [],
|
|
645
|
+
mutates: true,
|
|
646
|
+
json: "none",
|
|
647
|
+
details: ["Works without a running proxy: the preference is saved and the picker profile and trust are removed locally."],
|
|
648
|
+
usage: "ocx claude desktop picker off",
|
|
649
|
+
},
|
|
650
|
+
{
|
|
651
|
+
command: ["claude","desktop","picker","trust"],
|
|
652
|
+
summary: "Run the macOS keychain step for picker mode in this terminal, then ask the server to finish enabling it.",
|
|
653
|
+
routes: [{"method":"GET","path":"/api/claude-desktop/picker"},{"method":"PUT","path":"/api/claude-desktop/picker"}],
|
|
654
|
+
flags: [],
|
|
655
|
+
mutates: true,
|
|
656
|
+
json: "none",
|
|
657
|
+
details: ["The server removes trust this command added if the enable is refused; if the request is lost, trust is left alone and picker status tells what happened."],
|
|
658
|
+
usage: "ocx claude desktop picker trust",
|
|
659
|
+
},
|
|
660
|
+
{
|
|
661
|
+
command: ["integration","native"],
|
|
662
|
+
summary: "Read native integration state or toggle Claude, Claude Desktop, Codex and Grok.",
|
|
663
|
+
routes: [{"method":"GET","path":"/api/native-integrations"},{"method":"PUT","path":"/api/native-integrations/claude"},{"method":"PUT","path":"/api/native-integrations/claude-desktop"},{"method":"PUT","path":"/api/native-integrations/codex"},{"method":"PUT","path":"/api/native-integrations/grok"}],
|
|
664
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit the client rows or toggle result as JSON."}],
|
|
665
|
+
mutates: true,
|
|
666
|
+
json: "payload",
|
|
667
|
+
details: ["Each toggle writes the selected client configuration through its runtime owner. Refused disables remain failures. Cursor status and local-installer are separate read-only subcommands; they do not toggle or install Cursor."],
|
|
668
|
+
usage: "ocx integration native [list] [--json]; ocx integration native <claude|claude-desktop|codex|grok> <on|off> [--json]",
|
|
669
|
+
},
|
|
670
|
+
{
|
|
671
|
+
command: ["integration","client"],
|
|
672
|
+
summary: "Inspect and toggle file integrations and Aside profiles, read journals, and restore selected operations.",
|
|
673
|
+
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}"},{"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"},{"method":"PUT","path":"/api/client-integrations/{clientId}"},{"method":"PUT","path":"/api/client-integrations/aside/profiles"},{"method":"PUT","path":"/api/client-integrations/aside/profiles/{profileId}"},{"method":"POST","path":"/api/client-integrations/restore"},{"method":"POST","path":"/api/client-integrations/aside/profiles/{profileId}/restore"}],
|
|
674
|
+
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."},{"name":"--overwrite-conflict","value":"boolean","summary":"Explicitly permit replacing a conflicting block."},{"name":"--op","value":"string","summary":"Operation ID; --op-id is an alias."},{"name":"--confirm-drift","value":"boolean","summary":"Explicitly allow replacing edits made after the snapshot."}],
|
|
675
|
+
mutates: true,
|
|
676
|
+
json: "payload",
|
|
677
|
+
details: ["status/show/list reads all clients, one client or Aside profiles. history/journal reads rollback records; expired snapshots stay visible.","enable/disable requires --client; an omitted Aside --profile toggles all profiles. --overwrite-conflict applies only to enable.","restore requires --op (alias --op-id); --client requires --profile and only Aside supports that profile selector. --confirm-drift is an explicit user waiver, never auto-retried. Use client preview or restore --preview to inspect a change, history remove --op ID --yes to retire a journal row, and sync --client aside to refresh managed profiles."],
|
|
678
|
+
usage: "ocx integration client status [--client <id>] [--profile <id>] [--json]; ocx integration client history [--client <id>] [--profile <id>] [--json]; ocx integration client enable --client <id> [--profile <id>] [--overwrite-conflict] [--json]; ocx integration client disable --client <id> [--profile <id>] [--json]; ocx integration client restore --op <opId> [--client aside --profile <id>] [--confirm-drift] [--json]",
|
|
679
|
+
},
|
|
680
|
+
{
|
|
681
|
+
command: ["sync"],
|
|
682
|
+
summary: "Synchronize client catalogs, including Aside profiles through the running server's mutation owner.",
|
|
683
|
+
routes: [{ method: "POST", path: "/api/client-integrations/aside/sync" }],
|
|
684
|
+
flags: [
|
|
685
|
+
{ name: "--restart-codex", value: "boolean", summary: "Restart the Codex app-servers and fully quit and relaunch the Codex desktop app after a catalog or cache write, on macOS, Linux and Windows." },
|
|
686
|
+
{ name: "--restart-app-server-only", value: "boolean", summary: "Restart only the Codex app-servers and leave the desktop app running; wins over --restart-codex when both are given." },
|
|
687
|
+
{ name: "--restart-desktop-app", value: "boolean", summary: "Deprecated alias of --restart-codex." },
|
|
688
|
+
],
|
|
689
|
+
mutates: true,
|
|
690
|
+
json: "none",
|
|
691
|
+
details: ["The Aside refresh uses the live server; other catalog synchronization also performs local work."],
|
|
692
|
+
},
|
|
693
|
+
{
|
|
694
|
+
command: ["agent","subagents","force"],
|
|
695
|
+
summary: "Force Claude Code subagents onto one exposed model at the next routed launch; - clears.",
|
|
696
|
+
routes: [{"method":"PUT","path":"/api/subagent-models"}],
|
|
697
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit the saved force setting."}],
|
|
698
|
+
mutates: true,
|
|
699
|
+
json: "payload",
|
|
700
|
+
details: ["Requires Claude Code 2.1.257+. Plain claude, forks, inherit skills, the main model and small-fast sidecars are unaffected."],
|
|
701
|
+
usage: "ocx agent subagents force <model|-> [--json]",
|
|
702
|
+
},
|
|
703
|
+
{
|
|
704
|
+
command: ["agent","request-user-input"],
|
|
705
|
+
summary: "Show or set whether default mode may ask the operator a question mid-task.",
|
|
706
|
+
routes: [{"method":"GET","path":"/api/codex-auth/features/default-mode-request-user-input"},{"method":"PUT","path":"/api/codex-auth/features/default-mode-request-user-input"}],
|
|
707
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit the feature state as JSON."}],
|
|
708
|
+
mutates: true,
|
|
709
|
+
json: "payload",
|
|
710
|
+
details: ["A bare invocation reads and never writes."],
|
|
711
|
+
usage: "ocx agent request-user-input [on|off] [--json]",
|
|
712
|
+
},
|
|
713
|
+
{
|
|
714
|
+
command: ["agent","roles"],
|
|
715
|
+
summary: "omo (Codex / LazyCodex): show each Codex agent role's model pin, set one role's model in its TOML and in omo.jsonc, or suggest a model for every role.",
|
|
716
|
+
routes: [{"method":"GET","path":"/api/codex-agent-roles"},{"method":"PUT","path":"/api/codex-agent-roles/{role}"},{"method":"POST","path":"/api/codex-agent-roles/auto-assign"}],
|
|
717
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit the role list, the write result or the proposals as JSON."},{"name":"--model","value":"string","summary":"suggest: size the roles with this model instead of the Codex default model."},{"name":"--apply","value":"boolean","summary":"suggest: write every proposal through the role model write."}],
|
|
718
|
+
mutates: true,
|
|
719
|
+
json: "payload",
|
|
720
|
+
details: ["A bare invocation reads and never writes.","Requires Codex-based omo (LazyCodex): the omo@sisyphuslabs Codex plugin enabled in config.toml and installed; otherwise status lists no roles, and set and suggest are refused.","set rewrites only the root model value of $CODEX_HOME/agents/<role>.toml; omo.jsonc is skipped when absent or when it contains comments.","suggest sizes every role with one model call and prints proposals without writing; --apply writes each proposed model, and its effort when the role file already sets model_reasoning_effort."],
|
|
721
|
+
usage: "ocx agent roles [status] [--json]; ocx agent roles set <role> <model> [--json]; ocx agent roles suggest [--model <id>] [--apply] [--json]",
|
|
722
|
+
},
|
|
723
|
+
{
|
|
724
|
+
command: ["agent","injection"],
|
|
725
|
+
summary: "Show or set the delegation model and effort, or suggest both for a described piece of delegated work.",
|
|
726
|
+
routes: [{"method":"GET","path":"/api/injection-model"},{"method":"PUT","path":"/api/injection-model"},{"method":"POST","path":"/api/injection-model/suggest"}],
|
|
727
|
+
flags: [{"name":"--json","value":"boolean","summary":"Emit the delegation settings, the write result or the proposal as JSON."},{"name":"--model","value":"string","summary":"set: the delegation model, - clears it. suggest: size the work with this model instead of the Codex default model."},{"name":"--effort","value":"string","summary":"set: the delegation reasoning effort, - clears it."},{"name":"--prompt","value":"string","summary":"set: a custom guidance prompt, - clears it."},{"name":"--guidance","value":"string","summary":"set: on or off for OpenCodex delegation guidance."},{"name":"--apply","value":"boolean","summary":"suggest: write the proposed model and effort through the delegation settings write."},{"name":"--sync-codex-defaults","value":"string","summary":"set only: enable/disable the existing model-dependent default-sync policy."}],
|
|
728
|
+
mutates: true,
|
|
729
|
+
json: "payload",
|
|
730
|
+
details: ["guidance aliases injection. Bare invocation reads; use explicit status before --json. set requires at least one setting and - clears model, effort or prompt.","suggest may spend a model call; it writes no settings unless --apply is explicitly supplied. Preserve unsized/unassigned/already-set outcomes.","Default-sync edits return actual normalized model/effort/prompt/guidance/default-sync state; they do not promise a client catalog rewrite. Clearing a model also clears dependent settings under server validation."],
|
|
731
|
+
usage: "ocx agent injection status [--json]; ocx agent injection set [--model <id|->] [--effort <level|->] [--prompt <text|->] [--guidance <on|off>] [--sync-codex-defaults <on|off>] [--json]; ocx agent injection suggest <work description> [--model <id>] [--apply] [--json]",
|
|
732
|
+
},
|
|
733
|
+
{
|
|
734
|
+
command: ["api","protocols"],
|
|
735
|
+
summary: "Read the protocol contract version, API surfaces, protocol settings and feature vocabulary.",
|
|
736
|
+
routes: [{"method":"GET","path":"/api/protocols"}],
|
|
737
|
+
flags: [{"name":"--provider","value":"string","summary":"Add one configured provider's upstream wire and who decided it."},{"name":"--json","value":"boolean","summary":"Emit the GET /api/protocols body."}],
|
|
738
|
+
mutates: false,
|
|
739
|
+
json: "payload",
|
|
740
|
+
usage: "ocx api protocols [--provider <name>] [--json]",
|
|
741
|
+
details: [],
|
|
742
|
+
},
|
|
743
|
+
{
|
|
744
|
+
command: ["combo","test"],
|
|
745
|
+
summary: "Run one JEV decision probe through a decision method: TypeSafe, a System One row, or an opencodex model.",
|
|
746
|
+
routes: [{"method":"GET","path":"/api/combos"},{"method":"POST","path":"/api/combos/decision-test"}],
|
|
747
|
+
flags: [{"name":"--combo","value":"string","summary":"Combo id whose saved decision method is probed and whose recursion rules apply."},{"name":"--decision-provider","value":"string","summary":"Probe a jev-decision provider row (or jev for TypeSafe) instead of the saved method."},{"name":"--decision-model","value":"string","summary":"Probe an opencodex-routed model instead of the saved method."},{"name":"--decision-timeout","value":"number","summary":"Decision deadline in milliseconds (1000-120000)."},{"name":"--json","value":"boolean","summary":"Emit the probe result."}],
|
|
748
|
+
mutates: true,
|
|
749
|
+
json: "payload",
|
|
750
|
+
details: ["--combo without an explicit decision override reads the saved combo first. The synthetic decision probe may spend a backend call; a failed-open receipt is not an applied decision."],
|
|
751
|
+
usage: "ocx combo test [--combo <id>] [--decision-provider <provider|jev> | --decision-model <route>] [--decision-timeout <ms>] [--json]",
|
|
752
|
+
},
|
|
753
|
+
{
|
|
754
|
+
command: ["combo","discover"],
|
|
755
|
+
summary: "List configured System One decision rows and catalog models that look like decision services.",
|
|
756
|
+
routes: [{"method":"GET","path":"/api/combos/decision-discovery"}],
|
|
757
|
+
flags: [{"name":"--query","value":"string","summary":"Match catalog rows by this text instead of the built-in decision-model hint."},{"name":"--json","value":"boolean","summary":"Emit the discovery payload."}],
|
|
758
|
+
mutates: false,
|
|
759
|
+
json: "payload",
|
|
760
|
+
details: ["Read-only: nothing is probed and no provider row is created."],
|
|
761
|
+
usage: "ocx combo discover [--query <text>] [--json]",
|
|
762
|
+
},
|
|
763
|
+
{
|
|
764
|
+
command: ["api","explain"],
|
|
765
|
+
summary: "Preview the request path a model would take from one inbound API, computed from config.",
|
|
766
|
+
routes: [{"method":"POST","path":"/api/protocols/plan"}],
|
|
767
|
+
flags: [{"name":"--model","value":"string","required":true,"summary":"Model selector as a client would send it."},{"name":"--inbound","value":"string","required":true,"summary":"Inbound API: responses, chat or messages."},{"name":"--feature","value":"string","summary":"Request feature key to judge; repeatable or comma-separated."},{"name":"--json","value":"boolean","summary":"Emit the ProtocolPlanV1 preview."}],
|
|
768
|
+
mutates: false,
|
|
769
|
+
json: "payload",
|
|
770
|
+
details: ["A read-only POST: nothing is sent upstream, no combo state advances and the input is not logged."],
|
|
771
|
+
usage: "ocx api explain --model <id> --inbound <responses|chat|messages> [--feature <key>[,<key>]]... [--json]",
|
|
772
|
+
},
|
|
773
|
+
{
|
|
774
|
+
command: ["api","policy"],
|
|
775
|
+
summary: "Read the protocol policy, or change the Messages surface, unrepresentable policy and rollout switches.",
|
|
776
|
+
routes: [{"method":"GET","path":"/api/protocols"},{"method":"PATCH","path":"/api/protocols/settings"}],
|
|
777
|
+
flags: [{"name":"--messages","value":"string","summary":"Open or close the Messages API: on or off. Off also turns the Claude integration off."},{"name":"--unrepresentable","value":"string","summary":"legacy keeps today's behavior; reject refuses a request its path cannot carry."},{"name":"--rollout","value":"string","summary":"One switch as name=on or name=off; repeatable. Every switch defaults off."},{"name":"--json","value":"boolean","summary":"Emit the resulting GET /api/protocols body."}],
|
|
778
|
+
mutates: true,
|
|
779
|
+
json: "payload",
|
|
780
|
+
details: ["A bare invocation reads and never writes.","A setting flag changes the operator's config; run it only when the operator asks for that change."],
|
|
781
|
+
usage: "ocx api policy [--messages <on|off>] [--unrepresentable <legacy|reject>] [--rollout <switch>=<on|off>]... [--json]",
|
|
782
|
+
},
|
|
783
|
+
];
|