@lumenflow/kernel 3.0.0

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 (127) hide show
  1. package/LICENSE.md +190 -0
  2. package/README.md +26 -0
  3. package/dist/canonical-json.d.ts +7 -0
  4. package/dist/canonical-json.d.ts.map +1 -0
  5. package/dist/canonical-json.js +50 -0
  6. package/dist/canonical-json.js.map +1 -0
  7. package/dist/event-kinds.d.ts +32 -0
  8. package/dist/event-kinds.d.ts.map +1 -0
  9. package/dist/event-kinds.js +49 -0
  10. package/dist/event-kinds.js.map +1 -0
  11. package/dist/event-store/index.d.ts +64 -0
  12. package/dist/event-store/index.d.ts.map +1 -0
  13. package/dist/event-store/index.js +634 -0
  14. package/dist/event-store/index.js.map +1 -0
  15. package/dist/evidence/evidence-store.d.ts +78 -0
  16. package/dist/evidence/evidence-store.d.ts.map +1 -0
  17. package/dist/evidence/evidence-store.js +409 -0
  18. package/dist/evidence/evidence-store.js.map +1 -0
  19. package/dist/evidence/fs-helpers.d.ts +13 -0
  20. package/dist/evidence/fs-helpers.d.ts.map +1 -0
  21. package/dist/evidence/fs-helpers.js +38 -0
  22. package/dist/evidence/fs-helpers.js.map +1 -0
  23. package/dist/evidence/index.d.ts +3 -0
  24. package/dist/evidence/index.d.ts.map +1 -0
  25. package/dist/evidence/index.js +5 -0
  26. package/dist/evidence/index.js.map +1 -0
  27. package/dist/index.d.ts +17 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +19 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/kernel.schemas.d.ts +642 -0
  32. package/dist/kernel.schemas.d.ts.map +1 -0
  33. package/dist/kernel.schemas.js +331 -0
  34. package/dist/kernel.schemas.js.map +1 -0
  35. package/dist/pack/hash.d.ts +7 -0
  36. package/dist/pack/hash.d.ts.map +1 -0
  37. package/dist/pack/hash.js +56 -0
  38. package/dist/pack/hash.js.map +1 -0
  39. package/dist/pack/index.d.ts +4 -0
  40. package/dist/pack/index.d.ts.map +1 -0
  41. package/dist/pack/index.js +6 -0
  42. package/dist/pack/index.js.map +1 -0
  43. package/dist/pack/manifest.d.ts +100 -0
  44. package/dist/pack/manifest.d.ts.map +1 -0
  45. package/dist/pack/manifest.js +50 -0
  46. package/dist/pack/manifest.js.map +1 -0
  47. package/dist/pack/pack-loader.d.ts +108 -0
  48. package/dist/pack/pack-loader.d.ts.map +1 -0
  49. package/dist/pack/pack-loader.js +282 -0
  50. package/dist/pack/pack-loader.js.map +1 -0
  51. package/dist/policy/approval-event.d.ts +29 -0
  52. package/dist/policy/approval-event.d.ts.map +1 -0
  53. package/dist/policy/approval-event.js +17 -0
  54. package/dist/policy/approval-event.js.map +1 -0
  55. package/dist/policy/index.d.ts +3 -0
  56. package/dist/policy/index.d.ts.map +1 -0
  57. package/dist/policy/index.js +5 -0
  58. package/dist/policy/index.js.map +1 -0
  59. package/dist/policy/policy-engine.d.ts +52 -0
  60. package/dist/policy/policy-engine.d.ts.map +1 -0
  61. package/dist/policy/policy-engine.js +83 -0
  62. package/dist/policy/policy-engine.js.map +1 -0
  63. package/dist/runtime/index.d.ts +2 -0
  64. package/dist/runtime/index.d.ts.map +1 -0
  65. package/dist/runtime/index.js +4 -0
  66. package/dist/runtime/index.js.map +1 -0
  67. package/dist/runtime/kernel-runtime.d.ts +170 -0
  68. package/dist/runtime/kernel-runtime.d.ts.map +1 -0
  69. package/dist/runtime/kernel-runtime.js +751 -0
  70. package/dist/runtime/kernel-runtime.js.map +1 -0
  71. package/dist/sandbox/bwrap-invocation.d.ts +13 -0
  72. package/dist/sandbox/bwrap-invocation.d.ts.map +1 -0
  73. package/dist/sandbox/bwrap-invocation.js +105 -0
  74. package/dist/sandbox/bwrap-invocation.js.map +1 -0
  75. package/dist/sandbox/index.d.ts +5 -0
  76. package/dist/sandbox/index.d.ts.map +1 -0
  77. package/dist/sandbox/index.js +7 -0
  78. package/dist/sandbox/index.js.map +1 -0
  79. package/dist/sandbox/profile.d.ts +32 -0
  80. package/dist/sandbox/profile.d.ts.map +1 -0
  81. package/dist/sandbox/profile.js +101 -0
  82. package/dist/sandbox/profile.js.map +1 -0
  83. package/dist/sandbox/subprocess-dispatcher.d.ts +38 -0
  84. package/dist/sandbox/subprocess-dispatcher.d.ts.map +1 -0
  85. package/dist/sandbox/subprocess-dispatcher.js +145 -0
  86. package/dist/sandbox/subprocess-dispatcher.js.map +1 -0
  87. package/dist/sandbox/tool-runner-worker.d.ts +54 -0
  88. package/dist/sandbox/tool-runner-worker.d.ts.map +1 -0
  89. package/dist/sandbox/tool-runner-worker.js +159 -0
  90. package/dist/sandbox/tool-runner-worker.js.map +1 -0
  91. package/dist/shared-constants.d.ts +48 -0
  92. package/dist/shared-constants.d.ts.map +1 -0
  93. package/dist/shared-constants.js +49 -0
  94. package/dist/shared-constants.js.map +1 -0
  95. package/dist/state-machine/index.d.ts +30 -0
  96. package/dist/state-machine/index.d.ts.map +1 -0
  97. package/dist/state-machine/index.js +92 -0
  98. package/dist/state-machine/index.js.map +1 -0
  99. package/dist/tool-host/builtins/capabilities.d.ts +20 -0
  100. package/dist/tool-host/builtins/capabilities.d.ts.map +1 -0
  101. package/dist/tool-host/builtins/capabilities.js +211 -0
  102. package/dist/tool-host/builtins/capabilities.js.map +1 -0
  103. package/dist/tool-host/builtins/index.d.ts +2 -0
  104. package/dist/tool-host/builtins/index.d.ts.map +1 -0
  105. package/dist/tool-host/builtins/index.js +4 -0
  106. package/dist/tool-host/builtins/index.js.map +1 -0
  107. package/dist/tool-host/index.d.ts +5 -0
  108. package/dist/tool-host/index.d.ts.map +1 -0
  109. package/dist/tool-host/index.js +7 -0
  110. package/dist/tool-host/index.js.map +1 -0
  111. package/dist/tool-host/scope-intersection.d.ts +10 -0
  112. package/dist/tool-host/scope-intersection.d.ts.map +1 -0
  113. package/dist/tool-host/scope-intersection.js +188 -0
  114. package/dist/tool-host/scope-intersection.js.map +1 -0
  115. package/dist/tool-host/subprocess-dispatcher.d.ts +14 -0
  116. package/dist/tool-host/subprocess-dispatcher.d.ts.map +1 -0
  117. package/dist/tool-host/subprocess-dispatcher.js +14 -0
  118. package/dist/tool-host/subprocess-dispatcher.js.map +1 -0
  119. package/dist/tool-host/tool-host.d.ts +42 -0
  120. package/dist/tool-host/tool-host.d.ts.map +1 -0
  121. package/dist/tool-host/tool-host.js +395 -0
  122. package/dist/tool-host/tool-host.js.map +1 -0
  123. package/dist/tool-host/tool-registry.d.ts +9 -0
  124. package/dist/tool-host/tool-registry.d.ts.map +1 -0
  125. package/dist/tool-host/tool-registry.js +28 -0
  126. package/dist/tool-host/tool-registry.js.map +1 -0
  127. package/package.json +71 -0
@@ -0,0 +1,108 @@
1
+ import { KERNEL_EVENT_KINDS } from '../event-kinds.js';
2
+ import type { PackPin, WorkspaceSpec } from '../kernel.schemas.js';
3
+ import { type DomainPackManifest } from './manifest.js';
4
+ /**
5
+ * Port interface for git operations used by PackLoader.
6
+ *
7
+ * Consumers must provide an implementation (e.g. wrapping simple-git)
8
+ * so that PackLoader remains testable without real git operations.
9
+ */
10
+ export interface GitClient {
11
+ /** Clone a repository to the target directory. */
12
+ clone(url: string, targetDir: string): Promise<void>;
13
+ /** Pull latest changes in an existing repository. */
14
+ pull(repoDir: string): Promise<void>;
15
+ /** Checkout a specific tag or ref. */
16
+ checkout(repoDir: string, ref: string): Promise<void>;
17
+ /** Check whether a directory is an existing git repository. */
18
+ isRepo(dir: string): Promise<boolean>;
19
+ }
20
+ /**
21
+ * Port interface for registry operations used by PackLoader.
22
+ *
23
+ * Consumers must provide an implementation (e.g. wrapping fetch/got)
24
+ * so that PackLoader remains testable without real HTTP operations.
25
+ */
26
+ export interface RegistryPackMetadata {
27
+ /** URL to the tarball containing the pack contents. */
28
+ tarball_url: string;
29
+ /** Integrity hash of the tarball (informational, actual verification uses pack hash). */
30
+ integrity: string;
31
+ }
32
+ export interface RegistryClient {
33
+ /** Fetch pack metadata from the registry API. */
34
+ fetchMetadata(packId: string, version: string, registryUrl: string): Promise<RegistryPackMetadata>;
35
+ /** Download and extract the tarball to the target directory. */
36
+ downloadTarball(tarballUrl: string, targetDir: string): Promise<void>;
37
+ }
38
+ export interface WorkspaceWarningEvent {
39
+ schema_version: 1;
40
+ kind: typeof KERNEL_EVENT_KINDS.WORKSPACE_WARNING;
41
+ timestamp: string;
42
+ message: string;
43
+ }
44
+ export interface PackLoaderOptions {
45
+ packsRoot: string;
46
+ manifestFileName?: string;
47
+ hashExclusions?: string[];
48
+ runtimeEnvironment?: string;
49
+ allowDevIntegrityInProduction?: boolean;
50
+ /** Directory for caching git-sourced packs. Defaults to ~/.lumenflow/pack-cache/ */
51
+ packCacheDir?: string;
52
+ /** Git client for resolving packs with source: git. Required when loading git packs. */
53
+ gitClient?: GitClient;
54
+ /** Registry client for resolving packs with source: registry. Required when loading registry packs. */
55
+ registryClient?: RegistryClient;
56
+ /** Default registry URL. Overridden by PackPin.registry_url when set. Defaults to https://registry.lumenflow.dev */
57
+ defaultRegistryUrl?: string;
58
+ }
59
+ export interface PackLoadInput {
60
+ workspaceSpec: WorkspaceSpec;
61
+ packId: string;
62
+ onWorkspaceWarning?: (event: WorkspaceWarningEvent) => void;
63
+ }
64
+ export interface LoadedDomainPack {
65
+ pin: PackPin;
66
+ manifest: DomainPackManifest;
67
+ packRoot: string;
68
+ integrity: string;
69
+ }
70
+ export declare function resolvePackToolEntryPath(packRoot: string, entry: string): string;
71
+ export declare function validatePackImportBoundaries(packRoot: string, hashExclusions?: string[]): Promise<void>;
72
+ export declare class PackLoader {
73
+ private readonly packsRoot;
74
+ private readonly manifestFileName;
75
+ private readonly hashExclusions?;
76
+ private readonly runtimeEnvironment;
77
+ private readonly allowDevIntegrityInProduction;
78
+ private readonly packCacheDir;
79
+ private readonly gitClient?;
80
+ private readonly registryClient?;
81
+ private readonly defaultRegistryUrl;
82
+ constructor(options: PackLoaderOptions);
83
+ load(input: PackLoadInput): Promise<LoadedDomainPack>;
84
+ /**
85
+ * Resolve the pack root directory based on the pin source.
86
+ * For local packs, resolves relative to packsRoot.
87
+ * For git packs, clones/pulls to the pack cache and checks out the version tag.
88
+ * For registry packs, fetches metadata and downloads tarball to the pack cache.
89
+ */
90
+ private resolvePackRoot;
91
+ /**
92
+ * Resolve a git-sourced pack by cloning or pulling to the pack cache,
93
+ * then checking out the version tag.
94
+ */
95
+ private resolveGitPackRoot;
96
+ /**
97
+ * Resolve a registry-sourced pack by fetching metadata and downloading the tarball
98
+ * to the pack cache. Skips download if the pack is already cached.
99
+ */
100
+ private resolveRegistryPackRoot;
101
+ /**
102
+ * Load pack from a resolved on-disk directory.
103
+ * Handles manifest parsing, tool entry validation, import boundary checks,
104
+ * integrity verification, and dev-mode warnings.
105
+ */
106
+ private loadFromDisk;
107
+ }
108
+ //# sourceMappingURL=pack-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack-loader.d.ts","sourceRoot":"","sources":["../../src/pack/pack-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,282 @@
1
+ // Copyright (c) 2026 Hellmai Ltd
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { builtinModules } from 'node:module';
4
+ import path from 'node:path';
5
+ import { access, mkdir, readFile } from 'node:fs/promises';
6
+ import { homedir } from 'node:os';
7
+ import YAML from 'yaml';
8
+ import { KERNEL_EVENT_KINDS } from '../event-kinds.js';
9
+ import { LUMENFLOW_DIR_NAME, PACK_MANIFEST_FILE_NAME, SHA256_INTEGRITY_PREFIX, UTF8_ENCODING, } from '../shared-constants.js';
10
+ import { computeDeterministicPackHash, listPackFiles } from './hash.js';
11
+ import { DomainPackManifestSchema } from './manifest.js';
12
+ const PACK_CACHE_DIR_NAME = 'pack-cache';
13
+ const VERSION_TAG_PREFIX = 'v';
14
+ const DEFAULT_REGISTRY_URL = 'https://registry.lumenflow.dev';
15
+ const NODE_BUILTINS = new Set(builtinModules.map((moduleName) => moduleName.replace(/^node:/, '')));
16
+ const ALLOWED_BARE_IMPORT_SPECIFIERS = new Set(['simple-git']);
17
+ const IMPORT_SPECIFIER_PATTERNS = [
18
+ /\bimport\s+(?:[^'"]*?\sfrom\s*)?["']([^"']+)["']/,
19
+ /\bexport\s+[^'"]*?\sfrom\s*["']([^"']+)["']/,
20
+ /\bimport\(\s*["']([^"']+)["']\s*\)/,
21
+ ];
22
+ /**
23
+ * Best-effort import boundary scanner.
24
+ *
25
+ * LIMITATION: regex matching cannot fully parse JavaScript/TypeScript and can miss
26
+ * dynamic require/template-string patterns. This is an additional guard, not a
27
+ * replacement for sandboxing/runtime policy enforcement.
28
+ */
29
+ function isWithinRoot(root, candidatePath) {
30
+ const relative = path.relative(root, candidatePath);
31
+ return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));
32
+ }
33
+ function isRuntimeSourceFile(relativePath) {
34
+ const normalizedPath = relativePath.replace(/\\/g, '/');
35
+ const extension = path.extname(normalizedPath);
36
+ const isCodeFile = ['.ts', '.tsx', '.mts', '.cts', '.js', '.mjs', '.cjs'].includes(extension);
37
+ if (!isCodeFile) {
38
+ return false;
39
+ }
40
+ if (normalizedPath.includes('/__tests__/')) {
41
+ return false;
42
+ }
43
+ return !/\.(test|spec)\.[cm]?[jt]sx?$/.test(normalizedPath);
44
+ }
45
+ function parseToolEntry(entry) {
46
+ const separator = entry.indexOf('#');
47
+ const modulePath = separator < 0 ? entry : entry.slice(0, separator);
48
+ const exportName = separator < 0 ? undefined : entry.slice(separator + 1);
49
+ if (modulePath.trim().length === 0) {
50
+ throw new Error(`Pack tool entry "${entry}" is missing a module path.`);
51
+ }
52
+ if (exportName !== undefined && exportName.trim().length === 0) {
53
+ throw new Error(`Pack tool entry "${entry}" has an empty export fragment.`);
54
+ }
55
+ return {
56
+ modulePath,
57
+ exportName,
58
+ };
59
+ }
60
+ export function resolvePackToolEntryPath(packRoot, entry) {
61
+ const absolutePackRoot = path.resolve(packRoot);
62
+ const { modulePath, exportName } = parseToolEntry(entry);
63
+ const absoluteModulePath = path.resolve(absolutePackRoot, modulePath);
64
+ if (!isWithinRoot(absolutePackRoot, absoluteModulePath)) {
65
+ throw new Error(`Pack tool entry "${entry}" resolves outside pack root.`);
66
+ }
67
+ return exportName ? `${absoluteModulePath}#${exportName}` : absoluteModulePath;
68
+ }
69
+ function extractImportSpecifiers(sourceCode) {
70
+ const specifiers = new Set();
71
+ for (const pattern of IMPORT_SPECIFIER_PATTERNS) {
72
+ // Create a fresh global matcher per call to avoid shared RegExp state.
73
+ const globalPattern = new RegExp(pattern.source, 'g');
74
+ for (const match of sourceCode.matchAll(globalPattern)) {
75
+ if (match[1]) {
76
+ specifiers.add(match[1]);
77
+ }
78
+ }
79
+ }
80
+ return [...specifiers];
81
+ }
82
+ function isAllowedKernelImport(specifier) {
83
+ return specifier === '@lumenflow/kernel' || specifier.startsWith('@lumenflow/kernel/');
84
+ }
85
+ function validateImportSpecifier(options) {
86
+ const { specifier, sourceFilePath, packRoot } = options;
87
+ if (specifier.startsWith('node:')) {
88
+ return;
89
+ }
90
+ if (NODE_BUILTINS.has(specifier)) {
91
+ return;
92
+ }
93
+ if (isAllowedKernelImport(specifier)) {
94
+ return;
95
+ }
96
+ if (specifier.startsWith('@lumenflow/')) {
97
+ throw new Error(`Import "${specifier}" in ${sourceFilePath} is not allowed; only @lumenflow/kernel and Node built-ins are permitted.`);
98
+ }
99
+ if (path.isAbsolute(specifier)) {
100
+ throw new Error(`Import "${specifier}" in ${sourceFilePath} resolves outside pack root.`);
101
+ }
102
+ if (specifier.startsWith('.')) {
103
+ const absoluteFilePath = path.resolve(packRoot, sourceFilePath);
104
+ const resolvedImport = path.resolve(path.dirname(absoluteFilePath), specifier);
105
+ if (!isWithinRoot(packRoot, resolvedImport)) {
106
+ throw new Error(`Import "${specifier}" in ${sourceFilePath} resolves outside pack root.`);
107
+ }
108
+ return;
109
+ }
110
+ if (ALLOWED_BARE_IMPORT_SPECIFIERS.has(specifier)) {
111
+ return;
112
+ }
113
+ throw new Error(`Bare package import "${specifier}" in ${sourceFilePath} is not allowed; only relative imports, @lumenflow/kernel, and Node built-ins are permitted.`);
114
+ }
115
+ export async function validatePackImportBoundaries(packRoot, hashExclusions) {
116
+ const files = await listPackFiles(packRoot, hashExclusions);
117
+ const candidateFiles = files.filter((relativePath) => isRuntimeSourceFile(relativePath));
118
+ for (const relativePath of candidateFiles) {
119
+ const sourceCode = await readFile(path.join(packRoot, relativePath), UTF8_ENCODING);
120
+ const importSpecifiers = extractImportSpecifiers(sourceCode);
121
+ for (const specifier of importSpecifiers) {
122
+ validateImportSpecifier({
123
+ specifier,
124
+ sourceFilePath: relativePath,
125
+ packRoot,
126
+ });
127
+ }
128
+ }
129
+ }
130
+ function resolvePackPin(workspaceSpec, packId) {
131
+ const pin = workspaceSpec.packs.find((candidate) => candidate.id === packId);
132
+ if (!pin) {
133
+ throw new Error(`Pack "${packId}" is not present in workspace PackPin entries.`);
134
+ }
135
+ return pin;
136
+ }
137
+ export class PackLoader {
138
+ packsRoot;
139
+ manifestFileName;
140
+ hashExclusions;
141
+ runtimeEnvironment;
142
+ allowDevIntegrityInProduction;
143
+ packCacheDir;
144
+ gitClient;
145
+ registryClient;
146
+ defaultRegistryUrl;
147
+ constructor(options) {
148
+ this.packsRoot = path.resolve(options.packsRoot);
149
+ this.manifestFileName = options.manifestFileName || PACK_MANIFEST_FILE_NAME;
150
+ this.hashExclusions = options.hashExclusions;
151
+ this.runtimeEnvironment = options.runtimeEnvironment ?? process.env.NODE_ENV ?? 'development';
152
+ this.allowDevIntegrityInProduction = options.allowDevIntegrityInProduction ?? false;
153
+ this.packCacheDir =
154
+ options.packCacheDir ?? path.join(homedir(), LUMENFLOW_DIR_NAME, PACK_CACHE_DIR_NAME);
155
+ this.gitClient = options.gitClient;
156
+ this.registryClient = options.registryClient;
157
+ this.defaultRegistryUrl = options.defaultRegistryUrl ?? DEFAULT_REGISTRY_URL;
158
+ }
159
+ async load(input) {
160
+ const pin = resolvePackPin(input.workspaceSpec, input.packId);
161
+ const packRoot = await this.resolvePackRoot(pin);
162
+ return this.loadFromDisk(pin, packRoot, input);
163
+ }
164
+ /**
165
+ * Resolve the pack root directory based on the pin source.
166
+ * For local packs, resolves relative to packsRoot.
167
+ * For git packs, clones/pulls to the pack cache and checks out the version tag.
168
+ * For registry packs, fetches metadata and downloads tarball to the pack cache.
169
+ */
170
+ async resolvePackRoot(pin) {
171
+ if (pin.source === 'git') {
172
+ return this.resolveGitPackRoot(pin);
173
+ }
174
+ if (pin.source === 'registry') {
175
+ return this.resolveRegistryPackRoot(pin);
176
+ }
177
+ return path.resolve(this.packsRoot, pin.id);
178
+ }
179
+ /**
180
+ * Resolve a git-sourced pack by cloning or pulling to the pack cache,
181
+ * then checking out the version tag.
182
+ */
183
+ async resolveGitPackRoot(pin) {
184
+ if (!pin.url) {
185
+ throw new Error(`Pack "${pin.id}" has source: git but no url field. ` +
186
+ 'Add a url field to the PackPin to specify the git repository.');
187
+ }
188
+ if (!this.gitClient) {
189
+ throw new Error(`Pack "${pin.id}" has source: git but no gitClient was provided to PackLoader. ` +
190
+ 'Pass a gitClient in PackLoaderOptions to load git-sourced packs.');
191
+ }
192
+ const packCachePath = path.join(this.packCacheDir, `${pin.id}@${pin.version}`);
193
+ await mkdir(this.packCacheDir, { recursive: true });
194
+ const alreadyCached = await this.gitClient.isRepo(packCachePath);
195
+ if (alreadyCached) {
196
+ await this.gitClient.pull(packCachePath);
197
+ }
198
+ else {
199
+ await this.gitClient.clone(pin.url, packCachePath);
200
+ }
201
+ const versionTag = `${VERSION_TAG_PREFIX}${pin.version}`;
202
+ await this.gitClient.checkout(packCachePath, versionTag);
203
+ return packCachePath;
204
+ }
205
+ /**
206
+ * Resolve a registry-sourced pack by fetching metadata and downloading the tarball
207
+ * to the pack cache. Skips download if the pack is already cached.
208
+ */
209
+ async resolveRegistryPackRoot(pin) {
210
+ if (!this.registryClient) {
211
+ throw new Error(`Pack "${pin.id}" has source: registry but no registryClient was provided to PackLoader. ` +
212
+ 'Pass a registryClient in PackLoaderOptions to load registry-sourced packs.');
213
+ }
214
+ const packCachePath = path.join(this.packCacheDir, `${pin.id}@${pin.version}`);
215
+ await mkdir(this.packCacheDir, { recursive: true });
216
+ // Skip download if the pack manifest already exists in cache
217
+ const manifestCachePath = path.join(packCachePath, this.manifestFileName);
218
+ const alreadyCached = await access(manifestCachePath)
219
+ .then(() => true)
220
+ .catch(() => false);
221
+ if (!alreadyCached) {
222
+ const registryUrl = pin.registry_url ?? this.defaultRegistryUrl;
223
+ const metadata = await this.registryClient.fetchMetadata(pin.id, pin.version, registryUrl);
224
+ await this.registryClient.downloadTarball(metadata.tarball_url, packCachePath);
225
+ }
226
+ return packCachePath;
227
+ }
228
+ /**
229
+ * Load pack from a resolved on-disk directory.
230
+ * Handles manifest parsing, tool entry validation, import boundary checks,
231
+ * integrity verification, and dev-mode warnings.
232
+ */
233
+ async loadFromDisk(pin, packRoot, input) {
234
+ const manifestPath = path.join(packRoot, this.manifestFileName);
235
+ const manifestRaw = await readFile(manifestPath, UTF8_ENCODING);
236
+ const manifest = DomainPackManifestSchema.parse(YAML.parse(manifestRaw));
237
+ if (manifest.id !== pin.id) {
238
+ throw new Error(`Pack manifest id mismatch: expected ${pin.id}, got ${manifest.id}`);
239
+ }
240
+ if (manifest.version !== pin.version) {
241
+ throw new Error(`Pack manifest version mismatch: expected ${pin.version}, got ${manifest.version}`);
242
+ }
243
+ for (const tool of manifest.tools) {
244
+ resolvePackToolEntryPath(packRoot, tool.entry);
245
+ }
246
+ await validatePackImportBoundaries(packRoot, this.hashExclusions);
247
+ const integrity = await computeDeterministicPackHash({
248
+ packRoot,
249
+ exclusions: this.hashExclusions,
250
+ });
251
+ if (pin.integrity === 'dev') {
252
+ if (this.runtimeEnvironment === 'production' && !this.allowDevIntegrityInProduction) {
253
+ throw new Error(`Pack ${pin.id}@${pin.version} uses integrity: dev is not allowed in production.`);
254
+ }
255
+ input.onWorkspaceWarning?.({
256
+ schema_version: 1,
257
+ kind: KERNEL_EVENT_KINDS.WORKSPACE_WARNING,
258
+ timestamp: new Date().toISOString(),
259
+ message: `Pack ${pin.id}@${pin.version} loaded with integrity: dev (verification skipped).`,
260
+ });
261
+ return {
262
+ pin,
263
+ manifest,
264
+ packRoot,
265
+ integrity,
266
+ };
267
+ }
268
+ const expectedIntegrity = pin.integrity.startsWith(SHA256_INTEGRITY_PREFIX)
269
+ ? pin.integrity.slice(SHA256_INTEGRITY_PREFIX.length)
270
+ : pin.integrity;
271
+ if (integrity !== expectedIntegrity) {
272
+ throw new Error(`Pack integrity mismatch for ${pin.id}: expected ${expectedIntegrity}, got ${integrity}`);
273
+ }
274
+ return {
275
+ pin,
276
+ manifest,
277
+ packRoot,
278
+ integrity,
279
+ };
280
+ }
281
+ }
282
+ //# sourceMappingURL=pack-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack-loader.js","sourceRoot":"","sources":["../../src/pack/pack-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { z } from 'zod';
2
+ export declare const ApprovalScopeSchema: z.ZodObject<{
3
+ level: z.ZodEnum<{
4
+ task: "task";
5
+ workspace: "workspace";
6
+ pack: "pack";
7
+ lane: "lane";
8
+ }>;
9
+ id: z.ZodString;
10
+ }, z.core.$strip>;
11
+ export declare const ApprovalEventSchema: z.ZodObject<{
12
+ schema_version: z.ZodLiteral<1>;
13
+ kind: z.ZodLiteral<"approval_event">;
14
+ run_id: z.ZodString;
15
+ scope: z.ZodObject<{
16
+ level: z.ZodEnum<{
17
+ task: "task";
18
+ workspace: "workspace";
19
+ pack: "pack";
20
+ lane: "lane";
21
+ }>;
22
+ id: z.ZodString;
23
+ }, z.core.$strip>;
24
+ approved_by: z.ZodString;
25
+ expires_at: z.ZodString;
26
+ reason: z.ZodOptional<z.ZodString>;
27
+ }, z.core.$strip>;
28
+ export type ApprovalEvent = z.infer<typeof ApprovalEventSchema>;
29
+ //# sourceMappingURL=approval-event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-event.d.ts","sourceRoot":"","sources":["../../src/policy/approval-event.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,mBAAmB;;;;;;;;iBAG9B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;iBAQ9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ // Copyright (c) 2026 Hellmai Ltd
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { z } from 'zod';
4
+ export const ApprovalScopeSchema = z.object({
5
+ level: z.enum(['workspace', 'lane', 'pack', 'task']),
6
+ id: z.string().min(1),
7
+ });
8
+ export const ApprovalEventSchema = z.object({
9
+ schema_version: z.literal(1),
10
+ kind: z.literal('approval_event'),
11
+ run_id: z.string().min(1),
12
+ scope: ApprovalScopeSchema,
13
+ approved_by: z.string().min(1),
14
+ expires_at: z.string().datetime(),
15
+ reason: z.string().min(1).optional(),
16
+ });
17
+ //# sourceMappingURL=approval-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-event.js","sourceRoot":"","sources":["../../src/policy/approval-event.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,sCAAsC;AAEtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpD,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CACtB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC;IACjC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,KAAK,EAAE,mBAAmB;IAC1B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './approval-event.js';
2
+ export * from './policy-engine.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/policy/index.ts"],"names":[],"mappings":"AAGA,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,5 @@
1
+ // Copyright (c) 2026 Hellmai Ltd
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ export * from './approval-event.js';
4
+ export * from './policy-engine.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/policy/index.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,sCAAsC;AAEtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,52 @@
1
+ import type { PolicyDecision } from '../kernel.schemas.js';
2
+ export declare const POLICY_TRIGGERS: {
3
+ readonly ON_TOOL_REQUEST: "on_tool_request";
4
+ readonly ON_CLAIM: "on_claim";
5
+ readonly ON_COMPLETION: "on_completion";
6
+ readonly ON_EVIDENCE_ADDED: "on_evidence_added";
7
+ };
8
+ export type PolicyTrigger = (typeof POLICY_TRIGGERS)[keyof typeof POLICY_TRIGGERS];
9
+ export type PolicyLayerLevel = 'workspace' | 'lane' | 'pack' | 'task';
10
+ export type PolicyEffect = 'allow' | 'deny';
11
+ export interface PolicyEvaluationContext {
12
+ trigger: PolicyTrigger;
13
+ run_id: string;
14
+ tool_name?: string;
15
+ task_id?: string;
16
+ lane_id?: string;
17
+ pack_id?: string;
18
+ }
19
+ export interface PolicyRule {
20
+ id: string;
21
+ trigger: PolicyTrigger;
22
+ decision: PolicyEffect;
23
+ reason?: string;
24
+ when?: (context: PolicyEvaluationContext) => boolean;
25
+ }
26
+ export interface PolicyLayer {
27
+ level: PolicyLayerLevel;
28
+ default_decision?: PolicyEffect;
29
+ /**
30
+ * Opt-in for this layer to relax inherited deny defaults/rules.
31
+ *
32
+ * Important boundary: explicit deny rules remain sticky across the full
33
+ * evaluation. allow_loosening never overrides a hard deny emitted by an
34
+ * earlier layer.
35
+ */
36
+ allow_loosening?: boolean;
37
+ rules: PolicyRule[];
38
+ }
39
+ export interface PolicyEngineOptions {
40
+ layers: PolicyLayer[];
41
+ }
42
+ export interface PolicyEvaluationResult {
43
+ decision: PolicyEffect;
44
+ decisions: PolicyDecision[];
45
+ warnings: string[];
46
+ }
47
+ export declare class PolicyEngine {
48
+ private readonly layers;
49
+ constructor(options: PolicyEngineOptions);
50
+ evaluate(context: PolicyEvaluationContext): Promise<PolicyEvaluationResult>;
51
+ }
52
+ //# sourceMappingURL=policy-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-engine.d.ts","sourceRoot":"","sources":["../../src/policy/policy-engine.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,eAAO,MAAM,eAAe;;;;;CAKlB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,CAAC;AACnF,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AACtE,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,CAAC;AAE5C,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,OAAO,CAAC;CACtD;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,gBAAgB,CAAC;IACxB,gBAAgB,CAAC,EAAE,YAAY,CAAC;IAChC;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,YAAY,CAAC;IACvB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAyBD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,OAAO,EAAE,mBAAmB;IAMlC,QAAQ,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,sBAAsB,CAAC;CA0DlF"}
@@ -0,0 +1,83 @@
1
+ // Copyright (c) 2026 Hellmai Ltd
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ export const POLICY_TRIGGERS = {
4
+ ON_TOOL_REQUEST: 'on_tool_request',
5
+ ON_CLAIM: 'on_claim',
6
+ ON_COMPLETION: 'on_completion',
7
+ ON_EVIDENCE_ADDED: 'on_evidence_added',
8
+ };
9
+ const POLICY_LAYER_ORDER = ['workspace', 'lane', 'pack', 'task'];
10
+ function layerOrderScore(level) {
11
+ const index = POLICY_LAYER_ORDER.indexOf(level);
12
+ return index < 0 ? POLICY_LAYER_ORDER.length : index;
13
+ }
14
+ function matchingRules(layer, context) {
15
+ return layer.rules.filter((rule) => {
16
+ if (rule.trigger !== context.trigger) {
17
+ return false;
18
+ }
19
+ if (!rule.when) {
20
+ return true;
21
+ }
22
+ return rule.when(context);
23
+ });
24
+ }
25
+ function canLoosen(layer) {
26
+ return layer.allow_loosening === true;
27
+ }
28
+ export class PolicyEngine {
29
+ layers;
30
+ constructor(options) {
31
+ this.layers = [...options.layers].sort((left, right) => layerOrderScore(left.level) - layerOrderScore(right.level));
32
+ }
33
+ async evaluate(context) {
34
+ let effectiveDecision = 'deny';
35
+ let hasInitializedDecision = false;
36
+ // Once a deny rule matches, deny-wins is sticky until evaluation completes.
37
+ let hasHardDeny = false;
38
+ const warnings = [];
39
+ const decisions = [];
40
+ for (const layer of this.layers) {
41
+ if (!hasInitializedDecision) {
42
+ if (layer.default_decision) {
43
+ effectiveDecision = layer.default_decision;
44
+ }
45
+ hasInitializedDecision = true;
46
+ }
47
+ else if (layer.default_decision) {
48
+ if (effectiveDecision === 'deny' &&
49
+ layer.default_decision === 'allow' &&
50
+ !canLoosen(layer)) {
51
+ warnings.push(`Policy layer "${layer.level}" attempted loosening default decision without explicit opt-in.`);
52
+ }
53
+ else {
54
+ effectiveDecision = layer.default_decision;
55
+ }
56
+ }
57
+ const layerRules = matchingRules(layer, context);
58
+ for (const rule of layerRules) {
59
+ decisions.push({
60
+ policy_id: rule.id,
61
+ decision: rule.decision,
62
+ reason: rule.reason,
63
+ });
64
+ if (rule.decision === 'deny') {
65
+ hasHardDeny = true;
66
+ effectiveDecision = 'deny';
67
+ continue;
68
+ }
69
+ if (effectiveDecision === 'deny' && !canLoosen(layer)) {
70
+ warnings.push(`Policy layer "${layer.level}" attempted loosening via rule "${rule.id}" without explicit opt-in.`);
71
+ continue;
72
+ }
73
+ effectiveDecision = 'allow';
74
+ }
75
+ }
76
+ return {
77
+ decision: hasHardDeny ? 'deny' : effectiveDecision,
78
+ decisions,
79
+ warnings,
80
+ };
81
+ }
82
+ }
83
+ //# sourceMappingURL=policy-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-engine.js","sourceRoot":"","sources":["../../src/policy/policy-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './kernel-runtime.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAGA,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,4 @@
1
+ // Copyright (c) 2026 Hellmai Ltd
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ export * from './kernel-runtime.js';
4
+ //# sourceMappingURL=index.js.map