Skip to content
← Public packages

@kody/browser-run

Call Cloudflare Browser Run Quick Actions and reuse shared sessions with createBrowserContext.

AGENTS.md

90 lines · 3.0 KB · Markdown

@kody/browser-run — agent notes

Human setup and intent: README.md. Prefer static kody:@kody/browser-run/… imports from execute. Never packages.invoke.

Secrets

NameNotes
cloudflareApiTokenDefault. Browser Rendering - Edit. Host: api.cloudflare.com.
apiTokenSecret paramAlternate secret name only — not a token value.

Require accountId on live calls. Never hardcode a Cloudflare account id into this @kody package.

Setup URL (prefilled): https://kody.codes/account/secrets/new?name=cloudflareApiToken&description=Cloudflare%20API%20token%20with%20Browser%20Rendering%20-%20Edit&allowedHosts=api.cloudflare.com&scope=user

Import table

ExportImport
overviewkody:@kody/browser-run
quick-actionkody:@kody/browser-run/quick-action
screenshot / content / pdf / markdown / scrape / linkskody:@kody/browser-run/<name>
sessions/listkody:@kody/browser-run/sessions/list
sessions/getkody:@kody/browser-run/sessions/get
sessions/closekody:@kody/browser-run/sessions/close
sessions/acquirekody:@kody/browser-run/sessions/acquire
sessions/connectkody:@kody/browser-run/sessions/connect
open-isolated (DEFAULT session path)kody:@kody/browser-run/open-isolated
worker-recipekody:@kody/browser-run/worker-recipe
smoke-testkody:@kody/browser-run/smoke-test

Smoke tests

Dry / setup guidance (no accountId):

import smokeTest from 'kody:@kody/browser-run/smoke-test'

export default async function main() {
	return await smokeTest()
}

Overview (no secrets):

import overview from 'kody:@kody/browser-run'

export default async function main() {
	return await overview()
}

List sessions (needs secret + accountId):

import listSessions from 'kody:@kody/browser-run/sessions/list'

export default async function main() {
	return await listSessions({ accountId: 'YOUR_ACCOUNT_ID', dryRun: true })
}

Default shared-session path:

import openIsolated from 'kody:@kody/browser-run/open-isolated'

export default async function main() {
	return await openIsolated({ accountId: 'YOUR_ACCOUNT_ID', dryRun: true })
}

Edge cases / footguns

  • Never browser.close() on a shared session. Use context.close() then browser.disconnect().
  • Do not launch a new session in a tight loop without listing first — use open-isolated.
  • Mutating session close requires confirm: true (or dryRun: true).
  • Agent-facing write/session mutation inputs use remix/data-schema with { unknownKeys: 'error' } — unknown keys throw.
  • Screenshot/PDF Quick Actions may return { kind: 'binary', base64, contentType }.
  • This package must not depend on @cloudflare/puppeteer / Playwright — use worker-recipe for deployable Worker code.
  • Concurrent clients need @cloudflare/puppeteer ≥ 1.1.0 (Playwright ≥ 1.3.0).
  • Docs: https://developers.cloudflare.com/browser-run/features/reuse-sessions/