sneakoscope 8.1.2 → 8.2.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 (261) hide show
  1. package/README.md +96 -58
  2. package/crates/sks-core/Cargo.lock +1 -1
  3. package/crates/sks-core/Cargo.toml +1 -1
  4. package/dist/bin/fast-inline.js +5 -51
  5. package/dist/cli/command-manifest-lite.js +2 -1
  6. package/dist/cli/command-registry.js +2 -1
  7. package/dist/cli/global-mode-router.js +1 -1
  8. package/dist/cli/install-helpers-codex-lb-config.js +112 -914
  9. package/dist/cli/install-helpers-codex-lb-shared.js +3 -44
  10. package/dist/cli/install-helpers-install-support.js +4 -20
  11. package/dist/cli/install-helpers.js +36 -2716
  12. package/dist/cli/router.js +9 -9
  13. package/dist/commands/bridge-command-output.js +111 -0
  14. package/dist/commands/bridge.js +320 -0
  15. package/dist/commands/codex-app.js +39 -123
  16. package/dist/commands/doctor-helpers.js +380 -0
  17. package/dist/commands/doctor-profile.js +3 -0
  18. package/dist/commands/doctor.js +114 -873
  19. package/dist/commands/mad-sks.js +0 -4
  20. package/dist/config/skills-manifest.json +1 -1
  21. package/dist/core/agents/agent-effort-policy.js +11 -21
  22. package/dist/core/agents/agent-recursion-guard.js +26 -0
  23. package/dist/core/agents/agent-runner-codex-exec.js +7 -9
  24. package/dist/core/architecture-hardening/contracts/contracts.js +225 -161
  25. package/dist/core/architecture-hardening/state/state-service.js +49 -13
  26. package/dist/core/auto-review.js +15 -9
  27. package/dist/core/codex/codex-config-guard.js +8 -0
  28. package/dist/core/codex-adapter.js +8 -10
  29. package/dist/core/codex-app/codex-app-fast-ui-repair.js +7 -29
  30. package/dist/core/codex-app/codex-app-launcher.js +10 -12
  31. package/dist/core/codex-app/codex-app-restart.js +10 -12
  32. package/dist/core/codex-app/menubar/constants.js +2 -5
  33. package/dist/core/codex-app/menubar/global-install.js +3 -2
  34. package/dist/core/codex-app/menubar/installer/result.js +23 -0
  35. package/dist/core/codex-app/menubar/installer/runtime.js +28 -0
  36. package/dist/core/codex-app/menubar/installer.js +5 -96
  37. package/dist/core/codex-app/menubar/migration.js +1 -42
  38. package/dist/core/codex-app/openrouter-provider.js +0 -78
  39. package/dist/core/codex-app.js +97 -360
  40. package/dist/core/codex-control/codex-app-server-runtime-env.js +8 -28
  41. package/dist/core/codex-control/codex-current-image-path-real-probe.js +2 -3
  42. package/dist/core/codex-control/codex-current-web-search-probe.js +2 -3
  43. package/dist/core/codex-control/codex-sdk-adapter.js +5 -48
  44. package/dist/core/codex-control/codex-task-runner.js +16 -60
  45. package/dist/core/codex-control/desktop-bridge-launch-guard.js +227 -0
  46. package/dist/core/codex-exec-output-schema.js +11 -13
  47. package/dist/core/codex-lb/bridge-contracts.js +2 -0
  48. package/dist/core/codex-lb/bridge-runtime-validation/capability.js +104 -0
  49. package/dist/core/codex-lb/bridge-runtime-validation/catalog.js +52 -0
  50. package/dist/core/codex-lb/bridge-runtime-validation/shared.js +109 -0
  51. package/dist/core/codex-lb/bridge-runtime-validation/status.js +250 -0
  52. package/dist/core/codex-lb/bridge-runtime-validation.js +106 -0
  53. package/dist/core/codex-lb/capability-runner.js +505 -201
  54. package/dist/core/codex-lb/codex-lb-env.js +179 -12
  55. package/dist/core/codex-lb/combined-catalog/builder.js +86 -0
  56. package/dist/core/codex-lb/combined-catalog/contracts.js +5 -0
  57. package/dist/core/codex-lb/combined-catalog/normalize.js +170 -0
  58. package/dist/core/codex-lb/combined-catalog/persistence.js +207 -0
  59. package/dist/core/codex-lb/combined-catalog/shared.js +12 -0
  60. package/dist/core/codex-lb/combined-catalog/storage.js +171 -0
  61. package/dist/core/codex-lb/combined-catalog.js +12 -0
  62. package/dist/core/codex-lb/desktop-bridge/client.js +4 -1
  63. package/dist/core/codex-lb/desktop-bridge/header-policy.js +48 -63
  64. package/dist/core/codex-lb/desktop-bridge/http-forward.js +115 -83
  65. package/dist/core/codex-lb/desktop-bridge/launchd.js +20 -13
  66. package/dist/core/codex-lb/desktop-bridge/location-rewrite.js +4 -1
  67. package/dist/core/codex-lb/desktop-bridge/security.js +381 -267
  68. package/dist/core/codex-lb/desktop-bridge/server.js +148 -19
  69. package/dist/core/codex-lb/desktop-bridge/state.js +56 -70
  70. package/dist/core/codex-lb/desktop-bridge/types.js +6 -1
  71. package/dist/core/codex-lb/desktop-bridge/websocket-forward.js +281 -106
  72. package/dist/core/codex-lb/desktop-bridge-migration/historical-config.js +245 -0
  73. package/dist/core/codex-lb/desktop-bridge-migration/historical-toml.js +56 -0
  74. package/dist/core/codex-lb/desktop-bridge-migration/metadata.js +73 -0
  75. package/dist/core/codex-lb/desktop-bridge-migration/receipt.js +52 -0
  76. package/dist/core/codex-lb/desktop-bridge-migration/retired-runtime-cleanup.js +106 -0
  77. package/dist/core/codex-lb/desktop-bridge-migration/types.js +1 -0
  78. package/dist/core/codex-lb/desktop-bridge-migration.js +238 -0
  79. package/dist/core/codex-lb/desktop-controller-v3/catalog.js +257 -0
  80. package/dist/core/codex-lb/desktop-controller-v3/diagnostics.js +62 -0
  81. package/dist/core/codex-lb/desktop-controller-v3/lifecycle-commands.js +203 -0
  82. package/dist/core/codex-lb/desktop-controller-v3/live-probes.js +293 -0
  83. package/dist/core/codex-lb/desktop-controller-v3/preflight-probes.js +144 -0
  84. package/dist/core/codex-lb/desktop-controller-v3/provider-commands.js +182 -0
  85. package/dist/core/codex-lb/desktop-controller-v3/shared.js +279 -0
  86. package/dist/core/codex-lb/desktop-controller-v3/status.js +269 -0
  87. package/dist/core/codex-lb/desktop-controller-v3/types.js +1 -0
  88. package/dist/core/codex-lb/desktop-controller-v3/verification.js +89 -0
  89. package/dist/core/codex-lb/desktop-controller-v3.js +67 -0
  90. package/dist/core/codex-lb/desktop-controller.js +2 -1730
  91. package/dist/core/codex-lb/desktop-service.js +462 -627
  92. package/dist/core/codex-lb/migration-receipt.js +560 -118
  93. package/dist/core/codex-lb/probes/auxiliary-surfaces-probe.js +37 -53
  94. package/dist/core/codex-lb/probes/bridge-probe.js +125 -64
  95. package/dist/core/codex-lb/probes/catalog-probe.js +36 -136
  96. package/dist/core/codex-lb/probes/computer-use-probe.js +63 -39
  97. package/dist/core/codex-lb/probes/image-generation-probe.js +98 -41
  98. package/dist/core/codex-lb/probes/probe-evidence.js +32 -33
  99. package/dist/core/codex-lb/probes/voice-realtime-probe.js +69 -43
  100. package/dist/core/codex-lb/provider-credentials/configuration.js +127 -0
  101. package/dist/core/codex-lb/provider-credentials/locks.js +11 -0
  102. package/dist/core/codex-lb/provider-credentials/private-snapshot.js +28 -0
  103. package/dist/core/codex-lb/provider-credentials/removal.js +33 -0
  104. package/dist/core/codex-lb/provider-credentials/resolution.js +59 -0
  105. package/dist/core/codex-lb/provider-credentials/runtime.js +55 -0
  106. package/dist/core/codex-lb/provider-credentials/types.js +1 -0
  107. package/dist/core/codex-lb/provider-credentials/validation-store.js +137 -0
  108. package/dist/core/codex-lb/provider-credentials.js +5 -0
  109. package/dist/core/codex-lb/provider-registry.js +323 -0
  110. package/dist/core/codex-lb/provider-route-policy.js +118 -0
  111. package/dist/core/codex-lb/request-route-resolver.js +172 -0
  112. package/dist/core/codex-lb/route-index.js +148 -0
  113. package/dist/core/codex-lb/trusted-deep-evidence.js +158 -286
  114. package/dist/core/commands/basic-cli.js +1 -1
  115. package/dist/core/commands/check-command.js +3 -10
  116. package/dist/core/commands/gate-result-contract.js +10 -14
  117. package/dist/core/commands/intent-normalization/normalizer.js +1 -1
  118. package/dist/core/commands/mad-sks-command.js +2 -6
  119. package/dist/core/commands/release-command.js +11 -1
  120. package/dist/core/commands/telegram-command.js +46 -6
  121. package/dist/core/doctor/doctor-readiness-matrix.js +9 -7
  122. package/dist/core/doctor/skill-legacy-surface.js +5 -5
  123. package/dist/core/evidence/v2/evidence-key.js +30 -3
  124. package/dist/core/feature-fixtures.js +8 -1
  125. package/dist/core/feature-registry.js +3 -2
  126. package/dist/core/hooks-runtime/stop-finalization.js +11 -1
  127. package/dist/core/hooks-runtime/subagent-context.js +15 -1
  128. package/dist/core/hooks-runtime/subagent-skill-availability-contract.js +1 -1
  129. package/dist/core/hooks-runtime/tool-output-quarantine.js +1 -1
  130. package/dist/core/hooks-runtime.js +73 -87
  131. package/dist/core/image-ux-review/imagegen-adapter.js +108 -94
  132. package/dist/core/image-ux-review/real-callout-extractor.js +144 -14
  133. package/dist/core/imagegen/desktop-bridge-imagegen-target.js +77 -0
  134. package/dist/core/imagegen/imagegen-capability.js +43 -151
  135. package/dist/core/init/skills/filesystem.js +89 -0
  136. package/dist/core/init/skills/inventory.js +97 -0
  137. package/dist/core/init/skills/manifest.js +151 -0
  138. package/dist/core/init/skills.js +5 -325
  139. package/dist/core/init.js +0 -63
  140. package/dist/core/install/installed-package-smoke.js +1 -1
  141. package/dist/core/managed-assets/managed-assets-manifest.js +0 -1
  142. package/dist/core/policy/latest-version-guidance.js +15 -2
  143. package/dist/core/preflight/parallel-preflight-engine.js +27 -51
  144. package/dist/core/provider/provider-badge.js +9 -4
  145. package/dist/core/provider/provider-context.js +57 -107
  146. package/dist/core/providers/openrouter/openrouter-account.js +3 -1
  147. package/dist/core/providers/openrouter/openrouter-secret-store.js +91 -22
  148. package/dist/core/release/desktop-bridge-release-evidence.js +457 -0
  149. package/dist/core/release/gate-manifest.js +0 -1
  150. package/dist/core/release/main-push-guard.js +13 -0
  151. package/dist/core/release/main-push-receipt.js +11 -0
  152. package/dist/core/release/physical-release-gates.js +664 -61
  153. package/dist/core/release/publish-preflight.js +3 -3
  154. package/dist/core/release/release-gate-batch-runner.js +19 -6
  155. package/dist/core/release/release-gate-dag.js +33 -6
  156. package/dist/core/release/release-gate-node.js +1 -3
  157. package/dist/core/release/release-gate-output-contract.js +55 -0
  158. package/dist/core/release/release-pack-contract.js +1 -1
  159. package/dist/core/release/release-pack-receipt.js +209 -8
  160. package/dist/core/release/release-real-contract.js +1 -1
  161. package/dist/core/release/stage-publish.js +106 -28
  162. package/dist/core/retention/temp-lease.js +204 -0
  163. package/dist/core/retention.js +18 -195
  164. package/dist/core/routes.js +1 -2
  165. package/dist/core/safety/intent-contract/intent-contract.js +3 -3
  166. package/dist/core/subagents/naruto-host-credentials.js +6 -1
  167. package/dist/core/subagents/official-subagent-config.js +27 -9
  168. package/dist/core/subagents/official-subagent-runner.js +14 -31
  169. package/dist/core/subagents/wave-lifecycle.js +36 -8
  170. package/dist/core/subagents/wave-parent-guidance.js +2 -1
  171. package/dist/core/telegram/doctor.js +2 -2
  172. package/dist/core/telegram/liveness.js +10 -4
  173. package/dist/core/triwiki/context-graph/compiler/index.js +18 -18
  174. package/dist/core/update/update-migration-state/fast-mode-config.js +172 -0
  175. package/dist/core/update/update-migration-state/session-state-split.js +247 -0
  176. package/dist/core/update/update-migration-state/simple-stages.js +46 -0
  177. package/dist/core/update/update-migration-state.js +4 -481
  178. package/dist/core/version.js +1 -1
  179. package/dist/native/sks-menubar/Sources/OperationCoordinator.swift +28 -4
  180. package/dist/native/sks-menubar/Sources/OperationModels.swift +112 -2
  181. package/dist/native/sks-menubar/Sources/ProviderRouteExplanation.swift +21 -0
  182. package/dist/native/sks-menubar/Sources/ProvidersBridgeCatalog.swift +140 -0
  183. package/dist/native/sks-menubar/Sources/ProvidersOpenRouter.swift +107 -470
  184. package/dist/native/sks-menubar/Sources/ProvidersReliability.swift +27 -197
  185. package/dist/native/sks-menubar/Sources/ProvidersRoutingTruth.swift +335 -269
  186. package/dist/native/sks-menubar/Sources/ProvidersViewController.swift +233 -437
  187. package/dist/native/sks-menubar/Sources/RemoteCodingViewController.swift +16 -7
  188. package/dist/native/sks-menubar/Sources/SecureProcessEnvelope.swift +39 -9
  189. package/dist/native/sks-menubar/Sources/TelegramSupport.swift +56 -0
  190. package/dist/scripts/canonical-test-runner.js +7 -1
  191. package/dist/scripts/check-runtime-schemas.js +7 -2
  192. package/dist/scripts/codex-sdk-real-smoke-check.js +3 -1
  193. package/dist/scripts/desktop-bridge-capabilities-check.js +123 -0
  194. package/dist/scripts/{codex-lb-desktop-bridge-latency-check.js → desktop-bridge-latency-check.js} +61 -16
  195. package/dist/scripts/desktop-bridge-real-evidence-check.js +64 -0
  196. package/dist/scripts/{codex-lb-desktop-bridge-check.js → desktop-bridge-transport-check.js} +92 -155
  197. package/dist/scripts/desktop-bridge-transport-client.js +116 -0
  198. package/dist/scripts/desktop-bridge-unification-check.js +276 -0
  199. package/dist/scripts/doctor-fixes-codex-app-fast-ui-check.js +12 -8
  200. package/dist/scripts/gate-policy-audit-check.js +52 -2
  201. package/dist/scripts/provider-badge-context-check.js +55 -12
  202. package/dist/scripts/publish-preflight.js +1 -2
  203. package/dist/scripts/release-affected-selector-check.js +1 -2
  204. package/dist/scripts/release-aggressive-resource-governor-check.js +1 -1
  205. package/dist/scripts/release-cache-glob-hashing-check.js +1 -0
  206. package/dist/scripts/release-cache-version-neutral-fixture-check.js +1 -0
  207. package/dist/scripts/release-full-parallelism-blackbox.js +1 -1
  208. package/dist/scripts/release-gate-batch-runner-check.js +9 -0
  209. package/dist/scripts/release-gate-dag-runner-check.js +6 -0
  210. package/dist/scripts/release-gate-dag-runner.js +4 -2
  211. package/dist/scripts/release-metadata-check.js +16 -3
  212. package/dist/scripts/release-pack-receipt.js +29 -6
  213. package/dist/scripts/release-physical-gates-check.js +39 -0
  214. package/dist/scripts/release-real-check.js +7 -5
  215. package/package.json +6 -8
  216. package/release-gates.v2.json +156 -157
  217. package/runtime-required-scripts.json +11 -11
  218. package/schemas/codex/desktop-bridge-status-v3.schema.json +286 -0
  219. package/schemas/codex/desktop-capabilities-v3.schema.json +198 -0
  220. package/schemas/release/release-gate-node.schema.json +2 -3
  221. package/dist/cli/codex-lb-setup-warning-output.js +0 -17
  222. package/dist/cli/install-helpers-codex-lb-chain.js +0 -529
  223. package/dist/commands/codex-lb.js +0 -1232
  224. package/dist/core/architecture-hardening/migration/migration.js +0 -111
  225. package/dist/core/codex-app/auxiliary-oauth-policy.js +0 -36
  226. package/dist/core/codex-app/catalog-compat/catalog-service.js +0 -104
  227. package/dist/core/codex-app/child-policy/child-policy.js +0 -35
  228. package/dist/core/codex-app/desktop-routing-snapshot.js +0 -233
  229. package/dist/core/codex-app/glm-model-profile.js +0 -1
  230. package/dist/core/codex-app/glm-profile-installer.js +0 -191
  231. package/dist/core/codex-app/glm-profile-schema.js +0 -42
  232. package/dist/core/codex-app/multi-provider-router.js +0 -391
  233. package/dist/core/codex-app/openrouter-activate.js +0 -405
  234. package/dist/core/codex-app/openrouter-model-catalog.js +0 -217
  235. package/dist/core/codex-app/provider-child-policy.js +0 -64
  236. package/dist/core/codex-app/provider-mode.js +0 -91
  237. package/dist/core/codex-app/provider-session-policy.js +0 -85
  238. package/dist/core/codex-app/session-policy/session-pinning.js +0 -68
  239. package/dist/core/codex-control/codex-lb-launch-recovery.js +0 -319
  240. package/dist/core/codex-lb/codex-lb-setup.js +0 -293
  241. package/dist/core/codex-lb/codex-lb-tool-catalog.js +0 -456
  242. package/dist/core/codex-lb/codex-lb-tool-output-recovery.js +0 -290
  243. package/dist/core/codex-lb/desktop-center-credentials.js +0 -1083
  244. package/dist/core/codex-lb/desktop-mode.js +0 -32
  245. package/dist/core/codex-lb/desktop-real-evidence.js +0 -168
  246. package/dist/core/codex-lb/legacy-migration.js +0 -576
  247. package/dist/core/codex-lb/native-openai-transport/transport.js +0 -68
  248. package/dist/core/codex-lb/provider-routing/provider-router.js +0 -58
  249. package/dist/core/codex-lb/routing-truth.js +0 -327
  250. package/dist/core/imagegen/codex-lb-imagegen-target.js +0 -92
  251. package/dist/native/sks-menubar/Sources/ProvidersConnectTest.swift +0 -118
  252. package/dist/native/sks-menubar/Sources/ProvidersFastMode.swift +0 -17
  253. package/dist/native/sks-menubar/Sources/ProvidersMultiProvider.swift +0 -331
  254. package/dist/native/sks-menubar/Sources/ProvidersRoleModels.swift +0 -260
  255. package/dist/scripts/codex-lb-catalog-passthrough-check.js +0 -120
  256. package/dist/scripts/codex-lb-desktop-auth-invariant-check.js +0 -169
  257. package/dist/scripts/codex-lb-desktop-capabilities-check.js +0 -287
  258. package/dist/scripts/codex-lb-desktop-real-evidence-check.js +0 -123
  259. package/dist/scripts/codex-lb-fast-mode-truth-check.js +0 -114
  260. package/dist/scripts/codex-lb-fast-ui-preservation-check.js +0 -152
  261. package/dist/scripts/codex-lb-gpt56-fast-profile-check.js +0 -231
@@ -0,0 +1,269 @@
1
+ import { DESKTOP_BRIDGE_MANAGED_BASE_URL_MARKER, DESKTOP_BRIDGE_MANAGED_MARKER, DESKTOP_BRIDGE_MANAGED_MODEL_CATALOG_MARKER } from '../../../cli/install-helpers-codex-lb-config.js';
2
+ import { readActiveCombinedBridgeCatalog } from '../combined-catalog.js';
3
+ import { desktopBridgeServiceStatus } from '../desktop-service.js';
4
+ import { captureCodexAuthSnapshot } from '../desktop-auth-invariant.js';
5
+ import { readText } from '../../fsx.js';
6
+ import { resolveBridgeProviderRegistry } from '../provider-registry.js';
7
+ import { readBridgeRoutingPolicy, validateBridgeRoutingPolicy } from '../provider-route-policy.js';
8
+ import { sha256Stable } from '../route-index.js';
9
+ import { assertDesktopBridgeStatusV3 } from '../bridge-runtime-validation.js';
10
+ import { desktopBridgeReportReadinessV3, readLastDiagnostic } from './diagnostics.js';
11
+ import { activeProviderIds, controllerPaths, emptyScope, makeId, providerCode, providerRegistrySnapshot, recoveryActions, resolveValidatedCredentials, serviceLoopbackOrigin, unique } from './shared.js';
12
+ export async function desktopBridgeStatusV3(options = {}) {
13
+ const core = await loadCore(options);
14
+ const status = statusFromCore(core, options);
15
+ assertDesktopBridgeStatusV3(status);
16
+ return status;
17
+ }
18
+ export async function loadCore(options) {
19
+ const paths = controllerPaths(options);
20
+ const checkedAt = (options.now ? options.now() : new Date()).toISOString();
21
+ const [config, credentials, activeCatalog, policyRead, auth] = await Promise.all([
22
+ readText(paths.configPath, ''),
23
+ resolveValidatedCredentials(options, paths),
24
+ readActiveCombinedBridgeCatalog(paths.catalogPath, paths.routeIndexPath),
25
+ readBridgeRoutingPolicy(paths.routePolicyPath),
26
+ captureCodexAuthSnapshot({ home: paths.home, authPath: paths.authPath })
27
+ ]);
28
+ const registry = await resolveBridgeProviderRegistry({ home: paths.home, credentials });
29
+ const policyBlockers = policyRead.policy && activeCatalog.ok
30
+ ? validateBridgeRoutingPolicy(policyRead.policy, activeCatalog.route_index)
31
+ : policyRead.blockers;
32
+ const policy = policyBlockers.length === 0 ? policyRead.policy : null;
33
+ const snapshot = activeCatalog.ok
34
+ ? providerRegistrySnapshot(registry, activeCatalog.route_index)
35
+ : undefined;
36
+ const service = await (options.serviceStatusImpl || desktopBridgeServiceStatus)({
37
+ ...options,
38
+ home: paths.home,
39
+ ...(snapshot ? { providerRegistry: snapshot } : {}),
40
+ ...(policy ? { routePolicy: policy } : {})
41
+ });
42
+ const catalogSync = desktopBridgeCatalogStatusV3(activeCatalog, registry, policy, policyBlockers, checkedAt);
43
+ const diagnostic = await readLastDiagnostic(paths.diagnosticPath, catalogSync.generation, service.state?.process_generation || null, service.state?.last_verified_probe_ids || []);
44
+ return { paths, checkedAt, config, credentials, registry, activeCatalog, policy, policyBlockers, service, auth, catalogSync, diagnostic };
45
+ }
46
+ export function statusFromCore(core, options) {
47
+ const managedConfig = isManagedConfig(core.config);
48
+ const serviceState = serviceRuntimeState(core.service);
49
+ const managed = managedConfig || core.service.installed || core.service.running;
50
+ const management = managed
51
+ ? { managed: true, runtime: 'desktop-bridge', state: serviceState, reason: null }
52
+ : {
53
+ managed: false,
54
+ runtime: null,
55
+ state: core.service.installed ? 'stopped' : 'not_installed',
56
+ reason: core.config.trim() ? 'uninstalled' : 'never_configured'
57
+ };
58
+ const activeProviders = activeProviderIds(core);
59
+ const activeBlockers = [];
60
+ const warnings = [];
61
+ if (managedConfig && !core.service.running)
62
+ activeBlockers.push(...core.service.blockers);
63
+ if (activeProviders.length === 0)
64
+ activeBlockers.push('bridge_active_route_not_selected');
65
+ for (const providerId of ['codex-lb', 'openrouter']) {
66
+ const profile = core.registry.profiles[providerId];
67
+ const problems = unique([...profile.blockers, ...core.catalogSync.providers[providerId].blockers]);
68
+ if (activeProviders.includes(providerId))
69
+ activeBlockers.push(...problems);
70
+ else
71
+ warnings.push(...problems.map((problem) => `inactive_provider:${providerId}:${problem}`));
72
+ }
73
+ const activeCatalogReady = activeProviders.length > 0 && activeProviders.every((providerId) => core.catalogSync.providers[providerId].state === 'verified'
74
+ && core.policy
75
+ && Object.values(core.policy.model_routes).some((route) => route.provider_id === providerId));
76
+ if (!activeCatalogReady)
77
+ activeBlockers.push(...core.catalogSync.blockers);
78
+ const oauthConfigured = core.auth.mode === 'chatgpt_oauth' || core.auth.mode === 'mixed';
79
+ if (managedConfig && !oauthConfigured)
80
+ activeBlockers.push('chatgpt_oauth_required_for_desktop');
81
+ const lastReport = core.diagnostic?.report || null;
82
+ const reportReadiness = desktopBridgeReportReadinessV3(lastReport);
83
+ const bridgeReady = core.service.running && reportReadiness.bridge_ready;
84
+ const activeRoutesReady = activeCatalogReady
85
+ && activeProviders.every((providerId) => core.registry.profiles[providerId].state === 'ready')
86
+ && reportReadiness.active_routes_ready;
87
+ const ready = managedConfig && bridgeReady && activeRoutesReady && oauthConfigured;
88
+ const readinessState = !managed
89
+ ? 'unmanaged'
90
+ : activeProviders.length === 0
91
+ ? 'awaiting_provider'
92
+ : ready
93
+ ? 'ready'
94
+ : core.service.running && activeCatalogReady ? 'degraded' : 'blocked';
95
+ const providerSetupActions = activeProviders.length === 0
96
+ ? ['configure_codex_lb_credential', 'configure_openrouter_credential']
97
+ : [];
98
+ return {
99
+ schema: 'sks.desktop-bridge-status.v3',
100
+ checked_at: core.checkedAt,
101
+ correlation_id: makeId('status', options),
102
+ management,
103
+ service: {
104
+ state: serviceState,
105
+ installed: core.service.installed,
106
+ loaded: core.service.loaded,
107
+ running: core.service.running,
108
+ loopback_origin: serviceLoopbackOrigin(core.service),
109
+ pid: core.service.state?.pid || null,
110
+ checked_at: core.checkedAt,
111
+ blockers: [...core.service.blockers],
112
+ warnings: []
113
+ },
114
+ http_probe: core.diagnostic?.http_probe || null,
115
+ websocket_probe: core.diagnostic?.websocket_probe || null,
116
+ native_identity: {
117
+ state: oauthConfigured ? 'verified' : 'blocked',
118
+ configured: oauthConfigured,
119
+ semantic_identity_preserved: null,
120
+ checked_at: core.checkedAt,
121
+ blockers: oauthConfigured ? [] : ['chatgpt_oauth_required_for_desktop'],
122
+ warnings: []
123
+ },
124
+ providers: {
125
+ 'codex-lb': providerProfileStatus(core, 'codex-lb'),
126
+ openrouter: providerProfileStatus(core, 'openrouter')
127
+ },
128
+ routing: {
129
+ policy: core.policy,
130
+ selected_model: null,
131
+ selected_route: null,
132
+ session_pin: null,
133
+ fallback: 'none',
134
+ blockers: [...core.policyBlockers],
135
+ warnings: []
136
+ },
137
+ catalog_sync: core.catalogSync,
138
+ capabilities: lastReport,
139
+ readiness: {
140
+ ready,
141
+ state: readinessState,
142
+ bridge_ready: bridgeReady,
143
+ active_routes_ready: activeRoutesReady,
144
+ combined_catalog_ready: activeCatalogReady,
145
+ blockers: unique(activeBlockers),
146
+ warnings: unique([...warnings, ...core.catalogSync.warnings])
147
+ },
148
+ recovery_actions: unique([
149
+ ...providerSetupActions,
150
+ ...recoveryActions(unique(activeBlockers))
151
+ ])
152
+ };
153
+ }
154
+ function providerProfileStatus(core, providerId) {
155
+ const profile = core.registry.profiles[providerId];
156
+ return {
157
+ schema: 'sks.bridge-provider-profile-status.v1',
158
+ provider_id: providerId,
159
+ enabled: profile.enabled,
160
+ credential: {
161
+ state: profile.credential.state,
162
+ source: profile.credential.source,
163
+ fingerprint: profile.credential.fingerprint,
164
+ checked_at: profile.credential.checked_at,
165
+ blockers: [...profile.credential.blockers],
166
+ warnings: [...profile.credential.warnings]
167
+ },
168
+ endpoint: {
169
+ configured: profile.endpoint.configured,
170
+ origin_redacted: profile.endpoint.origin_redacted,
171
+ auth_transport: profile.endpoint.auth_transport
172
+ },
173
+ catalog: core.catalogSync.providers[providerId],
174
+ capabilities: core.diagnostic?.report.providers[providerId] || emptyScope(`provider:${providerId}`, core.checkedAt)
175
+ };
176
+ }
177
+ export function desktopBridgeCatalogStatusV3(active, registry, policy, policyBlockers, checkedAt) {
178
+ const providerRows = Object.fromEntries(['codex-lb', 'openrouter'].map((providerId) => {
179
+ const profile = registry.profiles[providerId];
180
+ const models = active.ok ? active.catalog.models.filter((model) => model.provider_id === providerId) : [];
181
+ const indexed = active.ok ? active.route_index.providers[providerId] : null;
182
+ const persisted = active.ok ? active.catalog.provider_statuses[providerId] : null;
183
+ const expired = Boolean(persisted?.expires_at && Date.parse(persisted.expires_at) <= Date.parse(checkedAt));
184
+ const state = !active.ok
185
+ ? 'not_started'
186
+ : !profile.enabled ? 'not_started'
187
+ : expired ? 'stale'
188
+ : indexed?.state === 'ready' && models.length > 0
189
+ && persisted?.state === 'verified' && persisted.generation === indexed.catalog_generation
190
+ ? 'verified'
191
+ : profile.state === 'ready' ? 'failed' : 'degraded';
192
+ const blockers = state === 'stale'
193
+ ? [`${providerCode(providerId)}_catalog_stale`]
194
+ : state === 'failed' ? [`${providerCode(providerId)}_catalog_not_verified`]
195
+ : state === 'degraded' ? [...profile.blockers] : [];
196
+ const row = {
197
+ schema: 'sks.catalog-sync-state.v2',
198
+ provider_id: providerId,
199
+ state,
200
+ source: providerId === 'codex-lb' ? 'gateway' : 'openrouter',
201
+ generation: indexed?.catalog_generation || null,
202
+ digest: models.length > 0 ? sha256Stable({ provider_id: providerId, models }) : null,
203
+ model_count: models.length,
204
+ checked_at: persisted?.checked_at || (active.ok ? active.catalog.created_at : null),
205
+ expires_at: persisted?.expires_at || null,
206
+ blockers: unique(blockers),
207
+ warnings: [],
208
+ recovery_action: blockers.length > 0 ? 'retry_catalog_sync' : null
209
+ };
210
+ return [providerId, row];
211
+ }));
212
+ const enabled = ['codex-lb', 'openrouter'].filter((id) => registry.profiles[id].enabled);
213
+ const verified = enabled.filter((id) => providerRows[id].state === 'verified');
214
+ const stale = enabled.filter((id) => providerRows[id].state === 'stale');
215
+ const conflicts = active.ok ? active.route_index.conflicts.length : 0;
216
+ const generationMatches = Boolean(active.ok && policy && policy.catalog_generation === active.catalog.generation);
217
+ const state = !active.ok ? 'not_started'
218
+ : conflicts > 0 ? 'failed'
219
+ : !generationMatches ? 'stale'
220
+ : verified.length === 0 && stale.length > 0 ? 'stale'
221
+ : verified.length === 0 ? 'failed'
222
+ : verified.length < enabled.length ? 'degraded' : 'verified';
223
+ const blockers = unique([
224
+ ...active.blockers,
225
+ ...policyBlockers,
226
+ ...(conflicts > 0 ? ['catalog_model_route_ambiguous'] : []),
227
+ ...(active.ok && !generationMatches ? ['catalog_route_index_stale'] : []),
228
+ ...(state === 'stale' ? enabled.flatMap((id) => providerRows[id].blockers) : []),
229
+ ...(state === 'failed' && conflicts === 0 ? enabled.flatMap((id) => providerRows[id].blockers) : [])
230
+ ]);
231
+ const warnings = unique(enabled.filter((id) => providerRows[id].state !== 'verified')
232
+ .flatMap((id) => providerRows[id].blockers.map((item) => `provider_catalog:${id}:${item}`)));
233
+ return {
234
+ schema: 'sks.combined-catalog-sync.v1',
235
+ state,
236
+ generation: active.ok ? active.catalog.generation : null,
237
+ digest: active.ok ? active.catalog.digest : null,
238
+ model_count: active.ok ? active.catalog.models.length : null,
239
+ route_count: active.ok ? Object.keys(active.route_index.routes).length : null,
240
+ conflict_count: conflicts,
241
+ checked_at: active.ok ? active.catalog.created_at : checkedAt,
242
+ providers: providerRows,
243
+ blockers,
244
+ warnings,
245
+ recovery_action: state === 'verified' ? null : conflicts > 0 ? 'resolve_catalog_route_conflict' : 'retry_catalog_sync'
246
+ };
247
+ }
248
+ function serviceRuntimeState(service) {
249
+ if (service.running && service.ok)
250
+ return 'ready';
251
+ if (service.running)
252
+ return 'degraded';
253
+ if (service.status === 'stale')
254
+ return 'stale';
255
+ if (!service.installed && !service.settings)
256
+ return 'not_installed';
257
+ if (service.blockers.length > 0)
258
+ return 'blocked';
259
+ return 'stopped';
260
+ }
261
+ function isManagedConfig(config) {
262
+ const top = String(config || '').split(/\n\s*\[/)[0] || '';
263
+ return [
264
+ DESKTOP_BRIDGE_MANAGED_MARKER,
265
+ DESKTOP_BRIDGE_MANAGED_BASE_URL_MARKER,
266
+ DESKTOP_BRIDGE_MANAGED_MODEL_CATALOG_MARKER
267
+ ].every((marker) => top.split(/\r?\n/).some((line) => line.trim() === marker))
268
+ && /^\s*model_provider\s*=\s*"openai"\s*(?:#.*)?$/m.test(top);
269
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,89 @@
1
+ import { refreshDesktopBridgeState } from '../desktop-bridge/index.js';
2
+ import { runDesktopCapabilityReportV3 } from '../capability-runner.js';
3
+ import { assertDesktopCapabilityReportV3 } from '../bridge-runtime-validation.js';
4
+ import { runBridgeProbeV3 } from '../probes/bridge-probe.js';
5
+ import { verifiedLiveProbeIds, writeLastDiagnostic } from './diagnostics.js';
6
+ import { probeBridgeHttp, probeBridgeWebSocket, probeProviderDeep, probeProviderText } from './live-probes.js';
7
+ import { combinedModelRouteProbe, combinedRoutePolicyProbe, nativeIdentityProbe, providerAuthProbe, providerCredentialProbe, providerModelRouteProbe } from './preflight-probes.js';
8
+ import { activeProviderIds, makeId, nowIso } from './shared.js';
9
+ import { loadCore, statusFromCore } from './status.js';
10
+ export async function verifyDesktopBridgeV3(requestedLevel, options = {}) {
11
+ const core = await loadCore(options);
12
+ const status = statusFromCore(core, options);
13
+ const reportId = makeId('report', options);
14
+ const correlationId = makeId('correlation', options);
15
+ const sessionId = makeId('session', options);
16
+ const checkedAt = nowIso(options);
17
+ let httpProbe;
18
+ let websocketProbe;
19
+ if (requestedLevel !== 'shallow') {
20
+ [httpProbe, websocketProbe] = await Promise.all([
21
+ probeBridgeHttp(status.service.loopback_origin, options),
22
+ probeBridgeWebSocket(status.service.loopback_origin, requestedLevel, options)
23
+ ]);
24
+ }
25
+ const probeContext = {
26
+ requestedLevel,
27
+ checkedAt,
28
+ reportId,
29
+ correlationId,
30
+ sessionId,
31
+ attemptId: 1
32
+ };
33
+ const results = [
34
+ ...runBridgeProbeV3({
35
+ ...probeContext,
36
+ configured: status.management.managed,
37
+ processRunning: status.service.running,
38
+ ...(httpProbe ? { httpProbe } : {}),
39
+ ...(websocketProbe ? { websocketProbe } : {})
40
+ }),
41
+ nativeIdentityProbe(core, probeContext),
42
+ combinedRoutePolicyProbe(core, probeContext),
43
+ combinedModelRouteProbe(core, status, probeContext)
44
+ ];
45
+ const activeProviders = activeProviderIds(core);
46
+ const enabledProviders = ['codex-lb', 'openrouter']
47
+ .filter((providerId) => core.registry.profiles[providerId].enabled);
48
+ for (const providerId of ['codex-lb', 'openrouter']) {
49
+ results.push(providerCredentialProbe(core, providerId, probeContext), providerAuthProbe(core, providerId, probeContext), providerModelRouteProbe(core, providerId, probeContext));
50
+ }
51
+ if (requestedLevel !== 'shallow') {
52
+ const textResults = await Promise.all(activeProviders.map((providerId) => probeProviderText(core, providerId, status.service.loopback_origin, probeContext, options)));
53
+ results.push(...textResults);
54
+ }
55
+ if (requestedLevel === 'deep') {
56
+ const deepResults = await Promise.all(activeProviders.map((providerId) => probeProviderDeep(core, providerId, probeContext, options)));
57
+ results.push(...deepResults.flat());
58
+ }
59
+ const report = runDesktopCapabilityReportV3({
60
+ requestedLevel,
61
+ reportId,
62
+ correlationId,
63
+ sessionId,
64
+ checkedAt,
65
+ activeProviderIds: activeProviders,
66
+ enabledProviderIds: enabledProviders,
67
+ catalogSync: core.catalogSync,
68
+ results,
69
+ executionBlockers: [],
70
+ executionWarnings: status.service.running ? [] : ['bridge_service_not_running']
71
+ });
72
+ assertDesktopCapabilityReportV3(report);
73
+ const processGeneration = core.service.state?.process_generation || null;
74
+ if (processGeneration) {
75
+ const stateUpdated = await refreshDesktopBridgeState(core.service.paths.state_path, { ...core.service.state, last_verified_probe_ids: verifiedLiveProbeIds(report) }, options.now ? options.now() : new Date());
76
+ if (!stateUpdated)
77
+ return report;
78
+ }
79
+ await writeLastDiagnostic(core.paths.diagnosticPath, {
80
+ schema: 'sks.desktop-bridge-last-diagnostic.v1',
81
+ checked_at: checkedAt,
82
+ catalog_generation: report.catalog_generation,
83
+ process_generation: processGeneration,
84
+ report,
85
+ http_probe: httpProbe || null,
86
+ websocket_probe: websocketProbe || null
87
+ });
88
+ return report;
89
+ }
@@ -0,0 +1,67 @@
1
+ import { syncCatalog } from './desktop-controller-v3/catalog.js';
2
+ import { explainRoute, ensureDesktopBridge, repairDesktopBridge, rollbackDesktopBridge, setDefaultProvider, unmanageDesktopBridge } from './desktop-controller-v3/lifecycle-commands.js';
3
+ import { configureProvider, removeCredential, setProviderState, validateProvider } from './desktop-controller-v3/provider-commands.js';
4
+ import { commandResult, safeCode } from './desktop-controller-v3/shared.js';
5
+ import { desktopBridgeStatusV3 } from './desktop-controller-v3/status.js';
6
+ import { verifyDesktopBridgeV3 } from './desktop-controller-v3/verification.js';
7
+ import { withFileLock } from '../locks/file-lock.js';
8
+ import path from 'node:path';
9
+ export { desktopBridgeDiagnosticBindingCurrentV3, desktopBridgeReportReadinessV3 } from './desktop-controller-v3/diagnostics.js';
10
+ export { runDesktopBridgeDeepProviderProbesV3 } from './desktop-controller-v3/live-probes.js';
11
+ export { desktopBridgeCatalogStatusV3, desktopBridgeStatusV3 } from './desktop-controller-v3/status.js';
12
+ export { verifyDesktopBridgeV3 } from './desktop-controller-v3/verification.js';
13
+ export async function executeDesktopBridgeCommandV3(request, options = {}) {
14
+ if (request.operation === 'status')
15
+ return desktopBridgeStatusV3(options);
16
+ if (request.operation === 'verify')
17
+ return verifyDesktopBridgeV3(request.level, options);
18
+ try {
19
+ const home = path.resolve(options.home || process.env.HOME || '.');
20
+ return await withFileLock({
21
+ lockPath: path.join(home, '.codex', 'sks', 'locks', 'desktop-bridge-controller.lock'),
22
+ timeoutMs: 30_000,
23
+ staleMs: 120_000
24
+ }, async () => {
25
+ if (request.operation === 'ensure')
26
+ return ensureDesktopBridge(options, 'ensure');
27
+ if (request.operation === 'repair')
28
+ return repairDesktopBridge(options);
29
+ if (request.operation === 'provider.list') {
30
+ const status = await desktopBridgeStatusV3(options);
31
+ return commandResult('provider.list', true, status, { providers: status.providers }, [], options);
32
+ }
33
+ if (request.operation === 'provider.configure')
34
+ return configureProvider(request, options);
35
+ if (request.operation === 'provider.validate')
36
+ return validateProvider(request.provider_id, options);
37
+ if (request.operation === 'provider.enable' || request.operation === 'provider.disable') {
38
+ return setProviderState(request.provider_id, request.operation === 'provider.enable', request.operation, options);
39
+ }
40
+ if (request.operation === 'provider.remove-credential') {
41
+ return removeCredential(request.provider_id, options);
42
+ }
43
+ if (request.operation === 'catalog.sync')
44
+ return syncCatalog(options);
45
+ if (request.operation === 'catalog.status') {
46
+ const status = await desktopBridgeStatusV3(options);
47
+ return commandResult('catalog.status', true, status, { catalog_sync: status.catalog_sync }, [], options);
48
+ }
49
+ if (request.operation === 'route.list') {
50
+ const status = await desktopBridgeStatusV3(options);
51
+ return commandResult('route.list', true, status, { routing: status.routing }, [], options);
52
+ }
53
+ if (request.operation === 'route.set-default')
54
+ return setDefaultProvider(request.provider_id, options);
55
+ if (request.operation === 'route.explain')
56
+ return explainRoute(request.model, options);
57
+ if (request.operation === 'unmanage')
58
+ return unmanageDesktopBridge(options);
59
+ return rollbackDesktopBridge(request.receipt_id, options);
60
+ });
61
+ }
62
+ catch (error) {
63
+ const blocker = safeCode(error, 'desktop_bridge_command_failed');
64
+ const status = await desktopBridgeStatusV3(options).catch(() => null);
65
+ return commandResult(request.operation, false, status, {}, [blocker], options);
66
+ }
67
+ }