feat(desktop): authoring runner URI, Allow-per-sub, and mailbox poll - #154
Merged
Conversation
Parse-only runner deep links (pack, bind, origin) beside the existing connect action. Prefix parsers reject oar_/oap_ mix-ups, hex-bodied oab_ tokens, and base64url-bodied oals_ secrets. No claim, keychain, or mailbox poll.
…bserved Outbound HTTPS claim of oab_ binds, keychain oals_ leases, wait=0 poll with a local 1s sleep, and Allow of a specific connector sub. Overlay Continue persists pause-target input via record_observed, never type_text. Windows native is COACH_ONLY; do not spawn win_agent.
…rate holes
Store mailbox allowedSub via POST /runner/allow. Hold pause_for_input until
overlay Continue, then callback {recorded, param} with no field value.
macOS/Linux default to COACH_ONLY until the window is unique; Playwright
launches empty-cookie Chromium from a Desktop URL. Titles never go to MCP.
…tus is missing Authoring bind is optional. A null authoring_status used to throw before setCheckedAuth, so the shell stayed on Loading and first-workflow navigation never mounted.
openadapt-web is private, so raw.githubusercontent.com 404s. CI already passes a token; use the Contents API so tokens:check can still gate palette drift.
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.
Implementation continues. Synthetic CI is the gate. MockMed is tests only. Production mailbox is web 464; this PR is the laptop Allow/poll.
Summary
D1 + D2 of the hosted authoring MCP stack. ChatGPT.com / Claude.ai can bind this laptop to a job pack over outbound HTTPS, Allow that connector
sub, and drive a first demonstration. This is not Cloud BYOC execute and not Operator.Does not merge or edit desktop PR 153 (coach HUD). Overlay Continue/Stop reuse origin/main
ControlOverlayvia existingresume_recording/stop_recording. Pause card copy: "Type in the application. Continue here when done."D1 — URI grammar (parse-only)
feat(desktop): openadapt://runner URI grammar, distinct from connectopenadapt://runnerinsrc-tauri/src/pairing.rs. Connect is not widened.engine/auth/runner_bind.pyparse-only:pack,bind,origin. Origin pinhttps://openadapt.ai.oab_[A-Za-z0-9_-]{43},oals_[a-f0-9]{64}.oar_+ 64 hex,oap_+ 43 unreserved,oab_with a hex body,oals_with a base64url body, and anything that merely starts withoa.D2 — claim, Allow-per-sub, wait=0 poll, record_observed
feat(desktop): authoring claim, Allow-per-sub, mailbox poll, record_observedengine/authoring_runner.pycopies poll / lease / TTL / kill-as-command / metadata-callback shape fromhosted_runner.py. Does not copy org, Stripe,oar_, wait=25, trust-manifest, or journal dispatch.POST /j/{id}/runner/claimwithoab_. 201leaseSecret(oals_) stored in keychainopenadapt-authoring-lease|{pack}. Secret never returned over IPC.wait_seconds: 0, sleep 1s locally.DEFAULT_LEASE_S = 900.bind_packpending Allow: "Allow ChatGPT to drive this job" for thatsub. Confirm POSTs/j/{id}/runner/allowover Beareroals_so the mailbox storesallowedSub. A second account asks to replace.bind_packrequiresallowedSubmatch, including hostedhalt.oals_.Recorder.record_observedon the pause-target node (captured at pause start). Nevertype_text. Secret pauses store no text.pause_for_inputstays in-flight until Continue, then callbacks{ recorded: true, param }with no value.{ status: "needs_human_admit" }. Refuses a secret pause with no TYPE. An agent click never paints VERIFIED.backend_pixels(mode 0600, 15-minute lifetime). Stale id → no click. Uncertain delivery →RECONCILIATION_REQUIRED, no retry.COACH_ONLY. Do not spawnwin_agentor callparallels_vm.launch_agent().oab_(Cloud already ownsoar_).Gaps closed in this review (2026-09-01)
fix(desktop): close remaining authoring D1/D2 Allow, pause, and substrate holesallowedSubis stored byPOST /runner/allow, not a generic callback. Without that, web enqueue staysnot_allowedafter Desktop Allow.pause_for_inputno longer completes before the person types. Continue is the result:{ recorded: true, param }, never field text.COACH_ONLYuntil uniqueness is proven (Use this window). Titles stay on disk / local pin; they never go to observe or callback.type_text.oals_hex body, not SHA256-as-password.oab_+64 hex andoals_+43 base64url.fix(desktop): keep first-workflow boot off Loading when authoring status is missingauthoring_statusno longer throws beforesetCheckedAuth, so the shell cannot stay on Loading and first-workflow navigation still mounts.fix(ci): fetch vendored design tokens through the GitHub APItokens:checkreads privateopenadapt-webthrough the GitHub Contents API.raw.githubusercontent.com404s because that repo is private.Tests
Python engine tests passed. Overlay pause-card tests passed. First-workflow navigation vitest now includes idle/missing authoring status so the shell leaves Loading.
How a person Allows ChatGPT to drive this job
openadapt://runner?pack=…&bind=oab_…&origin=https://openadapt.ai. Desktop claims the bind over outbound HTTPS.bind_pack).sub). Click Allow. A different account asks to replace.https://URL and Pin browser. Desktop launches Playwright Chromium with empty cookies. Log in again in that window if the app needs a session.win_agent.record_observed. It never types the secret.Possession of the pack URL plus a bound laptop is not enough. Allow is per ChatGPT/Claude
sub.Out of scope
/mcp(W2) live in openadapt-web PR 464. This PR is the laptop Allow/poll.Opened/updated by an agent session, not the founder.