khoji 2.1.4

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 (95) hide show
  1. package/README.md +136 -0
  2. package/dist/ai/GeminiAdapter.d.ts +7 -0
  3. package/dist/ai/GeminiAdapter.d.ts.map +1 -0
  4. package/dist/ai/GeminiAdapter.js +40 -0
  5. package/dist/ai/GeminiAdapter.js.map +1 -0
  6. package/dist/browser/BrowserManager.d.ts +17 -0
  7. package/dist/browser/BrowserManager.d.ts.map +1 -0
  8. package/dist/browser/BrowserManager.js +61 -0
  9. package/dist/browser/BrowserManager.js.map +1 -0
  10. package/dist/browser/PageLoader.d.ts +21 -0
  11. package/dist/browser/PageLoader.d.ts.map +1 -0
  12. package/dist/browser/PageLoader.js +116 -0
  13. package/dist/browser/PageLoader.js.map +1 -0
  14. package/dist/cli/index.d.ts +3 -0
  15. package/dist/cli/index.d.ts.map +1 -0
  16. package/dist/cli/index.js +98 -0
  17. package/dist/cli/index.js.map +1 -0
  18. package/dist/extractors/AnimationExtractor.d.ts +12 -0
  19. package/dist/extractors/AnimationExtractor.d.ts.map +1 -0
  20. package/dist/extractors/AnimationExtractor.js +247 -0
  21. package/dist/extractors/AnimationExtractor.js.map +1 -0
  22. package/dist/extractors/AssetExtractor.d.ts +11 -0
  23. package/dist/extractors/AssetExtractor.d.ts.map +1 -0
  24. package/dist/extractors/AssetExtractor.js +124 -0
  25. package/dist/extractors/AssetExtractor.js.map +1 -0
  26. package/dist/extractors/ContentExtractor.d.ts +13 -0
  27. package/dist/extractors/ContentExtractor.d.ts.map +1 -0
  28. package/dist/extractors/ContentExtractor.js +60 -0
  29. package/dist/extractors/ContentExtractor.js.map +1 -0
  30. package/dist/extractors/DomExtractor.d.ts +11 -0
  31. package/dist/extractors/DomExtractor.d.ts.map +1 -0
  32. package/dist/extractors/DomExtractor.js +68 -0
  33. package/dist/extractors/DomExtractor.js.map +1 -0
  34. package/dist/extractors/InteractionExtractor.d.ts +10 -0
  35. package/dist/extractors/InteractionExtractor.d.ts.map +1 -0
  36. package/dist/extractors/InteractionExtractor.js +64 -0
  37. package/dist/extractors/InteractionExtractor.js.map +1 -0
  38. package/dist/extractors/MetaExtractor.d.ts +8 -0
  39. package/dist/extractors/MetaExtractor.d.ts.map +1 -0
  40. package/dist/extractors/MetaExtractor.js +33 -0
  41. package/dist/extractors/MetaExtractor.js.map +1 -0
  42. package/dist/extractors/StyleExtractor.d.ts +10 -0
  43. package/dist/extractors/StyleExtractor.d.ts.map +1 -0
  44. package/dist/extractors/StyleExtractor.js +87 -0
  45. package/dist/extractors/StyleExtractor.js.map +1 -0
  46. package/dist/index.d.ts +6 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +6 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/output/Writer.d.ts +5 -0
  51. package/dist/output/Writer.d.ts.map +1 -0
  52. package/dist/output/Writer.js +13 -0
  53. package/dist/output/Writer.js.map +1 -0
  54. package/dist/pipeline/Cleaner.d.ts +12 -0
  55. package/dist/pipeline/Cleaner.d.ts.map +1 -0
  56. package/dist/pipeline/Cleaner.js +41 -0
  57. package/dist/pipeline/Cleaner.js.map +1 -0
  58. package/dist/pipeline/ComponentDetector.d.ts +8 -0
  59. package/dist/pipeline/ComponentDetector.d.ts.map +1 -0
  60. package/dist/pipeline/ComponentDetector.js +43 -0
  61. package/dist/pipeline/ComponentDetector.js.map +1 -0
  62. package/dist/pipeline/runner.d.ts +3 -0
  63. package/dist/pipeline/runner.d.ts.map +1 -0
  64. package/dist/pipeline/runner.js +182 -0
  65. package/dist/pipeline/runner.js.map +1 -0
  66. package/dist/prompting/PromptGenerator.d.ts +5 -0
  67. package/dist/prompting/PromptGenerator.d.ts.map +1 -0
  68. package/dist/prompting/PromptGenerator.js +30 -0
  69. package/dist/prompting/PromptGenerator.js.map +1 -0
  70. package/dist/serializer/JsonSerializer.d.ts +6 -0
  71. package/dist/serializer/JsonSerializer.d.ts.map +1 -0
  72. package/dist/serializer/JsonSerializer.js +7 -0
  73. package/dist/serializer/JsonSerializer.js.map +1 -0
  74. package/dist/serializer/MarkdownSerializer.d.ts +7 -0
  75. package/dist/serializer/MarkdownSerializer.d.ts.map +1 -0
  76. package/dist/serializer/MarkdownSerializer.js +143 -0
  77. package/dist/serializer/MarkdownSerializer.js.map +1 -0
  78. package/dist/types/KhojContext.d.ts +141 -0
  79. package/dist/types/KhojContext.d.ts.map +1 -0
  80. package/dist/types/KhojContext.js +6 -0
  81. package/dist/types/KhojContext.js.map +1 -0
  82. package/dist/utils/logger.d.ts +15 -0
  83. package/dist/utils/logger.d.ts.map +1 -0
  84. package/dist/utils/logger.js +70 -0
  85. package/dist/utils/logger.js.map +1 -0
  86. package/dist/utils/text.d.ts +2 -0
  87. package/dist/utils/text.d.ts.map +1 -0
  88. package/dist/utils/text.js +6 -0
  89. package/dist/utils/text.js.map +1 -0
  90. package/dist/utils/tokenEstimator.d.ts +10 -0
  91. package/dist/utils/tokenEstimator.d.ts.map +1 -0
  92. package/dist/utils/tokenEstimator.js +17 -0
  93. package/dist/utils/tokenEstimator.js.map +1 -0
  94. package/khoj-context.schema.json +48 -0
  95. package/package.json +75 -0
@@ -0,0 +1,5 @@
1
+ export type CloneSkill = 'frontend-design' | 'seo-audit' | 'web-design-guidelines' | 'award-winning-website';
2
+ export declare class PromptGenerator {
3
+ static generate(skills: CloneSkill[]): string;
4
+ }
5
+ //# sourceMappingURL=PromptGenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromptGenerator.d.ts","sourceRoot":"","sources":["../../src/prompting/PromptGenerator.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAChB,iBAAiB,GACjB,WAAW,GACX,uBAAuB,GACvB,uBAAuB,CAAC;AAE9B,qBAAa,eAAe;IACxB,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM;CAmChD"}
@@ -0,0 +1,30 @@
1
+ export class PromptGenerator {
2
+ static generate(skills) {
3
+ let prompt = `# Pixel-Perfect Website Clone Task\n\n`;
4
+ prompt += `You are an expert AI developer tasked with cloning a website. Within this folder, you have access to the raw HTML, unified CSS, a full-page screenshot, and a structural JSON context map of the target site. Your objective is to rebuild this website pixel-perfectly.\n\n`;
5
+ if (skills.length > 0) {
6
+ prompt += `## Project Guidelines & Skills\n`;
7
+ prompt += `While cloning, you must adhere strictly to the following guidelines selected for this project:\n\n`;
8
+ if (skills.includes('frontend-design')) {
9
+ prompt += `### ✦ Frontend Design Excellence\n`;
10
+ prompt += `Ensure the UI design completely avoids generic AI aesthetics. Prioritize distinctive typography (do not default to standard system fonts), maintain cohesive and intentional spacing, and commit to a bold creative direction for the interface. Every detail should feel meticulously human-crafted.\n\n`;
11
+ }
12
+ if (skills.includes('seo-audit')) {
13
+ prompt += `### ✦ SEO Best Practices\n`;
14
+ prompt += `Implement strong on-page technical SEO. Use correct HTML5 semantic tags, maintain a strict and logical heading hierarchy (with exactly one H1), ensure all images have descriptive \`alt\` attributes, and structure the DOM for maximum accessibility and immediate indexability.\n\n`;
15
+ }
16
+ if (skills.includes('web-design-guidelines')) {
17
+ prompt += `### ✦ Strict Web Design Guidelines\n`;
18
+ prompt += `Follow rigorous modern web interface guidelines. Ensure high color contrast ratios, provide reliable and visible focus states for all interactive elements, ensure flawlessly responsive viewport handling across mobile and desktop, and adhere to robust accessibility standards.\n\n`;
19
+ }
20
+ if (skills.includes('award-winning-website')) {
21
+ prompt += `### ✦ Award-Winning Experience\n`;
22
+ prompt += `Elevate this site into a premium, award-winning experience. Where appropriate, integrate scroll-triggered UI reveals, modern 3D or parallax geometric effects, and smooth high-end micro-interactions using robust animation patterns (e.g., GSAP, Framer Motion, or advanced CSS transitions).\n\n`;
23
+ }
24
+ }
25
+ prompt += `## Deliverables\n`;
26
+ prompt += `Please provide the functional code necessary to recreate this interface, ensuring the aforementioned guidelines define the final aesthetic and structural quality of the work.`;
27
+ return prompt;
28
+ }
29
+ }
30
+ //# sourceMappingURL=PromptGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromptGenerator.js","sourceRoot":"","sources":["../../src/prompting/PromptGenerator.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,eAAe;IACxB,MAAM,CAAC,QAAQ,CAAC,MAAoB;QAChC,IAAI,MAAM,GAAG,wCAAwC,CAAC;QAEtD,MAAM,IAAI,8QAA8Q,CAAC;QAEzR,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,kCAAkC,CAAC;YAC7C,MAAM,IAAI,oGAAoG,CAAC;YAE/G,IAAI,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACrC,MAAM,IAAI,oCAAoC,CAAC;gBAC/C,MAAM,IAAI,2SAA2S,CAAC;YAC1T,CAAC;YAED,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,4BAA4B,CAAC;gBACvC,MAAM,IAAI,wRAAwR,CAAC;YACvS,CAAC;YAED,IAAI,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;gBAC3C,MAAM,IAAI,sCAAsC,CAAC;gBACjD,MAAM,IAAI,yRAAyR,CAAC;YACxS,CAAC;YAED,IAAI,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;gBAC3C,MAAM,IAAI,kCAAkC,CAAC;gBAC7C,MAAM,IAAI,qSAAqS,CAAC;YACpT,CAAC;QACL,CAAC;QAED,MAAM,IAAI,mBAAmB,CAAC;QAC9B,MAAM,IAAI,gLAAgL,CAAC;QAE3L,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ"}
@@ -0,0 +1,6 @@
1
+ import type { KhojContext } from '../types/KhojContext.js';
2
+ /**
3
+ * Serializes the KhojContext object to a formatted JSON string.
4
+ */
5
+ export declare function serializeJson(ctx: KhojContext): string;
6
+ //# sourceMappingURL=JsonSerializer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JsonSerializer.d.ts","sourceRoot":"","sources":["../../src/serializer/JsonSerializer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAEtD"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Serializes the KhojContext object to a formatted JSON string.
3
+ */
4
+ export function serializeJson(ctx) {
5
+ return JSON.stringify(ctx, null, 2);
6
+ }
7
+ //# sourceMappingURL=JsonSerializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JsonSerializer.js","sourceRoot":"","sources":["../../src/serializer/JsonSerializer.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,GAAgB;IAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { KhojContext } from '../types/KhojContext.js';
2
+ /**
3
+ * Serializes a KhojContext into a markdown document optimised for LLM readability.
4
+ * Sections are ordered from most to least relevant for AI agents.
5
+ */
6
+ export declare function serializeMarkdown(ctx: KhojContext): string;
7
+ //# sourceMappingURL=MarkdownSerializer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarkdownSerializer.d.ts","sourceRoot":"","sources":["../../src/serializer/MarkdownSerializer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAsG,MAAM,yBAAyB,CAAC;AAE/J;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAuJ1D"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Serializes a KhojContext into a markdown document optimised for LLM readability.
3
+ * Sections are ordered from most to least relevant for AI agents.
4
+ */
5
+ export function serializeMarkdown(ctx) {
6
+ const lines = [];
7
+ lines.push(`# Khoj Context — ${ctx.meta.title || ctx.url}`);
8
+ lines.push(`> Extracted: ${ctx.extractedAt} | Schema: ${ctx.schemaVersion} | \~${ctx.tokenEstimate.toLocaleString()} tokens\n`);
9
+ // ── Meta ──────────────────────────────────────────────────────────────────
10
+ lines.push('## Meta');
11
+ lines.push(`- **URL**: ${ctx.url}`);
12
+ if (ctx.finalUrl !== ctx.url)
13
+ lines.push(`- **Final URL** (after redirect): ${ctx.finalUrl}`);
14
+ lines.push(`- **Title**: ${ctx.meta.title}`);
15
+ lines.push(`- **Description**: ${ctx.meta.description}`);
16
+ if (ctx.meta.ogImage)
17
+ lines.push(`- **OG Image**: ${ctx.meta.ogImage}`);
18
+ if (ctx.meta.canonical)
19
+ lines.push(`- **Canonical**: ${ctx.meta.canonical}`);
20
+ if (ctx.meta.themeColor)
21
+ lines.push(`- **Theme Color**: ${ctx.meta.themeColor}`);
22
+ lines.push('');
23
+ // ── Design Tokens ─────────────────────────────────────────────────────────
24
+ lines.push('## Design Tokens');
25
+ if (Object.keys(ctx.designTokens.colors).length > 0) {
26
+ lines.push('\n### Colors');
27
+ for (const [k, v] of Object.entries(ctx.designTokens.colors)) {
28
+ lines.push(`- \`${k}\`: ${v}`);
29
+ }
30
+ }
31
+ if (Object.keys(ctx.designTokens.spacing).length > 0) {
32
+ lines.push('\n### Spacing');
33
+ for (const [k, v] of Object.entries(ctx.designTokens.spacing)) {
34
+ lines.push(`- \`${k}\`: ${v}`);
35
+ }
36
+ }
37
+ if (ctx.designTokens.fonts.length > 0) {
38
+ lines.push(`\n### Fonts\n${ctx.designTokens.fonts.map((f) => `- ${f}`).join('\n')}`);
39
+ }
40
+ if (ctx.designTokens.breakpoints.length > 0) {
41
+ lines.push(`\n### Breakpoints\n${ctx.designTokens.breakpoints.map((b) => `- ${b}`).join('\n')}`);
42
+ }
43
+ lines.push('');
44
+ // ── Content ───────────────────────────────────────────────────────────────
45
+ lines.push('## Content');
46
+ const headings = ctx.content.filter((c) => c.type === 'heading');
47
+ const buttons = ctx.content.filter((c) => c.type === 'button');
48
+ const paragraphs = ctx.content.filter((c) => c.type === 'paragraph').slice(0, 10);
49
+ if (headings.length > 0) {
50
+ lines.push('\n### Headings');
51
+ headings.forEach((h) => lines.push(`${'#'.repeat(h.level ?? 1)} ${h.text}`));
52
+ }
53
+ if (buttons.length > 0) {
54
+ lines.push('\n### CTAs / Buttons');
55
+ buttons.forEach((b) => lines.push(`- ${b.text}`));
56
+ }
57
+ if (paragraphs.length > 0) {
58
+ lines.push('\n### Text Blocks (sample)');
59
+ paragraphs.forEach((p) => lines.push(`> ${p.text}`));
60
+ }
61
+ lines.push('');
62
+ // ── Assets ────────────────────────────────────────────────────────────────
63
+ lines.push('## Assets');
64
+ lines.push(`- **Images**: ${ctx.assets.images.length}`);
65
+ lines.push(`- **GIFs**: ${ctx.assets.gifs.length}`);
66
+ lines.push(`- **Fonts**: ${ctx.assets.fonts.length}`);
67
+ lines.push(`- **Icons**: ${ctx.assets.icons.length}`);
68
+ if (ctx.assets.images.length > 0) {
69
+ lines.push('\n### Images');
70
+ lines.push('| URL | Alt | Size | Lazy |');
71
+ lines.push('|-----|-----|------|------|');
72
+ ctx.assets.images.slice(0, 20).forEach((img) => {
73
+ const size = img.width && img.height ? `${img.width}×${img.height}` : '–';
74
+ lines.push(`| ${img.url.slice(0, 60)} | ${img.alt || '–'} | ${size} | ${img.isLazy ? 'yes' : 'no'} |`);
75
+ });
76
+ }
77
+ if (ctx.assets.gifs.length > 0) {
78
+ lines.push('\n### GIFs');
79
+ lines.push('| URL | Alt | Selector |');
80
+ lines.push('|-----|-----|----------|');
81
+ ctx.assets.gifs.forEach((g) => {
82
+ lines.push(`| ${g.url.slice(0, 60)} | ${g.alt || '–'} | \`${g.selector}\` |`);
83
+ });
84
+ }
85
+ lines.push('');
86
+ // ── Animations ────────────────────────────────────────────────────────────
87
+ lines.push('## Animations');
88
+ lines.push(`> ${ctx.animations.summary}`);
89
+ if (ctx.animations.cssAnimations.length > 0) {
90
+ lines.push('\n### CSS Animations');
91
+ ctx.animations.cssAnimations.slice(0, 15).forEach((a) => {
92
+ lines.push(`- **${a.name}** on \`${a.selector.slice(0, 60)}\`: ${a.description} *(${a.duration}, ${a.trigger})*`);
93
+ });
94
+ }
95
+ if (ctx.animations.cssTransitions.length > 0) {
96
+ lines.push('\n### CSS Transitions');
97
+ ctx.animations.cssTransitions.slice(0, 10).forEach((t) => {
98
+ lines.push(`- \`${t.selector.slice(0, 60)}\`: ${t.description}`);
99
+ });
100
+ }
101
+ if (ctx.animations.jsAnimations.length > 0) {
102
+ lines.push('\n### JS Animations');
103
+ ctx.animations.jsAnimations.forEach((j) => {
104
+ lines.push(`- **${j.library}**: ${j.description} *(${j.trigger})*`);
105
+ });
106
+ }
107
+ if (ctx.animations.scrollAnimations.length > 0) {
108
+ lines.push('\n### Scroll Animations');
109
+ ctx.animations.scrollAnimations.slice(0, 10).forEach((s) => {
110
+ lines.push(`- \`${s.selector}\` — ${s.animationType} (${s.library})`);
111
+ });
112
+ }
113
+ if (ctx.animations.gifAnimations.length > 0) {
114
+ lines.push('\n### GIF Animations');
115
+ ctx.animations.gifAnimations.forEach((g) => {
116
+ lines.push(`- **${g.purpose}**: ${g.alt || g.url.split('/').pop()} (\`${g.selector}\`)`);
117
+ });
118
+ }
119
+ lines.push('');
120
+ // ── Interactions ──────────────────────────────────────────────────────────
121
+ if (ctx.interactions.length > 0) {
122
+ lines.push('## Interactions');
123
+ ctx.interactions.forEach((i) => {
124
+ lines.push(`\n### ${i.label} (${i.type})`);
125
+ lines.push(`- Selector: \`${i.selector}\``);
126
+ if (i.fields && i.fields.length > 0) {
127
+ lines.push('- Fields:');
128
+ i.fields.forEach((f) => lines.push(` - ${f.name} (${f.inputType})${f.required ? ' *required*' : ''}${f.placeholder ? ` — "${f.placeholder}"` : ''}`));
129
+ }
130
+ });
131
+ lines.push('');
132
+ }
133
+ // ── Components ────────────────────────────────────────────────────────────
134
+ if (ctx.components.length > 0) {
135
+ lines.push('## Detected Components');
136
+ ctx.components.forEach((c) => {
137
+ lines.push(`- **${c.name}** (\`${c.pattern}\`): ${c.count} instances`);
138
+ });
139
+ lines.push('');
140
+ }
141
+ return lines.join('\n');
142
+ }
143
+ //# sourceMappingURL=MarkdownSerializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarkdownSerializer.js","sourceRoot":"","sources":["../../src/serializer/MarkdownSerializer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,141 @@
1
+ export interface KhojContext {
2
+ schemaVersion: '1.0';
3
+ url: string;
4
+ finalUrl: string;
5
+ extractedAt: string;
6
+ loadTimeMs: number;
7
+ tokenEstimate: number;
8
+ meta: PageMeta;
9
+ structure: DomNode[];
10
+ designTokens: DesignTokens;
11
+ components: DetectedComponent[];
12
+ assets: AssetMap;
13
+ content: ContentBlock[];
14
+ interactions: Interaction[];
15
+ animations: AnimationMap;
16
+ }
17
+ export interface PageMeta {
18
+ title: string;
19
+ description: string;
20
+ ogImage: string | null;
21
+ canonical: string | null;
22
+ themeColor: string | null;
23
+ jsonLd: unknown[];
24
+ }
25
+ export interface DomNode {
26
+ tag: string;
27
+ id?: string;
28
+ classes: string[];
29
+ role?: string;
30
+ text?: string;
31
+ children?: DomNode[];
32
+ }
33
+ export interface DesignTokens {
34
+ colors: Record<string, string>;
35
+ spacing: Record<string, string>;
36
+ typography: Record<string, string>;
37
+ fonts: string[];
38
+ breakpoints: string[];
39
+ }
40
+ export interface DetectedComponent {
41
+ name: string;
42
+ pattern: string;
43
+ count: number;
44
+ sampleHTML: string;
45
+ }
46
+ export interface AssetMap {
47
+ images: ImageAsset[];
48
+ gifs: ImageAsset[];
49
+ fonts: string[];
50
+ icons: string[];
51
+ scripts: string[];
52
+ }
53
+ export interface ImageAsset {
54
+ url: string;
55
+ alt: string;
56
+ type: 'image' | 'gif';
57
+ width: number | null;
58
+ height: number | null;
59
+ isLazy: boolean;
60
+ selector: string;
61
+ }
62
+ export type ContentType = 'heading' | 'paragraph' | 'button' | 'link' | 'label';
63
+ export interface ContentBlock {
64
+ type: ContentType;
65
+ text: string;
66
+ level?: number;
67
+ href?: string;
68
+ }
69
+ export type InteractionType = 'form' | 'nav' | 'button';
70
+ export interface Interaction {
71
+ type: InteractionType;
72
+ selector: string;
73
+ label: string;
74
+ fields?: FormField[];
75
+ }
76
+ export interface FormField {
77
+ inputType: string;
78
+ name: string;
79
+ placeholder: string;
80
+ required: boolean;
81
+ }
82
+ export interface AnimationMap {
83
+ cssAnimations: CSSAnimation[];
84
+ cssTransitions: CSSTransition[];
85
+ jsAnimations: JSAnimation[];
86
+ scrollAnimations: ScrollAnimation[];
87
+ gifAnimations: GifAnimation[];
88
+ summary: string;
89
+ }
90
+ export interface CSSAnimation {
91
+ name: string;
92
+ selector: string;
93
+ duration: string;
94
+ timingFunction: string;
95
+ iterationCount: string;
96
+ delay: string;
97
+ trigger: 'page-load' | 'hover' | 'focus' | 'unknown';
98
+ description: string;
99
+ }
100
+ export interface CSSTransition {
101
+ selector: string;
102
+ properties: string[];
103
+ duration: string;
104
+ timingFunction: string;
105
+ trigger: 'hover' | 'focus' | 'active' | 'unknown';
106
+ description: string;
107
+ }
108
+ export type JSAnimationLibrary = 'gsap' | 'framer-motion' | 'animejs' | 'web-animations-api' | 'lottie' | 'auto' | 'unknown';
109
+ export interface JSAnimation {
110
+ library: JSAnimationLibrary;
111
+ selector: string;
112
+ description: string;
113
+ trigger: 'page-load' | 'scroll' | 'click' | 'hover' | 'unknown';
114
+ }
115
+ export type ScrollAnimationLibrary = 'aos' | 'intersection-observer' | 'gsap-scrolltrigger' | 'unknown';
116
+ export interface ScrollAnimation {
117
+ selector: string;
118
+ library: ScrollAnimationLibrary;
119
+ animationType: string;
120
+ description: string;
121
+ }
122
+ export type GifAnimationPurpose = 'loading-spinner' | 'product-demo' | 'decorative' | 'tutorial' | 'unknown';
123
+ export interface GifAnimation {
124
+ url: string;
125
+ selector: string;
126
+ alt: string;
127
+ purpose: GifAnimationPurpose;
128
+ }
129
+ export interface ExtractionOptions {
130
+ url: string;
131
+ outputDir: string;
132
+ format: 'json' | 'markdown' | 'both';
133
+ timeout: number;
134
+ fast: boolean;
135
+ clone?: boolean;
136
+ cloneSkills?: string[];
137
+ sendToGemini?: boolean;
138
+ prompt?: string;
139
+ clickSelector?: string;
140
+ }
141
+ //# sourceMappingURL=KhojContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KhojContext.d.ts","sourceRoot":"","sources":["../../src/types/KhojContext.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ // ─── KhojContext ────────────────────────────────────────────────────────────
2
+ // Master TypeScript interface for the khoj-context.json output.
3
+ // This is the source of truth — all extractors must conform to these types.
4
+ // ─────────────────────────────────────────────────────────────────────────────
5
+ export {};
6
+ //# sourceMappingURL=KhojContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KhojContext.js","sourceRoot":"","sources":["../../src/types/KhojContext.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,gEAAgE;AAChE,4EAA4E;AAC5E,gFAAgF"}
@@ -0,0 +1,15 @@
1
+ import { type Ora } from 'ora';
2
+ export declare const logger: {
3
+ info(msg: string): void;
4
+ success(msg: string): void;
5
+ warn(msg: string): void;
6
+ error(msg: string, err?: unknown): void;
7
+ step(emoji: string, msg: string): void;
8
+ dim(msg: string): void;
9
+ stat(label: string, value: string): void;
10
+ divider(): void;
11
+ spinner(msg: string): Ora;
12
+ stopSpinner(success?: boolean, msg?: string): void;
13
+ banner(): void;
14
+ };
15
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AACA,OAAY,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAIpC,eAAO,MAAM,MAAM;cACP,MAAM,GAAG,IAAI;iBAKV,MAAM,GAAG,IAAI;cAKhB,MAAM,GAAG,IAAI;eAKZ,MAAM,QAAQ,OAAO,GAAG,IAAI;gBAQ3B,MAAM,OAAO,MAAM,GAAG,IAAI;aAK7B,MAAM,GAAG,IAAI;gBAIV,MAAM,SAAS,MAAM,GAAG,IAAI;eAI7B,IAAI;iBAIF,MAAM,GAAG,GAAG;yCAKS,MAAM,GAAG,IAAI;cAUrC,IAAI;CAYf,CAAC"}
@@ -0,0 +1,70 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ let _spinner = null;
4
+ export const logger = {
5
+ info(msg) {
6
+ if (_spinner)
7
+ _spinner.stop();
8
+ console.log(chalk.blue(`ℹ ${msg}`));
9
+ },
10
+ success(msg) {
11
+ if (_spinner)
12
+ _spinner.stop();
13
+ console.log(chalk.green(`✔ ${msg}`));
14
+ },
15
+ warn(msg) {
16
+ if (_spinner)
17
+ _spinner.stop();
18
+ console.warn(chalk.yellow(`⚠ ${msg}`));
19
+ },
20
+ error(msg, err) {
21
+ if (_spinner)
22
+ _spinner.stop();
23
+ console.error(chalk.red(`✖ ${msg}`));
24
+ if (err instanceof Error) {
25
+ console.error(chalk.dim(` ${err.message}`));
26
+ }
27
+ },
28
+ step(emoji, msg) {
29
+ if (_spinner)
30
+ _spinner.stop();
31
+ console.log(`${emoji} ${chalk.bold(msg)}`);
32
+ },
33
+ dim(msg) {
34
+ console.log(chalk.dim(` ${msg}`));
35
+ },
36
+ stat(label, value) {
37
+ console.log(` ${chalk.cyan(label.padEnd(20))} ${chalk.white(value)}`);
38
+ },
39
+ divider() {
40
+ console.log(chalk.dim('─'.repeat(60)));
41
+ },
42
+ spinner(msg) {
43
+ _spinner = ora({ text: msg, color: 'cyan' }).start();
44
+ return _spinner;
45
+ },
46
+ stopSpinner(success = true, msg) {
47
+ if (!_spinner)
48
+ return;
49
+ if (success) {
50
+ _spinner.succeed(msg);
51
+ }
52
+ else {
53
+ _spinner.fail(msg);
54
+ }
55
+ _spinner = null;
56
+ },
57
+ banner() {
58
+ console.log('');
59
+ console.log(chalk.bold.cyan(' ██╗ ██╗██╗ ██╗ ██████╗ ██╗'));
60
+ console.log(chalk.bold.cyan(' ██║ ██╔╝██║ ██║██╔═══██╗ ██║'));
61
+ console.log(chalk.bold.cyan(' █████╔╝ ███████║██║ ██║ ██║'));
62
+ console.log(chalk.bold.cyan(' ██╔═██╗ ██╔══██║██║ ██║██ ██║'));
63
+ console.log(chalk.bold.cyan(' ██║ ██╗██║ ██║╚██████╔╝╚█████╔╝'));
64
+ console.log(chalk.bold.cyan(' ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚════╝'));
65
+ console.log('');
66
+ console.log(chalk.dim(' Website context packager for AI agents'));
67
+ console.log('');
68
+ },
69
+ };
70
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function normalize(text: string): string;
2
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/utils/text.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG9C"}
@@ -0,0 +1,6 @@
1
+ export function normalize(text) {
2
+ if (!text)
3
+ return '';
4
+ return text.trim().replace(/\s+/g, ' ');
5
+ }
6
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/utils/text.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Estimates the number of LLM tokens in a string.
3
+ * Uses the standard approximation: ~4 characters per token.
4
+ */
5
+ export declare function estimateTokens(text: string): number;
6
+ /**
7
+ * Returns a human-readable comparison between raw HTML size and khoj output size.
8
+ */
9
+ export declare function formatTokenSavings(rawHtmlLength: number, khojOutputLength: number): string;
10
+ //# sourceMappingURL=tokenEstimator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenEstimator.d.ts","sourceRoot":"","sources":["../../src/utils/tokenEstimator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAK1F"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Estimates the number of LLM tokens in a string.
3
+ * Uses the standard approximation: ~4 characters per token.
4
+ */
5
+ export function estimateTokens(text) {
6
+ return Math.ceil(text.length / 4);
7
+ }
8
+ /**
9
+ * Returns a human-readable comparison between raw HTML size and khoj output size.
10
+ */
11
+ export function formatTokenSavings(rawHtmlLength, khojOutputLength) {
12
+ const rawTokens = estimateTokens(rawHtmlLength.toString().padEnd(rawHtmlLength));
13
+ const outTokens = estimateTokens(khojOutputLength.toString().padEnd(khojOutputLength));
14
+ const reduction = Math.round(((rawTokens - outTokens) / rawTokens) * 100);
15
+ return `Raw HTML ~${rawTokens.toLocaleString()} tokens → Khoj ~${outTokens.toLocaleString()} tokens (${reduction}% reduction)`;
16
+ }
17
+ //# sourceMappingURL=tokenEstimator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokenEstimator.js","sourceRoot":"","sources":["../../src/utils/tokenEstimator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACvC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,aAAqB,EAAE,gBAAwB;IAC9E,MAAM,SAAS,GAAG,cAAc,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;IACjF,MAAM,SAAS,GAAG,cAAc,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACvF,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC;IAC1E,OAAO,aAAa,SAAS,CAAC,cAAc,EAAE,mBAAmB,SAAS,CAAC,cAAc,EAAE,YAAY,SAAS,cAAc,CAAC;AACnI,CAAC"}
@@ -0,0 +1,48 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://khoj.dev/schema/khoj-context.schema.json",
4
+ "title": "KhojContext",
5
+ "description": "Output schema generated by the Khoj CLI (token-efficient website context)",
6
+ "type": "object",
7
+ "properties": {
8
+ "schemaVersion": {
9
+ "type": "string",
10
+ "const": "1.0"
11
+ },
12
+ "url": {
13
+ "type": "string",
14
+ "format": "uri"
15
+ },
16
+ "finalUrl": {
17
+ "type": "string",
18
+ "format": "uri"
19
+ },
20
+ "extractedAt": {
21
+ "type": "string",
22
+ "format": "date-time"
23
+ },
24
+ "loadTimeMs": {
25
+ "type": "number"
26
+ },
27
+ "tokenEstimate": {
28
+ "type": "number",
29
+ "description": "Estimated LLM tokens for the JSON payload"
30
+ }
31
+ },
32
+ "required": [
33
+ "schemaVersion",
34
+ "url",
35
+ "finalUrl",
36
+ "extractedAt",
37
+ "loadTimeMs",
38
+ "tokenEstimate",
39
+ "meta",
40
+ "structure",
41
+ "designTokens",
42
+ "components",
43
+ "assets",
44
+ "content",
45
+ "interactions",
46
+ "animations"
47
+ ]
48
+ }