@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.
- package/README.md +64 -0
- package/dist/contracts.d.ts +77 -0
- package/dist/contracts.js +21 -0
- package/dist/contracts.js.map +1 -0
- package/dist/convex.config.d.ts +5 -0
- package/dist/convex.config.js +9 -0
- package/dist/convex.config.js.map +1 -0
- package/dist/dependencyResolution.d.ts +18 -0
- package/dist/dependencyResolution.js +131 -0
- package/dist/dependencyResolution.js.map +1 -0
- package/dist/domain-pack/authoring.d.ts +172 -0
- package/dist/domain-pack/authoring.js +1896 -0
- package/dist/domain-pack/authoring.js.map +1 -0
- package/dist/domain-pack/contracts.d.ts +183 -0
- package/dist/domain-pack/contracts.js +65 -0
- package/dist/domain-pack/contracts.js.map +1 -0
- package/dist/domain-pack/index.d.ts +8 -0
- package/dist/domain-pack/index.js +3813 -0
- package/dist/domain-pack/index.js.map +1 -0
- package/dist/domain-pack/ontology/software-entities-v1.d.ts +102 -0
- package/dist/domain-pack/ontology/software-entities-v1.js +104 -0
- package/dist/domain-pack/ontology/software-entities-v1.js.map +1 -0
- package/dist/domain-pack/packs/developer-reasoning.d.ts +14 -0
- package/dist/domain-pack/packs/developer-reasoning.js +339 -0
- package/dist/domain-pack/packs/developer-reasoning.js.map +1 -0
- package/dist/domain-pack/packs/engineering-accelerator.d.ts +11 -0
- package/dist/domain-pack/packs/engineering-accelerator.js +1348 -0
- package/dist/domain-pack/packs/engineering-accelerator.js.map +1 -0
- package/dist/domain-pack/packs/index.d.ts +18 -0
- package/dist/domain-pack/packs/index.js +2653 -0
- package/dist/domain-pack/packs/index.js.map +1 -0
- package/dist/domain-pack/shaping.d.ts +54 -0
- package/dist/domain-pack/shaping.js +1013 -0
- package/dist/domain-pack/shaping.js.map +1 -0
- package/dist/domain-pack/validation.d.ts +26 -0
- package/dist/domain-pack/validation.js +775 -0
- package/dist/domain-pack/validation.js.map +1 -0
- package/dist/domain-pack.d.ts +8 -0
- package/dist/domain-pack.js +3813 -0
- package/dist/domain-pack.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.js +5520 -0
- package/dist/index.js.map +1 -0
- package/dist/lifecycle.d.ts +27 -0
- package/dist/lifecycle.js +98 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/manifestValidation.d.ts +28 -0
- package/dist/manifestValidation.js +253 -0
- package/dist/manifestValidation.js.map +1 -0
- package/dist/manifests/chat-v1.d.ts +10 -0
- package/dist/manifests/chat-v1.js +87 -0
- package/dist/manifests/chat-v1.js.map +1 -0
- package/dist/manifests/deals-v1.d.ts +10 -0
- package/dist/manifests/deals-v1.js +107 -0
- package/dist/manifests/deals-v1.js.map +1 -0
- package/dist/manifests/decisions-v1.d.ts +10 -0
- package/dist/manifests/decisions-v1.js +103 -0
- package/dist/manifests/decisions-v1.js.map +1 -0
- package/dist/manifests/documents-v1.d.ts +10 -0
- package/dist/manifests/documents-v1.js +88 -0
- package/dist/manifests/documents-v1.js.map +1 -0
- package/dist/manifests/epistemic-algorithms-v1.d.ts +10 -0
- package/dist/manifests/epistemic-algorithms-v1.js +107 -0
- package/dist/manifests/epistemic-algorithms-v1.js.map +1 -0
- package/dist/manifests/graph-visualization-v1.d.ts +10 -0
- package/dist/manifests/graph-visualization-v1.js +88 -0
- package/dist/manifests/graph-visualization-v1.js.map +1 -0
- package/dist/manifests/index.d.ts +23 -0
- package/dist/manifests/index.js +955 -0
- package/dist/manifests/index.js.map +1 -0
- package/dist/manifests/news-v1.d.ts +10 -0
- package/dist/manifests/news-v1.js +93 -0
- package/dist/manifests/news-v1.js.map +1 -0
- package/dist/manifests/philosophy-mode-v1.d.ts +10 -0
- package/dist/manifests/philosophy-mode-v1.js +100 -0
- package/dist/manifests/philosophy-mode-v1.js.map +1 -0
- package/dist/manifests/task-management-v1.d.ts +10 -0
- package/dist/manifests/task-management-v1.js +86 -0
- package/dist/manifests/task-management-v1.js.map +1 -0
- package/dist/manifests/team-analysis-v1.d.ts +10 -0
- package/dist/manifests/team-analysis-v1.js +93 -0
- package/dist/manifests/team-analysis-v1.js.map +1 -0
- package/dist/manifests/themes-v1.d.ts +10 -0
- package/dist/manifests/themes-v1.js +118 -0
- package/dist/manifests/themes-v1.js.map +1 -0
- package/dist/manifests/user-profiles-v1.d.ts +10 -0
- package/dist/manifests/user-profiles-v1.js +100 -0
- package/dist/manifests/user-profiles-v1.js.map +1 -0
- package/dist/manifests.d.ts +14 -0
- package/dist/manifests.js +955 -0
- package/dist/manifests.js.map +1 -0
- package/dist/namespacePolicy.d.ts +26 -0
- package/dist/namespacePolicy.js +129 -0
- package/dist/namespacePolicy.js.map +1 -0
- package/dist/registry.d.ts +13 -0
- package/dist/registry.js +1710 -0
- package/dist/registry.js.map +1 -0
- package/dist/runtime.d.ts +19 -0
- package/dist/runtime.js +638 -0
- package/dist/runtime.js.map +1 -0
- package/dist/serviceContracts.d.ts +18 -0
- package/dist/serviceContracts.js +64 -0
- package/dist/serviceContracts.js.map +1 -0
- 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,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":";AA+HA,SAAS,qBAAqB,MAAA,EAA4B;AACxD,EAAA,MAAM,UAAA,GAAa,MAAA,CAChB,GAAA,CAAI,CAAC,UAAU,KAAA,CAAM,IAAA,EAAM,CAAA,CAC3B,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,SAAS,CAAC,CAAA;AACrC,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,GAAA,CAAI,UAAU,CAAC,CAAA;AACvC;AAEO,SAAS,sBACd,QAAA,EACiB;AACjB,EAAA,MAAM,kBAAkB,QAAA,CAAS,cAAA,IAAkB,EAAC,EAAG,GAAA,CAAI,CAAC,WAAA,MAAiB;AAAA,IAC3E,GAAG,WAAA;AAAA,IACH,SAAA,EAAW,oBAAA,CAAqB,WAAA,CAAY,SAAS;AAAA,GACvD,CAAE,CAAA;AAEF,EAAA,OAAO;AAAA,IACL,GAAG,QAAA;AAAA,IACH,YAAA,EAAc,oBAAA,CAAqB,QAAA,CAAS,YAAY,CAAA;AAAA,IACxD,eAAA,EAAiB,oBAAA,CAAqB,QAAA,CAAS,eAAe,CAAA;AAAA,IAC9D;AAAA,GACF;AACF;;;AC5IO,IAAM,iBAAiB,qBAAA,CAAsB;AAAA,EAClD,GAAA,EAAK,SAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,OAAA,EAAS,OAAA;AAAA,EACT,SAAA,EAAW,QAAA;AAAA,EACX,QAAA,EAAU,cAAA;AAAA,EACV,WAAA,EACE,kFAAA;AAAA,EACF,cAAc,EAAC;AAAA,EACf,eAAA,EAAiB;AAAA,IACf,gBAAA;AAAA,IACA,cAAA;AAAA,IACA,iBAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,GAAA,EAAK,CAAC,cAAA,EAAgB,mBAAmB,CAAA;AAAA,IACzC,GAAA,EAAK;AAAA,MACH,kBAAA;AAAA,MACA,mBAAA;AAAA,MACA,qBAAA;AAAA,MACA,yBAAA;AAAA,MACA;AAAA;AACF,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,UAAA,EAAY;AAAA,MACV,mBAAA;AAAA,MACA,4BAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,MAAA,EAAQ,CAAC,iBAAA,EAAmB,oBAAA,EAAsB,qBAAqB,CAAA;AAAA,IACvE,KAAA,EAAO,CAAC,+BAA+B;AAAA,GACzC;AAAA,EACA,aAAA,EAAe;AAAA,IACb,SAAA,EAAW,CAAC,UAAA,EAAY,IAAA,EAAM,QAAQ,CAAA;AAAA,IACtC,KAAA,EAAO;AAAA,MACL,EAAE,QAAA,EAAU,SAAA,EAAW,SAAS,CAAC,MAAA,EAAQ,WAAW,CAAA,EAAE;AAAA,MACtD;AAAA,QACE,QAAA,EAAU,aAAA;AAAA,QACV,OAAA,EAAS,CAAC,MAAA,EAAQ,QAAQ,CAAA;AAAA,QAC1B,KAAA,EAAO;AAAA,OACT;AAAA,MACA,EAAE,QAAA,EAAU,UAAA,EAAY,SAAS,CAAC,MAAA,EAAQ,WAAW,CAAA;AAAE;AACzD,GACF;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,mBAAmB,CAAC,QAAA,EAAU,UAAA,EAAY,UAAA,EAAY,SAAS,MAAM,CAAA;AAAA,IACrE,iBAAA,EAAmB,CAAC,SAAA,EAAW,SAAA,EAAW,YAAY,CAAA;AAAA,IACtD,cAAA,EAAgB,CAAC,OAAA,EAAS,UAAA,EAAY,aAAa,UAAU,CAAA;AAAA,IAC7D,kBAAA,EAAoB;AAAA,GACtB;AAAA,EACA,SAAA,EAAW;AAAA,IACT,SAAA,EAAW,CAAC,cAAA,EAAgB,iBAAiB,CAAA;AAAA,IAC7C,OAAA,EAAS,CAAC,yBAAA,EAA2B,uBAAuB,CAAA;AAAA,IAC5D,SAAS,EAAC;AAAA,IACV,QAAA,EAAU,CAAC,MAAA,EAAQ,WAAA,EAAa,cAAc;AAAA,GAChD;AAAA,EACA,SAAA,EAAW;AAAA,IACT,MAAA,EAAQ,CAAC,uBAAA,EAAyB,sBAAsB,CAAA;AAAA,IACxD,MAAA,EAAQ,CAAC,wBAAA,EAA0B,uBAAuB,CAAA;AAAA,IAC1D,QAAA,EAAU,CAAC,uBAAuB;AAAA;AAEtC,CAAC","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"]}
|