@sourcepress/ai 0.1.0

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 (147) hide show
  1. package/.omc/state/last-tool-error.json +7 -0
  2. package/.turbo/turbo-build.log +4 -0
  3. package/.turbo/turbo-test.log +24 -0
  4. package/LICENSE +21 -0
  5. package/dist/__tests__/budget.test.d.ts +2 -0
  6. package/dist/__tests__/budget.test.d.ts.map +1 -0
  7. package/dist/__tests__/budget.test.js +96 -0
  8. package/dist/__tests__/budget.test.js.map +1 -0
  9. package/dist/__tests__/classify.test.d.ts +2 -0
  10. package/dist/__tests__/classify.test.d.ts.map +1 -0
  11. package/dist/__tests__/classify.test.js +72 -0
  12. package/dist/__tests__/classify.test.js.map +1 -0
  13. package/dist/__tests__/eval-runner.test.d.ts +2 -0
  14. package/dist/__tests__/eval-runner.test.d.ts.map +1 -0
  15. package/dist/__tests__/eval-runner.test.js +171 -0
  16. package/dist/__tests__/eval-runner.test.js.map +1 -0
  17. package/dist/__tests__/extract.test.d.ts +2 -0
  18. package/dist/__tests__/extract.test.d.ts.map +1 -0
  19. package/dist/__tests__/extract.test.js +79 -0
  20. package/dist/__tests__/extract.test.js.map +1 -0
  21. package/dist/__tests__/find-gaps.test.d.ts +2 -0
  22. package/dist/__tests__/find-gaps.test.d.ts.map +1 -0
  23. package/dist/__tests__/find-gaps.test.js +82 -0
  24. package/dist/__tests__/find-gaps.test.js.map +1 -0
  25. package/dist/__tests__/generate.test.d.ts +2 -0
  26. package/dist/__tests__/generate.test.d.ts.map +1 -0
  27. package/dist/__tests__/generate.test.js +68 -0
  28. package/dist/__tests__/generate.test.js.map +1 -0
  29. package/dist/__tests__/improve-prompt.test.d.ts +2 -0
  30. package/dist/__tests__/improve-prompt.test.d.ts.map +1 -0
  31. package/dist/__tests__/improve-prompt.test.js +32 -0
  32. package/dist/__tests__/improve-prompt.test.js.map +1 -0
  33. package/dist/__tests__/intent-impact.test.d.ts +2 -0
  34. package/dist/__tests__/intent-impact.test.d.ts.map +1 -0
  35. package/dist/__tests__/intent-impact.test.js +51 -0
  36. package/dist/__tests__/intent-impact.test.js.map +1 -0
  37. package/dist/__tests__/judge.test.d.ts +2 -0
  38. package/dist/__tests__/judge.test.d.ts.map +1 -0
  39. package/dist/__tests__/judge.test.js +61 -0
  40. package/dist/__tests__/judge.test.js.map +1 -0
  41. package/dist/__tests__/score.test.d.ts +2 -0
  42. package/dist/__tests__/score.test.d.ts.map +1 -0
  43. package/dist/__tests__/score.test.js +50 -0
  44. package/dist/__tests__/score.test.js.map +1 -0
  45. package/dist/__tests__/staleness.test.d.ts +2 -0
  46. package/dist/__tests__/staleness.test.d.ts.map +1 -0
  47. package/dist/__tests__/staleness.test.js +66 -0
  48. package/dist/__tests__/staleness.test.js.map +1 -0
  49. package/dist/budget.d.ts +13 -0
  50. package/dist/budget.d.ts.map +1 -0
  51. package/dist/budget.js +40 -0
  52. package/dist/budget.js.map +1 -0
  53. package/dist/eval/runner.d.ts +34 -0
  54. package/dist/eval/runner.d.ts.map +1 -0
  55. package/dist/eval/runner.js +128 -0
  56. package/dist/eval/runner.js.map +1 -0
  57. package/dist/functions/classify.d.ts +5 -0
  58. package/dist/functions/classify.d.ts.map +1 -0
  59. package/dist/functions/classify.js +43 -0
  60. package/dist/functions/classify.js.map +1 -0
  61. package/dist/functions/extract.d.ts +5 -0
  62. package/dist/functions/extract.d.ts.map +1 -0
  63. package/dist/functions/extract.js +57 -0
  64. package/dist/functions/extract.js.map +1 -0
  65. package/dist/functions/find-gaps.d.ts +5 -0
  66. package/dist/functions/find-gaps.d.ts.map +1 -0
  67. package/dist/functions/find-gaps.js +51 -0
  68. package/dist/functions/find-gaps.js.map +1 -0
  69. package/dist/functions/generate.d.ts +5 -0
  70. package/dist/functions/generate.d.ts.map +1 -0
  71. package/dist/functions/generate.js +39 -0
  72. package/dist/functions/generate.js.map +1 -0
  73. package/dist/functions/improve-prompt.d.ts +5 -0
  74. package/dist/functions/improve-prompt.d.ts.map +1 -0
  75. package/dist/functions/improve-prompt.js +38 -0
  76. package/dist/functions/improve-prompt.js.map +1 -0
  77. package/dist/functions/index.d.ts +11 -0
  78. package/dist/functions/index.d.ts.map +1 -0
  79. package/dist/functions/index.js +11 -0
  80. package/dist/functions/index.js.map +1 -0
  81. package/dist/functions/intent-impact.d.ts +5 -0
  82. package/dist/functions/intent-impact.d.ts.map +1 -0
  83. package/dist/functions/intent-impact.js +45 -0
  84. package/dist/functions/intent-impact.js.map +1 -0
  85. package/dist/functions/judge.d.ts +5 -0
  86. package/dist/functions/judge.d.ts.map +1 -0
  87. package/dist/functions/judge.js +32 -0
  88. package/dist/functions/judge.js.map +1 -0
  89. package/dist/functions/model-factory.d.ts +4 -0
  90. package/dist/functions/model-factory.d.ts.map +1 -0
  91. package/dist/functions/model-factory.js +52 -0
  92. package/dist/functions/model-factory.js.map +1 -0
  93. package/dist/functions/score.d.ts +5 -0
  94. package/dist/functions/score.d.ts.map +1 -0
  95. package/dist/functions/score.js +47 -0
  96. package/dist/functions/score.js.map +1 -0
  97. package/dist/functions/staleness.d.ts +5 -0
  98. package/dist/functions/staleness.d.ts.map +1 -0
  99. package/dist/functions/staleness.js +45 -0
  100. package/dist/functions/staleness.js.map +1 -0
  101. package/dist/functions/usage.d.ts +8 -0
  102. package/dist/functions/usage.d.ts.map +1 -0
  103. package/dist/functions/usage.js +13 -0
  104. package/dist/functions/usage.js.map +1 -0
  105. package/dist/index.d.ts +8 -0
  106. package/dist/index.d.ts.map +1 -0
  107. package/dist/index.js +6 -0
  108. package/dist/index.js.map +1 -0
  109. package/dist/provider.d.ts +10 -0
  110. package/dist/provider.d.ts.map +1 -0
  111. package/dist/provider.js +32 -0
  112. package/dist/provider.js.map +1 -0
  113. package/dist/types.d.ts +207 -0
  114. package/dist/types.d.ts.map +1 -0
  115. package/dist/types.js +2 -0
  116. package/dist/types.js.map +1 -0
  117. package/package.json +41 -0
  118. package/src/__tests__/budget.test.ts +103 -0
  119. package/src/__tests__/classify.test.ts +90 -0
  120. package/src/__tests__/eval-runner.test.ts +199 -0
  121. package/src/__tests__/extract.test.ts +92 -0
  122. package/src/__tests__/find-gaps.test.ts +93 -0
  123. package/src/__tests__/generate.test.ts +92 -0
  124. package/src/__tests__/improve-prompt.test.ts +42 -0
  125. package/src/__tests__/intent-impact.test.ts +62 -0
  126. package/src/__tests__/judge.test.ts +78 -0
  127. package/src/__tests__/score.test.ts +61 -0
  128. package/src/__tests__/staleness.test.ts +77 -0
  129. package/src/budget.ts +47 -0
  130. package/src/eval/runner.ts +163 -0
  131. package/src/functions/classify.ts +54 -0
  132. package/src/functions/extract.ts +72 -0
  133. package/src/functions/find-gaps.ts +65 -0
  134. package/src/functions/generate.ts +51 -0
  135. package/src/functions/improve-prompt.ts +48 -0
  136. package/src/functions/index.ts +10 -0
  137. package/src/functions/intent-impact.ts +56 -0
  138. package/src/functions/judge.ts +41 -0
  139. package/src/functions/model-factory.ts +60 -0
  140. package/src/functions/score.ts +56 -0
  141. package/src/functions/staleness.ts +54 -0
  142. package/src/functions/usage.ts +25 -0
  143. package/src/index.ts +47 -0
  144. package/src/provider.ts +41 -0
  145. package/src/types.ts +225 -0
  146. package/tsconfig.json +5 -0
  147. package/vitest.config.ts +2 -0
@@ -0,0 +1,128 @@
1
+ import { generate } from "../functions/generate.js";
2
+ import { improvePrompt } from "../functions/improve-prompt.js";
3
+ import { judge } from "../functions/judge.js";
4
+ function mergeUsage(a, b) {
5
+ return {
6
+ input_tokens: a.input_tokens + b.input_tokens,
7
+ output_tokens: a.output_tokens + b.output_tokens,
8
+ estimated_cost_usd: a.estimated_cost_usd + b.estimated_cost_usd,
9
+ function_name: "eval-run",
10
+ timestamp: new Date().toISOString(),
11
+ };
12
+ }
13
+ function emptyUsage() {
14
+ return {
15
+ input_tokens: 0,
16
+ output_tokens: 0,
17
+ estimated_cost_usd: 0,
18
+ function_name: "eval-run",
19
+ timestamp: new Date().toISOString(),
20
+ };
21
+ }
22
+ export class EvalRunner {
23
+ provider;
24
+ budget;
25
+ constructor(provider, budget) {
26
+ this.provider = provider;
27
+ this.budget = budget;
28
+ }
29
+ /**
30
+ * Run the generate-judge-decide-improve loop.
31
+ *
32
+ * 1. GENERATE — AI creates content with current prompt
33
+ * 2. JUDGE — Locked judge-prompt scores 0-100
34
+ * 3. DECIDE — Score >= threshold? Keep. Otherwise discard.
35
+ * 4. IMPROVE — If discard: agent adjusts generation prompt
36
+ * 5. LOG — Result recorded
37
+ * 6. REPEAT — Until threshold met or max iterations
38
+ */
39
+ async run(config) {
40
+ const iterations = [];
41
+ let currentPrompt = config.generation_prompt;
42
+ let totalUsage = emptyUsage();
43
+ let finalContent;
44
+ let finalScore = 0;
45
+ let finalStatus = "discard";
46
+ let promptImproved = false;
47
+ for (let i = 0; i < config.max_iterations; i++) {
48
+ // 1. GENERATE
49
+ const generated = await generate({
50
+ content_type: config.content_type,
51
+ generation_prompt: currentPrompt,
52
+ knowledge_context: config.knowledge_context,
53
+ intent: config.intent,
54
+ collection_schema: config.collection_schema,
55
+ }, this.provider, this.budget);
56
+ totalUsage = mergeUsage(totalUsage, generated.usage);
57
+ // Compose the draft as frontmatter + body for judging
58
+ const draft = `---\n${Object.entries(generated.frontmatter)
59
+ .map(([k, v]) => `${k}: ${JSON.stringify(v)}`)
60
+ .join("\n")}\n---\n\n${generated.content}`;
61
+ // 2. JUDGE
62
+ const judged = await judge({
63
+ draft,
64
+ gold_standard: config.gold_standard,
65
+ judge_prompt: config.judge_prompt,
66
+ intent: config.intent,
67
+ }, this.provider, this.budget);
68
+ totalUsage = mergeUsage(totalUsage, judged.usage);
69
+ // 3. DECIDE
70
+ const status = judged.score >= config.threshold ? "keep" : "discard";
71
+ const evalResult = {
72
+ id: `eval-${config.content_type}-${Date.now()}-${i}`,
73
+ content_type: config.content_type,
74
+ prompt_version: `v${i + 1}`,
75
+ score: judged.score,
76
+ status,
77
+ reasoning: judged.reasoning,
78
+ iteration: i + 1,
79
+ generated_content: draft,
80
+ timestamp: new Date().toISOString(),
81
+ total_usage: { ...totalUsage },
82
+ };
83
+ iterations.push(evalResult);
84
+ finalScore = judged.score;
85
+ finalContent = draft;
86
+ if (status === "keep") {
87
+ finalStatus = "keep";
88
+ break;
89
+ }
90
+ // 4. IMPROVE — adjust generation prompt (not on last iteration)
91
+ if (i < config.max_iterations - 1) {
92
+ const improved = await improvePrompt({
93
+ current_prompt: currentPrompt,
94
+ judge_reasoning: judged.reasoning,
95
+ judge_score: judged.score,
96
+ content_type: config.content_type,
97
+ }, this.provider, this.budget);
98
+ totalUsage = mergeUsage(totalUsage, improved.usage);
99
+ currentPrompt = improved.improved_prompt;
100
+ promptImproved = true;
101
+ // Mark previous iteration as improved
102
+ evalResult.status = "improved";
103
+ }
104
+ }
105
+ return {
106
+ iterations,
107
+ final_score: finalScore,
108
+ final_status: finalStatus,
109
+ final_content: finalStatus === "keep" ? finalContent : undefined,
110
+ final_prompt: currentPrompt,
111
+ prompt_improved: promptImproved,
112
+ total_usage: totalUsage,
113
+ };
114
+ }
115
+ /**
116
+ * Single judge pass — score existing content without the improve loop.
117
+ * Used for quality scoring of already-published content.
118
+ */
119
+ async judgeOnly(input) {
120
+ const result = await judge(input, this.provider, this.budget);
121
+ return {
122
+ score: result.score,
123
+ reasoning: result.reasoning,
124
+ usage: result.usage,
125
+ };
126
+ }
127
+ }
128
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/eval/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { BudgetTracker } from "../budget.js";
2
+ import type { ResolvedProvider } from "../provider.js";
3
+ import type { ClassifyInput, ClassifyResult } from "../types.js";
4
+ export declare function classify(input: ClassifyInput, provider: ResolvedProvider, budget: BudgetTracker): Promise<ClassifyResult>;
5
+ //# sourceMappingURL=classify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../src/functions/classify.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAWjE,wBAAsB,QAAQ,CAC7B,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,aAAa,GACnB,OAAO,CAAC,cAAc,CAAC,CAkCzB"}
@@ -0,0 +1,43 @@
1
+ import { generateObject } from "ai";
2
+ import { z } from "zod";
3
+ import { createModel } from "./model-factory.js";
4
+ import { recordUsage } from "./usage.js";
5
+ const classifySchema = z.object({
6
+ quality: z.enum(["structured", "draft", "thoughts"]),
7
+ quality_score: z.number().min(1).max(10),
8
+ type: z.string(),
9
+ reasoning: z.string(),
10
+ });
11
+ export async function classify(input, provider, budget) {
12
+ const typeConstraint = input.available_types
13
+ ? `Choose the type from these options: ${input.available_types.join(", ")}`
14
+ : "Infer the most appropriate type (e.g. project-notes, meeting-notes, transcript, brainstorm, research, documentation)";
15
+ const { object, usage } = await generateObject({
16
+ model: await createModel(provider),
17
+ schema: classifySchema,
18
+ prompt: `You are a knowledge classifier for a content engine. Analyze the following text and classify it.
19
+
20
+ Quality levels:
21
+ - "structured": Well-organized, has clear sections, headings, or data points. Score 7-10.
22
+ - "draft": Has useful information but needs editing, incomplete. Score 4-6.
23
+ - "thoughts": Raw brainstorm, bullet points, rough ideas. Score 1-3.
24
+
25
+ ${typeConstraint}
26
+
27
+ Text to classify:
28
+ ---
29
+ ${input.text}
30
+ ---
31
+
32
+ Respond with quality, quality_score (1-10), type, and reasoning.`,
33
+ });
34
+ const tokenUsage = recordUsage(budget, provider, usage, "classify");
35
+ return {
36
+ quality: object.quality,
37
+ quality_score: object.quality_score,
38
+ type: object.type,
39
+ reasoning: object.reasoning,
40
+ usage: tokenUsage,
41
+ };
42
+ }
43
+ //# sourceMappingURL=classify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify.js","sourceRoot":"","sources":["../../src/functions/classify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IACpD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IACxC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACrB,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC7B,KAAoB,EACpB,QAA0B,EAC1B,MAAqB;IAErB,MAAM,cAAc,GAAG,KAAK,CAAC,eAAe;QAC3C,CAAC,CAAC,uCAAuC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC3E,CAAC,CAAC,sHAAsH,CAAC;IAE1H,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,cAAc,CAAC;QAC9C,KAAK,EAAE,MAAM,WAAW,CAAC,QAAQ,CAAC;QAClC,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE;;;;;;;EAOR,cAAc;;;;EAId,KAAK,CAAC,IAAI;;;iEAGqD;KAC/D,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAEpE,OAAO;QACN,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,KAAK,EAAE,UAAU;KACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { BudgetTracker } from "../budget.js";
2
+ import type { ResolvedProvider } from "../provider.js";
3
+ import type { ExtractInput, ExtractResult } from "../types.js";
4
+ export declare function extract(input: ExtractInput, provider: ResolvedProvider, budget: BudgetTracker): Promise<ExtractResult>;
5
+ //# sourceMappingURL=extract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/functions/extract.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAwB/D,wBAAsB,OAAO,CAC5B,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,aAAa,GACnB,OAAO,CAAC,aAAa,CAAC,CAuCxB"}
@@ -0,0 +1,57 @@
1
+ import { generateObject } from "ai";
2
+ import { z } from "zod";
3
+ import { createModel } from "./model-factory.js";
4
+ import { recordUsage } from "./usage.js";
5
+ const extractSchema = z.object({
6
+ entities: z.array(z.object({
7
+ type: z.string(),
8
+ name: z.string(),
9
+ aliases: z.array(z.string()),
10
+ confidence: z.number().min(0).max(1),
11
+ })),
12
+ relations: z.array(z.object({
13
+ from_entity: z.string(),
14
+ to_entity: z.string(),
15
+ relation_type: z.string(),
16
+ confidence: z.number().min(0).max(1),
17
+ evidence: z.string(),
18
+ })),
19
+ });
20
+ export async function extract(input, provider, budget) {
21
+ const existingContext = input.existing_entities?.length
22
+ ? `\nExisting entities in the knowledge graph (you may create relations to these):\n${input.existing_entities.map((e) => `- ${e.name} (${e.type})`).join("\n")}`
23
+ : "";
24
+ const { object, usage } = await generateObject({
25
+ model: await createModel(provider),
26
+ schema: extractSchema,
27
+ maxTokens: 16384,
28
+ prompt: `You are an entity and relation extractor for a knowledge graph. Extract the most important named entities and their relationships from the following text.
29
+
30
+ Focus on concrete, named entities — not generic concepts. Limit to the 30 most significant entities.
31
+
32
+ Entity types to look for: client, technology, service, person, organization, concept, project, location, event.
33
+
34
+ For each entity provide:
35
+ - type: the entity category
36
+ - name: the canonical name
37
+ - aliases: alternative names or abbreviations
38
+ - confidence: 0.0-1.0 how confident you are this is a real entity
39
+
40
+ For each relation provide:
41
+ - from_entity / to_entity: entity names (must match extracted entities or existing ones)
42
+ - relation_type: e.g. "uses", "built_on", "employs", "located_in", "needs", "provides"
43
+ - confidence: 0.0-1.0
44
+ - evidence: the text snippet supporting this relation
45
+ ${existingContext}
46
+
47
+ Source file: ${input.file_path}
48
+
49
+ Text to analyze:
50
+ ---
51
+ ${input.text}
52
+ ---`,
53
+ });
54
+ const tokenUsage = recordUsage(budget, provider, usage, "extract");
55
+ return { entities: object.entities, relations: object.relations, usage: tokenUsage };
56
+ }
57
+ //# sourceMappingURL=extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/functions/extract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,QAAQ,EAAE,CAAC,CAAC,KAAK,CAChB,CAAC,CAAC,MAAM,CAAC;QACR,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC5B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;KACpC,CAAC,CACF;IACD,SAAS,EAAE,CAAC,CAAC,KAAK,CACjB,CAAC,CAAC,MAAM,CAAC;QACR,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;QACzB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACpC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;KACpB,CAAC,CACF;CACD,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC5B,KAAmB,EACnB,QAA0B,EAC1B,MAAqB;IAErB,MAAM,eAAe,GAAG,KAAK,CAAC,iBAAiB,EAAE,MAAM;QACtD,CAAC,CAAC,oFAAoF,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAChK,CAAC,CAAC,EAAE,CAAC;IAEN,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,cAAc,CAAC;QAC9C,KAAK,EAAE,MAAM,WAAW,CAAC,QAAQ,CAAC;QAClC,MAAM,EAAE,aAAa;QACrB,SAAS,EAAE,KAAK;QAChB,MAAM,EAAE;;;;;;;;;;;;;;;;;EAiBR,eAAe;;eAEF,KAAK,CAAC,SAAS;;;;EAI5B,KAAK,CAAC,IAAI;IACR;KACF,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAEnE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACtF,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { BudgetTracker } from "../budget.js";
2
+ import type { ResolvedProvider } from "../provider.js";
3
+ import type { FindGapsInput, FindGapsResult } from "../types.js";
4
+ export declare function findGaps(input: FindGapsInput, provider: ResolvedProvider, budget: BudgetTracker): Promise<FindGapsResult>;
5
+ //# sourceMappingURL=find-gaps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-gaps.d.ts","sourceRoot":"","sources":["../../src/functions/find-gaps.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAgBjE,wBAAsB,QAAQ,CAC7B,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,aAAa,GACnB,OAAO,CAAC,cAAc,CAAC,CAwCzB"}
@@ -0,0 +1,51 @@
1
+ import { generateObject } from "ai";
2
+ import { z } from "zod";
3
+ import { createModel } from "./model-factory.js";
4
+ import { recordUsage } from "./usage.js";
5
+ const findGapsSchema = z.object({
6
+ gaps: z.array(z.object({
7
+ entity_name: z.string(),
8
+ entity_type: z.string(),
9
+ suggested_content_type: z.string(),
10
+ priority: z.enum(["high", "medium", "low"]),
11
+ reason: z.string(),
12
+ })),
13
+ });
14
+ export async function findGaps(input, provider, budget) {
15
+ const entityList = input.entities.map((e) => `- ${e.name} (${e.type})`).join("\n");
16
+ const relationList = input.relations.length > 0
17
+ ? input.relations.map((r) => `- ${r.from} --[${r.type}]--> ${r.to}`).join("\n")
18
+ : "No relations yet.";
19
+ const contentList = input.existing_content.length > 0
20
+ ? input.existing_content.map((c) => `- ${c.path}: "${c.title}" — ${c.summary}`).join("\n")
21
+ : "No content yet.";
22
+ const businessContext = input.business_context
23
+ ? `\nBusiness context:\n${input.business_context}\n`
24
+ : "";
25
+ const { object, usage } = await generateObject({
26
+ model: await createModel(provider),
27
+ schema: findGapsSchema,
28
+ prompt: `You are a content gap analyzer for a content engine. Identify entities from the knowledge graph that should have dedicated content pages but currently don't.
29
+
30
+ Knowledge graph entities:
31
+ ${entityList}
32
+
33
+ Relations:
34
+ ${relationList}
35
+
36
+ Existing content:
37
+ ${contentList}
38
+ ${businessContext}
39
+
40
+ For each gap, determine:
41
+ - Which entity lacks content
42
+ - What type of content would best serve it (blog-post, case-study, service-page, landing-page, documentation)
43
+ - Priority: "high" (core business entity, many relations), "medium" (useful but not critical), "low" (nice to have)
44
+ - Why this gap matters
45
+
46
+ Only report genuine gaps.`,
47
+ });
48
+ const tokenUsage = recordUsage(budget, provider, usage, "findGaps");
49
+ return { gaps: object.gaps, usage: tokenUsage };
50
+ }
51
+ //# sourceMappingURL=find-gaps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-gaps.js","sourceRoot":"","sources":["../../src/functions/find-gaps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,IAAI,EAAE,CAAC,CAAC,KAAK,CACZ,CAAC,CAAC,MAAM,CAAC;QACR,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,sBAAsB,EAAE,CAAC,CAAC,MAAM,EAAE;QAClC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC3C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;KAClB,CAAC,CACF;CACD,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC7B,KAAoB,EACpB,QAA0B,EAC1B,MAAqB;IAErB,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnF,MAAM,YAAY,GACjB,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;QACzB,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/E,CAAC,CAAC,mBAAmB,CAAC;IACxB,MAAM,WAAW,GAChB,KAAK,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC;QAChC,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1F,CAAC,CAAC,iBAAiB,CAAC;IACtB,MAAM,eAAe,GAAG,KAAK,CAAC,gBAAgB;QAC7C,CAAC,CAAC,wBAAwB,KAAK,CAAC,gBAAgB,IAAI;QACpD,CAAC,CAAC,EAAE,CAAC;IAEN,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,cAAc,CAAC;QAC9C,KAAK,EAAE,MAAM,WAAW,CAAC,QAAQ,CAAC;QAClC,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE;;;EAGR,UAAU;;;EAGV,YAAY;;;EAGZ,WAAW;EACX,eAAe;;;;;;;;0BAQS;KACxB,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IACpE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AACjD,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { BudgetTracker } from "../budget.js";
2
+ import type { ResolvedProvider } from "../provider.js";
3
+ import type { GenerateInput, GenerateResult } from "../types.js";
4
+ export declare function generate(input: GenerateInput, provider: ResolvedProvider, budget: BudgetTracker): Promise<GenerateResult>;
5
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/functions/generate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AASjE,wBAAsB,QAAQ,CAC7B,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,aAAa,GACnB,OAAO,CAAC,cAAc,CAAC,CAiCzB"}
@@ -0,0 +1,39 @@
1
+ import { generateObject } from "ai";
2
+ import { z } from "zod";
3
+ import { createModel } from "./model-factory.js";
4
+ import { recordUsage } from "./usage.js";
5
+ const generateSchema = z.object({
6
+ frontmatter: z.record(z.unknown()),
7
+ body: z.string(),
8
+ });
9
+ export async function generate(input, provider, budget) {
10
+ const intentSection = input.intent
11
+ ? `\nIntent/tone-of-voice rules:\n---\n${input.intent}\n---\n`
12
+ : "";
13
+ const schemaSection = input.collection_schema
14
+ ? `\nExpected frontmatter fields:\n${JSON.stringify(input.collection_schema, null, 2)}\n`
15
+ : "";
16
+ const { object, usage } = await generateObject({
17
+ model: await createModel(provider),
18
+ schema: generateSchema,
19
+ prompt: `${input.generation_prompt}
20
+
21
+ You are generating content of type "${input.content_type}" for a content engine. Use ONLY the knowledge context provided below. Do not invent facts.
22
+
23
+ Knowledge context:
24
+ ---
25
+ ${input.knowledge_context}
26
+ ---
27
+ ${intentSection}${schemaSection}
28
+ Return a JSON object with:
29
+ - "frontmatter": an object with metadata fields (title, description, etc.)
30
+ - "body": the full content body in markdown format`,
31
+ });
32
+ const tokenUsage = recordUsage(budget, provider, usage, "generate");
33
+ return {
34
+ content: object.body,
35
+ frontmatter: object.frontmatter,
36
+ usage: tokenUsage,
37
+ };
38
+ }
39
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/functions/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAClC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;CAChB,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC7B,KAAoB,EACpB,QAA0B,EAC1B,MAAqB;IAErB,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM;QACjC,CAAC,CAAC,uCAAuC,KAAK,CAAC,MAAM,SAAS;QAC9D,CAAC,CAAC,EAAE,CAAC;IAEN,MAAM,aAAa,GAAG,KAAK,CAAC,iBAAiB;QAC5C,CAAC,CAAC,mCAAmC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI;QACzF,CAAC,CAAC,EAAE,CAAC;IAEN,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,cAAc,CAAC;QAC9C,KAAK,EAAE,MAAM,WAAW,CAAC,QAAQ,CAAC;QAClC,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,GAAG,KAAK,CAAC,iBAAiB;;sCAEE,KAAK,CAAC,YAAY;;;;EAItD,KAAK,CAAC,iBAAiB;;EAEvB,aAAa,GAAG,aAAa;;;mDAGoB;KACjD,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAEpE,OAAO;QACN,OAAO,EAAE,MAAM,CAAC,IAAI;QACpB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,KAAK,EAAE,UAAU;KACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { BudgetTracker } from "../budget.js";
2
+ import type { ResolvedProvider } from "../provider.js";
3
+ import type { ImprovePromptInput, ImprovePromptResult } from "../types.js";
4
+ export declare function improvePrompt(input: ImprovePromptInput, provider: ResolvedProvider, budget: BudgetTracker): Promise<ImprovePromptResult>;
5
+ //# sourceMappingURL=improve-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improve-prompt.d.ts","sourceRoot":"","sources":["../../src/functions/improve-prompt.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAS3E,wBAAsB,aAAa,CAClC,KAAK,EAAE,kBAAkB,EACzB,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,aAAa,GACnB,OAAO,CAAC,mBAAmB,CAAC,CA8B9B"}
@@ -0,0 +1,38 @@
1
+ import { generateObject } from "ai";
2
+ import { z } from "zod";
3
+ import { createModel } from "./model-factory.js";
4
+ import { recordUsage } from "./usage.js";
5
+ const improvePromptSchema = z.object({
6
+ improved_prompt: z.string(),
7
+ changes_summary: z.string(),
8
+ });
9
+ export async function improvePrompt(input, provider, budget) {
10
+ const { object, usage } = await generateObject({
11
+ model: await createModel(provider),
12
+ schema: improvePromptSchema,
13
+ prompt: `You are a prompt engineer improving a content generation prompt. The current prompt was used to generate "${input.content_type}" content, but the judge gave it a score of ${input.judge_score}/100.
14
+
15
+ Current generation prompt:
16
+ ---
17
+ ${input.current_prompt}
18
+ ---
19
+
20
+ Judge's reasoning for the low score:
21
+ ---
22
+ ${input.judge_reasoning}
23
+ ---
24
+
25
+ Improve the generation prompt to address the judge's feedback. Keep the same overall structure but make it more specific about what the judge found lacking. Do NOT change the fundamental approach — just refine the instructions.
26
+
27
+ Return:
28
+ - "improved_prompt": the full improved prompt text
29
+ - "changes_summary": a brief summary of what you changed and why`,
30
+ });
31
+ const tokenUsage = recordUsage(budget, provider, usage, "improvePrompt");
32
+ return {
33
+ improved_prompt: object.improved_prompt,
34
+ changes_summary: object.changes_summary,
35
+ usage: tokenUsage,
36
+ };
37
+ }
38
+ //# sourceMappingURL=improve-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"improve-prompt.js","sourceRoot":"","sources":["../../src/functions/improve-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;IAC3B,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;CAC3B,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,aAAa,CAClC,KAAyB,EACzB,QAA0B,EAC1B,MAAqB;IAErB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,cAAc,CAAC;QAC9C,KAAK,EAAE,MAAM,WAAW,CAAC,QAAQ,CAAC;QAClC,MAAM,EAAE,mBAAmB;QAC3B,MAAM,EAAE,6GAA6G,KAAK,CAAC,YAAY,+CAA+C,KAAK,CAAC,WAAW;;;;EAIvM,KAAK,CAAC,cAAc;;;;;EAKpB,KAAK,CAAC,eAAe;;;;;;;iEAO0C;KAC/D,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;IAEzE,OAAO;QACN,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,KAAK,EAAE,UAAU;KACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ export { classify } from "./classify.js";
2
+ export { extract } from "./extract.js";
3
+ export { score } from "./score.js";
4
+ export { judge } from "./judge.js";
5
+ export { detectStaleness } from "./staleness.js";
6
+ export { analyzeIntentImpact } from "./intent-impact.js";
7
+ export { findGaps } from "./find-gaps.js";
8
+ export { generate } from "./generate.js";
9
+ export { improvePrompt } from "./improve-prompt.js";
10
+ export { recordUsage } from "./usage.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/functions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,11 @@
1
+ export { classify } from "./classify.js";
2
+ export { extract } from "./extract.js";
3
+ export { score } from "./score.js";
4
+ export { judge } from "./judge.js";
5
+ export { detectStaleness } from "./staleness.js";
6
+ export { analyzeIntentImpact } from "./intent-impact.js";
7
+ export { findGaps } from "./find-gaps.js";
8
+ export { generate } from "./generate.js";
9
+ export { improvePrompt } from "./improve-prompt.js";
10
+ export { recordUsage } from "./usage.js";
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/functions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { BudgetTracker } from "../budget.js";
2
+ import type { ResolvedProvider } from "../provider.js";
3
+ import type { IntentImpactInput, IntentImpactResult } from "../types.js";
4
+ export declare function analyzeIntentImpact(input: IntentImpactInput, provider: ResolvedProvider, budget: BudgetTracker): Promise<IntentImpactResult>;
5
+ //# sourceMappingURL=intent-impact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intent-impact.d.ts","sourceRoot":"","sources":["../../src/functions/intent-impact.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAWzE,wBAAsB,mBAAmB,CACxC,KAAK,EAAE,iBAAiB,EACxB,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,aAAa,GACnB,OAAO,CAAC,kBAAkB,CAAC,CAoC7B"}
@@ -0,0 +1,45 @@
1
+ import { generateObject } from "ai";
2
+ import { z } from "zod";
3
+ import { createModel } from "./model-factory.js";
4
+ import { recordUsage } from "./usage.js";
5
+ const intentImpactSchema = z.object({
6
+ affected_pages: z.array(z.object({ path: z.string(), impact: z.enum(["high", "medium", "low"]), reason: z.string() })),
7
+ summary: z.string(),
8
+ });
9
+ export async function analyzeIntentImpact(input, provider, budget) {
10
+ const contentList = input.content_pages
11
+ .map((p) => `Page: ${p.path}\n---\n${p.text}\n---`)
12
+ .join("\n\n");
13
+ const { object, usage } = await generateObject({
14
+ model: await createModel(provider),
15
+ schema: intentImpactSchema,
16
+ prompt: `You are an intent impact analyzer for a content engine. When editorial intent rules change, you identify which published content pages are affected.
17
+
18
+ Previous intent rules:
19
+ ---
20
+ ${input.previous_intent}
21
+ ---
22
+
23
+ New intent rules:
24
+ ---
25
+ ${input.changed_intent}
26
+ ---
27
+
28
+ Analyze each content page and determine if it violates the NEW rules (but was fine under the old rules).
29
+
30
+ Impact levels:
31
+ - "high": Directly violates new rules (e.g., uses a now-forbidden word, wrong tone)
32
+ - "medium": Partially misaligned, needs revision
33
+ - "low": Minor adjustment needed
34
+
35
+ Only include pages that are actually affected.
36
+
37
+ Content pages:
38
+ ${contentList}
39
+
40
+ Return the list of affected pages with impact level and reason, plus a brief summary.`,
41
+ });
42
+ const tokenUsage = recordUsage(budget, provider, usage, "analyzeIntentImpact");
43
+ return { affected_pages: object.affected_pages, summary: object.summary, usage: tokenUsage };
44
+ }
45
+ //# sourceMappingURL=intent-impact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intent-impact.js","sourceRoot":"","sources":["../../src/functions/intent-impact.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,cAAc,EAAE,CAAC,CAAC,KAAK,CACtB,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC7F;IACD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;CACnB,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACxC,KAAwB,EACxB,QAA0B,EAC1B,MAAqB;IAErB,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa;SACrC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,IAAI,OAAO,CAAC;SAClD,IAAI,CAAC,MAAM,CAAC,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,cAAc,CAAC;QAC9C,KAAK,EAAE,MAAM,WAAW,CAAC,QAAQ,CAAC;QAClC,MAAM,EAAE,kBAAkB;QAC1B,MAAM,EAAE;;;;EAIR,KAAK,CAAC,eAAe;;;;;EAKrB,KAAK,CAAC,cAAc;;;;;;;;;;;;;EAapB,WAAW;;sFAEyE;KACpF,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,qBAAqB,CAAC,CAAC;IAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AAC9F,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { BudgetTracker } from "../budget.js";
2
+ import type { ResolvedProvider } from "../provider.js";
3
+ import type { JudgeInput, JudgeResult } from "../types.js";
4
+ export declare function judge(input: JudgeInput, provider: ResolvedProvider, budget: BudgetTracker): Promise<JudgeResult>;
5
+ //# sourceMappingURL=judge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"judge.d.ts","sourceRoot":"","sources":["../../src/functions/judge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAM3D,wBAAsB,KAAK,CAC1B,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,gBAAgB,EAC1B,MAAM,EAAE,aAAa,GACnB,OAAO,CAAC,WAAW,CAAC,CA0BtB"}
@@ -0,0 +1,32 @@
1
+ import { generateObject } from "ai";
2
+ import { z } from "zod";
3
+ import { createModel } from "./model-factory.js";
4
+ import { recordUsage } from "./usage.js";
5
+ const judgeSchema = z.object({ score: z.number().min(0).max(100), reasoning: z.string() });
6
+ export async function judge(input, provider, budget) {
7
+ const intentSection = input.intent
8
+ ? `\nIntent/tone-of-voice rules:\n---\n${input.intent}\n---\n`
9
+ : "";
10
+ const { object, usage } = await generateObject({
11
+ model: await createModel(provider),
12
+ schema: judgeSchema,
13
+ prompt: `${input.judge_prompt}
14
+
15
+ You are evaluating a content draft against a gold standard example. Compare quality, structure, specificity, tone, and accuracy.
16
+
17
+ Gold standard (this is what "perfect" looks like):
18
+ ---
19
+ ${input.gold_standard}
20
+ ---
21
+ ${intentSection}
22
+ Draft to evaluate:
23
+ ---
24
+ ${input.draft}
25
+ ---
26
+
27
+ Return a single score (0-100) and detailed reasoning explaining the score.`,
28
+ });
29
+ const tokenUsage = recordUsage(budget, provider, usage, "judge");
30
+ return { score: object.score, reasoning: object.reasoning, usage: tokenUsage };
31
+ }
32
+ //# sourceMappingURL=judge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"judge.js","sourceRoot":"","sources":["../../src/functions/judge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAE3F,MAAM,CAAC,KAAK,UAAU,KAAK,CAC1B,KAAiB,EACjB,QAA0B,EAC1B,MAAqB;IAErB,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM;QACjC,CAAC,CAAC,uCAAuC,KAAK,CAAC,MAAM,SAAS;QAC9D,CAAC,CAAC,EAAE,CAAC;IACN,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,cAAc,CAAC;QAC9C,KAAK,EAAE,MAAM,WAAW,CAAC,QAAQ,CAAC;QAClC,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE,GAAG,KAAK,CAAC,YAAY;;;;;;EAM7B,KAAK,CAAC,aAAa;;EAEnB,aAAa;;;EAGb,KAAK,CAAC,KAAK;;;2EAG8D;KACzE,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACjE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;AAChF,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { LanguageModel } from "ai";
2
+ import type { ResolvedProvider } from "../provider.js";
3
+ export declare function createModel(provider: ResolvedProvider): Promise<LanguageModel>;
4
+ //# sourceMappingURL=model-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-factory.d.ts","sourceRoot":"","sources":["../../src/functions/model-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,wBAAsB,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC,CAWpF"}