knowledge is the local-first knowledge engine for Hasna projects and
agents. It should make company knowledge durable, searchable, citable, and safe
for agents to reuse. It is not the raw file bucket. Raw source bytes belong to
open-files.
The open source package owns:
- Local CLI and MCP interfaces.
- Shared service modules used by CLI, MCP, tests, and future SDK callers. The
current
KnowledgeServicefacade centralizes workspace/config/safety, artifact storage, DB/wiki setup, source ingestion, source resolution, and outbox consumption. - Local project workspace under
.hasna/knowledge. - Source references, citations, extracted metadata, chunks, generated wiki artifacts, schemas, indexes, run ledgers, and search state.
- Hybrid retrieval over keyword search, semantic vectors, wiki pages, citations, and graph signals.
- Provider/runtime contracts for local BYOK agent workflows.
- Hosted-aware client contracts that can talk to a future SaaS wrapper.
open-files owns:
- Raw source bytes and snapshots.
- Local, S3, Google Drive, and future connector-backed source storage.
- Source ids, file ids, revisions, hashes, MIME metadata, storage locations, and extraction outputs.
- Read-only content resolution for knowledge agents.
- Source manifests and source-change events that drive reindexing.
The future hosted/SaaS wrapper owns:
- Users, orgs, projects, memberships, API keys, and permissions.
- Billing, limits, queues, workers, hosted databases, hosted object storage policies, connector secrets, audit, observability, and web UI.
- Permission-aware retrieval enforcement across tenants.
- Remote job orchestration for ingestion, embedding, web search, compile, lint, and sync runs.
The OSS package must stay useful without a hosted account. Hosted mode should be an optional remote client over explicit API contracts.
The detailed hosted boundary is specified in
hosted-wrapper-responsibilities.md.
That document is the source of truth for responsibilities that must stay out of
the OSS package, including tenants, ACL enforcement, connector credentials,
bucket provisioning, secrets, queues, billing, admin controls, observability, and
the hosted web UI.
Multi-machine sync is specified in
machine-sync-schema.md. The sync contract keeps
machine discovery optional through @hasna/machines, stores scalable sync state
in SQLite/Postgres/object storage, and keeps raw source bytes in open-files.
The local hosted-aware contract follows the open-skills pattern: mode is
local by default, setup --mode hosted records hosted.api_url, env vars
KNOWLEDGE_API_URL and KNOWLEDGE_API_KEY can override local config, and
credentials live outside project state in ~/.hasna/knowledge/auth.json.
remote contracts publishes the registry/search/ask/build/sync/status/logs and
artifact endpoints that a SaaS wrapper can implement. Local use, local search,
and local artifact generation do not require this remote API.
Project-local state lives at:
.hasna/knowledge/
config.json
knowledge.db
artifacts/
cache/
exports/
indexes/
logs/
runs/
schemas/
wiki/
The legacy JSON store at ~/.open-knowledge/db.json remains readable for
migration and compatibility. New project mode should prefer
.hasna/knowledge/knowledge.db and generated artifacts under the same app
home.
Global/user state may use a Hasna data directory, but project mode is the default for company knowledge because it keeps artifacts close to the repo or workspace they describe.
knowledge stores references, not raw source bytes. Supported source ref
forms:
open-files://file/<file_id>
open-files://file/<file_id>/revision/<revision_id>
open-files://source/<source_id>/path/<path>
s3://bucket/key
file:///absolute/path
https://example.com/page
For durable company knowledge, open-files:// is preferred because it can carry
file revisions, hashes, extraction state, permissions, and storage metadata.
Direct s3://, file://, and https:// refs are useful for bootstrap and
interop, but should be normalized into source records when possible.
Every durable search/wiki artifact should carry a provenance object in metadata:
source_owner, source_ref, source_uri, source_kind, source_revision_id,
revision, hash, optional chunk_id, offsets, read_only,
citation_required, resolver name, and stale status. For generated artifacts
that are not source-backed yet, metadata still records that open-files owns
source bytes and that citations are required before durable facts are filed.
wiki init now catalogs the starter wiki/README.md and indexes/root.md
records with generated-artifact provenance. Source ingestion stores source
provenance on every chunk, and source resolution returns that provenance with
chunks and citations so semantic search can pass through trustworthy evidence
without reconstructing it later.
The local resolver is exposed through:
knowledge source resolve <source-ref> --purpose knowledge_answer --json
knowledge ingest source <source-ref> --purpose knowledge_index --jsonand the MCP tool ok_resolve_source. It reads the knowledge catalog only,
enforces the read-only purpose labels imported from open-files, returns source
metadata, selected revision metadata, derived chunks, and citation evidence, and
records an audit event. It never returns raw bytes or storage credentials.
ingest source uses the same boundary for indexing. It accepts open-files://,
file://, s3://, and https:// refs, applies S3/web safety gates, converts
allowed extracted text into redacted chunks with offsets, records hashes and
revisions, and stores only derived knowledge records.
In future hosted mode, the same result shape can be backed by a remote open-files resolver API. The local OSS package should keep using the shared service boundary so CLI, MCP, and SaaS wrappers do not grow separate permission logic.
Local mode writes artifacts to .hasna/knowledge.
Remote/cloud mode can store generated knowledge artifacts in S3:
s3://<knowledge-bucket>/<org>/<project>/knowledge/
artifacts/
indexes/
logs/
runs/
schemas/
wiki/
example production uses the canonical open-source knowledge bucket and app path-compatible prefix:
s3://example-knowledge-prod/.hasna/knowledge/
The app config can be materialized with:
knowledge setup --mode hosted --canonical-example --scope project --jsonThe canonical metadata-only secret paths are:
example/knowledge/prod/env
example/knowledge/prod/aws
example/knowledge/prod/s3
example/knowledge/prod/rds is reserved for a future hosted
runtime database if the wrapper provisions one.
Raw files still route through open-files. Knowledge S3 storage is for derived
artifacts such as wiki pages, index shards, schema versions, logs, exports, and
run outputs.
The storage contract is inspectable through:
knowledge storage status --scope project --jsonThat contract names the local app path, SQLite catalog, generated artifact
classes, S3 bucket/prefix when configured, and the source ownership rule that
raw source bytes stay in open-files. The storage_objects table catalogs
generated artifacts by URI, kind, hash, size, and metadata so local mode and
remote/S3 mode share the same DB-facing shape.
The Karpathy-style wiki pattern is implemented as scalable artifacts, not three giant files.
Small repositories may expose root Markdown summaries:
wiki/index.md
schemas/current.md
logs/latest.md
Large knowledge bases use:
schemas/
v1.md
v2.md
indexes/
root.md
engineering.md
product.md
machine/
engineering.json
logs/
2026/
06/
08.jsonl
wiki/
engineering/
product/
operations/
The database catalog tracks every schema, index shard, log partition, wiki page, source citation, and generated artifact. Markdown remains the readable layer; SQLite/Postgres and object storage carry the scalable catalog.
The first compile/write loop is local and approval-gated. wiki compile
generates cited pages from derived source chunks, creates concept backlinks,
updates index rows, records storage objects, and appends dated JSONL logs.
wiki file-answer writes answer notes only with --approve-write; otherwise it
returns the dry-run proposal. wiki lint checks missing/stale citations,
duplicates, orphan pages, unresolved source refs, contradiction markers, and
new-article candidates.
Search is hybrid:
open-filessupplies source manifests, revisions, hashes, and extracted text.knowledgechunks extracted text and generated wiki pages.- Chunks and pages are indexed with keyword search and embeddings.
- Queries run through keyword FTS, vector search, and wiki/citation graph expansion.
- Results are merged, deduped, reranked, permission-filtered, and returned with citations.
Local mode should start with SQLite FTS and a local vector-index option. Hosted mode can use Postgres with pgvector or a managed vector index. Permission filters must be applied before agent context is assembled.
The first local semantic-search implementation indexes derived chunks with
knowledge embeddings index and queries them with
knowledge search --semantic or the lower-level
knowledge embeddings search. It stores OpenAI embedding vectors as
generated metadata rows, not raw source bytes, and pins each row to open-files
provenance: source ref/URI, revision/hash, chunk offsets, token count, provider,
model, dimensions, status, and timestamps. The structured search contract
merges keyword FTS, wiki/index catalog hits, generated wiki chunks, and optional
vector results. knowledge search --context and MCP knowledge_search
turn those rows into reranked citation context packs with selected excerpts,
freshness and permission notes, graph evidence, and final rerank scores. The
local SQLite index can later move to pgvector or a managed hosted vector store
without changing CLI/MCP result shape.
MCP has a stable agent-facing contract layered over the older ok_*
compatibility tools. Agents should prefer knowledge_search, knowledge_ask,
knowledge_build, knowledge_get, knowledge_ingest,
knowledge_web_search, knowledge_lint, knowledge_run_status,
knowledge_storage, and knowledge_resolve_source. The same server publishes
project-scope JSON resources at knowledge://project/config,
knowledge://project/storage, knowledge://project/schema,
knowledge://project/sources, knowledge://project/open-files,
knowledge://project/wiki/pages, knowledge://project/indexes,
knowledge://project/runs, and knowledge://project/decisions, plus templated
reads for individual items, sources, wiki pages, indexes, runs, and decisions.
These resources expose derived chunks, generated wiki artifacts, citations, run
ledgers, and storage/index metadata without exposing raw source bytes.
Index freshness is explicit. reindex_queue tracks missing or stale embedding
work, knowledge reindex status|enqueue|embeddings operates the local
queue, and MCP exposes the same controls through ok_reindex_status,
ok_reindex_enqueue, and ok_reindex_embeddings. Hosted mode can map the same
contract to worker queues, S3/object artifact sync, Postgres/pgvector, or a
managed vector index while preserving the local command shape.
The target user flow is:
knowledge "<prompt>"The command should:
- Search existing wiki and indexed source chunks.
- Resolve deeper read-only source content through
open-filesif needed. - Optionally use provider-native web search.
- Produce an answer with citations.
- Propose durable wiki/index/schema/log updates.
- Write generated artifacts only after approval or in an explicitly approved auto-write mode.
- Record a run ledger with tool calls, sources, costs, outputs, and generated records.
The first implementation exposes this as knowledge ask|build <prompt>
and the installed knowledge <prompt> bin alias. It retrieves read-only context,
returns a local citation draft by default, optionally calls AI SDK generation via
--generate, records runs, run_events, and provider_usage, and only
proposes durable wiki updates until the wiki compile/write task owns writes.
Provider-native web search is exposed separately as
knowledge web search <query> and MCP ok_web_search. Real network access
is safety-gated; OpenAI and Anthropic use provider web-search tools through AI
SDK, while DeepSeek remains a future fallback/external-search path. Returned web
snippets can optionally be filed as read-only web source refs for later local
search and citation.
AI provider setup is BYOK and AI SDK v6 based. The local provider layer tracks:
- OpenAI via
@ai-sdk/openai, defaulting toopenai:gpt-5.2. - Anthropic via
@ai-sdk/anthropic, defaulting toanthropic:claude-sonnet-4-6. - DeepSeek via
@ai-sdk/deepseek, defaulting todeepseek:deepseek-chat.
Model aliases live in config and can be inspected with
knowledge providers models. Credentials are resolved from env vars by
default, checked without making provider calls, and usage can be normalized into
the existing provider_usage table for future prompt, embedding, and web-search
runs.
- Do not make
knowledgeown raw source files. - Do not make hosted account, billing, worker, or tenant state required for local use.
- Do not let semantic search bypass permissions.
- Do not treat one
index.md,schema.md, orlog.mdas the final scalable representation for a large company knowledge base.