← Commit history
0.16.2: sw.js (nbrowser_scroll route), battery + policy for the #41 verbs, ship.sh push list, skills
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" }