Commit Graph
28 Commits
Author SHA1 Message Date
abkslm 9e6241005d Merge nucleic/humble-jade-newt into dev 2026-07-12 18:32:00 -07:00
abkslm 0951907fd7 update provisioning system 2026-07-12 17:30:55 -07:00
abkslm 04f149efd6 Merge nucleic/olive-velvet-gecko into dev 2026-07-12 16:21:25 -07:00
abkslmandnucleic 686b7bbd97 nvrsion: Add Linux support to VM service by extending the MacVM engine and manager to handle Linux-specific components like virtio and virtual keyboard, extend the toolchain integration for Linux with mac toolchain freed up, display status during cold starts for “mcp__nucleic__mac_vm_exec”, and fix build script permission errors in ‘make app-dev’.
Nucleic-Promote: 1
Co-authored-by: Nucleic <[email protected]>
2026-07-08 15:27:44 -07:00
abkslmandnucleic 8d118c0220 nvrsion: Add, Refactor, and Update App Bundle Integration: Implement drag-and-drop or browse for “*.app” bundles in SettingsView to include apps in the macOS VM base image, ensure apps are installed into the base image after the base image is built, resolve path conflicts in build scripts, and add a tool for the macOS VMs that allows the agent to request help operating the VM from the user (e.g. if there’s a captcha); also ensure apps are installed into the base image even after the base image has been built.
Nucleic-Promote: 1
Co-authored-by: Nucleic <[email protected]>
2026-07-08 05:13:49 -07:00
abkslmandnucleic 2773d3f5d8 nvrsion: Add: Provisioned VM Image Preparation, refactor PushRelayClient.swift, SyncHost.swift, LiveActivity.swift, apns.ts, LiveActivityManager.swift, and hold “Done” sessions in view in Live Activity until the user opens the app and views the sessions.
Nucleic-Promote: 1
Co-authored-by: Nucleic <[email protected]>
2026-07-07 04:09:22 -07:00
abkslmandnucleic 9d48995579 nvrsion: Add: Fix parse-entitlements error in scripts/package-app.sh
Nucleic-Promote: 1
Co-authored-by: Nucleic <[email protected]>
2026-07-04 18:11:01 -07:00
abkslmandClaude Fable 5 61e11572b8 Add Tailscale (Tailnet) as a sync transport between Mac and iPhone
Settings ▸ Remote gains a "Connect via" picker — LAN (default), Tailscale
(tailnet), or Relay (disabled, coming soon). On Tailnet, both devices run an
embedded tsnet node via TailscaleKit (tailscale/libtailscale) and sync frames
flow over the user's tailnet, so the phone can connect from anywhere the
tailnet reaches; Noise E2EE runs above the transport unchanged.

- NucleicTailnet (new target, macOS + iOS): TailnetNode wraps TailscaleKit's
  node lifecycle (auth-key login, generation-fenced start/stop since up() is
  un-cancellable) and drops to the framework's public C API for the data path
  — tailscale_dial/listen/accept hand back full-duplex socketpair fds, wrapped
  by FDFrameChannel (DispatchIO) into the shared FrameChannel seam. The Swift
  wrapper's one-way connection actors can't carry a bidirectional stream.
- Host: TailnetListener adopts SyncListener; startSyncServer is single-flight
  and honors toggle-off/picker changes at the commit point; pairing QRs carry
  transport + tailnet IP/port hints (PairingPayload additive optional fields,
  forward/backward compatible over CBOR).
- iPhone: pair/reconnect dial over whichever transport the pairing recorded;
  Settings gains a Tailscale auth-key field (Keychain, committed on editing
  end); connectivity chip shows "Connected · Tailnet".
- TailscaleKit has no SwiftPM distribution: scripts/build-tailscalekit.sh
  builds a pinned libtailscale commit into an untracked local xcframework;
  Package.swift links it only when present (everything builds without it, the
  picker then reports Tailscale support as not built in), and the script
  clears SwiftPM's content-keyed manifest cache so the toggle is picked up.
- iOS floor 17.0 → 18.1 (TailscaleKit requires the iOS 18 Swift runtime);
  package-app.sh embeds the framework in the .app like Sparkle.

703-test suite: no new failures (the 7 fake-claude/fake-grok staging issues
reproduce identically on an untouched checkout — pre-existing, tracked
separately). New coverage: FDFrameChannel over socketpairs, pairing-payload
version-skew both directions, transport-setting resolution.

Co-Authored-By: Claude Fable 5 <[email protected]>
2026-07-03 03:50:45 -07:00
abkslmandnucleic 98f84d21a1 nvrsion: Add: Adjust Canary Build Auto-Update to run every hour, fix Keychain permission audit by updating files: ControlAuth.swift, GitHubCredentials.swift, HeartbeatReporter.swift, KeychainOwnedAccess.swift, HostIdentityStore.swift, PushRelayClient.swift, refactor Remote Build Icon to use “bell.and.waves.left.and.right.fill” in ios/NucleicRemote/NucleicRemote/Views/BuildBanner.swift, add a Remote Release Channel Check in AppStore.swift, Sync/ConnectionHandler.swift, Sync/SyncHostBridge.swift, Sync/ReleaseChannel.swift, Sync/SyncClient.swift, Sync/WireMessages.swift, tests/SyncHostTests.swift, tests/SyncTestSupport.swift, and align build number hash in ios/NucleicRemote/NucleicRemote.xcodeproj/project.pbxproj, ios/NucleicRemote/NucleicRemote/Info.plist, ios/NucleicRemote/NucleicRemote/Views/BuildBanner.swift.
Nucleic-Promote: 1
Co-authored-by: Nucleic <[email protected]>
2026-07-02 21:54:40 -07:00
abkslmandnucleic 8f03fc35a7 nvrsion: Add deprecation warnings and updates for Hdiutil mount command; fix BUILD.md, Makefile, and related files.
Nucleic-Promote: 1
Co-authored-by: Nucleic <[email protected]>
2026-07-02 20:24:53 -07:00
abkslmandnucleic a82cc7244b Adjust Canary Build Icon
Nucleic-Session: DEF24ECB-DEAC-47BA-AB18-711628D59C39
Co-authored-by: Nucleic <[email protected]>
2026-07-02 01:51:29 -07:00
abkslmandnucleic 3d5f95b5c7 Adjust Canary Build Icon
Nucleic-Session: DEF24ECB-DEAC-47BA-AB18-711628D59C39
Co-authored-by: Nucleic <[email protected]>
2026-07-02 01:51:21 -07:00
abkslmandnucleic a7dc07520d Adjust Canary Build Icon
Nucleic-Session: DEF24ECB-DEAC-47BA-AB18-711628D59C39
Co-authored-by: Nucleic <[email protected]>
2026-07-02 01:51:10 -07:00
abkslmandnucleic c9c37eae63 canary_build_update_interval
Nucleic-Session: C9AE92BB-F3E0-4BAA-A988-9BE28E3E646D
Co-authored-by: Nucleic <[email protected]>
2026-07-02 00:50:43 -07:00
abkslmandnucleic 39ada901a3 Add Canary Release Channel
Nucleic-Session: 90CFCF35-D244-4EF0-92E7-DD9DAE62CBDF
Co-authored-by: Nucleic <[email protected]>
2026-07-01 19:31:59 -07:00
abkslmandnucleic 71acf64b12 Add Canary Release Channel
Nucleic-Session: 90CFCF35-D244-4EF0-92E7-DD9DAE62CBDF
Co-authored-by: Nucleic <[email protected]>
2026-07-01 19:31:49 -07:00
NucleicandClaude Opus 4.8 b50cb60190 Promote nvrsion trunk → dev
Squash-merge nucleic/trunk into dev (234 commits of accumulated nvrsion work).

Resolved two auto-generated-file conflicts:
- cloud/nucleic-edge/wrangler.jsonc: kept dev's real KV namespace ids and the
  xyz.blakeslee.nucleic.remote APNS topic, with binding names corrected to
  RELAY_TOKENS/PUSH_TOKENS to match the worker code on both branches.
- Package.resolved: took trunk's newer dependency pins.

Nucleic-Promote: 1
Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-06-27 13:43:32 -07:00
NucleicandClaude Opus 4.8 2ae25a3f27 release: per-release version bump via ./VERSION (build number + optional semver)
./VERSION (NUCLEIC_MARKETING_VERSION + NUCLEIC_BUILD_NUMBER) is the single source of truth, read by package-app.sh and bumped by release-macos.sh. Every release increments the build number by 1; 'make release-beta BUMP=major|minor|patch' also bumps that semver component (resetting lower ones). The bumped VERSION is committed on success so build numbers stay monotonic. Seeded at 827 (the prior git-derived count) so numbering is continuous.

scripts/bump-version.sh does the arithmetic and rewrites VERSION; package-app.sh now reads version+build from VERSION (env NUCLEIC_VERSION/NUCLEIC_BUILD still override; missing file falls back to 0.1.0 + git count, so app-* and fresh checkouts are unaffected).

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-06-26 18:07:26 -07:00
NucleicandClaude Opus 4.8 00706fba58 package-app: don't apply hardened runtime to ad-hoc local builds
Hardened runtime forces library validation (CS_REQUIRE_LV): every loaded Mach-O must share the main executable's Team ID. An ad-hoc binary has no team identity, and the app + embedded Sparkle.framework are signed in separate ad-hoc passes, so the loader rejects Sparkle at launch with "different Team IDs" (EXC_CRASH/DYLD) — even though `codesign --verify` (a static check) passes. This was the recurring nucleic-beta launch crash.

Apply --options runtime only for a real Developer ID identity (required by notarization; there the re-signed Sparkle shares the team, so library validation passes). Ad-hoc local builds omit it, dropping the library-validation requirement so the embedded Sparkle loads. Verified end-to-end: a fresh `make app-beta` now launches past dyld.

RT_FLAG is empty for ad-hoc; guard its expansion (${RT_FLAG[@]+...}) because macOS's bash 3.2 errors on "${empty[@]}" under set -u.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-06-26 17:07:04 -07:00
NucleicandClaude Opus 4.8 fc6b420990 Signing: rebrand bundle IDs to xyz.blakeslee.* and correct the Team ID
Desktop channels → xyz.blakeslee.nucleic.desktop.{dev,beta,rc,release} (the stable channel keyword is unchanged; only its bundle-id suffix is "release"). iOS remote → xyz.blakeslee.nucleic.remote, including its Keychain account namespaces, the scanner log subsystem, and the coupled APNS topic.

Correct the Apple Developer Team ID to L7UDTQ6F5W across the Xcode project, ExportOptions, the APNS config + tests, and the signing/cloud docs.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-06-26 16:52:14 -07:00
Nucleic e03d96b38a nvrsion: promote trunk to dev
Nucleic-Promote: 1
2026-06-26 16:18:02 -07:00
Nucleic d293162cca nvrsion: promote trunk to dev
Nucleic-Promote: 1
2026-06-26 14:28:43 -07:00
NucleicandClaude Opus 4.8 8bad615fa8 Container: auto-download the kernel (zero user setup)
The kernel was the last bundled asset (needing scripts/fetch-kernel.sh +
codesign-time bundling). Now it's acquired automatically on first use like the
vminitd initfs and the sandbox image — nothing is bundled and the user runs no
setup step.

- ContainerEngine.ensureKernel: resolve order = NUCLEIC_KERNEL_PATH → on-disk
  cache → bundled Resources (optional) → reuse Apple `container`'s installed
  kernel (no download) → download the kernel release asset. The asset is hosted
  on a GitHub release (ProjectSandbox.kernelRelease*) and fetched with the app's
  GitHub token when the repo is private (same token as the sandbox image).
  NUCLEIC_KERNEL_NO_REUSE forces the download (testing / incompatible local kernel).
- isSupported/unsupportedReason now gate only on Apple silicon; the kernel is no
  longer a precondition. Settings copy + package-app.sh + BUILD.md updated;
  bundling is an optional offline fast-path.
- registryAuth: scope credentials to the sandbox image's registry host, so a
  configured token is never attached to a different registry (e.g. docker.io
  public bases, which 401 on unrelated Basic creds). Fixes anonymous base pulls.
- Verified end-to-end on macOS 27 / Apple silicon: forced kernel download +
  anonymous docker.io base pull + boot + exec + stdout. Builds clean; 21 tests pass.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-06-21 02:37:14 -07:00
NucleicandClaude Opus 4.8 c4e41ec52e Rework container sandbox onto the containerization framework
Replace the Apple `container` CLI wrapper with Apple's `containerization`
Swift framework, driven in-process — no external CLI or daemon.

- ContainerEngine: in-process runtime (shared VZVirtualMachineManager from a
  bundled kernel + runtime-pulled vminitd initfs, ImageStore, VmnetNetwork,
  live-container registry, typed statistics for CPU/mem + OOM diagnosis).
  Daemonless ⇒ ephemeral VMs; reconcile is on-disk GC.
- ContainerizedProcessHandle: bridges a guest LinuxProcess onto the existing
  ProcessHandle contract (reusing LineSplitter), so backends stream NDJSON
  identically in-container and on-host. Closes the stdio writers after wait()
  to finish the line streams (the framework never calls Writer.close()).
- Sandbox image is built in CI (containers/nucleic-sandbox/Dockerfile +
  .github/workflows/sandbox-image.yml) and pushed to GHCR; the app pulls +
  unpacks it on first use (no on-device build, no user-installed tools). The
  GHCR package may stay private — pulls authenticate with the user's GitHub
  token via ContainerEngine.registryAuth (Settings → Sandbox, or
  NUCLEIC_REGISTRY_USER/NUCLEIC_REGISTRY_TOKEN). vminitd is pulled from Apple's
  public GHCR; only the kernel is bundled (scripts/fetch-kernel.sh, curl-only).
- ContainerManager rewired to the engine (policy preserved); ClaudeCodeBackend
  execs in-container via the engine; Settings/ProviderAvailability use a static
  capability check. Platform floor raised to macOS 26 (Apple silicon) + the
  com.apple.security.virtualization entitlement (swift-tools 6.2).
- Verified end-to-end on macOS 27 / Apple silicon via Sources/container-spike:
  pull vminitd + image, boot VM, exec, stream stdout. Builds clean; 21 tests pass.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
2026-06-21 00:46:04 -07:00
abkslm aefb2f47e2 editing package-app.sh 2026-06-15 17:25:10 -07:00
abkslmandClaude Opus 4.8 b7bc63c012 package-app: strip xattrs before codesign so iCloud detritus doesn't fail signing
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
2026-06-15 01:19:19 -07:00
abkslmandClaude Opus 4.8 7c4f398506 Rename Beta channel + add gold Release Candidate channel
Terminology: "TestFlight" -> "Beta" across the banner, build config, Makefile, and
docs. The beta channel's process/product is renamed nucleic-tf -> nucleic-beta so
everything (process, app name, bundle id, label) reads "beta".

New rc channel: NUCLEIC_CHANNEL=rc -> process nucleic-rc, define NUCLEIC_RC, gold
"Release Candidate" banner, Nucleic RC.app (com.abkslm.nucleic.rc). Sits between
staging and main in the gated flow: feature -> dev -> staging -> rc -> main.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
2026-06-13 19:38:11 -07:00
abkslmandClaude Opus 4.8 f6205c07e5 Wire up macOS .app bundle packaging per channel
Add scripts/package-app.sh + make app-dev/app-beta/app-stable/apps targets that
wrap each channel's SwiftPM executable in a coexisting, ad-hoc-signed .app:

  dev    -> dist/Nucleic Dev.app   (com.abkslm.nucleic.dev)
  beta   -> dist/Nucleic Beta.app  (com.abkslm.nucleic.beta)
  stable -> dist/Nucleic.app       (com.abkslm.nucleic)

The bundle keeps the channel product name as Contents/MacOS/<name> (preserving the
process name), ships GRDB/SwiftTerm resource bundles in Contents/Resources, writes
Info.plist (version = NUCLEIC_VERSION, build = commit count), and supports an
optional Resources/AppIcon[-<channel>].icns. Distribution signing/notarization/
TestFlight upload is left as configurable hooks (NUCLEIC_SIGN_ID). dist/ gitignored;
BUILD.md documents it.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
2026-06-13 19:31:43 -07:00