@agntk/agent-harness 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE +41 -0
  3. package/README.md +445 -0
  4. package/defaults/agents/summarizer.md +49 -0
  5. package/defaults/instincts/lead-with-answer.md +24 -0
  6. package/defaults/instincts/qualify-before-recommending.md +40 -0
  7. package/defaults/instincts/read-before-edit.md +23 -0
  8. package/defaults/instincts/search-before-create.md +23 -0
  9. package/defaults/playbooks/ship-feature.md +31 -0
  10. package/defaults/rules/ask-before-assuming.md +35 -0
  11. package/defaults/rules/operations.md +35 -0
  12. package/defaults/rules/respect-the-user.md +39 -0
  13. package/defaults/skills/business-analyst.md +181 -0
  14. package/defaults/skills/content-marketer.md +184 -0
  15. package/defaults/skills/research.md +34 -0
  16. package/defaults/tools/example-web-search.md +60 -0
  17. package/defaults/workflows/daily-reflection.md +54 -0
  18. package/dist/agent-framework-K4GUIICH.js +344 -0
  19. package/dist/agent-framework-K4GUIICH.js.map +1 -0
  20. package/dist/analytics-RPT73WNM.js +12 -0
  21. package/dist/analytics-RPT73WNM.js.map +1 -0
  22. package/dist/auto-processor-OLE45UI3.js +13 -0
  23. package/dist/auto-processor-OLE45UI3.js.map +1 -0
  24. package/dist/chunk-274RV3YO.js +162 -0
  25. package/dist/chunk-274RV3YO.js.map +1 -0
  26. package/dist/chunk-4CWAGBNS.js +168 -0
  27. package/dist/chunk-4CWAGBNS.js.map +1 -0
  28. package/dist/chunk-4FDUOGSZ.js +69 -0
  29. package/dist/chunk-4FDUOGSZ.js.map +1 -0
  30. package/dist/chunk-5H34JPMB.js +199 -0
  31. package/dist/chunk-5H34JPMB.js.map +1 -0
  32. package/dist/chunk-6EMOEYGU.js +102 -0
  33. package/dist/chunk-6EMOEYGU.js.map +1 -0
  34. package/dist/chunk-A7BJPQQ6.js +236 -0
  35. package/dist/chunk-A7BJPQQ6.js.map +1 -0
  36. package/dist/chunk-AGAAFJEO.js +76 -0
  37. package/dist/chunk-AGAAFJEO.js.map +1 -0
  38. package/dist/chunk-BSKDOFRT.js +65 -0
  39. package/dist/chunk-BSKDOFRT.js.map +1 -0
  40. package/dist/chunk-CHJ5GNZC.js +100 -0
  41. package/dist/chunk-CHJ5GNZC.js.map +1 -0
  42. package/dist/chunk-CSL3ERUI.js +307 -0
  43. package/dist/chunk-CSL3ERUI.js.map +1 -0
  44. package/dist/chunk-DA7IKHC4.js +229 -0
  45. package/dist/chunk-DA7IKHC4.js.map +1 -0
  46. package/dist/chunk-DGUM43GV.js +11 -0
  47. package/dist/chunk-DGUM43GV.js.map +1 -0
  48. package/dist/chunk-DTTXPHFW.js +211 -0
  49. package/dist/chunk-DTTXPHFW.js.map +1 -0
  50. package/dist/chunk-FD55B3IO.js +204 -0
  51. package/dist/chunk-FD55B3IO.js.map +1 -0
  52. package/dist/chunk-FLZU44SV.js +230 -0
  53. package/dist/chunk-FLZU44SV.js.map +1 -0
  54. package/dist/chunk-GJNNR2RA.js +200 -0
  55. package/dist/chunk-GJNNR2RA.js.map +1 -0
  56. package/dist/chunk-GNUSHD2Y.js +111 -0
  57. package/dist/chunk-GNUSHD2Y.js.map +1 -0
  58. package/dist/chunk-GUJTBGVS.js +2212 -0
  59. package/dist/chunk-GUJTBGVS.js.map +1 -0
  60. package/dist/chunk-IZ6UZ3ZL.js +207 -0
  61. package/dist/chunk-IZ6UZ3ZL.js.map +1 -0
  62. package/dist/chunk-JKMGYWXB.js +197 -0
  63. package/dist/chunk-JKMGYWXB.js.map +1 -0
  64. package/dist/chunk-KFX54TQM.js +165 -0
  65. package/dist/chunk-KFX54TQM.js.map +1 -0
  66. package/dist/chunk-M7NXUK55.js +199 -0
  67. package/dist/chunk-M7NXUK55.js.map +1 -0
  68. package/dist/chunk-MPZ3BPUI.js +374 -0
  69. package/dist/chunk-MPZ3BPUI.js.map +1 -0
  70. package/dist/chunk-OC6YSTDX.js +119 -0
  71. package/dist/chunk-OC6YSTDX.js.map +1 -0
  72. package/dist/chunk-RC6MEZB6.js +469 -0
  73. package/dist/chunk-RC6MEZB6.js.map +1 -0
  74. package/dist/chunk-RY3ZFII7.js +3440 -0
  75. package/dist/chunk-RY3ZFII7.js.map +1 -0
  76. package/dist/chunk-TAT6JU3X.js +167 -0
  77. package/dist/chunk-TAT6JU3X.js.map +1 -0
  78. package/dist/chunk-UDZIS2AQ.js +79 -0
  79. package/dist/chunk-UDZIS2AQ.js.map +1 -0
  80. package/dist/chunk-UPLBF4RZ.js +115 -0
  81. package/dist/chunk-UPLBF4RZ.js.map +1 -0
  82. package/dist/chunk-UWQTZMNI.js +154 -0
  83. package/dist/chunk-UWQTZMNI.js.map +1 -0
  84. package/dist/chunk-W4T7PGI2.js +346 -0
  85. package/dist/chunk-W4T7PGI2.js.map +1 -0
  86. package/dist/chunk-XTBKL5BI.js +111 -0
  87. package/dist/chunk-XTBKL5BI.js.map +1 -0
  88. package/dist/chunk-YIJY5DBV.js +399 -0
  89. package/dist/chunk-YIJY5DBV.js.map +1 -0
  90. package/dist/chunk-YUFNYN2H.js +242 -0
  91. package/dist/chunk-YUFNYN2H.js.map +1 -0
  92. package/dist/chunk-Z2PUCXTZ.js +94 -0
  93. package/dist/chunk-Z2PUCXTZ.js.map +1 -0
  94. package/dist/chunk-ZZJOFKAT.js +13 -0
  95. package/dist/chunk-ZZJOFKAT.js.map +1 -0
  96. package/dist/cli/index.js +3661 -0
  97. package/dist/cli/index.js.map +1 -0
  98. package/dist/config-WVMRUOCA.js +13 -0
  99. package/dist/config-WVMRUOCA.js.map +1 -0
  100. package/dist/context-loader-3ORBPMHJ.js +13 -0
  101. package/dist/context-loader-3ORBPMHJ.js.map +1 -0
  102. package/dist/conversation-QDEIDQPH.js +22 -0
  103. package/dist/conversation-QDEIDQPH.js.map +1 -0
  104. package/dist/cost-tracker-RS3W7SVY.js +24 -0
  105. package/dist/cost-tracker-RS3W7SVY.js.map +1 -0
  106. package/dist/delegate-VJCJLYEK.js +29 -0
  107. package/dist/delegate-VJCJLYEK.js.map +1 -0
  108. package/dist/emotional-state-VQVRA6ED.js +206 -0
  109. package/dist/emotional-state-VQVRA6ED.js.map +1 -0
  110. package/dist/env-discovery-2BLVMAIM.js +251 -0
  111. package/dist/env-discovery-2BLVMAIM.js.map +1 -0
  112. package/dist/export-6GCYHEHQ.js +165 -0
  113. package/dist/export-6GCYHEHQ.js.map +1 -0
  114. package/dist/graph-YUIPOSOO.js +14 -0
  115. package/dist/graph-YUIPOSOO.js.map +1 -0
  116. package/dist/harness-LCHA3DWP.js +10 -0
  117. package/dist/harness-LCHA3DWP.js.map +1 -0
  118. package/dist/harness-WE4SLCML.js +26 -0
  119. package/dist/harness-WE4SLCML.js.map +1 -0
  120. package/dist/health-NZ6WNIMV.js +23 -0
  121. package/dist/health-NZ6WNIMV.js.map +1 -0
  122. package/dist/index.d.ts +3612 -0
  123. package/dist/index.js +13501 -0
  124. package/dist/index.js.map +1 -0
  125. package/dist/indexer-LONANRRM.js +16 -0
  126. package/dist/indexer-LONANRRM.js.map +1 -0
  127. package/dist/instinct-learner-SRM72DHF.js +20 -0
  128. package/dist/instinct-learner-SRM72DHF.js.map +1 -0
  129. package/dist/intake-4M3HNU43.js +21 -0
  130. package/dist/intake-4M3HNU43.js.map +1 -0
  131. package/dist/intelligence-HJOCA4SJ.js +1081 -0
  132. package/dist/intelligence-HJOCA4SJ.js.map +1 -0
  133. package/dist/journal-WANJL3MI.js +24 -0
  134. package/dist/journal-WANJL3MI.js.map +1 -0
  135. package/dist/loader-C3TKIKZR.js +23 -0
  136. package/dist/loader-C3TKIKZR.js.map +1 -0
  137. package/dist/mcp-WTQJJZAO.js +15 -0
  138. package/dist/mcp-WTQJJZAO.js.map +1 -0
  139. package/dist/mcp-discovery-WPAQFL6S.js +377 -0
  140. package/dist/mcp-discovery-WPAQFL6S.js.map +1 -0
  141. package/dist/mcp-installer-6O2XXD3V.js +394 -0
  142. package/dist/mcp-installer-6O2XXD3V.js.map +1 -0
  143. package/dist/metrics-KXGNFAAB.js +20 -0
  144. package/dist/metrics-KXGNFAAB.js.map +1 -0
  145. package/dist/primitive-registry-I6VTIR4W.js +512 -0
  146. package/dist/primitive-registry-I6VTIR4W.js.map +1 -0
  147. package/dist/project-discovery-C4UMD7JI.js +246 -0
  148. package/dist/project-discovery-C4UMD7JI.js.map +1 -0
  149. package/dist/provider-LQHQX7Z7.js +26 -0
  150. package/dist/provider-LQHQX7Z7.js.map +1 -0
  151. package/dist/provider-SXPQZ74H.js +28 -0
  152. package/dist/provider-SXPQZ74H.js.map +1 -0
  153. package/dist/rate-limiter-RLRVM325.js +22 -0
  154. package/dist/rate-limiter-RLRVM325.js.map +1 -0
  155. package/dist/rule-engine-YGQ3RYZM.js +182 -0
  156. package/dist/rule-engine-YGQ3RYZM.js.map +1 -0
  157. package/dist/scaffold-A3VRRCBV.js +347 -0
  158. package/dist/scaffold-A3VRRCBV.js.map +1 -0
  159. package/dist/scheduler-XHHIVHRI.js +397 -0
  160. package/dist/scheduler-XHHIVHRI.js.map +1 -0
  161. package/dist/search-V3W5JMJG.js +75 -0
  162. package/dist/search-V3W5JMJG.js.map +1 -0
  163. package/dist/semantic-search-2DTOO5UX.js +241 -0
  164. package/dist/semantic-search-2DTOO5UX.js.map +1 -0
  165. package/dist/serve-DTQ3HENY.js +291 -0
  166. package/dist/serve-DTQ3HENY.js.map +1 -0
  167. package/dist/sessions-CZGVXKQE.js +21 -0
  168. package/dist/sessions-CZGVXKQE.js.map +1 -0
  169. package/dist/sources-RW5DT56F.js +32 -0
  170. package/dist/sources-RW5DT56F.js.map +1 -0
  171. package/dist/starter-packs-76YUVHEU.js +893 -0
  172. package/dist/starter-packs-76YUVHEU.js.map +1 -0
  173. package/dist/state-GMXILIHW.js +13 -0
  174. package/dist/state-GMXILIHW.js.map +1 -0
  175. package/dist/state-merge-NKO5FRBA.js +174 -0
  176. package/dist/state-merge-NKO5FRBA.js.map +1 -0
  177. package/dist/telemetry-UC6PBXC7.js +22 -0
  178. package/dist/telemetry-UC6PBXC7.js.map +1 -0
  179. package/dist/tool-executor-MJ7IG7PQ.js +28 -0
  180. package/dist/tool-executor-MJ7IG7PQ.js.map +1 -0
  181. package/dist/tools-DZ4KETET.js +20 -0
  182. package/dist/tools-DZ4KETET.js.map +1 -0
  183. package/dist/types-EW7AIB3R.js +18 -0
  184. package/dist/types-EW7AIB3R.js.map +1 -0
  185. package/dist/types-WGDLSPO6.js +16 -0
  186. package/dist/types-WGDLSPO6.js.map +1 -0
  187. package/dist/universal-installer-QGS4SJGX.js +578 -0
  188. package/dist/universal-installer-QGS4SJGX.js.map +1 -0
  189. package/dist/validator-7WXMDIHH.js +22 -0
  190. package/dist/validator-7WXMDIHH.js.map +1 -0
  191. package/dist/verification-gate-FYXUX6LH.js +246 -0
  192. package/dist/verification-gate-FYXUX6LH.js.map +1 -0
  193. package/dist/versioning-Z3XNE2Q2.js +271 -0
  194. package/dist/versioning-Z3XNE2Q2.js.map +1 -0
  195. package/dist/watcher-ISJC7YKL.js +109 -0
  196. package/dist/watcher-ISJC7YKL.js.map +1 -0
  197. package/dist/web-server-DD7ZOP46.js +28 -0
  198. package/dist/web-server-DD7ZOP46.js.map +1 -0
  199. package/package.json +76 -0
  200. package/sources.yaml +121 -0
  201. package/templates/assistant/CORE.md +24 -0
  202. package/templates/assistant/SYSTEM.md +24 -0
  203. package/templates/assistant/config.yaml +51 -0
  204. package/templates/base/CORE.md +17 -0
  205. package/templates/base/SYSTEM.md +24 -0
  206. package/templates/base/config.yaml +51 -0
  207. package/templates/claude-opus/config.yaml +51 -0
  208. package/templates/code-reviewer/CORE.md +25 -0
  209. package/templates/code-reviewer/SYSTEM.md +30 -0
  210. package/templates/code-reviewer/config.yaml +51 -0
  211. package/templates/gpt4/config.yaml +51 -0
  212. package/templates/local/config.yaml +51 -0
@@ -0,0 +1,512 @@
1
+ #!/usr/bin/env node
2
+
3
+ import {
4
+ parseHarnessDocument
5
+ } from "./chunk-UPLBF4RZ.js";
6
+ import {
7
+ log
8
+ } from "./chunk-BSKDOFRT.js";
9
+ import {
10
+ CORE_PRIMITIVE_DIRS
11
+ } from "./chunk-4CWAGBNS.js";
12
+ import "./chunk-ZZJOFKAT.js";
13
+
14
+ // src/runtime/primitive-registry.ts
15
+ import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync, renameSync, unlinkSync } from "fs";
16
+ import { join, basename, dirname, relative } from "path";
17
+ import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
18
+ function createManifest(harnessDir, options) {
19
+ const types = /* @__PURE__ */ new Set();
20
+ const fileEntries = [];
21
+ for (const filePath of options.files) {
22
+ const absPath = filePath.startsWith("/") ? filePath : join(harnessDir, filePath);
23
+ if (!existsSync(absPath)) continue;
24
+ const relPath = relative(harnessDir, absPath);
25
+ const dir = relPath.split("/")[0];
26
+ const type = CORE_PRIMITIVE_DIRS.includes(dir) ? dir : "custom";
27
+ types.add(type);
28
+ try {
29
+ const doc = parseHarnessDocument(absPath);
30
+ fileEntries.push({
31
+ path: relPath,
32
+ type,
33
+ id: doc.frontmatter.id ?? basename(relPath, ".md"),
34
+ l0: doc.l0 || ""
35
+ });
36
+ } catch {
37
+ fileEntries.push({
38
+ path: relPath,
39
+ type,
40
+ id: basename(relPath, ".md"),
41
+ l0: ""
42
+ });
43
+ }
44
+ }
45
+ return {
46
+ version: "1.0",
47
+ name: options.name,
48
+ description: options.description,
49
+ author: options.author ?? "unknown",
50
+ bundle_version: options.version ?? "1.0.0",
51
+ created: (/* @__PURE__ */ new Date()).toISOString(),
52
+ types: [...types],
53
+ tags: options.tags ?? [],
54
+ files: fileEntries,
55
+ license: options.license
56
+ };
57
+ }
58
+ function writeManifest(manifest, outputPath) {
59
+ writeFileSync(outputPath, stringifyYaml(manifest), "utf-8");
60
+ }
61
+ function readManifest(manifestPath) {
62
+ if (!existsSync(manifestPath)) {
63
+ throw new Error(`Manifest not found: ${manifestPath}`);
64
+ }
65
+ const content = readFileSync(manifestPath, "utf-8");
66
+ const parsed = parseYaml(content);
67
+ if (typeof parsed !== "object" || parsed === null) {
68
+ throw new Error("Invalid manifest: not an object");
69
+ }
70
+ const manifest = parsed;
71
+ if (typeof manifest.name !== "string" || !manifest.name) {
72
+ throw new Error('Invalid manifest: missing "name"');
73
+ }
74
+ if (typeof manifest.version !== "string") {
75
+ throw new Error('Invalid manifest: missing "version"');
76
+ }
77
+ if (!Array.isArray(manifest.files)) {
78
+ throw new Error('Invalid manifest: missing "files" array');
79
+ }
80
+ return parsed;
81
+ }
82
+ function packBundle(harnessDir, options) {
83
+ let filePaths = options.files ?? [];
84
+ const types = options.types && options.types.length > 0 ? options.types : filePaths.length === 0 ? [...CORE_PRIMITIVE_DIRS] : [];
85
+ if (types.length > 0 && filePaths.length === 0) {
86
+ for (const type of types) {
87
+ const dirPath = join(harnessDir, type);
88
+ if (!existsSync(dirPath)) continue;
89
+ const files2 = readdirSync(dirPath).filter((f) => f.endsWith(".md") && !f.startsWith("_") && !f.startsWith(".")).map((f) => join(type, f));
90
+ filePaths.push(...files2);
91
+ }
92
+ }
93
+ const manifest = createManifest(harnessDir, {
94
+ name: options.name,
95
+ description: options.description,
96
+ author: options.author,
97
+ version: options.version,
98
+ files: filePaths,
99
+ tags: options.tags,
100
+ license: options.license
101
+ });
102
+ const files = [];
103
+ for (const entry of manifest.files) {
104
+ const absPath = join(harnessDir, entry.path);
105
+ if (existsSync(absPath)) {
106
+ files.push({
107
+ path: entry.path,
108
+ content: readFileSync(absPath, "utf-8")
109
+ });
110
+ }
111
+ }
112
+ return { manifest, files };
113
+ }
114
+ function writeBundleDir(bundle, outputDir) {
115
+ mkdirSync(outputDir, { recursive: true });
116
+ writeManifest(bundle.manifest, join(outputDir, "manifest.yaml"));
117
+ for (const file of bundle.files) {
118
+ const targetPath = join(outputDir, file.path);
119
+ mkdirSync(dirname(targetPath), { recursive: true });
120
+ writeFileSync(targetPath, file.content, "utf-8");
121
+ }
122
+ }
123
+ function readBundleDir(bundleDir) {
124
+ const manifestPath = join(bundleDir, "manifest.yaml");
125
+ const manifest = readManifest(manifestPath);
126
+ const files = [];
127
+ for (const entry of manifest.files) {
128
+ const filePath = join(bundleDir, entry.path);
129
+ if (existsSync(filePath)) {
130
+ files.push({
131
+ path: entry.path,
132
+ content: readFileSync(filePath, "utf-8")
133
+ });
134
+ }
135
+ }
136
+ return { manifest, files };
137
+ }
138
+ function installBundle(harnessDir, bundle, options) {
139
+ const overwrite = options?.overwrite ?? false;
140
+ const result = {
141
+ installed: false,
142
+ name: bundle.manifest.name,
143
+ files: [],
144
+ skipped: [],
145
+ errors: [],
146
+ manifest: bundle.manifest
147
+ };
148
+ if (bundle.manifest.dependencies && bundle.manifest.dependencies.length > 0 && !options?.force) {
149
+ const installedPath = join(harnessDir, ".installed");
150
+ if (existsSync(installedPath)) {
151
+ const installed = readInstalledManifests(harnessDir);
152
+ const installedNames = new Set(installed.map((m) => m.name));
153
+ const missing = bundle.manifest.dependencies.filter((d) => !installedNames.has(d));
154
+ if (missing.length > 0) {
155
+ result.errors.push(`Missing dependencies: ${missing.join(", ")}. Use --force to install anyway.`);
156
+ return result;
157
+ }
158
+ }
159
+ }
160
+ for (const file of bundle.files) {
161
+ const targetPath = join(harnessDir, file.path);
162
+ if (existsSync(targetPath) && !overwrite) {
163
+ result.skipped.push(file.path);
164
+ continue;
165
+ }
166
+ try {
167
+ mkdirSync(dirname(targetPath), { recursive: true });
168
+ writeFileSync(targetPath, file.content, "utf-8");
169
+ result.files.push(file.path);
170
+ } catch (err) {
171
+ result.errors.push(`${file.path}: ${err instanceof Error ? err.message : String(err)}`);
172
+ }
173
+ }
174
+ if (result.files.length > 0 || result.skipped.length > 0) {
175
+ result.installed = true;
176
+ recordInstallation(harnessDir, bundle.manifest);
177
+ }
178
+ return result;
179
+ }
180
+ function uninstallBundle(harnessDir, bundleName, options) {
181
+ const result = {
182
+ uninstalled: false,
183
+ name: bundleName,
184
+ archived: [],
185
+ dependents: [],
186
+ errors: []
187
+ };
188
+ const installed = readInstalledManifests(harnessDir);
189
+ const manifest = installed.find((m) => m.name === bundleName);
190
+ if (!manifest) {
191
+ result.errors.push(`Bundle "${bundleName}" is not installed`);
192
+ return result;
193
+ }
194
+ const dependents = installed.filter(
195
+ (m) => m.name !== bundleName && m.dependencies?.includes(bundleName)
196
+ );
197
+ if (dependents.length > 0) {
198
+ result.dependents = dependents.map((m) => m.name);
199
+ result.errors.push(
200
+ `Cannot uninstall: ${dependents.map((m) => m.name).join(", ")} depend(s) on "${bundleName}"`
201
+ );
202
+ return result;
203
+ }
204
+ const archiveDir = join(harnessDir, "archive", "uninstalled", bundleName);
205
+ for (const entry of manifest.files) {
206
+ const filePath = join(harnessDir, entry.path);
207
+ if (!existsSync(filePath)) continue;
208
+ try {
209
+ if (options?.hard) {
210
+ unlinkSync(filePath);
211
+ } else {
212
+ const archivePath = join(archiveDir, entry.path);
213
+ mkdirSync(dirname(archivePath), { recursive: true });
214
+ renameSync(filePath, archivePath);
215
+ }
216
+ result.archived.push(entry.path);
217
+ } catch (err) {
218
+ result.errors.push(`${entry.path}: ${err instanceof Error ? err.message : String(err)}`);
219
+ }
220
+ }
221
+ if (result.archived.length > 0) {
222
+ result.uninstalled = true;
223
+ removeInstallationRecord(harnessDir, bundleName);
224
+ }
225
+ return result;
226
+ }
227
+ function diffBundle(harnessDir, newBundle) {
228
+ const installed = readInstalledManifests(harnessDir);
229
+ const existing = installed.find((m) => m.name === newBundle.manifest.name);
230
+ const added = [];
231
+ const modified = [];
232
+ const removed = [];
233
+ const unchanged = [];
234
+ const existingFiles = new Set(existing?.files.map((f) => f.path) ?? []);
235
+ const newFiles = new Set(newBundle.manifest.files.map((f) => f.path));
236
+ for (const file of newBundle.files) {
237
+ const targetPath = join(harnessDir, file.path);
238
+ if (!existingFiles.has(file.path)) {
239
+ added.push(file.path);
240
+ } else if (existsSync(targetPath)) {
241
+ const currentContent = readFileSync(targetPath, "utf-8");
242
+ if (currentContent !== file.content) {
243
+ modified.push(file.path);
244
+ } else {
245
+ unchanged.push(file.path);
246
+ }
247
+ } else {
248
+ added.push(file.path);
249
+ }
250
+ }
251
+ for (const path of existingFiles) {
252
+ if (!newFiles.has(path)) {
253
+ removed.push(path);
254
+ }
255
+ }
256
+ return { added, modified, removed, unchanged };
257
+ }
258
+ function updateBundle(harnessDir, newBundle, options) {
259
+ const removeDeleted = options?.removeDeleted ?? false;
260
+ const diff = diffBundle(harnessDir, newBundle);
261
+ const result = {
262
+ updated: false,
263
+ name: newBundle.manifest.name,
264
+ added: [],
265
+ modified: [],
266
+ removed: [],
267
+ errors: []
268
+ };
269
+ const installed = readInstalledManifests(harnessDir);
270
+ const existing = installed.find((m) => m.name === newBundle.manifest.name);
271
+ result.oldVersion = existing?.bundle_version;
272
+ result.newVersion = newBundle.manifest.bundle_version;
273
+ for (const path of [...diff.added, ...diff.modified]) {
274
+ const file = newBundle.files.find((f) => f.path === path);
275
+ if (!file) continue;
276
+ const targetPath = join(harnessDir, path);
277
+ try {
278
+ mkdirSync(dirname(targetPath), { recursive: true });
279
+ writeFileSync(targetPath, file.content, "utf-8");
280
+ if (diff.added.includes(path)) {
281
+ result.added.push(path);
282
+ } else {
283
+ result.modified.push(path);
284
+ }
285
+ } catch (err) {
286
+ result.errors.push(`${path}: ${err instanceof Error ? err.message : String(err)}`);
287
+ }
288
+ }
289
+ if (removeDeleted) {
290
+ const archiveDir = join(harnessDir, "archive", "updated", newBundle.manifest.name);
291
+ for (const path of diff.removed) {
292
+ const filePath = join(harnessDir, path);
293
+ if (!existsSync(filePath)) continue;
294
+ try {
295
+ const archivePath = join(archiveDir, path);
296
+ mkdirSync(dirname(archivePath), { recursive: true });
297
+ renameSync(filePath, archivePath);
298
+ result.removed.push(path);
299
+ } catch (err) {
300
+ result.errors.push(`${path}: ${err instanceof Error ? err.message : String(err)}`);
301
+ }
302
+ }
303
+ }
304
+ if (result.added.length > 0 || result.modified.length > 0 || result.removed.length > 0) {
305
+ result.updated = true;
306
+ recordInstallation(harnessDir, newBundle.manifest);
307
+ }
308
+ return result;
309
+ }
310
+ var INSTALLED_DIR = ".installed";
311
+ function recordInstallation(harnessDir, manifest) {
312
+ const installedDir = join(harnessDir, INSTALLED_DIR);
313
+ mkdirSync(installedDir, { recursive: true });
314
+ const manifestPath = join(installedDir, `${manifest.name}.yaml`);
315
+ writeFileSync(manifestPath, stringifyYaml(manifest), "utf-8");
316
+ }
317
+ function removeInstallationRecord(harnessDir, bundleName) {
318
+ const manifestPath = join(harnessDir, INSTALLED_DIR, `${bundleName}.yaml`);
319
+ if (existsSync(manifestPath)) {
320
+ unlinkSync(manifestPath);
321
+ }
322
+ }
323
+ function readInstalledManifests(harnessDir) {
324
+ const installedDir = join(harnessDir, INSTALLED_DIR);
325
+ if (!existsSync(installedDir)) return [];
326
+ const files = readdirSync(installedDir).filter((f) => f.endsWith(".yaml"));
327
+ const manifests = [];
328
+ for (const file of files) {
329
+ try {
330
+ const manifest = readManifest(join(installedDir, file));
331
+ manifests.push(manifest);
332
+ } catch (err) {
333
+ log.warn(`Failed to read installed manifest ${file}: ${err instanceof Error ? err.message : String(err)}`);
334
+ }
335
+ }
336
+ return manifests;
337
+ }
338
+ function listInstalledBundles(harnessDir) {
339
+ return readInstalledManifests(harnessDir).map((m) => ({
340
+ name: m.name,
341
+ version: m.bundle_version,
342
+ types: m.types,
343
+ fileCount: m.files.length,
344
+ description: m.description
345
+ }));
346
+ }
347
+ async function fetchRemoteBundle(url) {
348
+ const response = await fetch(url);
349
+ if (!response.ok) {
350
+ throw new Error(`Failed to fetch bundle: ${response.status} ${response.statusText}`);
351
+ }
352
+ const contentType = response.headers.get("content-type") ?? "";
353
+ if (contentType.includes("application/json")) {
354
+ const data = await response.json();
355
+ if (typeof data !== "object" || data === null || !("entries" in data)) {
356
+ throw new Error("Invalid JSON bundle format");
357
+ }
358
+ const jsonBundle = data;
359
+ const files = jsonBundle.entries;
360
+ const types = /* @__PURE__ */ new Set();
361
+ const fileEntries = [];
362
+ for (const entry of files) {
363
+ const dir = entry.path.split("/")[0];
364
+ const type = CORE_PRIMITIVE_DIRS.includes(dir) ? dir : "custom";
365
+ types.add(type);
366
+ fileEntries.push({
367
+ path: entry.path,
368
+ type,
369
+ id: basename(entry.path, ".md"),
370
+ l0: ""
371
+ });
372
+ }
373
+ const manifest2 = {
374
+ version: "1.0",
375
+ name: jsonBundle.agent_name ?? "remote-bundle",
376
+ description: "Imported from remote URL",
377
+ author: "unknown",
378
+ bundle_version: "1.0.0",
379
+ created: (/* @__PURE__ */ new Date()).toISOString(),
380
+ types: [...types],
381
+ tags: [],
382
+ files: fileEntries
383
+ };
384
+ return { manifest: manifest2, files };
385
+ }
386
+ const content = await response.text();
387
+ const fileName = basename(new URL(url).pathname);
388
+ const manifest = {
389
+ version: "1.0",
390
+ name: basename(fileName, ".md"),
391
+ description: `Downloaded from ${url}`,
392
+ author: "unknown",
393
+ bundle_version: "1.0.0",
394
+ created: (/* @__PURE__ */ new Date()).toISOString(),
395
+ types: ["custom"],
396
+ tags: [],
397
+ files: [{ path: fileName, type: "custom", id: basename(fileName, ".md"), l0: "" }]
398
+ };
399
+ return { manifest, files: [{ path: fileName, content }] };
400
+ }
401
+ async function searchBundleRegistry(registryUrl, query, options) {
402
+ const limit = options?.limit ?? 20;
403
+ const searchUrl = `${registryUrl}/api/bundles?search=${encodeURIComponent(query)}&limit=${limit}`;
404
+ const headers = { "Accept": "application/json" };
405
+ if (options?.token) {
406
+ headers["Authorization"] = `Bearer ${options.token}`;
407
+ }
408
+ const response = await fetch(searchUrl, { headers });
409
+ if (!response.ok) {
410
+ throw new Error(`Registry search failed: ${response.status} ${response.statusText}`);
411
+ }
412
+ return await response.json();
413
+ }
414
+ async function fetchFromRegistry(registryUrl, bundleName, options) {
415
+ const version = options?.version ?? "latest";
416
+ const bundleUrl = `${registryUrl}/api/bundles/${encodeURIComponent(bundleName)}/versions/${version}/download`;
417
+ const headers = {};
418
+ if (options?.token) {
419
+ headers["Authorization"] = `Bearer ${options.token}`;
420
+ }
421
+ const response = await fetch(bundleUrl, { headers });
422
+ if (!response.ok) {
423
+ throw new Error(`Failed to fetch bundle "${bundleName}": ${response.status} ${response.statusText}`);
424
+ }
425
+ const data = await response.json();
426
+ return data;
427
+ }
428
+ async function searchConfiguredRegistries(registries, query, options) {
429
+ const limit = options?.limit ?? 20;
430
+ const allResults = [];
431
+ const errors = [];
432
+ const seenNames = /* @__PURE__ */ new Set();
433
+ const searches = registries.map(async (reg) => {
434
+ const displayName = reg.name ?? reg.url;
435
+ try {
436
+ const response = await searchBundleRegistry(reg.url, query, { limit, token: reg.token });
437
+ return { registry: reg, displayName, response };
438
+ } catch (err) {
439
+ errors.push({
440
+ registry: displayName,
441
+ error: err instanceof Error ? err.message : String(err)
442
+ });
443
+ return null;
444
+ }
445
+ });
446
+ const results = await Promise.allSettled(searches);
447
+ for (const settled of results) {
448
+ if (settled.status === "fulfilled" && settled.value) {
449
+ const { registry, displayName, response } = settled.value;
450
+ for (const result of response.results) {
451
+ if (!seenNames.has(result.name)) {
452
+ seenNames.add(result.name);
453
+ allResults.push({
454
+ ...result,
455
+ registryUrl: registry.url,
456
+ registryName: displayName
457
+ });
458
+ }
459
+ }
460
+ }
461
+ }
462
+ return {
463
+ results: allResults.slice(0, limit),
464
+ total: allResults.length,
465
+ registriesSearched: registries.length,
466
+ errors
467
+ };
468
+ }
469
+ async function installFromRegistry(harnessDir, registries, bundleName, options) {
470
+ for (const reg of registries) {
471
+ try {
472
+ const bundle = await fetchFromRegistry(reg.url, bundleName, {
473
+ version: options?.version,
474
+ token: reg.token
475
+ });
476
+ const result = installBundle(harnessDir, bundle, {
477
+ overwrite: options?.overwrite,
478
+ force: options?.force
479
+ });
480
+ return { ...result, registryUrl: reg.url };
481
+ } catch {
482
+ continue;
483
+ }
484
+ }
485
+ return {
486
+ installed: false,
487
+ name: bundleName,
488
+ files: [],
489
+ skipped: [],
490
+ errors: [`Bundle "${bundleName}" not found in any configured registry`]
491
+ };
492
+ }
493
+ export {
494
+ createManifest,
495
+ diffBundle,
496
+ fetchFromRegistry,
497
+ fetchRemoteBundle,
498
+ installBundle,
499
+ installFromRegistry,
500
+ listInstalledBundles,
501
+ packBundle,
502
+ readBundleDir,
503
+ readInstalledManifests,
504
+ readManifest,
505
+ searchBundleRegistry,
506
+ searchConfiguredRegistries,
507
+ uninstallBundle,
508
+ updateBundle,
509
+ writeBundleDir,
510
+ writeManifest
511
+ };
512
+ //# sourceMappingURL=primitive-registry-I6VTIR4W.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runtime/primitive-registry.ts"],"sourcesContent":["import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync, renameSync, unlinkSync } from 'fs';\nimport { join, basename, dirname, relative } from 'path';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { CORE_PRIMITIVE_DIRS } from '../core/types.js';\nimport { parseHarnessDocument } from '../primitives/loader.js';\nimport { log } from '../core/logger.js';\n\n// --- Manifest Types ---\n\nexport interface BundleManifest {\n /** Manifest format version */\n version: string;\n /** Bundle name (e.g., \"code-review-rules\") */\n name: string;\n /** Human-readable description */\n description: string;\n /** Author identifier */\n author: string;\n /** Semantic version (e.g., \"1.0.0\") */\n bundle_version: string;\n /** When this bundle was created */\n created: string;\n /** Primitive type(s) contained (e.g., [\"rules\", \"instincts\"]) */\n types: string[];\n /** Tags for search/discovery */\n tags: string[];\n /** Files included in this bundle (relative paths) */\n files: BundleFileEntry[];\n /** Optional dependencies (other bundle names) */\n dependencies?: string[];\n /** Optional registry URL this was published to */\n registry?: string;\n /** Optional license identifier */\n license?: string;\n}\n\nexport interface BundleFileEntry {\n path: string;\n type: string;\n id: string;\n l0: string;\n}\n\n// --- Registry Types ---\n\nexport interface RegistryConfig {\n /** Registry URL (HTTPS) */\n url: string;\n /** Optional auth token */\n token?: string;\n /** Optional name for display */\n name?: string;\n}\n\nexport interface BundleSearchResult {\n name: string;\n description: string;\n author: string;\n version: string;\n types: string[];\n tags: string[];\n download_url: string;\n}\n\nexport interface BundleSearchResponse {\n results: BundleSearchResult[];\n total: number;\n}\n\n// --- Install / Uninstall Types ---\n\nexport interface PrimitiveInstallResult {\n installed: boolean;\n name: string;\n files: string[];\n skipped: string[];\n errors: string[];\n manifest?: BundleManifest;\n}\n\nexport interface PrimitiveUninstallResult {\n uninstalled: boolean;\n name: string;\n archived: string[];\n dependents: string[];\n errors: string[];\n}\n\nexport interface PrimitiveUpdateResult {\n updated: boolean;\n name: string;\n added: string[];\n modified: string[];\n removed: string[];\n errors: string[];\n oldVersion?: string;\n newVersion?: string;\n}\n\n// --- Manifest Operations ---\n\n/**\n * Create a manifest.yaml for a set of primitive files.\n */\nexport function createManifest(\n harnessDir: string,\n options: {\n name: string;\n description: string;\n author?: string;\n version?: string;\n files: string[];\n tags?: string[];\n license?: string;\n },\n): BundleManifest {\n const types = new Set<string>();\n const fileEntries: BundleFileEntry[] = [];\n\n for (const filePath of options.files) {\n const absPath = filePath.startsWith('/') ? filePath : join(harnessDir, filePath);\n if (!existsSync(absPath)) continue;\n\n const relPath = relative(harnessDir, absPath);\n const dir = relPath.split('/')[0];\n const type = (CORE_PRIMITIVE_DIRS as readonly string[]).includes(dir) ? dir : 'custom';\n types.add(type);\n\n try {\n const doc = parseHarnessDocument(absPath);\n fileEntries.push({\n path: relPath,\n type,\n id: doc.frontmatter.id ?? basename(relPath, '.md'),\n l0: doc.l0 || '',\n });\n } catch {\n fileEntries.push({\n path: relPath,\n type,\n id: basename(relPath, '.md'),\n l0: '',\n });\n }\n }\n\n return {\n version: '1.0',\n name: options.name,\n description: options.description,\n author: options.author ?? 'unknown',\n bundle_version: options.version ?? '1.0.0',\n created: new Date().toISOString(),\n types: [...types],\n tags: options.tags ?? [],\n files: fileEntries,\n license: options.license,\n };\n}\n\n/**\n * Write a manifest to a YAML file.\n */\nexport function writeManifest(manifest: BundleManifest, outputPath: string): void {\n writeFileSync(outputPath, stringifyYaml(manifest), 'utf-8');\n}\n\n/**\n * Read and validate a manifest from a YAML file.\n */\nexport function readManifest(manifestPath: string): BundleManifest {\n if (!existsSync(manifestPath)) {\n throw new Error(`Manifest not found: ${manifestPath}`);\n }\n const content = readFileSync(manifestPath, 'utf-8');\n const parsed: unknown = parseYaml(content);\n\n if (typeof parsed !== 'object' || parsed === null) {\n throw new Error('Invalid manifest: not an object');\n }\n\n const manifest = parsed as Record<string, unknown>;\n if (typeof manifest.name !== 'string' || !manifest.name) {\n throw new Error('Invalid manifest: missing \"name\"');\n }\n if (typeof manifest.version !== 'string') {\n throw new Error('Invalid manifest: missing \"version\"');\n }\n if (!Array.isArray(manifest.files)) {\n throw new Error('Invalid manifest: missing \"files\" array');\n }\n\n return parsed as BundleManifest;\n}\n\n// --- Bundle Pack/Unpack ---\n\nexport interface PackedBundle {\n manifest: BundleManifest;\n files: Array<{ path: string; content: string }>;\n}\n\n/**\n * Pack a set of primitives into a bundle (manifest + file contents).\n */\nexport function packBundle(\n harnessDir: string,\n options: {\n name: string;\n description: string;\n author?: string;\n version?: string;\n files?: string[];\n types?: string[];\n tags?: string[];\n license?: string;\n },\n): PackedBundle {\n let filePaths: string[] = options.files ?? [];\n\n // If types specified (or no types and no files), auto-collect all .md files from those dirs\n const types = (options.types && options.types.length > 0)\n ? options.types\n : (filePaths.length === 0 ? [...CORE_PRIMITIVE_DIRS] : []);\n if (types.length > 0 && filePaths.length === 0) {\n for (const type of types) {\n const dirPath = join(harnessDir, type);\n if (!existsSync(dirPath)) continue;\n const files = readdirSync(dirPath)\n .filter((f: string) => f.endsWith('.md') && !f.startsWith('_') && !f.startsWith('.'))\n .map((f: string) => join(type, f));\n filePaths.push(...files);\n }\n }\n\n const manifest = createManifest(harnessDir, {\n name: options.name,\n description: options.description,\n author: options.author,\n version: options.version,\n files: filePaths,\n tags: options.tags,\n license: options.license,\n });\n\n const files: Array<{ path: string; content: string }> = [];\n for (const entry of manifest.files) {\n const absPath = join(harnessDir, entry.path);\n if (existsSync(absPath)) {\n files.push({\n path: entry.path,\n content: readFileSync(absPath, 'utf-8'),\n });\n }\n }\n\n return { manifest, files };\n}\n\n/**\n * Write a packed bundle to a directory (manifest.yaml + files).\n */\nexport function writeBundleDir(bundle: PackedBundle, outputDir: string): void {\n mkdirSync(outputDir, { recursive: true });\n writeManifest(bundle.manifest, join(outputDir, 'manifest.yaml'));\n\n for (const file of bundle.files) {\n const targetPath = join(outputDir, file.path);\n mkdirSync(dirname(targetPath), { recursive: true });\n writeFileSync(targetPath, file.content, 'utf-8');\n }\n}\n\n/**\n * Read a packed bundle from a directory containing manifest.yaml.\n */\nexport function readBundleDir(bundleDir: string): PackedBundle {\n const manifestPath = join(bundleDir, 'manifest.yaml');\n const manifest = readManifest(manifestPath);\n\n const files: Array<{ path: string; content: string }> = [];\n for (const entry of manifest.files) {\n const filePath = join(bundleDir, entry.path);\n if (existsSync(filePath)) {\n files.push({\n path: entry.path,\n content: readFileSync(filePath, 'utf-8'),\n });\n }\n }\n\n return { manifest, files };\n}\n\n// --- Install from Bundle ---\n\n/**\n * Install primitives from a packed bundle into a harness directory.\n */\nexport function installBundle(\n harnessDir: string,\n bundle: PackedBundle,\n options?: { overwrite?: boolean; force?: boolean },\n): PrimitiveInstallResult {\n const overwrite = options?.overwrite ?? false;\n const result: PrimitiveInstallResult = {\n installed: false,\n name: bundle.manifest.name,\n files: [],\n skipped: [],\n errors: [],\n manifest: bundle.manifest,\n };\n\n // Check for dependents\n if (bundle.manifest.dependencies && bundle.manifest.dependencies.length > 0 && !options?.force) {\n const installedPath = join(harnessDir, '.installed');\n if (existsSync(installedPath)) {\n const installed = readInstalledManifests(harnessDir);\n const installedNames = new Set(installed.map((m) => m.name));\n const missing = bundle.manifest.dependencies.filter((d) => !installedNames.has(d));\n if (missing.length > 0) {\n result.errors.push(`Missing dependencies: ${missing.join(', ')}. Use --force to install anyway.`);\n return result;\n }\n }\n }\n\n for (const file of bundle.files) {\n const targetPath = join(harnessDir, file.path);\n\n if (existsSync(targetPath) && !overwrite) {\n result.skipped.push(file.path);\n continue;\n }\n\n try {\n mkdirSync(dirname(targetPath), { recursive: true });\n writeFileSync(targetPath, file.content, 'utf-8');\n result.files.push(file.path);\n } catch (err) {\n result.errors.push(`${file.path}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // Record installation\n if (result.files.length > 0 || result.skipped.length > 0) {\n result.installed = true;\n recordInstallation(harnessDir, bundle.manifest);\n }\n\n return result;\n}\n\n// --- Uninstall ---\n\n/**\n * Uninstall (soft-delete) a previously installed bundle.\n * Moves files to archive/ instead of deleting.\n */\nexport function uninstallBundle(\n harnessDir: string,\n bundleName: string,\n options?: { hard?: boolean },\n): PrimitiveUninstallResult {\n const result: PrimitiveUninstallResult = {\n uninstalled: false,\n name: bundleName,\n archived: [],\n dependents: [],\n errors: [],\n };\n\n // Find the installed manifest\n const installed = readInstalledManifests(harnessDir);\n const manifest = installed.find((m) => m.name === bundleName);\n if (!manifest) {\n result.errors.push(`Bundle \"${bundleName}\" is not installed`);\n return result;\n }\n\n // Check if other installed bundles depend on this one\n const dependents = installed.filter(\n (m) => m.name !== bundleName && m.dependencies?.includes(bundleName),\n );\n if (dependents.length > 0) {\n result.dependents = dependents.map((m) => m.name);\n result.errors.push(\n `Cannot uninstall: ${dependents.map((m) => m.name).join(', ')} depend(s) on \"${bundleName}\"`,\n );\n return result;\n }\n\n const archiveDir = join(harnessDir, 'archive', 'uninstalled', bundleName);\n\n for (const entry of manifest.files) {\n const filePath = join(harnessDir, entry.path);\n if (!existsSync(filePath)) continue;\n\n try {\n if (options?.hard) {\n unlinkSync(filePath);\n } else {\n // Soft delete — move to archive\n const archivePath = join(archiveDir, entry.path);\n mkdirSync(dirname(archivePath), { recursive: true });\n renameSync(filePath, archivePath);\n }\n result.archived.push(entry.path);\n } catch (err) {\n result.errors.push(`${entry.path}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // Remove installation record\n if (result.archived.length > 0) {\n result.uninstalled = true;\n removeInstallationRecord(harnessDir, bundleName);\n }\n\n return result;\n}\n\n// --- Update ---\n\n/**\n * Compare an installed bundle against a new version and produce a diff.\n */\nexport function diffBundle(\n harnessDir: string,\n newBundle: PackedBundle,\n): { added: string[]; modified: string[]; removed: string[]; unchanged: string[] } {\n const installed = readInstalledManifests(harnessDir);\n const existing = installed.find((m) => m.name === newBundle.manifest.name);\n\n const added: string[] = [];\n const modified: string[] = [];\n const removed: string[] = [];\n const unchanged: string[] = [];\n\n const existingFiles = new Set(existing?.files.map((f) => f.path) ?? []);\n const newFiles = new Set(newBundle.manifest.files.map((f) => f.path));\n\n // Check for added/modified files\n for (const file of newBundle.files) {\n const targetPath = join(harnessDir, file.path);\n if (!existingFiles.has(file.path)) {\n added.push(file.path);\n } else if (existsSync(targetPath)) {\n const currentContent = readFileSync(targetPath, 'utf-8');\n if (currentContent !== file.content) {\n modified.push(file.path);\n } else {\n unchanged.push(file.path);\n }\n } else {\n added.push(file.path);\n }\n }\n\n // Check for removed files\n for (const path of existingFiles) {\n if (!newFiles.has(path)) {\n removed.push(path);\n }\n }\n\n return { added, modified, removed, unchanged };\n}\n\n/**\n * Update an installed bundle to a new version.\n */\nexport function updateBundle(\n harnessDir: string,\n newBundle: PackedBundle,\n options?: { removeDeleted?: boolean },\n): PrimitiveUpdateResult {\n const removeDeleted = options?.removeDeleted ?? false;\n const diff = diffBundle(harnessDir, newBundle);\n\n const result: PrimitiveUpdateResult = {\n updated: false,\n name: newBundle.manifest.name,\n added: [],\n modified: [],\n removed: [],\n errors: [],\n };\n\n // Find old version\n const installed = readInstalledManifests(harnessDir);\n const existing = installed.find((m) => m.name === newBundle.manifest.name);\n result.oldVersion = existing?.bundle_version;\n result.newVersion = newBundle.manifest.bundle_version;\n\n // Write added/modified files\n for (const path of [...diff.added, ...diff.modified]) {\n const file = newBundle.files.find((f) => f.path === path);\n if (!file) continue;\n\n const targetPath = join(harnessDir, path);\n try {\n mkdirSync(dirname(targetPath), { recursive: true });\n writeFileSync(targetPath, file.content, 'utf-8');\n if (diff.added.includes(path)) {\n result.added.push(path);\n } else {\n result.modified.push(path);\n }\n } catch (err) {\n result.errors.push(`${path}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n // Handle removed files\n if (removeDeleted) {\n const archiveDir = join(harnessDir, 'archive', 'updated', newBundle.manifest.name);\n for (const path of diff.removed) {\n const filePath = join(harnessDir, path);\n if (!existsSync(filePath)) continue;\n\n try {\n const archivePath = join(archiveDir, path);\n mkdirSync(dirname(archivePath), { recursive: true });\n renameSync(filePath, archivePath);\n result.removed.push(path);\n } catch (err) {\n result.errors.push(`${path}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n }\n\n if (result.added.length > 0 || result.modified.length > 0 || result.removed.length > 0) {\n result.updated = true;\n recordInstallation(harnessDir, newBundle.manifest);\n }\n\n return result;\n}\n\n// --- Installation Record ---\n\nconst INSTALLED_DIR = '.installed';\n\n/**\n * Record that a bundle was installed (writes manifest to .installed/).\n */\nfunction recordInstallation(harnessDir: string, manifest: BundleManifest): void {\n const installedDir = join(harnessDir, INSTALLED_DIR);\n mkdirSync(installedDir, { recursive: true });\n const manifestPath = join(installedDir, `${manifest.name}.yaml`);\n writeFileSync(manifestPath, stringifyYaml(manifest), 'utf-8');\n}\n\n/**\n * Remove an installation record.\n */\nfunction removeInstallationRecord(harnessDir: string, bundleName: string): void {\n const manifestPath = join(harnessDir, INSTALLED_DIR, `${bundleName}.yaml`);\n if (existsSync(manifestPath)) {\n unlinkSync(manifestPath);\n }\n}\n\n/**\n * Read all installed bundle manifests.\n */\nexport function readInstalledManifests(harnessDir: string): BundleManifest[] {\n const installedDir = join(harnessDir, INSTALLED_DIR);\n if (!existsSync(installedDir)) return [];\n\n const files = readdirSync(installedDir).filter((f: string) => f.endsWith('.yaml'));\n const manifests: BundleManifest[] = [];\n\n for (const file of files) {\n try {\n const manifest = readManifest(join(installedDir, file));\n manifests.push(manifest);\n } catch (err) {\n log.warn(`Failed to read installed manifest ${file}: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n return manifests;\n}\n\n/**\n * List all installed bundles with summary info.\n */\nexport function listInstalledBundles(harnessDir: string): Array<{\n name: string;\n version: string;\n types: string[];\n fileCount: number;\n description: string;\n}> {\n return readInstalledManifests(harnessDir).map((m) => ({\n name: m.name,\n version: m.bundle_version,\n types: m.types,\n fileCount: m.files.length,\n description: m.description,\n }));\n}\n\n// --- Remote Registry Client ---\n\n/**\n * Fetch a bundle from a remote registry URL.\n */\nexport async function fetchRemoteBundle(url: string): Promise<PackedBundle> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch bundle: ${response.status} ${response.statusText}`);\n }\n\n const contentType = response.headers.get('content-type') ?? '';\n\n if (contentType.includes('application/json')) {\n // JSON bundle format (legacy HarnessBundle format)\n const data: unknown = await response.json();\n if (typeof data !== 'object' || data === null || !('entries' in data)) {\n throw new Error('Invalid JSON bundle format');\n }\n\n const jsonBundle = data as { entries: Array<{ path: string; content: string }>; agent_name?: string };\n\n // Convert to PackedBundle with synthetic manifest\n const files = jsonBundle.entries;\n const types = new Set<string>();\n const fileEntries: BundleFileEntry[] = [];\n\n for (const entry of files) {\n const dir = entry.path.split('/')[0];\n const type = (CORE_PRIMITIVE_DIRS as readonly string[]).includes(dir) ? dir : 'custom';\n types.add(type);\n fileEntries.push({\n path: entry.path,\n type,\n id: basename(entry.path, '.md'),\n l0: '',\n });\n }\n\n const manifest: BundleManifest = {\n version: '1.0',\n name: jsonBundle.agent_name ?? 'remote-bundle',\n description: 'Imported from remote URL',\n author: 'unknown',\n bundle_version: '1.0.0',\n created: new Date().toISOString(),\n types: [...types],\n tags: [],\n files: fileEntries,\n };\n\n return { manifest, files };\n }\n\n // YAML manifest + files format (tar/zip would go here in future)\n // For now, treat as a single-file bundle\n const content = await response.text();\n const fileName = basename(new URL(url).pathname);\n\n const manifest: BundleManifest = {\n version: '1.0',\n name: basename(fileName, '.md'),\n description: `Downloaded from ${url}`,\n author: 'unknown',\n bundle_version: '1.0.0',\n created: new Date().toISOString(),\n types: ['custom'],\n tags: [],\n files: [{ path: fileName, type: 'custom', id: basename(fileName, '.md'), l0: '' }],\n };\n\n return { manifest, files: [{ path: fileName, content }] };\n}\n\n/**\n * Search a remote registry for bundles.\n */\nexport async function searchBundleRegistry(\n registryUrl: string,\n query: string,\n options?: { limit?: number; token?: string },\n): Promise<BundleSearchResponse> {\n const limit = options?.limit ?? 20;\n const searchUrl = `${registryUrl}/api/bundles?search=${encodeURIComponent(query)}&limit=${limit}`;\n\n const headers: Record<string, string> = { 'Accept': 'application/json' };\n if (options?.token) {\n headers['Authorization'] = `Bearer ${options.token}`;\n }\n\n const response = await fetch(searchUrl, { headers });\n if (!response.ok) {\n throw new Error(`Registry search failed: ${response.status} ${response.statusText}`);\n }\n\n return await response.json() as BundleSearchResponse;\n}\n\n/**\n * Fetch a bundle from a registry by name.\n */\nexport async function fetchFromRegistry(\n registryUrl: string,\n bundleName: string,\n options?: { version?: string; token?: string },\n): Promise<PackedBundle> {\n const version = options?.version ?? 'latest';\n const bundleUrl = `${registryUrl}/api/bundles/${encodeURIComponent(bundleName)}/versions/${version}/download`;\n\n const headers: Record<string, string> = {};\n if (options?.token) {\n headers['Authorization'] = `Bearer ${options.token}`;\n }\n\n const response = await fetch(bundleUrl, { headers });\n if (!response.ok) {\n throw new Error(`Failed to fetch bundle \"${bundleName}\": ${response.status} ${response.statusText}`);\n }\n\n const data: unknown = await response.json();\n return data as PackedBundle;\n}\n\n// --- Multi-Registry Support ---\n\nexport interface BundleSearchHit extends BundleSearchResult {\n /** Which registry URL this result came from */\n registryUrl: string;\n /** Display name of the registry */\n registryName: string;\n}\n\nexport interface MultiBundleSearchResponse {\n results: BundleSearchHit[];\n total: number;\n registriesSearched: number;\n errors: Array<{ registry: string; error: string }>;\n}\n\n/**\n * Search all configured registries for bundles.\n * Merges results, deduplicating by name (first registry wins).\n */\nexport async function searchConfiguredRegistries(\n registries: Array<{ url: string; name?: string; token?: string }>,\n query: string,\n options?: { limit?: number },\n): Promise<MultiBundleSearchResponse> {\n const limit = options?.limit ?? 20;\n const allResults: BundleSearchHit[] = [];\n const errors: Array<{ registry: string; error: string }> = [];\n const seenNames = new Set<string>();\n\n const searches = registries.map(async (reg) => {\n const displayName = reg.name ?? reg.url;\n try {\n const response = await searchBundleRegistry(reg.url, query, { limit, token: reg.token });\n return { registry: reg, displayName, response };\n } catch (err) {\n errors.push({\n registry: displayName,\n error: err instanceof Error ? err.message : String(err),\n });\n return null;\n }\n });\n\n const results = await Promise.allSettled(searches);\n\n for (const settled of results) {\n if (settled.status === 'fulfilled' && settled.value) {\n const { registry, displayName, response } = settled.value;\n for (const result of response.results) {\n if (!seenNames.has(result.name)) {\n seenNames.add(result.name);\n allResults.push({\n ...result,\n registryUrl: registry.url,\n registryName: displayName,\n });\n }\n }\n }\n }\n\n return {\n results: allResults.slice(0, limit),\n total: allResults.length,\n registriesSearched: registries.length,\n errors,\n };\n}\n\n/**\n * Install a bundle from configured registries by name.\n * Searches each registry in order, installs from the first match.\n */\nexport async function installFromRegistry(\n harnessDir: string,\n registries: Array<{ url: string; name?: string; token?: string }>,\n bundleName: string,\n options?: { version?: string; overwrite?: boolean; force?: boolean },\n): Promise<PrimitiveInstallResult & { registryUrl?: string }> {\n for (const reg of registries) {\n try {\n const bundle = await fetchFromRegistry(reg.url, bundleName, {\n version: options?.version,\n token: reg.token,\n });\n const result = installBundle(harnessDir, bundle, {\n overwrite: options?.overwrite,\n force: options?.force,\n });\n return { ...result, registryUrl: reg.url };\n } catch {\n // Try next registry\n continue;\n }\n }\n\n return {\n installed: false,\n name: bundleName,\n files: [],\n skipped: [],\n errors: [`Bundle \"${bundleName}\" not found in any configured registry`],\n };\n}\n"],"mappings":"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","names":["files","manifest"]}