homegraph 1.5.2 → 1.5.4

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 (242) hide show
  1. package/CHANGELOG.md +156 -0
  2. package/README.md +63 -10
  3. package/dist/addons/dynamic-import.d.ts +18 -0
  4. package/dist/addons/dynamic-import.d.ts.map +1 -0
  5. package/dist/addons/dynamic-import.js +25 -0
  6. package/dist/addons/dynamic-import.js.map +1 -0
  7. package/dist/addons/init-template.d.ts +15 -0
  8. package/dist/addons/init-template.d.ts.map +1 -0
  9. package/dist/addons/init-template.js +290 -0
  10. package/dist/addons/init-template.js.map +1 -0
  11. package/dist/addons/loader.d.ts +18 -0
  12. package/dist/addons/loader.d.ts.map +1 -0
  13. package/dist/addons/loader.js +88 -0
  14. package/dist/addons/loader.js.map +1 -0
  15. package/dist/addons/manager.d.ts +106 -0
  16. package/dist/addons/manager.d.ts.map +1 -0
  17. package/dist/addons/manager.js +437 -0
  18. package/dist/addons/manager.js.map +1 -0
  19. package/dist/addons/paths.d.ts +22 -0
  20. package/dist/addons/paths.d.ts.map +1 -0
  21. package/dist/addons/paths.js +65 -0
  22. package/dist/addons/paths.js.map +1 -0
  23. package/dist/addons/registry.d.ts +38 -0
  24. package/dist/addons/registry.d.ts.map +1 -0
  25. package/dist/addons/registry.js +160 -0
  26. package/dist/addons/registry.js.map +1 -0
  27. package/dist/addons/semver.d.ts +21 -0
  28. package/dist/addons/semver.d.ts.map +1 -0
  29. package/dist/addons/semver.js +79 -0
  30. package/dist/addons/semver.js.map +1 -0
  31. package/dist/addons/types.d.ts +51 -0
  32. package/dist/addons/types.d.ts.map +1 -0
  33. package/dist/addons/types.js +14 -0
  34. package/dist/addons/types.js.map +1 -0
  35. package/dist/addons/validate.d.ts +38 -0
  36. package/dist/addons/validate.d.ts.map +1 -0
  37. package/dist/addons/validate.js +165 -0
  38. package/dist/addons/validate.js.map +1 -0
  39. package/dist/arkui/index.d.ts +4 -0
  40. package/dist/arkui/index.d.ts.map +1 -0
  41. package/dist/arkui/index.js +23 -0
  42. package/dist/arkui/index.js.map +1 -0
  43. package/dist/arkui/migrate-passage.d.ts +28 -0
  44. package/dist/arkui/migrate-passage.d.ts.map +1 -0
  45. package/dist/arkui/migrate-passage.js +310 -0
  46. package/dist/arkui/migrate-passage.js.map +1 -0
  47. package/dist/arkui/migrate-semantics.d.ts +47 -0
  48. package/dist/arkui/migrate-semantics.d.ts.map +1 -0
  49. package/dist/arkui/migrate-semantics.js +229 -0
  50. package/dist/arkui/migrate-semantics.js.map +1 -0
  51. package/dist/arkui/migrate-snapshot.d.ts +79 -0
  52. package/dist/arkui/migrate-snapshot.d.ts.map +1 -0
  53. package/dist/arkui/migrate-snapshot.js +364 -0
  54. package/dist/arkui/migrate-snapshot.js.map +1 -0
  55. package/dist/bin/addon-commands.d.ts +27 -0
  56. package/dist/bin/addon-commands.d.ts.map +1 -0
  57. package/dist/bin/addon-commands.js +254 -0
  58. package/dist/bin/addon-commands.js.map +1 -0
  59. package/dist/bin/fatal-handler.js +2 -2
  60. package/dist/bin/homegraph.js +111 -157
  61. package/dist/bin/homegraph.js.map +1 -1
  62. package/dist/bin/node-version-check.d.ts +6 -15
  63. package/dist/bin/node-version-check.d.ts.map +1 -1
  64. package/dist/bin/node-version-check.js +8 -37
  65. package/dist/bin/node-version-check.js.map +1 -1
  66. package/dist/db/index.d.ts +36 -1
  67. package/dist/db/index.d.ts.map +1 -1
  68. package/dist/db/index.js +92 -6
  69. package/dist/db/index.js.map +1 -1
  70. package/dist/db/migrations.d.ts +1 -1
  71. package/dist/db/migrations.d.ts.map +1 -1
  72. package/dist/db/migrations.js +15 -1
  73. package/dist/db/migrations.js.map +1 -1
  74. package/dist/db/queries.d.ts +42 -0
  75. package/dist/db/queries.d.ts.map +1 -1
  76. package/dist/db/queries.js +177 -10
  77. package/dist/db/queries.js.map +1 -1
  78. package/dist/db/schema.sql +6 -1
  79. package/dist/db/sqlite-adapter.d.ts +7 -3
  80. package/dist/db/sqlite-adapter.d.ts.map +1 -1
  81. package/dist/db/sqlite-adapter.js +44 -3
  82. package/dist/db/sqlite-adapter.js.map +1 -1
  83. package/dist/extraction/extraction-version.d.ts +1 -1
  84. package/dist/extraction/extraction-version.js +1 -1
  85. package/dist/extraction/generated-detection.d.ts +42 -11
  86. package/dist/extraction/generated-detection.d.ts.map +1 -1
  87. package/dist/extraction/generated-detection.js +141 -20
  88. package/dist/extraction/generated-detection.js.map +1 -1
  89. package/dist/extraction/index.d.ts +42 -0
  90. package/dist/extraction/index.d.ts.map +1 -1
  91. package/dist/extraction/index.js +96 -0
  92. package/dist/extraction/index.js.map +1 -1
  93. package/dist/extraction/languages/arkts.d.ts +33 -2
  94. package/dist/extraction/languages/arkts.d.ts.map +1 -1
  95. package/dist/extraction/languages/arkts.js +525 -129
  96. package/dist/extraction/languages/arkts.js.map +1 -1
  97. package/dist/extraction/wasm-runtime-flags.d.ts.map +1 -1
  98. package/dist/extraction/wasm-runtime-flags.js +9 -6
  99. package/dist/extraction/wasm-runtime-flags.js.map +1 -1
  100. package/dist/graph-sources.d.ts +41 -0
  101. package/dist/graph-sources.d.ts.map +1 -0
  102. package/dist/graph-sources.js +82 -0
  103. package/dist/graph-sources.js.map +1 -0
  104. package/dist/index.d.ts +20 -1
  105. package/dist/index.d.ts.map +1 -1
  106. package/dist/index.js +79 -9
  107. package/dist/index.js.map +1 -1
  108. package/dist/installer/index.d.ts.map +1 -1
  109. package/dist/installer/index.js +0 -48
  110. package/dist/installer/index.js.map +1 -1
  111. package/dist/installer/targets/antigravity.js +1 -1
  112. package/dist/installer/targets/antigravity.js.map +1 -1
  113. package/dist/installer/targets/deveco.js +1 -1
  114. package/dist/installer/targets/deveco.js.map +1 -1
  115. package/dist/installer/targets/hermes.d.ts +1 -1
  116. package/dist/installer/targets/hermes.js +2 -2
  117. package/dist/installer/targets/hermes.js.map +1 -1
  118. package/dist/installer/targets/opencode.js +1 -1
  119. package/dist/installer/targets/opencode.js.map +1 -1
  120. package/dist/installer/targets/shared.js +1 -1
  121. package/dist/installer/targets/shared.js.map +1 -1
  122. package/dist/mcp/daemon-paths.d.ts +5 -4
  123. package/dist/mcp/daemon-paths.d.ts.map +1 -1
  124. package/dist/mcp/daemon-paths.js +28 -13
  125. package/dist/mcp/daemon-paths.js.map +1 -1
  126. package/dist/mcp/daemon-registry.d.ts.map +1 -1
  127. package/dist/mcp/daemon-registry.js +4 -1
  128. package/dist/mcp/daemon-registry.js.map +1 -1
  129. package/dist/mcp/daemon.d.ts +1 -1
  130. package/dist/mcp/daemon.js +1 -1
  131. package/dist/mcp/engine.d.ts.map +1 -1
  132. package/dist/mcp/engine.js +12 -3
  133. package/dist/mcp/engine.js.map +1 -1
  134. package/dist/mcp/explore-dedup.d.ts +137 -0
  135. package/dist/mcp/explore-dedup.d.ts.map +1 -0
  136. package/dist/mcp/explore-dedup.js +236 -0
  137. package/dist/mcp/explore-dedup.js.map +1 -0
  138. package/dist/mcp/explore-repeat-guard.d.ts +123 -0
  139. package/dist/mcp/explore-repeat-guard.d.ts.map +1 -0
  140. package/dist/mcp/explore-repeat-guard.js +503 -0
  141. package/dist/mcp/explore-repeat-guard.js.map +1 -0
  142. package/dist/mcp/explore-session-state.d.ts +237 -0
  143. package/dist/mcp/explore-session-state.d.ts.map +1 -0
  144. package/dist/mcp/explore-session-state.js +353 -0
  145. package/dist/mcp/explore-session-state.js.map +1 -0
  146. package/dist/mcp/index.d.ts.map +1 -1
  147. package/dist/mcp/index.js +4 -7
  148. package/dist/mcp/index.js.map +1 -1
  149. package/dist/mcp/proxy.d.ts.map +1 -1
  150. package/dist/mcp/proxy.js +20 -18
  151. package/dist/mcp/proxy.js.map +1 -1
  152. package/dist/mcp/query-pool.d.ts.map +1 -1
  153. package/dist/mcp/query-pool.js +10 -13
  154. package/dist/mcp/query-pool.js.map +1 -1
  155. package/dist/mcp/query-worker.d.ts +1 -1
  156. package/dist/mcp/query-worker.js +1 -1
  157. package/dist/mcp/server-instructions.d.ts +5 -2
  158. package/dist/mcp/server-instructions.d.ts.map +1 -1
  159. package/dist/mcp/server-instructions.js +43 -32
  160. package/dist/mcp/server-instructions.js.map +1 -1
  161. package/dist/mcp/session.d.ts +14 -3
  162. package/dist/mcp/session.d.ts.map +1 -1
  163. package/dist/mcp/session.js +17 -14
  164. package/dist/mcp/session.js.map +1 -1
  165. package/dist/mcp/startup-handshake.d.ts +1 -1
  166. package/dist/mcp/startup-handshake.js +1 -1
  167. package/dist/mcp/tools.d.ts +149 -8
  168. package/dist/mcp/tools.d.ts.map +1 -1
  169. package/dist/mcp/tools.js +4265 -575
  170. package/dist/mcp/tools.js.map +1 -1
  171. package/dist/resolution/callback-synthesizer.d.ts.map +1 -1
  172. package/dist/resolution/callback-synthesizer.js +166 -0
  173. package/dist/resolution/callback-synthesizer.js.map +1 -1
  174. package/dist/resolution/frameworks/arkts-napi.d.ts +14 -0
  175. package/dist/resolution/frameworks/arkts-napi.d.ts.map +1 -1
  176. package/dist/resolution/frameworks/arkts-napi.js +169 -49
  177. package/dist/resolution/frameworks/arkts-napi.js.map +1 -1
  178. package/dist/search/query-utils.d.ts +157 -5
  179. package/dist/search/query-utils.d.ts.map +1 -1
  180. package/dist/search/query-utils.js +1105 -70
  181. package/dist/search/query-utils.js.map +1 -1
  182. package/dist/spec/build/scan.js +1 -1
  183. package/dist/spec/build/scan.js.map +1 -1
  184. package/dist/spec/build/scope-resolver.d.ts +24 -5
  185. package/dist/spec/build/scope-resolver.d.ts.map +1 -1
  186. package/dist/spec/build/scope-resolver.js +76 -10
  187. package/dist/spec/build/scope-resolver.js.map +1 -1
  188. package/dist/spec/config.d.ts +8 -0
  189. package/dist/spec/config.d.ts.map +1 -1
  190. package/dist/spec/config.js +3 -0
  191. package/dist/spec/config.js.map +1 -1
  192. package/dist/spec/evolve/pipeline.d.ts.map +1 -1
  193. package/dist/spec/evolve/pipeline.js +2 -1
  194. package/dist/spec/evolve/pipeline.js.map +1 -1
  195. package/dist/spec/git/commits.d.ts +8 -3
  196. package/dist/spec/git/commits.d.ts.map +1 -1
  197. package/dist/spec/git/commits.js +12 -11
  198. package/dist/spec/git/commits.js.map +1 -1
  199. package/dist/spec/mine/addon/adapter.d.ts +45 -0
  200. package/dist/spec/mine/addon/adapter.d.ts.map +1 -0
  201. package/dist/spec/mine/addon/adapter.js +118 -0
  202. package/dist/spec/mine/addon/adapter.js.map +1 -0
  203. package/dist/spec/mine/addon/render.d.ts +20 -0
  204. package/dist/spec/mine/addon/render.d.ts.map +1 -0
  205. package/dist/spec/mine/addon/render.js +41 -0
  206. package/dist/spec/mine/addon/render.js.map +1 -0
  207. package/dist/spec/mine/addon/types.d.ts +70 -0
  208. package/dist/spec/mine/addon/types.d.ts.map +1 -0
  209. package/dist/spec/mine/addon/types.js +14 -0
  210. package/dist/spec/mine/addon/types.js.map +1 -0
  211. package/dist/spec/mine/generator.d.ts +5 -1
  212. package/dist/spec/mine/generator.d.ts.map +1 -1
  213. package/dist/spec/mine/generator.js +69 -7
  214. package/dist/spec/mine/generator.js.map +1 -1
  215. package/dist/spec/mine/pipeline.d.ts.map +1 -1
  216. package/dist/spec/mine/pipeline.js +5 -1
  217. package/dist/spec/mine/pipeline.js.map +1 -1
  218. package/dist/spec/mine/scanner.d.ts +1 -0
  219. package/dist/spec/mine/scanner.d.ts.map +1 -1
  220. package/dist/spec/mine/scanner.js +1 -1
  221. package/dist/spec/mine/scanner.js.map +1 -1
  222. package/dist/spec/types.d.ts +1 -1
  223. package/dist/spec/types.d.ts.map +1 -1
  224. package/dist/types.d.ts +8 -0
  225. package/dist/types.d.ts.map +1 -1
  226. package/dist/upgrade/index.d.ts +14 -26
  227. package/dist/upgrade/index.d.ts.map +1 -1
  228. package/dist/upgrade/index.js +28 -123
  229. package/dist/upgrade/index.js.map +1 -1
  230. package/dist/upgrade/remove-binary.d.ts +19 -19
  231. package/dist/upgrade/remove-binary.d.ts.map +1 -1
  232. package/dist/upgrade/remove-binary.js +20 -21
  233. package/dist/upgrade/remove-binary.js.map +1 -1
  234. package/dist/upgrade/update-check.d.ts +4 -3
  235. package/dist/upgrade/update-check.d.ts.map +1 -1
  236. package/dist/upgrade/update-check.js +4 -3
  237. package/dist/upgrade/update-check.js.map +1 -1
  238. package/package.json +13 -9
  239. package/dist/telemetry/index.d.ts +0 -143
  240. package/dist/telemetry/index.d.ts.map +0 -1
  241. package/dist/telemetry/index.js +0 -541
  242. package/dist/telemetry/index.js.map +0 -1
@@ -0,0 +1,290 @@
1
+ "use strict";
2
+ /**
3
+ * Addon scaffold generator (`homegraph addon init`).
4
+ *
5
+ * Produces a publishable npm package skeleton with the `homegraph` marker,
6
+ * an `enrich` stub, and a worked Jira example (parse ticket refs → fetch
7
+ * details → return supplements).
8
+ *
9
+ * @module addons/init-template
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.createAddonScaffold = createAddonScaffold;
46
+ const fs = __importStar(require("fs"));
47
+ const path = __importStar(require("path"));
48
+ function packageJson(name, lang) {
49
+ const entry = lang === 'ts' ? './dist/index.js' : './index.mjs';
50
+ return JSON.stringify({
51
+ name,
52
+ version: '0.1.0',
53
+ description: 'HomeGraph addon: enrich spec-mine prompts with external requirement data',
54
+ type: 'module',
55
+ exports: { '.': entry },
56
+ files: lang === 'ts' ? ['dist', 'examples'] : ['index.mjs', 'examples'],
57
+ scripts: lang === 'ts' ? { build: 'tsc' } : undefined,
58
+ // TypeScript needs the homegraph type declarations to compile.
59
+ devDependencies: lang === 'ts' ? { homegraph: 'latest' } : undefined,
60
+ homegraph: { addon: true, api: 1 },
61
+ }, null, 2) + '\n';
62
+ }
63
+ function tsconfig() {
64
+ return JSON.stringify({
65
+ compilerOptions: {
66
+ target: 'ES2022',
67
+ module: 'NodeNext',
68
+ moduleResolution: 'NodeNext',
69
+ outDir: 'dist',
70
+ declaration: true,
71
+ strict: true,
72
+ esModuleInterop: true,
73
+ skipLibCheck: true,
74
+ },
75
+ include: ['index.ts'],
76
+ }, null, 2) + '\n';
77
+ }
78
+ /** Shared body of the enrich stub — identical for JS and TS. */
79
+ function enrichBody() {
80
+ return ` const supplements = [];
81
+ for (const commit of input.commits) {
82
+ const match = /([A-Z]+-\\d+)/.exec(commit.commitMessage);
83
+ if (match) {
84
+ supplements.push({
85
+ key: match[1],
86
+ text: \`Requirement \${match[1]}: replace this with fetched details.\`,
87
+ commitHash: commit.commitHash,
88
+ });
89
+ }
90
+ }
91
+ return supplements;
92
+ `;
93
+ }
94
+ function indexSource(name, lang) {
95
+ const head = `/**
96
+ * ${name} — HomeGraph spec-mine addon.
97
+ *
98
+ * Contract (api 1) — implement at least one hook:
99
+ * - enrich(input): add external requirement context (e.g. Jira) as
100
+ * supplements; HomeGraph dedupes by \`key\` and renders
101
+ * them into a "## Supplement" prompt section.
102
+ * - buildPrompt(ctx): optional escape hatch that takes over the whole
103
+ * prompt assembly (see ctx.limits — a soft contract).
104
+ *
105
+ * Data shapes (all passed in — you never run git):
106
+ *
107
+ * input { clusterId, commits }
108
+ * input.commits[i] { commitHash, commitMessage, author, timestamp }
109
+ * - commitMessage first line of the commit message
110
+ * - timestamp unix seconds
111
+ *
112
+ * Supplement { key?, text, commitHash? }
113
+ * - key opaque dedupe id (e.g. the ticket key); without it,
114
+ * exact-text dedup is used
115
+ * - text required — the requirement description you assembled
116
+ * - commitHash optional — surfaced for traceability
117
+ *
118
+ * buildPrompt ctx { cluster, supplements, template, limits }
119
+ * - cluster { id, commits, primaryFiles, primarySymbols }
120
+ * - supplements already deduplicated by HomeGraph
121
+ * - template output template (default or user --template)
122
+ * - limits { maxContextChars, maxSupplementChars } — soft
123
+ * contract you are expected to honor
124
+ *
125
+ * Return one Supplement per requirement. Both hooks are optional but at
126
+ * least one must be implemented.
127
+ `;
128
+ if (lang === 'ts') {
129
+ return (`import type { EnrichInput, Supplement } from 'homegraph';\n\n` +
130
+ head +
131
+ ` */\n\n` +
132
+ `export async function enrich(input: EnrichInput): Promise<Supplement[]> {\n` +
133
+ enrichBody() +
134
+ `}\n`);
135
+ }
136
+ return (head +
137
+ ` * @param {import('homegraph').EnrichInput} input - one commit cluster.
138
+ * @returns {Promise<import('homegraph').Supplement[]>}
139
+ */
140
+
141
+ export async function enrich(input) {
142
+ ` +
143
+ enrichBody() +
144
+ `}
145
+ `);
146
+ }
147
+ const JIRA_EXAMPLE = `// Worked example: fetch requirement details from Jira and render them as
148
+ // supplements. Standalone — drop this file into any addon's examples/ dir.
149
+ //
150
+ // Data shapes (enrich input / Supplement / buildPrompt ctx): see the
151
+ // contract comment at the top of index.mjs.
152
+ //
153
+ // const JIRA_BASE = process.env.JIRA_BASE_URL ?? 'https://your-domain.atlassian.net';
154
+ // const JIRA_EMAIL = process.env.JIRA_EMAIL ?? '';
155
+ // const JIRA_TOKEN = process.env.JIRA_API_TOKEN ?? '';
156
+ // const TICKET_RE = /([A-Z]+-\\d+)/g;
157
+
158
+ export async function enrich(input) {
159
+ const seen = new Set();
160
+ const supplements = [];
161
+ for (const commit of input.commits) {
162
+ for (const match of commit.commitMessage.matchAll(TICKET_RE)) {
163
+ const key = match[1];
164
+ if (seen.has(key)) continue; // dedupe across commits in the cluster
165
+ seen.add(key);
166
+ supplements.push({ key, text: await fetchTicket(key), commitHash: commit.commitHash });
167
+ }
168
+ }
169
+ return supplements;
170
+ }
171
+
172
+ async function fetchTicket(key) {
173
+ if (!JIRA_TOKEN) return \`\${key}: set JIRA_API_TOKEN to fetch details.\`;
174
+ const res = await fetch(\`\${JIRA_BASE}/rest/api/3/issue/\${key}\`, {
175
+ headers: { Authorization: 'Basic ' + btoa(JIRA_EMAIL + ':' + JIRA_TOKEN) },
176
+ });
177
+ if (!res.ok) return \`\${key}: fetch failed (\${res.status}).\`;
178
+ const issue = await res.json();
179
+ const summary = issue.fields?.summary ?? '(no summary)';
180
+ const description = issue.fields?.description ?? '';
181
+ return \`\${key} — \${summary}\\n\${description}\`;
182
+ }
183
+ `;
184
+ const BUILD_PROMPT_EXAMPLE = `// buildPrompt example — the optional escape hatch that takes over the whole
185
+ // prompt assembly. Copy it into index.mjs (or re-export it). When an addon
186
+ // implements both hooks, buildPrompt wins for assembly while enrich still
187
+ // runs first — its supplements reach you via ctx.supplements.
188
+ //
189
+ // Input ctx: { cluster, supplements, template, limits }
190
+ // - cluster: { id, commits, primaryFiles, primarySymbols }
191
+ // - supplements: already deduplicated by HomeGraph
192
+ // - template: output template (default or user --template)
193
+ // - limits: { maxContextChars, maxSupplementChars } — soft contract
194
+ // Output: the full user prompt string. Throwing falls back to the default
195
+ // assembler, so you can experiment freely.
196
+ export async function buildPrompt(ctx) {
197
+ const { cluster, supplements, template } = ctx;
198
+
199
+ // Your own section first, then the built-in structure.
200
+ const supplementLines = supplements.map(
201
+ (s) => \`- \${s.text}\${s.commitHash ? \` (commit \${s.commitHash.slice(0, 7)})\` : ''}\`,
202
+ );
203
+
204
+ return [
205
+ supplements.length > 0 ? '## Supplement' : null,
206
+ ...(supplements.length > 0 ? supplementLines : []),
207
+ '',
208
+ \`## Cluster Context — \${cluster.commits.length} commits\`,
209
+ \`Primary files: \${cluster.primaryFiles.join(', ') || '(none)'}\`,
210
+ \`Primary symbols: \${cluster.primarySymbols.join(', ') || '(none)'}\`,
211
+ '',
212
+ '---',
213
+ '',
214
+ 'Fill in this template:',
215
+ '',
216
+ template,
217
+ ]
218
+ .filter(Boolean)
219
+ .join('\\n');
220
+ }
221
+ `;
222
+ const README = `# HomeGraph Addon
223
+
224
+ A pluggable extension for \`homegraph spec mine\`: enrich cluster prompts with
225
+ external requirement context (Jira, internal trackers, APIs) without
226
+ HomeGraph knowing any ticket format.
227
+
228
+ ## Contract (api 1)
229
+
230
+ - \`enrich(input)\` → \`Supplement[]\`
231
+ - \`input\`: \`{ clusterId, commits }\` — HomeGraph passes every commit it
232
+ already knows, never re-runs git.
233
+ - \`input.commits[i]\`: \`{ commitHash, commitMessage, author, timestamp }\`
234
+ (commitMessage is the first line; timestamp is unix seconds).
235
+ - Return one \`Supplement\` per requirement:
236
+ - \`key\` (optional): opaque dedupe id (e.g. the ticket key); without it,
237
+ exact-text dedup is used.
238
+ - \`text\` (required): the requirement description you assembled
239
+ (title / URL / body all fine).
240
+ - \`commitHash\` (optional): surfaced for traceability.
241
+ - HomeGraph renders supplements into a \`## Supplement\` prompt section.
242
+ - \`buildPrompt(ctx)\` (optional escape hatch) — takes over prompt assembly
243
+ entirely. \`ctx\`: \`{ cluster, supplements, template, limits }\`
244
+ - \`cluster\`: \`{ id, commits, primaryFiles, primarySymbols }\`
245
+ - \`supplements\`: already deduplicated by HomeGraph.
246
+ - \`template\`: the output template (default or user \`--template\`).
247
+ - \`limits\`: \`{ maxContextChars, maxSupplementChars }\` — a soft contract
248
+ you are expected to honor.
249
+
250
+ Implement at least one hook. The \`homegraph\` field in package.json must
251
+ declare \`{ "addon": true, "api": 1 }\`.
252
+
253
+ ## Local usage
254
+
255
+ homegraph addon install ./path/to/this/addon
256
+
257
+ See \`examples/jira.mjs\` for enrich and \`examples/build-prompt.mjs\` for prompt assembly.
258
+ `;
259
+ /**
260
+ * Create the addon scaffold in `parentDir/<name>`. Returns the paths of the
261
+ * files created (absolute). Throws when the target directory already exists.
262
+ */
263
+ function createAddonScaffold(name, parentDir, lang) {
264
+ const addonDir = path.join(parentDir, name);
265
+ if (fs.existsSync(addonDir)) {
266
+ throw new Error(`Directory already exists: ${addonDir}`);
267
+ }
268
+ const files = {
269
+ 'package.json': packageJson(name, lang),
270
+ README: README,
271
+ 'examples/jira.mjs': JIRA_EXAMPLE,
272
+ 'examples/build-prompt.mjs': BUILD_PROMPT_EXAMPLE,
273
+ };
274
+ if (lang === 'ts') {
275
+ files['tsconfig.json'] = tsconfig();
276
+ files['index.ts'] = indexSource(name, lang);
277
+ }
278
+ else {
279
+ files['index.mjs'] = indexSource(name, lang);
280
+ }
281
+ const created = [];
282
+ for (const [rel, content] of Object.entries(files)) {
283
+ const filePath = path.join(addonDir, rel);
284
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
285
+ fs.writeFileSync(filePath, content, 'utf-8');
286
+ created.push(filePath);
287
+ }
288
+ return created;
289
+ }
290
+ //# sourceMappingURL=init-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-template.js","sourceRoot":"","sources":["../../src/addons/init-template.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgPH,kDA+BC;AA7QD,uCAAyB;AACzB,2CAA6B;AAE7B,SAAS,WAAW,CAAC,IAAY,EAAE,IAAiB;IAClD,MAAM,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,aAAa,CAAC;IAChE,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,IAAI;QACJ,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,0EAA0E;QACvF,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE;QACvB,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,UAAU,CAAC;QACvE,OAAO,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS;QACrD,+DAA+D;QAC/D,eAAe,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;QACpE,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE;KACnC,EACD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI,CAAC;AACX,CAAC;AAED,SAAS,QAAQ;IACf,OAAO,IAAI,CAAC,SAAS,CACnB;QACE,eAAe,EAAE;YACf,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,UAAU;YAClB,gBAAgB,EAAE,UAAU;YAC5B,MAAM,EAAE,MAAM;YACd,WAAW,EAAE,IAAI;YACjB,MAAM,EAAE,IAAI;YACZ,eAAe,EAAE,IAAI;YACrB,YAAY,EAAE,IAAI;SACnB;QACD,OAAO,EAAE,CAAC,UAAU,CAAC;KACtB,EACD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI,CAAC;AACX,CAAC;AAED,gEAAgE;AAChE,SAAS,UAAU;IACjB,OAAO;;;;;;;;;;;;CAYR,CAAC;AACF,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,IAAiB;IAClD,MAAM,IAAI,GAAG;KACV,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BR,CAAC;IAEA,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO,CACL,+DAA+D;YAC/D,IAAI;YACJ,SAAS;YACT,6EAA6E;YAC7E,UAAU,EAAE;YACZ,KAAK,CACN,CAAC;IACJ,CAAC;IACD,OAAO,CACL,IAAI;QACJ;;;;;CAKH;QACG,UAAU,EAAE;QACZ;CACH,CACE,CAAC;AACJ,CAAC;AAED,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCpB,CAAC;AAEF,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqC5B,CAAC;AAEF,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCd,CAAC;AAEF;;;GAGG;AACH,SAAgB,mBAAmB,CACjC,IAAY,EACZ,SAAiB,EACjB,IAAiB;IAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC5C,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,KAAK,GAA2B;QACpC,cAAc,EAAE,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC;QACvC,MAAM,EAAE,MAAM;QACd,mBAAmB,EAAE,YAAY;QACjC,2BAA2B,EAAE,oBAAoB;KAClD,CAAC;IACF,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,KAAK,CAAC,eAAe,CAAC,GAAG,QAAQ,EAAE,CAAC;QACpC,KAAK,CAAC,UAAU,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,WAAW,CAAC,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC1C,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Runtime addon loading.
3
+ *
4
+ * Deterministic lookup, never a directory scan: read the registry
5
+ * (`addons.json`), then for each enabled entry resolve its install directory
6
+ * by name and validate + import it. Missing / invalid / disabled entries are
7
+ * skipped with a warning — a broken addon must never break the host flow.
8
+ *
9
+ * @module addons/loader
10
+ */
11
+ import { LoadedAddon } from './types';
12
+ /**
13
+ * Load all enabled, registered addons for a repository, in registry order.
14
+ * Registry order is the deterministic priority order for consumers that need
15
+ * one winner (e.g. `buildPrompt`).
16
+ */
17
+ export declare function loadAddons(repoRoot: string): Promise<LoadedAddon[]>;
18
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/addons/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAiCzE"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ /**
3
+ * Runtime addon loading.
4
+ *
5
+ * Deterministic lookup, never a directory scan: read the registry
6
+ * (`addons.json`), then for each enabled entry resolve its install directory
7
+ * by name and validate + import it. Missing / invalid / disabled entries are
8
+ * skipped with a warning — a broken addon must never break the host flow.
9
+ *
10
+ * @module addons/loader
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
25
+ }) : function(o, v) {
26
+ o["default"] = v;
27
+ });
28
+ var __importStar = (this && this.__importStar) || (function () {
29
+ var ownKeys = function(o) {
30
+ ownKeys = Object.getOwnPropertyNames || function (o) {
31
+ var ar = [];
32
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
33
+ return ar;
34
+ };
35
+ return ownKeys(o);
36
+ };
37
+ return function (mod) {
38
+ if (mod && mod.__esModule) return mod;
39
+ var result = {};
40
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
41
+ __setModuleDefault(result, mod);
42
+ return result;
43
+ };
44
+ })();
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.loadAddons = loadAddons;
47
+ const fs = __importStar(require("fs"));
48
+ const path = __importStar(require("path"));
49
+ const errors_1 = require("../errors");
50
+ const registry_1 = require("./registry");
51
+ const paths_1 = require("./paths");
52
+ const validate_1 = require("./validate");
53
+ /**
54
+ * Load all enabled, registered addons for a repository, in registry order.
55
+ * Registry order is the deterministic priority order for consumers that need
56
+ * one winner (e.g. `buildPrompt`).
57
+ */
58
+ async function loadAddons(repoRoot) {
59
+ const registry = (0, registry_1.readRegistry)(repoRoot);
60
+ const out = [];
61
+ for (const entry of registry.addons) {
62
+ if (!entry.enabled)
63
+ continue;
64
+ const pkgDir = (0, paths_1.addonPkgDir)(repoRoot, entry.name);
65
+ if (!fs.existsSync(path.join(pkgDir, 'package.json'))) {
66
+ (0, errors_1.logWarn)(`Addon ${entry.name} is registered but not installed — skipping`, {
67
+ repoRoot,
68
+ name: entry.name,
69
+ });
70
+ continue;
71
+ }
72
+ const validation = await (0, validate_1.validateAddonPackage)(pkgDir);
73
+ if (!validation.ok) {
74
+ (0, errors_1.logWarn)(`Addon ${entry.name} failed validation — skipping`, {
75
+ name: entry.name,
76
+ reason: validation.reason,
77
+ });
78
+ continue;
79
+ }
80
+ out.push({
81
+ name: entry.name,
82
+ version: validation.version ?? entry.version,
83
+ module: validation.module,
84
+ });
85
+ }
86
+ return out;
87
+ }
88
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/addons/loader.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeH,gCAiCC;AA9CD,uCAAyB;AACzB,2CAA6B;AAC7B,sCAAoC;AACpC,yCAA0C;AAC1C,mCAAsC;AACtC,yCAAkD;AAGlD;;;;GAIG;AACI,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,MAAM,QAAQ,GAAG,IAAA,uBAAY,EAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,GAAG,GAAkB,EAAE,CAAC;IAE9B,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,SAAS;QAE7B,MAAM,MAAM,GAAG,IAAA,mBAAW,EAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;YACtD,IAAA,gBAAO,EAAC,SAAS,KAAK,CAAC,IAAI,6CAA6C,EAAE;gBACxE,QAAQ;gBACR,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,IAAA,+BAAoB,EAAC,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;YACnB,IAAA,gBAAO,EAAC,SAAS,KAAK,CAAC,IAAI,+BAA+B,EAAE;gBAC1D,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,GAAG,CAAC,IAAI,CAAC;YACP,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO;YAC5C,MAAM,EAAE,UAAU,CAAC,MAAO;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Addon install management (npm as the install engine).
3
+ *
4
+ * `npm install --prefix <addonsRoot>` handles all package mechanics —
5
+ * resolution, integrity, transitive dependencies, local paths, git URLs —
6
+ * so HomeGraph never reimplements package resolution. The registry records
7
+ * the concrete resolved version (never the requested range) to prevent
8
+ * silent drift.
9
+ *
10
+ * Version policy (v1 of the addon format):
11
+ * - **No silent downgrades.** Re-installing a name that is already
12
+ * registered compares the target version against the installed one and
13
+ * refuses anything older — the user must `remove` first.
14
+ * - **Upgrades preserve the previous version.** The installed package
15
+ * directory is renamed aside to a rollback backup before npm runs; a
16
+ * failed install/validation restores it, so a bad upgrade can never
17
+ * leave the store without the previous working copy.
18
+ *
19
+ * Both policies apply to registry packages and local-path packages alike
20
+ * (a local-path "package" is a symlink npm manages; rename/restore is
21
+ * symmetric). The one carve-out is the name-resolution fallback path
22
+ * (git URLs etc., where the package name is only known *after* npm runs) —
23
+ * it cannot gate or back up in advance.
24
+ *
25
+ * @module addons/manager
26
+ */
27
+ import { AddonRegistryEntry } from './types';
28
+ /** Result of a successful install. */
29
+ export interface InstallResult {
30
+ name: string;
31
+ version: string;
32
+ }
33
+ /** Options for `installAddon`. */
34
+ export interface InstallOptions {
35
+ /** Whether the new entry starts enabled (default true). */
36
+ enable: boolean;
37
+ /** Pre-resolved package name (from `npm view`/local package.json). */
38
+ name?: string;
39
+ }
40
+ /** Package identity + install source, resolved from an install spec. */
41
+ export interface PackageInfo {
42
+ name: string;
43
+ source: 'registry' | 'local';
44
+ }
45
+ /** Whether an install spec points at a local path (dir or tarball). */
46
+ export declare function isLocalPathSpec(spec: string): boolean;
47
+ /**
48
+ * Resolve the npm package name and install source for an install spec, or
49
+ * `null` when neither a local package.json nor `npm view` yields a name.
50
+ *
51
+ * - Local paths (`./x`, `../x`, absolute, `file:`) → read package.json.
52
+ * - Everything else (names, scoped names, ranges, dist-tags) → `npm view`.
53
+ */
54
+ export declare function resolvePackageInfo(pkgSpec: string): PackageInfo | null;
55
+ /** Package name only — compatibility shim over {@link resolvePackageInfo}. */
56
+ export declare function resolvePackageName(pkgSpec: string): string | null;
57
+ /**
58
+ * Install an addon package and register it.
59
+ *
60
+ * Throws on failure (npm error, invalid addon, unresolvable name, or a
61
+ * downgrade attempt against an installed version). The registry is written
62
+ * only after validation succeeds. When re-installing an existing name
63
+ * (upgrade), the previous files are preserved and restored on failure.
64
+ */
65
+ export declare function installAddon(repoRoot: string, pkgSpec: string, options: InstallOptions): Promise<InstallResult>;
66
+ /**
67
+ * Unregister an addon, optionally deleting its files. Returns `false` when
68
+ * the name was not registered.
69
+ */
70
+ export declare function removeAddon(repoRoot: string, name: string, options: {
71
+ purge: boolean;
72
+ }): boolean;
73
+ /**
74
+ * List registered addons with their on-disk status (installed vs missing).
75
+ */
76
+ export declare function listAddons(repoRoot: string): Array<AddonRegistryEntry & {
77
+ installed: boolean;
78
+ }>;
79
+ /** Options for `updateAddon`. */
80
+ export interface UpdateOptions {
81
+ /**
82
+ * Force the newest published version (`<name>@latest`, the registry
83
+ * dist-tag) instead of the recorded range. Registry-package entries only —
84
+ * local-path entries have no dist-tag and are rejected.
85
+ */
86
+ latest?: boolean;
87
+ }
88
+ /** Result of updating a single addon (`from === to` means no change). */
89
+ export interface UpdateResult {
90
+ name: string;
91
+ from: string;
92
+ to: string;
93
+ }
94
+ /** npm spec for an update: bare name follows the recorded range, `@latest` forces the dist-tag. */
95
+ export declare function resolveUpdateSpec(name: string, latest: boolean): string;
96
+ /**
97
+ * Update registered addon(s) to the latest version within the configured
98
+ * range (re-running `npm install` on the registered name, then recording the
99
+ * newly resolved version). Each update preserves the previous files and
100
+ * restores them on failure, so a bad upgrade never loses the working copy.
101
+ *
102
+ * Returns the names+versions that were updated; entries whose validation
103
+ * failed after install are logged and skipped (previous version kept).
104
+ */
105
+ export declare function updateAddon(repoRoot: string, name?: string, options?: UpdateOptions): Promise<UpdateResult[]>;
106
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/addons/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAWH,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAE7C,sCAAsC;AACtC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,kCAAkC;AAClC,MAAM,WAAW,cAAc;IAC7B,2DAA2D;IAC3D,MAAM,EAAE,OAAO,CAAC;IAChB,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAoCD,wEAAwE;AACxE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC;CAC9B;AAED,uEAAuE;AACvE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOrD;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CA2BtE;AAED,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEjE;AAqID;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CA0ExB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,GAC1B,OAAO,CAcT;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,MAAM,GACf,KAAK,CAAC,kBAAkB,GAAG;IAAE,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAQpD;AAED,iCAAiC;AACjC,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,yEAAyE;AACzE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,mGAAmG;AACnG,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAEvE;AAED;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,YAAY,EAAE,CAAC,CA+CzB"}