← Commit history

0.16.2: sw.js (nbrowser_scroll route), battery + policy for the #41 verbs, ship.sh push list, skills

John Lauer ·c80207f342 ·2mo ago ·parent dbadaf0
4 files changed +12−4
extension/src/sw.js+2
@@ -242,6 +242,8 @@ async function dispatch(verb, args) {       return cdp.inputDispatch(await native.resolveTabId(args, { requireOwned: true, verb: 'nbrowser_type' }), { ...args, type: 'type' });     case 'nbrowser_press_key':       return cdp.inputDispatch(await native.resolveTabId(args, { requireOwned: true, verb: 'nbrowser_press_key' }), { ...args, type: 'key' });+    case 'nbrowser_scroll':+      return cdp.inputDispatch(await native.resolveTabId(args, { requireOwned: true, verb: 'nbrowser_scroll' }), { ...args, type: 'wheel' });     case 'nbrowser_hover':       return cdp.inputDispatch(await native.resolveTabId(args, { requireOwned: true, verb: 'nbrowser_hover' }), { ...args, type: 'hover' });     case 'nbrowser_double_click':
tools/ship.sh+3−2
@@ -159,8 +159,9 @@ echo "   two-curl: anonymous $ANON (want 404), bearer version $BEAR (want $VER)" echo "== 5. push the source text files to the product page (source is open; public manifest untouched) ==" adom-wiki repo push "$PAGE" \   --files bridge/bridge.json bridge/BRIDGE_VERSION bridge/package.json bridge/server.js \-          extension/src/native.js extension/src/cdp.js extension/manifest.json \-          bin/nb-dashboard package.json dockbar.json tools/ship.sh tools/promote.sh \+          extension/src/native.js extension/src/cdp.js extension/src/sw.js extension/manifest.json \+          bin/nb-dashboard package.json dockbar.json tools/ship.sh tools/promote.sh tools/verb-battery.mjs tools/verbs-policy.json tools/check-guard-coverage.mjs \+          skills/*/SKILL.md \   -m "v${VER} (insiders): ${LOG}" >/dev/null 2>&1 || {     [ "${FORCE_PUSH:-0}" = "1" ] || { echo "   PUSH FAILED (set FORCE_PUSH=1 to retry)"; exit 1; }   }
tools/verb-battery.mjs+5−1
@@ -69,6 +69,10 @@ const T = {   resolve_profiles: () => { const r = call('nbrowser_resolve_profiles'); return A(r.ok !== false, 'resolved', JSON.stringify(r).slice(0, 120)); },   chrome_status: () => { const r = call('nbrowser_chrome_status'); return A(r.installed === true, `chrome installed, phase:${r.phase}`, JSON.stringify(r).slice(0, 140)); },   describe: () => { const r = call('nbrowser_describe'); const n = (r.verbs || []).length; const meta = metaCount(); return A(n === meta, `describe:${n} == VERB_META:${meta}`, `describe:${n} != VERB_META:${meta} — regenerate!`); },+  scroll: () => { const r = call('nbrowser_scroll', { sessionId: SID, x: 200, y: 200, deltaY: 300 }); return A(r.ok === true && r.dispatched === 'wheel' && r.scrollAfter && typeof r.pageScrolled === 'boolean', `wheel dispatched; pageScrolled=${r.pageScrolled}`, JSON.stringify(r).slice(0, 160)); },+  input_unknown_type: () => { const r = call('nbrowser_input_dispatch', { sessionId: SID, type: 'zoom', x: 200, y: 200, deltaY: -300 }); return A(r.ok === false && r.errorCode === 'unknown_input_type' && r.dispatched === false, 'unknown type refused, nothing dispatched', JSON.stringify(r).slice(0, 160)); },+  hover_raw_xy: () => { const r = call('nbrowser_hover', { sessionId: SID, x: 200, y: 200, hoverDwellMs: 100 }); return A(r.ok === true && r.dispatched === 'hover', 'raw xy hover accepted without atScrollX/Y', JSON.stringify(r).slice(0, 160)); },+  progress: () => { const r = call('nbrowser_progress'); return A(r.ok === true && Array.isArray(r.active) && r.verbDurations && typeof r.verbDurations === 'object', `active[]=${(r.active || []).length}, ${Object.keys(r.verbDurations || {}).length} measured verbs`, JSON.stringify(r).slice(0, 160)); },   activity: () => { const r = call('nbrowser_activity', { limit: 5 }); return A(Array.isArray(r.entries), `${(r.entries || []).length} entries`, JSON.stringify(r).slice(0, 120)); },   os_windows: () => { const r = call('nbrowser_os_windows'); return A(r.ok === true && typeof r.count === 'number', `${r.count} windows`, JSON.stringify(r).slice(0, 140)); },   wake_profile: () => { let r = call('nbrowser_wake_profile', { profile: PROFILE }); if (r.ok !== true) r = call('nbrowser_wake_profile', { profile: PROFILE }); return A(r.ok === true, `woke:${r.woke}`, JSON.stringify(r).slice(0, 160)); },@@ -256,7 +260,7 @@ const T = {  // ─── coverage map: EVERY VERB_META verb decides its fate here ─────────────── export const COVERAGE = {-  status: 'live', readiness: 'live', ping: 'live', whoami: 'live', profiles: 'live',+  status: 'live', readiness: 'live', ping: 'live', progress: 'live', scroll: 'live', input_unknown_type: 'guard', hover_raw_xy: 'live', whoami: 'live', profiles: 'live',   resolve_profiles: 'live', chrome_status: 'live', describe: 'live', activity: 'live',   os_windows: 'live', wake_profile: 'live', rescan: 'live', resync_sessions: 'live',   open_window: 'live', pin_session: 'live', use_profile: 'live', list_windows: 'live',
tools/verbs-policy.json+2−1
@@ -56,5 +56,6 @@   "screenshot_full_res": "readonly",   "eval": "mutating",   "evaluate": "alias",-  "set_file_input": "mutating"+  "set_file_input": "mutating",+  "scroll": "mutating" }