SDKs
Hosts embed Efelant through packages. Core stays in PostgreSQL.
There is no Storybook. The visual catalog for tokens and component chrome is Styles. How to attach a conversation to a domain object: Embedding.
Inventory
Packages
| package | import | what it is |
|---|---|---|
@efelant/tokens | CSS / JS / Dart | Style Dictionary output |
@efelant/client | TypeScript | function API over a transport |
@efelant/client-js | ESM / CJS / Efelant global | bundled @efelant/client |
@efelant/components | <efelant-*> | Stencil custom elements |
efelant_flutter | Dart | widgets + EfelantClient |
./scripts/packages.sh # tokens → clients → Stencil → Flutter
./scripts/packages.sh clients # TypeScript + JavaScript only
./scripts/packages.sh components # tokens, then Stencil + Flutter
Clients
TypeScript
import { EfelantClient, createGatewayTransport } from "@efelant/client";
const client = new EfelantClient({
transport: createGatewayTransport("/ws"),
});
await client.resume(token);
Browsers cannot speak the PostgreSQL wire protocol. Use createGatewayTransport. createMemoryTransport() is the same function names in memory. createMemoryHub() is one store, many connections. The landing-page demo is an in-memory Alice and Bob pair. The Flutter app sets the live host in settings.
| method | SQL |
|---|---|
login / resume / logout | auth.login / auth.resume_session / auth.logout |
listTenants / selectTenant | auth.list_tenants / auth.select_tenant |
openContext | efelant.open_context |
syncEvents / syncContext | efelant.sync_events / efelant.sync_context_events |
getConversations / sendMessage | chat.get_conversations / chat.send_message |
JavaScript bundle
@efelant/client-js is the same client: dist/efelant.esm.js, dist/efelant.cjs.js, dist/efelant.global.js.
<script type="module" src="@efelant/client-js/dist/efelant.esm.js"></script>
UI
Web components
Custom elements. They work from HTML, Vue, Angular, and Svelte. No React package ships from this repo. Set data-efelant-theme on a parent.
| tag | props | events |
|---|---|---|
<efelant-conversation> | tenant-id, conversation-id, context-type, external-id | — |
<efelant-conversation-list> | tenant-id | — |
<efelant-context-feed> | tenant-id, context-type, external-id | — |
<efelant-composer> | placeholder, disabled | efelantSend |
<efelant-status-event> | status, message | — |
<efelant-unread-badge> | count | — |
<efelant-conversation tenant-id="…" context-type="access_request" external-id="AR-123">
<efelant-composer slot="composer" placeholder="Message…"></efelant-composer>
</efelant-conversation>
Stencil UI is not pixel-shared with Flutter. Shared contracts are event names, models, and generated tokens.
Flutter
The messenger in app/ depends on efelant_flutter. Host apps import the same widgets.
EfelantConversation(
tenantId: tenantId,
context: EfelantContext(
type: 'access_request',
externalId: accessRequestId,
),
)
Widgets: EfelantConversation, EfelantConversationList, EfelantContextFeed, EfelantComposer, EfelantStatusEvent, EfelantUnreadBadge. Theme: buildEfelantTheme(theme: EfelantThemeId.primary).
Other runtimes
REST and gRPC
Runtimes that cannot speak PostgreSQL use the extensions. See REST / gRPC.