@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,159 @@
1
+ // Copyright (c) 2026 Hellmai Ltd
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import path from 'node:path';
4
+ import { pathToFileURL } from 'node:url';
5
+ import { z } from 'zod';
6
+ import { ToolOutputSchema, ToolScopeSchema, } from '../kernel.schemas.js';
7
+ import { UTF8_ENCODING } from '../shared-constants.js';
8
+ import { resolveScopeEnforcementNote } from './profile.js';
9
+ export const ToolRunnerWorkerInvocationSchema = z.object({
10
+ tool_name: z.string().min(1),
11
+ handler_entry: z.string().min(1),
12
+ input: z.unknown(),
13
+ scope_enforced: z.array(ToolScopeSchema),
14
+ receipt_id: z.string().min(1),
15
+ });
16
+ export const ToolRunnerWorkerResponseSchema = z.object({
17
+ output: ToolOutputSchema,
18
+ });
19
+ function buildFailureOutput(code, message, details) {
20
+ return {
21
+ success: false,
22
+ error: {
23
+ code,
24
+ message,
25
+ ...(details ? { details } : {}),
26
+ },
27
+ };
28
+ }
29
+ function withScopeNote(output, scopeEnforced) {
30
+ const note = resolveScopeEnforcementNote(scopeEnforced);
31
+ if (!note) {
32
+ return output;
33
+ }
34
+ return {
35
+ ...output,
36
+ metadata: {
37
+ ...(output.metadata || {}),
38
+ scope_enforcement_note: note,
39
+ },
40
+ };
41
+ }
42
+ async function defaultImportModule(specifier) {
43
+ return import(specifier);
44
+ }
45
+ function resolveEntrySpecifier(entry) {
46
+ if (entry.startsWith('file:')) {
47
+ return entry;
48
+ }
49
+ if (path.isAbsolute(entry)) {
50
+ return pathToFileURL(path.resolve(entry)).href;
51
+ }
52
+ if (entry.startsWith('.')) {
53
+ return pathToFileURL(path.resolve(process.cwd(), entry)).href;
54
+ }
55
+ return entry;
56
+ }
57
+ function isToolAdapter(value) {
58
+ return typeof value === 'function';
59
+ }
60
+ function selectAdapterExport(candidate) {
61
+ if (isToolAdapter(candidate)) {
62
+ return candidate;
63
+ }
64
+ if (!candidate || typeof candidate !== 'object') {
65
+ return null;
66
+ }
67
+ const moduleRecord = candidate;
68
+ const defaultExport = moduleRecord.default;
69
+ if (isToolAdapter(defaultExport)) {
70
+ return defaultExport;
71
+ }
72
+ const runExport = moduleRecord.run;
73
+ if (isToolAdapter(runExport)) {
74
+ return runExport;
75
+ }
76
+ const handlerExport = moduleRecord.handler;
77
+ if (isToolAdapter(handlerExport)) {
78
+ return handlerExport;
79
+ }
80
+ return null;
81
+ }
82
+ async function readStreamAsString(stream) {
83
+ let output = '';
84
+ for await (const chunk of stream) {
85
+ output += typeof chunk === 'string' ? chunk : chunk.toString(UTF8_ENCODING);
86
+ }
87
+ return output;
88
+ }
89
+ export function parseToolRunnerWorkerResponse(raw) {
90
+ const parsedPayload = JSON.parse(raw);
91
+ return ToolRunnerWorkerResponseSchema.parse(parsedPayload);
92
+ }
93
+ export async function executeToolRunnerInvocation(invocationInput, options = {}) {
94
+ const parsedInvocation = ToolRunnerWorkerInvocationSchema.safeParse(invocationInput);
95
+ if (!parsedInvocation.success) {
96
+ return buildFailureOutput('INVALID_INVOCATION_PAYLOAD', parsedInvocation.error.message);
97
+ }
98
+ const invocation = parsedInvocation.data;
99
+ const importModule = options.importModule || defaultImportModule;
100
+ let loadedModule;
101
+ try {
102
+ loadedModule = await importModule(resolveEntrySpecifier(invocation.handler_entry));
103
+ }
104
+ catch (error) {
105
+ return withScopeNote(buildFailureOutput('ADAPTER_LOAD_FAILED', `Failed to load adapter "${invocation.handler_entry}": ${error.message}`), invocation.scope_enforced);
106
+ }
107
+ const adapter = selectAdapterExport(loadedModule);
108
+ if (!adapter) {
109
+ return withScopeNote(buildFailureOutput('ADAPTER_LOAD_FAILED', `Adapter "${invocation.handler_entry}" does not export a function`), invocation.scope_enforced);
110
+ }
111
+ let rawOutput;
112
+ try {
113
+ rawOutput = await adapter(invocation.input, {
114
+ tool_name: invocation.tool_name,
115
+ receipt_id: invocation.receipt_id,
116
+ scope_enforced: invocation.scope_enforced,
117
+ });
118
+ }
119
+ catch (error) {
120
+ return withScopeNote(buildFailureOutput('TOOL_EXECUTION_FAILED', `Adapter "${invocation.handler_entry}" failed: ${error.message}`), invocation.scope_enforced);
121
+ }
122
+ const parsedOutput = ToolOutputSchema.safeParse(rawOutput);
123
+ if (!parsedOutput.success) {
124
+ return withScopeNote(buildFailureOutput('INVALID_OUTPUT', parsedOutput.error.message), invocation.scope_enforced);
125
+ }
126
+ return withScopeNote(parsedOutput.data, invocation.scope_enforced);
127
+ }
128
+ export async function runToolRunnerWorkerFromStreams(streams, options = {}) {
129
+ const rawPayload = await readStreamAsString(streams.stdin);
130
+ let payload;
131
+ try {
132
+ payload = JSON.parse(rawPayload);
133
+ }
134
+ catch {
135
+ const invalidPayload = buildFailureOutput('INVALID_INVOCATION_PAYLOAD', 'Worker stdin payload is not valid JSON');
136
+ streams.stdout.write(JSON.stringify({ output: invalidPayload }));
137
+ return;
138
+ }
139
+ const output = await executeToolRunnerInvocation(payload, options);
140
+ streams.stdout.write(JSON.stringify({ output }));
141
+ }
142
+ export async function runToolRunnerWorkerProcess() {
143
+ await runToolRunnerWorkerFromStreams({
144
+ stdin: process.stdin,
145
+ stdout: process.stdout,
146
+ stderr: process.stderr,
147
+ });
148
+ }
149
+ function shouldRunAsMain() {
150
+ const entryPath = process.argv[1];
151
+ if (!entryPath) {
152
+ return false;
153
+ }
154
+ return pathToFileURL(path.resolve(entryPath)).href === import.meta.url;
155
+ }
156
+ if (shouldRunAsMain()) {
157
+ void runToolRunnerWorkerProcess();
158
+ }
159
+ //# sourceMappingURL=tool-runner-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-runner-worker.js","sourceRoot":"","sources":["../../src/sandbox/tool-runner-worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ export declare const UTF8_ENCODING: "utf8";
2
+ export declare const BASE64_ENCODING: "base64";
3
+ export declare const SHA256_ALGORITHM: "sha256";
4
+ export declare const SHA256_HEX_LENGTH: 64;
5
+ export declare const SHA256_HEX_REGEX: RegExp;
6
+ export declare const SHA256_INTEGRITY_PREFIX: "sha256:";
7
+ export declare const SHA256_INTEGRITY_REGEX: RegExp;
8
+ export declare const WORKSPACE_FILE_NAME: "workspace.yaml";
9
+ export declare const PACKS_DIR_NAME: "packs";
10
+ export declare const PACK_MANIFEST_FILE_NAME: "manifest.yaml";
11
+ export declare const PACKAGES_DIR_NAME: "packages";
12
+ export declare const LUMENFLOW_SCOPE_NAME: "@lumenflow";
13
+ export declare const LUMENFLOW_DIR_NAME: ".lumenflow";
14
+ export declare const KERNEL_RUNTIME_ROOT_DIR_NAME: "kernel";
15
+ export declare const KERNEL_RUNTIME_TASKS_DIR_NAME: "tasks";
16
+ export declare const KERNEL_RUNTIME_EVENTS_DIR_NAME: "events";
17
+ export declare const KERNEL_RUNTIME_EVIDENCE_DIR_NAME: "evidence";
18
+ export declare const KERNEL_RUNTIME_EVENTS_FILE_NAME: "events.jsonl";
19
+ export declare const KERNEL_RUNTIME_EVENTS_LOCK_FILE_NAME: "events.lock";
20
+ export declare const RESERVED_FRAMEWORK_SCOPE_ROOT: ".lumenflow";
21
+ export declare const RESERVED_FRAMEWORK_SCOPE_PREFIX: ".lumenflow/";
22
+ export declare const RESERVED_FRAMEWORK_SCOPE_GLOB: ".lumenflow/**";
23
+ export declare const DEFAULT_WORKSPACE_CONFIG_HASH: string;
24
+ export declare const DEFAULT_KERNEL_RUNTIME_VERSION: "kernel-dev";
25
+ export declare const WORKSPACE_CONFIG_HASH_CONTEXT_KEYS: {
26
+ readonly WORKSPACE_FILE_MISSING: "workspace_file_missing";
27
+ };
28
+ export declare const EXECUTION_METADATA_KEYS: {
29
+ readonly WORKSPACE_ALLOWED_SCOPES: "workspace_allowed_scopes";
30
+ readonly LANE_ALLOWED_SCOPES: "lane_allowed_scopes";
31
+ readonly TASK_DECLARED_SCOPES: "task_declared_scopes";
32
+ readonly WORKSPACE_CONFIG_HASH: "workspace_config_hash";
33
+ readonly RUNTIME_VERSION: "runtime_version";
34
+ readonly PACK_ID: "pack_id";
35
+ readonly PACK_VERSION: "pack_version";
36
+ readonly PACK_INTEGRITY: "pack_integrity";
37
+ };
38
+ export declare const KERNEL_POLICY_IDS: {
39
+ readonly ALLOW_ALL: "kernel.policy.allow-all";
40
+ readonly RUNTIME_FALLBACK: "kernel.policy.runtime-fallback";
41
+ readonly BUILTIN_DEFAULT: "kernel.policy.builtin-default";
42
+ readonly PROC_EXEC_DEFAULT_DENY: "kernel.policy.proc-exec-default-deny";
43
+ readonly SCOPE_RESERVED_PATH: "kernel.scope.reserved-path";
44
+ readonly SCOPE_BOUNDARY: "kernel.scope.boundary";
45
+ readonly RECONCILIATION: "kernel.reconciliation";
46
+ };
47
+ export type KernelPolicyId = (typeof KERNEL_POLICY_IDS)[keyof typeof KERNEL_POLICY_IDS];
48
+ //# sourceMappingURL=shared-constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-constants.d.ts","sourceRoot":"","sources":["../src/shared-constants.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa,EAAG,MAAe,CAAC;AAC7C,eAAO,MAAM,eAAe,EAAG,QAAiB,CAAC;AACjD,eAAO,MAAM,gBAAgB,EAAG,QAAiB,CAAC;AAClD,eAAO,MAAM,iBAAiB,EAAG,EAAW,CAAC;AAC7C,eAAO,MAAM,gBAAgB,QAAmB,CAAC;AACjD,eAAO,MAAM,uBAAuB,EAAG,SAAkB,CAAC;AAC1D,eAAO,MAAM,sBAAsB,QAA0B,CAAC;AAC9D,eAAO,MAAM,mBAAmB,EAAG,gBAAyB,CAAC;AAC7D,eAAO,MAAM,cAAc,EAAG,OAAgB,CAAC;AAC/C,eAAO,MAAM,uBAAuB,EAAG,eAAwB,CAAC;AAChE,eAAO,MAAM,iBAAiB,EAAG,UAAmB,CAAC;AACrD,eAAO,MAAM,oBAAoB,EAAG,YAAqB,CAAC;AAE1D,eAAO,MAAM,kBAAkB,EAAG,YAAqB,CAAC;AACxD,eAAO,MAAM,4BAA4B,EAAG,QAAiB,CAAC;AAC9D,eAAO,MAAM,6BAA6B,EAAG,OAAgB,CAAC;AAC9D,eAAO,MAAM,8BAA8B,EAAG,QAAiB,CAAC;AAChE,eAAO,MAAM,gCAAgC,EAAG,UAAmB,CAAC;AACpE,eAAO,MAAM,+BAA+B,EAAG,cAAuB,CAAC;AACvE,eAAO,MAAM,oCAAoC,EAAG,aAAsB,CAAC;AAE3E,eAAO,MAAM,6BAA6B,cAAqB,CAAC;AAChE,eAAO,MAAM,+BAA+B,eAAoC,CAAC;AACjF,eAAO,MAAM,6BAA6B,iBAAsC,CAAC;AAEjF,eAAO,MAAM,6BAA6B,QAAgC,CAAC;AAC3E,eAAO,MAAM,8BAA8B,EAAG,YAAqB,CAAC;AAEpE,eAAO,MAAM,kCAAkC;;CAErC,CAAC;AAEX,eAAO,MAAM,uBAAuB;;;;;;;;;CAS1B,CAAC;AAEX,eAAO,MAAM,iBAAiB;;;;;;;;CAQpB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,OAAO,iBAAiB,CAAC,CAAC"}
@@ -0,0 +1,49 @@
1
+ // Copyright (c) 2026 Hellmai Ltd
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ export const UTF8_ENCODING = 'utf8';
4
+ export const BASE64_ENCODING = 'base64';
5
+ export const SHA256_ALGORITHM = 'sha256';
6
+ export const SHA256_HEX_LENGTH = 64;
7
+ export const SHA256_HEX_REGEX = /^[a-f0-9]{64}$/;
8
+ export const SHA256_INTEGRITY_PREFIX = 'sha256:';
9
+ export const SHA256_INTEGRITY_REGEX = /^sha256:[a-f0-9]{64}$/;
10
+ export const WORKSPACE_FILE_NAME = 'workspace.yaml';
11
+ export const PACKS_DIR_NAME = 'packs';
12
+ export const PACK_MANIFEST_FILE_NAME = 'manifest.yaml';
13
+ export const PACKAGES_DIR_NAME = 'packages';
14
+ export const LUMENFLOW_SCOPE_NAME = '@lumenflow';
15
+ export const LUMENFLOW_DIR_NAME = '.lumenflow';
16
+ export const KERNEL_RUNTIME_ROOT_DIR_NAME = 'kernel';
17
+ export const KERNEL_RUNTIME_TASKS_DIR_NAME = 'tasks';
18
+ export const KERNEL_RUNTIME_EVENTS_DIR_NAME = 'events';
19
+ export const KERNEL_RUNTIME_EVIDENCE_DIR_NAME = 'evidence';
20
+ export const KERNEL_RUNTIME_EVENTS_FILE_NAME = 'events.jsonl';
21
+ export const KERNEL_RUNTIME_EVENTS_LOCK_FILE_NAME = 'events.lock';
22
+ export const RESERVED_FRAMEWORK_SCOPE_ROOT = LUMENFLOW_DIR_NAME;
23
+ export const RESERVED_FRAMEWORK_SCOPE_PREFIX = `${LUMENFLOW_DIR_NAME}/`;
24
+ export const RESERVED_FRAMEWORK_SCOPE_GLOB = `${LUMENFLOW_DIR_NAME}/**`;
25
+ export const DEFAULT_WORKSPACE_CONFIG_HASH = '0'.repeat(SHA256_HEX_LENGTH);
26
+ export const DEFAULT_KERNEL_RUNTIME_VERSION = 'kernel-dev';
27
+ export const WORKSPACE_CONFIG_HASH_CONTEXT_KEYS = {
28
+ WORKSPACE_FILE_MISSING: 'workspace_file_missing',
29
+ };
30
+ export const EXECUTION_METADATA_KEYS = {
31
+ WORKSPACE_ALLOWED_SCOPES: 'workspace_allowed_scopes',
32
+ LANE_ALLOWED_SCOPES: 'lane_allowed_scopes',
33
+ TASK_DECLARED_SCOPES: 'task_declared_scopes',
34
+ WORKSPACE_CONFIG_HASH: 'workspace_config_hash',
35
+ RUNTIME_VERSION: 'runtime_version',
36
+ PACK_ID: 'pack_id',
37
+ PACK_VERSION: 'pack_version',
38
+ PACK_INTEGRITY: 'pack_integrity',
39
+ };
40
+ export const KERNEL_POLICY_IDS = {
41
+ ALLOW_ALL: 'kernel.policy.allow-all',
42
+ RUNTIME_FALLBACK: 'kernel.policy.runtime-fallback',
43
+ BUILTIN_DEFAULT: 'kernel.policy.builtin-default',
44
+ PROC_EXEC_DEFAULT_DENY: 'kernel.policy.proc-exec-default-deny',
45
+ SCOPE_RESERVED_PATH: 'kernel.scope.reserved-path',
46
+ SCOPE_BOUNDARY: 'kernel.scope.boundary',
47
+ RECONCILIATION: 'kernel.reconciliation',
48
+ };
49
+ //# sourceMappingURL=shared-constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-constants.js","sourceRoot":"","sources":["../src/shared-constants.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,sCAAsC;AAEtC,MAAM,CAAC,MAAM,aAAa,GAAG,MAAe,CAAC;AAC7C,MAAM,CAAC,MAAM,eAAe,GAAG,QAAiB,CAAC;AACjD,MAAM,CAAC,MAAM,gBAAgB,GAAG,QAAiB,CAAC;AAClD,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAW,CAAC;AAC7C,MAAM,CAAC,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;AACjD,MAAM,CAAC,MAAM,uBAAuB,GAAG,SAAkB,CAAC;AAC1D,MAAM,CAAC,MAAM,sBAAsB,GAAG,uBAAuB,CAAC;AAC9D,MAAM,CAAC,MAAM,mBAAmB,GAAG,gBAAyB,CAAC;AAC7D,MAAM,CAAC,MAAM,cAAc,GAAG,OAAgB,CAAC;AAC/C,MAAM,CAAC,MAAM,uBAAuB,GAAG,eAAwB,CAAC;AAChE,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAmB,CAAC;AACrD,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAqB,CAAC;AAE1D,MAAM,CAAC,MAAM,kBAAkB,GAAG,YAAqB,CAAC;AACxD,MAAM,CAAC,MAAM,4BAA4B,GAAG,QAAiB,CAAC;AAC9D,MAAM,CAAC,MAAM,6BAA6B,GAAG,OAAgB,CAAC;AAC9D,MAAM,CAAC,MAAM,8BAA8B,GAAG,QAAiB,CAAC;AAChE,MAAM,CAAC,MAAM,gCAAgC,GAAG,UAAmB,CAAC;AACpE,MAAM,CAAC,MAAM,+BAA+B,GAAG,cAAuB,CAAC;AACvE,MAAM,CAAC,MAAM,oCAAoC,GAAG,aAAsB,CAAC;AAE3E,MAAM,CAAC,MAAM,6BAA6B,GAAG,kBAAkB,CAAC;AAChE,MAAM,CAAC,MAAM,+BAA+B,GAAG,GAAG,kBAAkB,GAAY,CAAC;AACjF,MAAM,CAAC,MAAM,6BAA6B,GAAG,GAAG,kBAAkB,KAAc,CAAC;AAEjF,MAAM,CAAC,MAAM,6BAA6B,GAAG,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAC3E,MAAM,CAAC,MAAM,8BAA8B,GAAG,YAAqB,CAAC;AAEpE,MAAM,CAAC,MAAM,kCAAkC,GAAG;IAChD,sBAAsB,EAAE,wBAAwB;CACxC,CAAC;AAEX,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,wBAAwB,EAAE,0BAA0B;IACpD,mBAAmB,EAAE,qBAAqB;IAC1C,oBAAoB,EAAE,sBAAsB;IAC5C,qBAAqB,EAAE,uBAAuB;IAC9C,eAAe,EAAE,iBAAiB;IAClC,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,cAAc;IAC5B,cAAc,EAAE,gBAAgB;CACxB,CAAC;AAEX,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,SAAS,EAAE,yBAAyB;IACpC,gBAAgB,EAAE,gCAAgC;IAClD,eAAe,EAAE,+BAA+B;IAChD,sBAAsB,EAAE,sCAAsC;IAC9D,mBAAmB,EAAE,4BAA4B;IACjD,cAAc,EAAE,uBAAuB;IACvC,cAAc,EAAE,uBAAuB;CAC/B,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { TaskState } from '../kernel.schemas.js';
2
+ export declare const TASK_LIFECYCLE_STATES: {
3
+ readonly READY: "ready";
4
+ readonly ACTIVE: "active";
5
+ readonly BLOCKED: "blocked";
6
+ readonly WAITING: "waiting";
7
+ readonly DONE: "done";
8
+ };
9
+ export declare const TASK_LIFECYCLE_EVENTS: {
10
+ readonly CLAIM: "task.claim";
11
+ readonly BLOCK: "task.block";
12
+ readonly WAIT: "task.wait";
13
+ readonly COMPLETE: "task.complete";
14
+ readonly RELEASE: "task.release";
15
+ readonly UNBLOCK: "task.unblock";
16
+ readonly RESUME: "task.resume";
17
+ };
18
+ export type TaskLifecycleState = TaskState['status'];
19
+ export type TaskStateAliases = Partial<Record<TaskLifecycleState, string>>;
20
+ /**
21
+ * The canonical, single source of truth for task state transitions.
22
+ *
23
+ * WU-1865: The xstate machine definition was removed because it duplicated
24
+ * this map without being used at runtime. The runtime exclusively uses
25
+ * {@link assertTransition} which consults this map.
26
+ */
27
+ export declare const ALLOWED_TRANSITIONS: Readonly<Record<TaskLifecycleState, TaskLifecycleState[]>>;
28
+ export declare function resolveTaskState(state: string | null | undefined, aliases?: TaskStateAliases): TaskLifecycleState;
29
+ export declare function assertTransition(from: string | null | undefined, to: string | null | undefined, taskId: string, aliases?: TaskStateAliases): void;
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/state-machine/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,eAAO,MAAM,qBAAqB;;;;;;CAMxB,CAAC;AAEX,eAAO,MAAM,qBAAqB;;;;;;;;CAQxB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AACrD,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC,CAAC;AAiB3E;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,CAAC,CAM1F,CAAC;AA6BF,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,OAAO,GAAE,gBAAqB,GAC7B,kBAAkB,CAmBpB;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC/B,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC7B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,gBAAqB,GAC7B,IAAI,CAaN"}
@@ -0,0 +1,92 @@
1
+ // Copyright (c) 2026 Hellmai Ltd
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ export const TASK_LIFECYCLE_STATES = {
4
+ READY: 'ready',
5
+ ACTIVE: 'active',
6
+ BLOCKED: 'blocked',
7
+ WAITING: 'waiting',
8
+ DONE: 'done',
9
+ };
10
+ export const TASK_LIFECYCLE_EVENTS = {
11
+ CLAIM: 'task.claim',
12
+ BLOCK: 'task.block',
13
+ WAIT: 'task.wait',
14
+ COMPLETE: 'task.complete',
15
+ RELEASE: 'task.release',
16
+ UNBLOCK: 'task.unblock',
17
+ RESUME: 'task.resume',
18
+ };
19
+ /**
20
+ * Naming convention (WU-1865):
21
+ * - Methods: camelCase (standard TypeScript convention)
22
+ * - Data/event fields: snake_case (kernel event schema convention)
23
+ * - Constants: UPPER_SNAKE_CASE (standard constant convention)
24
+ */
25
+ const CANONICAL_STATES = [
26
+ TASK_LIFECYCLE_STATES.READY,
27
+ TASK_LIFECYCLE_STATES.ACTIVE,
28
+ TASK_LIFECYCLE_STATES.BLOCKED,
29
+ TASK_LIFECYCLE_STATES.WAITING,
30
+ TASK_LIFECYCLE_STATES.DONE,
31
+ ];
32
+ /**
33
+ * The canonical, single source of truth for task state transitions.
34
+ *
35
+ * WU-1865: The xstate machine definition was removed because it duplicated
36
+ * this map without being used at runtime. The runtime exclusively uses
37
+ * {@link assertTransition} which consults this map.
38
+ */
39
+ export const ALLOWED_TRANSITIONS = {
40
+ ready: ['active'],
41
+ active: ['blocked', 'waiting', 'done', 'ready'],
42
+ blocked: ['active', 'done'],
43
+ waiting: ['active', 'done'],
44
+ done: [],
45
+ };
46
+ function buildAliasLookup(aliases) {
47
+ const lookup = new Map();
48
+ for (const state of CANONICAL_STATES) {
49
+ lookup.set(state, state);
50
+ }
51
+ for (const [state, alias] of Object.entries(aliases)) {
52
+ if (!alias) {
53
+ continue;
54
+ }
55
+ const normalizedAlias = alias.trim();
56
+ if (!normalizedAlias) {
57
+ throw new Error(`Invalid alias for state "${state}": alias must be non-empty`);
58
+ }
59
+ const existing = lookup.get(normalizedAlias);
60
+ if (existing && existing !== state) {
61
+ throw new Error(`Ambiguous alias "${normalizedAlias}" resolves to both "${existing}" and "${state}"`);
62
+ }
63
+ lookup.set(normalizedAlias, state);
64
+ }
65
+ return lookup;
66
+ }
67
+ export function resolveTaskState(state, aliases = {}) {
68
+ if (state === null || state === undefined) {
69
+ throw new Error(`Invalid state: ${state}`);
70
+ }
71
+ const normalized = state.trim();
72
+ if (!normalized) {
73
+ throw new Error(`Invalid state: ${state}`);
74
+ }
75
+ const lookup = buildAliasLookup(aliases);
76
+ const resolved = lookup.get(normalized);
77
+ if (!resolved) {
78
+ throw new Error(`Invalid state: ${state}. Expected one of: ${Array.from(lookup.keys()).join(', ')}`);
79
+ }
80
+ return resolved;
81
+ }
82
+ export function assertTransition(from, to, taskId, aliases = {}) {
83
+ const fromState = resolveTaskState(from, aliases);
84
+ const toState = resolveTaskState(to, aliases);
85
+ const allowed = ALLOWED_TRANSITIONS[fromState];
86
+ if (!allowed.includes(toState)) {
87
+ const terminalHint = fromState === TASK_LIFECYCLE_STATES.DONE ? ' (done is a terminal state)' : '';
88
+ const allowedNext = allowed.length > 0 ? allowed.join(', ') : '(none)';
89
+ throw new Error(`Illegal state transition for ${taskId}: ${fromState} -> ${toState}${terminalHint}. Allowed next states: ${allowedNext}`);
90
+ }
91
+ }
92
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/state-machine/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { ToolCapability, ToolScope } from '../../kernel.schemas.js';
2
+ import type { PolicyHook } from '../tool-host.js';
3
+ import { ToolRegistry } from '../tool-registry.js';
4
+ export interface BuiltinSubprocessEntries {
5
+ fsWrite?: string;
6
+ procExec?: string;
7
+ }
8
+ export interface BuiltinToolOptions {
9
+ declaredScopes: ToolScope[];
10
+ includeInternalTools?: boolean;
11
+ subprocessEntries?: BuiltinSubprocessEntries;
12
+ }
13
+ export interface BuiltinPolicyOptions {
14
+ allowInternalProcExec?: boolean;
15
+ }
16
+ export declare function createBuiltinToolCapabilities(options: BuiltinToolOptions): ToolCapability[];
17
+ export declare function listAgentVisibleBuiltinTools(capabilities: ToolCapability[]): ToolCapability[];
18
+ export declare function registerBuiltinToolCapabilities(registry: ToolRegistry, options: BuiltinToolOptions): ToolCapability[];
19
+ export declare function createBuiltinPolicyHook(options?: BuiltinPolicyOptions): PolicyHook;
20
+ //# sourceMappingURL=capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../src/tool-host/builtins/capabilities.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAc,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAErF,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAuDnD,MAAM,WAAW,wBAAwB;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,SAAS,EAAE,CAAC;IAC5B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,iBAAiB,CAAC,EAAE,wBAAwB,CAAC;CAC9C;AAED,MAAM,WAAW,oBAAoB;IACnC,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAsID,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,kBAAkB,GAAG,cAAc,EAAE,CAiB3F;AAED,wBAAgB,4BAA4B,CAAC,YAAY,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAE7F;AAED,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,kBAAkB,GAC1B,cAAc,EAAE,CAMlB;AAED,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,oBAAyB,GAAG,UAAU,CAqBtF"}
@@ -0,0 +1,211 @@
1
+ // Copyright (c) 2026 Hellmai Ltd
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { readFile } from 'node:fs/promises';
4
+ import { resolve } from 'node:path';
5
+ import micromatch from 'micromatch';
6
+ import { z } from 'zod';
7
+ import { BASE64_ENCODING, KERNEL_POLICY_IDS, UTF8_ENCODING } from '../../shared-constants.js';
8
+ import { ToolRegistry } from '../tool-registry.js';
9
+ const BUILTIN_POLICY_IDS = {
10
+ DEFAULT_ALLOW: KERNEL_POLICY_IDS.BUILTIN_DEFAULT,
11
+ PROC_EXEC_DEFAULT_DENY: KERNEL_POLICY_IDS.PROC_EXEC_DEFAULT_DENY,
12
+ };
13
+ const BUILTIN_TOOL_NAMES = {
14
+ FS_READ: 'fs:read',
15
+ FS_WRITE: 'fs:write',
16
+ PROC_EXEC: 'proc:exec',
17
+ };
18
+ const BUILTIN_SUBPROCESS_ENTRIES = {
19
+ FS_WRITE: 'kernel/tool-impl/fs-write.js',
20
+ PROC_EXEC: 'kernel/tool-impl/proc-exec.js',
21
+ };
22
+ const BUILTIN_PACK_ID = 'kernel-builtins';
23
+ const BUILTIN_TOOL_VERSION = '1.0.0';
24
+ const TEXT_ENCODINGS = [UTF8_ENCODING, BASE64_ENCODING];
25
+ const FsReadInputSchema = z.object({
26
+ path: z.string().min(1),
27
+ encoding: z.enum(TEXT_ENCODINGS).optional(),
28
+ });
29
+ const FsReadOutputSchema = z.object({
30
+ path: z.string().min(1),
31
+ content: z.string(),
32
+ bytes: z.number().int().nonnegative(),
33
+ });
34
+ const FsWriteInputSchema = z.object({
35
+ path: z.string().min(1),
36
+ content: z.string(),
37
+ encoding: z.enum(TEXT_ENCODINGS).optional(),
38
+ });
39
+ const FsWriteOutputSchema = z.object({
40
+ queued: z.boolean(),
41
+ target: z.string().min(1),
42
+ });
43
+ const ProcExecInputSchema = z.object({
44
+ command: z.string().min(1),
45
+ args: z.array(z.string()).default([]),
46
+ });
47
+ const ProcExecOutputSchema = z.object({
48
+ exit_code: z.number().int(),
49
+ stdout: z.string(),
50
+ stderr: z.string(),
51
+ });
52
+ function buildScopeKey(scope) {
53
+ if (scope.type === 'path') {
54
+ return `${scope.type}:${scope.access}:${scope.pattern}`;
55
+ }
56
+ return `${scope.type}:${scope.posture}`;
57
+ }
58
+ function dedupeScopes(scopes) {
59
+ const seen = new Set();
60
+ const deduped = [];
61
+ for (const scope of scopes) {
62
+ const key = buildScopeKey(scope);
63
+ if (seen.has(key)) {
64
+ continue;
65
+ }
66
+ seen.add(key);
67
+ deduped.push(scope);
68
+ }
69
+ return deduped;
70
+ }
71
+ function buildFailureOutput(code, message) {
72
+ return {
73
+ success: false,
74
+ error: {
75
+ code,
76
+ message,
77
+ },
78
+ };
79
+ }
80
+ async function runFsRead(input, scopes) {
81
+ const parsedInput = FsReadInputSchema.safeParse(input);
82
+ if (!parsedInput.success) {
83
+ return buildFailureOutput('INVALID_INPUT', parsedInput.error.message);
84
+ }
85
+ const resolvedPath = resolve(parsedInput.data.path);
86
+ const canReadPath = scopesAllowReadPath(scopes, resolvedPath);
87
+ if (!canReadPath) {
88
+ return buildFailureOutput('SCOPE_VIOLATION', `Path ${resolvedPath} is outside the enforced read scopes for fs:read.`);
89
+ }
90
+ const encoding = parsedInput.data.encoding || UTF8_ENCODING;
91
+ try {
92
+ const content = await readFile(resolvedPath, { encoding });
93
+ return {
94
+ success: true,
95
+ data: {
96
+ path: resolvedPath,
97
+ content,
98
+ bytes: Buffer.byteLength(content),
99
+ },
100
+ };
101
+ }
102
+ catch (error) {
103
+ return buildFailureOutput('FS_READ_FAILED', error.message);
104
+ }
105
+ }
106
+ function scopesAllowReadPath(scopes, filePath) {
107
+ const readScopes = scopes.filter((scope) => scope.type === 'path' && scope.access === 'read');
108
+ if (readScopes.length === 0) {
109
+ return false;
110
+ }
111
+ const normalizedPath = filePath.replace(/\\/g, '/');
112
+ return readScopes.some((scope) => micromatch.isMatch(normalizedPath, resolve(scope.pattern).replace(/\\/g, '/')));
113
+ }
114
+ function createFsReadCapability(scopes) {
115
+ return {
116
+ name: BUILTIN_TOOL_NAMES.FS_READ,
117
+ domain: 'filesystem',
118
+ version: BUILTIN_TOOL_VERSION,
119
+ input_schema: FsReadInputSchema,
120
+ output_schema: FsReadOutputSchema,
121
+ permission: 'read',
122
+ required_scopes: scopes,
123
+ handler: {
124
+ kind: 'in-process',
125
+ fn: (input) => runFsRead(input, scopes),
126
+ },
127
+ description: 'Read file content from an allowed scope',
128
+ pack: BUILTIN_PACK_ID,
129
+ };
130
+ }
131
+ function createFsWriteCapability(scopes, entry) {
132
+ return {
133
+ name: BUILTIN_TOOL_NAMES.FS_WRITE,
134
+ domain: 'filesystem',
135
+ version: BUILTIN_TOOL_VERSION,
136
+ input_schema: FsWriteInputSchema,
137
+ output_schema: FsWriteOutputSchema,
138
+ permission: 'write',
139
+ required_scopes: scopes,
140
+ handler: {
141
+ kind: 'subprocess',
142
+ entry,
143
+ },
144
+ description: 'Write file content through sandboxed subprocess execution',
145
+ pack: BUILTIN_PACK_ID,
146
+ };
147
+ }
148
+ function createProcExecCapability(scopes, entry) {
149
+ return {
150
+ name: BUILTIN_TOOL_NAMES.PROC_EXEC,
151
+ domain: 'process',
152
+ version: BUILTIN_TOOL_VERSION,
153
+ input_schema: ProcExecInputSchema,
154
+ output_schema: ProcExecOutputSchema,
155
+ permission: 'admin',
156
+ required_scopes: scopes,
157
+ handler: {
158
+ kind: 'subprocess',
159
+ entry,
160
+ },
161
+ description: 'Execute internal subprocess actions for pack tool implementations',
162
+ pack: BUILTIN_PACK_ID,
163
+ };
164
+ }
165
+ export function createBuiltinToolCapabilities(options) {
166
+ const dedupedScopes = dedupeScopes(options.declaredScopes);
167
+ const subprocessEntries = {
168
+ fsWrite: options.subprocessEntries?.fsWrite || BUILTIN_SUBPROCESS_ENTRIES.FS_WRITE,
169
+ procExec: options.subprocessEntries?.procExec || BUILTIN_SUBPROCESS_ENTRIES.PROC_EXEC,
170
+ };
171
+ const capabilities = [
172
+ createFsReadCapability(dedupedScopes),
173
+ createFsWriteCapability(dedupedScopes, subprocessEntries.fsWrite),
174
+ ];
175
+ if (options.includeInternalTools) {
176
+ capabilities.push(createProcExecCapability(dedupedScopes, subprocessEntries.procExec));
177
+ }
178
+ return capabilities;
179
+ }
180
+ export function listAgentVisibleBuiltinTools(capabilities) {
181
+ return capabilities.filter((capability) => capability.name !== BUILTIN_TOOL_NAMES.PROC_EXEC);
182
+ }
183
+ export function registerBuiltinToolCapabilities(registry, options) {
184
+ const capabilities = createBuiltinToolCapabilities(options);
185
+ for (const capability of capabilities) {
186
+ registry.register(capability);
187
+ }
188
+ return capabilities;
189
+ }
190
+ export function createBuiltinPolicyHook(options = {}) {
191
+ const allowInternalProcExec = options.allowInternalProcExec || false;
192
+ return async (input) => {
193
+ if (input.capability.name === BUILTIN_TOOL_NAMES.PROC_EXEC && !allowInternalProcExec) {
194
+ return [
195
+ {
196
+ policy_id: BUILTIN_POLICY_IDS.PROC_EXEC_DEFAULT_DENY,
197
+ decision: 'deny',
198
+ reason: 'proc:exec is internal-only and default-denied by workspace policy.',
199
+ },
200
+ ];
201
+ }
202
+ return [
203
+ {
204
+ policy_id: BUILTIN_POLICY_IDS.DEFAULT_ALLOW,
205
+ decision: 'allow',
206
+ reason: 'Builtin tool allowed by default policy.',
207
+ },
208
+ ];
209
+ };
210
+ }
211
+ //# sourceMappingURL=capabilities.js.map