Commit Graph
144 Commits
Author SHA1 Message Date
Qiu Yuzhou 3ace468e2a ci: split style, build-test, and smoke jobs 2026-10-25 23:38:19 +08:00
Qiu Yuzhou e38d333a71 build: enforce strict checks across taskfile tasks
Inline strict SwiftLint and compiler flags in lint, build, and test tasks. Remove the STRICT configuration and forwarding from validation and CI, and update development documentation.
2026-10-25 23:24:13 +08:00
Qiu Yuzhou cb771e67ba fix(subscription): namespace SIP008 custom date fields 2026-10-25 22:55:45 +08:00
Qiu Yuzhou 34caebf322 feat: add GUI-scoped subscription automatic updates (#1516)
* feat: add GUI-scoped subscription automatic updates

* fix: drain newly due subscription updates during a batch

* style: use segmented subscription update pickers
2026-10-25 20:21:06 +08:00
Qiu Yuzhou 2241d3f7f9 fix(window): stop policy bouncing during launch activation
Keep regular policy while windows remain open to avoid repeated Dock registration. Share the activation retry budget across visibility events and stop permanently after exhaustion.
2026-10-25 17:50:18 +08:00
Qiu Yuzhou 168ff2e93e feat(rules): reorder presets and default to GFWList 2026-10-25 14:32:12 +08:00
Qiu Yuzhou f6abd4343e feat(rules)!: add isolated routing presets
Add Mainland China proxy routing with independent rule workspaces.
Preserve existing routing choices through equivalent preset mappings.

BREAKING CHANGE: existing custom rules and enablement settings are
not migrated. Recreate them in the appropriate preset.
2026-10-25 14:32:12 +08:00
Qiu Yuzhou 0757af988f docs: explain NG2 process architecture 2026-10-24 13:43:58 +08:00
Qiu Yuzhou 48c1a95f8e docs: make issue tracker configuration contributor-local 2026-10-24 12:14:52 +08:00
Qiu Yuzhou 5d6b8f433f test: move process lifecycle checks to smoke 2026-10-24 03:27:28 +08:00
Qiu Yuzhou 2e5c159d51 docs: streamline agent guidance in English 2026-10-24 02:56:36 +08:00
Qiu Yuzhou 2365befbfe ci: run smoke tests and retain failure evidence 2026-10-24 02:51:51 +08:00
Qiu Yuzhou 2fdcb5ab93 refactor(test): drop source-scanning openWindow guard 2026-10-24 00:50:07 +08:00
Qiu Yuzhou 4845cbf673 fix(logging): detect upstream levels case-insensitively 2026-10-23 23:54:54 +08:00
Qiu Yuzhou 888d184c69 ci: enforce strict compiler warnings 2026-10-23 05:42:37 +08:00
Qiu Yuzhou b5aa827958 ci: stream lint, test, and build logs 2026-10-23 05:09:51 +08:00
Qiu Yuzhou fd1ffd2433 ci: omit xcresult from validation artifact 2026-10-23 03:49:28 +08:00
Qiu Yuzhou 17848b6fde ci: add NG2 validation workflow and format checks 2026-10-23 03:05:14 +08:00
Qiu Yuzhou a3d53e5813 chore(hooks): adopt pre-commit framework 2026-10-23 01:27:32 +08:00
Qiu Yuzhou c76832b5e8 feat(release): add Taskfile publish workflow 2026-10-22 20:49:48 +08:00
Qiu Yuzhou 51667f4839 docs: rename Chinese docs suffix to zh 2026-10-22 17:24:49 +08:00
Qiu Yuzhou faf31a2a78 docs: add English documentation versions 2026-10-22 17:21:17 +08:00
Qiu Yuzhou ff93e6eeeb docs: add SIP-008 subscription provider guide 2026-10-22 17:10:35 +08:00
Qiu Yuzhou 0028254b40 fix(packaging): reject duplicate releases before build 2026-10-22 16:35:33 +08:00
Qiu Yuzhou 0101366096 fix(signing): timestamp all Release executables 2026-10-22 16:28:27 +08:00
Qiu Yuzhou 7b7d572fb5 fix(packaging): require explicit release versions 2026-10-22 16:16:05 +08:00
Qiu Yuzhou 4426d0b331 fix(packaging): support prerelease version labels 2026-10-22 15:02:15 +08:00
Qiu Yuzhou 9cca9f9a0a build: add signed and notarized DMG packaging 2026-10-22 14:32:47 +08:00
Qiu Yuzhou 17c9f15928 fix(window): bring presented window reliably to front at launch
Keyboard-launcher launches (Raycast/Spotlight Enter) left the
LSUIElement app unforegrounded with a missing Dock icon until Mission
Control forced a refresh. Investigation across real-machine rounds
(recorded in the ADR-0017 supplements) pinned three cooperating causes:

- The launch activation retry never started at launch: the workspace
  window's participation events (anchor attach / occlusion / key) could
  all miss the launch moment when content installed before the window
  became visible and the visibility notification fired before the
  anchor attached. A deferred visibility rescan plus re-armable chain
  (until truly settled) close this gap.
- NSApp.isActive can report an activation illusion while the menu bar
  still belongs to the previous frontmost app, so the settle check now
  requires both isActive and menu bar ownership.
- A same-turn accessory->regular bounce is coalesced away by the
  system; forced activation is a three-hop sequence with real settle
  delays (accessory -> 0.1s -> regular -> 0.15s -> activate), which
  re-registers the app with WindowServer/Dock and reclaims the menu
  bar. Each acting attempt also re-asserts makeKeyAndOrderFront and
  orderFrontRegardless as a visible-layer fallback.

Diagnostics: launchActivationRetry and windowAnchorAttached events
(unified-log category "window") record per-attempt facts (activation,
local policy, frontmost app, menu bar owner, space, window visibility);
user-environment facts stay out of shared diagnostic reports.
2026-10-22 03:24:14 +08:00
Qiu Yuzhou f847c01e70 chore(deps): update v2ray-plugin to v1.4.0 2026-10-22 00:49:56 +08:00
Qiu Yuzhou 987a23812a fix(window): activate app when presented 2026-10-21 16:25:42 +08:00
Qiu Yuzhou f9e95474e5 refactor: adopt age configuration storage
Replace the custom encrypted container with AgeSwift 0.1.0 so standard
age tools can inspect sensitive configuration independently of the app.

Use independent Keychain X25519 identities for catalog.age and
proxy-listening.age. Preserve atomic commits and confirmed recovery;
reject historical NG2 formats without migration or cleanup.
2026-10-21 14:31:32 +08:00
Qiu YuzhouandDeepSeek Harness 7977daafea refactor: keep test doubles and test-only wrappers out of production
Move InMemoryDiagnosticReportExporter and InMemoryConfigurationGroupFileExporter
from App/PlatformEffects to Tests/Support: both are test doubles with no
production caller, and production composition wires only the AppKit adapters.

Delete RuleRuntimeCompiler.validation, a wrapper whose only callers were two
assertion blocks in the controller deployment test; those restated
custom-to-custom shadowing and validation order-independence, both pinned by
CustomRuleValidatorTests and RuleAnalysisTests. RuleRuntimeCompiler.compile
stays and keeps its production caller.

Co-Authored-By: DeepSeek Harness <noreply@deepseek.com>
2026-10-21 02:44:35 +08:00
Qiu Yuzhou 2c75ee67ec feat(runtime): hot reload ACL rules with signals 2026-10-20 23:54:05 +08:00
Qiu Yuzhou 8508080480 fix: observe agent deployment failures without port probes 2026-10-20 23:49:00 +08:00
Qiu Yuzhou 6f33260b3b chore(sslocal): pin fork v1.26.0 2026-10-20 17:21:44 +08:00
Qiu Yuzhou f2424af305 fix(logging): preserve line boundaries and chronology 2026-10-20 16:28:11 +08:00
Qiu Yuzhou 94ef128db8 feat(system-proxy): emit privileged helper events to unified log
The root system-proxy helper logged nothing and launchd discards its
stdout/stderr, leaving helper launches, connection refusals, GUI-side
timeouts and root-side failures invisible. Share the minimal unified-log
emission unit (SystemLog) across GUI, wrapper and helper, and add a
dedicated closed helper event enum (lifecycle minimum: listener ready,
connection accepted/rejected with peer pid, typed apply/clear results)
with ADR-0045 privacy splitting. The emission seam is injected at the
helper engine and listener for test doubles. Helper events are
Console-only: no stderr, no agent.log, no diagnostic view or report
surface (ADR-0047).
2026-10-20 15:59:38 +08:00
Qiu Yuzhou 1d85e86b8e feat(diagnostics): unify log lines into one filtered view
Collapse the four definitions of "one log line" into LogLine (timestamp,
level, source, text) with a single renderer and parser. agent.log lines
now carry the uniform prefix, absorbing the ssxng: event marker into the
source column; legacy lines degrade to raw display without rewriting.
Level detection moves into the row model with a classic three-level
taxonomy whose unified-log projection stays unchanged.

The diagnostics log view merges GUI events and the agent.log tail through
DiagnosticLogIntake into one time-ordered list with level and source
filters; the tail window logic moves into the intake and blank lines are
kept for raw fidelity. The report whitelist projection and unified-log
routing are unchanged.
2026-10-20 14:42:51 +08:00
Qiu Yuzhou 1541e97fb3 test(runtime): silence unified-log writes during test runs
Add the SSXNG_SYSTEM_LOG=0 test seam: RuntimeLog.emit and the sslocal
unified-log destination skip their os.Logger writes when it is set,
while stderr lines and the event sink are unaffected. Test execution
no longer floods the unified log store (a full validate run previously
recorded 795 entries under the shared subsystem, 743 from xctest and
52 from test-spawned agents).

The switch is injected by the schemes' test actions only (Run/Profile
keep system logging so debugging from Xcode still shows it), and set
explicitly in the fixtures that spawn the agent/sslocal processes,
including the fixture that strips inherited SSXNG_* path seams. The
main scheme is now declared explicitly to keep the variable out of the
Launch/Profile actions. Document the seam in ADR-0045.
2026-10-20 12:38:21 +08:00
Qiu Yuzhou b6817568f3 docs(adr): record unified log routing decision
Record ADR-0045: unified-log routing through the emission seam with
native os.Logger and no third-party logging library, the closed-enum
dispatch with public/private text split, and the sslocal output intake
as a second free-form stream that never enters RuntimeLogEvent. Point
the systemLogRoute comment at the ADR.
2026-10-20 12:24:34 +08:00
Qiu Yuzhou d099239e3e feat(agent): route sslocal output through a dual-destination intake
Collect line framing, password redaction and oversized-line discard in
one SslocalOutputIntake and dispatch redacted lines through a
destination seam: stderr (freopen'd into agent.log, raw capture kept
for ADR-0006 local viewing) and the unified log under category "sslocal",
reusing the shared subsystem.

Upstream free text is never routed through RuntimeLogEvent and is
marked private in the unified log as a whole (ADR-0014 warns default
upstream logs may contain server addresses). Levels derive from
whitespace-separated upstream level tokens: ERROR maps to .error,
WARN/WARNING maps to .default (unified logging has no warning level),
and anything else maps to .info so the unified-log surface persists
only detected problems while agent.log stays the persistent surface.

The intake lives in Domain/Runtime so the hostless test mirror compiles
it; unit tests drive raw chunks against fake destinations instead of
parsing agent.log text. The 1 MiB agent.log retention policy deliberately
stays on the file side shared with wrapper event lines.
2026-10-20 12:18:41 +08:00
Qiu Yuzhou e0e2814b49 refactor: separate configuration, runtime, and log directories 2026-10-19 20:17:10 +08:00
Qiu Yuzhou 766d1a3d86 refactor(runtime): make deployment metadata references explicit 2026-10-19 19:59:23 +08:00
Qiu Yuzhou 8a53575d79 docs: shorten READMEs and extract topic guides 2026-10-19 19:42:38 +08:00
Qiu Yuzhou 12ae000cb0 refactor(runtime): separate sslocal output from GUI intent 2026-10-19 19:00:43 +08:00
Qiu Yuzhou 003e40d809 refactor(ng2): encrypt proxy listening configuration 2026-10-19 14:31:18 +08:00
Qiu Yuzhou 0f3454602f refactor: separate proxy preferences from listening configuration 2026-10-19 12:10:48 +08:00
Qiu Yuzhou 985153cd56 refactor(rules): separate rule values from storage models 2026-10-19 09:42:38 +08:00
Qiu Yuzhou e0db8b1e13 refactor(runtime): publish isolated supervision generations
Separate Agent supervision from sslocal input and preserve the latest intent after deployment failure. Persist failure barriers, serialize publication and retirement, and verify reload and single-instance behavior with real processes.

Refs #83
2026-10-19 03:00:33 +08:00