Skip to main content

Storage-agnostic file-editing tools (view / str_replace / insert) for Datasette Agent plugins

Project description

datasette-agent-edit

Storage-agnostic file-editing tools (view / str_replace / insert / batch edit) for Datasette Agent plugins. The same tool behaviour can sit on top of any storage layer — SQLite, the local filesystem, S3, the GitHub contents API, …

The three layers

  1. operations — pure, synchronous string surgery (view_lines, str_replace, insert, apply_edits). No I/O, no await, no Datasette.
  2. EditStore — the storage seam. The defining method is edit(ref, transform): the backend reads the current content, runs your pure transform inside whatever critical section it needs, and persists the result atomically. A failing transform persists nothing.
    • SqliteVersionedStore runs the transform inside Datasette's write thread (execute_write_fn) and keeps full version history.
    • DiskStore uses a lock + atomic os.replace.
    • S3 (If-Match) and GitHub (sha) backends fit the same shape with a compare-and-set retry loop.
  3. EditToolset — turns any EditStore into Datasette Agent tools with one consistent JSON envelope. Two hooks absorb the plugin-specific parts:
    • id_codec maps internal refs to the ids the model sees (e.g. an artifact- prefix).
    • render optionally injects presentation (e.g. an _html iframe preview); omit it and no *_render tool is registered.

Why transform is synchronous

The transform sits between a backend's awaits, never inside them — the SQLite backend literally cannot await on its write thread, and the S3/GitHub backends must not re-run network calls on every compare-and-set retry. If an edit decision needs async work, resolve it first and close over the result:

resolved = await registry.lookup(name)
await store.edit(ref, lambda c: rewrite(c, resolved))

A rare backend that genuinely needs in-transaction async can implement the optional AsyncTransformStore.aedit capability; the toolset never requires it.

Example

from datasette_agent_edit import EditToolset, SqliteVersionedStore, PrefixCodec

store = SqliteVersionedStore(datasette.get_internal_database())
toolset = EditToolset(
    store,
    name_prefix="artifact",
    id_field="artifact_id",
    id_codec=PrefixCodec("artifact-"),
    render=lambda editable: {"_html": build_iframe(editable.content, editable.metadata)},
)
agent_tools = toolset.tools()   # list of AgentTool, ready to register

Development

uv run pytest

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

datasette_agent_edit-0.1a0.tar.gz (19.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

datasette_agent_edit-0.1a0-py3-none-any.whl (18.4 kB view details)

Uploaded Python 3

File details

Details for the file datasette_agent_edit-0.1a0.tar.gz.

File metadata

  • Download URL: datasette_agent_edit-0.1a0.tar.gz
  • Upload date:
  • Size: 19.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for datasette_agent_edit-0.1a0.tar.gz
Algorithm Hash digest
SHA256 0b183465ec0144da489d0941ac086ec43c115c8867eacde77c1c03bc9a9400c2
MD5 735ae416b56317e4ddbc9a0e4b919abd
BLAKE2b-256 7985fedc10ace53cc45317310a4cf94172359bea60671f566d1a6f93f2813428

See more details on using hashes here.

Provenance

The following attestation bundles were made for datasette_agent_edit-0.1a0.tar.gz:

Publisher: publish.yml on datasette/datasette-agent-edit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file datasette_agent_edit-0.1a0-py3-none-any.whl.

File metadata

File hashes

Hashes for datasette_agent_edit-0.1a0-py3-none-any.whl
Algorithm Hash digest
SHA256 1658de270642480d66fe8e8462ee2da0f5964cdaac5925378de0037f01327395
MD5 233ee1152e9b61f6d4847d62fb97482f
BLAKE2b-256 323593afc0dfde1a54b260480b0f42d7ee58a926087e8d377be93aff734aa318

See more details on using hashes here.

Provenance

The following attestation bundles were made for datasette_agent_edit-0.1a0-py3-none-any.whl:

Publisher: publish.yml on datasette/datasette-agent-edit

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page