@ignite-agent/agent 0.1.0 → 0.4.1

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 (66) hide show
  1. package/AI.txt +7 -0
  2. package/LICENSE +57 -4
  3. package/README.md +194 -12
  4. package/dist/cli/index.js +105 -21
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/cli/project.d.ts +39 -0
  7. package/dist/cli/project.js +276 -0
  8. package/dist/cli/project.js.map +1 -0
  9. package/dist/client-public.d.ts +2 -0
  10. package/dist/client-public.js +3 -0
  11. package/dist/client-public.js.map +1 -0
  12. package/dist/client.d.ts +3 -1
  13. package/dist/client.js +7 -0
  14. package/dist/client.js.map +1 -1
  15. package/dist/env.js +1 -2
  16. package/dist/env.js.map +1 -1
  17. package/dist/ignite.css +228 -0
  18. package/dist/index.d.ts +9 -3
  19. package/dist/index.js +8 -2
  20. package/dist/index.js.map +1 -1
  21. package/dist/mcp.d.ts +22 -0
  22. package/dist/mcp.js +88 -0
  23. package/dist/mcp.js.map +1 -0
  24. package/dist/operator/blog.d.ts +21 -0
  25. package/dist/operator/blog.js +32 -0
  26. package/dist/operator/blog.js.map +1 -0
  27. package/dist/operator/card.d.ts +5 -0
  28. package/dist/operator/card.js +11 -0
  29. package/dist/operator/card.js.map +1 -0
  30. package/dist/operator/jsonld.d.ts +6 -0
  31. package/dist/operator/jsonld.js +6 -3
  32. package/dist/operator/jsonld.js.map +1 -1
  33. package/dist/operator/metadata.d.ts +1 -0
  34. package/dist/operator/metadata.js +1 -0
  35. package/dist/operator/metadata.js.map +1 -1
  36. package/dist/operator/page.d.ts +17 -0
  37. package/dist/operator/page.js +51 -0
  38. package/dist/operator/page.js.map +1 -0
  39. package/dist/operator/prose.d.ts +19 -0
  40. package/dist/operator/prose.js +26 -0
  41. package/dist/operator/prose.js.map +1 -0
  42. package/dist/operator/proxy.d.ts +2 -0
  43. package/dist/operator/proxy.js +43 -22
  44. package/dist/operator/proxy.js.map +1 -1
  45. package/dist/operator/robots.d.ts +1 -0
  46. package/dist/operator/robots.js +1 -0
  47. package/dist/operator/robots.js.map +1 -1
  48. package/dist/operator/sitemap-merge.d.ts +10 -0
  49. package/dist/operator/sitemap-merge.js +56 -0
  50. package/dist/operator/sitemap-merge.js.map +1 -0
  51. package/dist/operator/sitemap.d.ts +5 -1
  52. package/dist/operator/sitemap.js +28 -17
  53. package/dist/operator/sitemap.js.map +1 -1
  54. package/dist/operator/ui.d.ts +44 -0
  55. package/dist/operator/ui.js +477 -0
  56. package/dist/operator/ui.js.map +1 -0
  57. package/dist/operator/wiki.d.ts +21 -0
  58. package/dist/operator/wiki.js +41 -0
  59. package/dist/operator/wiki.js.map +1 -0
  60. package/dist/types.d.ts +39 -0
  61. package/onboarding/CLAUDE-CODE-SETUP.md +52 -18
  62. package/onboarding/CURSOR-SETUP.md +73 -0
  63. package/onboarding/LOVABLE-SETUP.md +76 -0
  64. package/onboarding/MIGRATE-EXISTING.md +94 -0
  65. package/onboarding/REPLIT-SETUP.md +76 -0
  66. package/package.json +32 -9
package/dist/mcp.js ADDED
@@ -0,0 +1,88 @@
1
+ import { createInterface } from 'node:readline';
2
+ import { IgniteClient } from './client.js';
3
+ const TOOLS = [
4
+ {
5
+ name: 'list_pages',
6
+ description: 'List published wiki and blog pages from the Ignite feed (no drafts).',
7
+ inputSchema: { type: 'object', properties: {}, additionalProperties: false },
8
+ },
9
+ {
10
+ name: 'get_page',
11
+ description: 'Fetch one published page body by slug.',
12
+ inputSchema: {
13
+ type: 'object',
14
+ properties: { slug: { type: 'string' } },
15
+ required: ['slug'],
16
+ additionalProperties: false,
17
+ },
18
+ },
19
+ {
20
+ name: 'get_directives',
21
+ description: 'Fetch robots, sitemap, JSON-LD, and metadata directives for this site.',
22
+ inputSchema: { type: 'object', properties: {}, additionalProperties: false },
23
+ },
24
+ ];
25
+ export async function handleMcp(msg, client) {
26
+ if (msg.id === undefined || msg.id === null)
27
+ return null;
28
+ const id = msg.id;
29
+ try {
30
+ switch (msg.method) {
31
+ case 'initialize':
32
+ return {
33
+ jsonrpc: '2.0',
34
+ id,
35
+ result: {
36
+ protocolVersion: '2024-11-05',
37
+ capabilities: { tools: {} },
38
+ serverInfo: { name: 'ignite-feed', version: '0.1.1' },
39
+ },
40
+ };
41
+ case 'tools/list':
42
+ return { jsonrpc: '2.0', id, result: { tools: TOOLS } };
43
+ case 'tools/call':
44
+ return { jsonrpc: '2.0', id, result: await callTool(client, msg.params) };
45
+ case 'notifications/initialized':
46
+ case 'ping':
47
+ return { jsonrpc: '2.0', id, result: {} };
48
+ default:
49
+ return { jsonrpc: '2.0', id, error: { code: -32601, message: `Unknown method ${msg.method ?? ''}` } };
50
+ }
51
+ }
52
+ catch (error) {
53
+ return { jsonrpc: '2.0', id, error: { code: -32000, message: error.message } };
54
+ }
55
+ }
56
+ async function callTool(client, params) {
57
+ const name = params?.name ?? '';
58
+ const args = params?.arguments ?? {};
59
+ let payload;
60
+ if (name === 'list_pages')
61
+ payload = await client.pages();
62
+ else if (name === 'get_page')
63
+ payload = await client.page(String(args.slug ?? ''));
64
+ else if (name === 'get_directives')
65
+ payload = await client.directives();
66
+ else
67
+ throw new Error(`Unknown tool ${name}`);
68
+ return { content: [{ type: 'text', text: JSON.stringify(payload) }] };
69
+ }
70
+ export async function runMcpStdio() {
71
+ const client = IgniteClient.fromEnv();
72
+ const rl = createInterface({ input: process.stdin });
73
+ for await (const line of rl) {
74
+ if (!line.trim())
75
+ continue;
76
+ let msg;
77
+ try {
78
+ msg = JSON.parse(line);
79
+ }
80
+ catch {
81
+ continue;
82
+ }
83
+ const res = await handleMcp(msg, client);
84
+ if (res)
85
+ process.stdout.write(`${JSON.stringify(res)}\n`);
86
+ }
87
+ }
88
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import 'server-only';
2
+ import type { Metadata } from 'next';
3
+ import { FeedArticle, feedPageMetadata, feedPagesOfKind, revalidate, tryLoadFeedPage } from './page.js';
4
+ import { type IgniteTokens } from './ui.js';
5
+ export { revalidate, FeedArticle, feedPageMetadata, tryLoadFeedPage, feedPagesOfKind };
6
+ export { pageJsonLd, feedMetadata, mergeSlugs } from './ui.js';
7
+ export { FeedJsonLd } from './jsonld.js';
8
+ export { IgniteProse, IgniteTokensProvider, type IgniteTokens } from './prose.js';
9
+ type SlugParams = {
10
+ params: Promise<{
11
+ slug: string;
12
+ }>;
13
+ };
14
+ export declare function generateStaticParams(): Promise<Array<{
15
+ slug: string;
16
+ }>>;
17
+ export declare function generateMetadata({ params }: SlugParams): Promise<Metadata>;
18
+ export default function BlogPage({ params }: SlugParams): Promise<import("react").JSX.Element>;
19
+ export declare function BlogIndex({ tokens }?: {
20
+ tokens?: IgniteTokens | undefined;
21
+ }): Promise<import("react").JSX.Element | null>;
@@ -0,0 +1,32 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import 'server-only';
3
+ import { notFound } from 'next/navigation';
4
+ import { FeedCard } from './card.js';
5
+ import { FeedArticle, feedPageMetadata, feedPagesOfKind, revalidate, tryLoadFeedPage, } from './page.js';
6
+ import { IgniteFrame } from './prose.js';
7
+ export { revalidate, FeedArticle, feedPageMetadata, tryLoadFeedPage, feedPagesOfKind };
8
+ export { pageJsonLd, feedMetadata, mergeSlugs } from './ui.js';
9
+ export { FeedJsonLd } from './jsonld.js';
10
+ export { IgniteProse, IgniteTokensProvider } from './prose.js';
11
+ export async function generateStaticParams() {
12
+ return (await feedPagesOfKind('article')).map((page) => ({ slug: page.slug }));
13
+ }
14
+ export async function generateMetadata({ params }) {
15
+ const { slug } = await params;
16
+ const page = await tryLoadFeedPage('article', slug);
17
+ return page ? feedPageMetadata(page) : {};
18
+ }
19
+ export default async function BlogPage({ params }) {
20
+ const { slug } = await params;
21
+ const page = await tryLoadFeedPage('article', slug);
22
+ if (!page)
23
+ notFound();
24
+ return _jsx(FeedArticle, { page: page });
25
+ }
26
+ export async function BlogIndex({ tokens } = {}) {
27
+ const pages = await feedPagesOfKind('article');
28
+ if (pages.length === 0)
29
+ return null;
30
+ return (_jsxs(IgniteFrame, { tokens: tokens, children: [_jsx("h1", { className: "ignite-index-title", children: "Blog" }), _jsx("div", { className: "ignite-cards", children: pages.map((page) => (_jsx(FeedCard, { page: page }, page.slug))) })] }));
31
+ }
32
+ //# sourceMappingURL=blog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blog.js","sourceRoot":"","sources":["../../src/operator/blog.tsx"],"names":[],"mappings":";AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAI3C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,eAAe,GAChB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,CAAC;AACvF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAqB,MAAM,YAAY,CAAC;AAIlF,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,OAAO,CAAC,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EAAE,MAAM,EAAc;IAC3D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACpD,OAAO,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,QAAQ,CAAC,EAAE,MAAM,EAAc;IAC3D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACpD,IAAI,CAAC,IAAI;QAAE,QAAQ,EAAE,CAAC;IACtB,OAAO,KAAC,WAAW,IAAC,IAAI,EAAE,IAAI,GAAI,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,EAAE,MAAM,KAA4C,EAAE;IACpF,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,CACL,MAAC,WAAW,IAAC,MAAM,EAAE,MAAM,aACzB,aAAI,SAAS,EAAC,oBAAoB,qBAAU,EAC5C,cAAK,SAAS,EAAC,cAAc,YAC1B,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,KAAC,QAAQ,IAAC,IAAI,EAAE,IAAI,IAAO,IAAI,CAAC,IAAI,CAAI,CACzC,CAAC,GACE,IACM,CACf,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import 'server-only';
2
+ import type { FeedPage } from '../types.js';
3
+ export declare function FeedCard({ page }: {
4
+ page: FeedPage;
5
+ }): import("react").JSX.Element;
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import 'server-only';
3
+ import { formatFeedDate, pageHero, plainExcerpt, publicPublishedAt } from './ui.js';
4
+ export function FeedCard({ page }) {
5
+ const excerpt = page.excerpt?.trim() || plainExcerpt(page.html);
6
+ const date = formatFeedDate(publicPublishedAt(page) ?? page.updatedAt);
7
+ const author = page.author?.name;
8
+ const image = pageHero(page);
9
+ return (_jsxs("a", { className: "ignite-card", href: page.path, children: [image?.url ? (_jsx("img", { className: "ignite-card-image", src: image.url, alt: image.alt ?? page.title })) : null, _jsx("h2", { className: "ignite-card-title", children: page.title }), author || date ? (_jsxs("p", { className: "ignite-card-meta", children: [author, author && date ? ' · ' : null, date] })) : null, excerpt ? _jsx("p", { className: "ignite-card-excerpt", children: excerpt }) : null] }));
10
+ }
11
+ //# sourceMappingURL=card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card.js","sourceRoot":"","sources":["../../src/operator/card.tsx"],"names":[],"mappings":";AAAA,OAAO,aAAa,CAAC;AAGrB,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEpF,MAAM,UAAU,QAAQ,CAAC,EAAE,IAAI,EAAsB;IACnD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,cAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;IACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE7B,OAAO,CACL,aAAG,SAAS,EAAC,aAAa,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,aACvC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CACZ,cAAK,SAAS,EAAC,mBAAmB,EAAC,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,GAAI,CACpF,CAAC,CAAC,CAAC,IAAI,EACR,aAAI,SAAS,EAAC,mBAAmB,YAAE,IAAI,CAAC,KAAK,GAAM,EAClD,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAChB,aAAG,SAAS,EAAC,kBAAkB,aAC5B,MAAM,EACN,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAC7B,IAAI,IACH,CACL,CAAC,CAAC,CAAC,IAAI,EACP,OAAO,CAAC,CAAC,CAAC,YAAG,SAAS,EAAC,qBAAqB,YAAE,OAAO,GAAK,CAAC,CAAC,CAAC,IAAI,IAChE,CACL,CAAC;AACJ,CAAC"}
@@ -1 +1,7 @@
1
+ import 'server-only';
2
+ import type { FeedPage } from '../types.js';
3
+ import { type FeedUrlOptions } from './ui.js';
1
4
  export declare function IgniteJsonLd(): Promise<React.JSX.Element | null>;
5
+ export declare function FeedJsonLd({ page, siteUrl }: {
6
+ page: FeedPage;
7
+ } & FeedUrlOptions): import("react").JSX.Element;
@@ -1,5 +1,7 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import 'server-only';
2
3
  import { IgniteClient } from '../client.js';
4
+ import { jsonLdScript, pageJsonLd } from './ui.js';
3
5
  // Drop into `app/layout.tsx`: import { IgniteJsonLd } from '@ignite-agent/agent/jsonld' then render <IgniteJsonLd />
4
6
  // An async server component that emits ld+json for the site. Renders nothing when unconfigured or unreachable.
5
7
  export async function IgniteJsonLd() {
@@ -15,8 +17,9 @@ export async function IgniteJsonLd() {
15
17
  }
16
18
  if (blocks.length === 0)
17
19
  return null;
18
- return (_jsx(_Fragment, { children: blocks.map((block, i) => (_jsx("script", { type: "application/ld+json",
19
- // JSON.stringify output is embedded as-is; escape the sequence that could close the script early.
20
- dangerouslySetInnerHTML: { __html: JSON.stringify(block).replace(/</g, '\\u003c') } }, i))) }));
20
+ return (_jsx(_Fragment, { children: blocks.map((block, i) => (_jsx("script", { type: "application/ld+json", dangerouslySetInnerHTML: { __html: jsonLdScript(block) } }, i))) }));
21
+ }
22
+ export function FeedJsonLd({ page, siteUrl }) {
23
+ return (_jsx("script", { type: "application/ld+json", dangerouslySetInnerHTML: { __html: jsonLdScript(pageJsonLd(page, { siteUrl })) } }));
21
24
  }
22
25
  //# sourceMappingURL=jsonld.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"jsonld.js","sourceRoot":"","sources":["../../src/operator/jsonld.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,uHAAuH;AACvH,+GAA+G;AAC/G,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,IAAI,MAAM,GAA8B,EAAE,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,OAAO,CACL,4BACG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CACxB,iBAEE,IAAI,EAAC,qBAAqB;YAC1B,kGAAkG;YAClG,uBAAuB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,IAH9E,CAAC,CAIN,CACH,CAAC,GACD,CACJ,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"jsonld.js","sourceRoot":"","sources":["../../src/operator/jsonld.tsx"],"names":[],"mappings":";AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAuB,MAAM,SAAS,CAAC;AAExE,uHAAuH;AACvH,+GAA+G;AAC/G,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,IAAI,MAAM,GAA8B,EAAE,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,OAAO,CACL,4BACG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CACxB,iBAAgB,IAAI,EAAC,qBAAqB,EAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,IAAtF,CAAC,CAAyF,CACxG,CAAC,GACD,CACJ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAE,IAAI,EAAE,OAAO,EAAuC;IAC/E,OAAO,CACL,iBAAQ,IAAI,EAAC,qBAAqB,EAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,GAAI,CACxH,CAAC;AACJ,CAAC"}
@@ -1,2 +1,3 @@
1
+ import 'server-only';
1
2
  import type { Metadata } from 'next';
2
3
  export declare function igniteMetadata(path: string): Promise<Metadata>;
@@ -1,3 +1,4 @@
1
+ import 'server-only';
1
2
  import { IgniteClient } from '../client.js';
2
3
  // Use inside `generateMetadata`: export async function generateMetadata() { return igniteMetadata('/pricing') }
3
4
  // Merge with your own values by spreading: { ...(await igniteMetadata(path)), title: 'override' }
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/operator/metadata.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,iHAAiH;AACjH,kGAAkG;AAClG,yFAAyF;AACzF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAEvB,IAAI,SAAS,CAAC;IACd,IAAI,CAAC;QACH,SAAS,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAE1B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,SAAS,CAAC,KAAK;QAAE,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;IACtD,IAAI,SAAS,CAAC,WAAW;QAAE,QAAQ,CAAC,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC;IACxE,IAAI,SAAS,CAAC,SAAS;QAAE,QAAQ,CAAC,UAAU,GAAG,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC;IAClF,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;QACxB,QAAQ,CAAC,SAAS,GAAG;YACnB,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1E,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5F,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9E,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/operator/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAIrB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,iHAAiH;AACjH,kGAAkG;AAClG,yFAAyF;AACzF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAEvB,IAAI,SAAS,CAAC;IACd,IAAI,CAAC;QACH,SAAS,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAE1B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,SAAS,CAAC,KAAK;QAAE,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;IACtD,IAAI,SAAS,CAAC,WAAW;QAAE,QAAQ,CAAC,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC;IACxE,IAAI,SAAS,CAAC,SAAS;QAAE,QAAQ,CAAC,UAAU,GAAG,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC;IAClF,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;QACxB,QAAQ,CAAC,SAAS,GAAG;YACnB,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1E,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5F,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9E,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import 'server-only';
2
+ import type { Metadata } from 'next';
3
+ import type { FeedPage } from '../types.js';
4
+ import { type FeedUrlOptions, type IgniteTokens } from './ui.js';
5
+ export { IgniteProse, IgniteTokensProvider, type IgniteTokens } from './prose.js';
6
+ export { pageJsonLd, feedMetadata } from './ui.js';
7
+ export { FeedJsonLd } from './jsonld.js';
8
+ export declare const revalidate = 60;
9
+ export declare function feedPagesOfKind(kind: FeedPage['kind']): Promise<FeedPage[]>;
10
+ export declare function tryLoadFeedPage(kind: FeedPage['kind'], slug: string): Promise<FeedPage | null>;
11
+ export declare function feedPageMetadata(page: FeedPage, options?: FeedUrlOptions): Metadata;
12
+ export declare function FeedArticle({ page, tokens, indexHref, siteUrl, }: {
13
+ page: FeedPage;
14
+ tokens?: IgniteTokens | undefined;
15
+ indexHref?: string | undefined;
16
+ siteUrl?: string | undefined;
17
+ }): import("react").JSX.Element;
@@ -0,0 +1,51 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import 'server-only';
3
+ import { IgniteApiError, IgniteClient } from '../client.js';
4
+ import { FeedJsonLd } from './jsonld.js';
5
+ import { IgniteFrame } from './prose.js';
6
+ import { feedMetadata, formatFeedDate, kindIndexPath, kindLabel, pageHero, publicModifiedAt, publicPublishedAt, } from './ui.js';
7
+ export { IgniteProse, IgniteTokensProvider } from './prose.js';
8
+ export { pageJsonLd, feedMetadata } from './ui.js';
9
+ export { FeedJsonLd } from './jsonld.js';
10
+ export const revalidate = 60;
11
+ export async function feedPagesOfKind(kind) {
12
+ const client = IgniteClient.fromEnvOrNull();
13
+ if (!client)
14
+ return [];
15
+ try {
16
+ const { pages } = await client.pages();
17
+ return pages.filter((page) => page.kind === kind);
18
+ }
19
+ catch {
20
+ return [];
21
+ }
22
+ }
23
+ export async function tryLoadFeedPage(kind, slug) {
24
+ const client = IgniteClient.fromEnvOrNull();
25
+ if (!client)
26
+ return null;
27
+ try {
28
+ const page = await client.page(slug);
29
+ return page.kind === kind ? page : null;
30
+ }
31
+ catch (error) {
32
+ if (error instanceof IgniteApiError && error.status === 404)
33
+ return null;
34
+ throw error;
35
+ }
36
+ }
37
+ export function feedPageMetadata(page, options) {
38
+ return feedMetadata(page, options);
39
+ }
40
+ export function FeedArticle({ page, tokens, indexHref, siteUrl, }) {
41
+ const index = indexHref ?? kindIndexPath(page.kind);
42
+ const published = formatFeedDate(publicPublishedAt(page));
43
+ const modified = formatFeedDate(publicModifiedAt(page));
44
+ const reviewed = formatFeedDate(page.lastReviewed);
45
+ const kind = kindLabel(page.kind);
46
+ const parent = page.parent;
47
+ const author = page.author;
48
+ const image = pageHero(page);
49
+ return (_jsxs(IgniteFrame, { tokens: tokens, children: [_jsx(FeedJsonLd, { page: page, siteUrl: siteUrl }), _jsxs("article", { className: "ignite-article", children: [_jsxs("nav", { className: "ignite-kicker", "aria-label": "Breadcrumb", children: [_jsx("a", { href: index, children: page.kind === 'article' ? 'Blog' : 'Wiki' }), parent ? (_jsxs(_Fragment, { children: [_jsx("span", { "aria-hidden": "true", children: "/" }), _jsx("a", { href: parent.path, children: parent.title })] })) : null] }), image?.url ? (_jsxs("figure", { className: "ignite-hero", children: [_jsx("img", { src: image.url, alt: image.alt ?? page.title, ...(image.width ? { width: image.width } : {}), ...(image.height ? { height: image.height } : {}) }), image.alt && image.alt !== page.title ? _jsx("figcaption", { children: image.alt }) : null] })) : null, _jsx("h1", { className: "ignite-title", children: page.title }), _jsxs("p", { className: "ignite-meta", children: [author?.image ? (_jsx("img", { className: "ignite-avatar", src: author.image, alt: author.name, width: 24, height: 24 })) : null, kind, author?.name ? (_jsxs(_Fragment, { children: [' · ', author.url ? _jsx("a", { href: author.url, children: author.name }) : author.name] })) : null, published ? ` · ${published}` : null, modified && modified !== published ? ` · Updated ${modified}` : null, reviewed ? ` · Reviewed ${reviewed}` : null] }), _jsx("div", { className: "ignite-prose", dangerouslySetInnerHTML: { __html: page.html } })] })] }));
50
+ }
51
+ //# sourceMappingURL=page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/operator/page.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import 'server-only';
2
+ import { type ReactNode } from 'react';
3
+ import { type IgniteTokens } from './ui.js';
4
+ export type { IgniteTokens };
5
+ export declare function IgniteTokensProvider({ tokens, children, }: {
6
+ tokens: IgniteTokens;
7
+ children: ReactNode;
8
+ }): import("react").JSX.Element;
9
+ export declare function IgniteProse({ html, children, tokens, injectCss, }: {
10
+ html?: string | undefined;
11
+ children?: ReactNode;
12
+ tokens?: IgniteTokens | undefined;
13
+ injectCss?: boolean | undefined;
14
+ }): import("react").JSX.Element;
15
+ export declare function IgniteFrame({ tokens, children, injectCss, }: {
16
+ tokens?: IgniteTokens | undefined;
17
+ children: ReactNode;
18
+ injectCss?: boolean | undefined;
19
+ }): import("react").JSX.Element;
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import 'server-only';
3
+ import { createContext, useContext } from 'react';
4
+ import { IGNITE_CSS, tokensToStyle } from './ui.js';
5
+ const IgniteTokensContext = createContext(undefined);
6
+ export function IgniteTokensProvider({ tokens, children, }) {
7
+ return _jsx(IgniteTokensContext.Provider, { value: tokens, children: children });
8
+ }
9
+ function useResolvedTokens(override) {
10
+ const ctx = useContext(IgniteTokensContext);
11
+ if (!override)
12
+ return ctx;
13
+ return ctx ? { ...ctx, ...override } : override;
14
+ }
15
+ function IgniteStyles() {
16
+ return (_jsx("style", { href: "ignite-ui", precedence: "medium", children: IGNITE_CSS }));
17
+ }
18
+ export function IgniteProse({ html, children, tokens, injectCss = true, }) {
19
+ const style = tokensToStyle(useResolvedTokens(tokens));
20
+ return (_jsxs("div", { className: "ignite ignite-prose", style: style, children: [injectCss ? _jsx(IgniteStyles, {}) : null, html ? _jsx("div", { dangerouslySetInnerHTML: { __html: html } }) : children] }));
21
+ }
22
+ export function IgniteFrame({ tokens, children, injectCss = true, }) {
23
+ const style = tokensToStyle(useResolvedTokens(tokens));
24
+ return (_jsxs("div", { className: "ignite", style: style, children: [injectCss ? _jsx(IgniteStyles, {}) : null, children] }));
25
+ }
26
+ //# sourceMappingURL=prose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prose.js","sourceRoot":"","sources":["../../src/operator/prose.tsx"],"names":[],"mappings":";AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,aAAa,EAAE,UAAU,EAAsC,MAAM,OAAO,CAAC;AAEtF,OAAO,EAAE,UAAU,EAAE,aAAa,EAAqB,MAAM,SAAS,CAAC;AAIvE,MAAM,mBAAmB,GAAG,aAAa,CAA2B,SAAS,CAAC,CAAC;AAE/E,MAAM,UAAU,oBAAoB,CAAC,EACnC,MAAM,EACN,QAAQ,GAIT;IACC,OAAO,KAAC,mBAAmB,CAAC,QAAQ,IAAC,KAAK,EAAE,MAAM,YAAG,QAAQ,GAAgC,CAAC;AAChG,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAmC;IAC5D,MAAM,GAAG,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAC;IAC5C,IAAI,CAAC,QAAQ;QAAE,OAAO,GAAG,CAAC;IAC1B,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;AAClD,CAAC;AAED,SAAS,YAAY;IACnB,OAAO,CACL,gBAAO,IAAI,EAAC,WAAW,EAAC,UAAU,EAAC,QAAQ,YACxC,UAAU,GACL,CACT,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,SAAS,GAAG,IAAI,GAMjB;IACC,MAAM,KAAK,GAAG,aAAa,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAA8B,CAAC;IACpF,OAAO,CACL,eAAK,SAAS,EAAC,qBAAqB,EAAC,KAAK,EAAE,KAAK,aAC9C,SAAS,CAAC,CAAC,CAAC,KAAC,YAAY,KAAG,CAAC,CAAC,CAAC,IAAI,EACnC,IAAI,CAAC,CAAC,CAAC,cAAK,uBAAuB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAI,CAAC,CAAC,CAAC,QAAQ,IACjE,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAC1B,MAAM,EACN,QAAQ,EACR,SAAS,GAAG,IAAI,GAKjB;IACC,MAAM,KAAK,GAAG,aAAa,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAA8B,CAAC;IACpF,OAAO,CACL,eAAK,SAAS,EAAC,QAAQ,EAAC,KAAK,EAAE,KAAK,aACjC,SAAS,CAAC,CAAC,CAAC,KAAC,YAAY,KAAG,CAAC,CAAC,CAAC,IAAI,EACnC,QAAQ,IACL,CACP,CAAC;AACJ,CAAC"}
@@ -1,5 +1,7 @@
1
+ import 'server-only';
1
2
  import { type NextRequest, NextResponse } from 'next/server';
2
3
  export declare function proxy(request: NextRequest): Promise<NextResponse>;
4
+ export declare const middleware: typeof proxy;
3
5
  export declare const config: {
4
6
  matcher: string[];
5
7
  };
@@ -1,3 +1,4 @@
1
+ import 'server-only';
1
2
  import { NextResponse } from 'next/server';
2
3
  import { IgniteClient } from '../client.js';
3
4
  // Well-known AI and search crawler user-agent tokens. Matching is case-insensitive substring; the first match
@@ -31,34 +32,54 @@ function clientIp(request) {
31
32
  return forwarded.split(',')[0]?.trim() || undefined;
32
33
  return request.headers.get('x-real-ip')?.trim() || undefined;
33
34
  }
34
- // Drop into `proxy.ts` at the project root: export { proxy, config } from '@ignite-agent/agent/proxy'
35
- // Passes every request through untouched, and records a crawl event when the visitor is a known crawler.
36
- // Recording is best-effort: a failure never affects the response.
35
+ // Drop into `proxy.ts` (Next 16) or `middleware.ts` (Next 15):
36
+ // export { proxy, config } from '@ignite-agent/agent/proxy'
37
+ // export { middleware, config } from '@ignite-agent/agent/proxy'
38
+ // Passes every request through untouched. Crawl ingest runs after the response so a slow Hub never stalls a bot.
37
39
  export async function proxy(request) {
38
40
  const botName = matchedCrawler(request.headers.get('user-agent') ?? '');
39
41
  if (botName) {
40
- const client = IgniteClient.fromEnvOrNull();
41
- if (client) {
42
- const ip = clientIp(request);
43
- const userAgent = request.headers.get('user-agent') ?? undefined;
44
- const event = {
45
- bot_name: botName,
46
- path: request.nextUrl.pathname,
47
- observed_at: new Date().toISOString(),
48
- method: request.method,
49
- ...(ip ? { ip } : {}),
50
- ...(userAgent ? { user_agent: userAgent } : {}),
51
- };
52
- try {
53
- await client.recordCrawlEvents([event]);
54
- }
55
- catch {
56
- // best-effort; ignore
57
- }
58
- }
42
+ const ip = clientIp(request);
43
+ const userAgent = request.headers.get('user-agent') ?? undefined;
44
+ const event = {
45
+ bot_name: botName,
46
+ path: request.nextUrl.pathname,
47
+ observed_at: new Date().toISOString(),
48
+ method: request.method,
49
+ ...(ip ? { ip } : {}),
50
+ ...(userAgent ? { user_agent: userAgent } : {}),
51
+ };
52
+ schedule(() => record(event));
59
53
  }
60
54
  return NextResponse.next();
61
55
  }
56
+ export const middleware = proxy;
57
+ function schedule(work) {
58
+ void import('next/server')
59
+ .then((mod) => {
60
+ if (typeof mod.after === 'function') {
61
+ mod.after(() => {
62
+ void work();
63
+ });
64
+ return;
65
+ }
66
+ void work();
67
+ })
68
+ .catch(() => {
69
+ void work();
70
+ });
71
+ }
72
+ async function record(event) {
73
+ const client = IgniteClient.fromEnvOrNull();
74
+ if (!client)
75
+ return;
76
+ try {
77
+ await client.recordCrawlEvents([event]);
78
+ }
79
+ catch {
80
+ // best-effort
81
+ }
82
+ }
62
83
  // Limit the proxy to page requests; skip static assets.
63
84
  export const config = {
64
85
  matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/operator/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,YAAY,EAAE,MAAM,aAAa,CAAC;AAE7D,OAAO,EAAE,YAAY,EAAmB,MAAM,cAAc,CAAC;AAE7D,8GAA8G;AAC9G,gHAAgH;AAChH,wDAAwD;AACxD,MAAM,cAAc,GAAG;IACrB,QAAQ;IACR,eAAe;IACf,cAAc;IACd,WAAW;IACX,YAAY;IACZ,cAAc;IACd,eAAe;IACf,iBAAiB;IACjB,iBAAiB;IACjB,WAAW;IACX,SAAS;IACT,UAAU;IACV,WAAW;IACX,oBAAoB;IACpB,YAAY;IACZ,OAAO;CACR,CAAC;AAEF,SAAS,cAAc,CAAC,SAAiB;IACvC,MAAM,EAAE,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;IACnC,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC;AAClF,CAAC;AAED,SAAS,QAAQ,CAAC,OAAoB;IACpC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACzD,IAAI,SAAS;QAAE,OAAO,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IACnE,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;AAC/D,CAAC;AAED,uGAAuG;AACvG,yGAAyG;AACzG,kEAAkE;AAClE,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,OAAoB;IAC9C,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;IAExE,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC;QAC5C,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC7B,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,SAAS,CAAC;YACjE,MAAM,KAAK,GAAe;gBACxB,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ;gBAC9B,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACrC,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAChD,CAAC;YACF,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1C,CAAC;YAAC,MAAM,CAAC;gBACP,sBAAsB;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAC,IAAI,EAAE,CAAC;AAC7B,CAAC;AAED,wDAAwD;AACxD,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,OAAO,EAAE,CAAC,+CAA+C,CAAC;CAC3D,CAAC"}
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/operator/proxy.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,3 @@
1
+ import 'server-only';
1
2
  import type { MetadataRoute } from 'next';
2
3
  export default function robots(): Promise<MetadataRoute.Robots>;
@@ -1,3 +1,4 @@
1
+ import 'server-only';
1
2
  import { IgniteClient } from '../client.js';
2
3
  // Drop into `app/robots.ts`: export { default } from '@ignite-agent/agent/robots'
3
4
  // Resolves rules from your Ignite workspace at request time. Falls back to allow-all when unconfigured or
@@ -1 +1 @@
1
- {"version":3,"file":"robots.js","sourceRoot":"","sources":["../../src/operator/robots.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,mFAAmF;AACnF,0GAA0G;AAC1G,wDAAwD;AACxD,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,MAAM;IAClC,MAAM,QAAQ,GAAyB,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;IAEjF,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC7C,IAAI,CAAC,MAAM;YAAE,OAAO,QAAQ,CAAC;QAC7B,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9C,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"robots.js","sourceRoot":"","sources":["../../src/operator/robots.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAIrB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,mFAAmF;AACnF,0GAA0G;AAC1G,wDAAwD;AACxD,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,MAAM;IAClC,MAAM,QAAQ,GAAyB,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;IAEjF,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,EAAE,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC7C,IAAI,CAAC,MAAM;YAAE,OAAO,QAAQ,CAAC;QAC7B,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9C,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { FeedPage, SitemapEntry } from '../types.js';
2
+ export type SitemapRow = {
3
+ url: string;
4
+ lastModified?: string;
5
+ changeFrequency?: SitemapEntry['changeFrequency'];
6
+ priority?: number;
7
+ };
8
+ export declare function originFromSitemapUrls(urls: string[]): string | undefined;
9
+ export declare function mergeSitemap(base: SitemapRow[], extra: SitemapRow[]): SitemapRow[];
10
+ export declare function feedPagesToSitemap(pages: FeedPage[], siteUrl?: string | undefined): SitemapRow[];
@@ -0,0 +1,56 @@
1
+ import { absoluteUrl, publicModifiedAt, resolveSiteUrl } from './ui.js';
2
+ export function originFromSitemapUrls(urls) {
3
+ for (const url of urls) {
4
+ try {
5
+ const parsed = new URL(url);
6
+ if (parsed.protocol === 'http:' || parsed.protocol === 'https:')
7
+ return parsed.origin;
8
+ }
9
+ catch {
10
+ // skip relative or malformed
11
+ }
12
+ }
13
+ return undefined;
14
+ }
15
+ export function mergeSitemap(base, extra) {
16
+ const map = new Map();
17
+ for (const row of base) {
18
+ if (!row.url)
19
+ continue;
20
+ map.set(row.url, { ...row });
21
+ }
22
+ for (const row of extra) {
23
+ if (!row.url)
24
+ continue;
25
+ const prev = map.get(row.url);
26
+ if (!prev) {
27
+ map.set(row.url, { ...row });
28
+ continue;
29
+ }
30
+ if (!prev.lastModified && row.lastModified) {
31
+ map.set(row.url, { ...prev, lastModified: row.lastModified });
32
+ }
33
+ }
34
+ return [...map.values()];
35
+ }
36
+ export function feedPagesToSitemap(pages, siteUrl) {
37
+ const base = resolveSiteUrl(siteUrl);
38
+ if (!base)
39
+ return [];
40
+ const rows = [];
41
+ const kinds = new Set();
42
+ for (const page of pages) {
43
+ kinds.add(page.kind);
44
+ const lastModified = publicModifiedAt(page) ?? undefined;
45
+ rows.push({
46
+ url: absoluteUrl(page.path, base),
47
+ ...(lastModified ? { lastModified } : {}),
48
+ });
49
+ }
50
+ if (kinds.has('wiki'))
51
+ rows.push({ url: absoluteUrl('/w', base) });
52
+ if (kinds.has('article'))
53
+ rows.push({ url: absoluteUrl('/blog', base) });
54
+ return rows;
55
+ }
56
+ //# sourceMappingURL=sitemap-merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sitemap-merge.js","sourceRoot":"","sources":["../../src/operator/sitemap-merge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AASxE,MAAM,UAAU,qBAAqB,CAAC,IAAc;IAClD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ;gBAAE,OAAO,MAAM,CAAC,MAAM,CAAC;QACxF,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAkB,EAAE,KAAmB;IAClE,MAAM,GAAG,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC1C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,GAAG;YAAE,SAAS;QACvB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;IAC/B,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,GAAG;YAAE,SAAS;QACvB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;YAC7B,SAAS;QACX,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;YAC3C,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAiB,EAAE,OAA4B;IAChF,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAErB,MAAM,IAAI,GAAiB,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,MAAM,YAAY,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;QACzD,IAAI,CAAC,IAAI,CAAC;YACR,GAAG,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;YACjC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1C,CAAC,CAAC;IACL,CAAC;IACD,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACnE,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;QAAE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACzE,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1,2 +1,6 @@
1
+ import 'server-only';
1
2
  import type { MetadataRoute } from 'next';
2
- export default function sitemap(): Promise<MetadataRoute.Sitemap>;
3
+ import { feedPagesToSitemap, mergeSitemap, originFromSitemapUrls } from './sitemap-merge.js';
4
+ export { mergeSitemap, feedPagesToSitemap, originFromSitemapUrls };
5
+ export declare function igniteSitemap(): Promise<MetadataRoute.Sitemap>;
6
+ export default igniteSitemap;