@lucern/pack-host 1.0.29 → 1.0.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/contracts.d.ts +35 -35
  2. package/dist/contracts.js.map +1 -1
  3. package/dist/dependencyResolution.d.ts +3 -3
  4. package/dist/dependencyResolution.js +83 -59
  5. package/dist/dependencyResolution.js.map +1 -1
  6. package/dist/domain-pack/authoring.core.d.ts +82 -82
  7. package/dist/domain-pack/authoring.core.js +7 -6
  8. package/dist/domain-pack/authoring.core.js.map +1 -1
  9. package/dist/domain-pack/authoring.js +400 -281
  10. package/dist/domain-pack/authoring.js.map +1 -1
  11. package/dist/domain-pack/authoring.validation.js +400 -281
  12. package/dist/domain-pack/authoring.validation.js.map +1 -1
  13. package/dist/domain-pack/contracts.d.ts +95 -95
  14. package/dist/domain-pack/contracts.js.map +1 -1
  15. package/dist/domain-pack/index.js +416 -285
  16. package/dist/domain-pack/index.js.map +1 -1
  17. package/dist/domain-pack/ontology/software-entities-v1.d.ts +7 -7
  18. package/dist/domain-pack/ontology/software-entities-v1.js.map +1 -1
  19. package/dist/domain-pack/packs/developer-reasoning.js +7 -1
  20. package/dist/domain-pack/packs/developer-reasoning.js.map +1 -1
  21. package/dist/domain-pack/packs/engineering-accelerator.js.map +1 -1
  22. package/dist/domain-pack/packs/index.js +333 -239
  23. package/dist/domain-pack/packs/index.js.map +1 -1
  24. package/dist/domain-pack/shaping.d.ts +15 -15
  25. package/dist/domain-pack/shaping.js +326 -238
  26. package/dist/domain-pack/shaping.js.map +1 -1
  27. package/dist/domain-pack/validation.d.ts +6 -6
  28. package/dist/domain-pack/validation.js +318 -236
  29. package/dist/domain-pack/validation.js.map +1 -1
  30. package/dist/domain-pack.js +416 -285
  31. package/dist/domain-pack.js.map +1 -1
  32. package/dist/index.d.ts +6 -6
  33. package/dist/index.js +3793 -3643
  34. package/dist/index.js.map +1 -1
  35. package/dist/lifecycle.d.ts +9 -9
  36. package/dist/lifecycle.js.map +1 -1
  37. package/dist/manifestValidation.d.ts +9 -9
  38. package/dist/manifestValidation.js.map +1 -1
  39. package/dist/manifests/chat-v1.js +1 -1
  40. package/dist/manifests/chat-v1.js.map +1 -1
  41. package/dist/manifests/deals-v1.js +1 -6
  42. package/dist/manifests/deals-v1.js.map +1 -1
  43. package/dist/manifests/decisions-v1.js.map +1 -1
  44. package/dist/manifests/documents-v1.js.map +1 -1
  45. package/dist/manifests/epistemic-algorithms-v1.js.map +1 -1
  46. package/dist/manifests/graph-visualization-v1.js.map +1 -1
  47. package/dist/manifests/index.js +2 -7
  48. package/dist/manifests/index.js.map +1 -1
  49. package/dist/manifests/news-v1.js.map +1 -1
  50. package/dist/manifests/philosophy-mode-v1.js.map +1 -1
  51. package/dist/manifests/sprints-v1.js.map +1 -1
  52. package/dist/manifests/task-management-v1.js.map +1 -1
  53. package/dist/manifests/team-analysis-v1.js.map +1 -1
  54. package/dist/manifests/themes-v1.js.map +1 -1
  55. package/dist/manifests/user-profiles-v1.js.map +1 -1
  56. package/dist/manifests.js +2 -7
  57. package/dist/manifests.js.map +1 -1
  58. package/dist/namespacePolicy.d.ts +6 -6
  59. package/dist/namespacePolicy.js.map +1 -1
  60. package/dist/proof-attestation.json +1 -1
  61. package/dist/registry.js +85 -66
  62. package/dist/registry.js.map +1 -1
  63. package/dist/runtime.d.ts +6 -6
  64. package/dist/runtime.js +83 -59
  65. package/dist/runtime.js.map +1 -1
  66. package/dist/serviceContracts.d.ts +4 -4
  67. package/dist/serviceContracts.js.map +1 -1
  68. package/package.json +1 -1
@@ -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
- type RouteNamespace = {
16
- web: string[];
15
+ interface RouteNamespace {
17
16
  api: string[];
18
- };
19
- type SurfaceOwnership = {
17
+ web: string[];
18
+ }
19
+ interface SurfaceOwnership {
20
20
  components: string[];
21
21
  convex: string[];
22
22
  tools: string[];
23
- };
24
- type PolicyRule = {
25
- resource: PolicyResource;
23
+ }
24
+ interface PolicyRule {
26
25
  actions: PolicyAction[];
27
26
  notes?: string;
28
- };
29
- type PolicyProfile = {
27
+ resource: PolicyResource;
28
+ }
29
+ interface PolicyProfile {
30
30
  audiences: PackAudience[];
31
31
  rules: PolicyRule[];
32
- };
33
- type DataContract = {
34
- requiredNodeTypes: string[];
32
+ }
33
+ interface DataContract {
34
+ projectionBehavior: ProjectionBehavior;
35
35
  requiredEdgeTypes: string[];
36
+ requiredNodeTypes: string[];
36
37
  requiredTables: string[];
37
- projectionBehavior: ProjectionBehavior;
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
- type PackTestSuite = {
43
+ workflows: string[];
44
+ }
45
+ interface PackTestSuite {
46
+ contract: string[];
46
47
  parity: string[];
47
48
  policy: string[];
48
- contract: string[];
49
- };
50
- type SharedServiceIntegration = {
51
- service: SharedService;
52
- mode: SharedServiceMode;
49
+ }
50
+ interface SharedServiceIntegration {
53
51
  contracts: string[];
54
- };
55
- type AppPackManifest = {
56
- key: string;
57
- name: string;
58
- version: string;
59
- lifecycle: PackLifecycle;
52
+ mode: SharedServiceMode;
53
+ service: SharedService;
54
+ }
55
+ interface AppPackManifest {
56
+ capabilityFlags: string[];
60
57
  category: PackCategory;
61
- description: string;
58
+ dataContract: DataContract;
62
59
  dependencies: string[];
63
- capabilityFlags: string[];
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
- sharedServices: SharedServiceIntegration[];
71
- };
70
+ version: string;
71
+ }
72
72
  type AppPackManifestInput = Omit<AppPackManifest, "sharedServices"> & {
73
73
  sharedServices?: SharedServiceIntegration[];
74
74
  };
@@ -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 type RouteNamespace = {\n web: string[];\n api: string[];\n};\n\nexport type SurfaceOwnership = {\n components: string[];\n convex: string[];\n tools: string[];\n};\n\nexport type PolicyRule = {\n resource: PolicyResource;\n actions: PolicyAction[];\n notes?: string;\n};\n\nexport type PolicyProfile = {\n audiences: PackAudience[];\n rules: PolicyRule[];\n};\n\nexport type DataContract = {\n requiredNodeTypes: string[];\n requiredEdgeTypes: string[];\n requiredTables: string[];\n projectionBehavior: ProjectionBehavior;\n};\n\nexport type TemplateAssets = {\n workflows: string[];\n prompts: string[];\n reports: string[];\n uiLabels: string[];\n};\n\nexport type PackTestSuite = {\n parity: string[];\n policy: string[];\n contract: string[];\n};\n\nexport type SharedServiceIntegration = {\n service: SharedService;\n mode: SharedServiceMode;\n contracts: string[];\n};\n\nexport type AppPackManifest = {\n key: string;\n name: string;\n version: string;\n lifecycle: PackLifecycle;\n category: PackCategory;\n description: string;\n dependencies: string[];\n capabilityFlags: string[];\n routeNamespace: RouteNamespace;\n surfaces: SurfaceOwnership;\n policyProfile: PolicyProfile;\n dataContract: DataContract;\n templates: TemplateAssets;\n testSuite: PackTestSuite;\n sharedServices: SharedServiceIntegration[];\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"]}
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
- type PackDependencyResolutionResult = {
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 resolvePackDependencyGraph(manifests) {
54
- const issues = [];
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
- dependencyClosureByPack[manifest.key] = [...closure].sort();
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":";AAgBA,SAAS,OAAA,CACP,IAAA,EACA,OAAA,EACA,IAAA,EACA,WAAgC,OAAA,EACX;AACrB,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,iBACP,SAAA,EAC8B;AAC9B,EAAA,OAAO,IAAI,GAAA,CAAI,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,KAAa,CAAC,QAAA,CAAS,GAAA,EAAK,QAAQ,CAAC,CAAC,CAAA;AACtE;AAEA,SAAS,qBAAA,CACP,WAAA,EACA,cAAA,EACA,IAAA,EACA,SACA,MAAA,EACM;AACN,EAAA,MAAM,QAAA,GAAW,cAAA,CAAe,GAAA,CAAI,WAAW,CAAA;AAC/C,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,UAAA,IAAc,SAAS,YAAA,EAAc;AAC9C,IAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,UAAU,CAAA,EAAG;AACnC,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,OAAA;AAAA,UACE,yBAAA;AAAA,UACA,CAAA,MAAA,EAAS,WAAW,CAAA,2BAAA,EAA8B,UAAU,CAAA,EAAA,CAAA;AAAA,UAC5D,gBAAgB,WAAW,CAAA;AAAA;AAC7B,OACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,EAAG;AAC7B,MAAA,MAAM,QAAQ,CAAC,GAAG,MAAM,UAAU,CAAA,CAAE,KAAK,MAAM,CAAA;AAC/C,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,OAAA;AAAA,UACE,uBAAA;AAAA,UACA,mBAAmB,KAAK,CAAA,CAAA;AAAA,UACxB,gBAAgB,WAAW,CAAA;AAAA;AAC7B,OACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA,EAAG;AAC3B,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,IAAI,UAAU,CAAA;AACtB,IAAA,qBAAA;AAAA,MACE,UAAA;AAAA,MACA,cAAA;AAAA,MACA,CAAC,GAAG,IAAA,EAAM,UAAU,CAAA;AAAA,MACpB,OAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;AAEO,SAAS,2BACd,SAAA,EACgC;AAChC,EAAA,MAAM,SAAgC,EAAC;AACvC,EAAA,MAAM,cAAA,GAAiB,iBAAiB,SAAS,CAAA;AACjD,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAsB;AAE5C,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,QAAA,CAAS,GAAA,CAAI,SAAS,GAAA,EAAK,QAAA,CAAS,IAAI,QAAA,CAAS,GAAG,KAAK,CAAC,CAAA;AAC1D,IAAA,SAAA,CAAU,GAAA,CAAI,QAAA,CAAS,GAAA,EAAK,EAAE,CAAA;AAAA,EAChC;AAEA,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,KAAA,MAAW,UAAA,IAAc,SAAS,YAAA,EAAc;AAC9C,MAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,UAAU,CAAA,EAAG;AACnC,QAAA,MAAA,CAAO,IAAA;AAAA,UACL,OAAA;AAAA,YACE,yBAAA;AAAA,YACA,CAAA,MAAA,EAAS,QAAA,CAAS,GAAG,CAAA,2BAAA,EAA8B,UAAU,CAAA,EAAA,CAAA;AAAA,YAC7D,CAAA,aAAA,EAAgB,SAAS,GAAG,CAAA;AAAA;AAC9B,SACF;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,oBAAA,GAAuB,SAAA,CAAU,GAAA,CAAI,UAAU,KAAK,EAAC;AAC3D,MAAA,oBAAA,CAAqB,IAAA,CAAK,SAAS,GAAG,CAAA;AACtC,MAAA,SAAA,CAAU,GAAA,CAAI,YAAY,oBAAoB,CAAA;AAE9C,MAAA,QAAA,CAAS,GAAA,CAAI,SAAS,GAAA,EAAA,CAAM,QAAA,CAAS,IAAI,QAAA,CAAS,GAAG,CAAA,IAAK,CAAA,IAAK,CAAC,CAAA;AAAA,IAClE;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,CAAC,GAAG,QAAA,CAAS,SAAS,CAAA,CACjC,MAAA,CAAO,CAAC,GAAG,KAAK,CAAA,KAAM,KAAA,KAAU,CAAC,CAAA,CACjC,GAAA,CAAI,CAAC,CAAC,OAAO,CAAA,KAAM,OAAO,CAAA,CAC1B,IAAA,EAAK;AAER,EAAA,MAAM,kBAA4B,EAAC;AACnC,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,OAAA,GAAU,MAAM,KAAA,EAAM;AAC5B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA;AAAA,IACF;AAEA,IAAA,eAAA,CAAgB,KAAK,OAAO,CAAA;AAC5B,IAAA,MAAM,UAAA,GAAa,SAAA,CAAU,GAAA,CAAI,OAAO,KAAK,EAAC;AAC9C,IAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA,IAAK,CAAA;AAC3C,MAAA,MAAM,UAAU,OAAA,GAAU,CAAA;AAC1B,MAAA,QAAA,CAAS,GAAA,CAAI,WAAW,OAAO,CAAA;AAC/B,MAAA,IAAI,YAAY,CAAA,EAAG;AACjB,QAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,MACtB;AAAA,IACF;AACA,IAAA,KAAA,CAAM,IAAA,EAAK;AAAA,EACb;AAEA,EAAA,IAAI,eAAA,CAAgB,MAAA,KAAW,cAAA,CAAe,IAAA,EAAM;AAClD,IAAA,MAAM,UAAA,GAAa,CAAC,GAAG,QAAA,CAAS,SAAS,CAAA,CACtC,MAAA,CAAO,CAAC,GAAG,KAAK,CAAA,KAAM,KAAA,GAAQ,CAAC,CAAA,CAC/B,GAAA,CAAI,CAAC,CAAC,GAAG,CAAA,KAAM,GAAG,CAAA,CAClB,IAAA,EAAK;AAER,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,OAAA;AAAA,QACE,uBAAA;AAAA,QACA,CAAA,mDAAA,EAAsD,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,QAC3E;AAAA;AACF,KACF;AAAA,EACF;AAEA,EAAA,MAAM,0BAAoD,EAAC;AAC3D,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,IAAA,qBAAA;AAAA,MACE,QAAA,CAAS,GAAA;AAAA,MACT,cAAA;AAAA,MACA,CAAC,SAAS,GAAG,CAAA;AAAA,MACb,OAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,uBAAA,CAAwB,SAAS,GAAG,CAAA,GAAI,CAAC,GAAG,OAAO,EAAE,IAAA,EAAK;AAAA,EAC5D;AAEA,EAAA,OAAO;AAAA,IACL,eAAA;AAAA,IACA,uBAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAO,MAAA,CAAO,KAAA,CAAM,CAAC,KAAA,KAAU,KAAA,CAAM,aAAa,OAAO;AAAA,GAC3D;AACF","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 { DomainPack, RuntimeTarget, DomainPackInput } from './contracts.js';
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
- type DomainPackFrameworkContract = {
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
- type DomainPackSchemaExtension = {
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
- type DomainPackOntologyEntityExtension = {
32
- value: string;
33
- label: string;
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
- label: string;
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
- constraintSeverity?: "error" | "warning" | "informational";
45
- };
46
- type DomainPackOntologyExtension = {
47
- extensionId: string;
48
- ontologyId: string;
49
- baseVersionConstraint: string;
44
+ value: string;
45
+ }
46
+ interface DomainPackOntologyExtension {
50
47
  additiveOnly: boolean;
51
- entityTypes?: DomainPackOntologyEntityExtension[];
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
- type DomainPackLineage = {
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
- notes?: string;
62
- };
63
- type DomainPackAuthoringMetadata = {
62
+ }
63
+ interface DomainPackAuthoringMetadata {
64
64
  description?: string;
65
65
  owner?: string;
66
66
  tags?: string[];
67
- };
68
- type DomainPackAuthoringManifest = {
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
- ontologyExtensions?: DomainPackOntologyExtension[];
75
- lineage: DomainPackLineage;
76
- metadata?: DomainPackAuthoringMetadata;
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
- ontologyExtensions?: DomainPackOntologyExtension[];
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
- type DomainPackManifestCounts = {
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
- schemaExtensions: number;
94
+ gates: number;
95
+ installProfiles: number;
103
96
  ontologyExtensions: number;
104
- };
105
- type DomainPackAuthoringValidationResult = {
106
- valid: boolean;
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
- issues: DomainPackAuthoringValidationIssue[];
111
- counts: DomainPackManifestCounts;
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
- type DomainPackPublicationLineageEdge = {
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
- type DomainPackPublication = {
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
- type DomainPackPublishResult = {
137
- published: boolean;
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
- type DomainPackAuthoringToolInput = {
142
- manifestText: string;
139
+ published: boolean;
140
+ }
141
+ interface DomainPackAuthoringToolInput {
143
142
  format?: DomainPackManifestFormat;
144
- };
145
- type DomainPackAuthoringToolDefinition<Result> = {
146
- name: "validate_domain_pack_manifest" | "preview_domain_pack_manifest" | "publish_domain_pack_manifest";
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
- type DomainPackAuthoringToolset = {
152
- validate: DomainPackAuthoringToolDefinition<DomainPackAuthoringValidationResult>;
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 void 0;
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 void 0;
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 void 0;
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 void 0;
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 void 0;
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 (/^-?\d+(?:\.\d+)?$/.test(value)) {
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("'")) {