[{"data":1,"prerenderedAt":2567},["ShallowReactive",2],{"search-sections-scio":3,"nav-scio":265,"content-tree-scio":292,"footer-resources":304,"content-/v0.0.5/learn/concepts":1833,"surround-/v0.0.5/learn/concepts":2564},[4,10,15,21,26,32,37,42,47,52,57,61,66,70,75,80,85,90,95,100,104,107,112,117,122,127,132,137,142,147,152,157,160,165,169,174,178,183,188,192,197,202,207,210,214,219,224,229,233,237,242,246,251,255,260],{"id":5,"title":6,"titles":7,"content":8,"level":9},"/v0.0.5/overview","Overview",[],"URI-based data catalog with atomic operations",1,{"id":11,"title":12,"titles":13,"content":14,"level":9},"/v0.0.5/overview#scio","scio",[],"scio is a URI-based data catalog with atomic operations for Go. It serves as the authoritative map of data sources in your system, providing topology intelligence and type-agnostic access via atoms.",{"id":16,"title":17,"titles":18,"content":19,"level":20},"/v0.0.5/overview#what-scio-does","What scio Does",[12],"Registers storage resources — Accepts atomic providers from grub (databases, stores, buckets)Routes operations via URI — db://users/123, kv://sessions/abc, bcs://docs/report.pdfProvides topology intelligence — Knows what resources exist, where, and their relationshipsEnables type-agnostic access — Works with atoms, never needs to know your types",2,{"id":22,"title":23,"titles":24,"content":25,"level":20},"/v0.0.5/overview#core-concepts","Core Concepts",[12],"",{"id":27,"title":28,"titles":29,"content":30,"level":31},"/v0.0.5/overview#uri-addressing","URI Addressing",[12,23],"Every data access point is addressed by a URI: VariantPatternExampledb://table/keydb://users/123kv://store/keykv://sessions/abcbcs://bucket/pathbcs://docs/reports/q4.pdf",3,{"id":33,"title":34,"titles":35,"content":36,"level":31},"/v0.0.5/overview#atomic-operations","Atomic Operations",[12,23],"scio operates on atoms — type-segregated data structures from the atom library. This enables infrastructure code to work with data without knowing user types.",{"id":38,"title":39,"titles":40,"content":41,"level":31},"/v0.0.5/overview#spec-tracking","Spec Tracking",[12,23],"When resources are registered, scio tracks their specs (type metadata). This enables: Finding all resources that share a typeDiscovering related resourcesField-based resource discovery",{"id":43,"title":44,"titles":45,"content":46,"level":20},"/v0.0.5/overview#use-cases","Use Cases",[12],"Service infrastructure — Route data access without coupling to user typesData pipelines — Process data across multiple storage backends uniformlySystem introspection — Understand the data topology of your applicationLLM integration — Provide context about available data sources",{"id":48,"title":49,"titles":50,"content":51,"level":20},"/v0.0.5/overview#dependencies","Dependencies",[12],"scio builds on the zoobzio ecosystem: atom — Type-segregated struct decompositiongrub — Provider-agnostic storageedamame — SQL query execution",{"id":53,"title":54,"titles":55,"content":56,"level":9},"/v0.0.5/learn/quickstart","Quick Start",[],"Get started with scio in 5 minutes",{"id":58,"title":54,"titles":59,"content":60,"level":9},"/v0.0.5/learn/quickstart#quick-start",[],"This guide gets you started with scio in 5 minutes.",{"id":62,"title":63,"titles":64,"content":65,"level":20},"/v0.0.5/learn/quickstart#installation","Installation",[54],"go get github.com/zoobz-io/scio",{"id":67,"title":68,"titles":69,"content":25,"level":20},"/v0.0.5/learn/quickstart#basic-usage","Basic Usage",[54],{"id":71,"title":72,"titles":73,"content":74,"level":31},"/v0.0.5/learn/quickstart#_1-create-a-scio-instance","1. Create a scio Instance",[54,68],"import \"github.com/zoobz-io/scio\"\n\ns := scio.New()",{"id":76,"title":77,"titles":78,"content":79,"level":31},"/v0.0.5/learn/quickstart#_2-register-resources","2. Register Resources",[54,68],"Register your grub providers with scio using URIs: // Assuming you have grub resources\nusersDB, _ := grub.NewDatabase[User](db, \"users\", \"id\", renderer)\nsessionsStore := grub.NewStore[Session](redisProvider)\n\n// Register with scio\ns.RegisterDatabase(\"db://users\", usersDB.Atomic())\ns.RegisterStore(\"kv://sessions\", sessionsStore.Atomic())",{"id":81,"title":82,"titles":83,"content":84,"level":31},"/v0.0.5/learn/quickstart#_3-perform-operations","3. Perform Operations",[54,68],"Access data via URIs: ctx := context.Background()\n\n// Get a record\natom, err := s.Get(ctx, \"db://users/123\")\nif err != nil {\n    // Handle error\n}\n\n// Access fields\nemail := atom.Strings[\"email\"]\nage := atom.Ints[\"age\"]\n\n// Set a record\ns.Set(ctx, \"kv://sessions/abc\", sessionAtom)\n\n// Check existence\nexists, _ := s.Exists(ctx, \"db://users/123\")\n\n// Delete\ns.Delete(ctx, \"db://users/123\")",{"id":86,"title":87,"titles":88,"content":89,"level":31},"/v0.0.5/learn/quickstart#_4-query-databases","4. Query Databases",[54,68],"For database resources, use query operations: // Query all records\nresults, _ := s.Query(ctx, \"db://users\", grub.QueryAll, nil)\n\n// Query with parameters\nstmt := edamame.NewQueryStatement(...)\nresults, _ := s.Query(ctx, \"db://users\", stmt, map[string]any{\n    \"status\": \"active\",\n})",{"id":91,"title":92,"titles":93,"content":94,"level":31},"/v0.0.5/learn/quickstart#_5-introspect-the-topology","5. Introspect the Topology",[54,68],"Discover what resources exist: // All resources\nfor _, r := range s.Sources() {\n    fmt.Printf(\"%s (%s)\\n\", r.URI, r.Variant)\n}\n\n// Find resources by spec\nrelated := s.FindBySpec(userSpec)\n\n// Find resources by field\nwithEmail := s.FindByField(\"email\")",{"id":96,"title":97,"titles":98,"content":99,"level":20},"/v0.0.5/learn/quickstart#next-steps","Next Steps",[54],"Core Concepts — Understand URIs, specs, and the catalogArchitecture — How scio fits in your system html pre.shiki code .sUt3r, html code.shiki .sUt3r{--shiki-default:var(--shiki-keyword)}html pre.shiki code .sxAnc, html code.shiki .sxAnc{--shiki-default:var(--shiki-string)}html pre.shiki code .sh8_p, html code.shiki .sh8_p{--shiki-default:var(--shiki-text)}html pre.shiki code .sq5bi, html code.shiki .sq5bi{--shiki-default:var(--shiki-punctuation)}html pre.shiki code .s5klm, html code.shiki .s5klm{--shiki-default:var(--shiki-function)}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sLkEo, html code.shiki .sLkEo{--shiki-default:var(--shiki-comment)}html pre.shiki code .sYBwO, html code.shiki .sYBwO{--shiki-default:var(--shiki-type)}html pre.shiki code .sW3Qg, html code.shiki .sW3Qg{--shiki-default:var(--shiki-operator)}html pre.shiki code .scyPU, html code.shiki .scyPU{--shiki-default:var(--shiki-placeholder)}html pre.shiki code .suWN2, html code.shiki .suWN2{--shiki-default:var(--shiki-tag)}",{"id":101,"title":23,"titles":102,"content":103,"level":9},"/v0.0.5/learn/concepts",[],"Understanding scio's core abstractions",{"id":105,"title":23,"titles":106,"content":25,"level":9},"/v0.0.5/learn/concepts#core-concepts",[],{"id":108,"title":109,"titles":110,"content":111,"level":20},"/v0.0.5/learn/concepts#uri-scheme","URI Scheme",[23],"scio uses URIs to address data. Each URI has three components: variant://resource/key Variant — The storage type (db, kv, bcs)Resource — The logical name (table, store, bucket)Key — The record identifier or path",{"id":113,"title":114,"titles":115,"content":116,"level":31},"/v0.0.5/learn/concepts#variant-semantics","Variant Semantics",[23,109],"Each variant has specific parsing rules: VariantResourceKeydb://Table nameRecord keykv://Store nameCache keybcs://Bucket nameFull object path For blob storage, the key can contain slashes: bcs://documents/reports/2024/q4/summary.pdf\n└─ bucket ──┘ └─────── key (full path) ──────┘",{"id":118,"title":119,"titles":120,"content":121,"level":20},"/v0.0.5/learn/concepts#resources","Resources",[23],"A resource is a registered data source: type Resource struct {\n    URI      string      // Full URI (e.g., \"db://users\")\n    Variant  Variant     // Storage type\n    Name     string      // Resource name\n    Spec     atom.Spec   // Type metadata\n    Metadata Metadata    // Annotations\n}",{"id":123,"title":124,"titles":125,"content":126,"level":31},"/v0.0.5/learn/concepts#metadata","Metadata",[23,119],"Resources can be annotated with metadata: s.RegisterDatabase(\"db://users\", db.Atomic(),\n    scio.WithDescription(\"User accounts table\"),\n    scio.WithVersion(\"1.2\"),\n    scio.WithTag(\"owner\", \"auth-team\"),\n    scio.WithTag(\"pii\", \"true\"),\n)",{"id":128,"title":129,"titles":130,"content":131,"level":20},"/v0.0.5/learn/concepts#specs-and-type-identity","Specs and Type Identity",[23],"scio tracks type information via specs (from the atom library). When you register a resource, its spec is captured.",{"id":133,"title":134,"titles":135,"content":136,"level":31},"/v0.0.5/learn/concepts#fqdn-identity","FQDN Identity",[23,129],"Types are identified by their fully qualified domain name (FQDN): github.com/myapp/models.User Two resources share a type if they have the same FQDN.",{"id":138,"title":139,"titles":140,"content":141,"level":31},"/v0.0.5/learn/concepts#spec-relationships","Spec Relationships",[23,129],"scio auto-detects when multiple resources share a spec: // Both use the User type\ns.RegisterDatabase(\"db://users\", usersDB.Atomic())\ns.RegisterStore(\"kv://user-cache\", userCache.Atomic())\n\n// Find related resources\nrelated := s.Related(\"db://users\")\n// Returns: [{URI: \"kv://user-cache\", ...}]",{"id":143,"title":144,"titles":145,"content":146,"level":20},"/v0.0.5/learn/concepts#the-catalog","The Catalog",[23],"The catalog provides introspection over registered resources: // Topology queries\ns.Sources()              // All resources\ns.Databases()            // All db:// resources\ns.Stores()               // All kv:// resources\ns.Buckets()              // All bcs:// resources\n\n// Spec queries\ns.Spec(\"db://users\")     // Get spec for a resource\ns.FindBySpec(spec)       // Find resources by spec\ns.FindByField(\"email\")   // Find resources containing field\ns.Related(\"db://users\")  // Find resources sharing the same spec",{"id":148,"title":149,"titles":150,"content":151,"level":20},"/v0.0.5/learn/concepts#operations","Operations",[23],"Operations are dispatched based on URI variant: OperationDatabaseStoreBucketGet✓✓✓Set✓✓—Delete✓✓✓Exists✓✓✓Query✓——Select✓——SetWithTTL—✓—Put——✓ html pre.shiki code .sUt3r, html code.shiki .sUt3r{--shiki-default:var(--shiki-keyword)}html pre.shiki code .sYBwO, html code.shiki .sYBwO{--shiki-default:var(--shiki-type)}html pre.shiki code .sq5bi, html code.shiki .sq5bi{--shiki-default:var(--shiki-punctuation)}html pre.shiki code .sBGCq, html code.shiki .sBGCq{--shiki-default:var(--shiki-property)}html pre.shiki code .sLkEo, html code.shiki .sLkEo{--shiki-default:var(--shiki-comment)}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sh8_p, html code.shiki .sh8_p{--shiki-default:var(--shiki-text)}html pre.shiki code .s5klm, html code.shiki .s5klm{--shiki-default:var(--shiki-function)}html pre.shiki code .sxAnc, html code.shiki .sxAnc{--shiki-default:var(--shiki-string)}",{"id":153,"title":154,"titles":155,"content":156,"level":9},"/v0.0.5/learn/architecture","Architecture",[],"How scio fits in your system",{"id":158,"title":154,"titles":159,"content":25,"level":9},"/v0.0.5/learn/architecture#architecture",[],{"id":161,"title":162,"titles":163,"content":164,"level":20},"/v0.0.5/learn/architecture#system-position","System Position",[154],"scio sits between your application logic and storage providers: Application Layer\n       │\n       ▼\n    ┌─────┐\n    │scio │  ← URI routing, catalog, spec tracking\n    └──┬──┘\n       │\n       ▼\n┌──────────────┐\n│ grub Atomic  │  ← Type-agnostic interfaces\n│  Interfaces  │\n└──────┬───────┘\n       │\n       ▼\n┌──────────────┐\n│    grub      │  ← Typed wrappers\n│   Wrappers   │\n└──────┬───────┘\n       │\n       ▼\n┌──────────────┐\n│  Providers   │  ← Redis, PostgreSQL, S3, etc.\n└──────────────┘",{"id":166,"title":167,"titles":168,"content":25,"level":20},"/v0.0.5/learn/architecture#data-flow","Data Flow",[154],{"id":170,"title":171,"titles":172,"content":173,"level":31},"/v0.0.5/learn/architecture#registration","Registration",[154,167],"User Code                    scio                     grub\n    │                          │                        │\n    │  NewDatabase[User]()     │                        │\n    │ ─────────────────────────┼───────────────────────▶│\n    │                          │                        │\n    │  .Atomic()               │                        │\n    │ ─────────────────────────┼───────────────────────▶│\n    │                          │   AtomicDatabase       │\n    │                          │◀───────────────────────│\n    │                          │                        │\n    │  RegisterDatabase()      │                        │\n    │ ────────────────────────▶│                        │\n    │                          │  Store by URI          │\n    │                          │  Track spec            │",{"id":175,"title":149,"titles":176,"content":177,"level":31},"/v0.0.5/learn/architecture#operations",[154,167],"Caller                       scio                   Provider\n   │                           │                        │\n   │  Get(\"db://users/123\")    │                        │\n   │ ─────────────────────────▶│                        │\n   │                           │  Parse URI             │\n   │                           │  Lookup provider       │\n   │                           │                        │\n   │                           │  Get(ctx, \"123\")       │\n   │                           │───────────────────────▶│\n   │                           │                        │\n   │                           │       *atom.Atom       │\n   │       *atom.Atom          │◀───────────────────────│\n   │◀──────────────────────────│                        │",{"id":179,"title":180,"titles":181,"content":182,"level":20},"/v0.0.5/learn/architecture#thread-safety","Thread Safety",[154],"scio uses sync.RWMutex for thread-safe access: Registration operations acquire write lockRead operations (Get, Exists, catalog queries) acquire read lockMultiple readers can operate concurrently",{"id":184,"title":185,"titles":186,"content":187,"level":20},"/v0.0.5/learn/architecture#error-handling","Error Handling",[154],"scio uses semantic errors: // scio-specific errors\nscio.ErrInvalidURI       // URI parsing failed\nscio.ErrUnknownVariant   // Unknown scheme\nscio.ErrResourceNotFound // Resource not registered\nscio.ErrResourceExists   // Duplicate registration\nscio.ErrVariantMismatch  // Wrong operation for variant\nscio.ErrKeyRequired      // Missing key in URI\nscio.ErrKeyNotExpected   // Key provided but not used (Query/Select)\n\n// Passed through from grub\nscio.ErrNotFound         // Record doesn't exist\nscio.ErrDuplicate        // Key already exists",{"id":189,"title":190,"titles":191,"content":25,"level":20},"/v0.0.5/learn/architecture#integration-patterns","Integration Patterns",[154],{"id":193,"title":194,"titles":195,"content":196,"level":31},"/v0.0.5/learn/architecture#service-layer","Service Layer",[154,190],"type UserService struct {\n    catalog *scio.Scio\n}\n\nfunc (s *UserService) GetUser(ctx context.Context, id string) (*atom.Atom, error) {\n    return s.catalog.Get(ctx, \"db://users/\"+id)\n}",{"id":198,"title":199,"titles":200,"content":201,"level":31},"/v0.0.5/learn/architecture#middleware","Middleware",[154,190],"func DataContextMiddleware(s *scio.Scio) func(http.Handler) http.Handler {\n    return func(next http.Handler) http.Handler {\n        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n            ctx := context.WithValue(r.Context(), \"scio\", s)\n            next.ServeHTTP(w, r.WithContext(ctx))\n        })\n    }\n} html pre.shiki code .sLkEo, html code.shiki .sLkEo{--shiki-default:var(--shiki-comment)}html pre.shiki code .sh8_p, html code.shiki .sh8_p{--shiki-default:var(--shiki-text)}html pre.shiki code .sq5bi, html code.shiki .sq5bi{--shiki-default:var(--shiki-punctuation)}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sUt3r, html code.shiki .sUt3r{--shiki-default:var(--shiki-keyword)}html pre.shiki code .sYBwO, html code.shiki .sYBwO{--shiki-default:var(--shiki-type)}html pre.shiki code .sBGCq, html code.shiki .sBGCq{--shiki-default:var(--shiki-property)}html pre.shiki code .sW3Qg, html code.shiki .sW3Qg{--shiki-default:var(--shiki-operator)}html pre.shiki code .sSYET, html code.shiki .sSYET{--shiki-default:var(--shiki-parameter)}html pre.shiki code .s5klm, html code.shiki .s5klm{--shiki-default:var(--shiki-function)}html pre.shiki code .sxAnc, html code.shiki .sxAnc{--shiki-default:var(--shiki-string)}",{"id":203,"title":204,"titles":205,"content":206,"level":9},"/v0.0.5/reference/api","API Reference",[],"Complete API documentation for scio",{"id":208,"title":204,"titles":209,"content":25,"level":9},"/v0.0.5/reference/api#api-reference",[],{"id":211,"title":212,"titles":213,"content":25,"level":20},"/v0.0.5/reference/api#types","Types",[204],{"id":215,"title":216,"titles":217,"content":218,"level":31},"/v0.0.5/reference/api#variant","Variant",[204,212],"type Variant string\n\nconst (\n    VariantDatabase Variant = \"db\"\n    VariantStore    Variant = \"kv\"\n    VariantBucket   Variant = \"bcs\"\n    VariantIndex    Variant = \"idx\"\n)",{"id":220,"title":221,"titles":222,"content":223,"level":31},"/v0.0.5/reference/api#uri","URI",[204,212],"type URI struct {\n    Variant  Variant\n    Resource string  // table, store, or bucket name\n    Key      string  // record key or blob path\n}\n\nfunc ParseURI(raw string) (*URI, error)\nfunc (u *URI) String() string\nfunc (u *URI) ResourceURI() string",{"id":225,"title":226,"titles":227,"content":228,"level":31},"/v0.0.5/reference/api#resource","Resource",[204,212],"type Resource struct {\n    URI      string\n    Variant  Variant\n    Name     string\n    Spec     atom.Spec\n    Metadata Metadata\n}",{"id":230,"title":124,"titles":231,"content":232,"level":31},"/v0.0.5/reference/api#metadata",[204,212],"type Metadata struct {\n    Description string\n    Version     string\n    Tags        map[string]string\n}",{"id":234,"title":235,"titles":236,"content":25,"level":20},"/v0.0.5/reference/api#scio","Scio",[204],{"id":238,"title":239,"titles":240,"content":241,"level":31},"/v0.0.5/reference/api#constructor","Constructor",[204,235],"func New() *Scio",{"id":243,"title":171,"titles":244,"content":245,"level":31},"/v0.0.5/reference/api#registration",[204,235],"func (s *Scio) RegisterDatabase(uri string, db grub.AtomicDatabase, opts ...RegistrationOption) error\nfunc (s *Scio) RegisterStore(uri string, store grub.AtomicStore, opts ...RegistrationOption) error\nfunc (s *Scio) RegisterBucket(uri string, bucket grub.AtomicBucket, opts ...RegistrationOption) error\nfunc (s *Scio) RegisterIndex(uri string, index grub.AtomicIndex, opts ...RegistrationOption) error",{"id":247,"title":248,"titles":249,"content":250,"level":31},"/v0.0.5/reference/api#registration-options","Registration Options",[204,235],"func WithDescription(desc string) RegistrationOption\nfunc WithVersion(ver string) RegistrationOption\nfunc WithTag(key, value string) RegistrationOption",{"id":252,"title":149,"titles":253,"content":254,"level":31},"/v0.0.5/reference/api#operations",[204,235],"// Common operations\nfunc (s *Scio) Get(ctx context.Context, uri string) (*atom.Atom, error)\nfunc (s *Scio) Set(ctx context.Context, uri string, data *atom.Atom) error\nfunc (s *Scio) Delete(ctx context.Context, uri string) error\nfunc (s *Scio) Exists(ctx context.Context, uri string) (bool, error)\n\n// Database operations\nfunc (s *Scio) Query(ctx context.Context, uri string, stmt edamame.QueryStatement, params map[string]any) ([]*atom.Atom, error)\nfunc (s *Scio) Select(ctx context.Context, uri string, stmt edamame.SelectStatement, params map[string]any) (*atom.Atom, error)\n\n// Store operations\nfunc (s *Scio) SetWithTTL(ctx context.Context, uri string, data *atom.Atom, ttl time.Duration) error\n\n// Bucket operations\nfunc (s *Scio) Put(ctx context.Context, uri string, obj *grub.AtomicObject) error\n\n// Index operations\nfunc (s *Scio) GetVector(ctx context.Context, uri string) (*grub.AtomicVector, error)\nfunc (s *Scio) UpsertVector(ctx context.Context, uri string, vector []float32, metadata *atom.Atom) error\nfunc (s *Scio) DeleteVector(ctx context.Context, uri string) error\nfunc (s *Scio) VectorExists(ctx context.Context, uri string) (bool, error)\nfunc (s *Scio) SearchVectors(ctx context.Context, uri string, vector []float32, k int, filter *atom.Atom) ([]grub.AtomicVector, error)\nfunc (s *Scio) QueryVectors(ctx context.Context, uri string, vector []float32, k int, filter *vecna.Filter) ([]grub.AtomicVector, error)\nfunc (s *Scio) FilterVectors(ctx context.Context, uri string, filter *vecna.Filter, limit int) ([]grub.AtomicVector, error)",{"id":256,"title":257,"titles":258,"content":259,"level":31},"/v0.0.5/reference/api#catalog","Catalog",[204,235],"// Topology queries\nfunc (s *Scio) Sources() []Resource\nfunc (s *Scio) Databases() []Resource\nfunc (s *Scio) Stores() []Resource\nfunc (s *Scio) Buckets() []Resource\nfunc (s *Scio) Indexes() []Resource\n\n// Spec queries\nfunc (s *Scio) Spec(uri string) (atom.Spec, error)\nfunc (s *Scio) FindBySpec(spec atom.Spec) []Resource\nfunc (s *Scio) FindByField(field string) []Resource\nfunc (s *Scio) Related(uri string) []Resource\n\n// Resource lookup\nfunc (s *Scio) Resource(uri string) *Resource",{"id":261,"title":262,"titles":263,"content":264,"level":20},"/v0.0.5/reference/api#errors","Errors",[204],"// scio errors\nvar ErrInvalidURI       = errors.New(\"invalid URI\")\nvar ErrUnknownVariant   = errors.New(\"unknown variant\")\nvar ErrResourceNotFound = errors.New(\"resource not found\")\nvar ErrResourceExists   = errors.New(\"resource already exists\")\nvar ErrVariantMismatch  = errors.New(\"variant mismatch\")\nvar ErrKeyRequired      = errors.New(\"key required\")\nvar ErrKeyNotExpected   = errors.New(\"key not expected\")\nvar ErrInvalidUUID      = errors.New(\"invalid UUID\")\n\n// Re-exported from grub\nvar ErrNotFound        = grub.ErrNotFound\nvar ErrDuplicate       = grub.ErrDuplicate\nvar ErrConflict        = grub.ErrConflict\nvar ErrConstraint      = grub.ErrConstraint\nvar ErrInvalidKey      = grub.ErrInvalidKey\nvar ErrReadOnly        = grub.ErrReadOnly\nvar ErrTTLNotSupported = grub.ErrTTLNotSupported html pre.shiki code .sUt3r, html code.shiki .sUt3r{--shiki-default:var(--shiki-keyword)}html pre.shiki code .sYBwO, html code.shiki .sYBwO{--shiki-default:var(--shiki-type)}html pre.shiki code .sq5bi, html code.shiki .sq5bi{--shiki-default:var(--shiki-punctuation)}html pre.shiki code .sfm-E, html code.shiki .sfm-E{--shiki-default:var(--shiki-variable)}html pre.shiki code .sh8_p, html code.shiki .sh8_p{--shiki-default:var(--shiki-text)}html pre.shiki code .sxAnc, html code.shiki .sxAnc{--shiki-default:var(--shiki-string)}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sBGCq, html code.shiki .sBGCq{--shiki-default:var(--shiki-property)}html pre.shiki code .sLkEo, html code.shiki .sLkEo{--shiki-default:var(--shiki-comment)}html pre.shiki code .s5klm, html code.shiki .s5klm{--shiki-default:var(--shiki-function)}html pre.shiki code .sSYET, html code.shiki .sSYET{--shiki-default:var(--shiki-parameter)}html pre.shiki code .sW3Qg, html code.shiki .sW3Qg{--shiki-default:var(--shiki-operator)}",[266],{"title":267,"path":268,"stem":269,"children":270,"page":284},"V005","/v0.0.5","v0.0.5",[271,273,285],{"title":6,"path":5,"stem":272,"description":8},"v0.0.5/1.overview",{"title":274,"path":275,"stem":276,"children":277,"page":284},"Learn","/v0.0.5/learn","v0.0.5/2.learn",[278,280,282],{"title":54,"path":53,"stem":279,"description":56},"v0.0.5/2.learn/1.quickstart",{"title":23,"path":101,"stem":281,"description":103},"v0.0.5/2.learn/2.concepts",{"title":154,"path":153,"stem":283,"description":156},"v0.0.5/2.learn/3.architecture",false,{"title":286,"path":287,"stem":288,"children":289,"page":284},"Reference","/v0.0.5/reference","v0.0.5/5.reference",[290],{"title":204,"path":203,"stem":291,"description":206},"v0.0.5/5.reference/1.api",[293],{"title":267,"path":268,"stem":269,"children":294,"page":284},[295,296,301],{"title":6,"path":5,"stem":272},{"title":274,"path":275,"stem":276,"children":297,"page":284},[298,299,300],{"title":54,"path":53,"stem":279},{"title":23,"path":101,"stem":281},{"title":154,"path":153,"stem":283},{"title":286,"path":287,"stem":288,"children":302,"page":284},[303],{"title":204,"path":203,"stem":291},[305,1416,1561],{"id":306,"title":307,"body":308,"description":25,"extension":1409,"icon":1410,"meta":1411,"navigation":436,"path":1412,"seo":1413,"stem":1414,"__hash__":1415},"resources/readme.md","README",{"type":309,"value":310,"toc":1396},"minimark",[311,314,384,387,390,395,398,716,720,737,740,743,1218,1222,1295,1299,1334,1338,1342,1359,1362,1369,1373,1381,1385,1392],[312,313,12],"h1",{"id":12},[315,316,317,328,336,344,352,360,368,376],"p",{},[318,319,323],"a",{"href":320,"rel":321},"https://github.com/zoobz-io/scio/actions/workflows/ci.yml",[322],"nofollow",[324,325],"img",{"alt":326,"src":327},"CI","https://github.com/zoobz-io/scio/actions/workflows/ci.yml/badge.svg",[318,329,332],{"href":330,"rel":331},"https://codecov.io/gh/zoobz-io/scio",[322],[324,333],{"alt":334,"src":335},"codecov","https://codecov.io/gh/zoobz-io/scio/branch/main/graph/badge.svg",[318,337,340],{"href":338,"rel":339},"https://goreportcard.com/report/github.com/zoobz-io/scio",[322],[324,341],{"alt":342,"src":343},"Go Report Card","https://goreportcard.com/badge/github.com/zoobz-io/scio",[318,345,348],{"href":346,"rel":347},"https://github.com/zoobz-io/scio/actions/workflows/codeql.yml",[322],[324,349],{"alt":350,"src":351},"CodeQL","https://github.com/zoobz-io/scio/actions/workflows/codeql.yml/badge.svg",[318,353,356],{"href":354,"rel":355},"https://pkg.go.dev/github.com/zoobz-io/scio",[322],[324,357],{"alt":358,"src":359},"Go Reference","https://pkg.go.dev/badge/github.com/zoobz-io/scio.svg",[318,361,364],{"href":362,"rel":363},"https://opensource.org/licenses/MIT",[322],[324,365],{"alt":366,"src":367},"License: MIT","https://img.shields.io/badge/License-MIT-yellow.svg",[318,369,372],{"href":370,"rel":371},"https://go.dev/",[322],[324,373],{"alt":374,"src":375},"Go Version","https://img.shields.io/github/go-mod/go-version/zoobz-io/scio",[318,377,380],{"href":378,"rel":379},"https://github.com/zoobz-io/scio/releases",[322],[324,381],{"alt":382,"src":383},"Release","https://img.shields.io/github/v/release/zoobz-io/scio",[315,385,386],{},"URI-based data catalog with atomic operations for Go.",[315,388,389],{},"scio is the system's authoritative map of data sources — it knows where data lives and provides type-agnostic access via atoms.",[391,392,394],"h2",{"id":393},"the-map","The Map",[315,396,397],{},"scio registers storage resources and routes operations through URIs:",[399,400,404],"pre",{"className":401,"code":402,"language":403,"meta":25,"style":25},"language-go shiki shiki-themes","s := scio.New()\n\n// Register resources (user code provides typed grub wrappers)\ns.RegisterDatabase(\"db://users\", usersDB.Atomic())\ns.RegisterStore(\"kv://sessions\", sessionsStore.Atomic())\ns.RegisterBucket(\"bcs://documents\", docsBucket.Atomic())\n\n// Operations via URI — scio routes to the right provider\natom, _ := s.Get(ctx, \"db://users/123\")\ns.Set(ctx, \"kv://sessions/abc\", sessionAtom)\n\n// Query databases\nresults, _ := s.Query(ctx, \"db://users\", stmt, params)\n\n// Introspect the topology\ns.Sources()                    // all registered resources\ns.FindBySpec(spec)             // resources sharing a type\ns.Related(\"db://users\")        // other resources with same spec\n","go",[405,406,407,432,438,444,475,501,527,532,538,572,598,603,609,649,654,660,676,697],"code",{"__ignoreMap":25},[408,409,411,415,418,421,425,429],"span",{"class":410,"line":9},"line",[408,412,414],{"class":413},"sh8_p","s",[408,416,417],{"class":413}," :=",[408,419,420],{"class":413}," scio",[408,422,424],{"class":423},"sq5bi",".",[408,426,428],{"class":427},"s5klm","New",[408,430,431],{"class":423},"()\n",[408,433,434],{"class":410,"line":20},[408,435,437],{"emptyLinePlaceholder":436},true,"\n",[408,439,440],{"class":410,"line":31},[408,441,443],{"class":442},"sLkEo","// Register resources (user code provides typed grub wrappers)\n",[408,445,447,449,451,454,457,461,464,467,469,472],{"class":410,"line":446},4,[408,448,414],{"class":413},[408,450,424],{"class":423},[408,452,453],{"class":427},"RegisterDatabase",[408,455,456],{"class":423},"(",[408,458,460],{"class":459},"sxAnc","\"db://users\"",[408,462,463],{"class":423},",",[408,465,466],{"class":413}," usersDB",[408,468,424],{"class":423},[408,470,471],{"class":427},"Atomic",[408,473,474],{"class":423},"())\n",[408,476,478,480,482,485,487,490,492,495,497,499],{"class":410,"line":477},5,[408,479,414],{"class":413},[408,481,424],{"class":423},[408,483,484],{"class":427},"RegisterStore",[408,486,456],{"class":423},[408,488,489],{"class":459},"\"kv://sessions\"",[408,491,463],{"class":423},[408,493,494],{"class":413}," sessionsStore",[408,496,424],{"class":423},[408,498,471],{"class":427},[408,500,474],{"class":423},[408,502,504,506,508,511,513,516,518,521,523,525],{"class":410,"line":503},6,[408,505,414],{"class":413},[408,507,424],{"class":423},[408,509,510],{"class":427},"RegisterBucket",[408,512,456],{"class":423},[408,514,515],{"class":459},"\"bcs://documents\"",[408,517,463],{"class":423},[408,519,520],{"class":413}," docsBucket",[408,522,424],{"class":423},[408,524,471],{"class":427},[408,526,474],{"class":423},[408,528,530],{"class":410,"line":529},7,[408,531,437],{"emptyLinePlaceholder":436},[408,533,535],{"class":410,"line":534},8,[408,536,537],{"class":442},"// Operations via URI — scio routes to the right provider\n",[408,539,541,544,546,549,551,554,556,559,561,564,566,569],{"class":410,"line":540},9,[408,542,543],{"class":413},"atom",[408,545,463],{"class":423},[408,547,548],{"class":413}," _",[408,550,417],{"class":413},[408,552,553],{"class":413}," s",[408,555,424],{"class":423},[408,557,558],{"class":427},"Get",[408,560,456],{"class":423},[408,562,563],{"class":413},"ctx",[408,565,463],{"class":423},[408,567,568],{"class":459}," \"db://users/123\"",[408,570,571],{"class":423},")\n",[408,573,575,577,579,582,584,586,588,591,593,596],{"class":410,"line":574},10,[408,576,414],{"class":413},[408,578,424],{"class":423},[408,580,581],{"class":427},"Set",[408,583,456],{"class":423},[408,585,563],{"class":413},[408,587,463],{"class":423},[408,589,590],{"class":459}," \"kv://sessions/abc\"",[408,592,463],{"class":423},[408,594,595],{"class":413}," sessionAtom",[408,597,571],{"class":423},[408,599,601],{"class":410,"line":600},11,[408,602,437],{"emptyLinePlaceholder":436},[408,604,606],{"class":410,"line":605},12,[408,607,608],{"class":442},"// Query databases\n",[408,610,612,615,617,619,621,623,625,628,630,632,634,637,639,642,644,647],{"class":410,"line":611},13,[408,613,614],{"class":413},"results",[408,616,463],{"class":423},[408,618,548],{"class":413},[408,620,417],{"class":413},[408,622,553],{"class":413},[408,624,424],{"class":423},[408,626,627],{"class":427},"Query",[408,629,456],{"class":423},[408,631,563],{"class":413},[408,633,463],{"class":423},[408,635,636],{"class":459}," \"db://users\"",[408,638,463],{"class":423},[408,640,641],{"class":413}," stmt",[408,643,463],{"class":423},[408,645,646],{"class":413}," params",[408,648,571],{"class":423},[408,650,652],{"class":410,"line":651},14,[408,653,437],{"emptyLinePlaceholder":436},[408,655,657],{"class":410,"line":656},15,[408,658,659],{"class":442},"// Introspect the topology\n",[408,661,663,665,667,670,673],{"class":410,"line":662},16,[408,664,414],{"class":413},[408,666,424],{"class":423},[408,668,669],{"class":427},"Sources",[408,671,672],{"class":423},"()",[408,674,675],{"class":442},"                    // all registered resources\n",[408,677,679,681,683,686,688,691,694],{"class":410,"line":678},17,[408,680,414],{"class":413},[408,682,424],{"class":423},[408,684,685],{"class":427},"FindBySpec",[408,687,456],{"class":423},[408,689,690],{"class":413},"spec",[408,692,693],{"class":423},")",[408,695,696],{"class":442},"             // resources sharing a type\n",[408,698,700,702,704,707,709,711,713],{"class":410,"line":699},18,[408,701,414],{"class":413},[408,703,424],{"class":423},[408,705,706],{"class":427},"Related",[408,708,456],{"class":423},[408,710,460],{"class":459},[408,712,693],{"class":423},[408,714,715],{"class":442},"        // other resources with same spec\n",[391,717,719],{"id":718},"install","Install",[399,721,725],{"className":722,"code":723,"language":724,"meta":25,"style":25},"language-bash shiki shiki-themes","go get github.com/zoobz-io/scio\n","bash",[405,726,727],{"__ignoreMap":25},[408,728,729,731,734],{"class":410,"line":9},[408,730,403],{"class":427},[408,732,733],{"class":459}," get",[408,735,736],{"class":459}," github.com/zoobz-io/scio\n",[315,738,739],{},"Requires Go 1.24 or higher.",[391,741,54],{"id":742},"quick-start",[399,744,746],{"className":401,"code":745,"language":403,"meta":25,"style":25},"package main\n\nimport (\n    \"context\"\n    \"fmt\"\n\n    \"github.com/zoobz-io/grub\"\n    \"github.com/zoobz-io/scio\"\n)\n\nfunc main() {\n    // Create scio instance\n    s := scio.New()\n\n    // Register a database (assumes usersDB is a grub.Database[User])\n    err := s.RegisterDatabase(\"db://users\", usersDB.Atomic(),\n        scio.WithDescription(\"User accounts\"),\n        scio.WithTag(\"owner\", \"auth-team\"),\n    )\n    if err != nil {\n        panic(err)\n    }\n\n    ctx := context.Background()\n\n    // Get a record\n    atom, err := s.Get(ctx, \"db://users/123\")\n    if err != nil {\n        panic(err)\n    }\n\n    // Access fields via typed maps\n    fmt.Println(atom.Strings[\"email\"])\n    fmt.Println(atom.Ints[\"age\"])\n\n    // Find related resources\n    for _, r := range s.Related(\"db://users\") {\n        fmt.Printf(\"Related: %s (%s)\\n\", r.URI, r.Variant)\n    }\n}\n",[405,747,748,758,762,771,776,781,785,790,795,799,803,816,821,836,840,845,873,891,912,918,936,950,956,961,979,984,990,1018,1031,1042,1047,1052,1058,1087,1112,1117,1123,1155,1207,1212],{"__ignoreMap":25},[408,749,750,754],{"class":410,"line":9},[408,751,753],{"class":752},"sUt3r","package",[408,755,757],{"class":756},"sYBwO"," main\n",[408,759,760],{"class":410,"line":20},[408,761,437],{"emptyLinePlaceholder":436},[408,763,764,767],{"class":410,"line":31},[408,765,766],{"class":752},"import",[408,768,770],{"class":769},"soy-K"," (\n",[408,772,773],{"class":410,"line":446},[408,774,775],{"class":459},"    \"context\"\n",[408,777,778],{"class":410,"line":477},[408,779,780],{"class":459},"    \"fmt\"\n",[408,782,783],{"class":410,"line":503},[408,784,437],{"emptyLinePlaceholder":436},[408,786,787],{"class":410,"line":529},[408,788,789],{"class":459},"    \"github.com/zoobz-io/grub\"\n",[408,791,792],{"class":410,"line":534},[408,793,794],{"class":459},"    \"github.com/zoobz-io/scio\"\n",[408,796,797],{"class":410,"line":540},[408,798,571],{"class":769},[408,800,801],{"class":410,"line":574},[408,802,437],{"emptyLinePlaceholder":436},[408,804,805,808,811,813],{"class":410,"line":600},[408,806,807],{"class":752},"func",[408,809,810],{"class":427}," main",[408,812,672],{"class":423},[408,814,815],{"class":423}," {\n",[408,817,818],{"class":410,"line":605},[408,819,820],{"class":442},"    // Create scio instance\n",[408,822,823,826,828,830,832,834],{"class":410,"line":611},[408,824,825],{"class":413},"    s",[408,827,417],{"class":413},[408,829,420],{"class":413},[408,831,424],{"class":423},[408,833,428],{"class":427},[408,835,431],{"class":423},[408,837,838],{"class":410,"line":651},[408,839,437],{"emptyLinePlaceholder":436},[408,841,842],{"class":410,"line":656},[408,843,844],{"class":442},"    // Register a database (assumes usersDB is a grub.Database[User])\n",[408,846,847,850,852,854,856,858,860,862,864,866,868,870],{"class":410,"line":662},[408,848,849],{"class":413},"    err",[408,851,417],{"class":413},[408,853,553],{"class":413},[408,855,424],{"class":423},[408,857,453],{"class":427},[408,859,456],{"class":423},[408,861,460],{"class":459},[408,863,463],{"class":423},[408,865,466],{"class":413},[408,867,424],{"class":423},[408,869,471],{"class":427},[408,871,872],{"class":423},"(),\n",[408,874,875,878,880,883,885,888],{"class":410,"line":678},[408,876,877],{"class":413},"        scio",[408,879,424],{"class":423},[408,881,882],{"class":427},"WithDescription",[408,884,456],{"class":423},[408,886,887],{"class":459},"\"User accounts\"",[408,889,890],{"class":423},"),\n",[408,892,893,895,897,900,902,905,907,910],{"class":410,"line":699},[408,894,877],{"class":413},[408,896,424],{"class":423},[408,898,899],{"class":427},"WithTag",[408,901,456],{"class":423},[408,903,904],{"class":459},"\"owner\"",[408,906,463],{"class":423},[408,908,909],{"class":459}," \"auth-team\"",[408,911,890],{"class":423},[408,913,915],{"class":410,"line":914},19,[408,916,917],{"class":423},"    )\n",[408,919,921,925,928,931,934],{"class":410,"line":920},20,[408,922,924],{"class":923},"sW3Qg","    if",[408,926,927],{"class":413}," err",[408,929,930],{"class":923}," !=",[408,932,933],{"class":752}," nil",[408,935,815],{"class":423},[408,937,939,943,945,948],{"class":410,"line":938},21,[408,940,942],{"class":941},"skxcq","        panic",[408,944,456],{"class":423},[408,946,947],{"class":413},"err",[408,949,571],{"class":423},[408,951,953],{"class":410,"line":952},22,[408,954,955],{"class":423},"    }\n",[408,957,959],{"class":410,"line":958},23,[408,960,437],{"emptyLinePlaceholder":436},[408,962,964,967,969,972,974,977],{"class":410,"line":963},24,[408,965,966],{"class":413},"    ctx",[408,968,417],{"class":413},[408,970,971],{"class":413}," context",[408,973,424],{"class":423},[408,975,976],{"class":427},"Background",[408,978,431],{"class":423},[408,980,982],{"class":410,"line":981},25,[408,983,437],{"emptyLinePlaceholder":436},[408,985,987],{"class":410,"line":986},26,[408,988,989],{"class":442},"    // Get a record\n",[408,991,993,996,998,1000,1002,1004,1006,1008,1010,1012,1014,1016],{"class":410,"line":992},27,[408,994,995],{"class":413},"    atom",[408,997,463],{"class":423},[408,999,927],{"class":413},[408,1001,417],{"class":413},[408,1003,553],{"class":413},[408,1005,424],{"class":423},[408,1007,558],{"class":427},[408,1009,456],{"class":423},[408,1011,563],{"class":413},[408,1013,463],{"class":423},[408,1015,568],{"class":459},[408,1017,571],{"class":423},[408,1019,1021,1023,1025,1027,1029],{"class":410,"line":1020},28,[408,1022,924],{"class":923},[408,1024,927],{"class":413},[408,1026,930],{"class":923},[408,1028,933],{"class":752},[408,1030,815],{"class":423},[408,1032,1034,1036,1038,1040],{"class":410,"line":1033},29,[408,1035,942],{"class":941},[408,1037,456],{"class":423},[408,1039,947],{"class":413},[408,1041,571],{"class":423},[408,1043,1045],{"class":410,"line":1044},30,[408,1046,955],{"class":423},[408,1048,1050],{"class":410,"line":1049},31,[408,1051,437],{"emptyLinePlaceholder":436},[408,1053,1055],{"class":410,"line":1054},32,[408,1056,1057],{"class":442},"    // Access fields via typed maps\n",[408,1059,1061,1064,1066,1069,1071,1073,1075,1078,1081,1084],{"class":410,"line":1060},33,[408,1062,1063],{"class":413},"    fmt",[408,1065,424],{"class":423},[408,1067,1068],{"class":427},"Println",[408,1070,456],{"class":423},[408,1072,543],{"class":413},[408,1074,424],{"class":423},[408,1076,1077],{"class":413},"Strings",[408,1079,1080],{"class":423},"[",[408,1082,1083],{"class":459},"\"email\"",[408,1085,1086],{"class":423},"])\n",[408,1088,1090,1092,1094,1096,1098,1100,1102,1105,1107,1110],{"class":410,"line":1089},34,[408,1091,1063],{"class":413},[408,1093,424],{"class":423},[408,1095,1068],{"class":427},[408,1097,456],{"class":423},[408,1099,543],{"class":413},[408,1101,424],{"class":423},[408,1103,1104],{"class":413},"Ints",[408,1106,1080],{"class":423},[408,1108,1109],{"class":459},"\"age\"",[408,1111,1086],{"class":423},[408,1113,1115],{"class":410,"line":1114},35,[408,1116,437],{"emptyLinePlaceholder":436},[408,1118,1120],{"class":410,"line":1119},36,[408,1121,1122],{"class":442},"    // Find related resources\n",[408,1124,1126,1129,1131,1133,1136,1138,1141,1143,1145,1147,1149,1151,1153],{"class":410,"line":1125},37,[408,1127,1128],{"class":923},"    for",[408,1130,548],{"class":413},[408,1132,463],{"class":423},[408,1134,1135],{"class":413}," r",[408,1137,417],{"class":413},[408,1139,1140],{"class":923}," range",[408,1142,553],{"class":413},[408,1144,424],{"class":423},[408,1146,706],{"class":427},[408,1148,456],{"class":423},[408,1150,460],{"class":459},[408,1152,693],{"class":423},[408,1154,815],{"class":423},[408,1156,1158,1161,1163,1166,1168,1171,1175,1178,1180,1182,1186,1189,1191,1193,1195,1197,1199,1201,1203,1205],{"class":410,"line":1157},38,[408,1159,1160],{"class":413},"        fmt",[408,1162,424],{"class":423},[408,1164,1165],{"class":427},"Printf",[408,1167,456],{"class":423},[408,1169,1170],{"class":459},"\"Related: ",[408,1172,1174],{"class":1173},"scyPU","%s",[408,1176,1177],{"class":459}," (",[408,1179,1174],{"class":1173},[408,1181,693],{"class":459},[408,1183,1185],{"class":1184},"suWN2","\\n",[408,1187,1188],{"class":459},"\"",[408,1190,463],{"class":423},[408,1192,1135],{"class":413},[408,1194,424],{"class":423},[408,1196,221],{"class":413},[408,1198,463],{"class":423},[408,1200,1135],{"class":413},[408,1202,424],{"class":423},[408,1204,216],{"class":413},[408,1206,571],{"class":423},[408,1208,1210],{"class":410,"line":1209},39,[408,1211,955],{"class":423},[408,1213,1215],{"class":410,"line":1214},40,[408,1216,1217],{"class":423},"}\n",[391,1219,1221],{"id":1220},"uri-semantics","URI Semantics",[1223,1224,1225,1240],"table",{},[1226,1227,1228],"thead",{},[1229,1230,1231,1234,1237],"tr",{},[1232,1233,216],"th",{},[1232,1235,1236],{},"Pattern",[1232,1238,1239],{},"Example",[1241,1242,1243,1261,1278],"tbody",{},[1229,1244,1245,1251,1256],{},[1246,1247,1248],"td",{},[405,1249,1250],{},"db://",[1246,1252,1253],{},[405,1254,1255],{},"table/key",[1246,1257,1258],{},[405,1259,1260],{},"db://users/123",[1229,1262,1263,1268,1273],{},[1246,1264,1265],{},[405,1266,1267],{},"kv://",[1246,1269,1270],{},[405,1271,1272],{},"store/key",[1246,1274,1275],{},[405,1276,1277],{},"kv://sessions/abc",[1229,1279,1280,1285,1290],{},[1246,1281,1282],{},[405,1283,1284],{},"bcs://",[1246,1286,1287],{},[405,1288,1289],{},"bucket/path",[1246,1291,1292],{},[405,1293,1294],{},"bcs://docs/reports/q4.pdf",[391,1296,1298],{"id":1297},"why-scio","Why scio?",[1300,1301,1302,1310,1316,1322,1328],"ul",{},[1303,1304,1305,1309],"li",{},[1306,1307,1308],"strong",{},"URI-based routing"," — logical addressing decoupled from physical storage",[1303,1311,1312,1315],{},[1306,1313,1314],{},"Type-agnostic"," — operates on atoms, never needs to know your types",[1303,1317,1318,1321],{},[1306,1319,1320],{},"Topology awareness"," — knows what resources exist and their relationships",[1303,1323,1324,1327],{},[1306,1325,1326],{},"Spec tracking"," — auto-detects when multiple resources share the same type",[1303,1329,1330,1333],{},[1306,1331,1332],{},"Metadata support"," — annotate resources for system use (LLM context, ownership, versioning)",[391,1335,1337],{"id":1336},"documentation","Documentation",[1339,1340,274],"h3",{"id":1341},"learn",[1300,1343,1344,1349,1354],{},[1303,1345,1346],{},[318,1347,54],{"href":1348},"docs/learn/quickstart",[1303,1350,1351],{},[318,1352,23],{"href":1353},"docs/learn/concepts",[1303,1355,1356],{},[318,1357,154],{"href":1358},"docs/learn/architecture",[1339,1360,286],{"id":1361},"reference",[1300,1363,1364],{},[1303,1365,1366],{},[318,1367,204],{"href":1368},"docs/reference/api",[391,1370,1372],{"id":1371},"contributing","Contributing",[315,1374,1375,1376,1380],{},"See ",[318,1377,1379],{"href":1378},"CONTRIBUTING","CONTRIBUTING.md"," for development setup and guidelines.",[391,1382,1384],{"id":1383},"license","License",[315,1386,1387,1388,1391],{},"MIT License - see ",[318,1389,1390],{"href":1390},"LICENSE"," for details.",[1393,1394,1395],"style",{},"html pre.shiki code .sh8_p, html code.shiki .sh8_p{--shiki-default:var(--shiki-text)}html pre.shiki code .sq5bi, html code.shiki .sq5bi{--shiki-default:var(--shiki-punctuation)}html pre.shiki code .s5klm, html code.shiki .s5klm{--shiki-default:var(--shiki-function)}html pre.shiki code .sLkEo, html code.shiki .sLkEo{--shiki-default:var(--shiki-comment)}html pre.shiki code .sxAnc, html code.shiki .sxAnc{--shiki-default:var(--shiki-string)}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sUt3r, html code.shiki .sUt3r{--shiki-default:var(--shiki-keyword)}html pre.shiki code .sYBwO, html code.shiki .sYBwO{--shiki-default:var(--shiki-type)}html pre.shiki code .soy-K, html code.shiki .soy-K{--shiki-default:#BBBBBB}html pre.shiki code .sW3Qg, html code.shiki .sW3Qg{--shiki-default:var(--shiki-operator)}html pre.shiki code .skxcq, html code.shiki .skxcq{--shiki-default:var(--shiki-builtin)}html pre.shiki code .scyPU, html code.shiki .scyPU{--shiki-default:var(--shiki-placeholder)}html pre.shiki code .suWN2, html code.shiki .suWN2{--shiki-default:var(--shiki-tag)}",{"title":25,"searchDepth":20,"depth":20,"links":1397},[1398,1399,1400,1401,1402,1403,1407,1408],{"id":393,"depth":20,"text":394},{"id":718,"depth":20,"text":719},{"id":742,"depth":20,"text":54},{"id":1220,"depth":20,"text":1221},{"id":1297,"depth":20,"text":1298},{"id":1336,"depth":20,"text":1337,"children":1404},[1405,1406],{"id":1341,"depth":31,"text":274},{"id":1361,"depth":31,"text":286},{"id":1371,"depth":20,"text":1372},{"id":1383,"depth":20,"text":1384},"md","book-open",{},"/readme",{"title":307,"description":25},"readme","kRSrXlj1emliC0ptWcFgX8aARGPhAUxZrHq7zVS40kc",{"id":1417,"title":1418,"body":1419,"description":25,"extension":1409,"icon":1555,"meta":1556,"navigation":436,"path":1557,"seo":1558,"stem":1559,"__hash__":1560},"resources/security.md","Security",{"type":309,"value":1420,"toc":1548},[1421,1425,1429,1451,1455,1458,1487,1491,1494,1520,1524,1527,1541,1545],[312,1422,1424],{"id":1423},"security-policy","Security Policy",[391,1426,1428],{"id":1427},"supported-versions","Supported Versions",[1223,1430,1431,1441],{},[1226,1432,1433],{},[1229,1434,1435,1438],{},[1232,1436,1437],{},"Version",[1232,1439,1440],{},"Supported",[1241,1442,1443],{},[1229,1444,1445,1448],{},[1246,1446,1447],{},"Latest",[1246,1449,1450],{},"✅",[391,1452,1454],{"id":1453},"reporting-a-vulnerability","Reporting a Vulnerability",[315,1456,1457],{},"We take security vulnerabilities seriously. If you discover a security issue, please follow these steps:",[1459,1460,1461,1467,1470],"ol",{},[1303,1462,1463,1466],{},[1306,1464,1465],{},"DO NOT"," create a public GitHub issue",[1303,1468,1469],{},"Email security details to the maintainers",[1303,1471,1472,1473],{},"Include:\n",[1300,1474,1475,1478,1481,1484],{},[1303,1476,1477],{},"Description of the vulnerability",[1303,1479,1480],{},"Steps to reproduce",[1303,1482,1483],{},"Potential impact",[1303,1485,1486],{},"Suggested fix (if available)",[391,1488,1490],{"id":1489},"security-best-practices","Security Best Practices",[315,1492,1493],{},"When using Scio:",[1459,1495,1496,1502,1508,1514],{},[1303,1497,1498,1501],{},[1306,1499,1500],{},"URI Validation",": Scio parses URIs to route operations. Ensure URIs are properly validated before passing to Scio to prevent injection attacks.",[1303,1503,1504,1507],{},[1306,1505,1506],{},"Spec Exposure",": Be aware that type metadata (field names, types) is accessible via the catalog. Review your struct definitions for information disclosure.",[1303,1509,1510,1513],{},[1306,1511,1512],{},"Provider Security",": Scio delegates storage operations to grub providers. Ensure your underlying storage (databases, caches, blob stores) are properly secured.",[1303,1515,1516,1519],{},[1306,1517,1518],{},"Access Control",": Scio does not implement authentication or authorization. Implement appropriate access controls in your application layer.",[391,1521,1523],{"id":1522},"security-features","Security Features",[315,1525,1526],{},"Scio is designed with security in mind:",[1300,1528,1529,1532,1535,1538],{},[1303,1530,1531],{},"No direct network operations (delegated to providers)",[1303,1533,1534],{},"No file system operations (delegated to providers)",[1303,1536,1537],{},"Type-safe operations through atoms",[1303,1539,1540],{},"URI scheme validation prevents variant injection",[391,1542,1544],{"id":1543},"acknowledgments","Acknowledgments",[315,1546,1547],{},"We appreciate responsible disclosure of security vulnerabilities.",{"title":25,"searchDepth":20,"depth":20,"links":1549},[1550,1551,1552,1553,1554],{"id":1427,"depth":20,"text":1428},{"id":1453,"depth":20,"text":1454},{"id":1489,"depth":20,"text":1490},{"id":1522,"depth":20,"text":1523},{"id":1543,"depth":20,"text":1544},"shield",{},"/security",{"title":1418,"description":25},"security","2bCaIpy1G_8DOL_WIU9ofOx1s6HHbLRCTQC2FQbP2PE",{"id":1562,"title":1372,"body":1563,"description":1571,"extension":1409,"icon":405,"meta":1829,"navigation":436,"path":1830,"seo":1831,"stem":1371,"__hash__":1832},"resources/contributing.md",{"type":309,"value":1564,"toc":1817},[1565,1569,1572,1576,1614,1618,1622,1633,1637,1693,1697,1717,1721,1738,1742,1756,1760,1763,1807,1811,1814],[312,1566,1568],{"id":1567},"contributing-to-scio","Contributing to Scio",[315,1570,1571],{},"Thank you for your interest in contributing to Scio! We welcome contributions from the community.",[391,1573,1575],{"id":1574},"getting-started","Getting Started",[1459,1577,1578,1581,1587,1593,1596,1602,1608,1611],{},[1303,1579,1580],{},"Fork the repository",[1303,1582,1583,1584],{},"Clone your fork: ",[405,1585,1586],{},"git clone https://github.com/your-username/scio.git",[1303,1588,1589,1590],{},"Create a new branch: ",[405,1591,1592],{},"git checkout -b feature/your-feature-name",[1303,1594,1595],{},"Make your changes",[1303,1597,1598,1599],{},"Run tests: ",[405,1600,1601],{},"make test",[1303,1603,1604,1605],{},"Run linters: ",[405,1606,1607],{},"make lint",[1303,1609,1610],{},"Commit your changes with a descriptive message",[1303,1612,1613],{},"Push to your fork and submit a pull request",[391,1615,1617],{"id":1616},"development-setup","Development Setup",[1339,1619,1621],{"id":1620},"prerequisites","Prerequisites",[1300,1623,1624,1627],{},[1303,1625,1626],{},"Go 1.24 or higher",[1303,1628,1629,1630,693],{},"golangci-lint (install with ",[405,1631,1632],{},"make install-tools",[1339,1634,1636],{"id":1635},"running-tests","Running Tests",[399,1638,1640],{"className":722,"code":1639,"language":724,"meta":25,"style":25},"make test        # Run all tests\nmake test-bench  # Run benchmarks\nmake coverage    # Generate coverage report\nmake lint        # Run linters\nmake check       # Run tests and lint\n",[405,1641,1642,1653,1663,1673,1683],{"__ignoreMap":25},[408,1643,1644,1647,1650],{"class":410,"line":9},[408,1645,1646],{"class":427},"make",[408,1648,1649],{"class":459}," test",[408,1651,1652],{"class":442},"        # Run all tests\n",[408,1654,1655,1657,1660],{"class":410,"line":20},[408,1656,1646],{"class":427},[408,1658,1659],{"class":459}," test-bench",[408,1661,1662],{"class":442},"  # Run benchmarks\n",[408,1664,1665,1667,1670],{"class":410,"line":31},[408,1666,1646],{"class":427},[408,1668,1669],{"class":459}," coverage",[408,1671,1672],{"class":442},"    # Generate coverage report\n",[408,1674,1675,1677,1680],{"class":410,"line":446},[408,1676,1646],{"class":427},[408,1678,1679],{"class":459}," lint",[408,1681,1682],{"class":442},"        # Run linters\n",[408,1684,1685,1687,1690],{"class":410,"line":477},[408,1686,1646],{"class":427},[408,1688,1689],{"class":459}," check",[408,1691,1692],{"class":442},"       # Run tests and lint\n",[391,1694,1696],{"id":1695},"code-style","Code Style",[1300,1698,1699,1702,1708,1711,1714],{},[1303,1700,1701],{},"Follow standard Go conventions",[1303,1703,1704,1705],{},"Ensure all code passes ",[405,1706,1707],{},"golangci-lint",[1303,1709,1710],{},"Write tests for new functionality",[1303,1712,1713],{},"Keep test coverage above 70%",[1303,1715,1716],{},"Document exported functions and types",[391,1718,1720],{"id":1719},"pull-request-process","Pull Request Process",[1459,1722,1723,1726,1729,1732,1735],{},[1303,1724,1725],{},"Ensure all tests pass",[1303,1727,1728],{},"Update documentation if needed",[1303,1730,1731],{},"Add entries to CHANGELOG.md if applicable",[1303,1733,1734],{},"Ensure your PR description clearly describes the problem and solution",[1303,1736,1737],{},"Link any relevant issues",[391,1739,1741],{"id":1740},"testing-guidelines","Testing Guidelines",[1300,1743,1744,1747,1750,1753],{},[1303,1745,1746],{},"Each source file should have a corresponding test file",[1303,1748,1749],{},"Write both positive and negative test cases",[1303,1751,1752],{},"Use table-driven tests where appropriate",[1303,1754,1755],{},"Ensure tests are deterministic and don't depend on external services",[391,1757,1759],{"id":1758},"commit-message-format","Commit Message Format",[315,1761,1762],{},"Use conventional commits format:",[1300,1764,1765,1771,1777,1783,1789,1795,1801],{},[1303,1766,1767,1770],{},[405,1768,1769],{},"feat:"," New feature",[1303,1772,1773,1776],{},[405,1774,1775],{},"fix:"," Bug fix",[1303,1778,1779,1782],{},[405,1780,1781],{},"docs:"," Documentation changes",[1303,1784,1785,1788],{},[405,1786,1787],{},"test:"," Test additions or changes",[1303,1790,1791,1794],{},[405,1792,1793],{},"refactor:"," Code refactoring",[1303,1796,1797,1800],{},[405,1798,1799],{},"perf:"," Performance improvements",[1303,1802,1803,1806],{},[405,1804,1805],{},"chore:"," Maintenance tasks",[391,1808,1810],{"id":1809},"questions","Questions?",[315,1812,1813],{},"Feel free to open an issue for any questions or concerns.",[1393,1815,1816],{},"html pre.shiki code .s5klm, html code.shiki .s5klm{--shiki-default:var(--shiki-function)}html pre.shiki code .sxAnc, html code.shiki .sxAnc{--shiki-default:var(--shiki-string)}html pre.shiki code .sLkEo, html code.shiki .sLkEo{--shiki-default:var(--shiki-comment)}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":25,"searchDepth":20,"depth":20,"links":1818},[1819,1820,1824,1825,1826,1827,1828],{"id":1574,"depth":20,"text":1575},{"id":1616,"depth":20,"text":1617,"children":1821},[1822,1823],{"id":1620,"depth":31,"text":1621},{"id":1635,"depth":31,"text":1636},{"id":1695,"depth":20,"text":1696},{"id":1719,"depth":20,"text":1720},{"id":1740,"depth":20,"text":1741},{"id":1758,"depth":20,"text":1759},{"id":1809,"depth":20,"text":1810},{},"/contributing",{"title":1372,"description":1571},"jHq_O7tUmrQ8X_M--QYOJA8SRdXBEs-QXkruRyt5JLQ",{"id":1834,"title":23,"author":1835,"body":1836,"description":103,"extension":1409,"meta":2555,"navigation":436,"path":101,"published":2556,"readtime":2557,"seo":2558,"stem":281,"tags":2559,"updated":2556,"__hash__":2563},"scio/v0.0.5/2.learn/2.concepts.md","zoobzio",{"type":309,"value":1837,"toc":2541},[1838,1841,1844,1847,1855,1883,1886,1889,1939,1942,1948,1951,1954,2037,2040,2043,2145,2148,2150,2153,2156,2162,2165,2168,2171,2260,2263,2266,2409,2412,2415,2538],[312,1839,23],{"id":1840},"core-concepts",[391,1842,109],{"id":1843},"uri-scheme",[315,1845,1846],{},"scio uses URIs to address data. Each URI has three components:",[399,1848,1853],{"className":1849,"code":1851,"language":1852},[1850],"language-text","variant://resource/key\n","text",[405,1854,1851],{"__ignoreMap":25},[1300,1856,1857,1872,1877],{},[1303,1858,1859,1861,1862,1865,1866,1865,1869,693],{},[1306,1860,216],{}," — The storage type (",[405,1863,1864],{},"db",", ",[405,1867,1868],{},"kv",[405,1870,1871],{},"bcs",[1303,1873,1874,1876],{},[1306,1875,226],{}," — The logical name (table, store, bucket)",[1303,1878,1879,1882],{},[1306,1880,1881],{},"Key"," — The record identifier or path",[1339,1884,114],{"id":1885},"variant-semantics",[315,1887,1888],{},"Each variant has specific parsing rules:",[1223,1890,1891,1901],{},[1226,1892,1893],{},[1229,1894,1895,1897,1899],{},[1232,1896,216],{},[1232,1898,226],{},[1232,1900,1881],{},[1241,1902,1903,1915,1927],{},[1229,1904,1905,1909,1912],{},[1246,1906,1907],{},[405,1908,1250],{},[1246,1910,1911],{},"Table name",[1246,1913,1914],{},"Record key",[1229,1916,1917,1921,1924],{},[1246,1918,1919],{},[405,1920,1267],{},[1246,1922,1923],{},"Store name",[1246,1925,1926],{},"Cache key",[1229,1928,1929,1933,1936],{},[1246,1930,1931],{},[405,1932,1284],{},[1246,1934,1935],{},"Bucket name",[1246,1937,1938],{},"Full object path",[315,1940,1941],{},"For blob storage, the key can contain slashes:",[399,1943,1946],{"className":1944,"code":1945,"language":1852},[1850],"bcs://documents/reports/2024/q4/summary.pdf\n└─ bucket ──┘ └─────── key (full path) ──────┘\n",[405,1947,1945],{"__ignoreMap":25},[391,1949,119],{"id":1950},"resources",[315,1952,1953],{},"A resource is a registered data source:",[399,1955,1957],{"className":401,"code":1956,"language":403,"meta":25,"style":25},"type Resource struct {\n    URI      string      // Full URI (e.g., \"db://users\")\n    Variant  Variant     // Storage type\n    Name     string      // Resource name\n    Spec     atom.Spec   // Type metadata\n    Metadata Metadata    // Annotations\n}\n",[405,1958,1959,1972,1984,1995,2006,2022,2033],{"__ignoreMap":25},[408,1960,1961,1964,1967,1970],{"class":410,"line":9},[408,1962,1963],{"class":752},"type",[408,1965,1966],{"class":756}," Resource",[408,1968,1969],{"class":752}," struct",[408,1971,815],{"class":423},[408,1973,1974,1978,1981],{"class":410,"line":20},[408,1975,1977],{"class":1976},"sBGCq","    URI",[408,1979,1980],{"class":756},"      string",[408,1982,1983],{"class":442},"      // Full URI (e.g., \"db://users\")\n",[408,1985,1986,1989,1992],{"class":410,"line":31},[408,1987,1988],{"class":1976},"    Variant",[408,1990,1991],{"class":756},"  Variant",[408,1993,1994],{"class":442},"     // Storage type\n",[408,1996,1997,2000,2003],{"class":410,"line":446},[408,1998,1999],{"class":1976},"    Name",[408,2001,2002],{"class":756},"     string",[408,2004,2005],{"class":442},"      // Resource name\n",[408,2007,2008,2011,2014,2016,2019],{"class":410,"line":477},[408,2009,2010],{"class":1976},"    Spec",[408,2012,2013],{"class":756},"     atom",[408,2015,424],{"class":423},[408,2017,2018],{"class":756},"Spec",[408,2020,2021],{"class":442},"   // Type metadata\n",[408,2023,2024,2027,2030],{"class":410,"line":503},[408,2025,2026],{"class":1976},"    Metadata",[408,2028,2029],{"class":756}," Metadata",[408,2031,2032],{"class":442},"    // Annotations\n",[408,2034,2035],{"class":410,"line":529},[408,2036,1217],{"class":423},[1339,2038,124],{"id":2039},"metadata",[315,2041,2042],{},"Resources can be annotated with metadata:",[399,2044,2046],{"className":401,"code":2045,"language":403,"meta":25,"style":25},"s.RegisterDatabase(\"db://users\", db.Atomic(),\n    scio.WithDescription(\"User accounts table\"),\n    scio.WithVersion(\"1.2\"),\n    scio.WithTag(\"owner\", \"auth-team\"),\n    scio.WithTag(\"pii\", \"true\"),\n)\n",[405,2047,2048,2071,2087,2103,2121,2141],{"__ignoreMap":25},[408,2049,2050,2052,2054,2056,2058,2060,2062,2065,2067,2069],{"class":410,"line":9},[408,2051,414],{"class":413},[408,2053,424],{"class":423},[408,2055,453],{"class":427},[408,2057,456],{"class":423},[408,2059,460],{"class":459},[408,2061,463],{"class":423},[408,2063,2064],{"class":413}," db",[408,2066,424],{"class":423},[408,2068,471],{"class":427},[408,2070,872],{"class":423},[408,2072,2073,2076,2078,2080,2082,2085],{"class":410,"line":20},[408,2074,2075],{"class":413},"    scio",[408,2077,424],{"class":423},[408,2079,882],{"class":427},[408,2081,456],{"class":423},[408,2083,2084],{"class":459},"\"User accounts table\"",[408,2086,890],{"class":423},[408,2088,2089,2091,2093,2096,2098,2101],{"class":410,"line":31},[408,2090,2075],{"class":413},[408,2092,424],{"class":423},[408,2094,2095],{"class":427},"WithVersion",[408,2097,456],{"class":423},[408,2099,2100],{"class":459},"\"1.2\"",[408,2102,890],{"class":423},[408,2104,2105,2107,2109,2111,2113,2115,2117,2119],{"class":410,"line":446},[408,2106,2075],{"class":413},[408,2108,424],{"class":423},[408,2110,899],{"class":427},[408,2112,456],{"class":423},[408,2114,904],{"class":459},[408,2116,463],{"class":423},[408,2118,909],{"class":459},[408,2120,890],{"class":423},[408,2122,2123,2125,2127,2129,2131,2134,2136,2139],{"class":410,"line":477},[408,2124,2075],{"class":413},[408,2126,424],{"class":423},[408,2128,899],{"class":427},[408,2130,456],{"class":423},[408,2132,2133],{"class":459},"\"pii\"",[408,2135,463],{"class":423},[408,2137,2138],{"class":459}," \"true\"",[408,2140,890],{"class":423},[408,2142,2143],{"class":410,"line":503},[408,2144,571],{"class":423},[391,2146,129],{"id":2147},"specs-and-type-identity",[315,2149,131],{},[1339,2151,134],{"id":2152},"fqdn-identity",[315,2154,2155],{},"Types are identified by their fully qualified domain name (FQDN):",[399,2157,2160],{"className":2158,"code":2159,"language":1852},[1850],"github.com/myapp/models.User\n",[405,2161,2159],{"__ignoreMap":25},[315,2163,2164],{},"Two resources share a type if they have the same FQDN.",[1339,2166,139],{"id":2167},"spec-relationships",[315,2169,2170],{},"scio auto-detects when multiple resources share a spec:",[399,2172,2174],{"className":401,"code":2173,"language":403,"meta":25,"style":25},"// Both use the User type\ns.RegisterDatabase(\"db://users\", usersDB.Atomic())\ns.RegisterStore(\"kv://user-cache\", userCache.Atomic())\n\n// Find related resources\nrelated := s.Related(\"db://users\")\n// Returns: [{URI: \"kv://user-cache\", ...}]\n",[405,2175,2176,2181,2203,2227,2231,2236,2255],{"__ignoreMap":25},[408,2177,2178],{"class":410,"line":9},[408,2179,2180],{"class":442},"// Both use the User type\n",[408,2182,2183,2185,2187,2189,2191,2193,2195,2197,2199,2201],{"class":410,"line":20},[408,2184,414],{"class":413},[408,2186,424],{"class":423},[408,2188,453],{"class":427},[408,2190,456],{"class":423},[408,2192,460],{"class":459},[408,2194,463],{"class":423},[408,2196,466],{"class":413},[408,2198,424],{"class":423},[408,2200,471],{"class":427},[408,2202,474],{"class":423},[408,2204,2205,2207,2209,2211,2213,2216,2218,2221,2223,2225],{"class":410,"line":31},[408,2206,414],{"class":413},[408,2208,424],{"class":423},[408,2210,484],{"class":427},[408,2212,456],{"class":423},[408,2214,2215],{"class":459},"\"kv://user-cache\"",[408,2217,463],{"class":423},[408,2219,2220],{"class":413}," userCache",[408,2222,424],{"class":423},[408,2224,471],{"class":427},[408,2226,474],{"class":423},[408,2228,2229],{"class":410,"line":446},[408,2230,437],{"emptyLinePlaceholder":436},[408,2232,2233],{"class":410,"line":477},[408,2234,2235],{"class":442},"// Find related resources\n",[408,2237,2238,2241,2243,2245,2247,2249,2251,2253],{"class":410,"line":503},[408,2239,2240],{"class":413},"related",[408,2242,417],{"class":413},[408,2244,553],{"class":413},[408,2246,424],{"class":423},[408,2248,706],{"class":427},[408,2250,456],{"class":423},[408,2252,460],{"class":459},[408,2254,571],{"class":423},[408,2256,2257],{"class":410,"line":529},[408,2258,2259],{"class":442},"// Returns: [{URI: \"kv://user-cache\", ...}]\n",[391,2261,144],{"id":2262},"the-catalog",[315,2264,2265],{},"The catalog provides introspection over registered resources:",[399,2267,2269],{"className":401,"code":2268,"language":403,"meta":25,"style":25},"// Topology queries\ns.Sources()              // All resources\ns.Databases()            // All db:// resources\ns.Stores()               // All kv:// resources\ns.Buckets()              // All bcs:// resources\n\n// Spec queries\ns.Spec(\"db://users\")     // Get spec for a resource\ns.FindBySpec(spec)       // Find resources by spec\ns.FindByField(\"email\")   // Find resources containing field\ns.Related(\"db://users\")  // Find resources sharing the same spec\n",[405,2270,2271,2276,2289,2303,2317,2331,2335,2340,2357,2374,2392],{"__ignoreMap":25},[408,2272,2273],{"class":410,"line":9},[408,2274,2275],{"class":442},"// Topology queries\n",[408,2277,2278,2280,2282,2284,2286],{"class":410,"line":20},[408,2279,414],{"class":413},[408,2281,424],{"class":423},[408,2283,669],{"class":427},[408,2285,672],{"class":423},[408,2287,2288],{"class":442},"              // All resources\n",[408,2290,2291,2293,2295,2298,2300],{"class":410,"line":31},[408,2292,414],{"class":413},[408,2294,424],{"class":423},[408,2296,2297],{"class":427},"Databases",[408,2299,672],{"class":423},[408,2301,2302],{"class":442},"            // All db:// resources\n",[408,2304,2305,2307,2309,2312,2314],{"class":410,"line":446},[408,2306,414],{"class":413},[408,2308,424],{"class":423},[408,2310,2311],{"class":427},"Stores",[408,2313,672],{"class":423},[408,2315,2316],{"class":442},"               // All kv:// resources\n",[408,2318,2319,2321,2323,2326,2328],{"class":410,"line":477},[408,2320,414],{"class":413},[408,2322,424],{"class":423},[408,2324,2325],{"class":427},"Buckets",[408,2327,672],{"class":423},[408,2329,2330],{"class":442},"              // All bcs:// resources\n",[408,2332,2333],{"class":410,"line":503},[408,2334,437],{"emptyLinePlaceholder":436},[408,2336,2337],{"class":410,"line":529},[408,2338,2339],{"class":442},"// Spec queries\n",[408,2341,2342,2344,2346,2348,2350,2352,2354],{"class":410,"line":534},[408,2343,414],{"class":413},[408,2345,424],{"class":423},[408,2347,2018],{"class":427},[408,2349,456],{"class":423},[408,2351,460],{"class":459},[408,2353,693],{"class":423},[408,2355,2356],{"class":442},"     // Get spec for a resource\n",[408,2358,2359,2361,2363,2365,2367,2369,2371],{"class":410,"line":540},[408,2360,414],{"class":413},[408,2362,424],{"class":423},[408,2364,685],{"class":427},[408,2366,456],{"class":423},[408,2368,690],{"class":413},[408,2370,693],{"class":423},[408,2372,2373],{"class":442},"       // Find resources by spec\n",[408,2375,2376,2378,2380,2383,2385,2387,2389],{"class":410,"line":574},[408,2377,414],{"class":413},[408,2379,424],{"class":423},[408,2381,2382],{"class":427},"FindByField",[408,2384,456],{"class":423},[408,2386,1083],{"class":459},[408,2388,693],{"class":423},[408,2390,2391],{"class":442},"   // Find resources containing field\n",[408,2393,2394,2396,2398,2400,2402,2404,2406],{"class":410,"line":600},[408,2395,414],{"class":413},[408,2397,424],{"class":423},[408,2399,706],{"class":427},[408,2401,456],{"class":423},[408,2403,460],{"class":459},[408,2405,693],{"class":423},[408,2407,2408],{"class":442},"  // Find resources sharing the same spec\n",[391,2410,149],{"id":2411},"operations",[315,2413,2414],{},"Operations are dispatched based on URI variant:",[1223,2416,2417,2433],{},[1226,2418,2419],{},[1229,2420,2421,2424,2427,2430],{},[1232,2422,2423],{},"Operation",[1232,2425,2426],{},"Database",[1232,2428,2429],{},"Store",[1232,2431,2432],{},"Bucket",[1241,2434,2435,2448,2461,2474,2487,2499,2512,2525],{},[1229,2436,2437,2441,2444,2446],{},[1246,2438,2439],{},[405,2440,558],{},[1246,2442,2443],{},"✓",[1246,2445,2443],{},[1246,2447,2443],{},[1229,2449,2450,2454,2456,2458],{},[1246,2451,2452],{},[405,2453,581],{},[1246,2455,2443],{},[1246,2457,2443],{},[1246,2459,2460],{},"—",[1229,2462,2463,2468,2470,2472],{},[1246,2464,2465],{},[405,2466,2467],{},"Delete",[1246,2469,2443],{},[1246,2471,2443],{},[1246,2473,2443],{},[1229,2475,2476,2481,2483,2485],{},[1246,2477,2478],{},[405,2479,2480],{},"Exists",[1246,2482,2443],{},[1246,2484,2443],{},[1246,2486,2443],{},[1229,2488,2489,2493,2495,2497],{},[1246,2490,2491],{},[405,2492,627],{},[1246,2494,2443],{},[1246,2496,2460],{},[1246,2498,2460],{},[1229,2500,2501,2506,2508,2510],{},[1246,2502,2503],{},[405,2504,2505],{},"Select",[1246,2507,2443],{},[1246,2509,2460],{},[1246,2511,2460],{},[1229,2513,2514,2519,2521,2523],{},[1246,2515,2516],{},[405,2517,2518],{},"SetWithTTL",[1246,2520,2460],{},[1246,2522,2443],{},[1246,2524,2460],{},[1229,2526,2527,2532,2534,2536],{},[1246,2528,2529],{},[405,2530,2531],{},"Put",[1246,2533,2460],{},[1246,2535,2460],{},[1246,2537,2443],{},[1393,2539,2540],{},"html pre.shiki code .sUt3r, html code.shiki .sUt3r{--shiki-default:var(--shiki-keyword)}html pre.shiki code .sYBwO, html code.shiki .sYBwO{--shiki-default:var(--shiki-type)}html pre.shiki code .sq5bi, html code.shiki .sq5bi{--shiki-default:var(--shiki-punctuation)}html pre.shiki code .sBGCq, html code.shiki .sBGCq{--shiki-default:var(--shiki-property)}html pre.shiki code .sLkEo, html code.shiki .sLkEo{--shiki-default:var(--shiki-comment)}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sh8_p, html code.shiki .sh8_p{--shiki-default:var(--shiki-text)}html pre.shiki code .s5klm, html code.shiki .s5klm{--shiki-default:var(--shiki-function)}html pre.shiki code .sxAnc, html code.shiki .sxAnc{--shiki-default:var(--shiki-string)}",{"title":25,"searchDepth":20,"depth":20,"links":2542},[2543,2546,2549,2553,2554],{"id":1843,"depth":20,"text":109,"children":2544},[2545],{"id":1885,"depth":31,"text":114},{"id":1950,"depth":20,"text":119,"children":2547},[2548],{"id":2039,"depth":31,"text":124},{"id":2147,"depth":20,"text":129,"children":2550},[2551,2552],{"id":2152,"depth":31,"text":134},{"id":2167,"depth":31,"text":139},{"id":2262,"depth":20,"text":144},{"id":2411,"depth":20,"text":149},{},"2025-01-11T00:00:00.000Z",null,{"title":23,"description":103},[2560,2561,2562],"concepts","uri","catalog","6Cr_1D8NJG6v2ETOh--4JSrqsZdNzccFuRaJzpAZYKk",[2565,2566],{"title":54,"path":53,"stem":279,"description":56,"children":-1},{"title":154,"path":153,"stem":283,"description":156,"children":-1},1776192966931]