Ingestion and Connectors
SkillCommunicationLets your agent add knowledge sources like Slack, GitHub, or Zoom to a shared brain, sync them, and fix stalled ones.
Use Ingestion and Connectors in Claude, ChatGPT or Ahel Desktop
Free. Sign in, add Ingestion and Connectors and connect your AI. About a minute.
Also: Claude Code · Cursor · Codex
Then ask your AI: use the Ingestion and Connectors skill
Details
Instructions available. Your AI can read the instructions. Execution depends on the setup they require.
Account requirements not reviewed. Check the skill instructions before use; ahel provides instructions and does not run this skill.
No other account needed.
Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.
About this skill
Create, sync, and diagnose Brain sources across all providers (manual, generic, clips, slack, granola, github, zoom), health states, sync scheduling, and credential resolution. Use when adding a source, running or debugging a sync, or the user asks why a source is stale, erroring, or not importing.
What this skill tells your AI
The instructions your AI receives, as published by builderio/agent-native in templates/brain/.agents/skills/ingestion-and-connectors/SKILL.md and read by ahel’s review.
For Slack-specific rollout steps (channel allow-lists, pilot runs, scope
checklist), read brain-runbook instead — this skill covers the
provider-agnostic source lifecycle.
Source Providers
create-source accepts exactly manual, generic, clips, slack,
granola, github, or zoom (sourceProviderSchema in actions/_schemas.ts), and
rejects anything else. There is no arbitrary/custom
provider string — a generic webhook-fed source uses provider: "generic"
with a sourceKey + minted ingestToken, not a made-up provider id.
pnpm --filter brain action create-source \
--title "Support call transcripts" \
--provider generic \
--sourceKey support-calls \
--visibility org
create-source returns ingestToken in the response once — it is stored
only as a SHA-256 hash (ingestTokenHash) on the source row, so it cannot be
retrieved again later. Surface it to the user immediately (e.g. for wiring
into an external system's webhook config) rather than assuming you can read
it back with get-source.
Manual sources are push/import-driven and private by default. Use
import-markdown-files for a bounded folder or batch of .md / .markdown
files; it preserves relative paths for deduplication, stores searchable text as
document captures, and reports each file's import or privacy outcome. Use the
standard sharing actions to change a source to organization visibility or grant
specific access. Do not use sync-source for a manual source.
Zoom
Zoom sources import cloud-recording transcripts through a Server-to-Server
OAuth app. Credentials are the vault secrets ZOOM_ACCOUNT_ID,
ZOOM_CLIENT_ID, and ZOOM_CLIENT_SECRET; the app needs scopes
user:read:list_users:admin and
cloud_recording:read:list_user_recordings:admin. Config is
{"zoom":{"userIds":[...],"lookbackDays":7}} — userIds is optional (up to
50; omitted means every account user) and lookbackDays is 1-30, default 7.
Sources auto-sync hourly; each run overlaps the previous one by one day to
catch late-processed transcripts, and captures dedupe by zoom:<meeting uuid>.
Captures use the organization audience. There are no Zoom webhooks.
Blessed FAQ And Docs Publishers
Approved FAQs, docs, handbooks, and similar owned resources use the same
generic signed source contract. They are not a new provider and do not require
Brain to crawl the entire upstream system. The source owner publishes only the
records Brain is allowed to use:
pnpm --filter brain action create-source \
--title "Blessed Agent-Native docs" \
--provider generic \
--sourceKey agent-native-docs \
--policy '{"trustTier":"blessed","answerEligible":true,"authority":100,"freshnessWindowDays":null,"reviewRequired":false,"conflictBehavior":"prefer-higher-authority"}' \
--visibility org
The source answer policy is code-enforced:
| Field | Effect |
|---|---|
trustTier | blessed, standard, or untrusted; cited answers rank higher trust first. |
answerEligible | Excludes the source from ask-brain answers when false. |
authority | Ranks otherwise eligible sources from 0 to 100. |
freshnessWindowDays | Excludes source-backed results after the configured window; null disables expiry. |
reviewRequired | Raw captures cannot support ask-brain answers. |
conflictBehavior | Prefer higher authority, surface conflicts, or require review before raw support. |
Legacy sources remain standard, answer-eligible, authority 50, with no
freshness expiry. Use update-source --policy ... to tighten an existing
source without recreating it.
Source Health States
get-brain-health (readBrainHealth in server/lib/brain-health.ts) is the
single action to check before telling a user "your source is broken" or
"nothing has synced yet." Each source gets one deterministic health value:
| Health | Meaning |
|---|---|
error | Source status === "error", has lastError, or its latest sync run failed. |
paused | Source status is paused or archived. |
needs_setup | Slack source with no configured channel allow-list yet (channelIds/channels/allowedChannels all empty). |
needs_sync | Auto-sync-eligible provider (slack/granola/github/zoom) that has never completed a sync (lastSyncedAt is null). |
stale | Past its computed nextSyncAt by more than a 15-minute grace window. |
healthy | None of the above. |
get-brain-health also reports distillationQueue counts (pending,
failed, stale — a processing row untouched for 15+ minutes counts as
stale), proposals.pending, sources.attention (every non-healthy source),
and ordered setup.nextSteps. Read this before diagnosing a "why isn't X in
Brain yet" question — it is cheaper and more reliable than inspecting
individual sources by hand.
Running a Sync
sync-source --sourceId=<id>runs one source's connector immediately (requireseditoraccess on that source). Slack scans only its allow-listed channels; Granola polls accessible notes; GitHub imports approved repository issues/PRs; Zoom imports recording transcripts.sync-due-sourcessweeps every accessible source whosenextSyncAthas passed. Prefer this for "catch everything up" requests instead of listing sources and callingsync-sourcein a loop.- Auto-sync (hourly by default) only applies to
slack,granola,github, andzoomsources, and only when the source's own config doesn't explicitly setautoSync: false(sourceAutoSyncinbrain-health.ts).manual,generic, andclipssources are push/import-driven, not polled — there's nonextSyncAtto wait on for those.
Beyond the Source Actions
Source sync actions are convenience readers, not integration limits. For ad hoc
provider analysis, or a question that needs an endpoint, filter, or payload the
source actions do not model, call provider-api-catalog / provider-api-docs
first, then provider-api-request against the provider's real HTTP API. Use
connectionId for a specific shared grant and accountId for a specific OAuth
account.
Credential Resolution Order
For connector work, use existing workspace integration grants when available; do not duplicate provider tokens into Brain. Every provider-backed source resolves its credential in this order (never skip ahead or ask for a duplicate token if an earlier tier already has one):
- Granted
workspace_connections/workspace_connection_grantsforappId=brain— a shared credential another app or Dispatch already connected and granted to Brain. - Backward-compatible Brain-local SQL credentials (legacy, pre-workspace-grant sources).
- Registered vault secrets scoped to the same user/org/workspace.
Brain source credentials do not fall back to raw deploy-level environment
variables — .env/.env.local alone will not satisfy a source's credential
check. list-connection-providers reports per-provider readiness
(connected, granted, needs_grant, not_connected) plus credential
health, so check that before telling a user to paste a new token — if a
provider shows needs_grant, the fix is granting Brain access to the existing
connection, not creating a new one.
Editing And Removing Sources
update-sourceedits title, config, cursor, status, or answer policy on an existing source.delete-sourceis a hard delete — there's no soft-archive alternative exposed as an action; settingstatus: "paused"viaupdate-sourceis the reversible way to stop a source without losing its captures.list-sources --provider=<p> --includeArchived=<bool>is scoped byaccessFilter— sharing/visibility rules apply the same way they do for knowledge and proposals.
Related Skills
brain— distillation, retrieval, and publish-tier mechanics once a capture exists.brain-runbook— Slack rollout steps, distillation worker internals, scheduled sync cron wiring, demo/eval seeding, and the generic ingest webhook payload shape.sharing— theaccessFilter/assertAccesspattern used throughout source and capture reads.
Signals
- GitHub stars
- 7k
- Forks
- 635
- Last commit
- Oct 2026
Advanced
- Item type
- skill
- Key
ingestion-and-connectors- Source
- github.com/builderio/agent-native
github.com/builderio/agent-native
More in Communication
Skill · anthropics
More in Communicationerror-handling
Skill · affaan-m
More in Communicationemails
Skill · coreyhaines31
More in Communicationazure-messaging
Skill · microsoft
More in Communicationinvestor-outreach
Skill · affaan-m
More in Communicationgws-gmail
Skill · googleworkspace
More in Communication