@agent-native/core 0.51.5 → 0.51.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/cli/pr-visual-recap-workflow.d.ts +1 -1
  2. package/dist/cli/pr-visual-recap-workflow.d.ts.map +1 -1
  3. package/dist/cli/pr-visual-recap-workflow.js +1 -1
  4. package/dist/cli/pr-visual-recap-workflow.js.map +1 -1
  5. package/dist/cli/templates-meta.js +1 -1
  6. package/dist/cli/templates-meta.js.map +1 -1
  7. package/dist/coding-tools/run-code.d.ts.map +1 -1
  8. package/dist/coding-tools/run-code.js +435 -3
  9. package/dist/coding-tools/run-code.js.map +1 -1
  10. package/dist/provider-api/corpus-jobs-store.d.ts +95 -0
  11. package/dist/provider-api/corpus-jobs-store.d.ts.map +1 -0
  12. package/dist/provider-api/corpus-jobs-store.js +394 -0
  13. package/dist/provider-api/corpus-jobs-store.js.map +1 -0
  14. package/dist/provider-api/corpus-jobs.d.ts +146 -0
  15. package/dist/provider-api/corpus-jobs.d.ts.map +1 -0
  16. package/dist/provider-api/corpus-jobs.js +1192 -0
  17. package/dist/provider-api/corpus-jobs.js.map +1 -0
  18. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  19. package/dist/server/agent-chat-plugin.js +9 -2
  20. package/dist/server/agent-chat-plugin.js.map +1 -1
  21. package/dist/server/auth-marketing.js +4 -4
  22. package/dist/server/auth-marketing.js.map +1 -1
  23. package/docs/content/cloneable-saas.md +1 -1
  24. package/docs/content/getting-started.md +1 -1
  25. package/docs/content/local-file-mode.md +6 -1
  26. package/docs/content/template-analytics.md +0 -8
  27. package/docs/content/template-assets.md +0 -6
  28. package/docs/content/template-brain.md +0 -8
  29. package/docs/content/template-calendar.md +0 -8
  30. package/docs/content/template-clips.md +0 -8
  31. package/docs/content/template-content.md +27 -23
  32. package/docs/content/template-design.md +0 -6
  33. package/docs/content/template-forms.md +0 -10
  34. package/docs/content/template-mail.md +0 -8
  35. package/docs/content/template-plan.md +180 -0
  36. package/docs/content/template-slides.md +0 -8
  37. package/docs/content/template-videos.md +0 -8
  38. package/package.json +3 -1
@@ -37,11 +37,11 @@ export const BUILT_IN_AUTH_MARKETING = {
37
37
  },
38
38
  content: {
39
39
  appName: "Agent-Native Content",
40
- tagline: "Your AI agent creates, edits, and organizes documents alongside you in a Notion-like workspace.",
40
+ tagline: "Open-source Obsidian for MDX: your AI agent edits local docs, creates custom blocks, and organizes everything alongside you.",
41
41
  features: [
42
- "Create and restructure entire document trees from a single prompt",
43
- "Surgical edits that sync live to your editor via real-time collaboration",
44
- "Search, summarize, and cross-reference documents instantly",
42
+ "Edit local Markdown/MDX files directly, with hosted sync when you need it",
43
+ "Generate rich interactive custom MDX blocks and edit their props visually",
44
+ "Search, summarize, cross-reference, and restructure document trees instantly",
45
45
  ],
46
46
  },
47
47
  design: {
@@ -1 +1 @@
1
- {"version":3,"file":"auth-marketing.js","sourceRoot":"","sources":["../../src/server/auth-marketing.ts"],"names":[],"mappings":"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","sourcesContent":["export interface AuthMarketingContent {\n appName: string;\n tagline: string;\n description?: string;\n features?: string[];\n runLocalCommand?: string;\n}\n\nexport interface ResolveBuiltInAuthMarketingOptions {\n requestHost?: string;\n requestPath?: string;\n}\n\nexport const BUILT_IN_AUTH_MARKETING: Record<string, AuthMarketingContent> = {\n analytics: {\n appName: \"Agent-Native Analytics\",\n tagline:\n \"Your AI agent queries your data sources, builds dashboards, and answers business questions alongside you.\",\n features: [\n \"Ask any question and get answers from BigQuery, HubSpot, Jira, and more\",\n \"Agent-built dashboards that pull live data from all your sources\",\n \"Saved analyses the agent can re-run on demand with fresh numbers\",\n ],\n },\n brain: {\n appName: \"Agent-Native Brain\",\n tagline:\n \"A company memory layer where raw conversations become reviewed, searchable institutional knowledge.\",\n features: [\n \"Import transcripts, notes, Slack exports, and Granola summaries\",\n \"Validate every fact against exact source quotes\",\n \"Review company-wide knowledge through proposal workflows\",\n ],\n },\n calendar: {\n appName: \"Agent-Native Calendar\",\n tagline:\n \"Your AI agent schedules, reschedules, and manages your calendar so you never have to.\",\n features: [\n \"Finds open slots and books meetings on your behalf\",\n \"Manages availability and booking links automatically\",\n \"Answers schedule questions and resolves conflicts instantly\",\n ],\n },\n clips: {\n appName: \"Agent-Native Clips\",\n tagline:\n \"Your AI agent transcribes, summarizes, and searches everything you record alongside you.\",\n features: [\n \"One-click screen recording with automatic titles, summaries, and chapters\",\n \"Calendar-synced meeting notes with live transcripts and action items\",\n \"One searchable library across recordings, meetings, and dictations\",\n ],\n },\n content: {\n appName: \"Agent-Native Content\",\n tagline:\n \"Your AI agent creates, edits, and organizes documents alongside you in a Notion-like workspace.\",\n features: [\n \"Create and restructure entire document trees from a single prompt\",\n \"Surgical edits that sync live to your editor via real-time collaboration\",\n \"Search, summarize, and cross-reference documents instantly\",\n ],\n },\n design: {\n appName: \"Agent-Native Design\",\n tagline:\n \"Design and prototype by describing what you want. The AI agent turns your ideas into interactive, fully responsive designs in seconds.\",\n features: [\n \"Create polished prototypes just by describing them\",\n \"Build and apply design systems to keep everything on-brand\",\n \"Export your work or share it with a link\",\n ],\n },\n dispatch: {\n appName: \"Agent-Native Dispatch\",\n tagline:\n \"Your AI agent manages secrets, orchestrates other agents, and routes messages across your workspace.\",\n features: [\n \"Centralized vault for secrets with granular per-app grants\",\n \"Cross-agent orchestration and delegation to specialist apps\",\n \"Slack and Telegram routing with approval workflows\",\n ],\n },\n forms: {\n appName: \"Agent-Native Forms\",\n tagline:\n \"Your AI agent builds, publishes, and analyzes forms alongside you.\",\n features: [\n \"Create complete forms from a single sentence\",\n \"Instant publishing with shareable links and captcha\",\n \"Response summaries, exports, and trend analysis on demand\",\n ],\n },\n assets: {\n appName: \"Agent-Native Assets\",\n tagline:\n \"Your AI agent creates, refines, and organizes on-brand assets alongside you.\",\n features: [\n \"Build reusable asset libraries from logos, product shots, videos, and references\",\n \"Generate heroes, diagrams, slide art, product visuals, and videos from a prompt\",\n \"Audit prompts, references, outputs, and refinements across every run\",\n ],\n },\n mail: {\n appName: \"Agent-Native Mail\",\n tagline: \"Your AI agent reads, drafts, and organizes email alongside you.\",\n features: [\n \"Replies that match your tone and style\",\n \"Multi-account Gmail in a single unified inbox\",\n \"Autonomous triage, archiving, and follow-ups\",\n ],\n runLocalCommand:\n \"npx @agent-native/core@latest create my-mail-app --template mail\",\n },\n slides: {\n appName: \"Agent-Native Slides\",\n tagline:\n \"Your AI agent builds, edits, and refines presentations alongside you.\",\n features: [\n \"Generate entire decks from a single prompt\",\n \"Surgical slide edits while you present or review\",\n \"Real-time collaboration between you and the agent\",\n ],\n },\n starter: {\n appName: \"Blank app\",\n tagline:\n \"Build an agent-native app where the AI agent and UI share state, actions, and context.\",\n features: [\n \"Define once, use everywhere: actions work as agent tools and API endpoints\",\n \"The agent always knows what you are looking at and can act on it\",\n \"Modify your app's own code, routes, and styles through conversation\",\n ],\n },\n videos: {\n appName: \"Agent-Native Videos\",\n tagline:\n \"Your AI agent builds, animates, and refines programmatic videos alongside you.\",\n features: [\n \"Generate animated components and compositions from a description\",\n \"Fine-tune tracks, keyframes, and easing without touching code\",\n \"Camera moves, interactive elements, and effects the agent wires for you\",\n ],\n },\n};\n\nconst SLUG_ALIASES: Record<string, string> = {\n \"agent-native\": \"\",\n \"blank-app\": \"starter\",\n asset: \"assets\",\n image: \"assets\",\n images: \"assets\",\n video: \"videos\",\n};\n\nfunction cloneMarketing(marketing: AuthMarketingContent): AuthMarketingContent {\n return {\n ...marketing,\n features: marketing.features ? [...marketing.features] : undefined,\n };\n}\n\nfunction normalizeSlug(value: string | undefined): string | undefined {\n if (!value) return undefined;\n let slug = value.trim().toLowerCase();\n if (!slug) return undefined;\n\n slug = slug.replace(/^@agent-native\\//, \"\");\n slug = slug\n .replace(/&/g, \" and \")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n slug = slug.replace(/^agent-native-/, \"\");\n slug = SLUG_ALIASES[slug] ?? slug;\n if (!slug) return undefined;\n return BUILT_IN_AUTH_MARKETING[slug] ? slug : undefined;\n}\n\nfunction slugFromUrl(value: string | undefined): string | undefined {\n if (!value) return undefined;\n try {\n const url = new URL(value);\n return slugFromHost(url.host) ?? slugFromPath(url.pathname);\n } catch {\n return undefined;\n }\n}\n\nfunction slugFromHost(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const host = value.split(\",\")[0]?.trim().split(\":\")[0]?.toLowerCase();\n if (!host) return undefined;\n if (host.endsWith(\".agent-native.com\")) {\n return normalizeSlug(host.slice(0, -\".agent-native.com\".length));\n }\n return undefined;\n}\n\nfunction slugFromPath(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const firstSegment = value.split(\"?\")[0]?.split(\"/\").filter(Boolean)[0];\n return normalizeSlug(firstSegment);\n}\n\nfunction candidateSlugs(\n opts: ResolveBuiltInAuthMarketingOptions = {},\n): string[] {\n const env = process.env;\n const candidates = [\n opts.requestHost ? slugFromHost(opts.requestHost) : undefined,\n opts.requestPath ? slugFromPath(opts.requestPath) : undefined,\n normalizeSlug(env.AGENT_NATIVE_TEMPLATE),\n normalizeSlug(env.APP_NAME),\n normalizeSlug(env.npm_package_name),\n slugFromPath(env.APP_BASE_PATH),\n slugFromPath(env.VITE_APP_BASE_PATH),\n slugFromUrl(env.APP_URL),\n slugFromUrl(env.BETTER_AUTH_URL),\n slugFromUrl(env.VITE_BETTER_AUTH_URL),\n slugFromUrl(env.URL),\n slugFromUrl(env.DEPLOY_URL),\n slugFromUrl(env.DEPLOY_PRIME_URL),\n ];\n\n return candidates.filter((slug): slug is string => !!slug);\n}\n\nexport function resolveBuiltInAuthMarketing(\n opts: ResolveBuiltInAuthMarketingOptions = {},\n): AuthMarketingContent | undefined {\n for (const slug of candidateSlugs(opts)) {\n const marketing = BUILT_IN_AUTH_MARKETING[slug];\n if (marketing) return cloneMarketing(marketing);\n }\n return undefined;\n}\n\nexport function resolveBuiltInAuthMarketingByName(\n value: string | undefined,\n): AuthMarketingContent | undefined {\n const slug = normalizeSlug(value);\n const marketing = slug ? BUILT_IN_AUTH_MARKETING[slug] : undefined;\n return marketing ? cloneMarketing(marketing) : undefined;\n}\n"]}
1
+ {"version":3,"file":"auth-marketing.js","sourceRoot":"","sources":["../../src/server/auth-marketing.ts"],"names":[],"mappings":"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","sourcesContent":["export interface AuthMarketingContent {\n appName: string;\n tagline: string;\n description?: string;\n features?: string[];\n runLocalCommand?: string;\n}\n\nexport interface ResolveBuiltInAuthMarketingOptions {\n requestHost?: string;\n requestPath?: string;\n}\n\nexport const BUILT_IN_AUTH_MARKETING: Record<string, AuthMarketingContent> = {\n analytics: {\n appName: \"Agent-Native Analytics\",\n tagline:\n \"Your AI agent queries your data sources, builds dashboards, and answers business questions alongside you.\",\n features: [\n \"Ask any question and get answers from BigQuery, HubSpot, Jira, and more\",\n \"Agent-built dashboards that pull live data from all your sources\",\n \"Saved analyses the agent can re-run on demand with fresh numbers\",\n ],\n },\n brain: {\n appName: \"Agent-Native Brain\",\n tagline:\n \"A company memory layer where raw conversations become reviewed, searchable institutional knowledge.\",\n features: [\n \"Import transcripts, notes, Slack exports, and Granola summaries\",\n \"Validate every fact against exact source quotes\",\n \"Review company-wide knowledge through proposal workflows\",\n ],\n },\n calendar: {\n appName: \"Agent-Native Calendar\",\n tagline:\n \"Your AI agent schedules, reschedules, and manages your calendar so you never have to.\",\n features: [\n \"Finds open slots and books meetings on your behalf\",\n \"Manages availability and booking links automatically\",\n \"Answers schedule questions and resolves conflicts instantly\",\n ],\n },\n clips: {\n appName: \"Agent-Native Clips\",\n tagline:\n \"Your AI agent transcribes, summarizes, and searches everything you record alongside you.\",\n features: [\n \"One-click screen recording with automatic titles, summaries, and chapters\",\n \"Calendar-synced meeting notes with live transcripts and action items\",\n \"One searchable library across recordings, meetings, and dictations\",\n ],\n },\n content: {\n appName: \"Agent-Native Content\",\n tagline:\n \"Open-source Obsidian for MDX: your AI agent edits local docs, creates custom blocks, and organizes everything alongside you.\",\n features: [\n \"Edit local Markdown/MDX files directly, with hosted sync when you need it\",\n \"Generate rich interactive custom MDX blocks and edit their props visually\",\n \"Search, summarize, cross-reference, and restructure document trees instantly\",\n ],\n },\n design: {\n appName: \"Agent-Native Design\",\n tagline:\n \"Design and prototype by describing what you want. The AI agent turns your ideas into interactive, fully responsive designs in seconds.\",\n features: [\n \"Create polished prototypes just by describing them\",\n \"Build and apply design systems to keep everything on-brand\",\n \"Export your work or share it with a link\",\n ],\n },\n dispatch: {\n appName: \"Agent-Native Dispatch\",\n tagline:\n \"Your AI agent manages secrets, orchestrates other agents, and routes messages across your workspace.\",\n features: [\n \"Centralized vault for secrets with granular per-app grants\",\n \"Cross-agent orchestration and delegation to specialist apps\",\n \"Slack and Telegram routing with approval workflows\",\n ],\n },\n forms: {\n appName: \"Agent-Native Forms\",\n tagline:\n \"Your AI agent builds, publishes, and analyzes forms alongside you.\",\n features: [\n \"Create complete forms from a single sentence\",\n \"Instant publishing with shareable links and captcha\",\n \"Response summaries, exports, and trend analysis on demand\",\n ],\n },\n assets: {\n appName: \"Agent-Native Assets\",\n tagline:\n \"Your AI agent creates, refines, and organizes on-brand assets alongside you.\",\n features: [\n \"Build reusable asset libraries from logos, product shots, videos, and references\",\n \"Generate heroes, diagrams, slide art, product visuals, and videos from a prompt\",\n \"Audit prompts, references, outputs, and refinements across every run\",\n ],\n },\n mail: {\n appName: \"Agent-Native Mail\",\n tagline: \"Your AI agent reads, drafts, and organizes email alongside you.\",\n features: [\n \"Replies that match your tone and style\",\n \"Multi-account Gmail in a single unified inbox\",\n \"Autonomous triage, archiving, and follow-ups\",\n ],\n runLocalCommand:\n \"npx @agent-native/core@latest create my-mail-app --template mail\",\n },\n slides: {\n appName: \"Agent-Native Slides\",\n tagline:\n \"Your AI agent builds, edits, and refines presentations alongside you.\",\n features: [\n \"Generate entire decks from a single prompt\",\n \"Surgical slide edits while you present or review\",\n \"Real-time collaboration between you and the agent\",\n ],\n },\n starter: {\n appName: \"Blank app\",\n tagline:\n \"Build an agent-native app where the AI agent and UI share state, actions, and context.\",\n features: [\n \"Define once, use everywhere: actions work as agent tools and API endpoints\",\n \"The agent always knows what you are looking at and can act on it\",\n \"Modify your app's own code, routes, and styles through conversation\",\n ],\n },\n videos: {\n appName: \"Agent-Native Videos\",\n tagline:\n \"Your AI agent builds, animates, and refines programmatic videos alongside you.\",\n features: [\n \"Generate animated components and compositions from a description\",\n \"Fine-tune tracks, keyframes, and easing without touching code\",\n \"Camera moves, interactive elements, and effects the agent wires for you\",\n ],\n },\n};\n\nconst SLUG_ALIASES: Record<string, string> = {\n \"agent-native\": \"\",\n \"blank-app\": \"starter\",\n asset: \"assets\",\n image: \"assets\",\n images: \"assets\",\n video: \"videos\",\n};\n\nfunction cloneMarketing(marketing: AuthMarketingContent): AuthMarketingContent {\n return {\n ...marketing,\n features: marketing.features ? [...marketing.features] : undefined,\n };\n}\n\nfunction normalizeSlug(value: string | undefined): string | undefined {\n if (!value) return undefined;\n let slug = value.trim().toLowerCase();\n if (!slug) return undefined;\n\n slug = slug.replace(/^@agent-native\\//, \"\");\n slug = slug\n .replace(/&/g, \" and \")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n slug = slug.replace(/^agent-native-/, \"\");\n slug = SLUG_ALIASES[slug] ?? slug;\n if (!slug) return undefined;\n return BUILT_IN_AUTH_MARKETING[slug] ? slug : undefined;\n}\n\nfunction slugFromUrl(value: string | undefined): string | undefined {\n if (!value) return undefined;\n try {\n const url = new URL(value);\n return slugFromHost(url.host) ?? slugFromPath(url.pathname);\n } catch {\n return undefined;\n }\n}\n\nfunction slugFromHost(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const host = value.split(\",\")[0]?.trim().split(\":\")[0]?.toLowerCase();\n if (!host) return undefined;\n if (host.endsWith(\".agent-native.com\")) {\n return normalizeSlug(host.slice(0, -\".agent-native.com\".length));\n }\n return undefined;\n}\n\nfunction slugFromPath(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const firstSegment = value.split(\"?\")[0]?.split(\"/\").filter(Boolean)[0];\n return normalizeSlug(firstSegment);\n}\n\nfunction candidateSlugs(\n opts: ResolveBuiltInAuthMarketingOptions = {},\n): string[] {\n const env = process.env;\n const candidates = [\n opts.requestHost ? slugFromHost(opts.requestHost) : undefined,\n opts.requestPath ? slugFromPath(opts.requestPath) : undefined,\n normalizeSlug(env.AGENT_NATIVE_TEMPLATE),\n normalizeSlug(env.APP_NAME),\n normalizeSlug(env.npm_package_name),\n slugFromPath(env.APP_BASE_PATH),\n slugFromPath(env.VITE_APP_BASE_PATH),\n slugFromUrl(env.APP_URL),\n slugFromUrl(env.BETTER_AUTH_URL),\n slugFromUrl(env.VITE_BETTER_AUTH_URL),\n slugFromUrl(env.URL),\n slugFromUrl(env.DEPLOY_URL),\n slugFromUrl(env.DEPLOY_PRIME_URL),\n ];\n\n return candidates.filter((slug): slug is string => !!slug);\n}\n\nexport function resolveBuiltInAuthMarketing(\n opts: ResolveBuiltInAuthMarketingOptions = {},\n): AuthMarketingContent | undefined {\n for (const slug of candidateSlugs(opts)) {\n const marketing = BUILT_IN_AUTH_MARKETING[slug];\n if (marketing) return cloneMarketing(marketing);\n }\n return undefined;\n}\n\nexport function resolveBuiltInAuthMarketingByName(\n value: string | undefined,\n): AuthMarketingContent | undefined {\n const slug = normalizeSlug(value);\n const marketing = slug ? BUILT_IN_AUTH_MARKETING[slug] : undefined;\n return marketing ? cloneMarketing(marketing) : undefined;\n}\n"]}
@@ -17,7 +17,7 @@ Each one is a real app you could use today, and the launching pad for your own v
17
17
  | ----------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
18
18
  | [**Mail**](/docs/template-mail) | An agent-native Superhuman. Inbox, labels, AI triage, keyboard-first, drafts and sends through the agent. |
19
19
  | [**Calendar**](/docs/template-calendar) | An agent-native Google Calendar. Events, sync, public booking links, agent-driven scheduling. |
20
- | [**Content**](/docs/template-content) | An agent-native Notion / Google Docs. Markdown + Tiptap editor, Notion sync, real-time multi-user collab. |
20
+ | [**Content**](/docs/template-content) | Open-source Obsidian for MDX. Local Markdown/MDX, Tiptap editor, Notion sync, real-time multi-user collab. |
21
21
  | [**Brain**](/docs/template-brain) | Clean company chat backed by cited institutional memory, approved sources, review gates, and citations. |
22
22
  | [**Assets**](/docs/template-assets) | Digital asset manager for brand libraries, uploads, references, and on-brand image/video generation. |
23
23
  | [**Slides**](/docs/template-slides) | An agent-native Google Slides. React-based decks the agent generates and edits directly. |
@@ -52,7 +52,7 @@ Each template is a complete app with UI, agent actions, database schema, and AI
52
52
  | Template | What it is |
53
53
  | ------------------------------------- | --------------------------------------------------------------------- |
54
54
  | [Calendar](/docs/template-calendar) | Agent-native Google Calendar + Calendly-style booking |
55
- | [Content](/docs/template-content) | Agent-native Notion / Google Docs |
55
+ | [Content](/docs/template-content) | Open-source Obsidian for MDX |
56
56
  | [Brain](/docs/template-brain) | Company chat with cited institutional memory |
57
57
  | [Assets](/docs/template-assets) | Brand asset libraries and generated media |
58
58
  | [Slides](/docs/template-slides) | Agent-native Google Slides / Pitch |
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: "Local File Mode"
3
- description: "Run agent-native apps with local Markdown, MDX, and other repo files as the source of truth instead of SQL-backed records."
3
+ description: "Run agent-native apps with local Markdown, MDX, and other repo files as the source of truth - including Obsidian-style MDX docs with custom components."
4
4
  ---
5
5
 
6
6
  # Local File Mode
@@ -16,12 +16,17 @@ Content editor, and saving writes back to the selected file. The same files can
16
16
  also be edited by Codex, Claude Code, the Agent-Native sidebar agent, or a normal
17
17
  editor.
18
18
 
19
+ For Content, this makes the product feel like open-source Obsidian for MDX:
20
+ your docs live as files, while the app adds a visual editor, agent actions,
21
+ shareable copies, and rich interactive MDX components.
22
+
19
23
  Use Local File Mode when you want a repo-first workflow:
20
24
 
21
25
  - a docs repo with `docs/*.mdx`
22
26
  - a blog with `blog/*.mdx`
23
27
  - resources such as positioning, messaging, or team notes in `resources/*.md`
24
28
  - a personal Obsidian-style knowledge base with a richer MDX editor
29
+ - docs that need interactive custom MDX blocks generated from local React code
25
30
  - app artifacts that should be easy for coding agents to inspect and patch
26
31
 
27
32
  Use database mode when you want the hosted collaborative app experience:
@@ -67,14 +67,6 @@ The app has three primary surfaces you'll spend time in:
67
67
 
68
68
  The dictionary is seeded by asking the agent: "import our dbt definitions" or "pull the metrics from our Notion handbook" and it does the work.
69
69
 
70
- ## Why it's interesting
71
-
72
- Three things make Analytics a good showcase of the framework:
73
-
74
- 1. **The data dictionary keeps SQL grounded.** The agent consults the dictionary before writing any query, so it uses real warehouse column names and honors documented caveats. The dictionary is itself an agent-native resource — seeded and edited through the same chat interface that runs the queries.
75
- 2. **Multi-source, single action surface.** BigQuery, GA4, Mixpanel, Amplitude, HubSpot, Jira, and a dozen other sources are each a single action file. Adding a new connector is adding a file; the agent picks it up automatically with no registration step.
76
- 3. **Reusable workspace integrations.** When a workspace already has a provider connected (e.g. HubSpot), Analytics requests a grant instead of requiring a second copy of the same credentials. The Data Sources page shows workspace-level readiness alongside local-credential status.
77
-
78
70
  ## For developers
79
71
 
80
72
  The rest of this doc is for anyone forking the Analytics template or extending it.
@@ -83,12 +83,6 @@ Generate and pick brand media without leaving Codex, Claude Code, Claude, or Cha
83
83
 
84
84
  4. **Apply to code.** The chosen Media URL and `assetId` come back to the agent, which uses the URL directly in the code it writes (an `<img>` src, a download) or calls `export-asset`.
85
85
 
86
- ## Why it's interesting
87
-
88
- Most AI media tools treat brand consistency as a prompt-writing problem. Assets treats it as application state: references, folders, collections, style briefs, run history, descriptions, and saved assets live in SQL, while binary media lives in object storage or the local file-upload fallback during development.
89
-
90
- Because generation and library management are actions and chat workflows, the UI and the agent share the same operations. A user can start from the big prompt box, a library detail page, another app's chat, or an A2A request from Slides, and the same audit and lineage model is preserved. Once enabled, the provider path prefers Builder-managed image generation so teams do not need to paste model-provider keys into every app.
91
-
92
86
  ## For developers
93
87
 
94
88
  The rest of this doc is for anyone forking the Assets template or extending it.
@@ -79,14 +79,6 @@ For a public demo, the seeded corpus demonstrates product-decision recall,
79
79
  citation links, supersede behavior, review gating, redaction, personal-content
80
80
  exclusion, and honest not-found behavior without connecting a real workspace.
81
81
 
82
- ## Why it's interesting
83
-
84
- Three things make Brain a good showcase of the framework:
85
-
86
- 1. **No vector database required.** Brain uses SQL text search with agentic query expansion, so it stays portable across SQLite, Postgres, Neon, D1, and Turso without an additional service dependency. This demonstrates that semantic-enough retrieval can be built without embedding infrastructure.
87
- 2. **Human-in-the-loop distillation.** Raw captures don't become company knowledge automatically. High-confidence entries can auto-publish; sensitive or low-confidence ones queue as proposals for human review. The Review surface is a first-class part of the product, not a settings screen.
88
- 3. **Shared workspace integrations.** Brain sources resolve credentials from workspace grants first, not duplicated env vars. It's a live example of the grant pattern — one Slack token at workspace level, per-app access requests.
89
-
90
82
  ## For developers
91
83
 
92
84
  The rest of this section is for anyone forking or extending the Brain template.
@@ -61,14 +61,6 @@ Or just ask the agent: "Create a 15-minute intro booking link with a name field.
61
61
 
62
62
  The agent will query Google Calendar live for any schedule question — it never guesses.
63
63
 
64
- ## Why it's interesting
65
-
66
- Three things make Calendar a good showcase of the framework:
67
-
68
- 1. **Live API queries, no local sync.** Events live in Google Calendar; the app queries the API on demand rather than maintaining a local mirror. This avoids stale data and webhook infrastructure while still giving the agent full read/write access through actions.
69
- 2. **Booking links as a Calendly replacement.** The public booking page (`/book/{slug}`) is stateless to visitors — it queries availability live and creates a booking on submit. The `booking_link_shares` table wires into the framework sharing primitive so teammates can manage links collaboratively.
70
- 3. **Multi-account overlay.** Connecting a second Google account is an action call; the UI overlays events from all connected calendars in the same view. This pattern — one row per account in `oauth_tokens`, list action that fans out — is reusable for any multi-account integration.
71
-
72
64
  ## For developers
73
65
 
74
66
  The rest of this doc is for anyone forking the Calendar template or extending it.
@@ -51,14 +51,6 @@ Live demo: [clips.agent-native.com](https://clips.agent-native.com).
51
51
  - "Create action items from the last sales call."
52
52
  - "Clean up this dictation and turn it into a Linear ticket."
53
53
 
54
- ## Why it's interesting
55
-
56
- Three things make Clips a good showcase of what agent-native enables:
57
-
58
- 1. **The agent edits the transcript.** Fix a mis-transcribed word, generate chapter timestamps, pull quotes for a blog post — all in natural language, in the chat, with the UI updating live via polling.
59
- 2. **Context awareness on recordings.** When you're viewing a clip, the agent knows the clip id, the current playhead, and the selected transcript range. Ask "summarize from here to the end" and it understands what "here" means.
60
- 3. **Clips you own, not a vendor.** The recordings live in your storage, the transcripts live in your SQL, and the agent is yours. Fork the template, change how chapters get built, wire it to your own CDN — it's your code.
61
-
62
54
  ## For developers
63
55
 
64
56
  The rest of this doc is for anyone forking the Clips template or extending it.
@@ -1,11 +1,15 @@
1
1
  ---
2
2
  title: "Content"
3
- description: "A Notion-style document editor with an AI agent that can read, write, reorganize, and publish your pages all in plain English."
3
+ description: "Open-source Obsidian for MDX: edit local Markdown/MDX files, generate rich interactive custom blocks, and write with an AI agent."
4
4
  ---
5
5
 
6
6
  # Content
7
7
 
8
- A Notion-style document workspace where the agent can read, write, reorganize, and publish pages for you. Open a doc, ask "rewrite this paragraph to be more concise" or "create a page called Q4 Planning with sub-pages for Goals, Metrics, and Risks" — same result whether you do it yourself or ask.
8
+ Content is open-source Obsidian for MDX: a local-file-friendly document
9
+ workspace where the agent can read, write, reorganize, and publish pages for
10
+ you. Open a doc, ask "rewrite this paragraph to be more concise" or "create a
11
+ page called Q4 Planning with sub-pages for Goals, Metrics, and Risks" - same
12
+ result whether you do it yourself or ask.
9
13
 
10
14
  <!-- screenshot:
11
15
  app: content
@@ -24,9 +28,13 @@ When you open the app, you'll see a sidebar tree of pages on the left, the edito
24
28
  - **Write rich text** with headings, lists, tables, code blocks, images, and links. Slash commands (`/`) insert blocks; selecting text pops up a formatting toolbar.
25
29
  - **Organize pages in a tree** — nest infinitely, drag to reorder, favorite pages you use often.
26
30
  - **Search across everything** with full-text search across titles and content.
27
- - **Sync with local Markdown/MDX files.** Use the `/local-files` view to export
28
- your workspace to files, edit them in your own tools, preview changes, and
29
- import them back.
31
+ - **Edit local Markdown/MDX files like Obsidian.** Use the `/local-files` view
32
+ to export your workspace to files, edit them in your own tools, preview
33
+ changes, and import them back. In Local File Mode, Content writes straight to
34
+ the selected `.md` or `.mdx` file.
35
+ - **Generate rich interactive custom blocks.** Register local React components,
36
+ insert them as MDX, and let the agent create or update component files for
37
+ your docs.
30
38
  - **Sync with Notion.** Link a local doc to a Notion page and pull or push content in either direction. Comments sync both ways too.
31
39
  - **Collaborate in real time.** Multiple people (and the agent) can edit the same doc at the same time.
32
40
  - **Share docs** with teammates or make them public — private by default, with viewer / editor / admin roles.
@@ -46,11 +54,13 @@ When you open the app, click **+ New page** in the sidebar, give it a title, and
46
54
 
47
55
  Select text and hit Cmd+I to focus the agent with that selection pre-loaded — "make this punchier" then operates on exactly what you highlighted.
48
56
 
49
- ## Local Markdown files {#local-files}
57
+ ## Local Markdown/MDX files {#local-files}
50
58
 
51
59
  Content can round-trip documents through local files without cloning or running
52
- the Content app locally. Open `/local-files`, choose a folder in your browser or
53
- Agent Native Desktop, and export the current document tree as Markdown/MDX under
60
+ the Content app locally. It feels like Obsidian for MDX: files stay inspectable
61
+ and editable, while the app gives you a rich editor, agent actions, sharing, and
62
+ custom blocks. Open `/local-files`, choose a folder in your browser or Agent
63
+ Native Desktop, and export the current document tree as Markdown/MDX under
54
64
  `content/`.
55
65
 
56
66
  Each exported file contains frontmatter for document metadata (`id`, `title`,
@@ -70,19 +80,11 @@ truth instead of SQL documents. Add `agent-native.json` to a repo, set
70
80
  `content/`, and `resources/`. The standard Content editor then populates its
71
81
  left sidebar from those local `.md`/`.mdx` files and writes edits back to the
72
82
  selected file through the normal document actions. Use this for repo-first docs,
73
- blogs, resource libraries, or Obsidian-style personal content; switch back to
74
- database mode when you want hosted collaboration and SQL-backed sharing. See
75
- [Local File Mode](/docs/local-file-mode) for the standalone repo layout,
76
- configuration, custom MDX components, local `extensions/` widgets, and
77
- production safety guide.
78
-
79
- ## Why it's interesting
80
-
81
- Three things make Content a good showcase of the framework:
82
-
83
- 1. **Agent and editor share one Yjs document.** The same CRDT that prevents conflicts between two simultaneous human typists is what the agent writes through via `edit-document`. There is no separate AI path — the diff appears live in every open browser tab.
84
- 2. **Notion sync as a two-way bridge.** Rather than replacing Notion, the template treats it as a peer: pull, push, bidirectional comment sync, conflict detection, and content-hash deduplication are all first-class. It demonstrates how agent-native apps can round-trip with external systems without losing their SQL-backed canonical form.
85
- 3. **Inline databases alongside prose.** The `content_databases` / `content_database_items` / `document_property_definitions` stack shows how structured tabular data can live inside an agent-native document without needing a separate app or a custom Airtable integration.
83
+ blogs, resource libraries, or Obsidian-style personal content with MDX-powered
84
+ components; switch back to database mode when you want hosted collaboration and
85
+ SQL-backed sharing. See [Local File Mode](/docs/local-file-mode) for the
86
+ standalone repo layout, configuration, custom MDX components, local
87
+ `extensions/` widgets, and production safety guide.
86
88
 
87
89
  ## For developers
88
90
 
@@ -172,8 +174,10 @@ Local file workspaces can also provide repo-local React components through the
172
174
  configured `components` folder. The Content dev server imports PascalCase
173
175
  exports from those files, renders matching MDX tags such as `<ImpactCounter />`
174
176
  inside the editor, and exposes them in the slash menu under Local components.
175
- This keeps custom MDX blocks local to the workspace without cloning the Content
176
- app. A minimal workspace component can be:
177
+ This is the "Obsidian for MDX" layer: custom MDX blocks stay local to the
178
+ workspace, but the editor can render them and the agent can generate or update
179
+ their source without cloning the Content app. A minimal workspace component can
180
+ be:
177
181
 
178
182
  ```tsx
179
183
  // components/ImpactCounter.tsx
@@ -41,12 +41,6 @@ Live demo: [design.agent-native.com](https://design.agent-native.com).
41
41
  - "Export this prototype as a ZIP once the final variant is selected."
42
42
  - "Turn this HTML into a stronger pricing page without changing the brand colors."
43
43
 
44
- ## Why it's interesting
45
-
46
- Design is useful because the agent edits an artifact that is already close to shippable web UI. There is no separate "AI mockup" format to translate later: the preview, the editable source, and the exported artifact all come from the same HTML.
47
-
48
- The template is also a good example of agent-native ownership. The app stores designs in SQL, exposes template operations as actions, and lets you fork the whole workflow when your team needs a different renderer, exporter, or design-system model.
49
-
50
44
  ## For developers
51
45
 
52
46
  The rest of this doc is for anyone forking the Design template or extending it.
@@ -49,16 +49,6 @@ Live demo: [forms.agent-native.com](https://forms.agent-native.com).
49
49
  - "Summarize this week's submissions and group them by customer segment."
50
50
  - "Make this form shorter without losing the fields we need for routing."
51
51
 
52
- ## Why it's interesting
53
-
54
- Three things make Forms a good showcase of the framework:
55
-
56
- 1. **Single SQL record, two editors.** The form's `fields` JSON column is the source of truth for both the visual builder and the agent. Ask the agent to add a field and the builder re-renders — no sync step, no separate "AI draft" state.
57
- 2. **Public and private surfaces from one schema.** The same form row serves authenticated editors (full field + settings access) and anonymous respondents (public fill page with secrets stripped). `toPublicFormSettings` handles the split at the action layer.
58
- 3. **Integrations as settings, not infrastructure.** Slack, Discord, Google Sheets, and webhook destinations are stored as JSON in the form's settings column and executed server-side at submission time — adding a new integration type is an action-layer change, not a schema migration.
59
-
60
- See [What is agent-native?](/docs/what-is-agent-native) for the broader framework model.
61
-
62
52
  ## For developers
63
53
 
64
54
  ### Scaffolding
@@ -82,14 +82,6 @@ If you select text and hit Cmd+I, that selection travels with your next message
82
82
  | `G A` | Go to Archive |
83
83
  | `Esc` | Close thread / clear search |
84
84
 
85
- ## Why it's interesting
86
-
87
- Three things make Mail a good showcase of the framework:
88
-
89
- 1. **Gmail as a view, not a copy.** Email lives in Gmail; the app is a fast keyboard-first view on top. Actions like `list-emails` and `search-emails` query the Gmail API live rather than maintaining a local sync — demonstrating how agent-native apps can wrap external services without duplicating state.
90
- 2. **Shared compose state between the agent and the UI.** Each draft tab is an `application_state` entry at `compose-{id}`. The agent can create, edit, or close drafts via `manage-draft`; the UI reads the same entry and renders it live. No separate draft format, no polling — same row.
91
- 3. **Queued-draft review.** Teammates or Slack users can ask the agent to prepare an email on behalf of an org member. The draft sits in the `queued_email_drafts` SQL table until the owner reviews and explicitly sends — demonstrating how agent-native apps can keep humans in the loop for consequential, irreversible actions.
92
-
93
85
  ## For developers
94
86
 
95
87
  The rest of this doc is for anyone forking the Mail template or extending it.
@@ -298,6 +298,186 @@ Actions in `templates/plan/actions/`:
298
298
  - **Prototype** — `convert-visual-plan-to-prototype`, `create-prototype-plan`
299
299
  - **Context & navigation** — `view-screen`, `navigate`
300
300
 
301
+ ### Custom MDX blocks {#custom-mdx-blocks}
302
+
303
+ Plans source files are MDX, but the app does not render arbitrary imported JSX
304
+ components. A custom MDX tag must be registered as a Plan block so the server can
305
+ parse and serialize it, the browser can render and edit it, and the agent can
306
+ see it in the block vocabulary returned by `get-plan-blocks`.
307
+
308
+ A registered block has three surfaces:
309
+
310
+ - A React-free schema and MDX config, safe for server and agent code.
311
+ - A normalized runtime type/schema entry in `shared/plan-content.ts`.
312
+ - A browser block spec with `Read` and optional `Edit` React components.
313
+
314
+ Keep the block `type` and MDX `tag` stable. The `type` is stored in normalized
315
+ plan JSON; the `tag` is the component name in `plan.mdx`. The registry handles
316
+ the base MDX attributes `id`, `title`, `summary`, and `editable`, so do not
317
+ repeat them in `toAttrs`.
318
+
319
+ 1. Add a shared config for the data shape and MDX round trip.
320
+
321
+ ```ts
322
+ // templates/plan/shared/risk-card.config.ts
323
+ import { z } from "zod";
324
+ import {
325
+ markdown,
326
+ type BlockMdxConfig,
327
+ } from "@agent-native/core/blocks/server";
328
+
329
+ export type RiskCardSeverity = "low" | "medium" | "high";
330
+
331
+ export interface RiskCardData {
332
+ severity?: RiskCardSeverity;
333
+ body: string;
334
+ }
335
+
336
+ const severities = new Set(["low", "medium", "high"]);
337
+
338
+ export const riskCardSchema = z.object({
339
+ severity: z.enum(["low", "medium", "high"]).optional(),
340
+ body: markdown(z.string().trim().min(1).max(10_000)),
341
+ }) as z.ZodType<RiskCardData>;
342
+
343
+ export const riskCardMdx: BlockMdxConfig<RiskCardData> = {
344
+ tag: "RiskCard",
345
+ childrenField: "body",
346
+ toAttrs: (data) => ({
347
+ severity: data.severity,
348
+ }),
349
+ fromAttrs: (attrs, children) => {
350
+ const severity = attrs.string("severity");
351
+
352
+ return {
353
+ severity: severities.has(severity ?? "")
354
+ ? (severity as RiskCardSeverity)
355
+ : undefined,
356
+ body: children,
357
+ };
358
+ },
359
+ };
360
+ ```
361
+
362
+ 2. Extend the normalized Plan content model in
363
+ `templates/plan/shared/plan-content.ts`.
364
+
365
+ Add the new `type` to `PlanBlockType`, add a matching block interface to the
366
+ `PlanBlock` union, and add the same data shape to `planBlockSchema`. This keeps
367
+ database saves, source imports, and `update-block` patches validating the custom
368
+ block instead of rejecting it as an unknown type.
369
+
370
+ 3. Register the React-free server spec in
371
+ `templates/plan/shared/plan-block-registry.ts`.
372
+
373
+ ```ts
374
+ import {
375
+ BlockRegistry,
376
+ defineBlock,
377
+ registerLibraryBlockConfigs,
378
+ registerBlocks,
379
+ } from "@agent-native/core/blocks/server";
380
+ import {
381
+ riskCardMdx,
382
+ riskCardSchema,
383
+ type RiskCardData,
384
+ } from "./risk-card.config.js";
385
+
386
+ const ServerReadStub = () => null;
387
+
388
+ const riskCardServerBlock = defineBlock<RiskCardData>({
389
+ type: "risk-card",
390
+ schema: riskCardSchema,
391
+ mdx: riskCardMdx,
392
+ Read: ServerReadStub,
393
+ placement: ["block"],
394
+ label: "Risk card",
395
+ description: "A markdown risk note with a low, medium, or high severity.",
396
+ });
397
+
398
+ export function registerPlanBlocks(registry: BlockRegistry): void {
399
+ registerLibraryBlockConfigs(registry, {
400
+ overrides: PLAN_SERVER_LIBRARY_OVERRIDES,
401
+ });
402
+ registerBlocks(registry, [riskCardServerBlock]);
403
+ }
404
+ ```
405
+
406
+ 4. Register the browser spec in
407
+ `templates/plan/app/components/plan/planBlocks.tsx`.
408
+
409
+ ```tsx
410
+ import {
411
+ defineBlock,
412
+ registerLibraryBlocks,
413
+ registerBlocks,
414
+ type BlockReadProps,
415
+ } from "@agent-native/core/blocks";
416
+ import {
417
+ riskCardMdx,
418
+ riskCardSchema,
419
+ type RiskCardData,
420
+ } from "@shared/risk-card.config";
421
+
422
+ function RiskCardBlock({ data, blockId, ctx }: BlockReadProps<RiskCardData>) {
423
+ return (
424
+ <section
425
+ className="rounded-md border border-border bg-card p-4"
426
+ data-block-id={blockId}
427
+ data-severity={data.severity}
428
+ >
429
+ <div className="mb-2 text-xs font-semibold uppercase text-muted-foreground">
430
+ {data.severity ?? "risk"}
431
+ </div>
432
+ {ctx.renderMarkdown?.(data.body) ?? (
433
+ <p className="whitespace-pre-wrap text-sm">{data.body}</p>
434
+ )}
435
+ </section>
436
+ );
437
+ }
438
+
439
+ const riskCardBlock = defineBlock<RiskCardData>({
440
+ type: "risk-card",
441
+ schema: riskCardSchema,
442
+ mdx: riskCardMdx,
443
+ Read: RiskCardBlock,
444
+ placement: ["block"],
445
+ editSurface: "panel",
446
+ label: "Risk card",
447
+ description: "A markdown risk note with a low, medium, or high severity.",
448
+ empty: () => ({ severity: "medium", body: "Describe the risk." }),
449
+ });
450
+
451
+ registerLibraryBlocks(planBlockRegistry, {
452
+ overrides: PLAN_LIBRARY_OVERRIDES,
453
+ });
454
+ registerBlocks(planBlockRegistry, [riskCardBlock]);
455
+ ```
456
+
457
+ With that in place, Plan MDX can use:
458
+
459
+ ```mdx
460
+ <RiskCard id="risk-auth" severity="high">
461
+
462
+ Token refresh failures can strand active reviewer sessions.
463
+
464
+ </RiskCard>
465
+ ```
466
+
467
+ The server registry makes this source importable/exportable, and the client
468
+ registry makes it render in `PlanBlockView`. If the block should be generated by
469
+ agents, keep `label`, `description`, `placement`, and `empty` precise; those
470
+ fields flow into the live block vocabulary.
471
+
472
+ When overriding an existing block, register the override after the shared
473
+ library registration. Last registration wins for both `type` and MDX `tag`.
474
+
475
+ After adding a block, run focused Plan tests:
476
+
477
+ ```bash
478
+ pnpm --filter plan test -- plan-mdx plan-block-registry
479
+ ```
480
+
301
481
  ### Route map
302
482
 
303
483
  - `app/routes/plans.$id.tsx` — plan editor / review surface
@@ -54,14 +54,6 @@ When you open the app:
54
54
 
55
55
  Select text on a slide and hit Cmd+I to focus the agent with that selection — it'll act only on what you selected.
56
56
 
57
- ## Why it's interesting
58
-
59
- Three things make Slides a good showcase of the framework:
60
-
61
- 1. **Streamed, parallel generation.** The agent fires parallel `add-slide` calls so you see the deck assemble in real time — one slide at a time — rather than waiting for a full batch. That pattern works for any content type that benefits from progressive rendering.
62
- 2. **Agent and editor share one document.** The same Yjs CRDT that lets two humans type concurrently is what the agent writes through via `update-slide --find/--replace`. There is no separate "AI-only" edit path.
63
- 3. **Multi-modal source ingestion.** PPTX, DOCX, Google Docs, PDFs, URLs, and GitHub repos all feed through the same `import-*` action surface. Adding a new source format is a single action file; the agent picks it up immediately.
64
-
65
57
  ## For developers
66
58
 
67
59
  The rest of this doc is for anyone forking the Slides template or extending it.
@@ -52,14 +52,6 @@ When you open the studio:
52
52
 
53
53
  If you select a track in the timeline and hit Cmd+I, the agent picks up that selection — "make this one snappier" just works.
54
54
 
55
- ## Why it's interesting
56
-
57
- Three things make the Video template a good showcase of the framework:
58
-
59
- 1. **Code as the authoring format.** Each composition is a React component, so the agent can write entirely new animation types — not just adjust parameters. The template demonstrates that an agent-native app can treat source code as a first-class editable artifact rather than a fixed runtime.
60
- 2. **Track-based animation as structured data.** Animations are `AnimationTrack` rows (start, end, easing, animated props) rather than hardcoded frame checks. This makes AI edits ("shift this track 10 frames later") reliable and composable without touching render logic.
61
- 3. **SQL + localStorage fusion.** User-created compositions persist in SQL; per-session tweaks (easing experiments, parameter knobs) persist in localStorage and deep-merge on load. This two-layer approach shows how to keep the agent's durable state separate from ephemeral in-session exploration.
62
-
63
55
  ## For developers
64
56
 
65
57
  The rest of this doc is for anyone forking the Video template or extending it. This template is more code-forward than the others — every composition is a React component and every animation is data on a track.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.51.5",
3
+ "version": "0.51.7",
4
4
  "type": "module",
5
5
  "engines": {
6
6
  "node": ">=22"
@@ -108,6 +108,8 @@
108
108
  "./usage": "./dist/usage/store.js",
109
109
  "./connections": "./dist/connections/index.js",
110
110
  "./provider-api": "./dist/provider-api/index.js",
111
+ "./provider-api/corpus-jobs": "./dist/provider-api/corpus-jobs.js",
112
+ "./provider-api/corpus-jobs-store": "./dist/provider-api/corpus-jobs-store.js",
111
113
  "./provider-api/staging": "./dist/provider-api/staging.js",
112
114
  "./provider-api/staged-datasets-store": "./dist/provider-api/staged-datasets-store.js",
113
115
  "./provider-api/staged-datasets-aggregate": "./dist/provider-api/staged-datasets-aggregate.js",