sneakoscope 8.2.0 → 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 (101) 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 -7
  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 -2
  40. package/dist/core/release/gate-manifest.js +5 -2
  41. package/dist/core/release/physical-release-gates.js +0 -26
  42. package/dist/core/release/release-gate-affected-selector.js +2 -1
  43. package/dist/core/release/release-gate-contract.js +3 -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-manager.js +4 -0
  47. package/dist/core/version.js +1 -1
  48. package/dist/native/sks-menubar/Sources/AppDelegate.swift +1 -12
  49. package/dist/native/sks-menubar/Sources/ControlCenterWindowController.swift +2 -6
  50. package/dist/native/sks-menubar/Sources/RemoteCodingViewController.swift +28 -471
  51. package/dist/native/sks-menubar/Sources/SecureProcessEnvelope.swift +1 -43
  52. package/dist/scripts/codex-current-app-server-v2-check.js +9 -8
  53. package/dist/scripts/codex-current-binary-identity-check.js +2 -2
  54. package/dist/scripts/codex-current-capability-check.js +9 -7
  55. package/dist/scripts/codex-current-dependency-check.js +21 -0
  56. package/dist/scripts/docs-truthfulness-check.js +4 -19
  57. package/dist/scripts/fast-codex-service-tier-proof-check.js +0 -1
  58. package/dist/scripts/install-surface-ssot-check.js +2 -2
  59. package/dist/scripts/latest-version-guidance-check.js +1 -1
  60. package/dist/scripts/packlist-performance-check.js +0 -1
  61. package/dist/scripts/release-metadata-check.js +4 -1
  62. package/dist/scripts/release-version-truth-check.js +149 -0
  63. package/dist/vendor/openai-codex/latest/hooks/permission-request.command.input.schema.json +6 -0
  64. package/dist/vendor/openai-codex/latest/hooks/permission-request.command.output.schema.json +2 -16
  65. package/dist/vendor/openai-codex/latest/hooks/post-compact.command.input.schema.json +6 -0
  66. package/dist/vendor/openai-codex/latest/hooks/post-tool-use.command.input.schema.json +6 -0
  67. package/dist/vendor/openai-codex/latest/hooks/post-tool-use.command.output.schema.json +2 -16
  68. package/dist/vendor/openai-codex/latest/hooks/pre-compact.command.input.schema.json +6 -0
  69. package/dist/vendor/openai-codex/latest/hooks/pre-tool-use.command.input.schema.json +6 -0
  70. package/dist/vendor/openai-codex/latest/hooks/pre-tool-use.command.output.schema.json +2 -16
  71. package/dist/vendor/openai-codex/latest/hooks/session-start.command.output.schema.json +2 -16
  72. package/dist/vendor/openai-codex/latest/hooks/snapshot-metadata.json +7 -5
  73. package/dist/vendor/openai-codex/latest/hooks/subagent-start.command.output.schema.json +4 -18
  74. package/dist/vendor/openai-codex/latest/hooks/user-prompt-submit.command.input.schema.json +6 -0
  75. package/dist/vendor/openai-codex/latest/hooks/user-prompt-submit.command.output.schema.json +2 -16
  76. package/package.json +4 -7
  77. package/release-gates.v2.json +49 -19
  78. package/config/codex-releases/rust-v0.146.0.json +0 -45
  79. package/dist/core/agents/agent-runner-codex-exec.js +0 -177
  80. package/dist/core/codex-compat/codex-release-manifest.js +0 -72
  81. package/dist/core/commands/telegram-command.js +0 -447
  82. package/dist/core/telegram/access.js +0 -58
  83. package/dist/core/telegram/client.js +0 -157
  84. package/dist/core/telegram/confirmation.js +0 -37
  85. package/dist/core/telegram/doctor.js +0 -154
  86. package/dist/core/telegram/index.js +0 -9
  87. package/dist/core/telegram/keychain.js +0 -317
  88. package/dist/core/telegram/liveness.js +0 -124
  89. package/dist/core/telegram/poller.js +0 -90
  90. package/dist/core/telegram/redaction.js +0 -15
  91. package/dist/core/telegram/state-lock.js +0 -416
  92. package/dist/core/telegram/types.js +0 -1
  93. package/dist/native/sks-menubar/Sources/TelegramPrivateFileStore.swift +0 -498
  94. package/dist/native/sks-menubar/Sources/TelegramPrivateFileSupport.swift +0 -236
  95. package/dist/native/sks-menubar/Sources/TelegramProcessGateway.swift +0 -454
  96. package/dist/native/sks-menubar/Sources/TelegramRuntimeSupport.swift +0 -56
  97. package/dist/native/sks-menubar/Sources/TelegramStateLock.swift +0 -448
  98. package/dist/native/sks-menubar/Sources/TelegramSupport.swift +0 -243
  99. package/dist/native/sks-menubar/Sources/TelegramTransport.swift +0 -499
  100. package/dist/scripts/codex-current-manifest-check.js +0 -29
  101. package/schemas/codex/app-server-0.146/codex_app_server_protocol.v2.schemas.json +0 -19858
@@ -1,6 +1,7 @@
1
1
  import { Client } from '@modelcontextprotocol/client';
2
2
  import { StdioClientTransport } from '@modelcontextprotocol/client/stdio';
3
3
  import { PACKAGE_VERSION } from './version.js';
4
+ import { collectMcpListPages } from './mcp/modern-protocol.js';
4
5
  const DEFAULT_CONTEXT7_COMMAND = 'npx';
5
6
  const DEFAULT_CONTEXT7_ARGS = ['-y', '@upstash/context7-mcp@latest'];
6
7
  export function defaultContext7ServerConfig() {
@@ -215,8 +216,10 @@ class LocalMcpClient {
215
216
  async listTools() {
216
217
  if (!this.client)
217
218
  throw new Error('Context7 MCP is not connected.');
218
- const result = await this.client.listTools({}, { timeout: this.timeoutMs, cacheMode: 'refresh' });
219
- return Array.isArray(result?.tools) ? result.tools : [];
219
+ return collectMcpListPages('tools', (params) => this.client.listTools(params, {
220
+ timeout: this.timeoutMs,
221
+ cacheMode: 'refresh'
222
+ }), { requireModernResult: false });
220
223
  }
221
224
  async callTool(name, args = {}) {
222
225
  if (!this.client)
@@ -1,5 +1,5 @@
1
1
  import path from 'node:path';
2
- import { CURRENT_CODEX_RELEASE_MANIFEST } from '../codex-compat/codex-release-manifest.js';
2
+ import { CURRENT_CODEX_RUNTIME_CONTRACT } from '../codex-compat/codex-runtime-contract.js';
3
3
  import { readJson } from '../fsx.js';
4
4
  export async function readCodexCurrentCoreDoctorRealProbeStatus(root) {
5
5
  const summary = await readJson(path.join(root, '.sneakoscope', 'codex-current-core-real-probe-summary.json'), null);
@@ -7,7 +7,7 @@ export async function readCodexCurrentCoreDoctorRealProbeStatus(root) {
7
7
  return {
8
8
  schema: 'sks.doctor-codex-current-core-real-probes.v1',
9
9
  codex_cli_version: result?.version_text || null,
10
- capability_version_flag: result?.parsed_version === CURRENT_CODEX_RELEASE_MANIFEST.requiredCliVersion,
10
+ capability_version_flag: result?.parsed_version === CURRENT_CODEX_RUNTIME_CONTRACT.requiredCliVersion,
11
11
  real_probes_last_run_status: summary ? (summary.ok ? 'ok' : 'blocked') : 'not_run',
12
12
  skipped_probes: result?.skipped || [],
13
13
  strict_probe_command: 'node ./dist/scripts/codex-current-core-real-probes-check.js --require-real --allow-network',
@@ -121,7 +121,7 @@ function phaseInputFiles(id) {
121
121
  return ['src/core/codex-native', 'src/scripts/native-capability-postcheck-check.ts'];
122
122
  if (id.includes('secret'))
123
123
  return ['safety-mutation-allowlist.json', 'src/scripts/secret-preservation-check.ts'];
124
- return ['package.json', 'config/codex-releases/rust-v0.146.0.json'];
124
+ return ['package.json', 'package-lock.json', 'src/core/codex-compat/codex-runtime-contract.ts'];
125
125
  }
126
126
  function packageIdentity() {
127
127
  const root = packageRoot();
@@ -58,13 +58,6 @@ export function buildDoctorReadinessMatrix(input = {}) {
58
58
  warnings.add('codex_app_fast_selector_repaired_restart_app_if_needed');
59
59
  if (input.sks_menubar?.ok === false)
60
60
  warnings.add(`sks_menubar_${input.sks_menubar?.status || 'blocked'}`);
61
- const telegramRemote = input.telegram_remote || null;
62
- if (telegramRemote?.status === 'degraded') {
63
- for (const blocker of normalizeList(telegramRemote.blockers))
64
- warnings.add(`telegram_remote:${blocker}`);
65
- if (!normalizeList(telegramRemote.blockers).length)
66
- warnings.add('telegram_remote_degraded');
67
- }
68
61
  const codexCurrentAppDoctor = input.codex_current_app_doctor || null;
69
62
  if (codexCurrentAppDoctor?.ok === false)
70
63
  for (const blocker of normalizeList(codexCurrentAppDoctor.blockers))
@@ -36,10 +36,6 @@ const FIXTURES = Object.freeze({
36
36
  },
37
37
  reason: 'The read-only status command proves the installed Desktop Bridge JSON facade and fail-closed no-fallback routing contract without configuring a provider, starting a service, or reading a plaintext credential.'
38
38
  }),
39
- 'cli-telegram': fixture('execute', 'sks telegram --help', [], 'pass', {
40
- quality: 'wiring_only',
41
- reason: 'The non-mutating help path proves the installed Telegram command is wired without requiring a bot token, private-file state, resident poller, or network access; transport behavior is covered by focused Telegram tests.'
42
- }),
43
39
  'cli-mcp': fixture('execute', 'sks mcp config list --scope project --trusted-project --json', [], 'pass', {
44
40
  reason: 'Project-scoped MCP inventory is a read-only, hermetic runtime probe when the trusted-project boundary is explicit; mutation, health, auth, and merge behavior remain covered by dedicated tests.'
45
41
  }),
@@ -941,7 +941,6 @@ function isExternalPromptCommandMention(mention) {
941
941
  '$SKS_CODEX_APP_IMAGEGEN_OUTPUT',
942
942
  '$SKS_CODEX_APP_IMAGEGEN_OUTPUT_ID',
943
943
  '$SKS_CODEX_APP_IMAGEGEN_CREATED_AT',
944
- '$SKS_TELEGRAM_TOKEN',
945
944
  '$SKS_WORKTREE_ROOT',
946
945
  '$XDG_CACHE_HOME',
947
946
  '$IMAGEGEN'
@@ -5,7 +5,7 @@ import fsp from 'node:fs/promises';
5
5
  import { nowIso, sha256, writeJsonAtomic } from './fsx.js';
6
6
  import { imageDimensions, sha256File } from './wiki-image/image-hash.js';
7
7
  import { CODEX_APP_IMAGE_GENERATION_DOC_URL, CODEX_CHROME_EXTENSION_DOC_URL, CODEX_IMAGEGEN_REQUIRED_POLICY, CODEX_WEB_VERIFICATION_POLICY } from './routes.js';
8
- import { CURRENT_CODEX_RELEASE_MANIFEST } from './codex-compat/codex-release-manifest.js';
8
+ import { CURRENT_CODEX_RUNTIME_CONTRACT } from './codex-compat/codex-runtime-contract.js';
9
9
  import { detectCodexExecResumeOutputSchema } from './codex-exec-output-schema.js';
10
10
  import { buildCalloutPrompt, imagegenCapabilityBlocker } from './image-ux-review/imagegen-adapter.js';
11
11
  import { buildIssueLedgerFromGeneratedCallouts } from './image-ux-review/callout-extraction.js';
@@ -132,8 +132,8 @@ export function buildImageUxReviewPolicy(contract = {}) {
132
132
  max_screen_retries: 2,
133
133
  codex_compatibility: {
134
134
  schema: 'sks.codex-current-image-ux-contract.v1',
135
- target_tag: CURRENT_CODEX_RELEASE_MANIFEST.targetTag,
136
- required_version: CURRENT_CODEX_RELEASE_MANIFEST.requiredCliVersion,
135
+ target_tag: CURRENT_CODEX_RUNTIME_CONTRACT.targetTag,
136
+ required_version: CURRENT_CODEX_RUNTIME_CONTRACT.requiredCliVersion,
137
137
  output_schema_preferred: true
138
138
  },
139
139
  output_schema: outputSchema,
@@ -4,7 +4,7 @@ import os from 'node:os';
4
4
  import path from 'node:path';
5
5
  import { runProcess, writeJsonAtomic } from '../fsx.js';
6
6
  import { LEGACY_DOLLAR_COMMAND_NAMES, LEGACY_DOLLAR_SKILL_NAMES } from '../routes.js';
7
- export const INSTALLED_REQUIRED_COMMANDS = ['naruto', 'mcp', 'update', 'menubar', 'config', 'telegram'];
7
+ export const INSTALLED_REQUIRED_COMMANDS = ['naruto', 'mcp', 'update', 'menubar', 'config'];
8
8
  export const INSTALLED_REQUIRED_DOLLAR_COMMANDS = ['$sks-naruto', '$sks-work'];
9
9
  export const INSTALLED_REMOVED_COMMANDS = ['team', 'mad-db', 'tmux', 'xai', 'swarm', 'agent', 'ralph', 'ui'];
10
10
  export const INSTALLED_REMOVED_DOLLAR_COMMANDS = Array.from(new Set([
@@ -192,7 +192,6 @@ export async function runInstalledPackageSmoke(root, options = {}) {
192
192
  { name: 'mcp', argv: [bin, 'mcp', 'config', 'list', '--scope', 'effective', '--trusted-project', '--json'], diagnostic: true },
193
193
  { name: 'update', argv: [bin, 'update', 'status', '--json'], diagnostic: true },
194
194
  { name: 'config', argv: [bin, 'config', '--help'], diagnostic: true },
195
- { name: 'telegram', argv: [bin, 'telegram', '--help'], diagnostic: true },
196
195
  ...(process.platform === 'darwin'
197
196
  ? [{ name: 'menubar-install', argv: [bin, 'menubar', 'install', '--no-launch', '--json'] }]
198
197
  : []),
@@ -543,7 +542,7 @@ function installedDiagnosticBlockers(name, result, platform) {
543
542
  if (name === 'naruto')
544
543
  return result.exit_code === 0 && /\$sks-naruto/.test(result.stdout)
545
544
  ? [] : ['installed_diagnostic_failed:naruto'];
546
- if (name === 'config' || name === 'telegram') {
545
+ if (name === 'config') {
547
546
  return result.exit_code === 0 && new RegExp(`Usage: sks ${name}`).test(result.stdout)
548
547
  ? [] : [`installed_diagnostic_failed:${name}`];
549
548
  }
@@ -2,6 +2,7 @@ import { performance } from 'node:perf_hooks';
2
2
  import { Client, StreamableHTTPClientTransport } from '@modelcontextprotocol/client';
3
3
  import { nowIso, sha256 } from '../../fsx.js';
4
4
  import { PACKAGE_VERSION } from '../../version.js';
5
+ import { collectMcpListPages } from '../../mcp/modern-protocol.js';
5
6
  export class MadSksSqlPlaneMcpExecutor {
6
7
  profile;
7
8
  opts;
@@ -42,11 +43,11 @@ export class MadSksSqlPlaneMcpExecutor {
42
43
  const started = performance.now();
43
44
  try {
44
45
  await this.connect();
45
- const result = await this.client.listTools({}, {
46
+ const tools = await collectMcpListPages('tools', (params) => this.client.listTools(params, {
46
47
  timeout: this.opts.timeoutMs || 10_000,
47
48
  cacheMode: 'refresh'
48
- });
49
- const names = (result.tools || []).map((tool) => String(tool?.name || '')).filter(Boolean).sort();
49
+ }), { requireModernResult: false });
50
+ const names = tools.map((tool) => String(tool?.name || '')).filter(Boolean).sort();
50
51
  const inventory = {
51
52
  schema: 'sks.mad-sks-sql-plane-tool-inventory.v1',
52
53
  checked_at: nowIso(),
@@ -3,6 +3,37 @@ export const MCP_PROTOCOL_VERSION_META_KEY = 'io.modelcontextprotocol/protocolVe
3
3
  export const MCP_CLIENT_INFO_META_KEY = 'io.modelcontextprotocol/clientInfo';
4
4
  export const MCP_CLIENT_CAPABILITIES_META_KEY = 'io.modelcontextprotocol/clientCapabilities';
5
5
  export const MCP_SERVER_INFO_META_KEY = 'io.modelcontextprotocol/serverInfo';
6
+ export const MCP_LIST_PAGE_LIMIT = 100;
7
+ export const MCP_LIST_ITEM_LIMIT = 10_000;
8
+ export async function collectMcpListPages(itemKey, requestPage, options = {}) {
9
+ const maxPages = options.maxPages ?? MCP_LIST_PAGE_LIMIT;
10
+ const maxItems = options.maxItems ?? MCP_LIST_ITEM_LIMIT;
11
+ const seenCursors = new Set();
12
+ const items = [];
13
+ let cursor = null;
14
+ for (let pageIndex = 0; pageIndex < maxPages; pageIndex += 1) {
15
+ const raw = await requestPage(cursor === null ? {} : { cursor }, pageIndex);
16
+ const result = options.requireModernResult === false
17
+ ? requireRecordResult(raw)
18
+ : requireModernCompleteResult(raw);
19
+ const pageItems = result[itemKey];
20
+ if (!Array.isArray(pageItems))
21
+ throw new Error('mcp_list_items_invalid');
22
+ items.push(...pageItems);
23
+ if (items.length > maxItems)
24
+ throw new Error('mcp_pagination_item_limit_exceeded');
25
+ const nextCursor = result.nextCursor;
26
+ if (nextCursor === undefined || nextCursor === null)
27
+ return items;
28
+ if (typeof nextCursor !== 'string')
29
+ throw new Error('mcp_pagination_cursor_invalid');
30
+ if (seenCursors.has(nextCursor))
31
+ throw new Error('mcp_pagination_cursor_repeated');
32
+ seenCursors.add(nextCursor);
33
+ cursor = nextCursor;
34
+ }
35
+ throw new Error('mcp_pagination_page_limit_exceeded');
36
+ }
6
37
  export function modernMcpParams(params, options) {
7
38
  const authoredMeta = isRecord(params._meta) ? params._meta : {};
8
39
  return {
@@ -40,6 +71,11 @@ export function requireModernCompleteResult(value) {
40
71
  }
41
72
  return value;
42
73
  }
74
+ function requireRecordResult(value) {
75
+ if (!isRecord(value))
76
+ throw new Error('mcp_result_invalid');
77
+ return value;
78
+ }
43
79
  export function modernServerInfo(value) {
44
80
  if (!isRecord(value) || !isRecord(value._meta))
45
81
  return null;
@@ -8,7 +8,7 @@ import { normalizeMcpServerName } from './secret-policy.js';
8
8
  import { resolveMcpScope } from './scope.js';
9
9
  import { MCP_HEALTH_SCHEMA } from './types.js';
10
10
  import { PACKAGE_VERSION } from '../version.js';
11
- import { MCP_PROTOCOL_VERSION, isRecognizedModernError, modernHttpHeaders, modernMcpRequest, modernServerInfo, requireModernCompleteResult } from '../mcp/modern-protocol.js';
11
+ import { MCP_PROTOCOL_VERSION, collectMcpListPages, isRecognizedModernError, modernHttpHeaders, modernMcpRequest, modernServerInfo, requireModernCompleteResult } from '../mcp/modern-protocol.js';
12
12
  const LEGACY_PROTOCOL_VERSION = '2024-11-05';
13
13
  const HEALTH_CLIENT_INFO = { name: 'sks-mcp-health', version: PACKAGE_VERSION };
14
14
  const OUTPUT_CAP = 64 * 1024;
@@ -102,12 +102,14 @@ async function probeStdio(name, scope, raw, options) {
102
102
  return result(name, scope, 'protocol_error', null, null, null, null, 'mcp_protocol_version_unsupported', options);
103
103
  }
104
104
  const instructions = typeof discoverResult.instructions === 'string';
105
- channel.send(modernMcpRequest(2, 'tools/list', {}, { clientInfo: HEALTH_CLIENT_INFO }));
106
- const tools = await channel.wait(2, timeoutMs(raw.tool_timeout_sec, 30));
107
- const toolsResult = isRecord(tools) && isRecord(tools.result) ? requireModernCompleteResult(tools.result) : null;
108
- const list = toolsResult && Array.isArray(toolsResult.tools) ? toolsResult.tools : null;
109
- if (!list)
110
- return result(name, scope, 'protocol_error', MCP_PROTOCOL_VERSION, null, instructions, null, 'mcp_tools_list_invalid', options);
105
+ const list = await collectMcpListPages('tools', async (params, pageIndex) => {
106
+ const id = 2 + pageIndex;
107
+ channel.send(modernMcpRequest(id, 'tools/list', params, { clientInfo: HEALTH_CLIENT_INFO }));
108
+ const response = await channel.wait(id, timeoutMs(raw.tool_timeout_sec, 30));
109
+ if (!isRecord(response) || !isRecord(response.result))
110
+ throw new Error('mcp_tools_list_invalid');
111
+ return response.result;
112
+ });
111
113
  return result(name, scope, 'healthy', MCP_PROTOCOL_VERSION, list.length, instructions, null, null, options, toolNames(list));
112
114
  }
113
115
  catch (error) {
@@ -160,11 +162,14 @@ async function probeLegacyStdio(name, scope, raw, options, channel) {
160
162
  const protocol = typeof init.result.protocolVersion === 'string' ? init.result.protocolVersion : null;
161
163
  const instructions = typeof init.result.instructions === 'string';
162
164
  channel.send({ jsonrpc: '2.0', method: 'notifications/initialized', params: {} });
163
- channel.send({ jsonrpc: '2.0', id: 3, method: 'tools/list', params: {} });
164
- const tools = await channel.wait(3, timeoutMs(raw.tool_timeout_sec, 30));
165
- const list = isRecord(tools) && isRecord(tools.result) && Array.isArray(tools.result.tools) ? tools.result.tools : null;
166
- if (!list)
167
- return result(name, scope, 'protocol_error', protocol, null, instructions, null, 'mcp_tools_list_invalid', options);
165
+ const list = await collectMcpListPages('tools', async (params, pageIndex) => {
166
+ const id = 3 + pageIndex;
167
+ channel.send({ jsonrpc: '2.0', id, method: 'tools/list', params });
168
+ const response = await channel.wait(id, timeoutMs(raw.tool_timeout_sec, 30));
169
+ if (!isRecord(response) || !isRecord(response.result))
170
+ throw new Error('mcp_tools_list_invalid');
171
+ return response.result;
172
+ }, { requireModernResult: false });
168
173
  return result(name, scope, 'healthy', protocol, list.length, instructions, null, null, options, toolNames(list));
169
174
  }
170
175
  async function probeHttp(name, scope, raw, options) {
@@ -202,22 +207,30 @@ async function probeHttp(name, scope, raw, options) {
202
207
  return result(name, scope, 'protocol_error', null, null, null, null, 'mcp_protocol_version_unsupported', options);
203
208
  }
204
209
  const instructions = typeof discoverResult.instructions === 'string';
205
- const toolsMessage = modernMcpRequest(2, 'tools/list', {}, { clientInfo: HEALTH_CLIENT_INFO });
206
- const tools = await postRpc(fetchImpl, url, toolsMessage, timeoutMs(raw.tool_timeout_sec, 30), bearer, {
207
- modern: true, method: 'tools/list', params: {}
210
+ const list = await collectMcpListPages('tools', async (params, pageIndex) => {
211
+ const toolsMessage = modernMcpRequest(2 + pageIndex, 'tools/list', params, { clientInfo: HEALTH_CLIENT_INFO });
212
+ const tools = await postRpc(fetchImpl, url, toolsMessage, timeoutMs(raw.tool_timeout_sec, 30), bearer, {
213
+ modern: true, method: 'tools/list', params
214
+ });
215
+ if (tools.status === 401 || tools.status === 403)
216
+ throw new Error('mcp_oauth_required');
217
+ if (!tools.ok || !isRecord(tools.json) || !isRecord(tools.json.result)) {
218
+ throw new Error(`mcp_http_tools_${tools.status}`);
219
+ }
220
+ return tools.json.result;
208
221
  });
209
- if (tools.status === 401 || tools.status === 403)
210
- return result(name, scope, 'oauth_required', MCP_PROTOCOL_VERSION, null, instructions, null, null, options);
211
- const toolsResult = tools.ok && isRecord(tools.json) && isRecord(tools.json.result)
212
- ? requireModernCompleteResult(tools.json.result) : null;
213
- const list = toolsResult && Array.isArray(toolsResult.tools) ? toolsResult.tools : null;
214
- if (!list)
215
- return result(name, scope, 'protocol_error', MCP_PROTOCOL_VERSION, null, instructions, null, `mcp_http_tools_${tools.status}`, options);
216
222
  return result(name, scope, 'healthy', MCP_PROTOCOL_VERSION, list.length, instructions, null, null, options, toolNames(list));
217
223
  }
218
224
  catch (error) {
219
225
  const message = redactMcpError(error);
220
- return result(name, scope, message.includes('AbortError') || message.includes('timeout') ? 'timeout' : 'startup_failed', null, null, null, null, message, options);
226
+ if (message === 'mcp_oauth_required')
227
+ return result(name, scope, 'oauth_required', MCP_PROTOCOL_VERSION, null, null, null, null, options);
228
+ const status = message.includes('AbortError') || message.includes('timeout')
229
+ ? 'timeout'
230
+ : message.includes('pagination') || message.includes('mcp_result') || message.includes('mcp_list') || message.includes('mcp_http_tools')
231
+ ? 'protocol_error'
232
+ : 'startup_failed';
233
+ return result(name, scope, status, null, null, null, null, message, options);
221
234
  }
222
235
  }
223
236
  async function probeLegacyHttp(name, scope, raw, options, fetchImpl, url, bearer) {
@@ -230,13 +243,15 @@ async function probeLegacyHttp(name, scope, raw, options, fetchImpl, url, bearer
230
243
  await postRpc(fetchImpl, url, { jsonrpc: '2.0', method: 'notifications/initialized', params: {} }, timeoutMs(raw.tool_timeout_sec, 30), bearer, {
231
244
  modern: false, sessionId: init.sessionId, legacyProtocolVersion: protocol
232
245
  });
233
- const tools = await postRpc(fetchImpl, url, { jsonrpc: '2.0', id: 3, method: 'tools/list', params: {} }, timeoutMs(raw.tool_timeout_sec, 30), bearer, {
234
- modern: false, sessionId: init.sessionId, legacyProtocolVersion: protocol
235
- });
236
- const list = tools.ok && isRecord(tools.json) && isRecord(tools.json.result) && Array.isArray(tools.json.result.tools)
237
- ? tools.json.result.tools : null;
238
- if (!list)
239
- return result(name, scope, 'protocol_error', protocol, null, instructions, null, `mcp_http_tools_${tools.status}`, options);
246
+ const list = await collectMcpListPages('tools', async (params, pageIndex) => {
247
+ const tools = await postRpc(fetchImpl, url, { jsonrpc: '2.0', id: 3 + pageIndex, method: 'tools/list', params }, timeoutMs(raw.tool_timeout_sec, 30), bearer, {
248
+ modern: false, sessionId: init.sessionId, legacyProtocolVersion: protocol
249
+ });
250
+ if (!tools.ok || !isRecord(tools.json) || !isRecord(tools.json.result)) {
251
+ throw new Error(`mcp_http_tools_${tools.status}`);
252
+ }
253
+ return tools.json.result;
254
+ }, { requireModernResult: false });
240
255
  return result(name, scope, 'healthy', protocol, list.length, instructions, null, null, options, toolNames(list));
241
256
  }
242
257
  class JsonLineChannel {
@@ -211,8 +211,7 @@ let firstStart = DispatchTime.now().uptimeNanoseconds
211
211
  status.start()
212
212
  let firstMs = Double(DispatchTime.now().uptimeNanoseconds - firstStart) / 1_000_000
213
213
  status.stop()
214
- let telegramService = TelegramRuntimeFactory.make(processClient: processClient, canonicalProjectRoot: AppRuntime.canonicalProjectRoot)
215
- let control = ControlCenterWindowController(processClient: processClient, operations: operations, notifications: notifications, telegramService: telegramService)
214
+ let control = ControlCenterWindowController(processClient: processClient, operations: operations, notifications: notifications)
216
215
  let controlStart = DispatchTime.now().uptimeNanoseconds
217
216
  control.show(section: SidebarItem.overview)
218
217
  let controlMs = Double(DispatchTime.now().uptimeNanoseconds - controlStart) / 1_000_000
@@ -77,7 +77,7 @@ export async function buildRuntimeTruthMatrix(input) {
77
77
  row('goal_mode', goalMode?.ok === true ? 'proven' : 'integration_optional', ['goal-mode-applied.json'], false, goalMode, 'record official goal mode evidence'),
78
78
  row('route_blackbox', fakeReal?.subsystem_levels?.route_blackbox || (official.proof_level === 'proven' ? 'proven' : 'integration_optional'), ['subagent-evidence.json', 'naruto-gate.json', 'fake-real-proof-policy.json'], false, fakeReal, official.next_action),
79
79
  row('dynamic_scheduler', schedulerRuntime.proof_level, ['agent-scheduler-state.json'], false, schedulerRuntime.report, 'record scheduler drain evidence'),
80
- row('codex_current', levelFromOk(codexCurrent, 'integration_optional'), ['codex-current-capability.json', 'config/codex-releases/rust-v0.146.0.json'], false, codexCurrent, 'run the current Codex capability release gate'),
80
+ row('codex_current', levelFromOk(codexCurrent, 'integration_optional'), ['codex-current-capability.json', 'package.json'], false, codexCurrent, 'run the current Codex capability release gate'),
81
81
  row('mcp_current', levelFromOk(mcpCurrent, 'integration_optional'), ['mcp-readonly-runtime-scheduler.json'], false, mcpCurrent, 'run the current MCP runtime scheduler release gate'),
82
82
  row('adhd_orchestration', levelFromOk(adhdOrchestration, 'integration_optional'), ['strategy-gate.json', 'adhd-orchestrating-gate.json'], false, adhdOrchestration, 'run `npm run strategy:adhd-orchestrating-gate`'),
83
83
  row('appshots', levelFromAppshots(appshots), ['appshots-evidence.json'], false, appshots, 'run `npm run appshots:evidence`'),
@@ -6,10 +6,9 @@ import { releaseAuthorizationSnapshot, sameReleaseAuthorizationSnapshot } from '
6
6
  export const CANONICAL_TEST_PROOF_SCHEMA = 'sks.canonical-test-proof.v1';
7
7
  const CURRENT_COMPILED_TESTS = new Set([
8
8
  'dist/core/__tests__/codex-capability-matrix.test.js',
9
- 'dist/core/__tests__/codex-release-manifest-current.test.js',
9
+ 'dist/core/__tests__/codex-runtime-contract-current.test.js',
10
10
  'dist/core/__tests__/release-gate-hermetic-env.test.js',
11
11
  'dist/core/__tests__/update-menubar-package-local.test.js',
12
- 'dist/core/__tests__/update-simulated-upgrade.test.js',
13
12
  'dist/core/__tests__/version-manager-current-docs.test.js',
14
13
  'dist/core/install/__tests__/installed-package-smoke.test.js',
15
14
  'dist/core/perf/__tests__/release-latency-slo.test.js'
@@ -11,6 +11,8 @@ export const FORBIDDEN_RECURSIVE_GATES = new Set([
11
11
  ]);
12
12
  export const ALWAYS_ON_GATES = new Set([
13
13
  'release:metadata-current',
14
+ 'release:version-truth',
15
+ 'install-surface:ssot',
14
16
  'architecture:guard',
15
17
  'safety:mutation-callsite-coverage',
16
18
  'side-effect:runtime-report',
@@ -25,13 +27,15 @@ export const ALWAYS_ON_GATES = new Set([
25
27
  ]);
26
28
  export const REQUIRED_FOR_PUBLISH = new Set([
27
29
  'release:metadata-current',
30
+ 'release:version-truth',
31
+ 'install-surface:ssot',
28
32
  'architecture:guard',
29
33
  'safety:mutation-callsite-coverage',
30
34
  'side-effect:runtime-report',
31
35
  'release:proof-truth',
32
36
  'release:latency-slo',
33
37
  'release:provenance',
34
- 'codex:current:manifest',
38
+ 'codex:current:dependency-graph',
35
39
  'codex:current:binary-identity',
36
40
  'codex:current:policy',
37
41
  'codex:current:app-server-v2',
@@ -105,7 +109,6 @@ export function affectedGlobsFor(id) {
105
109
  'src/core/codex-policy/**',
106
110
  'src/commands/codex.ts',
107
111
  'src/cli/install-helpers.ts',
108
- 'config/codex-releases/**',
109
112
  'schemas/codex-*.json',
110
113
  'package.json',
111
114
  'package-lock.json',
@@ -19,7 +19,6 @@ export const PHYSICAL_RELEASE_GATE_IDS = [
19
19
  'update_5001_directory',
20
20
  'single_menubar_process',
21
21
  'codex_lb_measured_request',
22
- 'telegram_cellular_e2e',
23
22
  'desktop_bridge_live_evidence'
24
23
  ];
25
24
  export function inspectPhysicalReleaseGates(opts) {
@@ -588,7 +587,6 @@ function genericGateCommandId(id) {
588
587
  update_5001_directory: 'sks.update.physical',
589
588
  single_menubar_process: 'sks.menubar.process-readback',
590
589
  codex_lb_measured_request: 'sks.codex-lb.measured-request',
591
- telegram_cellular_e2e: 'sks.telegram.cellular-roundtrip',
592
590
  desktop_bridge_live_evidence: 'sks.desktop-bridge.live-evidence'
593
591
  }[id];
594
592
  }
@@ -630,20 +628,6 @@ function deriveGenericGateObservations(id, measurement) {
630
628
  latency_ms: measurement.latency_ms
631
629
  };
632
630
  }
633
- if (id === 'telegram_cellular_e2e') {
634
- if (!CAPTURE_ID_PATTERN.test(String(measurement?.pairing_id || ''))
635
- || !SHA256_PATTERN.test(String(measurement?.outbound_message_sha256 || ''))
636
- || !SHA256_PATTERN.test(String(measurement?.inbound_reply_sha256 || '')))
637
- return null;
638
- return {
639
- network: measurement.network_interface_kind,
640
- paired: measurement.pairing_verified === true,
641
- allowlisted: measurement.allowlist_match === true,
642
- typed_command: measurement.outbound_typed === true,
643
- reply_received: measurement.inbound_reply_received === true,
644
- bot_token_recorded: measurement.bot_token_captured === true
645
- };
646
- }
647
631
  return null;
648
632
  }
649
633
  function validateArtifactReference(artifactPath, artifactSha256, id, evidenceRoot, scope, blockers) {
@@ -707,16 +691,6 @@ function validateObservations(observations, id, version, sourceCommit, evidenceR
707
691
  if (!Number.isFinite(observations.latency_ms) || observations.latency_ms < 0)
708
692
  blockers.push(`physical_receipt_observation_invalid:${id}:latency`);
709
693
  }
710
- else if (id === 'telegram_cellular_e2e') {
711
- if (observations.network !== 'cellular')
712
- blockers.push(`physical_receipt_observation_invalid:${id}:network`);
713
- if (observations.paired !== true || observations.allowlisted !== true)
714
- blockers.push(`physical_receipt_observation_invalid:${id}:authorization`);
715
- if (observations.typed_command !== true || observations.reply_received !== true)
716
- blockers.push(`physical_receipt_observation_invalid:${id}:roundtrip`);
717
- if (observations.bot_token_recorded !== false)
718
- blockers.push(`physical_receipt_observation_invalid:${id}:secret`);
719
- }
720
694
  else if (id === 'desktop_bridge_live_evidence') {
721
695
  if (observations.release_authorizing !== true
722
696
  || observations.capture_platform !== 'darwin'
@@ -1,6 +1,8 @@
1
1
  import { spawnSync } from 'node:child_process';
2
2
  const ALWAYS_KEEP = new Set([
3
3
  'release:proof-truth',
4
+ 'release:version-truth',
5
+ 'install-surface:ssot',
4
6
  'typecheck',
5
7
  'schema:check'
6
8
  ]);
@@ -94,7 +96,6 @@ function isCodexCurrentFile(file) {
94
96
  || file.startsWith('src/core/codex-policy/')
95
97
  || file === 'src/commands/codex.ts'
96
98
  || file === 'src/cli/install-helpers.ts'
97
- || file.startsWith('config/codex-releases/')
98
99
  || file.startsWith('schemas/codex-');
99
100
  }
100
101
  function selectionResult(all, selected, changedFiles, mode, reasons, skipped) {
@@ -5,12 +5,13 @@ export const RELEASE_GATE_CONTRACT_IDS = Object.freeze([
5
5
  'codex:current:app-server-v2',
6
6
  'codex:current:binary-identity',
7
7
  'codex:current:capability',
8
- 'codex:current:manifest',
8
+ 'codex:current:dependency-graph',
9
9
  'codex:current:policy',
10
10
  'codex:current:thread-store',
11
11
  'commands:current-surface-only',
12
12
  'config:managed-merge',
13
13
  'docs:truthfulness',
14
+ 'install-surface:ssot',
14
15
  'latest-version:guidance',
15
16
  'migration:current-surface-e2e',
16
17
  'migration:upgrade-safety',
@@ -24,6 +25,7 @@ export const RELEASE_GATE_CONTRACT_IDS = Object.freeze([
24
25
  'release:metadata-current',
25
26
  'release:proof-truth',
26
27
  'release:provenance',
28
+ 'release:version-truth',
27
29
  'runtime:installed-smoke',
28
30
  'safety:mutation-callsite-coverage',
29
31
  'schema:check',
@@ -405,7 +405,6 @@ const RETIRED_SURFACE_PATTERNS = [
405
405
  { kind: 'retired_team_lane_label', regex: /\b(?:Balanced Team Lane|Full Team Honest Path|full Team\/Honest proof path)\b/gi }
406
406
  ];
407
407
  const RETIRED_PACKAGED_FILE_PATTERNS = [
408
- /^package\/dist\/core\/telegram\/controller\.js$/,
409
408
  /^package\/dist\/core\/commands\/ui-command\.js$/,
410
409
  /^package\/dist\/core\/ui\/dashboard-html\.js$/,
411
410
  new RegExp(`^package/.*${RETIRED_MULTIPLEXER_TOKEN}`, 'i')
@@ -175,7 +175,7 @@ function runPreflight(opts, packageName, version) {
175
175
  && physicalReport?.release_authorizing === true
176
176
  && physicalReport?.inspector_platform === 'darwin';
177
177
  steps.push(step('physical_release_gates', physicalReady, physicalReady
178
- ? 'all five source-bound physical release receipts and live Desktop Bridge artifacts verified on macOS'
178
+ ? 'all four source-bound physical release receipts and live Desktop Bridge artifacts verified on macOS'
179
179
  : compactPhysicalGateFailure(physical, physicalReport), physicalReady ? null : 'stage_physical_release_gates_invalid'));
180
180
  const reviewEnvironmentBlocker = localNpmStageReviewEnvironmentBlocker(opts.env || process.env);
181
181
  steps.push(step('local_review_environment', reviewEnvironmentBlocker === null, reviewEnvironmentBlocker === null ? 'maintainer-local' : reviewEnvironmentBlocker, reviewEnvironmentBlocker === null ? null : `stage_${reviewEnvironmentBlocker}`));
@@ -323,6 +323,10 @@ async function syncSourcePackageVersion(root, version) {
323
323
  rel: 'src/core/version.ts',
324
324
  replace: (text) => text.replace(/export const PACKAGE_VERSION = ['"][^'"]+['"];/, `export const PACKAGE_VERSION = '${version}';`)
325
325
  },
326
+ {
327
+ rel: 'plugins/sks/.codex-plugin/plugin.json',
328
+ replace: (text) => text.replace(/("version"\s*:\s*")[^"]+("(?=\s*[,}]))/, `$1${version}$2`)
329
+ },
326
330
  {
327
331
  rel: 'crates/sks-core/Cargo.toml',
328
332
  replace: (text) => text.replace(/^version\s*=\s*"[^"]+"/m, `version = "${version}"`)
@@ -1 +1 @@
1
- export const PACKAGE_VERSION = '8.2.0';
1
+ export const PACKAGE_VERSION = '8.3.0';
@@ -7,7 +7,6 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
7
7
  private var notifications: NotificationCoordinator!
8
8
  private var controlCenter: ControlCenterWindowController!
9
9
  private var statusItemController: StatusItemController!
10
- private var telegramService: TelegramMenuBarService?
11
10
 
12
11
  init(singletonGuard: SingletonInstanceGuard) {
13
12
  self.singletonGuard = singletonGuard
@@ -21,19 +20,12 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
21
20
  // never reaches NSTextField/NSTextView responders without an explicit menu.
22
21
  AppIdentity.installStandardEditMenu()
23
22
  processClient = ProcessClient(actionScript: AppRuntime.actionScript, logPath: AppRuntime.lastActionLogPath, projectRoot: AppRuntime.projectRoot)
24
- let residentTelegramService = TelegramRuntimeFactory.make(
25
- processClient: processClient,
26
- canonicalProjectRoot: AppRuntime.canonicalProjectRoot
27
- )
28
- telegramService = residentTelegramService
29
- _ = residentTelegramService.start()
30
23
  operations = OperationCoordinator(directory: AppRuntime.operationDirectory)
31
24
  notifications = NotificationCoordinator()
32
25
  controlCenter = ControlCenterWindowController(
33
26
  processClient: processClient,
34
27
  operations: operations,
35
- notifications: notifications,
36
- telegramService: residentTelegramService
28
+ notifications: notifications
37
29
  )
38
30
  statusItemController = StatusItemController(
39
31
  processClient: processClient,
@@ -53,9 +45,6 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
53
45
  }
54
46
 
55
47
  func applicationWillTerminate(_ notification: Notification) {
56
- if telegramService?.stopAndWait(timeout: 2) == false {
57
- fputs("SKS Telegram bounded stop timed out; liveness will become stale.\n", stderr)
58
- }
59
48
  statusItemController?.stop()
60
49
  processClient?.terminateAll()
61
50
  singletonGuard.releaseRuntimeStateIfOwned()
@@ -11,8 +11,7 @@ final class ControlCenterWindowController: NSWindowController, NSTableViewDataSo
11
11
  init(
12
12
  processClient: ProcessClient,
13
13
  operations: OperationCoordinator,
14
- notifications: NotificationCoordinator,
15
- telegramService: TelegramMenuBarService
14
+ notifications: NotificationCoordinator
16
15
  ) {
17
16
  let overview = OverviewViewController(processClient: processClient, operations: operations)
18
17
  overviewController = overview
@@ -29,10 +28,7 @@ final class ControlCenterWindowController: NSWindowController, NSTableViewDataSo
29
28
  .updates: UpdatesViewController(processClient: processClient, operations: operations, notifications: notifications),
30
29
  .mcpServers: MCPServersViewController(processClient: processClient, operations: operations, notifications: notifications),
31
30
  .providers: ProvidersViewController(processClient: processClient, operations: operations),
32
- .remoteCoding: RemoteCodingViewController(
33
- processClient: processClient,
34
- telegramService: telegramService
35
- ),
31
+ .remoteCoding: RemoteCodingViewController(),
36
32
  .diagnostics: DiagnosticsViewController(processClient: processClient, operations: operations),
37
33
  .settings: SettingsViewController(notifications: notifications)
38
34
  ]