@michaelfromyeg/weft-core 1.3.0 → 1.4.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.
package/dist/index.d.ts CHANGED
@@ -141,6 +141,39 @@ interface SecretsResult {
141
141
  */
142
142
  declare function resolveConfig(plugin: Plugin, cwd: string, env?: Record<string, string | undefined>): SecretsResult;
143
143
 
144
+ /**
145
+ * The result of comparing an installed/declared harness version against the
146
+ * range an adapter's emitted format is verified for (versioning axis 4, spec §5).
147
+ */
148
+ interface HarnessCheck {
149
+ target: Target;
150
+ /** Human-facing harness name (from the adapter). */
151
+ name: string;
152
+ /** Supported semver range the adapter's format is known-good for. */
153
+ range: string;
154
+ /** The version compared against `range`; null when undeclared and undetectable. */
155
+ version: string | null;
156
+ /** Where `version` came from. */
157
+ source: "declared" | "detected" | "unknown";
158
+ /** true/false once a version is known; null when none could be determined. */
159
+ satisfied: boolean | null;
160
+ }
161
+ /**
162
+ * Best-effort: run the adapter's `versionCommand` and coerce a semver from its
163
+ * output. Returns null on any failure (binary absent, non-zero exit, no semver
164
+ * in the output) -- a harness we can't see is simply not checked, never an error.
165
+ */
166
+ declare function detectHarnessVersion(versionCommand: string): string | null;
167
+ /**
168
+ * Compare the harness version against the adapter's supported `range`. A caller-
169
+ * `declared` version (e.g. from `--harness codex@0.130`, the CI path) wins over
170
+ * auto-detection; `detect=false` skips spawning the version command for hermetic
171
+ * builds. Returns null for adapters that declare no `harness` block.
172
+ */
173
+ declare function checkHarness(adapter: HarnessAdapter, declared: string | undefined, detect: boolean): HarnessCheck | null;
174
+ /** Run {@link checkHarness} for each adapter, dropping those without a `harness` block. */
175
+ declare function checkHarnesses(adapters: HarnessAdapter[], declared: Record<string, string> | undefined, detect: boolean): HarnessCheck[];
176
+
144
177
  /** One plugin's contribution to a lockfile: its record, placed artifacts, and adapters used. */
145
178
  interface LockEntry {
146
179
  pluginLock: PluginLock;
@@ -269,6 +302,11 @@ interface BuildOptions {
269
302
  bare?: boolean;
270
303
  /** Compare against on-disk output instead of writing; populates `drift`, writes nothing. */
271
304
  check?: boolean;
305
+ /** Per-target harness version to compare against (e.g. {codex: "0.130"}); skips detection. */
306
+ harnessVersions?: Record<string, string>;
307
+ /** Set true to detect installed harness versions via their CLIs (the CLI enables this;
308
+ * off by default so the library stays hermetic). Declared `harnessVersions` are always checked. */
309
+ harnessCheck?: boolean;
272
310
  }
273
311
  interface BuildResult {
274
312
  result: CompileResult;
@@ -276,6 +314,8 @@ interface BuildResult {
276
314
  written: WrittenArtifact[];
277
315
  /** Present only in check mode: how the on-disk output differs from a fresh compile. */
278
316
  drift?: DriftReport;
317
+ /** Harness version-compat findings, one per built target that declares a `harness` (axis 4). */
318
+ harnessChecks: HarnessCheck[];
279
319
  }
280
320
  /** Compile a plugin and write its marketplace + plugin layout into `outDir` (no install). */
281
321
  declare function build(opts: BuildOptions): Promise<BuildResult>;
@@ -288,6 +328,11 @@ interface BuildMarketplaceOptions {
288
328
  bare?: boolean;
289
329
  /** Compare against on-disk output instead of writing; populates `drift`, writes nothing. */
290
330
  check?: boolean;
331
+ /** Per-target harness version to compare against (e.g. {codex: "0.130"}); skips detection. */
332
+ harnessVersions?: Record<string, string>;
333
+ /** Set true to detect installed harness versions via their CLIs (the CLI enables this;
334
+ * off by default so the library stays hermetic). Declared `harnessVersions` are always checked. */
335
+ harnessCheck?: boolean;
291
336
  }
292
337
  interface BuildMarketplaceResult {
293
338
  marketplace: Marketplace;
@@ -296,6 +341,8 @@ interface BuildMarketplaceResult {
296
341
  written: WrittenArtifact[];
297
342
  /** Present only in check mode: how the on-disk output differs from a fresh compile. */
298
343
  drift?: DriftReport;
344
+ /** Harness version-compat findings, one per built target that declares a `harness` (axis 4). */
345
+ harnessChecks: HarnessCheck[];
299
346
  }
300
347
  /**
301
348
  * Compile a curated `marketplace.yaml` of many plugins: resolve and compile each
@@ -554,11 +601,11 @@ declare function verifyArtifacts(lock: Lockfile, publicKey: KeyObject, signature
554
601
  declare function validatePlugin(fb: FetchedPlugin, diags: Diagnostics): void;
555
602
 
556
603
  /** The Weft/CLI version (versioning axis 2, spec §5). */
557
- declare const WEFT_VERSION = "1.3.0";
604
+ declare const WEFT_VERSION = "1.4.1";
558
605
  /**
559
606
  * Check a plugin's `weft_min_version` against the running Weft. Returns an error
560
607
  * message when unmet, or null when satisfied / unspecified.
561
608
  */
562
609
  declare function checkMinVersion(min: string | undefined): string | null;
563
610
 
564
- export { AdapterRegistry, type AliasInput, type AliasResult, type BuildMarketplaceOptions, type BuildMarketplaceResult, type BuildOptions, type BuildResult, CACHE_DIR, CompileError, type CompileOptions, type CompileResult, type ConfigResolution, type DependencyRecord, type Diagnostic, Diagnostics, type DriftReport, type FetchedMarketplace, type FetchedPlugin, type ImportOutput, type ImportPluginOptions, type InstallMarketplaceOptions, type InstallMarketplaceResult, type InstallOptions, type InstallResult, type LintResult, type LockEntry, type LockEntryInput, type ManagedPolicy, type PlannedArtifact, type PlannedWrite, type PolicyContext, type ResolvedComponent, type ResolvedDeps, type ResolvedPlugin, type ResolvedSource, type SecretsResult, type Severity, type Source, type StaticPass, type TaggedArtifact, type TargetOutput, type UninstallOptions, type UninstallResult, type UpdateResult, type VerifyResult, WEFT_VERSION, type WrittenArtifact, artifactDigest, build, buildLockEntry, buildMarketplace, buildToDir, checkManagedPolicy, checkMinVersion, compile, diffPlanned, fileAccessors, generateSigningKeys, gitInfo, hasMarketplaceManifest, importNativePlugin, install, installMarketplace, installToScope, lint, loadMarketplaceDir, loadPluginDir, lockDirForScope, mergeLock, parseSource, placeCatalog, placePluginArtifacts, planBuild, planCatalog, planPluginArtifacts, planScopeArtifacts, readLock, resolveAliases, resolveConfig, resolveDependencies, resolveDependency, resolvePluginRef, resolvePluginRefFull, resolveSourceDir, serializeLock, sha256, signLock, staticPass, synthMarketplace, uninstall, update, validatePlugin, verifyArtifacts, verifyLockSignature, writeLock, writePlanned };
611
+ export { AdapterRegistry, type AliasInput, type AliasResult, type BuildMarketplaceOptions, type BuildMarketplaceResult, type BuildOptions, type BuildResult, CACHE_DIR, CompileError, type CompileOptions, type CompileResult, type ConfigResolution, type DependencyRecord, type Diagnostic, Diagnostics, type DriftReport, type FetchedMarketplace, type FetchedPlugin, type HarnessCheck, type ImportOutput, type ImportPluginOptions, type InstallMarketplaceOptions, type InstallMarketplaceResult, type InstallOptions, type InstallResult, type LintResult, type LockEntry, type LockEntryInput, type ManagedPolicy, type PlannedArtifact, type PlannedWrite, type PluginInstall, type PolicyContext, type ResolvedComponent, type ResolvedDeps, type ResolvedPlugin, type ResolvedSource, type SecretsResult, type Severity, type Source, type StaticPass, type TaggedArtifact, type TargetOutput, type UninstallOptions, type UninstallResult, type UpdateResult, type VerifyResult, WEFT_VERSION, type WrittenArtifact, artifactDigest, build, buildLockEntry, buildMarketplace, buildToDir, checkHarness, checkHarnesses, checkManagedPolicy, checkMinVersion, compile, detectHarnessVersion, diffPlanned, fileAccessors, generateSigningKeys, gitInfo, hasMarketplaceManifest, importNativePlugin, install, installMarketplace, installToScope, lint, loadMarketplaceDir, loadPluginDir, lockDirForScope, mergeLock, parseSource, placeCatalog, placePluginArtifacts, planBuild, planCatalog, planPluginArtifacts, planScopeArtifacts, readLock, resolveAliases, resolveConfig, resolveDependencies, resolveDependency, resolvePluginRef, resolvePluginRefFull, resolveSourceDir, serializeLock, sha256, signLock, staticPass, synthMarketplace, uninstall, update, validatePlugin, verifyArtifacts, verifyLockSignature, writeLock, writePlanned };
package/dist/index.js CHANGED
@@ -6,6 +6,7 @@ import semver from 'semver';
6
6
  import { homedir, tmpdir } from 'os';
7
7
  import { createHash, generateKeyPairSync, sign, verify } from 'crypto';
8
8
  import { execa } from 'execa';
9
+ import { execSync } from 'child_process';
9
10
 
10
11
  // src/api.ts
11
12
 
@@ -128,7 +129,7 @@ function checkDescription(where, description, diags) {
128
129
  diags.warn(where, "description is very short; harnesses route on it -- make it specific");
129
130
  }
130
131
  }
131
- var WEFT_VERSION = "1.3.0";
132
+ var WEFT_VERSION = "1.4.1";
132
133
  function checkMinVersion(min) {
133
134
  if (!min) return null;
134
135
  const cleaned = semver.valid(semver.coerce(min) ?? min);
@@ -504,10 +505,54 @@ async function resolveDependencies(fb, tmpRoot) {
504
505
  };
505
506
  return { fb: mergedFb, dependencies };
506
507
  }
508
+ function detectHarnessVersion(versionCommand) {
509
+ try {
510
+ const out = execSync(versionCommand, {
511
+ stdio: ["ignore", "pipe", "ignore"],
512
+ timeout: 5e3
513
+ }).toString();
514
+ return semver.coerce(out)?.version ?? null;
515
+ } catch {
516
+ return null;
517
+ }
518
+ }
519
+ function checkHarness(adapter, declared, detect) {
520
+ const h = adapter.harness;
521
+ if (!h) return null;
522
+ let version = null;
523
+ let source = "unknown";
524
+ if (declared) {
525
+ version = semver.coerce(declared)?.version ?? null;
526
+ if (version) source = "declared";
527
+ } else if (detect && h.versionCommand) {
528
+ version = detectHarnessVersion(h.versionCommand);
529
+ if (version) source = "detected";
530
+ }
531
+ return {
532
+ target: adapter.target,
533
+ name: h.name,
534
+ range: h.range,
535
+ version,
536
+ source,
537
+ satisfied: version ? semver.satisfies(version, h.range) : null
538
+ };
539
+ }
540
+ function checkHarnesses(adapters, declared, detect) {
541
+ const checks = [];
542
+ for (const adapter of adapters) {
543
+ const check = checkHarness(adapter, declared?.[adapter.target], detect);
544
+ if (check) checks.push(check);
545
+ }
546
+ return checks;
547
+ }
507
548
  function buildLockEntry(input) {
508
549
  const adapters = {};
509
550
  for (const t of input.result.targets) {
510
- adapters[t.target] = { version: t.adapter.version, targetSchema: t.adapter.targetSchema };
551
+ adapters[t.target] = {
552
+ version: t.adapter.version,
553
+ targetSchema: t.adapter.targetSchema,
554
+ ...t.adapter.harness ? { harnessRange: t.adapter.harness.range } : {}
555
+ };
511
556
  }
512
557
  return {
513
558
  pluginLock: {
@@ -709,11 +754,16 @@ async function build(opts) {
709
754
  if (result.diagnostics.hasErrors) {
710
755
  throw new CompileError("compile failed", result.diagnostics.errors);
711
756
  }
757
+ const harnessChecks = checkHarnesses(
758
+ result.targets.map((t) => t.adapter),
759
+ opts.harnessVersions,
760
+ opts.harnessCheck === true
761
+ );
712
762
  const planned = planBuild(result, opts.outDir, opts.bare);
713
763
  if (opts.check) {
714
- return { result, written: asWritten(planned), drift: diffPlanned(planned) };
764
+ return { result, written: asWritten(planned), drift: diffPlanned(planned), harnessChecks };
715
765
  }
716
- return { result, written: writePlanned(planned) };
766
+ return { result, written: writePlanned(planned), harnessChecks };
717
767
  }
718
768
  async function buildMarketplace(opts) {
719
769
  const loaded = loadMarketplaceDir(opts.marketplaceDir);
@@ -771,11 +821,19 @@ async function buildMarketplace(opts) {
771
821
  };
772
822
  planned.push(...planCatalog(adapter, resolved, base));
773
823
  }
824
+ const adapters = targets.map((t) => opts.registry.get(t)).filter((a) => a !== void 0);
825
+ const harnessChecks = checkHarnesses(adapters, opts.harnessVersions, opts.harnessCheck === true);
774
826
  const plugins = compiled.map((c) => c.result);
775
827
  if (opts.check) {
776
- return { marketplace, plugins, written: asWritten(planned), drift: diffPlanned(planned) };
828
+ return {
829
+ marketplace,
830
+ plugins,
831
+ written: asWritten(planned),
832
+ drift: diffPlanned(planned),
833
+ harnessChecks
834
+ };
777
835
  }
778
- return { marketplace, plugins, written: writePlanned(planned) };
836
+ return { marketplace, plugins, written: writePlanned(planned), harnessChecks };
779
837
  }
780
838
  function installResolved(fb, dependencies, opts) {
781
839
  const result = compile(fb, { registry: opts.registry, targets: opts.targets, only: opts.only });
@@ -1039,6 +1097,6 @@ function verifyArtifacts(lock, publicKey, signature) {
1039
1097
  return { signatureValid: verifyLockSignature(lock, publicKey, signature), tampered };
1040
1098
  }
1041
1099
 
1042
- export { AdapterRegistry, CACHE_DIR, CompileError, Diagnostics, WEFT_VERSION, artifactDigest, build, buildLockEntry, buildMarketplace, buildToDir, checkManagedPolicy, checkMinVersion, compile, diffPlanned, fileAccessors, generateSigningKeys, gitInfo, hasMarketplaceManifest, importNativePlugin, install, installMarketplace, installToScope, lint, loadMarketplaceDir, loadPluginDir, lockDirForScope, mergeLock, parseSource, placeCatalog, placePluginArtifacts, planBuild, planCatalog, planPluginArtifacts, planScopeArtifacts, readLock, resolveAliases, resolveConfig, resolveDependencies, resolveDependency, resolvePluginRef, resolvePluginRefFull, resolveSourceDir, serializeLock, sha256, signLock, staticPass, synthMarketplace, uninstall, update, validatePlugin, verifyArtifacts, verifyLockSignature, writeLock, writePlanned };
1100
+ export { AdapterRegistry, CACHE_DIR, CompileError, Diagnostics, WEFT_VERSION, artifactDigest, build, buildLockEntry, buildMarketplace, buildToDir, checkHarness, checkHarnesses, checkManagedPolicy, checkMinVersion, compile, detectHarnessVersion, diffPlanned, fileAccessors, generateSigningKeys, gitInfo, hasMarketplaceManifest, importNativePlugin, install, installMarketplace, installToScope, lint, loadMarketplaceDir, loadPluginDir, lockDirForScope, mergeLock, parseSource, placeCatalog, placePluginArtifacts, planBuild, planCatalog, planPluginArtifacts, planScopeArtifacts, readLock, resolveAliases, resolveConfig, resolveDependencies, resolveDependency, resolvePluginRef, resolvePluginRefFull, resolveSourceDir, serializeLock, sha256, signLock, staticPass, synthMarketplace, uninstall, update, validatePlugin, verifyArtifacts, verifyLockSignature, writeLock, writePlanned };
1043
1101
  //# sourceMappingURL=index.js.map
1044
1102
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/diagnostics.ts","../src/namespace.ts","../src/validate.ts","../src/version.ts","../src/compile.ts","../src/config.ts","../src/loader.ts","../src/resolve.ts","../src/deps.ts","../src/lockfile.ts","../src/managed.ts","../src/hash.ts","../src/place.ts","../src/api.ts","../src/import.ts","../src/registry.ts","../src/sign.ts"],"names":["kindOf","join","existsSync","statSync","subdir","base","ref","mkdirSync","dir","sha","resolvePath","leafNameOf","refOf","homedir","writeFileSync","readFileSync","createHash","loadOrThrow","dirname","readdirSync","manifestPath"],"mappings":";;;;;;;;;;;;AAUO,IAAM,cAAN,MAAkB;AAAA,EACd,QAAsB,EAAC;AAAA,EAEhC,KAAA,CAAM,OAAe,OAAA,EAAuB;AAC1C,IAAA,IAAA,CAAK,MAAM,IAAA,CAAK,EAAE,UAAU,OAAA,EAAS,KAAA,EAAO,SAAS,CAAA;AAAA,EACvD;AAAA,EACA,IAAA,CAAK,OAAe,OAAA,EAAuB;AACzC,IAAA,IAAA,CAAK,MAAM,IAAA,CAAK,EAAE,UAAU,SAAA,EAAW,KAAA,EAAO,SAAS,CAAA;AAAA,EACzD;AAAA,EACA,IAAA,CAAK,OAAe,OAAA,EAAuB;AACzC,IAAA,IAAA,CAAK,MAAM,IAAA,CAAK,EAAE,UAAU,MAAA,EAAQ,KAAA,EAAO,SAAS,CAAA;AAAA,EACtD;AAAA,EAEA,IAAI,SAAA,GAAqB;AACvB,IAAA,OAAO,KAAK,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,OAAO,CAAA;AAAA,EACtD;AAAA,EAEA,IAAI,MAAA,GAAuB;AACzB,IAAA,OAAO,KAAK,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,OAAO,CAAA;AAAA,EACxD;AACF;AAEO,IAAM,YAAA,GAAN,cAA2B,KAAA,CAAM;AAAA,EACtC,WAAA,CACE,SACS,WAAA,EACT;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAFJ,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAGT,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EACd;AAAA,EAJW,WAAA;AAKb;;;ACrBO,SAAS,eAAe,UAAA,EAAuC;AACpE,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAsB;AACzC,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,MAAM,MAAM,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,IAAI,KAAK,EAAC;AACnC,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,EAAE,CAAA;AACb,IAAA,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,IAAA,EAAM,GAAG,CAAA;AAAA,EACxB;AAEA,EAAA,MAAM,UAAkC,EAAC;AACzC,EAAA,MAAM,aAAwC,EAAC;AAC/C,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,GAAG,CAAA,IAAK,MAAA,EAAQ;AAChC,IAAA,IAAI,IAAI,MAAA,KAAW,CAAA,UAAW,IAAI,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,SACtC,UAAA,CAAW,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,EAAK,CAAC,GAAG,GAAG,CAAA,CAAE,IAAA,EAAK,EAAG,CAAA;AAAA,EACrD;AACA,EAAA,OAAO,EAAE,SAAS,UAAA,EAAW;AAC/B;ACtBO,SAAS,cAAA,CAAe,IAAmB,KAAA,EAA0B;AAC1E,EAAA,EAAA,CAAG,MAAA,CAAO,UAAA,CAAW,OAAA,CAAQ,CAAC,WAAW,CAAA,KAAM;AAC7C,IAAA,MAAM,KAAA,GAAQ,cAAc,CAAC,CAAA,CAAA,CAAA;AAC7B,IAAA,MAAM,GAAA,GAAM,MAAM,SAAS,CAAA;AAC3B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,EAAA,CAAG,IAAA,EAAM,GAAG,CAAA;AAC7B,IAAA,IAAI,CAAC,UAAA,CAAW,GAAG,CAAA,EAAG;AACpB,MAAA,KAAA,CAAM,KAAA,CAAM,KAAA,EAAO,CAAA,iBAAA,EAAoB,GAAG,CAAA,gBAAA,CAAkB,CAAA;AAC5D,MAAA;AAAA,IACF;AAEA,IAAA,QAAQ,MAAA,CAAO,SAAS,CAAA;AAAG,MACzB,KAAK,OAAA;AACH,QAAA,aAAA,CAAc,EAAA,EAAI,GAAA,EAAK,GAAA,EAAK,KAAA,EAAO,KAAK,CAAA;AACxC,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,WAAA,CAAY,EAAA,EAAI,GAAA,EAAK,GAAA,EAAK,KAAA,EAAO,KAAK,CAAA;AACtC,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,yBAAA,CAA0B,EAAA,EAAI,GAAA,EAAK,GAAA,EAAK,KAAA,EAAO,KAAK,CAAA;AACpD,QAAA;AAGA;AACJ,EACF,CAAC,CAAA;AACH;AAEA,SAAS,aAAA,CACP,EAAA,EACA,GAAA,EACA,GAAA,EACA,OACA,KAAA,EACM;AACN,EAAA,IAAI,CAAC,QAAA,CAAS,GAAG,CAAA,CAAE,aAAY,EAAG;AAChC,IAAA,KAAA,CAAM,KAAA,CAAM,KAAA,EAAO,CAAA,OAAA,EAAU,GAAG,CAAA,yCAAA,CAA2C,CAAA;AAC3E,IAAA;AAAA,EACF;AACA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAK,UAAU,CAAA;AACpC,EAAA,IAAI,CAAC,UAAA,CAAW,OAAO,CAAA,EAAG;AACxB,IAAA,KAAA,CAAM,KAAA,CAAM,KAAA,EAAO,CAAA,OAAA,EAAU,GAAG,CAAA,qBAAA,CAAuB,CAAA;AACvD,IAAA;AAAA,EACF;AACA,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,gBAAA,CAAiB,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,UAAU,CAAC,CAAA,CAAE,QAAA,CAAS,MAAM,CAAC,CAAA;AACjF,EAAA,IAAI,CAAC,KAAK,IAAA,EAAM,KAAA,CAAM,MAAM,CAAA,EAAG,KAAK,UAAU,wCAAwC,CAAA;AACtF,EAAA,gBAAA,CAAiB,CAAA,EAAG,KAAK,CAAA,MAAA,CAAA,EAAU,IAAA,CAAK,aAAa,KAAK,CAAA;AAC5D;AAEA,SAAS,WAAA,CACP,EAAA,EACA,GAAA,EACA,GAAA,EACA,OACA,KAAA,EACM;AACN,EAAA,IAAI,CAAC,QAAA,CAAS,GAAG,CAAA,CAAE,aAAY,EAAG;AAChC,IAAA,KAAA,CAAM,KAAA,CAAM,KAAA,EAAO,CAAA,KAAA,EAAQ,GAAG,CAAA,4CAAA,CAA8C,CAAA;AAC5E,IAAA;AAAA,EACF;AACA,EAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,EAAK,aAAa,CAAA;AAC9C,EAAA,IAAI,CAAC,UAAA,CAAW,cAAc,CAAA,EAAG;AAC/B,IAAA,KAAA,CAAM,KAAA,CAAM,KAAA,EAAO,CAAA,KAAA,EAAQ,GAAG,CAAA,wBAAA,CAA0B,CAAA;AACxD,IAAA;AAAA,EACF;AACA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,aAAa,CAAC,CAAA,CAAE,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,EACxE,SAAS,GAAA,EAAK;AACZ,IAAA,KAAA,CAAM,MAAM,CAAA,EAAG,KAAK,QAAQ,CAAA,+BAAA,EAAmC,GAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AACtF,IAAA;AAAA,EACF;AACA,EAAA,IAAI,CAAC,OAAO,IAAA,EAAM,KAAA,CAAM,MAAM,CAAA,EAAG,KAAK,QAAQ,+BAA+B,CAAA;AAC7E,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,QAAA,IAAY,MAAA,CAAO,WAAW,MAAA,CAAO,OAAA;AAChE,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,KAAK,CAAA,IAAA,CAAA,EAAQ,6DAA6D,CAAA;AAAA,EAC1F;AACA,EAAA,gBAAA,CAAiB,CAAA,EAAG,KAAK,CAAA,IAAA,CAAA,EAAQ,MAAA,CAAO,aAAa,KAAK,CAAA;AAC5D;AAEA,SAAS,yBAAA,CACP,EAAA,EACA,GAAA,EACA,GAAA,EACA,OACA,KAAA,EACM;AACN,EAAA,IAAI,QAAA,CAAS,GAAG,CAAA,CAAE,WAAA,EAAY,EAAG;AACjC,EAAA,MAAM,EAAE,IAAA,EAAK,GAAI,gBAAA,CAAiB,EAAA,CAAG,KAAK,GAAG,CAAA,CAAE,QAAA,CAAS,MAAM,CAAC,CAAA;AAC/D,EAAA,IAAI,CAAC,KAAK,IAAA,EAAM,KAAA,CAAM,KAAK,CAAA,EAAG,KAAK,UAAU,qCAAqC,CAAA;AAClF,EAAA,gBAAA,CAAiB,CAAA,EAAG,KAAK,CAAA,MAAA,CAAA,EAAU,IAAA,CAAK,aAAa,KAAK,CAAA;AAC5D;AAEA,SAAS,gBAAA,CAAiB,KAAA,EAAe,WAAA,EAAsB,KAAA,EAA0B;AACvF,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,KAAA,CAAM,KAAA,CAAM,OAAO,mEAAmE,CAAA;AACtF,IAAA;AAAA,EACF;AACA,EAAA,IAAI,OAAO,WAAW,CAAA,CAAE,IAAA,EAAK,CAAE,SAAS,EAAA,EAAI;AAC1C,IAAA,KAAA,CAAM,IAAA,CAAK,OAAO,sEAAsE,CAAA;AAAA,EAC1F;AACF;AC7GO,IAAM,YAAA,GAAe;AAMrB,SAAS,gBAAgB,GAAA,EAAwC;AACtE,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,MAAM,UAAU,MAAA,CAAO,KAAA,CAAM,OAAO,MAAA,CAAO,GAAG,KAAK,GAAG,CAAA;AACtD,EAAA,IAAI,CAAC,OAAA,EAAS,OAAO,CAAA,kBAAA,EAAqB,GAAG,CAAA,uBAAA,CAAA;AAC7C,EAAA,IAAI,MAAA,CAAO,EAAA,CAAG,YAAA,EAAc,OAAO,CAAA,EAAG;AACpC,IAAA,OAAO,CAAA,wBAAA,EAA2B,GAAG,CAAA,cAAA,EAAiB,YAAY,CAAA,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,IAAA;AACT;;;ACyCO,SAAS,iBAAiB,MAAA,EAAqC;AACpE,EAAA,OAAO;AAAA,IACL,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,GAAI,OAAO,WAAA,GAAc,EAAE,aAAa,MAAA,CAAO,WAAA,KAAgB,EAAC;AAAA,IAChE,OAAA,EAAS;AAAA,MACP;AAAA,QACE,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,MAAA,EAAQ,CAAA,UAAA,EAAa,MAAA,CAAO,IAAI,CAAA,CAAA;AAAA,QAChC,GAAI,OAAO,WAAA,GAAc,EAAE,aAAa,MAAA,CAAO,WAAA,KAAgB,EAAC;AAAA,QAChE,SAAS,MAAA,CAAO;AAAA;AAClB;AACF,GACF;AACF;AAqBO,SAAS,WAAW,EAAA,EAA+B;AACxD,EAAA,MAAM,WAAA,GAAc,IAAI,WAAA,EAAY;AACpC,EAAA,MAAM,EAAE,QAAO,GAAI,EAAA;AACnB,EAAA,MAAM,KAAK,CAAA,EAAG,MAAA,CAAO,MAAM,SAAS,CAAA,CAAA,EAAI,OAAO,IAAI,CAAA,CAAA;AAEnD,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,MAAA,CAAO,gBAAgB,CAAA;AACtD,EAAA,IAAI,MAAA,EAAQ,WAAA,CAAY,KAAA,CAAM,kBAAA,EAAoB,MAAM,CAAA;AAExD,EAAA,cAAA,CAAe,IAAI,WAAW,CAAA;AAE9B,EAAA,MAAM,QAAA,GAAgC,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,CAAC,SAAA,MAAe;AAAA,IAC1E,EAAA,EAAI,KAAK,MAAA,CAAO,KAAA,CAAM,WAAW,MAAA,CAAO,IAAA,EAAM,UAAA,CAAW,SAAS,CAAC,CAAA;AAAA,IACnE,IAAA,EAAM,WAAW,SAAS,CAAA;AAAA,IAC1B,IAAA,EAAMA,OAAO,SAAS,CAAA;AAAA,IACtB;AAAA,GACF,CAAE,CAAA;AAEF,EAAA,MAAM,EAAE,OAAA,EAAS,UAAA,EAAW,GAAI,eAAe,QAAQ,CAAA;AACvD,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,WAAA,CAAY,KAAA;AAAA,MACV,CAAA,WAAA,EAAc,EAAE,IAAI,CAAA,CAAA;AAAA,MACpB,CAAA,0BAAA,EAA6B,EAAE,IAAI,CAAA,GAAA,EAAM,EAAE,GAAA,CAAI,IAAA,CAAK,MAAM,CAAC,CAAA,8CAAA;AAAA,KAC7D;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,EAAA,EAAI,WAAA,EAAa,OAAA,EAAS,QAAA,EAAS;AAC9C;AAYO,SAAS,OAAA,CAAQ,IAAmB,IAAA,EAAqC;AAC9E,EAAA,MAAM,EAAE,QAAO,GAAI,EAAA;AACnB,EAAA,MAAM,IAAA,GAAO,WAAW,EAAE,CAAA;AAC1B,EAAA,MAAM,EAAE,EAAA,EAAI,WAAA,EAAY,GAAI,IAAA;AAG5B,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,IAAI,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AACzE,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,MAAA,IAAI,CAAC,KAAK,QAAA,CAAS,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,IAAA,KAAS,IAAI,CAAA,EAAG;AACjD,QAAA,WAAA,CAAY,KAAA;AAAA,UACV,MAAA;AAAA,UACA,CAAA,WAAA,EAAc,IAAI,CAAA,wBAAA,EAA2B,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,SAC1F;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,EAAA,MAAM,QAAA,GAAW,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,CAAC,EAAA,KAAO,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,IAAI,CAAC,IAAI,IAAA,CAAK,QAAA;AACrF,EAAA,MAAM,eAAA,GAA0B,OAAA,GAC5B,EAAE,GAAG,MAAA,EAAQ,UAAA,EAAY,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,KAAO,EAAA,CAAG,SAAS,GAAE,GAC5D,MAAA;AACJ,EAAA,MAAM,OAAA,GAAU,UACZ,MAAA,CAAO,WAAA;AAAA,IACL,OAAO,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,CAAO,CAAC,GAAG,GAAG,CAAA,KAAM,SAAS,IAAA,CAAK,CAAC,OAAO,EAAA,CAAG,EAAA,KAAO,GAAG,CAAC;AAAA,MAEvF,IAAA,CAAK,OAAA;AACT,EAAA,MAAM,eAAe,IAAI,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,MAAM,GAAG,CAAA,KAAM,CAAC,GAAA,EAAK,IAAI,CAAC,CAAC,CAAA;AAEtF,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,QAAA,CAAS,OAAA;AAChD,EAAA,MAAM,UAA0B,EAAC;AAEjC,EAAA,KAAA,MAAW,UAAU,SAAA,EAAW;AAC9B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AACxC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,IAAI,KAAK,OAAA,EAAS,WAAA,CAAY,KAAK,MAAA,EAAQ,CAAA,kCAAA,EAAqC,MAAM,CAAA,CAAA,CAAG,CAAA;AACzF,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAiB;AAAA,MACrB,MAAA,EAAQ,eAAA;AAAA,MACR,MAAM,EAAA,CAAG,IAAA;AAAA,MACT,MAAM,EAAA,CAAG,IAAA;AAAA,MACT,UAAU,CAAC,WAAA,KAAgB,YAAA,CAAa,GAAA,CAAI,WAAW,CAAA,IAAK;AAAA,KAC9D;AAEA,IAAA,MAAM,kBAAoC,EAAC;AAC3C,IAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,MAAA,IAAI,CAAC,UAAU,EAAA,CAAG,SAAA,EAAW,WAAW,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5D,MAAA,KAAA,MAAW,KAAK,OAAA,CAAQ,SAAA,CAAU,EAAA,CAAG,SAAA,EAAW,GAAG,CAAA,EAAG;AACpD,QAAA,eAAA,CAAgB,KAAK,EAAE,WAAA,EAAa,GAAG,EAAA,EAAI,QAAA,EAAU,GAAG,CAAA;AAAA,MAC1D;AAAA,IACF;AACA,IAAA,KAAA,MAAW,CAAA,IAAK,OAAA,CAAQ,YAAA,CAAa,eAAA,EAAiB,GAAG,CAAA,EAAG;AAC1D,MAAA,eAAA,CAAgB,KAAK,EAAE,WAAA,EAAa,EAAA,EAAI,QAAA,EAAU,GAAG,CAAA;AAAA,IACvD;AAEA,IAAA,OAAA,CAAQ,KAAK,EAAE,MAAA,EAAQ,OAAA,EAAS,SAAA,EAAW,iBAAiB,CAAA;AAAA,EAC9D;AAEA,EAAA,OAAO,EAAE,EAAA,EAAI,EAAA,EAAI,YAAY,QAAA,EAAU,OAAA,EAAS,aAAa,OAAA,EAAQ;AACvE;AC9KA,SAAS,aAAa,SAAA,EAAsB;AAC1C,EAAA,OAAO,YAAY,SAAA,IAAa,SAAA,CAAU,MAAA,GAAS,SAAA,CAAU,SAAS,EAAC;AACzE;AAQO,SAAS,aAAA,CACd,MAAA,EACA,GAAA,EACA,GAAA,GAA0C,QAAQ,GAAA,EACnC;AACf,EAAA,MAAM,WAA+B,EAAC;AACtC,EAAA,MAAM,SAAiC,EAAC;AAExC,EAAA,KAAA,MAAW,SAAA,IAAa,OAAO,UAAA,EAAY;AACzC,IAAA,KAAA,MAAW,CAAA,IAAK,YAAA,CAAa,SAAS,CAAA,EAAG;AACvC,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,CAAA,CAAE,GAAG,CAAA;AACzB,MAAA,IAAI,YAAY,MAAA,EAAW;AACzB,QAAA,MAAA,CAAO,CAAA,CAAE,GAAG,CAAA,GAAI,OAAA;AAChB,QAAA,QAAA,CAAS,IAAA,CAAK,EAAE,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,QAAQ,KAAA,EAAO,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,CAAA;AAAA,MAC/D,CAAA,MAAA,IAAW,CAAA,CAAE,OAAA,KAAY,MAAA,EAAW;AAClC,QAAA,QAAA,CAAS,IAAA,CAAK,EAAE,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,QAAQ,SAAA,EAAW,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,CAAA;AAAA,MACnE,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,CAAA,CAAE,GAAG,CAAA,GAAI,CAAA,CAAE,OAAA;AAClB,QAAA,QAAA,CAAS,IAAA,CAAK,EAAE,GAAA,EAAK,CAAA,CAAE,GAAA,EAAK,QAAQ,SAAA,EAAW,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,CAAA;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,KAAW,GAAG,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,IAAA,EAAK;AAEpE,EAAA,MAAM,GAAA,GAAMC,IAAAA,CAAK,GAAA,EAAK,OAAO,CAAA;AAC7B,EAAA,SAAA,CAAU,GAAA,EAAK,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAElC,EAAA,aAAA,CAAcA,IAAAA,CAAK,GAAA,EAAK,YAAY,CAAA,EAAG,KAAK,CAAA;AAC5C,EAAA,MAAM,IAAA,GAAOA,IAAAA,CAAK,GAAA,EAAK,oBAAoB,CAAA;AAC3C,EAAA,aAAA,CAAc,MAAM,CAAA,EAAG,IAAA,CAAK,UAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC;AAAA,CAAI,CAAA;AAC1D,EAAA,OAAO,EAAE,UAAU,IAAA,EAAK;AAC1B;AC9BA,SAAS,SAAA,CAAU,MAAc,GAAA,EAAuB;AACtD,EAAA,IAAI,EAAEC,UAAAA,CAAW,GAAG,CAAA,IAAKC,QAAAA,CAAS,GAAG,CAAA,CAAE,WAAA,EAAY,CAAA,EAAI,OAAO,EAAC;AAC/D,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,KAAA,IAAS,WAAA,CAAY,GAAG,CAAA,CAAE,MAAK,EAAG;AAC3C,IAAA,MAAM,GAAA,GAAMF,IAAAA,CAAK,GAAA,EAAK,KAAK,CAAA;AAC3B,IAAA,IAAIE,QAAAA,CAAS,GAAG,CAAA,CAAE,WAAA,EAAY,EAAG,GAAA,CAAI,IAAA,CAAK,GAAG,SAAA,CAAU,IAAA,EAAM,GAAG,CAAC,CAAA;AAAA,SAC5D,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,GAAG,CAAC,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,GAAA;AACT;AAEA,IAAM,cAAA,GAAiB,CAAC,WAAA,EAAa,UAAA,EAAY,cAAc,WAAW,CAAA;AAGnE,SAAS,cAAc,IAAA,EAAoD;AAChF,EAAA,OAAO;AAAA,IACL,MAAM,CAAC,OAAA,KAAoB,aAAaF,IAAAA,CAAK,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,IAC3D,IAAA,EAAM,CAAC,MAAA,KAAmB,SAAA,CAAU,MAAMA,IAAAA,CAAK,IAAA,EAAM,MAAM,CAAC;AAAA,GAC9D;AACF;AAGO,SAAS,cAAc,GAAA,EAAyC;AACrE,EAAA,MAAM,YAAA,GAAe,cAAA,CAAe,GAAA,CAAI,CAAC,MAAMA,IAAAA,CAAK,GAAA,EAAK,CAAC,CAAC,EAAE,IAAA,CAAK,CAAC,CAAA,KAAMC,UAAAA,CAAW,CAAC,CAAC,CAAA;AACtF,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ;AAAA,QACN,EAAE,MAAM,GAAA,EAAK,OAAA,EAAS,qCAAqC,cAAA,CAAe,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAI;AAC1F,KACF;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,YAAA,EAAc,MAAM,CAAA;AAC9C,EAAA,MAAM,SAAS,UAAA,CAAW,IAAA,EAAM,EAAE,QAAA,EAAU,cAAc,CAAA;AAC1D,EAAA,IAAI,CAAC,MAAA,CAAO,EAAA,EAAI,OAAO,MAAA;AAEvB,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,IAAA;AAAA,IACJ,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAA,CAAO,KAAA,EAAO,IAAA,EAAM,GAAA,EAAK,YAAA,EAAc,GAAG,aAAA,CAAc,GAAG,CAAA;AAAE,GAChF;AACF;AAEA,IAAM,iBAAA,GAAoB;AAAA,EACxB,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACF,CAAA;AAGO,SAAS,uBAAuB,GAAA,EAAsB;AAC3D,EAAA,OAAO,iBAAA,CAAkB,KAAK,CAAC,CAAA,KAAMA,WAAWD,IAAAA,CAAK,GAAA,EAAK,CAAC,CAAC,CAAC,CAAA;AAC/D;AAGO,SAAS,mBAAmB,GAAA,EAA8C;AAC/E,EAAA,MAAM,YAAA,GAAe,iBAAA,CAAkB,GAAA,CAAI,CAAC,MAAMA,IAAAA,CAAK,GAAA,EAAK,CAAC,CAAC,EAAE,IAAA,CAAK,CAAC,CAAA,KAAMC,UAAAA,CAAW,CAAC,CAAC,CAAA;AACzF,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,MAAA,EAAQ;AAAA,QACN;AAAA,UACE,IAAA,EAAM,GAAA;AAAA,UACN,OAAA,EAAS,CAAA,uCAAA,EAA0C,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA;AACjF;AACF,KACF;AAAA,EACF;AACA,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,YAAA,EAAc,MAAM,CAAA;AAC9C,EAAA,MAAM,SAAS,YAAA,CAAa,WAAA,EAAa,MAAM,EAAE,QAAA,EAAU,cAAc,CAAA;AACzE,EAAA,IAAI,CAAC,MAAA,CAAO,EAAA,EAAI,OAAO,MAAA;AACvB,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,EAAE,WAAA,EAAa,MAAA,CAAO,KAAA,EAAO,IAAA,EAAM,GAAA,EAAK,YAAA,EAAa,EAAE;AACnF;ACvFO,IAAM,SAAA,GAAYD,IAAAA,CAAK,OAAA,EAAQ,EAAG,SAAS,OAAO;AAOzD,SAAS,kBAAkB,CAAA,EAA4D;AACrF,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAC1B,EAAA,MAAM,MAAM,IAAA,IAAQ,CAAA,GAAI,EAAE,KAAA,CAAM,IAAA,GAAO,CAAC,CAAA,GAAI,MAAA;AAC5C,EAAA,MAAM,OAAO,IAAA,IAAQ,CAAA,GAAI,EAAE,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,GAAI,CAAA;AAC5C,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,gBAAgB,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA;AACnD,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA;AACpC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AAC/B,EAAA,IAAI,KAAA,KAAU,EAAA,EAAI,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,GAAI,GAAA,GAAM,EAAE,GAAA,EAAI,GAAI,EAAC,EAAG;AAC/D,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,KAAK,CAAA;AAAA,IACjC,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA;AAAA,IAC5B,GAAI,GAAA,GAAM,EAAE,GAAA,KAAQ;AAAC,GACvB;AACF;AAGO,SAAS,YAAY,GAAA,EAAqB;AAC/C,EAAA,IAAI,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,IAAK,GAAA,CAAI,WAAW,KAAK,CAAA,IAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACpE,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,GAAA,EAAI;AAAA,EACpC;AACA,EAAA,IAAI,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA,EAAG;AAC1B,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA;AAC9B,IAAA,MAAMG,UAAS,KAAA,IAAS,CAAA,GAAI,IAAI,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA,GAAI,MAAA;AACnD,IAAA,MAAM,OAAO,KAAA,IAAS,CAAA,GAAI,IAAI,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,GAAI,GAAA;AAEhD,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AAC/B,IAAA,MAAM,MAAM,EAAA,GAAK,CAAA,GAAI,KAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,IAAA;AACzC,IAAA,MAAM,UAAU,EAAA,GAAK,CAAA,GAAI,KAAK,KAAA,CAAM,EAAA,GAAK,CAAC,CAAA,GAAI,MAAA;AAC9C,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,KAAK,GAAI,OAAA,GAAU,EAAE,OAAA,EAAQ,GAAI,EAAC,EAAI,GAAIA,OAAAA,GAAS,EAAE,QAAAA,OAAAA,EAAO,GAAI,EAAC,EAAG;AAAA,EAC5F;AACA,EAAA,IAAI,GAAA,CAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AAC7B,IAAA,MAAM,EAAE,IAAA,EAAAC,KAAAA,EAAM,MAAA,EAAAD,OAAAA,EAAQ,GAAA,EAAAE,IAAAA,EAAI,GAAI,iBAAA,CAAkB,GAAA,CAAI,KAAA,CAAM,SAAA,CAAU,MAAM,CAAC,CAAA;AAC3E,IAAA,OAAO,EAAE,MAAM,QAAA,EAAU,IAAA,EAAMD,OAAM,GAAIC,IAAAA,GAAM,EAAE,GAAA,EAAAA,IAAAA,KAAQ,EAAC,EAAI,GAAIF,OAAAA,GAAS,EAAE,QAAAA,OAAAA,EAAO,GAAI,EAAC,EAAG;AAAA,EAC9F;AACA,EAAA,IACE,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA,IACrB,IAAI,UAAA,CAAW,MAAM,CAAA,IACrB,GAAA,CAAI,WAAW,SAAS,CAAA,IACxB,cAAA,CAAe,IAAA,CAAK,GAAG,CAAA,EACvB;AACA,IAAA,MAAM,EAAE,IAAA,EAAAC,KAAAA,EAAM,MAAA,EAAAD,OAAAA,EAAQ,GAAA,EAAAE,IAAAA,EAAI,GAAI,iBAAA,CAAkB,GAAA,CAAI,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAC,CAAA;AACzE,IAAA,OAAO,EAAE,MAAM,KAAA,EAAO,GAAA,EAAKD,OAAM,GAAIC,IAAAA,GAAM,EAAE,GAAA,EAAAA,IAAAA,KAAQ,EAAC,EAAI,GAAIF,OAAAA,GAAS,EAAE,QAAAA,OAAAA,EAAO,GAAI,EAAC,EAAG;AAAA,EAC1F;AAEA,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAI,GAAI,kBAAkB,GAAG,CAAA;AACnD,EAAA,IAAI,oBAAA,CAAqB,IAAA,CAAK,IAAI,CAAA,EAAG;AACnC,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,IAAA,EAAM,GAAI,MAAM,EAAE,GAAA,EAAI,GAAI,IAAK,GAAI,MAAA,GAAS,EAAE,MAAA,EAAO,GAAI,EAAC,EAAG;AAAA,EAC9F;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,GAAA,EAAI;AACpC;AAEA,SAAS,YAAY,GAAA,EAAqB;AACxC,EAAA,OAAOH,IAAAA,CAAK,SAAA,EAAW,UAAA,CAAW,QAAQ,EAAE,MAAA,CAAO,GAAG,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AACpF;AAEA,IAAM,MAAA,GAAS,iBAAA;AAGf,eAAe,QAAA,CACb,KACA,GAAA,EACuC;AACvC,EAAAM,SAAAA,CAAU,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AACxC,EAAA,MAAM,MAAM,WAAA,CAAY,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,GAAA,IAAO,SAAS,CAAA,CAAE,CAAA;AACpD,EAAA,MAAM,KAAA,GAAQ,GAAA,KAAQ,MAAA,IAAa,MAAA,CAAO,KAAK,GAAG,CAAA;AAElD,EAAA,IAAIL,UAAAA,CAAWD,IAAAA,CAAK,GAAA,EAAK,MAAM,CAAC,CAAA,EAAG;AACjC,IAAA,MAAM,MAAM,KAAA,EAAO,CAAC,OAAA,EAAS,QAAA,EAAU,GAAI,GAAA,GAAM,CAAC,GAAG,CAAA,GAAI,EAAG,CAAA,EAAG,EAAE,GAAA,EAAK,KAAK,CAAA;AAC3E,IAAA,MAAM,KAAA,CAAM,KAAA,EAAO,CAAC,UAAA,EAAY,GAAA,IAAO,YAAY,CAAA,EAAG,EAAE,GAAA,EAAK,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,EACnF,WAAW,KAAA,EAAO;AAChB,IAAA,MAAM,MAAM,KAAA,EAAO,CAAC,OAAA,EAAS,GAAA,EAAK,GAAG,CAAC,CAAA;AACtC,IAAA,MAAM,KAAA,CAAM,OAAO,CAAC,UAAA,EAAY,GAAa,CAAA,EAAG,EAAE,GAAA,EAAK,GAAA,EAAK,CAAA;AAAA,EAC9D,CAAA,MAAO;AACL,IAAA,MAAM,aAAa,GAAA,GAAM,CAAC,UAAA,EAAY,GAAG,IAAI,EAAC;AAC9C,IAAA,MAAM,KAAA,CAAM,KAAA,EAAO,CAAC,OAAA,EAAS,SAAA,EAAW,KAAK,GAAG,UAAA,EAAY,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,EACvE;AACA,EAAA,MAAM,GAAA,GAAA,CAAO,MAAM,KAAA,CAAM,KAAA,EAAO,CAAC,WAAA,EAAa,MAAM,CAAA,EAAG,EAAE,GAAA,EAAK,GAAA,EAAK,CAAA,EAAG,OAAO,IAAA,EAAK;AAClF,EAAA,OAAO,EAAE,KAAK,GAAA,EAAI;AACpB;AAcA,eAAe,QAAA,CACb,KACA,OAAA,EACuC;AACvC,EAAA,MAAM,OAAO,OAAA,GAAU,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,GAAK,GAAA;AAC7C,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,CAAA,IAAA,EAAO,IAAI,CAAA,CAAE,CAAA;AACrC,EAAA,MAAM,MAAA,GAASA,IAAAA,CAAK,GAAA,EAAK,SAAS,CAAA;AAGlC,EAAA,IAAI,OAAA,IAAWC,WAAW,MAAM,CAAA,SAAU,EAAE,GAAA,EAAK,MAAA,EAAQ,GAAA,EAAK,OAAA,EAAQ;AAEtE,EAAAK,SAAAA,CAAU,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAElC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,KAAA,CAAM,KAAA,EAAO,CAAC,MAAA,EAAQ,IAAA,EAAM,oBAAA,EAAsB,GAAA,EAAK,QAAQ,CAAA,EAAG;AAAA,IACzF,GAAA,EAAK;AAAA,GACN,CAAA;AACD,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,KAAK,CAAC,CAAA;AACpB,EAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,IAAI,CAAA,CAAA,CAAG,CAAA;AAExE,EAAA,MAAM,KAAA,CAAM,KAAA,EAAO,CAAC,MAAA,EAAQN,IAAAA,CAAK,GAAA,EAAK,KAAA,CAAM,QAAQ,CAAA,EAAG,IAAA,EAAM,GAAG,CAAC,CAAA;AACjE,EAAA,OAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAK,KAAA,CAAM,OAAA,IAAW,WAAW,EAAA,EAAG;AAC5D;AAgBA,eAAe,eAAe,GAAA,EAA4C;AACxE,EAAA,IAAI,GAAA,CAAI,IAAA,KAAS,QAAA,IAAY,GAAA,CAAI,SAAS,KAAA,EAAO;AAC/C,IAAA,MAAM,GAAA,GAAM,IAAI,IAAA,KAAS,QAAA,GAAW,sBAAsB,GAAA,CAAI,IAAI,SAAS,GAAA,CAAI,GAAA;AAC/E,IAAA,MAAM,EAAE,GAAA,EAAAO,IAAAA,EAAK,GAAA,EAAAC,IAAAA,KAAQ,MAAM,QAAA,CAAS,GAAA,EAAK,GAAA,CAAI,GAAG,CAAA;AAChD,IAAA,OAAO,EAAE,GAAA,EAAK,GAAA,CAAI,MAAA,GAASR,KAAKO,IAAAA,EAAK,GAAA,CAAI,MAAM,CAAA,GAAIA,MAAK,GAAA,EAAK,GAAA,CAAI,GAAA,IAAO,SAAA,EAAW,KAAAC,IAAAA,EAAI;AAAA,EACzF;AACA,EAAA,MAAM,EAAE,KAAK,GAAA,EAAI,GAAI,MAAM,QAAA,CAAS,GAAA,CAAI,GAAA,EAAK,GAAA,CAAI,OAAO,CAAA;AACxD,EAAA,OAAO,EAAE,GAAA,EAAK,GAAA,CAAI,MAAA,GAASR,KAAK,GAAA,EAAK,GAAA,CAAI,MAAM,CAAA,GAAI,GAAA,EAAK,GAAA,EAAK,GAAA,CAAI,OAAA,IAAW,UAAU,GAAA,EAAI;AAC5F;AAQA,eAAsB,oBAAA,CACpB,QACA,QAAA,EACyB;AACzB,EAAA,MAAM,GAAA,GAAM,YAAY,MAAM,CAAA;AAC9B,EAAA,IAAI,GAAA,CAAI,SAAS,OAAA,EAAS;AACxB,IAAA,MAAMO,IAAAA,GAAM,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,GAAI,IAAI,IAAA,GAAOE,OAAA,CAAY,QAAA,EAAU,GAAA,CAAI,IAAI,CAAA;AAC5E,IAAA,OAAO,EAAE,IAAI,WAAA,CAAYF,IAAAA,EAAK,MAAM,CAAA,EAAG,GAAA,EAAK,OAAA,EAAS,GAAA,EAAK,EAAA,EAAG;AAAA,EAC/D;AACA,EAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAK,KAAI,GAAI,MAAM,eAAe,GAAG,CAAA;AAClD,EAAA,OAAO,EAAE,EAAA,EAAI,WAAA,CAAY,KAAK,MAAM,CAAA,EAAG,KAAK,GAAA,EAAI;AAClD;AAQA,eAAsB,gBAAA,CAAiB,QAAgB,QAAA,EAA2C;AAGhG,EAAA,MAAM,aAAa,UAAA,CAAW,MAAM,IAAI,MAAA,GAASE,OAAA,CAAY,UAAU,MAAM,CAAA;AAC7E,EAAA,IAAIR,UAAAA,CAAW,UAAU,CAAA,EAAG,OAAO,EAAE,KAAK,UAAA,EAAY,GAAA,EAAK,OAAA,EAAS,GAAA,EAAK,EAAA,EAAG;AAE5E,EAAA,MAAM,GAAA,GAAM,YAAY,MAAM,CAAA;AAC9B,EAAA,IAAI,GAAA,CAAI,IAAA,KAAS,OAAA,EAAS,OAAO,EAAE,KAAK,UAAA,EAAY,GAAA,EAAK,OAAA,EAAS,GAAA,EAAK,EAAA,EAAG;AAC1E,EAAA,OAAO,MAAM,eAAe,GAAG,CAAA;AACjC;AAGA,eAAsB,gBAAA,CAAiB,QAAgB,QAAA,EAA0C;AAC/F,EAAA,OAAA,CAAQ,MAAM,oBAAA,CAAqB,MAAA,EAAQ,QAAQ,CAAA,EAAG,EAAA;AACxD;AAEA,SAAS,WAAA,CAAY,KAAa,MAAA,EAA+B;AAC/D,EAAA,MAAM,MAAA,GAAS,cAAc,GAAG,CAAA;AAChC,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,mBAAmB,MAAM,CAAA;AAAA,EAAO,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAC,MAAM,CAAA,EAAA,EAAK,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,EAAE,OAAO,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KAClG;AAAA,EACF;AACA,EAAA,OAAO,MAAA,CAAO,KAAA;AAChB;AAGO,SAAS,iBAAA,CAAkB,KAAiB,QAAA,EAA2C;AAC5F,EAAA,OAAO,oBAAA,CAAqB,GAAA,CAAI,MAAA,EAAQ,QAAQ,CAAA;AAClD;AAGA,eAAsB,QAAQ,GAAA,EAAoD;AAChF,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAA,CAAO,MAAM,KAAA,CAAM,KAAA,EAAO,CAAC,WAAA,EAAa,MAAM,CAAA,EAAG,EAAE,GAAA,EAAK,GAAA,EAAK,CAAA,EAAG,OAAO,IAAA,EAAK;AAClF,IAAA,IAAI,GAAA,GAAM,MAAA;AACV,IAAA,IAAI;AACF,MAAA,GAAA,GAAA,CACE,MAAM,KAAA,CAAM,KAAA,EAAO,CAAC,YAAY,QAAA,EAAU,eAAe,CAAA,EAAG,EAAE,GAAA,EAAK,GAAA,EAAK,CAAA,EACxE,OAAO,IAAA,EAAK;AAAA,IAChB,CAAA,CAAA,MAAQ;AACN,MAAA,IAAI;AACF,QAAA,GAAA,GAAA,CACE,MAAM,KAAA,CAAM,KAAA,EAAO,CAAC,aAAa,cAAA,EAAgB,MAAM,CAAA,EAAG,EAAE,GAAA,EAAK,GAAA,EAAK,CAAA,EACtE,OAAO,IAAA,EAAK;AAAA,MAChB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,OAAO,EAAE,KAAK,GAAA,EAAI;AAAA,EACpB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,GAAA,EAAK,OAAA,EAAS,GAAA,EAAK,EAAA,EAAG;AAAA,EACjC;AACF;;;ACpOA,IAAM,QAAA,GAA0C;AAAA,EAC9C,KAAA,EAAO,OAAA;AAAA,EACP,GAAA,EAAK,KAAA;AAAA,EACL,KAAA,EAAO,OAAA;AAAA,EACP,IAAA,EAAM,MAAA;AAAA,EACN,OAAA,EAAS,SAAA;AAAA,EACT,WAAA,EAAa;AACf,CAAA;AAEA,SAAS,UAAA,CAAW,GAAc,MAAA,EAA2B;AAC3D,EAAA,OAAO,EAAE,GAAG,CAAA,EAAG,CAAC,QAAA,CAASF,OAAO,CAAC,CAAC,CAAC,GAAG,MAAA,EAAO;AAC/C;AAEA,IAAM,UAAU,CAAC,GAAA,KAAyB,CAAC,eAAA,CAAgB,KAAK,GAAG,CAAA;AAqBnE,eAAsB,mBAAA,CACpB,IACA,OAAA,EACuB;AACvB,EAAA,MAAM,OAAA,GAAU,EAAA,CAAG,MAAA,CAAO,OAAA,IAAW,EAAC;AACtC,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG,OAAO,EAAE,EAAA,EAAI,YAAA,EAAc,EAAC,EAAE;AAExD,EAAA,MAAM,SAAS,WAAA,CAAYC,IAAAA,CAAK,WAAW,MAAA,EAAO,EAAG,cAAc,CAAC,CAAA;AACpE,EAAA,MAAA,CAAO,EAAA,CAAG,MAAM,MAAA,EAAQ,EAAE,WAAW,IAAA,EAAM,MAAA,EAAQ,SAAS,CAAA;AAE5D,EAAA,MAAM,UAAA,GAA0B,CAAC,GAAG,EAAA,CAAG,OAAO,UAAU,CAAA;AACxD,EAAA,MAAM,eAAmC,EAAC;AAC1C,EAAA,MAAM,IAAA,mBAAO,IAAI,GAAA,CAAY,CAAC,GAAG,EAAA,CAAG,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA,CAAA,EAAI,EAAA,CAAG,MAAA,CAAO,IAAI,EAAE,CAAC,CAAA;AAE/E,EAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,IAAA,MAAM,QAAA,GAAW,MAAM,iBAAA,CAAkB,GAAA,EAAK,GAAG,IAAI,CAAA;AACrD,IAAA,MAAM,EAAA,GAAK,SAAS,EAAA,CAAG,MAAA;AACvB,IAAA,MAAM,QAAQ,CAAA,EAAG,EAAA,CAAG,MAAM,SAAS,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA,CAAA;AAC9C,IAAA,IAAI,IAAA,CAAK,IAAI,KAAK,CAAA,QAAS,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,KAAK,CAAA,CAAE,CAAA;AAC5E,IAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AAEd,IAAA,MAAM,OAAO,GAAA,CAAI,UAAA;AACjB,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,CAAC,SAAS,CAAC,EAAA,CAAG,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAMU,UAAAA,CAAW,CAAC,CAAA,KAAM,IAAI,CAAC,CAAA;AACxF,MAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,QAAA,MAAM,IAAI,MAAM,CAAA,WAAA,EAAc,KAAK,yBAAyB,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MAClF;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAAW,EAAA,CAAG,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,IAAA,IAAQ,IAAA,CAAK,QAAA,CAASA,UAAAA,CAAW,CAAC,CAAC,CAAC,CAAA;AAElF,IAAA,MAAM,QAAA,GAAWV,IAAAA,CAAK,OAAA,EAAS,EAAA,CAAG,IAAI,CAAA;AACtC,IAAA,MAAA,CAAO,QAAA,CAAS,EAAA,CAAG,IAAA,EAAMA,IAAAA,CAAK,MAAA,EAAQ,QAAQ,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,CAAA;AACrF,IAAA,KAAA,MAAW,CAAA,IAAK,QAAA,EAAU,UAAA,CAAW,IAAA,CAAK,UAAA,CAAW,CAAA,EAAGA,IAAAA,CAAK,QAAA,EAAUW,KAAAA,CAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AAEjF,IAAA,YAAA,CAAa,IAAA,CAAK,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,GAAA,CAAI,OAAA,IAAW,GAAA,EAAK,WAAA,EAAa,QAAA,CAAS,GAAA,EAAK,CAAA;AAAA,EACvF;AAEA,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,EAAA,CAAG,QAAQ,UAAA,EAAW;AAC1C,EAAA,MAAM,QAAA,GAA0B;AAAA,IAC9B,MAAA;AAAA,IACA,IAAA,EAAM,MAAA;AAAA,IACN,YAAA,EAAcX,IAAAA,CAAK,MAAA,EAAQ,WAAW,CAAA;AAAA,IACtC,GAAG,cAAc,MAAM;AAAA,GACzB;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,QAAA,EAAU,YAAA,EAAa;AACtC;AC/DO,SAAS,eAAe,KAAA,EAAkC;AAC/D,EAAA,MAAM,WAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,MAAA,CAAO,OAAA,EAAS;AACpC,IAAA,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,GAAI,EAAE,OAAA,EAAS,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,YAAA,EAAc,CAAA,CAAE,OAAA,CAAQ,YAAA,EAAa;AAAA,EAC1F;AACA,EAAA,OAAO;AAAA,IACL,UAAA,EAAY;AAAA,MACV,EAAA,EAAI,MAAM,MAAA,CAAO,EAAA;AAAA,MACjB,OAAA,EAAS,KAAA,CAAM,MAAA,CAAO,EAAA,CAAG,MAAA,CAAO,OAAA;AAAA,MAChC,KAAK,KAAA,CAAM,GAAA;AAAA,MACX,KAAK,KAAA,CAAM,GAAA;AAAA,MACX,YAAA,EAAc,KAAA,CAAM,YAAA,IAAgB,EAAC;AAAA,MACrC,OAAA,EAAS,MAAM,MAAA,CAAO;AAAA,KACxB;AAAA,IACA,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB;AAAA,GACF;AACF;AAOO,SAAS,SAAA,CACd,QAAA,EACA,OAAA,EACA,WAAA,EACU;AACV,EAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,CAAW,EAAE,CAAC,CAAA;AAC7D,EAAA,MAAM,OAAA,GAAA,CAAW,QAAA,EAAU,OAAA,IAAW,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AAC5E,EAAA,MAAM,SAAA,GAAA,CAAa,QAAA,EAAU,SAAA,IAAa,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,SAAA,CAAU,GAAA,CAAI,CAAA,CAAE,MAAM,CAAC,CAAA;AACpF,EAAA,MAAM,WAAiC,EAAE,GAAI,QAAA,EAAU,QAAA,IAAY,EAAC,EAAG;AACvE,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,UAAU,CAAA;AACzB,IAAA,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,CAAE,SAAS,CAAA;AAC7B,IAAA,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU,CAAA,CAAE,QAAQ,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,EAAE,WAAA,EAAa,YAAA,EAAc,WAAA,EAAa,OAAA,EAAS,WAAW,QAAA,EAAS;AAChF;AAOO,SAAS,eAAA,CAAgB,OAAc,GAAA,EAAqB;AACjE,EAAA,OAAO,UAAU,MAAA,GAASA,IAAAA,CAAKY,OAAAA,EAAQ,EAAG,OAAO,CAAA,GAAI,GAAA;AACvD;AAEO,SAAS,cAAc,IAAA,EAAwB;AACpD,EAAA,OAAO,GAAG,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC;AAAA,CAAA;AACzC;AAEO,SAAS,SAAA,CAAU,KAAa,IAAA,EAAwB;AAC7D,EAAA,MAAM,CAAA,GAAIZ,IAAAA,CAAK,GAAA,EAAK,WAAW,CAAA;AAC/B,EAAAa,aAAAA,CAAc,CAAA,EAAG,aAAA,CAAc,IAAI,CAAC,CAAA;AACpC,EAAA,OAAO,CAAA;AACT;AAGO,SAAS,SAAS,GAAA,EAA8B;AACrD,EAAA,IAAI;AACF,IAAA,MAAM,OAAOC,YAAAA,CAAad,IAAAA,CAAK,GAAA,EAAK,WAAW,GAAG,MAAM,CAAA;AACxD,IAAA,MAAM,MAAM,QAAA,CAAS,QAAA,EAAU,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAC/C,IAAA,OAAO,GAAA,CAAI,EAAA,GAAK,GAAA,CAAI,KAAA,GAAQ,IAAA;AAAA,EAC9B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;AC9EO,SAAS,kBAAA,CACd,QACA,GAAA,EACe;AACf,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,IAAI,MAAA,CAAO,mBAAmB,CAAC,MAAA,CAAO,gBAAgB,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA,EAAG;AAC7E,IAAA,OAAO,CAAA,WAAA,EAAc,IAAI,SAAS,CAAA,2CAAA,EAA8C,OAAO,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,EACnH;AACA,EAAA,IAAI,MAAA,CAAO,aAAA,IAAiB,MAAA,CAAO,aAAA,CAAc,SAAS,CAAA,EAAG;AAC3D,IAAA,MAAM,OAAO,IAAI,GAAA,CAAI,GAAA,CAAI,MAAA,IAAU,EAAE,CAAA;AACrC,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,aAAA,CAAc,MAAA,CAAO,CAAC,MAAM,CAAC,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AAC/D,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG,OAAO,wCAAwC,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,EAC3F;AACA,EAAA,OAAO,IAAA;AACT;AC/BO,SAAS,OAAO,QAAA,EAAmC;AACxD,EAAA,OAAOe,WAAW,QAAQ,CAAA,CAAE,OAAO,QAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AAC3D;;;ACqBO,SAAS,mBAAA,CACd,MAAA,EACA,OAAA,EACA,UAAA,EACgB;AAEhB,EAAA,OAAO,OAAO,SAAA,CAAU,GAAA,CAAI,CAAC,EAAE,UAAS,KAAM;AAC5C,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,OAAA,CAAQ,IAAA,GACvB,QAAA,CAAS,UACTf,IAAAA,CAAK,SAAA,EAAW,UAAA,EAAY,QAAA,CAAS,OAAO,CAAA;AAChD,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,QAAA,CAAS,QAAQ,CAAA;AAC3C,IAAA,OAAO;AAAA,MACL,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,OAAA,EAAS,GAAA;AAAA,MACT,GAAA,EAAKA,IAAAA,CAAK,OAAA,EAAS,GAAG,CAAA;AAAA,MACtB,IAAA,EAAM,OAAO,QAAQ,CAAA;AAAA,MACrB,MAAM,QAAA,CAAS,IAAA;AAAA,MACf;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACH;AAGO,SAAS,WAAA,CACd,OAAA,EACA,WAAA,EACA,OAAA,EACgB;AAChB,EAAA,OAAO,QAAQ,WAAA,CAAY,WAAW,CAAA,CAAE,GAAA,CAAI,CAAC,QAAA,KAAa;AACxD,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,QAAA,CAAS,QAAQ,CAAA;AAC3C,IAAA,OAAO;AAAA,MACL,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,SAAS,QAAA,CAAS,OAAA;AAAA,MAClB,GAAA,EAAKA,IAAAA,CAAK,OAAA,EAAS,QAAA,CAAS,OAAO,CAAA;AAAA,MACnC,IAAA,EAAM,OAAO,QAAQ,CAAA;AAAA,MACrB,MAAM,QAAA,CAAS,IAAA;AAAA,MACf;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACH;AAQO,SAAS,SAAA,CAAU,MAAA,EAAuB,MAAA,EAAgB,IAAA,GAAO,KAAA,EAAuB;AAC7F,EAAA,MAAM,UAA0B,EAAC;AACjC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAA,CAAO,EAAA;AAC1B,EAAA,MAAM,WAAA,GAAc,iBAAiB,MAAM,CAAA;AAC3C,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,OAAA,EAAS;AAC9B,IAAA,MAAM,OAAO,IAAA,GAAO,MAAA,GAASA,IAAAA,CAAK,MAAA,EAAQ,EAAE,MAAM,CAAA;AAClD,IAAA,OAAA,CAAQ,KAAK,GAAG,mBAAA,CAAoB,GAAG,IAAA,EAAM,MAAA,CAAO,IAAI,CAAC,CAAA;AACzD,IAAA,OAAA,CAAQ,KAAK,GAAG,WAAA,CAAY,EAAE,OAAA,EAAS,WAAA,EAAa,IAAI,CAAC,CAAA;AAAA,EAC3D;AACA,EAAA,OAAO,OAAA;AACT;AAGO,SAAS,aAAa,OAAA,EAA4C;AACvE,EAAA,OAAO,QAAQ,GAAA,CAAI,CAAC,EAAE,QAAA,EAAU,GAAG,MAAK,KAAM;AAC5C,IAAAM,SAAAA,CAAU,QAAQ,IAAA,CAAK,GAAG,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAChD,IAAAO,aAAAA,CAAc,IAAA,CAAK,GAAA,EAAK,QAAQ,CAAA;AAChC,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AACH;AAmBO,SAAS,YAAY,OAAA,EAAsC;AAChE,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,IAAI,CAACZ,WAAW,CAAA,CAAE,GAAG,GAAG,OAAA,CAAQ,IAAA,CAAK,EAAE,OAAO,CAAA;AAAA,SAAA,IACrC,MAAA,CAAOa,YAAAA,CAAa,CAAA,CAAE,GAAG,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,CAAA,CAAE,OAAO,CAAA;AAAA,EACvE;AACA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAA,CAAQ,MAAA,KAAW,CAAA,IAAK,MAAM,MAAA,KAAW,CAAA;AAAA,IAChD,OAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAS,OAAA,CAAQ;AAAA,GACnB;AACF;AAGO,SAAS,oBAAA,CACd,MAAA,EACA,OAAA,EACA,UAAA,EACmB;AACnB,EAAA,OAAO,YAAA,CAAa,mBAAA,CAAoB,MAAA,EAAQ,OAAA,EAAS,UAAU,CAAC,CAAA;AACtE;AAGO,SAAS,YAAA,CACd,OAAA,EACA,WAAA,EACA,OAAA,EACmB;AACnB,EAAA,OAAO,YAAA,CAAa,WAAA,CAAY,OAAA,EAAS,WAAA,EAAa,OAAO,CAAC,CAAA;AAChE;AAGO,SAAS,UAAA,CAAW,MAAA,EAAuB,MAAA,EAAgB,IAAA,GAAO,KAAA,EAA0B;AACjG,EAAA,OAAO,YAAA,CAAa,SAAA,CAAU,MAAA,EAAQ,MAAA,EAAQ,IAAI,CAAC,CAAA;AACrD;AAEA,SAAS,SAAS,QAAA,EAAmC;AACnD,EAAA,OAAO,OAAO,QAAA,KAAa,QAAA,GAAW,OAAO,IAAA,CAAK,QAAA,EAAU,MAAM,CAAA,GAAI,QAAA;AACxE;AAYO,SAAS,kBAAA,CACd,MAAA,EACA,KAAA,EACA,GAAA,EACmB;AACnB,EAAA,MAAM,UAA6B,EAAC;AACpC,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,EAAA,CAAG,MAAA,CAAO,IAAA;AAC9B,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,OAAA,EAAS;AAC9B,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,OAAA,CAAQ,MAAA,CAAO,OAAO,GAAG,CAAA;AAEzC,IAAA,MAAM,SAAA,GAAY,EAAE,OAAA,CAAQ,IAAA,GAAO,MAAM,OAAA,GAAUd,IAAAA,CAAK,KAAA,CAAM,OAAA,EAAS,IAAI,CAAA;AAC3E,IAAA,KAAA,MAAW,EAAE,WAAA,EAAa,QAAA,EAAS,IAAK,EAAE,SAAA,EAAW;AACnD,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,QAAA,CAAS,QAAQ,CAAA;AAC3C,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,QAAA;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,QAAQ,MAAA,CAAO,EAAA;AAAA,UACf,SAAA,EAAW,WAAA;AAAA,UACX,QAAQ,CAAA,CAAE,MAAA;AAAA,UACV,KAAA;AAAA,UACA,IAAA,EAAMA,IAAAA,CAAK,SAAA,EAAW,QAAA,CAAS,OAAO,CAAA;AAAA,UACtC,IAAA,EAAM,OAAO,QAAQ,CAAA;AAAA,UACrB,SAAA,EAAW,MAAA;AAAA,UACX,OAAA,EAAS,SAAS,UAAA,KAAe;AAAA;AACnC,OACD,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAGO,SAAS,cAAA,CAAe,MAAA,EAAuB,KAAA,EAAc,GAAA,EAA+B;AACjG,EAAA,OAAO,kBAAA,CAAmB,MAAA,EAAQ,KAAA,EAAO,GAAG,CAAA,CAAE,IAAI,CAAC,EAAE,MAAA,EAAQ,QAAA,EAAS,KAAM;AAC1E,IAAAM,SAAAA,CAAU,QAAQ,MAAA,CAAO,IAAI,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACnD,IAAAO,aAAAA,CAAc,MAAA,CAAO,IAAA,EAAM,QAAQ,CAAA;AACnC,IAAA,OAAO,MAAA;AAAA,EACT,CAAC,CAAA;AACH;;;AC/JA,SAAS,aACP,SAAA,EACkE;AAClE,EAAA,OAAO,mBAAA,CAAoBG,YAAAA,CAAY,SAAS,CAAC,CAAA;AACnD;AAEA,SAAS,oBAAoB,MAAA,EAAoC;AAC/D,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,QAAA,EAAU,OAAA,EAAS,KAAA,EAAO,CAAA,CAAE,IAAA,EAAM,OAAA,EAAS,CAAA,CAAE,SAAQ,CAAE,CAAA;AACrF;AAEA,SAASA,aAAY,SAAA,EAAmB;AACtC,EAAA,MAAM,MAAA,GAAS,cAAc,SAAS,CAAA;AACtC,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,MAAM,IAAI,YAAA;AAAA,MACR,4BAA4B,SAAS,CAAA,CAAA;AAAA,MACrC,mBAAA,CAAoB,OAAO,MAAM;AAAA,KACnC;AAAA,EACF;AACA,EAAA,OAAO,MAAA,CAAO,KAAA;AAChB;AAUO,SAAS,KAAK,SAAA,EAA+B;AAClD,EAAA,MAAM,EAAA,GAAKA,aAAY,SAAS,CAAA;AAChC,EAAA,MAAM,IAAA,GAAO,WAAW,EAAE,CAAA;AAC1B,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,WAAA,EAAa,IAAA,CAAK,WAAA,EAAY;AAChG;AAsBA,SAAS,UAAU,OAAA,EAA4C;AAC7D,EAAA,OAAO,OAAA,CAAQ,IAAI,CAAC,EAAE,UAAU,SAAA,EAAW,GAAG,IAAA,EAAK,KAAM,IAAI,CAAA;AAC/D;AAGA,eAAsB,MAAM,IAAA,EAA0C;AACpE,EAAA,MAAM,EAAE,EAAA,EAAG,GAAI,MAAM,YAAA,CAAa,KAAK,SAAS,CAAA;AAChD,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,EAAA,EAAI,EAAE,QAAA,EAAU,KAAK,QAAA,EAAU,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,CAAA;AAC7E,EAAA,IAAI,MAAA,CAAO,YAAY,SAAA,EAAW;AAChC,IAAA,MAAM,IAAI,YAAA,CAAa,gBAAA,EAAkB,MAAA,CAAO,YAAY,MAAM,CAAA;AAAA,EACpE;AACA,EAAA,MAAM,UAAU,SAAA,CAAU,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,KAAK,IAAI,CAAA;AACxD,EAAA,IAAI,KAAK,KAAA,EAAO;AACd,IAAA,OAAO,EAAE,QAAQ,OAAA,EAAS,SAAA,CAAU,OAAO,CAAA,EAAG,KAAA,EAAO,WAAA,CAAY,OAAO,CAAA,EAAE;AAAA,EAC5E;AACA,EAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,YAAA,CAAa,OAAO,CAAA,EAAE;AAClD;AA4BA,eAAsB,iBACpB,IAAA,EACiC;AACjC,EAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,IAAA,CAAK,cAAc,CAAA;AACrD,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,MAAM,IAAI,YAAA;AAAA,MACR,CAAA,8BAAA,EAAiC,KAAK,cAAc,CAAA,CAAA;AAAA,MACpD,mBAAA,CAAoB,OAAO,MAAM;AAAA,KACnC;AAAA,EACF;AACA,EAAA,MAAM,EAAE,WAAA,EAAa,IAAA,EAAK,GAAI,MAAA,CAAO,KAAA;AAErC,EAAA,MAAM,WAAoF,EAAC;AAC3F,EAAA,KAAA,MAAW,KAAA,IAAS,YAAY,OAAA,EAAS;AACvC,IAAA,IAAI,EAAA;AACJ,IAAA,IAAI;AACF,MAAA,EAAA,GAAA,CAAM,MAAM,oBAAA,CAAqB,KAAA,CAAM,MAAA,EAAQ,IAAI,CAAA,EAAG,EAAA;AAAA,IACxD,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,IAAI,YAAA,CAAa,CAAA,mBAAA,EAAsB,KAAA,CAAM,MAAM,CAAA,QAAA,CAAA,EAAY;AAAA,QACnE,EAAE,QAAA,EAAU,OAAA,EAAS,OAAO,SAAA,EAAW,OAAA,EAAU,IAAc,OAAA;AAAQ,OACxE,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,KAAA,CAAM,OAAA,EAAS,EAAA,GAAK,EAAE,GAAG,EAAA,EAAI,MAAA,EAAQ,EAAE,GAAG,EAAA,CAAG,MAAA,EAAQ,OAAA,EAAS,KAAA,CAAM,SAAQ,EAAE;AAElF,IAAA,MAAM,MAAA,GAAA,CAAU,MAAM,mBAAA,CAAoB,EAAE,CAAA,EAAG,EAAA;AAC/C,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,EAAQ,EAAE,QAAA,EAAU,KAAK,QAAA,EAAU,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,CAAA;AACjF,IAAA,IAAI,MAAA,CAAO,YAAY,SAAA,EAAW;AAChC,MAAA,MAAM,IAAI,aAAa,CAAA,QAAA,EAAW,MAAA,CAAO,EAAE,CAAA,QAAA,CAAA,EAAY,MAAA,CAAO,YAAY,MAAM,CAAA;AAAA,IAClF;AACA,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,EACjC;AAEA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,QAAA,CAAS,OAAA;AAC9C,EAAA,MAAM,UAA0B,EAAC;AACjC,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AACxC,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,GAAO,IAAA,CAAK,SAAShB,IAAAA,CAAK,IAAA,CAAK,QAAQ,MAAM,CAAA;AAC/D,IAAA,MAAM,UAA0B,EAAC;AACjC,IAAA,KAAA,MAAW,EAAE,KAAA,EAAO,MAAA,EAAO,IAAK,QAAA,EAAU;AACxC,MAAA,MAAM,MAAA,GAAS,OAAO,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,MAAM,CAAA;AAC7D,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,MAAM,CAAA,GAAI,OAAO,EAAA,CAAG,MAAA;AACpB,MAAA,OAAA,CAAQ,KAAK,GAAG,mBAAA,CAAoB,QAAQ,IAAA,EAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AACzD,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,MAAA,EAAQ,CAAA,UAAA,EAAa,CAAA,CAAE,IAAI,CAAA,CAAA;AAAA,QAC3B,GAAI,EAAE,WAAA,GAAc,EAAE,aAAa,CAAA,CAAE,WAAA,KAAgB,EAAC;AAAA,QACtD,OAAA,EAAS,KAAA,CAAM,OAAA,IAAW,CAAA,CAAE,OAAA;AAAA,QAC5B,GAAI,MAAM,QAAA,GAAW,EAAE,UAAU,KAAA,CAAM,QAAA,KAAa,EAAC;AAAA,QACrD,GAAI,MAAM,IAAA,GAAO,EAAE,MAAM,KAAA,CAAM,IAAA,KAAS;AAAC,OAC1C,CAAA;AAAA,IACH;AACA,IAAA,MAAM,QAAA,GAAgC;AAAA,MACpC,MAAM,WAAA,CAAY,IAAA;AAAA,MAClB,OAAO,WAAA,CAAY,KAAA;AAAA,MACnB,GAAI,YAAY,WAAA,GAAc,EAAE,aAAa,WAAA,CAAY,WAAA,KAAgB,EAAC;AAAA,MAC1E;AAAA,KACF;AACA,IAAA,OAAA,CAAQ,KAAK,GAAG,WAAA,CAAY,OAAA,EAAS,QAAA,EAAU,IAAI,CAAC,CAAA;AAAA,EACtD;AAEA,EAAA,MAAM,UAAU,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAC5C,EAAA,IAAI,KAAK,KAAA,EAAO;AACd,IAAA,OAAO,EAAE,WAAA,EAAa,OAAA,EAAS,OAAA,EAAS,SAAA,CAAU,OAAO,CAAA,EAAG,KAAA,EAAO,WAAA,CAAY,OAAO,CAAA,EAAE;AAAA,EAC1F;AACA,EAAA,OAAO,EAAE,WAAA,EAAa,OAAA,EAAS,OAAA,EAAS,YAAA,CAAa,OAAO,CAAA,EAAE;AAChE;AAmCA,SAAS,eAAA,CACP,EAAA,EACA,YAAA,EACA,IAAA,EAWe;AACf,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,EAAA,EAAI,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AAC9F,EAAA,IAAI,MAAA,CAAO,YAAY,SAAA,EAAW;AAChC,IAAA,MAAM,IAAI,YAAA,CAAa,gBAAA,EAAkB,MAAA,CAAO,YAAY,MAAM,CAAA;AAAA,EACpE;AAEA,EAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,IAAA,CAAK,OAAA,EAAS;AAAA,IAC/C,SAAA,EAAW,MAAA,CAAO,EAAA,CAAG,MAAA,CAAO,KAAA,CAAM,SAAA;AAAA,IAClC,QAAQ,IAAA,CAAK;AAAA,GACd,CAAA;AACD,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,IAAI,aAAa,mCAAA,EAAqC;AAAA,MAC1D,EAAE,QAAA,EAAU,OAAA,EAAS,KAAA,EAAO,SAAA,EAAW,SAAS,OAAA;AAAQ,KACzD,CAAA;AAAA,EACH;AACA,EAAA,MAAM,YAAY,cAAA,CAAe,MAAA,EAAQ,IAAA,CAAK,KAAA,EAAO,KAAK,GAAG,CAAA;AAC7D,EAAA,MAAM,UAAU,aAAA,CAAc,MAAA,CAAO,EAAA,CAAG,MAAA,EAAQ,KAAK,GAAG,CAAA;AACxD,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,EAAE,MAAA,EAAQ,SAAA,EAAW,YAAA,EAAc,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,CAAA;AAC9F,EAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAQ;AAClC;AAGA,SAAS,UAAA,CACP,KAAA,EACA,GAAA,EACA,OAAA,EACA,KACA,eAAA,EAC0C;AAC1C,EAAA,MAAM,GAAA,GAAM,eAAA,IAAmB,eAAA,CAAgB,KAAA,EAAO,GAAG,CAAA;AACzD,EAAAM,SAAAA,CAAU,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAClC,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,QAAA,CAAS,GAAG,CAAA,EAAG,OAAA,EAAS,GAAA,IAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,WAAA,EAAa,CAAA;AAClF,EAAA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAU,SAAA,CAAU,GAAA,EAAK,QAAQ,CAAA,EAAE;AACxD;AAGA,eAAsB,QAAQ,IAAA,EAA8C;AAC1E,EAAA,MAAM,EAAE,EAAA,EAAI,YAAA,KAAiB,MAAM,YAAA,CAAa,KAAK,SAAS,CAAA;AAC9D,EAAA,MAAM,EAAE,GAAA,EAAK,GAAA,KAAQ,MAAM,OAAA,CAAQ,KAAK,SAAS,CAAA;AACjD,EAAA,MAAM,EAAA,GAAK,eAAA,CAAgB,EAAA,EAAI,YAAA,EAAc;AAAA,IAC3C,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,KAAK,IAAA,CAAK,GAAA;AAAA,IACV,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,GAAA;AAAA,IACA,GAAA;AAAA,IACA,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,QAAQ,IAAA,CAAK;AAAA,GACd,CAAA;AACD,EAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAS,GAAI,UAAA;AAAA,IAC7B,IAAA,CAAK,KAAA;AAAA,IACL,IAAA,CAAK,GAAA;AAAA,IACL,CAAC,GAAG,KAAK,CAAA;AAAA,IACT,IAAA,CAAK,GAAA;AAAA,IACL,IAAA,CAAK;AAAA,GACP;AACA,EAAA,OAAO,EAAE,GAAG,EAAA,EAAI,QAAA,EAAU,QAAA,EAAS;AACrC;AA4BA,eAAsB,mBACpB,IAAA,EACmC;AACnC,EAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,IAAA,CAAK,cAAc,CAAA;AACrD,EAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,IAAA,MAAM,IAAI,YAAA;AAAA,MACR,CAAA,8BAAA,EAAiC,KAAK,cAAc,CAAA,CAAA;AAAA,MACpD,mBAAA,CAAoB,OAAO,MAAM;AAAA,KACnC;AAAA,EACF;AACA,EAAA,MAAM,EAAE,WAAA,EAAa,IAAA,EAAK,GAAI,MAAA,CAAO,KAAA;AAErC,EAAA,MAAM,WAA4B,EAAC;AACnC,EAAA,KAAA,MAAW,KAAA,IAAS,YAAY,OAAA,EAAS;AACvC,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,oBAAA,CAAqB,KAAA,CAAM,MAAA,EAAQ,IAAI,CAAA;AAAA,IAC1D,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,IAAI,YAAA,CAAa,CAAA,mBAAA,EAAsB,KAAA,CAAM,MAAM,CAAA,QAAA,CAAA,EAAY;AAAA,QACnE,EAAE,QAAA,EAAU,OAAA,EAAS,OAAO,SAAA,EAAW,OAAA,EAAU,IAAc,OAAA;AAAQ,OACxE,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,KAAK,QAAA,CAAS,EAAA;AAClB,IAAA,IAAI,KAAA,CAAM,OAAA,EAAS,EAAA,GAAK,EAAE,GAAG,EAAA,EAAI,MAAA,EAAQ,EAAE,GAAG,EAAA,CAAG,MAAA,EAAQ,OAAA,EAAS,KAAA,CAAM,SAAQ,EAAE;AAClF,IAAA,MAAM,EAAE,EAAA,EAAI,MAAA,EAAQ,cAAa,GAAI,MAAM,oBAAoB,EAAE,CAAA;AACjE,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,eAAA,CAAgB,QAAQ,YAAA,EAAc;AAAA,QACpC,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,KAAK,QAAA,CAAS,GAAA;AAAA,QACd,KAAK,QAAA,CAAS,GAAA;AAAA,QACd,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,SAAS,IAAA,CAAK;AAAA,OACf;AAAA,KACH;AAAA,EACF;AACA,EAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAS,GAAI,UAAA;AAAA,IAC7B,IAAA,CAAK,KAAA;AAAA,IACL,IAAA,CAAK,GAAA;AAAA,IACL,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AAAA,IAC3B,IAAA,CAAK,GAAA;AAAA,IACL,IAAA,CAAK;AAAA,GACP;AACA,EAAA,OAAO,EAAE,WAAA,EAAa,QAAA,EAAU,QAAA,EAAU,QAAA,EAAS;AACrD;AAgBA,SAAS,eAAe,KAAA,EAAuB;AAC7C,EAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAMW,OAAAA,CAAQ,CAAC,CAAC,CAAC,CAAA;AACjD,EAAA,KAAA,MAAW,SAAS,IAAA,EAAM;AACxB,IAAA,IAAI,CAAA,GAAI,KAAA;AACR,IAAA,OAAO,CAAA,IAAK,CAAA,KAAMA,OAAAA,CAAQ,CAAC,CAAA,EAAG;AAC5B,MAAA,IAAI;AACF,QAAA,IAAIC,WAAAA,CAAY,CAAC,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG;AAC/B,QAAA,MAAA,CAAO,GAAG,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,MAC5C,CAAA,CAAA,MAAQ;AACN,QAAA;AAAA,MACF;AACA,MAAA,CAAA,GAAID,QAAQ,CAAC,CAAA;AAAA,IACf;AAAA,EACF;AACF;AAQO,SAAS,UAAU,IAAA,EAAyC;AACjE,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA;AAC9B,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,aAAa,sBAAA,EAAwB;AAAA,MAC7C,EAAE,UAAU,OAAA,EAAS,KAAA,EAAO,aAAa,OAAA,EAAS,CAAA,sBAAA,EAAyB,IAAA,CAAK,GAAG,CAAA,CAAA;AAAG,KACvF,CAAA;AAAA,EACH;AACA,EAAA,MAAM,QAAQ,IAAA,CAAK,MAAA;AACnB,EAAA,MAAM,MAAM,IAAI,GAAA;AAAA,IAAA,CACb,KAAA,GACG,KAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,KAAA,IAAS,CAAA,CAAE,EAAA,CAAG,SAAS,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAC,CAAA,GACvE,IAAA,CAAK,SACP,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE;AAAA,GACnB;AACA,EAAA,IAAI,KAAA,IAAS,GAAA,CAAI,IAAA,KAAS,CAAA,EAAG;AAC3B,IAAA,MAAM,IAAI,YAAA,CAAa,CAAA,QAAA,EAAW,KAAK,CAAA,uBAAA,CAAA,EAA2B;AAAA,MAChE,EAAE,UAAU,OAAA,EAAS,KAAA,EAAO,aAAa,OAAA,EAAS,CAAA,oBAAA,EAAuB,KAAK,CAAA,CAAA,CAAA;AAAI,KACnF,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,CAAA,IAAK,KAAK,SAAA,EAAW;AAC9B,IAAA,IAAI,CAAC,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA,EAAG;AACxB,IAAA,IAAIhB,UAAAA,CAAW,CAAA,CAAE,IAAI,CAAA,EAAG;AACtB,MAAA,MAAA,CAAO,CAAA,CAAE,IAAA,EAAM,EAAE,KAAA,EAAO,MAAM,CAAA;AAC9B,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAI,CAAA;AAAA,IACrB;AAAA,EACF;AACA,EAAA,cAAA,CAAe,OAAO,CAAA;AAEtB,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AAC3D,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,MAAA,CAAOD,IAAAA,CAAK,KAAK,GAAA,EAAK,WAAW,GAAG,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,EACrD,CAAA,MAAO;AACL,IAAA,SAAA,CAAU,KAAK,GAAA,EAAK;AAAA,MAClB,GAAG,IAAA;AAAA,MACH,OAAA,EAAS,SAAA;AAAA,MACT,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,MAAM,CAAC;AAAA,KAC3D,CAAA;AAAA,EACH;AACA,EAAA,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,CAAC,GAAG,GAAG,CAAA,EAAE;AACtC;AAiBA,eAAsB,OAAO,IAAA,EAA6C;AACxE,EAAA,MAAM,UAAU,IAAA,CAAK,OAAA,IAAW,gBAAgB,IAAA,CAAK,KAAA,EAAO,KAAK,GAAG,CAAA;AACpE,EAAA,MAAM,IAAA,GAAO,SAAS,OAAO,CAAA;AAE7B,EAAA,MAAM,EAAE,EAAA,EAAI,YAAA,KAAiB,MAAM,YAAA,CAAa,KAAK,SAAS,CAAA;AAC9D,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,EAAA,EAAI,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AAC9F,EAAA,IAAI,MAAA,CAAO,YAAY,SAAA,EAAW;AAChC,IAAA,MAAM,IAAI,YAAA,CAAa,gBAAA,EAAkB,MAAA,CAAO,YAAY,MAAM,CAAA;AAAA,EACpE;AAGA,EAAA,MAAM,WAAW,IAAI,GAAA;AAAA,IAAA,CAClB,IAAA,EAAM,aAAa,EAAC,EAAG,OAAO,CAAC,CAAA,KAAM,EAAE,MAAA,KAAW,MAAA,CAAO,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,EAAE,IAAA,EAAM,CAAA,CAAE,IAAI,CAAC;AAAA,GAC3F;AACA,EAAA,MAAM,UAAU,kBAAA,CAAmB,MAAA,EAAQ,IAAA,CAAK,KAAA,EAAO,KAAK,GAAG,CAAA;AAC/D,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,EAAE,MAAA,EAAQ,QAAA,EAAS,IAAK,OAAA,EAAS;AAC1C,IAAA,IAAI,SAAS,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,KAAM,OAAO,IAAA,EAAM;AAC/C,IAAAM,SAAAA,CAAUW,QAAQ,MAAA,CAAO,IAAI,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACnD,IAAAJ,aAAAA,CAAc,MAAA,CAAO,IAAA,EAAM,QAAQ,CAAA;AACnC,IAAA,OAAA,CAAQ,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,EAAE,GAAA,EAAK,GAAA,KAAQ,MAAM,OAAA,CAAQ,KAAK,SAAS,CAAA;AACjD,EAAA,MAAM,QAAQ,cAAA,CAAe;AAAA,IAC3B,MAAA;AAAA,IACA,WAAW,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAAA,IACtC,YAAA;AAAA,IACA,GAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAAP,SAAAA,CAAU,OAAA,EAAS,EAAE,SAAA,EAAW,MAAM,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,IAAA,EAAM,CAAC,KAAK,CAAA,EAAG,IAAA,CAAK,GAAA,IAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,WAAA,EAAa,CAAA;AAC9E,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,OAAA,EAAS,QAAQ,CAAA;AAC5C,EAAA,OAAO,EAAE,EAAA,EAAI,MAAA,CAAO,EAAA,EAAI,QAAA,EAAU,UAAU,OAAA,EAAQ;AACtD;AC7eO,SAAS,mBAAmB,IAAA,EAAyC;AAC1E,EAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAc;AAC9B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,SAAA,EAAY,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,yBAAA,CAA2B,CAAA;AAAA,EAC5E;AACA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,IAAA,CAAK,KAAK,EAAE,SAAA,EAAW,IAAA,CAAK,SAAA,EAAW,CAAA;AAChF,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,MAAM,CAAA,GAAA,EAAM,IAAA,CAAK,QAAQ,MAAM,CAAA,gCAAA,EAAmC,IAAA,CAAK,GAAG,CAAA,CAAE,CAAA;AAAA,EACxF;AACA,EAAAA,UAAU,IAAA,CAAK,MAAA,EAAQ,EAAE,SAAA,EAAW,MAAM,CAAA;AAE1C,EAAA,IAAI,MAAA,CAAO,SAAS,aAAA,EAAe;AACjC,IAAA,MAAMa,aAAAA,GAAenB,IAAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,kBAAkB,CAAA;AACzD,IAAAa,aAAAA,CAAcM,aAAAA,EAAc,iBAAA,CAAkB,MAAA,CAAO,WAAW,CAAC,CAAA;AACjE,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,aAAA;AAAA,MACN,IAAA,EAAM,OAAO,WAAA,CAAY,IAAA;AAAA,MACzB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,YAAA,EAAAA,aAAAA;AAAA,MACA,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AAEA,EAAA,MAAM,YAAA,GAAenB,IAAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,WAAW,CAAA;AAClD,EAAAa,aAAAA,CAAc,YAAA,EAAc,iBAAA,CAAkB,MAAA,CAAO,MAAM,CAAC,CAAA;AAC5D,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,KAAA,EAAO;AAC5B,IAAA,MAAM,GAAA,GAAMb,IAAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,EAAE,OAAO,CAAA;AACvC,IAAAM,UAAUW,OAAAA,CAAQ,GAAG,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAC3C,IAAAJ,aAAAA;AAAA,MACE,GAAA;AAAA,MACA,OAAO,CAAA,CAAE,QAAA,KAAa,QAAA,GAAW,MAAA,CAAO,KAAK,CAAA,CAAE,QAAA,EAAU,MAAM,CAAA,GAAI,CAAA,CAAE;AAAA,KACvE;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,IAAA,EAAM,OAAO,MAAA,CAAO,IAAA;AAAA,IACpB,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,YAAA;AAAA,IACA,SAAA,EAAW,OAAO,KAAA,CAAM,MAAA;AAAA,IACxB,EAAA,EAAI,GAAG,MAAA,CAAO,MAAA,CAAO,MAAM,SAAS,CAAA,CAAA,EAAI,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAAA,GAC5D;AACF;;;AC7DO,IAAM,kBAAN,MAAsB;AAAA,EACV,QAAA,uBAAe,GAAA,EAA4B;AAAA,EAE5D,SAAS,OAAA,EAA+B;AACtC,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,OAAO,CAAA;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAI,MAAA,EAA4C;AAC9C,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAAA,EACjC;AAAA,EAEA,IAAI,MAAA,EAAyB;AAC3B,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAAA,EACjC;AAAA,EAEA,IAAI,OAAA,GAAoB;AACtB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA;AAAA,EACjC;AACF;AClBO,SAAS,eAAe,IAAA,EAAwB;AACrD,EAAA,MAAM,QAAQ,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,CAAA,CAAE,SAAS,CAAA,CAAA,EAAK,EAAE,MAAM,CAAA,CAAA,EAAK,EAAE,IAAI,CAAA,CAAE,EAAE,IAAA,EAAK;AACvF,EAAA,OAAOE,UAAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAO,MAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,MAAA,EAAO;AAC9D;AAGO,SAAS,mBAAA,GAAuE;AACrF,EAAA,OAAO,oBAAoB,SAAS,CAAA;AACtC;AAEO,SAAS,QAAA,CAAS,MAAgB,UAAA,EAA+B;AACtE,EAAA,OAAO,IAAA,CAAK,MAAM,cAAA,CAAe,IAAI,GAAG,UAAU,CAAA,CAAE,SAAS,QAAQ,CAAA;AACvE;AAEO,SAAS,mBAAA,CACd,IAAA,EACA,SAAA,EACA,SAAA,EACS;AACT,EAAA,IAAI;AACF,IAAA,OAAO,MAAA,CAAO,IAAA,EAAM,cAAA,CAAe,IAAI,CAAA,EAAG,WAAW,MAAA,CAAO,IAAA,CAAK,SAAA,EAAW,QAAQ,CAAC,CAAA;AAAA,EACvF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAaO,SAAS,eAAA,CACd,IAAA,EACA,SAAA,EACA,SAAA,EACc;AACd,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,KAAA,MAAW,CAAA,IAAK,KAAK,SAAA,EAAW;AAC9B,IAAA,IAAI,CAACd,UAAAA,CAAW,CAAA,CAAE,IAAI,CAAA,EAAG;AACvB,MAAA,QAAA,CAAS,IAAA,CAAK,EAAE,IAAI,CAAA;AACpB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAASc,UAAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAOD,YAAAA,CAAa,CAAA,CAAE,IAAI,CAAC,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAC7E,IAAA,IAAI,WAAW,CAAA,CAAE,IAAA,EAAM,QAAA,CAAS,IAAA,CAAK,EAAE,IAAI,CAAA;AAAA,EAC7C;AACA,EAAA,OAAO,EAAE,cAAA,EAAgB,mBAAA,CAAoB,MAAM,SAAA,EAAW,SAAS,GAAG,QAAA,EAAS;AACrF","file":"index.js","sourcesContent":["export type Severity = \"error\" | \"warning\" | \"info\";\n\nexport interface Diagnostic {\n severity: Severity;\n /** Path-precise location: \"components[1].mcp\", \"owner.namespace\", or a file path. */\n where: string;\n message: string;\n}\n\n/** Accumulates diagnostics during compile; fails closed when any error is present. */\nexport class Diagnostics {\n readonly items: Diagnostic[] = [];\n\n error(where: string, message: string): void {\n this.items.push({ severity: \"error\", where, message });\n }\n warn(where: string, message: string): void {\n this.items.push({ severity: \"warning\", where, message });\n }\n info(where: string, message: string): void {\n this.items.push({ severity: \"info\", where, message });\n }\n\n get hasErrors(): boolean {\n return this.items.some((d) => d.severity === \"error\");\n }\n\n get errors(): Diagnostic[] {\n return this.items.filter((d) => d.severity === \"error\");\n }\n}\n\nexport class CompileError extends Error {\n constructor(\n message: string,\n readonly diagnostics: Diagnostic[],\n ) {\n super(message);\n this.name = \"CompileError\";\n }\n}\n","/** One component identified for aliasing: its bare leaf name and full id. */\nexport interface AliasInput {\n id: string;\n leaf: string;\n}\n\nexport interface AliasResult {\n /** Bare leaf name -> fully-qualified id. */\n aliases: Record<string, string>;\n /** True same-scope collisions: one leaf claimed by multiple ids. */\n collisions: Array<{ leaf: string; ids: string[] }>;\n}\n\n/**\n * Bare name when unambiguous (spec §9.4). A leaf used by exactly one component\n * gets the bare alias; a leaf shared by several is surfaced as a collision for\n * the caller to resolve (prompt interactively, or error non-interactively).\n * Never silently last-wins.\n */\nexport function resolveAliases(components: AliasInput[]): AliasResult {\n const byLeaf = new Map<string, string[]>();\n for (const c of components) {\n const ids = byLeaf.get(c.leaf) ?? [];\n ids.push(c.id);\n byLeaf.set(c.leaf, ids);\n }\n\n const aliases: Record<string, string> = {};\n const collisions: AliasResult[\"collisions\"] = [];\n for (const [leaf, ids] of byLeaf) {\n if (ids.length === 1) aliases[leaf] = ids[0] as string;\n else collisions.push({ leaf, ids: [...ids].sort() });\n }\n return { aliases, collisions };\n}\n","import { existsSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { parseFrontmatter } from \"@michaelfromyeg/weft-adapter-kit\";\nimport { kindOf, refOf } from \"@michaelfromyeg/weft-schema\";\nimport type { Diagnostics } from \"./diagnostics\";\nimport type { FetchedPlugin } from \"./loader\";\n\n/**\n * Static validation (spec §9.1 step 3, the `valid` badge): every referenced file\n * exists, skill/agent frontmatter is well-formed, `server.json` parses, and\n * descriptions clear a basic quality bar. Errors fail the compile closed.\n */\nexport function validatePlugin(fb: FetchedPlugin, diags: Diagnostics): void {\n fb.plugin.components.forEach((component, i) => {\n const where = `components[${i}]`;\n const ref = refOf(component);\n const abs = join(fb.root, ref);\n if (!existsSync(abs)) {\n diags.error(where, `referenced path \"${ref}\" does not exist`);\n return;\n }\n\n switch (kindOf(component)) {\n case \"skill\":\n validateSkill(fb, ref, abs, where, diags);\n break;\n case \"mcp\":\n validateMcp(fb, ref, abs, where, diags);\n break;\n case \"agent\":\n validateMarkdownComponent(fb, ref, abs, where, diags);\n break;\n default:\n // command / hook / passthrough: existence is the only static gate.\n break;\n }\n });\n}\n\nfunction validateSkill(\n fb: FetchedPlugin,\n ref: string,\n abs: string,\n where: string,\n diags: Diagnostics,\n): void {\n if (!statSync(abs).isDirectory()) {\n diags.error(where, `skill \"${ref}\" must be a directory containing SKILL.md`);\n return;\n }\n const skillMd = join(abs, \"SKILL.md\");\n if (!existsSync(skillMd)) {\n diags.error(where, `skill \"${ref}\" is missing SKILL.md`);\n return;\n }\n const { data } = parseFrontmatter(fb.read(join(ref, \"SKILL.md\")).toString(\"utf8\"));\n if (!data.name) diags.error(`${where}.skill`, \"SKILL.md frontmatter is missing `name`\");\n checkDescription(`${where}.skill`, data.description, diags);\n}\n\nfunction validateMcp(\n fb: FetchedPlugin,\n ref: string,\n abs: string,\n where: string,\n diags: Diagnostics,\n): void {\n if (!statSync(abs).isDirectory()) {\n diags.error(where, `mcp \"${ref}\" must be a directory containing server.json`);\n return;\n }\n const serverJsonPath = join(abs, \"server.json\");\n if (!existsSync(serverJsonPath)) {\n diags.error(where, `mcp \"${ref}\" is missing server.json`);\n return;\n }\n let server: Record<string, unknown>;\n try {\n server = JSON.parse(fb.read(join(ref, \"server.json\")).toString(\"utf8\"));\n } catch (err) {\n diags.error(`${where}.mcp`, `server.json is not valid JSON: ${(err as Error).message}`);\n return;\n }\n if (!server.name) diags.error(`${where}.mcp`, \"server.json is missing `name`\");\n const hasRunnable = server.packages || server.remotes || server.command;\n if (!hasRunnable) {\n diags.warn(`${where}.mcp`, \"server.json declares no `packages`, `remotes`, or `command`\");\n }\n checkDescription(`${where}.mcp`, server.description, diags);\n}\n\nfunction validateMarkdownComponent(\n fb: FetchedPlugin,\n ref: string,\n abs: string,\n where: string,\n diags: Diagnostics,\n): void {\n if (statSync(abs).isDirectory()) return; // agent-as-dir: defer detailed checks\n const { data } = parseFrontmatter(fb.read(ref).toString(\"utf8\"));\n if (!data.name) diags.warn(`${where}.agent`, \"agent frontmatter is missing `name`\");\n checkDescription(`${where}.agent`, data.description, diags);\n}\n\nfunction checkDescription(where: string, description: unknown, diags: Diagnostics): void {\n if (!description) {\n diags.error(where, \"missing `description` (required for discovery + the tested badge)\");\n return;\n }\n if (String(description).trim().length < 16) {\n diags.warn(where, \"description is very short; harnesses route on it -- make it specific\");\n }\n}\n","import semver from \"semver\";\n\n/** The Weft/CLI version (versioning axis 2, spec §5). */\nexport const WEFT_VERSION = \"1.3.0\";\n\n/**\n * Check a plugin's `weft_min_version` against the running Weft. Returns an error\n * message when unmet, or null when satisfied / unspecified.\n */\nexport function checkMinVersion(min: string | undefined): string | null {\n if (!min) return null;\n const cleaned = semver.valid(semver.coerce(min) ?? min);\n if (!cleaned) return `weft_min_version \"${min}\" is not a valid semver`;\n if (semver.lt(WEFT_VERSION, cleaned)) {\n return `plugin requires Weft >= ${min}, but this is ${WEFT_VERSION}`;\n }\n return null;\n}\n","import type {\n CompiledArtifact,\n HarnessAdapter,\n PluginCtx,\n ResolvedMarketplace,\n} from \"@michaelfromyeg/weft-adapter-kit\";\nimport {\n ALL_TARGETS,\n type Component,\n type ComponentKind,\n fqid,\n kindOf,\n leafNameOf,\n type Plugin,\n type Target,\n targetsOf,\n} from \"@michaelfromyeg/weft-schema\";\nimport { Diagnostics } from \"./diagnostics\";\nimport type { FetchedPlugin } from \"./loader\";\nimport { resolveAliases } from \"./namespace\";\nimport type { AdapterRegistry } from \"./registry\";\nimport { validatePlugin } from \"./validate\";\nimport { checkMinVersion } from \"./version\";\n\n/** An emitted artifact tagged with the canonical component it came from. */\nexport interface TaggedArtifact {\n componentId: string;\n artifact: CompiledArtifact;\n}\n\n/** Everything one adapter produced for one plugin. */\nexport interface TargetOutput {\n target: Target;\n adapter: HarnessAdapter;\n /** Plugin-root-relative artifacts: components + the plugin manifest. */\n artifacts: TaggedArtifact[];\n}\n\nexport interface CompileResult {\n fb: FetchedPlugin;\n /** Plugin id: `{namespace}/{name}`. */\n id: string;\n /** The components actually compiled (the piecemeal selection, or all). */\n components: ResolvedComponent[];\n aliases: Record<string, string>;\n diagnostics: Diagnostics;\n targets: TargetOutput[];\n}\n\nexport interface CompileOptions {\n registry: AdapterRegistry;\n /** Restrict to these targets; default = every target with a registered adapter. */\n targets?: Target[];\n /** Piecemeal: include only these component leaf names; default = all (spec §9.2). */\n only?: string[];\n}\n\n/** A synthetic one-entry marketplace wrapping a single plugin (spec §9.1 build). */\nexport function synthMarketplace(plugin: Plugin): ResolvedMarketplace {\n return {\n name: plugin.name,\n owner: plugin.owner,\n ...(plugin.description ? { description: plugin.description } : {}),\n entries: [\n {\n name: plugin.name,\n source: `./plugins/${plugin.name}`,\n ...(plugin.description ? { description: plugin.description } : {}),\n version: plugin.version,\n },\n ],\n };\n}\n\nexport interface ResolvedComponent {\n id: string;\n leaf: string;\n kind: ComponentKind;\n component: Component;\n}\n\nexport interface StaticPass {\n id: string;\n diagnostics: Diagnostics;\n aliases: Record<string, string>;\n resolved: ResolvedComponent[];\n}\n\n/**\n * Steps 1-4 of the pipeline shared by `compile` and `lint`: min-version,\n * static validation, fully-qualified ids, and alias resolution. No adapters run,\n * so it is the deterministic \"is this plugin valid?\" pass behind the valid badge.\n */\nexport function staticPass(fb: FetchedPlugin): StaticPass {\n const diagnostics = new Diagnostics();\n const { plugin } = fb;\n const id = `${plugin.owner.namespace}/${plugin.name}`;\n\n const minErr = checkMinVersion(plugin.weft_min_version);\n if (minErr) diagnostics.error(\"weft_min_version\", minErr);\n\n validatePlugin(fb, diagnostics);\n\n const resolved: ResolvedComponent[] = plugin.components.map((component) => ({\n id: fqid(plugin.owner.namespace, plugin.name, leafNameOf(component)),\n leaf: leafNameOf(component),\n kind: kindOf(component),\n component,\n }));\n\n const { aliases, collisions } = resolveAliases(resolved);\n for (const c of collisions) {\n diagnostics.error(\n `components.${c.leaf}`,\n `ambiguous component name \"${c.leaf}\": ${c.ids.join(\" vs \")}; qualify or choose which keeps the bare alias`,\n );\n }\n\n return { id, diagnostics, aliases, resolved };\n}\n\n/**\n * Steps 1-5 of the compile pipeline (spec §9.1): load is done by the caller;\n * here we enforce min-version, validate statically, resolve aliases, and run each\n * adapter's transform + emitManifest. Catalog emission (a marketplace concern) and\n * placement are separate so `build` can inspect without installing and `install`\n * can pull components piecemeal.\n *\n * Never throws on plugin problems -- it accumulates diagnostics so the caller can\n * render them. `build`/`install` fail closed when `diagnostics.hasErrors`.\n */\nexport function compile(fb: FetchedPlugin, opts: CompileOptions): CompileResult {\n const { plugin } = fb;\n const pass = staticPass(fb);\n const { id, diagnostics } = pass;\n\n // Piecemeal selection (spec §9.2): include only the requested component leaves.\n const onlySet = opts.only && opts.only.length > 0 ? new Set(opts.only) : null;\n if (onlySet) {\n for (const leaf of onlySet) {\n if (!pass.resolved.some((rc) => rc.leaf === leaf)) {\n diagnostics.error(\n \"only\",\n `component \"${leaf}\" not found; available: ${pass.resolved.map((r) => r.leaf).join(\", \")}`,\n );\n }\n }\n }\n const selected = onlySet ? pass.resolved.filter((rc) => onlySet.has(rc.leaf)) : pass.resolved;\n const effectivePlugin: Plugin = onlySet\n ? { ...plugin, components: selected.map((rc) => rc.component) }\n : plugin;\n const aliases = onlySet\n ? Object.fromEntries(\n Object.entries(pass.aliases).filter(([, cid]) => selected.some((rc) => rc.id === cid)),\n )\n : pass.aliases;\n const reverseAlias = new Map(Object.entries(aliases).map(([leaf, cid]) => [cid, leaf]));\n\n const requested = opts.targets ?? opts.registry.targets;\n const targets: TargetOutput[] = [];\n\n for (const target of requested) {\n const adapter = opts.registry.get(target);\n if (!adapter) {\n if (opts.targets) diagnostics.warn(target, `no adapter registered for target \"${target}\"`);\n continue;\n }\n\n const ctx: PluginCtx = {\n plugin: effectivePlugin,\n read: fb.read,\n list: fb.list,\n aliasFor: (componentId) => reverseAlias.get(componentId) ?? componentId,\n };\n\n const pluginArtifacts: TaggedArtifact[] = [];\n for (const rc of selected) {\n if (!targetsOf(rc.component, ALL_TARGETS).includes(target)) continue;\n for (const a of adapter.transform(rc.component, ctx)) {\n pluginArtifacts.push({ componentId: rc.id, artifact: a });\n }\n }\n for (const a of adapter.emitManifest(effectivePlugin, ctx)) {\n pluginArtifacts.push({ componentId: id, artifact: a });\n }\n\n targets.push({ target, adapter, artifacts: pluginArtifacts });\n }\n\n return { fb, id, components: selected, aliases, diagnostics, targets };\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Component, Plugin } from \"@michaelfromyeg/weft-schema\";\n\nexport interface ConfigResolution {\n env: string;\n /** Where the value came from -- never the value itself. */\n source: \"env\" | \"default\" | \"missing\";\n secret: boolean;\n}\n\nexport interface SecretsResult {\n resolved: ConfigResolution[];\n /** Path to the gitignored local config the values were written to (or null). */\n path: string | null;\n}\n\nfunction configVarsOf(component: Component) {\n return \"config\" in component && component.config ? component.config : [];\n}\n\n/**\n * Resolve declared `ConfigVar`s (spec §9.1 step 7, §11 rule 4: declare-not-store).\n * Values come from the environment or a declared default and are written ONLY to a\n * local, gitignored config -- never to the lockfile, the plugin, the index, or\n * telemetry. The returned summary records where each value came from, not the value.\n */\nexport function resolveConfig(\n plugin: Plugin,\n cwd: string,\n env: Record<string, string | undefined> = process.env,\n): SecretsResult {\n const resolved: ConfigResolution[] = [];\n const values: Record<string, string> = {};\n\n for (const component of plugin.components) {\n for (const v of configVarsOf(component)) {\n const fromEnv = env[v.env];\n if (fromEnv !== undefined) {\n values[v.env] = fromEnv;\n resolved.push({ env: v.env, source: \"env\", secret: v.secret });\n } else if (v.default === undefined) {\n resolved.push({ env: v.env, source: \"missing\", secret: v.secret });\n } else {\n values[v.env] = v.default;\n resolved.push({ env: v.env, source: \"default\", secret: v.secret });\n }\n }\n }\n\n if (Object.keys(values).length === 0) return { resolved, path: null };\n\n const dir = join(cwd, \".weft\");\n mkdirSync(dir, { recursive: true });\n // Gitignore the whole local-config dir so resolved values never get committed.\n writeFileSync(join(dir, \".gitignore\"), \"*\\n\");\n const path = join(dir, \"secrets.local.json\");\n writeFileSync(path, `${JSON.stringify(values, null, 2)}\\n`);\n return { resolved, path };\n}\n","import { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\nimport {\n loadManifest,\n loadPlugin,\n Marketplace,\n type ParseResult,\n type Plugin,\n} from \"@michaelfromyeg/weft-schema\";\n\n/** A plugin whose files are available on disk under `root`. */\nexport interface FetchedPlugin {\n plugin: Plugin;\n root: string;\n manifestPath: string;\n /** Read a file from the plugin, relative to `root`. */\n read(relPath: string): Buffer;\n /** Recursively list files under a plugin dir, as paths relative to `root` (sorted). */\n list(relDir: string): string[];\n}\n\n/** A loaded marketplace manifest and its directory. */\nexport interface FetchedMarketplace {\n marketplace: Marketplace;\n root: string;\n manifestPath: string;\n}\n\n/** Recursively collect file paths under `dir`, relative to `root`. Deterministic order. */\nfunction walkFiles(root: string, dir: string): string[] {\n if (!(existsSync(dir) && statSync(dir).isDirectory())) return [];\n const out: string[] = [];\n for (const entry of readdirSync(dir).sort()) {\n const abs = join(dir, entry);\n if (statSync(abs).isDirectory()) out.push(...walkFiles(root, abs));\n else out.push(relative(root, abs));\n }\n return out;\n}\n\nconst MANIFEST_NAMES = [\"weft.yaml\", \"weft.yml\", \"weft.json5\", \"weft.json\"];\n\n/** Build `read`/`list` accessors rooted at a directory (used for merged plugins too). */\nexport function fileAccessors(root: string): Pick<FetchedPlugin, \"read\" | \"list\"> {\n return {\n read: (relPath: string) => readFileSync(join(root, relPath)),\n list: (relDir: string) => walkFiles(root, join(root, relDir)),\n };\n}\n\n/** Load and validate the plugin manifest in `dir`, exposing its files for adapters. */\nexport function loadPluginDir(dir: string): ParseResult<FetchedPlugin> {\n const manifestPath = MANIFEST_NAMES.map((n) => join(dir, n)).find((p) => existsSync(p));\n if (!manifestPath) {\n return {\n ok: false,\n issues: [\n { path: dir, message: `no plugin manifest found (one of: ${MANIFEST_NAMES.join(\", \")})` },\n ],\n };\n }\n\n const text = readFileSync(manifestPath, \"utf8\");\n const parsed = loadPlugin(text, { filename: manifestPath });\n if (!parsed.ok) return parsed;\n\n return {\n ok: true,\n value: { plugin: parsed.value, root: dir, manifestPath, ...fileAccessors(dir) },\n };\n}\n\nconst MARKETPLACE_NAMES = [\n \"marketplace.yaml\",\n \"marketplace.yml\",\n \"marketplace.json5\",\n \"marketplace.json\",\n];\n\n/** True when `dir` is a marketplace (a catalog of plugins) rather than a plugin. */\nexport function hasMarketplaceManifest(dir: string): boolean {\n return MARKETPLACE_NAMES.some((n) => existsSync(join(dir, n)));\n}\n\n/** Load and validate the marketplace manifest in `dir`. */\nexport function loadMarketplaceDir(dir: string): ParseResult<FetchedMarketplace> {\n const manifestPath = MARKETPLACE_NAMES.map((n) => join(dir, n)).find((p) => existsSync(p));\n if (!manifestPath) {\n return {\n ok: false,\n issues: [\n {\n path: dir,\n message: `no marketplace manifest found (one of: ${MARKETPLACE_NAMES.join(\", \")})`,\n },\n ],\n };\n }\n const text = readFileSync(manifestPath, \"utf8\");\n const parsed = loadManifest(Marketplace, text, { filename: manifestPath });\n if (!parsed.ok) return parsed;\n return { ok: true, value: { marketplace: parsed.value, root: dir, manifestPath } };\n}\n","import { createHash } from \"node:crypto\";\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { isAbsolute, join, resolve as resolvePath } from \"node:path\";\nimport type { Dependency } from \"@michaelfromyeg/weft-schema\";\nimport { execa } from \"execa\";\nimport { type FetchedPlugin, loadPluginDir } from \"./loader\";\n\nexport type Source =\n | { kind: \"local\"; path: string }\n | { kind: \"github\"; repo: string; ref?: string; subdir?: string }\n | { kind: \"git\"; url: string; ref?: string; subdir?: string }\n | { kind: \"npm\"; pkg: string; version?: string; subdir?: string };\n\n/** Where cloned/fetched remote plugins are cached. */\nexport const CACHE_DIR = join(homedir(), \".weft\", \"cache\");\n\n/**\n * Split a remote ref into its base, an optional `//subdir` (a plugin/marketplace\n * in a repo subdirectory), and an optional `#ref` (branch/tag/SHA). The leading\n * protocol's own `//` (e.g. `https://`) is ignored when finding the subdir.\n */\nfunction splitRefAndSubdir(s: string): { base: string; subdir?: string; ref?: string } {\n const hash = s.indexOf(\"#\");\n const ref = hash >= 0 ? s.slice(hash + 1) : undefined;\n const head = hash >= 0 ? s.slice(0, hash) : s;\n const proto = head.match(/^[a-z+]+:\\/\\//i)?.[0] ?? \"\";\n const rest = head.slice(proto.length);\n const slash = rest.indexOf(\"//\");\n if (slash === -1) return { base: head, ...(ref ? { ref } : {}) };\n return {\n base: proto + rest.slice(0, slash),\n subdir: rest.slice(slash + 2),\n ...(ref ? { ref } : {}),\n };\n}\n\n/** Parse a plugin/dependency source string into a structured form (spec §6.1). */\nexport function parseSource(src: string): Source {\n if (src.startsWith(\"./\") || src.startsWith(\"../\") || isAbsolute(src)) {\n return { kind: \"local\", path: src };\n }\n if (src.startsWith(\"npm:\")) {\n const raw = src.slice(\"npm:\".length);\n const slash = raw.indexOf(\"//\");\n const subdir = slash >= 0 ? raw.slice(slash + 2) : undefined;\n const spec = slash >= 0 ? raw.slice(0, slash) : raw;\n // lastIndexOf(\"@\") > 0 finds a version while leaving a scoped name's leading @.\n const at = spec.lastIndexOf(\"@\");\n const pkg = at > 0 ? spec.slice(0, at) : spec;\n const version = at > 0 ? spec.slice(at + 1) : undefined;\n return { kind: \"npm\", pkg, ...(version ? { version } : {}), ...(subdir ? { subdir } : {}) };\n }\n if (src.startsWith(\"github:\")) {\n const { base, subdir, ref } = splitRefAndSubdir(src.slice(\"github:\".length));\n return { kind: \"github\", repo: base, ...(ref ? { ref } : {}), ...(subdir ? { subdir } : {}) };\n }\n if (\n src.startsWith(\"git@\") ||\n src.startsWith(\"git+\") ||\n src.startsWith(\"file://\") ||\n /^https?:\\/\\//.test(src)\n ) {\n const { base, subdir, ref } = splitRefAndSubdir(src.replace(/^git\\+/, \"\"));\n return { kind: \"git\", url: base, ...(ref ? { ref } : {}), ...(subdir ? { subdir } : {}) };\n }\n // Bare `owner/repo` (optionally `//subdir` / `#ref`) is GitHub shorthand.\n const { base, subdir, ref } = splitRefAndSubdir(src);\n if (/^[\\w.-]+\\/[\\w.-]+$/.test(base)) {\n return { kind: \"github\", repo: base, ...(ref ? { ref } : {}), ...(subdir ? { subdir } : {}) };\n }\n return { kind: \"local\", path: src };\n}\n\nfunction cacheDirFor(key: string): string {\n return join(CACHE_DIR, createHash(\"sha256\").update(key).digest(\"hex\").slice(0, 16));\n}\n\nconst SHA_RE = /^[0-9a-f]{40}$/i;\n\n/** Clone (or refresh) a git repo into the cache and check out `ref`; return dir + SHA. */\nasync function gitFetch(\n url: string,\n ref: string | undefined,\n): Promise<{ dir: string; sha: string }> {\n mkdirSync(CACHE_DIR, { recursive: true });\n const dir = cacheDirFor(`${url}@${ref ?? \"default\"}`);\n const isSha = ref !== undefined && SHA_RE.test(ref);\n\n if (existsSync(join(dir, \".git\"))) {\n await execa(\"git\", [\"fetch\", \"origin\", ...(ref ? [ref] : [])], { cwd: dir });\n await execa(\"git\", [\"checkout\", ref ?? \"FETCH_HEAD\"], { cwd: dir, reject: false });\n } else if (isSha) {\n await execa(\"git\", [\"clone\", url, dir]);\n await execa(\"git\", [\"checkout\", ref as string], { cwd: dir });\n } else {\n const branchArgs = ref ? [\"--branch\", ref] : [];\n await execa(\"git\", [\"clone\", \"--depth\", \"1\", ...branchArgs, url, dir]);\n }\n const sha = (await execa(\"git\", [\"rev-parse\", \"HEAD\"], { cwd: dir })).stdout.trim();\n return { dir, sha };\n}\n\n/** A fetched plugin plus the ref/SHA it resolved to (for the lockfile). */\nexport interface ResolvedPlugin {\n fb: FetchedPlugin;\n ref: string;\n sha: string;\n}\n\n/**\n * Download an npm package tarball into the cache and extract it (no dependency\n * install); return the extracted package dir and its resolved version. A weft\n * plugin/marketplace published to npm is just its files inside the tarball.\n */\nasync function npmFetch(\n pkg: string,\n version: string | undefined,\n): Promise<{ dir: string; sha: string }> {\n const spec = version ? `${pkg}@${version}` : pkg;\n const dir = cacheDirFor(`npm:${spec}`);\n const pkgDir = join(dir, \"package\");\n // A pinned version is immutable, so reuse a prior extraction; an unpinned\n // (latest) spec always re-fetches to pick up a newer publish.\n if (version && existsSync(pkgDir)) return { dir: pkgDir, sha: version };\n\n mkdirSync(dir, { recursive: true });\n // `npm pack` fetches just the tarball from the registry; --json reports it.\n const { stdout } = await execa(\"npm\", [\"pack\", spec, \"--pack-destination\", dir, \"--json\"], {\n cwd: dir,\n });\n const meta = JSON.parse(stdout) as Array<{ filename: string; version?: string }>;\n const first = meta[0];\n if (!first) throw new Error(`npm pack produced no tarball for \"${spec}\"`);\n // The tarball extracts its contents under a top-level `package/` directory.\n await execa(\"tar\", [\"-xzf\", join(dir, first.filename), \"-C\", dir]);\n return { dir: pkgDir, sha: first.version ?? version ?? \"\" };\n}\n\n/** A resolved source directory on disk, plus the ref/SHA it came from. */\nexport interface ResolvedSource {\n dir: string;\n ref: string;\n sha: string;\n}\n\ntype RemoteSource = Exclude<Source, { kind: \"local\" }>;\n\n/**\n * Fetch a remote source into the cache (git clone or `npm pack`) and apply a\n * trailing `//subdir`. The single place that knows the remote-fetch matrix, so\n * both the plugin loader and the bare-dir resolver build on it.\n */\nasync function fetchSourceDir(src: RemoteSource): Promise<ResolvedSource> {\n if (src.kind === \"github\" || src.kind === \"git\") {\n const url = src.kind === \"github\" ? `https://github.com/${src.repo}.git` : src.url;\n const { dir, sha } = await gitFetch(url, src.ref);\n return { dir: src.subdir ? join(dir, src.subdir) : dir, ref: src.ref ?? \"default\", sha };\n }\n const { dir, sha } = await npmFetch(src.pkg, src.version);\n return { dir: src.subdir ? join(dir, src.subdir) : dir, ref: src.version ?? \"latest\", sha };\n}\n\n/**\n * Resolve a plugin source to a fetched plugin on disk (spec §5, §9.1 step 2).\n * Local `./path` sources resolve relative to `fromRoot`; `github:`/git sources are\n * git-cloned and pinned to a SHA; `npm:` packages are fetched via `npm pack`. A\n * trailing `//subdir` selects a plugin nested in the source.\n */\nexport async function resolvePluginRefFull(\n source: string,\n fromRoot: string,\n): Promise<ResolvedPlugin> {\n const src = parseSource(source);\n if (src.kind === \"local\") {\n const dir = isAbsolute(src.path) ? src.path : resolvePath(fromRoot, src.path);\n return { fb: loadOrThrow(dir, source), ref: \"local\", sha: \"\" };\n }\n const { dir, ref, sha } = await fetchSourceDir(src);\n return { fb: loadOrThrow(dir, source), ref, sha };\n}\n\n/**\n * Resolve an install/build target (a plugin OR a marketplace) to a directory on\n * disk: a local path is returned as-is; a remote ref (optionally with a `//subdir`)\n * is fetched into the cache. Unlike `resolvePluginRefFull` this does not load a\n * plugin, so it works for a `marketplace.yaml` target too.\n */\nexport async function resolveSourceDir(source: string, fromRoot: string): Promise<ResolvedSource> {\n // A path that exists on disk is always local; this avoids misreading a real\n // local dir like \"a/b\" as the GitHub shorthand \"owner/repo\".\n const localGuess = isAbsolute(source) ? source : resolvePath(fromRoot, source);\n if (existsSync(localGuess)) return { dir: localGuess, ref: \"local\", sha: \"\" };\n\n const src = parseSource(source);\n if (src.kind === \"local\") return { dir: localGuess, ref: \"local\", sha: \"\" };\n return await fetchSourceDir(src);\n}\n\n/** Convenience: resolve and return only the fetched plugin. */\nexport async function resolvePluginRef(source: string, fromRoot: string): Promise<FetchedPlugin> {\n return (await resolvePluginRefFull(source, fromRoot)).fb;\n}\n\nfunction loadOrThrow(dir: string, source: string): FetchedPlugin {\n const loaded = loadPluginDir(dir);\n if (!loaded.ok) {\n throw new Error(\n `failed to load \"${source}\":\\n${loaded.issues.map((i) => ` ${i.path}: ${i.message}`).join(\"\\n\")}`,\n );\n }\n return loaded.value;\n}\n\n/** Resolve a `depends` entry to a fetched plugin (relative to the depending plugin root). */\nexport function resolveDependency(dep: Dependency, fromRoot: string): Promise<ResolvedPlugin> {\n return resolvePluginRefFull(dep.plugin, fromRoot);\n}\n\n/** Best-effort git ref + SHA for the lockfile. Returns sentinels outside a repo. */\nexport async function gitInfo(dir: string): Promise<{ ref: string; sha: string }> {\n try {\n const sha = (await execa(\"git\", [\"rev-parse\", \"HEAD\"], { cwd: dir })).stdout.trim();\n let ref = \"HEAD\";\n try {\n ref = (\n await execa(\"git\", [\"describe\", \"--tags\", \"--exact-match\"], { cwd: dir })\n ).stdout.trim();\n } catch {\n try {\n ref = (\n await execa(\"git\", [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], { cwd: dir })\n ).stdout.trim();\n } catch {\n /* keep HEAD */\n }\n }\n return { ref, sha };\n } catch {\n return { ref: \"local\", sha: \"\" };\n }\n}\n","import { cpSync, mkdtempSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport {\n type Component,\n type ComponentKind,\n kindOf,\n leafNameOf,\n refOf,\n} from \"@michaelfromyeg/weft-schema\";\nimport { type FetchedPlugin, fileAccessors } from \"./loader\";\nimport { resolveDependency } from \"./resolve\";\n\nconst KIND_KEY: Record<ComponentKind, string> = {\n skill: \"skill\",\n mcp: \"mcp\",\n agent: \"agent\",\n hook: \"hook\",\n command: \"command\",\n passthrough: \"passthrough\",\n};\n\nfunction rewriteRef(c: Component, newRef: string): Component {\n return { ...c, [KIND_KEY[kindOf(c)]]: newRef } as Component;\n}\n\nconst skipGit = (src: string): boolean => !/\\/\\.git(\\/|$)/.test(src);\n\nexport interface DependencyRecord {\n id: string;\n range: string;\n resolvedSha: string;\n}\n\nexport interface ResolvedDeps {\n fb: FetchedPlugin;\n dependencies: DependencyRecord[];\n}\n\n/**\n * Resolve a plugin's `depends` (spec §9.1 step 2). Each dependency is fetched\n * (locally or git-cloned and pinned to a SHA), then its selected components are\n * vendored into a merged temp tree under `_deps/<name>/` and registered under the\n * consuming plugin's namespace. Piecemeal `components:[…]` selects which to\n * register, but the whole dep tree is copied so shared assets travel (drift-aware).\n * Direct cycles are detected by id.\n */\nexport async function resolveDependencies(\n fb: FetchedPlugin,\n tmpRoot?: string,\n): Promise<ResolvedDeps> {\n const depends = fb.plugin.depends ?? [];\n if (depends.length === 0) return { fb, dependencies: [] };\n\n const merged = mkdtempSync(join(tmpRoot ?? tmpdir(), \"weft-merged-\"));\n cpSync(fb.root, merged, { recursive: true, filter: skipGit });\n\n const components: Component[] = [...fb.plugin.components];\n const dependencies: DependencyRecord[] = [];\n const seen = new Set<string>([`${fb.plugin.owner.namespace}/${fb.plugin.name}`]);\n\n for (const dep of depends) {\n const resolved = await resolveDependency(dep, fb.root);\n const dp = resolved.fb.plugin;\n const depId = `${dp.owner.namespace}/${dp.name}`;\n if (seen.has(depId)) throw new Error(`dependency cycle detected at ${depId}`);\n seen.add(depId);\n\n const want = dep.components;\n if (want) {\n const missing = want.filter((leaf) => !dp.components.some((c) => leafNameOf(c) === leaf));\n if (missing.length > 0) {\n throw new Error(`dependency ${depId} has no component(s): ${missing.join(\", \")}`);\n }\n }\n const selected = dp.components.filter((c) => !want || want.includes(leafNameOf(c)));\n\n const destBase = join(\"_deps\", dp.name);\n cpSync(resolved.fb.root, join(merged, destBase), { recursive: true, filter: skipGit });\n for (const c of selected) components.push(rewriteRef(c, join(destBase, refOf(c))));\n\n dependencies.push({ id: depId, range: dep.version ?? \"*\", resolvedSha: resolved.sha });\n }\n\n const plugin = { ...fb.plugin, components };\n const mergedFb: FetchedPlugin = {\n plugin,\n root: merged,\n manifestPath: join(merged, \"weft.yaml\"),\n ...fileAccessors(merged),\n };\n return { fb: mergedFb, dependencies };\n}\n","import { readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport {\n type ArtifactRecord,\n Lockfile,\n type PluginLock,\n type Scope,\n validate,\n} from \"@michaelfromyeg/weft-schema\";\nimport type { CompileResult } from \"./compile\";\nimport { WEFT_VERSION } from \"./version\";\n\n/** One plugin's contribution to a lockfile: its record, placed artifacts, and adapters used. */\nexport interface LockEntry {\n pluginLock: PluginLock;\n artifacts: ArtifactRecord[];\n adapters: Lockfile[\"adapters\"];\n}\n\nexport interface LockEntryInput {\n result: CompileResult;\n artifacts: ArtifactRecord[];\n ref: string;\n sha: string;\n dependencies?: PluginLock[\"dependencies\"];\n}\n\n/** Build one plugin's lock entry from its compiled result and placement (spec §6.3). */\nexport function buildLockEntry(input: LockEntryInput): LockEntry {\n const adapters: Lockfile[\"adapters\"] = {};\n for (const t of input.result.targets) {\n adapters[t.target] = { version: t.adapter.version, targetSchema: t.adapter.targetSchema };\n }\n return {\n pluginLock: {\n id: input.result.id,\n version: input.result.fb.plugin.version,\n ref: input.ref,\n sha: input.sha,\n dependencies: input.dependencies ?? [],\n aliases: input.result.aliases,\n },\n artifacts: input.artifacts,\n adapters,\n };\n}\n\n/**\n * Merge install entries into an existing target lockfile (or a fresh one),\n * upserting by plugin id: a re-installed plugin replaces its prior record and\n * artifacts, leaving every other installed plugin in the ledger untouched.\n */\nexport function mergeLock(\n existing: Lockfile | null,\n entries: LockEntry[],\n generatedAt: string,\n): Lockfile {\n const replacing = new Set(entries.map((e) => e.pluginLock.id));\n const plugins = (existing?.plugins ?? []).filter((p) => !replacing.has(p.id));\n const artifacts = (existing?.artifacts ?? []).filter((a) => !replacing.has(a.plugin));\n const adapters: Lockfile[\"adapters\"] = { ...(existing?.adapters ?? {}) };\n for (const e of entries) {\n plugins.push(e.pluginLock);\n artifacts.push(...e.artifacts);\n Object.assign(adapters, e.adapters);\n }\n return { weftVersion: WEFT_VERSION, generatedAt, plugins, artifacts, adapters };\n}\n\n/**\n * Where a target's `weft.lock` lives: the project root for project scope, a\n * per-user dir for user scope. The lock travels with the install target, not the\n * (possibly remote, read-only) source.\n */\nexport function lockDirForScope(scope: Scope, cwd: string): string {\n return scope === \"user\" ? join(homedir(), \".weft\") : cwd;\n}\n\nexport function serializeLock(lock: Lockfile): string {\n return `${JSON.stringify(lock, null, 2)}\\n`;\n}\n\nexport function writeLock(dir: string, lock: Lockfile): string {\n const p = join(dir, \"weft.lock\");\n writeFileSync(p, serializeLock(lock));\n return p;\n}\n\n/** Read and validate an existing lockfile; null when absent or malformed. */\nexport function readLock(dir: string): Lockfile | null {\n try {\n const text = readFileSync(join(dir, \"weft.lock\"), \"utf8\");\n const res = validate(Lockfile, JSON.parse(text));\n return res.ok ? res.value : null;\n } catch {\n return null;\n }\n}\n","import type { Badge } from \"@michaelfromyeg/weft-schema\";\n\n/**\n * A managed-mode install policy (spec §11 rule 5): the same install mechanism as\n * a solo dev, restricted by scope + policy. An enterprise pins an allowlist of\n * namespaces and/or required badges; only scope and policy differ, never mechanism.\n */\nexport interface ManagedPolicy {\n /** Only these reverse-DNS namespaces may be installed. */\n allowNamespaces?: string[];\n /** Each installed plugin must carry all of these badges. */\n requireBadges?: Badge[];\n}\n\nexport interface PolicyContext {\n namespace: string;\n badges?: Badge[];\n}\n\n/** A blocking reason when the policy forbids the install, or null when permitted. */\nexport function checkManagedPolicy(\n policy: ManagedPolicy | undefined,\n ctx: PolicyContext,\n): string | null {\n if (!policy) return null;\n if (policy.allowNamespaces && !policy.allowNamespaces.includes(ctx.namespace)) {\n return `namespace \"${ctx.namespace}\" is not allowlisted (managed mode allows: ${policy.allowNamespaces.join(\", \")})`;\n }\n if (policy.requireBadges && policy.requireBadges.length > 0) {\n const have = new Set(ctx.badges ?? []);\n const missing = policy.requireBadges.filter((b) => !have.has(b));\n if (missing.length > 0) return `plugin is missing required badge(s): ${missing.join(\", \")}`;\n }\n return null;\n}\n","import { createHash } from \"node:crypto\";\n\n/** sha256 of compiled output, used for content-addressed update + the signed badge. */\nexport function sha256(contents: string | Buffer): string {\n return createHash(\"sha256\").update(contents).digest(\"hex\");\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type {\n ArtifactKind,\n HarnessAdapter,\n ResolvedMarketplace,\n} from \"@michaelfromyeg/weft-adapter-kit\";\nimport type { ArtifactRecord, Scope, Target } from \"@michaelfromyeg/weft-schema\";\nimport { type CompileResult, synthMarketplace, type TargetOutput } from \"./compile\";\nimport { sha256 } from \"./hash\";\n\nexport interface WrittenArtifact {\n target: Target;\n /** Relative to the per-target output base. */\n relPath: string;\n abs: string;\n hash: string;\n kind?: ArtifactKind;\n}\n\n/** A planned artifact: where it would land and its content hash, not yet written. */\nexport interface PlannedWrite extends WrittenArtifact {\n contents: Buffer;\n}\n\n/** Where one plugin's artifacts would land under `<baseDir>/plugins/<pluginName>/`, with hashes. */\nexport function planPluginArtifacts(\n target: TargetOutput,\n baseDir: string,\n pluginName: string,\n): PlannedWrite[] {\n // Flat adapters drop the plugins/<name>/ grouping (directory-convention harnesses).\n return target.artifacts.map(({ artifact }) => {\n const rel = target.adapter.flat\n ? artifact.relPath\n : join(\"plugins\", pluginName, artifact.relPath);\n const contents = toBuffer(artifact.contents);\n return {\n target: target.target,\n relPath: rel,\n abs: join(baseDir, rel),\n hash: sha256(contents),\n kind: artifact.kind,\n contents,\n };\n });\n}\n\n/** Where a harness's native catalog would land at `<baseDir>/`, with hashes. */\nexport function planCatalog(\n adapter: HarnessAdapter,\n marketplace: ResolvedMarketplace,\n baseDir: string,\n): PlannedWrite[] {\n return adapter.emitCatalog(marketplace).map((artifact) => {\n const contents = toBuffer(artifact.contents);\n return {\n target: adapter.target,\n relPath: artifact.relPath,\n abs: join(baseDir, artifact.relPath),\n hash: sha256(contents),\n kind: artifact.kind,\n contents,\n };\n });\n}\n\n/**\n * `weft build` placement plan for a single plugin (spec §9.1 step 6, inspect-only):\n * the plugin tree at `outDir/<target>/plugins/<plugin>/` plus a synthetic one-entry\n * catalog at the target root. `bare` writes straight to outDir (one target only) so a\n * repo root becomes the harness's native marketplace.\n */\nexport function planBuild(result: CompileResult, outDir: string, bare = false): PlannedWrite[] {\n const planned: PlannedWrite[] = [];\n const { plugin } = result.fb;\n const marketplace = synthMarketplace(plugin);\n for (const t of result.targets) {\n const base = bare ? outDir : join(outDir, t.target);\n planned.push(...planPluginArtifacts(t, base, plugin.name));\n planned.push(...planCatalog(t.adapter, marketplace, base));\n }\n return planned;\n}\n\n/** Write each planned artifact to disk (mkdir as needed); drops `contents` from the result. */\nexport function writePlanned(planned: PlannedWrite[]): WrittenArtifact[] {\n return planned.map(({ contents, ...rest }) => {\n mkdirSync(dirname(rest.abs), { recursive: true });\n writeFileSync(rest.abs, contents);\n return rest;\n });\n}\n\nexport interface DriftReport {\n clean: boolean;\n /** relPaths the build would create that are absent on disk. */\n missing: string[];\n /** relPaths whose on-disk content differs from the compiled artifact. */\n stale: string[];\n /** Total artifacts compared. */\n checked: number;\n}\n\n/**\n * Compare a build plan against what is on disk, reading only (never writes). Backs\n * `weft build --check`: a committed `--bare` marketplace that drifted from source\n * shows up as `stale`/`missing` so CI can fail before publish. Does NOT detect\n * orphans (files a prior build wrote that this one no longer would) -- that needs\n * the lockfile's history and belongs to `weft diff`.\n */\nexport function diffPlanned(planned: PlannedWrite[]): DriftReport {\n const missing: string[] = [];\n const stale: string[] = [];\n for (const p of planned) {\n if (!existsSync(p.abs)) missing.push(p.relPath);\n else if (sha256(readFileSync(p.abs)) !== p.hash) stale.push(p.relPath);\n }\n return {\n clean: missing.length === 0 && stale.length === 0,\n missing,\n stale,\n checked: planned.length,\n };\n}\n\n/** Write one plugin's artifacts under `<baseDir>/plugins/<pluginName>/`. */\nexport function placePluginArtifacts(\n target: TargetOutput,\n baseDir: string,\n pluginName: string,\n): WrittenArtifact[] {\n return writePlanned(planPluginArtifacts(target, baseDir, pluginName));\n}\n\n/** Emit and write a harness's native catalog at `<baseDir>/`. */\nexport function placeCatalog(\n adapter: HarnessAdapter,\n marketplace: ResolvedMarketplace,\n baseDir: string,\n): WrittenArtifact[] {\n return writePlanned(planCatalog(adapter, marketplace, baseDir));\n}\n\n/** Compile-and-write a single plugin's build output (write-mode `weft build`). */\nexport function buildToDir(result: CompileResult, outDir: string, bare = false): WrittenArtifact[] {\n return writePlanned(planBuild(result, outDir, bare));\n}\n\nfunction toBuffer(contents: string | Buffer): Buffer {\n return typeof contents === \"string\" ? Buffer.from(contents, \"utf8\") : contents;\n}\n\nexport interface PlannedArtifact {\n record: ArtifactRecord;\n contents: Buffer;\n}\n\n/**\n * Compute (without writing) where each target's plugin tree would land in the\n * scope, with content hashes. Drives both install (write all) and update (write\n * only what changed). Executable/passthrough artifacts are recorded DISABLED (§11).\n */\nexport function planScopeArtifacts(\n result: CompileResult,\n scope: Scope,\n cwd: string,\n): PlannedArtifact[] {\n const planned: PlannedArtifact[] = [];\n const name = result.fb.plugin.name;\n for (const t of result.targets) {\n const paths = t.adapter.detect(scope, cwd);\n // Flat adapters place under the scope dir directly, no plugins/<name>/ grouping.\n const pluginDir = t.adapter.flat ? paths.plugins : join(paths.plugins, name);\n for (const { componentId, artifact } of t.artifacts) {\n const contents = toBuffer(artifact.contents);\n planned.push({\n contents,\n record: {\n plugin: result.id,\n component: componentId,\n target: t.target,\n scope,\n path: join(pluginDir, artifact.relPath),\n hash: sha256(contents),\n placement: \"copy\",\n enabled: artifact.executable !== true,\n },\n });\n }\n }\n return planned;\n}\n\n/** `weft install` placement (spec §9.1 step 6): write every artifact, record each. */\nexport function installToScope(result: CompileResult, scope: Scope, cwd: string): ArtifactRecord[] {\n return planScopeArtifacts(result, scope, cwd).map(({ record, contents }) => {\n mkdirSync(dirname(record.path), { recursive: true });\n writeFileSync(record.path, contents);\n return record;\n });\n}\n","import { existsSync, mkdirSync, readdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { CatalogEntry, ResolvedMarketplace } from \"@michaelfromyeg/weft-adapter-kit\";\nimport type {\n Badge,\n Lockfile,\n Marketplace,\n ParseIssue,\n Plugin,\n Scope,\n Target,\n} from \"@michaelfromyeg/weft-schema\";\nimport { type CompileResult, compile, staticPass } from \"./compile\";\nimport { resolveConfig, type SecretsResult } from \"./config\";\nimport { type DependencyRecord, resolveDependencies } from \"./deps\";\nimport { CompileError, type Diagnostic, type Diagnostics } from \"./diagnostics\";\nimport { type FetchedPlugin, loadMarketplaceDir, loadPluginDir } from \"./loader\";\nimport {\n buildLockEntry,\n type LockEntry,\n lockDirForScope,\n mergeLock,\n readLock,\n writeLock,\n} from \"./lockfile\";\nimport { checkManagedPolicy, type ManagedPolicy } from \"./managed\";\nimport {\n type DriftReport,\n diffPlanned,\n installToScope,\n type PlannedWrite,\n planBuild,\n planCatalog,\n planPluginArtifacts,\n planScopeArtifacts,\n type WrittenArtifact,\n writePlanned,\n} from \"./place\";\nimport type { AdapterRegistry } from \"./registry\";\nimport { gitInfo, type ResolvedPlugin, resolvePluginRefFull } from \"./resolve\";\n\n/** Load a plugin and resolve its `depends` into a merged tree (spec §9.1 step 2). */\nfunction loadResolved(\n pluginDir: string,\n): Promise<{ fb: FetchedPlugin; dependencies: DependencyRecord[] }> {\n return resolveDependencies(loadOrThrow(pluginDir));\n}\n\nfunction issuesToDiagnostics(issues: ParseIssue[]): Diagnostic[] {\n return issues.map((i) => ({ severity: \"error\", where: i.path, message: i.message }));\n}\n\nfunction loadOrThrow(pluginDir: string) {\n const loaded = loadPluginDir(pluginDir);\n if (!loaded.ok) {\n throw new CompileError(\n `failed to load plugin in ${pluginDir}`,\n issuesToDiagnostics(loaded.issues),\n );\n }\n return loaded.value;\n}\n\nexport interface LintResult {\n id: string;\n plugin: Plugin;\n aliases: Record<string, string>;\n diagnostics: Diagnostics;\n}\n\n/** Load + statically validate a plugin without running any adapter (the valid badge). */\nexport function lint(pluginDir: string): LintResult {\n const fb = loadOrThrow(pluginDir);\n const pass = staticPass(fb);\n return { id: pass.id, plugin: fb.plugin, aliases: pass.aliases, diagnostics: pass.diagnostics };\n}\n\nexport interface BuildOptions {\n pluginDir: string;\n outDir: string;\n registry: AdapterRegistry;\n targets?: Target[];\n /** Write straight to outDir without the <target>/ subdir (single target only). */\n bare?: boolean;\n /** Compare against on-disk output instead of writing; populates `drift`, writes nothing. */\n check?: boolean;\n}\n\nexport interface BuildResult {\n result: CompileResult;\n /** The artifacts written (or, in check mode, the artifacts a write would produce). */\n written: WrittenArtifact[];\n /** Present only in check mode: how the on-disk output differs from a fresh compile. */\n drift?: DriftReport;\n}\n\n/** Drop the planned contents so a plan can be reported as `written` (check mode). */\nfunction asWritten(planned: PlannedWrite[]): WrittenArtifact[] {\n return planned.map(({ contents: _contents, ...rest }) => rest);\n}\n\n/** Compile a plugin and write its marketplace + plugin layout into `outDir` (no install). */\nexport async function build(opts: BuildOptions): Promise<BuildResult> {\n const { fb } = await loadResolved(opts.pluginDir);\n const result = compile(fb, { registry: opts.registry, targets: opts.targets });\n if (result.diagnostics.hasErrors) {\n throw new CompileError(\"compile failed\", result.diagnostics.errors);\n }\n const planned = planBuild(result, opts.outDir, opts.bare);\n if (opts.check) {\n return { result, written: asWritten(planned), drift: diffPlanned(planned) };\n }\n return { result, written: writePlanned(planned) };\n}\n\nexport interface BuildMarketplaceOptions {\n marketplaceDir: string;\n outDir: string;\n registry: AdapterRegistry;\n targets?: Target[];\n /** Write straight to outDir without the <target>/ subdir (single target only). */\n bare?: boolean;\n /** Compare against on-disk output instead of writing; populates `drift`, writes nothing. */\n check?: boolean;\n}\n\nexport interface BuildMarketplaceResult {\n marketplace: Marketplace;\n plugins: CompileResult[];\n /** The artifacts written (or, in check mode, the artifacts a write would produce). */\n written: WrittenArtifact[];\n /** Present only in check mode: how the on-disk output differs from a fresh compile. */\n drift?: DriftReport;\n}\n\n/**\n * Compile a curated `marketplace.yaml` of many plugins: resolve and compile each\n * referenced plugin, place every plugin tree under `outDir/<target>/plugins/`,\n * and emit ONE native catalog per target listing them all (spec §6.2). This is\n * the company-marketplace workflow.\n */\nexport async function buildMarketplace(\n opts: BuildMarketplaceOptions,\n): Promise<BuildMarketplaceResult> {\n const loaded = loadMarketplaceDir(opts.marketplaceDir);\n if (!loaded.ok) {\n throw new CompileError(\n `failed to load marketplace in ${opts.marketplaceDir}`,\n issuesToDiagnostics(loaded.issues),\n );\n }\n const { marketplace, root } = loaded.value;\n\n const compiled: Array<{ entry: Marketplace[\"plugins\"][number]; result: CompileResult }> = [];\n for (const entry of marketplace.plugins) {\n let fb: FetchedPlugin;\n try {\n fb = (await resolvePluginRefFull(entry.plugin, root)).fb;\n } catch (err) {\n throw new CompileError(`marketplace entry \"${entry.plugin}\" failed`, [\n { severity: \"error\", where: \"plugins\", message: (err as Error).message },\n ]);\n }\n // An entry version override flows into the compiled plugin.json too, so the\n // catalog and the plugin manifest agree (plugin.json wins at install time).\n if (entry.version) fb = { ...fb, plugin: { ...fb.plugin, version: entry.version } };\n // Resolve the entry plugin's own dependencies before compiling it.\n const merged = (await resolveDependencies(fb)).fb;\n const result = compile(merged, { registry: opts.registry, targets: opts.targets });\n if (result.diagnostics.hasErrors) {\n throw new CompileError(`plugin \"${result.id}\" failed`, result.diagnostics.errors);\n }\n compiled.push({ entry, result });\n }\n\n const targets = opts.targets ?? opts.registry.targets;\n const planned: PlannedWrite[] = [];\n for (const target of targets) {\n const adapter = opts.registry.get(target);\n if (!adapter) continue;\n const base = opts.bare ? opts.outDir : join(opts.outDir, target);\n const entries: CatalogEntry[] = [];\n for (const { entry, result } of compiled) {\n const output = result.targets.find((t) => t.target === target);\n if (!output) continue;\n const p = result.fb.plugin;\n planned.push(...planPluginArtifacts(output, base, p.name));\n entries.push({\n name: p.name,\n source: `./plugins/${p.name}`,\n ...(p.description ? { description: p.description } : {}),\n version: entry.version ?? p.version,\n ...(entry.category ? { category: entry.category } : {}),\n ...(entry.tags ? { tags: entry.tags } : {}),\n });\n }\n const resolved: ResolvedMarketplace = {\n name: marketplace.name,\n owner: marketplace.owner,\n ...(marketplace.description ? { description: marketplace.description } : {}),\n entries,\n };\n planned.push(...planCatalog(adapter, resolved, base));\n }\n\n const plugins = compiled.map((c) => c.result);\n if (opts.check) {\n return { marketplace, plugins, written: asWritten(planned), drift: diffPlanned(planned) };\n }\n return { marketplace, plugins, written: writePlanned(planned) };\n}\n\nexport interface InstallOptions {\n pluginDir: string;\n scope: Scope;\n cwd: string;\n registry: AdapterRegistry;\n targets?: Target[];\n /** Piecemeal: install only these component leaf names (spec §9.2). */\n only?: string[];\n /** Managed-mode policy: namespace allowlist / required badges (spec §11). */\n managed?: ManagedPolicy;\n /** Badges known for this plugin (for managed `requireBadges`). */\n badges?: Badge[];\n /** Where to write `weft.lock` (default: the plugin dir). Eval points this at a scratch dir. */\n lockDir?: string;\n /** Inject the lockfile timestamp for deterministic tests. */\n now?: string;\n}\n\n/** One plugin's install output: its compiled result, lock entry, and config summary. */\nexport interface PluginInstall {\n result: CompileResult;\n entry: LockEntry;\n /** Declared config resolution summary (never the values) -- spec §11. */\n secrets: SecretsResult;\n}\n\nexport interface InstallResult extends PluginInstall {\n /** The merged target lockfile (every plugin installed into this target). */\n lockfile: Lockfile;\n lockPath: string;\n}\n\n/** Compile an already-resolved plugin and place it into the scope (no lock write). */\nfunction installResolved(\n fb: FetchedPlugin,\n dependencies: DependencyRecord[],\n opts: {\n scope: Scope;\n cwd: string;\n registry: AdapterRegistry;\n targets?: Target[];\n only?: string[];\n managed?: ManagedPolicy;\n badges?: Badge[];\n ref: string;\n sha: string;\n },\n): PluginInstall {\n const result = compile(fb, { registry: opts.registry, targets: opts.targets, only: opts.only });\n if (result.diagnostics.hasErrors) {\n throw new CompileError(\"compile failed\", result.diagnostics.errors);\n }\n // Managed mode gates the install by namespace / required badges (spec §11).\n const blocked = checkManagedPolicy(opts.managed, {\n namespace: result.fb.plugin.owner.namespace,\n badges: opts.badges,\n });\n if (blocked) {\n throw new CompileError(\"install blocked by managed policy\", [\n { severity: \"error\", where: \"managed\", message: blocked },\n ]);\n }\n const artifacts = installToScope(result, opts.scope, opts.cwd);\n const secrets = resolveConfig(result.fb.plugin, opts.cwd);\n const entry = buildLockEntry({ result, artifacts, dependencies, ref: opts.ref, sha: opts.sha });\n return { result, entry, secrets };\n}\n\n/** Merge install entries into the target's `weft.lock` and write it once. */\nfunction commitLock(\n scope: Scope,\n cwd: string,\n entries: LockEntry[],\n now: string | undefined,\n lockDirOverride: string | undefined,\n): { lockfile: Lockfile; lockPath: string } {\n const dir = lockDirOverride ?? lockDirForScope(scope, cwd);\n mkdirSync(dir, { recursive: true });\n const lockfile = mergeLock(readLock(dir), entries, now ?? new Date().toISOString());\n return { lockfile, lockPath: writeLock(dir, lockfile) };\n}\n\n/** Compile a plugin, place it into the scope, resolve config, write the target `weft.lock`. */\nexport async function install(opts: InstallOptions): Promise<InstallResult> {\n const { fb, dependencies } = await loadResolved(opts.pluginDir);\n const { ref, sha } = await gitInfo(opts.pluginDir);\n const pi = installResolved(fb, dependencies, {\n scope: opts.scope,\n cwd: opts.cwd,\n registry: opts.registry,\n ref,\n sha,\n targets: opts.targets,\n only: opts.only,\n managed: opts.managed,\n badges: opts.badges,\n });\n const { lockfile, lockPath } = commitLock(\n opts.scope,\n opts.cwd,\n [pi.entry],\n opts.now,\n opts.lockDir,\n );\n return { ...pi, lockfile, lockPath };\n}\n\nexport interface InstallMarketplaceOptions {\n marketplaceDir: string;\n scope: Scope;\n cwd: string;\n registry: AdapterRegistry;\n targets?: Target[];\n managed?: ManagedPolicy;\n lockDir?: string;\n now?: string;\n}\n\nexport interface InstallMarketplaceResult {\n marketplace: Marketplace;\n /** The merged target lockfile recording every installed plugin. */\n lockfile: Lockfile;\n lockPath: string;\n /** One install per marketplace plugin, in catalog order. */\n installs: PluginInstall[];\n}\n\n/**\n * Install every plugin in a marketplace into the scope in one pass (the\n * company-marketplace install). Each plugin is resolved (local or remote),\n * compiled, and placed; all of them land in a single target `weft.lock`,\n * mirroring a single-plugin install at marketplace scale (same primitives).\n */\nexport async function installMarketplace(\n opts: InstallMarketplaceOptions,\n): Promise<InstallMarketplaceResult> {\n const loaded = loadMarketplaceDir(opts.marketplaceDir);\n if (!loaded.ok) {\n throw new CompileError(\n `failed to load marketplace in ${opts.marketplaceDir}`,\n issuesToDiagnostics(loaded.issues),\n );\n }\n const { marketplace, root } = loaded.value;\n\n const installs: PluginInstall[] = [];\n for (const entry of marketplace.plugins) {\n let resolved: ResolvedPlugin;\n try {\n resolved = await resolvePluginRefFull(entry.plugin, root);\n } catch (err) {\n throw new CompileError(`marketplace entry \"${entry.plugin}\" failed`, [\n { severity: \"error\", where: \"plugins\", message: (err as Error).message },\n ]);\n }\n // An entry version override flows into the installed plugin (catalog wins).\n let fb = resolved.fb;\n if (entry.version) fb = { ...fb, plugin: { ...fb.plugin, version: entry.version } };\n const { fb: merged, dependencies } = await resolveDependencies(fb);\n installs.push(\n installResolved(merged, dependencies, {\n scope: opts.scope,\n cwd: opts.cwd,\n registry: opts.registry,\n ref: resolved.ref,\n sha: resolved.sha,\n targets: opts.targets,\n managed: opts.managed,\n }),\n );\n }\n const { lockfile, lockPath } = commitLock(\n opts.scope,\n opts.cwd,\n installs.map((i) => i.entry),\n opts.now,\n opts.lockDir,\n );\n return { marketplace, lockfile, lockPath, installs };\n}\n\nexport interface UninstallOptions {\n /** The install target that holds weft.lock (project root for project scope). */\n dir: string;\n /** Optionally remove just one plugin (by id or bare name); default removes all. */\n plugin?: string;\n}\n\nexport interface UninstallResult {\n removed: string[];\n /** Plugin ids removed from the lock. */\n plugins: string[];\n}\n\n/** Prune now-empty directories upward from each removed file (best-effort). */\nfunction pruneEmptyDirs(paths: string[]): void {\n const dirs = new Set(paths.map((p) => dirname(p)));\n for (const start of dirs) {\n let d = start;\n while (d && d !== dirname(d)) {\n try {\n if (readdirSync(d).length > 0) break;\n rmSync(d, { recursive: true, force: true });\n } catch {\n break;\n }\n d = dirname(d);\n }\n }\n}\n\n/**\n * Remove what `install` placed into a target, using the paths recorded in the\n * target's `weft.lock` (spec §6.3). Removes one plugin (by id or bare name) or\n * all of them; deletes the lock when nothing is left, else rewrites the rest.\n * Errors are defined out of existence: a missing artifact is simply skipped.\n */\nexport function uninstall(opts: UninstallOptions): UninstallResult {\n const lock = readLock(opts.dir);\n if (!lock) {\n throw new CompileError(\"nothing to uninstall\", [\n { severity: \"error\", where: \"weft.lock\", message: `no weft.lock found in ${opts.dir}` },\n ]);\n }\n const match = opts.plugin;\n const ids = new Set(\n (match\n ? lock.plugins.filter((p) => p.id === match || p.id.endsWith(`/${match}`))\n : lock.plugins\n ).map((p) => p.id),\n );\n if (match && ids.size === 0) {\n throw new CompileError(`plugin \"${match}\" is not installed here`, [\n { severity: \"error\", where: \"weft.lock\", message: `no plugin matching \"${match}\"` },\n ]);\n }\n\n const removed: string[] = [];\n for (const a of lock.artifacts) {\n if (!ids.has(a.plugin)) continue;\n if (existsSync(a.path)) {\n rmSync(a.path, { force: true });\n removed.push(a.path);\n }\n }\n pruneEmptyDirs(removed);\n\n const remaining = lock.plugins.filter((p) => !ids.has(p.id));\n if (remaining.length === 0) {\n rmSync(join(opts.dir, \"weft.lock\"), { force: true });\n } else {\n writeLock(opts.dir, {\n ...lock,\n plugins: remaining,\n artifacts: lock.artifacts.filter((a) => !ids.has(a.plugin)),\n });\n }\n return { removed, plugins: [...ids] };\n}\n\nexport interface UpdateResult {\n /** The recompiled plugin's id. */\n id: string;\n lockfile: Lockfile;\n lockPath: string;\n /** Artifacts whose content hash changed (or are new) since the prior lockfile. */\n changed: string[];\n}\n\n/**\n * Re-resolve refs, recompile a plugin source, diff its artifact content hashes\n * against the target `weft.lock`, and re-place ONLY changed artifacts (spec §5,\n * §9.3); its entry is then merged back into the target lock. Content addressing\n * makes \"is there really a new version?\" exact: unchanged artifacts are not rewritten.\n */\nexport async function update(opts: InstallOptions): Promise<UpdateResult> {\n const lockDir = opts.lockDir ?? lockDirForScope(opts.scope, opts.cwd);\n const prev = readLock(lockDir);\n\n const { fb, dependencies } = await loadResolved(opts.pluginDir);\n const result = compile(fb, { registry: opts.registry, targets: opts.targets, only: opts.only });\n if (result.diagnostics.hasErrors) {\n throw new CompileError(\"compile failed\", result.diagnostics.errors);\n }\n\n // Diff against this plugin's prior artifacts only; other plugins in the lock are untouched.\n const prevHash = new Map(\n (prev?.artifacts ?? []).filter((a) => a.plugin === result.id).map((a) => [a.path, a.hash]),\n );\n const planned = planScopeArtifacts(result, opts.scope, opts.cwd);\n const changed: string[] = [];\n for (const { record, contents } of planned) {\n if (prevHash.get(record.path) === record.hash) continue; // unchanged -> never rewrite\n mkdirSync(dirname(record.path), { recursive: true });\n writeFileSync(record.path, contents);\n changed.push(record.path);\n }\n\n const { ref, sha } = await gitInfo(opts.pluginDir);\n const entry = buildLockEntry({\n result,\n artifacts: planned.map((p) => p.record),\n dependencies,\n ref,\n sha,\n });\n mkdirSync(lockDir, { recursive: true });\n const lockfile = mergeLock(prev, [entry], opts.now ?? new Date().toISOString());\n const lockPath = writeLock(lockDir, lockfile);\n return { id: result.id, lockfile, lockPath, changed };\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { HarnessAdapter } from \"@michaelfromyeg/weft-adapter-kit\";\nimport { stringifyDocument } from \"@michaelfromyeg/weft-schema\";\n\nexport interface ImportPluginOptions {\n /** Directory holding an existing native plugin or marketplace. */\n dir: string;\n adapter: HarnessAdapter;\n /** Where to write the generated Weft plugin/marketplace. */\n outDir: string;\n /** Reverse-DNS namespace to assign (native assets lack one). */\n namespace?: string;\n}\n\nexport interface ImportOutput {\n kind: \"plugin\" | \"marketplace\";\n name: string;\n outDir: string;\n manifestPath: string;\n fileCount: number;\n id?: string;\n}\n\n/**\n * Reverse-compile an existing native plugin/marketplace into the Weft model and\n * write it to `outDir`, ready for `weft build` to cross-compile to every other\n * harness. This is \"federate, don't wall off\" applied to assets you already have.\n */\nexport function importNativePlugin(opts: ImportPluginOptions): ImportOutput {\n if (!opts.adapter.importNative) {\n throw new Error(`adapter \"${opts.adapter.target}\" does not support import`);\n }\n const result = opts.adapter.importNative(opts.dir, { namespace: opts.namespace });\n if (!result) {\n throw new Error(`no ${opts.adapter.target} plugin or marketplace found in ${opts.dir}`);\n }\n mkdirSync(opts.outDir, { recursive: true });\n\n if (result.kind === \"marketplace\") {\n const manifestPath = join(opts.outDir, \"marketplace.yaml\");\n writeFileSync(manifestPath, stringifyDocument(result.marketplace));\n return {\n kind: \"marketplace\",\n name: result.marketplace.name,\n outDir: opts.outDir,\n manifestPath,\n fileCount: 0,\n };\n }\n\n const manifestPath = join(opts.outDir, \"weft.yaml\");\n writeFileSync(manifestPath, stringifyDocument(result.plugin));\n for (const f of result.files) {\n const abs = join(opts.outDir, f.relPath);\n mkdirSync(dirname(abs), { recursive: true });\n writeFileSync(\n abs,\n typeof f.contents === \"string\" ? Buffer.from(f.contents, \"utf8\") : f.contents,\n );\n }\n return {\n kind: \"plugin\",\n name: result.plugin.name,\n outDir: opts.outDir,\n manifestPath,\n fileCount: result.files.length,\n id: `${result.plugin.owner.namespace}/${result.plugin.name}`,\n };\n}\n","import type { HarnessAdapter } from \"@michaelfromyeg/weft-adapter-kit\";\nimport type { Target } from \"@michaelfromyeg/weft-schema\";\n\n/**\n * Adapters registered by Target (spec §7). Core depends only on the adapter-kit\n * interface; the CLI (or an embedding app) registers concrete adapters, keeping\n * the dependency direction one-way and letting community adapters slot in.\n */\nexport class AdapterRegistry {\n private readonly adapters = new Map<Target, HarnessAdapter>();\n\n register(adapter: HarnessAdapter): this {\n this.adapters.set(adapter.target, adapter);\n return this;\n }\n\n get(target: Target): HarnessAdapter | undefined {\n return this.adapters.get(target);\n }\n\n has(target: Target): boolean {\n return this.adapters.has(target);\n }\n\n get targets(): Target[] {\n return [...this.adapters.keys()];\n }\n}\n","import { createHash, generateKeyPairSync, type KeyObject, sign, verify } from \"node:crypto\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport type { Lockfile } from \"@michaelfromyeg/weft-schema\";\n\n/**\n * A digest over the lockfile's artifact set (component + target + content hash).\n * Signing this binds a signature to exactly the compiled artifacts (spec §10\n * `signed` badge). Sorting makes it order-independent and deterministic.\n */\nexport function artifactDigest(lock: Lockfile): Buffer {\n const lines = lock.artifacts.map((a) => `${a.component}\\t${a.target}\\t${a.hash}`).sort();\n return createHash(\"sha256\").update(lines.join(\"\\n\")).digest();\n}\n\n/** Ed25519 keypair. Production would use sigstore/cosign keyless signing instead. */\nexport function generateSigningKeys(): { publicKey: KeyObject; privateKey: KeyObject } {\n return generateKeyPairSync(\"ed25519\");\n}\n\nexport function signLock(lock: Lockfile, privateKey: KeyObject): string {\n return sign(null, artifactDigest(lock), privateKey).toString(\"base64\");\n}\n\nexport function verifyLockSignature(\n lock: Lockfile,\n publicKey: KeyObject,\n signature: string,\n): boolean {\n try {\n return verify(null, artifactDigest(lock), publicKey, Buffer.from(signature, \"base64\"));\n } catch {\n return false;\n }\n}\n\nexport interface VerifyResult {\n signatureValid: boolean;\n /** Recorded artifact paths whose on-disk bytes no longer match the lock hash. */\n tampered: string[];\n}\n\n/**\n * Verify a signature AND that every recorded artifact on disk still matches its\n * lockfile hash. The `signed` badge requires both: a valid signature over the\n * digest and no tampered artifacts.\n */\nexport function verifyArtifacts(\n lock: Lockfile,\n publicKey: KeyObject,\n signature: string,\n): VerifyResult {\n const tampered: string[] = [];\n for (const a of lock.artifacts) {\n if (!existsSync(a.path)) {\n tampered.push(a.path);\n continue;\n }\n const actual = createHash(\"sha256\").update(readFileSync(a.path)).digest(\"hex\");\n if (actual !== a.hash) tampered.push(a.path);\n }\n return { signatureValid: verifyLockSignature(lock, publicKey, signature), tampered };\n}\n"]}
1
+ {"version":3,"sources":["../src/diagnostics.ts","../src/namespace.ts","../src/validate.ts","../src/version.ts","../src/compile.ts","../src/config.ts","../src/loader.ts","../src/resolve.ts","../src/deps.ts","../src/harness.ts","../src/lockfile.ts","../src/managed.ts","../src/hash.ts","../src/place.ts","../src/api.ts","../src/import.ts","../src/registry.ts","../src/sign.ts"],"names":["kindOf","join","existsSync","statSync","subdir","base","ref","mkdirSync","dir","sha","resolvePath","leafNameOf","refOf","semver","homedir","writeFileSync","readFileSync","createHash","loadOrThrow","dirname","readdirSync","manifestPath"],"mappings":"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","file":"index.js","sourcesContent":["export type Severity = \"error\" | \"warning\" | \"info\";\n\nexport interface Diagnostic {\n severity: Severity;\n /** Path-precise location: \"components[1].mcp\", \"owner.namespace\", or a file path. */\n where: string;\n message: string;\n}\n\n/** Accumulates diagnostics during compile; fails closed when any error is present. */\nexport class Diagnostics {\n readonly items: Diagnostic[] = [];\n\n error(where: string, message: string): void {\n this.items.push({ severity: \"error\", where, message });\n }\n warn(where: string, message: string): void {\n this.items.push({ severity: \"warning\", where, message });\n }\n info(where: string, message: string): void {\n this.items.push({ severity: \"info\", where, message });\n }\n\n get hasErrors(): boolean {\n return this.items.some((d) => d.severity === \"error\");\n }\n\n get errors(): Diagnostic[] {\n return this.items.filter((d) => d.severity === \"error\");\n }\n}\n\nexport class CompileError extends Error {\n constructor(\n message: string,\n readonly diagnostics: Diagnostic[],\n ) {\n super(message);\n this.name = \"CompileError\";\n }\n}\n","/** One component identified for aliasing: its bare leaf name and full id. */\nexport interface AliasInput {\n id: string;\n leaf: string;\n}\n\nexport interface AliasResult {\n /** Bare leaf name -> fully-qualified id. */\n aliases: Record<string, string>;\n /** True same-scope collisions: one leaf claimed by multiple ids. */\n collisions: Array<{ leaf: string; ids: string[] }>;\n}\n\n/**\n * Bare name when unambiguous (spec §9.4). A leaf used by exactly one component\n * gets the bare alias; a leaf shared by several is surfaced as a collision for\n * the caller to resolve (prompt interactively, or error non-interactively).\n * Never silently last-wins.\n */\nexport function resolveAliases(components: AliasInput[]): AliasResult {\n const byLeaf = new Map<string, string[]>();\n for (const c of components) {\n const ids = byLeaf.get(c.leaf) ?? [];\n ids.push(c.id);\n byLeaf.set(c.leaf, ids);\n }\n\n const aliases: Record<string, string> = {};\n const collisions: AliasResult[\"collisions\"] = [];\n for (const [leaf, ids] of byLeaf) {\n if (ids.length === 1) aliases[leaf] = ids[0] as string;\n else collisions.push({ leaf, ids: [...ids].sort() });\n }\n return { aliases, collisions };\n}\n","import { existsSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { parseFrontmatter } from \"@michaelfromyeg/weft-adapter-kit\";\nimport { kindOf, refOf } from \"@michaelfromyeg/weft-schema\";\nimport type { Diagnostics } from \"./diagnostics\";\nimport type { FetchedPlugin } from \"./loader\";\n\n/**\n * Static validation (spec §9.1 step 3, the `valid` badge): every referenced file\n * exists, skill/agent frontmatter is well-formed, `server.json` parses, and\n * descriptions clear a basic quality bar. Errors fail the compile closed.\n */\nexport function validatePlugin(fb: FetchedPlugin, diags: Diagnostics): void {\n fb.plugin.components.forEach((component, i) => {\n const where = `components[${i}]`;\n const ref = refOf(component);\n const abs = join(fb.root, ref);\n if (!existsSync(abs)) {\n diags.error(where, `referenced path \"${ref}\" does not exist`);\n return;\n }\n\n switch (kindOf(component)) {\n case \"skill\":\n validateSkill(fb, ref, abs, where, diags);\n break;\n case \"mcp\":\n validateMcp(fb, ref, abs, where, diags);\n break;\n case \"agent\":\n validateMarkdownComponent(fb, ref, abs, where, diags);\n break;\n default:\n // command / hook / passthrough: existence is the only static gate.\n break;\n }\n });\n}\n\nfunction validateSkill(\n fb: FetchedPlugin,\n ref: string,\n abs: string,\n where: string,\n diags: Diagnostics,\n): void {\n if (!statSync(abs).isDirectory()) {\n diags.error(where, `skill \"${ref}\" must be a directory containing SKILL.md`);\n return;\n }\n const skillMd = join(abs, \"SKILL.md\");\n if (!existsSync(skillMd)) {\n diags.error(where, `skill \"${ref}\" is missing SKILL.md`);\n return;\n }\n const { data } = parseFrontmatter(fb.read(join(ref, \"SKILL.md\")).toString(\"utf8\"));\n if (!data.name) diags.error(`${where}.skill`, \"SKILL.md frontmatter is missing `name`\");\n checkDescription(`${where}.skill`, data.description, diags);\n}\n\nfunction validateMcp(\n fb: FetchedPlugin,\n ref: string,\n abs: string,\n where: string,\n diags: Diagnostics,\n): void {\n if (!statSync(abs).isDirectory()) {\n diags.error(where, `mcp \"${ref}\" must be a directory containing server.json`);\n return;\n }\n const serverJsonPath = join(abs, \"server.json\");\n if (!existsSync(serverJsonPath)) {\n diags.error(where, `mcp \"${ref}\" is missing server.json`);\n return;\n }\n let server: Record<string, unknown>;\n try {\n server = JSON.parse(fb.read(join(ref, \"server.json\")).toString(\"utf8\"));\n } catch (err) {\n diags.error(`${where}.mcp`, `server.json is not valid JSON: ${(err as Error).message}`);\n return;\n }\n if (!server.name) diags.error(`${where}.mcp`, \"server.json is missing `name`\");\n const hasRunnable = server.packages || server.remotes || server.command;\n if (!hasRunnable) {\n diags.warn(`${where}.mcp`, \"server.json declares no `packages`, `remotes`, or `command`\");\n }\n checkDescription(`${where}.mcp`, server.description, diags);\n}\n\nfunction validateMarkdownComponent(\n fb: FetchedPlugin,\n ref: string,\n abs: string,\n where: string,\n diags: Diagnostics,\n): void {\n if (statSync(abs).isDirectory()) return; // agent-as-dir: defer detailed checks\n const { data } = parseFrontmatter(fb.read(ref).toString(\"utf8\"));\n if (!data.name) diags.warn(`${where}.agent`, \"agent frontmatter is missing `name`\");\n checkDescription(`${where}.agent`, data.description, diags);\n}\n\nfunction checkDescription(where: string, description: unknown, diags: Diagnostics): void {\n if (!description) {\n diags.error(where, \"missing `description` (required for discovery + the tested badge)\");\n return;\n }\n if (String(description).trim().length < 16) {\n diags.warn(where, \"description is very short; harnesses route on it -- make it specific\");\n }\n}\n","import semver from \"semver\";\n\n/** The Weft/CLI version (versioning axis 2, spec §5). */\nexport const WEFT_VERSION = \"1.4.1\";\n\n/**\n * Check a plugin's `weft_min_version` against the running Weft. Returns an error\n * message when unmet, or null when satisfied / unspecified.\n */\nexport function checkMinVersion(min: string | undefined): string | null {\n if (!min) return null;\n const cleaned = semver.valid(semver.coerce(min) ?? min);\n if (!cleaned) return `weft_min_version \"${min}\" is not a valid semver`;\n if (semver.lt(WEFT_VERSION, cleaned)) {\n return `plugin requires Weft >= ${min}, but this is ${WEFT_VERSION}`;\n }\n return null;\n}\n","import type {\n CompiledArtifact,\n HarnessAdapter,\n PluginCtx,\n ResolvedMarketplace,\n} from \"@michaelfromyeg/weft-adapter-kit\";\nimport {\n ALL_TARGETS,\n type Component,\n type ComponentKind,\n fqid,\n kindOf,\n leafNameOf,\n type Plugin,\n type Target,\n targetsOf,\n} from \"@michaelfromyeg/weft-schema\";\nimport { Diagnostics } from \"./diagnostics\";\nimport type { FetchedPlugin } from \"./loader\";\nimport { resolveAliases } from \"./namespace\";\nimport type { AdapterRegistry } from \"./registry\";\nimport { validatePlugin } from \"./validate\";\nimport { checkMinVersion } from \"./version\";\n\n/** An emitted artifact tagged with the canonical component it came from. */\nexport interface TaggedArtifact {\n componentId: string;\n artifact: CompiledArtifact;\n}\n\n/** Everything one adapter produced for one plugin. */\nexport interface TargetOutput {\n target: Target;\n adapter: HarnessAdapter;\n /** Plugin-root-relative artifacts: components + the plugin manifest. */\n artifacts: TaggedArtifact[];\n}\n\nexport interface CompileResult {\n fb: FetchedPlugin;\n /** Plugin id: `{namespace}/{name}`. */\n id: string;\n /** The components actually compiled (the piecemeal selection, or all). */\n components: ResolvedComponent[];\n aliases: Record<string, string>;\n diagnostics: Diagnostics;\n targets: TargetOutput[];\n}\n\nexport interface CompileOptions {\n registry: AdapterRegistry;\n /** Restrict to these targets; default = every target with a registered adapter. */\n targets?: Target[];\n /** Piecemeal: include only these component leaf names; default = all (spec §9.2). */\n only?: string[];\n}\n\n/** A synthetic one-entry marketplace wrapping a single plugin (spec §9.1 build). */\nexport function synthMarketplace(plugin: Plugin): ResolvedMarketplace {\n return {\n name: plugin.name,\n owner: plugin.owner,\n ...(plugin.description ? { description: plugin.description } : {}),\n entries: [\n {\n name: plugin.name,\n source: `./plugins/${plugin.name}`,\n ...(plugin.description ? { description: plugin.description } : {}),\n version: plugin.version,\n },\n ],\n };\n}\n\nexport interface ResolvedComponent {\n id: string;\n leaf: string;\n kind: ComponentKind;\n component: Component;\n}\n\nexport interface StaticPass {\n id: string;\n diagnostics: Diagnostics;\n aliases: Record<string, string>;\n resolved: ResolvedComponent[];\n}\n\n/**\n * Steps 1-4 of the pipeline shared by `compile` and `lint`: min-version,\n * static validation, fully-qualified ids, and alias resolution. No adapters run,\n * so it is the deterministic \"is this plugin valid?\" pass behind the valid badge.\n */\nexport function staticPass(fb: FetchedPlugin): StaticPass {\n const diagnostics = new Diagnostics();\n const { plugin } = fb;\n const id = `${plugin.owner.namespace}/${plugin.name}`;\n\n const minErr = checkMinVersion(plugin.weft_min_version);\n if (minErr) diagnostics.error(\"weft_min_version\", minErr);\n\n validatePlugin(fb, diagnostics);\n\n const resolved: ResolvedComponent[] = plugin.components.map((component) => ({\n id: fqid(plugin.owner.namespace, plugin.name, leafNameOf(component)),\n leaf: leafNameOf(component),\n kind: kindOf(component),\n component,\n }));\n\n const { aliases, collisions } = resolveAliases(resolved);\n for (const c of collisions) {\n diagnostics.error(\n `components.${c.leaf}`,\n `ambiguous component name \"${c.leaf}\": ${c.ids.join(\" vs \")}; qualify or choose which keeps the bare alias`,\n );\n }\n\n return { id, diagnostics, aliases, resolved };\n}\n\n/**\n * Steps 1-5 of the compile pipeline (spec §9.1): load is done by the caller;\n * here we enforce min-version, validate statically, resolve aliases, and run each\n * adapter's transform + emitManifest. Catalog emission (a marketplace concern) and\n * placement are separate so `build` can inspect without installing and `install`\n * can pull components piecemeal.\n *\n * Never throws on plugin problems -- it accumulates diagnostics so the caller can\n * render them. `build`/`install` fail closed when `diagnostics.hasErrors`.\n */\nexport function compile(fb: FetchedPlugin, opts: CompileOptions): CompileResult {\n const { plugin } = fb;\n const pass = staticPass(fb);\n const { id, diagnostics } = pass;\n\n // Piecemeal selection (spec §9.2): include only the requested component leaves.\n const onlySet = opts.only && opts.only.length > 0 ? new Set(opts.only) : null;\n if (onlySet) {\n for (const leaf of onlySet) {\n if (!pass.resolved.some((rc) => rc.leaf === leaf)) {\n diagnostics.error(\n \"only\",\n `component \"${leaf}\" not found; available: ${pass.resolved.map((r) => r.leaf).join(\", \")}`,\n );\n }\n }\n }\n const selected = onlySet ? pass.resolved.filter((rc) => onlySet.has(rc.leaf)) : pass.resolved;\n const effectivePlugin: Plugin = onlySet\n ? { ...plugin, components: selected.map((rc) => rc.component) }\n : plugin;\n const aliases = onlySet\n ? Object.fromEntries(\n Object.entries(pass.aliases).filter(([, cid]) => selected.some((rc) => rc.id === cid)),\n )\n : pass.aliases;\n const reverseAlias = new Map(Object.entries(aliases).map(([leaf, cid]) => [cid, leaf]));\n\n const requested = opts.targets ?? opts.registry.targets;\n const targets: TargetOutput[] = [];\n\n for (const target of requested) {\n const adapter = opts.registry.get(target);\n if (!adapter) {\n if (opts.targets) diagnostics.warn(target, `no adapter registered for target \"${target}\"`);\n continue;\n }\n\n const ctx: PluginCtx = {\n plugin: effectivePlugin,\n read: fb.read,\n list: fb.list,\n aliasFor: (componentId) => reverseAlias.get(componentId) ?? componentId,\n };\n\n const pluginArtifacts: TaggedArtifact[] = [];\n for (const rc of selected) {\n if (!targetsOf(rc.component, ALL_TARGETS).includes(target)) continue;\n for (const a of adapter.transform(rc.component, ctx)) {\n pluginArtifacts.push({ componentId: rc.id, artifact: a });\n }\n }\n for (const a of adapter.emitManifest(effectivePlugin, ctx)) {\n pluginArtifacts.push({ componentId: id, artifact: a });\n }\n\n targets.push({ target, adapter, artifacts: pluginArtifacts });\n }\n\n return { fb, id, components: selected, aliases, diagnostics, targets };\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Component, Plugin } from \"@michaelfromyeg/weft-schema\";\n\nexport interface ConfigResolution {\n env: string;\n /** Where the value came from -- never the value itself. */\n source: \"env\" | \"default\" | \"missing\";\n secret: boolean;\n}\n\nexport interface SecretsResult {\n resolved: ConfigResolution[];\n /** Path to the gitignored local config the values were written to (or null). */\n path: string | null;\n}\n\nfunction configVarsOf(component: Component) {\n return \"config\" in component && component.config ? component.config : [];\n}\n\n/**\n * Resolve declared `ConfigVar`s (spec §9.1 step 7, §11 rule 4: declare-not-store).\n * Values come from the environment or a declared default and are written ONLY to a\n * local, gitignored config -- never to the lockfile, the plugin, the index, or\n * telemetry. The returned summary records where each value came from, not the value.\n */\nexport function resolveConfig(\n plugin: Plugin,\n cwd: string,\n env: Record<string, string | undefined> = process.env,\n): SecretsResult {\n const resolved: ConfigResolution[] = [];\n const values: Record<string, string> = {};\n\n for (const component of plugin.components) {\n for (const v of configVarsOf(component)) {\n const fromEnv = env[v.env];\n if (fromEnv !== undefined) {\n values[v.env] = fromEnv;\n resolved.push({ env: v.env, source: \"env\", secret: v.secret });\n } else if (v.default === undefined) {\n resolved.push({ env: v.env, source: \"missing\", secret: v.secret });\n } else {\n values[v.env] = v.default;\n resolved.push({ env: v.env, source: \"default\", secret: v.secret });\n }\n }\n }\n\n if (Object.keys(values).length === 0) return { resolved, path: null };\n\n const dir = join(cwd, \".weft\");\n mkdirSync(dir, { recursive: true });\n // Gitignore the whole local-config dir so resolved values never get committed.\n writeFileSync(join(dir, \".gitignore\"), \"*\\n\");\n const path = join(dir, \"secrets.local.json\");\n writeFileSync(path, `${JSON.stringify(values, null, 2)}\\n`);\n return { resolved, path };\n}\n","import { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { join, relative } from \"node:path\";\nimport {\n loadManifest,\n loadPlugin,\n Marketplace,\n type ParseResult,\n type Plugin,\n} from \"@michaelfromyeg/weft-schema\";\n\n/** A plugin whose files are available on disk under `root`. */\nexport interface FetchedPlugin {\n plugin: Plugin;\n root: string;\n manifestPath: string;\n /** Read a file from the plugin, relative to `root`. */\n read(relPath: string): Buffer;\n /** Recursively list files under a plugin dir, as paths relative to `root` (sorted). */\n list(relDir: string): string[];\n}\n\n/** A loaded marketplace manifest and its directory. */\nexport interface FetchedMarketplace {\n marketplace: Marketplace;\n root: string;\n manifestPath: string;\n}\n\n/** Recursively collect file paths under `dir`, relative to `root`. Deterministic order. */\nfunction walkFiles(root: string, dir: string): string[] {\n if (!(existsSync(dir) && statSync(dir).isDirectory())) return [];\n const out: string[] = [];\n for (const entry of readdirSync(dir).sort()) {\n const abs = join(dir, entry);\n if (statSync(abs).isDirectory()) out.push(...walkFiles(root, abs));\n else out.push(relative(root, abs));\n }\n return out;\n}\n\nconst MANIFEST_NAMES = [\"weft.yaml\", \"weft.yml\", \"weft.json5\", \"weft.json\"];\n\n/** Build `read`/`list` accessors rooted at a directory (used for merged plugins too). */\nexport function fileAccessors(root: string): Pick<FetchedPlugin, \"read\" | \"list\"> {\n return {\n read: (relPath: string) => readFileSync(join(root, relPath)),\n list: (relDir: string) => walkFiles(root, join(root, relDir)),\n };\n}\n\n/** Load and validate the plugin manifest in `dir`, exposing its files for adapters. */\nexport function loadPluginDir(dir: string): ParseResult<FetchedPlugin> {\n const manifestPath = MANIFEST_NAMES.map((n) => join(dir, n)).find((p) => existsSync(p));\n if (!manifestPath) {\n return {\n ok: false,\n issues: [\n { path: dir, message: `no plugin manifest found (one of: ${MANIFEST_NAMES.join(\", \")})` },\n ],\n };\n }\n\n const text = readFileSync(manifestPath, \"utf8\");\n const parsed = loadPlugin(text, { filename: manifestPath });\n if (!parsed.ok) return parsed;\n\n return {\n ok: true,\n value: { plugin: parsed.value, root: dir, manifestPath, ...fileAccessors(dir) },\n };\n}\n\nconst MARKETPLACE_NAMES = [\n \"marketplace.yaml\",\n \"marketplace.yml\",\n \"marketplace.json5\",\n \"marketplace.json\",\n];\n\n/** True when `dir` is a marketplace (a catalog of plugins) rather than a plugin. */\nexport function hasMarketplaceManifest(dir: string): boolean {\n return MARKETPLACE_NAMES.some((n) => existsSync(join(dir, n)));\n}\n\n/** Load and validate the marketplace manifest in `dir`. */\nexport function loadMarketplaceDir(dir: string): ParseResult<FetchedMarketplace> {\n const manifestPath = MARKETPLACE_NAMES.map((n) => join(dir, n)).find((p) => existsSync(p));\n if (!manifestPath) {\n return {\n ok: false,\n issues: [\n {\n path: dir,\n message: `no marketplace manifest found (one of: ${MARKETPLACE_NAMES.join(\", \")})`,\n },\n ],\n };\n }\n const text = readFileSync(manifestPath, \"utf8\");\n const parsed = loadManifest(Marketplace, text, { filename: manifestPath });\n if (!parsed.ok) return parsed;\n return { ok: true, value: { marketplace: parsed.value, root: dir, manifestPath } };\n}\n","import { createHash } from \"node:crypto\";\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { isAbsolute, join, resolve as resolvePath } from \"node:path\";\nimport type { Dependency } from \"@michaelfromyeg/weft-schema\";\nimport { execa } from \"execa\";\nimport { type FetchedPlugin, loadPluginDir } from \"./loader\";\n\nexport type Source =\n | { kind: \"local\"; path: string }\n | { kind: \"github\"; repo: string; ref?: string; subdir?: string }\n | { kind: \"git\"; url: string; ref?: string; subdir?: string }\n | { kind: \"npm\"; pkg: string; version?: string; subdir?: string };\n\n/** Where cloned/fetched remote plugins are cached. */\nexport const CACHE_DIR = join(homedir(), \".weft\", \"cache\");\n\n/**\n * Split a remote ref into its base, an optional `//subdir` (a plugin/marketplace\n * in a repo subdirectory), and an optional `#ref` (branch/tag/SHA). The leading\n * protocol's own `//` (e.g. `https://`) is ignored when finding the subdir.\n */\nfunction splitRefAndSubdir(s: string): { base: string; subdir?: string; ref?: string } {\n const hash = s.indexOf(\"#\");\n const ref = hash >= 0 ? s.slice(hash + 1) : undefined;\n const head = hash >= 0 ? s.slice(0, hash) : s;\n const proto = head.match(/^[a-z+]+:\\/\\//i)?.[0] ?? \"\";\n const rest = head.slice(proto.length);\n const slash = rest.indexOf(\"//\");\n if (slash === -1) return { base: head, ...(ref ? { ref } : {}) };\n return {\n base: proto + rest.slice(0, slash),\n subdir: rest.slice(slash + 2),\n ...(ref ? { ref } : {}),\n };\n}\n\n/** Parse a plugin/dependency source string into a structured form (spec §6.1). */\nexport function parseSource(src: string): Source {\n if (src.startsWith(\"./\") || src.startsWith(\"../\") || isAbsolute(src)) {\n return { kind: \"local\", path: src };\n }\n if (src.startsWith(\"npm:\")) {\n const raw = src.slice(\"npm:\".length);\n const slash = raw.indexOf(\"//\");\n const subdir = slash >= 0 ? raw.slice(slash + 2) : undefined;\n const spec = slash >= 0 ? raw.slice(0, slash) : raw;\n // lastIndexOf(\"@\") > 0 finds a version while leaving a scoped name's leading @.\n const at = spec.lastIndexOf(\"@\");\n const pkg = at > 0 ? spec.slice(0, at) : spec;\n const version = at > 0 ? spec.slice(at + 1) : undefined;\n return { kind: \"npm\", pkg, ...(version ? { version } : {}), ...(subdir ? { subdir } : {}) };\n }\n if (src.startsWith(\"github:\")) {\n const { base, subdir, ref } = splitRefAndSubdir(src.slice(\"github:\".length));\n return { kind: \"github\", repo: base, ...(ref ? { ref } : {}), ...(subdir ? { subdir } : {}) };\n }\n if (\n src.startsWith(\"git@\") ||\n src.startsWith(\"git+\") ||\n src.startsWith(\"file://\") ||\n /^https?:\\/\\//.test(src)\n ) {\n const { base, subdir, ref } = splitRefAndSubdir(src.replace(/^git\\+/, \"\"));\n return { kind: \"git\", url: base, ...(ref ? { ref } : {}), ...(subdir ? { subdir } : {}) };\n }\n // Bare `owner/repo` (optionally `//subdir` / `#ref`) is GitHub shorthand.\n const { base, subdir, ref } = splitRefAndSubdir(src);\n if (/^[\\w.-]+\\/[\\w.-]+$/.test(base)) {\n return { kind: \"github\", repo: base, ...(ref ? { ref } : {}), ...(subdir ? { subdir } : {}) };\n }\n return { kind: \"local\", path: src };\n}\n\nfunction cacheDirFor(key: string): string {\n return join(CACHE_DIR, createHash(\"sha256\").update(key).digest(\"hex\").slice(0, 16));\n}\n\nconst SHA_RE = /^[0-9a-f]{40}$/i;\n\n/** Clone (or refresh) a git repo into the cache and check out `ref`; return dir + SHA. */\nasync function gitFetch(\n url: string,\n ref: string | undefined,\n): Promise<{ dir: string; sha: string }> {\n mkdirSync(CACHE_DIR, { recursive: true });\n const dir = cacheDirFor(`${url}@${ref ?? \"default\"}`);\n const isSha = ref !== undefined && SHA_RE.test(ref);\n\n if (existsSync(join(dir, \".git\"))) {\n await execa(\"git\", [\"fetch\", \"origin\", ...(ref ? [ref] : [])], { cwd: dir });\n await execa(\"git\", [\"checkout\", ref ?? \"FETCH_HEAD\"], { cwd: dir, reject: false });\n } else if (isSha) {\n await execa(\"git\", [\"clone\", url, dir]);\n await execa(\"git\", [\"checkout\", ref as string], { cwd: dir });\n } else {\n const branchArgs = ref ? [\"--branch\", ref] : [];\n await execa(\"git\", [\"clone\", \"--depth\", \"1\", ...branchArgs, url, dir]);\n }\n const sha = (await execa(\"git\", [\"rev-parse\", \"HEAD\"], { cwd: dir })).stdout.trim();\n return { dir, sha };\n}\n\n/** A fetched plugin plus the ref/SHA it resolved to (for the lockfile). */\nexport interface ResolvedPlugin {\n fb: FetchedPlugin;\n ref: string;\n sha: string;\n}\n\n/**\n * Download an npm package tarball into the cache and extract it (no dependency\n * install); return the extracted package dir and its resolved version. A weft\n * plugin/marketplace published to npm is just its files inside the tarball.\n */\nasync function npmFetch(\n pkg: string,\n version: string | undefined,\n): Promise<{ dir: string; sha: string }> {\n const spec = version ? `${pkg}@${version}` : pkg;\n const dir = cacheDirFor(`npm:${spec}`);\n const pkgDir = join(dir, \"package\");\n // A pinned version is immutable, so reuse a prior extraction; an unpinned\n // (latest) spec always re-fetches to pick up a newer publish.\n if (version && existsSync(pkgDir)) return { dir: pkgDir, sha: version };\n\n mkdirSync(dir, { recursive: true });\n // `npm pack` fetches just the tarball from the registry; --json reports it.\n const { stdout } = await execa(\"npm\", [\"pack\", spec, \"--pack-destination\", dir, \"--json\"], {\n cwd: dir,\n });\n const meta = JSON.parse(stdout) as Array<{ filename: string; version?: string }>;\n const first = meta[0];\n if (!first) throw new Error(`npm pack produced no tarball for \"${spec}\"`);\n // The tarball extracts its contents under a top-level `package/` directory.\n await execa(\"tar\", [\"-xzf\", join(dir, first.filename), \"-C\", dir]);\n return { dir: pkgDir, sha: first.version ?? version ?? \"\" };\n}\n\n/** A resolved source directory on disk, plus the ref/SHA it came from. */\nexport interface ResolvedSource {\n dir: string;\n ref: string;\n sha: string;\n}\n\ntype RemoteSource = Exclude<Source, { kind: \"local\" }>;\n\n/**\n * Fetch a remote source into the cache (git clone or `npm pack`) and apply a\n * trailing `//subdir`. The single place that knows the remote-fetch matrix, so\n * both the plugin loader and the bare-dir resolver build on it.\n */\nasync function fetchSourceDir(src: RemoteSource): Promise<ResolvedSource> {\n if (src.kind === \"github\" || src.kind === \"git\") {\n const url = src.kind === \"github\" ? `https://github.com/${src.repo}.git` : src.url;\n const { dir, sha } = await gitFetch(url, src.ref);\n return { dir: src.subdir ? join(dir, src.subdir) : dir, ref: src.ref ?? \"default\", sha };\n }\n const { dir, sha } = await npmFetch(src.pkg, src.version);\n return { dir: src.subdir ? join(dir, src.subdir) : dir, ref: src.version ?? \"latest\", sha };\n}\n\n/**\n * Resolve a plugin source to a fetched plugin on disk (spec §5, §9.1 step 2).\n * Local `./path` sources resolve relative to `fromRoot`; `github:`/git sources are\n * git-cloned and pinned to a SHA; `npm:` packages are fetched via `npm pack`. A\n * trailing `//subdir` selects a plugin nested in the source.\n */\nexport async function resolvePluginRefFull(\n source: string,\n fromRoot: string,\n): Promise<ResolvedPlugin> {\n const src = parseSource(source);\n if (src.kind === \"local\") {\n const dir = isAbsolute(src.path) ? src.path : resolvePath(fromRoot, src.path);\n return { fb: loadOrThrow(dir, source), ref: \"local\", sha: \"\" };\n }\n const { dir, ref, sha } = await fetchSourceDir(src);\n return { fb: loadOrThrow(dir, source), ref, sha };\n}\n\n/**\n * Resolve an install/build target (a plugin OR a marketplace) to a directory on\n * disk: a local path is returned as-is; a remote ref (optionally with a `//subdir`)\n * is fetched into the cache. Unlike `resolvePluginRefFull` this does not load a\n * plugin, so it works for a `marketplace.yaml` target too.\n */\nexport async function resolveSourceDir(source: string, fromRoot: string): Promise<ResolvedSource> {\n // A path that exists on disk is always local; this avoids misreading a real\n // local dir like \"a/b\" as the GitHub shorthand \"owner/repo\".\n const localGuess = isAbsolute(source) ? source : resolvePath(fromRoot, source);\n if (existsSync(localGuess)) return { dir: localGuess, ref: \"local\", sha: \"\" };\n\n const src = parseSource(source);\n if (src.kind === \"local\") return { dir: localGuess, ref: \"local\", sha: \"\" };\n return await fetchSourceDir(src);\n}\n\n/** Convenience: resolve and return only the fetched plugin. */\nexport async function resolvePluginRef(source: string, fromRoot: string): Promise<FetchedPlugin> {\n return (await resolvePluginRefFull(source, fromRoot)).fb;\n}\n\nfunction loadOrThrow(dir: string, source: string): FetchedPlugin {\n const loaded = loadPluginDir(dir);\n if (!loaded.ok) {\n throw new Error(\n `failed to load \"${source}\":\\n${loaded.issues.map((i) => ` ${i.path}: ${i.message}`).join(\"\\n\")}`,\n );\n }\n return loaded.value;\n}\n\n/** Resolve a `depends` entry to a fetched plugin (relative to the depending plugin root). */\nexport function resolveDependency(dep: Dependency, fromRoot: string): Promise<ResolvedPlugin> {\n return resolvePluginRefFull(dep.plugin, fromRoot);\n}\n\n/** Best-effort git ref + SHA for the lockfile. Returns sentinels outside a repo. */\nexport async function gitInfo(dir: string): Promise<{ ref: string; sha: string }> {\n try {\n const sha = (await execa(\"git\", [\"rev-parse\", \"HEAD\"], { cwd: dir })).stdout.trim();\n let ref = \"HEAD\";\n try {\n ref = (\n await execa(\"git\", [\"describe\", \"--tags\", \"--exact-match\"], { cwd: dir })\n ).stdout.trim();\n } catch {\n try {\n ref = (\n await execa(\"git\", [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], { cwd: dir })\n ).stdout.trim();\n } catch {\n /* keep HEAD */\n }\n }\n return { ref, sha };\n } catch {\n return { ref: \"local\", sha: \"\" };\n }\n}\n","import { cpSync, mkdtempSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport {\n type Component,\n type ComponentKind,\n kindOf,\n leafNameOf,\n refOf,\n} from \"@michaelfromyeg/weft-schema\";\nimport { type FetchedPlugin, fileAccessors } from \"./loader\";\nimport { resolveDependency } from \"./resolve\";\n\nconst KIND_KEY: Record<ComponentKind, string> = {\n skill: \"skill\",\n mcp: \"mcp\",\n agent: \"agent\",\n hook: \"hook\",\n command: \"command\",\n passthrough: \"passthrough\",\n};\n\nfunction rewriteRef(c: Component, newRef: string): Component {\n return { ...c, [KIND_KEY[kindOf(c)]]: newRef } as Component;\n}\n\nconst skipGit = (src: string): boolean => !/\\/\\.git(\\/|$)/.test(src);\n\nexport interface DependencyRecord {\n id: string;\n range: string;\n resolvedSha: string;\n}\n\nexport interface ResolvedDeps {\n fb: FetchedPlugin;\n dependencies: DependencyRecord[];\n}\n\n/**\n * Resolve a plugin's `depends` (spec §9.1 step 2). Each dependency is fetched\n * (locally or git-cloned and pinned to a SHA), then its selected components are\n * vendored into a merged temp tree under `_deps/<name>/` and registered under the\n * consuming plugin's namespace. Piecemeal `components:[…]` selects which to\n * register, but the whole dep tree is copied so shared assets travel (drift-aware).\n * Direct cycles are detected by id.\n */\nexport async function resolveDependencies(\n fb: FetchedPlugin,\n tmpRoot?: string,\n): Promise<ResolvedDeps> {\n const depends = fb.plugin.depends ?? [];\n if (depends.length === 0) return { fb, dependencies: [] };\n\n const merged = mkdtempSync(join(tmpRoot ?? tmpdir(), \"weft-merged-\"));\n cpSync(fb.root, merged, { recursive: true, filter: skipGit });\n\n const components: Component[] = [...fb.plugin.components];\n const dependencies: DependencyRecord[] = [];\n const seen = new Set<string>([`${fb.plugin.owner.namespace}/${fb.plugin.name}`]);\n\n for (const dep of depends) {\n const resolved = await resolveDependency(dep, fb.root);\n const dp = resolved.fb.plugin;\n const depId = `${dp.owner.namespace}/${dp.name}`;\n if (seen.has(depId)) throw new Error(`dependency cycle detected at ${depId}`);\n seen.add(depId);\n\n const want = dep.components;\n if (want) {\n const missing = want.filter((leaf) => !dp.components.some((c) => leafNameOf(c) === leaf));\n if (missing.length > 0) {\n throw new Error(`dependency ${depId} has no component(s): ${missing.join(\", \")}`);\n }\n }\n const selected = dp.components.filter((c) => !want || want.includes(leafNameOf(c)));\n\n const destBase = join(\"_deps\", dp.name);\n cpSync(resolved.fb.root, join(merged, destBase), { recursive: true, filter: skipGit });\n for (const c of selected) components.push(rewriteRef(c, join(destBase, refOf(c))));\n\n dependencies.push({ id: depId, range: dep.version ?? \"*\", resolvedSha: resolved.sha });\n }\n\n const plugin = { ...fb.plugin, components };\n const mergedFb: FetchedPlugin = {\n plugin,\n root: merged,\n manifestPath: join(merged, \"weft.yaml\"),\n ...fileAccessors(merged),\n };\n return { fb: mergedFb, dependencies };\n}\n","import { execSync } from \"node:child_process\";\nimport type { HarnessAdapter } from \"@michaelfromyeg/weft-adapter-kit\";\nimport type { Target } from \"@michaelfromyeg/weft-schema\";\nimport semver from \"semver\";\n\n/**\n * The result of comparing an installed/declared harness version against the\n * range an adapter's emitted format is verified for (versioning axis 4, spec §5).\n */\nexport interface HarnessCheck {\n target: Target;\n /** Human-facing harness name (from the adapter). */\n name: string;\n /** Supported semver range the adapter's format is known-good for. */\n range: string;\n /** The version compared against `range`; null when undeclared and undetectable. */\n version: string | null;\n /** Where `version` came from. */\n source: \"declared\" | \"detected\" | \"unknown\";\n /** true/false once a version is known; null when none could be determined. */\n satisfied: boolean | null;\n}\n\n/**\n * Best-effort: run the adapter's `versionCommand` and coerce a semver from its\n * output. Returns null on any failure (binary absent, non-zero exit, no semver\n * in the output) -- a harness we can't see is simply not checked, never an error.\n */\nexport function detectHarnessVersion(versionCommand: string): string | null {\n try {\n const out = execSync(versionCommand, {\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n timeout: 5000,\n }).toString();\n return semver.coerce(out)?.version ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Compare the harness version against the adapter's supported `range`. A caller-\n * `declared` version (e.g. from `--harness codex@0.130`, the CI path) wins over\n * auto-detection; `detect=false` skips spawning the version command for hermetic\n * builds. Returns null for adapters that declare no `harness` block.\n */\nexport function checkHarness(\n adapter: HarnessAdapter,\n declared: string | undefined,\n detect: boolean,\n): HarnessCheck | null {\n const h = adapter.harness;\n if (!h) return null;\n\n let version: string | null = null;\n let source: HarnessCheck[\"source\"] = \"unknown\";\n if (declared) {\n version = semver.coerce(declared)?.version ?? null;\n if (version) source = \"declared\";\n } else if (detect && h.versionCommand) {\n version = detectHarnessVersion(h.versionCommand);\n if (version) source = \"detected\";\n }\n\n return {\n target: adapter.target,\n name: h.name,\n range: h.range,\n version,\n source,\n satisfied: version ? semver.satisfies(version, h.range) : null,\n };\n}\n\n/** Run {@link checkHarness} for each adapter, dropping those without a `harness` block. */\nexport function checkHarnesses(\n adapters: HarnessAdapter[],\n declared: Record<string, string> | undefined,\n detect: boolean,\n): HarnessCheck[] {\n const checks: HarnessCheck[] = [];\n for (const adapter of adapters) {\n const check = checkHarness(adapter, declared?.[adapter.target], detect);\n if (check) checks.push(check);\n }\n return checks;\n}\n","import { readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport {\n type ArtifactRecord,\n Lockfile,\n type PluginLock,\n type Scope,\n validate,\n} from \"@michaelfromyeg/weft-schema\";\nimport type { CompileResult } from \"./compile\";\nimport { WEFT_VERSION } from \"./version\";\n\n/** One plugin's contribution to a lockfile: its record, placed artifacts, and adapters used. */\nexport interface LockEntry {\n pluginLock: PluginLock;\n artifacts: ArtifactRecord[];\n adapters: Lockfile[\"adapters\"];\n}\n\nexport interface LockEntryInput {\n result: CompileResult;\n artifacts: ArtifactRecord[];\n ref: string;\n sha: string;\n dependencies?: PluginLock[\"dependencies\"];\n}\n\n/** Build one plugin's lock entry from its compiled result and placement (spec §6.3). */\nexport function buildLockEntry(input: LockEntryInput): LockEntry {\n const adapters: Lockfile[\"adapters\"] = {};\n for (const t of input.result.targets) {\n adapters[t.target] = {\n version: t.adapter.version,\n targetSchema: t.adapter.targetSchema,\n ...(t.adapter.harness ? { harnessRange: t.adapter.harness.range } : {}),\n };\n }\n return {\n pluginLock: {\n id: input.result.id,\n version: input.result.fb.plugin.version,\n ref: input.ref,\n sha: input.sha,\n dependencies: input.dependencies ?? [],\n aliases: input.result.aliases,\n },\n artifacts: input.artifacts,\n adapters,\n };\n}\n\n/**\n * Merge install entries into an existing target lockfile (or a fresh one),\n * upserting by plugin id: a re-installed plugin replaces its prior record and\n * artifacts, leaving every other installed plugin in the ledger untouched.\n */\nexport function mergeLock(\n existing: Lockfile | null,\n entries: LockEntry[],\n generatedAt: string,\n): Lockfile {\n const replacing = new Set(entries.map((e) => e.pluginLock.id));\n const plugins = (existing?.plugins ?? []).filter((p) => !replacing.has(p.id));\n const artifacts = (existing?.artifacts ?? []).filter((a) => !replacing.has(a.plugin));\n const adapters: Lockfile[\"adapters\"] = { ...(existing?.adapters ?? {}) };\n for (const e of entries) {\n plugins.push(e.pluginLock);\n artifacts.push(...e.artifacts);\n Object.assign(adapters, e.adapters);\n }\n return { weftVersion: WEFT_VERSION, generatedAt, plugins, artifacts, adapters };\n}\n\n/**\n * Where a target's `weft.lock` lives: the project root for project scope, a\n * per-user dir for user scope. The lock travels with the install target, not the\n * (possibly remote, read-only) source.\n */\nexport function lockDirForScope(scope: Scope, cwd: string): string {\n return scope === \"user\" ? join(homedir(), \".weft\") : cwd;\n}\n\nexport function serializeLock(lock: Lockfile): string {\n return `${JSON.stringify(lock, null, 2)}\\n`;\n}\n\nexport function writeLock(dir: string, lock: Lockfile): string {\n const p = join(dir, \"weft.lock\");\n writeFileSync(p, serializeLock(lock));\n return p;\n}\n\n/** Read and validate an existing lockfile; null when absent or malformed. */\nexport function readLock(dir: string): Lockfile | null {\n try {\n const text = readFileSync(join(dir, \"weft.lock\"), \"utf8\");\n const res = validate(Lockfile, JSON.parse(text));\n return res.ok ? res.value : null;\n } catch {\n return null;\n }\n}\n","import type { Badge } from \"@michaelfromyeg/weft-schema\";\n\n/**\n * A managed-mode install policy (spec §11 rule 5): the same install mechanism as\n * a solo dev, restricted by scope + policy. An enterprise pins an allowlist of\n * namespaces and/or required badges; only scope and policy differ, never mechanism.\n */\nexport interface ManagedPolicy {\n /** Only these reverse-DNS namespaces may be installed. */\n allowNamespaces?: string[];\n /** Each installed plugin must carry all of these badges. */\n requireBadges?: Badge[];\n}\n\nexport interface PolicyContext {\n namespace: string;\n badges?: Badge[];\n}\n\n/** A blocking reason when the policy forbids the install, or null when permitted. */\nexport function checkManagedPolicy(\n policy: ManagedPolicy | undefined,\n ctx: PolicyContext,\n): string | null {\n if (!policy) return null;\n if (policy.allowNamespaces && !policy.allowNamespaces.includes(ctx.namespace)) {\n return `namespace \"${ctx.namespace}\" is not allowlisted (managed mode allows: ${policy.allowNamespaces.join(\", \")})`;\n }\n if (policy.requireBadges && policy.requireBadges.length > 0) {\n const have = new Set(ctx.badges ?? []);\n const missing = policy.requireBadges.filter((b) => !have.has(b));\n if (missing.length > 0) return `plugin is missing required badge(s): ${missing.join(\", \")}`;\n }\n return null;\n}\n","import { createHash } from \"node:crypto\";\n\n/** sha256 of compiled output, used for content-addressed update + the signed badge. */\nexport function sha256(contents: string | Buffer): string {\n return createHash(\"sha256\").update(contents).digest(\"hex\");\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type {\n ArtifactKind,\n HarnessAdapter,\n ResolvedMarketplace,\n} from \"@michaelfromyeg/weft-adapter-kit\";\nimport type { ArtifactRecord, Scope, Target } from \"@michaelfromyeg/weft-schema\";\nimport { type CompileResult, synthMarketplace, type TargetOutput } from \"./compile\";\nimport { sha256 } from \"./hash\";\n\nexport interface WrittenArtifact {\n target: Target;\n /** Relative to the per-target output base. */\n relPath: string;\n abs: string;\n hash: string;\n kind?: ArtifactKind;\n}\n\n/** A planned artifact: where it would land and its content hash, not yet written. */\nexport interface PlannedWrite extends WrittenArtifact {\n contents: Buffer;\n}\n\n/** Where one plugin's artifacts would land under `<baseDir>/plugins/<pluginName>/`, with hashes. */\nexport function planPluginArtifacts(\n target: TargetOutput,\n baseDir: string,\n pluginName: string,\n): PlannedWrite[] {\n // Flat adapters drop the plugins/<name>/ grouping (directory-convention harnesses).\n return target.artifacts.map(({ artifact }) => {\n const rel = target.adapter.flat\n ? artifact.relPath\n : join(\"plugins\", pluginName, artifact.relPath);\n const contents = toBuffer(artifact.contents);\n return {\n target: target.target,\n relPath: rel,\n abs: join(baseDir, rel),\n hash: sha256(contents),\n kind: artifact.kind,\n contents,\n };\n });\n}\n\n/** Where a harness's native catalog would land at `<baseDir>/`, with hashes. */\nexport function planCatalog(\n adapter: HarnessAdapter,\n marketplace: ResolvedMarketplace,\n baseDir: string,\n): PlannedWrite[] {\n return adapter.emitCatalog(marketplace).map((artifact) => {\n const contents = toBuffer(artifact.contents);\n return {\n target: adapter.target,\n relPath: artifact.relPath,\n abs: join(baseDir, artifact.relPath),\n hash: sha256(contents),\n kind: artifact.kind,\n contents,\n };\n });\n}\n\n/**\n * `weft build` placement plan for a single plugin (spec §9.1 step 6, inspect-only):\n * the plugin tree at `outDir/<target>/plugins/<plugin>/` plus a synthetic one-entry\n * catalog at the target root. `bare` writes straight to outDir (one target only) so a\n * repo root becomes the harness's native marketplace.\n */\nexport function planBuild(result: CompileResult, outDir: string, bare = false): PlannedWrite[] {\n const planned: PlannedWrite[] = [];\n const { plugin } = result.fb;\n const marketplace = synthMarketplace(plugin);\n for (const t of result.targets) {\n const base = bare ? outDir : join(outDir, t.target);\n planned.push(...planPluginArtifacts(t, base, plugin.name));\n planned.push(...planCatalog(t.adapter, marketplace, base));\n }\n return planned;\n}\n\n/** Write each planned artifact to disk (mkdir as needed); drops `contents` from the result. */\nexport function writePlanned(planned: PlannedWrite[]): WrittenArtifact[] {\n return planned.map(({ contents, ...rest }) => {\n mkdirSync(dirname(rest.abs), { recursive: true });\n writeFileSync(rest.abs, contents);\n return rest;\n });\n}\n\nexport interface DriftReport {\n clean: boolean;\n /** relPaths the build would create that are absent on disk. */\n missing: string[];\n /** relPaths whose on-disk content differs from the compiled artifact. */\n stale: string[];\n /** Total artifacts compared. */\n checked: number;\n}\n\n/**\n * Compare a build plan against what is on disk, reading only (never writes). Backs\n * `weft build --check`: a committed `--bare` marketplace that drifted from source\n * shows up as `stale`/`missing` so CI can fail before publish. Does NOT detect\n * orphans (files a prior build wrote that this one no longer would) -- that needs\n * the lockfile's history and belongs to `weft diff`.\n */\nexport function diffPlanned(planned: PlannedWrite[]): DriftReport {\n const missing: string[] = [];\n const stale: string[] = [];\n for (const p of planned) {\n if (!existsSync(p.abs)) missing.push(p.relPath);\n else if (sha256(readFileSync(p.abs)) !== p.hash) stale.push(p.relPath);\n }\n return {\n clean: missing.length === 0 && stale.length === 0,\n missing,\n stale,\n checked: planned.length,\n };\n}\n\n/** Write one plugin's artifacts under `<baseDir>/plugins/<pluginName>/`. */\nexport function placePluginArtifacts(\n target: TargetOutput,\n baseDir: string,\n pluginName: string,\n): WrittenArtifact[] {\n return writePlanned(planPluginArtifacts(target, baseDir, pluginName));\n}\n\n/** Emit and write a harness's native catalog at `<baseDir>/`. */\nexport function placeCatalog(\n adapter: HarnessAdapter,\n marketplace: ResolvedMarketplace,\n baseDir: string,\n): WrittenArtifact[] {\n return writePlanned(planCatalog(adapter, marketplace, baseDir));\n}\n\n/** Compile-and-write a single plugin's build output (write-mode `weft build`). */\nexport function buildToDir(result: CompileResult, outDir: string, bare = false): WrittenArtifact[] {\n return writePlanned(planBuild(result, outDir, bare));\n}\n\nfunction toBuffer(contents: string | Buffer): Buffer {\n return typeof contents === \"string\" ? Buffer.from(contents, \"utf8\") : contents;\n}\n\nexport interface PlannedArtifact {\n record: ArtifactRecord;\n contents: Buffer;\n}\n\n/**\n * Compute (without writing) where each target's plugin tree would land in the\n * scope, with content hashes. Drives both install (write all) and update (write\n * only what changed). Executable/passthrough artifacts are recorded DISABLED (§11).\n */\nexport function planScopeArtifacts(\n result: CompileResult,\n scope: Scope,\n cwd: string,\n): PlannedArtifact[] {\n const planned: PlannedArtifact[] = [];\n const name = result.fb.plugin.name;\n for (const t of result.targets) {\n const paths = t.adapter.detect(scope, cwd);\n // Flat adapters place under the scope dir directly, no plugins/<name>/ grouping.\n const pluginDir = t.adapter.flat ? paths.plugins : join(paths.plugins, name);\n for (const { componentId, artifact } of t.artifacts) {\n const contents = toBuffer(artifact.contents);\n planned.push({\n contents,\n record: {\n plugin: result.id,\n component: componentId,\n target: t.target,\n scope,\n path: join(pluginDir, artifact.relPath),\n hash: sha256(contents),\n placement: \"copy\",\n enabled: artifact.executable !== true,\n },\n });\n }\n }\n return planned;\n}\n\n/** `weft install` placement (spec §9.1 step 6): write every artifact, record each. */\nexport function installToScope(result: CompileResult, scope: Scope, cwd: string): ArtifactRecord[] {\n return planScopeArtifacts(result, scope, cwd).map(({ record, contents }) => {\n mkdirSync(dirname(record.path), { recursive: true });\n writeFileSync(record.path, contents);\n return record;\n });\n}\n","import { existsSync, mkdirSync, readdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { CatalogEntry, ResolvedMarketplace } from \"@michaelfromyeg/weft-adapter-kit\";\nimport type {\n Badge,\n Lockfile,\n Marketplace,\n ParseIssue,\n Plugin,\n Scope,\n Target,\n} from \"@michaelfromyeg/weft-schema\";\nimport { type CompileResult, compile, staticPass } from \"./compile\";\nimport { resolveConfig, type SecretsResult } from \"./config\";\nimport { type DependencyRecord, resolveDependencies } from \"./deps\";\nimport { CompileError, type Diagnostic, type Diagnostics } from \"./diagnostics\";\nimport { checkHarnesses, type HarnessCheck } from \"./harness\";\nimport { type FetchedPlugin, loadMarketplaceDir, loadPluginDir } from \"./loader\";\nimport {\n buildLockEntry,\n type LockEntry,\n lockDirForScope,\n mergeLock,\n readLock,\n writeLock,\n} from \"./lockfile\";\nimport { checkManagedPolicy, type ManagedPolicy } from \"./managed\";\nimport {\n type DriftReport,\n diffPlanned,\n installToScope,\n type PlannedWrite,\n planBuild,\n planCatalog,\n planPluginArtifacts,\n planScopeArtifacts,\n type WrittenArtifact,\n writePlanned,\n} from \"./place\";\nimport type { AdapterRegistry } from \"./registry\";\nimport { gitInfo, type ResolvedPlugin, resolvePluginRefFull } from \"./resolve\";\n\n/** Load a plugin and resolve its `depends` into a merged tree (spec §9.1 step 2). */\nfunction loadResolved(\n pluginDir: string,\n): Promise<{ fb: FetchedPlugin; dependencies: DependencyRecord[] }> {\n return resolveDependencies(loadOrThrow(pluginDir));\n}\n\nfunction issuesToDiagnostics(issues: ParseIssue[]): Diagnostic[] {\n return issues.map((i) => ({ severity: \"error\", where: i.path, message: i.message }));\n}\n\nfunction loadOrThrow(pluginDir: string) {\n const loaded = loadPluginDir(pluginDir);\n if (!loaded.ok) {\n throw new CompileError(\n `failed to load plugin in ${pluginDir}`,\n issuesToDiagnostics(loaded.issues),\n );\n }\n return loaded.value;\n}\n\nexport interface LintResult {\n id: string;\n plugin: Plugin;\n aliases: Record<string, string>;\n diagnostics: Diagnostics;\n}\n\n/** Load + statically validate a plugin without running any adapter (the valid badge). */\nexport function lint(pluginDir: string): LintResult {\n const fb = loadOrThrow(pluginDir);\n const pass = staticPass(fb);\n return { id: pass.id, plugin: fb.plugin, aliases: pass.aliases, diagnostics: pass.diagnostics };\n}\n\nexport interface BuildOptions {\n pluginDir: string;\n outDir: string;\n registry: AdapterRegistry;\n targets?: Target[];\n /** Write straight to outDir without the <target>/ subdir (single target only). */\n bare?: boolean;\n /** Compare against on-disk output instead of writing; populates `drift`, writes nothing. */\n check?: boolean;\n /** Per-target harness version to compare against (e.g. {codex: \"0.130\"}); skips detection. */\n harnessVersions?: Record<string, string>;\n /** Set true to detect installed harness versions via their CLIs (the CLI enables this;\n * off by default so the library stays hermetic). Declared `harnessVersions` are always checked. */\n harnessCheck?: boolean;\n}\n\nexport interface BuildResult {\n result: CompileResult;\n /** The artifacts written (or, in check mode, the artifacts a write would produce). */\n written: WrittenArtifact[];\n /** Present only in check mode: how the on-disk output differs from a fresh compile. */\n drift?: DriftReport;\n /** Harness version-compat findings, one per built target that declares a `harness` (axis 4). */\n harnessChecks: HarnessCheck[];\n}\n\n/** Drop the planned contents so a plan can be reported as `written` (check mode). */\nfunction asWritten(planned: PlannedWrite[]): WrittenArtifact[] {\n return planned.map(({ contents: _contents, ...rest }) => rest);\n}\n\n/** Compile a plugin and write its marketplace + plugin layout into `outDir` (no install). */\nexport async function build(opts: BuildOptions): Promise<BuildResult> {\n const { fb } = await loadResolved(opts.pluginDir);\n const result = compile(fb, { registry: opts.registry, targets: opts.targets });\n if (result.diagnostics.hasErrors) {\n throw new CompileError(\"compile failed\", result.diagnostics.errors);\n }\n const harnessChecks = checkHarnesses(\n result.targets.map((t) => t.adapter),\n opts.harnessVersions,\n opts.harnessCheck === true,\n );\n const planned = planBuild(result, opts.outDir, opts.bare);\n if (opts.check) {\n return { result, written: asWritten(planned), drift: diffPlanned(planned), harnessChecks };\n }\n return { result, written: writePlanned(planned), harnessChecks };\n}\n\nexport interface BuildMarketplaceOptions {\n marketplaceDir: string;\n outDir: string;\n registry: AdapterRegistry;\n targets?: Target[];\n /** Write straight to outDir without the <target>/ subdir (single target only). */\n bare?: boolean;\n /** Compare against on-disk output instead of writing; populates `drift`, writes nothing. */\n check?: boolean;\n /** Per-target harness version to compare against (e.g. {codex: \"0.130\"}); skips detection. */\n harnessVersions?: Record<string, string>;\n /** Set true to detect installed harness versions via their CLIs (the CLI enables this;\n * off by default so the library stays hermetic). Declared `harnessVersions` are always checked. */\n harnessCheck?: boolean;\n}\n\nexport interface BuildMarketplaceResult {\n marketplace: Marketplace;\n plugins: CompileResult[];\n /** The artifacts written (or, in check mode, the artifacts a write would produce). */\n written: WrittenArtifact[];\n /** Present only in check mode: how the on-disk output differs from a fresh compile. */\n drift?: DriftReport;\n /** Harness version-compat findings, one per built target that declares a `harness` (axis 4). */\n harnessChecks: HarnessCheck[];\n}\n\n/**\n * Compile a curated `marketplace.yaml` of many plugins: resolve and compile each\n * referenced plugin, place every plugin tree under `outDir/<target>/plugins/`,\n * and emit ONE native catalog per target listing them all (spec §6.2). This is\n * the company-marketplace workflow.\n */\nexport async function buildMarketplace(\n opts: BuildMarketplaceOptions,\n): Promise<BuildMarketplaceResult> {\n const loaded = loadMarketplaceDir(opts.marketplaceDir);\n if (!loaded.ok) {\n throw new CompileError(\n `failed to load marketplace in ${opts.marketplaceDir}`,\n issuesToDiagnostics(loaded.issues),\n );\n }\n const { marketplace, root } = loaded.value;\n\n const compiled: Array<{ entry: Marketplace[\"plugins\"][number]; result: CompileResult }> = [];\n for (const entry of marketplace.plugins) {\n let fb: FetchedPlugin;\n try {\n fb = (await resolvePluginRefFull(entry.plugin, root)).fb;\n } catch (err) {\n throw new CompileError(`marketplace entry \"${entry.plugin}\" failed`, [\n { severity: \"error\", where: \"plugins\", message: (err as Error).message },\n ]);\n }\n // An entry version override flows into the compiled plugin.json too, so the\n // catalog and the plugin manifest agree (plugin.json wins at install time).\n if (entry.version) fb = { ...fb, plugin: { ...fb.plugin, version: entry.version } };\n // Resolve the entry plugin's own dependencies before compiling it.\n const merged = (await resolveDependencies(fb)).fb;\n const result = compile(merged, { registry: opts.registry, targets: opts.targets });\n if (result.diagnostics.hasErrors) {\n throw new CompileError(`plugin \"${result.id}\" failed`, result.diagnostics.errors);\n }\n compiled.push({ entry, result });\n }\n\n const targets = opts.targets ?? opts.registry.targets;\n const planned: PlannedWrite[] = [];\n for (const target of targets) {\n const adapter = opts.registry.get(target);\n if (!adapter) continue;\n const base = opts.bare ? opts.outDir : join(opts.outDir, target);\n const entries: CatalogEntry[] = [];\n for (const { entry, result } of compiled) {\n const output = result.targets.find((t) => t.target === target);\n if (!output) continue;\n const p = result.fb.plugin;\n planned.push(...planPluginArtifacts(output, base, p.name));\n entries.push({\n name: p.name,\n source: `./plugins/${p.name}`,\n ...(p.description ? { description: p.description } : {}),\n version: entry.version ?? p.version,\n ...(entry.category ? { category: entry.category } : {}),\n ...(entry.tags ? { tags: entry.tags } : {}),\n });\n }\n const resolved: ResolvedMarketplace = {\n name: marketplace.name,\n owner: marketplace.owner,\n ...(marketplace.description ? { description: marketplace.description } : {}),\n entries,\n };\n planned.push(...planCatalog(adapter, resolved, base));\n }\n\n const adapters = targets\n .map((t) => opts.registry.get(t))\n .filter((a): a is NonNullable<typeof a> => a !== undefined);\n const harnessChecks = checkHarnesses(adapters, opts.harnessVersions, opts.harnessCheck === true);\n\n const plugins = compiled.map((c) => c.result);\n if (opts.check) {\n return {\n marketplace,\n plugins,\n written: asWritten(planned),\n drift: diffPlanned(planned),\n harnessChecks,\n };\n }\n return { marketplace, plugins, written: writePlanned(planned), harnessChecks };\n}\n\nexport interface InstallOptions {\n pluginDir: string;\n scope: Scope;\n cwd: string;\n registry: AdapterRegistry;\n targets?: Target[];\n /** Piecemeal: install only these component leaf names (spec §9.2). */\n only?: string[];\n /** Managed-mode policy: namespace allowlist / required badges (spec §11). */\n managed?: ManagedPolicy;\n /** Badges known for this plugin (for managed `requireBadges`). */\n badges?: Badge[];\n /** Where to write `weft.lock` (default: the plugin dir). Eval points this at a scratch dir. */\n lockDir?: string;\n /** Inject the lockfile timestamp for deterministic tests. */\n now?: string;\n}\n\n/** One plugin's install output: its compiled result, lock entry, and config summary. */\nexport interface PluginInstall {\n result: CompileResult;\n entry: LockEntry;\n /** Declared config resolution summary (never the values) -- spec §11. */\n secrets: SecretsResult;\n}\n\nexport interface InstallResult extends PluginInstall {\n /** The merged target lockfile (every plugin installed into this target). */\n lockfile: Lockfile;\n lockPath: string;\n}\n\n/** Compile an already-resolved plugin and place it into the scope (no lock write). */\nfunction installResolved(\n fb: FetchedPlugin,\n dependencies: DependencyRecord[],\n opts: {\n scope: Scope;\n cwd: string;\n registry: AdapterRegistry;\n targets?: Target[];\n only?: string[];\n managed?: ManagedPolicy;\n badges?: Badge[];\n ref: string;\n sha: string;\n },\n): PluginInstall {\n const result = compile(fb, { registry: opts.registry, targets: opts.targets, only: opts.only });\n if (result.diagnostics.hasErrors) {\n throw new CompileError(\"compile failed\", result.diagnostics.errors);\n }\n // Managed mode gates the install by namespace / required badges (spec §11).\n const blocked = checkManagedPolicy(opts.managed, {\n namespace: result.fb.plugin.owner.namespace,\n badges: opts.badges,\n });\n if (blocked) {\n throw new CompileError(\"install blocked by managed policy\", [\n { severity: \"error\", where: \"managed\", message: blocked },\n ]);\n }\n const artifacts = installToScope(result, opts.scope, opts.cwd);\n const secrets = resolveConfig(result.fb.plugin, opts.cwd);\n const entry = buildLockEntry({ result, artifacts, dependencies, ref: opts.ref, sha: opts.sha });\n return { result, entry, secrets };\n}\n\n/** Merge install entries into the target's `weft.lock` and write it once. */\nfunction commitLock(\n scope: Scope,\n cwd: string,\n entries: LockEntry[],\n now: string | undefined,\n lockDirOverride: string | undefined,\n): { lockfile: Lockfile; lockPath: string } {\n const dir = lockDirOverride ?? lockDirForScope(scope, cwd);\n mkdirSync(dir, { recursive: true });\n const lockfile = mergeLock(readLock(dir), entries, now ?? new Date().toISOString());\n return { lockfile, lockPath: writeLock(dir, lockfile) };\n}\n\n/** Compile a plugin, place it into the scope, resolve config, write the target `weft.lock`. */\nexport async function install(opts: InstallOptions): Promise<InstallResult> {\n const { fb, dependencies } = await loadResolved(opts.pluginDir);\n const { ref, sha } = await gitInfo(opts.pluginDir);\n const pi = installResolved(fb, dependencies, {\n scope: opts.scope,\n cwd: opts.cwd,\n registry: opts.registry,\n ref,\n sha,\n targets: opts.targets,\n only: opts.only,\n managed: opts.managed,\n badges: opts.badges,\n });\n const { lockfile, lockPath } = commitLock(\n opts.scope,\n opts.cwd,\n [pi.entry],\n opts.now,\n opts.lockDir,\n );\n return { ...pi, lockfile, lockPath };\n}\n\nexport interface InstallMarketplaceOptions {\n marketplaceDir: string;\n scope: Scope;\n cwd: string;\n registry: AdapterRegistry;\n targets?: Target[];\n managed?: ManagedPolicy;\n lockDir?: string;\n now?: string;\n}\n\nexport interface InstallMarketplaceResult {\n marketplace: Marketplace;\n /** The merged target lockfile recording every installed plugin. */\n lockfile: Lockfile;\n lockPath: string;\n /** One install per marketplace plugin, in catalog order. */\n installs: PluginInstall[];\n}\n\n/**\n * Install every plugin in a marketplace into the scope in one pass (the\n * company-marketplace install). Each plugin is resolved (local or remote),\n * compiled, and placed; all of them land in a single target `weft.lock`,\n * mirroring a single-plugin install at marketplace scale (same primitives).\n */\nexport async function installMarketplace(\n opts: InstallMarketplaceOptions,\n): Promise<InstallMarketplaceResult> {\n const loaded = loadMarketplaceDir(opts.marketplaceDir);\n if (!loaded.ok) {\n throw new CompileError(\n `failed to load marketplace in ${opts.marketplaceDir}`,\n issuesToDiagnostics(loaded.issues),\n );\n }\n const { marketplace, root } = loaded.value;\n\n const installs: PluginInstall[] = [];\n for (const entry of marketplace.plugins) {\n let resolved: ResolvedPlugin;\n try {\n resolved = await resolvePluginRefFull(entry.plugin, root);\n } catch (err) {\n throw new CompileError(`marketplace entry \"${entry.plugin}\" failed`, [\n { severity: \"error\", where: \"plugins\", message: (err as Error).message },\n ]);\n }\n // An entry version override flows into the installed plugin (catalog wins).\n let fb = resolved.fb;\n if (entry.version) fb = { ...fb, plugin: { ...fb.plugin, version: entry.version } };\n const { fb: merged, dependencies } = await resolveDependencies(fb);\n installs.push(\n installResolved(merged, dependencies, {\n scope: opts.scope,\n cwd: opts.cwd,\n registry: opts.registry,\n ref: resolved.ref,\n sha: resolved.sha,\n targets: opts.targets,\n managed: opts.managed,\n }),\n );\n }\n const { lockfile, lockPath } = commitLock(\n opts.scope,\n opts.cwd,\n installs.map((i) => i.entry),\n opts.now,\n opts.lockDir,\n );\n return { marketplace, lockfile, lockPath, installs };\n}\n\nexport interface UninstallOptions {\n /** The install target that holds weft.lock (project root for project scope). */\n dir: string;\n /** Optionally remove just one plugin (by id or bare name); default removes all. */\n plugin?: string;\n}\n\nexport interface UninstallResult {\n removed: string[];\n /** Plugin ids removed from the lock. */\n plugins: string[];\n}\n\n/** Prune now-empty directories upward from each removed file (best-effort). */\nfunction pruneEmptyDirs(paths: string[]): void {\n const dirs = new Set(paths.map((p) => dirname(p)));\n for (const start of dirs) {\n let d = start;\n while (d && d !== dirname(d)) {\n try {\n if (readdirSync(d).length > 0) break;\n rmSync(d, { recursive: true, force: true });\n } catch {\n break;\n }\n d = dirname(d);\n }\n }\n}\n\n/**\n * Remove what `install` placed into a target, using the paths recorded in the\n * target's `weft.lock` (spec §6.3). Removes one plugin (by id or bare name) or\n * all of them; deletes the lock when nothing is left, else rewrites the rest.\n * Errors are defined out of existence: a missing artifact is simply skipped.\n */\nexport function uninstall(opts: UninstallOptions): UninstallResult {\n const lock = readLock(opts.dir);\n if (!lock) {\n throw new CompileError(\"nothing to uninstall\", [\n { severity: \"error\", where: \"weft.lock\", message: `no weft.lock found in ${opts.dir}` },\n ]);\n }\n const match = opts.plugin;\n const ids = new Set(\n (match\n ? lock.plugins.filter((p) => p.id === match || p.id.endsWith(`/${match}`))\n : lock.plugins\n ).map((p) => p.id),\n );\n if (match && ids.size === 0) {\n throw new CompileError(`plugin \"${match}\" is not installed here`, [\n { severity: \"error\", where: \"weft.lock\", message: `no plugin matching \"${match}\"` },\n ]);\n }\n\n const removed: string[] = [];\n for (const a of lock.artifacts) {\n if (!ids.has(a.plugin)) continue;\n if (existsSync(a.path)) {\n rmSync(a.path, { force: true });\n removed.push(a.path);\n }\n }\n pruneEmptyDirs(removed);\n\n const remaining = lock.plugins.filter((p) => !ids.has(p.id));\n if (remaining.length === 0) {\n rmSync(join(opts.dir, \"weft.lock\"), { force: true });\n } else {\n writeLock(opts.dir, {\n ...lock,\n plugins: remaining,\n artifacts: lock.artifacts.filter((a) => !ids.has(a.plugin)),\n });\n }\n return { removed, plugins: [...ids] };\n}\n\nexport interface UpdateResult {\n /** The recompiled plugin's id. */\n id: string;\n lockfile: Lockfile;\n lockPath: string;\n /** Artifacts whose content hash changed (or are new) since the prior lockfile. */\n changed: string[];\n}\n\n/**\n * Re-resolve refs, recompile a plugin source, diff its artifact content hashes\n * against the target `weft.lock`, and re-place ONLY changed artifacts (spec §5,\n * §9.3); its entry is then merged back into the target lock. Content addressing\n * makes \"is there really a new version?\" exact: unchanged artifacts are not rewritten.\n */\nexport async function update(opts: InstallOptions): Promise<UpdateResult> {\n const lockDir = opts.lockDir ?? lockDirForScope(opts.scope, opts.cwd);\n const prev = readLock(lockDir);\n\n const { fb, dependencies } = await loadResolved(opts.pluginDir);\n const result = compile(fb, { registry: opts.registry, targets: opts.targets, only: opts.only });\n if (result.diagnostics.hasErrors) {\n throw new CompileError(\"compile failed\", result.diagnostics.errors);\n }\n\n // Diff against this plugin's prior artifacts only; other plugins in the lock are untouched.\n const prevHash = new Map(\n (prev?.artifacts ?? []).filter((a) => a.plugin === result.id).map((a) => [a.path, a.hash]),\n );\n const planned = planScopeArtifacts(result, opts.scope, opts.cwd);\n const changed: string[] = [];\n for (const { record, contents } of planned) {\n if (prevHash.get(record.path) === record.hash) continue; // unchanged -> never rewrite\n mkdirSync(dirname(record.path), { recursive: true });\n writeFileSync(record.path, contents);\n changed.push(record.path);\n }\n\n const { ref, sha } = await gitInfo(opts.pluginDir);\n const entry = buildLockEntry({\n result,\n artifacts: planned.map((p) => p.record),\n dependencies,\n ref,\n sha,\n });\n mkdirSync(lockDir, { recursive: true });\n const lockfile = mergeLock(prev, [entry], opts.now ?? new Date().toISOString());\n const lockPath = writeLock(lockDir, lockfile);\n return { id: result.id, lockfile, lockPath, changed };\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { HarnessAdapter } from \"@michaelfromyeg/weft-adapter-kit\";\nimport { stringifyDocument } from \"@michaelfromyeg/weft-schema\";\n\nexport interface ImportPluginOptions {\n /** Directory holding an existing native plugin or marketplace. */\n dir: string;\n adapter: HarnessAdapter;\n /** Where to write the generated Weft plugin/marketplace. */\n outDir: string;\n /** Reverse-DNS namespace to assign (native assets lack one). */\n namespace?: string;\n}\n\nexport interface ImportOutput {\n kind: \"plugin\" | \"marketplace\";\n name: string;\n outDir: string;\n manifestPath: string;\n fileCount: number;\n id?: string;\n}\n\n/**\n * Reverse-compile an existing native plugin/marketplace into the Weft model and\n * write it to `outDir`, ready for `weft build` to cross-compile to every other\n * harness. This is \"federate, don't wall off\" applied to assets you already have.\n */\nexport function importNativePlugin(opts: ImportPluginOptions): ImportOutput {\n if (!opts.adapter.importNative) {\n throw new Error(`adapter \"${opts.adapter.target}\" does not support import`);\n }\n const result = opts.adapter.importNative(opts.dir, { namespace: opts.namespace });\n if (!result) {\n throw new Error(`no ${opts.adapter.target} plugin or marketplace found in ${opts.dir}`);\n }\n mkdirSync(opts.outDir, { recursive: true });\n\n if (result.kind === \"marketplace\") {\n const manifestPath = join(opts.outDir, \"marketplace.yaml\");\n writeFileSync(manifestPath, stringifyDocument(result.marketplace));\n return {\n kind: \"marketplace\",\n name: result.marketplace.name,\n outDir: opts.outDir,\n manifestPath,\n fileCount: 0,\n };\n }\n\n const manifestPath = join(opts.outDir, \"weft.yaml\");\n writeFileSync(manifestPath, stringifyDocument(result.plugin));\n for (const f of result.files) {\n const abs = join(opts.outDir, f.relPath);\n mkdirSync(dirname(abs), { recursive: true });\n writeFileSync(\n abs,\n typeof f.contents === \"string\" ? Buffer.from(f.contents, \"utf8\") : f.contents,\n );\n }\n return {\n kind: \"plugin\",\n name: result.plugin.name,\n outDir: opts.outDir,\n manifestPath,\n fileCount: result.files.length,\n id: `${result.plugin.owner.namespace}/${result.plugin.name}`,\n };\n}\n","import type { HarnessAdapter } from \"@michaelfromyeg/weft-adapter-kit\";\nimport type { Target } from \"@michaelfromyeg/weft-schema\";\n\n/**\n * Adapters registered by Target (spec §7). Core depends only on the adapter-kit\n * interface; the CLI (or an embedding app) registers concrete adapters, keeping\n * the dependency direction one-way and letting community adapters slot in.\n */\nexport class AdapterRegistry {\n private readonly adapters = new Map<Target, HarnessAdapter>();\n\n register(adapter: HarnessAdapter): this {\n this.adapters.set(adapter.target, adapter);\n return this;\n }\n\n get(target: Target): HarnessAdapter | undefined {\n return this.adapters.get(target);\n }\n\n has(target: Target): boolean {\n return this.adapters.has(target);\n }\n\n get targets(): Target[] {\n return [...this.adapters.keys()];\n }\n}\n","import { createHash, generateKeyPairSync, type KeyObject, sign, verify } from \"node:crypto\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport type { Lockfile } from \"@michaelfromyeg/weft-schema\";\n\n/**\n * A digest over the lockfile's artifact set (component + target + content hash).\n * Signing this binds a signature to exactly the compiled artifacts (spec §10\n * `signed` badge). Sorting makes it order-independent and deterministic.\n */\nexport function artifactDigest(lock: Lockfile): Buffer {\n const lines = lock.artifacts.map((a) => `${a.component}\\t${a.target}\\t${a.hash}`).sort();\n return createHash(\"sha256\").update(lines.join(\"\\n\")).digest();\n}\n\n/** Ed25519 keypair. Production would use sigstore/cosign keyless signing instead. */\nexport function generateSigningKeys(): { publicKey: KeyObject; privateKey: KeyObject } {\n return generateKeyPairSync(\"ed25519\");\n}\n\nexport function signLock(lock: Lockfile, privateKey: KeyObject): string {\n return sign(null, artifactDigest(lock), privateKey).toString(\"base64\");\n}\n\nexport function verifyLockSignature(\n lock: Lockfile,\n publicKey: KeyObject,\n signature: string,\n): boolean {\n try {\n return verify(null, artifactDigest(lock), publicKey, Buffer.from(signature, \"base64\"));\n } catch {\n return false;\n }\n}\n\nexport interface VerifyResult {\n signatureValid: boolean;\n /** Recorded artifact paths whose on-disk bytes no longer match the lock hash. */\n tampered: string[];\n}\n\n/**\n * Verify a signature AND that every recorded artifact on disk still matches its\n * lockfile hash. The `signed` badge requires both: a valid signature over the\n * digest and no tampered artifacts.\n */\nexport function verifyArtifacts(\n lock: Lockfile,\n publicKey: KeyObject,\n signature: string,\n): VerifyResult {\n const tampered: string[] = [];\n for (const a of lock.artifacts) {\n if (!existsSync(a.path)) {\n tampered.push(a.path);\n continue;\n }\n const actual = createHash(\"sha256\").update(readFileSync(a.path)).digest(\"hex\");\n if (actual !== a.hash) tampered.push(a.path);\n }\n return { signatureValid: verifyLockSignature(lock, publicKey, signature), tampered };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@michaelfromyeg/weft-core",
3
- "version": "1.3.0",
3
+ "version": "1.4.1",
4
4
  "description": "Weft compile pipeline: resolver, namespacing, placement, lockfile, adapter registry.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -18,8 +18,8 @@
18
18
  "dependencies": {
19
19
  "execa": "^9.5.2",
20
20
  "semver": "^7.6.3",
21
- "@michaelfromyeg/weft-adapter-kit": "1.3.0",
22
- "@michaelfromyeg/weft-schema": "1.3.0"
21
+ "@michaelfromyeg/weft-schema": "1.4.1",
22
+ "@michaelfromyeg/weft-adapter-kit": "1.4.1"
23
23
  },
24
24
  "devDependencies": {
25
25
  "@types/semver": "^7.5.8"