ollama-intern-mcp 1.0.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 (256) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +252 -0
  3. package/SECURITY.md +22 -0
  4. package/dist/corpus/chunker.d.ts +63 -0
  5. package/dist/corpus/chunker.d.ts.map +1 -0
  6. package/dist/corpus/chunker.js +230 -0
  7. package/dist/corpus/chunker.js.map +1 -0
  8. package/dist/corpus/fusion.d.ts +67 -0
  9. package/dist/corpus/fusion.d.ts.map +1 -0
  10. package/dist/corpus/fusion.js +76 -0
  11. package/dist/corpus/fusion.js.map +1 -0
  12. package/dist/corpus/indexer.d.ts +33 -0
  13. package/dist/corpus/indexer.d.ts.map +1 -0
  14. package/dist/corpus/indexer.js +201 -0
  15. package/dist/corpus/indexer.js.map +1 -0
  16. package/dist/corpus/lexical.d.ts +95 -0
  17. package/dist/corpus/lexical.d.ts.map +1 -0
  18. package/dist/corpus/lexical.js +227 -0
  19. package/dist/corpus/lexical.js.map +1 -0
  20. package/dist/corpus/manifest.d.ts +29 -0
  21. package/dist/corpus/manifest.d.ts.map +1 -0
  22. package/dist/corpus/manifest.js +45 -0
  23. package/dist/corpus/manifest.js.map +1 -0
  24. package/dist/corpus/refresh.d.ts +54 -0
  25. package/dist/corpus/refresh.d.ts.map +1 -0
  26. package/dist/corpus/refresh.js +155 -0
  27. package/dist/corpus/refresh.js.map +1 -0
  28. package/dist/corpus/searcher.d.ts +48 -0
  29. package/dist/corpus/searcher.d.ts.map +1 -0
  30. package/dist/corpus/searcher.js +131 -0
  31. package/dist/corpus/searcher.js.map +1 -0
  32. package/dist/corpus/storage.d.ts +56 -0
  33. package/dist/corpus/storage.d.ts.map +1 -0
  34. package/dist/corpus/storage.js +81 -0
  35. package/dist/corpus/storage.js.map +1 -0
  36. package/dist/coverage.d.ts +38 -0
  37. package/dist/coverage.d.ts.map +1 -0
  38. package/dist/coverage.js +117 -0
  39. package/dist/coverage.js.map +1 -0
  40. package/dist/embedMath.d.ts +22 -0
  41. package/dist/embedMath.d.ts.map +1 -0
  42. package/dist/embedMath.js +34 -0
  43. package/dist/embedMath.js.map +1 -0
  44. package/dist/envelope.d.ts +53 -0
  45. package/dist/envelope.d.ts.map +1 -0
  46. package/dist/envelope.js +32 -0
  47. package/dist/envelope.js.map +1 -0
  48. package/dist/errors.d.ts +20 -0
  49. package/dist/errors.d.ts.map +1 -0
  50. package/dist/errors.js +30 -0
  51. package/dist/errors.js.map +1 -0
  52. package/dist/evals/retrieval.d.ts +68 -0
  53. package/dist/evals/retrieval.d.ts.map +1 -0
  54. package/dist/evals/retrieval.js +173 -0
  55. package/dist/evals/retrieval.js.map +1 -0
  56. package/dist/guardrails/citations.d.ts +28 -0
  57. package/dist/guardrails/citations.d.ts.map +1 -0
  58. package/dist/guardrails/citations.js +45 -0
  59. package/dist/guardrails/citations.js.map +1 -0
  60. package/dist/guardrails/compileCheck.d.ts +20 -0
  61. package/dist/guardrails/compileCheck.d.ts.map +1 -0
  62. package/dist/guardrails/compileCheck.js +96 -0
  63. package/dist/guardrails/compileCheck.js.map +1 -0
  64. package/dist/guardrails/confidence.d.ts +21 -0
  65. package/dist/guardrails/confidence.d.ts.map +1 -0
  66. package/dist/guardrails/confidence.js +18 -0
  67. package/dist/guardrails/confidence.js.map +1 -0
  68. package/dist/guardrails/timeouts.d.ts +35 -0
  69. package/dist/guardrails/timeouts.d.ts.map +1 -0
  70. package/dist/guardrails/timeouts.js +58 -0
  71. package/dist/guardrails/timeouts.js.map +1 -0
  72. package/dist/guardrails/writeConfirm.d.ts +25 -0
  73. package/dist/guardrails/writeConfirm.d.ts.map +1 -0
  74. package/dist/guardrails/writeConfirm.js +35 -0
  75. package/dist/guardrails/writeConfirm.js.map +1 -0
  76. package/dist/index.d.ts +12 -0
  77. package/dist/index.d.ts.map +1 -0
  78. package/dist/index.js +153 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/observability.d.ts +66 -0
  81. package/dist/observability.d.ts.map +1 -0
  82. package/dist/observability.js +51 -0
  83. package/dist/observability.js.map +1 -0
  84. package/dist/ollama.d.ts +105 -0
  85. package/dist/ollama.d.ts.map +1 -0
  86. package/dist/ollama.js +109 -0
  87. package/dist/ollama.js.map +1 -0
  88. package/dist/prewarm.d.ts +28 -0
  89. package/dist/prewarm.d.ts.map +1 -0
  90. package/dist/prewarm.js +69 -0
  91. package/dist/prewarm.js.map +1 -0
  92. package/dist/profiles.d.ts +54 -0
  93. package/dist/profiles.d.ts.map +1 -0
  94. package/dist/profiles.js +95 -0
  95. package/dist/profiles.js.map +1 -0
  96. package/dist/protectedPaths.d.ts +33 -0
  97. package/dist/protectedPaths.d.ts.map +1 -0
  98. package/dist/protectedPaths.js +54 -0
  99. package/dist/protectedPaths.js.map +1 -0
  100. package/dist/runContext.d.ts +21 -0
  101. package/dist/runContext.d.ts.map +1 -0
  102. package/dist/runContext.js +9 -0
  103. package/dist/runContext.js.map +1 -0
  104. package/dist/semaphore.d.ts +16 -0
  105. package/dist/semaphore.d.ts.map +1 -0
  106. package/dist/semaphore.js +37 -0
  107. package/dist/semaphore.js.map +1 -0
  108. package/dist/sources.d.ts +19 -0
  109. package/dist/sources.d.ts.map +1 -0
  110. package/dist/sources.js +41 -0
  111. package/dist/sources.js.map +1 -0
  112. package/dist/tiers.d.ts +39 -0
  113. package/dist/tiers.d.ts.map +1 -0
  114. package/dist/tiers.js +44 -0
  115. package/dist/tiers.js.map +1 -0
  116. package/dist/tools/artifactDiff.d.ts +66 -0
  117. package/dist/tools/artifactDiff.d.ts.map +1 -0
  118. package/dist/tools/artifactDiff.js +66 -0
  119. package/dist/tools/artifactDiff.js.map +1 -0
  120. package/dist/tools/artifactExportToPath.d.ts +38 -0
  121. package/dist/tools/artifactExportToPath.d.ts.map +1 -0
  122. package/dist/tools/artifactExportToPath.js +51 -0
  123. package/dist/tools/artifactExportToPath.js.map +1 -0
  124. package/dist/tools/artifactList.d.ts +60 -0
  125. package/dist/tools/artifactList.d.ts.map +1 -0
  126. package/dist/tools/artifactList.js +107 -0
  127. package/dist/tools/artifactList.js.map +1 -0
  128. package/dist/tools/artifactRead.d.ts +43 -0
  129. package/dist/tools/artifactRead.d.ts.map +1 -0
  130. package/dist/tools/artifactRead.js +83 -0
  131. package/dist/tools/artifactRead.js.map +1 -0
  132. package/dist/tools/artifactSnippets.d.ts +56 -0
  133. package/dist/tools/artifactSnippets.d.ts.map +1 -0
  134. package/dist/tools/artifactSnippets.js +97 -0
  135. package/dist/tools/artifactSnippets.js.map +1 -0
  136. package/dist/tools/artifacts/diff.d.ts +161 -0
  137. package/dist/tools/artifacts/diff.d.ts.map +1 -0
  138. package/dist/tools/artifacts/diff.js +267 -0
  139. package/dist/tools/artifacts/diff.js.map +1 -0
  140. package/dist/tools/artifacts/export.d.ts +43 -0
  141. package/dist/tools/artifacts/export.d.ts.map +1 -0
  142. package/dist/tools/artifacts/export.js +113 -0
  143. package/dist/tools/artifacts/export.js.map +1 -0
  144. package/dist/tools/artifacts/scan.d.ts +86 -0
  145. package/dist/tools/artifacts/scan.d.ts.map +1 -0
  146. package/dist/tools/artifacts/scan.js +251 -0
  147. package/dist/tools/artifacts/scan.js.map +1 -0
  148. package/dist/tools/artifacts/snippets.d.ts +42 -0
  149. package/dist/tools/artifacts/snippets.d.ts.map +1 -0
  150. package/dist/tools/artifacts/snippets.js +165 -0
  151. package/dist/tools/artifacts/snippets.js.map +1 -0
  152. package/dist/tools/batch.d.ts +65 -0
  153. package/dist/tools/batch.d.ts.map +1 -0
  154. package/dist/tools/batch.js +117 -0
  155. package/dist/tools/batch.js.map +1 -0
  156. package/dist/tools/briefs/common.d.ts +65 -0
  157. package/dist/tools/briefs/common.d.ts.map +1 -0
  158. package/dist/tools/briefs/common.js +128 -0
  159. package/dist/tools/briefs/common.js.map +1 -0
  160. package/dist/tools/briefs/evidence.d.ts +40 -0
  161. package/dist/tools/briefs/evidence.d.ts.map +1 -0
  162. package/dist/tools/briefs/evidence.js +103 -0
  163. package/dist/tools/briefs/evidence.js.map +1 -0
  164. package/dist/tools/changeBrief.d.ts +85 -0
  165. package/dist/tools/changeBrief.d.ts.map +1 -0
  166. package/dist/tools/changeBrief.js +228 -0
  167. package/dist/tools/changeBrief.js.map +1 -0
  168. package/dist/tools/chat.d.ts +42 -0
  169. package/dist/tools/chat.d.ts.map +1 -0
  170. package/dist/tools/chat.js +49 -0
  171. package/dist/tools/chat.js.map +1 -0
  172. package/dist/tools/classify.d.ts +56 -0
  173. package/dist/tools/classify.d.ts.map +1 -0
  174. package/dist/tools/classify.js +103 -0
  175. package/dist/tools/classify.js.map +1 -0
  176. package/dist/tools/corpusAnswer.d.ts +79 -0
  177. package/dist/tools/corpusAnswer.d.ts.map +1 -0
  178. package/dist/tools/corpusAnswer.js +259 -0
  179. package/dist/tools/corpusAnswer.js.map +1 -0
  180. package/dist/tools/corpusIndex.d.ts +30 -0
  181. package/dist/tools/corpusIndex.d.ts.map +1 -0
  182. package/dist/tools/corpusIndex.js +67 -0
  183. package/dist/tools/corpusIndex.js.map +1 -0
  184. package/dist/tools/corpusList.d.ts +19 -0
  185. package/dist/tools/corpusList.d.ts.map +1 -0
  186. package/dist/tools/corpusList.js +34 -0
  187. package/dist/tools/corpusList.js.map +1 -0
  188. package/dist/tools/corpusRefresh.d.ts +29 -0
  189. package/dist/tools/corpusRefresh.d.ts.map +1 -0
  190. package/dist/tools/corpusRefresh.js +58 -0
  191. package/dist/tools/corpusRefresh.js.map +1 -0
  192. package/dist/tools/corpusSearch.d.ts +44 -0
  193. package/dist/tools/corpusSearch.d.ts.map +1 -0
  194. package/dist/tools/corpusSearch.js +80 -0
  195. package/dist/tools/corpusSearch.js.map +1 -0
  196. package/dist/tools/draft.d.ts +38 -0
  197. package/dist/tools/draft.d.ts.map +1 -0
  198. package/dist/tools/draft.js +72 -0
  199. package/dist/tools/draft.js.map +1 -0
  200. package/dist/tools/embed.d.ts +27 -0
  201. package/dist/tools/embed.d.ts.map +1 -0
  202. package/dist/tools/embed.js +41 -0
  203. package/dist/tools/embed.js.map +1 -0
  204. package/dist/tools/embedSearch.d.ts +58 -0
  205. package/dist/tools/embedSearch.d.ts.map +1 -0
  206. package/dist/tools/embedSearch.js +76 -0
  207. package/dist/tools/embedSearch.js.map +1 -0
  208. package/dist/tools/extract.d.ts +58 -0
  209. package/dist/tools/extract.d.ts.map +1 -0
  210. package/dist/tools/extract.js +93 -0
  211. package/dist/tools/extract.js.map +1 -0
  212. package/dist/tools/incidentBrief.d.ts +81 -0
  213. package/dist/tools/incidentBrief.d.ts.map +1 -0
  214. package/dist/tools/incidentBrief.js +252 -0
  215. package/dist/tools/incidentBrief.js.map +1 -0
  216. package/dist/tools/packs/changePack.d.ts +166 -0
  217. package/dist/tools/packs/changePack.d.ts.map +1 -0
  218. package/dist/tools/packs/changePack.js +470 -0
  219. package/dist/tools/packs/changePack.js.map +1 -0
  220. package/dist/tools/packs/incidentPack.d.ts +125 -0
  221. package/dist/tools/packs/incidentPack.d.ts.map +1 -0
  222. package/dist/tools/packs/incidentPack.js +354 -0
  223. package/dist/tools/packs/incidentPack.js.map +1 -0
  224. package/dist/tools/packs/repoPack.d.ts +207 -0
  225. package/dist/tools/packs/repoPack.d.ts.map +1 -0
  226. package/dist/tools/packs/repoPack.js +456 -0
  227. package/dist/tools/packs/repoPack.js.map +1 -0
  228. package/dist/tools/repoBrief.d.ts +81 -0
  229. package/dist/tools/repoBrief.d.ts.map +1 -0
  230. package/dist/tools/repoBrief.js +213 -0
  231. package/dist/tools/repoBrief.js.map +1 -0
  232. package/dist/tools/research.d.ts +45 -0
  233. package/dist/tools/research.d.ts.map +1 -0
  234. package/dist/tools/research.js +100 -0
  235. package/dist/tools/research.js.map +1 -0
  236. package/dist/tools/runner.d.ts +24 -0
  237. package/dist/tools/runner.d.ts.map +1 -0
  238. package/dist/tools/runner.js +47 -0
  239. package/dist/tools/runner.js.map +1 -0
  240. package/dist/tools/summarizeDeep.d.ts +49 -0
  241. package/dist/tools/summarizeDeep.d.ts.map +1 -0
  242. package/dist/tools/summarizeDeep.js +109 -0
  243. package/dist/tools/summarizeDeep.js.map +1 -0
  244. package/dist/tools/summarizeFast.d.ts +28 -0
  245. package/dist/tools/summarizeFast.d.ts.map +1 -0
  246. package/dist/tools/summarizeFast.js +43 -0
  247. package/dist/tools/summarizeFast.js.map +1 -0
  248. package/dist/tools/triageLogs.d.ts +51 -0
  249. package/dist/tools/triageLogs.d.ts.map +1 -0
  250. package/dist/tools/triageLogs.js +96 -0
  251. package/dist/tools/triageLogs.js.map +1 -0
  252. package/dist/version.d.ts +2 -0
  253. package/dist/version.d.ts.map +1 -0
  254. package/dist/version.js +2 -0
  255. package/dist/version.js.map +1 -0
  256. package/package.json +60 -0
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Pack-specific snippet tools.
3
+ *
4
+ * Three MCP handlers, one per pack, each rendering a compact
5
+ * markdown fragment from an existing artifact. No model calls,
6
+ * no re-packaging — pure derivation from stored JSON.
7
+ *
8
+ * Separate tools because the whole value is pack-shaped — a single
9
+ * generic snippet tool would flatten distinct useful fragments into
10
+ * lowest-common-denominator mush.
11
+ */
12
+ import { z } from "zod";
13
+ import { buildEnvelope } from "../envelope.js";
14
+ import { callEvent } from "../observability.js";
15
+ import { InternError } from "../errors.js";
16
+ import { resolveArtifactByIdentity, readArtifactAtPath, } from "./artifacts/scan.js";
17
+ import { renderIncidentNote, renderOnboardingSection, renderReleaseNote, } from "./artifacts/snippets.js";
18
+ const baseSnippetSchema = {
19
+ slug: z.string().min(1).describe("Slug of the source artifact (from artifact_list)."),
20
+ extra_artifact_dirs: z
21
+ .array(z.string().min(1))
22
+ .optional()
23
+ .describe("Extra read-only search dirs (same as artifact_read)."),
24
+ };
25
+ // ── incident_note_snippet ──────────────────────────────────
26
+ export const artifactIncidentNoteSnippetSchema = z.object(baseSnippetSchema);
27
+ export async function handleArtifactIncidentNoteSnippet(input, ctx) {
28
+ const startedAt = Date.now();
29
+ const extraDirs = input.extra_artifact_dirs ?? [];
30
+ const metadata = await resolveArtifactByIdentity("incident_pack", input.slug, { extra_artifact_dirs: extraDirs });
31
+ const artifact = await readArtifactAtPath(metadata.json_path, { extra_artifact_dirs: extraDirs });
32
+ if (artifact.pack !== "incident_pack") {
33
+ throw new InternError("SCHEMA_INVALID", `Artifact at ${metadata.json_path} is not an incident_pack artifact (found ${artifact.pack}).`, "Pick a slug that belongs to an incident_pack artifact. Use artifact_list to browse.", false);
34
+ }
35
+ const rendered = renderIncidentNote(artifact);
36
+ const envelope = buildEnvelope({
37
+ result: { rendered, metadata },
38
+ tier: "instant",
39
+ model: "",
40
+ hardwareProfile: ctx.hardwareProfile,
41
+ tokensIn: 0,
42
+ tokensOut: 0,
43
+ startedAt,
44
+ residency: null,
45
+ });
46
+ await ctx.logger.log(callEvent("ollama_artifact_incident_note_snippet", envelope));
47
+ return envelope;
48
+ }
49
+ // ── onboarding_section_snippet ─────────────────────────────
50
+ export const artifactOnboardingSectionSnippetSchema = z.object(baseSnippetSchema);
51
+ export async function handleArtifactOnboardingSectionSnippet(input, ctx) {
52
+ const startedAt = Date.now();
53
+ const extraDirs = input.extra_artifact_dirs ?? [];
54
+ const metadata = await resolveArtifactByIdentity("repo_pack", input.slug, { extra_artifact_dirs: extraDirs });
55
+ const artifact = await readArtifactAtPath(metadata.json_path, { extra_artifact_dirs: extraDirs });
56
+ if (artifact.pack !== "repo_pack") {
57
+ throw new InternError("SCHEMA_INVALID", `Artifact at ${metadata.json_path} is not a repo_pack artifact (found ${artifact.pack}).`, "Pick a slug that belongs to a repo_pack artifact. Use artifact_list to browse.", false);
58
+ }
59
+ const rendered = renderOnboardingSection(artifact);
60
+ const envelope = buildEnvelope({
61
+ result: { rendered, metadata },
62
+ tier: "instant",
63
+ model: "",
64
+ hardwareProfile: ctx.hardwareProfile,
65
+ tokensIn: 0,
66
+ tokensOut: 0,
67
+ startedAt,
68
+ residency: null,
69
+ });
70
+ await ctx.logger.log(callEvent("ollama_artifact_onboarding_section_snippet", envelope));
71
+ return envelope;
72
+ }
73
+ // ── release_note_snippet ───────────────────────────────────
74
+ export const artifactReleaseNoteSnippetSchema = z.object(baseSnippetSchema);
75
+ export async function handleArtifactReleaseNoteSnippet(input, ctx) {
76
+ const startedAt = Date.now();
77
+ const extraDirs = input.extra_artifact_dirs ?? [];
78
+ const metadata = await resolveArtifactByIdentity("change_pack", input.slug, { extra_artifact_dirs: extraDirs });
79
+ const artifact = await readArtifactAtPath(metadata.json_path, { extra_artifact_dirs: extraDirs });
80
+ if (artifact.pack !== "change_pack") {
81
+ throw new InternError("SCHEMA_INVALID", `Artifact at ${metadata.json_path} is not a change_pack artifact (found ${artifact.pack}).`, "Pick a slug that belongs to a change_pack artifact. Use artifact_list to browse.", false);
82
+ }
83
+ const rendered = renderReleaseNote(artifact);
84
+ const envelope = buildEnvelope({
85
+ result: { rendered, metadata },
86
+ tier: "instant",
87
+ model: "",
88
+ hardwareProfile: ctx.hardwareProfile,
89
+ tokensIn: 0,
90
+ tokensOut: 0,
91
+ startedAt,
92
+ residency: null,
93
+ });
94
+ await ctx.logger.log(callEvent("ollama_artifact_release_note_snippet", envelope));
95
+ return envelope;
96
+ }
97
+ //# sourceMappingURL=artifactSnippets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifactSnippets.js","sourceRoot":"","sources":["../../src/tools/artifactSnippets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Artifact diff — pack-shaped structured comparison, not generic text diff.
3
+ *
4
+ * Laws:
5
+ * - Same-pack only. Cross-pack diffs throw loudly.
6
+ * - Lists diff as {added, removed, unchanged} matched on a primary key
7
+ * field per item kind. No "changed" bucket in this slice — keep it
8
+ * boring and legible.
9
+ * - Narrative fields diff as {before, after}. release_note_draft also
10
+ * carries a compact LCS line diff because that's where it materially
11
+ * helps review.
12
+ * - Evidence is summarized (counts + referenced paths + path delta),
13
+ * never exploded chunk-by-chunk.
14
+ * - Weak flip gets top billing — surfaced at the envelope level, not
15
+ * buried inside the per-field diff.
16
+ * - Deterministic ordering: every list is sorted by its primary key
17
+ * before returning.
18
+ */
19
+ import type { PackArtifact } from "./scan.js";
20
+ export interface ListDiff<T> {
21
+ added: T[];
22
+ removed: T[];
23
+ unchanged: T[];
24
+ }
25
+ export interface StringDiff {
26
+ before: string;
27
+ after: string;
28
+ }
29
+ export type LineOp = "same" | "add" | "remove";
30
+ export interface LineDiffEntry {
31
+ op: LineOp;
32
+ line: string;
33
+ }
34
+ export interface ReleaseNoteDiff extends StringDiff {
35
+ line_diff: LineDiffEntry[];
36
+ }
37
+ export interface WeakFlip {
38
+ a: boolean;
39
+ b: boolean;
40
+ flipped: boolean;
41
+ /** Present only when flipped: "weakened" (strong → weak) or "strengthened" (weak → strong). */
42
+ direction?: "weakened" | "strengthened";
43
+ }
44
+ export interface EvidenceSummary {
45
+ a: {
46
+ count: number;
47
+ referenced_paths: string[];
48
+ };
49
+ b: {
50
+ count: number;
51
+ referenced_paths: string[];
52
+ };
53
+ path_delta: {
54
+ added: string[];
55
+ removed: string[];
56
+ };
57
+ }
58
+ export interface IncidentDiff {
59
+ root_cause_hypotheses: ListDiff<{
60
+ hypothesis: string;
61
+ confidence: string;
62
+ }>;
63
+ affected_surfaces: ListDiff<{
64
+ surface: string;
65
+ }>;
66
+ timeline_clues: ListDiff<{
67
+ clue: string;
68
+ }>;
69
+ next_checks: ListDiff<{
70
+ check: string;
71
+ why: string;
72
+ }>;
73
+ coverage_notes: ListDiff<string>;
74
+ evidence_summary: EvidenceSummary;
75
+ }
76
+ export interface ExtractedFactsDiff {
77
+ a_present: boolean;
78
+ b_present: boolean;
79
+ package_names?: ListDiff<string>;
80
+ entrypoints?: ListDiff<{
81
+ file: string;
82
+ purpose: string;
83
+ }>;
84
+ scripts?: ListDiff<{
85
+ name: string;
86
+ command: string;
87
+ }>;
88
+ config_files?: ListDiff<string>;
89
+ exposed_surfaces?: ListDiff<string>;
90
+ runtime_hints?: ListDiff<string>;
91
+ scripts_touched?: ListDiff<string>;
92
+ config_surfaces?: ListDiff<string>;
93
+ }
94
+ export interface RepoDiff {
95
+ repo_thesis: StringDiff;
96
+ architecture_shape: StringDiff;
97
+ key_surfaces: ListDiff<{
98
+ surface: string;
99
+ why: string;
100
+ }>;
101
+ risk_areas: ListDiff<{
102
+ risk: string;
103
+ }>;
104
+ read_next: ListDiff<{
105
+ file: string;
106
+ why: string;
107
+ }>;
108
+ coverage_notes: ListDiff<string>;
109
+ extracted_facts: ExtractedFactsDiff;
110
+ evidence_summary: EvidenceSummary;
111
+ }
112
+ export interface ChangeDiff {
113
+ change_summary: StringDiff;
114
+ why_it_matters: StringDiff;
115
+ affected_surfaces: ListDiff<{
116
+ surface: string;
117
+ }>;
118
+ likely_breakpoints: ListDiff<{
119
+ breakpoint: string;
120
+ }>;
121
+ validation_checks: ListDiff<{
122
+ check: string;
123
+ why: string;
124
+ }>;
125
+ release_note_draft: ReleaseNoteDiff;
126
+ coverage_notes: ListDiff<string>;
127
+ extracted_facts: ExtractedFactsDiff;
128
+ evidence_summary: EvidenceSummary;
129
+ }
130
+ export interface ArtifactDiffIdentity {
131
+ slug: string;
132
+ created_at: string;
133
+ title: string;
134
+ }
135
+ export type ArtifactDiffResult = ({
136
+ pack: "incident_pack";
137
+ a: ArtifactDiffIdentity;
138
+ b: ArtifactDiffIdentity;
139
+ weak: WeakFlip;
140
+ diff: IncidentDiff;
141
+ }) | ({
142
+ pack: "repo_pack";
143
+ a: ArtifactDiffIdentity;
144
+ b: ArtifactDiffIdentity;
145
+ weak: WeakFlip;
146
+ diff: RepoDiff;
147
+ }) | ({
148
+ pack: "change_pack";
149
+ a: ArtifactDiffIdentity;
150
+ b: ArtifactDiffIdentity;
151
+ weak: WeakFlip;
152
+ diff: ChangeDiff;
153
+ });
154
+ /**
155
+ * Compact LCS-based line diff. Used only for release_note_draft where
156
+ * it materially helps review. O(m*n); release notes are tiny so this
157
+ * is trivial in practice.
158
+ */
159
+ export declare function lineDiff(before: string, after: string): LineDiffEntry[];
160
+ export declare function diffArtifacts(a: PackArtifact, b: PackArtifact): ArtifactDiffResult;
161
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/tools/artifacts/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,267 @@
1
+ /**
2
+ * Artifact diff — pack-shaped structured comparison, not generic text diff.
3
+ *
4
+ * Laws:
5
+ * - Same-pack only. Cross-pack diffs throw loudly.
6
+ * - Lists diff as {added, removed, unchanged} matched on a primary key
7
+ * field per item kind. No "changed" bucket in this slice — keep it
8
+ * boring and legible.
9
+ * - Narrative fields diff as {before, after}. release_note_draft also
10
+ * carries a compact LCS line diff because that's where it materially
11
+ * helps review.
12
+ * - Evidence is summarized (counts + referenced paths + path delta),
13
+ * never exploded chunk-by-chunk.
14
+ * - Weak flip gets top billing — surfaced at the envelope level, not
15
+ * buried inside the per-field diff.
16
+ * - Deterministic ordering: every list is sorted by its primary key
17
+ * before returning.
18
+ */
19
+ import { InternError } from "../../errors.js";
20
+ // ── Shared helpers ──────────────────────────────────────────
21
+ /**
22
+ * Diff two lists of items using a primary-key function. Items present
23
+ * in both (by key) appear in `unchanged` with the B-side value. Sorts
24
+ * every bucket by the primary key for deterministic output.
25
+ */
26
+ function diffListByKey(a, b, keyOf) {
27
+ const aByKey = new Map();
28
+ const bByKey = new Map();
29
+ for (const item of a)
30
+ aByKey.set(keyOf(item), item);
31
+ for (const item of b)
32
+ bByKey.set(keyOf(item), item);
33
+ const added = [];
34
+ const removed = [];
35
+ const unchanged = [];
36
+ for (const [key, item] of bByKey) {
37
+ if (!aByKey.has(key))
38
+ added.push(item);
39
+ else
40
+ unchanged.push(item);
41
+ }
42
+ for (const [key, item] of aByKey) {
43
+ if (!bByKey.has(key))
44
+ removed.push(item);
45
+ }
46
+ const sortFn = (x, y) => {
47
+ const kx = keyOf(x);
48
+ const ky = keyOf(y);
49
+ return kx < ky ? -1 : kx > ky ? 1 : 0;
50
+ };
51
+ return {
52
+ added: added.sort(sortFn),
53
+ removed: removed.sort(sortFn),
54
+ unchanged: unchanged.sort(sortFn),
55
+ };
56
+ }
57
+ /** String list is a list-of-strings with identity = the string itself. */
58
+ function diffStringList(a, b) {
59
+ return diffListByKey([...(a ?? [])], [...(b ?? [])], (s) => s);
60
+ }
61
+ /**
62
+ * Compact LCS-based line diff. Used only for release_note_draft where
63
+ * it materially helps review. O(m*n); release notes are tiny so this
64
+ * is trivial in practice.
65
+ */
66
+ export function lineDiff(before, after) {
67
+ const a = before.split(/\r?\n/);
68
+ const b = after.split(/\r?\n/);
69
+ const m = a.length;
70
+ const n = b.length;
71
+ const dp = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));
72
+ for (let i = 1; i <= m; i++) {
73
+ for (let j = 1; j <= n; j++) {
74
+ if (a[i - 1] === b[j - 1])
75
+ dp[i][j] = dp[i - 1][j - 1] + 1;
76
+ else
77
+ dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
78
+ }
79
+ }
80
+ const ops = [];
81
+ let i = m;
82
+ let j = n;
83
+ while (i > 0 || j > 0) {
84
+ if (i > 0 && j > 0 && a[i - 1] === b[j - 1]) {
85
+ ops.unshift({ op: "same", line: a[i - 1] });
86
+ i -= 1;
87
+ j -= 1;
88
+ }
89
+ else if (j > 0 && (i === 0 || dp[i][j - 1] >= dp[i - 1][j])) {
90
+ ops.unshift({ op: "add", line: b[j - 1] });
91
+ j -= 1;
92
+ }
93
+ else {
94
+ ops.unshift({ op: "remove", line: a[i - 1] });
95
+ i -= 1;
96
+ }
97
+ }
98
+ return ops;
99
+ }
100
+ /**
101
+ * Pull path-like identity from a single evidence ref. Log refs don't
102
+ * carry paths; corpus/diff refs encode them; path refs ARE paths.
103
+ */
104
+ function pathFromEvidenceRef(kind, ref) {
105
+ if (kind === "path")
106
+ return ref;
107
+ if (kind === "corpus") {
108
+ const hashIdx = ref.indexOf("#");
109
+ return hashIdx > 0 ? ref.slice(0, hashIdx) : ref;
110
+ }
111
+ if (kind === "diff") {
112
+ if (ref === "diff")
113
+ return null;
114
+ if (ref.startsWith("diff:"))
115
+ return ref.slice("diff:".length);
116
+ return null;
117
+ }
118
+ return null;
119
+ }
120
+ function referencedPaths(evidence) {
121
+ const set = new Set();
122
+ for (const e of evidence) {
123
+ const p = pathFromEvidenceRef(e.kind, e.ref);
124
+ if (p)
125
+ set.add(p);
126
+ }
127
+ return [...set].sort();
128
+ }
129
+ function evidenceSummary(a, b) {
130
+ const pathsA = referencedPaths(a);
131
+ const pathsB = referencedPaths(b);
132
+ const setA = new Set(pathsA);
133
+ const setB = new Set(pathsB);
134
+ return {
135
+ a: { count: a.length, referenced_paths: pathsA },
136
+ b: { count: b.length, referenced_paths: pathsB },
137
+ path_delta: {
138
+ added: pathsB.filter((p) => !setA.has(p)).sort(),
139
+ removed: pathsA.filter((p) => !setB.has(p)).sort(),
140
+ },
141
+ };
142
+ }
143
+ function computeWeakFlip(aWeak, bWeak) {
144
+ const flipped = aWeak !== bWeak;
145
+ const result = { a: aWeak, b: bWeak, flipped };
146
+ if (flipped) {
147
+ result.direction = bWeak ? "weakened" : "strengthened";
148
+ }
149
+ return result;
150
+ }
151
+ // ── Per-pack diff functions ─────────────────────────────────
152
+ function diffIncident(a, b) {
153
+ const ab = a.brief;
154
+ const bb = b.brief;
155
+ return {
156
+ root_cause_hypotheses: diffListByKey(ab.root_cause_hypotheses.map((h) => ({ hypothesis: h.hypothesis, confidence: h.confidence })), bb.root_cause_hypotheses.map((h) => ({ hypothesis: h.hypothesis, confidence: h.confidence })), (h) => h.hypothesis),
157
+ affected_surfaces: diffListByKey(ab.affected_surfaces.map((s) => ({ surface: s.surface })), bb.affected_surfaces.map((s) => ({ surface: s.surface })), (s) => s.surface),
158
+ timeline_clues: diffListByKey(ab.timeline_clues.map((c) => ({ clue: c.clue })), bb.timeline_clues.map((c) => ({ clue: c.clue })), (c) => c.clue),
159
+ next_checks: diffListByKey(ab.next_checks.map((c) => ({ check: c.check, why: c.why })), bb.next_checks.map((c) => ({ check: c.check, why: c.why })), (c) => c.check),
160
+ coverage_notes: diffStringList(ab.coverage_notes, bb.coverage_notes),
161
+ evidence_summary: evidenceSummary(ab.evidence, bb.evidence),
162
+ };
163
+ }
164
+ function diffRepoExtractedFacts(a, b) {
165
+ const result = {
166
+ a_present: a !== null,
167
+ b_present: b !== null,
168
+ };
169
+ if (a === null || b === null)
170
+ return result;
171
+ result.package_names = diffStringList(a.package_names, b.package_names);
172
+ result.entrypoints = diffListByKey((a.entrypoints ?? []).map((e) => ({ file: e.file ?? "", purpose: e.purpose ?? "" })), (b.entrypoints ?? []).map((e) => ({ file: e.file ?? "", purpose: e.purpose ?? "" })), (e) => e.file);
173
+ result.scripts = diffListByKey((a.scripts ?? []).map((s) => ({ name: s.name ?? "", command: s.command ?? "" })), (b.scripts ?? []).map((s) => ({ name: s.name ?? "", command: s.command ?? "" })), (s) => s.name);
174
+ result.config_files = diffStringList(a.config_files, b.config_files);
175
+ result.exposed_surfaces = diffStringList(a.exposed_surfaces, b.exposed_surfaces);
176
+ result.runtime_hints = diffStringList(a.runtime_hints, b.runtime_hints);
177
+ return result;
178
+ }
179
+ function diffChangeExtractedFacts(a, b) {
180
+ const result = {
181
+ a_present: a !== null,
182
+ b_present: b !== null,
183
+ };
184
+ if (a === null || b === null)
185
+ return result;
186
+ result.scripts_touched = diffStringList(a.scripts_touched, b.scripts_touched);
187
+ result.config_surfaces = diffStringList(a.config_surfaces, b.config_surfaces);
188
+ result.runtime_hints = diffStringList(a.runtime_hints, b.runtime_hints);
189
+ return result;
190
+ }
191
+ function diffRepo(a, b) {
192
+ const ab = a.brief;
193
+ const bb = b.brief;
194
+ return {
195
+ repo_thesis: { before: ab.repo_thesis, after: bb.repo_thesis },
196
+ architecture_shape: { before: ab.architecture_shape, after: bb.architecture_shape },
197
+ key_surfaces: diffListByKey(ab.key_surfaces.map((s) => ({ surface: s.surface, why: s.why })), bb.key_surfaces.map((s) => ({ surface: s.surface, why: s.why })), (s) => s.surface),
198
+ risk_areas: diffListByKey(ab.risk_areas.map((r) => ({ risk: r.risk })), bb.risk_areas.map((r) => ({ risk: r.risk })), (r) => r.risk),
199
+ read_next: diffListByKey(ab.read_next.map((r) => ({ file: r.file, why: r.why })), bb.read_next.map((r) => ({ file: r.file, why: r.why })), (r) => r.file),
200
+ coverage_notes: diffStringList(ab.coverage_notes, bb.coverage_notes),
201
+ extracted_facts: diffRepoExtractedFacts(a.extracted_facts, b.extracted_facts),
202
+ evidence_summary: evidenceSummary(ab.evidence, bb.evidence),
203
+ };
204
+ }
205
+ function diffChange(a, b) {
206
+ const ab = a.brief;
207
+ const bb = b.brief;
208
+ return {
209
+ change_summary: { before: ab.change_summary, after: bb.change_summary },
210
+ why_it_matters: { before: ab.why_it_matters, after: bb.why_it_matters },
211
+ affected_surfaces: diffListByKey(ab.affected_surfaces.map((s) => ({ surface: s.surface })), bb.affected_surfaces.map((s) => ({ surface: s.surface })), (s) => s.surface),
212
+ likely_breakpoints: diffListByKey(ab.likely_breakpoints.map((bp) => ({ breakpoint: bp.breakpoint })), bb.likely_breakpoints.map((bp) => ({ breakpoint: bp.breakpoint })), (bp) => bp.breakpoint),
213
+ validation_checks: diffListByKey(ab.validation_checks.map((c) => ({ check: c.check, why: c.why })), bb.validation_checks.map((c) => ({ check: c.check, why: c.why })), (c) => c.check),
214
+ release_note_draft: {
215
+ before: ab.release_note_draft,
216
+ after: bb.release_note_draft,
217
+ line_diff: lineDiff(ab.release_note_draft, bb.release_note_draft),
218
+ },
219
+ coverage_notes: diffStringList(ab.coverage_notes, bb.coverage_notes),
220
+ extracted_facts: diffChangeExtractedFacts(a.extracted_facts, b.extracted_facts),
221
+ evidence_summary: evidenceSummary(ab.evidence, bb.evidence),
222
+ };
223
+ }
224
+ // ── Public entry ────────────────────────────────────────────
225
+ function identityOf(art) {
226
+ return { slug: art.slug, created_at: art.generated_at, title: art.title };
227
+ }
228
+ export function diffArtifacts(a, b) {
229
+ if (a.pack !== b.pack) {
230
+ throw new InternError("SCHEMA_INVALID", `Cross-pack diff refused: a.pack="${a.pack}" vs b.pack="${b.pack}"`, "artifact_diff compares within a single pack only (incident ↔ incident, repo ↔ repo, change ↔ change). Pack payloads stay distinct by design.", false);
231
+ }
232
+ const weak = computeWeakFlip(a.brief.weak, b.brief.weak);
233
+ const packName = a.pack;
234
+ if (packName === "incident_pack") {
235
+ const ai = a;
236
+ const bi = b;
237
+ return {
238
+ pack: "incident_pack",
239
+ a: identityOf(ai),
240
+ b: identityOf(bi),
241
+ weak,
242
+ diff: diffIncident(ai, bi),
243
+ };
244
+ }
245
+ if (packName === "repo_pack") {
246
+ const ar = a;
247
+ const br = b;
248
+ return {
249
+ pack: "repo_pack",
250
+ a: identityOf(ar),
251
+ b: identityOf(br),
252
+ weak,
253
+ diff: diffRepo(ar, br),
254
+ };
255
+ }
256
+ // change_pack
257
+ const ac = a;
258
+ const bc = b;
259
+ return {
260
+ pack: "change_pack",
261
+ a: identityOf(ac),
262
+ b: identityOf(bc),
263
+ weak,
264
+ diff: diffChange(ac, bc),
265
+ };
266
+ }
267
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/tools/artifacts/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Artifact markdown export — narrow handoff move, not a generic writer.
3
+ *
4
+ * Laws:
5
+ * - Reads the artifact's EXISTING markdown file. No re-render, no
6
+ * model call.
7
+ * - Prepends a provenance header (HTML comment) so exported files
8
+ * keep identity and point back at the source JSON.
9
+ * - Path safety is strict:
10
+ * - target_path must be absolute
11
+ * - no '..' segments in the input path (checked before normalize)
12
+ * - must end in .md
13
+ * - must live under one of the caller-supplied allowed_roots —
14
+ * no global default. The caller declares where export may
15
+ * write; the tool never guesses.
16
+ * - Overwrite is opt-in. Default refuses when target exists so
17
+ * re-runs never clobber a hand-edited copy silently.
18
+ */
19
+ import type { PackArtifact } from "./scan.js";
20
+ export interface ExportOptions {
21
+ target_path: string;
22
+ allowed_roots: string[];
23
+ overwrite?: boolean;
24
+ }
25
+ export interface ExportResult {
26
+ target_path: string;
27
+ bytes_written: number;
28
+ overwrote: boolean;
29
+ provenance: {
30
+ pack: string;
31
+ slug: string;
32
+ created_at: string;
33
+ source_json_path: string;
34
+ };
35
+ exported_at: string;
36
+ }
37
+ /**
38
+ * Execute the export. Takes the resolved artifact + target details
39
+ * and writes the artifact's existing markdown (with a provenance
40
+ * header prepended) to target_path.
41
+ */
42
+ export declare function exportArtifactMarkdown(artifact: PackArtifact, opts: ExportOptions): Promise<ExportResult>;
43
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../src/tools/artifacts/export.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,WAAW,EAAE,MAAM,CAAC;CACrB;AA6DD;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,YAAY,EACtB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,YAAY,CAAC,CA0EvB"}