@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,165 @@
1
+ #!/usr/bin/env node
2
+
3
+ import {
4
+ loadConfig
5
+ } from "./chunk-CHJ5GNZC.js";
6
+ import {
7
+ getPrimitiveDirs
8
+ } from "./chunk-4CWAGBNS.js";
9
+ import "./chunk-ZZJOFKAT.js";
10
+
11
+ // src/runtime/export.ts
12
+ import { readFileSync, writeFileSync, existsSync, readdirSync, mkdirSync } from "fs";
13
+ import { join, relative } from "path";
14
+ function collectMdFiles(dir) {
15
+ if (!existsSync(dir)) return [];
16
+ return readdirSync(dir).filter((f) => f.endsWith(".md") && !f.startsWith(".") && !f.startsWith("_")).map((f) => join(dir, f));
17
+ }
18
+ function exportHarness(harnessDir, options) {
19
+ const includeSessions = options?.sessions ?? true;
20
+ const includeJournals = options?.journals ?? true;
21
+ const includeMetrics = options?.metrics ?? true;
22
+ const includeState = options?.state ?? true;
23
+ let config;
24
+ try {
25
+ config = loadConfig(harnessDir);
26
+ } catch {
27
+ config = { agent: { name: "unknown", version: "0.0.0" } };
28
+ }
29
+ const entries = [];
30
+ let primitiveCount = 0;
31
+ let sessionCount = 0;
32
+ let journalCount = 0;
33
+ const coreFiles = ["CORE.md", "SYSTEM.md", "config.yaml"];
34
+ for (const file of coreFiles) {
35
+ const filePath = join(harnessDir, file);
36
+ if (existsSync(filePath)) {
37
+ entries.push({
38
+ path: file,
39
+ content: readFileSync(filePath, "utf-8")
40
+ });
41
+ }
42
+ }
43
+ if (includeState) {
44
+ const stateFiles = ["state.md", join("memory", "scratch.md")];
45
+ for (const file of stateFiles) {
46
+ const filePath = join(harnessDir, file);
47
+ if (existsSync(filePath)) {
48
+ entries.push({
49
+ path: file,
50
+ content: readFileSync(filePath, "utf-8")
51
+ });
52
+ }
53
+ }
54
+ }
55
+ const dirs = getPrimitiveDirs(config);
56
+ for (const dir of dirs) {
57
+ const files = collectMdFiles(join(harnessDir, dir));
58
+ for (const file of files) {
59
+ entries.push({
60
+ path: relative(harnessDir, file),
61
+ content: readFileSync(file, "utf-8")
62
+ });
63
+ primitiveCount++;
64
+ }
65
+ }
66
+ if (includeSessions) {
67
+ const sessionsDir = join(harnessDir, "memory", "sessions");
68
+ const files = collectMdFiles(sessionsDir);
69
+ for (const file of files) {
70
+ entries.push({
71
+ path: relative(harnessDir, file),
72
+ content: readFileSync(file, "utf-8")
73
+ });
74
+ sessionCount++;
75
+ }
76
+ }
77
+ if (includeJournals) {
78
+ const journalDir = join(harnessDir, "memory", "journal");
79
+ const files = collectMdFiles(journalDir);
80
+ for (const file of files) {
81
+ entries.push({
82
+ path: relative(harnessDir, file),
83
+ content: readFileSync(file, "utf-8")
84
+ });
85
+ journalCount++;
86
+ }
87
+ const weeklyDir = join(harnessDir, "memory", "journal", "weekly");
88
+ const weeklyFiles = collectMdFiles(weeklyDir);
89
+ for (const file of weeklyFiles) {
90
+ entries.push({
91
+ path: relative(harnessDir, file),
92
+ content: readFileSync(file, "utf-8")
93
+ });
94
+ journalCount++;
95
+ }
96
+ }
97
+ if (includeMetrics) {
98
+ const metricsPath = join(harnessDir, "memory", "metrics.json");
99
+ if (existsSync(metricsPath)) {
100
+ entries.push({
101
+ path: join("memory", "metrics.json"),
102
+ content: readFileSync(metricsPath, "utf-8")
103
+ });
104
+ }
105
+ }
106
+ return {
107
+ version: "1.0",
108
+ exported_at: (/* @__PURE__ */ new Date()).toISOString(),
109
+ agent_name: config.agent.name,
110
+ entries,
111
+ metadata: {
112
+ primitives: primitiveCount,
113
+ sessions: sessionCount,
114
+ journals: journalCount
115
+ }
116
+ };
117
+ }
118
+ function writeBundle(bundle, outputPath) {
119
+ writeFileSync(outputPath, JSON.stringify(bundle, null, 2), "utf-8");
120
+ }
121
+ function readBundle(bundlePath) {
122
+ if (!existsSync(bundlePath)) {
123
+ throw new Error(`Bundle not found: ${bundlePath}`);
124
+ }
125
+ const content = readFileSync(bundlePath, "utf-8");
126
+ const parsed = JSON.parse(content);
127
+ if (typeof parsed !== "object" || parsed === null || !("version" in parsed) || !("entries" in parsed) || !Array.isArray(parsed.entries)) {
128
+ throw new Error("Invalid bundle format: missing version or entries");
129
+ }
130
+ return parsed;
131
+ }
132
+ function importBundle(harnessDir, bundle, options) {
133
+ const overwrite = options?.overwrite ?? false;
134
+ const result = {
135
+ imported: 0,
136
+ skipped: 0,
137
+ errors: [],
138
+ files: []
139
+ };
140
+ for (const entry of bundle.entries) {
141
+ const targetPath = join(harnessDir, entry.path);
142
+ if (existsSync(targetPath) && !overwrite) {
143
+ result.skipped++;
144
+ continue;
145
+ }
146
+ try {
147
+ const parentDir = join(targetPath, "..");
148
+ mkdirSync(parentDir, { recursive: true });
149
+ writeFileSync(targetPath, entry.content, "utf-8");
150
+ result.imported++;
151
+ result.files.push(entry.path);
152
+ } catch (err) {
153
+ const msg = err instanceof Error ? err.message : String(err);
154
+ result.errors.push(`${entry.path}: ${msg}`);
155
+ }
156
+ }
157
+ return result;
158
+ }
159
+ export {
160
+ exportHarness,
161
+ importBundle,
162
+ readBundle,
163
+ writeBundle
164
+ };
165
+ //# sourceMappingURL=export-6GCYHEHQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runtime/export.ts"],"sourcesContent":["import { readFileSync, writeFileSync, existsSync, readdirSync, mkdirSync } from 'fs';\nimport { join, relative } from 'path';\nimport { getPrimitiveDirs } from '../core/types.js';\nimport type { HarnessConfig } from '../core/types.js';\nimport { loadConfig } from '../core/config.js';\n\nexport interface ExportEntry {\n path: string;\n content: string;\n}\n\nexport interface HarnessBundle {\n version: string;\n exported_at: string;\n agent_name: string;\n entries: ExportEntry[];\n metadata: {\n primitives: number;\n sessions: number;\n journals: number;\n };\n}\n\nexport interface ImportResult {\n imported: number;\n skipped: number;\n errors: string[];\n files: string[];\n}\n\nexport interface ExportOptions {\n /** Include session files (default: true) */\n sessions?: boolean;\n /** Include journal files (default: true) */\n journals?: boolean;\n /** Include memory/metrics.json (default: true) */\n metrics?: boolean;\n /** Include state.md and scratch.md (default: true) */\n state?: boolean;\n}\n\n/**\n * Collect all .md files from a directory (non-recursive, excludes dotfiles and _index).\n */\nfunction collectMdFiles(dir: string): string[] {\n if (!existsSync(dir)) return [];\n return readdirSync(dir)\n .filter((f) => f.endsWith('.md') && !f.startsWith('.') && !f.startsWith('_'))\n .map((f) => join(dir, f));\n}\n\n/**\n * Export a harness to a portable JSON bundle.\n */\nexport function exportHarness(harnessDir: string, options?: ExportOptions): HarnessBundle {\n const includeSessions = options?.sessions ?? true;\n const includeJournals = options?.journals ?? true;\n const includeMetrics = options?.metrics ?? true;\n const includeState = options?.state ?? true;\n\n let config: HarnessConfig;\n try {\n config = loadConfig(harnessDir);\n } catch {\n config = { agent: { name: 'unknown', version: '0.0.0' } } as HarnessConfig;\n }\n\n const entries: ExportEntry[] = [];\n let primitiveCount = 0;\n let sessionCount = 0;\n let journalCount = 0;\n\n // Core files\n const coreFiles = ['CORE.md', 'SYSTEM.md', 'config.yaml'];\n for (const file of coreFiles) {\n const filePath = join(harnessDir, file);\n if (existsSync(filePath)) {\n entries.push({\n path: file,\n content: readFileSync(filePath, 'utf-8'),\n });\n }\n }\n\n // State files\n if (includeState) {\n const stateFiles = ['state.md', join('memory', 'scratch.md')];\n for (const file of stateFiles) {\n const filePath = join(harnessDir, file);\n if (existsSync(filePath)) {\n entries.push({\n path: file,\n content: readFileSync(filePath, 'utf-8'),\n });\n }\n }\n }\n\n // Primitive directories\n const dirs = getPrimitiveDirs(config);\n for (const dir of dirs) {\n const files = collectMdFiles(join(harnessDir, dir));\n for (const file of files) {\n entries.push({\n path: relative(harnessDir, file),\n content: readFileSync(file, 'utf-8'),\n });\n primitiveCount++;\n }\n }\n\n // Sessions\n if (includeSessions) {\n const sessionsDir = join(harnessDir, 'memory', 'sessions');\n const files = collectMdFiles(sessionsDir);\n for (const file of files) {\n entries.push({\n path: relative(harnessDir, file),\n content: readFileSync(file, 'utf-8'),\n });\n sessionCount++;\n }\n }\n\n // Journals\n if (includeJournals) {\n const journalDir = join(harnessDir, 'memory', 'journal');\n const files = collectMdFiles(journalDir);\n for (const file of files) {\n entries.push({\n path: relative(harnessDir, file),\n content: readFileSync(file, 'utf-8'),\n });\n journalCount++;\n }\n\n // Weekly journals too\n const weeklyDir = join(harnessDir, 'memory', 'journal', 'weekly');\n const weeklyFiles = collectMdFiles(weeklyDir);\n for (const file of weeklyFiles) {\n entries.push({\n path: relative(harnessDir, file),\n content: readFileSync(file, 'utf-8'),\n });\n journalCount++;\n }\n }\n\n // Metrics\n if (includeMetrics) {\n const metricsPath = join(harnessDir, 'memory', 'metrics.json');\n if (existsSync(metricsPath)) {\n entries.push({\n path: join('memory', 'metrics.json'),\n content: readFileSync(metricsPath, 'utf-8'),\n });\n }\n }\n\n return {\n version: '1.0',\n exported_at: new Date().toISOString(),\n agent_name: config.agent.name,\n entries,\n metadata: {\n primitives: primitiveCount,\n sessions: sessionCount,\n journals: journalCount,\n },\n };\n}\n\n/**\n * Write an export bundle to a JSON file.\n */\nexport function writeBundle(bundle: HarnessBundle, outputPath: string): void {\n writeFileSync(outputPath, JSON.stringify(bundle, null, 2), 'utf-8');\n}\n\n/**\n * Read a bundle from a JSON file.\n */\nexport function readBundle(bundlePath: string): HarnessBundle {\n if (!existsSync(bundlePath)) {\n throw new Error(`Bundle not found: ${bundlePath}`);\n }\n\n const content = readFileSync(bundlePath, 'utf-8');\n const parsed: unknown = JSON.parse(content);\n\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n !('version' in parsed) ||\n !('entries' in parsed) ||\n !Array.isArray((parsed as HarnessBundle).entries)\n ) {\n throw new Error('Invalid bundle format: missing version or entries');\n }\n\n return parsed as HarnessBundle;\n}\n\n/**\n * Import a bundle into a harness directory.\n * Only writes files that don't already exist (no overwrites by default).\n */\nexport function importBundle(\n harnessDir: string,\n bundle: HarnessBundle,\n options?: { overwrite?: boolean },\n): ImportResult {\n const overwrite = options?.overwrite ?? false;\n const result: ImportResult = {\n imported: 0,\n skipped: 0,\n errors: [],\n files: [],\n };\n\n for (const entry of bundle.entries) {\n const targetPath = join(harnessDir, entry.path);\n\n // Skip if exists and no overwrite\n if (existsSync(targetPath) && !overwrite) {\n result.skipped++;\n continue;\n }\n\n try {\n // Ensure parent directory exists\n const parentDir = join(targetPath, '..');\n mkdirSync(parentDir, { recursive: true });\n\n writeFileSync(targetPath, entry.content, 'utf-8');\n result.imported++;\n result.files.push(entry.path);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n result.errors.push(`${entry.path}: ${msg}`);\n }\n }\n\n return result;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+
3
+ import {
4
+ buildDependencyGraph,
5
+ getGraphStats
6
+ } from "./chunk-274RV3YO.js";
7
+ import "./chunk-UPLBF4RZ.js";
8
+ import "./chunk-4CWAGBNS.js";
9
+ import "./chunk-ZZJOFKAT.js";
10
+ export {
11
+ buildDependencyGraph,
12
+ getGraphStats
13
+ };
14
+ //# sourceMappingURL=graph-YUIPOSOO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,10 @@
1
+ import {
2
+ createHarness
3
+ } from "./chunk-GUJTBGVS.js";
4
+ import "./chunk-KFX54TQM.js";
5
+ import "./chunk-FD55B3IO.js";
6
+ import "./chunk-DGUM43GV.js";
7
+ export {
8
+ createHarness
9
+ };
10
+ //# sourceMappingURL=harness-LCHA3DWP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env node
2
+
3
+ import {
4
+ createHarness
5
+ } from "./chunk-YIJY5DBV.js";
6
+ import "./chunk-AGAAFJEO.js";
7
+ import "./chunk-5H34JPMB.js";
8
+ import "./chunk-DA7IKHC4.js";
9
+ import "./chunk-UWQTZMNI.js";
10
+ import "./chunk-UDZIS2AQ.js";
11
+ import "./chunk-DTTXPHFW.js";
12
+ import "./chunk-Z2PUCXTZ.js";
13
+ import "./chunk-TAT6JU3X.js";
14
+ import "./chunk-JKMGYWXB.js";
15
+ import "./chunk-OC6YSTDX.js";
16
+ import "./chunk-XTBKL5BI.js";
17
+ import "./chunk-UPLBF4RZ.js";
18
+ import "./chunk-BSKDOFRT.js";
19
+ import "./chunk-IZ6UZ3ZL.js";
20
+ import "./chunk-CHJ5GNZC.js";
21
+ import "./chunk-4CWAGBNS.js";
22
+ import "./chunk-ZZJOFKAT.js";
23
+ export {
24
+ createHarness
25
+ };
26
+ //# sourceMappingURL=harness-WE4SLCML.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env node
2
+
3
+ import {
4
+ getHealthStatus,
5
+ loadHealth,
6
+ recordBoot,
7
+ recordFailure,
8
+ recordSuccess,
9
+ resetHealth,
10
+ saveHealth
11
+ } from "./chunk-TAT6JU3X.js";
12
+ import "./chunk-JKMGYWXB.js";
13
+ import "./chunk-ZZJOFKAT.js";
14
+ export {
15
+ getHealthStatus,
16
+ loadHealth,
17
+ recordBoot,
18
+ recordFailure,
19
+ recordSuccess,
20
+ resetHealth,
21
+ saveHealth
22
+ };
23
+ //# sourceMappingURL=health-NZ6WNIMV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}