Skip to content
Vocino edited this page Aug 20, 2026 · 6 revisions

import

where

  • left rail $ import field (280px rail, not route, not overlay)
  • top-right [ sync / import ] -> import addon (wb1!)
  • settings -> import (same decoder)
  • hotkey i anywhere. opens rail tab if collapsed.

flow

  1. click import or i. must be user gesture for navigator.clipboard.readText().
  2. if clipboard wb1! length>10 -> autofill preview. 0 paste needed.
  3. else textarea focused "paste wb1! here ctrl+v" -> debounce 150ms -> preview.
  4. preview sentence (rail cannot hold 8 cols): "6 chars, 1 over 3d, enter to import" rows with dots, hover per-section.
  5. enter confirms -> POST /api/addon/import { bundle:"wb1!..." } -> D1 character_addon_cache / warband_bank_cache upsert per user_id+char_key.
  6. receipt one line per char dot+gold printed in waves like $ output, held 6s, decayed 4 steps, removed. block returns to original height.
  7. nothing reloads. only line stamped. reload would discard receipt (what overlay did).

validation

client-side before d1 write:

  • not wb1! -> if wb0! "that's camp dna, not inventory, use share tab" else "doesn't look like wb1!, run /warband copy again"
  • 20 chars or >1mb decoded -> "too large, try single char"

  • missing chars not deleted -> keeps old snapshot aging red. staleness lowers confidence, never deletes.
  • 1 char 39kb json 8.6kb wire, 6 154kb/26kb, 20 cap 474kb/73kb. 4-7kb figure is slim no per-item.

lib

src/lib/warband-import.ts pure, testable via vitest, no dom/d1:

  • WIRE_PREFIX='wb1!', DNA_PREFIX='wb0!', MAX_CHARACTERS=20, MAX_DECODED_BYTES=1_048_576
  • base64url -> bytes -> DecompressionStream('deflate-raw') not deflate (zlib header addon does not emit, use raw or pako.inflateRaw)
  • throws on bad.

web tests src/__tests__/warband-import.test.ts. addon vectors docs/contract/vectors/v1-min.wb1.

parser hazard

any element whose raw text begins // inside astro expression deleted from output silently. compiler reads as line comment. no error.

fix: never write literal // in .cmt text. mark is .cmt::before css. literal doubles when renders and deletes when does not. always defect.

clipboard

  • https user gesture required. warband.pro https so chrome/edge ok.
  • never polling readText, only inside click.
  • dont auto-submit. user confirms after seeing staleness.
  • firefox/safari stricter -> fallback textarea ctrl+v.

tonight plan

after confirm scorer re-reads consumables rollup (tonight.ts, warband-import.ts types). freshness influences block vs grey.

Warband.pro Companion

Home

Start

Integration

Internals

Clone this wiki locally