{"id":49884767,"url":"https://github.com/outr/sigil","last_synced_at":"2026-05-15T17:42:21.730Z","repository":{"id":352274614,"uuid":"1214479076","full_name":"outr/sigil","owner":"outr","description":"Agentic core","archived":false,"fork":false,"pushed_at":"2026-05-10T15:29:28.000Z","size":7576,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-10T15:30:36.056Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Scala","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/outr.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-18T16:25:29.000Z","updated_at":"2026-05-10T15:29:32.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/outr/sigil","commit_stats":null,"previous_names":["outr/sigil"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/outr/sigil","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outr%2Fsigil","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outr%2Fsigil/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outr%2Fsigil/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outr%2Fsigil/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/outr","download_url":"https://codeload.github.com/outr/sigil/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outr%2Fsigil/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33073461,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-15T11:35:32.926Z","status":"ssl_error","status_checked_at":"2026-05-15T11:35:31.362Z","response_time":103,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-05-15T17:42:20.906Z","updated_at":"2026-05-15T17:42:21.722Z","avatar_url":"https://github.com/outr.png","language":"Scala","funding_links":[],"categories":[],"sub_categories":[],"readme":"# sigil\n[![CI](https://github.com/outr/sigil/actions/workflows/ci.yml/badge.svg)](https://github.com/outr/sigil/actions/workflows/ci.yml)\n[![Lines of code](https://aschey.tech/tokei/github/outr/sigil)](https://github.com/outr/sigil)\n[![Scala](https://img.shields.io/badge/scala-3.8.3-red)](https://www.scala-lang.org)\n[![Scala Steward](https://img.shields.io/badge/Scala_Steward-helping-blue)](https://scala-steward.org)\n[![License](https://img.shields.io/github/license/outr/sigil)](https://github.com/outr/sigil/blob/master/LICENSE)\n\nA Scala 3 framework for building multi-agent LLM conversations with tool use, capability discovery, and persistent context.\n\n## Features\n\n- **Provider-agnostic** — Anthropic, OpenAI (chat-completions + Responses), DeepSeek, Google Gemini, local llama.cpp, plus app-defined; routed `ProviderStrategy` chains with per-mode pinning, per-space assignment, and cooldown-aware fallback\n- **Event-sourced conversations** — `Event`s persisted via LightDB; `ConversationView` is a derived projection produced by a user-supplied curator with no implicit truncation\n- **Strongly-typed tools** — `Tool[Input]` with JSON schema auto-derived via fabric `derives RW`; grammar-constrained tool args per provider plus post-decode `ToolInputValidator` re-checking every constraint\n- **Capability discovery** — `find_capability` searches a persisted tool collection (queryable by mode / space / keyword) at runtime; static + user-created tools share one store\n- **Multi-agent fan-out** — `Participant`s on `Conversation`, dispatched statelessly via DB-atomic `AgentState` locks; `Role` (per-agent identity) + `Mode` (per-conversation tool policy) shape behavior\n- **Streaming signals** — `Event` + `Delta` as `Stream[Signal]` with per-viewer redaction (`viewerTransforms`) and visibility scopes (`MessageVisibility`) on every event\n- **Database-driven transport** — `SignalTransport` bridges `signalsFor(viewer)` to SSE / DurableSocket sinks with replay from `SigilDB.events`; no in-memory buffer, `RecentMessages(n)` resume preserves tool / mode events between messages\n- **Three-tier memory** — critical (app-driven), compression-time (curator pressure), and per-turn extraction; auto-embedded into a vector index when wired\n- **Multi-tenancy via `SpaceId`** — open `PolyType` scoping memories / tools / future records; one space per record, multi-space queries, per-call authz via `accessibleSpaces`\n- **Spatial primitives** — `Place` on messages, pluggable `Geocoder`, sender-private redaction\n- **Generic tool families** — filesystem (read / write / edit / glob / grep / bash), web (fetch + injectable search), util (system stats, save memory, semantic search), `ProxyTool` for remote dispatch\n- **Pluggable storage** — RocksDB + Lucene by default; opt into PostgreSQL for production via `sigil.postgres.jdbcUrl`\n\n## Optional modules\n\n- **`sigil-mcp`** — MCP client with stdio + HTTP+SSE transports, persisted server registry, sampling handler, automatic cancellation wiring\n- **`sigil-tooling`** — LSP / BSP clients (lsp4j + bsp4j) for IDE-grade structural integration; long-lived language-server and build-server sessions, with exhaustive coverage of edit, navigation, and build-system RPCs\n- **`sigil-debug`** — DAP (Debug Adapter Protocol) client for interactive debugging — launch / attach, breakpoints, step / continue / pause, stack trace, scope / variable inspection, REPL evaluation; per-language adapter configs (debugpy, lldb-dap, delve, sbt-debug-bridge, …)\n- **`sigil-script`** — REPL-backed `ScalaScriptExecutor` + DB-persisted `ScriptTool`s for runtime-defined capabilities\n- **`sigil-browser`** — headless browser automation via RoboBrowser\n- **`sigil-secrets`** — encrypted secret store (scalapass-backed); referenced by provider configs\n\n## SBT Configuration\n\n```scala\nlibraryDependencies += \"com.outr\" %% \"sigil-core\" % \"1.0.0-SNAPSHOT\"\n\n// Optional modules — add only what you need:\nlibraryDependencies ++= Seq(\n  \"com.outr\" %% \"sigil-mcp\"     % \"1.0.0-SNAPSHOT\",\n  \"com.outr\" %% \"sigil-tooling\" % \"1.0.0-SNAPSHOT\",\n  \"com.outr\" %% \"sigil-debug\"   % \"1.0.0-SNAPSHOT\",\n  \"com.outr\" %% \"sigil-script\"  % \"1.0.0-SNAPSHOT\",\n  \"com.outr\" %% \"sigil-browser\" % \"1.0.0-SNAPSHOT\",\n  \"com.outr\" %% \"sigil-secrets\" % \"1.0.0-SNAPSHOT\"\n)\n```\n\n## Getting Started\n\nSigil is centered on a `Sigil` trait that your application extends to wire in a\nprovider registry, a tool finder, and (optionally) participant / memory-space\npolymorphic registrations. A minimal instance looks like this:\n\n```scala\nimport lightdb.id.Id\nimport lightdb.store.CollectionManager\nimport lightdb.upgrade.DatabaseUpgrade\nimport rapid.Task\nimport sigil.Sigil\nimport sigil.db.{DefaultSigilDB, Model, SigilDB}\nimport sigil.participant.ParticipantId\nimport sigil.provider.Provider\n\nobject MySigil extends Sigil {\n  type DB = SigilDB\n\n  override protected def buildDB(directory: Option[java.nio.file.Path],\n                                 storeManager: CollectionManager,\n                                 appUpgrades: List[DatabaseUpgrade]): DB =\n    new DefaultSigilDB(directory, storeManager, appUpgrades)\n\n  override def providerFor(modelId: Id[Model], chain: List[ParticipantId]): Task[Provider] =\n    Task.error(new RuntimeException(\"configure a provider registry\"))\n}\n```\n\n## Design Notes\n\nMore in-depth design documents live under the `docs/design` directory.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foutr%2Fsigil","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foutr%2Fsigil","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foutr%2Fsigil/lists"}