@lucern/pack-host 0.1.0-alpha.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.
Files changed (104) hide show
  1. package/README.md +64 -0
  2. package/dist/contracts.d.ts +77 -0
  3. package/dist/contracts.js +21 -0
  4. package/dist/contracts.js.map +1 -0
  5. package/dist/convex.config.d.ts +5 -0
  6. package/dist/convex.config.js +9 -0
  7. package/dist/convex.config.js.map +1 -0
  8. package/dist/dependencyResolution.d.ts +18 -0
  9. package/dist/dependencyResolution.js +131 -0
  10. package/dist/dependencyResolution.js.map +1 -0
  11. package/dist/domain-pack/authoring.d.ts +172 -0
  12. package/dist/domain-pack/authoring.js +1896 -0
  13. package/dist/domain-pack/authoring.js.map +1 -0
  14. package/dist/domain-pack/contracts.d.ts +183 -0
  15. package/dist/domain-pack/contracts.js +65 -0
  16. package/dist/domain-pack/contracts.js.map +1 -0
  17. package/dist/domain-pack/index.d.ts +8 -0
  18. package/dist/domain-pack/index.js +3813 -0
  19. package/dist/domain-pack/index.js.map +1 -0
  20. package/dist/domain-pack/ontology/software-entities-v1.d.ts +102 -0
  21. package/dist/domain-pack/ontology/software-entities-v1.js +104 -0
  22. package/dist/domain-pack/ontology/software-entities-v1.js.map +1 -0
  23. package/dist/domain-pack/packs/developer-reasoning.d.ts +14 -0
  24. package/dist/domain-pack/packs/developer-reasoning.js +339 -0
  25. package/dist/domain-pack/packs/developer-reasoning.js.map +1 -0
  26. package/dist/domain-pack/packs/engineering-accelerator.d.ts +11 -0
  27. package/dist/domain-pack/packs/engineering-accelerator.js +1348 -0
  28. package/dist/domain-pack/packs/engineering-accelerator.js.map +1 -0
  29. package/dist/domain-pack/packs/index.d.ts +18 -0
  30. package/dist/domain-pack/packs/index.js +2653 -0
  31. package/dist/domain-pack/packs/index.js.map +1 -0
  32. package/dist/domain-pack/shaping.d.ts +54 -0
  33. package/dist/domain-pack/shaping.js +1013 -0
  34. package/dist/domain-pack/shaping.js.map +1 -0
  35. package/dist/domain-pack/validation.d.ts +26 -0
  36. package/dist/domain-pack/validation.js +775 -0
  37. package/dist/domain-pack/validation.js.map +1 -0
  38. package/dist/domain-pack.d.ts +8 -0
  39. package/dist/domain-pack.js +3813 -0
  40. package/dist/domain-pack.js.map +1 -0
  41. package/dist/index.d.ts +29 -0
  42. package/dist/index.js +5520 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/lifecycle.d.ts +27 -0
  45. package/dist/lifecycle.js +98 -0
  46. package/dist/lifecycle.js.map +1 -0
  47. package/dist/manifestValidation.d.ts +28 -0
  48. package/dist/manifestValidation.js +253 -0
  49. package/dist/manifestValidation.js.map +1 -0
  50. package/dist/manifests/chat-v1.d.ts +10 -0
  51. package/dist/manifests/chat-v1.js +87 -0
  52. package/dist/manifests/chat-v1.js.map +1 -0
  53. package/dist/manifests/deals-v1.d.ts +10 -0
  54. package/dist/manifests/deals-v1.js +107 -0
  55. package/dist/manifests/deals-v1.js.map +1 -0
  56. package/dist/manifests/decisions-v1.d.ts +10 -0
  57. package/dist/manifests/decisions-v1.js +103 -0
  58. package/dist/manifests/decisions-v1.js.map +1 -0
  59. package/dist/manifests/documents-v1.d.ts +10 -0
  60. package/dist/manifests/documents-v1.js +88 -0
  61. package/dist/manifests/documents-v1.js.map +1 -0
  62. package/dist/manifests/epistemic-algorithms-v1.d.ts +10 -0
  63. package/dist/manifests/epistemic-algorithms-v1.js +107 -0
  64. package/dist/manifests/epistemic-algorithms-v1.js.map +1 -0
  65. package/dist/manifests/graph-visualization-v1.d.ts +10 -0
  66. package/dist/manifests/graph-visualization-v1.js +88 -0
  67. package/dist/manifests/graph-visualization-v1.js.map +1 -0
  68. package/dist/manifests/index.d.ts +23 -0
  69. package/dist/manifests/index.js +955 -0
  70. package/dist/manifests/index.js.map +1 -0
  71. package/dist/manifests/news-v1.d.ts +10 -0
  72. package/dist/manifests/news-v1.js +93 -0
  73. package/dist/manifests/news-v1.js.map +1 -0
  74. package/dist/manifests/philosophy-mode-v1.d.ts +10 -0
  75. package/dist/manifests/philosophy-mode-v1.js +100 -0
  76. package/dist/manifests/philosophy-mode-v1.js.map +1 -0
  77. package/dist/manifests/task-management-v1.d.ts +10 -0
  78. package/dist/manifests/task-management-v1.js +86 -0
  79. package/dist/manifests/task-management-v1.js.map +1 -0
  80. package/dist/manifests/team-analysis-v1.d.ts +10 -0
  81. package/dist/manifests/team-analysis-v1.js +93 -0
  82. package/dist/manifests/team-analysis-v1.js.map +1 -0
  83. package/dist/manifests/themes-v1.d.ts +10 -0
  84. package/dist/manifests/themes-v1.js +118 -0
  85. package/dist/manifests/themes-v1.js.map +1 -0
  86. package/dist/manifests/user-profiles-v1.d.ts +10 -0
  87. package/dist/manifests/user-profiles-v1.js +100 -0
  88. package/dist/manifests/user-profiles-v1.js.map +1 -0
  89. package/dist/manifests.d.ts +14 -0
  90. package/dist/manifests.js +955 -0
  91. package/dist/manifests.js.map +1 -0
  92. package/dist/namespacePolicy.d.ts +26 -0
  93. package/dist/namespacePolicy.js +129 -0
  94. package/dist/namespacePolicy.js.map +1 -0
  95. package/dist/registry.d.ts +13 -0
  96. package/dist/registry.js +1710 -0
  97. package/dist/registry.js.map +1 -0
  98. package/dist/runtime.d.ts +19 -0
  99. package/dist/runtime.js +638 -0
  100. package/dist/runtime.js.map +1 -0
  101. package/dist/serviceContracts.d.ts +18 -0
  102. package/dist/serviceContracts.js +64 -0
  103. package/dist/serviceContracts.js.map +1 -0
  104. package/package.json +48 -0
@@ -0,0 +1,27 @@
1
+ import { PackLifecycle, AppPackManifest } from './contracts.js';
2
+
3
+ /**
4
+ * Pack Lifecycle Enforcement
5
+ *
6
+ * License and dependency checks for tenant/workspace pack enablement.
7
+ */
8
+
9
+ type PackEnablementReason = "allowed" | "pack_not_found" | "lifecycle_blocked" | "license_missing" | "dependency_missing" | "dependency_not_installed" | "dependency_not_enabled";
10
+ type PackEnablementDecision = {
11
+ packKey: string;
12
+ allowed: boolean;
13
+ reason: PackEnablementReason;
14
+ missingDependencies: string[];
15
+ };
16
+ type PackEnablementPolicy = {
17
+ requireExplicitEntitlement?: boolean;
18
+ allowedLifecycles?: readonly PackLifecycle[];
19
+ tenantEntitledPackKeys?: readonly string[];
20
+ workspaceEntitledPackKeys?: readonly string[];
21
+ installedPackKeys?: readonly string[];
22
+ enabledPackKeys?: readonly string[];
23
+ };
24
+ declare function evaluatePackEnablement(packKey: string, registry: Record<string, AppPackManifest>, policy?: PackEnablementPolicy): PackEnablementDecision;
25
+ declare function evaluateCatalogEnablement(registry: Record<string, AppPackManifest>, policy?: PackEnablementPolicy): PackEnablementDecision[];
26
+
27
+ export { type PackEnablementDecision, type PackEnablementPolicy, type PackEnablementReason, evaluateCatalogEnablement, evaluatePackEnablement };
@@ -0,0 +1,98 @@
1
+ // src/lifecycle.ts
2
+ var DEFAULT_ALLOWED_LIFECYCLES = [
3
+ "active",
4
+ "beta",
5
+ "experimental"
6
+ ];
7
+ function toSet(values) {
8
+ return new Set(values ?? []);
9
+ }
10
+ function evaluatePackEnablement(packKey, registry, policy = {}) {
11
+ const manifest = registry[packKey];
12
+ if (!manifest) {
13
+ return {
14
+ packKey,
15
+ allowed: false,
16
+ reason: "pack_not_found",
17
+ missingDependencies: []
18
+ };
19
+ }
20
+ const allowedLifecycles = new Set(
21
+ policy.allowedLifecycles ?? DEFAULT_ALLOWED_LIFECYCLES
22
+ );
23
+ if (!allowedLifecycles.has(manifest.lifecycle)) {
24
+ return {
25
+ packKey,
26
+ allowed: false,
27
+ reason: "lifecycle_blocked",
28
+ missingDependencies: []
29
+ };
30
+ }
31
+ const requireExplicitEntitlement = policy.requireExplicitEntitlement ?? false;
32
+ if (requireExplicitEntitlement) {
33
+ const entitled = /* @__PURE__ */ new Set([
34
+ ...toSet(policy.tenantEntitledPackKeys),
35
+ ...toSet(policy.workspaceEntitledPackKeys)
36
+ ]);
37
+ if (!entitled.has(packKey)) {
38
+ return {
39
+ packKey,
40
+ allowed: false,
41
+ reason: "license_missing",
42
+ missingDependencies: []
43
+ };
44
+ }
45
+ }
46
+ const missingDependencies = manifest.dependencies.filter(
47
+ (dependency) => !registry[dependency]
48
+ );
49
+ if (missingDependencies.length > 0) {
50
+ return {
51
+ packKey,
52
+ allowed: false,
53
+ reason: "dependency_missing",
54
+ missingDependencies
55
+ };
56
+ }
57
+ const installed = toSet(policy.installedPackKeys);
58
+ if (installed.size > 0) {
59
+ const notInstalled = manifest.dependencies.filter(
60
+ (dependency) => !installed.has(dependency)
61
+ );
62
+ if (notInstalled.length > 0) {
63
+ return {
64
+ packKey,
65
+ allowed: false,
66
+ reason: "dependency_not_installed",
67
+ missingDependencies: notInstalled
68
+ };
69
+ }
70
+ }
71
+ const enabled = toSet(policy.enabledPackKeys);
72
+ if (enabled.size > 0) {
73
+ const notEnabled = manifest.dependencies.filter(
74
+ (dependency) => !enabled.has(dependency)
75
+ );
76
+ if (notEnabled.length > 0) {
77
+ return {
78
+ packKey,
79
+ allowed: false,
80
+ reason: "dependency_not_enabled",
81
+ missingDependencies: notEnabled
82
+ };
83
+ }
84
+ }
85
+ return {
86
+ packKey,
87
+ allowed: true,
88
+ reason: "allowed",
89
+ missingDependencies: []
90
+ };
91
+ }
92
+ function evaluateCatalogEnablement(registry, policy = {}) {
93
+ return Object.keys(registry).sort().map((packKey) => evaluatePackEnablement(packKey, registry, policy));
94
+ }
95
+
96
+ export { evaluateCatalogEnablement, evaluatePackEnablement };
97
+ //# sourceMappingURL=lifecycle.js.map
98
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lifecycle.ts"],"names":[],"mappings":"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","file":"lifecycle.js","sourcesContent":["/**\n * Pack Lifecycle Enforcement\n *\n * License and dependency checks for tenant/workspace pack enablement.\n */\n\nimport type { AppPackManifest, PackLifecycle } from \"./contracts\";\n\nexport type PackEnablementReason =\n | \"allowed\"\n | \"pack_not_found\"\n | \"lifecycle_blocked\"\n | \"license_missing\"\n | \"dependency_missing\"\n | \"dependency_not_installed\"\n | \"dependency_not_enabled\";\n\nexport type PackEnablementDecision = {\n packKey: string;\n allowed: boolean;\n reason: PackEnablementReason;\n missingDependencies: string[];\n};\n\nexport type PackEnablementPolicy = {\n requireExplicitEntitlement?: boolean;\n allowedLifecycles?: readonly PackLifecycle[];\n tenantEntitledPackKeys?: readonly string[];\n workspaceEntitledPackKeys?: readonly string[];\n installedPackKeys?: readonly string[];\n enabledPackKeys?: readonly string[];\n};\n\nconst DEFAULT_ALLOWED_LIFECYCLES: PackLifecycle[] = [\n \"active\",\n \"beta\",\n \"experimental\",\n];\n\nfunction toSet(values?: readonly string[]): Set<string> {\n return new Set(values ?? []);\n}\n\nexport function evaluatePackEnablement(\n packKey: string,\n registry: Record<string, AppPackManifest>,\n policy: PackEnablementPolicy = {}\n): PackEnablementDecision {\n const manifest = registry[packKey];\n if (!manifest) {\n return {\n packKey,\n allowed: false,\n reason: \"pack_not_found\",\n missingDependencies: [],\n };\n }\n\n const allowedLifecycles = new Set(\n policy.allowedLifecycles ?? DEFAULT_ALLOWED_LIFECYCLES\n );\n if (!allowedLifecycles.has(manifest.lifecycle)) {\n return {\n packKey,\n allowed: false,\n reason: \"lifecycle_blocked\",\n missingDependencies: [],\n };\n }\n\n const requireExplicitEntitlement = policy.requireExplicitEntitlement ?? false;\n if (requireExplicitEntitlement) {\n const entitled = new Set([\n ...toSet(policy.tenantEntitledPackKeys),\n ...toSet(policy.workspaceEntitledPackKeys),\n ]);\n if (!entitled.has(packKey)) {\n return {\n packKey,\n allowed: false,\n reason: \"license_missing\",\n missingDependencies: [],\n };\n }\n }\n\n const missingDependencies = manifest.dependencies.filter(\n (dependency) => !registry[dependency]\n );\n if (missingDependencies.length > 0) {\n return {\n packKey,\n allowed: false,\n reason: \"dependency_missing\",\n missingDependencies,\n };\n }\n\n const installed = toSet(policy.installedPackKeys);\n if (installed.size > 0) {\n const notInstalled = manifest.dependencies.filter(\n (dependency) => !installed.has(dependency)\n );\n if (notInstalled.length > 0) {\n return {\n packKey,\n allowed: false,\n reason: \"dependency_not_installed\",\n missingDependencies: notInstalled,\n };\n }\n }\n\n const enabled = toSet(policy.enabledPackKeys);\n if (enabled.size > 0) {\n const notEnabled = manifest.dependencies.filter(\n (dependency) => !enabled.has(dependency)\n );\n if (notEnabled.length > 0) {\n return {\n packKey,\n allowed: false,\n reason: \"dependency_not_enabled\",\n missingDependencies: notEnabled,\n };\n }\n }\n\n return {\n packKey,\n allowed: true,\n reason: \"allowed\",\n missingDependencies: [],\n };\n}\n\nexport function evaluateCatalogEnablement(\n registry: Record<string, AppPackManifest>,\n policy: PackEnablementPolicy = {}\n): PackEnablementDecision[] {\n return Object.keys(registry)\n .sort()\n .map((packKey) => evaluatePackEnablement(packKey, registry, policy));\n}\n"]}
@@ -0,0 +1,28 @@
1
+ import { AppPackManifest } from './contracts.js';
2
+
3
+ /**
4
+ * Pack Manifest Validation
5
+ *
6
+ * Runtime schema and dictionary validation for app-pack manifests.
7
+ */
8
+
9
+ type PackValidationSeverity = "error" | "warning";
10
+ type PackValidationIssue = {
11
+ code: string;
12
+ severity: PackValidationSeverity;
13
+ message: string;
14
+ path: string;
15
+ };
16
+ type PackManifestValidationResult = {
17
+ manifestKey: string;
18
+ valid: boolean;
19
+ issues: PackValidationIssue[];
20
+ };
21
+ type PackSchemaDictionary = {
22
+ nodeTypes: readonly string[];
23
+ edgeTypes: readonly string[];
24
+ tables: readonly string[];
25
+ };
26
+ declare function validateAppPackManifest(manifest: AppPackManifest, dictionary?: PackSchemaDictionary): PackManifestValidationResult;
27
+
28
+ export { type PackManifestValidationResult, type PackSchemaDictionary, type PackValidationIssue, type PackValidationSeverity, validateAppPackManifest };
@@ -0,0 +1,253 @@
1
+ import { z } from 'zod';
2
+
3
+ // src/manifestValidation.ts
4
+ var manifestKeyPattern = /^[a-z0-9]+(?:-[a-z0-9]+)*-v[0-9]+$/;
5
+ var semverPattern = /^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/;
6
+ var appPackManifestSchema = z.object({
7
+ key: z.string().regex(manifestKeyPattern),
8
+ name: z.string().min(1),
9
+ version: z.string().regex(semverPattern),
10
+ lifecycle: z.enum(["active", "beta", "experimental"]),
11
+ category: z.enum([
12
+ "conversation",
13
+ "research",
14
+ "graph",
15
+ "analytics",
16
+ "workflow",
17
+ "decision",
18
+ "news",
19
+ "documents",
20
+ "identity",
21
+ "operations",
22
+ "domain"
23
+ ]),
24
+ description: z.string().min(1),
25
+ dependencies: z.array(z.string().min(1)),
26
+ capabilityFlags: z.array(z.string().min(1)),
27
+ routeNamespace: z.object({
28
+ web: z.array(z.string().min(1)),
29
+ api: z.array(z.string().min(1))
30
+ }),
31
+ surfaces: z.object({
32
+ components: z.array(z.string().min(1)),
33
+ convex: z.array(z.string().min(1)),
34
+ tools: z.array(z.string().min(1))
35
+ }),
36
+ policyProfile: z.object({
37
+ audiences: z.array(z.string().min(1)).min(1),
38
+ rules: z.array(
39
+ z.object({
40
+ resource: z.enum([
41
+ "project",
42
+ "node",
43
+ "edge",
44
+ "artifact",
45
+ "report_section",
46
+ "tool_action",
47
+ "task",
48
+ "user_profile",
49
+ "team_analytics"
50
+ ]),
51
+ actions: z.array(z.enum(["read", "summarize", "export", "mutate", "admin"])).min(1),
52
+ notes: z.string().optional()
53
+ })
54
+ ).min(1)
55
+ }),
56
+ dataContract: z.object({
57
+ requiredNodeTypes: z.array(z.string().min(1)),
58
+ requiredEdgeTypes: z.array(z.string().min(1)),
59
+ requiredTables: z.array(z.string().min(1)).min(1),
60
+ projectionBehavior: z.enum([
61
+ "none",
62
+ "inherits_policy",
63
+ "projection_required"
64
+ ])
65
+ }),
66
+ templates: z.object({
67
+ workflows: z.array(z.string().min(1)),
68
+ prompts: z.array(z.string().min(1)),
69
+ reports: z.array(z.string().min(1)),
70
+ uiLabels: z.array(z.string().min(1))
71
+ }),
72
+ testSuite: z.object({
73
+ parity: z.array(z.string().min(1)).min(1),
74
+ policy: z.array(z.string().min(1)).min(1),
75
+ contract: z.array(z.string().min(1)).min(1)
76
+ }),
77
+ sharedServices: z.array(
78
+ z.object({
79
+ service: z.enum([
80
+ "decision-kernel",
81
+ "knowledge-compiler",
82
+ "learning-loop"
83
+ ]),
84
+ mode: z.enum(["required", "optional"]),
85
+ contracts: z.array(z.string().min(1)).min(1)
86
+ })
87
+ )
88
+ });
89
+ function toIssue(code, message, path, severity = "error") {
90
+ return {
91
+ code,
92
+ severity,
93
+ message,
94
+ path
95
+ };
96
+ }
97
+ function collectDuplicateValues(values) {
98
+ const counts = /* @__PURE__ */ new Map();
99
+ for (const value of values) {
100
+ counts.set(value, (counts.get(value) ?? 0) + 1);
101
+ }
102
+ return [...counts.entries()].filter(([, count]) => count > 1).map(([value]) => value).sort();
103
+ }
104
+ function collectUnknownValues(values, knownValues) {
105
+ const known = new Set(knownValues);
106
+ return values.filter((value) => !known.has(value));
107
+ }
108
+ function validateManifestShape(manifest) {
109
+ const parsed = appPackManifestSchema.safeParse(manifest);
110
+ if (parsed.success) {
111
+ return [];
112
+ }
113
+ return parsed.error.issues.map(
114
+ (issue) => toIssue(
115
+ "PACK_MANIFEST_SCHEMA_INVALID",
116
+ issue.message,
117
+ issue.path.join(".") || "(root)"
118
+ )
119
+ );
120
+ }
121
+ function validateManifestUniqueness(manifest) {
122
+ const issues = [];
123
+ const duplicateDependencies = collectDuplicateValues(manifest.dependencies);
124
+ if (duplicateDependencies.length > 0) {
125
+ issues.push(
126
+ toIssue(
127
+ "PACK_DEPENDENCIES_DUPLICATE",
128
+ `Duplicate dependencies declared: ${duplicateDependencies.join(", ")}`,
129
+ "dependencies"
130
+ )
131
+ );
132
+ }
133
+ if (manifest.dependencies.includes(manifest.key)) {
134
+ issues.push(
135
+ toIssue(
136
+ "PACK_DEPENDENCY_SELF_REFERENCE",
137
+ `Pack "${manifest.key}" cannot depend on itself.`,
138
+ "dependencies"
139
+ )
140
+ );
141
+ }
142
+ const duplicateCapabilities = collectDuplicateValues(
143
+ manifest.capabilityFlags
144
+ );
145
+ if (duplicateCapabilities.length > 0) {
146
+ issues.push(
147
+ toIssue(
148
+ "PACK_CAPABILITIES_DUPLICATE",
149
+ `Duplicate capability flags declared: ${duplicateCapabilities.join(", ")}`,
150
+ "capabilityFlags"
151
+ )
152
+ );
153
+ }
154
+ const duplicateWebRoutes = collectDuplicateValues(
155
+ manifest.routeNamespace.web
156
+ );
157
+ if (duplicateWebRoutes.length > 0) {
158
+ issues.push(
159
+ toIssue(
160
+ "PACK_WEB_ROUTES_DUPLICATE",
161
+ `Duplicate web routes declared: ${duplicateWebRoutes.join(", ")}`,
162
+ "routeNamespace.web"
163
+ )
164
+ );
165
+ }
166
+ const duplicateApiRoutes = collectDuplicateValues(
167
+ manifest.routeNamespace.api
168
+ );
169
+ if (duplicateApiRoutes.length > 0) {
170
+ issues.push(
171
+ toIssue(
172
+ "PACK_API_ROUTES_DUPLICATE",
173
+ `Duplicate api routes declared: ${duplicateApiRoutes.join(", ")}`,
174
+ "routeNamespace.api"
175
+ )
176
+ );
177
+ }
178
+ const duplicateServices = collectDuplicateValues(
179
+ manifest.sharedServices.map((integration) => integration.service)
180
+ );
181
+ if (duplicateServices.length > 0) {
182
+ issues.push(
183
+ toIssue(
184
+ "PACK_SHARED_SERVICE_DUPLICATE",
185
+ `Duplicate shared-service integrations declared: ${duplicateServices.join(", ")}`,
186
+ "sharedServices"
187
+ )
188
+ );
189
+ }
190
+ return issues;
191
+ }
192
+ function validateManifestDictionary(manifest, dictionary) {
193
+ if (!dictionary) {
194
+ return [];
195
+ }
196
+ const issues = [];
197
+ const unknownNodeTypes = collectUnknownValues(
198
+ manifest.dataContract.requiredNodeTypes,
199
+ dictionary.nodeTypes
200
+ );
201
+ const unknownEdgeTypes = collectUnknownValues(
202
+ manifest.dataContract.requiredEdgeTypes,
203
+ dictionary.edgeTypes
204
+ );
205
+ const unknownTables = collectUnknownValues(
206
+ manifest.dataContract.requiredTables,
207
+ dictionary.tables
208
+ );
209
+ if (unknownNodeTypes.length > 0) {
210
+ issues.push(
211
+ toIssue(
212
+ "PACK_UNKNOWN_NODE_TYPES",
213
+ `Unknown required node types: ${unknownNodeTypes.join(", ")}`,
214
+ "dataContract.requiredNodeTypes"
215
+ )
216
+ );
217
+ }
218
+ if (unknownEdgeTypes.length > 0) {
219
+ issues.push(
220
+ toIssue(
221
+ "PACK_UNKNOWN_EDGE_TYPES",
222
+ `Unknown required edge types: ${unknownEdgeTypes.join(", ")}`,
223
+ "dataContract.requiredEdgeTypes"
224
+ )
225
+ );
226
+ }
227
+ if (unknownTables.length > 0) {
228
+ issues.push(
229
+ toIssue(
230
+ "PACK_UNKNOWN_TABLES",
231
+ `Unknown required tables: ${unknownTables.join(", ")}`,
232
+ "dataContract.requiredTables"
233
+ )
234
+ );
235
+ }
236
+ return issues;
237
+ }
238
+ function validateAppPackManifest(manifest, dictionary) {
239
+ const issues = [
240
+ ...validateManifestShape(manifest),
241
+ ...validateManifestUniqueness(manifest),
242
+ ...validateManifestDictionary(manifest, dictionary)
243
+ ];
244
+ return {
245
+ manifestKey: manifest.key,
246
+ valid: issues.every((issue) => issue.severity !== "error"),
247
+ issues
248
+ };
249
+ }
250
+
251
+ export { validateAppPackManifest };
252
+ //# sourceMappingURL=manifestValidation.js.map
253
+ //# sourceMappingURL=manifestValidation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/manifestValidation.ts"],"names":[],"mappings":"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","file":"manifestValidation.js","sourcesContent":["/**\n * Pack Manifest Validation\n *\n * Runtime schema and dictionary validation for app-pack manifests.\n */\n\nimport { z } from \"zod\";\nimport type { AppPackManifest } from \"./contracts\";\n\nconst manifestKeyPattern = /^[a-z0-9]+(?:-[a-z0-9]+)*-v[0-9]+$/;\nconst semverPattern = /^\\d+\\.\\d+\\.\\d+(?:[-+][0-9A-Za-z.-]+)?$/;\n\nexport type PackValidationSeverity = \"error\" | \"warning\";\n\nexport type PackValidationIssue = {\n code: string;\n severity: PackValidationSeverity;\n message: string;\n path: string;\n};\n\nexport type PackManifestValidationResult = {\n manifestKey: string;\n valid: boolean;\n issues: PackValidationIssue[];\n};\n\nexport type PackSchemaDictionary = {\n nodeTypes: readonly string[];\n edgeTypes: readonly string[];\n tables: readonly string[];\n};\n\nconst appPackManifestSchema = z.object({\n key: z.string().regex(manifestKeyPattern),\n name: z.string().min(1),\n version: z.string().regex(semverPattern),\n lifecycle: z.enum([\"active\", \"beta\", \"experimental\"]),\n category: z.enum([\n \"conversation\",\n \"research\",\n \"graph\",\n \"analytics\",\n \"workflow\",\n \"decision\",\n \"news\",\n \"documents\",\n \"identity\",\n \"operations\",\n \"domain\",\n ]),\n description: z.string().min(1),\n dependencies: z.array(z.string().min(1)),\n capabilityFlags: z.array(z.string().min(1)),\n routeNamespace: z.object({\n web: z.array(z.string().min(1)),\n api: z.array(z.string().min(1)),\n }),\n surfaces: z.object({\n components: z.array(z.string().min(1)),\n convex: z.array(z.string().min(1)),\n tools: z.array(z.string().min(1)),\n }),\n policyProfile: z.object({\n audiences: z.array(z.string().min(1)).min(1),\n rules: z\n .array(\n z.object({\n resource: z.enum([\n \"project\",\n \"node\",\n \"edge\",\n \"artifact\",\n \"report_section\",\n \"tool_action\",\n \"task\",\n \"user_profile\",\n \"team_analytics\",\n ]),\n actions: z\n .array(z.enum([\"read\", \"summarize\", \"export\", \"mutate\", \"admin\"]))\n .min(1),\n notes: z.string().optional(),\n })\n )\n .min(1),\n }),\n dataContract: z.object({\n requiredNodeTypes: z.array(z.string().min(1)),\n requiredEdgeTypes: z.array(z.string().min(1)),\n requiredTables: z.array(z.string().min(1)).min(1),\n projectionBehavior: z.enum([\n \"none\",\n \"inherits_policy\",\n \"projection_required\",\n ]),\n }),\n templates: z.object({\n workflows: z.array(z.string().min(1)),\n prompts: z.array(z.string().min(1)),\n reports: z.array(z.string().min(1)),\n uiLabels: z.array(z.string().min(1)),\n }),\n testSuite: z.object({\n parity: z.array(z.string().min(1)).min(1),\n policy: z.array(z.string().min(1)).min(1),\n contract: z.array(z.string().min(1)).min(1),\n }),\n sharedServices: z.array(\n z.object({\n service: z.enum([\n \"decision-kernel\",\n \"knowledge-compiler\",\n \"learning-loop\",\n ]),\n mode: z.enum([\"required\", \"optional\"]),\n contracts: z.array(z.string().min(1)).min(1),\n })\n ),\n});\n\nfunction toIssue(\n code: string,\n message: string,\n path: string,\n severity: PackValidationSeverity = \"error\"\n): PackValidationIssue {\n return {\n code,\n severity,\n message,\n path,\n };\n}\n\nfunction collectDuplicateValues(values: readonly string[]): string[] {\n const counts = new Map<string, number>();\n for (const value of values) {\n counts.set(value, (counts.get(value) ?? 0) + 1);\n }\n return [...counts.entries()]\n .filter(([, count]) => count > 1)\n .map(([value]) => value)\n .sort();\n}\n\nfunction collectUnknownValues(\n values: readonly string[],\n knownValues: readonly string[]\n): string[] {\n const known = new Set(knownValues);\n return values.filter((value) => !known.has(value));\n}\n\nfunction validateManifestShape(\n manifest: AppPackManifest\n): PackValidationIssue[] {\n const parsed = appPackManifestSchema.safeParse(manifest);\n if (parsed.success) {\n return [];\n }\n\n return parsed.error.issues.map((issue) =>\n toIssue(\n \"PACK_MANIFEST_SCHEMA_INVALID\",\n issue.message,\n issue.path.join(\".\") || \"(root)\"\n )\n );\n}\n\nfunction validateManifestUniqueness(\n manifest: AppPackManifest\n): PackValidationIssue[] {\n const issues: PackValidationIssue[] = [];\n\n const duplicateDependencies = collectDuplicateValues(manifest.dependencies);\n if (duplicateDependencies.length > 0) {\n issues.push(\n toIssue(\n \"PACK_DEPENDENCIES_DUPLICATE\",\n `Duplicate dependencies declared: ${duplicateDependencies.join(\", \")}`,\n \"dependencies\"\n )\n );\n }\n\n if (manifest.dependencies.includes(manifest.key)) {\n issues.push(\n toIssue(\n \"PACK_DEPENDENCY_SELF_REFERENCE\",\n `Pack \"${manifest.key}\" cannot depend on itself.`,\n \"dependencies\"\n )\n );\n }\n\n const duplicateCapabilities = collectDuplicateValues(\n manifest.capabilityFlags\n );\n if (duplicateCapabilities.length > 0) {\n issues.push(\n toIssue(\n \"PACK_CAPABILITIES_DUPLICATE\",\n `Duplicate capability flags declared: ${duplicateCapabilities.join(\", \")}`,\n \"capabilityFlags\"\n )\n );\n }\n\n const duplicateWebRoutes = collectDuplicateValues(\n manifest.routeNamespace.web\n );\n if (duplicateWebRoutes.length > 0) {\n issues.push(\n toIssue(\n \"PACK_WEB_ROUTES_DUPLICATE\",\n `Duplicate web routes declared: ${duplicateWebRoutes.join(\", \")}`,\n \"routeNamespace.web\"\n )\n );\n }\n\n const duplicateApiRoutes = collectDuplicateValues(\n manifest.routeNamespace.api\n );\n if (duplicateApiRoutes.length > 0) {\n issues.push(\n toIssue(\n \"PACK_API_ROUTES_DUPLICATE\",\n `Duplicate api routes declared: ${duplicateApiRoutes.join(\", \")}`,\n \"routeNamespace.api\"\n )\n );\n }\n\n const duplicateServices = collectDuplicateValues(\n manifest.sharedServices.map((integration) => integration.service)\n );\n if (duplicateServices.length > 0) {\n issues.push(\n toIssue(\n \"PACK_SHARED_SERVICE_DUPLICATE\",\n `Duplicate shared-service integrations declared: ${duplicateServices.join(\", \")}`,\n \"sharedServices\"\n )\n );\n }\n\n return issues;\n}\n\nfunction validateManifestDictionary(\n manifest: AppPackManifest,\n dictionary?: PackSchemaDictionary\n): PackValidationIssue[] {\n if (!dictionary) {\n return [];\n }\n\n const issues: PackValidationIssue[] = [];\n const unknownNodeTypes = collectUnknownValues(\n manifest.dataContract.requiredNodeTypes,\n dictionary.nodeTypes\n );\n const unknownEdgeTypes = collectUnknownValues(\n manifest.dataContract.requiredEdgeTypes,\n dictionary.edgeTypes\n );\n const unknownTables = collectUnknownValues(\n manifest.dataContract.requiredTables,\n dictionary.tables\n );\n\n if (unknownNodeTypes.length > 0) {\n issues.push(\n toIssue(\n \"PACK_UNKNOWN_NODE_TYPES\",\n `Unknown required node types: ${unknownNodeTypes.join(\", \")}`,\n \"dataContract.requiredNodeTypes\"\n )\n );\n }\n\n if (unknownEdgeTypes.length > 0) {\n issues.push(\n toIssue(\n \"PACK_UNKNOWN_EDGE_TYPES\",\n `Unknown required edge types: ${unknownEdgeTypes.join(\", \")}`,\n \"dataContract.requiredEdgeTypes\"\n )\n );\n }\n\n if (unknownTables.length > 0) {\n issues.push(\n toIssue(\n \"PACK_UNKNOWN_TABLES\",\n `Unknown required tables: ${unknownTables.join(\", \")}`,\n \"dataContract.requiredTables\"\n )\n );\n }\n\n return issues;\n}\n\nexport function validateAppPackManifest(\n manifest: AppPackManifest,\n dictionary?: PackSchemaDictionary\n): PackManifestValidationResult {\n const issues: PackValidationIssue[] = [\n ...validateManifestShape(manifest),\n ...validateManifestUniqueness(manifest),\n ...validateManifestDictionary(manifest, dictionary),\n ];\n\n return {\n manifestKey: manifest.key,\n valid: issues.every((issue) => issue.severity !== \"error\"),\n issues,\n };\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import { AppPackManifest } from '../contracts.js';
2
+
3
+ /**
4
+ * App Pack Manifest: chat-v1
5
+ *
6
+ * Declarative runtime contract for the chat-v1 application pack.
7
+ */
8
+ declare const chatV1Manifest: AppPackManifest;
9
+
10
+ export { chatV1Manifest };
@@ -0,0 +1,87 @@
1
+ // src/contracts.ts
2
+ function normalizeStringArray(values) {
3
+ const normalized = values.map((value) => value.trim()).filter((value) => value.length > 0);
4
+ return Array.from(new Set(normalized));
5
+ }
6
+ function defineAppPackManifest(manifest) {
7
+ const sharedServices = (manifest.sharedServices ?? []).map((integration) => ({
8
+ ...integration,
9
+ contracts: normalizeStringArray(integration.contracts)
10
+ }));
11
+ return {
12
+ ...manifest,
13
+ dependencies: normalizeStringArray(manifest.dependencies),
14
+ capabilityFlags: normalizeStringArray(manifest.capabilityFlags),
15
+ sharedServices
16
+ };
17
+ }
18
+
19
+ // src/manifests/chat-v1.ts
20
+ var chatV1Manifest = defineAppPackManifest({
21
+ key: "chat-v1",
22
+ name: "Chat",
23
+ version: "1.0.0",
24
+ lifecycle: "active",
25
+ category: "conversation",
26
+ description: "Core conversational runtime, streaming orchestration, and tool invocation shell.",
27
+ dependencies: [],
28
+ capabilityFlags: [
29
+ "chat.streaming",
30
+ "chat.history",
31
+ "tool.invocation",
32
+ "slash.commands",
33
+ "voice.mode"
34
+ ],
35
+ routeNamespace: {
36
+ web: ["/(chat)/chat", "/(chat)/chat/[id]"],
37
+ api: [
38
+ "/(chat)/api/chat",
39
+ "/(chat)/api/coach",
40
+ "/(chat)/api/history",
41
+ "/(chat)/api/suggestions",
42
+ "/(chat)/api/vote"
43
+ ]
44
+ },
45
+ surfaces: {
46
+ components: [
47
+ "components/chat/*",
48
+ "components/chat/sidebars/*",
49
+ "components/chat/viewers/*"
50
+ ],
51
+ convex: ["convex/chats.ts", "convex/messages.ts", "convex/chatState.ts"],
52
+ tools: ["lib/ai/tools/project-tools.ts"]
53
+ },
54
+ policyProfile: {
55
+ audiences: ["internal", "lp", "public"],
56
+ rules: [
57
+ { resource: "project", actions: ["read", "summarize"] },
58
+ {
59
+ resource: "tool_action",
60
+ actions: ["read", "mutate"],
61
+ notes: "Mutation tools must pass server-side policy checks."
62
+ },
63
+ { resource: "artifact", actions: ["read", "summarize"] }
64
+ ]
65
+ },
66
+ dataContract: {
67
+ requiredNodeTypes: ["belief", "question", "evidence", "theme", "deal"],
68
+ requiredEdgeTypes: ["informs", "answers", "belongs_to"],
69
+ requiredTables: ["chats", "messages", "chatState", "projects"],
70
+ projectionBehavior: "inherits_policy"
71
+ },
72
+ templates: {
73
+ workflows: ["chat/default", "chat/voice-mode"],
74
+ prompts: ["chat/main-system-prompt", "chat/voice-mode-style"],
75
+ reports: [],
76
+ uiLabels: ["chat", "assistant", "conversation"]
77
+ },
78
+ testSuite: {
79
+ parity: ["chat-streaming-parity", "slash-command-parity"],
80
+ policy: ["chat-context-filtering", "tool-deny-enforcement"],
81
+ contract: ["chat-pack-contract-v1"]
82
+ }
83
+ });
84
+
85
+ export { chatV1Manifest };
86
+ //# sourceMappingURL=chat-v1.js.map
87
+ //# sourceMappingURL=chat-v1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/contracts.ts","../../src/manifests/chat-v1.ts"],"names":[],"mappings":"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","file":"chat-v1.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","/**\n * App Pack Manifest: chat-v1\n *\n * Declarative runtime contract for the chat-v1 application pack.\n */\n\nimport { defineAppPackManifest } from \"../contracts\";\n\nexport const chatV1Manifest = defineAppPackManifest({\n key: \"chat-v1\",\n name: \"Chat\",\n version: \"1.0.0\",\n lifecycle: \"active\",\n category: \"conversation\",\n description:\n \"Core conversational runtime, streaming orchestration, and tool invocation shell.\",\n dependencies: [],\n capabilityFlags: [\n \"chat.streaming\",\n \"chat.history\",\n \"tool.invocation\",\n \"slash.commands\",\n \"voice.mode\",\n ],\n routeNamespace: {\n web: [\"/(chat)/chat\", \"/(chat)/chat/[id]\"],\n api: [\n \"/(chat)/api/chat\",\n \"/(chat)/api/coach\",\n \"/(chat)/api/history\",\n \"/(chat)/api/suggestions\",\n \"/(chat)/api/vote\",\n ],\n },\n surfaces: {\n components: [\n \"components/chat/*\",\n \"components/chat/sidebars/*\",\n \"components/chat/viewers/*\",\n ],\n convex: [\"convex/chats.ts\", \"convex/messages.ts\", \"convex/chatState.ts\"],\n tools: [\"lib/ai/tools/project-tools.ts\"],\n },\n policyProfile: {\n audiences: [\"internal\", \"lp\", \"public\"],\n rules: [\n { resource: \"project\", actions: [\"read\", \"summarize\"] },\n {\n resource: \"tool_action\",\n actions: [\"read\", \"mutate\"],\n notes: \"Mutation tools must pass server-side policy checks.\",\n },\n { resource: \"artifact\", actions: [\"read\", \"summarize\"] },\n ],\n },\n dataContract: {\n requiredNodeTypes: [\"belief\", \"question\", \"evidence\", \"theme\", \"deal\"],\n requiredEdgeTypes: [\"informs\", \"answers\", \"belongs_to\"],\n requiredTables: [\"chats\", \"messages\", \"chatState\", \"projects\"],\n projectionBehavior: \"inherits_policy\",\n },\n templates: {\n workflows: [\"chat/default\", \"chat/voice-mode\"],\n prompts: [\"chat/main-system-prompt\", \"chat/voice-mode-style\"],\n reports: [],\n uiLabels: [\"chat\", \"assistant\", \"conversation\"],\n },\n testSuite: {\n parity: [\"chat-streaming-parity\", \"slash-command-parity\"],\n policy: [\"chat-context-filtering\", \"tool-deny-enforcement\"],\n contract: [\"chat-pack-contract-v1\"],\n },\n});\n"]}
@@ -0,0 +1,10 @@
1
+ import { AppPackManifest } from '../contracts.js';
2
+
3
+ /**
4
+ * App Pack Manifest: deals-v1
5
+ *
6
+ * Declarative runtime contract for the deals-v1 application pack.
7
+ */
8
+ declare const dealsV1Manifest: AppPackManifest;
9
+
10
+ export { dealsV1Manifest };