- Wraps
signal-cli-rest-api. - Normalizes inbound webhook payloads to
NormalizedSignalMessage. - Sends outbound DM or group messages.
- Tracks transport health independently from the rest of the app.
- Assumes the bot account is registered directly on the laptop-hosted Signal stack as a primary device.
- Decides ingestion and response behavior.
- Group messages are ingested unless the group is
ignored. - Direct messages are never added to shared retrieval memory.
- Direct messages only receive replies when the sender has recent membership evidence in at least one
authorizedgroup. - Group auto-replies are disabled by default.
- Stores raw group messages.
- Stores minimal DM operational logs when enabled.
- Builds conversation-aware chunks from grouped messages instead of embedding single tiny messages.
- Retrieves only from allowed groups and optional filters.
- Uses native pgvector similarity search in PostgreSQL for production retrieval.
- Uses an ingestion job queue and worker to handle reindexing and deferred chunking.
- Ingests admin-managed local files.
- Supports
.txtand.md. - Accepts
.pdfas a documented stub path for the MVP. - Supports
global,group, andadmin_onlycollections.
- Calls OpenAI Responses API.
- Injects system instructions plus retrieved group and knowledge context.
- Uses OpenAI built-in
web_searchtool when enabled. - Returns source-aware payloads and token-usage metadata.
- Claims pending ingestion jobs.
- Handles reindex and group ingestion in the background.
- Group chats are shared memory only within approved scopes.
- Direct messages are private and are never embedded into shared retrieval memory.
- Knowledge collections stay separate from chat-derived memory.
- SQLite remains a test-only fallback for embeddings; PostgreSQL is the intended retrieval backend.
- The bot uses a dedicated Signal account and number.
- The laptop-hosted
signal-cli-rest-apistack is the primary and only active device for that account. - Registration happens through
signal-cli-rest-apiregister and verify endpoints rather than QR linking. - This is practical for future VPS migration, but it relies on unofficial tooling and should be monitored for breakage across Signal or signal-cli changes.
- Signal webhook arrives.
- Payload is normalized.
- Policy allows ingestion unless the group is
ignored. - Raw message is stored and membership evidence is updated.
- Background ingestion builds conversation chunks.
- No reply is sent by default.
- Direct message arrives.
- Membership evidence is checked against
authorizedgroups. - Group-scoped memory and knowledge are retrieved.
- OpenAI Responses API generates an answer and may use web search.
- Reply is sent privately.
- DM content is not added to shared memory.
- Direct message arrives.
- No authorized-group eligibility is found.
- Bot sends a polite refusal.