From 647201f9c2086fd8e2f5edf1ab10c2008e841251 Mon Sep 17 00:00:00 2001 From: Evan Jacobs Date: Sat, 25 Jul 2026 00:07:15 -0400 Subject: [PATCH] Ship DMG install with SMAppService and durable locks. Users can install from a disk image into Applications with Login Items registration, and ad-hoc helper upgrades rebind instead of sitting in launchd's codesign throttle. Resource locks now live in the daemon so a mid-lock crash still resumes paused servers. --- .changeset/dmg-smappservice-rebind.md | 5 + .github/workflows/release-dmg.yml | 110 ++++ .gitignore | 1 + BACKLOG.md | 9 +- CLAUDE.md | 23 +- CONTRIBUTING.md | 8 + Makefile | 8 +- Package.swift | 14 +- README.md | 7 +- Resources/AppIcon.icns | Bin 0 -> 412376 bytes Resources/AppIcon.png | Bin 0 -> 107652 bytes Sources/DevCtlApp/AgentService.swift | 277 +++++++++++ Sources/DevCtlApp/AppDeepLink.swift | 38 +- Sources/DevCtlApp/DaemonModel.swift | 119 +++++ Sources/DevCtlApp/DevCtlApp.swift | 90 +++- Sources/DevCtlApp/SetupPanel.swift | 217 ++++++++ Sources/DevCtlApp/SetupPerformer.swift | 355 +++++++++++++ Sources/DevCtlApp/SetupSession.swift | 53 ++ Sources/DevCtlApp/SpotlightIndexer.swift | 151 ++++-- .../Control/ControlServer.swift | 254 ++++++++-- .../Health/HealthProber.swift | 13 +- .../Supervisor/ProcessTree.swift | 173 ++++++- .../Supervisor/ServerSupervisor.swift | 27 +- .../DeepLink/DeepLinkNotificationAction.swift | 12 +- .../DevCtlKit/Launchd/AgentRebindPolicy.swift | 34 ++ .../Launchd/DaemonRecoveryPolicy.swift | 41 ++ Sources/DevCtlKit/Launchd/LaunchdAdmin.swift | 468 ++++++++++++++++++ Sources/DevCtlKit/Paths/Paths.swift | 18 +- Sources/DevCtlKit/Protocol/Wire.swift | 37 +- Sources/DevCtlKit/Setup/SetupPlanner.swift | 265 ++++++++++ .../DevCtlKit/Spotlight/SpotlightLabel.swift | 28 ++ Sources/devctl/CLI.swift | 119 +++-- Sources/devctl/HookSupport.swift | 6 + Sources/devctl/LaunchdAdmin.swift | 225 --------- Sources/devctld/Info.plist | 18 + Sources/devctld/main.swift | 64 ++- .../ProcessTreeTests.swift | 40 ++ .../ResourceLockTests.swift | 210 ++++++++ .../DaemonRecoveryPolicyTests.swift | 115 +++++ .../DeepLinkNotificationActionTests.swift | 9 +- Tests/DevCtlKitTests/SetupPlannerTests.swift | 173 +++++++ .../DevCtlKitTests/SpotlightLabelTests.swift | 20 + Tests/DevCtlKitTests/WireTests.swift | 25 + docs/cli-contract.md | 2 +- docs/design.md | 11 +- scripts/make-app-bundle.sh | 102 +++- scripts/make-dmg-background.swift | 89 ++++ scripts/make-dmg.sh | 114 +++++ scripts/notarize.sh | 52 ++ scripts/smoke-launchd.sh | 23 +- scripts/smoke.sh | 29 +- 51 files changed, 3826 insertions(+), 475 deletions(-) create mode 100644 .changeset/dmg-smappservice-rebind.md create mode 100644 .github/workflows/release-dmg.yml create mode 100644 Resources/AppIcon.icns create mode 100644 Resources/AppIcon.png create mode 100644 Sources/DevCtlApp/AgentService.swift create mode 100644 Sources/DevCtlApp/SetupPanel.swift create mode 100644 Sources/DevCtlApp/SetupPerformer.swift create mode 100644 Sources/DevCtlApp/SetupSession.swift create mode 100644 Sources/DevCtlKit/Launchd/AgentRebindPolicy.swift create mode 100644 Sources/DevCtlKit/Launchd/DaemonRecoveryPolicy.swift create mode 100644 Sources/DevCtlKit/Launchd/LaunchdAdmin.swift create mode 100644 Sources/DevCtlKit/Setup/SetupPlanner.swift delete mode 100644 Sources/devctl/LaunchdAdmin.swift create mode 100644 Sources/devctld/Info.plist create mode 100644 Tests/DevCtlDaemonCoreTests/ProcessTreeTests.swift create mode 100644 Tests/DevCtlDaemonCoreTests/ResourceLockTests.swift create mode 100644 Tests/DevCtlKitTests/DaemonRecoveryPolicyTests.swift create mode 100644 Tests/DevCtlKitTests/SetupPlannerTests.swift create mode 100644 scripts/make-dmg-background.swift create mode 100755 scripts/make-dmg.sh create mode 100755 scripts/notarize.sh diff --git a/.changeset/dmg-smappservice-rebind.md b/.changeset/dmg-smappservice-rebind.md new file mode 100644 index 0000000..ce34a03 --- /dev/null +++ b/.changeset/dmg-smappservice-rebind.md @@ -0,0 +1,5 @@ +--- +"devctl": minor +--- + +Ship a DMG installer that places the app in Applications and registers the Login Items agent, keep resource locks across a daemon crash so paused servers resume, and rebind the helper after ad-hoc upgrades so the daemon returns in seconds instead of stalling on a codesign throttle. diff --git a/.github/workflows/release-dmg.yml b/.github/workflows/release-dmg.yml new file mode 100644 index 0000000..e7d8c53 --- /dev/null +++ b/.github/workflows/release-dmg.yml @@ -0,0 +1,110 @@ +# Notarized DMG artifact for GitHub Releases. +# Triggered when the Ubuntu Changesets job publishes a release (tag vX.Y.Z). +# Requires repository secrets: +# APPLE_DEVELOPER_ID_P12_BASE64, APPLE_DEVELOPER_ID_P12_PASSWORD +# APPLE_SIGN_IDENTITY (e.g. "Developer ID Application: Name (TEAMID)") +# APPLE_API_KEY_BASE64, APPLE_API_KEY_ID, APPLE_API_ISSUER +name: Release DMG + +on: + release: + types: [published] + workflow_dispatch: + inputs: + tag: + description: "Tag to build (e.g. v1.2.0); defaults to latest release tag" + required: false + +concurrency: + group: release-dmg-${{ github.event.release.tag_name || github.ref }} + cancel-in-progress: false + +permissions: + contents: write + +jobs: + dmg: + name: Build and notarize DMG + runs-on: macos-26 + timeout-minutes: 45 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: ${{ github.event.release.tag_name || inputs.tag || github.ref }} + + - name: Cache SwiftPM + uses: actions/cache@v4 + with: + path: | + .build + ~/Library/Caches/org.swift.swiftpm + key: spm-release-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('Package.resolved') }} + restore-keys: | + spm-release-${{ runner.os }}-${{ runner.arch }}- + + - name: Import Developer ID certificate + env: + P12_BASE64: ${{ secrets.APPLE_DEVELOPER_ID_P12_BASE64 }} + P12_PASSWORD: ${{ secrets.APPLE_DEVELOPER_ID_P12_PASSWORD }} + run: | + set -euo pipefail + if [[ -z "${P12_BASE64:-}" || -z "${P12_PASSWORD:-}" ]]; then + echo "Missing APPLE_DEVELOPER_ID_P12_BASE64 or APPLE_DEVELOPER_ID_P12_PASSWORD" >&2 + exit 1 + fi + # RUNNER_TEMP is job-private; mktemp only randomizes trailing Xs, so + # a ".XXXXXX.p12" template would be a fixed path. + CERT_PATH="$(mktemp "$RUNNER_TEMP/devctl-cert.XXXXXX")" + KEYCHAIN_PATH="$RUNNER_TEMP/devctl-signing.keychain-db" + KEYCHAIN_PASSWORD="$(openssl rand -base64 24)" + echo "$P12_BASE64" | base64 -D > "$CERT_PATH" + security create-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" + security set-keychain-settings -lut 21600 "$KEYCHAIN_PATH" + security unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" + security import "$CERT_PATH" -P "$P12_PASSWORD" -A -t cert -f pkcs12 \ + -k "$KEYCHAIN_PATH" + security list-keychain -d user -s "$KEYCHAIN_PATH" $(security list-keychain -d user | tr -d '"') + security set-key-partition-list -S apple-tool:,apple:,codesign: -s \ + -k "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" + rm -f "$CERT_PATH" + echo "KEYCHAIN_PATH=$KEYCHAIN_PATH" >> "$GITHUB_ENV" + echo "KEYCHAIN_PASSWORD=$KEYCHAIN_PASSWORD" >> "$GITHUB_ENV" + + - name: Build signed DMG + env: + # A released image must carry the double-click instructions, so a + # runner that cannot drive Finder fails here instead of shipping a + # bare icon view. + DEVCTL_DMG_REQUIRE_LAYOUT: "1" + SIGN_IDENTITY: ${{ secrets.APPLE_SIGN_IDENTITY }} + run: | + set -euo pipefail + : "${SIGN_IDENTITY:?set APPLE_SIGN_IDENTITY secret}" + make dmg + + - name: Notarize and staple + env: + APPLE_API_KEY_BASE64: ${{ secrets.APPLE_API_KEY_BASE64 }} + APPLE_API_KEY_ID: ${{ secrets.APPLE_API_KEY_ID }} + APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }} + run: scripts/notarize.sh + + - name: Upload DMG to GitHub Release + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TAG: ${{ github.event.release.tag_name || inputs.tag }} + run: | + set -euo pipefail + DMG="$(ls -t dist/devctl-*.dmg | head -1)" + if [[ -z "${TAG:-}" ]]; then + TAG="$(git describe --tags --abbrev=0)" + fi + gh release upload "$TAG" "$DMG" --clobber + + - name: Cleanup keychain + if: always() + run: | + if [[ -n "${KEYCHAIN_PATH:-}" ]]; then + security delete-keychain "$KEYCHAIN_PATH" || true + fi diff --git a/.gitignore b/.gitignore index 922b61c..928287a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,6 @@ node_modules/ .build/ .swiftpm/ devctl.app/ +dist/ *.corrupt-* .DS_Store diff --git a/BACKLOG.md b/BACKLOG.md index b00ff20..afe5dca 100644 --- a/BACKLOG.md +++ b/BACKLOG.md @@ -2,13 +2,12 @@ Open work only; entries are removed by the change that resolves them. -- DMG distribution with one-click install (Evan, 2026-07-19): a simple dmg builder (scripts/make-dmg.sh from the existing bundle pipeline; hdiutil + a drag-to-Applications layout) where first launch of devctl.app completes setup itself: install the CLI/daemon binaries from the app bundle's Resources, run daemon install, and auto-detect installed agent harnesses (Claude Code via ~/.claude presence → offer/perform `hook install --harness claude`; Cursor via ~/.cursor presence → `hook install --harness cursor`), with a small first-run panel reporting what was set up. Requires Developer ID signing + notarization (already backlogged) to be download-safe; sequence the two together. - Orphan re-adoption without the bounce: after a daemon crash, re-adopt live orphan servers (pid + start-time match, resume spool tailing) instead of group-kill + restart. Blocked on: exit codes are unknowable for non-children; needs a design for degraded forensics. - Reverse proxy on :80/:443 routing by host signature, making ports disappear from `*.localhost` URLs (Valet/Herd territory). - MenuBarExtraAccess (orchetect) if `.window` presentation quirks bite in practice. -- Developer ID signing + notarization + Homebrew tap for OSS release; SIGN_IDENTITY variable already exists in the bundle script. -- App Intents / Shortcuts wrappers over the existing `DeepLink` verbs (`open`, `ensure`, `stop`, `why`) for Siri / Gemini-Siri and Control Center. The `devctl://` URL table and `DeepLinkRunner` are the shared surface; intents should call the runner, not reimplement dispatch. +- Populate Apple Developer ID + App Store Connect API secrets for `.github/workflows/release-dmg.yml` (and a Homebrew tap) so OSS downloads are Gatekeeper-safe; scripts (`make dmg`, `scripts/notarize.sh`) and the workflow already exist. First stapled DMG may be attached to the existing `v1.2.0` GitHub release only after local dogfood and Evan's explicit sign-off (do not upload without it). +- App Intents / Shortcuts wrappers over the existing `DeepLink` verbs (`open`, `ensure`, `stop`, `why`) for Siri / Gemini-Siri and Control Center. The `devctl://` URL table and `DeepLinkRunner` are the shared surface; intents should call the runner, not reimplement dispatch. Also the next plausible path for Spotlight ranking (IndexedEntity) once Core Spotlight levers are exhausted. - swift-subprocess 0.5 occasionally fatals in its kqueue AsyncIO cleanup at process exit ("Failed to close kqueue fds: Bad file descriptor"), seen once under parallel test load; harmless to the long-lived daemon but track against upstream releases (pinned revision in Package.swift). -- Field-level config editing in the dashboard to preserve devservers.json formatting instead of normalizing writes. -- Spotlight thumbnails: confirm config icons render in the real Spotlight UI. Ranking above filesystem / Cursor Top Hits is a hard Apple ceiling (tried; stripped Recent Documents / jump-file chase 2026-07-24); do not reopen without a new system API. +- Field-level config editing in the dashboard to preserve `devservers.json` formatting instead of normalizing writes. +- Spotlight thumbnails: confirm config icons render in the real Spotlight UI. Within-app ranking levers are maxed (lastUsed preserved across sync, incremental index updates, live/pinned rankingHint, alternateNames). Outranking filesystem / Cursor Top Hits remains an Apple ceiling; do not chase without a new system API. - Automatic port deconflicting / pre-spawn allocation: today is refuse (`port-held`) + observe framework bumps (`observedPort`). True auto-pick needs env injection, URL/head rewrite, and ephemeral-vs-committed policy. diff --git a/CLAUDE.md b/CLAUDE.md index 04672d6..7599d08 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -9,22 +9,22 @@ Identity and stack - Three products, one daemon: devctld owns all server processes; devctl (CLI) and devctl.app (SwiftUI MenuBarExtra) are thin clients over a unix socket (default ~/Library/Application Support/devctl/daemon.sock; DEVCTL_SOCKET overrides; /tmp fallback near the sun_path limit), NDJSON protocol. devctl daemon install/uninstall/start/stop/restart manage the LaunchAgent (dev.quantizor.devctl); tests and the smoke gate run devctld --foreground. Codebase map -- Sources/DevCtlKit: shared core, the unit-test target of record. Models.swift (specs, phases, ServerStatus), Wire.swift (JSONCoding, typed request/response/event frames, NDJSON framing, stable error codes), Client/DaemonClient.swift (blocking-POSIX socket actor used unchanged by CLI and app), Paths/Paths.swift (path constants, canonical project path, atomic write + defensive load, portable SHA-256), DeepLink/ (parse/serialize + DeepLinkRunner + notification action map), Log/DevCtlLog.swift (OSLog facade with a recording backend for tests). -- Sources/DevCtlDaemonCore: daemon logic as a library. Supervisor/ (ServerSupervisor actor per server: spawn, spool capture, health-gated phase machine, ensure/wait, group + descendant teardown; the ProcessLauncher seam; ProcessTree sysctl sweep), Health/ (EffectiveHealthcheck resolution, the HealthProber seam with the real network prober, PortGuard lsof diagnostics), Registry/ (owner of registry.json and state.json), Control/ (Router method dispatch + port pre-check + resource-lock registry with dead-holder auto-release + NWListener ControlServer). -- Sources/devctld: thin main; identical behavior under launchd and --foreground (tests and the smoke gate use foreground). -- Sources/devctl: CLI (swift-argument-parser); LaunchdAdmin (launchd lifecycle; install drains via daemon.shutdown before bootout), HookSupport (AgentContext + HarnessAdapter registry; adding a harness: CONTRIBUTING.md), Switch (branch switching + lifecycle playbooks), Lock (run-under-resource-lock), Link / x-url (deep links). -- Sources/DevCtlApp: menu bar app (DaemonModel 2s-polling model + crash notifications with Open/Why actions; PresenceLabel is AppKit-drawn colored tally dots only with renderingMode(.original); popover autogrows to a cap; nested head rows with UserDefaults-persisted pins; DashboardView logs/timeline/config tabs; SpotlightIndexer best-effort Core Spotlight; AppDeepLink handles `devctl://` and notification actions). Pure DaemonClient consumer. +- Sources/DevCtlKit: shared core, the unit-test target of record. Models.swift (specs, phases, ServerStatus), Wire.swift (JSONCoding, typed request/response/event frames, NDJSON framing, stable error codes), Client/DaemonClient.swift (blocking-POSIX socket actor used unchanged by CLI and app), Paths/Paths.swift (path constants, canonical project path, atomic write + defensive load with per-call unique temp names so two writers in one process cannot rename each other's temp away, portable SHA-256; agent.path holds login-shell PATH for the daemon), Setup/SetupPlanner.swift (first-run / upgrade decisions, harness offers, stage-and-rename binary install), Launchd/ (LaunchdAdmin: dual install path; SMAppService via app deep link when /Applications/devctl.app exists, else legacy home LaunchAgent + Application Support bin/devctld; --legacy forces the home path; DaemonRecoveryPolicy decides whether an unreachable daemon is auto-restarted; AgentRebindPolicy + agent.rebind settle the ad-hoc CDHash window on DMG replace), DeepLink/ (parse/serialize + DeepLinkRunner + notification action map), Log/DevCtlLog.swift (OSLog facade with a recording backend for tests). +- Sources/DevCtlDaemonCore: daemon logic as a library. Supervisor/ (ServerSupervisor actor per server: spawn, spool capture, health-gated phase machine, ensure/wait, group + descendant teardown with ProcessIdentity start-time revalidation; the ProcessLauncher seam; ProcessTree QA1123 sysctl sweep), Health/ (EffectiveHealthcheck resolution, the HealthProber seam with ephemeral URLSession HTTP probes + BSD TCP, PortGuard lsof diagnostics), Registry/ (owner of registry.json and state.json), Control/ (Router method dispatch + port pre-check + persisted resource locks with daemon-owned pause/resume and dead-holder auto-release + NWListener ControlServer with stateUpdateHandlers). +- Sources/devctld: thin main; identical behavior under launchd and --foreground (tests and the smoke gate use foreground). Applies agent.path into process env before spawn. +- Sources/devctl: CLI (swift-argument-parser); HookSupport (AgentContext + HarnessAdapter registry; adding a harness: CONTRIBUTING.md), Switch (branch switching + lifecycle playbooks), Lock (run-under-resource-lock), Link / x-url (deep links). +- Sources/DevCtlApp: menu bar app (DaemonModel 2s-polling model + crash notifications with Open/Why actions; AgentService wraps SMAppService.agent for Login Items registration, escalating to unregister + register when the agent reads `enabled` but the socket stays silent (a bootout or replaced bundle leaves the registration intact with nothing loaded) and reporting `requiresApproval` as its own failure instead of retrying; unregister records the stop intent so the recovery poll does not undo it; an unreachable daemon self-recovers via AgentService under DaemonRecoveryPolicy, falling back to legacy LaunchdAdmin only when the bundle carries no agent plist; DaemonDownRow offers Start, or Open Login Items while approval is pending, since a deliberate `daemon stop` stands down auto recovery; PresenceLabel is AppKit-drawn colored tally dots only with renderingMode(.original); popover autogrows to a cap; nested head rows with UserDefaults-persisted pins; DashboardView logs/timeline/config tabs; SpotlightIndexer named Core Spotlight index; AppDeepLink handles `devctl://` including `daemon/ensure` and `daemon/unregister`; SetupPanel first-run / upgrade installer from bundle Resources). Pure DaemonClient consumer. - Sources/fixture-server: test double dev server (heartbeat printer; TCP-listen, timed-exit, grandchild, ignore-sigterm, binary, flood modes; see its header comment). Commands - make build: swift build -c release (all products) - make test: swift test; budget under 30s, the run prints the live timing -- scripts/smoke.sh: the end-to-end gate. Debug-builds, boots a real devctld on a temp socket, then asserts register/start/status, spool capture, health/ensure/wait, port conflicts, marks/events/why, resource locks (pause + refused ensure + resume), whole-group death on stop, child survival across a daemon kill, `link`/`x-url` deep-link dispatch, and that the assembled app declares `CFBundleURLSchemes=devctl`. Run it after touching the supervisor, wire protocol, CLI, or deep links. +- scripts/smoke.sh: the end-to-end gate. Debug-builds, boots a real devctld on a temp socket, then asserts register/start/status, spool capture, health/ensure/wait, port conflicts, marks/events/why, resource locks (pause + refused ensure + resume), whole-group death on stop, child survival across a daemon kill, `link`/`x-url` deep-link dispatch, and that the assembled app declares `CFBundleURLSchemes=devctl`, ships AppIcon + CLI + daemon in Resources, and ships Helpers/devctld plus the in-bundle LaunchAgents BundleProgram plist. Run it after touching the supervisor, wire protocol, CLI, or deep links. - scripts/smoke-deeplink.sh: Launch Services E2E for `devctl://` (warm + cold `open`). Requires a GUI session; run before merging URL-scheme work. OSLog scrape is strict on a tty (`DEVCTL_OSLOG_STRICT=1` forces it). -- scripts/smoke-launchd.sh: the REAL LaunchAgent lifecycle (install, restart bounce + re-ensure, install-upgrade bounce + re-ensure, deliberate-stop intent, auto-bootstrap resurrection, uninstall). Mutates the user launchd domain; refuses to run if a devctl agent is already installed; leaves nothing behind. -- make app: assembles devctl.app via scripts/make-app-bundle.sh (no Xcode; ad-hoc signed; SIGN_IDENTITY upgrades; declares the `devctl://` URL scheme). make install: binaries to ~/.local/bin, app to /Applications, daemon install. +- scripts/smoke-launchd.sh: the REAL LaunchAgent lifecycle via `daemon install --legacy` (install, restart bounce + re-ensure, install-upgrade bounce + re-ensure, deliberate-stop intent, auto-bootstrap resurrection, uninstall). Mutates the user launchd domain; refuses to run if a home plist or bootstrapped job already exists; leaves nothing behind. SMAppService is exercised by installing from the app on a GUI session. +- make app: assembles fat devctl.app via scripts/make-app-bundle.sh (CLI in Contents/Resources; signed Helpers/devctld + Contents/Library/LaunchAgents BundleProgram plist for SMAppService; AppIcon.icns; ad-hoc signed; SIGN_IDENTITY upgrades; declares the `devctl://` URL scheme). make dmg: UDZO image via scripts/make-dmg.sh, holding the app alone (no /Applications symlink: the app installs itself after an in-app confirm) over a background rendered by scripts/make-dmg-background.swift that says to double-click. Finder window layout needs a GUI session and a volume name that is not already mounted; on a headless runner that pass is skipped and the image still ships. scripts/notarize.sh: notarytool + staple. make install: CLI + daemon to ~/.local/bin, app to /Applications, daemon install. - Unified logging: subsystem `dev.quantizor.devctl` (categories daemon, supervisor, health, app, deeplink). Stream with `log stream --predicate 'subsystem == "dev.quantizor.devctl"' --level debug`. Child stdout/stderr stay in spool files; OSLog is for devctl's own behavior. -- Deep links: `devctl://open|ensure|stop|why//[/]` (query form also accepted). `devctl link` prints; the app handles via Launch Services; `devctl x-url` runs the same runner for smoke. +- Deep links: `devctl://open|ensure|stop|why//[/]` (query form also accepted). `devctl://daemon/ensure` and `devctl://daemon/unregister` ask the app to own SMAppService registration. `devctl link` prints; the app handles via Launch Services; `devctl x-url` runs the same runner for smoke. Hard rules - Output capture is spool-file fds, never pipes: children must survive daemon death without SIGPIPE. Do not introduce pipe-based capture anywhere. @@ -56,7 +56,10 @@ Engineering rules Stack notes (verified 2026; re-verify before building on them) - swift-subprocess createSession = true gives the child a fresh session, so pgid == pid, which group-directed teardown relies on. -- launchd, for the launchd phase: jobs get a minimal PATH without Homebrew (the design captures the user's shell PATH at install). ThrottleInterval defaults to 10s between respawns. ExitTimeOut (SIGTERM to SIGKILL) defaults to 20s per launchd.plist(5); a sequential drain of many servers at 7s grace each can exceed it, so set it deliberately. User agents live in domain gui/, never system, and launchctl list/print answer differently depending on the calling context. +- launchd, for the launchd phase: jobs get a minimal PATH without Homebrew (the design captures the user's shell PATH at install). ThrottleInterval defaults to 10s between respawns. ExitTimeOut (SIGTERM to SIGKILL) defaults to 20s per launchd.plist(5); a sequential drain of many servers at 7s grace each can exceed it, so set it deliberately. 60 is the ceiling: launchd clamps anything larger and logs "ExitTimeOut is larger than the maximum allowed". +- SMAppService.Status is enabled = 1 and requiresApproval = 2, easy to misread from a raw value in a log. `enabled` means a registration exists, not that the job is loaded: after `launchctl bootout` or a replaced bundle the status still reads enabled while nothing runs, and `register()` on an already-registered service is a no-op, so the only way back is unregister + register. Expect launchd to log "Unknown key for plist importer (key: SHA256 type: data)" on every SMAppService submit; that key is Apple's, not ours. +- Replacing an ad-hoc signed `Contents/Helpers/devctld` while the agent is still registered binds BTM to the old CDHash: the next spawn dies with `SIGKILL (Code Signature Invalid)` / Launch Constraint Violation. Always unregister and wait for unload before replacing `/Applications/devctl.app`; DMG upgrades write `agent.rebind` and refuse to replace if the agent is still loaded. After replace, the first `register()` often still dies once; KeepAlive's in-place LWCR repair then fails for ad-hoc (`Unable to update LWCR with smd: 22`) and only burns another ThrottleInterval, so the rebind path forces unregister+register after a brief hello miss instead of waiting. Developer ID builds with a stable Team ID are far less sensitive. +- DMG and `/Applications/devctl.app` share a bundle id: never register the SMAppService agent from the volume copy, and never treat `openApplication` of Applications as success unless a different pid is actually running from that path (`createsNewApplicationInstance` plus a peer wait). Deep links for daemon control use `open -a /Applications/devctl.app` so the volume copy cannot steal them. User agents live in domain gui/, never system, and launchctl list/print answer differently depending on the calling context. Aesthetic Quiet instrument panel: monochrome SF Symbols glyph, tally-light status dots (subtle breathing animation on starting), dense but calm typography, no chrome. State changes register visibly but never shout. Visual changes are judged by rendering and viewing, never asserted in unit tests. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4a97d6a..8c674ac 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -13,6 +13,14 @@ devctl is a personal tool first; issues and patches are welcome all the same. Re GitHub releases are driven by [Changesets](https://github.com/changesets/changesets). After changesets land on `main`, a Version Packages PR appears; merging it tags `vX.Y.Z` and opens the GitHub release. Nothing is published to npm: the root `package.json` is private and only tracks the product version. +A separate macOS workflow (`.github/workflows/release-dmg.yml`) builds a Developer ID-signed, notarized DMG and attaches it to that release. Required repository secrets: + +- `APPLE_DEVELOPER_ID_P12_BASE64` / `APPLE_DEVELOPER_ID_P12_PASSWORD`: exported Developer ID Application certificate +- `APPLE_SIGN_IDENTITY`: exact codesign identity string (for example `Developer ID Application: Name (TEAMID)`) +- `APPLE_API_KEY_BASE64` / `APPLE_API_KEY_ID` / `APPLE_API_ISSUER`: App Store Connect API key for `notarytool` + +Local path: `SIGN_IDENTITY="Developer ID Application: …" make dmg` then `scripts/notarize.sh`. The first DMG for an already-published tag (for example attaching to `v1.2.0`) is uploaded only after local dogfood and maintainer sign-off. + ## Adding an agent-harness adapter The session-context payload is harness-agnostic: `devctl context` prints a fenced plain-text block describing the current project's servers, and `devctl statusline` prints a one-line presence summary from statusline stdin JSON. Wiring those into a harness is the only per-harness work. diff --git a/Makefile b/Makefile index 10e8925..c578069 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ PREFIX ?= $(HOME)/.local SIGN_IDENTITY ?= - -.PHONY: build test app install clean +.PHONY: build test app dmg install clean build: swift build -c release @@ -12,12 +12,16 @@ test: app: build scripts/make-app-bundle.sh "$(SIGN_IDENTITY)" +dmg: app + scripts/make-dmg.sh "$(SIGN_IDENTITY)" + install: build app mkdir -p $(PREFIX)/bin install .build/release/devctl $(PREFIX)/bin/devctl + install .build/release/devctld $(PREFIX)/bin/devctld ditto devctl.app /Applications/devctl.app $(PREFIX)/bin/devctl daemon install clean: swift package clean - rm -rf devctl.app + rm -rf devctl.app dist diff --git a/Package.swift b/Package.swift index eec3d30..6a0b773 100644 --- a/Package.swift +++ b/Package.swift @@ -37,7 +37,19 @@ let package = Package( .executableTarget( name: "devctld", dependencies: ["DevCtlDaemonCore", "DevCtlKit"], - swiftSettings: strictCore + exclude: ["Info.plist"], + swiftSettings: strictCore, + linkerSettings: [ + /** Embedded Info.plist for the helper Mach-O identity. Login + Items naming for the app install path comes from + SMAppService + the responsible app, not this section. */ + .unsafeFlags([ + "-Xlinker", "-sectcreate", + "-Xlinker", "__TEXT", + "-Xlinker", "__info_plist", + "-Xlinker", "\(Context.packageDirectory)/Sources/devctld/Info.plist", + ]) + ] ), .executableTarget( name: "devctl", diff --git a/README.md b/README.md index 533aae4..0665480 100644 --- a/README.md +++ b/README.md @@ -12,11 +12,12 @@ Agents forget their dev servers. After a context compaction they spawn duplicate ## Quick start -(Your agent can do all of this for you, just point them at the repo.) +Download the latest DMG from [GitHub Releases](https://github.com/quantizor/devctl/releases) and double-click `devctl` inside it. Nothing changes until you confirm: the setup panel lists what it will do, then moves the app to Applications, installs the CLI and daemon (migrating any older `make install` copy), and offers agent hooks for Claude Code and Cursor (checked by default when needed). +Or build from source (your agent can do this for you): ```sh -make install # binaries to ~/.local/bin, app to /Applications, daemon installed +make install # CLI + daemon to ~/.local/bin, app to /Applications, daemon installed cd your-project devctl register --name myproj --cmd bun --cmd run --cmd dev --port 3000 devctl ensure myproj # idempotent: healthy is a no-op @@ -37,4 +38,4 @@ Or commit a `devservers.json` at the project root (multiple servers, dependencie ## Building -`make build` and `make test`; `scripts/smoke.sh` is the end-to-end gate. No Xcode required, ever: the app bundle is assembled by a checked-in script. See `CLAUDE.md` for the codebase map and `CONTRIBUTING.md` for adding an agent-harness adapter. +`make build` and `make test`; `make app` / `make dmg` assemble the menu bar app (and a double-click-to-install disk image) without Xcode. `scripts/smoke.sh` is the end-to-end gate. See `CLAUDE.md` for the codebase map and `CONTRIBUTING.md` for adding an agent-harness adapter and for release DMG signing secrets. diff --git a/Resources/AppIcon.icns b/Resources/AppIcon.icns new file mode 100644 index 0000000000000000000000000000000000000000..390427f877555da1b2f72eae11f48bbd15965eed GIT binary patch literal 412376 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 ?VqAuA#iI(R)AeQeF4M;6jzA% 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 Qcj2|TwcY90|Lf1xsP>ZuX=tz}WEI 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 eJFFV3nKj}48FLr}$_Zp&PanRIz*@VGp1Jg# ztZc1{W~a*FLw-UW@dGSTZzl(r^zq0JU4QD^@|1?}$~W6k-8yb<>*Wq(uwvX*J{? z7#`tiPmC**$1D@t>nA^|k!? z`FGO(oc5Vz?7v;QB#8ee_Nf;mbq!bDG!M{rWr-)&_v4DAh6DO1Xj(8KtCdVn4(G5h>A zgOK%g@PvTfJI5ELzmld$2-Mke=>-CYZ7k`jV}!bYaSfN5mwX39rYOfMcj=CBaU@0? zb>nOoX^_6Nw$CFf_E6!KYKT`7berNPcMh%Z18cI04JUz1;vuhl&nA2AGN3BYs~tL0 zcdkG$j!bh5Q=vtcp&#%*Op$41H+o23;(-k>dm}6uW z8|zfkLOja>Cd2fr>i25%e{~XP+?|g$5A)uTLI|a_W-H@i53x}Cv&MlW%<2tqia+}swtqYRY;ookU zW;!b+ywaTmWdA3{X^B0k!ao{K`mWLGw%yKFtml1%!WAm#pq3zI(Q~BL0?YjK0U- zki{mHti~vgB1tzy&bVDNDm-Y9`18l-K80S*`O19cfberJ`)GN(5!Ex_=nL=dxPfpY zm91z3VCML@z4Z0R+uPr?Al+_MVhJxv6F@RomX)$!7{l}$pakID#jsP>NGNh%bZRmj zu7~5hshzb+0EvqqKnB698^4K-th(hHw(=aV5=tB;I~GA!c~m!bR5n48?S8@bG%F!4 zdSG7lTwkXjOc9)d@dvCIMB@X(;6JKNFf#I0$=SKJfSU`M&SU}k>VN_>`uT&3T@Vancd9f&ydQ* z2997kPF3(BwR@qHbf0cj%J@73D>{qFZCsJJ*7eas;Tgik1c2Zx%4bKLR-ItC7|CkXo>13QFu; ztKGv8Yr~m5mOrepURO~{G@Vsp!dcLms=kQp3^WnwunTPoWPJo!PpxbE@3OAlYlX;1 zmS*&hoB|5}OH%@#ifFJ!Mlva|3HbePBGj$Th037JKxwghrGByKKn=dgJY1dT{?&7;gxXQJU3@n^% zQnTpTfKR^qtb0`V%X6^txO26inS2ep=TPLN%U!S|N4&|PMenR2`IE-@nQhpXp=`#% zL*@f6=_-!XLtjTu!EOGRA$1{3^Dutz8q3On5w^5_J+-QJW?+;vQ}-VVYQ%9`rZ1cw zL9QTFif3*2Qj#?Q>Vpe-F4`5B5MlFI=P_*G1nYUT5Go(qeu)j>O$q7zLJIJXf9?~Z z0*DXWIZg+EBB~5-CqL(JW@acMvwcd`FHb~9|0c@=o3J&j2u8-vx z>Is9mP{c?PC3IOvjm;)2CLDsu0?uP$R$uXe^@=_TcUlxGOTK$F^)>$Dvpv??oDQ7K znK4ef75}m&b&R$PsG?1bVf*J)!+f$$e@u6T_asI38OJx7Ej`t41lfHyxTp7n^ z&o%mNUv>;y-&6<7ubj%=vAS+J<_TBQ53V+w%MRRH4WdHsC0}RuwcWC>Xyo%>bw~5T zLejrHXDh(#z%}A<1Yn%!p7&YT4kn**W+8}AQgCn6Fc;Qso3RoM9yCDwc^@1KHB1R5yk*=pUN|G|Y>Qg@U?_kx*rA z%r|63`ttXBGugewIxX~hoL~eYPuPHnVEC8L;My1JIYt4~-aRk#@Cq|TTI34q#OEVl zxaDF$pJ!skA!u0SjQ`yC5q@r`soenu3ZNGJbr5aX+b2PM$nfCq`+F0eTjiH{qm>b# zsowMc{ep$Ny}Z_U&@+Ge_s3UF@FbV|@X9R!AygHPssPBpBg11u2#Oc%xQVklDczC&>6_75@84CB($!v*rj9!|h#>`K}D$x)6C?s@aZ< zcI;hElp=XA#chR`TNOT??;F4wN?={qcy&~KXiZondg#e2E|bwk+@3+m`pD!f=b$q= zJjEN(pW;E@lEA{LV7Qa#9>290oW7fFFd7&+3aR2@WlbRzrcB@3Tzt@Q3WhYtOAUTo zRC*7njzr%6we$^2jP;&>&? z*wA>SD76$A9}@0MR?yI6n(yS|gBzs~h4~k|Uj3F~Y?2B6-oB&Cx*8!vq>>eAbC!c6 zaQjiYRIuyRzl3GI1-%s@yBHIQJ`k(}gG>Sm`I*14KcxRB&g_gw37?~c6)M>NK%KQj zy~}6&?!Mj@9Q^fumIVCpbH_%|owS%a=fSwx2LwL+DI4)2IW%D9SgY zUw-)qX+h|!8#K1X^CKx3(M6X|RYd6hgVdEk5r}vCvX>Z#O5Wiko4=5K2Hqw-(&B?yM3LTRaRvUft z-5p-n-=BkSd{i2sjVJ+eq{VAOH zR!>(%GKJAXu47smr$==WBmmV9To1NjV5&4KF791-G->N?S+{!%EJ$-_%rpiuWlAvk z*!6(c9#wSzmQJ>Y#Q)BVj#zFXfZE~LgOif2D#^Tv9IkrIr(z9`*SHoxsj69T%Gpem zMSs@j#O%Q}hy?5{N^K>r)9UG)GZNTmqfAfEub!`%#}3{Rrh!}x+&VX& zFPB}b3nC{PD_=M$2?u6%YEGDTH5Lio-=!u;C8FM&8|khvEVzlm-NR=YGCxnwQ*#5Z z9_4I{YdS(ld1g>Wy6Cd_RVB&!NA`~L#dTp16WNJAa>pK9e_<1b@w$Xk0h?L{%}1zM zn>+~L+kDaQ?lKxKx!?Kf4^EX0yNInBFSA|?U%P=6ZedTs|9;(mWNdoS^Y1mylcG#B z2re{(^ozu|*J5~bZ|f7bFden+e#EXT8e)*TX;(?*e6IIxEJ!;z1o>v^qK)H2LV?xI zm9c*-JWsy_e~z~*)A#Ru+Fx1XgYwb+TncNu3m)$=>Ee920S~WgK#Am)#=pVG5y^dv zFV4Ej&6O7oSr>sy^E8nu^UmiPp0O{up1wEPS00Flo_U`nyK5(nFG7(WKexlW+Yp({ z1dy7i#!)vj31nyt|WyQYsSw{b_vkFn#_O2_Fi?0LWu{Eb3ba3Tj`Ga z8xSGkCPC=Gr(^O^(qftU-$HjSLU%a!Ut-4&EL##!QA2;%1Kq}l0|zdegx)+C#BJuh z-G=kV0aT9eDYO(H@uBAY!mh^C?5wPsC2aMX?W^ugHyFy5N)8ilgi z>3%#>Dp%-%kt`LpNapD*`On=(bK(sBy0kQTsmvquJBaiRl@&~&YLe-a)@+8D`&=^_ z{3e76usM1-8ZUEWt7|R*t+>rB5w3)af$yK=f2v3l0uFN&KP59B#%YK5hkK%(5KT99 zh9>!~>HRAA+UF0**kyU!mO=LIQZ&W;@tE|QMF z-k~SNEwQeZhc;KYx$`|oxoe~Knjg+DMH-I^?!+I%;L)W98ufV{eV^(HYy5_7?*Hr2 z-hi1yMPUMo=QqOt5*Ze3!$ad#F1mzv|uc(DO%DXM*a$p;%ec zpWv6oUk+$CoXqf_nhYK$?$BfqS$o8N#m*kE1FwJ@zn+KcfyA80%cd!A5$^Q__{`9* zIkejm+9@oy;VC)?Z5~T!&m=r&REi;bpP$l_CC#i_LWwW+h3PTF?{9SrbxMo_l**h=WXmLZv9~Qvf^W!trdUd zD{WcEFdjR*E~!BjI@0_@I)jr#8okHF#A8}DqcZp((n=N196H>1rn{?zE3D{zG^sj~ zVZq18C_I#S%Rk+Egm+f$j59|lv%09rJ>}OUs!ltl++!Es$kn0ToyhJMLp*qm*K6SY z2@v8-eatdA$(8`V`sT{tQ)Vuo)zuiB)wLV?;}k8|r7wIZP>>$*Ce)Vdn*%}KsL+c{ z4@dD;;qX4BS%hvM@~Y;>nk*cCbw^DGaoG3FS^g5Z$?^cY@}#);u!3D=aBe35E8bs9 z{79b8GNP5~XCg~`)f|U5H(b>(M$h!gOZjfBGMoa* z+^;zG{nNkT9s8^7ESZ8-rSe5{q8TUPXEvM5r%GFzyGeEtgZMbYpfqbzc6hLm1_F<9 z)tZc~wcOUD=}mnB`4s2!?pPGCTLjpcHY%{4Ix7CXWXs$txWkU=q#f+D8R7en9alV! z-VIm>p!|o5H0fd#_EoFO(^Vh`T#m_KpwhyDH&(Y0f={g*)A?Txi+@8=mw6GhQ%zZm zxH@rpkKEW~8=rEl_iN-v&Ln!-C!W!rwgdhSYe29>XI`OUatjgB)^KTa9&>%ocnDGQoLV^zBti@ z3l;}F3%1s;6$z~(&!0?oOL?6|4GUjHP&?%Fl9y8(ig>)pi8*W2v;lvj)>d=pwf3Q1 z5E^pmdsLZd;-G$6fg-!LPF1Y&tV4R3DLTgU%4HXBb(z^sQXj|5i?%=6{f~W&Innk; zI7y;CL6f7y0y9bi`>%T`d0k;MC`I&~(mlOX0WrbU=2n z-YEfy{?+dkoc)oRcua95)0Dd>OoazUhtfww#Bk`zc!^sz3m}C&__?dsk%B!$7ySXC za3{^6^3B34(0uhrjV!=OHdl4Qr)}*&dYPwY)qDIYJP0AnX!fy6N&DlY(W6{pD(niO z4|t;IEkej%WPD3Y4E%vt^?u<99EY zN-G8Pp8l!bz=&jGG%~vvZf(aCXkOjf@yfx1S{3xE09j1bS8FT-mmFsCU@Abzj4}d# zY%Um1gl>7zl1r{xo24#VrnRuNgn^vTeq?Rx4JPlCJ$d37gVVbm%vmLAXV`za(S4`D z`X}P564KAXLx z?h$pvkuy}$ru^Q62I2?8@xM~d!aj!Le+yeMJjHE2y4OzLPl>8v=DO^^7p`$NC2845 zLjSN<1ANLOu;;cOjF$!q#_zXuzA@lm_xA${6;}zKE-!WQV#*0x-#yF;4M-R3Acg8~ z&&pdD9!bV3#>&}k9u^uaQc*c?IIK>IBxxEeX7Nji`TemJ0}i%?h8@t??eE-mu9b&L z^dA-fpj9C-QGOiX9hjln&Em|0^4&-LCL*ce4WsqgX8S(?wLnV0czjP{2}m{#tiy#~ z0%1o%!89RaMgd^L&(g6&alys!*A#1o+AQbRlUJRMNTjc? zMfy~A*D-a_%HMja?v<#!zHdZ6(La_>A&h+pi}tVEV5y?9-sntRm6pvP>leK7c?p z`qYcyLFJHmL5K%j2lPT4TIoFdzdFf#2;@)9_Mby=jV5O*8Gj0g^8a`ckiWWqYS`g> zsNEF=?xPi`v1D-i6k&j^SVOvr0+NUBg};Spz5r3jW!OgbJEA-T{J5t7jBnpS&7<|} zO~rO=SDs1;1PF-F9(oMi0SP}rsNDs(&Y2u(Ab5gZ%vfFmWYR>7@a~t;R`R+L54#0d z9#QtMlMW$$wcvkwu^FQC87nRt^p!nTLSS47L`#rWIR8Bafd{q2)Ptb&|NbAHu&%4o zl~V1E2s&<&<$E731QZ0sC5;BZWH$eZ8F>`}AZP;+Hm^l8zvX=e0N1L<5dcmQ820(* zH8}hXfkRh5{Ij3YQ)mw)-Jgn$qb&pgB{HA-)xmwFF;jvxL#v|Rho(FULuxK0}o_P5~s zk;%--yK)!C|2N5A^^4>gZhUclKQ-zb`EmK6guvJkNYS~&{HTJf=sE&GB-UeRQNCD0 zU`z-^+%gpOzhe)u&Ftw5g00+#aMqYXT`iW7xBxs%qf0^6O-;_BR-A z-C;9HZ4P`}#ci2N2+Rip3YK7SnMw%E83H{)0Byj3APj6F2z-W%)qMi3)LBanv;9cw zJVPvlYPGLk-u5_wII2B&EEOj+l5@?|f z7!+#d{oWH#dr4t|nONmh82^7kiS;G1;3da#wYK+Sc~L@OZV)I1fVqLT%=iNcL_y#H zb^Y(5hEE`xpR;!V070MzGk4E)Q`kXG0@+OxTmz~62)h1}ABO2QP}LQJ8ecBYB?J}( zfhY*L^t2CdZhV3V49i;$v;ppD83lo$0f=={8fe4jx02V@zfYbr^FL&(7jgbFq-%V) zJeLrdF9b>fV7~Aza~}qQXl!~2;rs(s^w};;1I(P*dm^d8+~xgh02CNx@-LY6|DN~o zzzV`aB)r4&F7K5PSTqEJAPT;^9mXNC`8Q$c+bj#H-BO#?69B+>l&0UI_bhQ8){{1Z zz?0;^B`JY7 z;Nz}=YEzHb5X9edJn!D9q5;@rE%liA0rxNxT<6d}pcDi?ZhXmn>y=__Nvrag$-DaB z6a4Q!!6?Du^OfXm@0Uq+{ZUfi{ywSIb%WK|r4$4*-=zhvU?~6;xN|ezH2J)=?}!=y zw;X?F)`XW}h`6Ri5DWmhcY+}B6YHtl7z*CgunIvyFM*P90)sMT2Lj@x^64kZ0oMKd zwXaZURlw2~K{45y7n_z2czbcQlboIYO;Xw3OEm%=JqFYml!8D2VEJ#M5GVzJg@U^* zEI>e7cMj8k0{Z=dYj@~VAmA3%ki!?e!L{qDp5O8AF>Y4(?qVZ=AfN+wDF^_EGA$PZ zDdSJD=s&IgRr0p_%jAqu)>`)WHtNyqC8n;IOXtmf0tntoDm$;(Z1BgV(SDB{5OF`g zT%Jn^%ohTs05D(pmbv#sKssoYvscXO{|K>r2Jw{WeK7gq#XvMAh~1;03sis5->0PYpny3=k@V zAW+4?wR84KaQY?c+zu{=J7uZT)4k(fTo|pT8{y zfe#^8-kC83>Z!1a#910w%^0*Fd3G{uCo*o+dkW)!kF5C}(f-`x*L3X!hlj%ifb`4s znfnO5VEyz6SF1;VjW&P?Z0#TV1OY1$B!>7^c`hL^B?Ls|?yQ^*dy?9h%=$k~-X{;3 z^{)m--Bb4uDWMbWS-?fJ7>1JEtDUuz8k<_3Zhw;O-G7uc8wdiY-zW7pINmK`_{T#E zEN_(%xE2E4aMK8;_2fN~tD5*-HzCYbq}x&uxE6Hf!y6!=s@{;k=P>*e82>pl^;h84 zci`9&=W7{%%$x78+g+{iwd8>CYbWf`_K4ltcK-`y?;!}F5$IrL&AjY-HABp(JeLp{ z1_3#?Gk$QGS$B9fevX^U zF*B+r>Qs*!_rx*rzf2_r#({v0zYTFZV|`!C{R;#D`R@m{ ze6NM;)f4Oi4#4A2Ak-`DIEYbIa`6)f+YcuQ2mzr>!YRngbQ1(bRu9}zt87}uY(J@P zac6}Y{|@G-n_Q2(X%Fuy0O$n(4&I1?yihysB%5q+eZp>o$M+Eg)*dF!*1Kd4!M1t! zoFJK}A+HptZ)!{V{NskeC7!lw+sSd`Gxk&aBss5cBEB9V06hB>E>?!EM77l>9INZJ zD-i5eW^4@ztAxGO3Vhr+G^+JdGwGy^|CCwMDU9E>ewnfxr2GjSdXF$Ey2_fL(DIc>;5Gw2kV^?TIq2=vj zK|n`(ncG= zJZ&8>gW8>>UjJFL)_R((p8u58FWh{U&2i%k82$8dq%mBVfaS~4-bhQ zP(!G#d`(`Taj-nlLMxECu1XyzlT3KOOvQtMNQRKg?4C6w=pT6EI)4TF7w)^q&mGqL zw?m-H>(=`DU})+f%#N}H9Qr}L2|Cw~JIThA^W@}SCpp`#F>_mIRqf}=VdE>72VN#? z=T9Kh?}(9g2C<(=(vGE+=fXhXa<;FU|D=8&RsR>br|v*XolsShM&%&cto~E7()l5{ zopKi}lgJ*TGCgPZbe93JieZ)G;*7@?s`oiqLJBw_KD5D#2I~IQ&~K7iKOgrc%Big+ z)vy(|WloqtNka#$F{WxP*B(D$T-0$k>@Hm)TJ0{F}TD0Q36~lbqps)EYlaR@!?k5j^Aknt7T_Xck-I za{xr4{>9mT1xKq*nEoS{h#n?qRbx?ToC>YuNUcsP$wu{Cu>PM}(MMC%$M&yMSsA|Z zsa+B{19^5ofyt|i1<@kn>ehAc0Ag*-Z7vlA)DEZ>@SPMV3kB+rsxhIT=|qJ-qxCt{ zR}2RKUn0&vI9HR1n z$8vzN{BFzqDJZPNR^8tEwrIrnb+iDRk2}fnLzV-!!Cz|}B4XMKj0S6uSnGX=lHfRL zxL+u&+c9XZk_F>u35rbj{xs-b*jTwRrYDjFmOYkgnoZ_r)nr9R&a~lY!qhMJ?6~ z@Yy8+wE+$C4?=*McZolST1oOb0`F%$!ycx?`?z4G!hponWPN5(r;u0qZ$1zZSG)L% z!Bb%RHPrhC?y0B+vj2P@nLd{xsWz`;CVCI%zrkCP*v98mo?Vwm15gb%R5QRGvT)|V zj?jI2(n(J4J65P$X!2#9&ns&v?Y?F=;xCg1_^d`?we=DOZWIRm#QMyjPE&%W{A?Tu z*h}InyGmgH(W>8Jw*P=|(|3|KA*X$s;_6j=RtvCFeUoff{s+R~bKXmZ#laFs2mrh$ z;XFBFJ@O$;TwKfa2m0LF zOK|k*{}zV&R)KGpO|oL3WsP%W-m}QwyxzmuH4^+3hOo&Du&Y8%v$vhyw#q0fE)#sg zEylnF_5>Gb5jvcMXM$f?Pg6XnzsmoMhCsy6c&1+~(5fn)O{m2a)#t{r zIn!#gmk^&HW5C1jI_FGsyJUd0;4;K{Mbo!Akp0(!~D7h=Vnj!3;Je9?OPG ze2x&D=Q+jAw2%1DHt4M?OdqxWDM6<+>T3rNmDnpoI=EN86u~xY|0`MV{41mlH^3VR z^z{OO8A~)xZy}m(kmC-9GgT06DB(%9Z*{k1Om#q zZj5%bEl(3bAaol*wGU+YEe@G|VEFc*Fz1NOKAx{DLgxP*hWDQ^fBBxjXP&GRQf`gR zC7#4epDAAzpWEQw6V&@>oFB3-Y#NDwKIlHwCtSC}1lyPn00>J3Y6lPqItSdxjv%bR zQASBXfx)a&>;uoLGUNXmTYIwEGc?yO+W~^aDJ!Q*EHiUqiLO%Pb$ueT?|*m#DH&A%8PIr~0Kf>;3cmmit|JtK#=wihIDmo9%U!qQB(${*UzipP50MPrTRv-Yl+V z`mV=^vxUr|uvqsO;B$*Med5ef_(TAWYKYIf?}V8h%!kNuN$pE+3zvQ1OpF1S3YcAi z=p0H)u|Uu9n#(c`fj}RO1FR)cs`X|1z`BYdCo1iv0uAZGQkroyk-RL-GODci-(|gD z0WhjvFW;Eem39S25Ukgksf%KhRCC-)fKnC6=*H7latu13-BC!oIrR$z8W5gTSzqQj zsDFc)MaUzBfEDmrEkX6-m{2g_vwLvB3(`?g;`7Z=?#C?{K6vZeeY>_50z0*s;h!PQ zb}-^gVVb_*ueG_U426YSD`(-MGaQ9}^E;r$ds!`kt2-E-Ut3}F};zOd{vdxb2Se~;nw zEW$i|HzBC}Mxym67~E5+i)osC(l2lLZ<`b>X@j_?v7T%8^Gdd3?>(>s*FIx;>xyyU zIED66a~V>FJoG0IeFL%7en2fjSS~%a1Av2M<$(iNc@joZ4W- z**(iJ;a-GO{4RbQG8prp#(p)J{{xu+I*^|xk8z74Z!|`#VMS-{0NUEz#Ab|{%~-E> z^IU(~N~#3lI=Rmn3LYt zp?Yx@pUq`H4IH-}%X%-xqaHpvnLtzCMr(LcWrkndO->P9+qmrMpD#pHSP3oZh}Qd) zCvmw^eVc4o{yPHNOY)@OCrFbC0A?&EpEA37fe>&HAs_?|nsN|@7I(jukp*KktHeE@ zDFA3Upmv}Jkw%IR%*`eK6^VPassz;uV~t zN}riMOgVvI0<^w1M%eb})%SSpO9JRn-W!blj?gOfi1patPx>OlMor;`k1i zbC(+Cmn07w2Py;{KZMEDxiJ;kt_lQ(kUiIR5|>#-S`;v?;A*H)U?3uw4=P;Oupy`h zZ5Z?-qzL8M>Ui!x&fO^mW^7doTz=u{aS@JYasiV+Bi6_{u|_oFbH*?6jNOoadlkOZ zfI(*8tUkxsPv-xg{QJkucsWi-VI`X95H5oT=^?OzTJA>m>39|D%~pLqsIqC4u71w;hIcHO zclz7ff9>PjB$@poaMsu_#`C{Te&c={21^%_>zr+CfYZ1cO!1!he9U^M#(|$c94$zeOTR4E-2X_Nww_h^p|p)}lGMUv~SOJLz|RYnx}8V7}N6yoULoA!J?>@L87e zVO~K1ptK5OQ`4!1B+#M3n60q9b@T|;vK|71-7|4Tt}-mO8mg`nRN2S)qKkq0pSw&@ z1DC58M}(U_3Xusb?IYgS#Il8u06s^pvE#0r;%qqnHn+v5s{p!!ACVT|%^{O_Stl@i z+8&H5ozbJ|399{Iu=gRe7oTU@BANYK_0Pf0PtD>q%wPCUCjj`Ro!5qdy?TwjlG5MZ3>Lv(w-;)82@w; z8h}`|`0R4Sj|c&30*o9ub9@d65KH7tnPIjIQw-@-{`(GX4}yWq9~>?n1Ob6_5Dq*m z7%=_PA4#R0`4HJx+Ky8hua9UhKTko?)T?(36I$_`wv@LOEzn4=F|C~ zT{t%RYTXh-9CN~(Eu467LMWNQnfuB=>9cDOl$7dTl*uS*-ieL}{5Z{wP zDi|mrL_*0q5KZr+J&4c5>yW?S_RCvgI<~0&AS4|00^3nv>+ys3r&)rx*h^gTFK$32myo- z?sfT`YI4a0FAI>Vwt{6lf`Mq$O(~Y7I2o1>q7VQc>yB8#)28YXdQJ_3_hGK$bU-DA zU<8b?WEaOlio;=JB&9BKQG5lbJK*vKXBl|!2+x?+(>W>gcXrPa=Emj~F~;i@f4xet z=gsItL4E(MO9kftTg2Ia=GywiG1vFn1eY^F$rK#P+ZPl|$Lyfqv|h_fgA6p*BQj%u zhx&Ev9iMx1@K*2HgcrT`_h)!b{^7OWM-vt{!`HzO1|T|0)?HW_ zhFWGccP89dPs=kLwr+wFmOG3QpBezsYmrH^SHq4cxCws3=C2#` z7XpU2Pu4XGFVGQy&)OLTeD1->i_33%xBKo5FKg7@G>6L^eXqZa^vUI0{5a7qT;b`VF>vH?@3jzR3BH|9HU2iN0jtT)91?ncKCSZ9&Kp$*AxQvW;o-j)D zUJ7aZpuLmaNNc=R`&WGY|5sNenN2Hhr$6|h4OHqKM01ZNfskfX$q$MtZ_E|~V!_Mq z%ztUj-zHHJ;#~*n(Xpx#VBCz#$BRrs^FV>mUSsEiU;m<~Zi{Sd;mX1Sp7;#z=9e=6 zdF20Z5g#H3Wd5m0m`5AjK5~=?z?Y8wWt8B+bj{g(=FkqdElm`KOsPe=9R% z0e~DOl8{=k|)vxMb!7iD*tE%n=_ic2f5EiWlW)O}9C zpqB*rDTRO~b;M-F9unPek03wGWd6?jJH+32T{$F&7B)x05K!TE83}wgV9**H2{qog zgW1$Fs!^6XE(CNLy@2`u519Y&W;*kaHJH5sV9pXscN6Rh0kOF9oGA$Om_KU&rBX|w zB87|sK$k*_M@?3#mPIi8J4+$J9R*7vpdTt3yYAqlzKfs#-GDMtep^l@5da!29raE5 z4K`WF4q&P1+$RLAyeox(<>1CRrHZ|g`MZ^`#CrA^Js$zU_DLuYm^Hn5>aQ|o4FdN3 z3%LFtVg6F2+2huPEv6Ex|Fz1E$vQPP3d}$fpVb1qESCc^&>KUl(829&H+jpkWER`2 zTbp1o{R2x`pt`bD_Mg@bRMu8{4b5L;A1&?D$9@lF#t<~sQs5d^N$U%QW^mE5lAnM1>nX&SxN36P}&4!r8m0u zAoMM3{%?{y`XOb2)PT6UmAQ-L06y0d05U-esf0qn`t$Roeh3lBM5Qu@R!gZ)+7X*o zH}#SE_f3fAP@nlzR)qj<0^Ci|>oP4D0`~YG172%?-Doq@B~--7VpkFrY6Ssck+A@- zlt1K$LW#=(uh~PO#OEOZTJ){d+TS(*Y%u?B`;8b^|1g+TLk&Py#+*YAQm~G9K+S+( zS*h2eQ7ALz*#Y|b{~J@GxaL3K%FSN@u>KNCy#wBrLcn~x^M>5*?YE40{rs0|@HecU zNV?GjAU>AaF4Ger)}#OI7}c#yA>a)g{FFjKKXev+-NC;<_47}+^IdT9*A#bwU;9Of zekc;B$*a^8;PPI4wzM<&+!F$hOCexs{SXSS!uGHPfV%t* zP)6}&6+^&*+c)Pq=QpAdV6Y%}6D;w0&H(SvKF0Q6LU`Z)YK*+TK>dH!10cRysj-y| z%K%wJ=U&7>;sjJr9gnfb<$2x^aGig>_HDA>A-r!ujKu+e@vOiW?jZymmDberMy!y( zxFpke=C6ux@jX6XGuROQ^FH;W9`I=La%6Es^#z&DF^91r?AdaHxo>S{N(e+@nr zC}y_mkGX%lzB9B=qKE=O7E=%c2m!wSj5z#mGqE^6ltpkXq)syb)#~@j1{?dhS@oiU zzIb-v2rxj9F#=9X_32!(%mEC4O1_0TsR3AgZ;#nLDi#EQ5rnacW*|$R0R62JpIcoa z;0&wEQV8gW&Wx{}IX4LMhV1|?Ud_-J@ zr`Wd)kz+Dk^W0SJJ+b`{Q2%FA?H{3tklJY&jA+E512?L{4gfoWEaM62yn@ki^EH}7 zX-S!82!U!+ubd=XRhj?0(YP|h5=Uh<0!v4|KI8jg=EO2U88UdbfVEe#=uLh^f?sYA zkI^nEBD4Qt27vKv36ORGStgj)ReXMjYvA*8-+OU9B3Xf3#$NEbs4GEm3fIzWsgJ*?+*9ZV*prAp> zO!+&F^7ocVf0>^7ht?^~)=~en{(l2^Z#1)O2Qb)Ct1ntfz1%@?5G+&tPE{$J)qhD= zIzKF(`P+cy3jo$aqG_~1g9UkArs*Ic=-A~e82#mDRRt8RYB7DybVyyPhJXeIy5_a% zfHsG(><0q{l`#Tt3Eb4z-w?lfNgV(OQNYg!1-}WG$-wD z$K{`3Hko$!8*G#YM$G#IkAfr3iUfWeL*>$+70fJQTW0fB}#%bTEc?F7$&m#P-?G6+YuW}y$9`D^jNS@}oG&6a95 zTLM5Jni#IVW((m9h-aC`gMhvG7`Qn&v(=+F)St>$T`wK8((71G<-rahwpx5X#xvj< z%K>@O_r|&}_1sDJ+1%#{4M6tS{Ue}YiWst9H12ZaW(Emnr11da=Xp3&X*~m0_Dauy z@w=-6$vO|d{?!iJ?Qv<{_yyeR%`qwOt;(3}V~M5#g38?k$AgTHhE z9$<9u$?%V0jQSv!6!MgyHEVbVRL`lnG^k8NAt1wF zt9^&j-ybr`{H=601%L=nHx4>2!v#lhTsb@NWcvS!yI(H1@uc#q|F84^ztUiSsQ%BB z9YBBmgHa%!E+JfS|AX>6LI8Fc!u;mO=r2~hdv34XpJ>8@$6&IeH$dJJ!?1?Iu|h!p zCLW6cw#d)NcC4M|ywnjduI_rPTj^?$Z|@q=oo zH>~u8?p@N#H4Fi>x-Y-@nL)1MmarDGUO^*#-D0K@}ma7;pIdl@YGLVVswqxA}V zfIJy9&K+zWR^TvRu30o0&%{Ixj6zy=!w85uB_33Og%pON}LZ7%6^ zUl+RW|1U)P!>v7o>;8Qe%>nz+2H=3mYQY|$#Ii8Zjv*a?hWSfDa+xHOZk95|dcM?B zZ-BhET_NB#0zhdG(8XN+{nwIrxP#`E`Mc}iMe_mc{|L2{ByhOyz5ql8%%eOTno1jV z4Xl**09|mn?*At!+jo$t3GrbP+?mn4`H?;K3Mh9DOc~#IFn@)BJj+8>480~Lm=WnW zSq8`t=EhoIp4$jOx(2q!pDkW~T(qlNF#5~ux_{^mCMjY4e~JNV$bjZrUZq)D4-Klp z{6l-EZ%7wINH$GP(NA8abYd}?cW z0D#Za&?a!WxzWxy8i2wpECV#yG)UWkk2O`GXPec3W`{qP`Eo*_^TS30(PY!0eP&J{ zBhhqV8RgF{esi6ajNSdu4S=Rh#sbhAAh!|#Ro4dKE%^NYWA$=L^qOa}i$`KFaf zN28PXKAjN0smtFT*8lUK*xYsH6Z&s@Qd)&ygrGn<2Zj3ttZAH_5AFBNpdDQPs;`r^ z%D=<>^EHsC$J&{JZ^De)kc>CaK(hRkjPZKx0vqqmI3l3 zX^#ZR8A6>xz%9TrGVcsO*vAF*l#QVBMJ@*cN~fXzZ?D{&PW>OVBb(KYe7Xb1CWJGc zX@tNP=+wuv6kw>|GeZ6T6E1&l!JaRS&Yu9_%>M)p!26G6>tK86Eh6<}7)Abi>k55H zxg6I2l`Zbyg5&vV0~>%46zCTD4AgEZKZ925fIjB2tAr_c&w!lr#;ffa_@&|BTIEkz{S&G_r?Y>XlwSeB z+K2U1YypZIAm|5}e_`BeAOuxrOO+|2|Jm2Wl1y_)0$h+J7ce$}fr1K`s;K_&pcPiK z&402L?dBKY^Xy1ymE8fGo5ksSy#m5s0ibn}QX24Q9|7P$a=(-{JM3Ln54T{Fx(4RH zEBXLvue?Oc1242Mu)233UEZ zO`>@S!8}BL>UG|eO>ox#y)Gq1NfOB&`p4iuGiCq=1=>OjAoVOl5{F+CAjn98MZjnJ zn?2)_cl3WTn7=5D^?&oTq%&pkpOI(^3L6k;Wi`ip0}M8fHfa#3HlPSe)&FYsF&O=4 zFgyQl$oUrl#43sZI}8HdKDY=fM%Vq1Xj1{?nckqUGFzH9_J1#v5f|GC0J+^#ZAhDp zb>UJ#A+`;!u9Us`m-VEz`q|~J8D1&#t!~l(MM<E`Kma&L5Xh_Q)Y1PVE+r~53X>p`6(Xfo z4Bcx3=a6ck@peIC0`$NGtX{FSmFpb?Ys~&(mc2F=-~u7Dz4ir>?&jpmNVnG;%$V6A zs3`KRy^hCRss)%6379u#rG|g+n96($6)O(gEKW62AY{X3{eD{~Tuj{l%@} z4UpG)On*Ci*9^@D#(?$1d@cpJda+*p9fp5s=JLOm(cdk->-=9hVh)%!ouE3++vsuD z|0AmZVojH56o!9B|C`tBU#xYi)HF0OT82VRo51Hi3HailI_jpPx6LDe&EaFy~G1y9uAq5DHxi$dv@pVcma+_5V4k z$!~($yq;HTNo)O^h2WSrt?S!`nhgXLc8`DtbS_Vu1yz`pt>g1w$#KNLp+f>5iD=_K z)&)v303!q*>lT;;ZtBcVx4$QblPpqFumrbiGxq%-1tJALH2`ZE9Og;*8`Yk8U-kc6 zaM|U6TnIP1{jG%Ae_`DILSNvT*SM3k8W^+AS^aNuqVOs)0cr)4p=_HG0;_5~bC6QE zzn_wN@`Nc&{@woiLEc_pMF7}^K+A-RlpH+<2g<{i!NT5n|3!2AbH;DvzgzB0ilxc|_ShG%eZ$Okapw8;m5U$*GpsY9?%&kvz@g8t+ZW z2BEC#D-GpbRMKyL+sJ@Sn-*B?+?yvp?_<|;08VFG3t+tewd9~sZh!VJYw`8X;QL=$ z!0f+=Pw2^A1}IX9ivUf~xv5)V#`g(OLB3Y~Gh6*?Se^rIau0E?zo@|LTWqC%zNH30 zHTnAP^PIKv33En>GrzcIr&&jCIqax7l3ckVYQT6B_>&j9vz5x%w#$TvEe! z(P|kYxJXHSJ|xCPX0-t6?EeUoS**2x#wa0wTdQ9pd@bH6&k?k?O(@+Z4W)Svp%5JC zJ=%?oPJW#IuU5ZLY907TfoA{m`_}qOa<;RcRM42FdJV%)Z4j%yh-u%Ds#=_6Yy?>y z*Zwm)0H#L;i6jDLmEb?ike!`2HSs#wD%i4?9b(%us|9fOzg^7PfAiC%J!jWHyLVU$ z=!{FCTLpVvq@)(0kx4CpYyYRoYUPhmu#EAITOvRO96G~W>Y_VAx?I>$08o9p45EF@ zMveSDY609VC`(#VVppU}m)d%qlu-$r0=S#hU$t z_tjc*zWz1%yu5*$x&&rfT|Oaw=)Rt60nlz_Y!Vb^|CM6S{@d)FdU|&=Q4lbt0)V2W zO8^Q1OQhLpmFDojrv;cp-qU0$Eh*&eU*uu^J-GfY5s}2_b?~{US^$FsWokND!SJuB zv;R+$cH=(qUcCB0k`}vqZ3`_x(EFj?k%>H8!6yq$@KfkxdPL>); zr}X(!17I6BG29BfP^1qF(d?iFVD0n}qPavVz6Z-V`!D3$Kdr2O0h|{Q_@@WZ5f}FL z-R*4j`G_h`b=!7n2XFvRX91s?F|?WaAF|g&5oiCc^u;@PWA-0WM=ij{4q{tbfnssNyvxl&+TfCF4Q+$&&N zN$9_1_HXFl!Jb%Fon}%l?a9*YKekDHF02*+Jbpun;H9#I3aWqB6pMw-fE2&~<|pj> zmyOwfKRO#2sEAsCnjQh}5fB@@@Uyf3bDUWJw8T2hr_o{dk5P1M^>Xb$mULABhWF45L)uoXstpbEtY}2}wx5hFBZ=cUVs> zp-QtUQlPr_Z{VLLYF9=zCTIb$11Q>7!M3-JF!^>_#;qMx|I8{1wn0kLX@@O;TPus% z^k)>>j=C>8uWhxHdWKfoM%8tq`_RNXc2V_1gqtPMM|b>l_FqAtRiu>8{taUd!iYQr z=|ce^zOZ?x>k$xd6yWTv>6n=6XG@5wE?zxX1yHmEQe}1aA3<%uBLNpu3-BJT*4g5T zmOG;z67!$%G!e?hIJ4#Nc}6V%M**}}#})vOfPz6jw8!wkGOfj?YErMhP3o1W)L}GB zTx^|YP#R#oZuV~p!&_?yxJ|G^z`{FY1`WS13vB?j1z6-XTqv`?m7wBUWU<$QVK&de zlM0NrhVfq(XaBL0;;G&a95wqForVhl zJ^{&+E#d++hN}*IC6~$mJwk2TT3}}j%jc;7vrAK^@5<`ej2Vne0>Vt6&D_5XS^zu( zYNJtp?sb?~0q+i24p<~|RfGCpv@TAfHPw~meB)O%Df>)-0ENlco#O2gppW{>{vvU? z!p#3LSxJ5@*zBM99BV7d$phE^M~~ENs39NKA?(}6bT3k3aJQH>1((1Dv?~Z4AoLy@ zfb7$i2>{|CML?`FTgroEi(1x7H~l$=WL`&DatB^! z{H?Wbi28@tGY9yrf?^e0fF}C{6iKP&`hVkKae;x-z&}4G)eb^*fe5s$=H%gSV(8y% z`2RH;07tNxwXqAP6)>2}p)P?7SUa^R^!s13kE`7|+r$*4{taU$PrL4c&w2znD2kLE zr*9x&3*iKY{oRB`7D<}LlA*rA?Ee=Fg5hkCPuXwt9$J8Frg5_=X|cKJ37|{h{FAPK zXITG#2ahZeK0^mu1V9Th|8JP=+>AOw*MvW;*jAKeTh0iga)JTXyxXPS->U-7{wvJ< zt7rgnFk9-OtrLGEVclgZ;D&+G`z8+;;;=!1PUr6un7aNIY|CF~|G52K)Y!-3y6IBJ za6x&mxpon}0v00sEvWqt(+0}`l{vcv%Jf$%FPZ%pEbK4sI%f8NF~)M|%>sa!wa%<* zjloegEOQxPo=NDwh4~+&uPcoFtlt&XI%o{qXn3&K-!JL^ehj7iST0)UW_sBGgG>%NplN%sB;*3a!O3eBtDU3mXzT%u?Y9l`H(2gQ)6y$(E!L#KEgTOHd|76&q@!x84 z5?uds-1q&B4sL&+;wFU~E7y5VqVwi%i{L<96s2oG=Q{MWI;Tz3(#U^Las6WwSP%m3 zjNgcV=Y~HYQyLsk0B~f8SUYF|+%a&>%>69$$z^~sR3#I)L#Drn08q5J|FxenUUE8H z>hDCgSr4)JE|Tt4JbouZn@>7M_$!X_AF$HxZ|koCR{r(p?&7|Ezetk}dWHP~LS(=> zpmUXltY+m0axRL*)OGt~_CJYt&iDd=fYL2cA)p`PK->|5p`08Uz;SqrqbUH||CQ%OWYRJ?C6paXFEoMopOCnNtA zD(*j;Os)Rg^_&^9j_6m>d3CeRQ5?5GS#x859+3fw{8xDcM!$lqrQ0V5X4)J4F3k=O~K%q=tWY(~!S~S<+-<k3}u{%Rix{3DG(4f{%7^gF& zqgwwrE00nC>!MYF#02JicQZM|xOp7Izy20aCII-Q>x;Y21dAd$(WYazRc$+Knjx0G zBES4DE85e2i2+#ss%!YCFi@aW2aj=?na{fUlHg=$;F)SQm|dX$FHXKbYs3(Wt@ZM6ed{dP5I0jz@23h-(Miqwz^g2!)-on5Y z33|3nvsc1mFU03#@cDFB%TI3i)4=$zAin<^{;hqTw3?rS&V`ZCdpIUKyHSww0g6DL zr8q0>5IC!`DbsIM_VE4J1$=V$*8_A$E?nmW`bvg(HqDhG0WaSYd=Q_!2Y9%0zmBZ2T0IGi4bT^fEk7cK26q8W=%&bB6zcLMwlVk z&)Md$iZOW^0aWc2BRXQxD0TPAGO!FNiu$;|J^d1+f-pT z-_oZYRO7X;XOmslbCFr@z*Kz&SQ}69XcDwYk+wK3g#yLB(Bkf1T#LKACO|1}rMP=> zEe^rmy;yK9Rw&NB{QmE~?|m=%l9Qd;+ne2yot>K_S^3a}d1I#lo&R&L!gTNgM}*#) zW!Oy1^mxHRNMT&7GcOREdDH{OhUK^>sC>AHx=opBEjP{1h+rY7o~fccRRwG>1qF{r zAOW_=d!vBek;mmBfHBt{lS>`qSO!9VWF?g(D#eV0tWDW@Kp?C{Q8j5X;Q#xa0+_&X zVQGeks+u;`;*FuMu9h$j4VSu_nwGYvyPK)0Q^Yo+p-_c5| zf7aI05A-)PGY@DgF3k#$aza*M`5(I4=Z`cr-0Dblhmc@LQ#0%0(xRA%$Z#Xo&n9}h zI_hfb%FHzHm9;g$z=DDTElo{JOTI(HF(O0sRQ2_A)S+q^>ay>tWwiBuVZn6XW~TX( zem-7a-T}V)nmU@ATH4xL+6oK;X5W%h)6-KDgRQ;X-Q1w=sBRwaX1Y*qu#OH?8&wmU zmx=TxqGe|0sMvYH+$r4LyqqoUEsXT_jm+E<)-I=;%ZrOE+7>S*KCoWiSbz)J;532k>*cP}rW zV0%+j*N~uu+>Ev`;H8U{q_mxzr|ko@ z9+#T|4+k&Gc+eT9W)a;s$mR01osJ*@O3K=5Z(%!O|3ZQhf4&0>zkd~f{?*Pi<{rw{p0FVBS z2cF&REKH1!O)eeW!~>|0TZ8=rutCT`|4o78b5)X{kjOKW8ug{5gT1p=>NK zpF^JrAMgFb!o#6{)|M6#=~?AvReR^qKNzRyhbt@Vw~x@LPxqnW;a>v+T`kPr(vaxG zf6q>k6`Uc_|2#fCK0Q5#hld3Q1o+!oSS6O1HXfg!ogvHrtS)ceLm!||knk`lG(aTK z$J#WyymtHI^z`iP+Z*PCIBt5gPzOHL_cC-sVfxHpQhx>;=>xj+0_0`p_y@S@&%=D`I z`iAkD-fsBb6B2;*;bs$o*xBD&U0vH>&d$t?t*ouD>z(L=PeC6r{-e|x5*@lnh*(|S z>rTr`im0rtt7{vA4_-Y%k(5T+U*9}{9=_jSU)`w8NQ;gxuc)kR>>fI~K0iCZynTAw z-CUa)9vGQjL#z~~hWdHJN>QqZw|0UM=$nU^(~U(r&}_V%;+DY(D}7y^l9GzXu9eN; z4fL&*x}fCTJZOGkUS6WToUXo}?$G4I_}J>&_U_L1_TEZGx~pr{kEGkT7Zg-MJ_9^7yt%iAB-G(-ZeDI&q>GbNXuSUiL*p-2Uqpn3jYo$D=l1uIlv>|! zMB+!s20A)=$J!Vfn_F3{2ntCI4UX^Z@9!a2*Vc;ivY@f_(H;)2!C#C`tgNifC542B z#Z+7eOZDafijB8y#IoZX!qePiQYRMa(e1zA``^`JVG+FzVM%gGwL zI61pG`-D3?IfX~)sHtn|DzmY1sOv&?m~36l<>Zv@k(Ilp#rioq!u(X#KkMk|3b3%q z=;>%1BT>}ld(!;e~$ogH$F7Fu(Y&@EFXmh_}JRmTF8it7nbkbUS9sY1%UIR@uj7?xy9wB zr6xar2ODc^I}>T~s_EZjLqnsp+jpn^jk)m=5%D?AbJcFf>PiX<%37K-eO(=$aCm12 ze7Fod*w4q;&(GJ#FTz14M2bvCc6q$Nx2L;juqQ!Z-rmc{*Vo6(UWJiHOeRPgPeO15 zF+V*$H9H#RWiBdX2D8O5lau0k^;T30DoHLbz>h$z&CblueE0CNmJ(C2vbMHTl#~`C zBc_E)(ntvKBg;3Irxz+cd^~NH#l+@vmOKPPRtk z64DkHGRRVC9%7Q$;u27PkUSKDzp>ij>FZ%*gCvxgo<0&ADoOT^n3z|L|C6}N_SObs zBg50%-qy~}N={ToRT3s8AT9Emh*9{Hu#$3n|J=rAoTrVkzOLREV>ualDKR1bPy8aE zDBto6E2*i4MZ^{K`hAu~UQ|j-PDw_Xnusn1Sv@4!&q$q`LO>cOg)YX&9N2nlykfgXt<$`Ke*;T)&@nvg{ekrJteo zgcS%=egFkP0z>e6c>FdtH&>cV9X+!(r7u-!>(r=TFurU=!_r`g$A2q8{cAxCOd96I zyH0fG#LK&Efd(7_1Tqmjjbo(`HM)wbkPrTp5aCO}^8E46-H0~8ZaebfZ<*BQpW3bi zOzvw5GSA}d9>=<9c=dTcU$o`YiNy25H;;QUH=zO_45B8C&+qh3P^1wy1HWI)S$Pym>`E&s9cKCv)E_ zy#CHe!|qnS;=`Yp0m%@EQnmHyrctX=pTY0S0-ItvQS4pbC0~ZktQ0nST74XFl?$W8 zUpMq=BI}5=1~)4pDhV%L^BT}jKuG_$SgQ3daS$k#<7{70KWfS@73X8 zN?)f(=R5PCXe%P}8=5J<%^F?aqddsh75rQ5FM>UY=hKP8zZ#_R!rkq&z3&$&m97?b z=M)?KKLp@HZU{U(`b9|9@C)5v^(mPl5X+Z#s&s8|U`Z=@Pij`}k5LSmT~t@Qy8S(2B3gmBv74zRXX`8_1yH z*APMCj@8f~6?C|u(4X&KV*JHFc(ltiOSC3Ml^WaIOrCB~VxtMns&bznb3HP|wF0r9 zXOVY<&PGkVLc?2hr07}!NA3HWM+Z`ztrm~=onDQr?yC>}WFR7Rwtj4b5KFh<9umD2 zLw81|vr7A}tMxX6r~{Q(Tg&m~;ad$+N9CblZutY9;V6_|D%f3>guvgZHT1WMEUFJK zMj2#VPtmi#b#>Z8y(9l%34q8hi8wBjKAu5HOA3={i7~a;au*+~T&9xS-198>O{fb~ z?KKK)FpIU;+&b(6V}>1jpG|X+6`Fu1(7JoCJ`*C`7AJbg!aKv+BM&f>nXI%%1#f|vdC8RZ)|7u3yH|_p-~eo+bTncgnx#WIs1t>toMA0yS+r9 zBB`1GEe;C%c?{{uWl`eu1+`6dXjRQ$AgvPUUkkTftE{QD=f0if()j40Yz9&jNwT9s z%o;{mde*ImQ^*VdmU)O5OuJ!{xkZ1%pLKzv4>4x)M zqvAUTe9%|wD;d?w#pf8pWVR{#Unsm?f#S!)k*Sz`n&c;dJ=fRZ&ttW0R}!b%rn&5D z)#^KtoZ_GHEvb_4jRc%^g~wbNCuC7zF{vlOi}yBO9j<;^IbYW9BjLMec3HX>$%AiX zZZC~2gtIN_B19UF8qa`!_Ilt56LPi&}1-0=iPvFI`aXXO3nn0W! zee#5WkZ`odBuh}V0q`-n1FdMb!=Z6p&DM85RBv(Hl;Z^$FQnp|X6>3_I4Q_5Y2?Dc z!H(`C5eqZ1z}D#jkdREng>FQ>;2!n$6tOx?$XFEUTcM8E`UpN>?_#k$KbpmdfA?v! ze|-;_3(P+dqJUY0O(xe5&3>C7ng?@proS(onouK~Y7rvW9m+1m{;7zv1hCQ6YD;TktsRHkdtB~sSK ztvXJDG+uHIPief-?uZHp^2)yRNJc^%bY2Lf#7=Vd?-8|w@-zZ^8w7*tMMP*sdQ1AX zDLMHPl>y%<-0DMff|3P-ta#XY^E-2E)LrviT_Qlh0BCt2oY^y@n?yDs0B-?MCj?0S zW3%qAqmoYBoR)c7II;$M>L=2iON;$L%&8*Avwo~XGFIB7lJL&&l&2pMpdrWsDloN9E^a|P&hSJXCp<5%1K!r`sk z`t@^W6hdoIn2A%PM-s4 zlps2KCPq?^;$`u1T*1x5+y=EmCO|L_E+&x-=mXOwg#E4~2xI2JQ%YWD0}5Zf5+?QJ zf^?8TUIN;eezHnPTb9faUjBa}F8i)?Vn+^3T42-l1^c zW+C&AC1wqQ&U%HnKecMFER$pIzeUaYrLF3c#4w6wZrb&tF z2%J1?8?!s)UW4i!8D$oFXfCNX>ec&$P2!-1UD8O}FTwg(l-`rWNcHxRnqSDpxgP}7U9CLhQ2^n=j^@IPB7zHg~ zW{;p`DTbSDX=|oL&VUiTV7cdRy}7qFT*mHit6$sqFYHO0`6;!Ao3%kw%W=XV-@yFY zLj964iAZqJ z7eiK%ppsZ~By2fZbg)w^z{KR_I%;K|fHUbe=1pZMSikuf643`btJO_9JvZSX2anVi z9;*DBz zFk}=8SJDWQ^PsnCL7RjTK>Peq<1k-tabfJw@}N;JS^_C8Brg#jsALVfiyj`h8EMaQ zUe!CCzMqhxgrVGPFwg7_W{Ib!DveK$?^0Lsr9g;CsU3$ zuq&y5e<_f)JlreLx-mB+m5;$7NzWkY#~iY}Q0 zjjlSRvzvwz(@aoCl2!li&HlFRsiQIGu_LvYxbwL<;nL z!uoLFhs$ZBH5UArr9@8D;*3)0DnP$#2S>@-=F;~K`Zjbby~9hAolludgM6nTfivJ= z1aREG_Mu-UH33+fK<4dM8OKtY@1%4l^DQzCI|qXbZWE`h+v4D4yLGM~k2I?BLU$>= zrVnn)^+C+LGzd88j1f`C&7!zuY1Ad6bXs12mR-E6d4%&ow}d;9cBye+9TbQJ%qbXC zEk=tv9unv_+fjA`EQin`2B!`mP%}k`S8T4Iq+pW3#L#m9B}HCA$c99XnP04H~S&|IGgLL;2U zNlgmVGGr;8nhW$m)ElVuoY^GYmisHZ^x}8t)rOb4F~vhtv~hGZ;9eAm*@o`mgQ%m) z64myGjxR^_$4{1QM&}ijBU{gG&Chk0uE*0#ik{;^(W5~x_@V-?*}ox2L39#lVE2+G z5TVq3d!+r`_j4VkHTOkNvZ^Sb(_Gb_iu&zQ0y>BSeahS^q8BvTV1Jv`3ZynKD@n(4 z(j1isop9ftWxOh@pCC7RxY!TRN+CnqMQw6^&1Nr-WK_vok~^6{rOSLANx(&Y{som} z5}S&{oZ%ol0jM!UfsM;Ob#wnls-Rlu>+s8A`b~*#De`bIBAfix_V>|PNoFSAZfcj9 zA)t2RDX{sJUoqQEJz13F%JB+v)Af1df_|a;9K{3pC}b&Gr#Y6?rSv3|s##MqYE)J0 zB+WuaLj+9hv($r}A`Li|?u&hWnTu#tf{G7zZJxY1$wc+IS*Rj!G52MhKl_k|=g5@(E-~sJ&uJ4T5TY>^c#K zTOfNM4-wIPslL=!X_Gwv=i!Vj<(pGIVWvrvHzCKCTRq`!{;%nM%j2hDl5eyxFw27; z*f3VgwW?V+a%Uv0*yTUq@4x-=mz_^fcX6kPtojgmVFKvX28qbFjQ5md@;7FXp~Iuc zo4?5a37W))lE10hcw^koV>dNN{Q;U^Nus>95%3gM_afz&U#3N^85&p-dytSG(h=ne zY}p07OMivN80cj_!~q8V=C914FeNf=P8b~aXk-22kJ`kRW6gbFg0!nP-K=nDoWJ86 zoX%U?`;sNF8YE%g?unl!lW7Guh*11wPn@gKh}EyH9ihV+1UEEzpje(6NwIh1Ga4Km z3#%c`1!1JM{-7m7l?(2S*qP#IB62b39@(XH`E=S?|U?qIKZ`k!$f2hWAcq%rs*S69c)>pOIs(d+BQ#ODh zrAFT$<_EqQ`O?87`!C~@h_<&b`dg)wUy0#Ngb=CcRjYs?&idte1jS+sW4Q)}b&%Dk z(?Uk~BGl2i1pk8Pg7NuZX$`IVIiTe0*(v`Vzf8_Fow+3ftH86$Wn3SyLiJ#`FMx&v z{;XqGdLbXv;p5a7BF!wgC+#b??Vf8WFq{k8wDef2twT-l6+v!Xd! zw%GXMwsLq8=&dIg6)(=mgU4hWc^r)3>o{?&R=%=?cdP)+Pl5s=(q>QM$0k~e#&~i6 zPO1KREQ*9+3P3n)VT0#xerskVA|bpg4;qxZzi?#cYq=+r79@Xno+ed(d-d*{NUJ~H zCyQ5wRz?SCaV+-PORHboK)WA658y}uTEI@)!XNju%Rla|cRqo8;|>R{F}DhxI(8dK zX-KD$dp`eeBJ6R3P5pctl&T5Nf(K_dzv(HuGI8*pugPIHtlA45%D_&z}aVC9!R* zD!E*~>WWhf)?kmVs42&pmj)x|dtxZ>w|I};fm5vpGW+D8C2r?Z%2;jp!lL$#8f`Zf zvg=&8&$)INQ^ARi4qJh&sY}bEU;`&)taQ9mJNg*PxVHK1YnU3pBHYEy=9$mCV&Vzo7Zsr3W31A|-XlBW3gx@@d~w2mgyST9=IJ_b-PIod+sPCHR z+@ZbunQt)uD#!&pRsspq(Gt*BV4s_8$ShlUtz!IAck4UO8N2% zxs3hbe>?P{CSSiu&s)q&dS(G79a6MN=IA-Aw*uFU-2#}wEUPMhM-Hr_B{5JCnH$z4NBP`)>NR_N_M~! zsWHKW@TysCgv{E?`=thSsMB?)LeeI=D%Tly^rJATAg2mvoy2cPZ{v&)@^o@slwb?g zrm)zPC*L2$#CR8M`2hBIeA!Qq6q7~U3glfle*Hh0i6rDZ9&TV4CA3|5x7QJQ1WcK&>~IEYG679~6*dK;CznUXtd4~}0n1QqeNa|n)yi$1(FE6b zX{7J$#J`Bc-Gz1&NQvBgYK_aHtFGwMpuXDmRXFvKXJ)z zND2zGxKabV2d*KfM^DAkW_GK5=t>e-_!mJ3s(;!2WvTFP*-s2h?}*{$PNdFR7LlJi zEP|{IdaFMoM~da=+wIyU;%^}CAs8OMb( zV-OqeG;s*wXbk)XJMi7z&7*BC>*vg|6T{Hzcu7ini3*3pUK zgbRPCw+Z-|*h#58f$yE`Nj5bRi-9LkY&dV5K}4af4cJD+i;t@(00Ym;(%Azh`@g_| z(Q%`xU&!(KI+oc_h=I}o|8FKZCo-i~E2^~>6mt-Wg!zcOG>BO}W7f9j@}ADO!Iv?J zS^g_iKr#%p5%~J5$Ph$+DWgx)$<2EF7GkUdX9tb&zZ_wxcK;NeZa?%v zYuR$~k)C%Xk6jnW!qgoFirh@@cMn!m&Oo&9{pCl2XOsQl-u{w~O`X#UNS}O1tJ*bx zf%;EV>JpLyjgP+;1@|B_$>@_wn*|3<4o`r!)&bih30~Pn77J8%SxT;<3$pS%ih3rxx>u{wUB0b;`q4@x>Z8RYopfbv+Q>3JlqrgcHSP;t@DXVf>?|!eOgG ztgYL|Bvphi(1*bhxMWOmTcJi5z2=9VsHfFC=~!7ox7n?LJj%yiNX}bxYpNIJh(+uO zZUNKRAL6DFt*8VR>Lb+Ezg)T(0dvvbs}Ic}Y7velMx_yHLMvUC#IvEh1s{zz$oIx~ z*uX`Fx2AZD*^|-h!A71H9hflMUP}B1sjuXs@!_jMYCLaM_G*0khPiM{mTCI%bu2P%fBo>h{zwPY8)&6MU=N{1TN>s+1 zro_t0^IJZ?=X!6*K`D1^v>MFw$5RNdXZV3Vgt!nQx@1p11+*8qX+yJwq2QZaqnE+j zdQu9H$)k#|G?mlFF&7mrk&L zO6JXIKErF}S&FC>n}5jN%fnlK63ga9XN_%Zh?(PeD&Wv0(hGoM}$^AQFn72T-PP zP_W;9Qt1)-T-5GyJ%?DtZn0nWT=pP3@%iz?X+;XP~p-!@&KYB?Ga{WB@UQ_?oj-C^mE z8IzAyy%*12ez!ijm(A^uVBKVCZ;Iw%2}6rI36*!sd0bFK&zNyPf~c!fUrEJ4(Wnb} z^CzgQl3y80h_r*SQu_9(F-h;3CJaIOHeh`UPPZz>7jxa+ZkHizZZqr=o2>?j@(dPa zGZ5}E?VzUn>}X$=!dVVeN0xzBw9pb0o<;O)jA%q?$(AOE6{zVIHJ1{f^Bd%f)hIsQ zfZA-lj&tkIcGI`p!!#65b>VOE@ZVK~D#jA99&K9czp z8ljZmLLi>YuRj*EQJI{*Nzr?5NY1<-loy?rw#WYM#U9!@`yJ;tKIPh89ybH!pPXFI zKyulxb~pYi*OD^lL*bYS`E`nCpH+h7_ttcudp;wCJH*pz1}oO27TOW)6LyB8Lwnz5 zcXqwFrYW$4&vVODV_JIb~j! zsbdZn6p~8*>b!Qu`-OJvMu5%cAfrllp@j-{RGuL^KuU{5ISb8SQ@+x!>Ov>2zEZcV zG_lz_mHXJWaUgYMC63m&E4_=DY7XHbU0V_>YnnpDZaquvSar=Q%wO%m^Nj;HvTS~z z=`mL1L2J{L+nSc)V3V~Olo0B_@h|4#VcU=mw?l^n!!U&zqDQ&?Y40q9dEcrcB+xdm zOP86B2A&<-_1hU=-gWnwocT+Kbmg|?9`(d;7w-0|bbo`}&2X)^w?;%K8n*4! z`7EIpg@sIt&lb0F=vZ#{Y_3UKhEYg!cHX*c?t|I2uDxBbFlWnXbo54IHyF?`lWl4l znAEVz@=HLZ57f==>5rnE`NIf0#^K(2D0;jH#?JL}uc2e<3Kj#CXCyPZ0Q~S&? zt#dZgBI?6L{fED8J7e3AX`t|86UPvQBHS9u`JW=qhk2yMDBg^BYgadlCP=+-%jGPm zNn9F+olm?J$WIJLhrXYRDyht$lHT;H_)lewP(!)bWv~YYYDYFxdav?%W$Ou*$sIDc z1J9|*?JK&z;hvK%;qitO{kXI#gJT<$vl0Cz;2W*Z4c!jhT{mLf@VVD6t)C#vXC^04 zD`SULr+fn;m(UM-CDF$!|IV`id_NwrOtbMB-61%uGWYSg+14tFd0_V>;k;41n6by- z!kj}b!c!TX6y6q79#pc=1qSuuP_>D64rD6MwZF{P;Fi&7}+d%cRQ~!zh3Z%4WlBdE=K2cv{K(}v#S*=3=OfY>gQh~q=G!~b%-%qBraH8qTRL$t z&itfyJ+lSMd)yAL*9&>riw>ExWs=<%>Zd5QsCF1-MG;yu&B*8hi9bRC6bkp2VVp%_ z=b#Yi@H4mxD?~}_ojhqVWaL$&pBZaTq5}7mhOM5lVeZXw|I3a{!pW|96W$;;!bc%u8X%K=NCTLr2?I>K^+OU6R5? zhVJri%*k=~<%h(|o!zn?oO6n$$12xg-`D)p<#=ZH(YdKQQ}*hb1qAFPsn726z*Oce zs50@+2*0e_mv#Y$sIT9?gpX6Dp0_=Y9^SG}gM9t}7G957ZYHPHEov+NkmtNBu`c&| zdF+FFve|4igXtv5hfeW_2FExK_Ma7sKQa=>vjkeDV+i`X&SwC8mk>z%H6LtW!)b;Z zRkW}>Cx#+2{GUF07b9(}J#3TGdP}AW_%fN_{0JcdlTSWlXe^ zWImAzkOpHh1?edm5xENJF)mh5EfbWywLcmEz5nlpcPKK7!c37-bWCO`g8F5441>*` z@s0emee~~n=t;J^fdY71vY1U25gdlm)gss2{ddXbpQ>94wJ)i42>TaVJ%xW_eU}?R zccgx`zJWtekU?xMk^gG~M`^+2BOBF*aeU=@8Y=$cGT+Ww259`8M>Ro_5Ymrvio^5w zoDW6DIRnW{Bkr$a6qKODeO;JwI!=Z*G6Vqw{=0b|Ihp7}_S&XA%eB9ujEAJqU*0S|5(3V9cC%N%{X$bNQLmytU9G2m9=fzXuXyQuF! zO+V%*e|(^B`vsV1eC>;_$W|hM2-r9$xc+V5g$Tt~`hK!8rU*lL4aNe%Ik1;F8QZx; zI9i8;7WQWEFUusz>2)-T@bv?R%kJ^OBBbmC7={}HVP}FqOKW=HGe{NdTWsNE6BJqf zYOl)Iz2%8mWSI=BI)*q>2a|%7`vnWG%#-E(>RaOn;rydcYq@aI*SKg_984lOgN89kll?EOP=j3XeHo1xx?)5)msj#gD38Pr27hP+TjiVml>@nO=Y#j=_fZ29K7Gz zTlOabB{u!&qd-;ib1lmIcjmYY5|=&GyV`!O17N$-+YKfq$|humb&Qd^zc_HfiiYo; z?I0Ei*~cWY5XCbE(L+1m$3^%C6fl4z-7Ar%Q*wm+n?;mocEOtjl_+I01MEWg*>gj8 zMpT)$no!@#);{oWk_x=|N^@h8QmK)n>BseyR#iUYl!5 zoynox8Wcvl@qG$|)1}eG;p<#_DBOl6ZZ+wnb9B+h_fP>8ln-mGrJ^;M*6+KjKU56h zI%^KyIi~2E5L-&h)k+FM7oD?;VU@dfip_~q>xInVbm3UI&Aq}WrqN2b*WaoAD!Xi3 zXvih^ZA$$Mz*JH<(oJ7urQY=Y*Eggv45mu%F8vV`bVv+1_gX3X7_eBujmuL{dJ;e3 zB*~8rL0js3uAa%26QbJL+*}Ff4~POfb%bRD)$1si^tj;mYzHxQ?f9@cV*^IfXsg~Z z(3`*-m|jxw#`@Hi@CU!KDs2OW>`HzdG1R6$$ohf@^wL_eJF#(FtxiGM(Sb?3?ny4n-Z(PdU!l>F3FrQ9nR2q!m2 z{*)Wk3q2lOkKfvuA+fRep(BBKE(ZR@j#^z13qNCT9}?OEW)?c-jO{heoQmy2*%PVV zQGZp>)OV+<9Qvq$mDKzclBCwjVWLxCt!6`Ou_t7SsBWVy(`MumoWtl-e4tD92~J%utVW4eRW;zV+o89O*95TXvd6NgO+6RMlfoeB6~(F zDiqulaG?nrIf~qAlY0XVl2?IPPOmBo(PIaY>mPK4LKa60JkXNO@g_ml%t6VO!XyFV z7}|fQRiAX+P)lzLR~>1HDdi6_qm&YeyUIx5A}M~2(Y8}S0c*#de;q!|74tLq?xMwq zFxR+(e>Lf1K2jsM3=L1U8`qe}@T*Q;e}Gq*04ymoR(I6J+7(6uCIeBU*6*#yt6v+2 z@YI$Hyse(OG;dEbj55ut)-PgH!Xn3U;6W?v;iTF*)3xoS>oH)xa4GpM(^4O*d)b%3 z3Mo!#!$3L~1Xh*m+;x6lo0&%c{O--9A1i`1MGn4e{qb=l;+I2#n=~0T57*fkKLT?< zwgf~_$7#;I<_NCPjb-s*Q>qvCzCT`;KOgd(StJS$WeJXLYA`Dg!XY?*UMp6@3zGN2 z%qWUW&fV@%sOqsJ?fj^G;&2^~N{|u(_o-%~&F<1w7fsueXO-Lq9rdeoSbGWHMBlV= zIEI87MG;I6?U;r@oMKYfC<)-tdgR&3df2XMs|oGc1+B*HNVn<$NrNCcAJjMti1<%d z8el!(yLnLN7mf>g9`F&dn-)O8HBxK>}pIoL*>r;kSry z`J)n8$nVKdCeZGBe#wdhW%K(cTBV5~Sv5<)xnF}&|Y z#Rl5YU@>+wt47T`%mM!75N^;)=w#xlf%Pz~rwL%dKQCjz6wo1;js8B$fZ2DgA%mI% zeUucO^CJUos&6Nz1t%3flqr4;HX?wf6Exw`fCl!`&%^(wzwX~f4YhRZN}k?#&oKD1 z%1fmpz5+b{sUz>$`9jT32~#vfd(U<3^GT-BPaXx%0$P1=*D=HevYY{4lwL;%QIT7a zP!Iw115^(hv1L2Tx;k^?nd)}_My1Qy%E>3wtG2n*it{A!liY&`7GxOXEa$TlEWsf{ z1?^Uj7-&cJ0?E`+)hERj)b&6#oeAM4-byl}?R< zn1^Vb5vrpQkLTAW_aEv_FHZV*yiNi~$-c z#YyVNTHo5By5(Ks7eIGHN)Gapgv+in@6J>IbG#iJsCJ_dJg%C4kx;B{BF=3fe0{gv zC3I8Y^dVh(of|X?o9{Y1?LF6Z)$dXdhaY1aKT<1e4PmhJn~Y>1^vZ}G&$WzT50Y6( z!S8F|8Y26I3#I?Xo>)#0JM{hoeTpmW*Y=R}o$?f@y1-?(?cwCE=5v{=Ved>hJPLDB zQ}WkCJL$x(bp+A^bGR&eTGXf;iR4Two*ObJB4z2V-aY-hWRpexD7vJr($8V*|o)_h^Im? zj)cFadJ2s5_T!v_WtQTcy6y?TXc>mZwZdqbGCtDg$zlkANMvaoM=lVVI|J5+Vfx#n znu{g4=AM*zx?#<%ZBYqRKuX3rx=`lWTIPQUiv#rpmcx&bj#WWRttFoy-~ExH8AN&L&> zRjU*5u67^ZXx`@)3wqQN0^y>)zc-t0!SxtVE24Udcng#Q*PCc&Ke8Y%IwQca2+F~k zt6W4htp%zSNBJBn@TP9M-iNt2@sh1%k}ny9;rKugwgA7yzatm<_6nFGTu7pNl_I?u~#~W|8 zzX11sJ8RnI3j+y8qC%aI6otwnmp5pbJu;Ty4Vc_DGxf3Ibn%-`u5?{VQ>x9Qnh5Nhh=ttSi(NQ<+%`x6Du^si_4rL&^y|cw z1e8X&<*OM9fM)?lLTcM*4}I8r+CoX;nFtZ#*ZvVxKIY~?pqvLrkX2l-@VoFmJft~# zg<-ynh4=iTv7Ote6B)XOKM>_#Le3cd|MF*;KNG!M2pr8^U@l`3U*xemsI=m9-jE*`M~n?o~bCzG?9Yfd70Fe?Uyf7)kN*DAJb}R zuxSRd^QA<#6oerR#&r@jBD0H1hpsg5LjEzj0oe$$+k2!G3A?8+`@B6^+bu}|#efH^ z>5y?lm?IDs3s*EaDAjFRjlTw75Q*oYPc&lizkAff5j1>-0eQ=ib1XYoHK6KWbW{LF zWZe1nMztXy)@OcdZgqQ36u=FFO=4DaBrpcn)L7BT;ek3Sa(Uh+ty$Df=X@F2Csqv6 zl6dnXLs8;=0|VxM^@Gf?8joa7#?VwG`zzxi|4c5o(S0SfC;-p1wH}#8`MI3)b1)C& z82YlhcNDaz(j_$fwG-<>+E`<|?@TyMo=FvU3aM)~?CIY7-T+&CCm5@*8soz(g)q(y znS=QgHT!+7!cStmUgzoC!zw##4EhO5){3AP7b<2;R9RRW`ou3FzkctDw;c|Kh*z~QhA<6 zUChr%V{gtC=ZDT|tXhe$(6uAah1kL=M8P{o1s!Dp%+KX%cDKGb=K55W2TJXo(mEr4{ztJ!NEbt!Vc&wWtlvM4a@l@sKcgG*$4 z@HzDvIOqO<(e%|}QFhPYyUPMgFO77FbSk3c5(0uqNaqqtDIqP$E{%Y6Nh@K{Akwga zv;xv79n#&f?7p|p_xJwE#kJ?mnfXkdnK^T#R-6-mjsx*Zy7Zu`*bSGP5Mydb6OlsV zna0Zp;CQ+qBk!dkj2DWq`JiTQ^|hS4FUun-#v*q0L_d(K?!%Ov{#TYdnUBuWz1bLa zgNlh`tv2*xOVd;!7=Edm-@B5t)+y-fa#gq^@z%(}#(||H0lN4~micvBFGY`96k-e} z7eHH|3ErrR(VlrrSdxO8QH) zuh2B1Ag9Xp)#hC}2#ev3ATzthwxf)F&u?%969%}wG6UH-RX0jUV55(^iCF*VFw%Zj7dMQ6))1HU-))zI;ik@`GB$eU=QMTL(1e$4*XcN2Dpa#zK zaN;C0kmVwtAwMNcXRp*9Dv&O))|j8Zdq`BMtBN!Q8ZmSK$^WSbv;&R~?|4K&;s`Qf z^=qNoz-4=j;?fBcjkBULq-l8H40d;c6XC(irI=M#(Q%(&ViR7doH%nYrYU?j_izd@ z^2`^gCT=wuG7(@Bufn}@A}0$l1*)8Uu;VZ?9icP1yZa zwxaXh8f6&079nM?7$ApiEkLJ)ev}Hms`c9kF$p7}j{c43YfIjGZ`YSl0Xav}4-S^S zrxE$|rTxr5Ko11M{pi?a^7;?avgN}6DOxt+b<8SLE1Gj(TJY;gmGjI z9Jzv%@LCGu5_a`T)~j%)nUmsivT2&5QND#N%kJBLH=dGErT zmxaKUb&0Do-W{#oZ1PtHN&Tc`m2GGeHk9VG^=Q{s6i%hS9fhETn-Fjy2F!md>A3DH zyHbE0<}CF_6dAa6?V-6CSf#1m^GmribPdLAt^kZ=kLqePPhNboiyb0l)){1j_zoA; z&J1=e=}jVoh(U1B2uM8su2H7EFpkj=J~#>+;)O);RJy*<;&EgVU0qsQJ^VEa+^m3b zk~Dq9=HL(7_%A(pfOMtrx5mU5vLBg;r2Q|h^*@sMp33zEuWBNHX&>G-;hQ&alG;F7 z(7q=-hSIb$(u1)?yF9GO)LhW*dGO-CoH`SlzPeF#Nm{%{qd}(1l%uyLhdpx5!YMV! z6bja!X=K~h9JMxGdAVHC2egmu?euT`s%SWu#!VEUA9Cd@9>yb~>nTpq40_Kx=_VJ^ zS-iso!|%V#HSnI6*r6bbp_>qY^#yivun<=JN9kX#YVZ#Wtn}?XvtwG8+V^r(_kmQ* zF-!2ZVkF|>U3(p8rLCE&z`!5lJPxp>2;6lM&T^+Q}UA2+&9}*tX zUk=D8mIteBRL}4?=$rLY+Zh3katMq0NKXvTiIVTAE_qjS!!+=c<;N-*afUa&qgN3J z40r>OT7&NLBn`(*(ITzC1l=~i9{jmX^my>_1D*pw*!WK0pz0emGg!fj!#3%m4*HKf zMT?r7?8eSnP=oaHJ3@sQWx}0eE;Lg$0Y-F8B0eo>m6YUYmn!O#^N_DBiw7Sxo+46b~Wn4CmLfVQh$eY&UUagdjsl{6bg1->fdL&!6> zVb9%Pu9=Jm+wNU&iP||Vo6Fe`&0He#%gnNfO3*`ooFp0nU_CYrm(lVzm@El!ag7ACqeP$~=iZpxfDsBbu^XJV z!)icn9{^|1!@zWxS&v?2D@n2aKx|js00rtU91l^>X?#?bN7jo=iZpVj4?W;Bfb zv1yTaQlN8vDqq}ecA}*HnbC(8Qn5o9`QYES{nflr_CRU#1b) zvFf_cPemK-2OsXj+m&#y-iPfiC4T>5MtobYPBE25`^-cA}E5)Ye;R$1cnGt$nb!X@9c!i`AYq`buo);b3lYrFsQS0DtVkZvvUEw2|*ZsS%B7y6~(@S*bjmhqPwwp9TRLFpUi?RH77)ib2y9| zaUbke-FL_yY$^$cerwFAegxO8L!C_unP6{!vkxJee}j<(dZsZ?{2=autx>k9h)1BC zpysG|jn|4ZifMrO8G{$CRgp^2F<2$B4*DgL9oy}vAotRVKV6ExIL2mU{~Ofx3}6c4 zb1zSRisqVF>I`05v^6`toCG3-yu!=wVs#b(dZI|dCm=sa`Y85hz8U+wMRFpSSD@w| zQxZJ;%>564@BtdJ36%peno2cSrQ2Tatm zXW3G3fh?cx(L1a2d2(ztrOPFb)D=2su&pmO=2iI2Wae(TS@90$JbcQ~6hscFcBfHM0&Bx^1%;v`) zfpC4}WTZZYdMy0~Ej*$)vSME!X?bY30Ax>7#Ica?d#nh{HEbi`3J}E^js3l!9kH(# zoK!LVP_LwmzHW^PQdg+^$HD~4()W5YS{4~OUyf1J3rmU~3)9G7)Id)e*Gs)Rhp5n@ z+eV!W&jy(Xw*EG3)t#0BMW@bLQ3m`?`xbiPTm+O`71J@*%=U>I^So8Yjshfq7T3&# zV`Icq&!v<`!+wOK!~0g%dnqfen&f9kH z@8bJ4#e~U%`KYcOeAaRIvMMJvRQQpoq6tf%QA8sD2NN zp*r_6$>(NPgn2?X@=vd2v88#jO>b2K4-fOcTx@)ybzWV~H!;!S0Uz(n3Rw6Xq_-1K zT{yhq0HeYr9`99wyA@16bhHh%mFVs6EWA1RP1<9Q-LaM{UkjTLk16W&b&G!=!D+$2 zUSVN<{@PCI0ynjC7PqH)>3=xewH#bT^j@$$;L3HG?co+=rDAgVUjlvW z#cX=y{E6rhM^U<&laI?-=VpKOe8x7o)7Kmz`E}Vohd4kcvfH6dy~p8o_>mLq=o2Y} zSAmb#)=$r;{v1KVg8l9l_gJ#cCu)Bm-P_-dTz-|*OJ5>#0-YlFdGDb0SW8{aJLr&3 zTKN;u`*oi+$T>{dlvWv-8XEh(=8B1*6O$Y8Kqa9F7J{v$15yZ`8MUVqocPt!c$ zF5w%&G0`Mjgyis&=3lpC1s`P0%hnC|gec0D$0QzT7>e5uqp(I}p-K@MQ-jJsie(MN ziA*>%0$u2aeFdZrd}ZYnPSyCClj_cVsR&Xn4_Ew^Tx<2tvl?A3^g+=zw5`AHC(0+B zR$IiQ%2d*lLgMUO#1%utn`fcC2l&k(^@~FUpfC|TTmZHn88^wG&c8zIK)^_ zCqyz9Okb+lpAk^vfxvfrFp(%1?2Va4U#z~Wq*zW8Q7@WQ10ln}3qRM%He__(f^Ld% zc@fXoT%PNl?DK?>DJ;cw8vE0Up34hgnto70P~74{3XRZCLCWb^y3xZ~n6f1siJ<9y zZvHE6EPC8TTw=(o;m#TH?q_Py9IImX=Pb8DvcHM@bF^DYU<4}bGD}36r1G4DF6e;j zY|woTXCnOZDoC#)=5;-@`KZN%X!m5*-|Ah=OeIwa9)@y(V2Wk5lmuzB6oUbhwbEFn zpk0cg$;G*E?fr}G3Da+4L!?V23rKW%{?OXMJzN`;QNqu0m1)a(8<%sr{BG1~(b7G? z_7?WJCyO0cj5Q`xo3{8_$XRg^ov(~9Ew?ngvC11}oiU!JTRd6JkTL#+Frwh9_n1h= z41&(!Cwf#PTC`tS%m?Nf*(xC*Rwl4j@mxa+1?Z{26gHKA8Ku|n_g?Y4GM+B28oV0{ zE_Isv*%KhaZah8g<>;mlUW#<#wj61+vPDBUi4XnqA(aX1+H0%#&#+pZ zp6lVBJ7tLlp^flA*79k!wM)V{m9v2DmC2599O4U)@L~IydHds_b*B`b>t_u@&hEdA zS2LZGUJ>8hXLT2px?wmT04nSdCqE}VWL@uNo**~Dn+@ro$UXcCS_l?iKUtU`z=TWP z{P=+JglBtwOWE4;lyA>!-8g&nF=M{D%zIK5F=s|gaw+MW2%1ky$V02}9yBw_p~<(* z)-geXivb(UY*x1jJJf?jdQO&&^Vy6edM+HnIV?lB$ z76~F7TNZkd(yB;|c__k>DZ`IETULUP9{3(>nQR-w73f5d56XM$hljp(8=?%?4Xw*O@6HU1gZ4ngf#S|g z!@g3avGPRKvuj(0ZvD~Q#AmBd_isHY|eXELod!{9hbSVF~xpwv&oH^^Y+*{U6xsz z<9$y$3Aufbk32dDr^uwXO?FwBi1w4*hAfNN30(GK34*){@}w6<68ewVvn>Wt&)fO0 zm2}hg+$*f_7>ilg2}s2%zg&!o=$CTFDoOTl0)Mv#%XceVw z7?xgTOp9fGZ-az(f;v3KScufzD8TP0(Lv=-Fq6}@EJOSL>EwXJjsS*owq&Kt*FtX; z7m09`GdMhZVdfj@>()uFppn`6_p@Db3Nzpf&4}Ay|V}d$c$=2jTq+}Cxq$3X}r48?Uh&}#ZPI%LfxGJbwe{48?pgO!~ZwW;Cwogp5~rGl-J5kD469p-*F`x3z?p& z{Iqa!1Qnj&ByrE|%xl-U^4h3Mo+Jmo{jJNsogMww!PO{ccga|tp#FeL0Bz)=- zUkwl5g6npo=Y%e4e(B0-M7LD<2;POOwGIO~z!?x_=j38# z@xyGv$7EIzkw+TF`wbM6N2;g~WG-ra@A96LuVfVn1}#q~_)iRmJXzNyNqEcSyJ}@g z#G&L{L~c4EWtn>>I5R6|<1pFLF|W*Qz`$L}3Q_1@sH#JYph!wc6V!|-z(M{h-Byr4 z=Vcb1oJ|&;RTgE7PRx}1wA~w>+2NcrlcMZBWZ@>5N1sPhpXuzng}UESk?KY>!7=&^UCVx8>kH?y|S9gU!4m3P9b z9v+{3d!$S>CZ4Yvni-BU_@I=NA!q4ZICrwzV|DjdH*NOE7HjqW-8Eq-=Q)!->P%bu zhoCH0g5hd8=h}U7FZawKB*4ao~yo^ zjqM$Dz_4)nNWR$_7T)_L6JhV#26;4h4|G>XUE}Cux#O*&{GLZx@9oX4!JrrSZml(a zU}fioNO0yy6m{k>!T}mAtlVuMou+q}R{qMUtV; zoj#H>vhYFHsQEvGHLW`<=GlqzK;(eDsrF>w+hFd5qKipN(;yerw12e%s@9s)-VJe` z4HkKOSdF}Fb-0xFnCT4Rh`|y8pBR0;z2EsD%j4?Z#WbC=?oUd+jdq^Ov%6lPnCGk1 z>(b04R4s&eQfp0#z}mDXYMTc)C86J)LHkPX`;Y@1PiO|t^823bsYm^~ulHhJj5?Al zXkhy$T(@8xJ|_@j+;%{&VoWk|TGtJ7qbG>Gaf7&n9DItv1?mqe5Y!GPdE-uezLE(>NJfCpq3-jWS`E-U&oLFd?eNO@ zGuiHaSg9?yMR)UA027$gqg%X{znmE~NHMfeGa`bZW&FXo+PYJbBzf(|+DEFto2ma? z_%Lf~wu0)F4J)4BH|Pnph*fog8QQHH+Ak}SV0d3O3L&sU#Wa>R5*mpnUPhBVxDDOr zy1C%J;h>jvQLp)&2-M@;7lT95i9IbwX;+8~vMKd#PN2xct!al@7#mB|Vc%oX%#~_} zEp0ubI=m*7LW6=t_4J=FT{szHcld%_hJH)g!%X&gR1hjee}CAxrd~DDA~c0p-+(!( zplBhDnxg@t44l}D9Lvdzd+}TmZ7a5s95Fce_PrJ=)SDX932kT+0?|pdy-2kW$B^+> z{&^4N?*Pg38Bzu_$boOIpiMdQ*qH1G)`9fPb`M@?6c5z@KQG?MeD;e8cL^fH>FGF6 zt%_N1QKlD%JcO0@!^ujGOCGRHw;7y|zr%;2TP?C7W7 z;`?=&V?2kx%_WtuMpfsYO;trqkmRu#Zh0Yf8VDFII)9h!7hTC@IsqizjfF`0!EXNK z(CvX8O-~?jFHI85?FJtoHD}5X38nkb4l=DbQE|_OoeZ%-=zB}1w`tv?DdZ+ZUbA~L<2O5Ka&fowcE>rFFMxzmBg;@47x`&il@%NCG*FXt-N+y z_~M~jhr0=KV0ovG{J|kUD4G9Fm4fk8{KNuRCD;xjJAo5;_lwwt=W|}l>PMWt0Gms4 zqES%$5p~m3Q{jn^A~$BVyFmrAS4Hjd?kF6K4|ZcBuj?vYlJ710koZwGIra&Y=)yRA z2a`Khp0pkPvurNJZT+jmj)6I%{tN19(j|}dw}#+Pfd!tBV!XYwf%mU@)@)7M700L2 zSAirRTM;Kfr!FkEh8!JA*7e|#V?_gZ%cbUaH)!?pcar@5cG&B%uZw!A8ss2_uvdh| z_~0hSR14$HUtL-nbH-}Tp4YJNFksk5)5v|mtP61Fmv77a5v>oXZ6C6$6~KO9>{Qu zt07P-Pfy4(Ejtwuy2D}<0b*SCtX_l-tY0^mGGw&X7^G~wp-xPU zjF)+?M!I5X^2R$KpyI2rrj1JcC5f<4i>00~=~`1{^Cu1F(5WUWgfa?uw?ZgElzItmsl5Q+cG^Mdu z6Soa<8G$Au;Z^4AYP0D^gf}2@nedn!ptyxD0N#b&Qc!0CYi5D)gL#) z>y$m)yE@RrH<%3B1tE9hKtkg&wRQRhz1(+fuj}@Gc@fY!Eb?ZR*8AVa}%zEQ~otWJB4{mRzXo5d*=g)w1Mw9nfr+pk@ z_eyFJ{7kPi+lgSOzM)r#GJcdHSF0U4X_6qXmPnv8Lvq9qFY#uctCZj5*!YgN3M+w~ zp4*etEZ9sOx|r=?)BScw$y$1XA(E|$*oBkYB0g5N@)_}AS2v()3xb`y>EGqtr%e?7Dgj3WKJh*{cS0yV67WW1! z^>cxM3AztKAq)VBz3{h9UAZq8Kq-lYGI@fU!$+)L_2uf68JhEFWs;k+t~Hjgy+5LU zI8&YlC7erW&xiCcKK(CGJv<>JOKF|?tdf{U>4bdPAXG0A=3F@uH`1b^0SDC}vbguJVSf*o-RrEMWK{vF_yh%rGn!?BvV&3bYoryp_Wd(D zT|3N6(bdhxBd_tq)M_ErmSCsz<#o$L$n%I6p>7slZSG)<1Aqwl2o*4!%h$i=xngY>5^s_z7~bO=VOV9LczhK)ViTL#8z=!RD82zv zi?aq-Ni4W6?%k_2XDX4(!Vq)4Tj2g6Eur+9R0TstqcMr;D)x0f8!)hYTBCqy#=o0_ zq0GPX2cQa25o}$w-N$02+!Z_!0iJxKCUG+2`ui!j7rsshbLH2%-vzH6k@|xvv5ZqD zia8CwHDxP{L_Ts@uSGgkKi`(Yg4)bIP_iOl>TQ=uKAK>1&U|Qy11EgUn9x4I7I({! z;O=7Poj?1M8y~uJf|?alINHhfJu7StfC-dsbBwjsq6(1#);b1x;tJ**(uHk~(Tc#w z5<}YVU|baslWP7Up94CUV7z+`o`&K$gZzb#Np(Zf=ykVT+fL9vtRj6M8t?`z;rw#S z-@YMmmyiY%6DE?bqm6a*{%Psv%cyfeyyZz2gPSmw{-KrYM?A#|l%lG*^0UDuvz_}= zrDH3l;o@K>0_Z!!zXEraF+MAl`h=~CoeRj~1hl#NzKyBh>{ab?%Z|T&`$~=|&J*07 z{01nj>k{PEgjiB;MTVY;#-!Ce%}B0R_bc1|TpomU%65I;|LY0oja4(t-RrW20&qwCSh5 zZzv*{UMXD90Y=s%H?GeaTG^?~>#0BB7~R&i)idHcB;C46Y2z)9>1bowr5ou|jBAPj zrt{UnKecy$^tqFAvP_UbT#kVctNjjG?a7=i@ys;{enJ6yTqz(%+}3?F(5KFd(TOA? zm2qlk^6P828y_e##j=WAHC6uE{#AIe8H%lmkyH3!>$bNa#b-!c>1n4yu*2YX==`Hp zF~6ii5dt^^^OL(@Bri+j*jlD}M`kf+qPW>Sq$A__adL_$7svqA!?d^Hf4wvbAq7mnw?Q+!oz8v z!t($K_StlO=t5?-&S=E1t~P|CoKGt32O51CloHUU5{238fP*UzY}VP_v&ft?1jP|w z5Zf=??qXmI;n3=%MC4DoQARX`miqBAt5;C`_2EaZdRd(O{iMm4q#f5={i!$nK*|+Bvrg~lfW5{eF;>rQ z(F}6y@Y03NL!c8m3Pha|fneeuR!Fwmm)9VWE|i#w(93_l%*(8J!SoqoPOsCd__@7g zz59tBp4(l#JGkrqcnG!Z`B&b~**}&zkv&j(YcFHmc~Ed-+CKxwElv?Eu9{yW$BBo( zBJ?YxQev(5U*=`7cyiX2MifzyX9>hHuL!=zxu=~?Y#pn;S-w`zGj1yBsjl+5@-t^^ z@3KA$=V{Fo#T{&h*U|>dapn_s{N4{Q%`xH9!I-+xZ|!ASBBTr#h%&&N`%9>&@=YCN z?(Lv_QG7*28x3)jmo&ZQI@Jr_;{dLLmwUyde%b%1a_508-V342S84v@O8Y&yN&o1s z+atdE(60}3Hg#JS$}#uu&mQ{Q6=(%5Hl?ME+yP-$=P$l;S=nV)(N|rE=2iW{)B9Xm zi%#2F{c}+g)b2L-urh%ct8B6N^SH;>Df8=twke3!!9` zHQzR>U6jf0%5I!khz~;eZ^@!vEs|IL^!r?~U>ylcON!?eHlFJQB{#*8(BTBM)4;;L z1b`Y0GJMi#Wp~K)D*@X#39eQu!TPzQ5!iT@=%=i4X5GN_?@-Wwx8koJM6 zj2oYRe-l&W{`NX!<(yoplyjQtl3A|f6mdN1Y{|iFq^GY~xM#kRGyD^O__m`B@Rw2K zU@2keQ*>>z^vmDdVc&xX=|?b0r5&SfTq6E#a*SIj{Cs0?{!6Lcuh#eJ)ERN~ySE+` za~Y{Zqc9e*vFvXKNSLFAUA}=^ksAVjF2faqxmEpingfUaDm=8d+1bIT_-SC@iBO{6 z_$_PN5$&xd6k)@BJelzj8L&GiWPlThq~H9(B0~CSg~lD7TOIt^Zqm_I66%*;0i#Ue zpA;<;dE*FnCf?1=Zd+>|8*>~NdcK0FoSL#~*F5G%0A!TG$X!J4n{M>x2YK*li?KRr z->*BTLjK$~wpv_CUz+YS(|6k;(cy%s=DP!dnZEVwid!e`l;q$)Qx9*j2&cMl2*4oH zF1dk!%KG^K{`4yGK7kqd(P>Tezw=f>ehki-G$@s9e!)4R-A(|kcT&(i?#LlUcb|>&x{mipH zm@Cc_{-;<=&Cg0S2ylD(830i)S;UC3!m~asi(r@i6%IFk0VO08|AHwHvm4D~#|8hV zZsH_hDUICPpoCWJ9ZIV8&;S{xHC0Q3jS9m#f}&z}wk1RMGA`dkw(W0U3vG!HfBn|5 zI@LV978oIH&C9biA5tdnYyf60Gz&f}=NK<)JIihEI;1QLylkp-#YxmQ!QstO{~1Dh zu#|3E0FVN@*6Y|ur-~tACRDze>=?K^i~w`nkHAmDogj?WP=b0pwQ{Si_9eGD%bvf{ zoz}KczdveiDBhL{Lwmole@i8ZLY(urv%jQ|NZh?<$xyL7_@6`RrGYfEPE=`Gj}OBu ziB%BhcPtmoTEtMVpQM&EmPup$TyJzL%RSm7E_h(qyyfOkY;ukVli~Mj3Tc2Y3BV)y z#ehZWT`J0~&jEp4{VgZ>YW$ zP~RFR7FTG~4!xc;jrskbZDfi^M+|MAp9D4a`6UYc3)lX=^4X&R=M3}Y3%)2M^IG|M z+d4PTDB;`jrc?~a8~2bmY!X|`5yxj-$Ud5Z_Kr5`=>uyEWvhq($Pym=y6{4=s7%TI;<3@A{yiIgmZyhGIX5dRe4c*1P5K6RXV!>V^eY9;)z1>SndfTo`eHz0X_LpSPCbpZ_6ftddO?sq7(wR`a9*F!Q}f?O_iw^tZ3B&73Xu_o^J~(RRPVX^ z6#d%A+#jW~eAciZ4>6qpeuozLw|n$0eqvzvL{9NR*8Pul5oq~~2Tv`7!6r> z_;gR>cC!D7_g6(wydN)E(-+s+?&{&x4dN8lrE@z5qI502*G zEIdB+;qF!!bj=X(>hR!f9^IGLwy{{T>L+ta;}c@5d;#Wv`}F7|s5oPhxz+l6eaWfP z)e?RpwUZX-L!oRy2dygSpMP7vxYm0GZ24CeQ#JH`18exrY{>q4|2_8nnaiytgf;=w zkIcp|rVRLkCxxw-sH)|maD2Al(gv_A9bItJl^JsnK3y)DYr%0<8YmABxJP&}z99~t zdLCpso+Nbkr(&h`Oxd}|;+*l=$gb`U;yv&bGJkl}VeJjV1IT!wpID~brPbEY=xss>+K6`GweTm|kcz*P2NibOce*sJ=ni+C84yUs*me)J<)4Erv z#E0x*J{2W;11s9USgnT=;rLTgIJ;#vDo8~Q22K_o47>pA8onI>XeEXMcCVJev>|d* zz*fgvA#qgiXg=S`&#w_nsD9Bw}^1 zECx%rI=^*ufu!S`C|vmS#@fPHG z!VR709AA+DjS#Q`YVI@?2$EeK)lS}ufY0@d$rx2;qyOTGy@~a~5$1w>Ot5W=gF64{1#`niAkN5H zg)3rHHr&IY=Q!pY1gCRS@WUE@y@7^mcDZD+fuTa`d)yXRc`6Ycz^VBEZAo`ciNphc z)Q6xAZ}k72ogZ+n;1RP5ROR!=>s5BIFSrpGCEuq>UK^MTsqha=p;6dA(5?RfE zA^#89`cj(@o_^%=`f+nK&q)ghue+579?21bmYsPTeFJ3#7QiO2 zZ#;RYt?4>D(O5fw>!39s%+C%`8B5hNBd|CfGw|@6v@FOc7Z7q5ymIo2`wYHjEl;ZR ziw@0;CHunTw1d~q#%Xy_=4y&RpEn?kr~QZiCF4vfwOV-a(jR-@Om(?jOYyA?-AIn}>{#PI3f+!b0J zeetq{PH*ei26?dmg&`)dp!^_{R}3|w03#o%g08%;2q%)MfDmZcyj{lAtNk^O+w=Q) z>nyzso@IJgA!*{5=jS_jyOxwaq55(U{-FUDhiDmEr1_E>BJE!YZuP zbI02f@X~bxZC-f;Vn~YNWvm>fX70aiD#5=4gKyQu0K3MjVg3xgIr=4A^{NfNp}1KIv-F>20lM?VSAXuk*z!TUu>gs140KXjJ3I$4nPJDpBjj{_F$pE zmcNVVYZo*iLxao;*d>V#jw1B~UvjbZ(z*LoiIfo$=n)dU^92+S@T{aoY0dn({i74X zbem-ecSp2QhGRPgvVTXA&#^VF?MF^;TOW!O70(%5@oJPkQ=d=lKSbz9fCxbXc1(SM z|3ZSH>?>VY{CsIg?@Y>u9LgQD$uOUy&5X2UO6EB=Pu|u4Bz|dOl}tnkF34ZH|4$jv zDU}DPdaLA~93ImOiy6{GX$p2lGV~si_|9O-R!&5zSC9~XdOCG;^U1|p8t=S591fS8 zQvbm9*YsG^+%zvM8o&2CBV-gv%T4wB2i&2_p)A<2e~Xz8n#R zQ)Va1IJ?~{17n|6J`tVP_nZr&npnW1V3N2HU`&!k%Iv?EcNiG8+{QiOtTpp{{*7V4 zZ7+{+@tH*K3}ooV-%TT_D$pu35zF3~5rTPM1R>av6cS;xCj6WN(}%F?S%XCgU~w4z{&`}O?d zCJV4qzi8mctE$K%lk~_ekqqpaeUVw(PA9FsH3|H?8-%qLgz0XJF&Hi3R6sm1%K3PR zTKTrB?oS*7de4c3>^1|pV1&#+G2{gDjQ>MB0wIk%lvkazZdV?5dGq9gr7H2aSnLOv z0Vh*X$kzfTh|a8v(`iYy`73@7Tk09duYr>wGbmIk;S5mn1T`oTGivr+wk7v@4r{+= z4ZEhXMJmY4;h2SKyqXk#SxL8*{?MW7Mq82BW$o*$#!vATVa&e+P zz|#o0Zc)4|R`Et^1kjUd5j)R9h*O7({dLpwQ-@8s0t-j`KYKa^UE9>CSC!GY< z!uTH+8NyOL7J|y;RQ|gw5QDYz8m$oSis$Eyl?Rg_igAA&fQfeL^PTxdXZZIFwM34A z0!b)tp=trtYLpo4oCFGP3#|=d9|tzAGi@wu=>^qF7;c#;eB@h3kxM+>(P7E zA1+b4G*iznrArgJbC8{!g7ITxSe}c^pfl^ zW4tIKm@hTN;?D3SPS={4>JUiz0Cz4DFiRFzU&UwAe3AvlD>m72-|^bB$1Iza*D8&-Yd3U()t#P8xd?0e~Xa1)5;UU0hqb=Srlm zV?!hQw6$&X>gT00dM}gPFca!t3E&6G1aX-HweefI;;zww>Bs*2pM9CzLMHGv8YB}t zzEcdKPN+*Ux?o0VdVROIu}+BD6CvfG6GP!Y;?i$(UyQLf$*bvjhPnG~9^h&<*uj%K z{ePWR*q?uWaJ!g1dT=N!_4YJ>p874s__sjMi3gz|$|!d4u}9#a6~BfFG;W_>r-a^z zL4v{pP${$*-6QwF@&cY0a-{PA;Zq5Ew=x%N_Z+KuXaI_7An(?m6ngm9eMer&b(1eD z_w`t?A;?vx=piBmYdZ?)5&8(cJnyhU#4u12Wqx5^^~yn-kLR-RR$1%3 zLs&GsrEG4~#}PDrrxl+1mScu&{(8veq7PX^wRt6x`^wkGrH?enVuu|6p-~w|rztXR zTB5Qwe-xh9XRt62Cpc_!6$DpS z*EG1!Bfta|Rg1*HN=Zr!pY8hE`uUK28sET<{xay7eCKYnR3b1CNWs_Hn%cZ=<8cEI0VtUgvs zd^fjpu&y+%+1I+?=q$LDO9qqwDa0k9HnNRWl6Y(twhN}OCqADhA(B4$4_{Gm@O&G` zGu)N<(PR{^px=2_`I``5MwV+SSZ$VZ;=a_2@WMN#o3|!MT`Y)TUhJLB$g{sz{3EA} zOZ(PJYHaTag5DaBx;0&A%;`$o@6!Tcn|^?hx@wF6%8!bo5^`>UYVl@R&l0WtiK}{n*YzU9P#8UT#Mx&pv-8f zk_Pm;4w-F@@!*Z?x%fub>HD%&!Jl?9c7pQfDY^I5N7g6pCj(#I>DmN)+w7K zTXzDLF#aw4uN#TKe`mX^0SjS*p5<<-@G zw~B^e?TMCw69hmT5Lc;>WP6H)4^jG+D>1D?Z6ML%&;JU@z>^pyM2$7xr6-YN$`WQ( zb-*Dt|5e-#PZMy#1O0(>!(SIE#>k3WzN#MmzM^22RjhA)CBh!|0PQXDTnhfs`ahMt zp@jJp=HKRw9Vc{B7UylcW*fP>zOCCXN9Wo1y6x5uanDOzw(m35Q3M-1kI$$_^vd48 zU;%$#WM1euwKJ5V@J|2tdIb$M93jfb5_j||igB|6&v2c!6?aOiy`zz(T*YTB<*1Q0 zy#9}YQOdv13ej&{KKcB7P2__9`9`~~?&xs9)p#z>`k78(E+e3@oDg4XKS;wGM?<;X zrj98i2ZmjJOBxS>=xFW&gig0YR`~#>L)?J5Rl1-{JH7 z2abc(HTI0zvZJq=O2{y?bDy(R*61fXG~6;GITy+scE+z85vVZ#Ml&xi82o~5hM+#M zmF!j<5Oj%CfGrhJRL^jzFy4*K%nP00*b>aa?dRC}8K22U1`s*3Y{lQAUoTg>LW}9D z7TC-yk$ZTquX>7@4@^d2_7Rv_>Yvp3*J+FZPw42-1C6IkyGH5)keQW>~k=ED#L8q~+Y- z-DyPPwVE$+tfFq#T;)F;dfD9-*fyKS_y0-a1~Aq0sJl)14qiu?zYF^oPX`i&KgO~4 zzmlI5ID>*-wTyeLY}E;+i-N^3GEFMcdpuITH-?*zMzZ|nm2kVxM@Fa{Mf2b62P@M>uN~=51sl2#}cq(7AObnX|)k5@{<(-F# zE^w@IT|6KH*OJ~-8OFS%4W_>@uk-ya;~PXV9CO^PS2}Pv?(R0jdo$!tM`X>wD z&A;#eqg0Js7yaPZ-m36Lu=CZT@{0NqRdrO5@6$uYXBTq%pnRAk=!-EQ@8>%6LqEpf z*Cas=lTn`yG2Ksx5#AJ)l$_KP1|b&DtyI2KsdC1Xcrblkryvl?6%M`IU0*RDADcbc==o@W6CwkrVpf=Hu-o~QNyiRxddMq?P zxIIq>!o+pz;f%*!w&r(@S*k;)bd>%kfDL67{~t$J9oO{Ng})mEMi1$3q#2FmKm?Q! zMY@J4EukPGumJ*65-K1e7?gBLvmvE)hop2!cWv)}@4x%p-Q9b4@44qZ_c`a;eV_2O zg#4Y~?R)+6vI#cBo%eGaijIHqK>el11(0b%Hj{Yh&5+j$k?fe&N+^?9D26!_l+3n z)UsLSujG-OA-a_me!mV(qxi$rXCTkE`R+c9nTW0eeNfU zqIie@%90&-_OedvmQn>ts)Lq(qVAMx7d^!bo8A3pG0+n0sRJ>#(#^Akcl$>?HZ-6f zQHZ`+el5Rw0%*UkpEn*4wV@tzk&W2U=4 zv0$!0#%Q18h2`;1BiW7pV0a0r@5Wwh$Zb=K5m62+CP(m zL2dGS#b84}FmC3InbuK0ex}8J7s4H7BZ(a0;?9}pmyYer`uLcjY3342bC>)^v>()na?98GF2F&%|wG?d)$4l0QyTF443l1in}(#0Pf) z$-vEbvH$oih&v?Yf6a`}bKyyaLx};)j}do|d4leqDwOrohE>BiIR^_Wz)cDq75$9G zZjY{2bO`>k7}S6ImhVCTW}o1BgbQ`XN|1_|g$vx#WG1IrG9@W0`=I#ib6*|qgSCZ3Z9L1&PKbj7av7wnyxpFeEBeR~7FeVP` z4X=DpItD&{Oy6PEigl*0--sI0KMpDV*C z{o!du#Rk`4o-poYfV%yzV#hrClXsUM2s>tyHq4qR>&RZXw-F&=vDQ=cDD<$=-G!(j z^h~wx>ow;xmrZf5T`R*sz06k=hs-KoDy04q&~^gYudn)2>|AX%cdf+^F&KQFxiTcmQl0VTF2 zfWlxtv;jtYFO@VkJ%mPBcQxa2XRUKBCUO;jv#vF0EJB7KfRBNZ%o`GL)nCDU(^*lK zuFnWm!OJQSF;3pxh1+kKlsNSIlkVnFGKDf)6Ppu^$s49nu>Pe2auE{&#npd47ZwvS zbz_)nf%A3DSF3#}$F@iW2M4g&jt%5^*d&3}q$m{qH9g%WU&N4BpmUg8J zs@I^=+z7CgC=WOkHpsGG=y6fu5kkGi-qR*Ih^IL6FVC1mgzd4&;wi+k*BAkz2*R9? zrL4iMDJpYO<7(|#QC#E_A^c6_s%K5~f^|Ex?kb7bL{R12%^35hXENR{j`%ork%}nszJZ%T~#DES*J(4T);} zm-zB6F&FDF5W9RzjmzY|Nc?uKxo(?4&YK92H=)<>qa>S3n~Wrhn6`Y(OM;2*v7%5S z#!1Q7ee&ZvkQ5TotiF0z9-hwqBHMms*YoUaT2!@RJjn&2FwB7_7!6u8bWJS;XY-jL z=cqAV4Yd2R4QG7F@0uiaWac{MN=EkBMP|x|RzBKaoM0s)_ZSDCMJ*Ey>-{846i%G^6&xi_7@MW6Zu3_ zudgDuWr8<<2^y8T%7e&>!XE#+eDhzj{0Qc)0lwSP_@&+;|DEa$uIg>>>lw~3S8LPe zR=EWWeZIz&enSmBN1N|jD3WY6Wc3h`!zxEDe-eAFOz^Y6yV&2qcVUP<> z@tDe)-K$Cdp4Fbs=u1~__=p*}3xLTh35FO>3_2t4=B&PItnWdD7<-_}oyL&q-|iJs>bm;HdXVrspPaKB4tt@~;-aI5n}*hj*mqAkHA=$*lon*Gl? zra)g=1s)aZBO#jfqloQ8)LzEdCD0{7&_I9tKh{syYNnN&@GsGtMuw^t$R2q z8~$2tT*>thS661h+m|6>H7`Un`!LV>Mn6`PVg^%p&8`;ETe*pgV0{)D*65i8?b1_w zlB$8};V3wEybe@NofgI^=>!H{bzknS)mCimdTKZp%9!_dcwkQWuJZ|SKGpeT!)Ml! zuC6y~g6$5c%2T1RoF^sPbLEb7M#d}KCRBUor$k-0vd>{8%eiyCBPQI>smnuUxpORW zA0D%1gw$;!XCH}mV(3I`Tq|EaUud+-0}a8vNm*(u-hg=7rd^RK!Ay$)) zTF^T9mgLW36fqm_S=^<4=wmGdl7b(SR{8mrbGrA-G2U60`%D{VW_&*0tP>#xYrbJS zm@akmBPLFVZKd~rxkn=f&GOi?Q4x8^_se;ds;$qd$3gQNfmUykGSVMeZ3VzXJmsOs zzbM4+*&=%I*zi4rz6;;3tYyWCAE@|S3ytgFsFR=oiTm&ZS{%|FSTWIlMf+*~XAaKd zZTKYU%RbRwPLw}rQ*fb?0(%cVWaOyv?o{wCAa*{MIj^ua;S;<$k&yha>>mjO#qh)Y z1BZ&hT@S;&Gh;3=TJN>5_&1T{BPJ^9$?e+f1+?kU-~%GEiwdHnr+ym}Mjn4!iqM@j ziL&2L?%@-WG(R-~R+r-?vk@HC{DHvl56jnvQ>^Nx!}4ZCb^O3fb%;I#ql&^ z?Y;XNM zoJqO{e#}~X1}$Qw-o>S+H&)DaB4)GHtoH`XI@iEKMF_uOER-ucM90`8@*QM1FyCyGM8hSU z`?{k#iJ0wsi^um*)(=R3=lPQOfqWShJEn8*iGujff5d5Ryb7Vh|C?OQIPq*N=E}S4 zB4oO&^?dN^m9BEF>{B5kY|ed&A3fVo&5>Vja}?3(MWR73t2lj^%O2m(MG+a7P=otT z_iSA>xQ(LVIT7!}wePh#Zj0?IaDga)h2^b|7^ur%ZSDOXpdu!dt0$^A?3urs4&fGk zCro8H9eF`FYtu39kD_iQhLrU;DPKZyxh!CES282%1T}NgVtbX6&`O$78=%LzrcPB` zEb{g*$xEhVf6k zbntH1wRqeC`NtuJ*8!%pz^7e>p!os#R(!q$6a?$F3@0ZSBW|K-r^Rwn(3;c#7b~3d z+>3I=OW(tcr@f`Zd(DqTNIF(_i47|1izn`kLM_Z0JT zLSF8rPxRq#L$h91bXgAp=`9RKD%(-xG3l2@Q>Zvhtht$PDhv4Dfq#`iV+Qi!cXCI& zZ%)Tml-5JDQL?|sXW~R)2&9Hp352`Jo(JqeYvkwXd@2t4*Eq8`omK?Hdj2EYs9UI3 z)4^i0^TH=t3P+n}{9-KuF{`1|x7j>7QIwz?o{{J~6^{gR(rvc5+*z+SWy_Ha;84~X zQp>Ecf=j@GOf2RoS)B%DB)25FY}wNBn^peG5%SN9^7Obn!rj!+L)Jdl#A$S-g#z2m zw0_Vx&=T>^5o**EIaB&TCG8%i{1es!T0Q50QiUS;SLE+okI9sTfF3=ULbe zcwlLssX7-CeT|jn%fz)?#$vpuJGBiBs-=pAcg4=sT_{0ipTQt@QO+4C*8CTVx%6v5 z4AyM&ZPBVWC_A|5wKtfFjwVFc(&y9g^YiV47fSf%xFb(Vjc<7GGv!}TQMF=v+}OtJ z;amTD>w974(UhPDLp`^l_-R21_(CBKO{y7c+N1d+w8ggpnzU83?S!^8b(%t?Li z2$qGRDpBiAOMOy>Vx!Z#P}li}|C8*}7Nt~Q0@5F=_N!C$B5QczdiLB^eG4+HgS4SZ z{|S+Sybj|U$60xCO#b9ur@?AIkY9YklF|4A!mQG2dBI%dsw({pDfA{k?}psce1~NK zjVMgj!@gyXkiYR9Q=smC)lndvK&g1G>K21Z{p}<85`+bQy}PIJNB8&$>`tvUWcxnYdWHCsia=grxa3%5Ba-nN#8EJ4CDr8@0B54ZjsQccjl zjfDO6yKWbO(YW+XN1;b14kHtFd-;=XHFGnUP)amGj@C-9l}yr1R#PZJPyYk0TxL zUz&;P`3LIu`;|@Uxf+ zZ+M>jRB2LcJFDfxRkGGa_UPJJBMu)Z10EC)CS<(MO_W3Y-IT zY2X|Q%QfQ~2fIpnMFyNd6dH^=Mq@uHP~f-8x!-voH_` zW$JCPIYRMUSg2blqKbwBY~3-$#QcP&)Hy^nE$xa*_2F&HB7c_!#mPOpPZN%k^Gd&Q z)?YVp#Wj|;cQPs5aY;Lp6deZ!zdTQUrWD%4=WHFJ{sJ_w?(=}nckZm_47BOYB0P9s z^p&%P+IIaR27}BgkV%D_VLwPXM%B|wzguZAX%dk`Ba<@mRUUgbv%L=CWieob`qZxM z18svlhp;)M&F|+C=)Ci3^}wi^afPtrrzH8Z_lzI65_41JMj5C_&MNnX)1eT(H^{VdNsIb_Pn;l zb6b-OWkkCS3z>&|17oF~6Rw-QN<9m1=@?Wb#eKQ+S*=Adz~Qq=o}-DT;o>piwmlGw z0YVI*%xm^Co4Z4I?893VB2g|EpxNI&8}3&$z_9J>I6oW#Z! zQpHeJyDJh2n;B)sVCIZmIpeeI^tQ;LVQo(pP&YP`yhiX%@^!5m9ky953q#?ryrM7 zW-;>orG=47QGQe3?Xt3l3HuF_GhfDY=4r8kh3V>DKuImp6CYS>%hT$^!Y^ zEDsH?cPZv2qD|t@uIDq8I4s@^F@URELY1+k=Je+`e&2DkzF6~JYFPDsN~IbMU*E=l zH6|vuEN}YfP&M7Dl{;?R5NCP{_9b?+=Nt*n?Bp@p0^`#^hlT%*Z^DT@(ksKAHawD8 zcXHnw)3+--H#PB>np&U81-AP`^qKlDx}@2_t~>bq@U8LY6rK)dLc}{1E}TmaQX|yo zBd-<}v^t7U<j;8+F&PW@kysz<~iPR(b! z@tPkl(t8ZOVH`o$-c6Z4#c^VAP#8Ig`uTi!_=$}Fud{|-@4>ww1msE>CiqWDV2(S` zsa5WaM3$AWMDwdrtFk;BJ7;)ZNH8ap97mZY=aG-Cj`vjnQ^=8$pPk`vTtHUOhnB64 zKkBb;b#0xu9=GmqO4E>WC%V}@!|iIf-AAV=W;`-ps_5u^nU|V%K6Rf)u^dva6RFKk z!5|r@0lfI;@j5n5*K^frCN{Uw4o)*C625CT;p=l!I$oo+yE*f($Hy1fdG&qmsDV)| z`}&r}?ohoA#%<_)BHO`xv_25drJSR;=APAaeG26qU6ma8%UVkFODm#IdbRnBg3DL2 zA)cI2VYQCc`SO)Rq}ZK_eHJ&ea;FFzGBc+ae1hI-8PR&C+X3zR0B;k85yV)q1+wG1*eAM|wC8-{Iaa-WQ zc#dv0reUE?npW^IwM#47ekq#Q$XO1yx2q~Ivb6SHi!83(Tka00Ri$&`H@4=J2`K5F z)XQ*sa2yBQ1G_zinbhat)6K)0KhHj8Z&Y{esrYKggSIeQ*ug%`4TVHAmJSg+sF(SB zaxmmSNGy>Z{PMEIlc2KMhxxJ-4+Rt#v>AzkKYk2g_FHAh-zo9ji9{iXx)A-_IdAAu zt|w)!gO%p8gOihA7y%10CHm1Dz<%I=IG8Rh)ZvO5->TAw2Wa_-fqR+h*rqULMExgK z@oDrel^db_wB^%f9VIx=#KgXi+{d0DIwj#%%nT?vr>_?K@*I{cSrZKsBs5f{HFq&x z0mQ2%h{Chxz-@?lv+PSfz7?SpWV`j0I>IhB+HOb635SZed^R z@WM#Jxt4cczNPsr#3Gp!7ykC!w0XvI%Btfi7>T9t9T*ObSpVV_E~7%A{S(@H!aV=x zd!2D%g5tts3ZF5T*_x>zP2}I<>Y6=vU#`jOmYe&3rB9b&0uy@#YNdOBY{ z?;;XyOn;NU{t5UhSo4OWoG!rFoxmpM3^g;C!HICR>csy5m^pPlc_4}sPS#(PDWU3g z1mB2 z=#2h9{L==Xs~B&m-y(e5EQ{<99z<#JmI#hTdNuvxxLc1>I_u^mypQnkmOmhzA3T3M z>xj+R+dPF&rkOvhl`CIxOa%!+eo;3PylC1pupmA=zvrGRmXcNGjd8lN7}Lru+0A2N z_`Wo48X2e-XY6g6-FMVGJa3)pp`2c&$V8P8UNsY)Ng-#@mbNGJU%Wbd=4ra#qZ+ql zm^fC{04ks1CinyWjTyUF|E0<;La!Jz@bkHn1}_tZeZ0LiOaIoTr`C4KZj-Z^nx;O0 z%v`8Pk6oyIZRVQaCh#ta8whVndq3+FWoXp8|H}Xti^KMxR}^fh_dJ8Vghf1c{fs_Q z)8a5ss)jNBmzN*fL3<`AkGISBJS^k5p9>(!)C(D$$#M|ouux){Q6FaP!ZnmN<@7;5 zT(!=w|0^-JfY#{cfD0L%oS8t+lHtxt$B(gAxyOaM_fVIwzjOh?$(1)+(_g0me4qc` z<%KbW#;!1wa2n!L_#B%tVe6-j-at!%7CGSV&jMgZ*(g_B*Wm~SfxuVsJVX$^U-RTN z#u9Ape`L|W14RxnX&{1eh38!HITF@-b7z#|6Zan=UQu;4)3}mhvFKCeUou`8G*q&D z|9;^rY7p~?0;r~Ar9)4FNd7G+K_LWS@_J+q1vdQ!AW73WB zUlmM&3`KgWk!tz6pUI$#C6X-LD004kAGnKpdhU^zgOMx=Xh+h5pFICx;tj&y?TI^4 zC(g?PcJLD>aB8d^J)ioSCgAAF5>0jgMrb3nDQx9I_m}JW?Vk&m51~M{41qHBT$=}r zE+d$jB&d0bXL~71>45eA95?aHB>y5$~0h!eu>-k#YIHN5BA>al90#q9tsCXkI@b@riP zKS;X)c)=S+fQVm^OZgY&;Mc^L(z;FQ77*$RLF+Glm;>)Z2*7#OY|F)zJN#T)S$oQx z7fudpyf&TLoR4d0f58WXCWDZB=5GrDQX_qp@5UVucH*mrAZc&tBpqo&A6H4d%8&B0 z$o>?-|7v|^cR!DqYbGb+BM`(nsCgEjx2rm1LTnEfX$6u7C`Dcf4Cn(y@H}?a-hrqcD=3K7 zcxU-3Zz2_hyo5v^zbh5xb;$L4iF(eVSmg1c&n+zHAM+UKm24pQ-|BOF z#n|BU`*NqRM0ZmRft;-2JFB%i1indX<*Pq;7zsNR)cA_B4{x_LCqQRIvU#1UP~uZz zOWA@PeRX)2AixY(x-oVmN8G=VP&AK{&&avvst?oAhgx`0PAf~m@U&49Yga00zQKw^ zsuap&MD2kfZ+SH|)1l^IWM$?`lpt9UHM3=LaNu=^m7{@3Y&+o{N5&iUm@-}d0mkdT z7wROM!Et#}j8I%7k+A!KXk-_syh_xL+lIeP+5t&Xx*u)mBkshl>L;hmS(Cx!PEPid zEp*n3uWZU}nsC2pK(IlcXmqQlUI~EQPs!EF0mq7sUFEA!&zql!l>mrW#hPf(1?s`| z2T=G+$llL~yvWvs0dYKPefq|LEvTh&l%v^oR!=dPu$~{B{VNv)`GE zz;6F|ieJxCwB2*((;M1{DM=ZVpfz3@+V4eo^f-+?Em3q zX6RFcTq;Ki5!BBX0qo_M>Px-(u{iwWscR58#Vm9ck6PGD9b&?8&t8K~NU3N^`WKd0XS+_~MBC1}yx6yj4XkLfgiB-BgJv3s8d zEM9z#BU8pZ%Fk3v^8kZ9laa86mA~#44#x66cRf03%ehPZL>kVWAoKN6nzXT5SO4B& zh)UkK`Ji94%@HoE=4)1vwaX1vg*QQi&XCaw)b3HqG7^N9<^o$m0q0{!rok9Xs!2+S zBG;z>y$GPhjMe_tj>s7|Eu0lp7k8O~lEV+^{*D6>=Tit*>@GKC&+*M(R+2Z?Babt* zWpWJDy134Jta`VSXy?zr3_Pg$jwOgPCv9so)Nyw*WFUy)#pkZ5UhN#oX(s|Z);P8S zn$5Yo3I+UUxl4f3&uMG7X-p%sJd++uDYJbGKrYG%YavpDS-0(o@J|b#+yiogN@SlO z?C_`ZFjf^=Ah4w7#mn!xU%}rYhL&enP?8UWPv}req7jg>2%vgh#y+M%fo%;7HL7}W?LbPzwPy*~(JmLJ2 zfkfvet*p<^qF2Z#w#L7tjrjyGjzz6)K#RK>8bpyh(Bt0uC<-d#jspU@le!q=JI&04DAh*hZtzUQaA1&=x6^h#u_^e1V3gfBU4Pag) z*U=|cKl>gc>ICOf+OC=!jN)Jr*WAlBtvDjPf34)`oygF?i}8`XIhOeOUe99}=Q8lS z4;CPFRK!Km*JN2GdN71jylF@XQal%}Sc6fB$&;n~x`8hyW_)wu{?-)uObPP+t?WC0 zFZNc!?bdf6+7l3^Bgr;r1TCygM)I>u>T%b@DChc_D;W-?P}AP|;7|^_SDv0ar&!=6 zL?UPJoMrf0Tsptq(5H^d(G%)e5y6aR1^&C^D(5`S}>_H399(!2)}Tos(|Mk`nbDH!*h2tCjFKFA&cZc8+{5&DsK z&&&r;A|$aNZ2k7T?jy7x;;$JWtx*w!++~@V$F|E8yd!@M7%htZ?rS#3Ati&2TZ*df ziX#XpRmlQ0dIeDP`cIP`9a*jJ-W@wpIfdjkej8=_1f?S>RpbRr{j%z$lIn+tu_+ez zRRP4JCXJ0}S7K?|lK7u_@TFryn@&>1y$1Z2d)_5m7Y8{InRu&^VY#li;}XVyMc^y9 z?Nw$TsXLdXEsYyD_yPCcjUV{=A#pe6KQO1Uzpf*f=hp$W8z2|5L|bZ!n=9!%11?wY zx0Ia_Wi#=6wv+)H4Zq}(?+&p({Z z%cvrK)+<*7Xcb={4|;yScB+p+ys6qO2{gW3kyb@&Y(CR`XDKMb@>iaJi!cpwdZ^Q_nriT)QAMiP=T%Dr*Rhv=y>ZcE?ijV0kI@oRhOl+b=>OZgSGis2`a)jt) z>$6!Oc{HI?MW%xhj@?`2r`2NLoyce!?^NY5QNoHWF}R$P4M6?rHH@X&pt0Mo@{m49WZNRAJUBbEi(a{sehm*!)r`KL8cT$Zi>{_PuEajjIl zO6K7ah0P;!91+0KbL$bJA4oD--imfLebvd++laNeY|X;~AC$u_0`be-8R7x-Qo=!; zwlU10{1ZB@EA`kq22-v)JRax+6DoZR@hbl)W|Ssk*D_TX6$HP7O)9CUsEk}2gbBTO zyZ?e#$bRO7k+XvU9c-P4O*@<=R*<`0?*VTPEnf1c@jtD*t`B{U0XT6$AElS6gAtYx zFg^bTo!l<#@W4wfTUyKtL1s$!w%f=#4-FE2D*bz5QY$8xkTlWO`Qg|=8(CwTR1+9* zV9>-$4wn2$2`J|Lvfv6@l)4AGfW{S0fz00^GNDbOCX9Tz`*$+I=t5X@ld`bx*Cj~Z zyW0OE9-|VBE8b#J1N(<^{b6kGG$W)sZsZ0j1rOj)QEX2|;HEDURLn~7PCgj~eOzJyWHg+EE_+M9rzBtvT38gP z;6~b4EScgJT%mTN&47j8WkK^0^%x!nypOLBn*vCjwO);$pAQC8h3cJ!WjYHxZM)pY z?wmfw$I;@K7N?1r+)Clsc+%Hy?0_Q?a}MqHgY$`VMopl9UXAo+22Xda1qyLa&|x%Mmj!CuAk z{>N+t{;2Ty$9WaQIrWOKMtHkptW9i{sC$uFC~P57@xNleXRMlee$~<+i3zv2qXxw( zXC}k9@y9A?7W<`bV^}$Xt6Lo+wIX3l%>b&EoOAV&q%=EN^v@L4T$y^`-Mu4Ki5r~v zA=htG;RAO#8vp2~bd=|FrC7p}0q*VW8Xm31L z7!qN}y{X=#Pe_4-(^<1BbS8Ty+=D9$_{eB>O?MIg!8QU*SY=h@zD@)>ejWb+lEyh$ zjR7#F>2>$ChhDa1v6W;*&?r)+67(c$1ZgCn_*L~3f%uhDA( zlUI20{=EoAh@KeNY{|Nmq{X0gMSBclVDonpF%Q55saR}@i{H3vdIiRyNZ_$q%>!A? z)rWCJFlD=IB$@*X+M6Z_!NM3o(JbjNvH`J|bL-fG&AAjtFo z*zFGY3i%_$n`y79lNf=!UW{9yMqwsKl-chbj7rJQ`-I%V&w6)num{seG0=zu$w=`^ z@Pfjab|8X4Rf2*s8iSas^%+Gb9&xIHhd?=yYA8Z{tIRczpz#V<1~WcfGB1&ILM7fO zWUbJy;yc!ffzkzxT2&N54sXg$sBvw059S{e0qqS%6h26*aSeET^ZeHrsJs2s%})ED z4qG$5=K&8w`i_HWKvs=c!F>@NTn&_Gr^%%uv6RH*0HX%YK#QvQy(&Fsrq@z060Djj zyo>Pf>q9bz|60Eu!tb6`2=$V9F}=~+9Ov3PX8gqE`)B%vwrGg z$;$QyZY)*J!^L=5Xt*sHzkT<$k#`$Zm&j&vWFrPBZokRN;~-4|WcesS-TII0C-9&U zysUv?^3;xYkY@t>ut5MlOt5q3(^wK+Cy_2CzFMv+z?;9`FbMp!`Y)YabA!-qo2UGb z#p14UdN$Tj1e38Q9i6Eq)BJH7)qKaj!D^30W08eXu_1Gjl zU_?D-nUI)Yex9(Ozlq2&*(3k$n`9bq%xq1FKj`i9gteCSwz1b3oyL$3{qyMcU zsJSf>;ZDgM+hH5=bd%BE9yTe{8~-kKJs`r9|Aurhe->#vrCu{{Sa#DYzsq=ciE4;< zPfYvoKi~UlR12&z?P@+_rW4h}gefrUMAlXc3^r(+& zAz9s-kVB@rOd;VS&-9pZW30Q8c@X5Xc?ZMqpGNy8iqX2ynnQm4J>7+yYAs#`xC+4T zM~4D*YmHo_=t9uDweUjvtA{ps^aUicd>#NW>G|(oM2dyWnx!AcaydZx$Muu5r!KqN zn;W&WEk_Q7;?BV8J=)feWTR(PLJJRQ3#K=rUWV{DSaHa>8`DEq9)(+aU!e3AytBIe zZlu=0BBe^2P&bLfT*RfpT00Va*OHeIOceF;rQ@RFRfz$6zL*Q@e)8egc=S*!0U0DPSz^{=2h!1o(*$ViY@9aQs2K&wF%s5o)g zc4vvNVBp(9t>pK z?|I)Cp3*qY>TA8p`A!S5wj#I)f>SvqTf@ITV<2(uR&Ocd`%6j;Bw@*oM}CM#LCJq5 zKOB+|!qKV&(w9NlYb}%fXUFAOi2zDDIpl!dTPNmiA=-@a2mB!86P7 zH0S}13T>n#y5_5>pvmc90qpzzg^?lL+fqPVieK zCsSV1Q0GC6wPZjjQo328Yzz#MdUZD)Ps8m^3x#WlR)APkY|CqnPxO>w6{rA)?qL5f zh?W&9mWkq_HGW74X-jP15*$f&3NY7lxtcW3dIkx{S2nCzaV&050#e-^yFP7C;mDn{ zfoo|Cj2Czgp(Jn;=5+X2{e2&Xl}3B9wZ=iC%bQXZYfy3J#HOk=;Jey*jNa~d9hs5F zH2&-B_FL#09wv^vhdi4nS+@6o*k24hW(0FJlB5x)W-pHh-B@Lx_SB$Qb9%vigH}Mi z?#XqGFgKs(scp?n(p)%yI-TlSbyKb=LUw`mQIX9xsZm?OFiA!GO@UgMxAmUCMKz{~ z4d`N}phv}@GR;Xl2XAYB(Liop!9FT7AM&vJtQDEm;%Imj74iz$fHfzF$-i`8FjM1f zRnEL}fBE(#&6Q;&JkRRh7AAqwQdlkTi!Ukf-rbXk`EHR9B7nS-9XsE@rFZZ{GM|Y_ zP(6fO=*pQqmIvNNzPYbATdLRbwXo1Tjx0LogR6yUdYlO7jm*y`hhiJ+c)wR)qyTFY zw`K~x#ranZg!1P1R@%>D44^XZYjcVMbvvF8a&s%?skJ&58grnF6P5Vma zOS~=}+r|FtkwuSl_^6_$@kOLDq0Pdt@#?H&-3w zRBCQf0+{z|E%5sR6jT!TdY28ozCYT+7^_j^fZaHT&|S9+b>rB0BwEaoH>V;+Uzg2A zP-){cdF#*}B76mZ7(fg}W2xOzOU0w|&tF?QRoU|(M9(PloEi@yG&rl-T`a%J-deW{u?#* zQL8#1Y-*U@yGNx8B`lr#K{hpn?ja36A#=CX8ONln(xS0kY3?|6bnh$yEFIEmSJ=21RvhdlTaU2gAQ&(pON zTjkb5Rs_0EnW9}W9OuTBPf?XnGabsKhb04#vxu%=(|zGupejY04i z3}9^VPjg-c7)wLzlx-l-h6Sv+jU3%!4GEkqAQ-3B8@k;dJmtP2Laf)> zgik}%4YU&i2nSF(8SxP}Y9#_e-X#WOI{%2N_EbGWC`l#}4p*%8uK}CU=MP;5=@p-t z-!AL-z%VvmDjfw{*uR0&^JGrlOF#?KumN2?5m2CroGrA$MyGtya&oM)C6V?&+-A5q z%38FDf-cmcD>+{Fsbe`Uba3&CeU%y7TxxsgTNgU}^AhXJh^WNzrmq{Q$?|?HE@I%2 zm#Osy;l+y*$_y&~YeJ?If06&!q${0Q18b0Uf&#Egefp$E%&$~@X+FDuah!TY;JNZK6`E3EXTN8+ z6hD7EXN9$?70hEU@KtH?2oLpO+*8qOs=9XR$@jncieeQ3CeDZVE109v7uSt0!(wdF zkE^v@Oe60X)4KxO;`V8I&Rv~9YfdZL+*|DGSWRKHU_0y%#y-S4?@gfRlNx$}xie+y zxo!Hh$`1GsZoB>ePMHB;?9q${cIw|76Ww{eP6o4>-dn*@8LPo14Qs;(1s(8sne&&% zG&VBAGhAl}8AR=Dl?PUBJC({xg#EWLL= z3svchiA|oB-i#`+4QN#xenmP~J$g)pkFZm4qhtbI(hh@jtBYU7$v;!t8U-!%-pb)a zYs3wo2ax9BzuPzxR#4q%g#LP$I)!=`*x`P>I?;=`fO6d zoIsPH05f+i9p{PWuh3(Jz5)Wjm8LOm%N^AZ?^bf_PIJlwJEnp2(gL0g5`vTv*4Gnv z=SC_mA08GwGfXCJdzR|T@Y~nsU}q?rk(`yWjdop=Y*1Ap^A}~( zDT#!-ld#X_Zy;6(fWQAu`TPH~%m<46H#jGN!tnC3FNq z`e%*X-50(Hx){1NU`j+Hst6u{?&Z8BqVA*Z`M;G_I|opCS^|Q`#mb(gJsA$x^_JMY z9C*x6s0GCQoAHV4hWT@!PBi*%RhMfJNr_mE-v7Vv5{E<8+7zjVeMBp|HRbSP@{HxAi(V*bp0wwq*pnc9>?|+g8TZ>^WomW=nfb6 z1%8;Ggh-!MbZqt;u^Eu^1a>Aq{={1CW_U2xR2YClA3dziGCLez7aQu45$1MsC!~r@ zZKukpbxgn0#7;#OP9?vu!I8``rDCmL-aV5lWRuJPS&e=N#H?Gk%%;=?%6<7`@hlCx z&U;8FdOdD2k!A#VQAO-?1wzNWtI_*a8{j`EDqPoN+5i5KzE66KbJ-)yVjlAKEhp+b zrc-k&&^jw9&di)sUB=2<5sV#uFTenO|I8B9-d7;*jJFsL#a1OahTJF&Bm=20n+xX}x!lm3HS=^u(syf3S-?shOk zl5SG-8FsZ5wYb}6wvW(TSulr+7sLG;dT!=0=qy!xh1mL|+f73Ah^te&?!hG{9X)iY zg4LYHi$8knt%Jyc8{m*}N2@nPUY3y?EPCGv6oj(&O%vW{;UA)+5PvrgTHMD=`u5O| z4U%{VtCSu-wZ!U5jdxFcH~HRyFWTyUf{@SxRR( zqU-C{{WGGQ>8t~pbmlHYM^dal4@9qiDSXdQG8u?zyORTn?O^K3jO?Q!(dDqL`zrYJ z&nP+C;`SG!x~O=3YEMyOGtX{CTjKND-ON4{VC>O)MR-7swKJwMUtlu zT1#1{#TE9AjiU72=^ZTIzE{bE$U0&Tc)m#n3#k`8O$U$6q}G04TRaj%eq_U@ab1Og zx?==luKj4#e1AXDM!za&e)Y3$X2{+W`|IqG;k{JfFIT4yd%i*8H`mM$*~FJK z1b69DOl})*vdd!`!~88u2HHwfj_c#bk<-1WIvRiA=-H-JuJHxId;C# zOW**uzxZyXk-uuA8`6+4gPE4}#xvDe!)iJ)ESGsy2)S3cbe3#I*n>-|823rP` zuHVpAh(RGH_2V?yvGJRx^-y@WfCZwYYu)2twUXgW$`gtQ{oi+w-C_gR;~@{9c5hZg zOTMPgoIi#Ru^Tv^J^Sf`6yKtFA%Y*YaDRM#zZ_zMHgm_{BhUcQplRSv(l?2OH{!OH zFJj6cH#%(Ei_QA!}rxNUx2*r?(L&X26bQJk}sF_*L9~@GF7_G zIrJMrx+ahhz5K=Jb%)&6nqw^0wOOTL59E0gdB0DHTdEH_BJJ1fM~`fAFd#*Dco^N6 z+cTcLvmXYP>>^{j>$|TW8{F=T_4f5wJ3Q*xer$(f^ znYL}IRd&PwM7jTv)21r#rCW;nOSO4&#W5QtD$j$GP@ehw`q7?b1>h9*Jn4w$c)0n& zOLS2>df2_D%=@W`dZ@|>V4(JdAfA46GbH^T{vL?a0OGAu*<&8wF(f%dI_NLcK9hF< zsrq!wxj$mxqanhqo-Y)>IYek@-8`kAfM2JbC@r7|?U9B`3w&;wP8hIokjJ7NNwWP@h#wM*jP`Pxa@9?J#P9y+$Xo)?l$UTlBt0sK}aV*k~=>H7Zh+Vxyz+&vdQtt zy93|z7TnWfe|evT(kPWCd?+$|#=Ur+5sV+vBfTa-sL3q>=#+s1CiXX_PM+pSn_Sd^va0{gX8YXT9yIenQ+-lV=K z%i=i_X_|0>44y>3qtFFoFlLo@F-+y1>I$%e_&3sIHq+Cu6!*ZPIJSEP9$Kpa68bJU z!0GMh{HWVBLKvYVrl82@h3odATYLr;il8oewJd6U!C4^*tsTl={Zg^E*Xc3bd>rFq zz&+>t8gT!pZ?VNIk^^5E7+_4HCdoTTDs|w0yZd-bL2}(H}o^n#I&{WDCR@XVco3}H=sS6#}dWxt7=Hz%#T!Q8n{Pi@t zUH_dC?_G)7xz$@8`#kc5hU$KXg0$#C6eo&xowG>PA zr7AkG8w&r$9~BS2e{b8DeMPx|ATX-g>YPquGk}{Jp&JLPJ(cc>aFc~D?l@)Lxg7BW zYDl}1P&Hi-)vVFYge(nUXN~asulz~m57wBhhOdk(#=};u(=Tmw&(Rm#?Y;P24P&iO zY|k6Ocd1(zpA;Xj%{_1a`%14x6wzSwAAf+7+DA_l2<)$Z{_jucvc$R@3-t#^wbO4h z<+aC?B*G`G7T4yUWzaP;01$LH0OxDTIT-F-V`)k4o?3Lj^RbcUVT-jtmP}m%9=e0Z zX6nS{t82~HADl3EhEcjpetEGET*doVR@YwtwGsz_#nv`+4?%vdP0&xOUxcDVT0=v2 zjJP~^1NdJpfPB+``V;}(5*m6!!h4}}+eVQ+xIm*HMJ3SFWw#Nc#;44K!l|fff%EU$!2MtWd4;dQ!a8mg(Ka37f>tTW^T|)X!>lyjS!fGrI3JsaDZg zt@s z@~rJ(RCw|7%V5n+ns3l|aP@JWqYy=h_uHXX-Nx8q)*+xwZ0qI?KxxPFXQcFwfyik8 z&!uxK8U)B@5!n(B;&uWxSGrz_MjzcV=nLxr)p$H8a$E?OQQ=>22oFkW^IcW1J~6#e zydlxkZzXrJRO@l&Vdu+>TcKuK$NHP55bxE(mcfaM^(~xAKts3Ob4hc;gQE>-`k#`!cI>Dz4yj#?-phNUe>t4MXl9Nu+X_%V zNf*m~F(F+LdKnHcJU}XRC>d1__JMk1wn}J!E47z=2sLE?$fg|kf;UB<>ChgNo2E!O z+7QrV65bCz&v#>Gdp0_af1EBsWXF~#DgAIuAJW0E3r#`G48wn9Z6Fj1m_Qb)JGQeU ze*1WM1m_MZ19PBM1E_bU!1Mnp4410Xf;DE$E6(7~>7CYu_e|&k7#MrRTXg(CLRjb_ z>{K!5K(Eugc7n)1%lbF6ofk;N9Xb_%>GDApz`G@fG6ckLYj;5RlaO59AjJM-%G9US z4O_3V+mbJ+gAvA5c$OWJp4az8c`Cz4Be?a#_(K&7fh(pypPAsJxGSL~?Vqc!v7(dw zar5q`b6}*vZWlqG!gExT>wUtI`)qR626D)|rZr<`ahh70$#zlTUH7bAb9$Z`4>Jqu zM>O#CkMQ5`SQS8XJ+$N7ULS4)s1)6wr?5NID77p8e(BfEE?-6c$xkLtcnLWgQH;k5 z04GFW1(*~o+%xQJ$?rYxV8Ib>Qp1qJ`tG8903Xt!jC4}A#x z_{;Z-B9aO#SZkWIMC;;?;VtK(u<4>(6dfF6LDx;Ha`PzX*Krh0#@f{L(iQTERyp(+ zS`fP%wtGmVXiV}|i*KUh8=DXEw{-6ucZ+}lUQLLhbD5*HDjw9-NJwUXg4NqDu&EkK z{A)yHHDwLM9L7Fe>#9p8*k(sj#2U6T^t$}F7qARIZ9`W<@?EXltuny!F5I4x-wmx( zd&hDnS^1_zfZuRj)Zv8YO7^fKsVGNLz1#%ys{dJiO!c`o+DgYT8>uGmFlpocsQl8R z5mHb2%)BjgT4a~J0I%XU6vUFXeEbXiM6o(kQ$*N$J)BKFUz#H`HEux>YZDWy*(-L zZ&=F#Q;@7fb$MZ1Lf6q|1h-?mm28k`EkP7}CQuu8JW_H;6#2X42Hgvnyl&*Ig77cz z?;&RjrK#lO*zvb>*k!5vzt}%)EX57cJNyA~$ zx3UZQ=`i4WB?le6H{CJP!{Vwtm}5BlI`E~Gg~|#swCryAbNehYvqym0+0;wJ?6&0_ zGfV1Y?MLqofy~K!TH)*9_?j)F{KRX`?@?p)X53#!%)lQu;swi^V`ZyabgY~ z(Ux-y=S*WDk4Wl3TUa!LyvV#90gMi5t062-mIIt=XjMjFFwtXhw{GkMu81EFHAHG7 z`x)8I&O38o>N&Hf(K7P?S!B#%nmi5QA3@#=i7a0ubt(9%W&V1@U&p}@hE6lf4+X`d za4O&$^0to-D}RXp;sr*-yyBsDZOTj?f^kJinPD`^@-y0r*{9c`#MOpR66V+O?BNL^ zGF5#UYd7^1Ch(tW4E*ZvtRN2CvS`hFIODeVGDQrbQ`fVIs(#{KR#npf@(x1Wr>ln0 zyz52Vh`z4F8BE8ZYwrfSk`X3@AknVi#~!2%x_DqFguEP6Gh^a<$~!QwgBBLa&~=f^ zrVo4ffuvX-Q}pkEC|h1?Q26D$b^$ahhyEb9Y_<`9M0h~XTS;TGM&l`4YyfI_Hm_}(!Z~pc zeEf&@#)v-N#PE7lw59+GiK#R_;x5heBw_YEc{7&ePXf0NILG!eooe>a4JB+g0VFc> zpAX`)DC7|^b<|Rx-EEFYOPd)EBj4PoF?-+v5Aul)nZNS#NL$)wjmsNByw!)ld`I)v zjOFv^u|H_c{M1tYU7o?lEgjA`5`B~Y>dN7c*|NPEiVMV>(Jo6=|;zZnG+i`O#CAVd=n2f#HlliB9KNU#Mah3Q(%O}QJ^ z8=!}JpwEJKk!?kDY=%{G%4JA~Ad6Z5U?}6Zs5&?CKe@AUlfOwQn#++wvB%`rIuW-_ z^_Uvo(%Oc5Sr(TK4<5%3g*$U(IYH`0Yjx3hYf! zS^?qmc$SQ<{Y2}>lLP|c~lO@>Aq=EMCVF9Mui~QyK`{F%c zp9npui{Pb&Q>Zmg#uoCmhY0cGA7($DY9wTpKYADuoTf^!t*Fo4hdt8x^ab1WV*789 z0wo3T?cbK39V|R&nW;hhOUw8xfuZxb5}YqI<=7_`wmDfp-VcOlOr93I0q54c5CIIM%lh zCq~p=-^nt-VmrDi%H>;U3;9_bnV(UgR9?C{_54z`z0V^ldUq^*nOiy;Uu6n^5Fh(j z=Vpp4FoH0s;hsXn=cUU)0xqmfJ&n}0q48%?T`848XT(BR*&#+$X-6=foBw)*K(RU}Gm z34uV+7!LxZGX&Ia9%6{Q_-LJgZ}DZcON+q#-39q_EH21Vmr-%Q5qD2q5gMc@JLySC zI#+-Dfy{{Jn`5OH@kMxRWae`=XM^KA*P))jMbgfDTTA7UU`pYGOoO6(bsUjg$&b5d zj@jf-TF_^-2+Kwl8)^=Rq!hMx`$ntRzID~pyZ8JtcJCY}pTJ^fbpd$~DY7OG8mME# z#rjwOU6o+pn4|vkQ@SUdbO-#n%QhuOn?n%P+$IGDGQg3Z8`gvSs4h}Ru|$}APNPTc zrcdMuYjB4nbEVRF2`>6}9fW`ffuT=m%Fu_sEK2%g;Y<Tcjo)wM0n^+y%~LoPP-iP`n!~hwoeY%B6pe zM7RxbMU=1sQCIM{#Bf(?URxUCOQFl$t5r>|-3P>Jj}|Up=i>rNJ)4IyH7WhFN>3UJ z)?2dz(N5zza5DN=7q-Sts%TxKCFaVQE{~%a%&DDw9dVKFKcOal7a&NzT_U+IL z(xXP^JnX*2fkjUxL)mmUPH`eH<`v-6?4*d{(${eQ2P@9bw)lQwxnOyK*QP4N*c@-_ zDb1bi8fjn*;~~xh;GSd^I#hO8?(FrtRGftx`iJbvC#7-^z&Vj^s9*Ba7e^V}b>9TP zXM62jQfNzYQLFtdmdjg7QJFG6UGfEA**43UucJ=k&1i%+rUN$xkgYGl5e-$}$B65? znxzViW+{kms!UzFGJeJc(WV3_>PSZ0-u8V5-xDg=-gx90+{cZtL3)%JwDhtFI=207 zMH^Z7NrM(R2x=T&I1Ra0^D4hnpiJj2V$rS{&y@M{a}rrZB#`?Z?5juG9jR6dpJ)wz zikOU6%JUMt_NV!!dy|XBAE9q~%@AMsjui?hdQw6*8q+C8FCm6c#ZaQ#4pOkb+W9vz zz2ZAC$$7q_I}umnioT2oH_lkPN(rGP4qXHtC%PrsAyCVPc&oh`L9&#~lQ8&gZ#@!A zcm{n9w_ikbsf_c%TJiif^LL{6hY58rUo>F`VtxORb$-Ba6^{ed=Mx>ZxQ_3#cu-cd z-7dZN=~rZ1=u2?xu=#57DP1&@|1Y99T1;v%@wPV_aKRGa*UL8q@ZsJJl!?Fo-I{eH z9eH@pxZgu)e~Ef$4qA)}51R2injo6TGX@z7H7@QSl0yqBS~35a$z%?T-t9gAL=IKr z21Ze+kyOUtS+k#Q+_r!1Y@LXEm@M-zxlIvsK|_cvuSYtN@m8%W>oml!*v1eebZUZ2 zu|R^%doW$PD5+UizzQp`yr?O99EIvu-WXRNs3JxPcGM?NFWk|N)M9CXEbv?Lg##6I zis>i@Ji}05t;dQNiuQlR-Jvs@=J{(j1QcLK)ulxtu!Bn4 z9$-GM>bwP`H^2=-PVFLE(C&1nwhv9eqn8*kBEb|A%!uG(-v7%i4F!tN3?k!(*-Hy! z4|Svc-}SRMzC549O8kdQ%>HR?(jfKJ2vX5``=95J_nX}vcEivozoI4$nj#Gh=&`wE zbhuCM6E0k=z7^y~Om52q#aGv|4*V&OwggaA7}}BAvCy|_%!2JDa+yVCA(-Y5B3E&S zd4rn5_-e$sUOpQH`qXu%UgG@cucUm&#+F}n-SrRL_{dVY8-}TD=$Dl{yfIGfNyrQE z8bPbkvjgd*)SjwIH}nK{FMn^sz)A8v^qXEm3MCoAfVtSshg$CV4x||Bo6eu+8w%&5 zUrP)rv*y&!9|(=ewG5#hHHK9j`(dKsqlCv~;dAHjy7!9(DEdC|^ZhQA8ESZvbER{J zuEYAx{5my5^3w1y610v&gKt+NDOIgK(3M*$irfN$Q=v^yJi2=O_6KJ?Z}MXnI4?9!SIl zpY?&={{C>VmQT$KandKGA@xH(rssZKxQ0qai%K1fh!=Yf6Tyovam#k{K$lkHA}}eq zgW9Q^^`==}bUI(=`Z;3>%~zE9dENc;Fx@Dfu3l*Pae$79IMvGf23pKMy`tU>pnu_i z73+A-z_FoI-;F})I`Gi=mln7Zo4~oBuNfZEL?J=d0_&d=xR~9!t_H zL{O8F0C4;fGZ32>no-+>?FGp3i{YM^x)SNLxzf|ft;^T>bugdLh3+5`n! z?y}SK;<>r}M~T&0)awdpAU0TGJRL8}ZmNfVPQUiJ(|De-G2S?2&8)I~-x_WqW-j<1 zVS6qurtnxX2D<~j6U<>4q7AK^`^)-MD%NMhXBI=S9)4i-UK&;KDmf!K&G=zOQ)JC7 za1948#f&(-pSS+s;Y`YrT0aU-{61wEPr^7IHT{4ufRjz$ZK9H93x-Z&)s5;jPNXJJ zG+p%My$UaD?`JIBDtjLdP;AMm+keW{&}u9E zcX9A$u2=Qg-}QGQ@S`Fe%w6ueI%<(9Hik=CeGAK@Lk#aZ}NY%x_tES!OSB;;xZ+$ z_#?Z2V3^Kltb6qm*2Y&BKfL|>P$-<50Qb7}W}hv)ieH)i3MWp?@NZ~K`L%9s7W|S# zEF<;Pt1ePhw-jvKDyLK$E&9ZtC4FL`pflcc3lvLyf~URC`1~8DIzVwkEGR?>41>e8 z9BMkW8EAi8sX1<$;Leb}gBme;vpTo9N5k-at) zC&pvk9GevNEwFda|C2`HP$s|z18juwf?lWHgEjGlEOvjAOq@h10CUKYb*|S-LouL1 zO`_ne!VRPQ{T4EK4%yA313`)1w^eCA2Yx6OHA5ydBM4(m!_irr{>69WeA@Vzy0`RV z;08V!2C*?e=_I+O7X27`hhXEm<<#p0TEzER1v>_(bWIv|!k#{4;a0mUFAln}<`{Pu zIjXAuk9CVmOxffvO;Y80(gqk+EmCVw7JiNVDi9&C{D^Ahgz$6NvaQDWvHHIwQYPSx*n0B|zyxk;dcc;UE;Fr8;(EACi^iaGm?$ z_Nc+RlbrEF@ca3Ut{}{}8Y);gdb|AK*}`bP4%pJ)V#2`>Xe-dOP;^L|LtL=JAi2Nh zeF`!)W#DN_sqaiqL2*kJvqZ~Eub%;OQPIwbl-nN}uT;Oc*RHi`JijP&nT4;qWamDg z+vsLhp%nj7cpl+Ac;P5S$zQ@gZFkT~8hcWw!#j>ZvF|!M+`pNuK8(=G1+idWSPxiW zKnB5zpEf(Y0Fe-iB{XhyC+!cG<=Hb7{BDSVnt~YD2fe!WpwbXsQC{uB+Y+9R?-$y< zXU5h-&>)#c&>Ul<+n;s=oD`)MVowT(Zft@{y=A%7Qqg}@*FOAfF{*=7vYUTR%!XQrd@z{z_vscTEf)6(eFa2NqWz`zohZP*g>4^0Z41lW zX75{MJ*qp<{jqah=tcegRMr~H0cEBrnA=nQtqPg-b=^3(%GmACYqKZ&DdE;1-;GK5 z|7GukLr~X1HB}HQ2zPvJb;GIFr%ES&EmSVCM}y3Ku~+HW`{6q<_#pNMrt zb8}&(O;*i^owwVPDi*LoVDJ9mu8fj1Le>t%XG6#kgX;U@TV1!yd%BF?xgtloT%D)j zvh_#1ehKJz9>j4tQuIE?Q(gU3%9(=8pBRQ61?T>1#a`NF}R=_rZe_ZYlB1K zHGc7ybU=CcDUuyOcp*@I_o36Z#!3i|Xi|lN&FfjwproORyjdWDyATT#P<<)8uup_X zJmBegEgP*`BwJ34YDsj2M{oIqqK|c#&~Z6*m-2jGxXjYG)J8*Os%Ak25J;511iOrl ziL`QtD`t3$(P3__6u;nV&)o~Z?y7GLBGJ3jX2OA16Z4c`znq)!sxs%f01v;AJ;6Z- z^SftX&d0QU4i*0v^86(B6|Oyjz25EGI{jzOUn55t$YMoL43#d;@?b=sflJ=LE6e?t z0F6-tk5%^W_By;isInf0)vZ&`%M=@u5;jXrORr^)dB?_m7VYZ-rj#GcjA1`s!$cpg zavo>R6+iZ+V;beeo0j(!Dwf=$?(Fr3!4(z%lZD#;So}#1Tj7 z;bLl9w%vleZT5Z(Mk(yxsKe6&PBmt(RQL3C;qu}l?s-iuF9R=wgQ2jy+U4`yJ>*QT z;EmLcR9#)2^n}50gRLap0lf!p1aHm*NFccQp-&Y6c$$Yuz9r+zzF*LLzope@e`3h~ zKGt=>0SK4qUc91Z!V-8OZUj)enWW3@aFPOy$3c_g1YuG&0Y2SwIlGE>FvGd&?m@O{K@02hnM zcba;T^Qw0UWOB)82g2ti!+A*|b46i@nk=jc@~pzx7Yud*_P!6NMAV%dLuRZuG%Z^ke4)umu%9WN5w&;xv+_+qC_{<^?9?}~)RG}8vFJ^gAoWs$O-;u)3l181>8mS&T)t^=75FvrC0F&u zNNwL{UA!ElE({Pz$p@$_@rf@rd)zI$KY?GPbZ&^fmrp;yNfb03?}h$`-!WK)JSl?L zt7B9}%}z%1JtY$IIdY!>r2roraQYI=Q>G*_jvH+6w@UhbChL8;`nG4`^{LXj$BMif zWKlsF(M~%Emc~!MN%}&cE4ih5+SkyhdC^(Zm#Cy34b+WWJlwOXdW?SVPjJVyALcdC z_Df_xmrUbzWCsjhV8Ugb==qPU(|{m-#ofBW+4$CLcqH|XgWBp5C;eOYkOCxVrqU@= zwca^)N*tkt>IW(dP~5o~?L@(S7Kpe>R8iYvV$_k%UtLx#gt~LsK3p}Kg_nUwBcr?R^o}eZv%I_X~WuEBR?8A^rR14+kxpQ zsj-8&gaxP%qT>#HL{2b>flr2>6e!Bcs5`r{zh8~kA`eoy6AhLEYCHiY)V<% z#o651iaC5}lI;ZOcdX}v$}qZCdSYCe90pHPP(c+LegJl5+xHAJh`$PhT=Mt0`{3LI zhy`)q8|JIn0eg$;J+IM>*cZU|{W6g!a*Aa^DAEmlCdjM_6y)8?mQrVo|9t#O1`K%d zL-XLd-UYHfuFZXcf;~kf{6<_?va=QXvFZ>8;o-9Mc=$qEW&mHSN>m2BlLq!?iZg zllZ1gnW$iPHiQwTslktpyGF)Q-QW0^TDCX2AE{#M^h*9&?cE1?-wd3ECh+<4z&-#T z5J3)<7)X+*to0+TdXS70AsKLvy!8$>fv8K#*;_pYTs8I)x#`cn9?Sjld%}0MGG4w9 zevhTqvK*Rb^&9cSWQvQLPE??P7-IH`#Rr&V9>9}Kmb3)x3_x}KYeEg!v+5kN^-Y;8 zSB1PA--ro0MlbabzajNku_%UhfM^oB4R-v&A3E3CL28)1f&=f?gj7(`3BdQ|410qE zGDybR>*X&`jyP1r*_L~^%CP4n?K+Wc~5HKDC#4HJ!+n|9ofRXA7>ve4`W^JjVQA6w{- z=whdD+tLHLH`X!W#oar}m*ef;BsMk7fHwxOmHSm*k=n;xB6$p|)bgc8Nu^cvuh3TD zN8=5WgnK@&oM{?+?05e`L$Kl}}rOUdy2N6kT*)WneH zfz5ox7S=s;hahSww0(2*bCjqw{tv0JSB7JM4$M8V24xpP>#5d>zjCl4ZaYNgQU*e9 zvc=U*t!8(z(t7HmYpgWwg`(4E*7Ti*wDV^zWqP6@Q8-|TJ-R^#rQgthtbc*b#VXC-Yo}UXLq8n@c+2}ktu%Nr zE>9e?o=ZiC=nw%GSp5T+;OGy^7=h=d*qYo>9u>TjWXLV`o$kOBJiQ)u=VaN%m^GdB zBTzuIVM)>bFu`@~O0yDwWnRKhLSW(&iBv+5AbT)UBkw+GL0q4Gb}A6 zekXdhXI)QhF(+|$drgY$@HfZR`qiD~A5KbC2wg$%nzi1uDL#FyaEn*jvf)j#PCrVR zX8*3GFtHa}69TW7n5$u(x0$@`>=~w=rj}<8OH3U$mDH@5qIF9T^vfwmzVXHDh|0{ISamX|Ba&mwpBB>35JW=Jr-1i|0l1y( zx?fbP`rgOa)>lw5j|goKjvk`|I?^p44MLvHJu~>If%_-<&UinT6#+F7_KgUdJVq@o z4;Rj@ommZE2VGF6tgzTIR}?X&)&8s zpNTvtxD5M*0m4W0Pr8SX%84BvXKbkp6F3-gM-H!DMsb7!E1b?g9fKFw17$8+q?#p};nh+ruXyhJy@IJeVv!C#inH-tNKyJ!mP8p**3*Wf+Ph#) zP2h;MjaCxPH-G7aNIV*wV^>1qAUJR)Bzx~A19H5nDljHVHvUJQ4uW8mf#6i3fZWg}-@yia5$B?IB@9$ zME6vQQ^v1-&Rek9S5+OnW4odcH(oZTch#I?TbvZ8NF;pi2_@5cwg_^BSfmL4xK>WN z(R=^nr_nY`l7kqv8hMRJ zB%D*dBN%z)Ku_=DoXBGRz#TO;AIBr6gl4}!VoPI03bux$Pe+7OQ4)>pn0}Q`#=iyC ztEdDKLJ?JKnvW1*n)Jv@ttV-fQ^5_AwPef;_>-VG;80;y)O7@RqRP4^M z&7@q`q0ZJ)lW>=f&3o0n}j0zpvkzI*w7S5EC_M^rQMD;?)n3>f2nQUq9bglt)iL zJB_&6l*94~72TJ8!BXDV6pS*UKXmz2S@K+v+Ou0C$B-j#SMrXQd@FW7m$iIhx%Z>R zz4P1Qz2p0u%f|5jb!#aN^uXd-r%V`WVud%%+a2uH?dEy3CPgX6=U z+c&#oPZX2$m0WfgSL;{*Wte999{d{=R-2RV=z;~!Daq%VF|3L?+R!V(&V=>RE`^qx7L9ut%4ld_aM>l36lpO&dFdS$Jg52OhU7+Zk>Rac2 z8L7n6vgYLN$~X{L%QW`Fve%_=i4+|1$dsF+*>D>RO?RPHhK=)Z zR(kS$ls@^Q)gV+>ndJoUP{GjEUvH;;p$42H*4b51^Ki88Bn-lG=hQdWny?iyDW1_y zHcoX_y(UZoJ+tFly4Al%i9_*fKY)g-i>gF^VbjzFm3~+8a<|PJKip&i3%RTIvKguTmt5>ShUMxRv@F=M5s=O1StXajZUhXmp=$A+IgTta+a8?5c`Zi zMCEHnsOE%peA*Z(3ZrH%R?9u~)+`y!m)OF>QD$uUIDlSK^aIvPs`MuMpVzdd(zihU zWOQIR7eo-B={Atz3NRGiuw&HyO`-;&Q3LRQ3VRZyfMNR_yBI`8vfNN1Ktl14Hx@)#nSz4C5BPh1zULp75*5B^Po(GS}t zMs56Du^jV_mbh?;+^yMd3bSw76hDMW1aX|bH*u=0?`#} zfJ-ZDhW*UqaA?~v(gV*Pe@$U6wJtx+{~J{qH8N!4VSYSJees0NL49B|B}xh?Rg&ic zPMZX#CW>yQlab;YYPr_`oD>=3(FGh5oA7>w4s7PEYNh{`lTpXK4ttjCC&zjA*7WLm zWuv%^^c1(gG-B&3Hzw0Lmy~A`>|cy_gXHZy-3xGOhPv(%m;XC{B{iI)CHR(!qNN~| z6;kzsjB$Q4LAEWfteF$D_&^>%T|WDffOk#zq6vF|9}bM+0?%DV(69}NvvB{^ z(n$~YAn1rhFgj_$;WZ;2LLGej`CllY@~A#1K-{JN7Box-U5rj!m<1)FYS7c(Ax$=b z58_SU&dvv_h?Wk32CqUZbfA`SL|Y&`&LIqailJso#kETx+0a#y= z4YwS(&qnwCLeP9SY!roJyoH#Egr;Wb5}^k3UYD(d!i?9NBxw(V@JJCJP_y9i|4#`= zxRhxF)aCn(kmDa7+9GC#-jdNM53Oy$ zb2BPjKl<$UG54)fa?^|WQ+d9#=>wUuvq+Q|Jgs)2Ip}Alq;cNbLwy`Z^DoYrfaR$k zCukAO>t>KL*g|U%TL5Pz3)*ErW~gMXJ6LRUAv}a~KD|OqS`|JH_fLiQ&2O^ZzVko? z37yPuM#)xW9xR)xK~*Y+!vTqXIes6D3Gu-MpMn%{EvEI{+XOyJh87OIT05k29!pOn zfZx{w$BIiy?UvbmakFR)Mv)PKm4w(#>#!f1033K%Tp8>4lqFNhc^q zA_<@(_!4BgjEPg7?iyNUNGs^()U}WLNmvlW*gsyJe$r9IusfB7-8KEr_Ax!A({=h?N%L&>W)%%2^DCke{ z2hM}Ugu<-ME_OaJo1#}J&u2quZtSty`3s%#9gKyRPZQ*Ax{8do@Hjxwa#33Nf_Xkn zmA_SS`do%@QG*|HD1KEhMTPiy8l>@@2O5b=h1;N!4XF9z`Edz}*A!bPHCVhuJ#XHLjmJ@$e82I|Q6SNvM5b#?y4 z;cTd*ZXhJ+9iLP?7wcM0`^iLL3ia{Cvv;%4d}mQ|v;3TRmB4J13%i{FviG$zjaO?`uJZ9DvETHa?N&^CCY7s zAMyOAb}s&OBm3B!~%^?X^!ZX|QL8<|SgLBEi&sJ~v9%3$)^RT5OtWfGS zUeNZF&=s!)OzI@jUn^vVjFs(8g#An*u;4pd{2L)pt2v_&A zVRC3WF!Pi3#IKd})lPo-LzY&ZLa~*Qv}$71Zn3?82eVX0r$uvNob}(-lrkgZ{+G!^ zhzPBh?hZx+{)@W*xN1t){Kf>&PFjswF+L95OU(BcTLTjZ3qi=l2Pjsi$B4gqnB#dt zIF1ClmHO!VLZX2qYGh=ytno36f-%#TNw_9}p zf;h-oetKnLunum=2s#ktl5y{`aUR(EQyc}ZZiakX*4gKo`H0)fK@izE9rFU1Vu?kn zFj_dWw0>1(TyvG;a6?!DkJ)Unq9L+)m(PTswh>h^E_x}_tV2}$;$Z)LW6u{kwq@~; zyZ(x#7QBP5w-dJMXZpc7-J1ldpA6Jm(-6$!&;Hm9`!hQO~JoW z@97UE29EN*N=xM*Vj`|y*}V#HvHXVX`ymN1Mk1O@=&y;k=YGot_btJlmk$Jn4iHf9 zGf8}r6oLgKeYs|Gh97EGqQT>28_x)v8Y$RSLpV0A%8rqkTuYStyIU?AAuJ)^OaqJ0 zYVO+H)|Z;x;|eN)u`zb3nWOs=;@l^LQNRa8asiNn)wjSd`$Qp#6qfoXCs>GQ+LZPX z=8fHC>j+B~51;)SI#%81;QLvEHg`~8j&#LV@E2&-*XRBjtXuoZu7fP zJ9XW{ncqQ?GlxP4^K+AL2W5=<*Z;)uAD4*S0tEF$cHMzpxk^sh_TJjOPN zpjk4eX+#}q1N@W;kW-qpZV$CjsN7RQ6)TZ^t+jnG6%=Hq8;kaPYsM` z2#gs#C{}p8xX)^U&3#5Lb-^0&$~O0+Bahqp{GP@CqXO{laaBK$9iKY<3I2MaqY{}7 z0x$Z-gc)LHx>XT>GSes(u(E`B-@-6%_z+xVX;fda-i-5KC4YdSl&Y9~xWPJAZ`Fpy z`O<&(-1^5nU6Oy(O)zUN``Ki>?u`;rH7ZomdS1`WNiiBU2=O8y{u@*;;zImCf!B_%`iZ6tB@a-gtEU!gr4R~Fo#y{Ybp%+Y>g^v&+Y~a5>_KI1Ej(Ud%R8d2{quHY}c( zS98m|bqq%2mi_B}og}mgxFuFi7HT&wh-Xrjbm^h;VYksNLUD@pA(^#YPloxtr@N<@ z6MTT?qSP9WJs0L@H@V}QLQ+xc?YGeyXS9pwrT_Fgi))dQ?dlKlKz#uXt$i*itIN0D zcQ_8daK-|~jU!cE6bv%m&6fpS_4AVEUDIIoNZ9|}dFuKz8^{~i`U*;f#!Z}r?O(HT z2I}t%JP14>zt&mT%!47?qdZ74&c*5_8{$m!l1)Mt?J#}p4Fz8thqr!3V98yHv}Wc) zt}qtJ++In?sGeQozVc|`z6$$if!{OXzWgPH4I9s`3R*71ds9!92pdh&fXR?zY*GS7 zS6IZ)5L!WMgm_Ze+q3>_Kj0cRrbZYz)yvnYi?c07Ee!s`zlQ#YxGlWd+7uBgi^kA_{>X8zuiD(B@ccpAAA(CQHPBOJ*<=T{-ZAy zq;;~umEq!+cHyLLfz`?t@ANn?x^9{vY#2#caLGiGif;XXg@H~vA>1N7plKCF!4Kj zN_jnhr&tB4`6ZRjPoQ~9&g9s`_0LFfUcV78QZxBZWjVgn%zvH-Mvq~6gPVL_r+M{i zog84&)*L}mAvhu7K_!pKG?vgf^WSpk)#@54z&cmrEgFg3B7&D z`FuV+w$UiIYJyT2cSxMlya zbtrt$aTu)J@lLd{)p}=Tz+T;>5N1v&&D%g-tYp4<@Q0#}x=$)vzB5mt}Hpy%c;_^bbhDaISL-2SOn4y+!m(%kaEN#2z_Y*^g%98&lR>LW7SNe)=k8qHVaNC^G#q}=R*8vh?o{Q~?|3}kTI5gdU zZ*OD3=x&6OA}xr3)aVWo=@ulUQ5rV7LqI~h1O+6dbCjfjf+F1|(m7&#=kxu&f51Mw zsP#&3qT?~m>bruK2K_MYtG6+`>P1Yc6u_n8@67{I(UyebzYmd@L+yOC+E zJdenP{WR~R|7;qIS92iNDaKEA^`cgD+4fPu&iGV&?ZXN4a0i^lP$vo(aZal^bqGN8 z?iosayZ3&|Gmq_p>U2)4s7O|g8P(fCX0=6aiX$K}illV!h#cX|D^g@!U;IArt(UCO zb}NV%5c$eh4<wRKoZ&Xk4|vid z@%;)qkk6H^WQm528FBVGlc;~yse@vg$0<_p#1wtVjzc~a!wIXu`|Kw7RQJ1)II}TF z%4bR~xpPN?I>27$9+2OqDJKEZSIMf}i>T;@Hb#V>3mi&a1{(E0+i)mlzJ;ly)ms4k1vx1Eohk(Kb=VS@7^kwmtM_s~PH;SleR% zqYTcf)GxRMZ#etXpYvE5>I_M#u-yc!wK3h&n^So6=0hA9MAUT`&B;>8bxW9Qx|@Zkp)_RHsHF1+!dM) zr!&%&1-0($q{LeFCcz3~Yx0V_g2@PgxF z#@$w61VBZqTz%?cNvW#J^n72{19%?$ce#Oly{GlnHw|Y~Yc<*wF-#!N`li;`(%>Bm z*aTo+6TyNr<2tw9#P1o3qGlbom>1a@DvOQa%{)cH#4E+WUyIJAZJuejOv5QV8VY+S`0pA{wl%ma9~HEnU~4D8roYVy$|%VWoL6$G7G2WE=f}nUpvNFL8ma=V`r=l?-DGj zw5A;f^wv-5HQ}g``vN?SS?#9Q>QB{;m)3aV)(2xQVH2AA2D{&4;gN9HxJrIqZE3Il z)#((e^8b4Q$a>XEZLvUSmq{S&2-ErNS)b@}ju+jroX-E4i^4?2CT{q4*u+{^@$R;>Terf&MA{pD{m4hpc(; zUdNJZw#e(<&7AUpu(QoyM_LM-=l2{ba{PKj2{QggAMol`V>szrk9(_`-(%0N5h*g# z$BBv(9nqgC@^SL}{#f<=#{UVKf4J~^cMcvGNEVRZgvN6GldMd8nLcQQcuY+Qhh%-c z8mF%mXH{eAay8vU@UVCbv>Zcgnz z0NyT&2dg&9EU6DEFm9wuR~`9&a3 z99}3+mMSv&DWOaE)YSs>Qve}G-c}D^0bzVIi zs<|5+f}x3`gd`v@Cj?t#)WrqvULVVOY9VE$LRr+X^u8cDwC-zU5r{}nnVuasfnZ4f zNy$Bxg90C~9NIL-t1Z!%YefNtMG}Y6IvqdZg4b?*cMWHBLcjj7QbAXa(;oM{QwlPo z3X9ZKL4%`5BtJSFs?kW|e5zklpQuP)Qk5R%x9cGy2g-AIF_zL2O7LIGX%0kI?O zko?rrImB6)L*DU{A5ZpT%9KT(Y~exzXQwnJO~Y7|>c;)>+~YrqA5O)ePL&lHqB%N% z#p~9-o+ulPA_0I^Whh;=r6?qkGtA1&4kj9(3;gzm9F%56jqL&R(`7XMP#%;XT&o|5 ztJ+8Lnf!tofHy+3m7m_9n`4e@UQBV-gg;^5h&EdPJopscn*@k$8JJRh^|9o&0fP@lwc*@fcRr1Z95JO=X3blgk+dgfGf-M>R<<-LvV^ zT2sx$h#KGRu~eiHQ`u~Vv|X~Uw%8m7Iv%q6(rxv`v`RhIZ)Rt(HtdenMK-%mAkJh` zfH_o~#97K!d%958{BW=Yv6C7s+#VoRZJ+)(=-I`m$)FDzuTslK;V(tLP`j;VT!`$x}Cw=nv$^_vFd~%0D(j#S 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

;(=nhus0iz9N7=GNZ@9% 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 HamV}*-KWkd literal 0 HcmV?d00001 diff --git a/Sources/DevCtlApp/AgentService.swift b/Sources/DevCtlApp/AgentService.swift new file mode 100644 index 0000000..9fb55df --- /dev/null +++ b/Sources/DevCtlApp/AgentService.swift @@ -0,0 +1,277 @@ +import DevCtlKit +import Foundation +import ServiceManagement + +/** SMAppService registration for the in-bundle LaunchAgent. + Must run inside the app process: `SMAppService.agent(plistName:)` resolves + the plist relative to `Bundle.main`. Nonisolated: setup runs off the main + actor and Service Management is thread-safe for these calls. */ +enum AgentService { + nonisolated static let plistName = "dev.quantizor.devctl.plist" + + /** Why registration could not finish. `needsApproval` is not a malfunction: + macOS registered the job and is waiting for the user to switch it on, so + callers must say so rather than retry or fall back to another install. */ + enum Failure: Error, LocalizedError, Sendable { + case missingPlist(String) + case needsApproval + + var errorDescription: String? { + switch self { + case .missingPlist(let name): + return + "This copy of devctl.app is missing \(name). Reinstall from the DMG or run make app." + case .needsApproval: + return + "macOS is waiting for you to allow devctl to run in the background. Turn on quantizor/devctl in System Settings > General > Login Items & Extensions." + } + } + } + + private nonisolated static var agent: SMAppService { + SMAppService.agent(plistName: plistName) + } + + nonisolated static var status: SMAppService.Status { agent.status } + + /** Status by name: the raw values are easy to misread in a log line + (`enabled` is 1, `requiresApproval` is 2). */ + nonisolated static var statusDescription: String { + switch agent.status { + case .enabled: "enabled" + case .notFound: "not found" + case .notRegistered: "not registered" + case .requiresApproval: "requires approval" + @unknown default: "unknown" + } + } + + /** True when this process ships the in-bundle LaunchAgents plist. */ + nonisolated static var bundleHasAgentPlist: Bool { + let url = Bundle.main.bundleURL + .appending(path: "Contents/Library/LaunchAgents") + .appending(path: plistName) + return FileManager.default.fileExists(atPath: url.path) + } + + /** Register the agent. Writes agent.path first so the daemon inherits the + login-shell PATH after start. Registering often lands in + `requiresApproval`, which reads as success from `register()` alone, so the + status is re-read afterwards and reported as `Failure.needsApproval`. */ + nonisolated static func register() throws { + guard bundleHasAgentPlist else { throw Failure.missingPlist(plistName) } + try LaunchdAdmin.writeAgentPath() + migrateLegacyHomeAgent() + if agent.status != .enabled { + /** Registering an already-registered job throws; the status check + above plus this tolerance keeps re-launches idempotent. */ + do { + try agent.register() + } catch { + if agent.status != .requiresApproval { throw error } + } + } + if agent.status == .requiresApproval { + SMAppService.openSystemSettingsLoginItems() + throw Failure.needsApproval + } + } + + /** Unregister then register: required after the helper binary or plist + changes inside the bundle (SDK guidance), and the only way to reload a + job that is registered but not running. + + Ad-hoc resigns change the helper CDHash. Registering (or KeepAlive + respawning) before BTM drops the prior launch constraint produces + `SIGKILL (Code Signature Invalid)` / Launch Constraint Violation. So + unregister always waits for launchd + a BTM settle before register. */ + nonisolated static func reregister() async throws { + try LaunchdAdmin.writeAgentPath() + migrateLegacyHomeAgent() + if agent.status == .enabled || agent.status == .requiresApproval { + try? await agent.unregister() + let unloaded = await LaunchdAdmin.waitUntilAgentUnloaded() + if !unloaded { + DevCtlLog.app.error( + "agent still loaded after unregister; register may hit a Launch Constraint Violation") + } + } + try agent.register() + if agent.status == .requiresApproval { + SMAppService.openSystemSettingsLoginItems() + throw Failure.needsApproval + } + } + + /** Unregistering is a deliberate stand-down, so it records the stop intent + first: without the marker the recovery poll sees an unreachable daemon a + moment later and registers the agent right back. */ + nonisolated static func unregister(paths: DevCtlPaths = DevCtlPaths()) async throws { + try AtomicFile.write(Data(), to: paths.stoppedIntentFile) + migrateLegacyHomeAgent() + guard agent.status != .notRegistered else { return } + try await agent.unregister() + DevCtlLog.app.info("agent unregistered on request") + } + + /** Deep-link / recovery entry: register, then wait until the socket answers. + `Failure.needsApproval` short-circuits the wait, since no amount of + polling starts a job the user has not switched on. + + A status of `enabled` does not prove the job is loaded. Escalate fast when + launchd has nothing; only wait out ThrottleInterval (~10s) when the job is + present but still spawning after a bad first attempt. */ + nonisolated static func ensureRunning(paths: DevCtlPaths = DevCtlPaths()) async throws { + try? FileManager.default.removeItem(at: paths.stoppedIntentFile) + try register() + try await waitForHelloOrEscalate(paths: paths, escalate: true) + } + + /** At launch: keep the agent registered when this bundle can host it, + unless the user deliberately stopped the daemon. Copies running from a + DMG or Downloads skip registration: they share a bundle id with + `/Applications/devctl.app`, so registering from there races the relocate + handoff and can unregister or bind BTM to the volume path. + + A post-replace `agent.rebind` marker means the DMG installer already + unregistered. The first register often dies on an ad-hoc CDHash mismatch; + KeepAlive's in-place LWCR repair fails (`smd` error 22), so a brief hello + miss forces unregister+register instead of waiting out ThrottleInterval. */ + nonisolated static func ensureAtLaunchIfNeeded() async { + guard bundleHasAgentPlist else { + DevCtlLog.app.info("no in-bundle LaunchAgent; leaving the daemon to the CLI") + return + } + if SetupPlanner.isRunningOutsideApplications(bundlePath: Bundle.main.bundlePath) { + DevCtlLog.app.info( + "running outside Applications; deferring agent register until relocated") + return + } + let paths = DevCtlPaths() + let rebind = LaunchdAdmin.agentRebindNeeded(paths: paths) + guard + AgentRebindPolicy.shouldRegisterAtLaunch( + deliberatelyStopped: LaunchdAdmin.deliberatelyStopped(paths: paths), + rebindNeeded: rebind) + else { + DevCtlLog.app.info( + "skipping agent register: devctld was stopped on purpose (Start in the menu clears that)") + return + } + do { + if rebind { + try? FileManager.default.removeItem(at: paths.stoppedIntentFile) + } + try register() + DevCtlLog.app.info("agent register at launch: \(statusDescription)") + if AgentRebindPolicy.shouldForceReregisterAfterHelloMiss(rebindNeeded: rebind) { + if (try? await LaunchdAdmin.pollHello( + paths: paths, timeoutSeconds: AgentRebindPolicy.postReplaceHelloSeconds)) + == nil + { + DevCtlLog.app.info( + "post-replace spawn missed (ad-hoc LWCR repair is a dead end); re-registering") + try await reregister() + try await LaunchdAdmin.pollHello(paths: paths, timeoutSeconds: 10) + } + LaunchdAdmin.clearAgentRebindMarker(paths: paths) + } else { + await bounceStaleDaemon(paths: paths) + try await waitForHelloOrEscalate(paths: paths, escalate: true) + } + } catch Failure.needsApproval { + DevCtlLog.app.error("agent awaiting approval in Login Items") + } catch { + DevCtlLog.app.error("agent register at launch: \(error.localizedDescription)") + } + } + + /** Wait for the socket, escalating only when needed. + Fast path (~2s): covers a clean RunAtLoad spawn. + Missing job: re-register immediately (register was a no-op on a ghost). + Spawn scheduled / silent job: wait out launchd's ~10s throttle before + another unregister+register, which would reset that window. */ + nonisolated static func waitForHelloOrEscalate( + paths: DevCtlPaths = DevCtlPaths(), escalate: Bool + ) async throws { + if (try? await LaunchdAdmin.pollHello(paths: paths, timeoutSeconds: 2)) != nil { + return + } + guard agent.status == .enabled else { + throw WireError(code: .daemonUnreachable, message: "devctld never answered") + } + guard !LaunchdAdmin.deliberatelyStopped(paths: paths) else { return } + + if !LaunchdAdmin.isAgentLoaded() { + guard escalate else { return } + DevCtlLog.app.info("agent enabled but not loaded; re-registering") + try await reregister() + try await LaunchdAdmin.pollHello(paths: paths, timeoutSeconds: 12) + return + } + + /** KeepAlive's in-place LWCR repair after a Launch Constraint Violation + fails for ad-hoc helpers (`Unable to update LWCR with smd: 22`) and + only burns another ThrottleInterval. Prefer a fresh register. */ + if LaunchdAdmin.agentRebindNeeded(paths: paths) + || LaunchdAdmin.agentSpawnScheduled() + { + if LaunchdAdmin.agentRebindNeeded(paths: paths) { + DevCtlLog.app.info( + "post-replace agent still silent; re-registering instead of waiting on LWCR repair") + guard escalate else { return } + try await reregister() + try await LaunchdAdmin.pollHello(paths: paths, timeoutSeconds: 12) + LaunchdAdmin.clearAgentRebindMarker(paths: paths) + return + } + DevCtlLog.app.info("agent spawn scheduled (launchd throttle); waiting") + } + if (try? await LaunchdAdmin.pollHello(paths: paths, timeoutSeconds: 12)) != nil { + return + } + guard escalate else { return } + DevCtlLog.app.info("agent still silent after throttle window; re-registering") + try await reregister() + try await LaunchdAdmin.pollHello(paths: paths, timeoutSeconds: 12) + } + + /** Restart devctld when the running one predates this app. Installing a new + version replaces the helper on disk, but the old process keeps running the + old inode and `register()` is a no-op while the service stays registered, + so without this an upgrade silently leaves the previous daemon in charge. + + The test is the reported version, which does not move between rebuilds of + the same version during development: use `devctl daemon restart` there. */ + nonisolated static func bounceStaleDaemon(paths: DevCtlPaths = DevCtlPaths()) async { + let client = DaemonClient(socketPath: paths.socketPath) + guard + let info = try? await client.request( + .daemonInfo, params: WireEmpty(), expecting: DaemonInfo.self), + info.daemonVersion != DevCtlVersion.version + else { return } + DevCtlLog.app.info( + "devctld v\(info.daemonVersion) predates this app (v\(DevCtlVersion.version)); restarting it") + do { + try await reregister() + try await waitForHelloOrEscalate(paths: paths, escalate: false) + } catch { + DevCtlLog.app.error("could not restart the stale daemon: \(error.localizedDescription)") + } + } + + /** Reopen the Login Items pane for the popover's approval affordance. */ + nonisolated static func openLoginItemsSettings() { + SMAppService.openSystemSettingsLoginItems() + } + + /** Drop a leftover `~/Library/LaunchAgents` job so BTM does not show two rows. */ + nonisolated static func migrateLegacyHomeAgent() { + let plist = LaunchdAdmin.plistURL + guard FileManager.default.fileExists(atPath: plist.path) else { return } + _ = LaunchdAdmin.shell( + "/bin/launchctl", ["bootout", "gui/\(getuid())/\(LaunchdAdmin.label)"]) + try? FileManager.default.removeItem(at: plist) + DevCtlLog.app.info("migrated away from legacy home LaunchAgent") + } +} diff --git a/Sources/DevCtlApp/AppDeepLink.swift b/Sources/DevCtlApp/AppDeepLink.swift index 32295c9..6d24556 100644 --- a/Sources/DevCtlApp/AppDeepLink.swift +++ b/Sources/DevCtlApp/AppDeepLink.swift @@ -23,7 +23,9 @@ struct AppDeepLinkEffects: DeepLinkEffects { } func openBrowser(_ url: URL) async { - await MainActor.run { NSWorkspace.shared.open(url) } + /** Best effort: a browser that refuses to open is not worth failing the + deep link over, and the caller has no recovery for it either. */ + await MainActor.run { _ = NSWorkspace.shared.open(url) } } } @@ -35,6 +37,10 @@ enum AppDeepLinkDispatch { static let userInfoHead = "head" static func run(_ url: URL) { + if isDaemonControl(url) { + Task { await executeDaemonControl(url) } + return + } switch DeepLink.parse(url: url) { case .failure(let error): DevCtlLog.deeplink.error("reject \(error.message)") @@ -46,6 +52,36 @@ enum AppDeepLinkDispatch { } } + /** `devctl://daemon/ensure` and `devctl://daemon/unregister`: CLI asks the + app to own SMAppService registration (correct Bundle.main). */ + private static func isDaemonControl(_ url: URL) -> Bool { + guard url.scheme?.lowercased() == "devctl", + url.host?.lowercased() == "daemon" + else { return false } + let action = url.path.trimmingCharacters(in: CharacterSet(charactersIn: "/")).lowercased() + return action == "ensure" || action == "unregister" + } + + private static func executeDaemonControl(_ url: URL) async { + let action = url.path.trimmingCharacters(in: CharacterSet(charactersIn: "/")).lowercased() + do { + switch action { + case "ensure": + try await AgentService.ensureRunning() + DevCtlLog.app.info("deeplink daemon/ensure ok") + case "unregister": + try await AgentService.unregister() + DevCtlLog.app.info("deeplink daemon/unregister ok") + default: + break + } + } catch { + DevCtlLog.app.error("deeplink daemon/\(action): \(error.localizedDescription)") + await AppDeepLinkEffects().notify( + title: "devctl daemon control failed", body: error.localizedDescription) + } + } + static func run(_ link: DeepLink) { Task { await execute(link) } } diff --git a/Sources/DevCtlApp/DaemonModel.swift b/Sources/DevCtlApp/DaemonModel.swift index bfda0b7..710770f 100644 --- a/Sources/DevCtlApp/DaemonModel.swift +++ b/Sources/DevCtlApp/DaemonModel.swift @@ -85,8 +85,23 @@ final class DaemonModel { /** Bumped on system theme change so the baked menu bar label re-renders. */ var appearanceTick = 0 var daemonReachable = false + /** Last failed recovery, surfaced in the popover so a dead daemon is never + a dead end. */ + var daemonRecoveryError: String? + /** True while a bootstrap/kickstart is in flight, so the row can say so and + the poll does not stack attempts. */ + var daemonRecovering = false + /** macOS registered the background agent but is waiting for the user to + switch it on. Nothing the app can retry, so the popover asks for the + approval instead of looping. */ + var daemonNeedsApproval = false + /** `devctl daemon stop` wrote the deliberate-stop marker: the app offers + Start instead of resurrecting the daemon behind the user's back. */ + var daemonStoppedOnPurpose = false var projects: [ProjectGroup] = [] + private var lastRecoveryAttempt: Date? + struct ProjectGroup: Identifiable { var id: String { path } let name: String @@ -172,6 +187,18 @@ final class DaemonModel { self?.appearanceTick += 1 } } + /** Launch-time registration runs behind the same in-flight flag and + cooldown as recovery. Left outside them, the 2s poll sees the socket + still silent inside launchd's respawn throttle and fires a second + unregister + register on top of the first. */ + Task { [weak self] in + guard let self else { return } + daemonRecovering = true + await AgentService.ensureAtLaunchIfNeeded() + lastRecoveryAttempt = Date() + daemonRecovering = false + await refresh() + } pollTask = Task { [weak self] in while !Task.isCancelled { await self?.refresh() @@ -194,13 +221,105 @@ final class DaemonModel { servers: (grouped[path] ?? []).sorted { $0.server < $1.server }) } SpotlightIndexer.sync(projects: projects) + daemonRecoveryError = nil + lastRecoveryAttempt = nil + daemonStoppedOnPurpose = false await surfaceCrashNotifications(client: client) } catch { daemonReachable = false projects = [] + daemonStoppedOnPurpose = LaunchdAdmin.deliberatelyStopped() + await recoverDaemonIfNeeded() + } + } + + /** Bring the daemon back on its own after a crash or a failed relaunch. + Skipped when the user stopped it on purpose (their intent wins) and + rate-limited so a permanently broken install does not spin. */ + private func recoverDaemonIfNeeded() async { + let decision = DaemonRecoveryPolicy.decide( + reachable: daemonReachable, + stoppedOnPurpose: daemonStoppedOnPurpose, + recovering: daemonRecovering, + lastAttempt: lastRecoveryAttempt) + guard decision == .recover else { return } + lastRecoveryAttempt = Date() + daemonRecovering = true + let recovered = await recoverAgent() + daemonRecovering = false + if recovered { + daemonRecoveryError = nil + await refresh() + } else if daemonNeedsApproval { + daemonRecoveryError = AgentService.Failure.needsApproval.localizedDescription + } else { + daemonRecoveryError = "could not start devctld automatically" + } + } + + /** Prefer SMAppService inside this app process; fall back to the legacy home + LaunchAgent only when this bundle cannot host an agent. Falling back while + approval is pending would write back the very `~/Library/LaunchAgents` + job the migration removed, and Login Items would name it `devctld` again. */ + private func recoverAgent() async -> Bool { + if AgentService.bundleHasAgentPlist { + do { + try await AgentService.ensureRunning() + daemonNeedsApproval = false + return true + } catch AgentService.Failure.needsApproval { + daemonNeedsApproval = true + DevCtlLog.app.error("agent awaiting approval in Login Items") + return false + } catch { + DevCtlLog.app.error("SMAppService recover failed: \(error.localizedDescription)") + return false + } + } + return await LaunchdAdmin.attemptBootstrap( + extraDaemonCandidates: Self.bundledDaemonCandidates(), forceLegacy: true) + } + + /** Explicit Start from the popover: clears a deliberate-stop marker, so it + also works when auto recovery is intentionally standing down. */ + func startDaemon() { + guard !daemonRecovering else { return } + Task { + daemonRecovering = true + daemonRecoveryError = nil + do { + if AgentService.bundleHasAgentPlist { + try await AgentService.ensureRunning() + } else { + try await LaunchdAdmin.startOrInstall( + extraDaemonCandidates: Self.bundledDaemonCandidates(), + forceLegacy: true) + } + daemonNeedsApproval = false + daemonStoppedOnPurpose = false + } catch AgentService.Failure.needsApproval { + daemonNeedsApproval = true + daemonRecoveryError = AgentService.Failure.needsApproval.localizedDescription + } catch let error as WireError { + daemonRecoveryError = error.message + } catch { + daemonRecoveryError = error.localizedDescription + } + daemonRecovering = false + await refresh() } } + /** The version-matched devctld inside this app bundle's Resources, which is + the right install source when no LaunchAgent exists yet. */ + private static func bundledDaemonCandidates() -> [URL] { + guard + let url = Bundle.main.url( + forResource: SetupPlanner.resourceDaemonName, withExtension: nil) + else { return [] } + return [url] + } + func startServer(_ server: ServerStatus) { ProjectAccessLog.shared.record(projectPath: server.project) Task { diff --git a/Sources/DevCtlApp/DevCtlApp.swift b/Sources/DevCtlApp/DevCtlApp.swift index 1ef25cb..722a0c5 100644 --- a/Sources/DevCtlApp/DevCtlApp.swift +++ b/Sources/DevCtlApp/DevCtlApp.swift @@ -208,7 +208,9 @@ final class AppActivationDelegate: NSObject, NSApplicationDelegate, UNUserNotifi continue userActivity: NSUserActivity, restorationHandler: @escaping ([any NSUserActivityRestoring]) -> Void ) -> Bool { - guard userActivity.activityType == CSSearchableItemActionType, + let fromSpotlight = userActivity.activityType == CSSearchableItemActionType + let fromDonation = userActivity.activityType == SpotlightIndexer.activityType + guard fromSpotlight || fromDonation, let identifier = userActivity.userInfo?[CSSearchableItemActivityIdentifier] as? String, let url = SpotlightIndexer.url(forIdentifier: identifier) else { return false } @@ -217,6 +219,18 @@ final class AppActivationDelegate: NSObject, NSApplicationDelegate, UNUserNotifi return true } + /** MenuBarExtra is often foreground; without willPresent the SDK drops the + banner entirely (UNUserNotificationCenter.h). Prefer .banner/.list over + the deprecated .alert. */ + func userNotificationCenter( + _ center: UNUserNotificationCenter, + willPresent notification: UNNotification, + withCompletionHandler completionHandler: + @escaping (UNNotificationPresentationOptions) -> Void + ) { + completionHandler([.banner, .list, .sound]) + } + func userNotificationCenter( _ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, @@ -247,6 +261,7 @@ final class AppActivationDelegate: NSObject, NSApplicationDelegate, UNUserNotifi struct DevCtlApp: App { @NSApplicationDelegateAdaptor(AppActivationDelegate.self) private var appDelegate @State private var model = DaemonModel() + @State private var setupSession = SetupSession() /** Polling starts at launch, not first popover open: the collapsed label's presence dots must be live from the first frame. */ @@ -264,6 +279,7 @@ struct DevCtlApp: App { closures do not participate in Observation tracking, so counts read here directly would never re-render the collapsed label. */ PresenceLabel(model: model) + .background(SetupWindowOpener(session: setupSession)) } .menuBarExtraStyle(.window) @@ -271,6 +287,22 @@ struct DevCtlApp: App { DashboardView(model: model) } .defaultSize(width: 860, height: 560) + + Window(setupSession.migration || setupSession.replacingApplicationsApp + ? "Upgrade devctl" : "Install devctl", id: "setup") { + SetupPanel( + installAppToApplications: setupSession.installAppToApplications, + migration: setupSession.migration, + offers: setupSession.offers, + pathWarning: setupSession.pathWarning, + replacingApplicationsApp: setupSession.replacingApplicationsApp + ) { + setupSession.shouldPresent = false + SetupWindowCloser.close() + } + } + .windowResizability(.contentSize) + .defaultSize(width: 460, height: 420) } } @@ -312,8 +344,7 @@ struct MenuContent: View { var body: some View { VStack(alignment: .leading, spacing: 0) { if !model.daemonReachable { - Label("devctld is not running", systemImage: "bolt.slash") - .foregroundStyle(.secondary) + DaemonDownRow(model: model) .padding(12) } else if model.projects.isEmpty { VStack(alignment: .leading, spacing: 4) { @@ -420,6 +451,59 @@ struct MenuContent: View { } } +/** Shown when the socket does not answer. The app tries to bring the daemon + back on its own, so this states what is happening and still offers the + manual action: a deliberate `devctl daemon stop` suppresses auto recovery, + and a failed recovery needs somewhere to report. */ +struct DaemonDownRow: View { + var model: DaemonModel + + private var message: String { + if model.daemonRecovering { return "Starting devctld…" } + if model.daemonNeedsApproval { return "devctl needs your approval" } + if model.daemonStoppedOnPurpose { return "devctld is stopped" } + if model.daemonRecoveryError != nil { return "devctld is not running" } + return "devctld is not running; restarting" + } + + private var glyph: String { + if model.daemonRecovering { return "bolt" } + if model.daemonNeedsApproval { return "hand.raised" } + return "bolt.slash" + } + + var body: some View { + HStack(alignment: .firstTextBaseline, spacing: 8) { + VStack(alignment: .leading, spacing: 2) { + Label(message, systemImage: glyph) + .foregroundStyle(.secondary) + if let error = model.daemonRecoveryError { + Text(error) + .font(.caption) + .foregroundStyle(.secondary) + } + } + Spacer(minLength: 8) + /** Approval is the only action that can help while the switch is + off, so it replaces Start rather than sitting beside it. */ + if model.daemonNeedsApproval { + Button("Open Login Items") { + AgentService.openLoginItemsSettings() + } + .buttonStyle(.borderless) + .help("Turn on quantizor/devctl in System Settings") + } else { + Button("Start") { + model.startDaemon() + } + .buttonStyle(.borderless) + .disabled(model.daemonRecovering) + .help("Start devctld now") + } + } + } +} + struct ProjectSection: View { let filterText: String let keyNav: KeyNavModel diff --git a/Sources/DevCtlApp/SetupPanel.swift b/Sources/DevCtlApp/SetupPanel.swift new file mode 100644 index 0000000..6e0294b --- /dev/null +++ b/Sources/DevCtlApp/SetupPanel.swift @@ -0,0 +1,217 @@ +import DevCtlKit +import SwiftUI + +/** First-run / upgrade panel: clear checklist of what Confirm will do, then + opt-in harness hooks (default checked when install is still needed). */ +struct SetupPanel: View { + let installAppToApplications: Bool + let migration: Bool + let offers: [HarnessOffer] + let pathWarning: Bool + let replacingApplicationsApp: Bool + var onFinished: () -> Void + + @State private var busy = false + @State private var errorText: String? + @State private var finishedSummary: String? + @State private var selected: Set + @State private var willRelaunch = false + + init( + installAppToApplications: Bool, + migration: Bool, + offers: [HarnessOffer], + pathWarning: Bool, + replacingApplicationsApp: Bool, + onFinished: @escaping () -> Void + ) { + self.installAppToApplications = installAppToApplications + self.migration = migration + self.offers = offers + self.pathWarning = pathWarning + self.replacingApplicationsApp = replacingApplicationsApp + self.onFinished = onFinished + _selected = State( + initialValue: Set(offers.filter(\.defaultChecked).map(\.harness))) + } + + var body: some View { + VStack(alignment: .leading, spacing: 14) { + Text(migration || replacingApplicationsApp ? "Upgrade devctl" : "Install devctl") + .font(.title3.weight(.semibold)) + + Text("Confirm to apply the changes below. Nothing runs until you confirm.") + .foregroundStyle(.secondary) + .fixedSize(horizontal: false, vertical: true) + + VStack(alignment: .leading, spacing: 6) { + Text("This will:") + .font(.caption.weight(.semibold)) + .foregroundStyle(.secondary) + if installAppToApplications { + bullet( + replacingApplicationsApp + ? "Quit the running menu bar app (if any), then replace /Applications/devctl.app with this version" + : "Install the menu bar app at /Applications/devctl.app") + } + bullet( + migration + ? "Update the CLI at \(SetupPlanner.defaultCLIDirectory().path)" + : "Install the CLI at \(SetupPlanner.defaultCLIDirectory().path)") + bullet( + "Install or update the background daemon and restart it (your running servers stay)") + if selected.isEmpty { + bullet("Leave agent hooks unchanged (none selected below)") + } else { + let names = offers.filter { selected.contains($0.harness) }.map(\.displayName) + bullet("Install agent hooks for: \(names.joined(separator: ", "))") + } + if installAppToApplications { + bullet("Relaunch from Applications when finished") + } + } + .font(.callout) + .fixedSize(horizontal: false, vertical: true) + + if pathWarning { + Label( + "\(SetupPlanner.defaultCLIDirectory().path) is not on your PATH. Add it after setup so shells find `devctl`.", + systemImage: "exclamationmark.triangle") + .font(.caption) + .foregroundStyle(.secondary) + .fixedSize(horizontal: false, vertical: true) + } + + if !offers.isEmpty { + VStack(alignment: .leading, spacing: 8) { + Text("Agent hooks (optional)") + .font(.caption.weight(.semibold)) + .foregroundStyle(.secondary) + ForEach(offers, id: \.harness) { offer in + Toggle(isOn: binding(for: offer)) { + HStack(spacing: 6) { + Text("Install \(offer.displayName) hook") + if offer.alreadyInstalled { + Text("already installed") + .font(.caption2) + .foregroundStyle(.tertiary) + } + } + } + .toggleStyle(.checkbox) + .disabled(busy || offer.alreadyInstalled) + } + } + } + + if let errorText { + Text(errorText) + .font(.caption) + .foregroundStyle(.red) + .textSelection(.enabled) + .fixedSize(horizontal: false, vertical: true) + } + + if let finishedSummary { + Text(finishedSummary) + .font(.caption) + .foregroundStyle(.secondary) + .textSelection(.enabled) + .fixedSize(horizontal: false, vertical: true) + } + + HStack { + Spacer() + if finishedSummary == nil { + Button(busy ? "Working…" : "Confirm") { runSetup() } + .keyboardShortcut(.defaultAction) + .disabled(busy) + } else if willRelaunch { + Button("Relaunch from Applications") { + SetupPerformer.relaunchFromApplicationsAndQuit() + } + .keyboardShortcut(.defaultAction) + } else { + Button("Done") { onFinished() } + .keyboardShortcut(.defaultAction) + } + } + } + .padding(20) + .frame(width: 460) + .opacity(busy ? 0.7 : 1) + } + + private func bullet(_ text: String) -> some View { + HStack(alignment: .top, spacing: 6) { + Text("•") + Text(text) + .fixedSize(horizontal: false, vertical: true) + } + } + + private func binding(for offer: HarnessOffer) -> Binding { + Binding( + get: { selected.contains(offer.harness) }, + set: { on in + if on { selected.insert(offer.harness) } else { selected.remove(offer.harness) } + }) + } + + private func runSetup() { + busy = true + errorText = nil + let harnesses = selected + let relocate = installAppToApplications + Task { @MainActor in + if relocate { + /** Drop the SMAppService registration while the on-disk helper + still matches BTM's CDHash. Replacing the ad-hoc signed + bundle first, then re-registering, is what produced the + Launch Constraint Violation crashes. */ + if replacingApplicationsApp { + _ = LaunchdAdmin.requestAppAgentUnregister() + let unloaded = await LaunchdAdmin.waitUntilAgentUnloaded() + if !unloaded { + errorText = + "Could not stop the background agent before replacing the app. Quit quantizor/devctl from Activity Monitor (or turn it off in Login Items), then try again." + busy = false + return + } + do { + try LaunchdAdmin.markAgentRebindNeeded() + } catch { + errorText = + "Could not prepare the daemon rebind marker: \(error.localizedDescription)" + busy = false + return + } + /** Unregister wrote stopped.intent; clear it so the + Applications copy is allowed to register after settle. */ + try? FileManager.default.removeItem(at: DevCtlPaths().stoppedIntentFile) + } + await SetupPerformer.quitOtherInstances() + } + do { + let result = try await Task.detached(priority: .userInitiated) { + try await SetupPerformer.run( + selectedHarnesses: harnesses, + installAppToApplications: relocate) + }.value + let lines = result.notes + result.harnessSummaries + let summary = lines.isEmpty ? "Setup complete." : lines.joined(separator: "\n") + finishedSummary = summary + willRelaunch = result.relocatedToApplications + busy = false + if result.relocatedToApplications { + /** Short beat so the summary is readable, then hand off. */ + try? await Task.sleep(for: .milliseconds(600)) + SetupPerformer.relaunchFromApplicationsAndQuit() + } + } catch { + errorText = error.localizedDescription + busy = false + } + } + } +} diff --git a/Sources/DevCtlApp/SetupPerformer.swift b/Sources/DevCtlApp/SetupPerformer.swift new file mode 100644 index 0000000..9afb105 --- /dev/null +++ b/Sources/DevCtlApp/SetupPerformer.swift @@ -0,0 +1,355 @@ +import AppKit +import DevCtlKit +import Foundation + +/** Performs first-run / upgrade install from the app bundle Resources. Copies + the app into /Applications when needed, installs CLI + daemon, then optional + harness hooks. File I/O is nonisolated; quitting peers / relaunch is MainActor. */ +enum SetupPerformer: Sendable { + static let appBundleIdentifier = "dev.quantizor.devctl.app" + + struct Result: Sendable { + var cliOnPATH: Bool + var harnessSummaries: [String] + var migration: Bool + var notes: [String] + var relocatedToApplications: Bool + } + + struct Presentation: Sendable { + var installAppToApplications: Bool + var migration: Bool + var offers: [HarnessOffer] + var pathWarning: Bool + var replacingApplicationsApp: Bool + var shouldPresent: Bool + } + + enum Failure: Error, LocalizedError, Sendable { + case missingResources + case commandFailed(command: String, status: Int32, output: String) + case appInstallFailed(String) + case agentRegisterFailed(String) + + var errorDescription: String? { + switch self { + case .missingResources: + return "This copy of devctl.app is missing its bundled CLI and daemon. Reinstall from the DMG or run make app." + case .commandFailed(let command, let status, let output): + let detail = output.trimmingCharacters(in: .whitespacesAndNewlines) + if detail.isEmpty { + return "\(command) failed (exit \(status))." + } + return "\(command) failed (exit \(status)): \(detail)" + case .appInstallFailed(let message): + return message + case .agentRegisterFailed(let message): + return message + } + } + } + + nonisolated static func resourceURLs(bundle: Bundle = .main) -> (cli: URL, daemon: URL)? { + guard let cli = bundle.url(forResource: SetupPlanner.resourceCLIName, withExtension: nil), + let daemon = bundle.url(forResource: SetupPlanner.resourceDaemonName, withExtension: nil), + FileManager.default.isExecutableFile(atPath: cli.path), + FileManager.default.isExecutableFile(atPath: daemon.path) + else { return nil } + return (cli, daemon) + } + + nonisolated static func bundledVersion(bundle: Bundle = .main) -> String { + if let short = bundle.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String, + !short.isEmpty + { + return short + } + return DevCtlVersion.version + } + + nonisolated static func evaluatePresentation( + bundle: Bundle = .main, paths: DevCtlPaths = DevCtlPaths() + ) -> Presentation { + let resources = resourceURLs(bundle: bundle) != nil + let bundled = bundledVersion(bundle: bundle) + let cliURL = SetupPlanner.installedCLIURL() + let installedVersion = readCLIVersion(at: cliURL) + let stamp = SetupPlanner.readStamp(at: SetupPlanner.stampURL(paths: paths)) + let outside = SetupPlanner.isRunningOutsideApplications( + bundlePath: bundle.bundleURL.path) + let should = SetupPlanner.shouldPresent( + bundledVersion: bundled, + installedCLIVersion: installedVersion, + stampVersion: stamp, + resourcesPresent: resources, + runningOutsideApplications: outside) + let agentPlist = FileManager.default.homeDirectoryForCurrentUser + .appending(path: "Library/LaunchAgents/dev.quantizor.devctl.plist") + let migration = SetupPlanner.isMigration( + installedCLIExists: FileManager.default.isExecutableFile(atPath: cliURL.path), + stampExists: stamp != nil, + launchAgentExists: FileManager.default.fileExists(atPath: agentPlist.path)) + let offers = SetupPlanner.harnessOffers(installedCLIPath: cliURL.path) + let pathWarning = !SetupPlanner.cliDirectoryOnPATH( + pathEnv: ProcessInfo.processInfo.environment["PATH"]) + return Presentation( + installAppToApplications: outside, + migration: migration, + offers: offers, + pathWarning: pathWarning, + replacingApplicationsApp: outside && SetupPlanner.applicationsAppExists(), + shouldPresent: should) + } + + /** Install app (when needed), CLI, register the SMAppService agent from + this process when the bundle can host it, then checked hooks. + Call `quitOtherInstances` on the MainActor before this when relocating. */ + nonisolated static func run( + selectedHarnesses: Set, + installAppToApplications: Bool, + bundle: Bundle = .main + ) async throws -> Result { + guard let resources = resourceURLs(bundle: bundle) else { throw Failure.missingResources } + let paths = DevCtlPaths() + let cliDest = SetupPlanner.installedCLIURL() + let daemonSibling = SetupPlanner.installedDaemonSiblingURL() + let fm = FileManager.default + let migration = SetupPlanner.isMigration( + installedCLIExists: fm.isExecutableFile(atPath: cliDest.path), + stampExists: SetupPlanner.readStamp(at: SetupPlanner.stampURL(paths: paths)) != nil, + launchAgentExists: fm.fileExists( + atPath: fm.homeDirectoryForCurrentUser + .appending(path: "Library/LaunchAgents/dev.quantizor.devctl.plist").path)) + + var notes: [String] = [] + var relocated = false + + /** Running setup is intent to run the daemon, so a leftover + deliberate-stop marker from an earlier `daemon stop` / uninstall must + not suppress registration (in the relocated case the Applications + copy reads this marker at launch, long after this process is gone). */ + try? fm.removeItem(at: paths.stoppedIntentFile) + + if installAppToApplications { + let destination = URL(fileURLWithPath: SetupPlanner.applicationsAppPath) + let replacing = fm.fileExists(atPath: destination.path) + do { + try SetupPlanner.installAppBundle(from: bundle.bundleURL, to: destination) + } catch { + throw Failure.appInstallFailed( + "Could not place the app at \(destination.path): \(error.localizedDescription). Quit any open copy of devctl and try again.") + } + relocated = true + notes.append( + replacing + ? "Updated the menu bar app at \(destination.path)." + : "Installed the menu bar app at \(destination.path).") + } + + if migration { + notes.append("Migrating the existing CLI and daemon to this version.") + } + + try SetupPlanner.installBinary(from: resources.cli, to: cliDest) + try SetupPlanner.installBinary(from: resources.daemon, to: daemonSibling) + notes.append("Installed CLI to \(cliDest.path)") + + /** SMAppService must run with Bundle.main as the hosting app. After a + relocate, the Applications copy registers on launch; otherwise do it + here (and reregister on upgrade so the helper/plist swap sticks). */ + if !relocated { + do { + try LaunchdAdmin.writeAgentPath(paths: paths) + if migration { + try await AgentService.reregister() + } else { + try AgentService.register() + } + try await LaunchdAdmin.pollHello(paths: paths, timeoutSeconds: 8) + notes.append("Daemon registered via Login Items.") + } catch AgentService.Failure.needsApproval { + /** Not a failed install: the job is registered and one switch + away from running, and Login Items is already open. */ + notes.append(AgentService.Failure.needsApproval.localizedDescription) + } catch { + throw Failure.agentRegisterFailed( + "Could not register the background agent: \(error.localizedDescription). Check System Settings > General > Login Items & Extensions.") + } + } else { + notes.append( + "The copy in Applications registers the daemon when it launches. If macOS asks, allow quantizor/devctl in Login Items.") + } + + var harnessSummaries: [String] = [] + for harness in selectedHarnesses.sorted() { + let out = try runCLI(cliDest, arguments: ["hook", "install", "--harness", harness]) + harnessSummaries.append(out.isEmpty ? "Installed \(harness) hook" : out) + } + + try SetupPlanner.writeStamp( + version: bundledVersion(bundle: bundle), to: SetupPlanner.stampURL(paths: paths)) + + let onPATH = SetupPlanner.cliDirectoryOnPATH( + pathEnv: ProcessInfo.processInfo.environment["PATH"]) + if !onPATH { + notes.append( + "\(SetupPlanner.defaultCLIDirectory().path) is not on your PATH. Add it so shells and agents can find `devctl`.") + } + + return Result( + cliOnPATH: onPATH, + harnessSummaries: harnessSummaries, + migration: migration, + notes: notes, + relocatedToApplications: relocated) + } + + /** Quit every other running copy so /Applications/devctl.app can be replaced. */ + @MainActor + static func quitOtherInstances() async { + let peers = NSWorkspace.shared.runningApplications.filter { + $0.bundleIdentifier == appBundleIdentifier && $0 != .current + } + for app in peers { + app.terminate() + } + let deadline = Date().addingTimeInterval(5) + while Date() < deadline { + let still = NSWorkspace.shared.runningApplications.contains { + $0.bundleIdentifier == appBundleIdentifier && $0 != .current + } + if !still { return } + try? await Task.sleep(for: .milliseconds(100)) + } + for app in NSWorkspace.shared.runningApplications + where app.bundleIdentifier == appBundleIdentifier && app != .current { + app.forceTerminate() + } + try? await Task.sleep(for: .milliseconds(200)) + } + + /** Open the Applications copy and quit this (DMG/Downloads) process. Quitting + is conditional: Launch Services treats the DMG and Applications copies as + the same app (shared bundle id), so `openApplication` can return *this* + process as a "success". We only quit once a different pid is running from + the Applications path. */ + @MainActor + static func relaunchFromApplicationsAndQuit() { + let url = URL(fileURLWithPath: SetupPlanner.applicationsAppPath) + let appsPath = url.resolvingSymlinksInPath().standardizedFileURL.path + let selfPID = ProcessInfo.processInfo.processIdentifier + let configuration = NSWorkspace.OpenConfiguration() + configuration.activates = true + /** Force a new instance: without this, openApplication often "succeeds" + by activating the already-running DMG copy (same bundle id). */ + configuration.createsNewApplicationInstance = true + NSWorkspace.shared.openApplication(at: url, configuration: configuration) { app, error in + Task { @MainActor in + if let error { + DevCtlLog.app.error( + "relaunch from \(SetupPlanner.applicationsAppPath) failed: \(error.localizedDescription)") + return + } + let launchedPath = app?.bundleURL? + .resolvingSymlinksInPath().standardizedFileURL.path + let differentProcess = (app?.processIdentifier).map { $0 != selfPID } ?? false + if differentProcess, launchedPath == appsPath { + NSApp.terminate(nil) + return + } + DevCtlLog.app.info( + "openApplication returned self or wrong path; waiting for Applications peer") + let deadline = Date().addingTimeInterval(8) + while Date() < deadline { + let peer = NSWorkspace.shared.runningApplications.first { running in + guard running.bundleIdentifier == appBundleIdentifier else { return false } + guard running.processIdentifier != selfPID else { return false } + let path = running.bundleURL? + .resolvingSymlinksInPath().standardizedFileURL.path + return path == appsPath + } + if peer != nil { + NSApp.terminate(nil) + return + } + try? await Task.sleep(for: .milliseconds(100)) + } + /** Last resort: `open(1)` bypasses some LS same-bundle shortcuts. */ + let open = LaunchdAdmin.shell("/usr/bin/open", [SetupPlanner.applicationsAppPath]) + if open.status == 0 { + let openDeadline = Date().addingTimeInterval(5) + while Date() < openDeadline { + let peer = NSWorkspace.shared.runningApplications.contains { running in + guard running.bundleIdentifier == appBundleIdentifier else { + return false + } + guard running.processIdentifier != selfPID else { return false } + let path = running.bundleURL? + .resolvingSymlinksInPath().standardizedFileURL.path + return path == appsPath + } + if peer { + NSApp.terminate(nil) + return + } + try? await Task.sleep(for: .milliseconds(100)) + } + } + DevCtlLog.app.error( + "could not hand off to \(SetupPlanner.applicationsAppPath); staying alive so setup is not lost") + } + } + } + + nonisolated private static func readCLIVersion(at url: URL) -> String? { + guard FileManager.default.isExecutableFile(atPath: url.path) else { return nil } + let proc = Process() + proc.executableURL = url + proc.arguments = ["--version"] + let pipe = Pipe() + proc.standardOutput = pipe + proc.standardError = Pipe() + do { + try proc.run() + proc.waitUntilExit() + } catch { + return nil + } + guard proc.terminationStatus == 0 else { return nil } + let data = pipe.fileHandleForReading.readDataToEndOfFile() + let text = String(data: data, encoding: .utf8)? + .trimmingCharacters(in: .whitespacesAndNewlines) + return (text?.isEmpty == false) ? text : nil + } + + nonisolated private static func runCLI(_ cli: URL, arguments: [String]) throws -> String { + let proc = Process() + proc.executableURL = cli + proc.arguments = arguments + let out = Pipe() + let err = Pipe() + proc.standardOutput = out + proc.standardError = err + do { + try proc.run() + proc.waitUntilExit() + } catch { + throw Failure.commandFailed( + command: ([cli.path] + arguments).joined(separator: " "), + status: -1, + output: error.localizedDescription) + } + let stdout = String(data: out.fileHandleForReading.readDataToEndOfFile(), encoding: .utf8) + ?? "" + let stderr = String(data: err.fileHandleForReading.readDataToEndOfFile(), encoding: .utf8) + ?? "" + let combined = (stdout + stderr).trimmingCharacters(in: .whitespacesAndNewlines) + guard proc.terminationStatus == 0 else { + throw Failure.commandFailed( + command: ([cli.path] + arguments).joined(separator: " "), + status: proc.terminationStatus, + output: combined) + } + return combined + } +} diff --git a/Sources/DevCtlApp/SetupSession.swift b/Sources/DevCtlApp/SetupSession.swift new file mode 100644 index 0000000..e08c22d --- /dev/null +++ b/Sources/DevCtlApp/SetupSession.swift @@ -0,0 +1,53 @@ +import AppKit +import DevCtlKit +import Observation +import SwiftUI + +/** Shared first-run / upgrade gate evaluated once at launch. */ +@Observable +final class SetupSession { + var installAppToApplications = false + var migration = false + var offers: [HarnessOffer] = [] + var pathWarning = false + var replacingApplicationsApp = false + var shouldPresent = false + + func evaluate() { + let eval = SetupPerformer.evaluatePresentation() + installAppToApplications = eval.installAppToApplications + migration = eval.migration + offers = eval.offers + pathWarning = eval.pathWarning + replacingApplicationsApp = eval.replacingApplicationsApp + shouldPresent = eval.shouldPresent + } +} + +/** Opens the setup window from a view that has `openWindow` (the menu bar label). */ +struct SetupWindowOpener: View { + @Environment(\.openWindow) private var openWindow + var session: SetupSession + @State private var didOpen = false + + var body: some View { + Color.clear + .frame(width: 0, height: 0) + .onAppear { + session.evaluate() + guard session.shouldPresent, !didOpen else { return } + didOpen = true + openWindow(id: "setup") + NSApp.activate(ignoringOtherApps: true) + } + } +} + +/** Close the setup SwiftUI window by id (macOS 14-safe; dismissWindow is 15+). */ +enum SetupWindowCloser { + static func close() { + for window in NSApp.windows where window.identifier?.rawValue == "setup" { + window.close() + } + } +} diff --git a/Sources/DevCtlApp/SpotlightIndexer.swift b/Sources/DevCtlApp/SpotlightIndexer.swift index c522538..693cda8 100644 --- a/Sources/DevCtlApp/SpotlightIndexer.swift +++ b/Sources/DevCtlApp/SpotlightIndexer.swift @@ -1,110 +1,156 @@ import AppKit -import CoreSpotlight +@preconcurrency import CoreSpotlight import DevCtlKit import Foundation /** Spotlight integration: every server and every head becomes a searchable item ("candor · operator" opens the surface). Titles lead with the project/head; `devctl` lives in the subtitle. Ranking above filesystem Top Hits is not - something Core Spotlight can force; this is best-effort discovery, not a - launcher. Raycast/Alfred + `devctl://` is the fast path. */ + something Core Spotlight can force; within our own items we preserve + last-used engagement across syncs, update in place instead of wipe-rebuild, + and tier `rankingHint` by live/pinned. Raycast/Alfred + `devctl://` is the + fast path. */ enum SpotlightIndexer { /** nonisolated: read inside the (nonisolated) index completion callback. */ nonisolated static let domain = "devctl-servers" - /** Donated on open so Siri / Spotlight can predict the surface; the type is - opaque since continuation runs through CSSearchableItemActionType, not this. */ + /** Donated on open so Spotlight can re-surface the item; continue accepts + both CSSearchableItemActionType and this type. */ static let activityType = "dev.quantizor.devctl.open-surface" private static let entriesKey = "spotlight entries" private static let signatureKey = "spotlight signature" /** nonisolated: written inside the (nonisolated) index completion callback. */ nonisolated private static let statusKey = "spotlight last sync" - private static let baseRankingHint = 90 - private static let pinnedRankingHint = 100 - + /** Persisted in UserDefaults; new fields stay optional so older payloads keep + decoding (defensive-load rule). */ struct SpotlightEntry: Codable, Sendable { + var alternateNames: [String]? + var firstSeen: Date? let icon: String? let keywords: [String] + var lastUsed: Date? let rankingHint: Int let title: String let url: String } + /** Named index so Spotlight can batch; default() forbids batching. */ + nonisolated private static let index = CSSearchableIndex(name: "devctl-servers") + private static var currentActivity: NSUserActivity? static func sync(projects: [DaemonModel.ProjectGroup]) { + guard CSSearchableIndex.isIndexingAvailable() else { + UserDefaults.standard.set("unavailable", forKey: statusKey) + return + } HeadPins.shared.reconcile(projects: projects) let pins = HeadPins.shared + let previous = loadEntries() + let now = Date() var entriesByIdentifier: [String: SpotlightEntry] = [:] - var payload: [(identifier: String, entry: SpotlightEntry)] = [] + var payload: [(identifier: String, entry: SpotlightEntry, existed: Bool)] = [] for project in projects { for server in project.servers { if let url = server.url { let identifier = "\(project.path)::\(server.server)" + let prior = previous[identifier] + let names = SpotlightLabel.alternateNames( + project: project.name, server: server.server, head: nil, url: url) let entry = SpotlightEntry( + alternateNames: names, + firstSeen: prior?.firstSeen ?? now, icon: server.icon, keywords: SpotlightLabel.keywords( project: project.name, server: server.server, head: nil, url: url), - rankingHint: baseRankingHint, + lastUsed: prior?.lastUsed, + rankingHint: SpotlightLabel.rankingHint(phase: server.phase, pinned: false), title: SpotlightLabel.title( project: project.name, server: server.server, head: nil), url: url) entriesByIdentifier[identifier] = entry - payload.append((identifier, entry)) + payload.append((identifier, entry, prior != nil)) } for (head, url) in server.heads ?? [:] { let identifier = "\(project.path)::\(server.server)::\(head)" + let prior = previous[identifier] let pinned = pins.isPinned(project: project.path, server: server.server, head: head) + let names = SpotlightLabel.alternateNames( + project: project.name, server: server.server, head: head, url: url) let entry = SpotlightEntry( + alternateNames: names, + firstSeen: prior?.firstSeen ?? now, icon: server.icon, keywords: SpotlightLabel.keywords( project: project.name, server: server.server, head: head, url: url), - rankingHint: pinned ? pinnedRankingHint : baseRankingHint, + lastUsed: prior?.lastUsed, + rankingHint: SpotlightLabel.rankingHint(phase: server.phase, pinned: pinned), title: SpotlightLabel.title( project: project.name, server: server.server, head: head), url: url) entriesByIdentifier[identifier] = entry - payload.append((identifier, entry)) + payload.append((identifier, entry, prior != nil)) } } } - let signature = "v6-cs-only|" + payload.map { - "\($0.identifier)#\($0.entry.title)#\($0.entry.url)#\($0.entry.icon ?? "")#\($0.entry.rankingHint)#\($0.entry.keywords.joined(separator: ","))" + let signature = "v7-cs-incremental|" + payload.map { + "\($0.identifier)#\($0.entry.title)#\($0.entry.url)#\($0.entry.icon ?? "")#\($0.entry.rankingHint)#\($0.entry.keywords.joined(separator: ","))#\(($0.entry.alternateNames ?? []).joined(separator: ","))" }.sorted().joined(separator: "|") guard signature != UserDefaults.standard.string(forKey: signatureKey) else { return } if let data = try? JSONCoding.encoder().encode(entriesByIdentifier) { UserDefaults.standard.set(data, forKey: entriesKey) } UserDefaults.standard.set(signature, forKey: signatureKey) - let items = payload - CSSearchableIndex.default().deleteSearchableItems(withDomainIdentifiers: [domain]) { _ in - let built = items.map { element -> CSSearchableItem in - let item = CSSearchableItem( - uniqueIdentifier: element.identifier, - domainIdentifier: domain, - attributeSet: attributeSet(for: element.entry)) - item.expirationDate = .distantFuture - return item - } - let count = built.count - CSSearchableIndex.default().indexSearchableItems(built) { error in - UserDefaults.standard.set( - error.map { "error: \($0.localizedDescription)" } - ?? "ok \(count) items \(JSONCoding.formatISO8601(Date()))", - forKey: statusKey) + + let removed = Set(previous.keys).subtracting(entriesByIdentifier.keys) + let built = payload.map { element -> CSSearchableItem in + let item = CSSearchableItem( + uniqueIdentifier: element.identifier, + domainIdentifier: domain, + attributeSet: attributeSet(for: element.entry)) + item.expirationDate = .distantFuture + item.isUpdate = element.existed + return item + } + let count = built.count + let finish: @Sendable (Error?) -> Void = { error in + UserDefaults.standard.set( + error.map { "error: \($0.localizedDescription)" } + ?? "ok \(count) items \(JSONCoding.formatISO8601(Date()))", + forKey: statusKey) + } + if removed.isEmpty { + index.indexSearchableItems(built, completionHandler: finish) + } else { + let toIndex = built + index.deleteSearchableItems(withIdentifiers: Array(removed)) { + deleteError in + if let deleteError { + finish(deleteError) + return + } + index.indexSearchableItems(toIndex, completionHandler: finish) } } } static func noteOpened(identifier: String) { - guard let entry = loadEntries()[identifier] else { return } + guard var entry = loadEntries()[identifier] else { return } + let now = Date() + entry.lastUsed = now + if entry.firstSeen == nil { entry.firstSeen = now } + var map = loadEntries() + map[identifier] = entry + if let data = try? JSONCoding.encoder().encode(map) { + UserDefaults.standard.set(data, forKey: entriesKey) + } let item = CSSearchableItem( uniqueIdentifier: identifier, domainIdentifier: domain, - attributeSet: attributeSet(for: entry, lastUsed: Date())) + attributeSet: attributeSet(for: entry, lastUsed: now)) item.isUpdate = true item.expirationDate = .distantFuture - CSSearchableIndex.default().indexSearchableItems([item]) { _ in } + index.indexSearchableItems([item]) { _ in } donateActivity(identifier: identifier, entry: entry) } @@ -113,17 +159,27 @@ enum SpotlightIndexer { ) -> CSSearchableItemAttributeSet { /** `.text` surfaces on macOS; `.url` often indexes "ok" but never appears. */ let attributes = CSSearchableItemAttributeSet(contentType: .text) - attributes.displayName = entry.title - attributes.title = entry.title - attributes.contentDescription = SpotlightLabel.subtitle(url: entry.url) - attributes.textContent = "\(entry.title)\n\(SpotlightLabel.subtitle(url: entry.url))" + let created = entry.firstSeen ?? Date() + let used = lastUsed ?? entry.lastUsed + if let names = entry.alternateNames, !names.isEmpty { + attributes.alternateNames = names + } attributes.containerDisplayName = "devctl" - attributes.kind = "Dev Server" + attributes.contentCreationDate = created + attributes.contentDescription = SpotlightLabel.subtitle(url: entry.url) + attributes.contentModificationDate = used ?? created + attributes.displayName = entry.title attributes.keywords = entry.keywords + attributes.kind = "Dev Server" + if let used { attributes.lastUsedDate = used } + attributes.metadataModificationDate = Date() + attributes.organizations = ["devctl"] attributes.rankingHint = NSNumber(value: entry.rankingHint) + attributes.subject = entry.title + attributes.textContent = "\(entry.title)\n\(SpotlightLabel.subtitle(url: entry.url))" attributes.thumbnailData = entry.icon.flatMap(Self.thumbnailPNG) + attributes.title = entry.title attributes.url = URL(string: entry.url) - if let lastUsed { attributes.lastUsedDate = lastUsed } return attributes } @@ -132,8 +188,11 @@ enum SpotlightIndexer { activity.title = entry.title activity.keywords = Set(entry.keywords) activity.userInfo = [CSSearchableItemActivityIdentifier: identifier] + activity.isEligibleForHandoff = false activity.isEligibleForSearch = true activity.persistentIdentifier = identifier + activity.targetContentIdentifier = identifier + activity.expirationDate = .distantFuture if let url = URL(string: entry.url) { activity.webpageURL = url } let attributes = attributeSet(for: entry, lastUsed: Date()) attributes.relatedUniqueIdentifier = identifier @@ -152,14 +211,10 @@ enum SpotlightIndexer { nonisolated static func thumbnailPNG(path: String) -> Data? { guard let image = NSImage(contentsOfFile: path) else { return nil } let side: CGFloat = 128 - let target = NSImage(size: NSSize(width: side, height: side)) - target.lockFocus() - image.draw( - in: NSRect(x: 0, y: 0, width: side, height: side), - from: .zero, - operation: .sourceOver, - fraction: 1) - target.unlockFocus() + let target = NSImage(size: NSSize(width: side, height: side), flipped: false) { rect in + image.draw(in: rect, from: .zero, operation: .sourceOver, fraction: 1) + return true + } guard let tiff = target.tiffRepresentation, let bitmap = NSBitmapImageRep(data: tiff) else { return nil } diff --git a/Sources/DevCtlDaemonCore/Control/ControlServer.swift b/Sources/DevCtlDaemonCore/Control/ControlServer.swift index aebd8e5..176b50c 100644 --- a/Sources/DevCtlDaemonCore/Control/ControlServer.swift +++ b/Sources/DevCtlDaemonCore/Control/ControlServer.swift @@ -12,8 +12,9 @@ public actor Router { private var supervisors: [String: ServerSupervisor] = [:] /** devservers.json views cached by mtime; a save invalidates naturally. */ private var configCache: [String: (mtime: Date, view: ProjectConfigView)] = [:] - /** Held resource locks keyed `project::resource`; stale holders (dead pids) - evaporate on access, so a crashed harness never wedges a resource. */ + /** Held resource locks keyed `project::resource`. Persisted to locks.json so + a daemon crash mid-hold can still resume the paused servers when the + holder is gone. Stale holders (dead pids) evaporate on access. */ private var resourceLocks: [String: LockHolder] = [:] public init(launcher: any ProcessLauncher, paths: DevCtlPaths, registry: Registry) { @@ -21,6 +22,8 @@ public actor Router { self.launcher = launcher self.paths = paths self.registry = registry + self.resourceLocks = + AtomicFile.loadDefensively(LocksFile.self, from: paths.locksFile)?.locks ?? [:] } /** Decodes the typed request for `method` and returns the encoded response @@ -49,7 +52,7 @@ public actor Router { /** Deliberate shutdown stays down: the intent marker keeps auto-bootstrap from resurrecting the daemon, and exit 0 satisfies KeepAlive={SuccessfulExit:false}. */ - try? Data().write(to: await self.paths.stoppedIntentFile) + try? Data().write(to: self.paths.stoppedIntentFile) await self.exitDaemon() } return frame @@ -67,7 +70,7 @@ public actor Router { let supervisor = try await resolvedSupervisor(target) await recordTrustIfNeeded(project: target.project, name: target.name, fileNames: merged.fileNames) if let spec = merged.specs.first(where: { $0.name == target.name }) { - try lockGate(project: target.project, spec: spec) + try await lockGate(project: target.project, spec: spec) } try await portPreCheck(target: target, supervisor: supervisor) let result = await supervisor.ensure(timeoutSeconds: request.params.timeoutSeconds) @@ -81,7 +84,7 @@ public actor Router { await recordTrustIfNeeded( project: request.params.project, name: request.params.name, fileNames: merged.fileNames) if let spec = merged.specs.first(where: { $0.name == request.params.name }) { - try lockGate(project: request.params.project, spec: spec) + try await lockGate(project: request.params.project, spec: spec) } try await portPreCheck(target: request.params, supervisor: supervisor) return try respond(id: head.id, result: ServerResult(server: await supervisor.start())) @@ -169,22 +172,12 @@ public actor Router { id: head.id, result: EnsureResult(reason: reason, server: await supervisor.status())) case .lockAcquire: let request = try decoder.decode(WireRequest.self, from: line) - let key = "\(request.params.project)::\(request.params.resource)" - if let holder = liveLockHolder(key: key), holder.pid != request.params.holderPid { - throw WireError( - code: .resourceLocked, - hint: "wait for pid \(holder.pid) to finish, or verify it: ps -p \(holder.pid)", - message: "resource '\(request.params.resource)' is locked by pid \(holder.pid) since \(JSONCoding.formatISO8601(holder.since))") - } - resourceLocks[key] = LockHolder(pid: request.params.holderPid, since: Date()) - return try respond(id: head.id, result: WireEmpty()) + let result = try await acquireLock(request.params) + return try respond(id: head.id, result: result) case .lockRelease: let request = try decoder.decode(WireRequest.self, from: line) - let key = "\(request.params.project)::\(request.params.resource)" - if resourceLocks[key]?.pid == request.params.holderPid { - resourceLocks[key] = nil - } - return try respond(id: head.id, result: WireEmpty()) + let result = try await releaseLock(request.params) + return try respond(id: head.id, result: result) case .logsQuery: let request = try decoder.decode(WireRequest.self, from: line) let target = ServerTargetParams(name: request.params.name, project: request.params.project) @@ -296,14 +289,15 @@ public actor Router { } } - /** Startup recovery: reconcile persisted state with reality, then restore - boot intent. A recorded pid that is gone becomes crashed(daemon-restart); + /** Startup recovery: reconcile persisted locks first, then restore servers + with boot intent. A recorded pid that is gone becomes crashed(daemon-restart); a live orphan (its spool fd kept it healthy while the daemon was away) is group-killed, since exit forensics are unknowable for non-children. Never adopted silently. What comes back: any server whose start intent survives (resumeOnBoot), which a machine shutdown's drain leaves set, plus the classic daemon-crash case of a phase left running/starting. A deliberate - stop clears the flag, so only those stay down. + stop clears the flag, so only those stay down. Servers still paused under + a live resource lock are left alone: starting them would fight the harness. Specs resolve through the merged view (devservers.json + ad-hoc registry), the same path ensure/status use. Config-defined servers are never written @@ -311,6 +305,8 @@ public actor Router { committed server on boot. A rename/delete with no matching spec drops the orphaned state row instead of retrying forever. */ public func recoverAtStartup() async { + await reconcileLocksAtStartup() + var toStart: [(project: String, spec: ServerSpec)] = [] for (id, persisted) in await registry.allPersistedState() { guard let separator = id.range(of: "::") else { continue } let project = String(id[id.startIndex.. LockHolder? { - guard let holder = resourceLocks[key] else { return nil } - guard kill(pid_t(holder.pid), 0) == 0 else { + /** Acquire: refuse if another live holder owns it, pause active declarers + without retiring boot intent, persist the hold, return who was paused. */ + private func acquireLock(_ params: LockParams) async throws -> LockResult { + let key = "\(params.project)::\(params.resource)" + await releaseOrphanedLock(key: key) + if let holder = resourceLocks[key], holder.pid != params.holderPid { + throw WireError( + code: .resourceLocked, + hint: "wait for pid \(holder.pid) to finish, or verify it: ps -p \(holder.pid)", + message: + "resource '\(params.resource)' is locked by pid \(holder.pid) since \(JSONCoding.formatISO8601(holder.since))" + ) + } + /** Same holder re-acquiring (retry after a blip) keeps the existing pause + set rather than double-stopping. */ + if let existing = resourceLocks[key], existing.pid == params.holderPid { + return LockResult(paused: existing.paused) + } + var paused: [String] = [] + let merged = try? await mergedSpecs(project: params.project) + for spec in merged?.specs ?? [] where (spec.locks ?? []).contains(params.resource) { + let supervisor = await supervisor(project: params.project, spec: spec) + let status = await supervisor.status() + switch status.phase { + case .running, .starting, .unhealthy, .stopping: + /** Non-retiring stop: boot intent survives so a daemon crash + mid-hold can still bring the server back if the holder is gone. */ + _ = await supervisor.stop(deliberate: false) + paused.append(spec.name) + DevCtlLog.daemon.info( + "lock \(params.resource) paused \(spec.name)@\(params.project)") + case .stopped, .crashed, .failed: + break + } + } + paused.sort() + resourceLocks[key] = LockHolder( + paused: paused, pid: params.holderPid, + resumeTimeoutSeconds: params.resumeTimeoutSeconds, since: Date()) + persistLocks() + return LockResult(paused: paused) + } + + /** Release: only the matching holder clears the lock; then ensure everyone + that was paused. */ + private func releaseLock(_ params: LockParams) async throws -> LockResult { + let key = "\(params.project)::\(params.resource)" + guard let holder = resourceLocks[key], holder.pid == params.holderPid else { + return LockResult(paused: []) + } + resourceLocks[key] = nil + persistLocks() + let timeout = params.resumeTimeoutSeconds ?? holder.resumeTimeoutSeconds ?? 60 + await resumePaused( + names: holder.paused, project: params.project, resource: params.resource, + timeoutSeconds: timeout) + return LockResult(paused: holder.paused) + } + + /** Drop dead holders and resume what they paused. Called from gate/acquire + and at startup so a crashed harness (or a dead CLI after a daemon bounce) + never leaves servers stopped. */ + private func releaseOrphanedLock(key: String) async { + guard let holder = resourceLocks[key] else { return } + guard kill(pid_t(holder.pid), 0) != 0 else { return } + guard let separator = key.range(of: "::") else { resourceLocks[key] = nil - return nil + persistLocks() + return } - return holder + let project = String(key[key.startIndex.. Bool { + for (key, holder) in resourceLocks { + guard key.hasPrefix("\(project)::") else { continue } + guard kill(pid_t(holder.pid), 0) == 0 else { continue } + if holder.paused.contains(name) { return true } + } + return false + } + + private func persistLocks() { + /** Empty file is fine: defensive load treats missing/corrupt as {}. */ + try? AtomicFile.write( + JSONCoding.encoder().encode(LocksFile(locks: resourceLocks)), to: paths.locksFile) } /** Refuses to start a server while an external holder owns one of its declared resources: restarting mid-harness-run is exactly the contention the lock exists to prevent. */ - private func lockGate(project: String, spec: ServerSpec) throws { + private func lockGate(project: String, spec: ServerSpec) async throws { for resource in spec.locks ?? [] { - if let holder = liveLockHolder(key: "\(project)::\(resource)") { + let key = "\(project)::\(resource)" + await releaseOrphanedLock(key: key) + if let holder = resourceLocks[key] { throw WireError( code: .resourceLocked, hint: "the holder releases it when done; check: ps -p \(holder.pid)", - message: "server '\(spec.name)' holds resource '\(resource)', locked by pid \(holder.pid) since \(JSONCoding.formatISO8601(holder.since))") + message: + "server '\(spec.name)' holds resource '\(resource)', locked by pid \(holder.pid) since \(JSONCoding.formatISO8601(holder.since))" + ) } } } @@ -706,6 +854,16 @@ public final class ControlServer: Sendable { params.requiredLocalEndpoint = NWEndpoint.unix(path: socketPath) params.allowLocalEndpointReuse = true self.listener = try NWListener(using: params) + listener.stateUpdateHandler = { state in + switch state { + case .failed(let error): + DevCtlLog.daemon.error("control listener failed: \(String(describing: error))") + case .cancelled: + DevCtlLog.daemon.debug("control listener cancelled") + default: + break + } + } listener.newConnectionHandler = { [router] connection in Self.serve(connection: connection, router: router) } @@ -716,8 +874,32 @@ public final class ControlServer: Sendable { listener.start(queue: DispatchQueue(label: "devctl.control")) } + /** A client that exits without a shutdown handshake (every one-shot `devctl` + invocation) surfaces as `.failed` with a peer-close errno. Those are + routine, so they log at debug; anything else is a real listener problem + and stays at error. */ + private static func isRoutineDisconnect(_ error: NWError) -> Bool { + guard case .posix(let code) = error else { return false } + return code == .ENETDOWN || code == .ECONNRESET || code == .EPIPE || code == .ECANCELED + } + private static func serve(connection: NWConnection, router: Router) { let queue = DispatchQueue(label: "devctl.connection") + connection.stateUpdateHandler = { state in + switch state { + case .failed(let error): + if isRoutineDisconnect(error) { + DevCtlLog.daemon.debug("control connection closed by peer: \(String(describing: error))") + } else { + DevCtlLog.daemon.error("control connection failed: \(String(describing: error))") + } + connection.cancel() + case .cancelled: + break + default: + break + } + } connection.start(queue: queue) let hello = try? NDJSON.encodeLine( WireEvent( diff --git a/Sources/DevCtlDaemonCore/Health/HealthProber.swift b/Sources/DevCtlDaemonCore/Health/HealthProber.swift index c428d5b..b5d3573 100644 --- a/Sources/DevCtlDaemonCore/Health/HealthProber.swift +++ b/Sources/DevCtlDaemonCore/Health/HealthProber.swift @@ -47,6 +47,16 @@ public protocol HealthProber: Sendable { } public struct NetworkHealthProber: HealthProber { + /** Dedicated ephemeral session so probes do not share URLSession.shared + caches or the default 60s resource timeout. */ + private static let session: URLSession = { + let config = URLSessionConfiguration.ephemeral + config.timeoutIntervalForRequest = 5 + config.timeoutIntervalForResource = 5 + config.waitsForConnectivity = false + return URLSession(configuration: config, delegate: RedirectStopper.shared, delegateQueue: nil) + }() + public init() {} public func probe(_ check: EffectiveHealthcheck) async -> Bool { @@ -97,8 +107,7 @@ public struct NetworkHealthProber: HealthProber { following it would re-enter hostname resolution the loopback rewrite just avoided, so redirects never get followed. */ private static func httpResponds(_ request: URLRequest) async throws -> Bool { - let (_, response) = try await URLSession.shared.data( - for: request, delegate: RedirectStopper.shared) + let (_, response) = try await session.data(for: request) guard let http = response as? HTTPURLResponse else { return false } return (200..<400).contains(http.statusCode) } diff --git a/Sources/DevCtlDaemonCore/Supervisor/ProcessTree.swift b/Sources/DevCtlDaemonCore/Supervisor/ProcessTree.swift index 89ca8b8..284442e 100644 --- a/Sources/DevCtlDaemonCore/Supervisor/ProcessTree.swift +++ b/Sources/DevCtlDaemonCore/Supervisor/ProcessTree.swift @@ -1,44 +1,165 @@ import Darwin import Foundation +/** A process identity that survives PID reuse: pid alone is not enough across a + grace window, because macOS can recycle the number. Start time comes from + `kinfo_proc.kp_proc.p_starttime`. */ +public struct ProcessIdentity: Hashable, Sendable, Equatable { + public let pid: pid_t + public let startMicroseconds: suseconds_t + public let startSeconds: time_t + + public init(pid: pid_t, startSeconds: time_t, startMicroseconds: suseconds_t) { + self.pid = pid + self.startMicroseconds = startMicroseconds + self.startSeconds = startSeconds + } + + init(_ info: kinfo_proc) { + self.pid = info.kp_proc.p_pid + self.startMicroseconds = info.kp_proc.p_starttime.tv_usec + self.startSeconds = info.kp_proc.p_starttime.tv_sec + } +} + +/** Result of a descendant sweep. Failure must not look like "no children": a + silent empty list drops the escaped-descendant half of teardown. */ +public enum DescendantsResult: Sendable, Equatable { + case failed(errno: Int32) + case ok([ProcessIdentity]) + + public var identities: [ProcessIdentity] { + switch self { + case .failed: [] + case .ok(let ids): ids + } + } + + public var pids: [pid_t] { identities.map(\.pid) } +} + /** Descendant enumeration via sysctl KERN_PROC_ALL. Group-directed signals miss processes that changed their own group (Foundation Process children setpgid; daemonizers setsid), so teardown signals the group AND every live descendant found by walking the parent-pid chain. The snapshot must be taken before the parent dies: orphans reparent to launchd and fall out of the chain. */ -enum ProcessTree { +public enum ProcessTree { /** All live descendants of `pid` (children, grandchildren, ...), excluding `pid` itself. Best-effort: a process spawned after the snapshot is missed. */ - static func descendants(of pid: pid_t) -> [pid_t] { - var name: [Int32] = [CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0] - var size = 0 - guard sysctl(&name, 4, nil, &size, nil, 0) == 0, size > 0 else { return [] } - /** Headroom: processes can appear between the size probe and the fetch. */ - size += size / 8 - let capacity = size / MemoryLayout.stride - var processes = [kinfo_proc](repeating: kinfo_proc(), count: capacity) - guard sysctl(&name, 4, &processes, &size, nil, 0) == 0 else { return [] } - let count = size / MemoryLayout.stride - var childrenByParent: [pid_t: [pid_t]] = [:] - for info in processes.prefix(count) { - childrenByParent[info.kp_eproc.e_ppid, default: []].append(info.kp_proc.p_pid) - } - var found: [pid_t] = [] - var queue: [pid_t] = [pid] - while let parent = queue.popLast() { - for child in childrenByParent[parent] ?? [] where child != parent { - found.append(child) - queue.append(child) + public static func descendants(of pid: pid_t) -> DescendantsResult { + switch fetchProcessTable() { + case .failed(let errno): + return .failed(errno: errno) + case .ok(let table): + var childrenByParent: [pid_t: [ProcessIdentity]] = [:] + for identity in table { + childrenByParent[identity.parent, default: []].append(identity.process) + } + var found: [ProcessIdentity] = [] + var queue: [pid_t] = [pid] + while let parent = queue.popLast() { + for child in childrenByParent[parent] ?? [] where child.pid != parent { + found.append(child) + queue.append(child.pid) + } } + return .ok(found) } - return found } - /** Signals the process group and every stray descendant outside it. */ - static func signalTree(rootPid: pid_t, descendants: [pid_t], signal: Int32) { + /** Whether a snapshotted identity still names the same process. A nil live + identity means the pid is gone; a start-time mismatch means reuse. */ + public static func shouldSignal(snapshotted: ProcessIdentity, live: ProcessIdentity?) -> Bool { + guard let live else { return false } + return snapshotted == live + } + + /** Round a probed byte count up to whole `kinfo_proc` entries with 12.5% + headroom, then return capacity and the exact allocated byte count to + pass to sysctl (never advertise past the allocation). */ + public static func allocation(forProbedBytes probed: Int) -> (capacity: Int, byteCount: Int) { + let stride = MemoryLayout.stride + guard probed > 0, stride > 0 else { return (0, 0) } + let withHeadroom = probed + probed / 8 + let capacity = max(1, (withHeadroom + stride - 1) / stride) + return (capacity, capacity * stride) + } + + /** Signals the process group and every stray descendant outside it. + When `revalidate` is true, skip identities whose start time no longer + matches (PID reuse after a grace window). */ + public static func signalTree( + rootPid: pid_t, + descendants: [ProcessIdentity], + signal: Int32, + revalidate: Bool = false + ) { kill(-rootPid, signal) - for pid in descendants where getpgid(pid) != rootPid { - kill(pid, signal) + for identity in descendants { + if revalidate { + let live = liveIdentity(of: identity.pid) + guard shouldSignal(snapshotted: identity, live: live) else { continue } + } + if getpgid(identity.pid) != rootPid { + kill(identity.pid, signal) + } + } + } + + /** Individually SIGKILL snapshotted PIDs that still match, used when the + root is already gone so group-directed kill no longer applies. */ + public static func escalateIndividuals(_ identities: [ProcessIdentity]) { + for identity in identities { + let live = liveIdentity(of: identity.pid) + guard shouldSignal(snapshotted: identity, live: live) else { continue } + kill(identity.pid, SIGKILL) } } + + private struct TableRow: Sendable { + let parent: pid_t + let process: ProcessIdentity + } + + private enum TableResult { + case failed(errno: Int32) + case ok([TableRow]) + } + + /** QA1123 shape: 3-level MIB, size probe, rounded allocation, retry ENOMEM. */ + private static func fetchProcessTable() -> TableResult { + var mib: [Int32] = [CTL_KERN, KERN_PROC, KERN_PROC_ALL] + for _ in 0..<8 { + var probed = 0 + guard sysctl(&mib, 3, nil, &probed, nil, 0) == 0, probed > 0 else { + return .failed(errno: errno) + } + let plan = allocation(forProbedBytes: probed) + var buffer = [kinfo_proc](repeating: kinfo_proc(), count: plan.capacity) + var length = plan.byteCount + let status = buffer.withUnsafeMutableBufferPointer { ptr -> Int32 in + sysctl(&mib, 3, ptr.baseAddress, &length, nil, 0) + } + if status == 0 { + let count = length / MemoryLayout.stride + let rows = buffer.prefix(count).map { info in + TableRow(parent: info.kp_eproc.e_ppid, process: ProcessIdentity(info)) + } + return .ok(rows) + } + if errno == ENOMEM { continue } + return .failed(errno: errno) + } + return .failed(errno: ENOMEM) + } + + private static func liveIdentity(of pid: pid_t) -> ProcessIdentity? { + var mib: [Int32] = [CTL_KERN, KERN_PROC, KERN_PROC_PID, pid] + var length = MemoryLayout.stride + var info = kinfo_proc() + guard sysctl(&mib, 4, &info, &length, nil, 0) == 0, length >= MemoryLayout.stride + else { return nil } + guard info.kp_proc.p_pid == pid else { return nil } + return ProcessIdentity(info) + } } diff --git a/Sources/DevCtlDaemonCore/Supervisor/ServerSupervisor.swift b/Sources/DevCtlDaemonCore/Supervisor/ServerSupervisor.swift index bf0da95..9d7b32e 100644 --- a/Sources/DevCtlDaemonCore/Supervisor/ServerSupervisor.swift +++ b/Sources/DevCtlDaemonCore/Supervisor/ServerSupervisor.swift @@ -198,7 +198,12 @@ public actor ServerSupervisor { stopRequested = true stopWasDeliberate = deliberate phase = .stopping - let snapshot = ProcessTree.descendants(of: target) + let snapshotResult = ProcessTree.descendants(of: target) + if case .failed(let code) = snapshotResult { + DevCtlLog.supervisor.error( + "descendant sweep failed before SIGTERM (errno \(code)); group-only teardown") + } + let snapshot = snapshotResult.identities ProcessTree.signalTree(rootPid: target, descendants: snapshot, signal: SIGTERM) let deadline = ContinuousClock.now.advanced(by: .seconds(graceSeconds)) while ContinuousClock.now < deadline { @@ -208,13 +213,21 @@ public actor ServerSupervisor { } /** Escalate: the pre-signal snapshot plus a fresh sweep (new children may have appeared during the grace window while the parent lived). */ - let escalation = Set(snapshot).union(ProcessTree.descendants(of: target)) + let fresh = ProcessTree.descendants(of: target) + if case .failed(let code) = fresh { + DevCtlLog.supervisor.error( + "descendant sweep failed before SIGKILL (errno \(code)); using pre-signal snapshot") + } + var byPid: [pid_t: ProcessIdentity] = [:] + for identity in snapshot + fresh.identities { + byPid[identity.pid] = identity + } + let escalation = Array(byPid.values) if kill(target, 0) == 0 { - ProcessTree.signalTree(rootPid: target, descendants: Array(escalation), signal: SIGKILL) + ProcessTree.signalTree( + rootPid: target, descendants: escalation, signal: SIGKILL, revalidate: true) } else { - for pid in escalation where kill(pid, 0) == 0 { - kill(pid, SIGKILL) - } + ProcessTree.escalateIndividuals(escalation) } await waitForRunTaskCompletion() return status() @@ -317,7 +330,7 @@ public actor ServerSupervisor { private func scanObservedPort() { guard let rootPid = pid else { return } Task { [weak self] in - let pids = [rootPid] + ProcessTree.descendants(of: rootPid) + let pids = [rootPid] + ProcessTree.descendants(of: rootPid).pids let ports = PortGuard.listeningPorts(pids: pids) await self?.recordObservedPort(ports: ports) } diff --git a/Sources/DevCtlKit/DeepLink/DeepLinkNotificationAction.swift b/Sources/DevCtlKit/DeepLink/DeepLinkNotificationAction.swift index ae130bb..ebaad33 100644 --- a/Sources/DevCtlKit/DeepLink/DeepLinkNotificationAction.swift +++ b/Sources/DevCtlKit/DeepLink/DeepLinkNotificationAction.swift @@ -8,12 +8,20 @@ public enum DeepLinkNotificationAction: String, Sendable, Equatable, CaseIterabl case open = "dev.quantizor.devctl.notification.open" case why = "dev.quantizor.devctl.notification.why" + /** System default tap (`UNNotificationDefaultActionIdentifier`). Kept as a + string so this module stays free of UserNotifications. */ + public static let defaultActionId = "com.apple.UNNotificationDefaultActionIdentifier" + /** The link a tapped action fires, or nil when the identifier is not one of - ours (a system action like the default tap or dismiss). `head` rides along - only for `open`, matching `DeepLink`'s own head rule. */ + ours and not the body tap. `head` rides along only for `open`, matching + `DeepLink`'s own head rule. Body tap maps to open so a click on the + banner itself is not a dead end. */ public static func link( actionId: String, projectSlug: String, server: String, head: String? = nil ) -> DeepLink? { + if actionId == defaultActionId { + return DeepLink(verb: .open, projectSlug: projectSlug, server: server, head: head) + } guard let action = DeepLinkNotificationAction(rawValue: actionId) else { return nil } switch action { case .open: diff --git a/Sources/DevCtlKit/Launchd/AgentRebindPolicy.swift b/Sources/DevCtlKit/Launchd/AgentRebindPolicy.swift new file mode 100644 index 0000000..ff2d343 --- /dev/null +++ b/Sources/DevCtlKit/Launchd/AgentRebindPolicy.swift @@ -0,0 +1,34 @@ +import Foundation + +/** Decide helpers for SMAppService helper upgrades after a DMG replace. + + Ad-hoc resigns change the helper CDHash. The first `register()` after replace + often dies with Launch Constraint Violation. KeepAlive then asks smd to repair + the LWCR in place; for ad-hoc (empty Team ID) that returns + `Unable to update LWCR with smd: 22` and another 10s throttle. Waiting does + not help. A second unregister+register submits a fresh job whose LWCR matches + the on-disk helper. Developer ID builds are far less sensitive. */ +public enum AgentRebindPolicy { + /** Idle after launchd reports the agent gone, before replacing the helper + or calling register again. Long enough for unload, not a BTM cure. */ + public static let settleSeconds: TimeInterval = 1 + + /** How long to wait for the first post-replace spawn before forcing a + fresh unregister+register (KeepAlive LWCR repair is a dead end). */ + public static let postReplaceHelloSeconds: TimeInterval = 1.5 + + /** Whether launch should register the agent. A post-upgrade rebind marker + outranks a leftover deliberate-stop file from the pre-replace unregister. */ + public static func shouldRegisterAtLaunch( + deliberatelyStopped: Bool, rebindNeeded: Bool + ) -> Bool { + if rebindNeeded { return true } + return !deliberatelyStopped + } + + /** After a brief hello miss on a rebind, skip the throttle wait and + re-register immediately. */ + public static func shouldForceReregisterAfterHelloMiss(rebindNeeded: Bool) -> Bool { + rebindNeeded + } +} diff --git a/Sources/DevCtlKit/Launchd/DaemonRecoveryPolicy.swift b/Sources/DevCtlKit/Launchd/DaemonRecoveryPolicy.swift new file mode 100644 index 0000000..69dfda1 --- /dev/null +++ b/Sources/DevCtlKit/Launchd/DaemonRecoveryPolicy.swift @@ -0,0 +1,41 @@ +import Foundation + +/** Whether an unreachable daemon should be resurrected without being asked. + + Policy, not UI: the menu bar app polls every couple of seconds, so this has + to distinguish "died and should come back" from "the user stopped it" and + from "we just tried and it failed". Recovery shells out to launchctl, which + is why a failed attempt earns a cooldown instead of retrying every poll. */ +public enum DaemonRecoveryPolicy { + public enum Decision: Equatable, Sendable { + /** Socket answered: nothing to do. */ + case healthy + /** Bring it back now. */ + case recover + /** An attempt is already in flight. */ + case inFlight + /** Tried too recently; wait out the cooldown. */ + case cooling + /** `devctl daemon stop` was deliberate; wait for an explicit Start. */ + case awaitUser + } + + public static let cooldown: TimeInterval = 15 + + public static func decide( + reachable: Bool, + stoppedOnPurpose: Bool, + recovering: Bool, + lastAttempt: Date?, + now: Date = Date(), + cooldown: TimeInterval = cooldown + ) -> Decision { + if reachable { return .healthy } + /** Intent outranks liveness: resurrecting a deliberately stopped daemon + would silently undo what the user asked for. */ + if stoppedOnPurpose { return .awaitUser } + if recovering { return .inFlight } + if let lastAttempt, now.timeIntervalSince(lastAttempt) < cooldown { return .cooling } + return .recover + } +} diff --git a/Sources/DevCtlKit/Launchd/LaunchdAdmin.swift b/Sources/DevCtlKit/Launchd/LaunchdAdmin.swift new file mode 100644 index 0000000..14a994f --- /dev/null +++ b/Sources/DevCtlKit/Launchd/LaunchdAdmin.swift @@ -0,0 +1,468 @@ +import Foundation + +/** launchd administration: install renders the LaunchAgent and bootstraps it; + upgrades stage-and-rename the binary (overwriting a running signed Mach-O + gets it SIGKILLed); restart drains, kickstarts, and re-ensures what ran. + Shared by the CLI and the menu bar app so both can bring the daemon back. */ +public enum LaunchdAdmin { + public static let label = "dev.quantizor.devctl" + + public static var plistURL: URL { + FileManager.default.homeDirectoryForCurrentUser + .appending(path: "Library/LaunchAgents/\(label).plist") + } + + /** Menu bar app at the standard install location. When present, agent + registration must go through SMAppService inside that process. */ + public static var applicationsAppURL: URL { + URL(fileURLWithPath: SetupPlanner.applicationsAppPath) + } + + public static func applicationsAppPresent() -> Bool { + FileManager.default.fileExists(atPath: applicationsAppURL.path) + } + + /** Ask the menu bar app to register/ensure the SMAppService agent. + CLI processes cannot call `SMAppService.agent` (wrong `Bundle.main`). + Prefer `-a /Applications/devctl.app` so a DMG/Downloads copy with the + same bundle id does not steal the URL. */ + @discardableResult + public static func requestAppAgentEnsure() -> (status: Int32, output: String) { + if applicationsAppPresent() { + return shell( + "/usr/bin/open", ["-a", applicationsAppURL.path, "devctl://daemon/ensure"]) + } + return shell("/usr/bin/open", ["devctl://daemon/ensure"]) + } + + /** Ask the menu bar app to unregister the SMAppService agent. */ + @discardableResult + public static func requestAppAgentUnregister() -> (status: Int32, output: String) { + if applicationsAppPresent() { + return shell( + "/usr/bin/open", ["-a", applicationsAppURL.path, "devctl://daemon/unregister"]) + } + return shell("/usr/bin/open", ["devctl://daemon/unregister"]) + } + + /** True when launchd currently has our agent in the gui domain. */ + public static func isAgentLoaded() -> Bool { + shell("/bin/launchctl", ["print", "gui/\(getuid())/\(label)"]).status == 0 + } + + /** Wait until launchd drops the agent after an unregister, then idle so BTM + can drop the prior launch constraint. Returns false if the job is still + loaded after the timeout (and a last-resort bootout); callers must not + replace the helper in that case. */ + @discardableResult + public static func waitUntilAgentUnloaded( + timeoutSeconds: Double = 10, + settleSeconds: Double = AgentRebindPolicy.settleSeconds + ) async -> Bool { + let deadline = Date().addingTimeInterval(timeoutSeconds) + while Date() < deadline, isAgentLoaded() { + try? await Task.sleep(for: .milliseconds(50)) + } + if isAgentLoaded() { + _ = shell("/bin/launchctl", ["bootout", "gui/\(getuid())/\(label)"]) + let bootoutDeadline = Date().addingTimeInterval(3) + while Date() < bootoutDeadline, isAgentLoaded() { + try? await Task.sleep(for: .milliseconds(50)) + } + } + guard !isAgentLoaded() else { return false } + if settleSeconds > 0 { + try? await Task.sleep(for: .seconds(settleSeconds)) + } + return !isAgentLoaded() + } + + /** Marker for the Applications copy: settle, then register, after a DMG + replace that unregistered first. */ + public static func markAgentRebindNeeded(paths: DevCtlPaths = DevCtlPaths()) throws { + try FileManager.default.createDirectory( + at: paths.dataDir, withIntermediateDirectories: true) + try AtomicFile.write(Data(), to: paths.agentRebindFile) + } + + public static func agentRebindNeeded(paths: DevCtlPaths = DevCtlPaths()) -> Bool { + FileManager.default.fileExists(atPath: paths.agentRebindFile.path) + } + + public static func clearAgentRebindMarker(paths: DevCtlPaths = DevCtlPaths()) { + try? FileManager.default.removeItem(at: paths.agentRebindFile) + } + + /** True when launchd has the job but is waiting out ThrottleInterval + (`minimum runtime` defaults to 10s) after a failed spawn. */ + public static func agentSpawnScheduled() -> Bool { + launchdState().contains("spawn scheduled") + } + + public static func pollHello(paths: DevCtlPaths, timeoutSeconds: Double = 5) async throws { + let deadline = Date().addingTimeInterval(timeoutSeconds) + var lastError: Error = WireError(code: .daemonUnreachable, message: "daemon never answered") + while Date() < deadline { + do { + let client = DaemonClient(socketPath: paths.socketPath) + _ = try await client.request( + .daemonInfo, params: WireEmpty(), expecting: DaemonInfo.self) + return + } catch { + lastError = error + try? await Task.sleep(for: .milliseconds(50)) + } + } + throw lastError + } + + /** True when `devctl daemon stop` left the deliberate-stop marker. Auto + bootstrap honors it; an explicit Start clears it. */ + public static func deliberatelyStopped(paths: DevCtlPaths = DevCtlPaths()) -> Bool { + FileManager.default.fileExists(atPath: paths.stoppedIntentFile.path) + } + + /** First executable `devctld` among `extraCandidates`, then argv0 sibling, + `~/.local/bin/devctld`, and the Application Support install path. */ + public static func resolveDaemonBinary(extraCandidates: [URL] = []) -> URL? { + var candidates = extraCandidates + let arg0 = URL(fileURLWithPath: CommandLine.arguments[0]) + candidates.append(arg0.deletingLastPathComponent().appending(path: "devctld")) + candidates.append(SetupPlanner.installedDaemonSiblingURL()) + candidates.append(DevCtlPaths().daemonBinaryDir.appending(path: "devctld")) + let fm = FileManager.default + for url in candidates where fm.isExecutableFile(atPath: url.path) { + return url + } + return nil + } + + /** Auto-bootstrap: only against the default socket (never a test override), + never past a deliberate-stop marker. Prefers the Applications app's + SMAppService path when present; otherwise kickstarts/installs the + legacy home LaunchAgent. */ + @discardableResult + public static func attemptBootstrap( + paths: DevCtlPaths = DevCtlPaths(), + extraDaemonCandidates: [URL] = [], + forceLegacy: Bool = false + ) async -> Bool { + guard ProcessInfo.processInfo.environment["DEVCTL_SOCKET"] == nil else { return false } + guard !deliberatelyStopped(paths: paths) else { return false } + /** With the app installed it owns registration, so a silent socket is + answered by waiting, never by installing a second job. Falling through + to the legacy path here wrote `~/Library/LaunchAgents` back whenever a + command landed inside launchd's respawn throttle, leaving two jobs + competing for one label and socket. The wait clears that throttle. */ + if !forceLegacy, applicationsAppPresent() { + try? writeAgentPath(paths: paths) + _ = requestAppAgentEnsure() + return (try? await pollHello(paths: paths, timeoutSeconds: 12)) != nil + } + if FileManager.default.fileExists(atPath: plistURL.path) { + return (try? await start(paths: paths)) != nil + } + guard let binary = resolveDaemonBinary(extraCandidates: extraDaemonCandidates) else { + return false + } + return (try? await install(daemonBinary: binary, paths: paths, forceLegacy: true)) != nil + } + + /** Explicit user start: clears the stop marker, then kickstarts or installs. */ + public static func startOrInstall( + paths: DevCtlPaths = DevCtlPaths(), + extraDaemonCandidates: [URL] = [], + forceLegacy: Bool = false + ) async throws { + try? FileManager.default.removeItem(at: paths.stoppedIntentFile) + if !forceLegacy, applicationsAppPresent() { + try writeAgentPath(paths: paths) + _ = requestAppAgentEnsure() + try await pollHello(paths: paths, timeoutSeconds: 12) + return + } + if FileManager.default.fileExists(atPath: plistURL.path) { + try await start(paths: paths) + return + } + guard let binary = resolveDaemonBinary(extraCandidates: extraDaemonCandidates) else { + throw WireError( + code: .internalError, + hint: "run: make install (or open the setup panel from the DMG)", + message: "no LaunchAgent and no devctld binary found to install") + } + _ = try await install(daemonBinary: binary, paths: paths, forceLegacy: true) + } + + /** Install (or upgrade) the LaunchAgent. Same bounce contract as restart: + capture what is running, drain, swap binary + bootstrap, re-ensure. The + daemon's recoverAtStartup is the reboot path; install cannot rely on it + alone because a pre-feature state.json may lack resumeOnBoot, and the + CLI already knows the live names from status. */ + /** Install (or upgrade) the agent. When `/Applications/devctl.app` exists + and `forceLegacy` is false, asks the app to register via SMAppService + (correct Bundle.main). Otherwise writes the home LaunchAgent. */ + @discardableResult + public static func install( + daemonBinary: URL, paths: DevCtlPaths, forceLegacy: Bool = false + ) async throws -> [( + project: String, name: String + )] { + let client = DaemonClient(socketPath: paths.socketPath) + let runningServers = await captureActiveServers(client: client) + /** Drain through the daemon FIRST: bootout's own kill can outrun the + SIGTERM drain and orphan server trees mid-escalation. */ + _ = try? await client.request(.daemonShutdown, params: WireEmpty(), expecting: WireEmpty.self) + for _ in 0..<50 where FileManager.default.fileExists(atPath: paths.socketPath) { + if (try? await DaemonClient(socketPath: paths.socketPath) + .request(.daemonInfo, params: WireEmpty(), expecting: DaemonInfo.self)) == nil + { + break + } + try? await Task.sleep(for: .milliseconds(100)) + } + try? FileManager.default.removeItem(at: paths.stoppedIntentFile) + + if !forceLegacy, applicationsAppPresent() { + try writeAgentPath(paths: paths) + /** Leave any legacy home plist for the app to migrate on ensure. */ + _ = requestAppAgentEnsure() + do { + try await pollHello(paths: paths, timeoutSeconds: 10) + } catch { + /** The app owns registration, so the usual reason for silence is + an unapproved background item. Say that instead of a timeout. */ + throw WireError( + code: .daemonUnreachable, + hint: "open \"x-apple.systempreferences:com.apple.LoginItems-Settings.extension\"", + message: + "asked \(SetupPlanner.applicationsAppPath) to start devctld, but it never answered. If macOS is waiting for permission, turn on quantizor/devctl in System Settings > General > Login Items & Extensions, or run: devctl daemon install --legacy") + } + await reensure(runningServers, paths: paths) + return runningServers + } + + let fm = FileManager.default + try fm.createDirectory(at: paths.daemonBinaryDir, withIntermediateDirectories: true) + let destination = paths.daemonBinaryDir.appending(path: "devctld") + /** Stage-and-rename: never cp over a running signed binary. */ + let staged = paths.daemonBinaryDir.appending(path: ".devctld.staged-\(getpid())") + try? fm.removeItem(at: staged) + try fm.copyItem(at: daemonBinary, to: staged) + _ = try fm.replaceItemAt(destination, withItemAt: staged) + let plist = renderPlist(daemonPath: destination.path, paths: paths) + try fm.createDirectory(at: plistURL.deletingLastPathComponent(), withIntermediateDirectories: true) + try Data(plist.utf8).write(to: plistURL) + try? fm.removeItem(at: paths.stoppedIntentFile) + _ = shell("/bin/launchctl", ["bootout", "gui/\(getuid())/\(label)"]) + let bootstrap = shell("/bin/launchctl", ["bootstrap", "gui/\(getuid())", plistURL.path]) + /** A concurrent session bootstrapping first reports already-bootstrapped; + the socket poll below is the actual success signal. */ + if bootstrap.status != 0, !bootstrap.output.contains("already bootstrapped"), + !bootstrap.output.contains("Bootstrap failed: 5: Input/output error") + { + throw WireError( + code: .internalError, + hint: "run: launchctl bootstrap gui/\(getuid()) \(plistURL.path)", + message: "launchctl bootstrap failed (\(bootstrap.status)): \(bootstrap.output)") + } + try await pollHello(paths: paths) + await reensure(runningServers, paths: paths) + return runningServers + } + + public static func uninstall(paths: DevCtlPaths, purge: Bool) async { + let client = DaemonClient(socketPath: paths.socketPath) + _ = try? await client.request(.daemonShutdown, params: WireEmpty(), expecting: WireEmpty.self) + if applicationsAppPresent() { + _ = requestAppAgentUnregister() + /** Brief wait so the app can finish SMAppService.unregister. */ + try? await Task.sleep(for: .milliseconds(800)) + } + _ = shell("/bin/launchctl", ["bootout", "gui/\(getuid())/\(label)"]) + try? FileManager.default.removeItem(at: plistURL) + if purge { + try? FileManager.default.removeItem(at: paths.dataDir) + try? FileManager.default.removeItem(at: paths.logsDir) + } + } + + public static func start(paths: DevCtlPaths) async throws { + try? FileManager.default.removeItem(at: paths.stoppedIntentFile) + try? writeAgentPath(paths: paths) + guard FileManager.default.fileExists(atPath: plistURL.path) else { + throw WireError( + code: .internalError, + hint: "run: devctl daemon install", + message: "no LaunchAgent installed at \(plistURL.path)") + } + let result = shell("/bin/launchctl", ["kickstart", "gui/\(getuid())/\(label)"]) + if result.status != 0 { + _ = shell("/bin/launchctl", ["bootstrap", "gui/\(getuid())", plistURL.path]) + } + try await pollHello(paths: paths) + } + + /** Drain, kickstart -k, re-ensure what was running: "servers bounce, then + come back" is the restart contract. */ + @discardableResult + public static func restart(paths: DevCtlPaths) async throws -> [(project: String, name: String)] { + let client = DaemonClient(socketPath: paths.socketPath) + let runningServers = await captureActiveServers(client: client) + try? FileManager.default.removeItem(at: paths.stoppedIntentFile) + let result = shell("/bin/launchctl", ["kickstart", "-k", "gui/\(getuid())/\(label)"]) + if result.status != 0 { + throw WireError( + code: .internalError, + hint: "run: devctl daemon install", + message: "launchctl kickstart failed (\(result.status)): \(result.output)") + } + try await pollHello(paths: paths) + await reensure(runningServers, paths: paths) + return runningServers + } + + public static func captureActiveServers(client: DaemonClient) async -> [( + project: String, name: String + )] { + guard + let all = try? await client.request( + .serverStatus, params: ProjectParams(project: ""), expecting: ServerListResult.self) + else { return [] } + return all.servers + .filter { $0.phase == .running || $0.phase == .starting || $0.phase == .unhealthy } + .map { (project: $0.project, name: $0.server) } + } + + public static func reensure( + _ servers: [(project: String, name: String)], paths: DevCtlPaths + ) async { + let fresh = DaemonClient(socketPath: paths.socketPath) + for server in servers { + _ = try? await fresh.request( + .serverEnsure, + params: EnsureParams(name: server.name, project: server.project, timeoutSeconds: 60), + expecting: EnsureResult.self) + } + } + + public static func launchdState() -> String { + let result = shell("/bin/launchctl", ["print", "gui/\(getuid())/\(label)"]) + if result.status != 0 { return "not bootstrapped" } + for line in result.output.split(separator: "\n") { + let trimmed = line.trimmingCharacters(in: .whitespaces) + if trimmed.hasPrefix("state =") || trimmed.hasPrefix("pid =") { + return trimmed + } + } + return "bootstrapped" + } + + /** Floor PATH for sealed in-bundle LaunchAgent plists. Dynamic user PATH + lives in `agent.path` and is applied by the daemon at start. */ + public static let pathFloor = + "/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin" + + /** Captured login-shell PATH so launchd children can find Homebrew/asdf/mise + tools; launchd agents otherwise get a minimal PATH. Goes stale after a + Homebrew migration, which doctor surfaces via daemon.info. */ + public static func capturedPath() -> String { + let result = shell("/bin/zsh", ["-lc", "echo $PATH"]) + let path = result.output.trimmingCharacters(in: .whitespacesAndNewlines) + return path.isEmpty ? pathFloor : path + } + + /** Persist the login-shell PATH for the daemon to merge at start. */ + public static func writeAgentPath( + _ path: String = capturedPath(), paths: DevCtlPaths = DevCtlPaths() + ) throws { + let trimmed = path.trimmingCharacters(in: .whitespacesAndNewlines) + let payload = trimmed.isEmpty ? pathFloor : trimmed + try AtomicFile.write(Data(payload.utf8), to: paths.agentPathFile) + } + + public static func readAgentPath(paths: DevCtlPaths = DevCtlPaths()) -> String? { + guard let data = try? Data(contentsOf: paths.agentPathFile), + let text = String(data: data, encoding: .utf8)? + .trimmingCharacters(in: .whitespacesAndNewlines), + !text.isEmpty + else { return nil } + return text + } + + /** Apply the persisted PATH into this process before spawning children. */ + public static func applyAgentPathToProcess(paths: DevCtlPaths = DevCtlPaths()) { + guard let path = readAgentPath(paths: paths) else { return } + setenv("PATH", path, 1) + } + + /** LaunchAgent plist for CLI-only installs. AssociatedBundleIdentifiers is + a best-effort BTM hint; Login Items naming for the app path comes from + SMAppService + the responsible app's CFBundleDisplayName. Legacy plists + still bake PATH; the daemon also reads agent.path so both stay in sync. */ + public static func renderPlist(daemonPath: String, paths: DevCtlPaths) -> String { + let resolvedPath: String + do { + try writeAgentPath(paths: paths) + resolvedPath = readAgentPath(paths: paths) ?? capturedPath() + } catch { + resolvedPath = capturedPath() + } + return """ + + + + + AssociatedBundleIdentifiers + + dev.quantizor.devctl.app + + EnvironmentVariables + + PATH + \(resolvedPath) + + ExitTimeOut + 60 + KeepAlive + + SuccessfulExit + + + Label + \(label) + ProcessType + Interactive + ProgramArguments + + \(daemonPath) + + RunAtLoad + + StandardErrorPath + \(paths.daemonLog.path) + StandardOutPath + \(paths.daemonLog.path) + + + """ + } + + @discardableResult + public static func shell(_ path: String, _ arguments: [String]) -> (status: Int32, output: String) { + let process = Process() + process.executableURL = URL(fileURLWithPath: path) + process.arguments = arguments + let pipe = Pipe() + process.standardOutput = pipe + process.standardError = pipe + do { + try process.run() + } catch { + return (status: -1, output: String(describing: error)) + } + let data = pipe.fileHandleForReading.readDataToEndOfFile() + process.waitUntilExit() + return (status: process.terminationStatus, output: String(decoding: data, as: UTF8.self)) + } +} diff --git a/Sources/DevCtlKit/Paths/Paths.swift b/Sources/DevCtlKit/Paths/Paths.swift index e848927..0bc8837 100644 --- a/Sources/DevCtlKit/Paths/Paths.swift +++ b/Sources/DevCtlKit/Paths/Paths.swift @@ -13,7 +13,18 @@ public struct DevCtlPaths: Sendable { public var daemonBinaryDir: URL { dataDir.appending(path: "bin") } public var daemonLog: URL { dataDir.appending(path: "daemon.log") } + /** Login-shell PATH captured at install/start. The sealed in-bundle + LaunchAgent cannot hold a dynamic PATH; the daemon merges this file + into its environment at startup so children still find Homebrew tools. */ + public var agentPathFile: URL { dataDir.appending(path: "agent.path") } + /** Written before replacing `/Applications/devctl.app` so the relaunched + copy settles BTM before re-registering the helper (ad-hoc CDHash). */ + public var agentRebindFile: URL { dataDir.appending(path: "agent.rebind") } public var lockFile: URL { dataDir.appending(path: "daemon.lock") } + /** Held resource locks (`project::resource` → holder + paused servers). + Survives a daemon crash so mid-lock deaths can still resume what pause + stopped. */ + public var locksFile: URL { dataDir.appending(path: "locks.json") } public var registryFile: URL { dataDir.appending(path: "registry.json") } public var stateFile: URL { dataDir.appending(path: "state.json") } public var stoppedIntentFile: URL { dataDir.appending(path: "stopped.intent") } @@ -92,10 +103,15 @@ public func serverID(project: String, name: String) -> String { failure quarantines the file to `.corrupt-` and returns nil rather than crashing (a startup parse crash under launchd KeepAlive loops forever). */ public enum AtomicFile { + /** Temp + fsync + rename. The temp name carries a per-call unique suffix, not + just the pid: two writers inside one process (the app registers the agent + at launch while its recovery poll writes the same file) would otherwise + share a temp path and rename it out from under each other. */ public static func write(_ data: Data, to url: URL) throws { let dir = url.deletingLastPathComponent() try FileManager.default.createDirectory(at: dir, withIntermediateDirectories: true) - let tmp = dir.appending(path: ".\(url.lastPathComponent).tmp-\(getpid())") + let tmp = dir.appending( + path: ".\(url.lastPathComponent).tmp-\(getpid())-\(UUID().uuidString)") try data.write(to: tmp) let fd = open(tmp.path, O_WRONLY) if fd >= 0 { diff --git a/Sources/DevCtlKit/Protocol/Wire.swift b/Sources/DevCtlKit/Protocol/Wire.swift index 3f05580..13fa62d 100644 --- a/Sources/DevCtlKit/Protocol/Wire.swift +++ b/Sources/DevCtlKit/Protocol/Wire.swift @@ -283,24 +283,57 @@ public struct LockParams: Codable, Equatable, Sendable { public var holderPid: Int public var project: String public var resource: String + /** Per-server health wait used when this hold ends (release or orphan + cleanup). Optional so older clients keep decoding. */ + public var resumeTimeoutSeconds: Double? - public init(holderPid: Int, project: String, resource: String) { + public init( + holderPid: Int, project: String, resource: String, resumeTimeoutSeconds: Double? = nil + ) { self.holderPid = holderPid self.project = project self.resource = resource + self.resumeTimeoutSeconds = resumeTimeoutSeconds } } +/** In-memory and on-disk lock record. `paused` is who the daemon stopped for + this hold so a crash mid-lock can resume them when the holder is gone. */ public struct LockHolder: Codable, Equatable, Sendable { + public var paused: [String] public var pid: Int + public var resumeTimeoutSeconds: Double? public var since: Date - public init(pid: Int, since: Date) { + public init( + paused: [String] = [], pid: Int, resumeTimeoutSeconds: Double? = nil, since: Date + ) { + self.paused = paused self.pid = pid + self.resumeTimeoutSeconds = resumeTimeoutSeconds self.since = since } } +/** Result of lock.acquire / lock.release: which servers were paused or resumed. */ +public struct LockResult: Codable, Equatable, Sendable { + public var paused: [String] + + public init(paused: [String] = []) { + self.paused = paused + } +} + +/** Persisted resource locks (`locks.json`). Optional on load so a missing or + pre-feature file is just empty. */ +public struct LocksFile: Codable, Sendable { + public var locks: [String: LockHolder] + + public init(locks: [String: LockHolder] = [:]) { + self.locks = locks + } +} + public struct ProjectOnlyParams: Codable, Equatable, Sendable { public var project: String diff --git a/Sources/DevCtlKit/Setup/SetupPlanner.swift b/Sources/DevCtlKit/Setup/SetupPlanner.swift new file mode 100644 index 0000000..14cf8d3 --- /dev/null +++ b/Sources/DevCtlKit/Setup/SetupPlanner.swift @@ -0,0 +1,265 @@ +import Foundation + +/** First-run / upgrade planning for the menu bar app installer. Pure decisions + only: the app performs copies and shells out to the installed CLI. Layout + matches `make install` (`~/.local/bin`) so DMG and source installs converge. */ +public enum SetupPlanner { + public static let applicationsAppPath = "/Applications/devctl.app" + public static let cliBinaryName = "devctl" + public static let daemonBinaryName = "devctld" + public static let resourceCLIName = "devctl" + public static let resourceDaemonName = "devctld" + public static let stampFileName = "setup.stamp" + + /** Canonical CLI directory shared with `make install` (`PREFIX/bin`). */ + public static func defaultCLIDirectory(home: URL = FileManager.default.homeDirectoryForCurrentUser) + -> URL + { + home.appending(path: ".local/bin") + } + + public static func stampURL(paths: DevCtlPaths) -> URL { + paths.dataDir.appending(path: stampFileName) + } + + public static func installedCLIURL(home: URL = FileManager.default.homeDirectoryForCurrentUser) + -> URL + { + defaultCLIDirectory(home: home).appending(path: cliBinaryName) + } + + public static func installedDaemonSiblingURL( + home: URL = FileManager.default.homeDirectoryForCurrentUser + ) -> URL { + defaultCLIDirectory(home: home).appending(path: daemonBinaryName) + } + + /** Semver-ish compare: `"1.2.0"`, optionally with a trailing build label. + Missing/unparseable sides sort as older than a concrete version. */ + public static func compareVersions(_ lhs: String, _ rhs: String) -> ComparisonResult { + let left = parseVersion(lhs) + let right = parseVersion(rhs) + if left.isEmpty && right.isEmpty { return .orderedSame } + if left.isEmpty { return .orderedAscending } + if right.isEmpty { return .orderedDescending } + let count = max(left.count, right.count) + for i in 0.. b { return .orderedDescending } + } + return .orderedSame + } + + /** Whether the setup / upgrade panel should appear. */ + public static func shouldPresent( + bundledVersion: String, + installedCLIVersion: String?, + stampVersion: String?, + resourcesPresent: Bool, + runningOutsideApplications: Bool = false + ) -> Bool { + guard resourcesPresent else { return false } + /** Opening from a DMG or Downloads always offers install: the app must + land in /Applications so login items and deep links keep working. */ + if runningOutsideApplications { return true } + if stampVersion == nil { return true } + if installedCLIVersion == nil { return true } + if let installed = installedCLIVersion, + compareVersions(bundledVersion, installed) == .orderedDescending + { + return true + } + if let stamped = stampVersion, + compareVersions(bundledVersion, stamped) == .orderedDescending + { + return true + } + return false + } + + /** True when this process is not already `/Applications/devctl.app`. */ + public static func isRunningOutsideApplications(bundlePath: String) -> Bool { + let running = URL(fileURLWithPath: bundlePath).resolvingSymlinksInPath() + .standardizedFileURL.path + let apps = URL(fileURLWithPath: applicationsAppPath).resolvingSymlinksInPath() + .standardizedFileURL.path + return running != apps + } + + /** True when an on-disk CLI or LaunchAgent-era install already exists. */ + public static func isMigration( + installedCLIExists: Bool, + stampExists: Bool, + launchAgentExists: Bool + ) -> Bool { + installedCLIExists || stampExists || launchAgentExists + } + + /** True when /Applications already has a copy (replace vs first place). */ + public static func applicationsAppExists( + fileManager: FileManager = .default + ) -> Bool { + fileManager.fileExists(atPath: applicationsAppPath) + } + + /** Detect agent harnesses and whether their hooks still need installing. */ + public static func harnessOffers( + home: URL = FileManager.default.homeDirectoryForCurrentUser, + installedCLIPath: String + ) -> [HarnessOffer] { + var offers: [HarnessOffer] = [] + let claudeDir = home.appending(path: ".claude") + if FileManager.default.fileExists(atPath: claudeDir.path) { + let installed = HookPresence.claudeHookInstalled( + settingsURL: claudeDir.appending(path: "settings.json"), + expectedCLIPath: installedCLIPath) + offers.append( + HarnessOffer( + alreadyInstalled: installed, + defaultChecked: !installed, + displayName: "Claude Code", + harness: "claude")) + } + let cursorDir = home.appending(path: ".cursor") + if FileManager.default.fileExists(atPath: cursorDir.path) { + let installed = HookPresence.cursorHookInstalled( + settingsURL: cursorDir.appending(path: "hooks.json"), + expectedCLIPath: installedCLIPath) + offers.append( + HarnessOffer( + alreadyInstalled: installed, + defaultChecked: !installed, + displayName: "Cursor", + harness: "cursor")) + } + return offers.sorted { $0.harness < $1.harness } + } + + /** Whether `~/.local/bin` appears on PATH (split on `:`). */ + public static func cliDirectoryOnPATH( + pathEnv: String?, + cliDirectory: URL = defaultCLIDirectory() + ) -> Bool { + let needle = cliDirectory.path + let path = pathEnv ?? "" + return path.split(separator: ":").contains { String($0) == needle } + } + + /** Read a prior setup stamp (plain version string). */ + public static func readStamp(at url: URL) -> String? { + guard let data = try? Data(contentsOf: url), + let text = String(data: data, encoding: .utf8) + else { return nil } + let trimmed = text.trimmingCharacters(in: .whitespacesAndNewlines) + return trimmed.isEmpty ? nil : trimmed + } + + /** Persist the installed bundled version after a successful setup. */ + public static func writeStamp(version: String, to url: URL) throws { + try AtomicFile.write(Data("\(version)\n".utf8), to: url) + } + + /** Stage-and-rename a Mach-O into place (never overwrite a running signed binary). */ + public static func installBinary(from source: URL, to destination: URL) throws { + let fm = FileManager.default + try fm.createDirectory( + at: destination.deletingLastPathComponent(), withIntermediateDirectories: true) + let staged = destination.deletingLastPathComponent() + .appending(path: ".\(destination.lastPathComponent).staged-\(getpid())") + try? fm.removeItem(at: staged) + try fm.copyItem(at: source, to: staged) + try fm.setAttributes( + [.posixPermissions: NSNumber(value: Int16(0o755))], ofItemAtPath: staged.path) + _ = try fm.replaceItemAt(destination, withItemAt: staged) + } + + /** Stage-and-replace an .app bundle into /Applications (or `destination`). + Caller must quit any process still holding the destination first. */ + public static func installAppBundle(from source: URL, to destination: URL) throws { + let fm = FileManager.default + try fm.createDirectory( + at: destination.deletingLastPathComponent(), withIntermediateDirectories: true) + let staged = destination.deletingLastPathComponent() + .appending(path: ".\(destination.lastPathComponent).staged-\(getpid())") + try? fm.removeItem(at: staged) + try fm.copyItem(at: source, to: staged) + clearQuarantine(at: staged) + if fm.fileExists(atPath: destination.path) { + _ = try fm.replaceItemAt(destination, withItemAt: staged) + } else { + try fm.moveItem(at: staged, to: destination) + } + clearQuarantine(at: destination) + } + + /** Drop the DMG/Downloads quarantine so Gatekeeper trusts the Applications copy. */ + private static func clearQuarantine(at url: URL) { + let proc = Process() + proc.executableURL = URL(fileURLWithPath: "/usr/bin/xattr") + proc.arguments = ["-dr", "com.apple.quarantine", url.path] + proc.standardOutput = Pipe() + proc.standardError = Pipe() + try? proc.run() + proc.waitUntilExit() + } + + private static func parseVersion(_ raw: String) -> [Int] { + let head = raw.split(separator: " ", maxSplits: 1).first.map(String.init) ?? raw + let numeric = head.split(separator: "-").first.map(String.init) ?? head + return numeric.split(separator: ".").compactMap { Int($0) } + } +} + +/** One harness row on the first-run panel. */ +public struct HarnessOffer: Equatable, Sendable { + public var alreadyInstalled: Bool + public var defaultChecked: Bool + public var displayName: String + public var harness: String + + public init( + alreadyInstalled: Bool, + defaultChecked: Bool, + displayName: String, + harness: String + ) { + self.alreadyInstalled = alreadyInstalled + self.defaultChecked = defaultChecked + self.displayName = displayName + self.harness = harness + } +} + +/** Lightweight read of harness settings to decide checkbox defaults. Mirrors the + CLI adapters' "already installed" checks without writing. */ +enum HookPresence { + static func claudeHookInstalled(settingsURL: URL, expectedCLIPath: String) -> Bool { + guard let data = try? Data(contentsOf: settingsURL), + let settings = try? JSONSerialization.jsonObject(with: data) as? [String: Any], + let hooks = settings["hooks"] as? [String: Any], + let sessionStart = hooks["SessionStart"] as? [[String: Any]] + else { return false } + let expected = "\(expectedCLIPath) hook claude-session-start" + return sessionStart.contains { entry in + ((entry["hooks"] as? [[String: Any]]) ?? []).contains { hook in + let command = hook["command"] as? String ?? "" + return command == expected || command.contains("devctl hook claude-session-start") + } + } + } + + static func cursorHookInstalled(settingsURL: URL, expectedCLIPath: String) -> Bool { + guard let data = try? Data(contentsOf: settingsURL), + let settings = try? JSONSerialization.jsonObject(with: data) as? [String: Any], + let hooks = settings["hooks"] as? [String: Any], + let sessionStart = hooks["sessionStart"] as? [[String: Any]] + else { return false } + let expected = "\(expectedCLIPath) hook cursor-session-start" + return sessionStart.contains { entry in + let command = entry["command"] as? String ?? "" + return command == expected || command.contains("devctl hook cursor-session-start") + } + } +} diff --git a/Sources/DevCtlKit/Spotlight/SpotlightLabel.swift b/Sources/DevCtlKit/Spotlight/SpotlightLabel.swift index 4456385..3249010 100644 --- a/Sources/DevCtlKit/Spotlight/SpotlightLabel.swift +++ b/Sources/DevCtlKit/Spotlight/SpotlightLabel.swift @@ -22,6 +22,34 @@ public enum SpotlightLabel { "devctl · \(url)" } + /** Alternate titles Spotlight can match against without stuffing keywords. + Host leaf and head name are the tokens people type after the project. */ + public static func alternateNames(project: String, server: String, head: String?, url: String) + -> [String] + { + var names: Set = [project, server] + if let head { names.insert(head) } + if let host = URL(string: url)?.host { + let leaf = host.split(separator: ".").first.map(String.init) + if let leaf, !leaf.isEmpty, leaf != "localhost" { + names.insert(leaf) + } + } + names.remove(title(project: project, server: server, head: head)) + return names.sorted() + } + + /** Relative importance among our own indexed items (0…100). Live and pinned + surfaces win within the app; this cannot outrank filesystem Top Hits. */ + public static func rankingHint(phase: ServerPhase, pinned: Bool) -> Int { + if pinned { return 100 } + switch phase { + case .running, .unhealthy: return 100 + case .starting, .stopping: return 95 + case .crashed, .failed, .stopped: return 90 + } + } + /** Keyword tokens: project, server, head, distinctive host/path parts, plus the standing "devctl" / "dev server" anchors so a typed "devctl candor" still lands. */ diff --git a/Sources/devctl/CLI.swift b/Sources/devctl/CLI.swift index 4961c5e..6fd6d0c 100644 --- a/Sources/devctl/CLI.swift +++ b/Sources/devctl/CLI.swift @@ -140,14 +140,7 @@ enum CLIRunner { never past a deliberate-stop marker, install-if-missing when the devctld binary ships alongside this CLI. */ static func attemptBootstrap() async -> Bool { - guard ProcessInfo.processInfo.environment["DEVCTL_SOCKET"] == nil else { return false } - let paths = DevCtlPaths() - guard !FileManager.default.fileExists(atPath: paths.stoppedIntentFile.path) else { return false } - if FileManager.default.fileExists(atPath: LaunchdAdmin.plistURL.path) { - return (try? await LaunchdAdmin.start(paths: paths)) != nil - } - guard let binary = LaunchdAdmin.bundledDaemonBinary() else { return false } - return (try? await LaunchdAdmin.install(daemonBinary: binary, paths: paths)) != nil + await LaunchdAdmin.attemptBootstrap(extraDaemonCandidates: [CLISelf.daemonSibling]) } static func describe(_ status: ServerStatus) -> String { @@ -1019,12 +1012,19 @@ struct Doctor: AsyncParsableCommand { findings.append( Finding(detail: "v\(info.daemonVersion) pid \(info.pid) on \(info.socketPath)", kind: "daemon", severity: "ok")) let livePath = LaunchdAdmin.capturedPath() + let storedPath = LaunchdAdmin.readAgentPath() if let daemonPath = info.searchPath, daemonPath != livePath { findings.append( Finding( detail: "daemon PATH differs from the current login shell (captured at install; run: devctl daemon install)", kind: "path-staleness", severity: "warning")) } + if let storedPath, storedPath != livePath { + findings.append( + Finding( + detail: "agent.path differs from the current login shell (run: devctl daemon install)", + kind: "path-staleness", severity: "warning")) + } } else { findings.append( Finding(detail: "daemon not responding (run: devctl daemon status)", kind: "daemon", severity: "error")) @@ -1138,10 +1138,17 @@ struct DaemonInstall: AsyncParsableCommand { @Option(help: "Path to the devctld binary; defaults to the one alongside this devctl.") var devctld: String? + @Flag( + help: + "Force the home LaunchAgent path even when /Applications/devctl.app is present (CLI-only / smoke)." + ) + var legacy = false + @OptionGroup var global: GlobalOptions func run() async throws { - let binary = devctld.map { URL(fileURLWithPath: $0) } ?? LaunchdAdmin.bundledDaemonBinary() + let binary = devctld.map { URL(fileURLWithPath: $0) } + ?? LaunchdAdmin.resolveDaemonBinary(extraCandidates: [CLISelf.daemonSibling]) guard let binary else { CLIRunner.fail( WireError( @@ -1152,14 +1159,20 @@ struct DaemonInstall: AsyncParsableCommand { } let restored: [(project: String, name: String)] do { - restored = try await LaunchdAdmin.install(daemonBinary: binary, paths: DevCtlPaths()) + restored = try await LaunchdAdmin.install( + daemonBinary: binary, paths: DevCtlPaths(), forceLegacy: legacy) } catch let error as WireError { CLIRunner.fail(error, json: global.json) } + let viaApp = !legacy && LaunchdAdmin.applicationsAppPresent() CLIRunner.emit(WireEmpty(), json: global.json) { _ in - restored.isEmpty - ? "devctld installed and running (\(LaunchdAdmin.label))" - : "devctld installed; re-ensured \(restored.map(\.name).joined(separator: ", "))" + if restored.isEmpty { + viaApp + ? "devctld ensured via \(SetupPlanner.applicationsAppPath) (Login Items)" + : "devctld installed and running (\(LaunchdAdmin.label))" + } else { + "devctld installed; re-ensured \(restored.map(\.name).joined(separator: ", "))" + } } } } @@ -1185,11 +1198,20 @@ struct DaemonStart: AsyncParsableCommand { static let configuration = CommandConfiguration( commandName: "start", abstract: "Start a stopped daemon (clears the deliberate-stop marker).") + @Flag( + help: + "Force the home LaunchAgent path even when /Applications/devctl.app is present." + ) + var legacy = false + @OptionGroup var global: GlobalOptions func run() async throws { do { - try await LaunchdAdmin.start(paths: DevCtlPaths()) + try await LaunchdAdmin.startOrInstall( + paths: DevCtlPaths(), + extraDaemonCandidates: [CLISelf.daemonSibling], + forceLegacy: legacy) } catch let error as WireError { CLIRunner.fail(error, json: global.json) } @@ -1386,11 +1408,11 @@ struct Switch: AsyncParsableCommand { } } -/** Runs a command while holding a named resource exclusively: managed servers - declaring the resource in their `locks` are stopped first and re-ensured - after, and their starts are refused for the duration, so a test harness's - private server never contends with the managed one over shared mutable - state (a local database, a fixture tree). */ +/** Runs a command while holding a named resource exclusively. The daemon + pauses managed servers that declare the resource, refuses their starts for + the duration, and resumes them on release (or on recover when this process + dies), so a test harness's private server never contends with the managed + one over shared mutable state (a local database, a fixture tree). */ struct Lock: AsyncParsableCommand { static let configuration = CommandConfiguration( abstract: "Run a command holding a project resource; conflicting servers pause and return.") @@ -1421,52 +1443,32 @@ struct Lock: AsyncParsableCommand { let project = global.resolvedProject() let holderPid = Int(getpid()) let client = CLIRunner.client() - /** Which managed holders are up now decides what comes back after. */ - let statuses = (try? await client.request( - .serverStatus, params: ProjectParams(project: project), expecting: ServerListResult.self))? - .servers ?? [] - let merged = statuses.filter { status in - status.phase == .running || status.phase == .starting || status.phase == .unhealthy - } - var toRestore: [String] = [] - /** Acquire with patience: another harness may hold it. */ + /** Acquire with patience: another harness may hold it. The daemon owns + pause/resume of declaring servers; this CLI just runs the command. */ let deadline = Date().addingTimeInterval(acquireTimeout) - var acquired = false + var acquired: LockResult? var lastError: WireError? while Date() < deadline { do { - _ = try await client.request( + acquired = try await client.request( .lockAcquire, - params: LockParams(holderPid: holderPid, project: project, resource: resource), - expecting: WireEmpty.self) - acquired = true + params: LockParams( + holderPid: holderPid, project: project, resource: resource, + resumeTimeoutSeconds: timeout), + expecting: LockResult.self) break } catch let error as WireError where error.code == .resourceLocked { lastError = error try? await Task.sleep(for: .seconds(1)) } } - guard acquired else { + guard let acquired else { CLIRunner.fail( lastError ?? WireError(code: .resourceLocked, message: "could not acquire '\(resource)'"), json: global.json) } - /** Stop the managed holders of this resource (recorded for the return - trip). The daemon knows which specs declare it via config; the CLI - asks per-server status and stops the ones whose spec declares the - resource: simplest source is the config itself. */ - if let view = try? ProjectConfigLoader.load(project: project) { - for spec in view.specs where (spec.locks ?? []).contains(resource) { - let wasActive = merged.contains { $0.server == spec.name } - if wasActive { - toRestore.append(spec.name) - _ = try? await client.request( - .serverStop, - params: ServerTargetParams(name: spec.name, project: project), - expecting: ServerResult.self) - print("paused \(spec.name) (holds \(resource))") - } - } + for name in acquired.paused { + print("paused \(name) (holds \(resource))") } /** Run the guarded command with inherited stdio. */ let process = Process() @@ -1481,18 +1483,15 @@ struct Lock: AsyncParsableCommand { } catch { FileHandle.standardError.write(Data("devctl lock: cannot run command: \(error)\n".utf8)) } - /** Release, then bring the paused servers back even if the command - failed: the checkpointed world returns either way. */ - _ = try? await client.request( + /** Release resumes whoever was paused, even if the command failed. */ + let released = (try? await client.request( .lockRelease, - params: LockParams(holderPid: holderPid, project: project, resource: resource), - expecting: WireEmpty.self) - for name in toRestore { + params: LockParams( + holderPid: holderPid, project: project, resource: resource, + resumeTimeoutSeconds: timeout), + expecting: LockResult.self)) ?? LockResult() + for name in released.paused { print("resuming \(name)…") - _ = try? await client.request( - .serverEnsure, - params: EnsureParams(name: name, project: project, timeoutSeconds: timeout), - expecting: EnsureResult.self) } Foundation.exit(commandStatus) } diff --git a/Sources/devctl/HookSupport.swift b/Sources/devctl/HookSupport.swift index 0d8418a..44868ff 100644 --- a/Sources/devctl/HookSupport.swift +++ b/Sources/devctl/HookSupport.swift @@ -14,6 +14,12 @@ enum CLISelf { return fallbackPath() } + /** The devctld that shipped alongside this devctl; the preferred install + source because it is version-matched to this binary. */ + static var daemonSibling: URL { + URL(fileURLWithPath: path).deletingLastPathComponent().appending(path: "devctld") + } + /** Standard 2-call `_NSGetExecutablePath`: query size, then fill. */ private static func dyldExecutablePath() -> String? { var size: UInt32 = 0 diff --git a/Sources/devctl/LaunchdAdmin.swift b/Sources/devctl/LaunchdAdmin.swift deleted file mode 100644 index 820a0fe..0000000 --- a/Sources/devctl/LaunchdAdmin.swift +++ /dev/null @@ -1,225 +0,0 @@ -import DevCtlKit -import Foundation - -/** launchd administration: install renders the LaunchAgent and bootstraps it; - upgrades stage-and-rename the binary (overwriting a running signed Mach-O - gets it SIGKILLed); restart drains, kickstarts, and re-ensures what ran. */ -enum LaunchdAdmin { - static let label = "dev.quantizor.devctl" - - static var plistURL: URL { - FileManager.default.homeDirectoryForCurrentUser - .appending(path: "Library/LaunchAgents/\(label).plist") - } - - /** The devctld binary that ships alongside this devctl binary. */ - static func bundledDaemonBinary() -> URL? { - let selfPath = URL(fileURLWithPath: CLISelf.path) - let sibling = selfPath.deletingLastPathComponent().appending(path: "devctld") - return FileManager.default.isExecutableFile(atPath: sibling.path) ? sibling : nil - } - - /** Install (or upgrade) the LaunchAgent. Same bounce contract as restart: - capture what is running, drain, swap binary + bootstrap, re-ensure. The - daemon's recoverAtStartup is the reboot path; install cannot rely on it - alone because a pre-feature state.json may lack resumeOnBoot, and the - CLI already knows the live names from status. */ - static func install(daemonBinary: URL, paths: DevCtlPaths) async throws -> [(project: String, name: String)] { - let fm = FileManager.default - try fm.createDirectory(at: paths.daemonBinaryDir, withIntermediateDirectories: true) - let destination = paths.daemonBinaryDir.appending(path: "devctld") - /** Stage-and-rename: never cp over a running signed binary. */ - let staged = paths.daemonBinaryDir.appending(path: ".devctld.staged-\(getpid())") - try? fm.removeItem(at: staged) - try fm.copyItem(at: daemonBinary, to: staged) - _ = try fm.replaceItemAt(destination, withItemAt: staged) - let plist = renderPlist(daemonPath: destination.path, paths: paths) - try fm.createDirectory(at: plistURL.deletingLastPathComponent(), withIntermediateDirectories: true) - try Data(plist.utf8).write(to: plistURL) - try? fm.removeItem(at: paths.stoppedIntentFile) - let client = DaemonClient(socketPath: paths.socketPath) - let runningServers = await captureActiveServers(client: client) - /** Drain through the daemon FIRST: bootout's own kill can outrun the - SIGTERM drain and orphan server trees mid-escalation. */ - _ = try? await client.request(.daemonShutdown, params: WireEmpty(), expecting: WireEmpty.self) - for _ in 0..<50 where FileManager.default.fileExists(atPath: paths.socketPath) { - if (try? await DaemonClient(socketPath: paths.socketPath) - .request(.daemonInfo, params: WireEmpty(), expecting: DaemonInfo.self)) == nil { - break - } - try? await Task.sleep(for: .milliseconds(100)) - } - try? fm.removeItem(at: paths.stoppedIntentFile) - _ = shell("/bin/launchctl", ["bootout", "gui/\(getuid())/\(label)"]) - let bootstrap = shell("/bin/launchctl", ["bootstrap", "gui/\(getuid())", plistURL.path]) - /** A concurrent session bootstrapping first reports already-bootstrapped; - the socket poll below is the actual success signal. */ - if bootstrap.status != 0, !bootstrap.output.contains("already bootstrapped"), - !bootstrap.output.contains("Bootstrap failed: 5: Input/output error") { - throw WireError( - code: .internalError, - hint: "run: launchctl bootstrap gui/\(getuid()) \(plistURL.path)", - message: "launchctl bootstrap failed (\(bootstrap.status)): \(bootstrap.output)") - } - try await pollHello(paths: paths) - await reensure(runningServers, paths: paths) - return runningServers - } - - static func uninstall(paths: DevCtlPaths, purge: Bool) async { - let client = DaemonClient(socketPath: paths.socketPath) - _ = try? await client.request(.daemonShutdown, params: WireEmpty(), expecting: WireEmpty.self) - _ = shell("/bin/launchctl", ["bootout", "gui/\(getuid())/\(label)"]) - try? FileManager.default.removeItem(at: plistURL) - if purge { - try? FileManager.default.removeItem(at: paths.dataDir) - try? FileManager.default.removeItem(at: paths.logsDir) - } - } - - static func start(paths: DevCtlPaths) async throws { - try? FileManager.default.removeItem(at: paths.stoppedIntentFile) - guard FileManager.default.fileExists(atPath: plistURL.path) else { - throw WireError( - code: .internalError, - hint: "run: devctl daemon install", - message: "no LaunchAgent installed at \(plistURL.path)") - } - let result = shell("/bin/launchctl", ["kickstart", "gui/\(getuid())/\(label)"]) - if result.status != 0 { - _ = shell("/bin/launchctl", ["bootstrap", "gui/\(getuid())", plistURL.path]) - } - try await pollHello(paths: paths) - } - - /** Drain, kickstart -k, re-ensure what was running: "servers bounce, then - come back" is the restart contract. */ - static func restart(paths: DevCtlPaths) async throws -> [(project: String, name: String)] { - let client = DaemonClient(socketPath: paths.socketPath) - let runningServers = await captureActiveServers(client: client) - try? FileManager.default.removeItem(at: paths.stoppedIntentFile) - let result = shell("/bin/launchctl", ["kickstart", "-k", "gui/\(getuid())/\(label)"]) - if result.status != 0 { - throw WireError( - code: .internalError, - hint: "run: devctl daemon install", - message: "launchctl kickstart failed (\(result.status)): \(result.output)") - } - try await pollHello(paths: paths) - await reensure(runningServers, paths: paths) - return runningServers - } - - static func captureActiveServers(client: DaemonClient) async -> [(project: String, name: String)] { - guard let all = try? await client.request( - .serverStatus, params: ProjectParams(project: ""), expecting: ServerListResult.self) - else { return [] } - return all.servers - .filter { $0.phase == .running || $0.phase == .starting || $0.phase == .unhealthy } - .map { (project: $0.project, name: $0.server) } - } - - static func reensure( - _ servers: [(project: String, name: String)], paths: DevCtlPaths - ) async { - let fresh = DaemonClient(socketPath: paths.socketPath) - for server in servers { - _ = try? await fresh.request( - .serverEnsure, - params: EnsureParams(name: server.name, project: server.project, timeoutSeconds: 60), - expecting: EnsureResult.self) - } - } - - static func launchdState() -> String { - let result = shell("/bin/launchctl", ["print", "gui/\(getuid())/\(label)"]) - if result.status != 0 { return "not bootstrapped" } - for line in result.output.split(separator: "\n") { - let trimmed = line.trimmingCharacters(in: .whitespaces) - if trimmed.hasPrefix("state =") || trimmed.hasPrefix("pid =") { - return trimmed - } - } - return "bootstrapped" - } - - static func pollHello(paths: DevCtlPaths, timeoutSeconds: Double = 5) async throws { - let deadline = Date().addingTimeInterval(timeoutSeconds) - var lastError: Error = WireError(code: .daemonUnreachable, message: "daemon never answered") - while Date() < deadline { - do { - let client = DaemonClient(socketPath: paths.socketPath) - _ = try await client.request(.daemonInfo, params: WireEmpty(), expecting: DaemonInfo.self) - return - } catch { - lastError = error - try? await Task.sleep(for: .milliseconds(200)) - } - } - throw lastError - } - - /** Captured login-shell PATH so launchd children can find Homebrew/asdf/mise - tools; launchd agents otherwise get a minimal PATH. Goes stale after a - Homebrew migration, which doctor surfaces via daemon.info. */ - static func capturedPath() -> String { - let result = shell("/bin/zsh", ["-lc", "echo $PATH"]) - let path = result.output.trimmingCharacters(in: .whitespacesAndNewlines) - return path.isEmpty ? "/usr/bin:/bin:/usr/sbin:/sbin" : path - } - - static func renderPlist(daemonPath: String, paths: DevCtlPaths) -> String { - """ - - - - - EnvironmentVariables - - PATH - \(capturedPath()) - - ExitTimeOut - 120 - KeepAlive - - SuccessfulExit - - - Label - \(label) - ProcessType - Interactive - ProgramArguments - - \(daemonPath) - - RunAtLoad - - StandardErrorPath - \(paths.daemonLog.path) - StandardOutPath - \(paths.daemonLog.path) - - - """ - } - - @discardableResult - static func shell(_ path: String, _ arguments: [String]) -> (status: Int32, output: String) { - let process = Process() - process.executableURL = URL(fileURLWithPath: path) - process.arguments = arguments - let pipe = Pipe() - process.standardOutput = pipe - process.standardError = pipe - do { - try process.run() - } catch { - return (status: -1, output: String(describing: error)) - } - let data = pipe.fileHandleForReading.readDataToEndOfFile() - process.waitUntilExit() - return (status: process.terminationStatus, output: String(decoding: data, as: UTF8.self)) - } -} diff --git a/Sources/devctld/Info.plist b/Sources/devctld/Info.plist new file mode 100644 index 0000000..43bae6c --- /dev/null +++ b/Sources/devctld/Info.plist @@ -0,0 +1,18 @@ + + + + + + CFBundleDisplayName + quantizor/devctl + CFBundleIdentifier + dev.quantizor.devctld + CFBundleName + quantizor/devctl + CFBundlePackageType + APPL + LSMinimumSystemVersion + 14.0 + + diff --git a/Sources/devctld/main.swift b/Sources/devctld/main.swift index 083e69c..ff92060 100644 --- a/Sources/devctld/main.swift +++ b/Sources/devctld/main.swift @@ -63,25 +63,42 @@ guard flock(lockFD, LOCK_EX | LOCK_NB) == 0 else { exit(0) } -/** Raise the fd ceiling: launchd jobs default to a 256 soft limit, and a dozen - servers plus log subscribers approaches it. */ +/** Raise the fd ceiling only when below the target: launchd jobs default to a + 256 soft limit, and a dozen servers plus log subscribers approaches it. Never + lower an already-higher soft limit. */ var limit = rlimit() if getrlimit(RLIMIT_NOFILE, &limit) == 0 { - limit.rlim_cur = min(limit.rlim_max, rlim_t(8192)) - setrlimit(RLIMIT_NOFILE, &limit) + let target = min(limit.rlim_max, rlim_t(8192)) + if limit.rlim_cur < target { + limit.rlim_cur = target + if setrlimit(RLIMIT_NOFILE, &limit) != 0 { + FileHandle.standardError.write( + Data( + "devctld: setrlimit(RLIMIT_NOFILE) failed: \(String(cString: strerror(errno)))\n" + .utf8)) + } + } } /** A running daemon is proof any prior deliberate-stop intent is spent. */ try? FileManager.default.removeItem(at: paths.stoppedIntentFile) +/** Merge the install-time login PATH before any child spawn so Homebrew tools + stay findable under a sealed in-bundle LaunchAgent. */ +LaunchdAdmin.applyAgentPathToProcess(paths: paths) + let registry = Registry(paths: paths) let router = Router(launcher: SubprocessLauncher(), paths: paths, registry: registry) /** Sleep/wake awareness: health probes pause during sleep and get a grace - window on wake so lid-open does not flap every server unhealthy. The IOKit - message constants are iokit_common_msg values from IOMessage.h, written as - literals inside the C callback (it cannot capture top-level lets): 0xE0000270 - can-sleep, 0xE0000280 will-sleep, 0xE0000300 has-powered-on. */ + window on wake so lid-open does not flap every server unhealthy. IOKit + message macros (`kIOMessageCanSystemSleep` et al.) do not bridge into Swift; + these named values match IOMessage.h (`iokit_common_msg`). */ +enum PowerMessage { + static let canSystemSleep: natural_t = 0xE000_0270 + static let systemHasPoweredOn: natural_t = 0xE000_0300 + static let systemWillSleep: natural_t = 0xE000_0280 +} final class PowerContext { var rootPort: io_connect_t = 0 } @@ -95,20 +112,23 @@ powerContext.rootPort = IORegisterForSystemPower( guard let refcon else { return } let context = Unmanaged.fromOpaque(refcon).takeUnretainedValue() switch messageType { - case 0xE000_0270, 0xE000_0280: - if messageType == 0xE000_0280 { + case PowerMessage.canSystemSleep, PowerMessage.systemWillSleep: + if messageType == PowerMessage.systemWillSleep { Task { await PowerState.shared.recordSleep() } } /** Sleep is never vetoed; failing to acknowledge stalls the system. */ IOAllowPowerChange(context.rootPort, Int(bitPattern: argument)) - case 0xE000_0300: + case PowerMessage.systemHasPoweredOn: Task { await PowerState.shared.recordWake() } default: break } }, &powerNotifier) -if let powerPort { +if powerContext.rootPort == 0 { + FileHandle.standardError.write( + Data("devctld: IORegisterForSystemPower failed; sleep/wake probes are unaware\n".utf8)) +} else if let powerPort { IONotificationPortSetDispatchQueue(powerPort, DispatchQueue.main) } @@ -128,12 +148,28 @@ Task { } /** Graceful termination: drain-stop every supervised server through the normal - teardown path, then exit 0 (a deliberate stop must not trigger KeepAlive). */ + teardown path, unregister power notifications, then exit 0 (a deliberate + stop must not trigger KeepAlive). */ let terminationSource = DispatchSource.makeSignalSource(signal: SIGTERM, queue: .main) signal(SIGTERM, SIG_IGN) terminationSource.setEventHandler { - Task { + Task { @MainActor in await router.drainAll() + if let port = powerPort { + IONotificationPortSetDispatchQueue(port, nil) + } + if powerNotifier != 0 { + IODeregisterForSystemPower(&powerNotifier) + powerNotifier = 0 + } + if powerContext.rootPort != 0 { + IOServiceClose(powerContext.rootPort) + powerContext.rootPort = 0 + } + if let port = powerPort { + IONotificationPortDestroy(port) + powerPort = nil + } exit(0) } } diff --git a/Tests/DevCtlDaemonCoreTests/ProcessTreeTests.swift b/Tests/DevCtlDaemonCoreTests/ProcessTreeTests.swift new file mode 100644 index 0000000..fa4e4c7 --- /dev/null +++ b/Tests/DevCtlDaemonCoreTests/ProcessTreeTests.swift @@ -0,0 +1,40 @@ +import Darwin +import Foundation +import Testing + +@testable import DevCtlDaemonCore + +@Suite struct ProcessTreeTests { + @Test func allocationRoundsUpAndNeverOverstatesBytes() { + let stride = MemoryLayout.stride + let plan = ProcessTree.allocation(forProbedBytes: stride * 3 + 1) + #expect(plan.capacity >= 4) + #expect(plan.byteCount == plan.capacity * stride) + #expect(plan.byteCount % stride == 0) + } + + @Test func allocationZeroProbeIsEmpty() { + let plan = ProcessTree.allocation(forProbedBytes: 0) + #expect(plan.capacity == 0) + #expect(plan.byteCount == 0) + } + + @Test func shouldSignalRejectsMissingAndReusedPid() { + let snap = ProcessIdentity(pid: 42, startSeconds: 100, startMicroseconds: 5) + #expect(ProcessTree.shouldSignal(snapshotted: snap, live: nil) == false) + let reused = ProcessIdentity(pid: 42, startSeconds: 200, startMicroseconds: 0) + #expect(ProcessTree.shouldSignal(snapshotted: snap, live: reused) == false) + #expect(ProcessTree.shouldSignal(snapshotted: snap, live: snap) == true) + } + + @Test func failedDescendantsAreNotEmptySuccess() { + /** Live sweep against a nonsense pid still returns .ok([]) (no children), + never .failed. Failure is a sysctl errno path; assert the result type + distinguishes the two shapes we care about. */ + let none = DescendantsResult.ok([]) + let fail = DescendantsResult.failed(errno: ENOMEM) + #expect(none.identities.isEmpty) + #expect(fail.identities.isEmpty) + #expect(none != fail) + } +} diff --git a/Tests/DevCtlDaemonCoreTests/ResourceLockTests.swift b/Tests/DevCtlDaemonCoreTests/ResourceLockTests.swift new file mode 100644 index 0000000..a525582 --- /dev/null +++ b/Tests/DevCtlDaemonCoreTests/ResourceLockTests.swift @@ -0,0 +1,210 @@ +import DevCtlKit +import Foundation +import Testing + +@testable import DevCtlDaemonCore + +private struct LockEnv { + let paths: DevCtlPaths + let projectPath: String +} + +private func makeLockEnv() throws -> LockEnv { + let base = FileManager.default.temporaryDirectory.appending(path: "devctl-lock-\(UUID().uuidString)") + let project = base.appending(path: "proj") + try FileManager.default.createDirectory(at: project, withIntermediateDirectories: true) + return LockEnv( + paths: DevCtlPaths(dataDir: base.appending(path: "data"), logsDir: base.appending(path: "logs")), + projectPath: project.path) +} + +private func writeLockDevservers(project: String) throws { + let body = """ + { + "servers": { + "db": { + "command": ["/bin/sh", "-c", "sleep 60"], + "locks": ["data"] + } + }, + "version": 1 + } + """ + try Data(body.utf8).write( + to: URL(fileURLWithPath: project).appending(path: "devservers.json")) +} + +private func handle( + router: Router, method: WireMethod, params: P, expecting: R.Type +) async throws -> R { + let line = try NDJSON.encodeLine( + WireRequest(id: "t", method: method.rawValue, params: params)) + let data = await router.handle(line: line) + let response = try JSONCoding.decoder().decode(WireResponse.self, from: data) + guard response.ok, let result = response.result else { + throw response.error + ?? WireError(code: .internalError, message: "request failed") + } + return result +} + +private func startDB(router: Router, project: String) async throws { + _ = try await handle( + router: router, method: .serverStart, + params: ServerTargetParams(name: "db", project: project), + expecting: ServerResult.self) + /** Give spawn a beat so phase is active for pause detection. */ + try await Task.sleep(for: .milliseconds(200)) +} + +private func phaseOf(router: Router, project: String, name: String) async throws -> ServerPhase { + let list = try await handle( + router: router, method: .serverStatus, + params: ProjectParams(project: project), + expecting: ServerListResult.self) + let server = try #require(list.servers.first { $0.server == name }) + return server.phase +} + +@Suite struct ResourceLockTests { + /** Acquire pauses the declaring server, refuses ensure, release brings it + back. Pause is non-retiring so boot intent survives the hold. */ + @Test func acquirePausesReleaseResumesAndPreservesBootIntent() async throws { + let env = try makeLockEnv() + try writeLockDevservers(project: env.projectPath) + let registry = Registry(paths: env.paths) + try await registry.setTrusted(project: env.projectPath) + let router = Router(launcher: SubprocessLauncher(), paths: env.paths, registry: registry) + try await startDB(router: router, project: env.projectPath) + let id = serverID(project: env.projectPath, name: "db") + #expect(await registry.persistedState(serverID: id)?.resumeOnBoot == true) + + let acquired = try await handle( + router: router, method: .lockAcquire, + params: LockParams( + holderPid: Int(getpid()), project: env.projectPath, resource: "data", + resumeTimeoutSeconds: 15), + expecting: LockResult.self) + #expect(acquired.paused == ["db"]) + #expect(try await phaseOf(router: router, project: env.projectPath, name: "db") == .stopped) + #expect(await registry.persistedState(serverID: id)?.resumeOnBoot == true) + #expect(FileManager.default.fileExists(atPath: env.paths.locksFile.path)) + + let ensureLine = try NDJSON.encodeLine( + WireRequest( + id: "e", method: WireMethod.serverEnsure.rawValue, + params: EnsureParams(name: "db", project: env.projectPath, timeoutSeconds: 2))) + let ensureData = await router.handle(line: ensureLine) + let ensureResponse = try JSONCoding.decoder().decode( + WireResponse.self, from: ensureData) + #expect(ensureResponse.ok == false) + #expect(ensureResponse.error?.code == .resourceLocked) + + let released = try await handle( + router: router, method: .lockRelease, + params: LockParams( + holderPid: Int(getpid()), project: env.projectPath, resource: "data", + resumeTimeoutSeconds: 15), + expecting: LockResult.self) + #expect(released.paused == ["db"]) + let phase = try await phaseOf(router: router, project: env.projectPath, name: "db") + #expect(phase == .starting || phase == .running) + _ = try await handle( + router: router, method: .serverStop, + params: ServerTargetParams(name: "db", project: env.projectPath), + expecting: ServerResult.self) + } + + /** The candor failure: daemon dies mid-hold, holder is gone, recover must + resume the paused set from locks.json. */ + @Test func recoverResumesWhenHolderIsDead() async throws { + let env = try makeLockEnv() + try writeLockDevservers(project: env.projectPath) + let registry = Registry(paths: env.paths) + try await registry.setTrusted(project: env.projectPath) + let id = serverID(project: env.projectPath, name: "db") + try await registry.updateState(serverID: id) { entry in + entry.phase = .stopped + entry.resumeOnBoot = true + entry.pid = nil + } + /** A pid we know is gone: spawn and wait, then reuse the identifier. */ + let probe = Process() + probe.executableURL = URL(fileURLWithPath: "/usr/bin/true") + try probe.run() + probe.waitUntilExit() + let deadPid = Int(probe.processIdentifier) + #expect(kill(pid_t(deadPid), 0) != 0) + let key = "\(env.projectPath)::data" + try AtomicFile.write( + JSONCoding.encoder().encode( + LocksFile( + locks: [ + key: LockHolder( + paused: ["db"], pid: deadPid, resumeTimeoutSeconds: 15, since: Date()) + ])), + to: env.paths.locksFile) + + let router = Router(launcher: SubprocessLauncher(), paths: env.paths, registry: registry) + await router.recoverAtStartup() + let phase = try await phaseOf(router: router, project: env.projectPath, name: "db") + #expect(phase == .starting || phase == .running) + let locks = AtomicFile.loadDefensively(LocksFile.self, from: env.paths.locksFile) + #expect(locks?.locks.isEmpty == true) + _ = try await handle( + router: router, method: .serverStop, + params: ServerTargetParams(name: "db", project: env.projectPath), + expecting: ServerResult.self) + } + + /** If the harness survived the daemon restart, recover must leave the + paused server down and keep the lock so ensure stays refused. */ + @Test func recoverLeavesPausedWhenHolderStillAlive() async throws { + let env = try makeLockEnv() + try writeLockDevservers(project: env.projectPath) + let registry = Registry(paths: env.paths) + try await registry.setTrusted(project: env.projectPath) + let id = serverID(project: env.projectPath, name: "db") + try await registry.updateState(serverID: id) { entry in + entry.phase = .stopped + entry.resumeOnBoot = true + entry.pid = nil + } + let livePid = Int(getpid()) + let key = "\(env.projectPath)::data" + try AtomicFile.write( + JSONCoding.encoder().encode( + LocksFile( + locks: [ + key: LockHolder( + paused: ["db"], pid: livePid, resumeTimeoutSeconds: 15, since: Date()) + ])), + to: env.paths.locksFile) + + let router = Router(launcher: SubprocessLauncher(), paths: env.paths, registry: registry) + await router.recoverAtStartup() + #expect(try await phaseOf(router: router, project: env.projectPath, name: "db") == .stopped) + + let ensureLine = try NDJSON.encodeLine( + WireRequest( + id: "e", method: WireMethod.serverEnsure.rawValue, + params: EnsureParams(name: "db", project: env.projectPath, timeoutSeconds: 2))) + let ensureData = await router.handle(line: ensureLine) + let ensureResponse = try JSONCoding.decoder().decode( + WireResponse.self, from: ensureData) + #expect(ensureResponse.error?.code == .resourceLocked) + + _ = try await handle( + router: router, method: .lockRelease, + params: LockParams( + holderPid: livePid, project: env.projectPath, resource: "data", + resumeTimeoutSeconds: 15), + expecting: LockResult.self) + let phase = try await phaseOf(router: router, project: env.projectPath, name: "db") + #expect(phase == .starting || phase == .running) + _ = try await handle( + router: router, method: .serverStop, + params: ServerTargetParams(name: "db", project: env.projectPath), + expecting: ServerResult.self) + } +} diff --git a/Tests/DevCtlKitTests/DaemonRecoveryPolicyTests.swift b/Tests/DevCtlKitTests/DaemonRecoveryPolicyTests.swift new file mode 100644 index 0000000..8bd41ad --- /dev/null +++ b/Tests/DevCtlKitTests/DaemonRecoveryPolicyTests.swift @@ -0,0 +1,115 @@ +import Foundation +import Testing + +@testable import DevCtlKit + +@Suite struct LegacyAgentPlistTests { + /** launchd rejects an ExitTimeOut above 60, silently clamps it, and logs + "ExitTimeOut is larger than the maximum allowed", so the rendered value + has to stay inside the ceiling. */ + @Test func exitTimeOutStaysUnderLaunchdCeiling() throws { + let dir = FileManager.default.temporaryDirectory.appending(path: "devctl-test-\(UUID().uuidString)") + defer { try? FileManager.default.removeItem(at: dir) } + let paths = DevCtlPaths(dataDir: dir) + let plist = LaunchdAdmin.renderPlist(daemonPath: "/tmp/devctld", paths: paths) + let data = try #require(plist.data(using: .utf8)) + let parsed = try #require( + try PropertyListSerialization.propertyList(from: data, format: nil) as? [String: Any]) + let exitTimeOut = try #require(parsed["ExitTimeOut"] as? Int) + #expect(exitTimeOut <= 60) + } +} + +@Suite struct AgentRebindPolicyTests { + @Test func deliberateStopSkipsRegisterUnlessRebind() { + #expect( + AgentRebindPolicy.shouldRegisterAtLaunch( + deliberatelyStopped: true, rebindNeeded: false) == false) + #expect( + AgentRebindPolicy.shouldRegisterAtLaunch( + deliberatelyStopped: true, rebindNeeded: true) == true) + } + + @Test func runningInstallRegisters() { + #expect( + AgentRebindPolicy.shouldRegisterAtLaunch( + deliberatelyStopped: false, rebindNeeded: false) == true) + #expect( + AgentRebindPolicy.shouldRegisterAtLaunch( + deliberatelyStopped: false, rebindNeeded: true) == true) + } + + @Test func forceReregisterOnlyWhenRebindMarked() { + #expect( + AgentRebindPolicy.shouldForceReregisterAfterHelloMiss(rebindNeeded: true)) + #expect( + !AgentRebindPolicy.shouldForceReregisterAfterHelloMiss(rebindNeeded: false)) + } + + @Test func rebindMarkerRoundTrip() throws { + let dir = FileManager.default.temporaryDirectory + .appending(path: "devctl-rebind-\(UUID().uuidString)") + defer { try? FileManager.default.removeItem(at: dir) } + let paths = DevCtlPaths(dataDir: dir) + #expect(!LaunchdAdmin.agentRebindNeeded(paths: paths)) + try LaunchdAdmin.markAgentRebindNeeded(paths: paths) + #expect(LaunchdAdmin.agentRebindNeeded(paths: paths)) + LaunchdAdmin.clearAgentRebindMarker(paths: paths) + #expect(!LaunchdAdmin.agentRebindNeeded(paths: paths)) + } +} + +@Suite struct DaemonRecoveryPolicyTests { + private let now = Date(timeIntervalSince1970: 1_800_000_000) + + @Test func reachableDaemonNeedsNothing() { + #expect( + DaemonRecoveryPolicy.decide( + reachable: true, stoppedOnPurpose: false, recovering: false, lastAttempt: nil, + now: now) == .healthy) + } + + @Test func crashedDaemonRecoversImmediately() { + #expect( + DaemonRecoveryPolicy.decide( + reachable: false, stoppedOnPurpose: false, recovering: false, lastAttempt: nil, + now: now) == .recover) + } + + /** A deliberate `devctl daemon stop` must survive the app's poll loop. */ + @Test func deliberateStopWaitsForTheUser() { + #expect( + DaemonRecoveryPolicy.decide( + reachable: false, stoppedOnPurpose: true, recovering: false, lastAttempt: nil, + now: now) == .awaitUser) + /** Intent wins even when a cooldown would otherwise allow a retry. */ + #expect( + DaemonRecoveryPolicy.decide( + reachable: false, stoppedOnPurpose: true, recovering: false, + lastAttempt: now.addingTimeInterval(-3600), now: now) == .awaitUser) + } + + @Test func attemptInFlightIsNotStacked() { + #expect( + DaemonRecoveryPolicy.decide( + reachable: false, stoppedOnPurpose: false, recovering: true, lastAttempt: nil, + now: now) == .inFlight) + } + + @Test func failedAttemptCoolsDownThenRetries() { + #expect( + DaemonRecoveryPolicy.decide( + reachable: false, stoppedOnPurpose: false, recovering: false, + lastAttempt: now.addingTimeInterval(-1), now: now) == .cooling) + /** Boundary: exactly at the cooldown is eligible again. */ + #expect( + DaemonRecoveryPolicy.decide( + reachable: false, stoppedOnPurpose: false, recovering: false, + lastAttempt: now.addingTimeInterval(-DaemonRecoveryPolicy.cooldown), now: now) + == .recover) + #expect( + DaemonRecoveryPolicy.decide( + reachable: false, stoppedOnPurpose: false, recovering: false, + lastAttempt: now.addingTimeInterval(-60), now: now) == .recover) + } +} diff --git a/Tests/DevCtlKitTests/DeepLinkNotificationActionTests.swift b/Tests/DevCtlKitTests/DeepLinkNotificationActionTests.swift index 9c3b0fe..749b7c5 100644 --- a/Tests/DevCtlKitTests/DeepLinkNotificationActionTests.swift +++ b/Tests/DevCtlKitTests/DeepLinkNotificationActionTests.swift @@ -23,10 +23,17 @@ import Testing #expect(link == DeepLink(verb: .why, projectSlug: "candor", server: "cms")) } + @Test func defaultBodyTapMapsToOpen() { + let link = DeepLinkNotificationAction.link( + actionId: DeepLinkNotificationAction.defaultActionId, + projectSlug: "candor", server: "cms", head: "wren-hollow") + #expect(link == DeepLink(verb: .open, projectSlug: "candor", server: "cms", head: "wren-hollow")) + } + @Test func unknownActionIsNil() { #expect( DeepLinkNotificationAction.link( - actionId: "com.apple.UNNotificationDefaultActionIdentifier", + actionId: "com.apple.UNNotificationDismissActionIdentifier", projectSlug: "candor", server: "cms") == nil) } } diff --git a/Tests/DevCtlKitTests/SetupPlannerTests.swift b/Tests/DevCtlKitTests/SetupPlannerTests.swift new file mode 100644 index 0000000..2d91512 --- /dev/null +++ b/Tests/DevCtlKitTests/SetupPlannerTests.swift @@ -0,0 +1,173 @@ +import Foundation +import Testing +@testable import DevCtlKit + +@Suite("SetupPlanner") +struct SetupPlannerTests { + @Test func compareVersionsOrdersSemver() { + #expect(SetupPlanner.compareVersions("1.0.0", "1.0.1") == .orderedAscending) + #expect(SetupPlanner.compareVersions("1.2.0", "1.1.9") == .orderedDescending) + #expect(SetupPlanner.compareVersions("1.2.0", "1.2.0") == .orderedSame) + #expect(SetupPlanner.compareVersions("", "1.0.0") == .orderedAscending) + #expect(SetupPlanner.compareVersions("2.0", "2.0.0") == .orderedSame) + } + + @Test func shouldPresentOnFreshInstall() { + #expect( + SetupPlanner.shouldPresent( + bundledVersion: "1.2.0", + installedCLIVersion: nil, + stampVersion: nil, + resourcesPresent: true)) + } + + @Test func shouldPresentWhenBundledNewerThanStamp() { + #expect( + SetupPlanner.shouldPresent( + bundledVersion: "1.3.0", + installedCLIVersion: "1.2.0", + stampVersion: "1.2.0", + resourcesPresent: true)) + } + + @Test func shouldSkipWhenVersionsMatch() { + #expect( + !SetupPlanner.shouldPresent( + bundledVersion: "1.2.0", + installedCLIVersion: "1.2.0", + stampVersion: "1.2.0", + resourcesPresent: true)) + } + + @Test func shouldPresentWhenRunningOutsideApplicationsEvenIfVersionsMatch() { + #expect( + SetupPlanner.shouldPresent( + bundledVersion: "1.2.0", + installedCLIVersion: "1.2.0", + stampVersion: "1.2.0", + resourcesPresent: true, + runningOutsideApplications: true)) + } + + @Test func shouldSkipWithoutResources() { + #expect( + !SetupPlanner.shouldPresent( + bundledVersion: "1.2.0", + installedCLIVersion: nil, + stampVersion: nil, + resourcesPresent: false)) + #expect( + !SetupPlanner.shouldPresent( + bundledVersion: "1.2.0", + installedCLIVersion: nil, + stampVersion: nil, + resourcesPresent: false, + runningOutsideApplications: true)) + } + + @Test func isRunningOutsideApplicationsComparesCanonicalPaths() { + #expect( + SetupPlanner.isRunningOutsideApplications( + bundlePath: "/Volumes/devctl/devctl.app")) + #expect( + !SetupPlanner.isRunningOutsideApplications( + bundlePath: SetupPlanner.applicationsAppPath)) + } + + @Test func isMigrationDetectsPriorLayout() { + #expect(SetupPlanner.isMigration( + installedCLIExists: true, stampExists: false, launchAgentExists: false)) + #expect(SetupPlanner.isMigration( + installedCLIExists: false, stampExists: false, launchAgentExists: true)) + #expect( + !SetupPlanner.isMigration( + installedCLIExists: false, stampExists: false, launchAgentExists: false)) + } + + @Test func cliDirectoryOnPATH() { + let dir = SetupPlanner.defaultCLIDirectory( + home: URL(fileURLWithPath: "/Users/test")) + #expect( + SetupPlanner.cliDirectoryOnPATH( + pathEnv: "/usr/bin:\(dir.path):/bin", cliDirectory: dir)) + #expect( + !SetupPlanner.cliDirectoryOnPATH( + pathEnv: "/usr/bin:/bin", cliDirectory: dir)) + } + + @Test func harnessOffersDefaultCheckedOnlyWhenNeeded() throws { + let root = FileManager.default.temporaryDirectory + .appending(path: "devctl-setup-\(UUID().uuidString)") + defer { try? FileManager.default.removeItem(at: root) } + let home = root.appending(path: "home") + try FileManager.default.createDirectory( + at: home.appending(path: ".claude"), withIntermediateDirectories: true) + try FileManager.default.createDirectory( + at: home.appending(path: ".cursor"), withIntermediateDirectories: true) + + let cliPath = home.appending(path: ".local/bin/devctl").path + let offersFresh = SetupPlanner.harnessOffers(home: home, installedCLIPath: cliPath) + #expect(offersFresh.map(\.harness) == ["claude", "cursor"]) + #expect(offersFresh.allSatisfy { $0.defaultChecked && !$0.alreadyInstalled }) + + let claudeSettings = """ + {"hooks":{"SessionStart":[{"hooks":[{"command":"\(cliPath) hook claude-session-start","type":"command"}],"matcher":"startup|resume|clear|compact"}]}} + """ + try Data(claudeSettings.utf8).write( + to: home.appending(path: ".claude/settings.json")) + let cursorSettings = """ + {"hooks":{"sessionStart":[{"command":"\(cliPath) hook cursor-session-start"}]},"version":1} + """ + try Data(cursorSettings.utf8).write(to: home.appending(path: ".cursor/hooks.json")) + + let offersInstalled = SetupPlanner.harnessOffers(home: home, installedCLIPath: cliPath) + #expect(offersInstalled.count == 2) + #expect(offersInstalled.allSatisfy { $0.alreadyInstalled && !$0.defaultChecked }) + } + + @Test func stampRoundTrip() throws { + let root = FileManager.default.temporaryDirectory + .appending(path: "devctl-stamp-\(UUID().uuidString)") + defer { try? FileManager.default.removeItem(at: root) } + try FileManager.default.createDirectory(at: root, withIntermediateDirectories: true) + let stamp = root.appending(path: "setup.stamp") + try SetupPlanner.writeStamp(version: "1.2.0", to: stamp) + #expect(SetupPlanner.readStamp(at: stamp) == "1.2.0") + } + + @Test func installBinaryStageAndRename() throws { + let root = FileManager.default.temporaryDirectory + .appending(path: "devctl-bin-\(UUID().uuidString)") + defer { try? FileManager.default.removeItem(at: root) } + try FileManager.default.createDirectory(at: root, withIntermediateDirectories: true) + let source = root.appending(path: "src-bin") + let dest = root.appending(path: "bin/devctl") + try Data("#!/bin/sh\necho ok\n".utf8).write(to: source) + try SetupPlanner.installBinary(from: source, to: dest) + #expect(FileManager.default.isExecutableFile(atPath: dest.path)) + let again = root.appending(path: "src-bin-2") + try Data("#!/bin/sh\necho v2\n".utf8).write(to: again) + try SetupPlanner.installBinary(from: again, to: dest) + let body = try String(contentsOf: dest, encoding: .utf8) + #expect(body.contains("v2")) + } + + @Test func installAppBundleReplacesExisting() throws { + let root = FileManager.default.temporaryDirectory + .appending(path: "devctl-app-\(UUID().uuidString)") + defer { try? FileManager.default.removeItem(at: root) } + let apps = root.appending(path: "Applications") + try FileManager.default.createDirectory(at: apps, withIntermediateDirectories: true) + let source = root.appending(path: "source.app") + let dest = apps.appending(path: "devctl.app") + try FileManager.default.createDirectory( + at: source.appending(path: "Contents"), withIntermediateDirectories: true) + try Data("v1".utf8).write(to: source.appending(path: "Contents/marker")) + try FileManager.default.createDirectory( + at: dest.appending(path: "Contents"), withIntermediateDirectories: true) + try Data("old".utf8).write(to: dest.appending(path: "Contents/marker")) + try SetupPlanner.installAppBundle(from: source, to: dest) + let body = try String(contentsOf: dest.appending(path: "Contents/marker"), encoding: .utf8) + #expect(body == "v1") + } +} diff --git a/Tests/DevCtlKitTests/SpotlightLabelTests.swift b/Tests/DevCtlKitTests/SpotlightLabelTests.swift index 3df56a2..f652520 100644 --- a/Tests/DevCtlKitTests/SpotlightLabelTests.swift +++ b/Tests/DevCtlKitTests/SpotlightLabelTests.swift @@ -32,4 +32,24 @@ import Testing url: "http://demo1.localhost:3000/qa") == ["candor", "demo1", "dev server", "devctl", "qa"]) } + + @Test func alternateNamesDropPrimaryTitle() { + #expect( + SpotlightLabel.alternateNames( + project: "candor", server: "candor", head: "operator", + url: "http://candor.localhost:3000/") + == ["candor", "operator"]) + #expect( + SpotlightLabel.alternateNames( + project: "styled-components", server: "native", head: nil, + url: "http://native.localhost:3000/") + == ["native", "styled-components"]) + } + + @Test func rankingHintTiersLiveAndPinned() { + #expect(SpotlightLabel.rankingHint(phase: .running, pinned: false) == 100) + #expect(SpotlightLabel.rankingHint(phase: .stopped, pinned: true) == 100) + #expect(SpotlightLabel.rankingHint(phase: .starting, pinned: false) == 95) + #expect(SpotlightLabel.rankingHint(phase: .stopped, pinned: false) == 90) + } } diff --git a/Tests/DevCtlKitTests/WireTests.swift b/Tests/DevCtlKitTests/WireTests.swift index 81113df..f8fb04f 100644 --- a/Tests/DevCtlKitTests/WireTests.swift +++ b/Tests/DevCtlKitTests/WireTests.swift @@ -98,4 +98,29 @@ import Testing #expect(quarantined.count == 1) try? FileManager.default.removeItem(at: dir) } + + /** Two writers inside one process must both succeed: a pid-only temp name + made them rename the same temp file out from under each other, which is + how the app lost agent.path when launch registration and the recovery + poll wrote it at the same moment. */ + @Test func concurrentWritesToOneFileAllSucceed() async throws { + let dir = FileManager.default.temporaryDirectory.appending(path: "devctl-test-\(UUID().uuidString)") + let file = dir.appending(path: "agent.path") + let payloads = (0..<8).map { "payload-\($0)" } + try await withThrowingTaskGroup(of: Void.self) { group in + for payload in payloads { + group.addTask { + try AtomicFile.write(Data(payload.utf8), to: file) + } + } + try await group.waitForAll() + } + let written = try String(decoding: Data(contentsOf: file), as: UTF8.self) + #expect(payloads.contains(written)) + /** No temp files survive a clean run. */ + let leftovers = try FileManager.default.contentsOfDirectory(atPath: dir.path) + .filter { $0.hasPrefix(".agent.path.tmp-") } + #expect(leftovers.isEmpty) + try? FileManager.default.removeItem(at: dir) + } } diff --git a/docs/cli-contract.md b/docs/cli-contract.md index e319ed7..9888335 100644 --- a/docs/cli-contract.md +++ b/docs/cli-contract.md @@ -56,7 +56,7 @@ Filled in per phase as each lands; golden tests reference the examples in this f - `devctl doctor [--fix] --json` → `{findings: [{detail, kind, severity}]}`: daemon/launchd state, captured-PATH staleness, the host:port signature table with conflicts, unmanaged listeners on managed ports, and registry entries whose project path no longer exists (`--fix` prunes those). - `devctl switch [--no-fetch] [--timeout 120]` → clean-tree guard (refuses dirty; never stashes), fetch, group down, `git switch` (remote-tracking fallback), then the project's `lifecycle.switch` playbook (argv arrays run sequentially from the project root; failures stop with `devctl up` as the resume hint), then group up. Playbooks live in devservers.json `lifecycle` and are agent-configurable. - Config extras: project-level `icon` (project-relative path, per-server override) feeds Spotlight thumbnails; every server and head is indexed in Spotlight as ` · ` with subtitle `devctl · ` (best-effort; not a Top Hit launcher); `heads` and pins surface in the menu bar app. -- `devctl lock -- [--acquire-timeout 300] [--timeout 120]` → runs the command holding a project resource exclusively. Servers declaring the resource in their `locks` (devservers.json) are stopped first and re-ensured after (even on command failure); `ensure`/`start` of a declaring server is refused (`resource-locked`, naming the holder pid) while a live holder owns it; a dead holder auto-releases. Exit status is the command's. The mechanism for test harnesses whose private servers share mutable state (a local database) with a managed server. +- `devctl lock -- [--acquire-timeout 300] [--timeout 120]` → runs the command holding a project resource exclusively. The daemon pauses servers that declare the resource in their `locks` (devservers.json) and re-ensures them on release (even on command failure); `ensure`/`start` of a declaring server is refused (`resource-locked`, naming the holder pid) while a live holder owns it. Locks persist across a daemon crash: a dead holder auto-releases and resumes the paused set; a still-live holder keeps them paused so the harness stays exclusive. Exit status is the command's. The mechanism for test harnesses whose private servers share mutable state (a local database) with a managed server. - `devctl daemon install|uninstall [--purge]|start|stop|restart|status`: launchd lifecycle. `stop` drains and writes a deliberate-stop marker that auto-bootstrap honors; `restart` and `install` (upgrade) both capture running servers, bounce the daemon, and re-ensure them by name ("servers bounce, then come back"). `install` also stages-and-renames the daemon binary and captures the login-shell PATH into the agent plist. Reboot recovery: the LaunchAgent runs at load; starting a server records resume-on-boot; a machine shutdown drains without clearing it; `recoverAtStartup` resolves specs through the merged config+registry view (so committed `devservers.json` servers come back, not only ad-hoc `register` entries). A deliberate `devctl stop`/`down` clears the intent. Renamed or deleted servers leave orphan state rows that recover drops. - `devctl context`: the harness-agnostic session context: a fenced `` plain-text block (server phases, URLs, log paths, the ensure/wait/why/logs cheat-sheet) for the cwd's project. Silent (exit 0) when the project is unregistered or untrusted or the daemon is down; never bootstraps; never contains raw log lines or command strings. - `devctl hook install [--harness claude|cursor] [--statusline]`: idempotently wires a session-start hook into the harness's settings (claude: SessionStart with matcher `startup|resume|clear|compact` in ~/.claude/settings.json, emitting `hookSpecificOutput.additionalContext`; cursor: sessionStart in ~/.cursor/hooks.json, emitting `{additional_context}`). After a successful install it also prints a one-bullet discovery tip for the project's CLAUDE.md/AGENTS.md (wired to the nearest devservers.json's first server when one exists); the tip is printed for a human to paste and is never auto-appended to those files. Adding a harness: CONTRIBUTING.md. diff --git a/docs/design.md b/docs/design.md index 4735f1d..6d53208 100644 --- a/docs/design.md +++ b/docs/design.md @@ -36,14 +36,14 @@ Swift 6.3 (6.3.3 latest), Swift 6 language mode with strict concurrency. Depende - `Sources/devctl/`: CLI executable (swift-argument-parser). - `Sources/DevCtlApp/`: SwiftUI MenuBarExtra app, pure DaemonClient consumer, default-MainActor module isolation. - `Sources/fixture-server/`: test helper executable (TCP/HTTP responder with `--exit-after`, `--spawn-grandchild`, `--ignore-sigterm`, `--emit-binary`, `--flood` modes). -- `Makefile` + `scripts/make-app-bundle.sh` + `scripts/install.sh`, `Resources/` (Info.plist with LSUIElement, launchd plist template, AppIcon.icns). +- `Makefile` + `scripts/make-app-bundle.sh` (fat app: CLI + daemon in `Contents/Resources`) + `scripts/make-dmg.sh` + `scripts/notarize.sh`. Info.plist is generated by the bundle script (LSUIElement, `devctl://` URL scheme). ## On-disk layout -- `~/Library/Application Support/devctl/`: `daemon.sock` (0600; fallback `/tmp/devctl-$UID/daemon.sock` near the 104-byte sun_path limit; `DEVCTL_SOCKET` overrides; actual path advertised in `daemon.info`), `daemon.lock` (flock held for daemon lifetime; the single-instance mutex: the lock holder alone may unlink and rebind the socket, so stale-socket takeover cannot race), `registry.json`, `state.json`, `stopped.intent` (marker written by deliberate shutdown; auto-bootstrap honors it), `bin/devctld` (stable path the launchd plist points at), `daemon.log` (self-rotated 10 MB × 5; the launchd redirect catches pre-init stderr only). +- `~/Library/Application Support/devctl/`: `daemon.sock` (0600; fallback `/tmp/devctl-$UID/daemon.sock` near the 104-byte sun_path limit; `DEVCTL_SOCKET` overrides; actual path advertised in `daemon.info`), `daemon.lock` (flock held for daemon lifetime; the single-instance mutex: the lock holder alone may unlink and rebind the socket, so stale-socket takeover cannot race), `registry.json`, `state.json`, `locks.json` (held resource locks with the servers they paused; survives a daemon crash so a dead holder still resumes what it stopped), `stopped.intent` (marker written by deliberate shutdown; auto-bootstrap honors it), `agent.path` (login-shell PATH captured at install; the daemon merges it into process env at start so sealed in-bundle plists need not bake PATH), `bin/devctld` (stable path the legacy home LaunchAgent points at), `daemon.log` (self-rotated 10 MB × 5; the launchd redirect catches pre-init stderr only on the legacy path). - State durability: atomic writes are temp + fsync + rename. On load-parse failure, rename the file to `.corrupt-`, log a `sys` event, continue with empty state; corruption is never fatal (a parse crash under KeepAlive would loop forever). - `~/Library/Logs/devctl/-//`: `current.log` + rotated `.1`-`.5`, `spool.log` (raw child output, truncated per run), `health.json` (ring of last 100 health transitions). -- `~/Library/LaunchAgents/dev.quantizor.devctl.plist`. +- LaunchAgent dual path: when `/Applications/devctl.app` is present, `SMAppService.agent` registers the in-bundle `Contents/Library/LaunchAgents/dev.quantizor.devctl.plist` (`BundleProgram` → `Contents/Helpers/devctld`); CLI `daemon install` opens `devctl://daemon/ensure` so registration runs with the app's `Bundle.main`. Without the app, legacy `~/Library/LaunchAgents/dev.quantizor.devctl.plist` + Application Support `bin/devctld` + `AssociatedBundleIdentifiers` remains (`devctl daemon install --legacy` forces it). - Server identity: `serverID = "::"`, where canonical = realpath (symlinks resolved, on-disk case) computed identically in CLI and daemon, so `~/code` symlinks and `/tmp` vs `/private/tmp` cannot mint duplicate identities. ## Config model: devservers.json (committed at project root) @@ -126,7 +126,7 @@ Every command has `--json` (stable schemas carrying `schemaVersion`, generated f - `devctl hook install --statusline` offers a statusline snippet (stdin carries `workspace.current_dir`): `myproj:3000 ok · api:8787 crashed`. - Discovery: after a successful install `hook install` prints a one-bullet CLAUDE.md/AGENTS.md stanza for the project (`DiscoveryStanza.render`, wired to the nearest devservers.json's first server), so an agent that has never heard of devctl learns to prefer `devctl ensure` over `npm run dev`. Printed for a human to paste; devctl never edits those files. - Deep links: the menu bar app declares `devctl://` (`CFBundleURLTypes`). Path form `devctl:////[/]` (verbs: open, ensure, stop, why); query form accepted. Shared `DeepLink` + `DeepLinkRunner` in DevCtlKit; `devctl link` prints, `devctl x-url` dispatches for smoke, Launch Services delivers to the app. Crash notifications carry Open/Why actions that synthesize the same links. App Intents (backlog) should wrap the runner. -- Spotlight: Core Spotlight indexes each server/head as ` · ` (subtitle `devctl · `, `.text` content type). Best-effort discovery only: Apple does not let third-party items outrank filesystem / heavy-usage app Top Hits for a one-word project name. Fast path is Raycast/Alfred + `devctl://`, or the menu bar. +- Spotlight: Core Spotlight indexes each server/head as ` · ` (subtitle `devctl · `, `.text` content type). Updates are incremental with preserved `lastUsedDate` and live/pinned `rankingHint` tiers. Best-effort discovery only: Apple does not let third-party items outrank filesystem / heavy-usage app Top Hits for a one-word project name. Fast path is Raycast/Alfred + `devctl://`, or the menu bar. - Unified logging: `OSLog` subsystem `dev.quantizor.devctl` (daemon, supervisor, health, app, deeplink). Spool files remain the child-output source of truth. - `docs/cli-contract.md` in the repo enumerates every command's JSON schema and per-phase behavior; it is the contract the golden tests enforce and lands before the code that implements it. @@ -141,12 +141,13 @@ Plist: `RunAtLoad`, `KeepAlive = {SuccessfulExit: false}`, `ProcessType=Interact - One `@Observable @MainActor DaemonModel` owning a DaemonClient; `status.subscribe` mirrors pushes; reconnect loop with backoff so daemon restarts are invisible to the UI. - Ambient state: the menu bar glyph itself reports aggregate health, quiet when everything is green, badged when anything crashed or failed; the app subscribes to the event stream and posts a macOS notification on crash with Open / Why actions (UserNotifications lives in the app since the daemon has no bundle; actions dispatch through DeepLinkRunner). - Dropdown: per-project sections, rows = status dot + name + host:port + start/stop/restart; clicking a row opens the server's URL in the default browser (Evan's request); footer: Open Dashboard, Quit (app only). +- Daemon down: the app resurrects devctld via `SMAppService` when the bundle ships `Contents/Library/LaunchAgents` (Login Items naming shows the responsible app), falling back to the legacy home LaunchAgent install from Resources when needed. Rate-limited so a broken install cannot spin. A deliberate `devctl daemon stop` suppresses that (intent outranks liveness), so the row always carries a Start button and reports a failed recovery rather than dead-ending. - Dashboard: NavigationSplitView; virtualized log viewer over `logs.follow` with replay, search, jump-to-marker; config editor writing through `project.writeConfig` with optimistic concurrency (write carries the hash of the loaded version; daemon rejects on mismatch with reload-and-retry, so an IDE edit is never silently clobbered; v1 warns that writes normalize formatting); a timeline lane per server built from the event stream (colored phase spans with marker pins, replacing a bare sparkline); port/signature map (declared vs observed, squatter pids). - Project aesthetic (recorded in CLAUDE.md at bootstrap): a quiet instrument panel. Monochrome SF Symbols glyph, tally-light status dots with a subtle breathing animation on `starting`, dense but calm typography, no chrome; state changes register visibly but never shout. ## Build pipeline (no Xcode ever) -`make build` = `swift build -c release`; `make app` = checked-in `scripts/make-app-bundle.sh` assembling `devctl.app/Contents/{MacOS,Info.plist,Resources}` + ad-hoc `codesign --force --sign -`; `make install` = binaries to `~/.local/bin`, app to /Applications, `devctl daemon install`. `SIGN_IDENTITY` variable upgrades to Developer ID + notarization at OSS-release time. Tuist/XcodeGen/Swift Bundler evaluated and rejected (Xcode dependency or unclear release cadence); the script is the documentation. +`make build` = `swift build -c release`; `make app` = checked-in `scripts/make-app-bundle.sh` assembling `devctl.app/Contents/{MacOS,Info.plist,Resources}` with CLI + daemon in Resources + ad-hoc `codesign` (Developer ID via `SIGN_IDENTITY`); `make dmg` = UDZO via `scripts/make-dmg.sh` (app alone, no `/Applications` symlink, over a generated background telling the user to double-click; the app relocates itself on confirm); `make install` = CLI + daemon to `~/.local/bin`, app to /Applications, `devctl daemon install`. First launch of the app runs a setup panel (migrate binaries, bounce daemon, opt-in harness hooks). Notarization: `scripts/notarize.sh`; GitHub Actions `.github/workflows/release-dmg.yml` attaches a stapled DMG on release. Tuist/XcodeGen/Swift Bundler evaluated and rejected (Xcode dependency or unclear release cadence); the script is the documentation. ## Implementation phases diff --git a/scripts/make-app-bundle.sh b/scripts/make-app-bundle.sh index c204f32..8e2b86f 100755 --- a/scripts/make-app-bundle.sh +++ b/scripts/make-app-bundle.sh @@ -1,28 +1,92 @@ #!/bin/zsh -# Assembles devctl.app from the SPM-built DevCtlApp binary. No Xcode: the bundle -# is directory layout + Info.plist + signature. Ad-hoc signed by default; pass a -# Developer ID identity as $1 to upgrade. +# Assembles devctl.app from the SPM-built products. No Xcode: the bundle is +# directory layout + Info.plist + signature. Contents/Resources carries the CLI +# (and a Resources copy of the daemon for setup); Contents/Helpers/devctld is the +# SMAppService BundleProgram target; Contents/Library/LaunchAgents holds the +# in-bundle agent plist. Ad-hoc signed by default; pass a Developer ID identity +# as $1 to upgrade (notarization needs it). set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" IDENTITY="${1:--}" CONFIG="${2:-release}" -BINARY="$ROOT/.build/$CONFIG/DevCtlApp" +BUILD="$ROOT/.build/$CONFIG" +APP_BINARY="$BUILD/DevCtlApp" +CLI_BINARY="$BUILD/devctl" +DAEMON_BINARY="$BUILD/devctld" APP="$ROOT/devctl.app" +LABEL="dev.quantizor.devctl" -[[ -x "$BINARY" ]] || { echo "make-app-bundle: build first (missing $BINARY)" >&2; exit 1 } +[[ -x "$APP_BINARY" ]] || { echo "make-app-bundle: build first (missing $APP_BINARY)" >&2; exit 1 } +[[ -x "$CLI_BINARY" ]] || { echo "make-app-bundle: build first (missing $CLI_BINARY)" >&2; exit 1 } +[[ -x "$DAEMON_BINARY" ]] || { echo "make-app-bundle: build first (missing $DAEMON_BINARY)" >&2; exit 1 } + +ICON_ICNS="$ROOT/Resources/AppIcon.icns" +[[ -f "$ICON_ICNS" ]] || { echo "make-app-bundle: missing $ICON_ICNS" >&2; exit 1 } rm -rf "$APP" -mkdir -p "$APP/Contents/MacOS" "$APP/Contents/Resources" -cp "$BINARY" "$APP/Contents/MacOS/devctl-app" +mkdir -p \ + "$APP/Contents/MacOS" \ + "$APP/Contents/Resources" \ + "$APP/Contents/Helpers" \ + "$APP/Contents/Library/LaunchAgents" +cp "$APP_BINARY" "$APP/Contents/MacOS/devctl-app" +cp "$CLI_BINARY" "$APP/Contents/Resources/devctl" +cp "$DAEMON_BINARY" "$APP/Contents/Resources/devctld" +cp "$DAEMON_BINARY" "$APP/Contents/Helpers/devctld" +cp "$ICON_ICNS" "$APP/Contents/Resources/AppIcon.icns" +chmod 755 \ + "$APP/Contents/MacOS/devctl-app" \ + "$APP/Contents/Resources/devctl" \ + "$APP/Contents/Resources/devctld" \ + "$APP/Contents/Helpers/devctld" + +# Sealed in-bundle agent: BundleProgram (SMAppService-only), static PATH floor. +# Dynamic login PATH lives in Application Support/agent.path (daemon applies it). +# Stdio redirects omitted: per-user paths cannot be baked into a notarized plist; +# the daemon writes its own daemon.log after start. +cat > "$APP/Contents/Library/LaunchAgents/${LABEL}.plist" < + + + + BundleProgram + Contents/Helpers/devctld + EnvironmentVariables + + PATH + /opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin + + ExitTimeOut + 60 + KeepAlive + + SuccessfulExit + + + Label + ${LABEL} + ProcessType + Interactive + RunAtLoad + + + +PLIST + +VERSION="$("$CLI_BINARY" --version 2>/dev/null || echo 0.1.0)" cat > "$APP/Contents/Info.plist" < + CFBundleDisplayName + quantizor/devctl CFBundleExecutable devctl-app + CFBundleIconFile + AppIcon CFBundleIdentifier dev.quantizor.devctl.app CFBundleInfoDictionaryVersion @@ -32,7 +96,7 @@ cat > "$APP/Contents/Info.plist" <CFBundlePackageType APPL CFBundleShortVersionString - $("$ROOT/.build/$CONFIG/devctl" --version 2>/dev/null || echo 0.1.0) + $VERSION LSMinimumSystemVersion 14.0 LSUIElement @@ -42,6 +106,8 @@ cat > "$APP/Contents/Info.plist" < CFBundleURLName dev.quantizor.devctl.url + CFBundleTypeRole + Editor CFBundleURLSchemes devctl @@ -55,5 +121,21 @@ cat > "$APP/Contents/Info.plist" < "$APP/Contents/PkgInfo" -codesign --force --sign "$IDENTITY" "$APP" -echo "assembled $APP (signed: $IDENTITY)" + +sign() { + local target="$1" + if [[ "$IDENTITY" == "-" ]]; then + codesign --force --sign "$IDENTITY" "$target" + else + # Hardened runtime is required for Developer ID notarization. + codesign --force --options runtime --sign "$IDENTITY" "$target" + fi +} + +# Nested Mach-Os first, then the outer bundle (Gatekeeper walks inward). +sign "$APP/Contents/Resources/devctl" +sign "$APP/Contents/Resources/devctld" +sign "$APP/Contents/Helpers/devctld" +sign "$APP/Contents/MacOS/devctl-app" +sign "$APP" +echo "assembled $APP (signed: $IDENTITY; Helpers/devctld + LaunchAgents + Resources)" diff --git a/scripts/make-dmg-background.swift b/scripts/make-dmg-background.swift new file mode 100644 index 0000000..42d0108 --- /dev/null +++ b/scripts/make-dmg-background.swift @@ -0,0 +1,89 @@ +#!/usr/bin/env swift +/** Renders the DMG background (1x + 2x PNGs) that tells the user to double-click + the app. Generated at build time so no binary asset lives in the repo. + Usage: make-dmg-background.swift */ +import AppKit +import Foundation + +let width: CGFloat = 560 +let height: CGFloat = 380 + +guard CommandLine.arguments.count > 1 else { + FileHandle.standardError.write(Data("make-dmg-background: missing output directory\n".utf8)) + exit(1) +} +let outputDirectory = URL(fileURLWithPath: CommandLine.arguments[1]) + +func render(scale: CGFloat) -> Data? { + guard + let rep = NSBitmapImageRep( + bitmapDataPlanes: nil, + pixelsWide: Int(width * scale), + pixelsHigh: Int(height * scale), + bitsPerSample: 8, + samplesPerPixel: 4, + hasAlpha: true, + isPlanar: false, + colorSpaceName: .deviceRGB, + bytesPerRow: 0, + bitsPerPixel: 0) + else { return nil } + rep.size = NSSize(width: width, height: height) + + guard let context = NSGraphicsContext(bitmapImageRep: rep) else { return nil } + NSGraphicsContext.saveGraphicsState() + NSGraphicsContext.current = context + + NSColor(calibratedWhite: 0.976, alpha: 1).setFill() + NSRect(x: 0, y: 0, width: width, height: height).fill() + + /** Hairline frame: quiet instrument-panel edge, not chrome. */ + NSColor(calibratedWhite: 0.902, alpha: 1).setStroke() + let frame = NSBezierPath(rect: NSRect(x: 0.5, y: 0.5, width: width - 1, height: height - 1)) + frame.lineWidth = 1 + frame.stroke() + + let paragraph = NSMutableParagraphStyle() + paragraph.alignment = .center + + /** The context has a bottom-left origin, so each rect's y is measured up from + the bottom while the text itself lays out downward from the rect's top. + The Finder icon sits centered at 125 points down from the window's top. */ + let heading = NSAttributedString( + string: "Double-click to install", + attributes: [ + .font: NSFont.systemFont(ofSize: 19, weight: .semibold), + .foregroundColor: NSColor(calibratedWhite: 0.153, alpha: 1), + .paragraphStyle: paragraph, + ]) + heading.draw(in: NSRect(x: 40, y: height - 240 - 28, width: width - 80, height: 28)) + + let detail = NSAttributedString( + string: + "It sets up the command line tool, background service, and menu bar app.\nYou will see exactly what changes and confirm before anything runs.", + attributes: [ + .font: NSFont.systemFont(ofSize: 12.5, weight: .regular), + .foregroundColor: NSColor(calibratedWhite: 0.435, alpha: 1), + .paragraphStyle: paragraph, + ]) + detail.draw(in: NSRect(x: 40, y: height - 276 - 44, width: width - 80, height: 44)) + + NSGraphicsContext.restoreGraphicsState() + return rep.representation(using: .png, properties: [:]) +} + +do { + try FileManager.default.createDirectory( + at: outputDirectory, withIntermediateDirectories: true) + for (scale, name) in [(CGFloat(1), "background.png"), (CGFloat(2), "background@2x.png")] { + guard let data = render(scale: scale) else { + FileHandle.standardError.write(Data("make-dmg-background: render failed\n".utf8)) + exit(1) + } + try data.write(to: outputDirectory.appending(path: name)) + } +} catch { + FileHandle.standardError.write( + Data("make-dmg-background: \(error.localizedDescription)\n".utf8)) + exit(1) +} diff --git a/scripts/make-dmg.sh b/scripts/make-dmg.sh new file mode 100755 index 0000000..906a85a --- /dev/null +++ b/scripts/make-dmg.sh @@ -0,0 +1,114 @@ +#!/bin/zsh +# Builds the devctl DMG from the assembled (and signed) devctl.app. +# Usage: scripts/make-dmg.sh [SIGN_IDENTITY] +# +# The image holds the app alone: no /Applications symlink. Setup happens inside +# the app (it copies itself to /Applications after an explicit confirm), so a +# drag target would be a second, conflicting way to install. The window +# background says to double-click instead. +# +# Finder styling needs a GUI session. Without one the AppleScript pass is skipped +# and the image still ships, just unstyled: plain icon view, background file +# present but unused. Set DEVCTL_DMG_REQUIRE_LAYOUT=1 to make that a hard error, +# so a release build never quietly loses the instructions. +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +IDENTITY="${1:--}" +APP="$ROOT/devctl.app" +DIST="$ROOT/dist" +STAGE="$DIST/dmg-stage" +VOLUME_NAME="devctl" + +[[ -d "$APP" ]] || { echo "make-dmg: run make app first (missing $APP)" >&2; exit 1 } + +VERSION="$(/usr/libexec/PlistBuddy -c 'Print :CFBundleShortVersionString' "$APP/Contents/Info.plist" 2>/dev/null || echo 0.0.0)" +DMG="$DIST/devctl-${VERSION}.dmg" +RW_DMG="$DIST/.devctl-${VERSION}.rw.dmg" + +rm -rf "$STAGE" +mkdir -p "$STAGE/.background" "$DIST" +ditto "$APP" "$STAGE/devctl.app" + +echo "rendering background..." +swift "$ROOT/scripts/make-dmg-background.swift" "$STAGE/.background" +tiffutil -cathidpicheck \ + "$STAGE/.background/background.png" \ + "$STAGE/.background/background@2x.png" \ + -out "$STAGE/.background/background.tiff" > /dev/null +rm -f "$STAGE/.background/background.png" "$STAGE/.background/background@2x.png" + +rm -f "$DMG" "$RW_DMG" +hdiutil create \ + -volname "$VOLUME_NAME" \ + -srcfolder "$STAGE" \ + -ov \ + -format UDRW \ + "$RW_DMG" > /dev/null + +# Mount under /Volumes and read the name back: Finder resolves the window by +# volume name, and a stale devctl mount makes this one "devctl 1". Custom +# -mountpoint or -nobrowse both break the AppleScript lookup. +MOUNT_POINT="$(hdiutil attach "$RW_DMG" -noverify -noautoopen | awk -F'\t' '/\/Volumes\// { print $NF }' | tail -1)" +[[ -n "$MOUNT_POINT" ]] || { echo "make-dmg: could not mount $RW_DMG" >&2; exit 1 } +MOUNTED_NAME="$(basename "$MOUNT_POINT")" +abort_cleanup() { + hdiutil detach "$MOUNT_POINT" -quiet 2>/dev/null || true + rm -f "$RW_DMG" + rm -rf "$STAGE" +} +trap abort_cleanup EXIT + +LAYOUT_LOG="$(mktemp "${TMPDIR:-/tmp}/devctl-dmg-layout.XXXXXX")" +if osascript - "$MOUNTED_NAME" > "$LAYOUT_LOG" 2>&1 <<'APPLESCRIPT' +on run argv + set volumeName to item 1 of argv + tell application "Finder" + tell disk volumeName + open + set current view of container window to icon view + set toolbar visible of container window to false + set statusbar visible of container window to false + set the bounds of container window to {200, 120, 760, 500} + set viewOptions to the icon view options of container window + set arrangement of viewOptions to not arranged + set icon size of viewOptions to 128 + set text size of viewOptions to 12 + set background picture of viewOptions to file ".background:background.tiff" + set position of item "devctl.app" of container window to {280, 125} + update without registering applications + delay 1 + close + end tell + end tell +end run +APPLESCRIPT +then + echo "applied Finder window layout" + rm -f "$LAYOUT_LOG" +elif [[ "${DEVCTL_DMG_REQUIRE_LAYOUT:-0}" == "1" ]]; then + echo "make-dmg: Finder window layout failed and DEVCTL_DMG_REQUIRE_LAYOUT=1" >&2 + cat "$LAYOUT_LOG" >&2 + echo "make-dmg: run from a logged-in GUI session, grant the terminal Automation access for Finder, and check that no other volume is named $VOLUME_NAME" >&2 + exit 1 +else + echo "note: skipped Finder layout; the image ships unstyled. Reason:" + sed 's/^/ /' "$LAYOUT_LOG" + rm -f "$LAYOUT_LOG" +fi + +rm -rf "$MOUNT_POINT/.fseventsd" +sync +hdiutil detach "$MOUNT_POINT" -quiet +trap - EXIT + +hdiutil convert "$RW_DMG" -format UDZO -imagekey zlib-level=9 -ov -o "$DMG" > /dev/null +rm -f "$RW_DMG" +rm -rf "$STAGE" + +if [[ "$IDENTITY" != "-" ]]; then + codesign --force --sign "$IDENTITY" "$DMG" + echo "signed DMG with $IDENTITY" +fi + +echo "wrote $DMG" diff --git a/scripts/notarize.sh b/scripts/notarize.sh new file mode 100755 index 0000000..e6d112d --- /dev/null +++ b/scripts/notarize.sh @@ -0,0 +1,52 @@ +#!/bin/zsh +# Notarize and staple a Developer ID-signed DMG (or app). Credentials come from +# the environment / keychain; never commit secrets. +# +# Auth (one of): +# NOTARY_KEYCHAIN_PROFILE (default: devctl-notary) — local notarytool store-credentials +# APPLE_API_KEY_ID + APPLE_API_ISSUER + (APPLE_API_KEY_PATH | APPLE_API_KEY_BASE64) — CI +# Optional: +# NOTARIZE_TARGET (path to .dmg or .app; default: newest dist/devctl-*.dmg) +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" + +TARGET="${NOTARIZE_TARGET:-}" +if [[ -z "$TARGET" ]]; then + TARGET="$(ls -t "$ROOT"/dist/devctl-*.dmg 2>/dev/null | head -1 || true)" +fi +[[ -n "$TARGET" && -e "$TARGET" ]] || { + echo "notarize: no target (set NOTARIZE_TARGET or build make dmg first)" >&2 + exit 1 +} + +PROFILE="${NOTARY_KEYCHAIN_PROFILE:-devctl-notary}" +AUTH_ARGS=() +CLEANUP_KEY="" + +if [[ -n "${APPLE_API_KEY_ID:-}" && -n "${APPLE_API_ISSUER:-}" ]]; then + KEY_PATH="${APPLE_API_KEY_PATH:-}" + if [[ -z "$KEY_PATH" ]]; then + : "${APPLE_API_KEY_BASE64:?set APPLE_API_KEY_PATH or APPLE_API_KEY_BASE64}" + # The private key lands in a 0700 directory of its own: mktemp only + # randomizes trailing Xs, so a template like AuthKey.XXXXXX.p8 would be a + # fixed, world-readable path, and chmod after the write leaves a window. + KEY_DIR="$(mktemp -d "${TMPDIR:-/tmp}/devctl-notary.XXXXXX")" + KEY_PATH="$KEY_DIR/AuthKey.p8" + CLEANUP_KEY="$KEY_DIR" + print -r -- "$APPLE_API_KEY_BASE64" | base64 -D > "$KEY_PATH" + fi + AUTH_ARGS=(--key "$KEY_PATH" --key-id "$APPLE_API_KEY_ID" --issuer "$APPLE_API_ISSUER") +else + AUTH_ARGS=(--keychain-profile "$PROFILE") +fi + +trap '[[ -n "$CLEANUP_KEY" ]] && rm -rf "$CLEANUP_KEY"' EXIT + +echo "submitting $TARGET for notarization..." +xcrun notarytool submit "$TARGET" "${AUTH_ARGS[@]}" --wait + +echo "stapling $TARGET..." +xcrun stapler staple "$TARGET" +xcrun stapler validate "$TARGET" +echo "notarize ok: $TARGET" diff --git a/scripts/smoke-launchd.sh b/scripts/smoke-launchd.sh index 831114d..be338b5 100755 --- a/scripts/smoke-launchd.sh +++ b/scripts/smoke-launchd.sh @@ -1,5 +1,8 @@ #!/bin/zsh # launchd smoke: exercises the REAL LaunchAgent lifecycle on this machine. +# Uses the legacy home LaunchAgent path (--legacy) so it stays deterministic +# when /Applications/devctl.app is also present. For SMAppService, install from +# the app / Login Items on a GUI session separately. # install → daemon status → server ensure → restart (bounce + re-ensure) → # install-upgrade (bounce + re-ensure) → deliberate stop honored by # auto-bootstrap → start → uninstall. @@ -12,6 +15,7 @@ WORK="$(mktemp -d /tmp/devctl-launchd-smoke.XXXXXX)" PROJECT="$WORK/project" mkdir -p "$PROJECT" DEVCTL="$BIN/devctl" +LABEL="dev.quantizor.devctl" fail() { echo "LAUNCHD-SMOKE FAIL: $1" >&2; cleanup; exit 1 } pass() { echo " ok: $1" } @@ -25,12 +29,15 @@ trap cleanup EXIT echo "building..." swift build --package-path "$ROOT" > /dev/null -if [[ -f "$HOME/Library/LaunchAgents/dev.quantizor.devctl.plist" ]]; then - fail "a devctl LaunchAgent is already installed; refusing to clobber it" +if [[ -f "$HOME/Library/LaunchAgents/${LABEL}.plist" ]]; then + fail "a legacy home LaunchAgent is already installed; refusing to clobber it" +fi +if launchctl print "gui/$(id -u)/${LABEL}" >/dev/null 2>&1; then + fail "a ${LABEL} job is already bootstrapped; refusing to clobber it" fi -"$DEVCTL" daemon install > /dev/null || fail "daemon install" -pass "daemon install + hello" +"$DEVCTL" daemon install --legacy > /dev/null || fail "daemon install --legacy" +pass "daemon install + hello (legacy home LaunchAgent)" "$DEVCTL" daemon status | grep -q "pid" || fail "daemon status shows no pid" pass "daemon status" @@ -51,7 +58,7 @@ pass "restart bounced and re-ensured (pid $PID_BEFORE -> $PID_AFTER)" # Upgrade-in-place: install again while the server is up must re-ensure it, # same contract as restart (this is what `make install` hits). PID_PRE_UPGRADE="$PID_AFTER" -"$DEVCTL" daemon install > /dev/null || fail "daemon install upgrade" +"$DEVCTL" daemon install --legacy > /dev/null || fail "daemon install upgrade" PHASE="$("$DEVCTL" wait web --healthy --timeout 20 --json | /usr/bin/python3 -c 'import json,sys; print(json.load(sys.stdin)["server"]["phase"])')" [[ "$PHASE" == "running" ]] || fail "server did not come back after install upgrade (phase $PHASE)" PID_POST_UPGRADE="$("$DEVCTL" status web --json | /usr/bin/python3 -c 'import json,sys; print(json.load(sys.stdin)["servers"][0]["pid"])')" @@ -68,20 +75,20 @@ set -e echo "$STATUS_OUT" | grep -q "deliberately stopped" || fail "missing deliberate-stop hint: $STATUS_OUT" pass "deliberate stop honored by auto-bootstrap" -"$DEVCTL" daemon start > /dev/null || fail "daemon start" +"$DEVCTL" daemon start --legacy > /dev/null || fail "daemon start" "$DEVCTL" daemon status | grep -q "pid" || fail "daemon not back after start" pass "daemon start" # Auto-bootstrap: stop via bootout (simulating a dead daemon with no intent), # then a plain status must resurrect it. -launchctl bootout "gui/$(id -u)/dev.quantizor.devctl" 2>/dev/null || true +launchctl bootout "gui/$(id -u)/${LABEL}" 2>/dev/null || true sleep 1 "$DEVCTL" status --json > /dev/null || fail "auto-bootstrap did not resurrect the daemon" "$DEVCTL" daemon status | grep -q "pid" || fail "daemon not resurrected" pass "auto-bootstrap resurrects a dead daemon" "$DEVCTL" daemon uninstall > /dev/null -[[ ! -f "$HOME/Library/LaunchAgents/dev.quantizor.devctl.plist" ]] || fail "plist survived uninstall" +[[ ! -f "$HOME/Library/LaunchAgents/${LABEL}.plist" ]] || fail "plist survived uninstall" pass "uninstall" echo "LAUNCHD-SMOKE PASS" diff --git a/scripts/smoke.sh b/scripts/smoke.sh index 2658768..ed3daec 100755 --- a/scripts/smoke.sh +++ b/scripts/smoke.sh @@ -17,6 +17,9 @@ pass() { echo " ok: $1" } cleanup() { [[ -n "${DAEMON_PID:-}" ]] && kill -9 "$DAEMON_PID" 2>/dev/null || true [[ -n "${CHILD_PID:-}" ]] && kill -9 "-$CHILD_PID" 2>/dev/null || true + # Grandchildren escape the process group on purpose (that is what the teardown + # assertions exercise), so a group kill leaves them behind. Reap them by pid. + for stray in ${STRAY_PIDS:-}; do kill -9 "$stray" 2>/dev/null || true; done rm -rf "$WORK" } trap cleanup EXIT @@ -116,6 +119,7 @@ sleep 1 AFTER="$(wc -l < "$RAW_SPOOL")" [[ "$AFTER" -gt "$BEFORE" ]] || fail "raw spool stopped growing after daemon death" pass "child survived daemon kill and kept logging ($BEFORE -> $AFTER raw lines)" +STRAY_PIDS="${STRAY_PIDS:-} $(grep grandchild "$RAW_SPOOL" | tail -1 | awk '{print $NF}')" kill -9 "-$CHILD_PID" 2>/dev/null || true CHILD_PID="" @@ -195,12 +199,33 @@ set -e echo "$BAD_OUT" | grep -Eq 'not-found|"ok":false' || fail "x-url bad slug envelope: $BAD_OUT" pass "x-url rejects unknown slug" -# Bundle advertises the custom URL scheme. -swift build --package-path "$ROOT" --product DevCtlApp > /dev/null +# Bundle advertises the custom URL scheme and ships CLI + daemon for first-run. "$ROOT/scripts/make-app-bundle.sh" - debug SCHEME="$(/usr/libexec/PlistBuddy -c 'Print :CFBundleURLTypes:0:CFBundleURLSchemes:0' "$ROOT/devctl.app/Contents/Info.plist")" [[ "$SCHEME" == "devctl" ]] || fail "assembled Info.plist scheme was '$SCHEME'" pass "assembled app declares CFBundleURLSchemes=devctl" +ICON="$(/usr/libexec/PlistBuddy -c 'Print :CFBundleIconFile' "$ROOT/devctl.app/Contents/Info.plist")" +[[ "$ICON" == "AppIcon" ]] || fail "assembled Info.plist CFBundleIconFile was '$ICON'" +[[ -f "$ROOT/devctl.app/Contents/Resources/AppIcon.icns" ]] || fail "bundle missing Resources/AppIcon.icns" +pass "assembled app ships AppIcon.icns" +DISPLAY="$(/usr/libexec/PlistBuddy -c 'Print :CFBundleDisplayName' "$ROOT/devctl.app/Contents/Info.plist")" +[[ "$DISPLAY" == "quantizor/devctl" ]] || fail "assembled Info.plist CFBundleDisplayName was '$DISPLAY'" +pass "assembled app display name is quantizor/devctl" +ROLE="$(/usr/libexec/PlistBuddy -c 'Print :CFBundleURLTypes:0:CFBundleTypeRole' "$ROOT/devctl.app/Contents/Info.plist")" +[[ "$ROLE" == "Editor" ]] || fail "assembled Info.plist CFBundleTypeRole was '$ROLE'" +pass "assembled app URL type role is Editor" +[[ -x "$ROOT/devctl.app/Contents/Resources/devctl" ]] || fail "bundle missing Resources/devctl" +[[ -x "$ROOT/devctl.app/Contents/Resources/devctld" ]] || fail "bundle missing Resources/devctld" +pass "assembled app ships CLI and daemon in Resources" +[[ -x "$ROOT/devctl.app/Contents/Helpers/devctld" ]] || fail "bundle missing Helpers/devctld" +AGENT_PLIST="$ROOT/devctl.app/Contents/Library/LaunchAgents/dev.quantizor.devctl.plist" +[[ -f "$AGENT_PLIST" ]] || fail "bundle missing Library/LaunchAgents/dev.quantizor.devctl.plist" +BUNDLE_PROG="$(/usr/libexec/PlistBuddy -c 'Print :BundleProgram' "$AGENT_PLIST")" +[[ "$BUNDLE_PROG" == "Contents/Helpers/devctld" ]] || fail "BundleProgram was '$BUNDLE_PROG'" +# launchd caps ExitTimeOut at 60 and logs a complaint above it. +AGENT_EXIT_TIMEOUT="$(/usr/libexec/PlistBuddy -c 'Print :ExitTimeOut' "$AGENT_PLIST")" +[[ "$AGENT_EXIT_TIMEOUT" -le 60 ]] || fail "ExitTimeOut was '$AGENT_EXIT_TIMEOUT'; launchd caps it at 60" +pass "assembled app ships Helpers/devctld + in-bundle LaunchAgent" kill -9 "$DAEMON_PID" 2>/dev/null || true DAEMON_PID=""