[{"data":1,"prerenderedAt":2404},["ShallowReactive",2],{"search-sections-scio":3,"nav-scio":265,"content-tree-scio":292,"footer-resources":304,"content-/v0.0.5/learn/architecture":1833,"surround-/v0.0.5/learn/architecture":2401},[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":154,"author":1835,"body":1836,"description":156,"extension":1409,"meta":2393,"navigation":436,"path":153,"published":2394,"readtime":2395,"seo":2396,"stem":283,"tags":2397,"updated":2399,"__hash__":2400},"scio/v0.0.5/2.learn/3.architecture.md","zoobzio",{"type":309,"value":1837,"toc":2380},[1838,1841,1844,1847,1855,1858,1861,1867,1870,1876,1879,1886,1897,1900,1903,2030,2033,2036,2174,2177,2377],[312,1839,154],{"id":1840},"architecture",[391,1842,162],{"id":1843},"system-position",[315,1845,1846],{},"scio sits between your application logic and storage providers:",[399,1848,1853],{"className":1849,"code":1851,"language":1852},[1850],"language-text","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└──────────────┘\n","text",[405,1854,1851],{"__ignoreMap":25},[391,1856,167],{"id":1857},"data-flow",[1339,1859,171],{"id":1860},"registration",[399,1862,1865],{"className":1863,"code":1864,"language":1852},[1850],"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            │\n",[405,1866,1864],{"__ignoreMap":25},[1339,1868,149],{"id":1869},"operations",[399,1871,1874],{"className":1872,"code":1873,"language":1852},[1850],"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   │◀──────────────────────────│                        │\n",[405,1875,1873],{"__ignoreMap":25},[391,1877,180],{"id":1878},"thread-safety",[315,1880,1881,1882,1885],{},"scio uses ",[405,1883,1884],{},"sync.RWMutex"," for thread-safe access:",[1300,1887,1888,1891,1894],{},[1303,1889,1890],{},"Registration operations acquire write lock",[1303,1892,1893],{},"Read operations (Get, Exists, catalog queries) acquire read lock",[1303,1895,1896],{},"Multiple readers can operate concurrently",[391,1898,185],{"id":1899},"error-handling",[315,1901,1902],{},"scio uses semantic errors:",[399,1904,1906],{"className":401,"code":1905,"language":403,"meta":25,"style":25},"// 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\n",[405,1907,1908,1913,1925,1937,1949,1961,1973,1985,1997,2001,2006,2018],{"__ignoreMap":25},[408,1909,1910],{"class":410,"line":9},[408,1911,1912],{"class":442},"// scio-specific errors\n",[408,1914,1915,1917,1919,1922],{"class":410,"line":20},[408,1916,12],{"class":413},[408,1918,424],{"class":423},[408,1920,1921],{"class":413},"ErrInvalidURI",[408,1923,1924],{"class":442},"       // URI parsing failed\n",[408,1926,1927,1929,1931,1934],{"class":410,"line":31},[408,1928,12],{"class":413},[408,1930,424],{"class":423},[408,1932,1933],{"class":413},"ErrUnknownVariant",[408,1935,1936],{"class":442},"   // Unknown scheme\n",[408,1938,1939,1941,1943,1946],{"class":410,"line":446},[408,1940,12],{"class":413},[408,1942,424],{"class":423},[408,1944,1945],{"class":413},"ErrResourceNotFound",[408,1947,1948],{"class":442}," // Resource not registered\n",[408,1950,1951,1953,1955,1958],{"class":410,"line":477},[408,1952,12],{"class":413},[408,1954,424],{"class":423},[408,1956,1957],{"class":413},"ErrResourceExists",[408,1959,1960],{"class":442},"   // Duplicate registration\n",[408,1962,1963,1965,1967,1970],{"class":410,"line":503},[408,1964,12],{"class":413},[408,1966,424],{"class":423},[408,1968,1969],{"class":413},"ErrVariantMismatch",[408,1971,1972],{"class":442},"  // Wrong operation for variant\n",[408,1974,1975,1977,1979,1982],{"class":410,"line":529},[408,1976,12],{"class":413},[408,1978,424],{"class":423},[408,1980,1981],{"class":413},"ErrKeyRequired",[408,1983,1984],{"class":442},"      // Missing key in URI\n",[408,1986,1987,1989,1991,1994],{"class":410,"line":534},[408,1988,12],{"class":413},[408,1990,424],{"class":423},[408,1992,1993],{"class":413},"ErrKeyNotExpected",[408,1995,1996],{"class":442},"   // Key provided but not used (Query/Select)\n",[408,1998,1999],{"class":410,"line":540},[408,2000,437],{"emptyLinePlaceholder":436},[408,2002,2003],{"class":410,"line":574},[408,2004,2005],{"class":442},"// Passed through from grub\n",[408,2007,2008,2010,2012,2015],{"class":410,"line":600},[408,2009,12],{"class":413},[408,2011,424],{"class":423},[408,2013,2014],{"class":413},"ErrNotFound",[408,2016,2017],{"class":442},"         // Record doesn't exist\n",[408,2019,2020,2022,2024,2027],{"class":410,"line":605},[408,2021,12],{"class":413},[408,2023,424],{"class":423},[408,2025,2026],{"class":413},"ErrDuplicate",[408,2028,2029],{"class":442},"        // Key already exists\n",[391,2031,190],{"id":2032},"integration-patterns",[1339,2034,194],{"id":2035},"service-layer",[399,2037,2039],{"className":401,"code":2038,"language":403,"meta":25,"style":25},"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}\n",[405,2040,2041,2054,2070,2074,2078,2140,2170],{"__ignoreMap":25},[408,2042,2043,2046,2049,2052],{"class":410,"line":9},[408,2044,2045],{"class":752},"type",[408,2047,2048],{"class":756}," UserService",[408,2050,2051],{"class":752}," struct",[408,2053,815],{"class":423},[408,2055,2056,2060,2063,2065,2067],{"class":410,"line":20},[408,2057,2059],{"class":2058},"sBGCq","    catalog",[408,2061,2062],{"class":923}," *",[408,2064,12],{"class":756},[408,2066,424],{"class":423},[408,2068,2069],{"class":756},"Scio\n",[408,2071,2072],{"class":410,"line":31},[408,2073,1217],{"class":423},[408,2075,2076],{"class":410,"line":446},[408,2077,437],{"emptyLinePlaceholder":436},[408,2079,2080,2082,2084,2088,2091,2094,2096,2099,2101,2103,2105,2107,2110,2112,2115,2118,2120,2122,2124,2126,2128,2131,2133,2136,2138],{"class":410,"line":477},[408,2081,807],{"class":752},[408,2083,1177],{"class":423},[408,2085,2087],{"class":2086},"sSYET","s ",[408,2089,2090],{"class":923},"*",[408,2092,2093],{"class":756},"UserService",[408,2095,693],{"class":423},[408,2097,2098],{"class":427}," GetUser",[408,2100,456],{"class":423},[408,2102,563],{"class":2086},[408,2104,971],{"class":756},[408,2106,424],{"class":423},[408,2108,2109],{"class":756},"Context",[408,2111,463],{"class":423},[408,2113,2114],{"class":2086}," id",[408,2116,2117],{"class":756}," string",[408,2119,693],{"class":423},[408,2121,1177],{"class":423},[408,2123,2090],{"class":923},[408,2125,543],{"class":756},[408,2127,424],{"class":423},[408,2129,2130],{"class":756},"Atom",[408,2132,463],{"class":423},[408,2134,2135],{"class":756}," error",[408,2137,693],{"class":423},[408,2139,815],{"class":423},[408,2141,2142,2145,2147,2149,2152,2154,2156,2158,2160,2162,2165,2168],{"class":410,"line":503},[408,2143,2144],{"class":923},"    return",[408,2146,553],{"class":413},[408,2148,424],{"class":423},[408,2150,2151],{"class":413},"catalog",[408,2153,424],{"class":423},[408,2155,558],{"class":427},[408,2157,456],{"class":423},[408,2159,563],{"class":413},[408,2161,463],{"class":423},[408,2163,2164],{"class":459}," \"db://users/\"",[408,2166,2167],{"class":413},"+id",[408,2169,571],{"class":423},[408,2171,2172],{"class":410,"line":529},[408,2173,1217],{"class":423},[1339,2175,199],{"id":2176},"middleware",[399,2178,2180],{"className":401,"code":2179,"language":403,"meta":25,"style":25},"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}\n",[405,2181,2182,2227,2254,2299,2334,2364,2369,2373],{"__ignoreMap":25},[408,2183,2184,2186,2189,2191,2193,2195,2197,2199,2201,2203,2206,2208,2211,2213,2216,2218,2221,2223,2225],{"class":410,"line":9},[408,2185,807],{"class":752},[408,2187,2188],{"class":427}," DataContextMiddleware",[408,2190,456],{"class":423},[408,2192,414],{"class":2086},[408,2194,2062],{"class":923},[408,2196,12],{"class":756},[408,2198,424],{"class":423},[408,2200,235],{"class":756},[408,2202,693],{"class":423},[408,2204,2205],{"class":752}," func",[408,2207,456],{"class":423},[408,2209,2210],{"class":756},"http",[408,2212,424],{"class":423},[408,2214,2215],{"class":756},"Handler",[408,2217,693],{"class":423},[408,2219,2220],{"class":756}," http",[408,2222,424],{"class":423},[408,2224,2215],{"class":756},[408,2226,815],{"class":423},[408,2228,2229,2231,2233,2235,2238,2240,2242,2244,2246,2248,2250,2252],{"class":410,"line":20},[408,2230,2144],{"class":923},[408,2232,2205],{"class":752},[408,2234,456],{"class":423},[408,2236,2237],{"class":2086},"next",[408,2239,2220],{"class":756},[408,2241,424],{"class":423},[408,2243,2215],{"class":756},[408,2245,693],{"class":423},[408,2247,2220],{"class":756},[408,2249,424],{"class":423},[408,2251,2215],{"class":756},[408,2253,815],{"class":423},[408,2255,2256,2259,2261,2263,2266,2268,2270,2272,2275,2277,2279,2282,2284,2286,2288,2290,2292,2295,2297],{"class":410,"line":31},[408,2257,2258],{"class":923},"        return",[408,2260,2220],{"class":413},[408,2262,424],{"class":423},[408,2264,2265],{"class":427},"HandlerFunc",[408,2267,456],{"class":423},[408,2269,807],{"class":752},[408,2271,456],{"class":423},[408,2273,2274],{"class":2086},"w",[408,2276,2220],{"class":756},[408,2278,424],{"class":423},[408,2280,2281],{"class":756},"ResponseWriter",[408,2283,463],{"class":423},[408,2285,1135],{"class":2086},[408,2287,2062],{"class":923},[408,2289,2210],{"class":756},[408,2291,424],{"class":423},[408,2293,2294],{"class":756},"Request",[408,2296,693],{"class":423},[408,2298,815],{"class":423},[408,2300,2301,2304,2306,2308,2310,2313,2315,2318,2320,2322,2325,2328,2330,2332],{"class":410,"line":446},[408,2302,2303],{"class":413},"            ctx",[408,2305,417],{"class":413},[408,2307,971],{"class":413},[408,2309,424],{"class":423},[408,2311,2312],{"class":427},"WithValue",[408,2314,456],{"class":423},[408,2316,2317],{"class":413},"r",[408,2319,424],{"class":423},[408,2321,2109],{"class":427},[408,2323,2324],{"class":423},"(),",[408,2326,2327],{"class":459}," \"scio\"",[408,2329,463],{"class":423},[408,2331,553],{"class":413},[408,2333,571],{"class":423},[408,2335,2336,2339,2341,2344,2346,2348,2350,2352,2354,2357,2359,2361],{"class":410,"line":477},[408,2337,2338],{"class":413},"            next",[408,2340,424],{"class":423},[408,2342,2343],{"class":427},"ServeHTTP",[408,2345,456],{"class":423},[408,2347,2274],{"class":413},[408,2349,463],{"class":423},[408,2351,1135],{"class":413},[408,2353,424],{"class":423},[408,2355,2356],{"class":427},"WithContext",[408,2358,456],{"class":423},[408,2360,563],{"class":413},[408,2362,2363],{"class":423},"))\n",[408,2365,2366],{"class":410,"line":503},[408,2367,2368],{"class":423},"        })\n",[408,2370,2371],{"class":410,"line":529},[408,2372,955],{"class":423},[408,2374,2375],{"class":410,"line":534},[408,2376,1217],{"class":423},[1393,2378,2379],{},"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)}",{"title":25,"searchDepth":20,"depth":20,"links":2381},[2382,2383,2387,2388,2389],{"id":1843,"depth":20,"text":162},{"id":1857,"depth":20,"text":167,"children":2384},[2385,2386],{"id":1860,"depth":31,"text":171},{"id":1869,"depth":31,"text":149},{"id":1878,"depth":20,"text":180},{"id":1899,"depth":20,"text":185},{"id":2032,"depth":20,"text":190,"children":2390},[2391,2392],{"id":2035,"depth":31,"text":194},{"id":2176,"depth":31,"text":199},{},"2025-01-11T00:00:00.000Z",null,{"title":154,"description":156},[1840,2398],"design","2026-01-12T00:00:00.000Z","Eytb7n5ViaClYUM7nui7hj9MgNK4l437KhUcoA64ZgI",[2402,2403],{"title":23,"path":101,"stem":281,"description":103,"children":-1},{"title":204,"path":203,"stem":291,"description":206,"children":-1},1776192966931]