Conversation
Host the P1 Prepare/Apply contract in install/uapinstaller until UAP can publish agentplugins/installer. Portable setup now uses that API for canonical snapshots and host seams, while keeping P4a reservation handoff. Co-authored-by: Илия <iliyazelenkog@gmail.com>
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: trueThanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## cursor/uap-installer-p4a-handoff-6c84 #182 +/- ##
=========================================================================
+ Coverage 65.18% 65.26% +0.07%
=========================================================================
Files 170 181 +11
Lines 17474 18657 +1183
=========================================================================
+ Hits 11391 12177 +786
- Misses 4432 4676 +244
- Partials 1651 1804 +153 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Co-authored-by: Илия <iliyazelenkog@gmail.com>
Co-authored-by: Илия <iliyazelenkog@gmail.com>
UAP managedstdio treats a launcher as executable only when the file mode has an execute bit. Windows reports that for PATHEXT names, so installer tests now build probe.exe instead of a suffix-less probe. Co-authored-by: Илия <iliyazelenkog@gmail.com>
Add a same-release Agent Notify package builder and extractor so install
uses plugin.json, mcp.json, the canonical skill, and the platform binary
from that tag. The zip is a Notifications release asset named
agent-notify-portable-${GOOS}-${GOARCH}.zip, checked into checksums.txt.
Co-authored-by: Илия <iliyazelenkog@gmail.com>
Recognize --internal-stdio-v1 with managedstdio.Dispatch before config, logs, or notification init. Unknown --internal-stdio-* versions exit 126 instead of falling through to the public CLI. Co-authored-by: Илия <iliyazelenkog@gmail.com>
UAP managedstdio.NewSource rejects files whose Perm() lacks 0111. Go Windows FileMode does not set execute bits on regular files, including .exe, so Apply cannot run until that UAP check is Windows-aware. Co-authored-by: Илия <iliyazelenkog@gmail.com>
Co-authored-by: Илия <iliyazelenkog@gmail.com>
The shared 5s request context covered several Commits plus crash replay. Windows 1.26 CI exceeded that on antivirus-slow temp IO. Keep the 5s helper for lighter tests and bound this recovery case at 30s. Co-authored-by: Илия <iliyazelenkog@gmail.com>
Local Prepare used AcquireLocal, which hashes POSIX 0111 from the checkout. Windows regular files never carry that bit, so TreeDigest dropped logical bin/ helpers. SnapshotWithExecutables now marks mcp.json commands and bin/ files as 100755 independently of host FileMode. Co-authored-by: Илия <iliyazelenkog@gmail.com>
Inspect now returns a read-only recovery observation: state root, pending directory journals, and unfinished state receipts including state_committed without a journal. Recover takes that observation, re-reads it under the mutation lock, and returns plan_changed instead of expanding the confirmed scope. Co-authored-by: Илия <iliyazelenkog@gmail.com>
Inspect does not create state or invoke the helper runner. Apply rejects a closed handle, a handle from another Engine, and a second confirmed Apply. Recover does not call the runner or committed-binding callback. Co-authored-by: Илия <iliyazelenkog@gmail.com>
Install Apply constructs the helper before creating the state file. Remove Prepare and Apply check the persisted target and managed artifact digest without running the client. An external example module imports the public API with GOWORK=off and no replace. Co-authored-by: Илия <iliyazelenkog@gmail.com>
Confirmed Apply returns recovery_required when Inspect sees a pending journal, instead of letting usecase beginMutation recover silently. Apply releases the handle mutex while busy so Close and a second Apply return ErrHandleBusy without dropping the sealed snapshot. Co-authored-by: Илия <iliyazelenkog@gmail.com>
Prepare wraps UAP sticky-source and update-separately failures as ErrUpdateRequired so a new package cannot upsert an owned revision. The projection seam still replaces args of one declared MCP server. Co-authored-by: Илия <iliyazelenkog@gmail.com>
… rewrite Last-client remove keeps PLUGIN_DATA and reports data_retained. Optional digest-bound Assess never turns block or unavailable into allow. A recorded TreeDigest that is not the canonical snapshot, including an old-bridge artifact digest, returns ErrUpdateRequired without rewriting state. Isolated E2E deletes a disposable MCP cwd instead of the managed package. Co-authored-by: Илия <iliyazelenkog@gmail.com>
Confirmed Apply re-reads live target/ownership before mutation and returns plan_changed instead of applying a moved binding. Inspect and Result report per-client materialization/activation. Discover lists Claude/Codex metadata without creating state or running a helper. Co-authored-by: Илия <iliyazelenkog@gmail.com>
Read-only discovery now Lstats explicit client paths or PATH candidates for Claude and Codex. Found files are never executed, state is not created, and caller-owned ClientExecutables maps are copied by New. Co-authored-by: Илия <iliyazelenkog@gmail.com>
Install Result.Client now copies the required MCP/skill components. Discover reports current UAP bindings read-only, without creating state, taking the mutation lock, or executing found files. Co-authored-by: Илия <iliyazelenkog@gmail.com>
Repeated last-client remove of a DataRetained installation is unchanged without creating a journal or running a helper. Plan now includes the helper protocol version, Result.NextActions cover recover/update/reprepare, and missing required components fail Prepare before state is written. Co-authored-by: Илия <iliyazelenkog@gmail.com>
Last-client DataRetained installations with zero live clients return success without validate, helper, journal, or kernel mutation. Codex remove now forwards ExternalUninstalled to the installer SDK. Co-authored-by: Илия <iliyazelenkog@gmail.com>
Unconfirmed Apply returns cancelled before usecase mutation. Prepare still uses DryRun when PersistAuthoritativeObservations is enabled, so planning does not write state, lock, or journals. Co-authored-by: Илия <iliyazelenkog@gmail.com>
Co-authored-by: Илия <iliyazelenkog@gmail.com>
Install of a second Claude/Codex client shares the installation and removing one binding leaves the other. Windows UNC StateRoot is rejected before mutation. Co-authored-by: Илия <iliyazelenkog@gmail.com>
…igest Prove ClientConfigRoot is not mixed with CODEX_HOME/CLAUDE_CONFIG_DIR/HOME, and surface the helper SHA-256 that UAP managedstdio stores. Co-authored-by: Илия <iliyazelenkog@gmail.com>
Reservation rollback and lease fencing do several Commits on one context. A 5s budget expired on Windows 1.25 CI under the larger P4 suite. Co-authored-by: Илия <iliyazelenkog@gmail.com>
Prepare rejects scratch overlap with PackageRoot, including case and symlink aliases, before creating the snapshot directory. Co-authored-by: Илия <iliyazelenkog@gmail.com>
Scratch must not overlap PackageRoot through filesystem identity, including NFC/NFD names when the volume aliases them as the same directory. Co-authored-by: Илия <iliyazelenkog@gmail.com>
Recover classifies observed journals/receipts as resolved, remaining, or unknown even on error. After a terminal remove, a later install uses the new explicit ClientConfigRoot; sibling bindings and PLUGIN_DATA stay. Co-authored-by: Илия <iliyazelenkog@gmail.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This is P4 (R1b) on top of #180. It does not fold into #177.
UAP P1–P3 cannot be published from this agent (
universal-agent-pluginspush is 403). This PR is the Notifications-side portable adapter: a process-localinstall/uapinstallerfacade over the currentplugin-kit-ai/install/integrationctlpin, plus the version-bound portable zip from §8.4.What landed
install/uapinstallerEngine: Prepare/Apply/Inspect/Recover/Discover for install and remove. Update/repair returnErrUnsupporteduntil UAP P2.plan_changedinstead of expanding the confirmed scope.Result.Recovery, including when recovery fails.plan_changedinstead of applying a stale confirmation.cancelledbefore usecase mutation. Prepare keeps DryRun even when the PersistAuthoritativeObservations seam is enabled.already_absentwithout a journal or helper.ClientConfigRoot; sibling bindings and PLUGIN_DATA stay.os.SameFileshows they are the same directory.ExternalUninstalledto the SDK.Result.Clientcopies required MCP/skill components together with materialization/activation/authentication/verification.recovery_requiredwhen Inspect sees a pending journal. Close during Apply returnsErrHandleBusy.ErrUpdateRequiredwithout rewriting state.install/uapinstaller/exampleimports the public API withGOWORK=offand no replace.agent-notify-portable-${GOOS}-${GOARCH}.zip.Honest gaps
install/uapinstallerpackage, not a published UAPinstall/integrationctl/agentplugins/installermodule.Tests
go test ./install/uapinstaller ./internal/agentnotify/portablesetup ./internal/agentnotify/portableasset ./internal/installruntimecd install/uapinstaller/example && GOWORK=off go run .→external import ok