sneakoscope 8.2.1 → 8.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +50 -112
- package/config/skills-hash-ledger.v1.json +3 -0
- package/crates/sks-core/Cargo.lock +1 -1
- package/crates/sks-core/Cargo.toml +1 -1
- package/dist/cli/command-manifest-lite.js +0 -2
- package/dist/cli/command-registry.js +0 -2
- package/dist/commands/codex.js +3 -3
- package/dist/commands/doctor.js +5 -157
- package/dist/config/skills-manifest.json +7 -4
- package/dist/core/codex/codex-cli-syntax-builder.js +0 -8
- package/dist/core/codex-app/codex-models-cache.js +2 -1
- package/dist/core/codex-app/menubar/config.js +4 -4
- package/dist/core/codex-app/menubar/constants.js +2 -9
- package/dist/core/codex-app/menubar/global-install.js +16 -0
- package/dist/core/codex-app/menubar/installer.js +15 -2
- package/dist/core/codex-app/menubar/launch-agent.js +23 -9
- package/dist/core/codex-app/menubar/rollback.js +12 -2
- package/dist/core/codex-compat/codex-capability-matrix.js +7 -7
- package/dist/core/codex-compat/codex-compat-report.js +8 -12
- package/dist/core/codex-compat/codex-runtime-contract.js +62 -0
- package/dist/core/codex-compat/codex-version-policy.js +7 -7
- package/dist/core/codex-control/codex-current-app-capability.js +3 -3
- package/dist/core/codex-control/codex-current-capability.js +67 -94
- package/dist/core/codex-control/codex-current-core-capability.js +3 -3
- package/dist/core/codex-control/codex-current-core-probe-runner.js +4 -4
- package/dist/core/codex-control/codex-current-core-real-probes.js +2 -2
- package/dist/core/codex-control/codex-current-feature-capability.js +4 -4
- package/dist/core/codex-control/codex-current-image-path-real-probe.js +1 -1
- package/dist/core/codex-control/codex-current-web-search-probe.js +1 -1
- package/dist/core/codex-control/codex-sdk-capability.js +2 -2
- package/dist/core/codex-lb/combined-catalog/normalize.js +36 -3
- package/dist/core/codex-lb/desktop-bridge/header-policy.js +5 -3
- package/dist/core/codex-lb/desktop-bridge/http-forward.js +48 -3
- package/dist/core/codex-lb/desktop-bridge/server.js +13 -7
- package/dist/core/codex-lb/desktop-bridge-migration/historical-config.js +2 -1
- package/dist/core/codex-lb/desktop-bridge-migration/retired-runtime-cleanup.js +46 -8
- package/dist/core/codex-lb/desktop-controller-v3/lifecycle-commands.js +12 -2
- package/dist/core/codex-lb/desktop-controller-v3/live-probes.js +34 -8
- package/dist/core/codex-lb/desktop-controller-v3/preflight-probes.js +13 -4
- package/dist/core/codex-lb/desktop-controller-v3/shared.js +2 -1
- package/dist/core/codex-lb/desktop-controller-v3/verification.js +10 -9
- package/dist/core/codex-lb/desktop-service.js +57 -4
- package/dist/core/codex-lb/route-index.js +1 -0
- package/dist/core/commands/remote-command.js +2 -2
- package/dist/core/context7-client.js +5 -2
- package/dist/core/doctor/codex-current-core-probe-doctor.js +2 -2
- package/dist/core/doctor/doctor-dirty-planner.js +1 -1
- package/dist/core/doctor/doctor-readiness-matrix.js +0 -7
- package/dist/core/feature-fixtures.js +0 -4
- package/dist/core/feature-registry.js +0 -1
- package/dist/core/image-ux-review.js +3 -3
- package/dist/core/install/installed-package-smoke.js +2 -3
- package/dist/core/mad-sks/sql-plane/mcp-executor.js +4 -3
- package/dist/core/managed-assets/managed-assets-manifest.js +1 -0
- package/dist/core/mcp/modern-protocol.js +36 -0
- package/dist/core/mcp-config/health-check.js +45 -30
- package/dist/core/perf/release-latency-slo.js +1 -2
- package/dist/core/proof/runtime-truth-matrix.js +1 -1
- package/dist/core/release/canonical-test-proof.js +9 -3
- package/dist/core/release/gate-manifest.js +1 -2
- package/dist/core/release/physical-release-gates.js +0 -26
- package/dist/core/release/release-gate-affected-selector.js +0 -1
- package/dist/core/release/release-gate-contract.js +1 -1
- package/dist/core/release/release-pack-receipt.js +0 -1
- package/dist/core/release/stage-publish.js +1 -1
- package/dist/core/routes/evidence.js +1 -1
- package/dist/core/version.js +1 -1
- package/dist/native/sks-menubar/Sources/AppDelegate.swift +1 -12
- package/dist/native/sks-menubar/Sources/CodexLifecyclePolicy.swift +18 -0
- package/dist/native/sks-menubar/Sources/ControlCenterWindowController.swift +2 -6
- package/dist/native/sks-menubar/Sources/ProcessClient.swift +3 -1
- package/dist/native/sks-menubar/Sources/ProvidersRoutingTruth.swift +86 -2
- package/dist/native/sks-menubar/Sources/ProvidersViewController.swift +49 -15
- package/dist/native/sks-menubar/Sources/RemoteCodingViewController.swift +28 -470
- package/dist/native/sks-menubar/Sources/SKSKeychainStore.swift +21 -1
- package/dist/native/sks-menubar/Sources/SecureProcessEnvelope.swift +1 -43
- package/dist/native/sks-menubar/Sources/SettingsViewController.swift +18 -17
- package/dist/native/sks-menubar/Sources/StatusItemController.swift +14 -14
- package/dist/scripts/canonical-test-runner.js +83 -3
- package/dist/scripts/codex-current-app-server-v2-check.js +9 -8
- package/dist/scripts/codex-current-binary-identity-check.js +2 -2
- package/dist/scripts/codex-current-capability-check.js +9 -7
- package/dist/scripts/codex-current-dependency-check.js +21 -0
- package/dist/scripts/docs-truthfulness-check.js +4 -19
- package/dist/scripts/fast-codex-service-tier-proof-check.js +0 -1
- package/dist/scripts/latest-version-guidance-check.js +1 -1
- package/dist/scripts/packlist-performance-check.js +0 -1
- package/dist/scripts/release-metadata-check.js +1 -1
- package/dist/vendor/openai-codex/latest/hooks/permission-request.command.input.schema.json +6 -0
- package/dist/vendor/openai-codex/latest/hooks/permission-request.command.output.schema.json +2 -16
- package/dist/vendor/openai-codex/latest/hooks/post-compact.command.input.schema.json +6 -0
- package/dist/vendor/openai-codex/latest/hooks/post-tool-use.command.input.schema.json +6 -0
- package/dist/vendor/openai-codex/latest/hooks/post-tool-use.command.output.schema.json +2 -16
- package/dist/vendor/openai-codex/latest/hooks/pre-compact.command.input.schema.json +6 -0
- package/dist/vendor/openai-codex/latest/hooks/pre-tool-use.command.input.schema.json +6 -0
- package/dist/vendor/openai-codex/latest/hooks/pre-tool-use.command.output.schema.json +2 -16
- package/dist/vendor/openai-codex/latest/hooks/session-start.command.output.schema.json +2 -16
- package/dist/vendor/openai-codex/latest/hooks/snapshot-metadata.json +7 -5
- package/dist/vendor/openai-codex/latest/hooks/subagent-start.command.output.schema.json +4 -18
- package/dist/vendor/openai-codex/latest/hooks/user-prompt-submit.command.input.schema.json +6 -0
- package/dist/vendor/openai-codex/latest/hooks/user-prompt-submit.command.output.schema.json +2 -16
- package/package.json +3 -7
- package/release-gates.v2.json +10 -17
- package/config/codex-releases/rust-v0.146.0.json +0 -45
- package/dist/core/agents/agent-runner-codex-exec.js +0 -177
- package/dist/core/codex-compat/codex-release-manifest.js +0 -72
- package/dist/core/commands/telegram-command.js +0 -447
- package/dist/core/telegram/access.js +0 -58
- package/dist/core/telegram/client.js +0 -157
- package/dist/core/telegram/confirmation.js +0 -37
- package/dist/core/telegram/doctor.js +0 -159
- package/dist/core/telegram/index.js +0 -9
- package/dist/core/telegram/keychain.js +0 -317
- package/dist/core/telegram/liveness.js +0 -124
- package/dist/core/telegram/poller.js +0 -90
- package/dist/core/telegram/redaction.js +0 -15
- package/dist/core/telegram/state-lock.js +0 -416
- package/dist/core/telegram/types.js +0 -1
- package/dist/native/sks-menubar/Sources/RemoteCodingSettingsControls.swift +0 -160
- package/dist/native/sks-menubar/Sources/TelegramPrivateFileStore.swift +0 -498
- package/dist/native/sks-menubar/Sources/TelegramPrivateFileSupport.swift +0 -236
- package/dist/native/sks-menubar/Sources/TelegramProcessGateway.swift +0 -454
- package/dist/native/sks-menubar/Sources/TelegramRuntimeSupport.swift +0 -56
- package/dist/native/sks-menubar/Sources/TelegramStateLock.swift +0 -448
- package/dist/native/sks-menubar/Sources/TelegramSupport.swift +0 -244
- package/dist/native/sks-menubar/Sources/TelegramTransport.swift +0 -499
- package/dist/scripts/codex-current-manifest-check.js +0 -29
- package/schemas/codex/app-server-0.146/codex_app_server_protocol.v2.schemas.json +0 -19858
package/README.md
CHANGED
|
@@ -22,15 +22,14 @@ 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.
|
|
25
|
+
This README documents package **SKS 8.3.1** — 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
|
|
|
29
|
-
## What 8.
|
|
29
|
+
## What 8.3.1 Ships
|
|
30
30
|
|
|
31
|
-
| Problem | 8.
|
|
31
|
+
| Problem | 8.3.1 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. |
|
|
@@ -40,6 +39,8 @@ Use the official latest stable SKS and Codex CLI releases. The Codex compatibili
|
|
|
40
39
|
| Codex routing was split across legacy provider paths | One local Desktop Bridge is the managed routing runtime; Codex-LB and OpenRouter are simultaneous credential profiles. |
|
|
41
40
|
| Requests could be coupled to a provider mode or weak model heuristic | The combined catalog's explicit route index resolves provider/model pairs with `fallback: none`; missing or ambiguous routes block. |
|
|
42
41
|
| Transport verification was confused with deep evidence | Capability v3 records scope, stage, requested level, execution, and readiness separately; unattempted deep work is not a transport failure. |
|
|
42
|
+
| The Menu Bar could terminate with Codex and miss the next Codex launch | A launchd-resident observer remains alive, follows Codex visibility without terminating, and migrates the legacy quit preference. |
|
|
43
|
+
| A partial Provider repair could look successful because the CLI exited zero | The Center validates the structured command status, records partial repair as needing action, and shows capability issues before verified diagnostic rows. |
|
|
43
44
|
|
|
44
45
|
## Install In One Command
|
|
45
46
|
|
|
@@ -72,111 +73,49 @@ The SKS menu bar shows the installed Codex CLI version and latest known version.
|
|
|
72
73
|
|
|
73
74
|
**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
75
|
|
|
75
|
-
###
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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.
|
|
76
|
+
### Recommended remote companion: Paseo
|
|
77
|
+
|
|
78
|
+
For remote and cross-device coding, Sneakoscope officially recommends
|
|
79
|
+
[Paseo](https://paseo.sh/docs). Start with the Paseo desktop app. For a
|
|
80
|
+
headless machine, install and launch the official CLI:
|
|
81
|
+
|
|
82
|
+
```sh
|
|
83
|
+
npm install -g @getpaseo/cli
|
|
84
|
+
paseo
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Install and authenticate Codex CLI before using it through Paseo. Paseo runs
|
|
88
|
+
the existing provider CLI, so your Codex subscription, configuration, skills,
|
|
89
|
+
and MCP servers remain owned by Codex rather than copied into Sneakoscope.
|
|
90
|
+
|
|
91
|
+
From this repository, start Codex in the current workspace with:
|
|
92
|
+
|
|
93
|
+
```sh
|
|
94
|
+
paseo run --provider codex "Review this repository"
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
For an isolated branch-backed worktree based on `main`, use:
|
|
98
|
+
|
|
99
|
+
```sh
|
|
100
|
+
paseo run --new-workspace worktree --worktree-mode branch-off --new-branch paseo-task --base main "Implement the task"
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
The committed `paseo.json` prepares each new worktree with
|
|
104
|
+
`npm ci --ignore-scripts` followed by `npm run build:clean`. It also exposes
|
|
105
|
+
these named repository actions through Paseo:
|
|
106
|
+
|
|
107
|
+
| Paseo script | Repository command |
|
|
108
|
+
| --- | --- |
|
|
109
|
+
| `build` | `npm run build` |
|
|
110
|
+
| `typecheck` | `npm run typecheck` |
|
|
111
|
+
| `test` | `npm run test` |
|
|
112
|
+
| `release-check` | `npm run release:check:affected` |
|
|
113
|
+
| `release-confidence` | `npm run release:check:confidence` |
|
|
114
|
+
|
|
115
|
+
Paseo is an independent project, not bundled with or operated by Sneakoscope.
|
|
116
|
+
Sneakoscope maintains only this repository's `paseo.json` and usage guidance;
|
|
117
|
+
Paseo installation, authentication, pairing, relay operation, security, and
|
|
118
|
+
product support remain with Paseo and its official documentation.
|
|
180
119
|
|
|
181
120
|
## The Front Door
|
|
182
121
|
|
|
@@ -389,8 +328,8 @@ It shows the current quickstart flow: one-line install, `$sks-plan`, `sks review
|
|
|
389
328
|
- Native capability repair: `sks doctor --fix` (imagegen/Computer Use/Browser Use), `.sneakoscope/reports/native-capability-readiness.json`
|
|
390
329
|
- 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
330
|
- 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
|
|
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
|
|
331
|
+
- 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.
|
|
332
|
+
- 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
333
|
- 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
334
|
- 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
335
|
|
|
@@ -408,7 +347,6 @@ It shows the current quickstart flow: one-line install, `$sks-plan`, `sks review
|
|
|
408
347
|
- The provider services remain independently operated. SKS never deploys them, changes remote credentials, or silently substitutes one profile for another.
|
|
409
348
|
- 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
349
|
- 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
350
|
- 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
351
|
- `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
352
|
- `sks menubar status --json` reports a `codex_sync` object with `bundle_id`, `codex_running`, and `icon_visible_expected` to show Codex-lifecycle detection state.
|
|
@@ -65,6 +65,7 @@
|
|
|
65
65
|
{
|
|
66
66
|
"canonical_name": "sks-computer-use-fast",
|
|
67
67
|
"trusted_sha256": [
|
|
68
|
+
"57e4c1d04ae785b0a53711e53210f2ddabd6131041b97edb4b6d99f18b24155e",
|
|
68
69
|
"b270d82e4057934d7f92ed4241d4ae86e22d0a9a08bceba1aa179d7535bda042",
|
|
69
70
|
"b8736b2621398dfc85f7a2ff35d7a2fc728db0dfc0e964de69aebff93b5ed897"
|
|
70
71
|
]
|
|
@@ -79,6 +80,7 @@
|
|
|
79
80
|
{
|
|
80
81
|
"canonical_name": "sks-cu",
|
|
81
82
|
"trusted_sha256": [
|
|
83
|
+
"be9a3eb7197483693f354e5f7e5a8eb2c0dc0209597cea53479e2e803ad39479",
|
|
82
84
|
"fc6ed807d0299dd56441738d9388787b1dd857dab9bb4c31a11f7d9b90b424d0",
|
|
83
85
|
"da480ba03208d4888df1e97bbec6d80d608dafad0e33c2b1c72266e1860476a8"
|
|
84
86
|
]
|
|
@@ -148,6 +150,7 @@
|
|
|
148
150
|
{
|
|
149
151
|
"canonical_name": "sks-from-chat-img",
|
|
150
152
|
"trusted_sha256": [
|
|
153
|
+
"1cf6b9494829216c27c0778cecd825698c37a6a6dbde67a2a79dd957a32c24cc",
|
|
151
154
|
"be2f0ec42839c0c8ec09c4bfbb99e3c57d6ffe1b8253c2ebbf894200cf8dbf40",
|
|
152
155
|
"583c41f46a7355d8c0c87472ea83573695d04341822eb9adcea822ed3311809f"
|
|
153
156
|
]
|
|
@@ -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
|
},
|
package/dist/commands/codex.js
CHANGED
|
@@ -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 {
|
|
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 ===
|
|
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 ${
|
|
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 || [])
|
package/dist/commands/doctor.js
CHANGED
|
@@ -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,
|
|
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 {
|
|
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: ${
|
|
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.
|
|
3
|
+
"package_version": "8.3.1",
|
|
4
4
|
"skills": [
|
|
5
5
|
{
|
|
6
6
|
"canonical_name": "sks",
|
|
@@ -82,8 +82,9 @@
|
|
|
82
82
|
{
|
|
83
83
|
"canonical_name": "sks-computer-use-fast",
|
|
84
84
|
"type": "official",
|
|
85
|
-
"content_sha256": "
|
|
85
|
+
"content_sha256": "57e4c1d04ae785b0a53711e53210f2ddabd6131041b97edb4b6d99f18b24155e",
|
|
86
86
|
"hash_history": [
|
|
87
|
+
"b270d82e4057934d7f92ed4241d4ae86e22d0a9a08bceba1aa179d7535bda042",
|
|
87
88
|
"b8736b2621398dfc85f7a2ff35d7a2fc728db0dfc0e964de69aebff93b5ed897"
|
|
88
89
|
],
|
|
89
90
|
"deprecated_aliases": []
|
|
@@ -100,8 +101,9 @@
|
|
|
100
101
|
{
|
|
101
102
|
"canonical_name": "sks-cu",
|
|
102
103
|
"type": "official",
|
|
103
|
-
"content_sha256": "
|
|
104
|
+
"content_sha256": "be9a3eb7197483693f354e5f7e5a8eb2c0dc0209597cea53479e2e803ad39479",
|
|
104
105
|
"hash_history": [
|
|
106
|
+
"fc6ed807d0299dd56441738d9388787b1dd857dab9bb4c31a11f7d9b90b424d0",
|
|
105
107
|
"da480ba03208d4888df1e97bbec6d80d608dafad0e33c2b1c72266e1860476a8"
|
|
106
108
|
],
|
|
107
109
|
"deprecated_aliases": []
|
|
@@ -188,8 +190,9 @@
|
|
|
188
190
|
{
|
|
189
191
|
"canonical_name": "sks-from-chat-img",
|
|
190
192
|
"type": "official",
|
|
191
|
-
"content_sha256": "
|
|
193
|
+
"content_sha256": "1cf6b9494829216c27c0778cecd825698c37a6a6dbde67a2a79dd957a32c24cc",
|
|
192
194
|
"hash_history": [
|
|
195
|
+
"be2f0ec42839c0c8ec09c4bfbb99e3c57d6ffe1b8253c2ebbf894200cf8dbf40",
|
|
193
196
|
"583c41f46a7355d8c0c87472ea83573695d04341822eb9adcea822ed3311809f"
|
|
194
197
|
],
|
|
195
198
|
"deprecated_aliases": []
|