openpencil/crates/op-host-services
Kayshen-X 37c41db35a feat(web): postMessage bridge with token bootstrap and conflict resolution
Add the webview-facing postMessage bridge (vscode_bridge.rs): token
bootstrap via Init, OpenDocument probe-conditional push, uncapped
Snapshot flush, SaveCommitted, and UseLocal/AcceptRemote conflict
resolution. All three edge/state events (dirty-changed, sync-conflict,
opened) are emitted only from the tick observer draining SyncGate's
consumable latches; handlers only mutate the gate. Reorder mount_ck so
the bridge listener installs first, an iframe awaits Init (2s fallback),
and the 400ms pull tick starts only after the daemon sync-reset (managed:
token; direct: legacy reset moved out of index.html) completes.

Token audit (X-OpenPencil-Token attached only when url starts with
daemon_base(); public requests never carry it):
  live_sync.rs get                 -> daemon -> attach_daemon_headers
  live_sync.rs get_with_status     -> daemon -> attach_daemon_headers
  live_sync.rs post_json           -> daemon -> attach_daemon_headers
  live_sync.rs post_json_with_status -> daemon -> attach_daemon_headers
  web_model_catalog.rs:21 (/api/ai/models)   -> daemon -> attach_daemon_headers
  web_ai_transport.rs:93 (/api/ai/stream)    -> daemon -> attach_daemon_headers
  iconify_web.rs:311 fetch_text (daemon brand-catalog + public Iconify CDN)
      -> attach_daemon_headers with url-prefix guard: token only on the
         daemon URL, never on the public api.iconify.design requests
All other daemon-talking modules route through the live_sync helpers and
inherit the token. No window.fetch / Request::new sites in the crate.
2026-07-17 01:06:14 +08:00
..
src feat(web): postMessage bridge with token bootstrap and conflict resolution 2026-07-17 01:06:14 +08:00
Cargo.toml fix(mcp): bump rquickjs 0.9->0.12 for windows-aarch64; MSRV 1.87; switch test input token 2026-07-07 21:26:38 +08:00