@decantr/registry 2.1.0 → 2.2.0
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/README.md +12 -0
- package/dist/client.d.ts +2 -2
- package/dist/{content-types-Ce7Eolmj.d.ts → content-types-202FZ5NY.d.ts} +1 -1
- package/dist/content-types.d.ts +1 -1
- package/dist/index.d.ts +38 -3
- package/dist/index.js +258 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -19,6 +19,7 @@ npm install @decantr/registry
|
|
|
19
19
|
- `@decantr/registry/client` for web-safe API usage
|
|
20
20
|
- public schema exports for registry content, content health, and summary responses
|
|
21
21
|
- ranking and sorting helpers for public registry content
|
|
22
|
+
- Brownfield-aware pattern discovery helpers: `patternToDiscoveryCandidate()`, `scorePatternCandidate()`, and `rankPatternCandidates()`
|
|
22
23
|
- blueprint portfolio metadata helpers for public `All`, `Featured`, `Certified`, and `Labs` registry cuts
|
|
23
24
|
|
|
24
25
|
## Example
|
|
@@ -45,6 +46,17 @@ const client = createRegistryClient({ baseUrl: 'https://api.decantr.ai/v1' });
|
|
|
45
46
|
const summary = await client.getIntelligenceSummary();
|
|
46
47
|
```
|
|
47
48
|
|
|
49
|
+
Pattern discovery usage:
|
|
50
|
+
|
|
51
|
+
```ts
|
|
52
|
+
import { patternToDiscoveryCandidate, rankPatternCandidates } from '@decantr/registry';
|
|
53
|
+
|
|
54
|
+
const matches = rankPatternCandidates(
|
|
55
|
+
{ query: 'recipe feed with avatars and infinite scroll', route: '/feed' },
|
|
56
|
+
patterns.map((pattern) => patternToDiscoveryCandidate(pattern)),
|
|
57
|
+
);
|
|
58
|
+
```
|
|
59
|
+
|
|
48
60
|
## Related Schemas
|
|
49
61
|
|
|
50
62
|
This package owns the canonical registry schemas published under `@decantr/registry/schema/*`, including `content-health-report.v1.json` for local content repository health reports emitted by `decantr content-health`.
|
package/dist/client.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { EssenceFile } from '@decantr/essence-spec';
|
|
2
|
-
import { e as ApiContentType, aC as SearchParams, U as ContentListResponse, as as PublicContentRecord,
|
|
3
|
-
export { c as API_CONTENT_TYPES, d as API_CONTENT_TYPE_TO_CONTENT_TYPE, j as BLUEPRINT_ARTIFACT_STATUSES, k as BLUEPRINT_PORTFOLIO_MATURITIES, l as BLUEPRINT_PORTFOLIO_VISIBILITIES, m as BlueprintArtifactStatus, q as BlueprintPortfolioArtifact, r as BlueprintPortfolioMaturity, s as BlueprintPortfolioMetadata, t as BlueprintPortfolioVisibility, v as CONTENT_INTELLIGENCE_SOURCES, w as CONTENT_TYPES, x as CONTENT_TYPE_TO_API_CONTENT_TYPE, z as ContentBenchmarkConfidence, E as ContentGoldenUsage, N as ContentIntelligenceMetadata, O as ContentIntelligenceSource, Q as ContentItem, V as ContentVerificationStatus, ad as PUBLIC_BLUEPRINT_SETS, ae as PUBLIC_CONTENT_SOURCES, ar as PublicBlueprintSet, at as PublicContentSource, ay as RegistryIntelligenceSummaryBucket, aF as ShowcaseManifestEntry, aJ as ShowcaseShortlistSummary, aK as ShowcaseVerificationEntry, aT as getBlueprintPortfolioMetadata, aU as isApiContentType, aV as isBlueprintArtifactStatus, aW as isBlueprintPortfolioMaturity, aX as isBlueprintPortfolioVisibility, aY as isContentIntelligenceSource, aZ as isContentType, a_ as isPublicBlueprintSet, a$ as isPublicContentSource } from './content-types-
|
|
2
|
+
import { e as ApiContentType, aC as SearchParams, U as ContentListResponse, as as PublicContentRecord, P as Pattern, A as Archetype, T as Theme, B as Blueprint, S as Shell, aD as SearchResponse, av as PublicUserProfile, au as PublicContentSummary, aP as UserProfile, aw as PublishPayload, ax as PublishResponse, ac as OwnedContentSummary, aG as ShowcaseManifestResponse, aI as ShowcaseShortlistResponse, aH as ShowcaseShortlistReport, az as RegistryIntelligenceSummaryResponse, Z as ExecutionPackBundleResponse, b0 as HostedSelectedExecutionPackRequest, b1 as SelectedExecutionPackResponse, $ as ExecutionPackManifest, a7 as HostedFileCritiqueRequest, a5 as FileCritiqueReport, a8 as HostedProjectAuditRequest, ao as ProjectAuditReport } from './content-types-202FZ5NY.js';
|
|
3
|
+
export { c as API_CONTENT_TYPES, d as API_CONTENT_TYPE_TO_CONTENT_TYPE, j as BLUEPRINT_ARTIFACT_STATUSES, k as BLUEPRINT_PORTFOLIO_MATURITIES, l as BLUEPRINT_PORTFOLIO_VISIBILITIES, m as BlueprintArtifactStatus, q as BlueprintPortfolioArtifact, r as BlueprintPortfolioMaturity, s as BlueprintPortfolioMetadata, t as BlueprintPortfolioVisibility, v as CONTENT_INTELLIGENCE_SOURCES, w as CONTENT_TYPES, x as CONTENT_TYPE_TO_API_CONTENT_TYPE, z as ContentBenchmarkConfidence, E as ContentGoldenUsage, N as ContentIntelligenceMetadata, O as ContentIntelligenceSource, Q as ContentItem, V as ContentVerificationStatus, ad as PUBLIC_BLUEPRINT_SETS, ae as PUBLIC_CONTENT_SOURCES, ar as PublicBlueprintSet, at as PublicContentSource, ay as RegistryIntelligenceSummaryBucket, aF as ShowcaseManifestEntry, aJ as ShowcaseShortlistSummary, aK as ShowcaseVerificationEntry, aT as getBlueprintPortfolioMetadata, aU as isApiContentType, aV as isBlueprintArtifactStatus, aW as isBlueprintPortfolioMaturity, aX as isBlueprintPortfolioVisibility, aY as isContentIntelligenceSource, aZ as isContentType, a_ as isPublicBlueprintSet, a$ as isPublicContentSource } from './content-types-202FZ5NY.js';
|
|
4
4
|
|
|
5
5
|
interface RegistryAPIClientOptions {
|
|
6
6
|
baseUrl?: string;
|
|
@@ -1001,4 +1001,4 @@ interface ProjectAuditReport {
|
|
|
1001
1001
|
summary: ProjectAuditSummary;
|
|
1002
1002
|
}
|
|
1003
1003
|
|
|
1004
|
-
export { type ExecutionPackManifest as $, type Archetype as A, type Blueprint as B, type ContentType as C, type ContentDependencies as D, type ContentGoldenUsage as E, type ContentHealthFinding as F, type ContentHealthFindingSource as G, type ContentHealthQualitySummary as H, type ContentHealthReferenceSummary as I, type ContentHealthRemediation as J, type ContentHealthReport as K, type ContentHealthStatus as L, type ContentHealthTypeSummary as M, type ContentIntelligenceMetadata as N, type ContentIntelligenceSource as O, type
|
|
1004
|
+
export { type ExecutionPackManifest as $, type Archetype as A, type Blueprint as B, type ContentType as C, type ContentDependencies as D, type ContentGoldenUsage as E, type ContentHealthFinding as F, type ContentHealthFindingSource as G, type ContentHealthQualitySummary as H, type ContentHealthReferenceSummary as I, type ContentHealthRemediation as J, type ContentHealthReport as K, type ContentHealthStatus as L, type ContentHealthTypeSummary as M, type ContentIntelligenceMetadata as N, type ContentIntelligenceSource as O, type Pattern as P, type ContentItem as Q, type ResolvedContent as R, type Shell as S, type Theme as T, type ContentListResponse as U, type ContentVerificationStatus as V, type CvdMode as W, type ExecutionPackAntiPattern as X, type ExecutionPackBase as Y, type ExecutionPackBundleResponse as Z, type ExecutionPackExample as _, type PatternPreset as a, isPublicContentSource as a$, type ExecutionPackScope as a0, type ExecutionPackSuccessCheck as a1, type ExecutionPackTarget as a2, type ExecutionPackTokenBudget as a3, type ExecutionPackType as a4, type FileCritiqueReport as a5, type HostedDistSnapshot as a6, type HostedFileCritiqueRequest as a7, type HostedProjectAuditRequest as a8, type LayoutGroup as a9, type ReviewExecutionPack as aA, type ScaffoldExecutionPack as aB, type SearchParams as aC, type SearchResponse as aD, type SectionExecutionPack as aE, type ShowcaseManifestEntry as aF, type ShowcaseManifestResponse as aG, type ShowcaseShortlistReport as aH, type ShowcaseShortlistResponse as aI, type ShowcaseShortlistSummary as aJ, type ShowcaseVerificationEntry as aK, type ThemeEffects as aL, type ThemeShell as aM, type ThemeSpatial as aN, type ThemeTokens as aO, type UserProfile as aP, type VerificationFinding as aQ, type VerificationScore as aR, type VerificationSeverity as aS, getBlueprintPortfolioMetadata as aT, isApiContentType as aU, isBlueprintArtifactStatus as aV, isBlueprintPortfolioMaturity as aW, isBlueprintPortfolioVisibility as aX, isContentIntelligenceSource as aY, isContentType as aZ, isPublicBlueprintSet as a_, type LayoutItem as aa, type MutationExecutionPack as ab, type OwnedContentSummary as ac, PUBLIC_BLUEPRINT_SETS as ad, PUBLIC_CONTENT_SOURCES as ae, type PackManifestEntry as af, type PackManifestMutationEntry as ag, type PackManifestPageEntry as ah, type PackManifestSectionEntry as ai, type PageExecutionPack as aj, type PatternCodeSpec as ak, type PatternLayoutSpec as al, type PatternReference as am, type PatternReferenceObject as an, type ProjectAuditReport as ao, type ProjectAuditRuntimeAudit as ap, type ProjectAuditSummary as aq, type PublicBlueprintSet as ar, type PublicContentRecord as as, type PublicContentSource as at, type PublicContentSummary as au, type PublicUserProfile as av, type PublishPayload as aw, type PublishResponse as ax, type RegistryIntelligenceSummaryBucket as ay, type RegistryIntelligenceSummaryResponse as az, type PatternIO as b, type HostedSelectedExecutionPackRequest as b0, type SelectedExecutionPackResponse as b1, API_CONTENT_TYPES as c, API_CONTENT_TYPE_TO_CONTENT_TYPE as d, type ApiContentType as e, type ArchetypeHeroCustomization as f, type ArchetypePage as g, type ArchetypeRole as h, type ArchetypeSuggestedTheme as i, BLUEPRINT_ARTIFACT_STATUSES as j, BLUEPRINT_PORTFOLIO_MATURITIES as k, BLUEPRINT_PORTFOLIO_VISIBILITIES as l, type BlueprintArtifactStatus as m, type BlueprintNavigation as n, type BlueprintNavigationHotkey as o, type BlueprintOverrides as p, type BlueprintPortfolioArtifact as q, type BlueprintPortfolioMaturity as r, type BlueprintPortfolioMetadata as s, type BlueprintPortfolioVisibility as t, type BlueprintRoute as u, CONTENT_INTELLIGENCE_SOURCES as v, CONTENT_TYPES as w, CONTENT_TYPE_TO_API_CONTENT_TYPE as x, type ComposeEntry as y, type ContentBenchmarkConfidence as z };
|
package/dist/content-types.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { c as API_CONTENT_TYPES, d as API_CONTENT_TYPE_TO_CONTENT_TYPE, e as ApiContentType, w as CONTENT_TYPES, x as CONTENT_TYPE_TO_API_CONTENT_TYPE, C as ContentType, aU as isApiContentType, aZ as isContentType } from './content-types-
|
|
1
|
+
export { c as API_CONTENT_TYPES, d as API_CONTENT_TYPE_TO_CONTENT_TYPE, e as ApiContentType, w as CONTENT_TYPES, x as CONTENT_TYPE_TO_API_CONTENT_TYPE, C as ContentType, aU as isApiContentType, aZ as isContentType } from './content-types-202FZ5NY.js';
|
|
2
2
|
import '@decantr/essence-spec';
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,43 @@
|
|
|
1
1
|
export { PublicContentSort, RegistryAPIClient, RegistryAPIClientOptions, RegistryAPIError, RegistryClient, RegistryClientOptions, SearchResult, comparePublicContent, createRegistryClient, normalizePublicContentSort, sortPublicContent } from './client.js';
|
|
2
|
-
import { P as
|
|
3
|
-
export { c as API_CONTENT_TYPES, d as API_CONTENT_TYPE_TO_CONTENT_TYPE, e as ApiContentType, f as ArchetypeHeroCustomization, g as ArchetypePage, h as ArchetypeRole, i as ArchetypeSuggestedTheme, j as BLUEPRINT_ARTIFACT_STATUSES, k as BLUEPRINT_PORTFOLIO_MATURITIES, l as BLUEPRINT_PORTFOLIO_VISIBILITIES, m as BlueprintArtifactStatus, n as BlueprintNavigation, o as BlueprintNavigationHotkey, p as BlueprintOverrides, q as BlueprintPortfolioArtifact, r as BlueprintPortfolioMaturity, s as BlueprintPortfolioMetadata, t as BlueprintPortfolioVisibility, u as BlueprintRoute, v as CONTENT_INTELLIGENCE_SOURCES, w as CONTENT_TYPES, x as CONTENT_TYPE_TO_API_CONTENT_TYPE, y as ComposeEntry, z as ContentBenchmarkConfidence, D as ContentDependencies, E as ContentGoldenUsage, F as ContentHealthFinding, G as ContentHealthFindingSource, H as ContentHealthQualitySummary, I as ContentHealthReferenceSummary, J as ContentHealthRemediation, K as ContentHealthReport, L as ContentHealthStatus, M as ContentHealthTypeSummary, N as ContentIntelligenceMetadata, O as ContentIntelligenceSource, Q as ContentItem, U as ContentListResponse, V as ContentVerificationStatus, W as CvdMode, X as ExecutionPackAntiPattern, Y as ExecutionPackBase, Z as ExecutionPackBundleResponse, _ as ExecutionPackExample, $ as ExecutionPackManifest, a0 as ExecutionPackScope, a1 as ExecutionPackSuccessCheck, a2 as ExecutionPackTarget, a3 as ExecutionPackTokenBudget, a4 as ExecutionPackType, a5 as FileCritiqueReport, a6 as HostedDistSnapshot, a7 as HostedFileCritiqueRequest, a8 as HostedProjectAuditRequest, a9 as LayoutGroup, aa as LayoutItem, ab as MutationExecutionPack, ac as OwnedContentSummary, ad as PUBLIC_BLUEPRINT_SETS, ae as PUBLIC_CONTENT_SOURCES, af as PackManifestEntry, ag as PackManifestMutationEntry, ah as PackManifestPageEntry, ai as PackManifestSectionEntry, aj as PageExecutionPack, ak as PatternCodeSpec, al as PatternLayoutSpec, am as PatternReference, an as PatternReferenceObject, ao as ProjectAuditReport, ap as ProjectAuditRuntimeAudit, aq as ProjectAuditSummary, ar as PublicBlueprintSet, as as PublicContentRecord, at as PublicContentSource, au as PublicContentSummary, av as PublicUserProfile, aw as PublishPayload, ax as PublishResponse, ay as RegistryIntelligenceSummaryBucket, az as RegistryIntelligenceSummaryResponse, aA as ReviewExecutionPack, aB as ScaffoldExecutionPack, aC as SearchParams, aD as SearchResponse, aE as SectionExecutionPack, aF as ShowcaseManifestEntry, aG as ShowcaseManifestResponse, aH as ShowcaseShortlistReport, aI as ShowcaseShortlistResponse, aJ as ShowcaseShortlistSummary, aK as ShowcaseVerificationEntry, aL as ThemeEffects, aM as ThemeShell, aN as ThemeSpatial, aO as ThemeTokens, aP as UserProfile, aQ as VerificationFinding, aR as VerificationScore, aS as VerificationSeverity, aT as getBlueprintPortfolioMetadata, aU as isApiContentType, aV as isBlueprintArtifactStatus, aW as isBlueprintPortfolioMaturity, aX as isBlueprintPortfolioVisibility, aY as isContentIntelligenceSource, aZ as isContentType, a_ as isPublicBlueprintSet, a$ as isPublicContentSource } from './content-types-
|
|
2
|
+
import { P as Pattern, a as PatternPreset, C as ContentType, R as ResolvedContent, A as Archetype, T as Theme, B as Blueprint, S as Shell, b as PatternIO } from './content-types-202FZ5NY.js';
|
|
3
|
+
export { c as API_CONTENT_TYPES, d as API_CONTENT_TYPE_TO_CONTENT_TYPE, e as ApiContentType, f as ArchetypeHeroCustomization, g as ArchetypePage, h as ArchetypeRole, i as ArchetypeSuggestedTheme, j as BLUEPRINT_ARTIFACT_STATUSES, k as BLUEPRINT_PORTFOLIO_MATURITIES, l as BLUEPRINT_PORTFOLIO_VISIBILITIES, m as BlueprintArtifactStatus, n as BlueprintNavigation, o as BlueprintNavigationHotkey, p as BlueprintOverrides, q as BlueprintPortfolioArtifact, r as BlueprintPortfolioMaturity, s as BlueprintPortfolioMetadata, t as BlueprintPortfolioVisibility, u as BlueprintRoute, v as CONTENT_INTELLIGENCE_SOURCES, w as CONTENT_TYPES, x as CONTENT_TYPE_TO_API_CONTENT_TYPE, y as ComposeEntry, z as ContentBenchmarkConfidence, D as ContentDependencies, E as ContentGoldenUsage, F as ContentHealthFinding, G as ContentHealthFindingSource, H as ContentHealthQualitySummary, I as ContentHealthReferenceSummary, J as ContentHealthRemediation, K as ContentHealthReport, L as ContentHealthStatus, M as ContentHealthTypeSummary, N as ContentIntelligenceMetadata, O as ContentIntelligenceSource, Q as ContentItem, U as ContentListResponse, V as ContentVerificationStatus, W as CvdMode, X as ExecutionPackAntiPattern, Y as ExecutionPackBase, Z as ExecutionPackBundleResponse, _ as ExecutionPackExample, $ as ExecutionPackManifest, a0 as ExecutionPackScope, a1 as ExecutionPackSuccessCheck, a2 as ExecutionPackTarget, a3 as ExecutionPackTokenBudget, a4 as ExecutionPackType, a5 as FileCritiqueReport, a6 as HostedDistSnapshot, a7 as HostedFileCritiqueRequest, a8 as HostedProjectAuditRequest, a9 as LayoutGroup, aa as LayoutItem, ab as MutationExecutionPack, ac as OwnedContentSummary, ad as PUBLIC_BLUEPRINT_SETS, ae as PUBLIC_CONTENT_SOURCES, af as PackManifestEntry, ag as PackManifestMutationEntry, ah as PackManifestPageEntry, ai as PackManifestSectionEntry, aj as PageExecutionPack, ak as PatternCodeSpec, al as PatternLayoutSpec, am as PatternReference, an as PatternReferenceObject, ao as ProjectAuditReport, ap as ProjectAuditRuntimeAudit, aq as ProjectAuditSummary, ar as PublicBlueprintSet, as as PublicContentRecord, at as PublicContentSource, au as PublicContentSummary, av as PublicUserProfile, aw as PublishPayload, ax as PublishResponse, ay as RegistryIntelligenceSummaryBucket, az as RegistryIntelligenceSummaryResponse, aA as ReviewExecutionPack, aB as ScaffoldExecutionPack, aC as SearchParams, aD as SearchResponse, aE as SectionExecutionPack, aF as ShowcaseManifestEntry, aG as ShowcaseManifestResponse, aH as ShowcaseShortlistReport, aI as ShowcaseShortlistResponse, aJ as ShowcaseShortlistSummary, aK as ShowcaseVerificationEntry, aL as ThemeEffects, aM as ThemeShell, aN as ThemeSpatial, aO as ThemeTokens, aP as UserProfile, aQ as VerificationFinding, aR as VerificationScore, aS as VerificationSeverity, aT as getBlueprintPortfolioMetadata, aU as isApiContentType, aV as isBlueprintArtifactStatus, aW as isBlueprintPortfolioMaturity, aX as isBlueprintPortfolioVisibility, aY as isContentIntelligenceSource, aZ as isContentType, a_ as isPublicBlueprintSet, a$ as isPublicContentSource } from './content-types-202FZ5NY.js';
|
|
4
4
|
import { LayoutItem } from '@decantr/essence-spec';
|
|
5
5
|
|
|
6
|
+
interface PatternDiscoveryCandidate {
|
|
7
|
+
id: string;
|
|
8
|
+
slug?: string;
|
|
9
|
+
name?: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
tags?: string[];
|
|
12
|
+
components?: string[];
|
|
13
|
+
interactions?: string[];
|
|
14
|
+
visual_brief?: string;
|
|
15
|
+
layout_hints?: Record<string, string>;
|
|
16
|
+
aliases?: string[];
|
|
17
|
+
category?: string;
|
|
18
|
+
domain?: string;
|
|
19
|
+
source?: string;
|
|
20
|
+
pattern?: Pattern | Record<string, unknown>;
|
|
21
|
+
}
|
|
22
|
+
interface PatternDiscoveryInput {
|
|
23
|
+
query?: string;
|
|
24
|
+
route?: string;
|
|
25
|
+
code?: string;
|
|
26
|
+
limit?: number;
|
|
27
|
+
}
|
|
28
|
+
interface PatternDiscoveryMatch {
|
|
29
|
+
candidate: PatternDiscoveryCandidate;
|
|
30
|
+
score: number;
|
|
31
|
+
reasons: string[];
|
|
32
|
+
matchedTerms: string[];
|
|
33
|
+
}
|
|
34
|
+
declare function patternToDiscoveryCandidate(pattern: Pattern | Record<string, unknown>, options?: {
|
|
35
|
+
source?: string;
|
|
36
|
+
slug?: string;
|
|
37
|
+
}): PatternDiscoveryCandidate;
|
|
38
|
+
declare function scorePatternCandidate(input: PatternDiscoveryInput, candidate: PatternDiscoveryCandidate): PatternDiscoveryMatch;
|
|
39
|
+
declare function rankPatternCandidates(input: PatternDiscoveryInput, candidates: PatternDiscoveryCandidate[]): PatternDiscoveryMatch[];
|
|
40
|
+
|
|
6
41
|
interface ResolvedPreset {
|
|
7
42
|
preset: string;
|
|
8
43
|
layout: PatternPreset['layout'];
|
|
@@ -78,4 +113,4 @@ declare function buildIOMap(entries: PatternIOEntry[]): Map<string, PatternIO>;
|
|
|
78
113
|
*/
|
|
79
114
|
declare function detectWirings(layout: LayoutItem[], patternIOMap?: Map<string, PatternIO>): WiringResult[];
|
|
80
115
|
|
|
81
|
-
export { Archetype, Blueprint, type ContentResolver, ContentType, type HookType, type IOWiringEdge, Pattern, PatternIO, type PatternIOEntry, PatternPreset, ResolvedContent, type ResolvedPreset, type ResolverOptions, Shell, Theme, WIRING_RULES, type WiringResult, type WiringRule, type WiringSignal, buildIOMap, createResolver, deriveIOWirings, detectWirings, resolvePatternPreset };
|
|
116
|
+
export { Archetype, Blueprint, type ContentResolver, ContentType, type HookType, type IOWiringEdge, Pattern, type PatternDiscoveryCandidate, type PatternDiscoveryInput, type PatternDiscoveryMatch, PatternIO, type PatternIOEntry, PatternPreset, ResolvedContent, type ResolvedPreset, type ResolverOptions, Shell, Theme, WIRING_RULES, type WiringResult, type WiringRule, type WiringSignal, buildIOMap, createResolver, deriveIOWirings, detectWirings, patternToDiscoveryCandidate, rankPatternCandidates, resolvePatternPreset, scorePatternCandidate };
|
package/dist/index.js
CHANGED
|
@@ -358,6 +358,257 @@ function createRegistryClient(options = {}) {
|
|
|
358
358
|
};
|
|
359
359
|
}
|
|
360
360
|
|
|
361
|
+
// src/discovery.ts
|
|
362
|
+
var STOP_WORDS = /* @__PURE__ */ new Set([
|
|
363
|
+
"a",
|
|
364
|
+
"an",
|
|
365
|
+
"and",
|
|
366
|
+
"app",
|
|
367
|
+
"are",
|
|
368
|
+
"as",
|
|
369
|
+
"at",
|
|
370
|
+
"be",
|
|
371
|
+
"by",
|
|
372
|
+
"for",
|
|
373
|
+
"from",
|
|
374
|
+
"has",
|
|
375
|
+
"have",
|
|
376
|
+
"in",
|
|
377
|
+
"into",
|
|
378
|
+
"is",
|
|
379
|
+
"it",
|
|
380
|
+
"of",
|
|
381
|
+
"on",
|
|
382
|
+
"or",
|
|
383
|
+
"page",
|
|
384
|
+
"route",
|
|
385
|
+
"section",
|
|
386
|
+
"that",
|
|
387
|
+
"the",
|
|
388
|
+
"this",
|
|
389
|
+
"to",
|
|
390
|
+
"ui",
|
|
391
|
+
"with"
|
|
392
|
+
]);
|
|
393
|
+
var DOMAIN_LANGUAGE = {
|
|
394
|
+
recipe: [
|
|
395
|
+
"cookbook",
|
|
396
|
+
"cookbooks",
|
|
397
|
+
"cooking",
|
|
398
|
+
"dish",
|
|
399
|
+
"food",
|
|
400
|
+
"ingredient",
|
|
401
|
+
"ingredients",
|
|
402
|
+
"meal",
|
|
403
|
+
"photo",
|
|
404
|
+
"recipe",
|
|
405
|
+
"recipes"
|
|
406
|
+
],
|
|
407
|
+
ai: [
|
|
408
|
+
"agent",
|
|
409
|
+
"ai",
|
|
410
|
+
"assistant",
|
|
411
|
+
"chat",
|
|
412
|
+
"claude",
|
|
413
|
+
"generate",
|
|
414
|
+
"generation",
|
|
415
|
+
"image",
|
|
416
|
+
"model",
|
|
417
|
+
"prompt",
|
|
418
|
+
"vision"
|
|
419
|
+
],
|
|
420
|
+
social: [
|
|
421
|
+
"activity",
|
|
422
|
+
"avatar",
|
|
423
|
+
"comment",
|
|
424
|
+
"community",
|
|
425
|
+
"feed",
|
|
426
|
+
"follow",
|
|
427
|
+
"like",
|
|
428
|
+
"profile",
|
|
429
|
+
"share",
|
|
430
|
+
"social",
|
|
431
|
+
"user"
|
|
432
|
+
],
|
|
433
|
+
commerce: ["cart", "checkout", "commerce", "ecommerce", "order", "price", "product", "shop"],
|
|
434
|
+
dashboard: ["analytics", "chart", "dashboard", "kpi", "metric", "report", "table"],
|
|
435
|
+
form: ["form", "input", "settings", "submit", "toggle", "upload"]
|
|
436
|
+
};
|
|
437
|
+
function isRecord2(value) {
|
|
438
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
439
|
+
}
|
|
440
|
+
function stringArray(value) {
|
|
441
|
+
return Array.isArray(value) ? value.filter((entry) => typeof entry === "string") : [];
|
|
442
|
+
}
|
|
443
|
+
function recordToText(value) {
|
|
444
|
+
if (!isRecord2(value)) return "";
|
|
445
|
+
return Object.values(value).flatMap((entry) => {
|
|
446
|
+
if (typeof entry === "string") return [entry];
|
|
447
|
+
if (Array.isArray(entry))
|
|
448
|
+
return entry.filter((item) => typeof item === "string");
|
|
449
|
+
if (isRecord2(entry)) return [recordToText(entry)];
|
|
450
|
+
return [];
|
|
451
|
+
}).join(" ");
|
|
452
|
+
}
|
|
453
|
+
function patternToDiscoveryCandidate(pattern, options = {}) {
|
|
454
|
+
const record = pattern;
|
|
455
|
+
const slug = options.slug || (typeof record.slug === "string" ? record.slug : void 0) || (typeof record.id === "string" ? record.id : void 0);
|
|
456
|
+
return {
|
|
457
|
+
id: typeof record.id === "string" ? record.id : slug ?? "pattern",
|
|
458
|
+
slug,
|
|
459
|
+
name: typeof record.name === "string" ? record.name : slug,
|
|
460
|
+
description: typeof record.description === "string" ? record.description : void 0,
|
|
461
|
+
tags: stringArray(record.tags),
|
|
462
|
+
components: stringArray(record.components),
|
|
463
|
+
interactions: stringArray(record.interactions),
|
|
464
|
+
visual_brief: typeof record.visual_brief === "string" ? record.visual_brief : typeof record.visualBrief === "string" ? record.visualBrief : void 0,
|
|
465
|
+
layout_hints: isRecord2(record.layout_hints) ? record.layout_hints : void 0,
|
|
466
|
+
aliases: stringArray(record.aliases),
|
|
467
|
+
category: typeof record.category === "string" ? record.category : void 0,
|
|
468
|
+
domain: typeof record.domain === "string" ? record.domain : void 0,
|
|
469
|
+
source: options.source,
|
|
470
|
+
pattern
|
|
471
|
+
};
|
|
472
|
+
}
|
|
473
|
+
function tokenize(value) {
|
|
474
|
+
if (!value) return [];
|
|
475
|
+
const tokens = value.toLowerCase().replace(/([a-z])([A-Z])/g, "$1 $2").split(/[^a-z0-9]+/g).map((token) => token.trim()).filter((token) => token.length >= 2 && !STOP_WORDS.has(token));
|
|
476
|
+
return [...new Set(tokens)];
|
|
477
|
+
}
|
|
478
|
+
function inferDomainTerms(tokens) {
|
|
479
|
+
const tokenSet = new Set(tokens);
|
|
480
|
+
const matches = [];
|
|
481
|
+
for (const [domain, terms] of Object.entries(DOMAIN_LANGUAGE)) {
|
|
482
|
+
const hits = terms.filter((term) => tokenSet.has(term));
|
|
483
|
+
if (hits.length > 0) matches.push({ domain, terms });
|
|
484
|
+
}
|
|
485
|
+
return matches;
|
|
486
|
+
}
|
|
487
|
+
function candidateText(candidate) {
|
|
488
|
+
const pattern = candidate.pattern;
|
|
489
|
+
const patternRecord = isRecord2(pattern) ? pattern : {};
|
|
490
|
+
const presets = isRecord2(patternRecord.presets) ? recordToText(patternRecord.presets) : "";
|
|
491
|
+
const composition = isRecord2(patternRecord.composition) ? recordToText(patternRecord.composition) : "";
|
|
492
|
+
const motion = isRecord2(patternRecord.motion) ? recordToText(patternRecord.motion) : "";
|
|
493
|
+
const responsive = isRecord2(patternRecord.responsive) ? recordToText(patternRecord.responsive) : "";
|
|
494
|
+
const accessibility = isRecord2(patternRecord.accessibility) ? recordToText(patternRecord.accessibility) : "";
|
|
495
|
+
return {
|
|
496
|
+
high: [
|
|
497
|
+
candidate.slug,
|
|
498
|
+
candidate.id,
|
|
499
|
+
candidate.name,
|
|
500
|
+
candidate.aliases?.join(" "),
|
|
501
|
+
candidate.category,
|
|
502
|
+
candidate.domain
|
|
503
|
+
].filter(Boolean).join(" "),
|
|
504
|
+
medium: [
|
|
505
|
+
candidate.description,
|
|
506
|
+
candidate.tags?.join(" "),
|
|
507
|
+
candidate.components?.join(" "),
|
|
508
|
+
candidate.interactions?.join(" "),
|
|
509
|
+
candidate.visual_brief,
|
|
510
|
+
candidate.layout_hints ? recordToText(candidate.layout_hints) : ""
|
|
511
|
+
].filter(Boolean).join(" "),
|
|
512
|
+
low: [presets, composition, motion, responsive, accessibility].filter(Boolean).join(" ")
|
|
513
|
+
};
|
|
514
|
+
}
|
|
515
|
+
function fieldMatches(tokens, text) {
|
|
516
|
+
const lower = text.toLowerCase();
|
|
517
|
+
return tokens.filter((token) => lower.includes(token));
|
|
518
|
+
}
|
|
519
|
+
function addReason(reasons, reason) {
|
|
520
|
+
if (!reasons.includes(reason)) reasons.push(reason);
|
|
521
|
+
}
|
|
522
|
+
function scorePatternCandidate(input, candidate) {
|
|
523
|
+
const queryTokens = tokenize(input.query);
|
|
524
|
+
const routeTokens = tokenize(input.route);
|
|
525
|
+
const codeTokens = tokenize(input.code).slice(0, 250);
|
|
526
|
+
const tokens = [.../* @__PURE__ */ new Set([...queryTokens, ...routeTokens, ...codeTokens])];
|
|
527
|
+
const text = candidateText(candidate);
|
|
528
|
+
const reasons = [];
|
|
529
|
+
const matchedTerms = /* @__PURE__ */ new Set();
|
|
530
|
+
let score = 0;
|
|
531
|
+
const highMatches = fieldMatches(tokens, text.high);
|
|
532
|
+
if (highMatches.length > 0) {
|
|
533
|
+
score += highMatches.length * 18;
|
|
534
|
+
for (const term of highMatches) matchedTerms.add(term);
|
|
535
|
+
addReason(reasons, "matched slug, name, alias, category, or domain");
|
|
536
|
+
}
|
|
537
|
+
const mediumMatches = fieldMatches(tokens, text.medium);
|
|
538
|
+
if (mediumMatches.length > 0) {
|
|
539
|
+
score += mediumMatches.length * 10;
|
|
540
|
+
for (const term of mediumMatches) matchedTerms.add(term);
|
|
541
|
+
addReason(
|
|
542
|
+
reasons,
|
|
543
|
+
"matched description, tags, components, interactions, visual brief, or layout hints"
|
|
544
|
+
);
|
|
545
|
+
}
|
|
546
|
+
const lowMatches = fieldMatches(tokens, text.low);
|
|
547
|
+
if (lowMatches.length > 0) {
|
|
548
|
+
score += lowMatches.length * 4;
|
|
549
|
+
for (const term of lowMatches) matchedTerms.add(term);
|
|
550
|
+
addReason(reasons, "matched composition, motion, responsive, preset, or accessibility details");
|
|
551
|
+
}
|
|
552
|
+
const slug = (candidate.slug || candidate.id).toLowerCase();
|
|
553
|
+
const query = (input.query || "").toLowerCase();
|
|
554
|
+
if (query && (slug === query || candidate.name?.toLowerCase() === query)) {
|
|
555
|
+
score += 50;
|
|
556
|
+
addReason(reasons, "exact slug or name match");
|
|
557
|
+
} else if (query && slug.includes(query.replace(/\s+/g, "-"))) {
|
|
558
|
+
score += 28;
|
|
559
|
+
addReason(reasons, "direct slug phrase match");
|
|
560
|
+
}
|
|
561
|
+
for (const domain of inferDomainTerms(tokens)) {
|
|
562
|
+
const candidateDomainText = [text.high, text.medium, text.low].join(" ").toLowerCase();
|
|
563
|
+
const hits = domain.terms.filter((term) => candidateDomainText.includes(term));
|
|
564
|
+
if (hits.length > 0) {
|
|
565
|
+
score += Math.min(30, hits.length * 6);
|
|
566
|
+
for (const term of hits) matchedTerms.add(term);
|
|
567
|
+
addReason(reasons, `${domain.domain} domain language`);
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
if (input.route) {
|
|
571
|
+
const route = input.route.toLowerCase();
|
|
572
|
+
if (route.includes(slug) || slug.includes(route.replace(/^\//, "").replace(/\//g, "-"))) {
|
|
573
|
+
score += 16;
|
|
574
|
+
addReason(reasons, "route name resembles pattern slug");
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
if (input.code) {
|
|
578
|
+
const code = input.code.toLowerCase();
|
|
579
|
+
const codeHints = [
|
|
580
|
+
["intersectionobserver", "scroll-reveal"],
|
|
581
|
+
["avatar", "social profile or feed"],
|
|
582
|
+
["like", "social engagement"],
|
|
583
|
+
["upload", "upload flow"],
|
|
584
|
+
['input type="file"', "upload flow"],
|
|
585
|
+
["textarea", "form or chat input"],
|
|
586
|
+
["message", "chat surface"],
|
|
587
|
+
["grid", "grid composition"],
|
|
588
|
+
["form", "form surface"]
|
|
589
|
+
];
|
|
590
|
+
for (const [needle, label] of codeHints) {
|
|
591
|
+
if (code.includes(needle) && [text.high, text.medium, text.low].join(" ").toLowerCase().includes(label.split(" ")[0])) {
|
|
592
|
+
score += 8;
|
|
593
|
+
addReason(reasons, `source code hint: ${label}`);
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
return {
|
|
598
|
+
candidate,
|
|
599
|
+
score,
|
|
600
|
+
reasons,
|
|
601
|
+
matchedTerms: [...matchedTerms].sort()
|
|
602
|
+
};
|
|
603
|
+
}
|
|
604
|
+
function rankPatternCandidates(input, candidates) {
|
|
605
|
+
const limit = input.limit ?? 10;
|
|
606
|
+
return candidates.map((candidate) => scorePatternCandidate(input, candidate)).filter((match) => match.score > 0).sort((a, b) => {
|
|
607
|
+
if (b.score !== a.score) return b.score - a.score;
|
|
608
|
+
return (a.candidate.slug || a.candidate.id).localeCompare(b.candidate.slug || b.candidate.id);
|
|
609
|
+
}).slice(0, limit);
|
|
610
|
+
}
|
|
611
|
+
|
|
361
612
|
// src/pattern.ts
|
|
362
613
|
function resolvePatternPreset(pattern, explicitPreset, themeDefaultPresets) {
|
|
363
614
|
const presets = pattern.presets;
|
|
@@ -409,16 +660,16 @@ function isBlueprintArtifactStatus(value) {
|
|
|
409
660
|
function isPublicBlueprintSet(value) {
|
|
410
661
|
return PUBLIC_BLUEPRINT_SETS.includes(value);
|
|
411
662
|
}
|
|
412
|
-
function
|
|
663
|
+
function isRecord3(value) {
|
|
413
664
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
414
665
|
}
|
|
415
666
|
function getBlueprintPortfolioMetadata(value) {
|
|
416
|
-
const candidate =
|
|
417
|
-
if (!
|
|
667
|
+
const candidate = isRecord3(value) && isRecord3(value.blueprint_portfolio) ? value.blueprint_portfolio : value;
|
|
668
|
+
if (!isRecord3(candidate)) {
|
|
418
669
|
return null;
|
|
419
670
|
}
|
|
420
671
|
const artifact = candidate.artifact;
|
|
421
|
-
if (!isBlueprintPortfolioVisibility(candidate.visibility) || !isBlueprintPortfolioMaturity(candidate.maturity) || typeof candidate.rationale !== "string" || !
|
|
672
|
+
if (!isBlueprintPortfolioVisibility(candidate.visibility) || !isBlueprintPortfolioMaturity(candidate.maturity) || typeof candidate.rationale !== "string" || !isRecord3(artifact) || !isBlueprintArtifactStatus(artifact.status)) {
|
|
422
673
|
return null;
|
|
423
674
|
}
|
|
424
675
|
return {
|
|
@@ -798,7 +1049,10 @@ export {
|
|
|
798
1049
|
isPublicBlueprintSet,
|
|
799
1050
|
isPublicContentSource,
|
|
800
1051
|
normalizePublicContentSort,
|
|
1052
|
+
patternToDiscoveryCandidate,
|
|
1053
|
+
rankPatternCandidates,
|
|
801
1054
|
resolvePatternPreset,
|
|
1055
|
+
scorePatternCandidate,
|
|
802
1056
|
sortPublicContent
|
|
803
1057
|
};
|
|
804
1058
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api-client.ts","../src/pattern.ts","../src/types.ts","../src/ranking.ts","../src/resolver.ts","../src/wiring.ts"],"sourcesContent":["import type { EssenceFile } from '@decantr/essence-spec';\nimport type {\n ApiContentType,\n Archetype,\n Blueprint,\n ContentItem,\n ContentListResponse,\n ExecutionPackBundleResponse,\n ExecutionPackManifest,\n FileCritiqueReport,\n HostedFileCritiqueRequest,\n HostedProjectAuditRequest,\n HostedSelectedExecutionPackRequest,\n OwnedContentSummary,\n Pattern,\n ProjectAuditReport,\n PublicContentRecord,\n PublicContentSummary,\n PublicUserProfile,\n PublishPayload,\n PublishResponse,\n RegistryIntelligenceSummaryResponse,\n SearchParams,\n SearchResponse,\n SelectedExecutionPackResponse,\n Shell,\n ShowcaseManifestResponse,\n ShowcaseShortlistReport,\n ShowcaseShortlistResponse,\n Theme,\n UserProfile,\n} from './types.js';\n\nconst DEFAULT_BASE_URL = 'https://api.decantr.ai/v1';\nconst DEFAULT_TIMEOUT_MS = 30000;\nconst DEFAULT_CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes\n\ninterface CacheEntry<T> {\n data: T;\n timestamp: number;\n}\n\nfunction unwrapDataEnvelope<T>(value: T): T {\n if (typeof value === 'object' && value !== null && 'data' in value) {\n return value.data as T;\n }\n return value;\n}\n\nexport interface RegistryAPIClientOptions {\n baseUrl?: string;\n apiKey?: string;\n accessToken?: string;\n timeoutMs?: number;\n cacheTtlMs?: number;\n}\n\nexport class RegistryAPIError extends Error {\n status: number;\n details?: unknown;\n\n constructor(status: number, message: string, details?: unknown) {\n super(message);\n this.name = 'RegistryAPIError';\n this.status = status;\n this.details = details;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport class RegistryAPIClient {\n private baseUrl: string;\n private apiKey: string | undefined;\n private accessToken: string | undefined;\n private timeoutMs: number;\n private cacheTtlMs: number;\n private cache = new Map<string, CacheEntry<unknown>>();\n\n constructor(options: RegistryAPIClientOptions = {}) {\n this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n this.apiKey = options.apiKey;\n this.accessToken = options.accessToken;\n this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.cacheTtlMs = options.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;\n }\n\n // ── HTTP helpers ──\n\n private buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: 'application/json',\n };\n if (this.apiKey) {\n headers['X-API-Key'] = this.apiKey;\n }\n if (this.accessToken) {\n headers['Authorization'] = `Bearer ${this.accessToken}`;\n }\n return headers;\n }\n\n private async fetchWithTimeout(url: string, init?: RequestInit): Promise<Response> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timeout);\n }\n }\n\n private async request<T>(path: string, init?: RequestInit): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const response = await this.fetchWithTimeout(url, {\n ...init,\n headers: { ...this.buildHeaders(), ...init?.headers },\n });\n if (!response.ok) {\n const bodyText = await response.text().catch(() => '');\n let details: unknown;\n let message = response.statusText;\n\n if (bodyText) {\n try {\n details = JSON.parse(bodyText) as unknown;\n if (isRecord(details) && typeof details.error === 'string') {\n message = details.error;\n } else {\n message = bodyText;\n }\n } catch {\n message = bodyText;\n }\n }\n\n throw new RegistryAPIError(response.status, `API ${response.status}: ${message}`, details);\n }\n return response.json() as Promise<T>;\n }\n\n // ── Cache helpers ──\n\n private getCached<T>(key: string): T | null {\n const entry = this.cache.get(key) as CacheEntry<T> | undefined;\n if (!entry) return null;\n if (Date.now() - entry.timestamp > this.cacheTtlMs) {\n this.cache.delete(key);\n return null;\n }\n return entry.data;\n }\n\n private setCache<T>(key: string, data: T): void {\n this.cache.set(key, { data, timestamp: Date.now() });\n }\n\n clearCache(): void {\n this.cache.clear();\n }\n\n // ── Health ──\n\n async checkHealth(): Promise<boolean> {\n try {\n const url = this.baseUrl.replace(/\\/v1$/, '/health');\n const response = await this.fetchWithTimeout(url);\n return response.ok;\n } catch {\n return false;\n }\n }\n\n // ── Content fetching (public) ──\n\n async listContent<T = Record<string, unknown>>(\n type: ApiContentType,\n params?: {\n namespace?: string;\n source?: SearchParams['source'];\n sort?: string;\n recommended?: boolean;\n intelligenceSource?: SearchParams['intelligenceSource'];\n blueprintSet?: SearchParams['blueprintSet'];\n labs?: boolean;\n limit?: number;\n offset?: number;\n },\n ): Promise<ContentListResponse<T>> {\n const cacheKey = `list:${type}:${JSON.stringify(params ?? {})}`;\n const cached = this.getCached<ContentListResponse<T>>(cacheKey);\n if (cached) return cached;\n\n const searchParams = new URLSearchParams();\n if (params?.namespace) searchParams.set('namespace', params.namespace);\n if (params?.source) searchParams.set('source', params.source);\n if (params?.sort) searchParams.set('sort', params.sort);\n if (params?.recommended) searchParams.set('recommended', 'true');\n if (params?.intelligenceSource)\n searchParams.set('intelligence_source', params.intelligenceSource);\n if (params?.blueprintSet) searchParams.set('blueprint_set', params.blueprintSet);\n if (params?.labs) searchParams.set('labs', 'true');\n if (params?.limit) searchParams.set('limit', String(params.limit));\n if (params?.offset) searchParams.set('offset', String(params.offset));\n\n const query = searchParams.toString();\n const path = `/${type}${query ? `?${query}` : ''}`;\n const result = await this.request<ContentListResponse<T>>(path);\n this.setCache(cacheKey, result);\n return result;\n }\n\n async getContent<T = Record<string, unknown>>(\n type: ApiContentType,\n namespace: string,\n slug: string,\n ): Promise<T> {\n const cacheKey = `get:${type}:${namespace}:${slug}`;\n const cached = this.getCached<T>(cacheKey);\n if (cached) return cached;\n\n const raw = await this.request<T>(`/${type}/${namespace}/${slug}`);\n // API returns { id, type, slug, data: {...actual content...} } — unwrap\n const unwrapped = unwrapDataEnvelope(raw);\n this.setCache(cacheKey, unwrapped);\n return unwrapped;\n }\n\n async getPublicContentRecord<TData = Record<string, unknown>>(\n type: ApiContentType,\n namespace: string,\n slug: string,\n ): Promise<PublicContentRecord<TData>> {\n const cacheKey = `public-record:${type}:${namespace}:${slug}`;\n const cached = this.getCached<PublicContentRecord<TData>>(cacheKey);\n if (cached) return cached;\n\n const result = await this.request<PublicContentRecord<TData>>(`/${type}/${namespace}/${slug}`);\n this.setCache(cacheKey, result);\n return result;\n }\n\n async getContentRecord<TData = Record<string, unknown>>(\n type: ApiContentType,\n namespace: string,\n slug: string,\n ): Promise<PublicContentRecord<TData>> {\n const cacheKey = `content-record:${type}:${namespace}:${slug}:${this.apiKey ?? ''}:${this.accessToken ?? ''}`;\n const cached = this.getCached<PublicContentRecord<TData>>(cacheKey);\n if (cached) return cached;\n\n const result = await this.request<PublicContentRecord<TData>>(`/${type}/${namespace}/${slug}`);\n this.setCache(cacheKey, result);\n return result;\n }\n\n // ── Typed convenience methods ──\n\n async getPattern(namespace: string, slug: string): Promise<Pattern> {\n return this.getContent<Pattern>('patterns', namespace, slug);\n }\n\n async getArchetype(namespace: string, slug: string): Promise<Archetype> {\n return this.getContent<Archetype>('archetypes', namespace, slug);\n }\n\n async getTheme(namespace: string, slug: string): Promise<Theme> {\n return this.getContent<Theme>('themes', namespace, slug);\n }\n\n async getBlueprint(namespace: string, slug: string): Promise<Blueprint> {\n return this.getContent<Blueprint>('blueprints', namespace, slug);\n }\n\n async getShell(namespace: string, slug: string): Promise<Shell> {\n return this.getContent<Shell>('shells', namespace, slug);\n }\n\n // ── Search ──\n\n async search(params: SearchParams): Promise<SearchResponse> {\n const searchParams = new URLSearchParams({ q: params.q });\n if (params.type) searchParams.set('type', params.type);\n if (params.namespace) searchParams.set('namespace', params.namespace);\n if (params.source) searchParams.set('source', params.source);\n if (params.sort) searchParams.set('sort', params.sort);\n if (params.recommended) searchParams.set('recommended', 'true');\n if (params.intelligenceSource)\n searchParams.set('intelligence_source', params.intelligenceSource);\n if (params.blueprintSet) searchParams.set('blueprint_set', params.blueprintSet);\n if (params.labs) searchParams.set('labs', 'true');\n if (params.limit) searchParams.set('limit', String(params.limit));\n if (params.offset) searchParams.set('offset', String(params.offset));\n\n return this.request<SearchResponse>(`/search?${searchParams}`);\n }\n\n async getPublicUserProfile(username: string): Promise<PublicUserProfile> {\n const cacheKey = `public-user:${username}`;\n const cached = this.getCached<PublicUserProfile>(cacheKey);\n if (cached) return cached;\n\n const result = await this.request<PublicUserProfile>(`/users/${encodeURIComponent(username)}`);\n this.setCache(cacheKey, result);\n return result;\n }\n\n async getPublicUserContent(\n username: string,\n params?: {\n type?: string;\n source?: SearchParams['source'];\n sort?: string;\n recommended?: boolean;\n intelligenceSource?: SearchParams['intelligenceSource'];\n blueprintSet?: SearchParams['blueprintSet'];\n labs?: boolean;\n limit?: number;\n offset?: number;\n },\n ): Promise<ContentListResponse<PublicContentSummary>> {\n const cacheKey = `public-user-content:${username}:${JSON.stringify(params ?? {})}`;\n const cached = this.getCached<ContentListResponse<PublicContentSummary>>(cacheKey);\n if (cached) return cached;\n\n const searchParams = new URLSearchParams();\n if (params?.type) searchParams.set('type', params.type);\n if (params?.source) searchParams.set('source', params.source);\n if (params?.sort) searchParams.set('sort', params.sort);\n if (params?.recommended) searchParams.set('recommended', 'true');\n if (params?.intelligenceSource)\n searchParams.set('intelligence_source', params.intelligenceSource);\n if (params?.blueprintSet) searchParams.set('blueprint_set', params.blueprintSet);\n if (params?.labs) searchParams.set('labs', 'true');\n if (params?.limit != null) searchParams.set('limit', String(params.limit));\n if (params?.offset != null) searchParams.set('offset', String(params.offset));\n\n const query = searchParams.toString();\n const result = await this.request<ContentListResponse<PublicContentSummary>>(\n `/users/${encodeURIComponent(username)}/content${query ? `?${query}` : ''}`,\n );\n this.setCache(cacheKey, result);\n return result;\n }\n\n // ── Authenticated endpoints ──\n\n async getProfile(): Promise<UserProfile> {\n return this.request<UserProfile>('/me');\n }\n\n async publishContent(payload: PublishPayload): Promise<PublishResponse> {\n return this.request<PublishResponse>('/content', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n });\n }\n\n async getMyContent(): Promise<ContentListResponse<OwnedContentSummary>> {\n return this.request<ContentListResponse<OwnedContentSummary>>('/my/content');\n }\n\n async getAccessiblePrivateContent(params?: {\n type?: string;\n scope?: 'all' | 'personal' | 'organization';\n q?: string;\n limit?: number;\n offset?: number;\n }): Promise<ContentListResponse<OwnedContentSummary>> {\n const searchParams = new URLSearchParams();\n if (params?.type) searchParams.set('type', params.type);\n if (params?.scope) searchParams.set('scope', params.scope);\n if (params?.q) searchParams.set('q', params.q);\n if (params?.limit != null) searchParams.set('limit', String(params.limit));\n if (params?.offset != null) searchParams.set('offset', String(params.offset));\n const query = searchParams.toString();\n\n return this.request<ContentListResponse<OwnedContentSummary>>(\n `/private/content${query ? `?${query}` : ''}`,\n );\n }\n\n // ── Schema ──\n\n async getSchema(name: string = 'essence.v4.json'): Promise<Record<string, unknown>> {\n return this.request<Record<string, unknown>>(`/schema/${name}`);\n }\n\n // ── Showcase benchmarks ──\n\n async getShowcaseManifest(): Promise<ShowcaseManifestResponse> {\n const cacheKey = 'showcase:manifest';\n const cached = this.getCached<ShowcaseManifestResponse>(cacheKey);\n if (cached) return cached;\n\n const result = await this.request<ShowcaseManifestResponse>('/showcase/manifest');\n this.setCache(cacheKey, result);\n return result;\n }\n\n async getShowcaseShortlist(): Promise<ShowcaseShortlistResponse> {\n const cacheKey = 'showcase:shortlist';\n const cached = this.getCached<ShowcaseShortlistResponse>(cacheKey);\n if (cached) return cached;\n\n const result = await this.request<ShowcaseShortlistResponse>('/showcase/shortlist');\n this.setCache(cacheKey, result);\n return result;\n }\n\n async getShowcaseShortlistVerification(): Promise<ShowcaseShortlistReport> {\n const cacheKey = 'showcase:shortlist-verification';\n const cached = this.getCached<ShowcaseShortlistReport>(cacheKey);\n if (cached) return cached;\n\n const result = await this.request<ShowcaseShortlistReport>('/showcase/shortlist-verification');\n this.setCache(cacheKey, result);\n return result;\n }\n\n async getRegistryIntelligenceSummary(params?: {\n namespace?: string;\n }): Promise<RegistryIntelligenceSummaryResponse> {\n const cacheKey = `registry-intelligence-summary:${JSON.stringify(params ?? {})}`;\n const cached = this.getCached<RegistryIntelligenceSummaryResponse>(cacheKey);\n if (cached) return cached;\n\n const searchParams = new URLSearchParams();\n if (params?.namespace) searchParams.set('namespace', params.namespace);\n const query = searchParams.toString();\n const result = await this.request<RegistryIntelligenceSummaryResponse>(\n `/intelligence/summary${query ? `?${query}` : ''}`,\n );\n this.setCache(cacheKey, result);\n return result;\n }\n\n async compileExecutionPacks(\n essence: EssenceFile,\n params?: { namespace?: string },\n ): Promise<ExecutionPackBundleResponse> {\n const searchParams = new URLSearchParams();\n if (params?.namespace) searchParams.set('namespace', params.namespace);\n const query = searchParams.toString();\n\n return this.request<ExecutionPackBundleResponse>(`/packs/compile${query ? `?${query}` : ''}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(essence),\n });\n }\n\n async selectExecutionPack(\n input: HostedSelectedExecutionPackRequest,\n params?: { namespace?: string },\n ): Promise<SelectedExecutionPackResponse> {\n const searchParams = new URLSearchParams();\n if (params?.namespace) searchParams.set('namespace', params.namespace);\n const query = searchParams.toString();\n\n return this.request<SelectedExecutionPackResponse>(`/packs/select${query ? `?${query}` : ''}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(input),\n });\n }\n\n async getExecutionPackManifest(\n essence: EssenceFile,\n params?: { namespace?: string },\n ): Promise<ExecutionPackManifest> {\n const selected = await this.selectExecutionPack(\n {\n essence,\n pack_type: 'scaffold',\n },\n params,\n );\n\n return selected.manifest;\n }\n\n async critiqueFile(\n input: HostedFileCritiqueRequest,\n params?: { namespace?: string },\n ): Promise<FileCritiqueReport> {\n const searchParams = new URLSearchParams();\n if (params?.namespace) searchParams.set('namespace', params.namespace);\n const query = searchParams.toString();\n\n return this.request<FileCritiqueReport>(`/critique/file${query ? `?${query}` : ''}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(input),\n });\n }\n\n async auditProject(\n input: HostedProjectAuditRequest,\n params?: { namespace?: string },\n ): Promise<ProjectAuditReport> {\n const searchParams = new URLSearchParams();\n if (params?.namespace) searchParams.set('namespace', params.namespace);\n const query = searchParams.toString();\n\n return this.request<ProjectAuditReport>(`/audit/project${query ? `?${query}` : ''}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(input),\n });\n }\n}\n\n// ── Lightweight registry client (merged from client.ts) ──\n\nexport interface RegistryClientOptions {\n baseUrl?: string;\n}\n\nexport interface SearchResult {\n id: string;\n type: string;\n name: string;\n description: string;\n version: string;\n tags: string[];\n}\n\nexport interface RegistryClient {\n search(query: string, type?: string): Promise<SearchResult[]>;\n fetch(type: string, id: string, version?: string): Promise<unknown>;\n}\n\nexport function createRegistryClient(options: RegistryClientOptions = {}): RegistryClient {\n const baseUrl = options.baseUrl ?? 'https://api.decantr.ai/v1';\n return {\n async search(query: string, type?: string): Promise<SearchResult[]> {\n const params = new URLSearchParams({ q: query });\n if (type) params.set('type', type);\n const res = await fetch(`${baseUrl}/search?${params}`);\n if (!res.ok) return [];\n const data = (await res.json()) as\n | { results?: SearchResult[]; total?: number }\n | SearchResult[];\n // API returns { total, results } wrapper\n if (Array.isArray(data)) return data;\n return (data as { results: SearchResult[] }).results ?? [];\n },\n async fetch(type: string, id: string, version?: string): Promise<unknown> {\n const url = version\n ? `${baseUrl}/content/${type}/${id}/${version}`\n : `${baseUrl}/content/${type}/${id}`;\n const res = await fetch(url);\n if (!res.ok) return null;\n return res.json();\n },\n };\n}\n","import type { Pattern, PatternPreset } from './types.js';\n\nexport interface ResolvedPreset {\n preset: string;\n layout: PatternPreset['layout'];\n code: PatternPreset['code'];\n}\n\nexport function resolvePatternPreset(\n pattern: Pattern,\n explicitPreset?: string,\n themeDefaultPresets?: Record<string, string>,\n): ResolvedPreset {\n const presets = pattern.presets;\n const hasPresets = Object.keys(presets).length > 0;\n\n if (!hasPresets) {\n return {\n preset: '',\n layout: { layout: 'row', atoms: '' },\n code: pattern.code ?? { imports: '', example: '' },\n };\n }\n\n let presetName = explicitPreset;\n if (presetName && !presets[presetName]) presetName = undefined;\n if (!presetName && themeDefaultPresets?.[pattern.id]) {\n const themeName = themeDefaultPresets[pattern.id];\n if (presets[themeName]) presetName = themeName;\n }\n if (!presetName) presetName = pattern.default_preset;\n if (!presetName || !presets[presetName]) presetName = Object.keys(presets)[0];\n\n const preset = presets[presetName];\n return { preset: presetName, layout: preset.layout, code: preset.code };\n}\n","import type { EssenceFile } from '@decantr/essence-spec';\n\n// --- Pattern ---\nexport interface PatternLayoutSpec {\n layout: string;\n atoms: string;\n slots?: Record<string, string>;\n}\n\nexport interface PatternCodeSpec {\n imports?: string;\n example?: string;\n}\n\nexport interface PatternPreset {\n description: string;\n components?: string[];\n layout: PatternLayoutSpec;\n code?: PatternCodeSpec;\n}\n\nexport interface PatternIO {\n produces?: string[];\n consumes?: string[];\n actions?: string[];\n}\n\nexport interface Pattern {\n id: string;\n version: string;\n name: string;\n description: string;\n tags: string[];\n components: string[];\n default_preset: string;\n presets: Record<string, PatternPreset>;\n contained?: boolean;\n io?: PatternIO;\n code?: PatternCodeSpec;\n default_layout?: PatternLayoutSpec;\n visual_brief?: string;\n composition?: Record<string, string>;\n motion?: {\n micro?: Record<string, string>;\n transitions?: Record<string, string>;\n ambient?: Record<string, string>;\n };\n /**\n * Declared runtime interactions this pattern MUST implement.\n * Surfaced as a checkbox checklist in the per-page execution pack; enforced\n * by `decantr check --strict` (C5 guard rule). Each value maps to a\n * canonical implementation (treatment class + handler pattern) — see the\n * Interaction Requirements table in scaffolded DECANTR.md. Before this\n * field, motion/interactivity lived only as prose philosophy that cold\n * LLMs routinely categorized as \"nice to have\" and skipped.\n */\n interactions?: string[];\n responsive?: {\n mobile?: string;\n tablet?: string;\n desktop?: string;\n };\n accessibility?: {\n role?: string;\n 'aria-label'?: string;\n keyboard?: string[];\n announcements?: string[];\n focus_management?: string;\n };\n layout_hints?: Record<string, string>;\n category?: string;\n}\n\n// --- Archetype ---\nexport type ArchetypeRole = 'primary' | 'gateway' | 'public' | 'auxiliary';\n\nexport interface PatternReferenceObject {\n pattern: string;\n preset?: string;\n as?: string;\n}\n\nexport type PatternReference = string | PatternReferenceObject;\n\nexport interface LayoutGroup {\n cols: PatternReference[];\n at?: string;\n span?: Record<string, number>;\n}\n\nexport type LayoutItem = PatternReference | LayoutGroup;\n\nexport interface ContentDependencies {\n [kind: string]: Record<string, string>;\n}\n\nexport interface ArchetypePage {\n id: string;\n default_layout: LayoutItem[];\n shell: string;\n description?: string;\n patterns?: PatternReference[];\n}\n\nexport interface SeoHints {\n schema_org?: string[];\n meta_priorities?: string[];\n}\n\nexport interface ArchetypeSuggestedTheme {\n ids?: string[];\n modes?: string[];\n shapes?: string[];\n}\n\nexport interface ArchetypeHeroCustomization {\n style?: string;\n elements?: string[];\n background?: string;\n [key: string]: unknown;\n}\n\nexport interface Archetype {\n $schema?: string;\n id: string;\n version: string;\n decantr_compat?: string;\n name: string;\n description: string;\n tags: string[];\n role: ArchetypeRole;\n pages: ArchetypePage[];\n features: string[];\n dependencies?: ContentDependencies;\n seo_hints?: SeoHints;\n classification?: {\n triggers: { primary: string[]; secondary: string[]; negative: string[] };\n implies: string[];\n weight: number;\n tier: string;\n };\n page_briefs?: Record<string, string>;\n suggested_theme?: ArchetypeSuggestedTheme;\n shells?: Record<string, string>;\n personality?: string[];\n hero_customization?: ArchetypeHeroCustomization;\n}\n\n// --- Theme substructures (absorbed from former Recipe type) ---\nexport interface ThemeSpatial {\n density_bias: number;\n content_gap_shift: number;\n section_padding: string;\n card_wrapping: 'always' | 'minimal' | 'none';\n surface_override: string | null;\n}\n\nexport interface ThemeEffects {\n enabled: boolean;\n intensity: 'subtle' | 'moderate' | 'bold';\n type_mapping: Record<string, string[]>;\n component_fallback: Record<string, string>;\n intensity_values?: Record<string, Record<string, string>>;\n}\n\nexport interface ThemeShell {\n preferred: string[];\n nav_style: string;\n root?: string;\n nav?: string;\n header?: string;\n dimensions?: { navWidth?: string; headerHeight?: string };\n}\n\n// --- Blueprint ---\nexport type ComposeEntry = string | { archetype: string; prefix: string; role?: ArchetypeRole };\n\nexport const BLUEPRINT_PORTFOLIO_VISIBILITIES = [\n 'featured',\n 'public',\n 'labs',\n 'hidden',\n] as const;\nexport type BlueprintPortfolioVisibility = (typeof BLUEPRINT_PORTFOLIO_VISIBILITIES)[number];\n\nexport const BLUEPRINT_PORTFOLIO_MATURITIES = [\n 'certified-flagship',\n 'supported-contract',\n 'experimental',\n 'fold-candidate',\n 'legacy-hidden',\n] as const;\nexport type BlueprintPortfolioMaturity = (typeof BLUEPRINT_PORTFOLIO_MATURITIES)[number];\n\nexport const BLUEPRINT_ARTIFACT_STATUSES = ['none', 'planned', 'candidate', 'certified'] as const;\nexport type BlueprintArtifactStatus = (typeof BLUEPRINT_ARTIFACT_STATUSES)[number];\n\nexport const PUBLIC_BLUEPRINT_SETS = ['all', 'featured', 'certified', 'labs'] as const;\nexport type PublicBlueprintSet = (typeof PUBLIC_BLUEPRINT_SETS)[number];\n\nexport interface BlueprintPortfolioArtifact {\n status: BlueprintArtifactStatus;\n showcase?: string;\n notes?: string;\n}\n\nexport interface BlueprintPortfolioMetadata {\n visibility: BlueprintPortfolioVisibility;\n maturity: BlueprintPortfolioMaturity;\n rationale: string;\n recommended_alternative?: string;\n artifact: BlueprintPortfolioArtifact;\n}\n\nexport function isBlueprintPortfolioVisibility(\n value: unknown,\n): value is BlueprintPortfolioVisibility {\n return BLUEPRINT_PORTFOLIO_VISIBILITIES.includes(value as BlueprintPortfolioVisibility);\n}\n\nexport function isBlueprintPortfolioMaturity(value: unknown): value is BlueprintPortfolioMaturity {\n return BLUEPRINT_PORTFOLIO_MATURITIES.includes(value as BlueprintPortfolioMaturity);\n}\n\nexport function isBlueprintArtifactStatus(value: unknown): value is BlueprintArtifactStatus {\n return BLUEPRINT_ARTIFACT_STATUSES.includes(value as BlueprintArtifactStatus);\n}\n\nexport function isPublicBlueprintSet(value: unknown): value is PublicBlueprintSet {\n return PUBLIC_BLUEPRINT_SETS.includes(value as PublicBlueprintSet);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function getBlueprintPortfolioMetadata(\n value: unknown,\n): BlueprintPortfolioMetadata | null {\n const candidate = isRecord(value) && isRecord(value.blueprint_portfolio)\n ? value.blueprint_portfolio\n : value;\n if (!isRecord(candidate)) {\n return null;\n }\n\n const artifact = candidate.artifact;\n if (\n !isBlueprintPortfolioVisibility(candidate.visibility) ||\n !isBlueprintPortfolioMaturity(candidate.maturity) ||\n typeof candidate.rationale !== 'string' ||\n !isRecord(artifact) ||\n !isBlueprintArtifactStatus(artifact.status)\n ) {\n return null;\n }\n\n return {\n visibility: candidate.visibility,\n maturity: candidate.maturity,\n rationale: candidate.rationale,\n recommended_alternative:\n typeof candidate.recommended_alternative === 'string'\n ? candidate.recommended_alternative\n : undefined,\n artifact: {\n status: artifact.status,\n showcase: typeof artifact.showcase === 'string' ? artifact.showcase : undefined,\n notes: typeof artifact.notes === 'string' ? artifact.notes : undefined,\n },\n };\n}\n\nexport interface BlueprintRoute {\n shell?: string;\n archetype?: string;\n page?: string;\n}\n\nexport interface BlueprintNavigationHotkey {\n key: string;\n route?: string;\n label?: string;\n}\n\nexport interface BlueprintNavigation {\n command_palette?: boolean;\n hotkeys?: BlueprintNavigationHotkey[];\n}\n\nexport interface BlueprintOverrides {\n features_add?: string[];\n features_remove?: string[];\n pages_remove?: string[];\n pages?: Record<string, Record<string, unknown>>;\n}\n\nexport interface Blueprint {\n $schema?: string;\n id: string;\n version?: string;\n decantr_compat?: string;\n name: string;\n description?: string;\n blueprint_portfolio?: BlueprintPortfolioMetadata;\n tags?: string[];\n archetype?: string;\n compose?: ComposeEntry[];\n theme: { id: string; mode?: string; shape?: string };\n personality?: string | string[];\n features?: string[];\n routes?: Record<string, BlueprintRoute>;\n overrides?: BlueprintOverrides;\n seo_hints?: SeoHints;\n navigation?: BlueprintNavigation;\n dependencies?: ContentDependencies;\n suggested_themes?: string[];\n design_constraints?: Record<string, unknown>;\n voice?: {\n tone?: string;\n cta_verbs?: string[];\n avoid?: string[];\n empty_states?: string;\n errors?: string;\n loading?: string;\n metrics_format?: string;\n };\n responsive_strategy?: {\n breakpoints?: string[];\n navigation?: Record<string, string>;\n data_display?: Record<string, string>;\n };\n}\n\n// --- Shell ---\nexport interface Shell {\n id: string;\n name: string;\n description?: string;\n root?: string;\n nav?: string;\n header?: string;\n nav_style?: string;\n dimensions?: {\n navWidth?: string;\n headerHeight?: string;\n };\n internal_layout?: Record<string, unknown>;\n layout?: string;\n atoms?: string;\n config?: Record<string, unknown>;\n guidance?: Record<string, string>;\n code?: { imports?: string; example?: string };\n}\n\n// --- Content Resolution ---\nexport const CONTENT_TYPES = ['pattern', 'theme', 'blueprint', 'archetype', 'shell'] as const;\n\nexport type ContentType = (typeof CONTENT_TYPES)[number];\n\nexport const API_CONTENT_TYPES = [\n 'patterns',\n 'themes',\n 'blueprints',\n 'archetypes',\n 'shells',\n] as const;\n\nexport type ApiContentType = (typeof API_CONTENT_TYPES)[number];\n\nexport const CONTENT_TYPE_TO_API_CONTENT_TYPE: Record<ContentType, ApiContentType> = {\n pattern: 'patterns',\n theme: 'themes',\n blueprint: 'blueprints',\n archetype: 'archetypes',\n shell: 'shells',\n};\n\nexport const API_CONTENT_TYPE_TO_CONTENT_TYPE: Record<ApiContentType, ContentType> = {\n patterns: 'pattern',\n themes: 'theme',\n blueprints: 'blueprint',\n archetypes: 'archetype',\n shells: 'shell',\n};\n\nexport function isContentType(value: string): value is ContentType {\n return CONTENT_TYPES.includes(value as ContentType);\n}\n\nexport function isApiContentType(value: string): value is ApiContentType {\n return API_CONTENT_TYPES.includes(value as ApiContentType);\n}\n\nexport interface ResolvedContent<T> {\n item: T;\n source: 'local' | 'core';\n path: string;\n}\n\n// --- Content Health ---\n\nexport type ContentHealthStatus = 'healthy' | 'warning' | 'error';\nexport type ContentHealthFindingSource =\n | 'schema'\n | 'reference'\n | 'quality'\n | 'coverage'\n | 'content';\n\nexport interface ContentHealthRemediation {\n summary: string;\n prompt: string;\n commands: string[];\n}\n\nexport interface ContentHealthFinding {\n id: string;\n source: ContentHealthFindingSource;\n category: string;\n severity: VerificationSeverity;\n message: string;\n evidence: string[];\n file?: string;\n type?: ContentType;\n itemId?: string;\n rule?: string;\n suggestedFix?: string;\n remediation: ContentHealthRemediation;\n}\n\nexport interface ContentHealthTypeSummary {\n type: ContentType;\n directory: ApiContentType;\n itemCount: number;\n validCount: number;\n errorCount: number;\n warnCount: number;\n infoCount: number;\n ignoredCount: number;\n}\n\nexport interface ContentHealthReferenceSummary {\n checked: number;\n missing: number;\n missingByType: Record<ContentType, number>;\n}\n\nexport interface ContentHealthQualitySummary {\n patternVisualBriefCoverage: number;\n patternInteractionCoverage: number;\n themeDecoratorCoverage: number;\n blueprintPersonalityCoverage: number;\n blueprintVoiceCoverage: number;\n archetypePageBriefCoverage: number;\n}\n\nexport interface ContentHealthReport {\n $schema: string;\n generatedAt: string;\n contentRoot: string;\n status: ContentHealthStatus;\n score: number;\n summary: {\n itemCount: number;\n validCount: number;\n errorCount: number;\n warnCount: number;\n infoCount: number;\n findingCount: number;\n ignoredCount: number;\n contentDirectoryCount: number;\n };\n content: ContentHealthTypeSummary[];\n references: ContentHealthReferenceSummary;\n quality: ContentHealthQualitySummary;\n ci: {\n recommendedCommand: string;\n failOn: 'error' | 'warn' | 'none';\n };\n findings: ContentHealthFinding[];\n}\n\n// --- Theme ---\n\nexport type CvdMode = 'deuteranopia' | 'protanopia' | 'tritanopia' | 'achromatopsia';\n\nexport interface ThemeTokens {\n base?: Record<string, string>;\n cvd?: Partial<Record<CvdMode, Record<string, string>>>;\n}\n\nexport interface Theme {\n id: string;\n name: string;\n description?: string;\n tags?: string[];\n personality?: string;\n seed?: Record<string, string>;\n palette?: Record<string, Record<string, string>>;\n modes?: string[];\n shapes?: string[];\n cvd_support?: CvdMode[];\n tokens?: ThemeTokens;\n decantr_compat?: string;\n source?: string;\n // Absorbed from former Recipe type\n decorators?: Record<string, string>;\n treatments?: Record<string, Record<string, string>>;\n spatial?: ThemeSpatial;\n shell?: ThemeShell;\n effects?: ThemeEffects;\n motion?: {\n preference?: string;\n reduce_motion?: boolean;\n entrance?: string;\n timing?: string;\n durations?: Record<string, string>;\n };\n typography?: { scale?: string; heading_weight?: number; body_weight?: number; mono?: string };\n radius?: { philosophy?: string; base?: number };\n compositions?: Record<string, { shell: string; description: string; effects?: string[] }>;\n pattern_preferences?: {\n prefer: string[];\n avoid: string[];\n default_presets?: Record<string, string>;\n };\n decorator_definitions?: Record<\n string,\n {\n description: string;\n intent: string;\n suggested_properties?: Record<string, string>;\n pairs_with?: string[];\n usage?: string[];\n }\n >;\n}\n\n// --- API Client Types ---\n\nexport interface ContentListResponse<T = Record<string, unknown>> {\n items: T[];\n total: number;\n limit?: number;\n offset?: number;\n}\n\nexport type ContentVerificationStatus =\n | 'unknown'\n | 'pending'\n | 'build-green'\n | 'build-red'\n | 'smoke-green'\n | 'smoke-red';\n\nexport type ContentBenchmarkConfidence = 'none' | 'low' | 'medium' | 'high';\nexport type ContentConfidenceTier = 'low' | 'medium' | 'high' | 'verified';\n\nexport type ContentGoldenUsage = 'none' | 'showcase' | 'shortlisted';\nexport const PUBLIC_CONTENT_SOURCES = ['official', 'community', 'organization'] as const;\n\nexport type PublicContentSource = (typeof PUBLIC_CONTENT_SOURCES)[number];\n\nexport function isPublicContentSource(value: string): value is PublicContentSource {\n return PUBLIC_CONTENT_SOURCES.includes(value as PublicContentSource);\n}\n\nexport const CONTENT_INTELLIGENCE_SOURCES = ['authored', 'benchmark', 'hybrid'] as const;\n\nexport type ContentIntelligenceSource = 'authored' | 'benchmark' | 'hybrid';\n\nexport function isContentIntelligenceSource(value: string): value is ContentIntelligenceSource {\n return CONTENT_INTELLIGENCE_SOURCES.includes(value as ContentIntelligenceSource);\n}\n\nexport interface ContentIntelligenceMetadata {\n source: ContentIntelligenceSource;\n verification_status: ContentVerificationStatus;\n last_verified_at?: string | null;\n target_coverage: string[];\n benchmark_confidence: ContentBenchmarkConfidence;\n confidence_tier: ContentConfidenceTier;\n golden_usage: ContentGoldenUsage;\n quality_score: number | null;\n confidence_score: number | null;\n recommended: boolean;\n evidence: string[];\n recommendation_reasons: string[];\n recommendation_blockers: string[];\n benchmark?: {\n classification?: ShowcaseVerificationEntry['classification'];\n target?: string | null;\n drift_signal?: ShowcaseVerificationEntry['drift']['signal'];\n build_passed?: boolean | null;\n smoke_passed?: boolean | null;\n };\n}\n\nexport interface PublicContentSummary {\n id: string;\n slug: string;\n namespace: string;\n type: string;\n version?: string;\n name?: string;\n description?: string;\n published_at?: string;\n owner_name?: string | null;\n owner_username?: string | null;\n thumbnail_url?: string | null;\n blueprint_portfolio?: BlueprintPortfolioMetadata | null;\n intelligence?: ContentIntelligenceMetadata | null;\n}\n\nexport interface PublicContentRecord<TData = Record<string, unknown>> {\n id: string;\n slug: string;\n namespace: string;\n type: string;\n version: string;\n data: TData;\n visibility: 'public' | 'private';\n status: 'pending' | 'approved' | 'rejected' | 'published';\n created_at: string;\n updated_at: string;\n published_at?: string;\n owner_name?: string | null;\n owner_username?: string | null;\n thumbnail_url?: string | null;\n intelligence?: ContentIntelligenceMetadata | null;\n}\n\nexport interface ContentItem extends PublicContentRecord<Record<string, unknown>> {}\n\nexport interface OwnedContentSummary extends PublicContentSummary {\n visibility: 'public' | 'private';\n status: 'pending' | 'approved' | 'rejected' | 'published';\n created_at: string;\n updated_at: string;\n}\n\nexport interface PublicUserProfile {\n username: string;\n display_name: string | null;\n reputation_score: number;\n tier: 'free' | 'pro' | 'team' | 'enterprise';\n created_at: string;\n content_count: number;\n content_counts: Record<string, number>;\n}\n\nexport interface PublishPayload {\n type: ApiContentType;\n slug: string;\n namespace: string;\n version: string;\n data: Record<string, unknown>;\n visibility?: 'public' | 'private';\n}\n\nexport interface PublishResponse {\n id: string;\n slug: string;\n namespace: string;\n type: string;\n status: string;\n}\n\nexport interface SearchParams {\n q: string;\n type?: string;\n namespace?: string;\n source?: PublicContentSource;\n sort?: string;\n recommended?: boolean;\n intelligenceSource?: ContentIntelligenceSource;\n blueprintSet?: PublicBlueprintSet;\n labs?: boolean;\n limit?: number;\n offset?: number;\n}\n\nexport interface SearchResponse {\n results: PublicContentSummary[];\n total: number;\n limit?: number;\n offset?: number;\n}\n\nexport interface RegistryIntelligenceSummaryBucket {\n total_public_items: number;\n with_intelligence: number;\n recommended: number;\n authored: number;\n benchmark: number;\n hybrid: number;\n missing_source: number;\n smoke_green: number;\n build_green: number;\n high_confidence: number;\n verified_confidence: number;\n}\n\nexport interface RegistryIntelligenceSummaryResponse {\n $schema: string;\n generated_at: string;\n namespace: string | null;\n totals: RegistryIntelligenceSummaryBucket;\n by_type: Record<ContentType, RegistryIntelligenceSummaryBucket>;\n}\n\nexport interface UserProfile {\n id: string;\n email: string;\n tier: 'free' | 'pro' | 'team' | 'enterprise';\n reputation_score: number;\n trusted: boolean;\n}\n\nexport interface ShowcaseVerificationEntry {\n slug: string;\n target: string | null;\n classification: 'pending' | 'A' | 'B' | 'C' | 'D';\n verificationStatus: 'pending' | 'build-green' | 'build-red' | 'smoke-green' | 'smoke-red';\n build: {\n passed: boolean | null;\n durationMs: number;\n };\n smoke: {\n passed: boolean | null;\n durationMs: number;\n rootDocumentOk: boolean;\n titleOk: boolean;\n langOk: boolean;\n viewportOk: boolean;\n charsetOk: boolean;\n cspSignalOk: boolean;\n inlineScriptCount: number;\n inlineEventHandlerCount: number;\n externalScriptsWithoutIntegrityCount: number;\n externalScriptsWithIntegrityMissingCrossoriginCount: number;\n externalStylesheetsWithoutIntegrityCount: number;\n externalStylesheetsWithIntegrityMissingCrossoriginCount: number;\n externalScriptsWithInsecureTransportCount: number;\n externalStylesheetsWithInsecureTransportCount: number;\n externalMediaSourcesWithInsecureTransportCount: number;\n externalBlankLinksWithoutRelCount: number;\n externalIframesWithoutSandboxCount: number;\n externalIframesWithInsecureTransportCount: number;\n jsEvalSignalCount: number;\n jsHtmlInjectionSignalCount: number;\n jsInsecureTransportSignalCount: number;\n jsSecretSignalCount: number;\n assetCount: number;\n assetsPassed: number;\n routeHintsChecked: string[];\n routeHintsMatched: number;\n routeHintsCoverageOk: boolean;\n routeDocumentsChecked: number;\n routeDocumentsPassed: number;\n routeDocumentsHardenedCount: number;\n routeDocumentsCoverageOk: boolean;\n routeDocumentsHardeningOk: boolean;\n fullRouteCoverageOk: boolean;\n totalAssetBytes: number;\n jsAssetBytes: number;\n cssAssetBytes: number;\n largestAssetPath: string | null;\n largestAssetBytes: number;\n failures: string[];\n };\n drift: {\n signal: 'lower' | 'moderate' | 'elevated';\n penalty: number;\n inlineStyleCount: number;\n hardcodedColorCount: number;\n utilityLeakageCount: number;\n decantrTreatmentCount: number;\n hasPackManifest: boolean;\n hasDist: boolean;\n };\n}\n\nexport interface ShowcaseShortlistSummary {\n appCount: number;\n passedBuilds: number;\n failedBuilds: number;\n averageDurationMs: number;\n passedSmokes: number;\n failedSmokes: number;\n averageSmokeDurationMs: number;\n appsWithTitleOkCount: number;\n appsWithLangOkCount: number;\n appsWithViewportOkCount: number;\n appsWithCharsetOkCount: number;\n appsWithoutInlineScriptsCount: number;\n appsWithCspSignalCount: number;\n appsWithExternalScriptIntegrityCount: number;\n appsWithExternalScriptCrossoriginCount: number;\n appsWithExternalStylesheetIntegrityCount: number;\n appsWithExternalStylesheetCrossoriginCount: number;\n appsWithRouteCoverageCount: number;\n appsWithFullRouteCoverageCount: number;\n averageTotalAssetBytes: number;\n averageJsAssetBytes: number;\n averageCssAssetBytes: number;\n lowerDriftCount: number;\n moderateDriftCount: number;\n elevatedDriftCount: number;\n withPackManifestCount: number;\n}\n\nexport interface ShowcaseManifestEntry {\n slug: string;\n status: string;\n classification: string;\n origin?: string | null;\n target?: string | null;\n goldenCandidate?: string | boolean;\n notes?: string | null;\n thumbnail?: {\n src: string;\n alt: string;\n width?: number;\n height?: number;\n } | null;\n url?: string | null;\n verification?: ShowcaseVerificationEntry | null;\n}\n\nexport interface ShowcaseManifestResponse {\n total: number;\n shortlisted: number;\n apps: ShowcaseManifestEntry[];\n}\n\nexport interface ShowcaseShortlistResponse {\n generatedAt: string | null;\n summary: ShowcaseShortlistSummary | null;\n apps: ShowcaseManifestEntry[];\n}\n\nexport interface ShowcaseShortlistReport {\n $schema: string;\n generatedAt: string;\n dryRun: boolean;\n summary: ShowcaseShortlistSummary;\n results: ShowcaseVerificationEntry[];\n}\n\nexport interface HostedFileCritiqueRequest {\n essence: EssenceFile;\n code: string;\n filePath?: string;\n treatmentsCss?: string;\n}\n\nexport interface HostedDistSnapshot {\n indexHtml: string;\n assets?: Record<string, string>;\n}\n\nexport interface HostedSourceSnapshot {\n files: Record<string, string>;\n}\n\nexport interface HostedProjectAuditRequest {\n essence: EssenceFile;\n dist?: HostedDistSnapshot;\n sources?: HostedSourceSnapshot;\n}\n\nexport type ExecutionPackType = 'scaffold' | 'section' | 'page' | 'mutation' | 'review';\n\nexport interface ExecutionPackTarget {\n platform: 'web';\n framework: string | null;\n runtime: string | null;\n adapter: string;\n}\n\nexport interface ExecutionPackScope {\n appId: string;\n pageIds: string[];\n patternIds: string[];\n}\n\nexport interface ExecutionPackExample {\n id: string;\n label: string;\n language: string;\n snippet: string;\n}\n\nexport interface ExecutionPackAntiPattern {\n id: string;\n summary: string;\n guidance: string;\n}\n\nexport interface ExecutionPackSuccessCheck {\n id: string;\n label: string;\n severity: 'error' | 'warn' | 'info';\n}\n\nexport interface ExecutionPackTokenBudget {\n target: number;\n max: number;\n strategy: string[];\n}\n\nexport interface ExecutionPackBase<TData = Record<string, unknown>> {\n $schema: string;\n packVersion: '1.0.0';\n packType: ExecutionPackType;\n objective: string;\n target: ExecutionPackTarget;\n preset: string | null;\n scope: ExecutionPackScope;\n requiredSetup: string[];\n allowedVocabulary: string[];\n examples: ExecutionPackExample[];\n antiPatterns: ExecutionPackAntiPattern[];\n successChecks: ExecutionPackSuccessCheck[];\n tokenBudget: ExecutionPackTokenBudget;\n data: TData;\n renderedMarkdown: string;\n}\n\nexport interface PackManifestEntry {\n id: string;\n markdown: string;\n json: string;\n}\n\nexport interface PackManifestSectionEntry extends PackManifestEntry {\n pageIds: string[];\n}\n\nexport interface PackManifestPageEntry extends PackManifestEntry {\n sectionId: string | null;\n sectionRole: string | null;\n}\n\nexport interface PackManifestMutationEntry extends PackManifestEntry {\n mutationType: 'add-page' | 'modify';\n}\n\nexport interface ExecutionPackManifest {\n $schema: string;\n version: '1.0.0';\n generatedAt: string;\n scaffold: PackManifestEntry | null;\n review: PackManifestEntry | null;\n sections: PackManifestSectionEntry[];\n pages: PackManifestPageEntry[];\n mutations: PackManifestMutationEntry[];\n}\n\nexport interface ScaffoldExecutionPack\n extends ExecutionPackBase<{\n shell: string;\n theme: {\n id: string;\n mode: string;\n shape: string | null;\n };\n routing: 'hash' | 'history' | 'pathname';\n features: string[];\n routes: Array<{\n pageId: string;\n path: string;\n shell?: string;\n patternIds: string[];\n }>;\n }> {\n packType: 'scaffold';\n}\n\nexport interface ReviewExecutionPack\n extends ExecutionPackBase<{\n reviewType: 'app';\n shell: string;\n theme: {\n id: string;\n mode: string;\n shape: string | null;\n };\n routing: 'hash' | 'history' | 'pathname';\n features: string[];\n routes: Array<{\n pageId: string;\n path: string;\n shell?: string;\n patternIds: string[];\n }>;\n focusAreas: string[];\n workflow: string[];\n }> {\n packType: 'review';\n}\n\nexport interface SectionExecutionPack\n extends ExecutionPackBase<{\n sectionId: string;\n role: string;\n shell: string;\n description: string;\n features: string[];\n theme: {\n id: string;\n mode: string;\n shape: string | null;\n };\n routes: Array<{\n pageId: string;\n path: string;\n shell?: string;\n patternIds: string[];\n }>;\n }> {\n packType: 'section';\n}\n\nexport interface PageExecutionPack\n extends ExecutionPackBase<{\n pageId: string;\n path: string;\n shell: string;\n sectionId: string | null;\n sectionRole: string | null;\n features: string[];\n surface: string;\n theme: {\n id: string;\n mode: string;\n shape: string | null;\n };\n wiringSignals: string[];\n patterns: Array<{\n id: string;\n alias: string;\n preset: string;\n layout: string;\n }>;\n }> {\n packType: 'page';\n}\n\nexport interface MutationExecutionPack\n extends ExecutionPackBase<{\n mutationType: 'add-page' | 'modify';\n shell: string;\n theme: {\n id: string;\n mode: string;\n shape: string | null;\n };\n routing: 'hash' | 'history' | 'pathname';\n features: string[];\n routes: Array<{\n pageId: string;\n path: string;\n shell?: string;\n patternIds: string[];\n }>;\n workflow: string[];\n }> {\n packType: 'mutation';\n}\n\nexport interface ExecutionPackBundleResponse {\n $schema: string;\n generatedAt: string;\n sourceEssenceVersion: string;\n manifest: ExecutionPackManifest;\n scaffold: ScaffoldExecutionPack;\n review: ReviewExecutionPack;\n sections: SectionExecutionPack[];\n pages: PageExecutionPack[];\n mutations: MutationExecutionPack[];\n}\n\nexport interface HostedSelectedExecutionPackRequest {\n essence: EssenceFile;\n pack_type: ExecutionPackType;\n id?: string;\n}\n\nexport interface SelectedExecutionPackResponse {\n $schema: string;\n generatedAt: string;\n sourceEssenceVersion: string;\n manifest: ExecutionPackManifest;\n selector: {\n packType: ExecutionPackType;\n id: string | null;\n };\n pack:\n | ScaffoldExecutionPack\n | ReviewExecutionPack\n | SectionExecutionPack\n | PageExecutionPack\n | MutationExecutionPack;\n}\n\nexport type VerificationSeverity = 'error' | 'warn' | 'info';\n\nexport interface VerificationFinding {\n id: string;\n category: string;\n severity: VerificationSeverity;\n message: string;\n evidence: string[];\n target?: string;\n file?: string;\n rule?: string;\n suggestedFix?: string;\n}\n\nexport interface VerificationScore {\n category: string;\n focusArea: string;\n score: number;\n details: string;\n suggestions: string[];\n}\n\nexport interface FileCritiqueReport {\n $schema: string;\n file: string;\n overall: number;\n scores: VerificationScore[];\n findings: VerificationFinding[];\n focusAreas: string[];\n reviewPack: ReviewExecutionPack | null;\n}\n\nexport interface ProjectAuditRuntimeAudit {\n distPresent: boolean;\n indexPresent: boolean;\n checked: boolean;\n passed: boolean | null;\n rootDocumentOk: boolean;\n titleOk: boolean;\n langOk: boolean;\n viewportOk: boolean;\n charsetOk: boolean;\n cspSignalOk: boolean;\n inlineScriptCount: number;\n inlineEventHandlerCount: number;\n externalScriptsWithoutIntegrityCount: number;\n externalScriptsWithIntegrityMissingCrossoriginCount: number;\n externalStylesheetsWithoutIntegrityCount: number;\n externalStylesheetsWithIntegrityMissingCrossoriginCount: number;\n externalScriptsWithInsecureTransportCount: number;\n externalStylesheetsWithInsecureTransportCount: number;\n externalMediaSourcesWithInsecureTransportCount: number;\n externalBlankLinksWithoutRelCount: number;\n externalIframesWithoutSandboxCount: number;\n externalIframesWithInsecureTransportCount: number;\n jsEvalSignalCount: number;\n jsHtmlInjectionSignalCount: number;\n jsInsecureTransportSignalCount: number;\n jsSecretSignalCount: number;\n assetCount: number;\n assetsPassed: number;\n routeHintsChecked: string[];\n routeHintsMatched: number;\n routeHintsCoverageOk: boolean;\n routeDocumentsChecked: number;\n routeDocumentsPassed: number;\n routeDocumentsHardenedCount: number;\n routeDocumentsCoverageOk: boolean;\n routeDocumentsHardeningOk: boolean;\n fullRouteCoverageOk: boolean;\n totalAssetBytes: number;\n jsAssetBytes: number;\n cssAssetBytes: number;\n largestAssetPath: string | null;\n largestAssetBytes: number;\n failures: string[];\n}\n\nexport interface ProjectAuditSummary {\n errorCount: number;\n warnCount: number;\n infoCount: number;\n essenceVersion: string | null;\n reviewPackPresent: boolean;\n packManifestPresent: boolean;\n runtimeAuditChecked: boolean;\n runtimePassed: boolean | null;\n pageCount: number;\n}\n\nexport interface ProjectAuditReport {\n $schema: string;\n projectRoot: string;\n valid: boolean;\n essence: EssenceFile | null;\n reviewPack: ReviewExecutionPack | null;\n packManifest: ExecutionPackManifest | null;\n runtimeAudit: ProjectAuditRuntimeAudit;\n findings: VerificationFinding[];\n summary: ProjectAuditSummary;\n}\n","import { getBlueprintPortfolioMetadata, type PublicContentSummary } from './types.js';\n\nexport type PublicContentSort = 'recommended' | 'recent' | 'name';\n\nfunction verificationScore(status?: string | null): number {\n switch (status) {\n case 'smoke-green':\n return 200;\n case 'build-green':\n return 120;\n case 'pending':\n return 20;\n case 'smoke-red':\n case 'build-red':\n return -40;\n default:\n return 0;\n }\n}\n\nfunction confidenceScore(level?: string | null): number {\n switch (level) {\n case 'high':\n return 120;\n case 'medium':\n return 70;\n case 'low':\n return 30;\n default:\n return 0;\n }\n}\n\nfunction confidenceTierScore(tier?: string | null): number {\n switch (tier) {\n case 'verified':\n return 180;\n case 'high':\n return 120;\n case 'medium':\n return 60;\n case 'low':\n return 10;\n default:\n return 0;\n }\n}\n\nfunction getRecommendedPriority(item: PublicContentSummary): number {\n const intelligence = item.intelligence;\n let score = 0;\n\n const portfolio = getBlueprintPortfolioMetadata(item.blueprint_portfolio);\n if (portfolio?.visibility === 'featured') {\n score += 900;\n }\n if (portfolio?.artifact.status === 'certified') {\n score += 650;\n } else if (portfolio?.artifact.status === 'candidate') {\n score += 120;\n }\n if (portfolio?.visibility === 'labs' || portfolio?.visibility === 'hidden') {\n score -= 400;\n }\n\n if (!intelligence) {\n return score;\n }\n\n if (intelligence.recommended) {\n score += 500;\n }\n\n if (intelligence.golden_usage === 'shortlisted') {\n score += 160;\n } else if (intelligence.golden_usage === 'showcase') {\n score += 80;\n }\n\n score += verificationScore(intelligence.verification_status);\n score += confidenceScore(intelligence.benchmark_confidence);\n score += confidenceTierScore(intelligence.confidence_tier);\n score += Math.round((intelligence.confidence_score ?? 0) / 2);\n score += intelligence.quality_score ?? 0;\n\n return score;\n}\n\nexport function normalizePublicContentSort(value: string | null | undefined): PublicContentSort {\n switch (value) {\n case 'popular':\n case 'recommended':\n return 'recommended';\n case 'newest':\n case 'recent':\n case 'published':\n return 'recent';\n case 'name':\n return 'name';\n default:\n return 'recommended';\n }\n}\n\nexport function comparePublicContent(\n a: PublicContentSummary,\n b: PublicContentSummary,\n sort: PublicContentSort = 'recommended',\n): number {\n if (sort === 'name') {\n return (a.name ?? a.slug).localeCompare(b.name ?? b.slug);\n }\n\n if (sort === 'recent') {\n const publishedDelta =\n new Date(b.published_at ?? 0).getTime() - new Date(a.published_at ?? 0).getTime();\n if (publishedDelta !== 0) {\n return publishedDelta;\n }\n return a.slug.localeCompare(b.slug);\n }\n\n const priorityDelta = getRecommendedPriority(b) - getRecommendedPriority(a);\n if (priorityDelta !== 0) {\n return priorityDelta;\n }\n\n if (a.namespace !== b.namespace) {\n if (a.namespace === '@official') return -1;\n if (b.namespace === '@official') return 1;\n }\n\n const publishedDelta =\n new Date(b.published_at ?? 0).getTime() - new Date(a.published_at ?? 0).getTime();\n if (publishedDelta !== 0) {\n return publishedDelta;\n }\n\n return (a.name ?? a.slug).localeCompare(b.name ?? b.slug);\n}\n\nexport function sortPublicContent<T extends PublicContentSummary>(\n items: T[],\n sort: PublicContentSort = 'recommended',\n): T[] {\n return [...items].sort((left, right) => comparePublicContent(left, right, sort));\n}\n","import { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type {\n Archetype,\n Blueprint,\n ContentType,\n Pattern,\n ResolvedContent,\n Shell,\n Theme,\n} from './types.js';\n\ntype ContentMap = {\n pattern: Pattern;\n archetype: Archetype;\n theme: Theme;\n blueprint: Blueprint;\n shell: Shell;\n};\n\nexport interface ResolverOptions {\n contentRoot: string;\n overridePaths?: string[];\n}\n\nexport interface ContentResolver {\n resolve<T extends ContentType>(\n type: T,\n id: string,\n ): Promise<ResolvedContent<ContentMap[T]> | null>;\n}\n\nconst TYPE_DIRS: Record<ContentType, string> = {\n pattern: 'patterns',\n archetype: 'archetypes',\n theme: 'themes',\n blueprint: 'blueprints',\n shell: 'shells',\n};\n\nasync function tryLoadJson<T>(filePath: string): Promise<T | null> {\n try {\n const content = await readFile(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\nexport function createResolver(options: ResolverOptions): ContentResolver {\n const { contentRoot, overridePaths = [] } = options;\n return {\n async resolve<T extends ContentType>(\n type: T,\n id: string,\n ): Promise<ResolvedContent<ContentMap[T]> | null> {\n const dir = TYPE_DIRS[type];\n const fileName = `${id}.json`;\n for (const overridePath of overridePaths) {\n const filePath = join(overridePath, dir, fileName);\n const item = await tryLoadJson<ContentMap[T]>(filePath);\n if (item) return { item, source: 'local', path: filePath };\n }\n // Check main content directory\n const mainPath = join(contentRoot, dir, fileName);\n const mainItem = await tryLoadJson<ContentMap[T]>(mainPath);\n if (mainItem) return { item: mainItem, source: 'core', path: mainPath };\n\n // Check content/core/{type}/ as fallback\n const corePath = join(contentRoot, 'core', dir, fileName);\n const coreItem = await tryLoadJson<ContentMap[T]>(corePath);\n if (coreItem) return { item: coreItem, source: 'core', path: corePath };\n\n return null;\n },\n };\n}\n","import type { LayoutItem, PatternRef } from '@decantr/essence-spec';\nimport type { PatternIO } from './types.js';\n\n// AUTO: hookType classifies each signal for custom hook generation\nexport type HookType = 'search' | 'filter' | 'selection' | 'sort';\n\nexport interface WiringSignal {\n name: string;\n init: string;\n hookType: HookType;\n}\n\nexport interface WiringRule {\n pair: [string, string];\n signals: WiringSignal[];\n props: Record<string, Record<string, string>>;\n // AUTO: hookProps maps pattern IDs to hook variable names passed as props\n hookProps: Record<string, Record<string, string>>;\n}\n\nexport interface WiringResult {\n rule: WiringRule;\n signals: WiringSignal[];\n props: Record<string, Record<string, string>>;\n hookProps: Record<string, Record<string, string>>;\n}\n\n/**\n * IO declaration for a pattern, used by the data-driven wiring system.\n */\nexport interface PatternIOEntry {\n id: string;\n io: PatternIO;\n}\n\n/**\n * A dynamically derived wiring edge between two patterns based on shared IO signals.\n */\nexport interface IOWiringEdge {\n producer: string;\n consumer: string;\n signals: string[];\n}\n\nexport const WIRING_RULES: WiringRule[] = [\n {\n pair: ['filter-bar', 'data-table'],\n signals: [\n { name: 'pageSearch', init: \"''\", hookType: 'search' },\n { name: 'pageStatus', init: \"'all'\", hookType: 'filter' },\n ],\n props: {\n 'filter-bar': { onSearch: 'setPageSearch', onCategory: 'setPageStatus' },\n 'data-table': { search: 'pageSearch', status: 'pageStatus' },\n },\n hookProps: {\n 'filter-bar': { search: 'search', filters: 'filters' },\n 'data-table': { search: 'search', filters: 'filters' },\n },\n },\n {\n pair: ['filter-bar', 'activity-feed'],\n signals: [\n { name: 'pageSearch', init: \"''\", hookType: 'search' },\n { name: 'pageView', init: \"'all'\", hookType: 'filter' },\n ],\n props: {\n 'filter-bar': { onSearch: 'setPageSearch', onView: 'setPageView' },\n 'activity-feed': { search: 'pageSearch', view: 'pageView' },\n },\n hookProps: {\n 'filter-bar': { search: 'search', filters: 'filters' },\n 'activity-feed': { search: 'search', filters: 'filters' },\n },\n },\n {\n pair: ['filter-bar', 'card-grid'],\n signals: [{ name: 'pageSearch', init: \"''\", hookType: 'search' }],\n props: {\n 'filter-bar': { onSearch: 'setPageSearch' },\n 'card-grid': { search: 'pageSearch' },\n },\n hookProps: {\n 'filter-bar': { search: 'search' },\n 'card-grid': { search: 'search' },\n },\n },\n];\n\nfunction getPatternId(item: LayoutItem): string | null {\n if (typeof item === 'string') return item;\n if ('pattern' in item) return (item as PatternRef).pattern;\n return null;\n}\n\n/**\n * Derive wiring edges from pattern IO declarations.\n * If pattern A produces signal X and pattern B consumes signal X, an edge is created.\n * Only patterns present in the layout are considered.\n */\nexport function deriveIOWirings(\n layoutIds: string[],\n patternIOMap: Map<string, PatternIO>,\n): IOWiringEdge[] {\n const edges: IOWiringEdge[] = [];\n const layoutSet = new Set(layoutIds);\n\n for (const producerId of layoutIds) {\n const producerIO = patternIOMap.get(producerId);\n if (!producerIO?.produces?.length) continue;\n\n for (const consumerId of layoutIds) {\n if (producerId === consumerId) continue;\n if (!layoutSet.has(consumerId)) continue;\n const consumerIO = patternIOMap.get(consumerId);\n if (!consumerIO?.consumes?.length) continue;\n\n const shared = producerIO.produces.filter((signal) => consumerIO.consumes!.includes(signal));\n if (shared.length > 0) {\n edges.push({ producer: producerId, consumer: consumerId, signals: shared });\n }\n }\n }\n\n return edges;\n}\n\n/**\n * Build a PatternIO map from an array of PatternIOEntry objects.\n */\nexport function buildIOMap(entries: PatternIOEntry[]): Map<string, PatternIO> {\n const map = new Map<string, PatternIO>();\n for (const entry of entries) {\n map.set(entry.id, entry.io);\n }\n return map;\n}\n\n/**\n * Detect wirings from a layout. Uses hardcoded WIRING_RULES for detailed\n * signal/prop information. When a patternIOMap is provided, also derives\n * IO-based wirings and merges them (hardcoded rules take precedence for\n * pairs they cover).\n */\nexport function detectWirings(\n layout: LayoutItem[],\n patternIOMap?: Map<string, PatternIO>,\n): WiringResult[] {\n const patternIds = layout.map(getPatternId).filter((id): id is string => id !== null);\n const results: WiringResult[] = [];\n const coveredPairs = new Set<string>();\n\n // Apply hardcoded rules first (these have detailed signal/prop info)\n for (const rule of WIRING_RULES) {\n const [a, b] = rule.pair;\n if (patternIds.includes(a) && patternIds.includes(b)) {\n results.push({ rule, signals: rule.signals, props: rule.props, hookProps: rule.hookProps });\n coveredPairs.add(`${a}:${b}`);\n coveredPairs.add(`${b}:${a}`);\n }\n }\n\n // If IO map provided, derive additional wirings from IO declarations\n if (patternIOMap) {\n const ioEdges = deriveIOWirings(patternIds, patternIOMap);\n for (const edge of ioEdges) {\n const pairKey = `${edge.producer}:${edge.consumer}`;\n if (coveredPairs.has(pairKey)) continue;\n coveredPairs.add(pairKey);\n\n // Generate a synthetic WiringRule from IO signals\n const signals: WiringSignal[] = edge.signals.map((sig) => {\n const camel = toCamelCase(sig);\n return {\n name: `page${capitalize(camel)}`,\n init: \"''\",\n hookType: classifySignal(sig),\n };\n });\n\n const producerProps: Record<string, string> = {};\n const consumerProps: Record<string, string> = {};\n const producerHookProps: Record<string, string> = {};\n const consumerHookProps: Record<string, string> = {};\n\n for (const sig of edge.signals) {\n const camel = toCamelCase(sig);\n const stateName = `page${capitalize(camel)}`;\n const setterName = `set${capitalize(stateName)}`;\n producerProps[`on${capitalize(camel)}`] = setterName;\n consumerProps[sig] = stateName;\n producerHookProps[sig] = sig;\n consumerHookProps[sig] = sig;\n }\n\n const rule: WiringRule = {\n pair: [edge.producer, edge.consumer],\n signals,\n props: { [edge.producer]: producerProps, [edge.consumer]: consumerProps },\n hookProps: { [edge.producer]: producerHookProps, [edge.consumer]: consumerHookProps },\n };\n\n results.push({ rule, signals, props: rule.props, hookProps: rule.hookProps });\n }\n }\n\n return results;\n}\n\n/**\n * Convert a kebab-case string to camelCase.\n */\nfunction toCamelCase(str: string): string {\n return str.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n}\n\n/**\n * Capitalize the first letter of a string.\n */\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * Classify a signal name into a HookType for code generation.\n */\nfunction classifySignal(signal: string): HookType {\n const normalized = toCamelCase(signal);\n if (normalized === 'search') return 'search';\n if (normalized === 'selection') return 'selection';\n if (normalized === 'sort') return 'sort';\n return 'filter';\n}\n"],"mappings":"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","names":["isRecord","publishedDelta"]}
|
|
1
|
+
{"version":3,"sources":["../src/api-client.ts","../src/discovery.ts","../src/pattern.ts","../src/types.ts","../src/ranking.ts","../src/resolver.ts","../src/wiring.ts"],"sourcesContent":["import type { EssenceFile } from '@decantr/essence-spec';\nimport type {\n ApiContentType,\n Archetype,\n Blueprint,\n ContentItem,\n ContentListResponse,\n ExecutionPackBundleResponse,\n ExecutionPackManifest,\n FileCritiqueReport,\n HostedFileCritiqueRequest,\n HostedProjectAuditRequest,\n HostedSelectedExecutionPackRequest,\n OwnedContentSummary,\n Pattern,\n ProjectAuditReport,\n PublicContentRecord,\n PublicContentSummary,\n PublicUserProfile,\n PublishPayload,\n PublishResponse,\n RegistryIntelligenceSummaryResponse,\n SearchParams,\n SearchResponse,\n SelectedExecutionPackResponse,\n Shell,\n ShowcaseManifestResponse,\n ShowcaseShortlistReport,\n ShowcaseShortlistResponse,\n Theme,\n UserProfile,\n} from './types.js';\n\nconst DEFAULT_BASE_URL = 'https://api.decantr.ai/v1';\nconst DEFAULT_TIMEOUT_MS = 30000;\nconst DEFAULT_CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes\n\ninterface CacheEntry<T> {\n data: T;\n timestamp: number;\n}\n\nfunction unwrapDataEnvelope<T>(value: T): T {\n if (typeof value === 'object' && value !== null && 'data' in value) {\n return value.data as T;\n }\n return value;\n}\n\nexport interface RegistryAPIClientOptions {\n baseUrl?: string;\n apiKey?: string;\n accessToken?: string;\n timeoutMs?: number;\n cacheTtlMs?: number;\n}\n\nexport class RegistryAPIError extends Error {\n status: number;\n details?: unknown;\n\n constructor(status: number, message: string, details?: unknown) {\n super(message);\n this.name = 'RegistryAPIError';\n this.status = status;\n this.details = details;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport class RegistryAPIClient {\n private baseUrl: string;\n private apiKey: string | undefined;\n private accessToken: string | undefined;\n private timeoutMs: number;\n private cacheTtlMs: number;\n private cache = new Map<string, CacheEntry<unknown>>();\n\n constructor(options: RegistryAPIClientOptions = {}) {\n this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n this.apiKey = options.apiKey;\n this.accessToken = options.accessToken;\n this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.cacheTtlMs = options.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;\n }\n\n // ── HTTP helpers ──\n\n private buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n Accept: 'application/json',\n };\n if (this.apiKey) {\n headers['X-API-Key'] = this.apiKey;\n }\n if (this.accessToken) {\n headers['Authorization'] = `Bearer ${this.accessToken}`;\n }\n return headers;\n }\n\n private async fetchWithTimeout(url: string, init?: RequestInit): Promise<Response> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timeout);\n }\n }\n\n private async request<T>(path: string, init?: RequestInit): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const response = await this.fetchWithTimeout(url, {\n ...init,\n headers: { ...this.buildHeaders(), ...init?.headers },\n });\n if (!response.ok) {\n const bodyText = await response.text().catch(() => '');\n let details: unknown;\n let message = response.statusText;\n\n if (bodyText) {\n try {\n details = JSON.parse(bodyText) as unknown;\n if (isRecord(details) && typeof details.error === 'string') {\n message = details.error;\n } else {\n message = bodyText;\n }\n } catch {\n message = bodyText;\n }\n }\n\n throw new RegistryAPIError(response.status, `API ${response.status}: ${message}`, details);\n }\n return response.json() as Promise<T>;\n }\n\n // ── Cache helpers ──\n\n private getCached<T>(key: string): T | null {\n const entry = this.cache.get(key) as CacheEntry<T> | undefined;\n if (!entry) return null;\n if (Date.now() - entry.timestamp > this.cacheTtlMs) {\n this.cache.delete(key);\n return null;\n }\n return entry.data;\n }\n\n private setCache<T>(key: string, data: T): void {\n this.cache.set(key, { data, timestamp: Date.now() });\n }\n\n clearCache(): void {\n this.cache.clear();\n }\n\n // ── Health ──\n\n async checkHealth(): Promise<boolean> {\n try {\n const url = this.baseUrl.replace(/\\/v1$/, '/health');\n const response = await this.fetchWithTimeout(url);\n return response.ok;\n } catch {\n return false;\n }\n }\n\n // ── Content fetching (public) ──\n\n async listContent<T = Record<string, unknown>>(\n type: ApiContentType,\n params?: {\n namespace?: string;\n source?: SearchParams['source'];\n sort?: string;\n recommended?: boolean;\n intelligenceSource?: SearchParams['intelligenceSource'];\n blueprintSet?: SearchParams['blueprintSet'];\n labs?: boolean;\n limit?: number;\n offset?: number;\n },\n ): Promise<ContentListResponse<T>> {\n const cacheKey = `list:${type}:${JSON.stringify(params ?? {})}`;\n const cached = this.getCached<ContentListResponse<T>>(cacheKey);\n if (cached) return cached;\n\n const searchParams = new URLSearchParams();\n if (params?.namespace) searchParams.set('namespace', params.namespace);\n if (params?.source) searchParams.set('source', params.source);\n if (params?.sort) searchParams.set('sort', params.sort);\n if (params?.recommended) searchParams.set('recommended', 'true');\n if (params?.intelligenceSource)\n searchParams.set('intelligence_source', params.intelligenceSource);\n if (params?.blueprintSet) searchParams.set('blueprint_set', params.blueprintSet);\n if (params?.labs) searchParams.set('labs', 'true');\n if (params?.limit) searchParams.set('limit', String(params.limit));\n if (params?.offset) searchParams.set('offset', String(params.offset));\n\n const query = searchParams.toString();\n const path = `/${type}${query ? `?${query}` : ''}`;\n const result = await this.request<ContentListResponse<T>>(path);\n this.setCache(cacheKey, result);\n return result;\n }\n\n async getContent<T = Record<string, unknown>>(\n type: ApiContentType,\n namespace: string,\n slug: string,\n ): Promise<T> {\n const cacheKey = `get:${type}:${namespace}:${slug}`;\n const cached = this.getCached<T>(cacheKey);\n if (cached) return cached;\n\n const raw = await this.request<T>(`/${type}/${namespace}/${slug}`);\n // API returns { id, type, slug, data: {...actual content...} } — unwrap\n const unwrapped = unwrapDataEnvelope(raw);\n this.setCache(cacheKey, unwrapped);\n return unwrapped;\n }\n\n async getPublicContentRecord<TData = Record<string, unknown>>(\n type: ApiContentType,\n namespace: string,\n slug: string,\n ): Promise<PublicContentRecord<TData>> {\n const cacheKey = `public-record:${type}:${namespace}:${slug}`;\n const cached = this.getCached<PublicContentRecord<TData>>(cacheKey);\n if (cached) return cached;\n\n const result = await this.request<PublicContentRecord<TData>>(`/${type}/${namespace}/${slug}`);\n this.setCache(cacheKey, result);\n return result;\n }\n\n async getContentRecord<TData = Record<string, unknown>>(\n type: ApiContentType,\n namespace: string,\n slug: string,\n ): Promise<PublicContentRecord<TData>> {\n const cacheKey = `content-record:${type}:${namespace}:${slug}:${this.apiKey ?? ''}:${this.accessToken ?? ''}`;\n const cached = this.getCached<PublicContentRecord<TData>>(cacheKey);\n if (cached) return cached;\n\n const result = await this.request<PublicContentRecord<TData>>(`/${type}/${namespace}/${slug}`);\n this.setCache(cacheKey, result);\n return result;\n }\n\n // ── Typed convenience methods ──\n\n async getPattern(namespace: string, slug: string): Promise<Pattern> {\n return this.getContent<Pattern>('patterns', namespace, slug);\n }\n\n async getArchetype(namespace: string, slug: string): Promise<Archetype> {\n return this.getContent<Archetype>('archetypes', namespace, slug);\n }\n\n async getTheme(namespace: string, slug: string): Promise<Theme> {\n return this.getContent<Theme>('themes', namespace, slug);\n }\n\n async getBlueprint(namespace: string, slug: string): Promise<Blueprint> {\n return this.getContent<Blueprint>('blueprints', namespace, slug);\n }\n\n async getShell(namespace: string, slug: string): Promise<Shell> {\n return this.getContent<Shell>('shells', namespace, slug);\n }\n\n // ── Search ──\n\n async search(params: SearchParams): Promise<SearchResponse> {\n const searchParams = new URLSearchParams({ q: params.q });\n if (params.type) searchParams.set('type', params.type);\n if (params.namespace) searchParams.set('namespace', params.namespace);\n if (params.source) searchParams.set('source', params.source);\n if (params.sort) searchParams.set('sort', params.sort);\n if (params.recommended) searchParams.set('recommended', 'true');\n if (params.intelligenceSource)\n searchParams.set('intelligence_source', params.intelligenceSource);\n if (params.blueprintSet) searchParams.set('blueprint_set', params.blueprintSet);\n if (params.labs) searchParams.set('labs', 'true');\n if (params.limit) searchParams.set('limit', String(params.limit));\n if (params.offset) searchParams.set('offset', String(params.offset));\n\n return this.request<SearchResponse>(`/search?${searchParams}`);\n }\n\n async getPublicUserProfile(username: string): Promise<PublicUserProfile> {\n const cacheKey = `public-user:${username}`;\n const cached = this.getCached<PublicUserProfile>(cacheKey);\n if (cached) return cached;\n\n const result = await this.request<PublicUserProfile>(`/users/${encodeURIComponent(username)}`);\n this.setCache(cacheKey, result);\n return result;\n }\n\n async getPublicUserContent(\n username: string,\n params?: {\n type?: string;\n source?: SearchParams['source'];\n sort?: string;\n recommended?: boolean;\n intelligenceSource?: SearchParams['intelligenceSource'];\n blueprintSet?: SearchParams['blueprintSet'];\n labs?: boolean;\n limit?: number;\n offset?: number;\n },\n ): Promise<ContentListResponse<PublicContentSummary>> {\n const cacheKey = `public-user-content:${username}:${JSON.stringify(params ?? {})}`;\n const cached = this.getCached<ContentListResponse<PublicContentSummary>>(cacheKey);\n if (cached) return cached;\n\n const searchParams = new URLSearchParams();\n if (params?.type) searchParams.set('type', params.type);\n if (params?.source) searchParams.set('source', params.source);\n if (params?.sort) searchParams.set('sort', params.sort);\n if (params?.recommended) searchParams.set('recommended', 'true');\n if (params?.intelligenceSource)\n searchParams.set('intelligence_source', params.intelligenceSource);\n if (params?.blueprintSet) searchParams.set('blueprint_set', params.blueprintSet);\n if (params?.labs) searchParams.set('labs', 'true');\n if (params?.limit != null) searchParams.set('limit', String(params.limit));\n if (params?.offset != null) searchParams.set('offset', String(params.offset));\n\n const query = searchParams.toString();\n const result = await this.request<ContentListResponse<PublicContentSummary>>(\n `/users/${encodeURIComponent(username)}/content${query ? `?${query}` : ''}`,\n );\n this.setCache(cacheKey, result);\n return result;\n }\n\n // ── Authenticated endpoints ──\n\n async getProfile(): Promise<UserProfile> {\n return this.request<UserProfile>('/me');\n }\n\n async publishContent(payload: PublishPayload): Promise<PublishResponse> {\n return this.request<PublishResponse>('/content', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n });\n }\n\n async getMyContent(): Promise<ContentListResponse<OwnedContentSummary>> {\n return this.request<ContentListResponse<OwnedContentSummary>>('/my/content');\n }\n\n async getAccessiblePrivateContent(params?: {\n type?: string;\n scope?: 'all' | 'personal' | 'organization';\n q?: string;\n limit?: number;\n offset?: number;\n }): Promise<ContentListResponse<OwnedContentSummary>> {\n const searchParams = new URLSearchParams();\n if (params?.type) searchParams.set('type', params.type);\n if (params?.scope) searchParams.set('scope', params.scope);\n if (params?.q) searchParams.set('q', params.q);\n if (params?.limit != null) searchParams.set('limit', String(params.limit));\n if (params?.offset != null) searchParams.set('offset', String(params.offset));\n const query = searchParams.toString();\n\n return this.request<ContentListResponse<OwnedContentSummary>>(\n `/private/content${query ? `?${query}` : ''}`,\n );\n }\n\n // ── Schema ──\n\n async getSchema(name: string = 'essence.v4.json'): Promise<Record<string, unknown>> {\n return this.request<Record<string, unknown>>(`/schema/${name}`);\n }\n\n // ── Showcase benchmarks ──\n\n async getShowcaseManifest(): Promise<ShowcaseManifestResponse> {\n const cacheKey = 'showcase:manifest';\n const cached = this.getCached<ShowcaseManifestResponse>(cacheKey);\n if (cached) return cached;\n\n const result = await this.request<ShowcaseManifestResponse>('/showcase/manifest');\n this.setCache(cacheKey, result);\n return result;\n }\n\n async getShowcaseShortlist(): Promise<ShowcaseShortlistResponse> {\n const cacheKey = 'showcase:shortlist';\n const cached = this.getCached<ShowcaseShortlistResponse>(cacheKey);\n if (cached) return cached;\n\n const result = await this.request<ShowcaseShortlistResponse>('/showcase/shortlist');\n this.setCache(cacheKey, result);\n return result;\n }\n\n async getShowcaseShortlistVerification(): Promise<ShowcaseShortlistReport> {\n const cacheKey = 'showcase:shortlist-verification';\n const cached = this.getCached<ShowcaseShortlistReport>(cacheKey);\n if (cached) return cached;\n\n const result = await this.request<ShowcaseShortlistReport>('/showcase/shortlist-verification');\n this.setCache(cacheKey, result);\n return result;\n }\n\n async getRegistryIntelligenceSummary(params?: {\n namespace?: string;\n }): Promise<RegistryIntelligenceSummaryResponse> {\n const cacheKey = `registry-intelligence-summary:${JSON.stringify(params ?? {})}`;\n const cached = this.getCached<RegistryIntelligenceSummaryResponse>(cacheKey);\n if (cached) return cached;\n\n const searchParams = new URLSearchParams();\n if (params?.namespace) searchParams.set('namespace', params.namespace);\n const query = searchParams.toString();\n const result = await this.request<RegistryIntelligenceSummaryResponse>(\n `/intelligence/summary${query ? `?${query}` : ''}`,\n );\n this.setCache(cacheKey, result);\n return result;\n }\n\n async compileExecutionPacks(\n essence: EssenceFile,\n params?: { namespace?: string },\n ): Promise<ExecutionPackBundleResponse> {\n const searchParams = new URLSearchParams();\n if (params?.namespace) searchParams.set('namespace', params.namespace);\n const query = searchParams.toString();\n\n return this.request<ExecutionPackBundleResponse>(`/packs/compile${query ? `?${query}` : ''}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(essence),\n });\n }\n\n async selectExecutionPack(\n input: HostedSelectedExecutionPackRequest,\n params?: { namespace?: string },\n ): Promise<SelectedExecutionPackResponse> {\n const searchParams = new URLSearchParams();\n if (params?.namespace) searchParams.set('namespace', params.namespace);\n const query = searchParams.toString();\n\n return this.request<SelectedExecutionPackResponse>(`/packs/select${query ? `?${query}` : ''}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(input),\n });\n }\n\n async getExecutionPackManifest(\n essence: EssenceFile,\n params?: { namespace?: string },\n ): Promise<ExecutionPackManifest> {\n const selected = await this.selectExecutionPack(\n {\n essence,\n pack_type: 'scaffold',\n },\n params,\n );\n\n return selected.manifest;\n }\n\n async critiqueFile(\n input: HostedFileCritiqueRequest,\n params?: { namespace?: string },\n ): Promise<FileCritiqueReport> {\n const searchParams = new URLSearchParams();\n if (params?.namespace) searchParams.set('namespace', params.namespace);\n const query = searchParams.toString();\n\n return this.request<FileCritiqueReport>(`/critique/file${query ? `?${query}` : ''}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(input),\n });\n }\n\n async auditProject(\n input: HostedProjectAuditRequest,\n params?: { namespace?: string },\n ): Promise<ProjectAuditReport> {\n const searchParams = new URLSearchParams();\n if (params?.namespace) searchParams.set('namespace', params.namespace);\n const query = searchParams.toString();\n\n return this.request<ProjectAuditReport>(`/audit/project${query ? `?${query}` : ''}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(input),\n });\n }\n}\n\n// ── Lightweight registry client (merged from client.ts) ──\n\nexport interface RegistryClientOptions {\n baseUrl?: string;\n}\n\nexport interface SearchResult {\n id: string;\n type: string;\n name: string;\n description: string;\n version: string;\n tags: string[];\n}\n\nexport interface RegistryClient {\n search(query: string, type?: string): Promise<SearchResult[]>;\n fetch(type: string, id: string, version?: string): Promise<unknown>;\n}\n\nexport function createRegistryClient(options: RegistryClientOptions = {}): RegistryClient {\n const baseUrl = options.baseUrl ?? 'https://api.decantr.ai/v1';\n return {\n async search(query: string, type?: string): Promise<SearchResult[]> {\n const params = new URLSearchParams({ q: query });\n if (type) params.set('type', type);\n const res = await fetch(`${baseUrl}/search?${params}`);\n if (!res.ok) return [];\n const data = (await res.json()) as\n | { results?: SearchResult[]; total?: number }\n | SearchResult[];\n // API returns { total, results } wrapper\n if (Array.isArray(data)) return data;\n return (data as { results: SearchResult[] }).results ?? [];\n },\n async fetch(type: string, id: string, version?: string): Promise<unknown> {\n const url = version\n ? `${baseUrl}/content/${type}/${id}/${version}`\n : `${baseUrl}/content/${type}/${id}`;\n const res = await fetch(url);\n if (!res.ok) return null;\n return res.json();\n },\n };\n}\n","import type { Pattern } from './types.js';\n\nexport interface PatternDiscoveryCandidate {\n id: string;\n slug?: string;\n name?: string;\n description?: string;\n tags?: string[];\n components?: string[];\n interactions?: string[];\n visual_brief?: string;\n layout_hints?: Record<string, string>;\n aliases?: string[];\n category?: string;\n domain?: string;\n source?: string;\n pattern?: Pattern | Record<string, unknown>;\n}\n\nexport interface PatternDiscoveryInput {\n query?: string;\n route?: string;\n code?: string;\n limit?: number;\n}\n\nexport interface PatternDiscoveryMatch {\n candidate: PatternDiscoveryCandidate;\n score: number;\n reasons: string[];\n matchedTerms: string[];\n}\n\nconst STOP_WORDS = new Set([\n 'a',\n 'an',\n 'and',\n 'app',\n 'are',\n 'as',\n 'at',\n 'be',\n 'by',\n 'for',\n 'from',\n 'has',\n 'have',\n 'in',\n 'into',\n 'is',\n 'it',\n 'of',\n 'on',\n 'or',\n 'page',\n 'route',\n 'section',\n 'that',\n 'the',\n 'this',\n 'to',\n 'ui',\n 'with',\n]);\n\nconst DOMAIN_LANGUAGE: Record<string, string[]> = {\n recipe: [\n 'cookbook',\n 'cookbooks',\n 'cooking',\n 'dish',\n 'food',\n 'ingredient',\n 'ingredients',\n 'meal',\n 'photo',\n 'recipe',\n 'recipes',\n ],\n ai: [\n 'agent',\n 'ai',\n 'assistant',\n 'chat',\n 'claude',\n 'generate',\n 'generation',\n 'image',\n 'model',\n 'prompt',\n 'vision',\n ],\n social: [\n 'activity',\n 'avatar',\n 'comment',\n 'community',\n 'feed',\n 'follow',\n 'like',\n 'profile',\n 'share',\n 'social',\n 'user',\n ],\n commerce: ['cart', 'checkout', 'commerce', 'ecommerce', 'order', 'price', 'product', 'shop'],\n dashboard: ['analytics', 'chart', 'dashboard', 'kpi', 'metric', 'report', 'table'],\n form: ['form', 'input', 'settings', 'submit', 'toggle', 'upload'],\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction stringArray(value: unknown): string[] {\n return Array.isArray(value)\n ? value.filter((entry): entry is string => typeof entry === 'string')\n : [];\n}\n\nfunction recordToText(value: unknown): string {\n if (!isRecord(value)) return '';\n return Object.values(value)\n .flatMap((entry) => {\n if (typeof entry === 'string') return [entry];\n if (Array.isArray(entry))\n return entry.filter((item): item is string => typeof item === 'string');\n if (isRecord(entry)) return [recordToText(entry)];\n return [];\n })\n .join(' ');\n}\n\nexport function patternToDiscoveryCandidate(\n pattern: Pattern | Record<string, unknown>,\n options: { source?: string; slug?: string } = {},\n): PatternDiscoveryCandidate {\n const record = pattern as Record<string, unknown>;\n const slug =\n options.slug ||\n (typeof record.slug === 'string' ? record.slug : undefined) ||\n (typeof record.id === 'string' ? record.id : undefined);\n return {\n id: typeof record.id === 'string' ? record.id : (slug ?? 'pattern'),\n slug,\n name: typeof record.name === 'string' ? record.name : slug,\n description: typeof record.description === 'string' ? record.description : undefined,\n tags: stringArray(record.tags),\n components: stringArray(record.components),\n interactions: stringArray(record.interactions),\n visual_brief:\n typeof record.visual_brief === 'string'\n ? record.visual_brief\n : typeof record.visualBrief === 'string'\n ? record.visualBrief\n : undefined,\n layout_hints: isRecord(record.layout_hints)\n ? (record.layout_hints as Record<string, string>)\n : undefined,\n aliases: stringArray(record.aliases),\n category: typeof record.category === 'string' ? record.category : undefined,\n domain: typeof record.domain === 'string' ? record.domain : undefined,\n source: options.source,\n pattern,\n };\n}\n\nfunction tokenize(value: string | undefined): string[] {\n if (!value) return [];\n const tokens = value\n .toLowerCase()\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .split(/[^a-z0-9]+/g)\n .map((token) => token.trim())\n .filter((token) => token.length >= 2 && !STOP_WORDS.has(token));\n return [...new Set(tokens)];\n}\n\nfunction inferDomainTerms(tokens: string[]): { domain: string; terms: string[] }[] {\n const tokenSet = new Set(tokens);\n const matches: { domain: string; terms: string[] }[] = [];\n for (const [domain, terms] of Object.entries(DOMAIN_LANGUAGE)) {\n const hits = terms.filter((term) => tokenSet.has(term));\n if (hits.length > 0) matches.push({ domain, terms });\n }\n return matches;\n}\n\nfunction candidateText(candidate: PatternDiscoveryCandidate): {\n high: string;\n medium: string;\n low: string;\n} {\n const pattern = candidate.pattern;\n const patternRecord = isRecord(pattern) ? pattern : {};\n const presets = isRecord(patternRecord.presets) ? recordToText(patternRecord.presets) : '';\n const composition = isRecord(patternRecord.composition)\n ? recordToText(patternRecord.composition)\n : '';\n const motion = isRecord(patternRecord.motion) ? recordToText(patternRecord.motion) : '';\n const responsive = isRecord(patternRecord.responsive)\n ? recordToText(patternRecord.responsive)\n : '';\n const accessibility = isRecord(patternRecord.accessibility)\n ? recordToText(patternRecord.accessibility)\n : '';\n\n return {\n high: [\n candidate.slug,\n candidate.id,\n candidate.name,\n candidate.aliases?.join(' '),\n candidate.category,\n candidate.domain,\n ]\n .filter(Boolean)\n .join(' '),\n medium: [\n candidate.description,\n candidate.tags?.join(' '),\n candidate.components?.join(' '),\n candidate.interactions?.join(' '),\n candidate.visual_brief,\n candidate.layout_hints ? recordToText(candidate.layout_hints) : '',\n ]\n .filter(Boolean)\n .join(' '),\n low: [presets, composition, motion, responsive, accessibility].filter(Boolean).join(' '),\n };\n}\n\nfunction fieldMatches(tokens: string[], text: string): string[] {\n const lower = text.toLowerCase();\n return tokens.filter((token) => lower.includes(token));\n}\n\nfunction addReason(reasons: string[], reason: string): void {\n if (!reasons.includes(reason)) reasons.push(reason);\n}\n\nexport function scorePatternCandidate(\n input: PatternDiscoveryInput,\n candidate: PatternDiscoveryCandidate,\n): PatternDiscoveryMatch {\n const queryTokens = tokenize(input.query);\n const routeTokens = tokenize(input.route);\n const codeTokens = tokenize(input.code).slice(0, 250);\n const tokens = [...new Set([...queryTokens, ...routeTokens, ...codeTokens])];\n const text = candidateText(candidate);\n const reasons: string[] = [];\n const matchedTerms = new Set<string>();\n let score = 0;\n\n const highMatches = fieldMatches(tokens, text.high);\n if (highMatches.length > 0) {\n score += highMatches.length * 18;\n for (const term of highMatches) matchedTerms.add(term);\n addReason(reasons, 'matched slug, name, alias, category, or domain');\n }\n\n const mediumMatches = fieldMatches(tokens, text.medium);\n if (mediumMatches.length > 0) {\n score += mediumMatches.length * 10;\n for (const term of mediumMatches) matchedTerms.add(term);\n addReason(\n reasons,\n 'matched description, tags, components, interactions, visual brief, or layout hints',\n );\n }\n\n const lowMatches = fieldMatches(tokens, text.low);\n if (lowMatches.length > 0) {\n score += lowMatches.length * 4;\n for (const term of lowMatches) matchedTerms.add(term);\n addReason(reasons, 'matched composition, motion, responsive, preset, or accessibility details');\n }\n\n const slug = (candidate.slug || candidate.id).toLowerCase();\n const query = (input.query || '').toLowerCase();\n if (query && (slug === query || candidate.name?.toLowerCase() === query)) {\n score += 50;\n addReason(reasons, 'exact slug or name match');\n } else if (query && slug.includes(query.replace(/\\s+/g, '-'))) {\n score += 28;\n addReason(reasons, 'direct slug phrase match');\n }\n\n for (const domain of inferDomainTerms(tokens)) {\n const candidateDomainText = [text.high, text.medium, text.low].join(' ').toLowerCase();\n const hits = domain.terms.filter((term) => candidateDomainText.includes(term));\n if (hits.length > 0) {\n score += Math.min(30, hits.length * 6);\n for (const term of hits) matchedTerms.add(term);\n addReason(reasons, `${domain.domain} domain language`);\n }\n }\n\n if (input.route) {\n const route = input.route.toLowerCase();\n if (route.includes(slug) || slug.includes(route.replace(/^\\//, '').replace(/\\//g, '-'))) {\n score += 16;\n addReason(reasons, 'route name resembles pattern slug');\n }\n }\n\n if (input.code) {\n const code = input.code.toLowerCase();\n const codeHints = [\n ['intersectionobserver', 'scroll-reveal'],\n ['avatar', 'social profile or feed'],\n ['like', 'social engagement'],\n ['upload', 'upload flow'],\n ['input type=\"file\"', 'upload flow'],\n ['textarea', 'form or chat input'],\n ['message', 'chat surface'],\n ['grid', 'grid composition'],\n ['form', 'form surface'],\n ];\n for (const [needle, label] of codeHints) {\n if (\n code.includes(needle) &&\n [text.high, text.medium, text.low].join(' ').toLowerCase().includes(label.split(' ')[0])\n ) {\n score += 8;\n addReason(reasons, `source code hint: ${label}`);\n }\n }\n }\n\n return {\n candidate,\n score,\n reasons,\n matchedTerms: [...matchedTerms].sort(),\n };\n}\n\nexport function rankPatternCandidates(\n input: PatternDiscoveryInput,\n candidates: PatternDiscoveryCandidate[],\n): PatternDiscoveryMatch[] {\n const limit = input.limit ?? 10;\n return candidates\n .map((candidate) => scorePatternCandidate(input, candidate))\n .filter((match) => match.score > 0)\n .sort((a, b) => {\n if (b.score !== a.score) return b.score - a.score;\n return (a.candidate.slug || a.candidate.id).localeCompare(b.candidate.slug || b.candidate.id);\n })\n .slice(0, limit);\n}\n","import type { Pattern, PatternPreset } from './types.js';\n\nexport interface ResolvedPreset {\n preset: string;\n layout: PatternPreset['layout'];\n code: PatternPreset['code'];\n}\n\nexport function resolvePatternPreset(\n pattern: Pattern,\n explicitPreset?: string,\n themeDefaultPresets?: Record<string, string>,\n): ResolvedPreset {\n const presets = pattern.presets;\n const hasPresets = Object.keys(presets).length > 0;\n\n if (!hasPresets) {\n return {\n preset: '',\n layout: { layout: 'row', atoms: '' },\n code: pattern.code ?? { imports: '', example: '' },\n };\n }\n\n let presetName = explicitPreset;\n if (presetName && !presets[presetName]) presetName = undefined;\n if (!presetName && themeDefaultPresets?.[pattern.id]) {\n const themeName = themeDefaultPresets[pattern.id];\n if (presets[themeName]) presetName = themeName;\n }\n if (!presetName) presetName = pattern.default_preset;\n if (!presetName || !presets[presetName]) presetName = Object.keys(presets)[0];\n\n const preset = presets[presetName];\n return { preset: presetName, layout: preset.layout, code: preset.code };\n}\n","import type { EssenceFile } from '@decantr/essence-spec';\n\n// --- Pattern ---\nexport interface PatternLayoutSpec {\n layout: string;\n atoms: string;\n slots?: Record<string, string>;\n}\n\nexport interface PatternCodeSpec {\n imports?: string;\n example?: string;\n}\n\nexport interface PatternPreset {\n description: string;\n components?: string[];\n layout: PatternLayoutSpec;\n code?: PatternCodeSpec;\n}\n\nexport interface PatternIO {\n produces?: string[];\n consumes?: string[];\n actions?: string[];\n}\n\nexport interface Pattern {\n id: string;\n version: string;\n name: string;\n description: string;\n tags: string[];\n components: string[];\n default_preset: string;\n presets: Record<string, PatternPreset>;\n contained?: boolean;\n io?: PatternIO;\n code?: PatternCodeSpec;\n default_layout?: PatternLayoutSpec;\n visual_brief?: string;\n composition?: Record<string, string>;\n motion?: {\n micro?: Record<string, string>;\n transitions?: Record<string, string>;\n ambient?: Record<string, string>;\n };\n /**\n * Declared runtime interactions this pattern MUST implement.\n * Surfaced as a checkbox checklist in the per-page execution pack; enforced\n * by `decantr check --strict` (C5 guard rule). Each value maps to a\n * canonical implementation (treatment class + handler pattern) — see the\n * Interaction Requirements table in scaffolded DECANTR.md. Before this\n * field, motion/interactivity lived only as prose philosophy that cold\n * LLMs routinely categorized as \"nice to have\" and skipped.\n */\n interactions?: string[];\n responsive?: {\n mobile?: string;\n tablet?: string;\n desktop?: string;\n };\n accessibility?: {\n role?: string;\n 'aria-label'?: string;\n keyboard?: string[];\n announcements?: string[];\n focus_management?: string;\n };\n layout_hints?: Record<string, string>;\n category?: string;\n}\n\n// --- Archetype ---\nexport type ArchetypeRole = 'primary' | 'gateway' | 'public' | 'auxiliary';\n\nexport interface PatternReferenceObject {\n pattern: string;\n preset?: string;\n as?: string;\n}\n\nexport type PatternReference = string | PatternReferenceObject;\n\nexport interface LayoutGroup {\n cols: PatternReference[];\n at?: string;\n span?: Record<string, number>;\n}\n\nexport type LayoutItem = PatternReference | LayoutGroup;\n\nexport interface ContentDependencies {\n [kind: string]: Record<string, string>;\n}\n\nexport interface ArchetypePage {\n id: string;\n default_layout: LayoutItem[];\n shell: string;\n description?: string;\n patterns?: PatternReference[];\n}\n\nexport interface SeoHints {\n schema_org?: string[];\n meta_priorities?: string[];\n}\n\nexport interface ArchetypeSuggestedTheme {\n ids?: string[];\n modes?: string[];\n shapes?: string[];\n}\n\nexport interface ArchetypeHeroCustomization {\n style?: string;\n elements?: string[];\n background?: string;\n [key: string]: unknown;\n}\n\nexport interface Archetype {\n $schema?: string;\n id: string;\n version: string;\n decantr_compat?: string;\n name: string;\n description: string;\n tags: string[];\n role: ArchetypeRole;\n pages: ArchetypePage[];\n features: string[];\n dependencies?: ContentDependencies;\n seo_hints?: SeoHints;\n classification?: {\n triggers: { primary: string[]; secondary: string[]; negative: string[] };\n implies: string[];\n weight: number;\n tier: string;\n };\n page_briefs?: Record<string, string>;\n suggested_theme?: ArchetypeSuggestedTheme;\n shells?: Record<string, string>;\n personality?: string[];\n hero_customization?: ArchetypeHeroCustomization;\n}\n\n// --- Theme substructures (absorbed from former Recipe type) ---\nexport interface ThemeSpatial {\n density_bias: number;\n content_gap_shift: number;\n section_padding: string;\n card_wrapping: 'always' | 'minimal' | 'none';\n surface_override: string | null;\n}\n\nexport interface ThemeEffects {\n enabled: boolean;\n intensity: 'subtle' | 'moderate' | 'bold';\n type_mapping: Record<string, string[]>;\n component_fallback: Record<string, string>;\n intensity_values?: Record<string, Record<string, string>>;\n}\n\nexport interface ThemeShell {\n preferred: string[];\n nav_style: string;\n root?: string;\n nav?: string;\n header?: string;\n dimensions?: { navWidth?: string; headerHeight?: string };\n}\n\n// --- Blueprint ---\nexport type ComposeEntry = string | { archetype: string; prefix: string; role?: ArchetypeRole };\n\nexport const BLUEPRINT_PORTFOLIO_VISIBILITIES = [\n 'featured',\n 'public',\n 'labs',\n 'hidden',\n] as const;\nexport type BlueprintPortfolioVisibility = (typeof BLUEPRINT_PORTFOLIO_VISIBILITIES)[number];\n\nexport const BLUEPRINT_PORTFOLIO_MATURITIES = [\n 'certified-flagship',\n 'supported-contract',\n 'experimental',\n 'fold-candidate',\n 'legacy-hidden',\n] as const;\nexport type BlueprintPortfolioMaturity = (typeof BLUEPRINT_PORTFOLIO_MATURITIES)[number];\n\nexport const BLUEPRINT_ARTIFACT_STATUSES = ['none', 'planned', 'candidate', 'certified'] as const;\nexport type BlueprintArtifactStatus = (typeof BLUEPRINT_ARTIFACT_STATUSES)[number];\n\nexport const PUBLIC_BLUEPRINT_SETS = ['all', 'featured', 'certified', 'labs'] as const;\nexport type PublicBlueprintSet = (typeof PUBLIC_BLUEPRINT_SETS)[number];\n\nexport interface BlueprintPortfolioArtifact {\n status: BlueprintArtifactStatus;\n showcase?: string;\n notes?: string;\n}\n\nexport interface BlueprintPortfolioMetadata {\n visibility: BlueprintPortfolioVisibility;\n maturity: BlueprintPortfolioMaturity;\n rationale: string;\n recommended_alternative?: string;\n artifact: BlueprintPortfolioArtifact;\n}\n\nexport function isBlueprintPortfolioVisibility(\n value: unknown,\n): value is BlueprintPortfolioVisibility {\n return BLUEPRINT_PORTFOLIO_VISIBILITIES.includes(value as BlueprintPortfolioVisibility);\n}\n\nexport function isBlueprintPortfolioMaturity(value: unknown): value is BlueprintPortfolioMaturity {\n return BLUEPRINT_PORTFOLIO_MATURITIES.includes(value as BlueprintPortfolioMaturity);\n}\n\nexport function isBlueprintArtifactStatus(value: unknown): value is BlueprintArtifactStatus {\n return BLUEPRINT_ARTIFACT_STATUSES.includes(value as BlueprintArtifactStatus);\n}\n\nexport function isPublicBlueprintSet(value: unknown): value is PublicBlueprintSet {\n return PUBLIC_BLUEPRINT_SETS.includes(value as PublicBlueprintSet);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function getBlueprintPortfolioMetadata(\n value: unknown,\n): BlueprintPortfolioMetadata | null {\n const candidate = isRecord(value) && isRecord(value.blueprint_portfolio)\n ? value.blueprint_portfolio\n : value;\n if (!isRecord(candidate)) {\n return null;\n }\n\n const artifact = candidate.artifact;\n if (\n !isBlueprintPortfolioVisibility(candidate.visibility) ||\n !isBlueprintPortfolioMaturity(candidate.maturity) ||\n typeof candidate.rationale !== 'string' ||\n !isRecord(artifact) ||\n !isBlueprintArtifactStatus(artifact.status)\n ) {\n return null;\n }\n\n return {\n visibility: candidate.visibility,\n maturity: candidate.maturity,\n rationale: candidate.rationale,\n recommended_alternative:\n typeof candidate.recommended_alternative === 'string'\n ? candidate.recommended_alternative\n : undefined,\n artifact: {\n status: artifact.status,\n showcase: typeof artifact.showcase === 'string' ? artifact.showcase : undefined,\n notes: typeof artifact.notes === 'string' ? artifact.notes : undefined,\n },\n };\n}\n\nexport interface BlueprintRoute {\n shell?: string;\n archetype?: string;\n page?: string;\n}\n\nexport interface BlueprintNavigationHotkey {\n key: string;\n route?: string;\n label?: string;\n}\n\nexport interface BlueprintNavigation {\n command_palette?: boolean;\n hotkeys?: BlueprintNavigationHotkey[];\n}\n\nexport interface BlueprintOverrides {\n features_add?: string[];\n features_remove?: string[];\n pages_remove?: string[];\n pages?: Record<string, Record<string, unknown>>;\n}\n\nexport interface Blueprint {\n $schema?: string;\n id: string;\n version?: string;\n decantr_compat?: string;\n name: string;\n description?: string;\n blueprint_portfolio?: BlueprintPortfolioMetadata;\n tags?: string[];\n archetype?: string;\n compose?: ComposeEntry[];\n theme: { id: string; mode?: string; shape?: string };\n personality?: string | string[];\n features?: string[];\n routes?: Record<string, BlueprintRoute>;\n overrides?: BlueprintOverrides;\n seo_hints?: SeoHints;\n navigation?: BlueprintNavigation;\n dependencies?: ContentDependencies;\n suggested_themes?: string[];\n design_constraints?: Record<string, unknown>;\n voice?: {\n tone?: string;\n cta_verbs?: string[];\n avoid?: string[];\n empty_states?: string;\n errors?: string;\n loading?: string;\n metrics_format?: string;\n };\n responsive_strategy?: {\n breakpoints?: string[];\n navigation?: Record<string, string>;\n data_display?: Record<string, string>;\n };\n}\n\n// --- Shell ---\nexport interface Shell {\n id: string;\n name: string;\n description?: string;\n root?: string;\n nav?: string;\n header?: string;\n nav_style?: string;\n dimensions?: {\n navWidth?: string;\n headerHeight?: string;\n };\n internal_layout?: Record<string, unknown>;\n layout?: string;\n atoms?: string;\n config?: Record<string, unknown>;\n guidance?: Record<string, string>;\n code?: { imports?: string; example?: string };\n}\n\n// --- Content Resolution ---\nexport const CONTENT_TYPES = ['pattern', 'theme', 'blueprint', 'archetype', 'shell'] as const;\n\nexport type ContentType = (typeof CONTENT_TYPES)[number];\n\nexport const API_CONTENT_TYPES = [\n 'patterns',\n 'themes',\n 'blueprints',\n 'archetypes',\n 'shells',\n] as const;\n\nexport type ApiContentType = (typeof API_CONTENT_TYPES)[number];\n\nexport const CONTENT_TYPE_TO_API_CONTENT_TYPE: Record<ContentType, ApiContentType> = {\n pattern: 'patterns',\n theme: 'themes',\n blueprint: 'blueprints',\n archetype: 'archetypes',\n shell: 'shells',\n};\n\nexport const API_CONTENT_TYPE_TO_CONTENT_TYPE: Record<ApiContentType, ContentType> = {\n patterns: 'pattern',\n themes: 'theme',\n blueprints: 'blueprint',\n archetypes: 'archetype',\n shells: 'shell',\n};\n\nexport function isContentType(value: string): value is ContentType {\n return CONTENT_TYPES.includes(value as ContentType);\n}\n\nexport function isApiContentType(value: string): value is ApiContentType {\n return API_CONTENT_TYPES.includes(value as ApiContentType);\n}\n\nexport interface ResolvedContent<T> {\n item: T;\n source: 'local' | 'core';\n path: string;\n}\n\n// --- Content Health ---\n\nexport type ContentHealthStatus = 'healthy' | 'warning' | 'error';\nexport type ContentHealthFindingSource =\n | 'schema'\n | 'reference'\n | 'quality'\n | 'coverage'\n | 'content';\n\nexport interface ContentHealthRemediation {\n summary: string;\n prompt: string;\n commands: string[];\n}\n\nexport interface ContentHealthFinding {\n id: string;\n source: ContentHealthFindingSource;\n category: string;\n severity: VerificationSeverity;\n message: string;\n evidence: string[];\n file?: string;\n type?: ContentType;\n itemId?: string;\n rule?: string;\n suggestedFix?: string;\n remediation: ContentHealthRemediation;\n}\n\nexport interface ContentHealthTypeSummary {\n type: ContentType;\n directory: ApiContentType;\n itemCount: number;\n validCount: number;\n errorCount: number;\n warnCount: number;\n infoCount: number;\n ignoredCount: number;\n}\n\nexport interface ContentHealthReferenceSummary {\n checked: number;\n missing: number;\n missingByType: Record<ContentType, number>;\n}\n\nexport interface ContentHealthQualitySummary {\n patternVisualBriefCoverage: number;\n patternInteractionCoverage: number;\n themeDecoratorCoverage: number;\n blueprintPersonalityCoverage: number;\n blueprintVoiceCoverage: number;\n archetypePageBriefCoverage: number;\n}\n\nexport interface ContentHealthReport {\n $schema: string;\n generatedAt: string;\n contentRoot: string;\n status: ContentHealthStatus;\n score: number;\n summary: {\n itemCount: number;\n validCount: number;\n errorCount: number;\n warnCount: number;\n infoCount: number;\n findingCount: number;\n ignoredCount: number;\n contentDirectoryCount: number;\n };\n content: ContentHealthTypeSummary[];\n references: ContentHealthReferenceSummary;\n quality: ContentHealthQualitySummary;\n ci: {\n recommendedCommand: string;\n failOn: 'error' | 'warn' | 'none';\n };\n findings: ContentHealthFinding[];\n}\n\n// --- Theme ---\n\nexport type CvdMode = 'deuteranopia' | 'protanopia' | 'tritanopia' | 'achromatopsia';\n\nexport interface ThemeTokens {\n base?: Record<string, string>;\n cvd?: Partial<Record<CvdMode, Record<string, string>>>;\n}\n\nexport interface Theme {\n id: string;\n name: string;\n description?: string;\n tags?: string[];\n personality?: string;\n seed?: Record<string, string>;\n palette?: Record<string, Record<string, string>>;\n modes?: string[];\n shapes?: string[];\n cvd_support?: CvdMode[];\n tokens?: ThemeTokens;\n decantr_compat?: string;\n source?: string;\n // Absorbed from former Recipe type\n decorators?: Record<string, string>;\n treatments?: Record<string, Record<string, string>>;\n spatial?: ThemeSpatial;\n shell?: ThemeShell;\n effects?: ThemeEffects;\n motion?: {\n preference?: string;\n reduce_motion?: boolean;\n entrance?: string;\n timing?: string;\n durations?: Record<string, string>;\n };\n typography?: { scale?: string; heading_weight?: number; body_weight?: number; mono?: string };\n radius?: { philosophy?: string; base?: number };\n compositions?: Record<string, { shell: string; description: string; effects?: string[] }>;\n pattern_preferences?: {\n prefer: string[];\n avoid: string[];\n default_presets?: Record<string, string>;\n };\n decorator_definitions?: Record<\n string,\n {\n description: string;\n intent: string;\n suggested_properties?: Record<string, string>;\n pairs_with?: string[];\n usage?: string[];\n }\n >;\n}\n\n// --- API Client Types ---\n\nexport interface ContentListResponse<T = Record<string, unknown>> {\n items: T[];\n total: number;\n limit?: number;\n offset?: number;\n}\n\nexport type ContentVerificationStatus =\n | 'unknown'\n | 'pending'\n | 'build-green'\n | 'build-red'\n | 'smoke-green'\n | 'smoke-red';\n\nexport type ContentBenchmarkConfidence = 'none' | 'low' | 'medium' | 'high';\nexport type ContentConfidenceTier = 'low' | 'medium' | 'high' | 'verified';\n\nexport type ContentGoldenUsage = 'none' | 'showcase' | 'shortlisted';\nexport const PUBLIC_CONTENT_SOURCES = ['official', 'community', 'organization'] as const;\n\nexport type PublicContentSource = (typeof PUBLIC_CONTENT_SOURCES)[number];\n\nexport function isPublicContentSource(value: string): value is PublicContentSource {\n return PUBLIC_CONTENT_SOURCES.includes(value as PublicContentSource);\n}\n\nexport const CONTENT_INTELLIGENCE_SOURCES = ['authored', 'benchmark', 'hybrid'] as const;\n\nexport type ContentIntelligenceSource = 'authored' | 'benchmark' | 'hybrid';\n\nexport function isContentIntelligenceSource(value: string): value is ContentIntelligenceSource {\n return CONTENT_INTELLIGENCE_SOURCES.includes(value as ContentIntelligenceSource);\n}\n\nexport interface ContentIntelligenceMetadata {\n source: ContentIntelligenceSource;\n verification_status: ContentVerificationStatus;\n last_verified_at?: string | null;\n target_coverage: string[];\n benchmark_confidence: ContentBenchmarkConfidence;\n confidence_tier: ContentConfidenceTier;\n golden_usage: ContentGoldenUsage;\n quality_score: number | null;\n confidence_score: number | null;\n recommended: boolean;\n evidence: string[];\n recommendation_reasons: string[];\n recommendation_blockers: string[];\n benchmark?: {\n classification?: ShowcaseVerificationEntry['classification'];\n target?: string | null;\n drift_signal?: ShowcaseVerificationEntry['drift']['signal'];\n build_passed?: boolean | null;\n smoke_passed?: boolean | null;\n };\n}\n\nexport interface PublicContentSummary {\n id: string;\n slug: string;\n namespace: string;\n type: string;\n version?: string;\n name?: string;\n description?: string;\n published_at?: string;\n owner_name?: string | null;\n owner_username?: string | null;\n thumbnail_url?: string | null;\n blueprint_portfolio?: BlueprintPortfolioMetadata | null;\n intelligence?: ContentIntelligenceMetadata | null;\n}\n\nexport interface PublicContentRecord<TData = Record<string, unknown>> {\n id: string;\n slug: string;\n namespace: string;\n type: string;\n version: string;\n data: TData;\n visibility: 'public' | 'private';\n status: 'pending' | 'approved' | 'rejected' | 'published';\n created_at: string;\n updated_at: string;\n published_at?: string;\n owner_name?: string | null;\n owner_username?: string | null;\n thumbnail_url?: string | null;\n intelligence?: ContentIntelligenceMetadata | null;\n}\n\nexport interface ContentItem extends PublicContentRecord<Record<string, unknown>> {}\n\nexport interface OwnedContentSummary extends PublicContentSummary {\n visibility: 'public' | 'private';\n status: 'pending' | 'approved' | 'rejected' | 'published';\n created_at: string;\n updated_at: string;\n}\n\nexport interface PublicUserProfile {\n username: string;\n display_name: string | null;\n reputation_score: number;\n tier: 'free' | 'pro' | 'team' | 'enterprise';\n created_at: string;\n content_count: number;\n content_counts: Record<string, number>;\n}\n\nexport interface PublishPayload {\n type: ApiContentType;\n slug: string;\n namespace: string;\n version: string;\n data: Record<string, unknown>;\n visibility?: 'public' | 'private';\n}\n\nexport interface PublishResponse {\n id: string;\n slug: string;\n namespace: string;\n type: string;\n status: string;\n}\n\nexport interface SearchParams {\n q: string;\n type?: string;\n namespace?: string;\n source?: PublicContentSource;\n sort?: string;\n recommended?: boolean;\n intelligenceSource?: ContentIntelligenceSource;\n blueprintSet?: PublicBlueprintSet;\n labs?: boolean;\n limit?: number;\n offset?: number;\n}\n\nexport interface SearchResponse {\n results: PublicContentSummary[];\n total: number;\n limit?: number;\n offset?: number;\n}\n\nexport interface RegistryIntelligenceSummaryBucket {\n total_public_items: number;\n with_intelligence: number;\n recommended: number;\n authored: number;\n benchmark: number;\n hybrid: number;\n missing_source: number;\n smoke_green: number;\n build_green: number;\n high_confidence: number;\n verified_confidence: number;\n}\n\nexport interface RegistryIntelligenceSummaryResponse {\n $schema: string;\n generated_at: string;\n namespace: string | null;\n totals: RegistryIntelligenceSummaryBucket;\n by_type: Record<ContentType, RegistryIntelligenceSummaryBucket>;\n}\n\nexport interface UserProfile {\n id: string;\n email: string;\n tier: 'free' | 'pro' | 'team' | 'enterprise';\n reputation_score: number;\n trusted: boolean;\n}\n\nexport interface ShowcaseVerificationEntry {\n slug: string;\n target: string | null;\n classification: 'pending' | 'A' | 'B' | 'C' | 'D';\n verificationStatus: 'pending' | 'build-green' | 'build-red' | 'smoke-green' | 'smoke-red';\n build: {\n passed: boolean | null;\n durationMs: number;\n };\n smoke: {\n passed: boolean | null;\n durationMs: number;\n rootDocumentOk: boolean;\n titleOk: boolean;\n langOk: boolean;\n viewportOk: boolean;\n charsetOk: boolean;\n cspSignalOk: boolean;\n inlineScriptCount: number;\n inlineEventHandlerCount: number;\n externalScriptsWithoutIntegrityCount: number;\n externalScriptsWithIntegrityMissingCrossoriginCount: number;\n externalStylesheetsWithoutIntegrityCount: number;\n externalStylesheetsWithIntegrityMissingCrossoriginCount: number;\n externalScriptsWithInsecureTransportCount: number;\n externalStylesheetsWithInsecureTransportCount: number;\n externalMediaSourcesWithInsecureTransportCount: number;\n externalBlankLinksWithoutRelCount: number;\n externalIframesWithoutSandboxCount: number;\n externalIframesWithInsecureTransportCount: number;\n jsEvalSignalCount: number;\n jsHtmlInjectionSignalCount: number;\n jsInsecureTransportSignalCount: number;\n jsSecretSignalCount: number;\n assetCount: number;\n assetsPassed: number;\n routeHintsChecked: string[];\n routeHintsMatched: number;\n routeHintsCoverageOk: boolean;\n routeDocumentsChecked: number;\n routeDocumentsPassed: number;\n routeDocumentsHardenedCount: number;\n routeDocumentsCoverageOk: boolean;\n routeDocumentsHardeningOk: boolean;\n fullRouteCoverageOk: boolean;\n totalAssetBytes: number;\n jsAssetBytes: number;\n cssAssetBytes: number;\n largestAssetPath: string | null;\n largestAssetBytes: number;\n failures: string[];\n };\n drift: {\n signal: 'lower' | 'moderate' | 'elevated';\n penalty: number;\n inlineStyleCount: number;\n hardcodedColorCount: number;\n utilityLeakageCount: number;\n decantrTreatmentCount: number;\n hasPackManifest: boolean;\n hasDist: boolean;\n };\n}\n\nexport interface ShowcaseShortlistSummary {\n appCount: number;\n passedBuilds: number;\n failedBuilds: number;\n averageDurationMs: number;\n passedSmokes: number;\n failedSmokes: number;\n averageSmokeDurationMs: number;\n appsWithTitleOkCount: number;\n appsWithLangOkCount: number;\n appsWithViewportOkCount: number;\n appsWithCharsetOkCount: number;\n appsWithoutInlineScriptsCount: number;\n appsWithCspSignalCount: number;\n appsWithExternalScriptIntegrityCount: number;\n appsWithExternalScriptCrossoriginCount: number;\n appsWithExternalStylesheetIntegrityCount: number;\n appsWithExternalStylesheetCrossoriginCount: number;\n appsWithRouteCoverageCount: number;\n appsWithFullRouteCoverageCount: number;\n averageTotalAssetBytes: number;\n averageJsAssetBytes: number;\n averageCssAssetBytes: number;\n lowerDriftCount: number;\n moderateDriftCount: number;\n elevatedDriftCount: number;\n withPackManifestCount: number;\n}\n\nexport interface ShowcaseManifestEntry {\n slug: string;\n status: string;\n classification: string;\n origin?: string | null;\n target?: string | null;\n goldenCandidate?: string | boolean;\n notes?: string | null;\n thumbnail?: {\n src: string;\n alt: string;\n width?: number;\n height?: number;\n } | null;\n url?: string | null;\n verification?: ShowcaseVerificationEntry | null;\n}\n\nexport interface ShowcaseManifestResponse {\n total: number;\n shortlisted: number;\n apps: ShowcaseManifestEntry[];\n}\n\nexport interface ShowcaseShortlistResponse {\n generatedAt: string | null;\n summary: ShowcaseShortlistSummary | null;\n apps: ShowcaseManifestEntry[];\n}\n\nexport interface ShowcaseShortlistReport {\n $schema: string;\n generatedAt: string;\n dryRun: boolean;\n summary: ShowcaseShortlistSummary;\n results: ShowcaseVerificationEntry[];\n}\n\nexport interface HostedFileCritiqueRequest {\n essence: EssenceFile;\n code: string;\n filePath?: string;\n treatmentsCss?: string;\n}\n\nexport interface HostedDistSnapshot {\n indexHtml: string;\n assets?: Record<string, string>;\n}\n\nexport interface HostedSourceSnapshot {\n files: Record<string, string>;\n}\n\nexport interface HostedProjectAuditRequest {\n essence: EssenceFile;\n dist?: HostedDistSnapshot;\n sources?: HostedSourceSnapshot;\n}\n\nexport type ExecutionPackType = 'scaffold' | 'section' | 'page' | 'mutation' | 'review';\n\nexport interface ExecutionPackTarget {\n platform: 'web';\n framework: string | null;\n runtime: string | null;\n adapter: string;\n}\n\nexport interface ExecutionPackScope {\n appId: string;\n pageIds: string[];\n patternIds: string[];\n}\n\nexport interface ExecutionPackExample {\n id: string;\n label: string;\n language: string;\n snippet: string;\n}\n\nexport interface ExecutionPackAntiPattern {\n id: string;\n summary: string;\n guidance: string;\n}\n\nexport interface ExecutionPackSuccessCheck {\n id: string;\n label: string;\n severity: 'error' | 'warn' | 'info';\n}\n\nexport interface ExecutionPackTokenBudget {\n target: number;\n max: number;\n strategy: string[];\n}\n\nexport interface ExecutionPackBase<TData = Record<string, unknown>> {\n $schema: string;\n packVersion: '1.0.0';\n packType: ExecutionPackType;\n objective: string;\n target: ExecutionPackTarget;\n preset: string | null;\n scope: ExecutionPackScope;\n requiredSetup: string[];\n allowedVocabulary: string[];\n examples: ExecutionPackExample[];\n antiPatterns: ExecutionPackAntiPattern[];\n successChecks: ExecutionPackSuccessCheck[];\n tokenBudget: ExecutionPackTokenBudget;\n data: TData;\n renderedMarkdown: string;\n}\n\nexport interface PackManifestEntry {\n id: string;\n markdown: string;\n json: string;\n}\n\nexport interface PackManifestSectionEntry extends PackManifestEntry {\n pageIds: string[];\n}\n\nexport interface PackManifestPageEntry extends PackManifestEntry {\n sectionId: string | null;\n sectionRole: string | null;\n}\n\nexport interface PackManifestMutationEntry extends PackManifestEntry {\n mutationType: 'add-page' | 'modify';\n}\n\nexport interface ExecutionPackManifest {\n $schema: string;\n version: '1.0.0';\n generatedAt: string;\n scaffold: PackManifestEntry | null;\n review: PackManifestEntry | null;\n sections: PackManifestSectionEntry[];\n pages: PackManifestPageEntry[];\n mutations: PackManifestMutationEntry[];\n}\n\nexport interface ScaffoldExecutionPack\n extends ExecutionPackBase<{\n shell: string;\n theme: {\n id: string;\n mode: string;\n shape: string | null;\n };\n routing: 'hash' | 'history' | 'pathname';\n features: string[];\n routes: Array<{\n pageId: string;\n path: string;\n shell?: string;\n patternIds: string[];\n }>;\n }> {\n packType: 'scaffold';\n}\n\nexport interface ReviewExecutionPack\n extends ExecutionPackBase<{\n reviewType: 'app';\n shell: string;\n theme: {\n id: string;\n mode: string;\n shape: string | null;\n };\n routing: 'hash' | 'history' | 'pathname';\n features: string[];\n routes: Array<{\n pageId: string;\n path: string;\n shell?: string;\n patternIds: string[];\n }>;\n focusAreas: string[];\n workflow: string[];\n }> {\n packType: 'review';\n}\n\nexport interface SectionExecutionPack\n extends ExecutionPackBase<{\n sectionId: string;\n role: string;\n shell: string;\n description: string;\n features: string[];\n theme: {\n id: string;\n mode: string;\n shape: string | null;\n };\n routes: Array<{\n pageId: string;\n path: string;\n shell?: string;\n patternIds: string[];\n }>;\n }> {\n packType: 'section';\n}\n\nexport interface PageExecutionPack\n extends ExecutionPackBase<{\n pageId: string;\n path: string;\n shell: string;\n sectionId: string | null;\n sectionRole: string | null;\n features: string[];\n surface: string;\n theme: {\n id: string;\n mode: string;\n shape: string | null;\n };\n wiringSignals: string[];\n patterns: Array<{\n id: string;\n alias: string;\n preset: string;\n layout: string;\n }>;\n }> {\n packType: 'page';\n}\n\nexport interface MutationExecutionPack\n extends ExecutionPackBase<{\n mutationType: 'add-page' | 'modify';\n shell: string;\n theme: {\n id: string;\n mode: string;\n shape: string | null;\n };\n routing: 'hash' | 'history' | 'pathname';\n features: string[];\n routes: Array<{\n pageId: string;\n path: string;\n shell?: string;\n patternIds: string[];\n }>;\n workflow: string[];\n }> {\n packType: 'mutation';\n}\n\nexport interface ExecutionPackBundleResponse {\n $schema: string;\n generatedAt: string;\n sourceEssenceVersion: string;\n manifest: ExecutionPackManifest;\n scaffold: ScaffoldExecutionPack;\n review: ReviewExecutionPack;\n sections: SectionExecutionPack[];\n pages: PageExecutionPack[];\n mutations: MutationExecutionPack[];\n}\n\nexport interface HostedSelectedExecutionPackRequest {\n essence: EssenceFile;\n pack_type: ExecutionPackType;\n id?: string;\n}\n\nexport interface SelectedExecutionPackResponse {\n $schema: string;\n generatedAt: string;\n sourceEssenceVersion: string;\n manifest: ExecutionPackManifest;\n selector: {\n packType: ExecutionPackType;\n id: string | null;\n };\n pack:\n | ScaffoldExecutionPack\n | ReviewExecutionPack\n | SectionExecutionPack\n | PageExecutionPack\n | MutationExecutionPack;\n}\n\nexport type VerificationSeverity = 'error' | 'warn' | 'info';\n\nexport interface VerificationFinding {\n id: string;\n category: string;\n severity: VerificationSeverity;\n message: string;\n evidence: string[];\n target?: string;\n file?: string;\n rule?: string;\n suggestedFix?: string;\n}\n\nexport interface VerificationScore {\n category: string;\n focusArea: string;\n score: number;\n details: string;\n suggestions: string[];\n}\n\nexport interface FileCritiqueReport {\n $schema: string;\n file: string;\n overall: number;\n scores: VerificationScore[];\n findings: VerificationFinding[];\n focusAreas: string[];\n reviewPack: ReviewExecutionPack | null;\n}\n\nexport interface ProjectAuditRuntimeAudit {\n distPresent: boolean;\n indexPresent: boolean;\n checked: boolean;\n passed: boolean | null;\n rootDocumentOk: boolean;\n titleOk: boolean;\n langOk: boolean;\n viewportOk: boolean;\n charsetOk: boolean;\n cspSignalOk: boolean;\n inlineScriptCount: number;\n inlineEventHandlerCount: number;\n externalScriptsWithoutIntegrityCount: number;\n externalScriptsWithIntegrityMissingCrossoriginCount: number;\n externalStylesheetsWithoutIntegrityCount: number;\n externalStylesheetsWithIntegrityMissingCrossoriginCount: number;\n externalScriptsWithInsecureTransportCount: number;\n externalStylesheetsWithInsecureTransportCount: number;\n externalMediaSourcesWithInsecureTransportCount: number;\n externalBlankLinksWithoutRelCount: number;\n externalIframesWithoutSandboxCount: number;\n externalIframesWithInsecureTransportCount: number;\n jsEvalSignalCount: number;\n jsHtmlInjectionSignalCount: number;\n jsInsecureTransportSignalCount: number;\n jsSecretSignalCount: number;\n assetCount: number;\n assetsPassed: number;\n routeHintsChecked: string[];\n routeHintsMatched: number;\n routeHintsCoverageOk: boolean;\n routeDocumentsChecked: number;\n routeDocumentsPassed: number;\n routeDocumentsHardenedCount: number;\n routeDocumentsCoverageOk: boolean;\n routeDocumentsHardeningOk: boolean;\n fullRouteCoverageOk: boolean;\n totalAssetBytes: number;\n jsAssetBytes: number;\n cssAssetBytes: number;\n largestAssetPath: string | null;\n largestAssetBytes: number;\n failures: string[];\n}\n\nexport interface ProjectAuditSummary {\n errorCount: number;\n warnCount: number;\n infoCount: number;\n essenceVersion: string | null;\n reviewPackPresent: boolean;\n packManifestPresent: boolean;\n runtimeAuditChecked: boolean;\n runtimePassed: boolean | null;\n pageCount: number;\n}\n\nexport interface ProjectAuditReport {\n $schema: string;\n projectRoot: string;\n valid: boolean;\n essence: EssenceFile | null;\n reviewPack: ReviewExecutionPack | null;\n packManifest: ExecutionPackManifest | null;\n runtimeAudit: ProjectAuditRuntimeAudit;\n findings: VerificationFinding[];\n summary: ProjectAuditSummary;\n}\n","import { getBlueprintPortfolioMetadata, type PublicContentSummary } from './types.js';\n\nexport type PublicContentSort = 'recommended' | 'recent' | 'name';\n\nfunction verificationScore(status?: string | null): number {\n switch (status) {\n case 'smoke-green':\n return 200;\n case 'build-green':\n return 120;\n case 'pending':\n return 20;\n case 'smoke-red':\n case 'build-red':\n return -40;\n default:\n return 0;\n }\n}\n\nfunction confidenceScore(level?: string | null): number {\n switch (level) {\n case 'high':\n return 120;\n case 'medium':\n return 70;\n case 'low':\n return 30;\n default:\n return 0;\n }\n}\n\nfunction confidenceTierScore(tier?: string | null): number {\n switch (tier) {\n case 'verified':\n return 180;\n case 'high':\n return 120;\n case 'medium':\n return 60;\n case 'low':\n return 10;\n default:\n return 0;\n }\n}\n\nfunction getRecommendedPriority(item: PublicContentSummary): number {\n const intelligence = item.intelligence;\n let score = 0;\n\n const portfolio = getBlueprintPortfolioMetadata(item.blueprint_portfolio);\n if (portfolio?.visibility === 'featured') {\n score += 900;\n }\n if (portfolio?.artifact.status === 'certified') {\n score += 650;\n } else if (portfolio?.artifact.status === 'candidate') {\n score += 120;\n }\n if (portfolio?.visibility === 'labs' || portfolio?.visibility === 'hidden') {\n score -= 400;\n }\n\n if (!intelligence) {\n return score;\n }\n\n if (intelligence.recommended) {\n score += 500;\n }\n\n if (intelligence.golden_usage === 'shortlisted') {\n score += 160;\n } else if (intelligence.golden_usage === 'showcase') {\n score += 80;\n }\n\n score += verificationScore(intelligence.verification_status);\n score += confidenceScore(intelligence.benchmark_confidence);\n score += confidenceTierScore(intelligence.confidence_tier);\n score += Math.round((intelligence.confidence_score ?? 0) / 2);\n score += intelligence.quality_score ?? 0;\n\n return score;\n}\n\nexport function normalizePublicContentSort(value: string | null | undefined): PublicContentSort {\n switch (value) {\n case 'popular':\n case 'recommended':\n return 'recommended';\n case 'newest':\n case 'recent':\n case 'published':\n return 'recent';\n case 'name':\n return 'name';\n default:\n return 'recommended';\n }\n}\n\nexport function comparePublicContent(\n a: PublicContentSummary,\n b: PublicContentSummary,\n sort: PublicContentSort = 'recommended',\n): number {\n if (sort === 'name') {\n return (a.name ?? a.slug).localeCompare(b.name ?? b.slug);\n }\n\n if (sort === 'recent') {\n const publishedDelta =\n new Date(b.published_at ?? 0).getTime() - new Date(a.published_at ?? 0).getTime();\n if (publishedDelta !== 0) {\n return publishedDelta;\n }\n return a.slug.localeCompare(b.slug);\n }\n\n const priorityDelta = getRecommendedPriority(b) - getRecommendedPriority(a);\n if (priorityDelta !== 0) {\n return priorityDelta;\n }\n\n if (a.namespace !== b.namespace) {\n if (a.namespace === '@official') return -1;\n if (b.namespace === '@official') return 1;\n }\n\n const publishedDelta =\n new Date(b.published_at ?? 0).getTime() - new Date(a.published_at ?? 0).getTime();\n if (publishedDelta !== 0) {\n return publishedDelta;\n }\n\n return (a.name ?? a.slug).localeCompare(b.name ?? b.slug);\n}\n\nexport function sortPublicContent<T extends PublicContentSummary>(\n items: T[],\n sort: PublicContentSort = 'recommended',\n): T[] {\n return [...items].sort((left, right) => comparePublicContent(left, right, sort));\n}\n","import { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type {\n Archetype,\n Blueprint,\n ContentType,\n Pattern,\n ResolvedContent,\n Shell,\n Theme,\n} from './types.js';\n\ntype ContentMap = {\n pattern: Pattern;\n archetype: Archetype;\n theme: Theme;\n blueprint: Blueprint;\n shell: Shell;\n};\n\nexport interface ResolverOptions {\n contentRoot: string;\n overridePaths?: string[];\n}\n\nexport interface ContentResolver {\n resolve<T extends ContentType>(\n type: T,\n id: string,\n ): Promise<ResolvedContent<ContentMap[T]> | null>;\n}\n\nconst TYPE_DIRS: Record<ContentType, string> = {\n pattern: 'patterns',\n archetype: 'archetypes',\n theme: 'themes',\n blueprint: 'blueprints',\n shell: 'shells',\n};\n\nasync function tryLoadJson<T>(filePath: string): Promise<T | null> {\n try {\n const content = await readFile(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\nexport function createResolver(options: ResolverOptions): ContentResolver {\n const { contentRoot, overridePaths = [] } = options;\n return {\n async resolve<T extends ContentType>(\n type: T,\n id: string,\n ): Promise<ResolvedContent<ContentMap[T]> | null> {\n const dir = TYPE_DIRS[type];\n const fileName = `${id}.json`;\n for (const overridePath of overridePaths) {\n const filePath = join(overridePath, dir, fileName);\n const item = await tryLoadJson<ContentMap[T]>(filePath);\n if (item) return { item, source: 'local', path: filePath };\n }\n // Check main content directory\n const mainPath = join(contentRoot, dir, fileName);\n const mainItem = await tryLoadJson<ContentMap[T]>(mainPath);\n if (mainItem) return { item: mainItem, source: 'core', path: mainPath };\n\n // Check content/core/{type}/ as fallback\n const corePath = join(contentRoot, 'core', dir, fileName);\n const coreItem = await tryLoadJson<ContentMap[T]>(corePath);\n if (coreItem) return { item: coreItem, source: 'core', path: corePath };\n\n return null;\n },\n };\n}\n","import type { LayoutItem, PatternRef } from '@decantr/essence-spec';\nimport type { PatternIO } from './types.js';\n\n// AUTO: hookType classifies each signal for custom hook generation\nexport type HookType = 'search' | 'filter' | 'selection' | 'sort';\n\nexport interface WiringSignal {\n name: string;\n init: string;\n hookType: HookType;\n}\n\nexport interface WiringRule {\n pair: [string, string];\n signals: WiringSignal[];\n props: Record<string, Record<string, string>>;\n // AUTO: hookProps maps pattern IDs to hook variable names passed as props\n hookProps: Record<string, Record<string, string>>;\n}\n\nexport interface WiringResult {\n rule: WiringRule;\n signals: WiringSignal[];\n props: Record<string, Record<string, string>>;\n hookProps: Record<string, Record<string, string>>;\n}\n\n/**\n * IO declaration for a pattern, used by the data-driven wiring system.\n */\nexport interface PatternIOEntry {\n id: string;\n io: PatternIO;\n}\n\n/**\n * A dynamically derived wiring edge between two patterns based on shared IO signals.\n */\nexport interface IOWiringEdge {\n producer: string;\n consumer: string;\n signals: string[];\n}\n\nexport const WIRING_RULES: WiringRule[] = [\n {\n pair: ['filter-bar', 'data-table'],\n signals: [\n { name: 'pageSearch', init: \"''\", hookType: 'search' },\n { name: 'pageStatus', init: \"'all'\", hookType: 'filter' },\n ],\n props: {\n 'filter-bar': { onSearch: 'setPageSearch', onCategory: 'setPageStatus' },\n 'data-table': { search: 'pageSearch', status: 'pageStatus' },\n },\n hookProps: {\n 'filter-bar': { search: 'search', filters: 'filters' },\n 'data-table': { search: 'search', filters: 'filters' },\n },\n },\n {\n pair: ['filter-bar', 'activity-feed'],\n signals: [\n { name: 'pageSearch', init: \"''\", hookType: 'search' },\n { name: 'pageView', init: \"'all'\", hookType: 'filter' },\n ],\n props: {\n 'filter-bar': { onSearch: 'setPageSearch', onView: 'setPageView' },\n 'activity-feed': { search: 'pageSearch', view: 'pageView' },\n },\n hookProps: {\n 'filter-bar': { search: 'search', filters: 'filters' },\n 'activity-feed': { search: 'search', filters: 'filters' },\n },\n },\n {\n pair: ['filter-bar', 'card-grid'],\n signals: [{ name: 'pageSearch', init: \"''\", hookType: 'search' }],\n props: {\n 'filter-bar': { onSearch: 'setPageSearch' },\n 'card-grid': { search: 'pageSearch' },\n },\n hookProps: {\n 'filter-bar': { search: 'search' },\n 'card-grid': { search: 'search' },\n },\n },\n];\n\nfunction getPatternId(item: LayoutItem): string | null {\n if (typeof item === 'string') return item;\n if ('pattern' in item) return (item as PatternRef).pattern;\n return null;\n}\n\n/**\n * Derive wiring edges from pattern IO declarations.\n * If pattern A produces signal X and pattern B consumes signal X, an edge is created.\n * Only patterns present in the layout are considered.\n */\nexport function deriveIOWirings(\n layoutIds: string[],\n patternIOMap: Map<string, PatternIO>,\n): IOWiringEdge[] {\n const edges: IOWiringEdge[] = [];\n const layoutSet = new Set(layoutIds);\n\n for (const producerId of layoutIds) {\n const producerIO = patternIOMap.get(producerId);\n if (!producerIO?.produces?.length) continue;\n\n for (const consumerId of layoutIds) {\n if (producerId === consumerId) continue;\n if (!layoutSet.has(consumerId)) continue;\n const consumerIO = patternIOMap.get(consumerId);\n if (!consumerIO?.consumes?.length) continue;\n\n const shared = producerIO.produces.filter((signal) => consumerIO.consumes!.includes(signal));\n if (shared.length > 0) {\n edges.push({ producer: producerId, consumer: consumerId, signals: shared });\n }\n }\n }\n\n return edges;\n}\n\n/**\n * Build a PatternIO map from an array of PatternIOEntry objects.\n */\nexport function buildIOMap(entries: PatternIOEntry[]): Map<string, PatternIO> {\n const map = new Map<string, PatternIO>();\n for (const entry of entries) {\n map.set(entry.id, entry.io);\n }\n return map;\n}\n\n/**\n * Detect wirings from a layout. Uses hardcoded WIRING_RULES for detailed\n * signal/prop information. When a patternIOMap is provided, also derives\n * IO-based wirings and merges them (hardcoded rules take precedence for\n * pairs they cover).\n */\nexport function detectWirings(\n layout: LayoutItem[],\n patternIOMap?: Map<string, PatternIO>,\n): WiringResult[] {\n const patternIds = layout.map(getPatternId).filter((id): id is string => id !== null);\n const results: WiringResult[] = [];\n const coveredPairs = new Set<string>();\n\n // Apply hardcoded rules first (these have detailed signal/prop info)\n for (const rule of WIRING_RULES) {\n const [a, b] = rule.pair;\n if (patternIds.includes(a) && patternIds.includes(b)) {\n results.push({ rule, signals: rule.signals, props: rule.props, hookProps: rule.hookProps });\n coveredPairs.add(`${a}:${b}`);\n coveredPairs.add(`${b}:${a}`);\n }\n }\n\n // If IO map provided, derive additional wirings from IO declarations\n if (patternIOMap) {\n const ioEdges = deriveIOWirings(patternIds, patternIOMap);\n for (const edge of ioEdges) {\n const pairKey = `${edge.producer}:${edge.consumer}`;\n if (coveredPairs.has(pairKey)) continue;\n coveredPairs.add(pairKey);\n\n // Generate a synthetic WiringRule from IO signals\n const signals: WiringSignal[] = edge.signals.map((sig) => {\n const camel = toCamelCase(sig);\n return {\n name: `page${capitalize(camel)}`,\n init: \"''\",\n hookType: classifySignal(sig),\n };\n });\n\n const producerProps: Record<string, string> = {};\n const consumerProps: Record<string, string> = {};\n const producerHookProps: Record<string, string> = {};\n const consumerHookProps: Record<string, string> = {};\n\n for (const sig of edge.signals) {\n const camel = toCamelCase(sig);\n const stateName = `page${capitalize(camel)}`;\n const setterName = `set${capitalize(stateName)}`;\n producerProps[`on${capitalize(camel)}`] = setterName;\n consumerProps[sig] = stateName;\n producerHookProps[sig] = sig;\n consumerHookProps[sig] = sig;\n }\n\n const rule: WiringRule = {\n pair: [edge.producer, edge.consumer],\n signals,\n props: { [edge.producer]: producerProps, [edge.consumer]: consumerProps },\n hookProps: { [edge.producer]: producerHookProps, [edge.consumer]: consumerHookProps },\n };\n\n results.push({ rule, signals, props: rule.props, hookProps: rule.hookProps });\n }\n }\n\n return results;\n}\n\n/**\n * Convert a kebab-case string to camelCase.\n */\nfunction toCamelCase(str: string): string {\n return str.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n}\n\n/**\n * Capitalize the first letter of a string.\n */\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n/**\n * Classify a signal name into a HookType for code generation.\n */\nfunction classifySignal(signal: string): HookType {\n const normalized = toCamelCase(signal);\n if (normalized === 'search') return 'search';\n if (normalized === 'selection') return 'selection';\n if (normalized === 'sort') return 'sort';\n return 'filter';\n}\n"],"mappings":"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","names":["isRecord","isRecord","publishedDelta"]}
|