@lucern/pack-host 1.0.28 → 1.0.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/contracts.d.ts +35 -35
- package/dist/contracts.js.map +1 -1
- package/dist/dependencyResolution.d.ts +3 -3
- package/dist/dependencyResolution.js +83 -59
- package/dist/dependencyResolution.js.map +1 -1
- package/dist/domain-pack/authoring.core.d.ts +82 -82
- package/dist/domain-pack/authoring.core.js +7 -6
- package/dist/domain-pack/authoring.core.js.map +1 -1
- package/dist/domain-pack/authoring.js +400 -281
- package/dist/domain-pack/authoring.js.map +1 -1
- package/dist/domain-pack/authoring.validation.js +400 -281
- package/dist/domain-pack/authoring.validation.js.map +1 -1
- package/dist/domain-pack/contracts.d.ts +95 -95
- package/dist/domain-pack/contracts.js.map +1 -1
- package/dist/domain-pack/index.js +416 -285
- package/dist/domain-pack/index.js.map +1 -1
- package/dist/domain-pack/ontology/software-entities-v1.d.ts +7 -7
- package/dist/domain-pack/ontology/software-entities-v1.js.map +1 -1
- package/dist/domain-pack/packs/developer-reasoning.js +7 -1
- package/dist/domain-pack/packs/developer-reasoning.js.map +1 -1
- package/dist/domain-pack/packs/engineering-accelerator.js.map +1 -1
- package/dist/domain-pack/packs/index.js +333 -239
- package/dist/domain-pack/packs/index.js.map +1 -1
- package/dist/domain-pack/shaping.d.ts +15 -15
- package/dist/domain-pack/shaping.js +326 -238
- package/dist/domain-pack/shaping.js.map +1 -1
- package/dist/domain-pack/validation.d.ts +6 -6
- package/dist/domain-pack/validation.js +318 -236
- package/dist/domain-pack/validation.js.map +1 -1
- package/dist/domain-pack.js +416 -285
- package/dist/domain-pack.js.map +1 -1
- package/dist/index.d.ts +6 -6
- package/dist/index.js +3793 -3643
- package/dist/index.js.map +1 -1
- package/dist/lifecycle.d.ts +9 -9
- package/dist/lifecycle.js.map +1 -1
- package/dist/manifestValidation.d.ts +9 -9
- package/dist/manifestValidation.js.map +1 -1
- package/dist/manifests/chat-v1.js.map +1 -1
- package/dist/manifests/deals-v1.js +1 -6
- package/dist/manifests/deals-v1.js.map +1 -1
- package/dist/manifests/decisions-v1.js.map +1 -1
- package/dist/manifests/documents-v1.js.map +1 -1
- package/dist/manifests/epistemic-algorithms-v1.js.map +1 -1
- package/dist/manifests/graph-visualization-v1.js.map +1 -1
- package/dist/manifests/index.js +1 -6
- package/dist/manifests/index.js.map +1 -1
- package/dist/manifests/news-v1.js.map +1 -1
- package/dist/manifests/philosophy-mode-v1.js.map +1 -1
- package/dist/manifests/sprints-v1.js.map +1 -1
- package/dist/manifests/task-management-v1.js.map +1 -1
- package/dist/manifests/team-analysis-v1.js.map +1 -1
- package/dist/manifests/themes-v1.js.map +1 -1
- package/dist/manifests/user-profiles-v1.js.map +1 -1
- package/dist/manifests.js +1 -6
- package/dist/manifests.js.map +1 -1
- package/dist/namespacePolicy.d.ts +6 -6
- package/dist/namespacePolicy.js.map +1 -1
- package/dist/proof-attestation.json +1 -1
- package/dist/registry.js +84 -65
- package/dist/registry.js.map +1 -1
- package/dist/runtime.d.ts +6 -6
- package/dist/runtime.js +83 -59
- package/dist/runtime.js.map +1 -1
- package/dist/serviceContracts.d.ts +4 -4
- package/dist/serviceContracts.js.map +1 -1
- package/package.json +1 -1
package/dist/contracts.d.ts
CHANGED
|
@@ -12,63 +12,63 @@ type ProjectionBehavior = "none" | "inherits_policy" | "projection_required";
|
|
|
12
12
|
type PackRuntimeStage = "registered" | "validated" | "installed" | "enabled" | "degraded" | "disabled" | "removed";
|
|
13
13
|
type SharedService = "decision-kernel" | "knowledge-compiler" | "learning-loop";
|
|
14
14
|
type SharedServiceMode = "required" | "optional";
|
|
15
|
-
|
|
16
|
-
web: string[];
|
|
15
|
+
interface RouteNamespace {
|
|
17
16
|
api: string[];
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
web: string[];
|
|
18
|
+
}
|
|
19
|
+
interface SurfaceOwnership {
|
|
20
20
|
components: string[];
|
|
21
21
|
convex: string[];
|
|
22
22
|
tools: string[];
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
resource: PolicyResource;
|
|
23
|
+
}
|
|
24
|
+
interface PolicyRule {
|
|
26
25
|
actions: PolicyAction[];
|
|
27
26
|
notes?: string;
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
resource: PolicyResource;
|
|
28
|
+
}
|
|
29
|
+
interface PolicyProfile {
|
|
30
30
|
audiences: PackAudience[];
|
|
31
31
|
rules: PolicyRule[];
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
}
|
|
33
|
+
interface DataContract {
|
|
34
|
+
projectionBehavior: ProjectionBehavior;
|
|
35
35
|
requiredEdgeTypes: string[];
|
|
36
|
+
requiredNodeTypes: string[];
|
|
36
37
|
requiredTables: string[];
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
type TemplateAssets = {
|
|
40
|
-
workflows: string[];
|
|
38
|
+
}
|
|
39
|
+
interface TemplateAssets {
|
|
41
40
|
prompts: string[];
|
|
42
41
|
reports: string[];
|
|
43
42
|
uiLabels: string[];
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
workflows: string[];
|
|
44
|
+
}
|
|
45
|
+
interface PackTestSuite {
|
|
46
|
+
contract: string[];
|
|
46
47
|
parity: string[];
|
|
47
48
|
policy: string[];
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
type SharedServiceIntegration = {
|
|
51
|
-
service: SharedService;
|
|
52
|
-
mode: SharedServiceMode;
|
|
49
|
+
}
|
|
50
|
+
interface SharedServiceIntegration {
|
|
53
51
|
contracts: string[];
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
lifecycle: PackLifecycle;
|
|
52
|
+
mode: SharedServiceMode;
|
|
53
|
+
service: SharedService;
|
|
54
|
+
}
|
|
55
|
+
interface AppPackManifest {
|
|
56
|
+
capabilityFlags: string[];
|
|
60
57
|
category: PackCategory;
|
|
61
|
-
|
|
58
|
+
dataContract: DataContract;
|
|
62
59
|
dependencies: string[];
|
|
63
|
-
|
|
60
|
+
description: string;
|
|
61
|
+
key: string;
|
|
62
|
+
lifecycle: PackLifecycle;
|
|
63
|
+
name: string;
|
|
64
|
+
policyProfile: PolicyProfile;
|
|
64
65
|
routeNamespace: RouteNamespace;
|
|
66
|
+
sharedServices: SharedServiceIntegration[];
|
|
65
67
|
surfaces: SurfaceOwnership;
|
|
66
|
-
policyProfile: PolicyProfile;
|
|
67
|
-
dataContract: DataContract;
|
|
68
68
|
templates: TemplateAssets;
|
|
69
69
|
testSuite: PackTestSuite;
|
|
70
|
-
|
|
71
|
-
}
|
|
70
|
+
version: string;
|
|
71
|
+
}
|
|
72
72
|
type AppPackManifestInput = Omit<AppPackManifest, "sharedServices"> & {
|
|
73
73
|
sharedServices?: SharedServiceIntegration[];
|
|
74
74
|
};
|
package/dist/contracts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/contracts.ts"],"names":[],"mappings":";AA+HA,SAAS,qBAAqB,MAAA,EAA4B;AACxD,EAAA,MAAM,UAAA,GAAa,MAAA,CAChB,GAAA,CAAI,CAAC,UAAU,KAAA,CAAM,IAAA,EAAM,CAAA,CAC3B,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,SAAS,CAAC,CAAA;AACrC,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,GAAA,CAAI,UAAU,CAAC,CAAA;AACvC;AAEO,SAAS,sBACd,QAAA,EACiB;AACjB,EAAA,MAAM,kBAAkB,QAAA,CAAS,cAAA,IAAkB,EAAC,EAAG,GAAA,CAAI,CAAC,WAAA,MAAiB;AAAA,IAC3E,GAAG,WAAA;AAAA,IACH,SAAA,EAAW,oBAAA,CAAqB,WAAA,CAAY,SAAS;AAAA,GACvD,CAAE,CAAA;AAEF,EAAA,OAAO;AAAA,IACL,GAAG,QAAA;AAAA,IACH,YAAA,EAAc,oBAAA,CAAqB,QAAA,CAAS,YAAY,CAAA;AAAA,IACxD,eAAA,EAAiB,oBAAA,CAAqB,QAAA,CAAS,eAAe,CAAA;AAAA,IAC9D;AAAA,GACF;AACF","file":"contracts.js","sourcesContent":["/**\n * App Pack Contracts\n *\n * Canonical type contracts for Lucern app-pack manifests and runtime metadata.\n */\n\nexport type PackLifecycle = \"active\" | \"beta\" | \"experimental\";\n\nexport type PackCategory =\n | \"conversation\"\n | \"research\"\n | \"graph\"\n | \"analytics\"\n | \"workflow\"\n | \"decision\"\n | \"news\"\n | \"documents\"\n | \"identity\"\n | \"operations\"\n | \"domain\";\n\nexport type PackAudience = string;\n\nexport type PolicyAction = \"read\" | \"summarize\" | \"export\" | \"mutate\" | \"admin\";\n\nexport type PolicyResource =\n | \"project\"\n | \"node\"\n | \"edge\"\n | \"artifact\"\n | \"report_section\"\n | \"tool_action\"\n | \"task\"\n | \"user_profile\"\n | \"team_analytics\";\n\nexport type ProjectionBehavior =\n | \"none\"\n | \"inherits_policy\"\n | \"projection_required\";\n\nexport type PackRuntimeStage =\n | \"registered\"\n | \"validated\"\n | \"installed\"\n | \"enabled\"\n | \"degraded\"\n | \"disabled\"\n | \"removed\";\n\nexport type SharedService =\n | \"decision-kernel\"\n | \"knowledge-compiler\"\n | \"learning-loop\";\n\nexport type SharedServiceMode = \"required\" | \"optional\";\n\nexport
|
|
1
|
+
{"version":3,"sources":["../src/contracts.ts"],"names":[],"mappings":";AA+HA,SAAS,qBAAqB,MAAA,EAA4B;AACxD,EAAA,MAAM,UAAA,GAAa,MAAA,CAChB,GAAA,CAAI,CAAC,UAAU,KAAA,CAAM,IAAA,EAAM,CAAA,CAC3B,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,SAAS,CAAC,CAAA;AACrC,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,GAAA,CAAI,UAAU,CAAC,CAAA;AACvC;AAEO,SAAS,sBACd,QAAA,EACiB;AACjB,EAAA,MAAM,kBAAkB,QAAA,CAAS,cAAA,IAAkB,EAAC,EAAG,GAAA,CAAI,CAAC,WAAA,MAAiB;AAAA,IAC3E,GAAG,WAAA;AAAA,IACH,SAAA,EAAW,oBAAA,CAAqB,WAAA,CAAY,SAAS;AAAA,GACvD,CAAE,CAAA;AAEF,EAAA,OAAO;AAAA,IACL,GAAG,QAAA;AAAA,IACH,YAAA,EAAc,oBAAA,CAAqB,QAAA,CAAS,YAAY,CAAA;AAAA,IACxD,eAAA,EAAiB,oBAAA,CAAqB,QAAA,CAAS,eAAe,CAAA;AAAA,IAC9D;AAAA,GACF;AACF","file":"contracts.js","sourcesContent":["/**\n * App Pack Contracts\n *\n * Canonical type contracts for Lucern app-pack manifests and runtime metadata.\n */\n\nexport type PackLifecycle = \"active\" | \"beta\" | \"experimental\";\n\nexport type PackCategory =\n | \"conversation\"\n | \"research\"\n | \"graph\"\n | \"analytics\"\n | \"workflow\"\n | \"decision\"\n | \"news\"\n | \"documents\"\n | \"identity\"\n | \"operations\"\n | \"domain\";\n\nexport type PackAudience = string;\n\nexport type PolicyAction = \"read\" | \"summarize\" | \"export\" | \"mutate\" | \"admin\";\n\nexport type PolicyResource =\n | \"project\"\n | \"node\"\n | \"edge\"\n | \"artifact\"\n | \"report_section\"\n | \"tool_action\"\n | \"task\"\n | \"user_profile\"\n | \"team_analytics\";\n\nexport type ProjectionBehavior =\n | \"none\"\n | \"inherits_policy\"\n | \"projection_required\";\n\nexport type PackRuntimeStage =\n | \"registered\"\n | \"validated\"\n | \"installed\"\n | \"enabled\"\n | \"degraded\"\n | \"disabled\"\n | \"removed\";\n\nexport type SharedService =\n | \"decision-kernel\"\n | \"knowledge-compiler\"\n | \"learning-loop\";\n\nexport type SharedServiceMode = \"required\" | \"optional\";\n\nexport interface RouteNamespace {\n api: string[];\n web: string[];\n}\n\nexport interface SurfaceOwnership {\n components: string[];\n convex: string[];\n tools: string[];\n}\n\nexport interface PolicyRule {\n actions: PolicyAction[];\n notes?: string;\n resource: PolicyResource;\n}\n\nexport interface PolicyProfile {\n audiences: PackAudience[];\n rules: PolicyRule[];\n}\n\nexport interface DataContract {\n projectionBehavior: ProjectionBehavior;\n requiredEdgeTypes: string[];\n requiredNodeTypes: string[];\n requiredTables: string[];\n}\n\nexport interface TemplateAssets {\n prompts: string[];\n reports: string[];\n uiLabels: string[];\n workflows: string[];\n}\n\nexport interface PackTestSuite {\n contract: string[];\n parity: string[];\n policy: string[];\n}\n\nexport interface SharedServiceIntegration {\n contracts: string[];\n mode: SharedServiceMode;\n service: SharedService;\n}\n\nexport interface AppPackManifest {\n capabilityFlags: string[];\n category: PackCategory;\n dataContract: DataContract;\n dependencies: string[];\n description: string;\n key: string;\n lifecycle: PackLifecycle;\n name: string;\n policyProfile: PolicyProfile;\n routeNamespace: RouteNamespace;\n sharedServices: SharedServiceIntegration[];\n surfaces: SurfaceOwnership;\n templates: TemplateAssets;\n testSuite: PackTestSuite;\n version: string;\n}\n\ntype AppPackManifestInput = Omit<AppPackManifest, \"sharedServices\"> & {\n sharedServices?: SharedServiceIntegration[];\n};\n\nfunction normalizeStringArray(values: string[]): string[] {\n const normalized = values\n .map((value) => value.trim())\n .filter((value) => value.length > 0);\n return Array.from(new Set(normalized));\n}\n\nexport function defineAppPackManifest(\n manifest: AppPackManifestInput\n): AppPackManifest {\n const sharedServices = (manifest.sharedServices ?? []).map((integration) => ({\n ...integration,\n contracts: normalizeStringArray(integration.contracts),\n }));\n\n return {\n ...manifest,\n dependencies: normalizeStringArray(manifest.dependencies),\n capabilityFlags: normalizeStringArray(manifest.capabilityFlags),\n sharedServices,\n };\n}\n"]}
|
|
@@ -7,12 +7,12 @@ import { PackValidationIssue } from './manifestValidation.js';
|
|
|
7
7
|
* Dependency-graph validation and deterministic activation ordering.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
orderedPackKeys: string[];
|
|
10
|
+
interface PackDependencyResolutionResult {
|
|
12
11
|
dependencyClosureByPack: Record<string, string[]>;
|
|
13
12
|
issues: PackValidationIssue[];
|
|
13
|
+
orderedPackKeys: string[];
|
|
14
14
|
valid: boolean;
|
|
15
|
-
}
|
|
15
|
+
}
|
|
16
16
|
declare function resolvePackDependencyGraph(manifests: AppPackManifest[]): PackDependencyResolutionResult;
|
|
17
17
|
|
|
18
18
|
export { type PackDependencyResolutionResult, resolvePackDependencyGraph };
|
|
@@ -10,6 +10,73 @@ function toIssue(code, message, path, severity = "error") {
|
|
|
10
10
|
function buildManifestMap(manifests) {
|
|
11
11
|
return new Map(manifests.map((manifest) => [manifest.key, manifest]));
|
|
12
12
|
}
|
|
13
|
+
function initializeDependencyGraph(manifests) {
|
|
14
|
+
const manifestsByKey = buildManifestMap(manifests);
|
|
15
|
+
const indegree = /* @__PURE__ */ new Map();
|
|
16
|
+
const adjacency = /* @__PURE__ */ new Map();
|
|
17
|
+
for (const manifest of manifests) {
|
|
18
|
+
indegree.set(manifest.key, indegree.get(manifest.key) ?? 0);
|
|
19
|
+
adjacency.set(manifest.key, []);
|
|
20
|
+
}
|
|
21
|
+
return { adjacency, indegree, manifestsByKey };
|
|
22
|
+
}
|
|
23
|
+
function linkPackDependency(manifest, dependency, graph, issues) {
|
|
24
|
+
if (!graph.manifestsByKey.has(dependency)) {
|
|
25
|
+
issues.push(
|
|
26
|
+
toIssue(
|
|
27
|
+
"PACK_DEPENDENCY_MISSING",
|
|
28
|
+
`Pack "${manifest.key}" depends on unknown pack "${dependency}".`,
|
|
29
|
+
`dependencies:${manifest.key}`
|
|
30
|
+
)
|
|
31
|
+
);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const dependencyDependents = graph.adjacency.get(dependency) ?? [];
|
|
35
|
+
dependencyDependents.push(manifest.key);
|
|
36
|
+
graph.adjacency.set(dependency, dependencyDependents);
|
|
37
|
+
graph.indegree.set(manifest.key, (graph.indegree.get(manifest.key) ?? 0) + 1);
|
|
38
|
+
}
|
|
39
|
+
function linkPackDependencies(manifests, graph, issues) {
|
|
40
|
+
for (const manifest of manifests) {
|
|
41
|
+
for (const dependency of manifest.dependencies) {
|
|
42
|
+
linkPackDependency(manifest, dependency, graph, issues);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function topologicalPackOrder(graph) {
|
|
47
|
+
const queue = [...graph.indegree.entries()].filter(([, value]) => value === 0).map(([packKey]) => packKey).sort();
|
|
48
|
+
const orderedPackKeys = [];
|
|
49
|
+
while (queue.length > 0) {
|
|
50
|
+
const nextKey = queue.shift();
|
|
51
|
+
if (!nextKey) {
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
orderedPackKeys.push(nextKey);
|
|
55
|
+
const dependents = graph.adjacency.get(nextKey) ?? [];
|
|
56
|
+
for (const dependent of dependents) {
|
|
57
|
+
const updated = (graph.indegree.get(dependent) ?? 0) - 1;
|
|
58
|
+
graph.indegree.set(dependent, updated);
|
|
59
|
+
if (updated === 0) {
|
|
60
|
+
queue.push(dependent);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
queue.sort();
|
|
64
|
+
}
|
|
65
|
+
return orderedPackKeys;
|
|
66
|
+
}
|
|
67
|
+
function recordUnresolvedDependencyCycles(orderedPackKeys, graph, issues) {
|
|
68
|
+
if (orderedPackKeys.length === graph.manifestsByKey.size) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const unresolved = [...graph.indegree.entries()].filter(([, value]) => value > 0).map(([key]) => key).sort();
|
|
72
|
+
issues.push(
|
|
73
|
+
toIssue(
|
|
74
|
+
"PACK_DEPENDENCY_CYCLE",
|
|
75
|
+
`Dependency graph is not acyclic; unresolved packs: ${unresolved.join(", ")}`,
|
|
76
|
+
"dependencies"
|
|
77
|
+
)
|
|
78
|
+
);
|
|
79
|
+
}
|
|
13
80
|
function walkDependencyClosure(manifestKey, manifestsByKey, path, closure, issues) {
|
|
14
81
|
const manifest = manifestsByKey.get(manifestKey);
|
|
15
82
|
if (!manifest) {
|
|
@@ -50,63 +117,8 @@ function walkDependencyClosure(manifestKey, manifestsByKey, path, closure, issue
|
|
|
50
117
|
);
|
|
51
118
|
}
|
|
52
119
|
}
|
|
53
|
-
function
|
|
54
|
-
const
|
|
55
|
-
const manifestsByKey = buildManifestMap(manifests);
|
|
56
|
-
const indegree = /* @__PURE__ */ new Map();
|
|
57
|
-
const adjacency = /* @__PURE__ */ new Map();
|
|
58
|
-
for (const manifest of manifests) {
|
|
59
|
-
indegree.set(manifest.key, indegree.get(manifest.key) ?? 0);
|
|
60
|
-
adjacency.set(manifest.key, []);
|
|
61
|
-
}
|
|
62
|
-
for (const manifest of manifests) {
|
|
63
|
-
for (const dependency of manifest.dependencies) {
|
|
64
|
-
if (!manifestsByKey.has(dependency)) {
|
|
65
|
-
issues.push(
|
|
66
|
-
toIssue(
|
|
67
|
-
"PACK_DEPENDENCY_MISSING",
|
|
68
|
-
`Pack "${manifest.key}" depends on unknown pack "${dependency}".`,
|
|
69
|
-
`dependencies:${manifest.key}`
|
|
70
|
-
)
|
|
71
|
-
);
|
|
72
|
-
continue;
|
|
73
|
-
}
|
|
74
|
-
const dependencyDependents = adjacency.get(dependency) ?? [];
|
|
75
|
-
dependencyDependents.push(manifest.key);
|
|
76
|
-
adjacency.set(dependency, dependencyDependents);
|
|
77
|
-
indegree.set(manifest.key, (indegree.get(manifest.key) ?? 0) + 1);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
const queue = [...indegree.entries()].filter(([, value]) => value === 0).map(([packKey]) => packKey).sort();
|
|
81
|
-
const orderedPackKeys = [];
|
|
82
|
-
while (queue.length > 0) {
|
|
83
|
-
const nextKey = queue.shift();
|
|
84
|
-
if (!nextKey) {
|
|
85
|
-
break;
|
|
86
|
-
}
|
|
87
|
-
orderedPackKeys.push(nextKey);
|
|
88
|
-
const dependents = adjacency.get(nextKey) ?? [];
|
|
89
|
-
for (const dependent of dependents) {
|
|
90
|
-
const current = indegree.get(dependent) ?? 0;
|
|
91
|
-
const updated = current - 1;
|
|
92
|
-
indegree.set(dependent, updated);
|
|
93
|
-
if (updated === 0) {
|
|
94
|
-
queue.push(dependent);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
queue.sort();
|
|
98
|
-
}
|
|
99
|
-
if (orderedPackKeys.length !== manifestsByKey.size) {
|
|
100
|
-
const unresolved = [...indegree.entries()].filter(([, value]) => value > 0).map(([key]) => key).sort();
|
|
101
|
-
issues.push(
|
|
102
|
-
toIssue(
|
|
103
|
-
"PACK_DEPENDENCY_CYCLE",
|
|
104
|
-
`Dependency graph is not acyclic; unresolved packs: ${unresolved.join(", ")}`,
|
|
105
|
-
"dependencies"
|
|
106
|
-
)
|
|
107
|
-
);
|
|
108
|
-
}
|
|
109
|
-
const dependencyClosureByPack = {};
|
|
120
|
+
function dependencyClosureByPack(manifests, manifestsByKey, issues) {
|
|
121
|
+
const dependencyClosure = {};
|
|
110
122
|
for (const manifest of manifests) {
|
|
111
123
|
const closure = /* @__PURE__ */ new Set();
|
|
112
124
|
walkDependencyClosure(
|
|
@@ -116,11 +128,23 @@ function resolvePackDependencyGraph(manifests) {
|
|
|
116
128
|
closure,
|
|
117
129
|
issues
|
|
118
130
|
);
|
|
119
|
-
|
|
131
|
+
dependencyClosure[manifest.key] = [...closure].sort();
|
|
120
132
|
}
|
|
133
|
+
return dependencyClosure;
|
|
134
|
+
}
|
|
135
|
+
function resolvePackDependencyGraph(manifests) {
|
|
136
|
+
const issues = [];
|
|
137
|
+
const graph = initializeDependencyGraph(manifests);
|
|
138
|
+
linkPackDependencies(manifests, graph, issues);
|
|
139
|
+
const orderedPackKeys = topologicalPackOrder(graph);
|
|
140
|
+
recordUnresolvedDependencyCycles(orderedPackKeys, graph, issues);
|
|
121
141
|
return {
|
|
122
142
|
orderedPackKeys,
|
|
123
|
-
dependencyClosureByPack
|
|
143
|
+
dependencyClosureByPack: dependencyClosureByPack(
|
|
144
|
+
manifests,
|
|
145
|
+
graph.manifestsByKey,
|
|
146
|
+
issues
|
|
147
|
+
),
|
|
124
148
|
issues,
|
|
125
149
|
valid: issues.every((issue) => issue.severity !== "error")
|
|
126
150
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dependencyResolution.ts"],"names":[],"mappings":"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","file":"dependencyResolution.js","sourcesContent":["/**\n * Pack Dependency Resolution\n *\n * Dependency-graph validation and deterministic activation ordering.\n */\n\nimport type { AppPackManifest } from \"./contracts\";\nimport type { PackValidationIssue } from \"./manifestValidation\";\n\nexport type PackDependencyResolutionResult = {\n orderedPackKeys: string[];\n dependencyClosureByPack: Record<string, string[]>;\n issues: PackValidationIssue[];\n valid: boolean;\n};\n\nfunction toIssue(\n code: string,\n message: string,\n path: string,\n severity: \"error\" | \"warning\" = \"error\"\n): PackValidationIssue {\n return {\n code,\n severity,\n message,\n path,\n };\n}\n\nfunction buildManifestMap(\n manifests: AppPackManifest[]\n): Map<string, AppPackManifest> {\n return new Map(manifests.map((manifest) => [manifest.key, manifest]));\n}\n\nfunction walkDependencyClosure(\n manifestKey: string,\n manifestsByKey: Map<string, AppPackManifest>,\n path: string[],\n closure: Set<string>,\n issues: PackValidationIssue[]\n): void {\n const manifest = manifestsByKey.get(manifestKey);\n if (!manifest) {\n return;\n }\n\n for (const dependency of manifest.dependencies) {\n if (!manifestsByKey.has(dependency)) {\n issues.push(\n toIssue(\n \"PACK_DEPENDENCY_MISSING\",\n `Pack \"${manifestKey}\" depends on unknown pack \"${dependency}\".`,\n `dependencies:${manifestKey}`\n )\n );\n continue;\n }\n\n if (path.includes(dependency)) {\n const cycle = [...path, dependency].join(\" -> \");\n issues.push(\n toIssue(\n \"PACK_DEPENDENCY_CYCLE\",\n `Cycle detected: ${cycle}`,\n `dependencies:${manifestKey}`\n )\n );\n continue;\n }\n\n if (closure.has(dependency)) {\n continue;\n }\n\n closure.add(dependency);\n walkDependencyClosure(\n dependency,\n manifestsByKey,\n [...path, dependency],\n closure,\n issues\n );\n }\n}\n\nexport function resolvePackDependencyGraph(\n manifests: AppPackManifest[]\n): PackDependencyResolutionResult {\n const issues: PackValidationIssue[] = [];\n const manifestsByKey = buildManifestMap(manifests);\n const indegree = new Map<string, number>();\n const adjacency = new Map<string, string[]>();\n\n for (const manifest of manifests) {\n indegree.set(manifest.key, indegree.get(manifest.key) ?? 0);\n adjacency.set(manifest.key, []);\n }\n\n for (const manifest of manifests) {\n for (const dependency of manifest.dependencies) {\n if (!manifestsByKey.has(dependency)) {\n issues.push(\n toIssue(\n \"PACK_DEPENDENCY_MISSING\",\n `Pack \"${manifest.key}\" depends on unknown pack \"${dependency}\".`,\n `dependencies:${manifest.key}`\n )\n );\n continue;\n }\n\n const dependencyDependents = adjacency.get(dependency) ?? [];\n dependencyDependents.push(manifest.key);\n adjacency.set(dependency, dependencyDependents);\n\n indegree.set(manifest.key, (indegree.get(manifest.key) ?? 0) + 1);\n }\n }\n\n const queue = [...indegree.entries()]\n .filter(([, value]) => value === 0)\n .map(([packKey]) => packKey)\n .sort();\n\n const orderedPackKeys: string[] = [];\n while (queue.length > 0) {\n const nextKey = queue.shift();\n if (!nextKey) {\n break;\n }\n\n orderedPackKeys.push(nextKey);\n const dependents = adjacency.get(nextKey) ?? [];\n for (const dependent of dependents) {\n const current = indegree.get(dependent) ?? 0;\n const updated = current - 1;\n indegree.set(dependent, updated);\n if (updated === 0) {\n queue.push(dependent);\n }\n }\n queue.sort();\n }\n\n if (orderedPackKeys.length !== manifestsByKey.size) {\n const unresolved = [...indegree.entries()]\n .filter(([, value]) => value > 0)\n .map(([key]) => key)\n .sort();\n\n issues.push(\n toIssue(\n \"PACK_DEPENDENCY_CYCLE\",\n `Dependency graph is not acyclic; unresolved packs: ${unresolved.join(\", \")}`,\n \"dependencies\"\n )\n );\n }\n\n const dependencyClosureByPack: Record<string, string[]> = {};\n for (const manifest of manifests) {\n const closure = new Set<string>();\n walkDependencyClosure(\n manifest.key,\n manifestsByKey,\n [manifest.key],\n closure,\n issues\n );\n dependencyClosureByPack[manifest.key] = [...closure].sort();\n }\n\n return {\n orderedPackKeys,\n dependencyClosureByPack,\n issues,\n valid: issues.every((issue) => issue.severity !== \"error\"),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/dependencyResolution.ts"],"names":[],"mappings":"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","file":"dependencyResolution.js","sourcesContent":["// biome-ignore-all lint/style/useFilenamingConvention: Legacy public @lucern/pack-host/dependencyResolution subpath.\n/**\n * Pack Dependency Resolution\n *\n * Dependency-graph validation and deterministic activation ordering.\n */\n\nimport type { AppPackManifest } from \"./contracts\";\nimport type { PackValidationIssue } from \"./manifestValidation\";\n\nexport interface PackDependencyResolutionResult {\n dependencyClosureByPack: Record<string, string[]>;\n issues: PackValidationIssue[];\n orderedPackKeys: string[];\n valid: boolean;\n}\n\ninterface PackDependencyGraph {\n adjacency: Map<string, string[]>;\n indegree: Map<string, number>;\n manifestsByKey: Map<string, AppPackManifest>;\n}\n\nfunction toIssue(\n code: string,\n message: string,\n path: string,\n severity: \"error\" | \"warning\" = \"error\"\n): PackValidationIssue {\n return {\n code,\n severity,\n message,\n path,\n };\n}\n\nfunction buildManifestMap(\n manifests: AppPackManifest[]\n): Map<string, AppPackManifest> {\n return new Map(manifests.map((manifest) => [manifest.key, manifest]));\n}\n\nfunction initializeDependencyGraph(\n manifests: AppPackManifest[]\n): PackDependencyGraph {\n const manifestsByKey = buildManifestMap(manifests);\n const indegree = new Map<string, number>();\n const adjacency = new Map<string, string[]>();\n\n for (const manifest of manifests) {\n indegree.set(manifest.key, indegree.get(manifest.key) ?? 0);\n adjacency.set(manifest.key, []);\n }\n\n return { adjacency, indegree, manifestsByKey };\n}\n\nfunction linkPackDependency(\n manifest: AppPackManifest,\n dependency: string,\n graph: PackDependencyGraph,\n issues: PackValidationIssue[]\n): void {\n if (!graph.manifestsByKey.has(dependency)) {\n issues.push(\n toIssue(\n \"PACK_DEPENDENCY_MISSING\",\n `Pack \"${manifest.key}\" depends on unknown pack \"${dependency}\".`,\n `dependencies:${manifest.key}`\n )\n );\n return;\n }\n\n const dependencyDependents = graph.adjacency.get(dependency) ?? [];\n dependencyDependents.push(manifest.key);\n graph.adjacency.set(dependency, dependencyDependents);\n graph.indegree.set(manifest.key, (graph.indegree.get(manifest.key) ?? 0) + 1);\n}\n\nfunction linkPackDependencies(\n manifests: AppPackManifest[],\n graph: PackDependencyGraph,\n issues: PackValidationIssue[]\n): void {\n for (const manifest of manifests) {\n for (const dependency of manifest.dependencies) {\n linkPackDependency(manifest, dependency, graph, issues);\n }\n }\n}\n\nfunction topologicalPackOrder(graph: PackDependencyGraph): string[] {\n const queue = [...graph.indegree.entries()]\n .filter(([, value]) => value === 0)\n .map(([packKey]) => packKey)\n .sort();\n\n const orderedPackKeys: string[] = [];\n while (queue.length > 0) {\n const nextKey = queue.shift();\n if (!nextKey) {\n break;\n }\n\n orderedPackKeys.push(nextKey);\n const dependents = graph.adjacency.get(nextKey) ?? [];\n for (const dependent of dependents) {\n const updated = (graph.indegree.get(dependent) ?? 0) - 1;\n graph.indegree.set(dependent, updated);\n if (updated === 0) {\n queue.push(dependent);\n }\n }\n queue.sort();\n }\n\n return orderedPackKeys;\n}\n\nfunction recordUnresolvedDependencyCycles(\n orderedPackKeys: string[],\n graph: PackDependencyGraph,\n issues: PackValidationIssue[]\n): void {\n if (orderedPackKeys.length === graph.manifestsByKey.size) {\n return;\n }\n\n const unresolved = [...graph.indegree.entries()]\n .filter(([, value]) => value > 0)\n .map(([key]) => key)\n .sort();\n\n issues.push(\n toIssue(\n \"PACK_DEPENDENCY_CYCLE\",\n `Dependency graph is not acyclic; unresolved packs: ${unresolved.join(\", \")}`,\n \"dependencies\"\n )\n );\n}\n\nfunction walkDependencyClosure(\n manifestKey: string,\n manifestsByKey: Map<string, AppPackManifest>,\n path: string[],\n closure: Set<string>,\n issues: PackValidationIssue[]\n): void {\n const manifest = manifestsByKey.get(manifestKey);\n if (!manifest) {\n return;\n }\n\n for (const dependency of manifest.dependencies) {\n if (!manifestsByKey.has(dependency)) {\n issues.push(\n toIssue(\n \"PACK_DEPENDENCY_MISSING\",\n `Pack \"${manifestKey}\" depends on unknown pack \"${dependency}\".`,\n `dependencies:${manifestKey}`\n )\n );\n continue;\n }\n\n if (path.includes(dependency)) {\n const cycle = [...path, dependency].join(\" -> \");\n issues.push(\n toIssue(\n \"PACK_DEPENDENCY_CYCLE\",\n `Cycle detected: ${cycle}`,\n `dependencies:${manifestKey}`\n )\n );\n continue;\n }\n\n if (closure.has(dependency)) {\n continue;\n }\n\n closure.add(dependency);\n walkDependencyClosure(\n dependency,\n manifestsByKey,\n [...path, dependency],\n closure,\n issues\n );\n }\n}\n\nfunction dependencyClosureByPack(\n manifests: AppPackManifest[],\n manifestsByKey: Map<string, AppPackManifest>,\n issues: PackValidationIssue[]\n): Record<string, string[]> {\n const dependencyClosure: Record<string, string[]> = {};\n for (const manifest of manifests) {\n const closure = new Set<string>();\n walkDependencyClosure(\n manifest.key,\n manifestsByKey,\n [manifest.key],\n closure,\n issues\n );\n dependencyClosure[manifest.key] = [...closure].sort();\n }\n return dependencyClosure;\n}\n\nexport function resolvePackDependencyGraph(\n manifests: AppPackManifest[]\n): PackDependencyResolutionResult {\n const issues: PackValidationIssue[] = [];\n const graph = initializeDependencyGraph(manifests);\n linkPackDependencies(manifests, graph, issues);\n const orderedPackKeys = topologicalPackOrder(graph);\n recordUnresolvedDependencyCycles(orderedPackKeys, graph, issues);\n\n return {\n orderedPackKeys,\n dependencyClosureByPack: dependencyClosureByPack(\n manifests,\n graph.manifestsByKey,\n issues\n ),\n issues,\n valid: issues.every((issue) => issue.severity !== \"error\"),\n };\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { RuntimeTarget, DomainPack, DomainPackInput } from './contracts.js';
|
|
2
2
|
import { DomainPackValidationIssue } from './validation.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -12,104 +12,104 @@ import { DomainPackValidationIssue } from './validation.js';
|
|
|
12
12
|
|
|
13
13
|
declare const DOMAIN_PACK_MANIFEST_KIND: "lucern-domain-pack-manifest";
|
|
14
14
|
type DomainPackManifestFormat = "json" | "yaml";
|
|
15
|
-
|
|
15
|
+
interface DomainPackFrameworkContract {
|
|
16
16
|
frameworkId: string;
|
|
17
|
-
version: string;
|
|
18
|
-
versionConstraint?: string;
|
|
19
17
|
required?: boolean;
|
|
20
18
|
runtimeTargets?: RuntimeTarget[];
|
|
21
|
-
|
|
19
|
+
version: string;
|
|
20
|
+
versionConstraint?: string;
|
|
21
|
+
}
|
|
22
22
|
type DomainPackSchemaExtensionTarget = "artifact" | "workflow" | "gate" | "prompt" | "tool" | "install-profile" | "topic-template";
|
|
23
|
-
|
|
24
|
-
extensionId: string;
|
|
25
|
-
target: DomainPackSchemaExtensionTarget;
|
|
23
|
+
interface DomainPackSchemaExtension {
|
|
26
24
|
description: string;
|
|
27
|
-
version: string;
|
|
28
25
|
extends?: string;
|
|
26
|
+
extensionId: string;
|
|
29
27
|
schema: Record<string, unknown>;
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
28
|
+
target: DomainPackSchemaExtensionTarget;
|
|
29
|
+
version: string;
|
|
30
|
+
}
|
|
31
|
+
interface DomainPackOntologyEntityExtension {
|
|
34
32
|
description?: string;
|
|
33
|
+
label: string;
|
|
35
34
|
schema?: Record<string, unknown>;
|
|
36
35
|
subtypes?: string[];
|
|
37
|
-
};
|
|
38
|
-
type DomainPackOntologyEdgeExtension = {
|
|
39
36
|
value: string;
|
|
40
|
-
|
|
37
|
+
}
|
|
38
|
+
interface DomainPackOntologyEdgeExtension {
|
|
39
|
+
constraintSeverity?: "error" | "warning" | "informational";
|
|
41
40
|
description?: string;
|
|
41
|
+
label: string;
|
|
42
42
|
sourceTypes?: string[];
|
|
43
43
|
targetTypes?: string[];
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
extensionId: string;
|
|
48
|
-
ontologyId: string;
|
|
49
|
-
baseVersionConstraint: string;
|
|
44
|
+
value: string;
|
|
45
|
+
}
|
|
46
|
+
interface DomainPackOntologyExtension {
|
|
50
47
|
additiveOnly: boolean;
|
|
51
|
-
|
|
48
|
+
baseVersionConstraint: string;
|
|
52
49
|
edgeTypes?: DomainPackOntologyEdgeExtension[];
|
|
53
|
-
|
|
50
|
+
entityTypes?: DomainPackOntologyEntityExtension[];
|
|
51
|
+
extensionId: string;
|
|
52
|
+
ontologyId: string;
|
|
53
|
+
}
|
|
54
54
|
type DomainPackLineageMode = "root" | "remix" | "fork";
|
|
55
|
-
|
|
55
|
+
interface DomainPackLineage {
|
|
56
56
|
mode: DomainPackLineageMode;
|
|
57
|
+
notes?: string;
|
|
58
|
+
parentManifestDigest?: string;
|
|
57
59
|
parentPackId?: string;
|
|
58
60
|
parentVersion?: string;
|
|
59
|
-
parentManifestDigest?: string;
|
|
60
61
|
supersedesPackId?: string;
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
type DomainPackAuthoringMetadata = {
|
|
62
|
+
}
|
|
63
|
+
interface DomainPackAuthoringMetadata {
|
|
64
64
|
description?: string;
|
|
65
65
|
owner?: string;
|
|
66
66
|
tags?: string[];
|
|
67
|
-
}
|
|
68
|
-
|
|
67
|
+
}
|
|
68
|
+
interface DomainPackAuthoringManifest {
|
|
69
|
+
frameworks?: DomainPackFrameworkContract[];
|
|
69
70
|
kind: typeof DOMAIN_PACK_MANIFEST_KIND;
|
|
71
|
+
lineage: DomainPackLineage;
|
|
70
72
|
manifestVersion: string;
|
|
73
|
+
metadata?: DomainPackAuthoringMetadata;
|
|
74
|
+
ontologyExtensions?: DomainPackOntologyExtension[];
|
|
71
75
|
pack: DomainPack;
|
|
72
|
-
frameworks?: DomainPackFrameworkContract[];
|
|
73
76
|
schemaExtensions?: DomainPackSchemaExtension[];
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
};
|
|
78
|
-
type DomainPackAuthoringManifestInput = {
|
|
77
|
+
}
|
|
78
|
+
interface DomainPackAuthoringManifestInput {
|
|
79
|
+
frameworks?: DomainPackFrameworkContract[];
|
|
79
80
|
kind?: typeof DOMAIN_PACK_MANIFEST_KIND;
|
|
81
|
+
lineage?: DomainPackLineage;
|
|
80
82
|
manifestVersion?: string;
|
|
83
|
+
metadata?: DomainPackAuthoringMetadata;
|
|
84
|
+
ontologyExtensions?: DomainPackOntologyExtension[];
|
|
81
85
|
pack: DomainPack | DomainPackInput;
|
|
82
|
-
frameworks?: DomainPackFrameworkContract[];
|
|
83
86
|
schemaExtensions?: DomainPackSchemaExtension[];
|
|
84
|
-
|
|
85
|
-
lineage?: DomainPackLineage;
|
|
86
|
-
metadata?: DomainPackAuthoringMetadata;
|
|
87
|
-
};
|
|
87
|
+
}
|
|
88
88
|
type DomainPackAuthoringValidationIssue = DomainPackValidationIssue & {
|
|
89
89
|
source: "manifest" | "pack" | "framework" | "schema-extension" | "ontology-extension" | "lineage" | "terminology" | "parse";
|
|
90
90
|
};
|
|
91
|
-
|
|
92
|
-
topicRoots: number;
|
|
93
|
-
workflows: number;
|
|
94
|
-
gates: number;
|
|
91
|
+
interface DomainPackManifestCounts {
|
|
95
92
|
artifacts: number;
|
|
96
|
-
roles: number;
|
|
97
|
-
prompts: number;
|
|
98
|
-
tools: number;
|
|
99
|
-
setupAssets: number;
|
|
100
|
-
installProfiles: number;
|
|
101
93
|
frameworks: number;
|
|
102
|
-
|
|
94
|
+
gates: number;
|
|
95
|
+
installProfiles: number;
|
|
103
96
|
ontologyExtensions: number;
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
97
|
+
prompts: number;
|
|
98
|
+
roles: number;
|
|
99
|
+
schemaExtensions: number;
|
|
100
|
+
setupAssets: number;
|
|
101
|
+
tools: number;
|
|
102
|
+
topicRoots: number;
|
|
103
|
+
workflows: number;
|
|
104
|
+
}
|
|
105
|
+
interface DomainPackAuthoringValidationResult {
|
|
106
|
+
counts: DomainPackManifestCounts;
|
|
107
107
|
format: DomainPackManifestFormat | null;
|
|
108
|
+
issues: DomainPackAuthoringValidationIssue[];
|
|
108
109
|
manifest: DomainPackAuthoringManifest | null;
|
|
109
110
|
manifestDigest: string | null;
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
};
|
|
111
|
+
valid: boolean;
|
|
112
|
+
}
|
|
113
113
|
type DomainPackAuthoringPreview = DomainPackAuthoringValidationResult & {
|
|
114
114
|
readyToPublish: boolean;
|
|
115
115
|
canonicalJson: string | null;
|
|
@@ -117,42 +117,42 @@ type DomainPackAuthoringPreview = DomainPackAuthoringValidationResult & {
|
|
|
117
117
|
lineageSummary: string | null;
|
|
118
118
|
requiredRuntimeTargets: RuntimeTarget[];
|
|
119
119
|
};
|
|
120
|
-
|
|
121
|
-
edgeType: "remixed_from" | "supersedes";
|
|
120
|
+
interface DomainPackPublicationLineageEdge {
|
|
122
121
|
childPackId: string;
|
|
122
|
+
edgeType: "remixed_from" | "supersedes";
|
|
123
123
|
parentPackId: string;
|
|
124
124
|
parentVersion: string;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
publicationId: string;
|
|
128
|
-
packId: string;
|
|
129
|
-
version: string;
|
|
130
|
-
manifestDigest: string;
|
|
131
|
-
manifest: DomainPackAuthoringManifest;
|
|
132
|
-
lineageEdge: DomainPackPublicationLineageEdge | null;
|
|
125
|
+
}
|
|
126
|
+
interface DomainPackPublication {
|
|
133
127
|
canonicalJson: string;
|
|
134
128
|
canonicalYaml: string;
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
129
|
+
lineageEdge: DomainPackPublicationLineageEdge | null;
|
|
130
|
+
manifest: DomainPackAuthoringManifest;
|
|
131
|
+
manifestDigest: string;
|
|
132
|
+
packId: string;
|
|
133
|
+
publicationId: string;
|
|
134
|
+
version: string;
|
|
135
|
+
}
|
|
136
|
+
interface DomainPackPublishResult {
|
|
138
137
|
preview: DomainPackAuthoringPreview;
|
|
139
138
|
publication: DomainPackPublication | null;
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
139
|
+
published: boolean;
|
|
140
|
+
}
|
|
141
|
+
interface DomainPackAuthoringToolInput {
|
|
143
142
|
format?: DomainPackManifestFormat;
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
143
|
+
manifestText: string;
|
|
144
|
+
}
|
|
145
|
+
interface DomainPackAuthoringToolDefinition<Result> {
|
|
147
146
|
description: string;
|
|
148
|
-
inputSchema: Record<string, unknown>;
|
|
149
147
|
execute: (args: DomainPackAuthoringToolInput) => Result;
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
148
|
+
inputSchema: Record<string, unknown>;
|
|
149
|
+
name: "validate_domain_pack_manifest" | "preview_domain_pack_manifest" | "publish_domain_pack_manifest";
|
|
150
|
+
}
|
|
151
|
+
interface DomainPackAuthoringToolset {
|
|
153
152
|
preview: DomainPackAuthoringToolDefinition<DomainPackAuthoringPreview>;
|
|
154
153
|
publish: DomainPackAuthoringToolDefinition<DomainPackPublishResult>;
|
|
155
|
-
|
|
154
|
+
validate: DomainPackAuthoringToolDefinition<DomainPackAuthoringValidationResult>;
|
|
155
|
+
}
|
|
156
156
|
declare function defineDomainPackAuthoringManifest(input: DomainPackAuthoringManifestInput): DomainPackAuthoringManifest;
|
|
157
157
|
declare function countManifestArtifacts(manifest: DomainPackAuthoringManifest | null): DomainPackManifestCounts;
|
|
158
158
|
declare function serializeDomainPackAuthoringManifest(manifest: DomainPackAuthoringManifest, format?: DomainPackManifestFormat): string;
|
|
@@ -63,12 +63,13 @@ function defineDomainPack(input) {
|
|
|
63
63
|
// src/domain-pack/authoring.core.ts
|
|
64
64
|
var DOMAIN_PACK_MANIFEST_KIND = "lucern-domain-pack-manifest";
|
|
65
65
|
var CURRENT_MANIFEST_VERSION = "1.0.0";
|
|
66
|
+
var YAML_NUMERIC_SCALAR = /^-?\d+(?:\.\d+)?$/;
|
|
66
67
|
function isPlainObject(value) {
|
|
67
68
|
return typeof value === "object" && value !== null && !Array.isArray(value) && Object.getPrototypeOf(value) === Object.prototype;
|
|
68
69
|
}
|
|
69
70
|
function dedupeStrings2(values) {
|
|
70
71
|
if (!values) {
|
|
71
|
-
return
|
|
72
|
+
return;
|
|
72
73
|
}
|
|
73
74
|
return Array.from(
|
|
74
75
|
new Set(values.map((value) => value.trim()).filter((value) => value.length))
|
|
@@ -79,7 +80,7 @@ function normalizeRuntimeTargets2(values) {
|
|
|
79
80
|
}
|
|
80
81
|
function normalizeFrameworks(frameworks) {
|
|
81
82
|
if (!frameworks) {
|
|
82
|
-
return
|
|
83
|
+
return;
|
|
83
84
|
}
|
|
84
85
|
return frameworks.map((framework) => ({
|
|
85
86
|
...framework,
|
|
@@ -91,7 +92,7 @@ function normalizeFrameworks(frameworks) {
|
|
|
91
92
|
}
|
|
92
93
|
function normalizeSchemaExtensions(extensions) {
|
|
93
94
|
if (!extensions) {
|
|
94
|
-
return
|
|
95
|
+
return;
|
|
95
96
|
}
|
|
96
97
|
return extensions.map((extension) => ({
|
|
97
98
|
...extension,
|
|
@@ -104,7 +105,7 @@ function normalizeSchemaExtensions(extensions) {
|
|
|
104
105
|
}
|
|
105
106
|
function normalizeOntologyExtensions(extensions) {
|
|
106
107
|
if (!extensions) {
|
|
107
|
-
return
|
|
108
|
+
return;
|
|
108
109
|
}
|
|
109
110
|
return extensions.map((extension) => ({
|
|
110
111
|
...extension,
|
|
@@ -143,7 +144,7 @@ function normalizeLineage(lineage) {
|
|
|
143
144
|
}
|
|
144
145
|
function normalizeMetadata(metadata) {
|
|
145
146
|
if (!metadata) {
|
|
146
|
-
return
|
|
147
|
+
return;
|
|
147
148
|
}
|
|
148
149
|
return {
|
|
149
150
|
description: metadata.description?.trim(),
|
|
@@ -271,7 +272,7 @@ function parseYamlScalar(raw) {
|
|
|
271
272
|
if (value === "false") {
|
|
272
273
|
return false;
|
|
273
274
|
}
|
|
274
|
-
if (
|
|
275
|
+
if (YAML_NUMERIC_SCALAR.test(value)) {
|
|
275
276
|
return Number(value);
|
|
276
277
|
}
|
|
277
278
|
if (value.startsWith('"') && value.endsWith('"') || value.startsWith("'") && value.endsWith("'")) {
|