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.
- package/CHANGELOG.md +156 -0
- package/README.md +63 -10
- package/dist/addons/dynamic-import.d.ts +18 -0
- package/dist/addons/dynamic-import.d.ts.map +1 -0
- package/dist/addons/dynamic-import.js +25 -0
- package/dist/addons/dynamic-import.js.map +1 -0
- package/dist/addons/init-template.d.ts +15 -0
- package/dist/addons/init-template.d.ts.map +1 -0
- package/dist/addons/init-template.js +290 -0
- package/dist/addons/init-template.js.map +1 -0
- package/dist/addons/loader.d.ts +18 -0
- package/dist/addons/loader.d.ts.map +1 -0
- package/dist/addons/loader.js +88 -0
- package/dist/addons/loader.js.map +1 -0
- package/dist/addons/manager.d.ts +106 -0
- package/dist/addons/manager.d.ts.map +1 -0
- package/dist/addons/manager.js +437 -0
- package/dist/addons/manager.js.map +1 -0
- package/dist/addons/paths.d.ts +22 -0
- package/dist/addons/paths.d.ts.map +1 -0
- package/dist/addons/paths.js +65 -0
- package/dist/addons/paths.js.map +1 -0
- package/dist/addons/registry.d.ts +38 -0
- package/dist/addons/registry.d.ts.map +1 -0
- package/dist/addons/registry.js +160 -0
- package/dist/addons/registry.js.map +1 -0
- package/dist/addons/semver.d.ts +21 -0
- package/dist/addons/semver.d.ts.map +1 -0
- package/dist/addons/semver.js +79 -0
- package/dist/addons/semver.js.map +1 -0
- package/dist/addons/types.d.ts +51 -0
- package/dist/addons/types.d.ts.map +1 -0
- package/dist/addons/types.js +14 -0
- package/dist/addons/types.js.map +1 -0
- package/dist/addons/validate.d.ts +38 -0
- package/dist/addons/validate.d.ts.map +1 -0
- package/dist/addons/validate.js +165 -0
- package/dist/addons/validate.js.map +1 -0
- package/dist/arkui/index.d.ts +4 -0
- package/dist/arkui/index.d.ts.map +1 -0
- package/dist/arkui/index.js +23 -0
- package/dist/arkui/index.js.map +1 -0
- package/dist/arkui/migrate-passage.d.ts +28 -0
- package/dist/arkui/migrate-passage.d.ts.map +1 -0
- package/dist/arkui/migrate-passage.js +310 -0
- package/dist/arkui/migrate-passage.js.map +1 -0
- package/dist/arkui/migrate-semantics.d.ts +47 -0
- package/dist/arkui/migrate-semantics.d.ts.map +1 -0
- package/dist/arkui/migrate-semantics.js +229 -0
- package/dist/arkui/migrate-semantics.js.map +1 -0
- package/dist/arkui/migrate-snapshot.d.ts +79 -0
- package/dist/arkui/migrate-snapshot.d.ts.map +1 -0
- package/dist/arkui/migrate-snapshot.js +364 -0
- package/dist/arkui/migrate-snapshot.js.map +1 -0
- package/dist/bin/addon-commands.d.ts +27 -0
- package/dist/bin/addon-commands.d.ts.map +1 -0
- package/dist/bin/addon-commands.js +254 -0
- package/dist/bin/addon-commands.js.map +1 -0
- package/dist/bin/fatal-handler.js +2 -2
- package/dist/bin/homegraph.js +111 -157
- package/dist/bin/homegraph.js.map +1 -1
- package/dist/bin/node-version-check.d.ts +6 -15
- package/dist/bin/node-version-check.d.ts.map +1 -1
- package/dist/bin/node-version-check.js +8 -37
- package/dist/bin/node-version-check.js.map +1 -1
- package/dist/db/index.d.ts +36 -1
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +92 -6
- package/dist/db/index.js.map +1 -1
- package/dist/db/migrations.d.ts +1 -1
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +15 -1
- package/dist/db/migrations.js.map +1 -1
- package/dist/db/queries.d.ts +42 -0
- package/dist/db/queries.d.ts.map +1 -1
- package/dist/db/queries.js +177 -10
- package/dist/db/queries.js.map +1 -1
- package/dist/db/schema.sql +6 -1
- package/dist/db/sqlite-adapter.d.ts +7 -3
- package/dist/db/sqlite-adapter.d.ts.map +1 -1
- package/dist/db/sqlite-adapter.js +44 -3
- package/dist/db/sqlite-adapter.js.map +1 -1
- package/dist/extraction/extraction-version.d.ts +1 -1
- package/dist/extraction/extraction-version.js +1 -1
- package/dist/extraction/generated-detection.d.ts +42 -11
- package/dist/extraction/generated-detection.d.ts.map +1 -1
- package/dist/extraction/generated-detection.js +141 -20
- package/dist/extraction/generated-detection.js.map +1 -1
- package/dist/extraction/index.d.ts +42 -0
- package/dist/extraction/index.d.ts.map +1 -1
- package/dist/extraction/index.js +96 -0
- package/dist/extraction/index.js.map +1 -1
- package/dist/extraction/languages/arkts.d.ts +33 -2
- package/dist/extraction/languages/arkts.d.ts.map +1 -1
- package/dist/extraction/languages/arkts.js +525 -129
- package/dist/extraction/languages/arkts.js.map +1 -1
- package/dist/extraction/wasm-runtime-flags.d.ts.map +1 -1
- package/dist/extraction/wasm-runtime-flags.js +9 -6
- package/dist/extraction/wasm-runtime-flags.js.map +1 -1
- package/dist/graph-sources.d.ts +41 -0
- package/dist/graph-sources.d.ts.map +1 -0
- package/dist/graph-sources.js +82 -0
- package/dist/graph-sources.js.map +1 -0
- package/dist/index.d.ts +20 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +79 -9
- package/dist/index.js.map +1 -1
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +0 -48
- package/dist/installer/index.js.map +1 -1
- package/dist/installer/targets/antigravity.js +1 -1
- package/dist/installer/targets/antigravity.js.map +1 -1
- package/dist/installer/targets/deveco.js +1 -1
- package/dist/installer/targets/deveco.js.map +1 -1
- package/dist/installer/targets/hermes.d.ts +1 -1
- package/dist/installer/targets/hermes.js +2 -2
- package/dist/installer/targets/hermes.js.map +1 -1
- package/dist/installer/targets/opencode.js +1 -1
- package/dist/installer/targets/opencode.js.map +1 -1
- package/dist/installer/targets/shared.js +1 -1
- package/dist/installer/targets/shared.js.map +1 -1
- package/dist/mcp/daemon-paths.d.ts +5 -4
- package/dist/mcp/daemon-paths.d.ts.map +1 -1
- package/dist/mcp/daemon-paths.js +28 -13
- package/dist/mcp/daemon-paths.js.map +1 -1
- package/dist/mcp/daemon-registry.d.ts.map +1 -1
- package/dist/mcp/daemon-registry.js +4 -1
- package/dist/mcp/daemon-registry.js.map +1 -1
- package/dist/mcp/daemon.d.ts +1 -1
- package/dist/mcp/daemon.js +1 -1
- package/dist/mcp/engine.d.ts.map +1 -1
- package/dist/mcp/engine.js +12 -3
- package/dist/mcp/engine.js.map +1 -1
- package/dist/mcp/explore-dedup.d.ts +137 -0
- package/dist/mcp/explore-dedup.d.ts.map +1 -0
- package/dist/mcp/explore-dedup.js +236 -0
- package/dist/mcp/explore-dedup.js.map +1 -0
- package/dist/mcp/explore-repeat-guard.d.ts +123 -0
- package/dist/mcp/explore-repeat-guard.d.ts.map +1 -0
- package/dist/mcp/explore-repeat-guard.js +503 -0
- package/dist/mcp/explore-repeat-guard.js.map +1 -0
- package/dist/mcp/explore-session-state.d.ts +237 -0
- package/dist/mcp/explore-session-state.d.ts.map +1 -0
- package/dist/mcp/explore-session-state.js +353 -0
- package/dist/mcp/explore-session-state.js.map +1 -0
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +4 -7
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/proxy.d.ts.map +1 -1
- package/dist/mcp/proxy.js +20 -18
- package/dist/mcp/proxy.js.map +1 -1
- package/dist/mcp/query-pool.d.ts.map +1 -1
- package/dist/mcp/query-pool.js +10 -13
- package/dist/mcp/query-pool.js.map +1 -1
- package/dist/mcp/query-worker.d.ts +1 -1
- package/dist/mcp/query-worker.js +1 -1
- package/dist/mcp/server-instructions.d.ts +5 -2
- package/dist/mcp/server-instructions.d.ts.map +1 -1
- package/dist/mcp/server-instructions.js +43 -32
- package/dist/mcp/server-instructions.js.map +1 -1
- package/dist/mcp/session.d.ts +14 -3
- package/dist/mcp/session.d.ts.map +1 -1
- package/dist/mcp/session.js +17 -14
- package/dist/mcp/session.js.map +1 -1
- package/dist/mcp/startup-handshake.d.ts +1 -1
- package/dist/mcp/startup-handshake.js +1 -1
- package/dist/mcp/tools.d.ts +149 -8
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +4265 -575
- package/dist/mcp/tools.js.map +1 -1
- package/dist/resolution/callback-synthesizer.d.ts.map +1 -1
- package/dist/resolution/callback-synthesizer.js +166 -0
- package/dist/resolution/callback-synthesizer.js.map +1 -1
- package/dist/resolution/frameworks/arkts-napi.d.ts +14 -0
- package/dist/resolution/frameworks/arkts-napi.d.ts.map +1 -1
- package/dist/resolution/frameworks/arkts-napi.js +169 -49
- package/dist/resolution/frameworks/arkts-napi.js.map +1 -1
- package/dist/search/query-utils.d.ts +157 -5
- package/dist/search/query-utils.d.ts.map +1 -1
- package/dist/search/query-utils.js +1105 -70
- package/dist/search/query-utils.js.map +1 -1
- package/dist/spec/build/scan.js +1 -1
- package/dist/spec/build/scan.js.map +1 -1
- package/dist/spec/build/scope-resolver.d.ts +24 -5
- package/dist/spec/build/scope-resolver.d.ts.map +1 -1
- package/dist/spec/build/scope-resolver.js +76 -10
- package/dist/spec/build/scope-resolver.js.map +1 -1
- package/dist/spec/config.d.ts +8 -0
- package/dist/spec/config.d.ts.map +1 -1
- package/dist/spec/config.js +3 -0
- package/dist/spec/config.js.map +1 -1
- package/dist/spec/evolve/pipeline.d.ts.map +1 -1
- package/dist/spec/evolve/pipeline.js +2 -1
- package/dist/spec/evolve/pipeline.js.map +1 -1
- package/dist/spec/git/commits.d.ts +8 -3
- package/dist/spec/git/commits.d.ts.map +1 -1
- package/dist/spec/git/commits.js +12 -11
- package/dist/spec/git/commits.js.map +1 -1
- package/dist/spec/mine/addon/adapter.d.ts +45 -0
- package/dist/spec/mine/addon/adapter.d.ts.map +1 -0
- package/dist/spec/mine/addon/adapter.js +118 -0
- package/dist/spec/mine/addon/adapter.js.map +1 -0
- package/dist/spec/mine/addon/render.d.ts +20 -0
- package/dist/spec/mine/addon/render.d.ts.map +1 -0
- package/dist/spec/mine/addon/render.js +41 -0
- package/dist/spec/mine/addon/render.js.map +1 -0
- package/dist/spec/mine/addon/types.d.ts +70 -0
- package/dist/spec/mine/addon/types.d.ts.map +1 -0
- package/dist/spec/mine/addon/types.js +14 -0
- package/dist/spec/mine/addon/types.js.map +1 -0
- package/dist/spec/mine/generator.d.ts +5 -1
- package/dist/spec/mine/generator.d.ts.map +1 -1
- package/dist/spec/mine/generator.js +69 -7
- package/dist/spec/mine/generator.js.map +1 -1
- package/dist/spec/mine/pipeline.d.ts.map +1 -1
- package/dist/spec/mine/pipeline.js +5 -1
- package/dist/spec/mine/pipeline.js.map +1 -1
- package/dist/spec/mine/scanner.d.ts +1 -0
- package/dist/spec/mine/scanner.d.ts.map +1 -1
- package/dist/spec/mine/scanner.js +1 -1
- package/dist/spec/mine/scanner.js.map +1 -1
- package/dist/spec/types.d.ts +1 -1
- package/dist/spec/types.d.ts.map +1 -1
- package/dist/types.d.ts +8 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/upgrade/index.d.ts +14 -26
- package/dist/upgrade/index.d.ts.map +1 -1
- package/dist/upgrade/index.js +28 -123
- package/dist/upgrade/index.js.map +1 -1
- package/dist/upgrade/remove-binary.d.ts +19 -19
- package/dist/upgrade/remove-binary.d.ts.map +1 -1
- package/dist/upgrade/remove-binary.js +20 -21
- package/dist/upgrade/remove-binary.js.map +1 -1
- package/dist/upgrade/update-check.d.ts +4 -3
- package/dist/upgrade/update-check.d.ts.map +1 -1
- package/dist/upgrade/update-check.js +4 -3
- package/dist/upgrade/update-check.js.map +1 -1
- package/package.json +13 -9
- package/dist/telemetry/index.d.ts +0 -143
- package/dist/telemetry/index.d.ts.map +0 -1
- package/dist/telemetry/index.js +0 -541
- 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":"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"}
|
|
@@ -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"}
|