sneakoscope 8.2.1 → 8.3.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 (99) hide show
  1. package/README.md +46 -110
  2. package/crates/sks-core/Cargo.lock +1 -1
  3. package/crates/sks-core/Cargo.toml +1 -1
  4. package/dist/cli/command-manifest-lite.js +0 -2
  5. package/dist/cli/command-registry.js +0 -2
  6. package/dist/commands/codex.js +3 -3
  7. package/dist/commands/doctor.js +5 -157
  8. package/dist/config/skills-manifest.json +1 -1
  9. package/dist/core/codex/codex-cli-syntax-builder.js +0 -8
  10. package/dist/core/codex-app/codex-models-cache.js +2 -1
  11. package/dist/core/codex-app/menubar/constants.js +0 -8
  12. package/dist/core/codex-compat/codex-capability-matrix.js +7 -7
  13. package/dist/core/codex-compat/codex-compat-report.js +8 -12
  14. package/dist/core/codex-compat/codex-runtime-contract.js +62 -0
  15. package/dist/core/codex-compat/codex-version-policy.js +7 -7
  16. package/dist/core/codex-control/codex-current-app-capability.js +3 -3
  17. package/dist/core/codex-control/codex-current-capability.js +67 -94
  18. package/dist/core/codex-control/codex-current-core-capability.js +3 -3
  19. package/dist/core/codex-control/codex-current-core-probe-runner.js +4 -4
  20. package/dist/core/codex-control/codex-current-core-real-probes.js +2 -2
  21. package/dist/core/codex-control/codex-current-feature-capability.js +4 -4
  22. package/dist/core/codex-control/codex-current-image-path-real-probe.js +1 -1
  23. package/dist/core/codex-control/codex-current-web-search-probe.js +1 -1
  24. package/dist/core/codex-control/codex-sdk-capability.js +2 -2
  25. package/dist/core/commands/remote-command.js +2 -2
  26. package/dist/core/context7-client.js +5 -2
  27. package/dist/core/doctor/codex-current-core-probe-doctor.js +2 -2
  28. package/dist/core/doctor/doctor-dirty-planner.js +1 -1
  29. package/dist/core/doctor/doctor-readiness-matrix.js +0 -7
  30. package/dist/core/feature-fixtures.js +0 -4
  31. package/dist/core/feature-registry.js +0 -1
  32. package/dist/core/image-ux-review.js +3 -3
  33. package/dist/core/install/installed-package-smoke.js +2 -3
  34. package/dist/core/mad-sks/sql-plane/mcp-executor.js +4 -3
  35. package/dist/core/mcp/modern-protocol.js +36 -0
  36. package/dist/core/mcp-config/health-check.js +45 -30
  37. package/dist/core/perf/release-latency-slo.js +1 -2
  38. package/dist/core/proof/runtime-truth-matrix.js +1 -1
  39. package/dist/core/release/canonical-test-proof.js +1 -1
  40. package/dist/core/release/gate-manifest.js +1 -2
  41. package/dist/core/release/physical-release-gates.js +0 -26
  42. package/dist/core/release/release-gate-affected-selector.js +0 -1
  43. package/dist/core/release/release-gate-contract.js +1 -1
  44. package/dist/core/release/release-pack-receipt.js +0 -1
  45. package/dist/core/release/stage-publish.js +1 -1
  46. package/dist/core/version.js +1 -1
  47. package/dist/native/sks-menubar/Sources/AppDelegate.swift +1 -12
  48. package/dist/native/sks-menubar/Sources/ControlCenterWindowController.swift +2 -6
  49. package/dist/native/sks-menubar/Sources/RemoteCodingViewController.swift +28 -470
  50. package/dist/native/sks-menubar/Sources/SecureProcessEnvelope.swift +1 -43
  51. package/dist/scripts/codex-current-app-server-v2-check.js +9 -8
  52. package/dist/scripts/codex-current-binary-identity-check.js +2 -2
  53. package/dist/scripts/codex-current-capability-check.js +9 -7
  54. package/dist/scripts/codex-current-dependency-check.js +21 -0
  55. package/dist/scripts/docs-truthfulness-check.js +4 -19
  56. package/dist/scripts/fast-codex-service-tier-proof-check.js +0 -1
  57. package/dist/scripts/latest-version-guidance-check.js +1 -1
  58. package/dist/scripts/packlist-performance-check.js +0 -1
  59. package/dist/scripts/release-metadata-check.js +1 -1
  60. package/dist/vendor/openai-codex/latest/hooks/permission-request.command.input.schema.json +6 -0
  61. package/dist/vendor/openai-codex/latest/hooks/permission-request.command.output.schema.json +2 -16
  62. package/dist/vendor/openai-codex/latest/hooks/post-compact.command.input.schema.json +6 -0
  63. package/dist/vendor/openai-codex/latest/hooks/post-tool-use.command.input.schema.json +6 -0
  64. package/dist/vendor/openai-codex/latest/hooks/post-tool-use.command.output.schema.json +2 -16
  65. package/dist/vendor/openai-codex/latest/hooks/pre-compact.command.input.schema.json +6 -0
  66. package/dist/vendor/openai-codex/latest/hooks/pre-tool-use.command.input.schema.json +6 -0
  67. package/dist/vendor/openai-codex/latest/hooks/pre-tool-use.command.output.schema.json +2 -16
  68. package/dist/vendor/openai-codex/latest/hooks/session-start.command.output.schema.json +2 -16
  69. package/dist/vendor/openai-codex/latest/hooks/snapshot-metadata.json +7 -5
  70. package/dist/vendor/openai-codex/latest/hooks/subagent-start.command.output.schema.json +4 -18
  71. package/dist/vendor/openai-codex/latest/hooks/user-prompt-submit.command.input.schema.json +6 -0
  72. package/dist/vendor/openai-codex/latest/hooks/user-prompt-submit.command.output.schema.json +2 -16
  73. package/package.json +3 -7
  74. package/release-gates.v2.json +10 -17
  75. package/config/codex-releases/rust-v0.146.0.json +0 -45
  76. package/dist/core/agents/agent-runner-codex-exec.js +0 -177
  77. package/dist/core/codex-compat/codex-release-manifest.js +0 -72
  78. package/dist/core/commands/telegram-command.js +0 -447
  79. package/dist/core/telegram/access.js +0 -58
  80. package/dist/core/telegram/client.js +0 -157
  81. package/dist/core/telegram/confirmation.js +0 -37
  82. package/dist/core/telegram/doctor.js +0 -159
  83. package/dist/core/telegram/index.js +0 -9
  84. package/dist/core/telegram/keychain.js +0 -317
  85. package/dist/core/telegram/liveness.js +0 -124
  86. package/dist/core/telegram/poller.js +0 -90
  87. package/dist/core/telegram/redaction.js +0 -15
  88. package/dist/core/telegram/state-lock.js +0 -416
  89. package/dist/core/telegram/types.js +0 -1
  90. package/dist/native/sks-menubar/Sources/RemoteCodingSettingsControls.swift +0 -160
  91. package/dist/native/sks-menubar/Sources/TelegramPrivateFileStore.swift +0 -498
  92. package/dist/native/sks-menubar/Sources/TelegramPrivateFileSupport.swift +0 -236
  93. package/dist/native/sks-menubar/Sources/TelegramProcessGateway.swift +0 -454
  94. package/dist/native/sks-menubar/Sources/TelegramRuntimeSupport.swift +0 -56
  95. package/dist/native/sks-menubar/Sources/TelegramStateLock.swift +0 -448
  96. package/dist/native/sks-menubar/Sources/TelegramSupport.swift +0 -244
  97. package/dist/native/sks-menubar/Sources/TelegramTransport.swift +0 -499
  98. package/dist/scripts/codex-current-manifest-check.js +0 -29
  99. package/schemas/codex/app-server-0.146/codex_app_server_protocol.v2.schemas.json +0 -19858
package/README.md CHANGED
@@ -22,7 +22,7 @@ Proof-first orchestration for Codex CLI, ChatGPT Desktop, AI coding agents, mult
22
22
  Sneakoscope Codex (`sks`) is an open-source trust layer for Codex CLI and ChatGPT Desktop. It coordinates bounded AI coding agents, records machine-verifiable evidence, preserves project memory, and blocks release claims that are not supported by current tests or artifacts. Search visibility outcomes are measured separately; SKS does not promise rankings or traffic.
23
23
  <!-- END SKS SEARCH VISIBILITY MARKETING -->
24
24
 
25
- This README documents package **SKS 8.2.1** — its own identity, read from `package.json` and subject to release-gate verification, not advice about what to install.
25
+ This README documents package **SKS 8.3.0** — its own identity, read from `package.json` and subject to release-gate verification, not advice about what to install.
26
26
 
27
27
  Use the official latest stable SKS and Codex CLI releases. The Codex compatibility SSOT is always the **current latest stable** host; capability probes measure what that host can actually do. Product docs do not crown a fixed `0.x.y` string as SSOT (release pins and schema directories are measured artifacts for the current package, not a permanent product version claim). Menu Bar / Center induce updates to the latest stable build. Run `sks update-check` for what is installed and read the capability report for what is supported. Install SSOT is npm `sneakoscope@latest`; PATH `sks` and Menu Bar stamped generation must match that version or gates fail. It resolves managed SKS skills from the authoritative global install, preserves a runnable Naruto child slot when `max_threads=2`, and keeps Menu Bar repair transactional so stamped generations remain verifiable. Naruto uses stable opt-in multi-agent V2 when the host exposes it (Codex official multi-agent wrap-only; SKS does not reimplement a parallel runtime). Local code search is mode-separated (`sks search files|text|structure|symbol|context`); `context` is answered by the compiled TriWiki Context Graph (`context-graph.json` is exhaustive authority; `context-pack.json` and managed `AGENTS.md` are bounded projections) — see [docs/architecture/context-graph.md](https://github.com/mandarange/Sneakoscope-Codex/blob/main/docs/architecture/context-graph.md) and [docs/PRODUCT-CONTRACT.md](https://github.com/mandarange/Sneakoscope-Codex/blob/main/docs/PRODUCT-CONTRACT.md). See [CHANGELOG.md](https://github.com/mandarange/Sneakoscope-Codex/blob/main/CHANGELOG.md).
28
28
 
@@ -30,7 +30,6 @@ Use the official latest stable SKS and Codex CLI releases. The Codex compatibili
30
30
 
31
31
  | Problem | 8.2.0 behavior |
32
32
  | --- | --- |
33
- | SKS Center could reject a valid token for a user-selected BotFather bot with only a generic verification message | Setup accepts any bot the user owns, binds the exact `getMe` identity, returns actionable verification failures, and keeps native/CLI liveness receipts schema-compatible. |
34
33
  | Overview mixed Menu Bar, installed SKS, and cached registry versions | Each value is labeled by authority, stale or unavailable probes remain explicit, and Refresh forces a bounded update-status refresh. |
35
34
  | Naruto stopped creating children after its first wave | The root parent records settled waves, recovers open-thread capacity, rescans the ready DAG, and can launch later direct-child waves under the same workflow run. |
36
35
  | Most delegated work drifted to Sol Max | Read-heavy discovery uses Terra Max, ordinary implementation uses Sol High, and Sol Max is reserved for focused high-risk or final judgment slices. |
@@ -72,111 +71,49 @@ The SKS menu bar shows the installed Codex CLI version and latest known version.
72
71
 
73
72
  **Manage MCP Servers…** opens a native macOS manager for the global `~/.codex/config.toml`. It can add remote URL or local stdio servers, enable/disable existing entries, remove entries after confirmation, and refresh the current state. Mutations are lock-protected, backed up, TOML-validated, and written with mode `0600`; configured environment values and command arguments are never rendered in the list. Changes apply to new Codex sessions. The same plumbing is available through the canonical `sks mcp config list|get|add|edit|duplicate|enable|disable|remove|test|login|logout|backups|restore` surface for diagnostics and automation.
74
73
 
75
- ### Remote control: Telegram BotFather integration
76
-
77
- SKS provides a first-party Telegram Bot API transport for the existing
78
- typed remote-control contract. A bounded outbound `getUpdates` loop runs only
79
- inside the resident Menu Bar process: it opens no inbound port, tunnel, daemon,
80
- or public webhook.
81
-
82
- #### BotFather setup
83
-
84
- 1. In Telegram, open **@BotFather** and create a bot with `/newbot`, or select
85
- any existing bot that you own. Copy that bot's token. SKS does not assume a
86
- fixed bot name or username: it verifies the token with `getMe` and binds the
87
- returned bot identity. Treat the token like a password. Do not place it in
88
- a shell command, config file, commit, issue, or screenshot.
89
- 2. On the Mac that runs SKS, open **SKS Center → Remote Coding**, choose
90
- **Enter Bot Token…**, and paste the token into the native secure-input
91
- sheet. SKS verifies `getMe` and the bot's webhook state before it stores
92
- anything. If a webhook is active, the token is not retained and Center asks
93
- for explicit consent before removing that webhook without dropping pending
94
- updates.
95
-
96
- For a terminal-only setup, use a no-echo `zsh` prompt and pipe the token on
97
- standard input; direct interactive TTY input is intentionally rejected:
98
-
99
- ```sh
100
- IFS= read -r -s "sks_telegram_token?BotFather token: "
101
- printf '\n'
102
- printf '%s\n' "$sks_telegram_token" | sks telegram setup --token-stdin
103
- unset sks_telegram_token
104
- ```
105
-
106
- If that command reports an existing webhook, review the delivery change and
107
- repeat the same no-echo flow with `--remove-webhook`. This is explicit
108
- consent to stop the old webhook endpoint; SKS always requests
109
- `drop_pending_updates=false`. The token travels only on standard input, is
110
- verified with Telegram before storage, is never printed, and is stored in
111
- the owner-only user secret file. A token supplied by `TELEGRAM_BOT_TOKEN` or
112
- `SKS_TELEGRAM_BOT_TOKEN` is also supported for an operator-managed runtime,
113
- but environment values can be exposed to other local processes and are not
114
- the recommended setup path. SKS Center restarts its resident poller after a
115
- successful save; if that restart reports a blocker, resolve it before
116
- generating or sending a pairing code.
117
- 3. For terminal-only setup, restart the resident Menu Bar process immediately
118
- after setup (and after any webhook removal or token rotation). The poller
119
- must be running before it can consume and confirm `/start`:
120
-
121
- ```sh
122
- sks menubar restart
123
- ```
124
-
125
- There is deliberately no `sks telegram start` or `sks telegram stop`:
126
- Telegram is not a separate daemon. SKS Center exposes **Start**, **Stop**,
127
- and **Restart** for the poller owned by the current resident Menu Bar
128
- process. **Stop** preserves the token and pairings and lasts only until that
129
- companion is relaunched. To keep Telegram stopped across relaunches, stop or
130
- uninstall the entire Menu Bar companion; that also disables its other
131
- resident features.
132
- 4. Issue a short-lived pairing code with `sks telegram pair`:
133
-
134
- ```sh
135
- sks telegram pair --json
136
- ```
137
-
138
- From the one intended **private** chat, send the returned
139
- `/start <pairing-code>` message to the bot before it expires. Only that
140
- private chat/user pair is enrolled. Unpaired chats receive no reply.
141
- 5. After the bot confirms pairing, send a typed command such as:
142
-
143
- ```text
144
- /sks status {}
145
- ```
146
-
147
- The command grammar is `/sks <command> <JSON object>`; the JSON object may
148
- be omitted when the command needs no options. The allowlist is `gates`,
149
- `paths`, `pipeline`, `proof`, `search`, `stats`, `status`, `stop-gate`,
150
- `trust`, `update-check`, and `validate-artifacts`. If SKS replies with a
151
- short-lived confirmation nonce, send the exact `/confirm <nonce>` message
152
- once before it expires. Arbitrary prose and free-form shell commands are not
153
- executed.
154
- 6. Confirm runtime evidence:
155
-
156
- ```sh
157
- sks telegram status --json
158
- sks telegram doctor --json
159
- sks doctor
160
- ```
161
-
162
- `status` reads the secret-free liveness receipt. `telegram doctor` evaluates
163
- token presence, the bot identity, pairing, audit health, poller state, and
164
- liveness. A ready result requires a real `getMe` check, a paired private
165
- chat, and a running poller; a configured token alone is not readiness.
166
-
167
- The transport accepts only allowlisted typed commands. It never accepts
168
- free-form shell input; higher-risk commands require actor-bound two-step
169
- confirmation and an audit receipt. Telegram long polling and a webhook cannot
170
- be active together. If Doctor reports a webhook/409 conflict, enter the token
171
- again in SKS Center and approve webhook removal, or repeat the no-echo CLI
172
- setup with `--remove-webhook`, then restart the poller. SKS never drops pending
173
- updates during that transition.
174
-
175
- If a token may have leaked, revoke/regenerate it in BotFather, enter the
176
- replacement through SKS Center (or the no-echo CLI flow), and restart the
177
- poller. Token rotation and BotFather credential changes are external actions;
178
- SKS does not publish packages, revoke tokens, or make any other irreversible
179
- remote change on the operator's behalf.
74
+ ### Recommended remote companion: Paseo
75
+
76
+ For remote and cross-device coding, Sneakoscope officially recommends
77
+ [Paseo](https://paseo.sh/docs). Start with the Paseo desktop app. For a
78
+ headless machine, install and launch the official CLI:
79
+
80
+ ```sh
81
+ npm install -g @getpaseo/cli
82
+ paseo
83
+ ```
84
+
85
+ Install and authenticate Codex CLI before using it through Paseo. Paseo runs
86
+ the existing provider CLI, so your Codex subscription, configuration, skills,
87
+ and MCP servers remain owned by Codex rather than copied into Sneakoscope.
88
+
89
+ From this repository, start Codex in the current workspace with:
90
+
91
+ ```sh
92
+ paseo run --provider codex "Review this repository"
93
+ ```
94
+
95
+ For an isolated branch-backed worktree based on `main`, use:
96
+
97
+ ```sh
98
+ paseo run --new-workspace worktree --worktree-mode branch-off --new-branch paseo-task --base main "Implement the task"
99
+ ```
100
+
101
+ The committed `paseo.json` prepares each new worktree with
102
+ `npm ci --ignore-scripts` followed by `npm run build:clean`. It also exposes
103
+ these named repository actions through Paseo:
104
+
105
+ | Paseo script | Repository command |
106
+ | --- | --- |
107
+ | `build` | `npm run build` |
108
+ | `typecheck` | `npm run typecheck` |
109
+ | `test` | `npm run test` |
110
+ | `release-check` | `npm run release:check:affected` |
111
+ | `release-confidence` | `npm run release:check:confidence` |
112
+
113
+ Paseo is an independent project, not bundled with or operated by Sneakoscope.
114
+ Sneakoscope maintains only this repository's `paseo.json` and usage guidance;
115
+ Paseo installation, authentication, pairing, relay operation, security, and
116
+ product support remain with Paseo and its official documentation.
180
117
 
181
118
  ## The Front Door
182
119
 
@@ -389,8 +326,8 @@ It shows the current quickstart flow: one-line install, `$sks-plan`, `sks review
389
326
  - Native capability repair: `sks doctor --fix` (imagegen/Computer Use/Browser Use), `.sneakoscope/reports/native-capability-readiness.json`
390
327
  - Desktop Bridge: `sks bridge status --json`, `sks bridge route explain <model> --json`, and `sks bridge verify --level transport --json` report service, explicit routing, and staged transport truth. A configured profile or catalog is not routing proof, and a missing route never silently falls back.
391
328
  - Agent bridge for any agent system: `sks mcp-server`, `sks agent-bridge setup`, `SKS_AGENT_MODE=1` — see [docs/AGENT-BRIDGE.md](https://github.com/mandarange/Sneakoscope-Codex/blob/main/docs/AGENT-BRIDGE.md)
392
- - Release gates: `npm run release:check:affected` for ordinary change-aware verification and `npm run release:check:confidence` for the final local confidence pass. Release claims still require target-bound real evidence for macOS lifecycle, OAuth preservation, both provider profiles, WebSocket protocol/frame truth, and deep artifacts; documentation and fixtures do not satisfy those gates.
393
- - Direct npm publication: run `npm run release:check:full` (it creates the current clean-HEAD pack receipt), then publish from a clean `main` checkout that exactly matches `origin/main`. The Git release tag may be created afterward, and stage-only physical receipts do not block this direct path. The staged/OIDC workflow still requires all five source-bound physical receipts, exact tag proof, and its authenticated review gates.
329
+ - Release gates: `npm run release:check:affected` for ordinary change-aware verification and `npm run release:check:confidence` for the final local confidence pass. Release claims still require target-bound real evidence for macOS lifecycle, OAuth preservation, both provider profiles, WebSocket protocol/frame truth, and deep artifacts; Paseo installation or pairing is not SKS release evidence, and documentation and fixtures do not satisfy protected gates.
330
+ - Direct npm publication: run `npm run release:check:full` (it creates the current clean-HEAD pack receipt), then publish from a clean `main` checkout that exactly matches `origin/main`. The Git release tag may be created afterward, and stage-only physical receipts do not block this direct path. The staged/OIDC workflow still requires all four source-bound physical receipts, exact tag proof, and its authenticated review gates.
394
331
  - Release evidence boundaries: [docs/release-readiness.md](https://github.com/mandarange/Sneakoscope-Codex/blob/main/docs/release-readiness.md), [docs/release-proof-truth.md](https://github.com/mandarange/Sneakoscope-Codex/blob/main/docs/release-proof-truth.md), and [CHANGELOG.md](https://github.com/mandarange/Sneakoscope-Codex/blob/main/CHANGELOG.md). Local configuration, fixtures, and diagnostics are not live release proof.
395
332
  - Image generation review routes require Codex App `$imagegen`/`gpt-image-2` evidence with recorded output hashes; direct API fallback and mock fixtures do not satisfy full route gates.
396
333
 
@@ -408,7 +345,6 @@ It shows the current quickstart flow: one-line install, `$sks-plan`, `sks review
408
345
  - The provider services remain independently operated. SKS never deploys them, changes remote credentials, or silently substitutes one profile for another.
409
346
  - Full release proof remains `not-run-real` until fresh target-bound evidence covers the real Desktop service/UI, OAuth preservation, both provider profiles, staged WebSocket verification, and each claimed deep artifact.
410
347
  - Update installs stop and verify every prior Menu Bar process before replacement, rebuild the companion from the newly installed SKS package, bootstrap it, and require exactly one running process whose version probe equals the current package version.
411
- - Telegram remote control uses one bounded long-poller inside that same Menu Bar process. Release evidence must include a real cellular command/reply round trip; `getMe`, a local fixture, or a configured token alone cannot satisfy the E2E gate.
412
348
  - The menubar dropdown's `View Last Log` item opens the most recent background action's log file, so you don't need to keep a Terminal window open to see command output.
413
349
  - `Manage MCP Servers…` provides a resizable native table and add/remove/enable/disable controls for global Codex MCP configuration. Secret environment values and command arguments are accepted through native dialogs/stdin but omitted from list output and logs.
414
350
  - `sks menubar status --json` reports a `codex_sync` object with `bundle_id`, `codex_running`, and `icon_visible_expected` to show Codex-lifecycle detection state.
@@ -259,7 +259,7 @@ dependencies = [
259
259
 
260
260
  [[package]]
261
261
  name = "sks-core"
262
- version = "8.2.1"
262
+ version = "8.3.0"
263
263
  dependencies = [
264
264
  "globset",
265
265
  "grep-matcher",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "sks-core"
3
- version = "8.2.1"
3
+ version = "8.3.0"
4
4
  edition = "2021"
5
5
 
6
6
  [dependencies]
@@ -39,7 +39,6 @@ const COMMAND_MANIFEST_LITE_BASE = [
39
39
  { name: 'bridge', summary: 'Manage the single Desktop Bridge runtime, provider profiles, catalog, and routes', maturity: 'beta', skipMigrationGate: true },
40
40
  { name: 'menubar', summary: 'Inspect/install/restart/uninstall SKS menu bar', maturity: 'beta', skipMigrationGate: true, allowedDuringActiveRoute: true, diagnostic: true },
41
41
  { name: 'remote', summary: 'Inspect official Remote readiness and run the proof-aware SSH stdio worker', maturity: 'beta' },
42
- { name: 'telegram', summary: 'Pair and inspect the Telegram remote-control transport', maturity: 'beta', skipMigrationGate: true },
43
42
  { name: 'hooks', summary: 'Explain and inspect Codex hooks', maturity: 'beta', skipMigrationGate: true },
44
43
  { name: 'mad-sks', summary: 'MAD-SKS scoped permission modifier + SQL-plane execution', maturity: 'beta', mutatesRouteState: true },
45
44
  { name: 'auto-review', summary: 'Manage auto-review profile', maturity: 'beta' },
@@ -167,7 +166,6 @@ const COMMAND_CONTRACT_OVERRIDES_LITE = {
167
166
  requiredCapabilities: ['proof.stop-gate']
168
167
  },
169
168
  task: { risk: 'R1', latency: 'long' },
170
- telegram: { risk: 'R2', supportsJson: true, remoteAllowed: false, inputProfile: 'json-only' },
171
169
  trust: {
172
170
  risk: 'R0', latency: 'fast', supportsJson: true, remoteAllowed: true, inputProfile: 'trust', requiredCapabilities: ['proof.trust']
173
171
  },
@@ -187,7 +187,6 @@ const COMMAND_DEFINITIONS = {
187
187
  bridge: skipMigrationGate(entry('beta', 'Manage the single Desktop Bridge runtime, provider profiles, catalog, and routes', 'dist/commands/bridge.js', directCommand(() => import('../commands/bridge.js'), 'dist/commands/bridge.js'))),
188
188
  menubar: activeRouteDiagnostic(entry('beta', 'Inspect/install/restart/uninstall SKS menu bar', 'dist/core/commands/menubar-command.js', subcommand(() => import('../core/commands/menubar-command.js'), 'menubarCommand', 'dist/core/commands/menubar-command.js', 'status'))),
189
189
  remote: entry('beta', 'Inspect official Remote readiness and run the proof-aware SSH stdio worker', 'dist/core/commands/remote-command.js', argsCommand(() => import('../core/commands/remote-command.js'), 'remoteCommand', 'dist/core/commands/remote-command.js')),
190
- telegram: skipMigrationGate(entry('beta', 'Pair and inspect the Telegram remote-control transport', 'dist/core/commands/telegram-command.js', argsCommand(() => import('../core/commands/telegram-command.js'), 'telegramCommand', 'dist/core/commands/telegram-command.js'))),
191
190
  hooks: skipMigrationGate(entry('beta', 'Explain and inspect Codex hooks', 'dist/commands/hooks.js', directCommand(() => import('../commands/hooks.js'), 'dist/commands/hooks.js'))),
192
191
  'mad-sks': routeStateMutator(entry('beta', 'MAD-SKS scoped permission modifier + SQL-plane execution', 'dist/commands/mad-sks.js', directCommand(() => import('../commands/mad-sks.js'), 'dist/commands/mad-sks.js')), ['mad-sks-gate.json']),
193
192
  'auto-review': entry('beta', 'Manage auto-review profile', 'dist/commands/auto-review.js', directCommand(() => import('../commands/auto-review.js'), 'dist/commands/auto-review.js')),
@@ -309,7 +308,6 @@ const COMMANDS_WITH_LEGACY_CONTRACT_OVERRIDES = applyCommandContractOverrides(CO
309
308
  requiredCapabilities: ['proof.stop-gate']
310
309
  },
311
310
  task: { risk: 'R1', latency: 'long' },
312
- telegram: { risk: 'R2', supportsJson: true, remoteAllowed: false, inputProfile: 'json-only' },
313
311
  trust: {
314
312
  risk: 'R0', latency: 'fast', supportsJson: true, remoteAllowed: true, inputProfile: 'trust', requiredCapabilities: ['proof.trust']
315
313
  },
@@ -4,7 +4,7 @@ import { codexCompatibilityReport, codexDoctorReport } from '../core/codex-compa
4
4
  import { codexVersionReport } from '../core/codex-compat/codex-version.js';
5
5
  import { codexSchemaSnapshotReport } from '../core/codex-compat/codex-schema-snapshot.js';
6
6
  import { detectCodexCurrentCapability } from '../core/codex-control/codex-current-capability.js';
7
- import { CURRENT_CODEX_RELEASE_MANIFEST } from '../core/codex-compat/codex-release-manifest.js';
7
+ import { CURRENT_CODEX_RUNTIME_CONTRACT } from '../core/codex-compat/codex-runtime-contract.js';
8
8
  import { codexCliUpdateConsoleLines, inspectCodexCliUpdate, updateCodexCliNow } from '../core/codex/codex-cli-update.js';
9
9
  export async function run(_command, args = []) {
10
10
  const action = args[0] || 'compatibility';
@@ -59,11 +59,11 @@ export async function run(_command, args = []) {
59
59
  process.exitCode = 1;
60
60
  return;
61
61
  }
62
- if (action === 'current' || action === CURRENT_CODEX_RELEASE_MANIFEST.targetTag) {
62
+ if (action === 'current' || action === CURRENT_CODEX_RUNTIME_CONTRACT.targetTag) {
63
63
  const result = await detectCodexCurrentCapability({ requireReal: flag(args, '--require-real') });
64
64
  if (flag(args, '--json'))
65
65
  return printJson(result);
66
- console.log(`Codex ${CURRENT_CODEX_RELEASE_MANIFEST.requiredCliVersion} compatibility: ${result.ok ? 'ok' : 'blocked'} (${result.probe_mode})`);
66
+ console.log(`Codex ${CURRENT_CODEX_RUNTIME_CONTRACT.requiredCliVersion} compatibility: ${result.ok ? 'ok' : 'blocked'} (${result.probe_mode})`);
67
67
  for (const blocker of result.blockers || [])
68
68
  console.log(`- blocker: ${blocker}`);
69
69
  for (const warning of result.warnings || [])
@@ -8,10 +8,6 @@ import { getCodexInfo } from '../core/codex-adapter.js';
8
8
  import { rustInfo } from '../core/rust-accelerator.js';
9
9
  import { codexAppIntegrationStatus } from '../core/codex-app.js';
10
10
  import { desktopBridgeStatusV3 } from '../core/codex-lb/desktop-controller-v3.js';
11
- import { probeTelegram, telegramSelfHealAction } from '../core/telegram/doctor.js';
12
- import { TelegramClient } from '../core/telegram/client.js';
13
- import { resolveTelegramBotToken } from '../core/telegram/keychain.js';
14
- import { telegramLivenessPath } from '../core/telegram/liveness.js';
15
11
  import { inspectCodexConfigReadability } from '../core/codex/codex-config-readability.js';
16
12
  import { inspectOAuthCallbackPortConflict, oauthCallbackDoctorGuidance } from '../core/codex/oauth-callback-port-diagnostic.js';
17
13
  import { inventoryCodexPermissionProfiles } from '../core/codex/codex-permission-profiles.js';
@@ -26,11 +22,10 @@ import { withSecretPreservationGuard } from '../core/config/config-migration-jou
26
22
  import { reconcileDoctorSkills } from '../core/doctor/doctor-skill-reconcile.js';
27
23
  import { buildSksMenuBarDoctorPostcheck } from '../core/doctor/sks-menubar-doctor.js';
28
24
  import { isUpdateMigrationReceiptCurrent, projectUpdateMigrationReceiptPath, writeProjectUpdateMigrationReceipt } from '../core/update/update-migration-state.js';
29
- import { inspectSksMenuBarStatus, installSksMenuBar, sksMenuBarPaths, sksMenuBarRestartDeferred } from '../core/codex-app/menubar/index.js';
30
- import { restartLaunchAgent } from '../core/codex-app/menubar/launch-agent.js';
25
+ import { inspectSksMenuBarStatus, installSksMenuBar, sksMenuBarRestartDeferred } from '../core/codex-app/menubar/index.js';
31
26
  import { sweepSksTempDirs } from '../core/retention.js';
32
27
  import { detectImagegenCapability } from '../core/imagegen/imagegen-capability.js';
33
- import { CURRENT_CODEX_RELEASE_MANIFEST } from '../core/codex-compat/codex-release-manifest.js';
28
+ import { CURRENT_CODEX_RUNTIME_CONTRACT } from '../core/codex-compat/codex-runtime-contract.js';
34
29
  import { formatHarnessConflictReport, scanHarnessConflicts } from '../core/harness-conflicts.js';
35
30
  import { doctorArgWarnings as baseDoctorArgWarnings, doctorMenuBarInstallPolicy, doctorPhaseIdsForProfile, doctorProfileFromArgs, doctorProfileRequiresDesktopBridgeReadiness } from './doctor-profile.js';
36
31
  import { buildCodexAppUiDiagnosticFailure, buildRuntimeReadiness, captureCodexConfigSnapshot, deferredNativeRepair, doctorDedupeStatus, doctorSkillStatus, fallbackCodexNativeFeatureMatrix, formatCodexDoctorConsoleStatus, installScopeFromArgs, isMigrationUserOwnedProjectConfigBlocker, mergeObservedCodexStartupWarnings, nativeCapabilityStatus, readOption, rebootstrapSksMenuBarLaunchdForDoctorFix, sksMenuBarRunningVersionConsoleLines, uniqueNativeManualActions, writeFixMigrationJournal, writeJsonReportFile } from './doctor-helpers.js';
@@ -212,13 +207,6 @@ export async function executeDoctorGlobalOnlyFix(args = [], root, deps = {}) {
212
207
  home,
213
208
  processEnv: doctorEnv
214
209
  }, { desktopBridgeStatusImpl: deps.desktopBridgeStatusImpl });
215
- const telegramRemote = await inspectTelegramRemote({
216
- live: true,
217
- fix: true,
218
- root,
219
- home,
220
- env: doctorEnv
221
- }, deps);
222
210
  const globalSkillsReady = !globalSkills?.error
223
211
  && globalSkills?.ok !== false
224
212
  && globalSkills?.core_skill_integrity?.ok !== false;
@@ -261,12 +249,10 @@ export async function executeDoctorGlobalOnlyFix(args = [], root, deps = {}) {
261
249
  codex_app_fast_mode: globalFastMode,
262
250
  openrouter_provider: desktopBridge.providers?.openrouter || null,
263
251
  sks_menubar: menuBar,
264
- telegram_remote: telegramRemote,
265
252
  desktop_bridge: desktopBridge,
266
253
  blockers,
267
254
  next_actions: [
268
255
  ...(desktopBridge.ok === false ? desktopBridge.recovery_actions || [] : []),
269
- ...telegramDoctorOperatorActions(telegramRemote),
270
256
  'Run `sks doctor --fix --json` from a specific project directory when project-scoped repair is required.'
271
257
  ]
272
258
  };
@@ -288,14 +274,6 @@ async function runDoctorGlobalOnlyFix(args = [], root, deps = {}) {
288
274
  console.log(`SKS Doctor global repair: ${result.ok ? 'ok' : 'blocked'}`);
289
275
  console.log(`Global skills: ${result.skills.global?.error ? 'blocked' : 'reconciled'}`);
290
276
  console.log(`SKS menu bar: ${result.sks_menubar?.status || (result.sks_menubar?.ok ? 'ok' : 'blocked')}`);
291
- const telegramOutcome = result.telegram_remote?.self_heal_outcome;
292
- const telegramAction = telegramOutcome?.attempted
293
- ? telegramOutcome.action
294
- : result.telegram_remote?.self_heal_action || 'none';
295
- console.log(`Telegram Remote: ${result.telegram_remote?.status || 'unknown'} (self-heal ${telegramAction}${telegramOutcome?.attempted ? `, ${telegramOutcome.recovered ? 'recovered' : 'still degraded'}` : ''})`);
296
- const telegramCheckedLine = telegramDoctorCheckedLine(result.telegram_remote);
297
- if (telegramCheckedLine)
298
- console.log(telegramCheckedLine);
299
277
  console.log(`Desktop Bridge: ${result.desktop_bridge.ok ? 'ready' : 'blocked'} (${result.desktop_bridge.status?.readiness?.state || 'unavailable'})`);
300
278
  for (const blocker of result.blockers)
301
279
  console.log(`- blocker: ${blocker}`);
@@ -306,109 +284,6 @@ async function runDoctorGlobalOnlyFix(args = [], root, deps = {}) {
306
284
  process.exitCode = 1;
307
285
  return result;
308
286
  }
309
- export async function inspectTelegramRemote(input = {}, deps = {}) {
310
- const env = input.env || process.env;
311
- const home = path.resolve(input.home || env.HOME || os.homedir());
312
- const receiptPath = input.receiptPath || telegramLivenessPath(home);
313
- const probeImpl = deps.probeTelegramImpl || probeTelegram;
314
- let tokenProvider = deps.telegramTokenProvider;
315
- let client = deps.telegramClient;
316
- if (input.live && (!tokenProvider || !client)) {
317
- const resolveImpl = deps.resolveTelegramBotTokenImpl || resolveTelegramBotToken;
318
- let resolvedToken = null;
319
- tokenProvider ||= {
320
- loadToken: () => {
321
- resolvedToken ||= Promise.resolve(resolveImpl({ env })).then((result) => result.token);
322
- return resolvedToken;
323
- }
324
- };
325
- client ||= new TelegramClient({ tokenProvider });
326
- }
327
- const runProbe = () => {
328
- if (!input.live)
329
- return probeImpl({ receiptPath });
330
- if (!client || !tokenProvider)
331
- throw new Error('telegram_live_probe_dependencies_missing');
332
- return probeImpl({ client, tokenProvider, receiptPath });
333
- };
334
- const before = await runProbe();
335
- const action = telegramSelfHealAction(before);
336
- if (!input.fix || action !== 'restart_poll' || !before.token_configured || before.paired_chat_count < 1) {
337
- return {
338
- ...before,
339
- self_heal_action: action,
340
- self_heal_outcome: {
341
- requested: input.fix === true,
342
- attempted: false,
343
- action,
344
- reason: input.fix !== true
345
- ? 'report_only'
346
- : action !== 'restart_poll'
347
- ? 'action_not_restart_poll'
348
- : 'telegram_not_configured_or_paired'
349
- }
350
- };
351
- }
352
- const restartImpl = deps.restartLaunchAgentImpl || restartLaunchAgent;
353
- const restart = await restartImpl(sksMenuBarPaths(home, input.root), env).catch((error) => ({
354
- ok: false,
355
- error: error instanceof Error ? error.message : String(error)
356
- }));
357
- const maximumReprobes = Math.max(1, Math.min(deps.telegramReprobeAttempts ?? 3, 5));
358
- const reprobeDelayMs = Math.max(0, Math.min(deps.telegramReprobeDelayMs ?? 500, 5_000));
359
- const sleepImpl = deps.telegramSleepImpl || ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
360
- let reprobeAttempts = 1;
361
- let after = await runProbe();
362
- let afterAction = telegramSelfHealAction(after);
363
- while (restart?.ok === true && afterAction === 'restart_poll' && reprobeAttempts < maximumReprobes) {
364
- await sleepImpl(reprobeDelayMs);
365
- after = await runProbe();
366
- afterAction = telegramSelfHealAction(after);
367
- reprobeAttempts += 1;
368
- }
369
- return {
370
- ...after,
371
- self_heal_action: afterAction,
372
- self_heal_attempted_action: action,
373
- self_heal_before: before,
374
- self_heal_outcome: {
375
- requested: true,
376
- attempted: true,
377
- action,
378
- after_action: afterAction,
379
- restart_ok: restart?.ok === true,
380
- reprobe_ok: after.ok,
381
- reprobe_attempts: reprobeAttempts,
382
- recovered: restart?.ok === true && after.ok && afterAction === 'none',
383
- error: restart?.error || null,
384
- restart
385
- }
386
- };
387
- }
388
- export function telegramDoctorCheckedLine(probe, indent = '') {
389
- if (!probe?.getme_checked_at)
390
- return null;
391
- return `${indent}checked: ${probe.getme_checked_at} (${probe.getme_latency_ms ?? 'unknown'} ms, ${probe.getme_check_kind || 'receipt'})`;
392
- }
393
- function telegramDoctorOperatorActions(probe) {
394
- if (!probe || probe.status === 'not_configured')
395
- return [];
396
- if (probe.self_heal_action === 'restart_poll') {
397
- if (probe.self_heal_outcome?.recovered === true)
398
- return [];
399
- return ['Run `sks menubar restart` to restart the resident Telegram long poller.'];
400
- }
401
- if (probe.self_heal_action === 'revalidate_token') {
402
- return ['Run `sks telegram setup --token-stdin`, then `sks menubar restart`, to revalidate the bot identity.'];
403
- }
404
- if (probe.self_heal_action === 'operator_remove_webhook') {
405
- return ['Remove the Telegram bot webhook through the Bot API, then run `sks menubar restart`; getUpdates and webhooks cannot be active together.'];
406
- }
407
- if (probe.self_heal_action === 'operator_repair_audit') {
408
- return ['Restore owner-only write access to `~/.codex/sks-menubar/logs/telegram-audit.jsonl`, then run `sks menubar restart`.'];
409
- }
410
- return [];
411
- }
412
287
  async function runDoctorJsonFastPath(args = [], root) {
413
288
  const startedAtMs = Date.now();
414
289
  const reportFile = readOption(args, '--report-file', null);
@@ -435,7 +310,6 @@ async function runDoctorJsonFastPath(args = [], root) {
435
310
  inspectDoctorDesktopBridgeStatus({ processEnv: process.env })
436
311
  ]);
437
312
  const oauthCallbackOperatorActions = oauthCallbackDoctorGuidance(oauthCallbackPortDiagnostic);
438
- const telegramRemote = await inspectTelegramRemote();
439
313
  const ready = {
440
314
  schema: 'sks.doctor-readiness-matrix.v2',
441
315
  generated_at: nowIso(),
@@ -473,8 +347,7 @@ async function runDoctorJsonFastPath(args = [], root) {
473
347
  not_counted_as_full_doctor: true,
474
348
  next_actions: [
475
349
  'Run sks doctor --full --json for deep diagnostics.',
476
- ...(desktopBridge.ok === false ? desktopBridge.recovery_actions || [] : []),
477
- ...telegramDoctorOperatorActions(telegramRemote)
350
+ ...(desktopBridge.ok === false ? desktopBridge.recovery_actions || [] : [])
478
351
  ],
479
352
  root,
480
353
  fast_path: true,
@@ -509,7 +382,6 @@ async function runDoctorJsonFastPath(args = [], root) {
509
382
  blockers: [],
510
383
  warnings: ['menubar_install_deferred_to_fix_or_full_doctor']
511
384
  },
512
- telegram_remote: telegramRemote,
513
385
  provider_context: {
514
386
  schema: 'sks.provider-context.v2',
515
387
  generated_at: nowIso(),
@@ -881,12 +753,6 @@ async function runDoctor(args = [], root, doctorFix, deps = {}) {
881
753
  blockers: [err?.message || String(err)],
882
754
  warnings: []
883
755
  }));
884
- const telegramRemote = await inspectTelegramRemote({
885
- live: deepDiagnostics || doctorFix,
886
- fix: doctorFix,
887
- root,
888
- env: process.env
889
- }, deps);
890
756
  const context7Repair = await runDoctorContext7Repair({ root, fix: doctorFix }).catch((err) => ({
891
757
  schema: 'sks.doctor-context7-repair.v1',
892
758
  ok: false,
@@ -1398,7 +1264,6 @@ async function runDoctor(args = [], root, doctorFix, deps = {}) {
1398
1264
  repair: configRepair,
1399
1265
  codex_app_ui: codexAppUi,
1400
1266
  sks_menubar: sksMenuBar,
1401
- telegram_remote: telegramRemote,
1402
1267
  codex_current_app_doctor: codexCurrentAppDoctor,
1403
1268
  codex_plugin_inventory: pluginInventory?.report || null,
1404
1269
  codex_plugin_app_template_policy: pluginPolicy,
@@ -1410,8 +1275,7 @@ async function runDoctor(args = [], root, doctorFix, deps = {}) {
1410
1275
  ...(codexStartupRepair.manual_actions || []),
1411
1276
  ...(codexConfigSyntaxRepair?.manual_actions || []),
1412
1277
  ...(pluginPolicy?.doctor_warnings || []),
1413
- ...(desktopBridge.ok === false ? desktopBridge.recovery_actions || [] : []),
1414
- ...telegramDoctorOperatorActions(telegramRemote)
1278
+ ...(desktopBridge.ok === false ? desktopBridge.recovery_actions || [] : [])
1415
1279
  ]
1416
1280
  };
1417
1281
  let ready = await writeDoctorReadinessMatrix(root, doctorReadinessInput);
@@ -1527,7 +1391,6 @@ async function runDoctor(args = [], root, doctorFix, deps = {}) {
1527
1391
  codex_app_ui: codexAppUi,
1528
1392
  openrouter_provider: desktopBridge.providers?.openrouter || null,
1529
1393
  sks_menubar: sksMenuBar,
1530
- telegram_remote: telegramRemote,
1531
1394
  provider_context: providerContext,
1532
1395
  desktop_bridge: desktopBridge,
1533
1396
  codex_doctor: authoritativeCodexDoctor,
@@ -1742,21 +1605,6 @@ async function runDoctor(args = [], root, doctorFix, deps = {}) {
1742
1605
  console.log(` blockers: ${sksMenuBar.blockers.join(', ')}`);
1743
1606
  if (Array.isArray(sksMenuBar.warnings) && sksMenuBar.warnings.length)
1744
1607
  console.log(` warnings: ${sksMenuBar.warnings.join(', ')}`);
1745
- console.log('Telegram Remote:');
1746
- console.log(` status: ${telegramRemote.status || 'unknown'}`);
1747
- console.log(` getMe: ${telegramRemote.bot_identity_valid ? 'verified' : telegramRemote.token_configured ? 'invalid' : 'not configured'}`);
1748
- console.log(` audit: ${telegramRemote.audit_healthy ? 'healthy' : 'unavailable'}`);
1749
- const telegramCheckedLine = telegramDoctorCheckedLine(telegramRemote, ' ');
1750
- if (telegramCheckedLine)
1751
- console.log(telegramCheckedLine);
1752
- console.log(` long poll: ${telegramRemote.poller?.running ? 'running' : 'stopped'}`);
1753
- const telegramSelfHealOutcome = telegramRemote.self_heal_outcome;
1754
- const telegramDisplayedAction = telegramSelfHealOutcome?.attempted
1755
- ? telegramSelfHealOutcome.action
1756
- : telegramRemote.self_heal_action;
1757
- if (telegramDisplayedAction && telegramDisplayedAction !== 'none') {
1758
- console.log(` self-heal: ${telegramDisplayedAction}${telegramSelfHealOutcome?.attempted ? ` (${telegramSelfHealOutcome.recovered ? 'recovered' : 'attempted, still degraded'})` : ''}`);
1759
- }
1760
1608
  console.log(`Provider: ${providerContext.provider || 'unknown'} ${providerContext.service_tier || ''} (${providerContext.source || 'unknown'}, ${providerContext.confidence || 'low'})`);
1761
1609
  const imagegenReady = imagegen.auth_readiness;
1762
1610
  if (imagegenReady) {
@@ -1787,7 +1635,7 @@ async function runDoctor(args = [], root, doctorFix, deps = {}) {
1787
1635
  }
1788
1636
  const codexCurrentApp = codexCurrentAppCapability.report || {};
1789
1637
  console.log('Codex current compatibility:');
1790
- console.log(` target: ${CURRENT_CODEX_RELEASE_MANIFEST.targetTag}`);
1638
+ console.log(` target: ${CURRENT_CODEX_RUNTIME_CONTRACT.targetTag}`);
1791
1639
  console.log(` runtime: ${codex.version || 'unknown'}`);
1792
1640
  console.log(` multi-agent mode: ${codexNativeFeatureMatrix.features?.multi_agent_mode?.ok ? 'verified' : 'unverified'}`);
1793
1641
  console.log(` rollout budget: ${codexNativeFeatureMatrix.features?.rollout_budget?.ok ? 'verified' : 'unverified'}`);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schema": "sks.skills-manifest.v1",
3
- "package_version": "8.2.1",
3
+ "package_version": "8.3.0",
4
4
  "skills": [
5
5
  {
6
6
  "canonical_name": "sks",
@@ -1,13 +1,7 @@
1
1
  export function buildCodexExecArgs(opts) {
2
- if (opts.fullAuto && opts.danger) {
3
- throw new Error('codex exec cannot combine full auto and danger modes');
4
- }
5
2
  if (opts.danger && !opts.allowDanger) {
6
3
  throw new Error('codex exec danger mode requires explicit allowDanger=true');
7
4
  }
8
- if (opts.fullAuto && !opts.allowFullAuto) {
9
- throw new Error('codex exec full-auto mode requires explicit allowFullAuto=true');
10
- }
11
5
  if (opts.profile && opts.ignoreUserConfig) {
12
6
  throw new Error('codex exec cannot combine --profile with --ignore-user-config');
13
7
  }
@@ -30,8 +24,6 @@ export function buildCodexExecArgs(opts) {
30
24
  args.push('--ignore-user-config');
31
25
  if (opts.ignoreRules)
32
26
  args.push('--ignore-rules');
33
- if (opts.fullAuto)
34
- args.push('--full-auto');
35
27
  if (opts.danger)
36
28
  args.push('--dangerously-bypass-approvals-and-sandbox');
37
29
  else if (opts.sandbox)
@@ -2,6 +2,7 @@ import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import { writeTextAtomic } from '../fsx.js';
4
4
  import { codexHomePath } from './codex-model-catalog.js';
5
+ import { CURRENT_CODEX_RUNTIME_CONTRACT } from '../codex-compat/codex-runtime-contract.js';
5
6
  export const CODEX_MODELS_CACHE_STALE_FETCHED_AT = '2000-01-01T00:00:00Z';
6
7
  export const CODEX_MODELS_CACHE_FILENAME = 'models_cache.json';
7
8
  export function codexModelsCachePath(input = {}) {
@@ -116,7 +117,7 @@ export async function invalidateCodexModelsCache(input = {}) {
116
117
  const existingClient = typeof existing?.client_version === 'string' ? existing.client_version.trim() : '';
117
118
  const clientVersion = existingClient && existingClient !== '0.0.0'
118
119
  ? existingClient
119
- : '0.146.0';
120
+ : CURRENT_CODEX_RUNTIME_CONTRACT.requiredCliVersion;
120
121
  const wrapper = {
121
122
  fetched_at: CODEX_MODELS_CACHE_STALE_FETCHED_AT,
122
123
  client_version: clientVersion,
@@ -25,7 +25,6 @@ export const NATIVE_SOURCE_FILES = [
25
25
  'ProvidersOpenRouter.swift',
26
26
  'ProvidersBridgeCatalog.swift',
27
27
  'RemoteCodingViewController.swift',
28
- 'RemoteCodingSettingsControls.swift',
29
28
  'DiagnosticsViewController.swift',
30
29
  'SettingsViewController.swift',
31
30
  'OperationModels.swift',
@@ -36,13 +35,6 @@ export const NATIVE_SOURCE_FILES = [
36
35
  'ProcessIdentityGuard.swift',
37
36
  'SecureProcessEnvelope.swift',
38
37
  'SKSKeychainStore.swift',
39
- 'TelegramStateLock.swift',
40
- 'TelegramPrivateFileSupport.swift',
41
- 'TelegramPrivateFileStore.swift',
42
- 'TelegramSupport.swift',
43
- 'TelegramRuntimeSupport.swift',
44
- 'TelegramTransport.swift',
45
- 'TelegramProcessGateway.swift',
46
38
  'NotificationCoordinator.swift',
47
39
  'AlertFactory.swift',
48
40
  'AppIdentity.swift',