sneakoscope 6.7.0 → 7.0.2
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 +3 -3
- package/crates/sks-core/Cargo.lock +1 -1
- package/crates/sks-core/Cargo.toml +1 -1
- package/dist/cli/install-helpers-codex-lb-config.js +71 -0
- package/dist/cli/install-helpers-codex-lb-selftest.js +11 -14
- package/dist/cli/install-helpers.js +305 -53
- package/dist/config/skills-manifest.json +52 -52
- package/dist/core/agents/agent-orchestrator.js +56 -5
- package/dist/core/agents/agent-roster.js +4 -2
- package/dist/core/codex-app/codex-app-fast-ui-repair.js +18 -1
- package/dist/core/codex-app/codex-app-ui-state-snapshot.js +16 -0
- package/dist/core/codex-app.js +52 -6
- package/dist/core/commands/naruto-command.js +23 -5
- package/dist/core/hooks-runtime.js +77 -3
- package/dist/core/managed-assets/managed-assets-manifest.js +1 -1
- package/dist/core/mission.js +74 -4
- package/dist/core/release/package-size-budget.js +1 -1
- package/dist/core/subagents/naruto-proof-projection.js +2 -2
- package/dist/core/subagents/official-subagent-config.js +8 -5
- package/dist/core/subagents/official-subagent-preparation.js +24 -1
- package/dist/core/subagents/official-subagent-prompt.js +3 -2
- package/dist/core/subagents/official-subagent-runner.js +8 -1
- package/dist/core/subagents/wave-lifecycle.js +20 -0
- package/dist/core/subagents/wave-parent-guidance.js +42 -0
- package/dist/core/version.js +1 -1
- package/dist/native/sks-menubar/Sources/AlertFactory.swift +21 -2
- package/dist/native/sks-menubar/Sources/AppDelegate.swift +3 -0
- package/dist/native/sks-menubar/Sources/AppIdentity.swift +28 -1
- package/dist/native/sks-menubar/Sources/ControlCenterWindowController.swift +14 -8
- package/dist/native/sks-menubar/Sources/DiagnosticsViewController.swift +71 -7
- package/dist/native/sks-menubar/Sources/MCPServersViewController.swift +50 -9
- package/dist/native/sks-menubar/Sources/OverviewViewController.swift +61 -8
- package/dist/native/sks-menubar/Sources/ProvidersViewController.swift +169 -31
- package/dist/native/sks-menubar/Sources/RemoteTelegramViewController.swift +58 -23
- package/dist/native/sks-menubar/Sources/SettingsViewController.swift +41 -7
- package/dist/native/sks-menubar/Sources/StatusItemController.swift +34 -3
- package/dist/native/sks-menubar/Sources/UpdatesViewController.swift +38 -8
- package/dist/scripts/docs-truthfulness-check.js +2 -2
- package/dist/scripts/doctor-fixes-codex-app-fast-ui-check.js +7 -3
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import Cocoa
|
|
2
2
|
|
|
3
|
-
final class UpdatesViewController: NSViewController {
|
|
3
|
+
final class UpdatesViewController: NSViewController, ControlCenterPage {
|
|
4
4
|
private static let controlCenterUpdateEnvironment = ["SKS_UPDATE_DEFER_MENUBAR_RESTART": "1"]
|
|
5
5
|
private let processClient: ProcessClient
|
|
6
6
|
private let operations: OperationCoordinator
|
|
@@ -11,6 +11,9 @@ final class UpdatesViewController: NSViewController {
|
|
|
11
11
|
private let progress = NSProgressIndicator()
|
|
12
12
|
private var receiptTimer: Timer?
|
|
13
13
|
private var activeReceiptId: String?
|
|
14
|
+
private var checkButton: NSButton!
|
|
15
|
+
private var reviewButton: NSButton!
|
|
16
|
+
private var busy = false
|
|
14
17
|
|
|
15
18
|
init(processClient: ProcessClient, operations: OperationCoordinator, notifications: NotificationCoordinator) {
|
|
16
19
|
self.processClient = processClient; self.operations = operations; self.notifications = notifications
|
|
@@ -22,9 +25,9 @@ final class UpdatesViewController: NSViewController {
|
|
|
22
25
|
progress.isIndeterminate = !NSWorkspace.shared.accessibilityDisplayShouldReduceMotion
|
|
23
26
|
progress.controlSize = .small
|
|
24
27
|
progress.isHidden = true
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
let buttons = NSStackView(views: [
|
|
28
|
+
checkButton = NativeView.button("Check Now", target: self, action: #selector(checkNow))
|
|
29
|
+
reviewButton = NativeView.button("Review and Update", target: self, action: #selector(reviewAndUpdate))
|
|
30
|
+
let buttons = NSStackView(views: [checkButton, reviewButton, progress])
|
|
28
31
|
buttons.orientation = .horizontal; buttons.spacing = 8
|
|
29
32
|
view = NativeView.stack([
|
|
30
33
|
NativeView.title("Updates"),
|
|
@@ -37,17 +40,36 @@ final class UpdatesViewController: NSViewController {
|
|
|
37
40
|
|
|
38
41
|
deinit { receiptTimer?.invalidate() }
|
|
39
42
|
|
|
43
|
+
func refreshOnAppear() { reloadSnapshot() }
|
|
44
|
+
|
|
40
45
|
private func loadCached() {
|
|
41
46
|
reloadSnapshot()
|
|
42
47
|
}
|
|
43
48
|
|
|
49
|
+
private func setBusy(_ value: Bool) {
|
|
50
|
+
busy = value
|
|
51
|
+
checkButton?.isEnabled = !value
|
|
52
|
+
reviewButton?.isEnabled = !value
|
|
53
|
+
}
|
|
54
|
+
|
|
44
55
|
@objc private func checkNow() { run(["update", "status", "--refresh", "--json"], kind: "update-status", group: nil) }
|
|
45
56
|
|
|
46
57
|
@objc private func reviewAndUpdate() {
|
|
47
58
|
run(["update", "review", "--json"], kind: "update-review", group: nil) { [weak self] result in
|
|
48
|
-
guard
|
|
59
|
+
guard let self = self else { return }
|
|
60
|
+
guard result.code == 0, let window = self.view.window else {
|
|
61
|
+
self.status.stringValue = "Update review failed. Open Diagnostics for the redacted log."
|
|
62
|
+
return
|
|
63
|
+
}
|
|
64
|
+
let pending = self.operations.latestSnapshot()
|
|
49
65
|
AlertFactory.confirmSheet(window: window, title: "Update SKS?", message: "Review completed. Continue with the verified staged update?", destructive: false) { approved in
|
|
50
|
-
if approved {
|
|
66
|
+
if approved {
|
|
67
|
+
self.run(["update", "now", "--json"], kind: "update", group: "update")
|
|
68
|
+
} else if let pending = pending, pending.kind == "update-review" {
|
|
69
|
+
_ = self.operations.update(pending, state: .cancelled, stage: "confirmation", progress: 1, summary: "Update review cancelled")
|
|
70
|
+
self.status.stringValue = "Update review cancelled. No staged update was applied."
|
|
71
|
+
self.reloadSnapshot()
|
|
72
|
+
}
|
|
51
73
|
}
|
|
52
74
|
}
|
|
53
75
|
}
|
|
@@ -62,6 +84,7 @@ final class UpdatesViewController: NSViewController {
|
|
|
62
84
|
))
|
|
63
85
|
return
|
|
64
86
|
}
|
|
87
|
+
setBusy(true)
|
|
65
88
|
progress.isHidden = false
|
|
66
89
|
if NSWorkspace.shared.accessibilityDisplayShouldReduceMotion {
|
|
67
90
|
progress.isIndeterminate = false
|
|
@@ -76,10 +99,12 @@ final class UpdatesViewController: NSViewController {
|
|
|
76
99
|
_ = operations.update(operation, state: .running, stage: "running", progress: nil, summary: status.stringValue)
|
|
77
100
|
if kind == "update" { startReceiptPolling(for: operation) }
|
|
78
101
|
let environment = kind == "update" ? Self.controlCenterUpdateEnvironment : [:]
|
|
79
|
-
|
|
102
|
+
let timeout: TimeInterval? = kind == "update" ? nil : NativeView.mutationTimeout
|
|
103
|
+
processClient.run(args, environment: environment, timeout: timeout) { [weak self] result in
|
|
80
104
|
guard let self = self else { return }
|
|
81
105
|
self.stopReceiptPolling()
|
|
82
106
|
self.progress.stopAnimation(nil); self.progress.isHidden = true
|
|
107
|
+
self.setBusy(false)
|
|
83
108
|
var authoritativeState: OperationState?
|
|
84
109
|
var restartMenuBarAfterCompletion = false
|
|
85
110
|
if kind == "update" {
|
|
@@ -106,6 +131,11 @@ final class UpdatesViewController: NSViewController {
|
|
|
106
131
|
} else {
|
|
107
132
|
let state: OperationState = kind == "update-review" && result.code == 0 ? .waitingForConfirmation : result.code == 0 ? .succeeded : .failed
|
|
108
133
|
_ = self.operations.update(operation, state: state, stage: state == .waitingForConfirmation ? "confirmation" : "complete", progress: 1, summary: state == .waitingForConfirmation ? "Update review is waiting for confirmation" : result.code == 0 ? "Update operation completed" : "Update operation failed")
|
|
134
|
+
if result.code != 0 {
|
|
135
|
+
self.status.stringValue = "\(kind.replacingOccurrences(of: "-", with: " ").capitalized) failed · \(NativeView.redactPreview(result.output))"
|
|
136
|
+
} else if state == .waitingForConfirmation {
|
|
137
|
+
self.status.stringValue = "Review ready. Confirm to continue, or cancel to leave the current install unchanged."
|
|
138
|
+
}
|
|
109
139
|
}
|
|
110
140
|
let updateOutput = kind == "update-status" ? result.output : nil
|
|
111
141
|
let approvalRequired = kind == "update-review" && result.code == 0
|
|
@@ -162,7 +192,7 @@ final class UpdatesViewController: NSViewController {
|
|
|
162
192
|
}
|
|
163
193
|
|
|
164
194
|
private func reloadSnapshot() {
|
|
165
|
-
processClient.run(["update", "status", "--json"]) { [weak self] result in self?.render(statusResult: result) }
|
|
195
|
+
processClient.run(["update", "status", "--json"], timeout: NativeView.statusTimeout) { [weak self] result in self?.render(statusResult: result) }
|
|
166
196
|
}
|
|
167
197
|
|
|
168
198
|
private func render(statusResult result: ProcessResult) {
|
|
@@ -33,7 +33,7 @@ const required = {
|
|
|
33
33
|
'docs/goal-to-loop-migration.md': ['only persisted goal owner', 'creates no SKS mission', '--legacy-goal-runtime', 'fail with an instruction'],
|
|
34
34
|
'docs/known-gaps.md': ['No P0', 'P1'],
|
|
35
35
|
'docs/release-readiness.md': [
|
|
36
|
-
'SKS
|
|
36
|
+
'SKS 7.0.0 Release Readiness',
|
|
37
37
|
'$sks-naruto',
|
|
38
38
|
'$sks-work',
|
|
39
39
|
'sks doctor --fix',
|
|
@@ -46,7 +46,7 @@ const required = {
|
|
|
46
46
|
'proof-aware fleet control',
|
|
47
47
|
'npm stage publish',
|
|
48
48
|
'npm stage approve <stage-id>',
|
|
49
|
-
'6.2.0 to
|
|
49
|
+
'6.2.0 to 7.0.0 upgrade smoke'
|
|
50
50
|
]
|
|
51
51
|
};
|
|
52
52
|
const forbidden = [
|
|
@@ -38,15 +38,19 @@ const ok = plan.fast_selector === 'manual_action_required'
|
|
|
38
38
|
&& plan.provider_actions.includes('sks codex-lb setup --host <domain> --api-key-stdin --yes')
|
|
39
39
|
&& plan.safe_auto_apply === true
|
|
40
40
|
&& repaired.fast_selector === 'repaired'
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
// Contract-valid codex-lb selection is preserved through Fast UI repair; without
|
|
42
|
+
// hermetic credentials/catalog the selected provider stays setup-required.
|
|
43
|
+
&& repaired.provider_selector === 'manual_action_required'
|
|
44
|
+
&& repaired.selected_provider_blockers.includes('codex_lb_api_key_missing')
|
|
45
|
+
&& repaired.selected_provider_blockers.includes('codex_lb_base_url_missing')
|
|
46
|
+
&& repaired.selected_provider_blockers.includes('codex_lb_model_catalog_json_unselected')
|
|
43
47
|
&& repaired.safe_auto_apply === true
|
|
44
48
|
&& backups.length >= 1
|
|
45
49
|
&& /^model\s*=\s*"future-codex-model"$/m.test(projectAfter.split(/\n\s*\[/)[0] || '')
|
|
46
50
|
&& /^model_reasoning_effort\s*=\s*"medium"$/m.test(projectAfter.split(/\n\s*\[/)[0] || '')
|
|
47
51
|
&& !/^model\s*=/m.test(homeTopLevel)
|
|
48
52
|
&& !/^model_reasoning_effort\s*=/m.test(homeTopLevel)
|
|
49
|
-
&&
|
|
53
|
+
&& /^model_provider\s*=\s*"codex-lb"$/m.test(homeTopLevel)
|
|
50
54
|
&& /model_provider\s*=\s*"codex-lb"/.test(projectAfter)
|
|
51
55
|
&& /^service_tier\s*=\s*"fast"$/m.test(homeTopLevel)
|
|
52
56
|
&& /fast_mode = false/.test(homeAfter)
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sneakoscope",
|
|
3
3
|
"displayName": "ㅅㅋㅅ",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "7.0.2",
|
|
5
5
|
"description": "Proof-first Codex CLI and ChatGPT Desktop orchestration for AI coding agents, release verification, and macOS menu bar control.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"homepage": "https://github.com/mandarange/Sneakoscope-Codex#readme",
|