@lucern/pack-host 1.0.0 → 1.0.2
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/domain-pack/authoring.core.d.ts +161 -0
- package/dist/domain-pack/authoring.core.js +411 -0
- package/dist/domain-pack/authoring.core.js.map +1 -0
- package/dist/domain-pack/authoring.d.ts +12 -170
- package/dist/domain-pack/authoring.js +1155 -1098
- package/dist/domain-pack/authoring.js.map +1 -1
- package/dist/domain-pack/authoring.validation.d.ts +28 -0
- package/dist/domain-pack/authoring.validation.js +1944 -0
- package/dist/domain-pack/authoring.validation.js.map +1 -0
- package/dist/domain-pack/index.d.ts +2 -1
- package/dist/domain-pack/index.js +1979 -1917
- package/dist/domain-pack/index.js.map +1 -1
- package/dist/domain-pack/packs/engineering-accelerator-tail.d.ts +256 -0
- package/dist/domain-pack/packs/engineering-accelerator-tail.js +716 -0
- package/dist/domain-pack/packs/engineering-accelerator-tail.js.map +1 -0
- package/dist/domain-pack/packs/engineering-accelerator.js +790 -785
- package/dist/domain-pack/packs/engineering-accelerator.js.map +1 -1
- package/dist/domain-pack/packs/index.js +790 -785
- package/dist/domain-pack/packs/index.js.map +1 -1
- package/dist/domain-pack.d.ts +2 -1
- package/dist/domain-pack.js +1979 -1917
- package/dist/domain-pack.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +1843 -1661
- package/dist/index.js.map +1 -1
- package/dist/manifests/chat-v1.js +17 -6
- package/dist/manifests/chat-v1.js.map +1 -1
- package/dist/manifests/deals-v1.js +10 -7
- package/dist/manifests/deals-v1.js.map +1 -1
- package/dist/manifests/decisions-v1.js +11 -4
- package/dist/manifests/decisions-v1.js.map +1 -1
- package/dist/manifests/documents-v1.js +12 -12
- package/dist/manifests/documents-v1.js.map +1 -1
- package/dist/manifests/epistemic-algorithms-v1.js +11 -6
- package/dist/manifests/epistemic-algorithms-v1.js.map +1 -1
- package/dist/manifests/graph-visualization-v1.js +9 -5
- package/dist/manifests/graph-visualization-v1.js.map +1 -1
- package/dist/manifests/index.d.ts +1 -0
- package/dist/manifests/index.js +230 -110
- package/dist/manifests/index.js.map +1 -1
- package/dist/manifests/news-v1.js +12 -13
- package/dist/manifests/news-v1.js.map +1 -1
- package/dist/manifests/philosophy-mode-v1.js +10 -12
- package/dist/manifests/philosophy-mode-v1.js.map +1 -1
- package/dist/manifests/sprints-v1.d.ts +10 -0
- package/dist/manifests/sprints-v1.js +106 -0
- package/dist/manifests/sprints-v1.js.map +1 -0
- package/dist/manifests/task-management-v1.js +18 -6
- package/dist/manifests/task-management-v1.js.map +1 -1
- package/dist/manifests/team-analysis-v1.js +12 -9
- package/dist/manifests/team-analysis-v1.js.map +1 -1
- package/dist/manifests/themes-v1.js +12 -16
- package/dist/manifests/themes-v1.js.map +1 -1
- package/dist/manifests/user-profiles-v1.js +9 -13
- package/dist/manifests/user-profiles-v1.js.map +1 -1
- package/dist/manifests.d.ts +1 -0
- package/dist/manifests.js +230 -110
- package/dist/manifests.js.map +1 -1
- package/dist/proof-attestation.json +1 -1
- package/dist/registry.js +229 -109
- package/dist/registry.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { DomainPack, RuntimeTarget, DomainPackInput } from './contracts.js';
|
|
2
|
+
import { DomainPackValidationIssue } from './validation.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Domain Pack Authoring Kit
|
|
6
|
+
*
|
|
7
|
+
* Config-first authoring surface for tenant-authored domain packs. This layer
|
|
8
|
+
* wraps the internal DomainPack contract in a stable manifest envelope with
|
|
9
|
+
* framework versioning, schema and ontology extension contracts, remix/fork
|
|
10
|
+
* lineage, and tool-shaped validate/preview/publish handlers.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
declare const DOMAIN_PACK_MANIFEST_KIND: "lucern-domain-pack-manifest";
|
|
14
|
+
type DomainPackManifestFormat = "json" | "yaml";
|
|
15
|
+
type DomainPackFrameworkContract = {
|
|
16
|
+
frameworkId: string;
|
|
17
|
+
version: string;
|
|
18
|
+
versionConstraint?: string;
|
|
19
|
+
required?: boolean;
|
|
20
|
+
runtimeTargets?: RuntimeTarget[];
|
|
21
|
+
};
|
|
22
|
+
type DomainPackSchemaExtensionTarget = "artifact" | "workflow" | "gate" | "prompt" | "tool" | "install-profile" | "topic-template";
|
|
23
|
+
type DomainPackSchemaExtension = {
|
|
24
|
+
extensionId: string;
|
|
25
|
+
target: DomainPackSchemaExtensionTarget;
|
|
26
|
+
description: string;
|
|
27
|
+
version: string;
|
|
28
|
+
extends?: string;
|
|
29
|
+
schema: Record<string, unknown>;
|
|
30
|
+
};
|
|
31
|
+
type DomainPackOntologyEntityExtension = {
|
|
32
|
+
value: string;
|
|
33
|
+
label: string;
|
|
34
|
+
description?: string;
|
|
35
|
+
schema?: Record<string, unknown>;
|
|
36
|
+
subtypes?: string[];
|
|
37
|
+
};
|
|
38
|
+
type DomainPackOntologyEdgeExtension = {
|
|
39
|
+
value: string;
|
|
40
|
+
label: string;
|
|
41
|
+
description?: string;
|
|
42
|
+
sourceTypes?: string[];
|
|
43
|
+
targetTypes?: string[];
|
|
44
|
+
constraintSeverity?: "error" | "warning" | "informational";
|
|
45
|
+
};
|
|
46
|
+
type DomainPackOntologyExtension = {
|
|
47
|
+
extensionId: string;
|
|
48
|
+
ontologyId: string;
|
|
49
|
+
baseVersionConstraint: string;
|
|
50
|
+
additiveOnly: boolean;
|
|
51
|
+
entityTypes?: DomainPackOntologyEntityExtension[];
|
|
52
|
+
edgeTypes?: DomainPackOntologyEdgeExtension[];
|
|
53
|
+
};
|
|
54
|
+
type DomainPackLineageMode = "root" | "remix" | "fork";
|
|
55
|
+
type DomainPackLineage = {
|
|
56
|
+
mode: DomainPackLineageMode;
|
|
57
|
+
parentPackId?: string;
|
|
58
|
+
parentVersion?: string;
|
|
59
|
+
parentManifestDigest?: string;
|
|
60
|
+
supersedesPackId?: string;
|
|
61
|
+
notes?: string;
|
|
62
|
+
};
|
|
63
|
+
type DomainPackAuthoringMetadata = {
|
|
64
|
+
description?: string;
|
|
65
|
+
owner?: string;
|
|
66
|
+
tags?: string[];
|
|
67
|
+
};
|
|
68
|
+
type DomainPackAuthoringManifest = {
|
|
69
|
+
kind: typeof DOMAIN_PACK_MANIFEST_KIND;
|
|
70
|
+
manifestVersion: string;
|
|
71
|
+
pack: DomainPack;
|
|
72
|
+
frameworks?: DomainPackFrameworkContract[];
|
|
73
|
+
schemaExtensions?: DomainPackSchemaExtension[];
|
|
74
|
+
ontologyExtensions?: DomainPackOntologyExtension[];
|
|
75
|
+
lineage: DomainPackLineage;
|
|
76
|
+
metadata?: DomainPackAuthoringMetadata;
|
|
77
|
+
};
|
|
78
|
+
type DomainPackAuthoringManifestInput = {
|
|
79
|
+
kind?: typeof DOMAIN_PACK_MANIFEST_KIND;
|
|
80
|
+
manifestVersion?: string;
|
|
81
|
+
pack: DomainPack | DomainPackInput;
|
|
82
|
+
frameworks?: DomainPackFrameworkContract[];
|
|
83
|
+
schemaExtensions?: DomainPackSchemaExtension[];
|
|
84
|
+
ontologyExtensions?: DomainPackOntologyExtension[];
|
|
85
|
+
lineage?: DomainPackLineage;
|
|
86
|
+
metadata?: DomainPackAuthoringMetadata;
|
|
87
|
+
};
|
|
88
|
+
type DomainPackAuthoringValidationIssue = DomainPackValidationIssue & {
|
|
89
|
+
source: "manifest" | "pack" | "framework" | "schema-extension" | "ontology-extension" | "lineage" | "terminology" | "parse";
|
|
90
|
+
};
|
|
91
|
+
type DomainPackManifestCounts = {
|
|
92
|
+
topicRoots: number;
|
|
93
|
+
workflows: number;
|
|
94
|
+
gates: number;
|
|
95
|
+
artifacts: number;
|
|
96
|
+
roles: number;
|
|
97
|
+
prompts: number;
|
|
98
|
+
tools: number;
|
|
99
|
+
setupAssets: number;
|
|
100
|
+
installProfiles: number;
|
|
101
|
+
frameworks: number;
|
|
102
|
+
schemaExtensions: number;
|
|
103
|
+
ontologyExtensions: number;
|
|
104
|
+
};
|
|
105
|
+
type DomainPackAuthoringValidationResult = {
|
|
106
|
+
valid: boolean;
|
|
107
|
+
format: DomainPackManifestFormat | null;
|
|
108
|
+
manifest: DomainPackAuthoringManifest | null;
|
|
109
|
+
manifestDigest: string | null;
|
|
110
|
+
issues: DomainPackAuthoringValidationIssue[];
|
|
111
|
+
counts: DomainPackManifestCounts;
|
|
112
|
+
};
|
|
113
|
+
type DomainPackAuthoringPreview = DomainPackAuthoringValidationResult & {
|
|
114
|
+
readyToPublish: boolean;
|
|
115
|
+
canonicalJson: string | null;
|
|
116
|
+
canonicalYaml: string | null;
|
|
117
|
+
lineageSummary: string | null;
|
|
118
|
+
requiredRuntimeTargets: RuntimeTarget[];
|
|
119
|
+
};
|
|
120
|
+
type DomainPackPublicationLineageEdge = {
|
|
121
|
+
edgeType: "remixed_from" | "supersedes";
|
|
122
|
+
childPackId: string;
|
|
123
|
+
parentPackId: string;
|
|
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;
|
|
133
|
+
canonicalJson: string;
|
|
134
|
+
canonicalYaml: string;
|
|
135
|
+
};
|
|
136
|
+
type DomainPackPublishResult = {
|
|
137
|
+
published: boolean;
|
|
138
|
+
preview: DomainPackAuthoringPreview;
|
|
139
|
+
publication: DomainPackPublication | null;
|
|
140
|
+
};
|
|
141
|
+
type DomainPackAuthoringToolInput = {
|
|
142
|
+
manifestText: string;
|
|
143
|
+
format?: DomainPackManifestFormat;
|
|
144
|
+
};
|
|
145
|
+
type DomainPackAuthoringToolDefinition<Result> = {
|
|
146
|
+
name: "validate_domain_pack_manifest" | "preview_domain_pack_manifest" | "publish_domain_pack_manifest";
|
|
147
|
+
description: string;
|
|
148
|
+
inputSchema: Record<string, unknown>;
|
|
149
|
+
execute: (args: DomainPackAuthoringToolInput) => Result;
|
|
150
|
+
};
|
|
151
|
+
type DomainPackAuthoringToolset = {
|
|
152
|
+
validate: DomainPackAuthoringToolDefinition<DomainPackAuthoringValidationResult>;
|
|
153
|
+
preview: DomainPackAuthoringToolDefinition<DomainPackAuthoringPreview>;
|
|
154
|
+
publish: DomainPackAuthoringToolDefinition<DomainPackPublishResult>;
|
|
155
|
+
};
|
|
156
|
+
declare function defineDomainPackAuthoringManifest(input: DomainPackAuthoringManifestInput): DomainPackAuthoringManifest;
|
|
157
|
+
declare function countManifestArtifacts(manifest: DomainPackAuthoringManifest | null): DomainPackManifestCounts;
|
|
158
|
+
declare function serializeDomainPackAuthoringManifest(manifest: DomainPackAuthoringManifest, format?: DomainPackManifestFormat): string;
|
|
159
|
+
declare function parseDomainPackAuthoringManifest(source: string, format?: DomainPackManifestFormat): DomainPackAuthoringManifest;
|
|
160
|
+
|
|
161
|
+
export { DOMAIN_PACK_MANIFEST_KIND, type DomainPackAuthoringManifest, type DomainPackAuthoringManifestInput, type DomainPackAuthoringMetadata, type DomainPackAuthoringPreview, type DomainPackAuthoringToolDefinition, type DomainPackAuthoringToolInput, type DomainPackAuthoringToolset, type DomainPackAuthoringValidationIssue, type DomainPackAuthoringValidationResult, type DomainPackFrameworkContract, type DomainPackLineage, type DomainPackLineageMode, type DomainPackManifestCounts, type DomainPackManifestFormat, type DomainPackOntologyEdgeExtension, type DomainPackOntologyEntityExtension, type DomainPackOntologyExtension, type DomainPackPublication, type DomainPackPublicationLineageEdge, type DomainPackPublishResult, type DomainPackSchemaExtension, type DomainPackSchemaExtensionTarget, RuntimeTarget, countManifestArtifacts, defineDomainPackAuthoringManifest, parseDomainPackAuthoringManifest, serializeDomainPackAuthoringManifest };
|
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
// src/domain-pack/contracts.ts
|
|
2
|
+
function dedupeStrings(values) {
|
|
3
|
+
return Array.from(
|
|
4
|
+
new Set(values.map((v) => v.trim()).filter((v) => v.length > 0))
|
|
5
|
+
);
|
|
6
|
+
}
|
|
7
|
+
function normalizeRuntimeTargets(values) {
|
|
8
|
+
return values ? dedupeStrings(values) : void 0;
|
|
9
|
+
}
|
|
10
|
+
function normalizeOntologyBinding(binding) {
|
|
11
|
+
return {
|
|
12
|
+
...binding,
|
|
13
|
+
requiredEntityTypes: binding.requiredEntityTypes ? dedupeStrings(binding.requiredEntityTypes) : void 0,
|
|
14
|
+
requiredEdgeTypes: binding.requiredEdgeTypes ? dedupeStrings(binding.requiredEdgeTypes) : void 0
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function normalizeOperatingSystem(layer) {
|
|
18
|
+
if (!layer) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
prompts: layer.prompts?.map((prompt) => ({
|
|
23
|
+
...prompt,
|
|
24
|
+
runtimeTargets: normalizeRuntimeTargets(prompt.runtimeTargets)
|
|
25
|
+
})),
|
|
26
|
+
tools: layer.tools?.map((tool) => ({
|
|
27
|
+
...tool,
|
|
28
|
+
runtimeTargets: normalizeRuntimeTargets(tool.runtimeTargets)
|
|
29
|
+
})),
|
|
30
|
+
setupAssets: layer.setupAssets?.map((asset) => ({
|
|
31
|
+
...asset,
|
|
32
|
+
runtimeTargets: normalizeRuntimeTargets(asset.runtimeTargets)
|
|
33
|
+
})),
|
|
34
|
+
topicTemplates: layer.topicTemplates,
|
|
35
|
+
installProfiles: layer.installProfiles?.map((profile) => ({
|
|
36
|
+
...profile,
|
|
37
|
+
promptIds: dedupeStrings(profile.promptIds),
|
|
38
|
+
toolIds: dedupeStrings(profile.toolIds),
|
|
39
|
+
assetIds: dedupeStrings(profile.assetIds),
|
|
40
|
+
defaultTopicSlugs: dedupeStrings(profile.defaultTopicSlugs)
|
|
41
|
+
}))
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function defineDomainPack(input) {
|
|
45
|
+
return {
|
|
46
|
+
...input,
|
|
47
|
+
ontologyBindings: input.ontologyBindings.map(normalizeOntologyBinding),
|
|
48
|
+
appPackKeys: input.appPackKeys ? dedupeStrings(input.appPackKeys) : void 0,
|
|
49
|
+
operatingSystem: normalizeOperatingSystem(input.operatingSystem),
|
|
50
|
+
workflows: input.workflows.map((w) => ({
|
|
51
|
+
...w,
|
|
52
|
+
requiredArtifacts: dedupeStrings(w.requiredArtifacts),
|
|
53
|
+
gateCheckpoints: dedupeStrings(w.gateCheckpoints),
|
|
54
|
+
steps: w.steps.map((s) => ({
|
|
55
|
+
...s,
|
|
56
|
+
requiredRoles: dedupeStrings(s.requiredRoles),
|
|
57
|
+
produces: s.produces ? dedupeStrings(s.produces) : void 0
|
|
58
|
+
}))
|
|
59
|
+
}))
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// src/domain-pack/authoring.core.ts
|
|
64
|
+
var DOMAIN_PACK_MANIFEST_KIND = "lucern-domain-pack-manifest";
|
|
65
|
+
var CURRENT_MANIFEST_VERSION = "1.0.0";
|
|
66
|
+
function isPlainObject(value) {
|
|
67
|
+
return typeof value === "object" && value !== null && !Array.isArray(value) && Object.getPrototypeOf(value) === Object.prototype;
|
|
68
|
+
}
|
|
69
|
+
function dedupeStrings2(values) {
|
|
70
|
+
if (!values) {
|
|
71
|
+
return void 0;
|
|
72
|
+
}
|
|
73
|
+
return Array.from(
|
|
74
|
+
new Set(values.map((value) => value.trim()).filter((value) => value.length))
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
function normalizeRuntimeTargets2(values) {
|
|
78
|
+
return values ? dedupeStrings2(values) : void 0;
|
|
79
|
+
}
|
|
80
|
+
function normalizeFrameworks(frameworks) {
|
|
81
|
+
if (!frameworks) {
|
|
82
|
+
return void 0;
|
|
83
|
+
}
|
|
84
|
+
return frameworks.map((framework) => ({
|
|
85
|
+
...framework,
|
|
86
|
+
frameworkId: framework.frameworkId.trim(),
|
|
87
|
+
version: framework.version.trim(),
|
|
88
|
+
versionConstraint: framework.versionConstraint?.trim(),
|
|
89
|
+
runtimeTargets: normalizeRuntimeTargets2(framework.runtimeTargets)
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
function normalizeSchemaExtensions(extensions) {
|
|
93
|
+
if (!extensions) {
|
|
94
|
+
return void 0;
|
|
95
|
+
}
|
|
96
|
+
return extensions.map((extension) => ({
|
|
97
|
+
...extension,
|
|
98
|
+
extensionId: extension.extensionId.trim(),
|
|
99
|
+
target: extension.target,
|
|
100
|
+
description: extension.description.trim(),
|
|
101
|
+
version: extension.version.trim(),
|
|
102
|
+
extends: extension.extends?.trim()
|
|
103
|
+
}));
|
|
104
|
+
}
|
|
105
|
+
function normalizeOntologyExtensions(extensions) {
|
|
106
|
+
if (!extensions) {
|
|
107
|
+
return void 0;
|
|
108
|
+
}
|
|
109
|
+
return extensions.map((extension) => ({
|
|
110
|
+
...extension,
|
|
111
|
+
extensionId: extension.extensionId.trim(),
|
|
112
|
+
ontologyId: extension.ontologyId.trim(),
|
|
113
|
+
baseVersionConstraint: extension.baseVersionConstraint.trim(),
|
|
114
|
+
entityTypes: extension.entityTypes?.map((entityType) => ({
|
|
115
|
+
...entityType,
|
|
116
|
+
value: entityType.value.trim(),
|
|
117
|
+
label: entityType.label.trim(),
|
|
118
|
+
description: entityType.description?.trim(),
|
|
119
|
+
subtypes: dedupeStrings2(entityType.subtypes)
|
|
120
|
+
})),
|
|
121
|
+
edgeTypes: extension.edgeTypes?.map((edgeType) => ({
|
|
122
|
+
...edgeType,
|
|
123
|
+
value: edgeType.value.trim(),
|
|
124
|
+
label: edgeType.label.trim(),
|
|
125
|
+
description: edgeType.description?.trim(),
|
|
126
|
+
sourceTypes: dedupeStrings2(edgeType.sourceTypes),
|
|
127
|
+
targetTypes: dedupeStrings2(edgeType.targetTypes)
|
|
128
|
+
}))
|
|
129
|
+
}));
|
|
130
|
+
}
|
|
131
|
+
function normalizeLineage(lineage) {
|
|
132
|
+
if (!lineage) {
|
|
133
|
+
return { mode: "root" };
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
mode: lineage.mode,
|
|
137
|
+
parentPackId: lineage.parentPackId?.trim(),
|
|
138
|
+
parentVersion: lineage.parentVersion?.trim(),
|
|
139
|
+
parentManifestDigest: lineage.parentManifestDigest?.trim(),
|
|
140
|
+
supersedesPackId: lineage.supersedesPackId?.trim(),
|
|
141
|
+
notes: lineage.notes?.trim()
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
function normalizeMetadata(metadata) {
|
|
145
|
+
if (!metadata) {
|
|
146
|
+
return void 0;
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
description: metadata.description?.trim(),
|
|
150
|
+
owner: metadata.owner?.trim(),
|
|
151
|
+
tags: dedupeStrings2(metadata.tags)
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
function toDomainPack(pack) {
|
|
155
|
+
return defineDomainPack(pack);
|
|
156
|
+
}
|
|
157
|
+
function defineDomainPackAuthoringManifest(input) {
|
|
158
|
+
return {
|
|
159
|
+
kind: input.kind ?? DOMAIN_PACK_MANIFEST_KIND,
|
|
160
|
+
manifestVersion: input.manifestVersion?.trim() || CURRENT_MANIFEST_VERSION,
|
|
161
|
+
pack: toDomainPack(input.pack),
|
|
162
|
+
frameworks: normalizeFrameworks(input.frameworks),
|
|
163
|
+
schemaExtensions: normalizeSchemaExtensions(input.schemaExtensions),
|
|
164
|
+
ontologyExtensions: normalizeOntologyExtensions(input.ontologyExtensions),
|
|
165
|
+
lineage: normalizeLineage(input.lineage),
|
|
166
|
+
metadata: normalizeMetadata(input.metadata)
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
function countManifestArtifacts(manifest) {
|
|
170
|
+
if (!manifest) {
|
|
171
|
+
return {
|
|
172
|
+
topicRoots: 0,
|
|
173
|
+
workflows: 0,
|
|
174
|
+
gates: 0,
|
|
175
|
+
artifacts: 0,
|
|
176
|
+
roles: 0,
|
|
177
|
+
prompts: 0,
|
|
178
|
+
tools: 0,
|
|
179
|
+
setupAssets: 0,
|
|
180
|
+
installProfiles: 0,
|
|
181
|
+
frameworks: 0,
|
|
182
|
+
schemaExtensions: 0,
|
|
183
|
+
ontologyExtensions: 0
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
return {
|
|
187
|
+
topicRoots: manifest.pack.topicRoots.length,
|
|
188
|
+
workflows: manifest.pack.workflows.length,
|
|
189
|
+
gates: manifest.pack.gates.length,
|
|
190
|
+
artifacts: manifest.pack.artifacts.length,
|
|
191
|
+
roles: manifest.pack.roles.length,
|
|
192
|
+
prompts: manifest.pack.operatingSystem?.prompts?.length ?? 0,
|
|
193
|
+
tools: manifest.pack.operatingSystem?.tools?.length ?? 0,
|
|
194
|
+
setupAssets: manifest.pack.operatingSystem?.setupAssets?.length ?? 0,
|
|
195
|
+
installProfiles: manifest.pack.operatingSystem?.installProfiles?.length ?? 0,
|
|
196
|
+
frameworks: manifest.frameworks?.length ?? 0,
|
|
197
|
+
schemaExtensions: manifest.schemaExtensions?.length ?? 0,
|
|
198
|
+
ontologyExtensions: manifest.ontologyExtensions?.length ?? 0
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
function sortJsonValue(value) {
|
|
202
|
+
if (Array.isArray(value)) {
|
|
203
|
+
return value.map(sortJsonValue);
|
|
204
|
+
}
|
|
205
|
+
if (isPlainObject(value)) {
|
|
206
|
+
return Object.fromEntries(
|
|
207
|
+
Object.entries(value).filter(([, entryValue]) => entryValue !== void 0).sort(([left], [right]) => left.localeCompare(right)).map(([key, entryValue]) => [key, sortJsonValue(entryValue)])
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
return value;
|
|
211
|
+
}
|
|
212
|
+
function toYamlScalar(value) {
|
|
213
|
+
if (value === null) {
|
|
214
|
+
return "null";
|
|
215
|
+
}
|
|
216
|
+
if (typeof value === "boolean" || typeof value === "number") {
|
|
217
|
+
return String(value);
|
|
218
|
+
}
|
|
219
|
+
return JSON.stringify(String(value));
|
|
220
|
+
}
|
|
221
|
+
function renderYaml(value, indent = 0) {
|
|
222
|
+
const prefix = " ".repeat(indent);
|
|
223
|
+
if (Array.isArray(value)) {
|
|
224
|
+
if (value.length === 0) {
|
|
225
|
+
return [`${prefix}[]`];
|
|
226
|
+
}
|
|
227
|
+
return value.flatMap((entry) => {
|
|
228
|
+
if (Array.isArray(entry) || isPlainObject(entry)) {
|
|
229
|
+
return [`${prefix}-`, ...renderYaml(entry, indent + 2)];
|
|
230
|
+
}
|
|
231
|
+
return [`${prefix}- ${toYamlScalar(entry)}`];
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
if (isPlainObject(value)) {
|
|
235
|
+
const entries = Object.entries(value);
|
|
236
|
+
if (entries.length === 0) {
|
|
237
|
+
return [`${prefix}{}`];
|
|
238
|
+
}
|
|
239
|
+
return entries.flatMap(([key, entryValue]) => {
|
|
240
|
+
if (entryValue === void 0) {
|
|
241
|
+
return [];
|
|
242
|
+
}
|
|
243
|
+
if (Array.isArray(entryValue)) {
|
|
244
|
+
if (entryValue.length === 0) {
|
|
245
|
+
return [`${prefix}${key}: []`];
|
|
246
|
+
}
|
|
247
|
+
return [`${prefix}${key}:`, ...renderYaml(entryValue, indent + 2)];
|
|
248
|
+
}
|
|
249
|
+
if (isPlainObject(entryValue)) {
|
|
250
|
+
if (Object.keys(entryValue).length === 0) {
|
|
251
|
+
return [`${prefix}${key}: {}`];
|
|
252
|
+
}
|
|
253
|
+
return [`${prefix}${key}:`, ...renderYaml(entryValue, indent + 2)];
|
|
254
|
+
}
|
|
255
|
+
return [`${prefix}${key}: ${toYamlScalar(entryValue)}`];
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
return [`${prefix}${toYamlScalar(value)}`];
|
|
259
|
+
}
|
|
260
|
+
function countIndent(line) {
|
|
261
|
+
return line.length - line.trimStart().length;
|
|
262
|
+
}
|
|
263
|
+
function parseYamlScalar(raw) {
|
|
264
|
+
const value = raw.trim();
|
|
265
|
+
if (value === "null") {
|
|
266
|
+
return null;
|
|
267
|
+
}
|
|
268
|
+
if (value === "true") {
|
|
269
|
+
return true;
|
|
270
|
+
}
|
|
271
|
+
if (value === "false") {
|
|
272
|
+
return false;
|
|
273
|
+
}
|
|
274
|
+
if (/^-?\d+(?:\.\d+)?$/.test(value)) {
|
|
275
|
+
return Number(value);
|
|
276
|
+
}
|
|
277
|
+
if (value.startsWith('"') && value.endsWith('"') || value.startsWith("'") && value.endsWith("'")) {
|
|
278
|
+
if (value.startsWith("'")) {
|
|
279
|
+
return value.slice(1, -1).replace(/''/g, "'");
|
|
280
|
+
}
|
|
281
|
+
return JSON.parse(value);
|
|
282
|
+
}
|
|
283
|
+
if (value === "[]") {
|
|
284
|
+
return [];
|
|
285
|
+
}
|
|
286
|
+
if (value === "{}") {
|
|
287
|
+
return {};
|
|
288
|
+
}
|
|
289
|
+
return value;
|
|
290
|
+
}
|
|
291
|
+
function splitYamlKeyValue(trimmed) {
|
|
292
|
+
const separatorIndex = trimmed.indexOf(":");
|
|
293
|
+
if (separatorIndex === -1) {
|
|
294
|
+
throw new Error(`Invalid YAML mapping entry: ${trimmed}`);
|
|
295
|
+
}
|
|
296
|
+
const key = trimmed.slice(0, separatorIndex).trim();
|
|
297
|
+
const value = trimmed.slice(separatorIndex + 1).trim();
|
|
298
|
+
return { key, value: value.length ? value : null };
|
|
299
|
+
}
|
|
300
|
+
function parseYamlDocument(text) {
|
|
301
|
+
const rawLines = text.replace(/\r\n/g, "\n").split("\n").map((line) => line.replace(/\t/g, " "));
|
|
302
|
+
const lines = rawLines.filter((line) => {
|
|
303
|
+
const trimmed = line.trim();
|
|
304
|
+
return trimmed.length > 0 && trimmed !== "---" && trimmed !== "...";
|
|
305
|
+
});
|
|
306
|
+
let index = 0;
|
|
307
|
+
function parseBlock(indent) {
|
|
308
|
+
if (index >= lines.length) {
|
|
309
|
+
return {};
|
|
310
|
+
}
|
|
311
|
+
const currentLine = lines[index];
|
|
312
|
+
const currentIndent = countIndent(currentLine);
|
|
313
|
+
if (currentIndent < indent) {
|
|
314
|
+
return {};
|
|
315
|
+
}
|
|
316
|
+
if (currentLine.trimStart().startsWith("-")) {
|
|
317
|
+
return parseArray(indent);
|
|
318
|
+
}
|
|
319
|
+
return parseObject(indent);
|
|
320
|
+
}
|
|
321
|
+
function parseArray(indent) {
|
|
322
|
+
const items = [];
|
|
323
|
+
while (index < lines.length) {
|
|
324
|
+
const line = lines[index];
|
|
325
|
+
const currentIndent = countIndent(line);
|
|
326
|
+
if (currentIndent < indent) {
|
|
327
|
+
break;
|
|
328
|
+
}
|
|
329
|
+
if (currentIndent !== indent) {
|
|
330
|
+
throw new Error(`Invalid YAML indentation near: ${line.trim()}`);
|
|
331
|
+
}
|
|
332
|
+
const trimmed = line.trimStart();
|
|
333
|
+
if (!trimmed.startsWith("-")) {
|
|
334
|
+
break;
|
|
335
|
+
}
|
|
336
|
+
const rest = trimmed.slice(1).trimStart();
|
|
337
|
+
index += 1;
|
|
338
|
+
if (!rest.length) {
|
|
339
|
+
items.push(parseBlock(indent + 2));
|
|
340
|
+
continue;
|
|
341
|
+
}
|
|
342
|
+
items.push(parseYamlScalar(rest));
|
|
343
|
+
}
|
|
344
|
+
return items;
|
|
345
|
+
}
|
|
346
|
+
function parseObject(indent) {
|
|
347
|
+
const objectValue = {};
|
|
348
|
+
while (index < lines.length) {
|
|
349
|
+
const line = lines[index];
|
|
350
|
+
const currentIndent = countIndent(line);
|
|
351
|
+
if (currentIndent < indent) {
|
|
352
|
+
break;
|
|
353
|
+
}
|
|
354
|
+
if (currentIndent !== indent) {
|
|
355
|
+
throw new Error(`Invalid YAML indentation near: ${line.trim()}`);
|
|
356
|
+
}
|
|
357
|
+
const trimmed = line.trim();
|
|
358
|
+
if (trimmed.startsWith("-")) {
|
|
359
|
+
break;
|
|
360
|
+
}
|
|
361
|
+
const { key, value } = splitYamlKeyValue(trimmed);
|
|
362
|
+
index += 1;
|
|
363
|
+
objectValue[key] = value === null ? parseBlock(indent + 2) : parseYamlScalar(value);
|
|
364
|
+
}
|
|
365
|
+
return objectValue;
|
|
366
|
+
}
|
|
367
|
+
return parseBlock(0);
|
|
368
|
+
}
|
|
369
|
+
function detectDomainPackManifestFormat(source, explicitFormat) {
|
|
370
|
+
if (explicitFormat) {
|
|
371
|
+
return explicitFormat;
|
|
372
|
+
}
|
|
373
|
+
const trimmed = source.trim();
|
|
374
|
+
if (trimmed.startsWith("{")) {
|
|
375
|
+
return "json";
|
|
376
|
+
}
|
|
377
|
+
return "yaml";
|
|
378
|
+
}
|
|
379
|
+
function serializeDomainPackAuthoringManifest(manifest, format = "json") {
|
|
380
|
+
const canonicalValue = sortJsonValue(manifest);
|
|
381
|
+
if (format === "json") {
|
|
382
|
+
return `${JSON.stringify(canonicalValue, null, 2)}
|
|
383
|
+
`;
|
|
384
|
+
}
|
|
385
|
+
return `${renderYaml(canonicalValue).join("\n")}
|
|
386
|
+
`;
|
|
387
|
+
}
|
|
388
|
+
function parseDomainPackAuthoringManifest(source, format) {
|
|
389
|
+
const detectedFormat = detectDomainPackManifestFormat(source, format);
|
|
390
|
+
const parsed = detectedFormat === "json" ? JSON.parse(source) : parseYamlDocument(source);
|
|
391
|
+
if (!isPlainObject(parsed)) {
|
|
392
|
+
throw new Error("Domain pack manifest must parse to an object.");
|
|
393
|
+
}
|
|
394
|
+
if (!("pack" in parsed)) {
|
|
395
|
+
throw new Error("Domain pack manifest requires a top-level pack object.");
|
|
396
|
+
}
|
|
397
|
+
return defineDomainPackAuthoringManifest({
|
|
398
|
+
kind: parsed.kind,
|
|
399
|
+
manifestVersion: parsed.manifestVersion,
|
|
400
|
+
pack: parsed.pack,
|
|
401
|
+
frameworks: parsed.frameworks,
|
|
402
|
+
schemaExtensions: parsed.schemaExtensions,
|
|
403
|
+
ontologyExtensions: parsed.ontologyExtensions,
|
|
404
|
+
lineage: parsed.lineage,
|
|
405
|
+
metadata: parsed.metadata
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
export { DOMAIN_PACK_MANIFEST_KIND, countManifestArtifacts, defineDomainPackAuthoringManifest, parseDomainPackAuthoringManifest, serializeDomainPackAuthoringManifest };
|
|
410
|
+
//# sourceMappingURL=authoring.core.js.map
|
|
411
|
+
//# sourceMappingURL=authoring.core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/domain-pack/contracts.ts","../../src/domain-pack/authoring.core.ts"],"names":["dedupeStrings","normalizeRuntimeTargets"],"mappings":"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","file":"authoring.core.js","sourcesContent":["/**\n * Domain Pack Contracts\n *\n * A DomainPack is a self-contained reasoning context bundle that defines\n * how reasoning works in a specific domain. It binds ontology versions,\n * defines topic structure, declares workflow templates, gate schemas,\n * artifact schemas, and reasoning roles.\n *\n * This is the THIRD pack type in Lucern's architecture:\n * - AppPackManifest: UI routes, surfaces, policy profiles (app-level)\n * - MethodologyPack: Agent workflow phases, gates, enforcement (process-level)\n * - DomainPack: Reasoning domain context (domain-level)\n *\n * All fields are internal until RS-5+ external authoring certification.\n */\n\n// ---------------------------------------------------------------------------\n// Ontology Binding — ties a pack to specific ontology versions\n// ---------------------------------------------------------------------------\n\nexport type OntologyProvisionMode = \"bind\" | \"seed\" | \"extend\";\n\nexport type OntologyBinding = {\n ontologyId: string;\n versionConstraint: string; // semver range, e.g., \"^1.0.0\"\n required: boolean;\n provisionMode?: OntologyProvisionMode;\n seedRef?: string;\n requiredEntityTypes?: string[];\n requiredEdgeTypes?: string[];\n};\n\n// ---------------------------------------------------------------------------\n// Topic Root — defines the domain's top-level topic tree structure\n// ---------------------------------------------------------------------------\n\nexport type TopicRoot = {\n slug: string;\n name: string;\n description: string;\n ontologyId?: string; // which ontology governs this root\n};\n\n// ---------------------------------------------------------------------------\n// Workflow Template — shape of a workflow (not execution logic)\n// ---------------------------------------------------------------------------\n\nexport type WorkflowStep = {\n stepId: string;\n name: string;\n description: string;\n requiredRoles: string[]; // roleId references\n produces?: string[]; // artifactId references\n gateId?: string; // gate checked after this step\n};\n\nexport type WorkflowTemplate = {\n workflowId: string;\n name: string;\n description: string;\n steps: WorkflowStep[];\n requiredArtifacts: string[]; // artifactId references\n gateCheckpoints: string[]; // gateId references\n};\n\n// ---------------------------------------------------------------------------\n// Gate Schema — declarative description of what must be true\n// ---------------------------------------------------------------------------\n\nexport type GateCriterionOperator = \"gte\" | \"lte\" | \"eq\" | \"gt\" | \"lt\";\n\nexport type GateCriterion = {\n criterionId: string;\n description: string;\n metric: string;\n threshold?: number;\n operator?: GateCriterionOperator;\n};\n\nexport type GateSeverity = \"blocking\" | \"warning\" | \"informational\";\n\nexport type GateSchema = {\n gateId: string;\n name: string;\n description: string;\n criteria: GateCriterion[];\n severity: GateSeverity;\n};\n\n// ---------------------------------------------------------------------------\n// Artifact Schema — what artifacts workflows produce\n// ---------------------------------------------------------------------------\n\nexport type ArtifactSchema = {\n artifactId: string;\n name: string;\n description: string;\n stage: string; // workflow step that produces this\n contentSchema: Record<string, unknown>; // JSON Schema for content\n requiredFields: string[];\n};\n\n// ---------------------------------------------------------------------------\n// Reasoning Role — epistemic actors in the domain\n// ---------------------------------------------------------------------------\n\nexport type ReasoningRole = {\n roleId: string;\n name: string;\n description: string;\n perspective: string;\n optimizesFor: string;\n mayBlock: boolean; // Epistemic Invariant #13: agents may block progress\n};\n\n// ---------------------------------------------------------------------------\n// Inquiry Shaping — pack-level hooks for RS-3 auto-shaping\n// ---------------------------------------------------------------------------\n\nexport type InquiryShapingQuestionTemplate = {\n templateId: string;\n questionType:\n | \"validation\"\n | \"falsification\"\n | \"assumption_probe\"\n | \"counterfactual\"\n | \"scope\"\n | \"comparison\"\n | \"mechanism\"\n | \"general\";\n priority?: \"critical\" | \"high\" | \"medium\" | \"low\";\n template: string; // Supports {{objective}} and {{hypothesis}}\n whenObjectiveIncludes?: string[];\n};\n\nexport type InquiryShapingTaskTemplate = {\n templateId: string;\n title: string; // Supports {{objective}} and {{hypothesis}}\n description?: string; // Supports {{objective}} and {{hypothesis}}\n taskType?:\n | \"general\"\n | \"find_evidence\"\n | \"verify_claim\"\n | \"research\"\n | \"review\"\n | \"interview\"\n | \"analysis\"\n | \"track_metrics\";\n priority?: \"urgent\" | \"high\" | \"medium\" | \"low\";\n whenObjectiveIncludes?: string[];\n whenQuestionTypes?: string[];\n};\n\nexport type InquiryShapingFrameworkHint = {\n frameworkName: string;\n whenObjectiveIncludes?: string[];\n whenQuestionTypes?: string[];\n boost?: number;\n reason?: string;\n};\n\nexport type InquiryShapingConfig = {\n questionTemplates?: InquiryShapingQuestionTemplate[];\n taskTemplates?: InquiryShapingTaskTemplate[];\n frameworkHints?: InquiryShapingFrameworkHint[];\n};\n\n// ---------------------------------------------------------------------------\n// Operating System Layer — prompts, tools, topic bootstrap, install surfaces\n// ---------------------------------------------------------------------------\n\nexport type RuntimeTarget = \"claude-code\" | \"codex\" | \"hybrid\" | \"portable\";\n\nexport type PromptSource = \"langfuse\" | \"file\";\nexport type PromptChannel =\n | \"bootstrap\"\n | \"workflow\"\n | \"analysis\"\n | \"review\"\n | \"tool\";\n\nexport type PromptBinding = {\n promptId: string;\n description: string;\n source: PromptSource;\n ref: string;\n fallbackRef?: string;\n channel: PromptChannel;\n required: boolean;\n runtimeTargets?: RuntimeTarget[];\n};\n\nexport type ToolKind = \"mcp\" | \"cli\" | \"script\" | \"hook\" | \"ai-tool\";\n\nexport type ToolBinding = {\n toolId: string;\n description: string;\n kind: ToolKind;\n entrypoint: string;\n required: boolean;\n runtimeTargets?: RuntimeTarget[];\n};\n\nexport type SetupAssetKind =\n | \"instruction\"\n | \"settings\"\n | \"hook\"\n | \"skill\"\n | \"agent\"\n | \"manifest\"\n | \"template\"\n | \"inbox\"\n | \"script\"\n | \"ui\";\n\nexport type SetupAsset = {\n assetId: string;\n kind: SetupAssetKind;\n description: string;\n path: string;\n required: boolean;\n runtimeTargets?: RuntimeTarget[];\n};\n\nexport type TopicTemplate = {\n slug: string;\n name: string;\n description: string;\n parentSlug?: string;\n ontologyId?: string;\n};\n\nexport type InstallProfile = {\n profileId: string;\n name: string;\n description: string;\n runtimeTarget: RuntimeTarget;\n promptIds: string[];\n toolIds: string[];\n assetIds: string[];\n defaultTopicSlugs: string[];\n};\n\nexport type OperatingSystemLayer = {\n prompts?: PromptBinding[];\n tools?: ToolBinding[];\n setupAssets?: SetupAsset[];\n topicTemplates?: TopicTemplate[];\n installProfiles?: InstallProfile[];\n};\n\n// ---------------------------------------------------------------------------\n// Domain Pack — the top-level contract\n// ---------------------------------------------------------------------------\n\nexport type DomainPack = {\n // Identity\n packId: string;\n name: string;\n version: string; // semver\n\n // Scope\n ontologyBindings: OntologyBinding[];\n topicRoots: TopicRoot[];\n\n // Workflow Templates\n workflows: WorkflowTemplate[];\n\n // Gate Schemas\n gates: GateSchema[];\n\n // Artifact Schemas\n artifacts: ArtifactSchema[];\n\n // Reasoning Roles\n roles: ReasoningRole[];\n\n // Inquiry shaping hooks\n inquiryShaping?: InquiryShapingConfig;\n\n // Runtime/install packaging layer\n operatingSystem?: OperatingSystemLayer;\n\n // Composition — optional references to other pack types\n appPackKeys?: string[]; // AppPackManifest keys this domain uses\n methodologyPackId?: string; // MethodologyPack for agent behavior\n};\n\n// ---------------------------------------------------------------------------\n// Builder helper — normalizes arrays and validates basic structure\n// ---------------------------------------------------------------------------\n\nfunction dedupeStrings(values: string[]): string[] {\n return Array.from(\n new Set(values.map((v) => v.trim()).filter((v) => v.length > 0))\n );\n}\n\nexport type DomainPackInput = Omit<DomainPack, \"appPackKeys\"> & {\n appPackKeys?: string[];\n};\n\nfunction normalizeRuntimeTargets(\n values: RuntimeTarget[] | undefined\n): RuntimeTarget[] | undefined {\n return values ? (dedupeStrings(values) as RuntimeTarget[]) : undefined;\n}\n\nfunction normalizeOntologyBinding(binding: OntologyBinding): OntologyBinding {\n return {\n ...binding,\n requiredEntityTypes: binding.requiredEntityTypes\n ? dedupeStrings(binding.requiredEntityTypes)\n : undefined,\n requiredEdgeTypes: binding.requiredEdgeTypes\n ? dedupeStrings(binding.requiredEdgeTypes)\n : undefined,\n };\n}\n\nfunction normalizeOperatingSystem(\n layer: OperatingSystemLayer | undefined\n): OperatingSystemLayer | undefined {\n if (!layer) {\n return;\n }\n\n return {\n prompts: layer.prompts?.map((prompt) => ({\n ...prompt,\n runtimeTargets: normalizeRuntimeTargets(prompt.runtimeTargets),\n })),\n tools: layer.tools?.map((tool) => ({\n ...tool,\n runtimeTargets: normalizeRuntimeTargets(tool.runtimeTargets),\n })),\n setupAssets: layer.setupAssets?.map((asset) => ({\n ...asset,\n runtimeTargets: normalizeRuntimeTargets(asset.runtimeTargets),\n })),\n topicTemplates: layer.topicTemplates,\n installProfiles: layer.installProfiles?.map((profile) => ({\n ...profile,\n promptIds: dedupeStrings(profile.promptIds),\n toolIds: dedupeStrings(profile.toolIds),\n assetIds: dedupeStrings(profile.assetIds),\n defaultTopicSlugs: dedupeStrings(profile.defaultTopicSlugs),\n })),\n };\n}\n\nexport function defineDomainPack(input: DomainPackInput): DomainPack {\n return {\n ...input,\n ontologyBindings: input.ontologyBindings.map(normalizeOntologyBinding),\n appPackKeys: input.appPackKeys\n ? dedupeStrings(input.appPackKeys)\n : undefined,\n operatingSystem: normalizeOperatingSystem(input.operatingSystem),\n workflows: input.workflows.map((w) => ({\n ...w,\n requiredArtifacts: dedupeStrings(w.requiredArtifacts),\n gateCheckpoints: dedupeStrings(w.gateCheckpoints),\n steps: w.steps.map((s) => ({\n ...s,\n requiredRoles: dedupeStrings(s.requiredRoles),\n produces: s.produces ? dedupeStrings(s.produces) : undefined,\n })),\n })),\n };\n}\n","/**\n * Domain Pack Authoring Kit\n *\n * Config-first authoring surface for tenant-authored domain packs. This layer\n * wraps the internal DomainPack contract in a stable manifest envelope with\n * framework versioning, schema and ontology extension contracts, remix/fork\n * lineage, and tool-shaped validate/preview/publish handlers.\n */\n\nimport type { DomainPack, DomainPackInput, RuntimeTarget } from \"./contracts\";\nimport { defineDomainPack } from \"./contracts\";\nimport type { DomainPackValidationIssue } from \"./validation\";\nexport type { RuntimeTarget } from \"./contracts\";\n\nexport const DOMAIN_PACK_MANIFEST_KIND =\n \"lucern-domain-pack-manifest\" as const;\nconst CURRENT_MANIFEST_VERSION = \"1.0.0\";\n\nexport type DomainPackManifestFormat = \"json\" | \"yaml\";\n\nexport type DomainPackFrameworkContract = {\n frameworkId: string;\n version: string;\n versionConstraint?: string;\n required?: boolean;\n runtimeTargets?: RuntimeTarget[];\n};\n\nexport type DomainPackSchemaExtensionTarget =\n | \"artifact\"\n | \"workflow\"\n | \"gate\"\n | \"prompt\"\n | \"tool\"\n | \"install-profile\"\n | \"topic-template\";\n\nexport type DomainPackSchemaExtension = {\n extensionId: string;\n target: DomainPackSchemaExtensionTarget;\n description: string;\n version: string;\n extends?: string;\n schema: Record<string, unknown>;\n};\n\nexport type DomainPackOntologyEntityExtension = {\n value: string;\n label: string;\n description?: string;\n schema?: Record<string, unknown>;\n subtypes?: string[];\n};\n\nexport type DomainPackOntologyEdgeExtension = {\n value: string;\n label: string;\n description?: string;\n sourceTypes?: string[];\n targetTypes?: string[];\n constraintSeverity?: \"error\" | \"warning\" | \"informational\";\n};\n\nexport type DomainPackOntologyExtension = {\n extensionId: string;\n ontologyId: string;\n baseVersionConstraint: string;\n additiveOnly: boolean;\n entityTypes?: DomainPackOntologyEntityExtension[];\n edgeTypes?: DomainPackOntologyEdgeExtension[];\n};\n\nexport type DomainPackLineageMode = \"root\" | \"remix\" | \"fork\";\n\nexport type DomainPackLineage = {\n mode: DomainPackLineageMode;\n parentPackId?: string;\n parentVersion?: string;\n parentManifestDigest?: string;\n supersedesPackId?: string;\n notes?: string;\n};\n\nexport type DomainPackAuthoringMetadata = {\n description?: string;\n owner?: string;\n tags?: string[];\n};\n\nexport type DomainPackAuthoringManifest = {\n kind: typeof DOMAIN_PACK_MANIFEST_KIND;\n manifestVersion: string;\n pack: DomainPack;\n frameworks?: DomainPackFrameworkContract[];\n schemaExtensions?: DomainPackSchemaExtension[];\n ontologyExtensions?: DomainPackOntologyExtension[];\n lineage: DomainPackLineage;\n metadata?: DomainPackAuthoringMetadata;\n};\n\nexport type DomainPackAuthoringManifestInput = {\n kind?: typeof DOMAIN_PACK_MANIFEST_KIND;\n manifestVersion?: string;\n pack: DomainPack | DomainPackInput;\n frameworks?: DomainPackFrameworkContract[];\n schemaExtensions?: DomainPackSchemaExtension[];\n ontologyExtensions?: DomainPackOntologyExtension[];\n lineage?: DomainPackLineage;\n metadata?: DomainPackAuthoringMetadata;\n};\n\nexport type DomainPackAuthoringValidationIssue = DomainPackValidationIssue & {\n source:\n | \"manifest\"\n | \"pack\"\n | \"framework\"\n | \"schema-extension\"\n | \"ontology-extension\"\n | \"lineage\"\n | \"terminology\"\n | \"parse\";\n};\n\nexport type DomainPackManifestCounts = {\n topicRoots: number;\n workflows: number;\n gates: number;\n artifacts: number;\n roles: number;\n prompts: number;\n tools: number;\n setupAssets: number;\n installProfiles: number;\n frameworks: number;\n schemaExtensions: number;\n ontologyExtensions: number;\n};\n\nexport type DomainPackAuthoringValidationResult = {\n valid: boolean;\n format: DomainPackManifestFormat | null;\n manifest: DomainPackAuthoringManifest | null;\n manifestDigest: string | null;\n issues: DomainPackAuthoringValidationIssue[];\n counts: DomainPackManifestCounts;\n};\n\nexport type DomainPackAuthoringPreview = DomainPackAuthoringValidationResult & {\n readyToPublish: boolean;\n canonicalJson: string | null;\n canonicalYaml: string | null;\n lineageSummary: string | null;\n requiredRuntimeTargets: RuntimeTarget[];\n};\n\nexport type DomainPackPublicationLineageEdge = {\n edgeType: \"remixed_from\" | \"supersedes\";\n childPackId: string;\n parentPackId: string;\n parentVersion: string;\n};\n\nexport type DomainPackPublication = {\n publicationId: string;\n packId: string;\n version: string;\n manifestDigest: string;\n manifest: DomainPackAuthoringManifest;\n lineageEdge: DomainPackPublicationLineageEdge | null;\n canonicalJson: string;\n canonicalYaml: string;\n};\n\nexport type DomainPackPublishResult = {\n published: boolean;\n preview: DomainPackAuthoringPreview;\n publication: DomainPackPublication | null;\n};\n\nexport type DomainPackAuthoringToolInput = {\n manifestText: string;\n format?: DomainPackManifestFormat;\n};\n\nexport type DomainPackAuthoringToolDefinition<Result> = {\n name:\n | \"validate_domain_pack_manifest\"\n | \"preview_domain_pack_manifest\"\n | \"publish_domain_pack_manifest\";\n description: string;\n inputSchema: Record<string, unknown>;\n execute: (args: DomainPackAuthoringToolInput) => Result;\n};\n\nexport type DomainPackAuthoringToolset = {\n validate: DomainPackAuthoringToolDefinition<DomainPackAuthoringValidationResult>;\n preview: DomainPackAuthoringToolDefinition<DomainPackAuthoringPreview>;\n publish: DomainPackAuthoringToolDefinition<DomainPackPublishResult>;\n};\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n\nfunction dedupeStrings(values: string[] | undefined): string[] | undefined {\n if (!values) {\n return undefined;\n }\n return Array.from(\n new Set(values.map((value) => value.trim()).filter((value) => value.length))\n );\n}\n\nfunction normalizeRuntimeTargets(\n values: RuntimeTarget[] | undefined\n): RuntimeTarget[] | undefined {\n return values ? (dedupeStrings(values) as RuntimeTarget[]) : undefined;\n}\n\nfunction normalizeFrameworks(\n frameworks: DomainPackFrameworkContract[] | undefined\n): DomainPackFrameworkContract[] | undefined {\n if (!frameworks) {\n return undefined;\n }\n\n return frameworks.map((framework) => ({\n ...framework,\n frameworkId: framework.frameworkId.trim(),\n version: framework.version.trim(),\n versionConstraint: framework.versionConstraint?.trim(),\n runtimeTargets: normalizeRuntimeTargets(framework.runtimeTargets),\n }));\n}\n\nfunction normalizeSchemaExtensions(\n extensions: DomainPackSchemaExtension[] | undefined\n): DomainPackSchemaExtension[] | undefined {\n if (!extensions) {\n return undefined;\n }\n\n return extensions.map((extension) => ({\n ...extension,\n extensionId: extension.extensionId.trim(),\n target: extension.target,\n description: extension.description.trim(),\n version: extension.version.trim(),\n extends: extension.extends?.trim(),\n }));\n}\n\nfunction normalizeOntologyExtensions(\n extensions: DomainPackOntologyExtension[] | undefined\n): DomainPackOntologyExtension[] | undefined {\n if (!extensions) {\n return undefined;\n }\n\n return extensions.map((extension) => ({\n ...extension,\n extensionId: extension.extensionId.trim(),\n ontologyId: extension.ontologyId.trim(),\n baseVersionConstraint: extension.baseVersionConstraint.trim(),\n entityTypes: extension.entityTypes?.map((entityType) => ({\n ...entityType,\n value: entityType.value.trim(),\n label: entityType.label.trim(),\n description: entityType.description?.trim(),\n subtypes: dedupeStrings(entityType.subtypes),\n })),\n edgeTypes: extension.edgeTypes?.map((edgeType) => ({\n ...edgeType,\n value: edgeType.value.trim(),\n label: edgeType.label.trim(),\n description: edgeType.description?.trim(),\n sourceTypes: dedupeStrings(edgeType.sourceTypes),\n targetTypes: dedupeStrings(edgeType.targetTypes),\n })),\n }));\n}\n\nfunction normalizeLineage(lineage: DomainPackLineage | undefined): DomainPackLineage {\n if (!lineage) {\n return { mode: \"root\" };\n }\n\n return {\n mode: lineage.mode,\n parentPackId: lineage.parentPackId?.trim(),\n parentVersion: lineage.parentVersion?.trim(),\n parentManifestDigest: lineage.parentManifestDigest?.trim(),\n supersedesPackId: lineage.supersedesPackId?.trim(),\n notes: lineage.notes?.trim(),\n };\n}\n\nfunction normalizeMetadata(\n metadata: DomainPackAuthoringMetadata | undefined\n): DomainPackAuthoringMetadata | undefined {\n if (!metadata) {\n return undefined;\n }\n\n return {\n description: metadata.description?.trim(),\n owner: metadata.owner?.trim(),\n tags: dedupeStrings(metadata.tags),\n };\n}\n\nfunction toDomainPack(pack: DomainPack | DomainPackInput): DomainPack {\n return defineDomainPack(pack as DomainPackInput);\n}\n\nexport function defineDomainPackAuthoringManifest(\n input: DomainPackAuthoringManifestInput\n): DomainPackAuthoringManifest {\n return {\n kind: input.kind ?? DOMAIN_PACK_MANIFEST_KIND,\n manifestVersion: input.manifestVersion?.trim() || CURRENT_MANIFEST_VERSION,\n pack: toDomainPack(input.pack),\n frameworks: normalizeFrameworks(input.frameworks),\n schemaExtensions: normalizeSchemaExtensions(input.schemaExtensions),\n ontologyExtensions: normalizeOntologyExtensions(input.ontologyExtensions),\n lineage: normalizeLineage(input.lineage),\n metadata: normalizeMetadata(input.metadata),\n };\n}\n\nexport function countManifestArtifacts(\n manifest: DomainPackAuthoringManifest | null\n): DomainPackManifestCounts {\n if (!manifest) {\n return {\n topicRoots: 0,\n workflows: 0,\n gates: 0,\n artifacts: 0,\n roles: 0,\n prompts: 0,\n tools: 0,\n setupAssets: 0,\n installProfiles: 0,\n frameworks: 0,\n schemaExtensions: 0,\n ontologyExtensions: 0,\n };\n }\n\n return {\n topicRoots: manifest.pack.topicRoots.length,\n workflows: manifest.pack.workflows.length,\n gates: manifest.pack.gates.length,\n artifacts: manifest.pack.artifacts.length,\n roles: manifest.pack.roles.length,\n prompts: manifest.pack.operatingSystem?.prompts?.length ?? 0,\n tools: manifest.pack.operatingSystem?.tools?.length ?? 0,\n setupAssets: manifest.pack.operatingSystem?.setupAssets?.length ?? 0,\n installProfiles: manifest.pack.operatingSystem?.installProfiles?.length ?? 0,\n frameworks: manifest.frameworks?.length ?? 0,\n schemaExtensions: manifest.schemaExtensions?.length ?? 0,\n ontologyExtensions: manifest.ontologyExtensions?.length ?? 0,\n };\n}\n\nfunction sortJsonValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(sortJsonValue);\n }\n if (isPlainObject(value)) {\n return Object.fromEntries(\n Object.entries(value)\n .filter(([, entryValue]) => entryValue !== undefined)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entryValue]) => [key, sortJsonValue(entryValue)])\n );\n }\n return value;\n}\n\nfunction toYamlScalar(value: unknown): string {\n if (value === null) {\n return \"null\";\n }\n if (typeof value === \"boolean\" || typeof value === \"number\") {\n return String(value);\n }\n return JSON.stringify(String(value));\n}\n\nfunction renderYaml(value: unknown, indent = 0): string[] {\n const prefix = \" \".repeat(indent);\n\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return [`${prefix}[]`];\n }\n return value.flatMap((entry) => {\n if (Array.isArray(entry) || isPlainObject(entry)) {\n return [`${prefix}-`, ...renderYaml(entry, indent + 2)];\n }\n return [`${prefix}- ${toYamlScalar(entry)}`];\n });\n }\n\n if (isPlainObject(value)) {\n const entries = Object.entries(value);\n if (entries.length === 0) {\n return [`${prefix}{}`];\n }\n return entries.flatMap(([key, entryValue]) => {\n if (entryValue === undefined) {\n return [];\n }\n if (Array.isArray(entryValue)) {\n if (entryValue.length === 0) {\n return [`${prefix}${key}: []`];\n }\n return [`${prefix}${key}:`, ...renderYaml(entryValue, indent + 2)];\n }\n if (isPlainObject(entryValue)) {\n if (Object.keys(entryValue).length === 0) {\n return [`${prefix}${key}: {}`];\n }\n return [`${prefix}${key}:`, ...renderYaml(entryValue, indent + 2)];\n }\n return [`${prefix}${key}: ${toYamlScalar(entryValue)}`];\n });\n }\n\n return [`${prefix}${toYamlScalar(value)}`];\n}\n\nfunction countIndent(line: string): number {\n return line.length - line.trimStart().length;\n}\n\nfunction parseYamlScalar(raw: string): unknown {\n const value = raw.trim();\n if (value === \"null\") {\n return null;\n }\n if (value === \"true\") {\n return true;\n }\n if (value === \"false\") {\n return false;\n }\n if (/^-?\\d+(?:\\.\\d+)?$/.test(value)) {\n return Number(value);\n }\n if (\n (value.startsWith(\"\\\"\") && value.endsWith(\"\\\"\")) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n if (value.startsWith(\"'\")) {\n return value.slice(1, -1).replace(/''/g, \"'\");\n }\n return JSON.parse(value) as string;\n }\n if (value === \"[]\") {\n return [];\n }\n if (value === \"{}\") {\n return {};\n }\n return value;\n}\n\nfunction splitYamlKeyValue(\n trimmed: string\n): { key: string; value: string | null } {\n const separatorIndex = trimmed.indexOf(\":\");\n if (separatorIndex === -1) {\n throw new Error(`Invalid YAML mapping entry: ${trimmed}`);\n }\n\n const key = trimmed.slice(0, separatorIndex).trim();\n const value = trimmed.slice(separatorIndex + 1).trim();\n return { key, value: value.length ? value : null };\n}\n\nfunction parseYamlDocument(text: string): unknown {\n const rawLines = text\n .replace(/\\r\\n/g, \"\\n\")\n .split(\"\\n\")\n .map((line) => line.replace(/\\t/g, \" \"));\n const lines = rawLines.filter((line) => {\n const trimmed = line.trim();\n return trimmed.length > 0 && trimmed !== \"---\" && trimmed !== \"...\";\n });\n\n let index = 0;\n\n function parseBlock(indent: number): unknown {\n if (index >= lines.length) {\n return {};\n }\n\n const currentLine = lines[index];\n const currentIndent = countIndent(currentLine);\n if (currentIndent < indent) {\n return {};\n }\n if (currentLine.trimStart().startsWith(\"-\")) {\n return parseArray(indent);\n }\n return parseObject(indent);\n }\n\n function parseArray(indent: number): unknown[] {\n const items: unknown[] = [];\n\n while (index < lines.length) {\n const line = lines[index];\n const currentIndent = countIndent(line);\n if (currentIndent < indent) {\n break;\n }\n if (currentIndent !== indent) {\n throw new Error(`Invalid YAML indentation near: ${line.trim()}`);\n }\n\n const trimmed = line.trimStart();\n if (!trimmed.startsWith(\"-\")) {\n break;\n }\n\n const rest = trimmed.slice(1).trimStart();\n index += 1;\n\n if (!rest.length) {\n items.push(parseBlock(indent + 2));\n continue;\n }\n\n items.push(parseYamlScalar(rest));\n }\n\n return items;\n }\n\n function parseObject(indent: number): Record<string, unknown> {\n const objectValue: Record<string, unknown> = {};\n\n while (index < lines.length) {\n const line = lines[index];\n const currentIndent = countIndent(line);\n if (currentIndent < indent) {\n break;\n }\n if (currentIndent !== indent) {\n throw new Error(`Invalid YAML indentation near: ${line.trim()}`);\n }\n\n const trimmed = line.trim();\n if (trimmed.startsWith(\"-\")) {\n break;\n }\n\n const { key, value } = splitYamlKeyValue(trimmed);\n index += 1;\n objectValue[key] =\n value === null ? parseBlock(indent + 2) : parseYamlScalar(value);\n }\n\n return objectValue;\n }\n\n return parseBlock(0);\n}\n\nfunction detectDomainPackManifestFormat(\n source: string,\n explicitFormat?: DomainPackManifestFormat\n): DomainPackManifestFormat {\n if (explicitFormat) {\n return explicitFormat;\n }\n\n const trimmed = source.trim();\n if (trimmed.startsWith(\"{\")) {\n return \"json\";\n }\n return \"yaml\";\n}\n\nexport function serializeDomainPackAuthoringManifest(\n manifest: DomainPackAuthoringManifest,\n format: DomainPackManifestFormat = \"json\"\n): string {\n const canonicalValue = sortJsonValue(manifest);\n if (format === \"json\") {\n return `${JSON.stringify(canonicalValue, null, 2)}\\n`;\n }\n return `${renderYaml(canonicalValue).join(\"\\n\")}\\n`;\n}\n\nexport function parseDomainPackAuthoringManifest(\n source: string,\n format?: DomainPackManifestFormat\n): DomainPackAuthoringManifest {\n const detectedFormat = detectDomainPackManifestFormat(source, format);\n const parsed =\n detectedFormat === \"json\"\n ? (JSON.parse(source) as unknown)\n : parseYamlDocument(source);\n\n if (!isPlainObject(parsed)) {\n throw new Error(\"Domain pack manifest must parse to an object.\");\n }\n\n if (!(\"pack\" in parsed)) {\n throw new Error(\"Domain pack manifest requires a top-level pack object.\");\n }\n\n return defineDomainPackAuthoringManifest({\n kind: parsed.kind as typeof DOMAIN_PACK_MANIFEST_KIND | undefined,\n manifestVersion: parsed.manifestVersion as string | undefined,\n pack: parsed.pack as DomainPackInput,\n frameworks: parsed.frameworks as DomainPackFrameworkContract[] | undefined,\n schemaExtensions: parsed.schemaExtensions as\n | DomainPackSchemaExtension[]\n | undefined,\n ontologyExtensions: parsed.ontologyExtensions as\n | DomainPackOntologyExtension[]\n | undefined,\n lineage: parsed.lineage as DomainPackLineage | undefined,\n metadata: parsed.metadata as DomainPackAuthoringMetadata | undefined,\n });\n}\n"]}
|