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,66 @@
1
+ /**
2
+ * ollama_artifact_diff — structured same-pack comparison.
3
+ *
4
+ * Identity-first: both sides come in as {pack, slug}. No path-based
5
+ * escape hatch in this slice — artifact_read already covers that
6
+ * surface for callers who need it.
7
+ *
8
+ * Cross-pack diffs throw SCHEMA_INVALID. Pack payloads stay distinct
9
+ * by design; a flattened "generic" diff would defeat the job-shape
10
+ * discipline the rest of the product enforces.
11
+ *
12
+ * Weak flip is surfaced at the result top level, not buried inside the
13
+ * field diff — a brief going from strong to weak (or vice versa) is
14
+ * the single most important review signal.
15
+ */
16
+ import { z } from "zod";
17
+ import type { Envelope } from "../envelope.js";
18
+ import type { RunContext } from "../runContext.js";
19
+ import { type PackName } from "./artifacts/scan.js";
20
+ import { type ArtifactDiffResult } from "./artifacts/diff.js";
21
+ export declare const artifactDiffSchema: z.ZodObject<{
22
+ a: z.ZodObject<{
23
+ pack: z.ZodEnum<[PackName, ...PackName[]]>;
24
+ slug: z.ZodString;
25
+ }, "strip", z.ZodTypeAny, {
26
+ pack: PackName;
27
+ slug: string;
28
+ }, {
29
+ pack: PackName;
30
+ slug: string;
31
+ }>;
32
+ b: z.ZodObject<{
33
+ pack: z.ZodEnum<[PackName, ...PackName[]]>;
34
+ slug: z.ZodString;
35
+ }, "strip", z.ZodTypeAny, {
36
+ pack: PackName;
37
+ slug: string;
38
+ }, {
39
+ pack: PackName;
40
+ slug: string;
41
+ }>;
42
+ extra_artifact_dirs: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
43
+ }, "strip", z.ZodTypeAny, {
44
+ a: {
45
+ pack: PackName;
46
+ slug: string;
47
+ };
48
+ b: {
49
+ pack: PackName;
50
+ slug: string;
51
+ };
52
+ extra_artifact_dirs?: string[] | undefined;
53
+ }, {
54
+ a: {
55
+ pack: PackName;
56
+ slug: string;
57
+ };
58
+ b: {
59
+ pack: PackName;
60
+ slug: string;
61
+ };
62
+ extra_artifact_dirs?: string[] | undefined;
63
+ }>;
64
+ export type ArtifactDiffInput = z.infer<typeof artifactDiffSchema>;
65
+ export declare function handleArtifactDiff(input: ArtifactDiffInput, ctx: RunContext): Promise<Envelope<ArtifactDiffResult>>;
66
+ //# sourceMappingURL=artifactDiff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifactDiff.d.ts","sourceRoot":"","sources":["../../src/tools/artifactDiff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAIL,KAAK,QAAQ,EACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAiB,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAO7E,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAO7B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEnE,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,iBAAiB,EACxB,GAAG,EAAE,UAAU,GACd,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CA0CvC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * ollama_artifact_diff — structured same-pack comparison.
3
+ *
4
+ * Identity-first: both sides come in as {pack, slug}. No path-based
5
+ * escape hatch in this slice — artifact_read already covers that
6
+ * surface for callers who need it.
7
+ *
8
+ * Cross-pack diffs throw SCHEMA_INVALID. Pack payloads stay distinct
9
+ * by design; a flattened "generic" diff would defeat the job-shape
10
+ * discipline the rest of the product enforces.
11
+ *
12
+ * Weak flip is surfaced at the result top level, not buried inside the
13
+ * field diff — a brief going from strong to weak (or vice versa) is
14
+ * the single most important review signal.
15
+ */
16
+ import { z } from "zod";
17
+ import { buildEnvelope } from "../envelope.js";
18
+ import { callEvent } from "../observability.js";
19
+ import { InternError } from "../errors.js";
20
+ import { KNOWN_PACKS, resolveArtifactByIdentity, readArtifactAtPath, } from "./artifacts/scan.js";
21
+ import { diffArtifacts } from "./artifacts/diff.js";
22
+ const identitySchema = z.object({
23
+ pack: z.enum(KNOWN_PACKS).describe("Pack identity."),
24
+ slug: z.string().min(1).describe("Artifact slug (filename stem)."),
25
+ });
26
+ export const artifactDiffSchema = z.object({
27
+ a: identitySchema.describe("First artifact identity."),
28
+ b: identitySchema.describe("Second artifact identity. Must share a.pack — cross-pack diffs are refused."),
29
+ extra_artifact_dirs: z
30
+ .array(z.string().min(1))
31
+ .optional()
32
+ .describe("Extra read-only search dirs (same as artifact_list / artifact_read). Canonical identity is still (pack, slug)."),
33
+ });
34
+ export async function handleArtifactDiff(input, ctx) {
35
+ const startedAt = Date.now();
36
+ // Enforce same-pack at the input level too — gives a clearer error
37
+ // than waiting for the payload-level check after both files load.
38
+ if (input.a.pack !== input.b.pack) {
39
+ throw new InternError("SCHEMA_INVALID", `Cross-pack diff refused: a.pack="${input.a.pack}" vs b.pack="${input.b.pack}"`, "artifact_diff compares within a single pack only. Pick two artifacts of the same pack.", false);
40
+ }
41
+ const extraDirs = input.extra_artifact_dirs ?? [];
42
+ // Resolve both sides by identity in parallel — each resolution fails
43
+ // loud on ambiguity or absence, per the Artifact Spine A contract.
44
+ const [metaA, metaB] = await Promise.all([
45
+ resolveArtifactByIdentity(input.a.pack, input.a.slug, { extra_artifact_dirs: extraDirs }),
46
+ resolveArtifactByIdentity(input.b.pack, input.b.slug, { extra_artifact_dirs: extraDirs }),
47
+ ]);
48
+ const [artA, artB] = await Promise.all([
49
+ readArtifactAtPath(metaA.json_path, { extra_artifact_dirs: extraDirs }),
50
+ readArtifactAtPath(metaB.json_path, { extra_artifact_dirs: extraDirs }),
51
+ ]);
52
+ const result = diffArtifacts(artA, artB);
53
+ const envelope = buildEnvelope({
54
+ result,
55
+ tier: "instant", // pure file I/O + in-memory diff; no model call
56
+ model: "",
57
+ hardwareProfile: ctx.hardwareProfile,
58
+ tokensIn: 0,
59
+ tokensOut: 0,
60
+ startedAt,
61
+ residency: null,
62
+ });
63
+ await ctx.logger.log(callEvent("ollama_artifact_diff", envelope));
64
+ return envelope;
65
+ }
66
+ //# sourceMappingURL=artifactDiff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifactDiff.js","sourceRoot":"","sources":["../../src/tools/artifactDiff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * ollama_artifact_export_to_path — handoff move, not a writer framework.
3
+ *
4
+ * Reads the artifact's existing markdown (no re-render, no model call),
5
+ * prepends a provenance header so exported files keep identity, and
6
+ * writes to a caller-supplied absolute path under caller-supplied
7
+ * allowed_roots. Overwrite is opt-in by design.
8
+ */
9
+ import { z } from "zod";
10
+ import type { Envelope } from "../envelope.js";
11
+ import type { RunContext } from "../runContext.js";
12
+ import { type PackName } from "./artifacts/scan.js";
13
+ import { type ExportResult } from "./artifacts/export.js";
14
+ export declare const artifactExportToPathSchema: z.ZodObject<{
15
+ pack: z.ZodEnum<[PackName, ...PackName[]]>;
16
+ slug: z.ZodString;
17
+ target_path: z.ZodString;
18
+ allowed_roots: z.ZodArray<z.ZodString, "many">;
19
+ overwrite: z.ZodOptional<z.ZodBoolean>;
20
+ extra_artifact_dirs: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
21
+ }, "strip", z.ZodTypeAny, {
22
+ target_path: string;
23
+ pack: PackName;
24
+ slug: string;
25
+ allowed_roots: string[];
26
+ extra_artifact_dirs?: string[] | undefined;
27
+ overwrite?: boolean | undefined;
28
+ }, {
29
+ target_path: string;
30
+ pack: PackName;
31
+ slug: string;
32
+ allowed_roots: string[];
33
+ extra_artifact_dirs?: string[] | undefined;
34
+ overwrite?: boolean | undefined;
35
+ }>;
36
+ export type ArtifactExportToPathInput = z.infer<typeof artifactExportToPathSchema>;
37
+ export declare function handleArtifactExportToPath(input: ArtifactExportToPathInput, ctx: RunContext): Promise<Envelope<ExportResult>>;
38
+ //# sourceMappingURL=artifactExportToPath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifactExportToPath.d.ts","sourceRoot":"","sources":["../../src/tools/artifactExportToPath.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAIL,KAAK,QAAQ,EACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAA0B,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAElF,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;EAarC,CAAC;AAEH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAEnF,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,yBAAyB,EAChC,GAAG,EAAE,UAAU,GACd,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAyBjC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * ollama_artifact_export_to_path — handoff move, not a writer framework.
3
+ *
4
+ * Reads the artifact's existing markdown (no re-render, no model call),
5
+ * prepends a provenance header so exported files keep identity, and
6
+ * writes to a caller-supplied absolute path under caller-supplied
7
+ * allowed_roots. Overwrite is opt-in by design.
8
+ */
9
+ import { z } from "zod";
10
+ import { buildEnvelope } from "../envelope.js";
11
+ import { callEvent } from "../observability.js";
12
+ import { KNOWN_PACKS, resolveArtifactByIdentity, readArtifactAtPath, } from "./artifacts/scan.js";
13
+ import { exportArtifactMarkdown } from "./artifacts/export.js";
14
+ export const artifactExportToPathSchema = z.object({
15
+ pack: z.enum(KNOWN_PACKS).describe("Pack identity of the source artifact."),
16
+ slug: z.string().min(1).describe("Source artifact slug."),
17
+ target_path: z.string().min(1).describe("Absolute target path. Must end in .md, must live under one of allowed_roots, no '..' segments."),
18
+ allowed_roots: z
19
+ .array(z.string().min(1))
20
+ .min(1)
21
+ .describe("Absolute directories the export may write into. REQUIRED — the caller declares intent; the tool never guesses a default. Empty list is refused."),
22
+ overwrite: z.boolean().optional().describe("If true, replace an existing file at target_path. Default false; existing files refuse the export so re-runs never clobber hand-edits."),
23
+ extra_artifact_dirs: z
24
+ .array(z.string().min(1))
25
+ .optional()
26
+ .describe("Extra read-only search dirs for locating the source artifact (same as artifact_read)."),
27
+ });
28
+ export async function handleArtifactExportToPath(input, ctx) {
29
+ const startedAt = Date.now();
30
+ const extraDirs = input.extra_artifact_dirs ?? [];
31
+ const metadata = await resolveArtifactByIdentity(input.pack, input.slug, { extra_artifact_dirs: extraDirs });
32
+ const artifact = await readArtifactAtPath(metadata.json_path, { extra_artifact_dirs: extraDirs });
33
+ const result = await exportArtifactMarkdown(artifact, {
34
+ target_path: input.target_path,
35
+ allowed_roots: input.allowed_roots,
36
+ overwrite: input.overwrite,
37
+ });
38
+ const envelope = buildEnvelope({
39
+ result,
40
+ tier: "instant",
41
+ model: "",
42
+ hardwareProfile: ctx.hardwareProfile,
43
+ tokensIn: 0,
44
+ tokensOut: 0,
45
+ startedAt,
46
+ residency: null,
47
+ });
48
+ await ctx.logger.log(callEvent("ollama_artifact_export_to_path", envelope));
49
+ return envelope;
50
+ }
51
+ //# sourceMappingURL=artifactExportToPath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifactExportToPath.js","sourceRoot":"","sources":["../../src/tools/artifactExportToPath.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EACL,WAAW,EACX,yBAAyB,EACzB,kBAAkB,GAEnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,sBAAsB,EAAqB,MAAM,uBAAuB,CAAC;AAElF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,WAAmD,CAAC,CAAC,QAAQ,CAAC,uCAAuC,CAAC;IACnH,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;IACzD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,gGAAgG,CAAC;IACzI,aAAa,EAAE,CAAC;SACb,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACxB,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,iJAAiJ,CAAC;IAC9J,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wIAAwI,CAAC;IACpL,mBAAmB,EAAE,CAAC;SACnB,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACxB,QAAQ,EAAE;SACV,QAAQ,CAAC,uFAAuF,CAAC;CACrG,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,KAAgC,EAChC,GAAe;IAEf,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC;IAElD,MAAM,QAAQ,GAAG,MAAM,yBAAyB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7G,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,CAAC;IAElG,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,QAAQ,EAAE;QACpD,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,SAAS,EAAE,KAAK,CAAC,SAAS;KAC3B,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,aAAa,CAAe;QAC3C,MAAM;QACN,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,EAAE;QACT,eAAe,EAAE,GAAG,CAAC,eAAe;QACpC,QAAQ,EAAE,CAAC;QACX,SAAS,EAAE,CAAC;QACZ,SAAS;QACT,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IACH,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,gCAAgC,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC5E,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * ollama_artifact_list — metadata-only index of pack artifacts on disk.
3
+ *
4
+ * Artifact tier, not an atom, not a pack. Turns pack outputs into a
5
+ * reusable working surface: what exists, when it was made, is it weak,
6
+ * which pack produced it, which corpus (if any) grounded it.
7
+ *
8
+ * Returns ONE metadata record per artifact. Full payloads belong to
9
+ * artifact_read — listing stays cheap and scan-friendly.
10
+ *
11
+ * Identity is (pack, slug). Collisions across dirs surface as warnings
12
+ * in the response, but every colliding record still appears so the
13
+ * operator can see the duplication and resolve it.
14
+ *
15
+ * Default sort: newest first by created_at, then pack, then slug.
16
+ * Filter → sort → limit, in that order.
17
+ */
18
+ import { z } from "zod";
19
+ import type { Envelope } from "../envelope.js";
20
+ import type { RunContext } from "../runContext.js";
21
+ import { type ArtifactMetadata, type PackName } from "./artifacts/scan.js";
22
+ export declare const artifactListSchema: z.ZodObject<{
23
+ pack: z.ZodOptional<z.ZodEnum<[PackName, ...PackName[]]>>;
24
+ date_after: z.ZodOptional<z.ZodString>;
25
+ date_before: z.ZodOptional<z.ZodString>;
26
+ weak_only: z.ZodOptional<z.ZodBoolean>;
27
+ strong_only: z.ZodOptional<z.ZodBoolean>;
28
+ limit: z.ZodOptional<z.ZodNumber>;
29
+ extra_artifact_dirs: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
30
+ }, "strip", z.ZodTypeAny, {
31
+ pack?: PackName | undefined;
32
+ date_after?: string | undefined;
33
+ date_before?: string | undefined;
34
+ weak_only?: boolean | undefined;
35
+ strong_only?: boolean | undefined;
36
+ limit?: number | undefined;
37
+ extra_artifact_dirs?: string[] | undefined;
38
+ }, {
39
+ pack?: PackName | undefined;
40
+ date_after?: string | undefined;
41
+ date_before?: string | undefined;
42
+ weak_only?: boolean | undefined;
43
+ strong_only?: boolean | undefined;
44
+ limit?: number | undefined;
45
+ extra_artifact_dirs?: string[] | undefined;
46
+ }>;
47
+ export type ArtifactListInput = z.infer<typeof artifactListSchema>;
48
+ export interface ArtifactListResult {
49
+ items: ArtifactMetadata[];
50
+ /** (pack, slug) pairs present in more than one location. Surfaces so the operator can resolve. */
51
+ duplicates: Array<{
52
+ pack: PackName;
53
+ slug: string;
54
+ paths: string[];
55
+ }>;
56
+ /** Total matches BEFORE limit was applied. */
57
+ total_matches: number;
58
+ }
59
+ export declare function handleArtifactList(input: ArtifactListInput, ctx: RunContext): Promise<Envelope<ArtifactListResult>>;
60
+ //# sourceMappingURL=artifactList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifactList.d.ts","sourceRoot":"","sources":["../../src/tools/artifactList.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,QAAQ,EACd,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;EAc7B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEnE,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,kGAAkG;IAClG,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACrE,8CAA8C;IAC9C,aAAa,EAAE,MAAM,CAAC;CACvB;AAuCD,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,iBAAiB,EACxB,GAAG,EAAE,UAAU,GACd,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAuCvC"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * ollama_artifact_list — metadata-only index of pack artifacts on disk.
3
+ *
4
+ * Artifact tier, not an atom, not a pack. Turns pack outputs into a
5
+ * reusable working surface: what exists, when it was made, is it weak,
6
+ * which pack produced it, which corpus (if any) grounded it.
7
+ *
8
+ * Returns ONE metadata record per artifact. Full payloads belong to
9
+ * artifact_read — listing stays cheap and scan-friendly.
10
+ *
11
+ * Identity is (pack, slug). Collisions across dirs surface as warnings
12
+ * in the response, but every colliding record still appears so the
13
+ * operator can see the duplication and resolve it.
14
+ *
15
+ * Default sort: newest first by created_at, then pack, then slug.
16
+ * Filter → sort → limit, in that order.
17
+ */
18
+ import { z } from "zod";
19
+ import { buildEnvelope } from "../envelope.js";
20
+ import { callEvent } from "../observability.js";
21
+ import { InternError } from "../errors.js";
22
+ import { KNOWN_PACKS, scanAllArtifacts, } from "./artifacts/scan.js";
23
+ export const artifactListSchema = z.object({
24
+ pack: z
25
+ .enum(KNOWN_PACKS)
26
+ .optional()
27
+ .describe("Filter to a single pack. Omit to include all three."),
28
+ date_after: z.string().optional().describe("ISO timestamp. Include only artifacts with created_at >= date_after."),
29
+ date_before: z.string().optional().describe("ISO timestamp. Include only artifacts with created_at <= date_before."),
30
+ weak_only: z.boolean().optional().describe("If true, keep only artifacts where the brief flagged weak=true."),
31
+ strong_only: z.boolean().optional().describe("If true, keep only artifacts where weak=false. Mutually exclusive with weak_only."),
32
+ limit: z.number().int().min(1).max(500).optional().describe("Cap on entries returned after sorting (default 50). Apply after filters."),
33
+ extra_artifact_dirs: z
34
+ .array(z.string().min(1))
35
+ .optional()
36
+ .describe("Additional read-only search dirs. Canonical identity is still (pack, slug) — extras don't shift precedence."),
37
+ });
38
+ function parseIso(s, fieldName) {
39
+ if (s === undefined)
40
+ return null;
41
+ const d = new Date(s);
42
+ if (Number.isNaN(d.getTime())) {
43
+ throw new InternError("SCHEMA_INVALID", `Invalid ISO timestamp on ${fieldName}: ${s}`, "Pass an ISO-8601 string like 2026-04-17T00:00:00Z.", false);
44
+ }
45
+ return d;
46
+ }
47
+ function assertMutex(input) {
48
+ if (input.weak_only && input.strong_only) {
49
+ throw new InternError("SCHEMA_INVALID", "weak_only and strong_only are mutually exclusive.", "Pick one — weak_only keeps weak artifacts, strong_only keeps non-weak.", false);
50
+ }
51
+ }
52
+ function sortAndLimit(items, limit) {
53
+ // Deterministic sort: created_at desc, then pack asc, then slug asc.
54
+ const sorted = items.slice().sort((a, b) => {
55
+ if (a.created_at !== b.created_at)
56
+ return a.created_at < b.created_at ? 1 : -1;
57
+ if (a.pack !== b.pack)
58
+ return a.pack < b.pack ? -1 : 1;
59
+ if (a.slug !== b.slug)
60
+ return a.slug < b.slug ? -1 : 1;
61
+ // Fall back to json_path if everything else ties — still deterministic.
62
+ return a.json_path < b.json_path ? -1 : a.json_path > b.json_path ? 1 : 0;
63
+ });
64
+ return sorted.slice(0, limit);
65
+ }
66
+ export async function handleArtifactList(input, ctx) {
67
+ assertMutex(input);
68
+ const startedAt = Date.now();
69
+ const after = parseIso(input.date_after, "date_after");
70
+ const before = parseIso(input.date_before, "date_before");
71
+ const limit = input.limit ?? 50;
72
+ const scan = await scanAllArtifacts({ extra_artifact_dirs: input.extra_artifact_dirs });
73
+ let filtered = scan.all;
74
+ if (input.pack)
75
+ filtered = filtered.filter((m) => m.pack === input.pack);
76
+ if (after)
77
+ filtered = filtered.filter((m) => new Date(m.created_at).getTime() >= after.getTime());
78
+ if (before)
79
+ filtered = filtered.filter((m) => new Date(m.created_at).getTime() <= before.getTime());
80
+ if (input.weak_only)
81
+ filtered = filtered.filter((m) => m.weak === true);
82
+ if (input.strong_only)
83
+ filtered = filtered.filter((m) => m.weak === false);
84
+ const total_matches = filtered.length;
85
+ const items = sortAndLimit(filtered, limit);
86
+ const result = {
87
+ items,
88
+ duplicates: scan.duplicates,
89
+ total_matches,
90
+ };
91
+ const envelope = buildEnvelope({
92
+ result,
93
+ tier: "instant", // no model call; "instant" is the cheapest tier we report
94
+ model: "",
95
+ hardwareProfile: ctx.hardwareProfile,
96
+ tokensIn: 0,
97
+ tokensOut: 0,
98
+ startedAt,
99
+ residency: null,
100
+ ...(scan.duplicates.length > 0
101
+ ? { warnings: [`Found ${scan.duplicates.length} slug collision(s) across artifact dirs — see result.duplicates.`] }
102
+ : {}),
103
+ });
104
+ await ctx.logger.log(callEvent("ollama_artifact_list", envelope));
105
+ return envelope;
106
+ }
107
+ //# sourceMappingURL=artifactList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifactList.js","sourceRoot":"","sources":["../../src/tools/artifactList.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * ollama_artifact_read — typed read of a pack artifact.
3
+ *
4
+ * Primary entry = {pack, slug}. Keeps reads anchored to job identity,
5
+ * not file paths. Collisions within (pack, slug) fail loud.
6
+ *
7
+ * Secondary entry = {json_path}. Strict path safety: must be absolute,
8
+ * must normalize cleanly, must end in .json, must live under a
9
+ * recognized artifact dir (canonical roots + extra_artifact_dirs).
10
+ *
11
+ * Return shape is a discriminated union on `pack` — incident/repo/
12
+ * change payloads stay distinct. Metadata is also surfaced so callers
13
+ * can do weak-checks / section-counts without parsing the full
14
+ * artifact themselves.
15
+ */
16
+ import { z } from "zod";
17
+ import type { Envelope } from "../envelope.js";
18
+ import type { RunContext } from "../runContext.js";
19
+ import { type ArtifactMetadata, type PackArtifact, type PackName } from "./artifacts/scan.js";
20
+ export declare const artifactReadSchema: z.ZodObject<{
21
+ pack: z.ZodOptional<z.ZodEnum<[PackName, ...PackName[]]>>;
22
+ slug: z.ZodOptional<z.ZodString>;
23
+ json_path: z.ZodOptional<z.ZodString>;
24
+ extra_artifact_dirs: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
25
+ }, "strip", z.ZodTypeAny, {
26
+ pack?: PackName | undefined;
27
+ slug?: string | undefined;
28
+ json_path?: string | undefined;
29
+ extra_artifact_dirs?: string[] | undefined;
30
+ }, {
31
+ pack?: PackName | undefined;
32
+ slug?: string | undefined;
33
+ json_path?: string | undefined;
34
+ extra_artifact_dirs?: string[] | undefined;
35
+ }>;
36
+ export type ArtifactReadInput = z.infer<typeof artifactReadSchema>;
37
+ export interface ArtifactReadResult {
38
+ metadata: ArtifactMetadata;
39
+ /** The full artifact payload, typed by pack. */
40
+ artifact: PackArtifact;
41
+ }
42
+ export declare function handleArtifactRead(input: ArtifactReadInput, ctx: RunContext): Promise<Envelope<ArtifactReadResult>>;
43
+ //# sourceMappingURL=artifactRead.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifactRead.d.ts","sourceRoot":"","sources":["../../src/tools/artifactRead.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAKL,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,QAAQ,EACd,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;EAe7B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEnE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,gDAAgD;IAChD,QAAQ,EAAE,YAAY,CAAC;CACxB;AAyBD,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,iBAAiB,EACxB,GAAG,EAAE,UAAU,GACd,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAwCvC"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * ollama_artifact_read — typed read of a pack artifact.
3
+ *
4
+ * Primary entry = {pack, slug}. Keeps reads anchored to job identity,
5
+ * not file paths. Collisions within (pack, slug) fail loud.
6
+ *
7
+ * Secondary entry = {json_path}. Strict path safety: must be absolute,
8
+ * must normalize cleanly, must end in .json, must live under a
9
+ * recognized artifact dir (canonical roots + extra_artifact_dirs).
10
+ *
11
+ * Return shape is a discriminated union on `pack` — incident/repo/
12
+ * change payloads stay distinct. Metadata is also surfaced so callers
13
+ * can do weak-checks / section-counts without parsing the full
14
+ * artifact themselves.
15
+ */
16
+ import { z } from "zod";
17
+ import { buildEnvelope } from "../envelope.js";
18
+ import { callEvent } from "../observability.js";
19
+ import { InternError } from "../errors.js";
20
+ import { KNOWN_PACKS, resolveArtifactByIdentity, readArtifactAtPath, metadataFromArtifact, } from "./artifacts/scan.js";
21
+ export const artifactReadSchema = z.object({
22
+ pack: z
23
+ .enum(KNOWN_PACKS)
24
+ .optional()
25
+ .describe("Pack identity. Pass WITH slug for the primary identity-based read."),
26
+ slug: z.string().min(1).optional().describe("Artifact slug (filename stem). Pass WITH pack."),
27
+ json_path: z
28
+ .string()
29
+ .min(1)
30
+ .optional()
31
+ .describe("Absolute path to the artifact JSON file. Secondary escape hatch — must live under a recognized artifact dir; path-safety guarded."),
32
+ extra_artifact_dirs: z
33
+ .array(z.string().min(1))
34
+ .optional()
35
+ .describe("Extra read-only search dirs (same as artifact_list). Applied to both identity resolution and path safety."),
36
+ });
37
+ function assertExactlyOneEntry(input) {
38
+ const hasIdentity = Boolean(input.pack) && Boolean(input.slug);
39
+ const hasPath = Boolean(input.json_path);
40
+ const partialIdentity = Boolean(input.pack) !== Boolean(input.slug);
41
+ if (partialIdentity) {
42
+ throw new InternError("SCHEMA_INVALID", "artifact_read: pack and slug must be provided together.", "Use {pack, slug} as the primary identity-based entry, or {json_path} as the secondary escape hatch.", false);
43
+ }
44
+ const count = (hasIdentity ? 1 : 0) + (hasPath ? 1 : 0);
45
+ if (count !== 1) {
46
+ throw new InternError("SCHEMA_INVALID", `artifact_read: provide exactly one of {pack, slug} or {json_path} (given ${count}).`, "The {pack, slug} form is preferred — it keeps reads anchored to job identity. json_path is a secondary escape hatch.", false);
47
+ }
48
+ }
49
+ export async function handleArtifactRead(input, ctx) {
50
+ assertExactlyOneEntry(input);
51
+ const startedAt = Date.now();
52
+ const extraDirs = input.extra_artifact_dirs ?? [];
53
+ let metadata;
54
+ let artifact;
55
+ if (input.pack && input.slug) {
56
+ // Primary entry: identity-based.
57
+ metadata = await resolveArtifactByIdentity(input.pack, input.slug, { extra_artifact_dirs: extraDirs });
58
+ artifact = await readArtifactAtPath(metadata.json_path, { extra_artifact_dirs: extraDirs });
59
+ }
60
+ else {
61
+ // Secondary entry: path-based.
62
+ artifact = await readArtifactAtPath(input.json_path, { extra_artifact_dirs: extraDirs });
63
+ const meta = metadataFromArtifact(artifact, input.json_path);
64
+ if (!meta) {
65
+ throw new InternError("SCHEMA_INVALID", `Artifact at ${input.json_path} has an unrecognized shape.`, "Only pack-produced artifacts (incident_pack, repo_pack, change_pack) are readable through this tool.", false);
66
+ }
67
+ metadata = meta;
68
+ }
69
+ const result = { metadata, artifact };
70
+ const envelope = buildEnvelope({
71
+ result,
72
+ tier: "instant", // no model call; just file I/O
73
+ model: "",
74
+ hardwareProfile: ctx.hardwareProfile,
75
+ tokensIn: 0,
76
+ tokensOut: 0,
77
+ startedAt,
78
+ residency: null,
79
+ });
80
+ await ctx.logger.log(callEvent("ollama_artifact_read", envelope));
81
+ return envelope;
82
+ }
83
+ //# sourceMappingURL=artifactRead.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifactRead.js","sourceRoot":"","sources":["../../src/tools/artifactRead.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
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 type { Envelope } from "../envelope.js";
14
+ import type { RunContext } from "../runContext.js";
15
+ import { type ArtifactMetadata } from "./artifacts/scan.js";
16
+ export interface SnippetResult {
17
+ rendered: string;
18
+ metadata: ArtifactMetadata;
19
+ }
20
+ export declare const artifactIncidentNoteSnippetSchema: z.ZodObject<{
21
+ readonly slug: z.ZodString;
22
+ readonly extra_artifact_dirs: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
23
+ }, "strip", z.ZodTypeAny, {
24
+ slug: string;
25
+ extra_artifact_dirs?: string[] | undefined;
26
+ }, {
27
+ slug: string;
28
+ extra_artifact_dirs?: string[] | undefined;
29
+ }>;
30
+ export type ArtifactIncidentNoteSnippetInput = z.infer<typeof artifactIncidentNoteSnippetSchema>;
31
+ export declare function handleArtifactIncidentNoteSnippet(input: ArtifactIncidentNoteSnippetInput, ctx: RunContext): Promise<Envelope<SnippetResult>>;
32
+ export declare const artifactOnboardingSectionSnippetSchema: z.ZodObject<{
33
+ readonly slug: z.ZodString;
34
+ readonly extra_artifact_dirs: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
35
+ }, "strip", z.ZodTypeAny, {
36
+ slug: string;
37
+ extra_artifact_dirs?: string[] | undefined;
38
+ }, {
39
+ slug: string;
40
+ extra_artifact_dirs?: string[] | undefined;
41
+ }>;
42
+ export type ArtifactOnboardingSectionSnippetInput = z.infer<typeof artifactOnboardingSectionSnippetSchema>;
43
+ export declare function handleArtifactOnboardingSectionSnippet(input: ArtifactOnboardingSectionSnippetInput, ctx: RunContext): Promise<Envelope<SnippetResult>>;
44
+ export declare const artifactReleaseNoteSnippetSchema: z.ZodObject<{
45
+ readonly slug: z.ZodString;
46
+ readonly extra_artifact_dirs: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
47
+ }, "strip", z.ZodTypeAny, {
48
+ slug: string;
49
+ extra_artifact_dirs?: string[] | undefined;
50
+ }, {
51
+ slug: string;
52
+ extra_artifact_dirs?: string[] | undefined;
53
+ }>;
54
+ export type ArtifactReleaseNoteSnippetInput = z.infer<typeof artifactReleaseNoteSnippetSchema>;
55
+ export declare function handleArtifactReleaseNoteSnippet(input: ArtifactReleaseNoteSnippetInput, ctx: RunContext): Promise<Envelope<SnippetResult>>;
56
+ //# sourceMappingURL=artifactSnippets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifactSnippets.d.ts","sourceRoot":"","sources":["../../src/tools/artifactSnippets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,qBAAqB,CAAC;AAY7B,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAYD,eAAO,MAAM,iCAAiC;;;;;;;;;EAA8B,CAAC;AAC7E,MAAM,MAAM,gCAAgC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iCAAiC,CAAC,CAAC;AAEjG,wBAAsB,iCAAiC,CACrD,KAAK,EAAE,gCAAgC,EACvC,GAAG,EAAE,UAAU,GACd,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CA0BlC;AAID,eAAO,MAAM,sCAAsC;;;;;;;;;EAA8B,CAAC;AAClF,MAAM,MAAM,qCAAqC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sCAAsC,CAAC,CAAC;AAE3G,wBAAsB,sCAAsC,CAC1D,KAAK,EAAE,qCAAqC,EAC5C,GAAG,EAAE,UAAU,GACd,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CA0BlC;AAID,eAAO,MAAM,gCAAgC;;;;;;;;;EAA8B,CAAC;AAC5E,MAAM,MAAM,+BAA+B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gCAAgC,CAAC,CAAC;AAE/F,wBAAsB,gCAAgC,CACpD,KAAK,EAAE,+BAA+B,EACtC,GAAG,EAAE,UAAU,GACd,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CA0BlC"}