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.
- package/README.md +46 -110
- 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 +1 -1
- 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/constants.js +0 -7
- 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/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/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 +1 -2
- package/dist/core/release/gate-manifest.js +5 -2
- package/dist/core/release/physical-release-gates.js +0 -26
- package/dist/core/release/release-gate-affected-selector.js +2 -1
- package/dist/core/release/release-gate-contract.js +3 -1
- package/dist/core/release/release-pack-receipt.js +0 -1
- package/dist/core/release/stage-publish.js +1 -1
- package/dist/core/version-manager.js +4 -0
- package/dist/core/version.js +1 -1
- package/dist/native/sks-menubar/Sources/AppDelegate.swift +1 -12
- package/dist/native/sks-menubar/Sources/ControlCenterWindowController.swift +2 -6
- package/dist/native/sks-menubar/Sources/RemoteCodingViewController.swift +28 -471
- package/dist/native/sks-menubar/Sources/SecureProcessEnvelope.swift +1 -43
- 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/install-surface-ssot-check.js +2 -2
- 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 +4 -1
- package/dist/scripts/release-version-truth-check.js +149 -0
- 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 +4 -7
- package/release-gates.v2.json +49 -19
- 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 -154
- 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/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 -243
- 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
|
@@ -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
|
-
|
|
219
|
-
|
|
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 {
|
|
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 ===
|
|
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', '
|
|
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 {
|
|
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:
|
|
136
|
-
required_version:
|
|
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'
|
|
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'
|
|
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
|
|
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 =
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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
|
|
206
|
-
|
|
207
|
-
|
|
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
|
-
|
|
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
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
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
|
|
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', '
|
|
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-
|
|
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:
|
|
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:
|
|
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
|
|
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}"`)
|
package/dist/core/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const PACKAGE_VERSION = '8.
|
|
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
|
]
|