@probelabs/probe 0.6.0-rc339 → 0.6.0-rc341

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 (30) hide show
  1. package/bin/binaries/{probe-v0.6.0-rc339-x86_64-apple-darwin.tar.gz → probe-v0.6.0-rc341-aarch64-apple-darwin.tar.gz} +0 -0
  2. package/bin/binaries/{probe-v0.6.0-rc339-aarch64-unknown-linux-musl.tar.gz → probe-v0.6.0-rc341-aarch64-unknown-linux-musl.tar.gz} +0 -0
  3. package/bin/binaries/{probe-v0.6.0-rc339-x86_64-pc-windows-msvc.zip → probe-v0.6.0-rc341-x86_64-apple-darwin.tar.gz} +0 -0
  4. package/bin/binaries/probe-v0.6.0-rc341-x86_64-pc-windows-msvc.zip +0 -0
  5. package/bin/binaries/{probe-v0.6.0-rc339-x86_64-unknown-linux-musl.tar.gz → probe-v0.6.0-rc341-x86_64-unknown-linux-musl.tar.gz} +0 -0
  6. package/build/agent/ProbeAgent.d.ts +37 -9
  7. package/build/agent/ProbeAgent.js +196 -62
  8. package/build/agent/acp/tools.js +1 -1
  9. package/build/agent/engines/codex.js +189 -52
  10. package/build/agent/engines/governed-answer-failure.js +164 -5
  11. package/build/agent/engines/governed-codex-exec.js +1227 -0
  12. package/build/agent/engines/governed-codex-profile.js +80 -28
  13. package/build/agent/governance/index.d.ts +18 -0
  14. package/build/agent/governance/index.js +14 -0
  15. package/build/index.js +26 -0
  16. package/cjs/agent/ProbeAgent.cjs +3291 -1117
  17. package/cjs/index.cjs +3318 -1119
  18. package/index.d.ts +53 -7
  19. package/package.json +1 -1
  20. package/src/agent/ProbeAgent.d.ts +37 -9
  21. package/src/agent/ProbeAgent.js +196 -62
  22. package/src/agent/acp/tools.js +1 -1
  23. package/src/agent/engines/codex.js +189 -52
  24. package/src/agent/engines/governed-answer-failure.js +164 -5
  25. package/src/agent/engines/governed-codex-exec.js +1227 -0
  26. package/src/agent/engines/governed-codex-profile.js +80 -28
  27. package/src/agent/governance/index.d.ts +18 -0
  28. package/src/agent/governance/index.js +14 -0
  29. package/src/index.js +26 -0
  30. package/bin/binaries/probe-v0.6.0-rc339-aarch64-apple-darwin.tar.gz +0 -0
@@ -4,16 +4,19 @@ import { isAbsolute, normalize } from 'node:path';
4
4
 
5
5
  const PROFILE_KEYS = ['version', 'profileId', 'engine', 'model', 'reasoningEffort', 'sandbox', 'approvalPolicy', 'cwd', 'probeTools', 'fallback', 'retries'];
6
6
  const PROFILE_V2_KEYS = ['version', 'profileId', 'engine', 'model', 'reasoningEffort', 'sandbox', 'approvalPolicy', 'cwd', 'probeMcpTools', 'codexNativeTools', 'fallback', 'retries'];
7
+ const PROFILE_V3_KEYS = PROFILE_V2_KEYS;
7
8
  const PROFILE_VALUES = {
8
9
  version: 'probe.governed-codex-profile/v1', profileId: 'luna-xhigh-readonly-v1', engine: 'codex',
9
10
  model: 'gpt-5.6-luna', reasoningEffort: 'xhigh', sandbox: 'read-only', approvalPolicy: 'never',
10
11
  fallback: false, retries: 0,
11
12
  };
12
13
  const PROFILE_V2_VALUES = { ...PROFILE_VALUES, version: 'probe.governed-codex-profile/v2', profileId: 'luna-xhigh-readonly-native-exec-v1' };
14
+ const PROFILE_V3_VALUES = { ...PROFILE_V2_VALUES, version: 'probe.governed-codex-profile/v3', profileId: 'luna-xhigh-isolated-writer-v1', sandbox: 'workspace-write' };
13
15
  // This profile admits the pinned Codex `exec` capability inside the attested read-only sandbox.
14
16
  // It does not claim that commands supplied to `exec` are semantically safe.
15
17
  const PROBE_TOOLS = ['search', 'extract', 'listFiles'];
16
18
  const CODEX_NATIVE_TOOLS = ['exec'];
19
+ const WRITER_CODEX_NATIVE_TOOLS = ['apply_patch', 'exec'];
17
20
  const ENABLED_TOOLS = ['mcp__probe__search', 'mcp__probe__extract', 'mcp__probe__listFiles'];
18
21
  const SESSION_MSG_KEYS = ['type', 'session_id', 'thread_id', 'model', 'model_provider_id', 'approval_policy',
19
22
  'approvals_reviewer', 'permission_profile', 'reasoning_effort', 'rollout_path', 'cwd'];
@@ -75,22 +78,26 @@ function requireValue(actual, expected, label) { if (!Object.is(actual, expected
75
78
 
76
79
  export function validateGovernedCodexProfile(input) {
77
80
  const version = input && Object.getOwnPropertyDescriptor(input, 'version')?.value;
78
- const v2 = version === PROFILE_V2_VALUES.version, values = v2 ? PROFILE_V2_VALUES : PROFILE_VALUES;
79
- const profile = exactObject(input, v2 ? PROFILE_V2_KEYS : PROFILE_KEYS, 'profile');
81
+ const v2 = version === PROFILE_V2_VALUES.version;
82
+ const v3 = version === PROFILE_V3_VALUES.version;
83
+ const native = v2 || v3;
84
+ const values = v3 ? PROFILE_V3_VALUES : v2 ? PROFILE_V2_VALUES : PROFILE_VALUES;
85
+ const nativeTools = v3 ? WRITER_CODEX_NATIVE_TOOLS : CODEX_NATIVE_TOOLS;
86
+ const profile = exactObject(input, native ? (v3 ? PROFILE_V3_KEYS : PROFILE_V2_KEYS) : PROFILE_KEYS, 'profile');
80
87
  for (const [key, value] of Object.entries(values)) requireValue(profile[key], value, `profile.${key}`);
81
- const probeKey = v2 ? 'probeMcpTools' : 'probeTools';
88
+ const probeKey = native ? 'probeMcpTools' : 'probeTools';
82
89
  exactArray(profile[probeKey], PROBE_TOOLS.length, `profile.${probeKey}`);
83
90
  PROBE_TOOLS.forEach((tool, index) => requireValue(profile[probeKey][index], tool, `profile.${probeKey}[${index}]`));
84
- if (v2) {
85
- exactArray(profile.codexNativeTools, CODEX_NATIVE_TOOLS.length, 'profile.codexNativeTools');
86
- CODEX_NATIVE_TOOLS.forEach((tool, index) => requireValue(profile.codexNativeTools[index], tool, `profile.codexNativeTools[${index}]`));
91
+ if (native) {
92
+ exactArray(profile.codexNativeTools, nativeTools.length, 'profile.codexNativeTools');
93
+ nativeTools.forEach((tool, index) => requireValue(profile.codexNativeTools[index], tool, `profile.codexNativeTools[${index}]`));
87
94
  if (profile.probeMcpTools.some((tool) => profile.codexNativeTools.includes(tool))) invalid('profile capability overlap');
88
95
  }
89
96
  return deepFreeze({
90
97
  version: values.version, profileId: values.profileId, engine: values.engine,
91
98
  model: values.model, reasoningEffort: values.reasoningEffort, sandbox: values.sandbox,
92
99
  approvalPolicy: values.approvalPolicy, cwd: canonicalCwd(profile.cwd),
93
- ...(v2 ? { probeMcpTools: [...PROBE_TOOLS], codexNativeTools: [...CODEX_NATIVE_TOOLS] } : { probeTools: [...PROBE_TOOLS] }),
100
+ ...(native ? { probeMcpTools: [...PROBE_TOOLS], codexNativeTools: [...nativeTools] } : { probeTools: [...PROBE_TOOLS] }),
94
101
  fallback: false, retries: 0,
95
102
  });
96
103
  }
@@ -112,29 +119,64 @@ export function buildGovernedCodexInitialToolArgs(input) {
112
119
  if (typeof input.prompt !== 'string' || Buffer.byteLength(input.prompt, 'utf8') < 1 || Buffer.byteLength(input.prompt, 'utf8') > 131072) invalid('prompt');
113
120
  const mcp = validateMcp(input.mcp);
114
121
  const features = Object.fromEntries(FEATURE_NAMES.map((name) => [name, false]));
122
+ if (profile.version === PROFILE_V3_VALUES.version && profile.profileId === PROFILE_V3_VALUES.profileId) features.shell_tool = true;
115
123
  const tools = Object.fromEntries(ENABLED_TOOLS.map((name) => [name, { approval_mode: 'approve' }]));
116
124
  const server = { url: mcp.url, default_tools_approval_mode: 'prompt', enabled_tools: [...ENABLED_TOOLS], tools };
125
+ const writerSandbox = profile.sandbox === 'workspace-write' ? {
126
+ network_access: false, writable_roots: [], exclude_tmpdir_env_var: true, exclude_slash_tmp: true,
127
+ } : undefined;
117
128
  return deepFreeze({
118
129
  prompt: input.prompt, model: profile.model,
119
- config: { model_reasoning_effort: profile.reasoningEffort, web_search: 'disabled', features, skills: { include_instructions: false }, mcp_servers: { [mcp.name]: server } },
130
+ config: { model_reasoning_effort: profile.reasoningEffort, web_search: 'disabled', features, skills: { include_instructions: false },
131
+ ...(writerSandbox ? { sandbox_workspace_write: writerSandbox } : {}), mcp_servers: { [mcp.name]: server } },
120
132
  cwd: profile.cwd, sandbox: profile.sandbox, 'approval-policy': profile.approvalPolicy,
121
133
  });
122
134
  }
123
135
 
124
- function validatePermission(input) {
136
+ function validatePermission(input, profile) {
125
137
  const permission = exactObject(input, ['type', 'file_system', 'network'], 'permission_profile');
126
138
  requireValue(permission.type, 'managed', 'permission_profile.type');
127
139
  requireValue(permission.network, 'restricted', 'permission_profile.network');
128
140
  const fileSystem = exactObject(permission.file_system, ['type', 'entries'], 'file_system');
129
141
  requireValue(fileSystem.type, 'restricted', 'file_system.type');
130
- exactArray(fileSystem.entries, 1, 'file_system.entries');
131
- const entry = exactObject(fileSystem.entries[0], ['access', 'path'], 'file_system entry');
132
- requireValue(entry.access, 'read', 'file_system entry access');
133
- const path = exactObject(entry.path, ['type', 'value'], 'permission path');
134
- requireValue(path.type, 'special', 'permission path type');
135
- const value = exactObject(path.value, ['kind'], 'permission path value');
136
- requireValue(value.kind, 'root', 'permission path kind');
137
- return { type: 'managed', file_system: { type: 'restricted', entries: [{ access: 'read', path: { type: 'special', value: { kind: 'root' } } }] }, network: 'restricted' };
142
+ const writer = profile.sandbox === 'workspace-write';
143
+ if (!writer) {
144
+ exactArray(fileSystem.entries, 1, 'file_system.entries');
145
+ const entry = exactObject(fileSystem.entries[0], ['access', 'path'], 'file_system entry');
146
+ requireValue(entry.access, 'read', 'file_system entry access');
147
+ const path = exactObject(entry.path, ['type', 'value'], 'permission path');
148
+ requireValue(path.type, 'special', 'permission path type');
149
+ const value = exactObject(path.value, ['kind'], 'permission path value');
150
+ requireValue(value.kind, 'root', 'permission path kind');
151
+ return { type: 'managed', file_system: { type: 'restricted', entries: [{ access: 'read', path: { type: 'special', value: { kind: 'root' } } }] }, network: 'restricted' };
152
+ }
153
+ exactArray(fileSystem.entries, 5, 'file_system.entries');
154
+ const rootEntry = exactObject(fileSystem.entries[0], ['access', 'path'], 'file_system entry');
155
+ requireValue(rootEntry.access, 'read', 'file_system entry access');
156
+ const rootPath = exactObject(rootEntry.path, ['type', 'value'], 'permission path');
157
+ requireValue(rootPath.type, 'special', 'permission path type');
158
+ const rootValue = exactObject(rootPath.value, ['kind'], 'permission path value');
159
+ requireValue(rootValue.kind, 'root', 'permission path kind');
160
+ const cwdEntry = exactObject(fileSystem.entries[1], ['access', 'path'], 'file_system entry');
161
+ requireValue(cwdEntry.access, 'write', 'file_system entry access');
162
+ const cwdPath = exactObject(cwdEntry.path, ['type', 'path'], 'permission path');
163
+ requireValue(cwdPath.type, 'path', 'permission path type');
164
+ requireValue(cwdPath.path, profile.cwd, 'permission path cwd');
165
+ const protectedPaths = ['.git', '.agents', '.codex'];
166
+ const protectedEntries = protectedPaths.map((suffix, index) => {
167
+ const protectedEntry = exactObject(fileSystem.entries[index + 2], ['access', 'missing_path_behavior', 'path'], 'file_system entry');
168
+ requireValue(protectedEntry.access, 'read', 'file_system entry access');
169
+ requireValue(protectedEntry.missing_path_behavior, 'skip', 'file_system missing path behavior');
170
+ const protectedPath = exactObject(protectedEntry.path, ['type', 'path'], 'permission path');
171
+ requireValue(protectedPath.type, 'path', 'permission path type');
172
+ requireValue(protectedPath.path, `${profile.cwd}/${suffix}`, 'permission path cwd');
173
+ return { access: 'read', missing_path_behavior: 'skip', path: { type: 'path', path: `${profile.cwd}/${suffix}` } };
174
+ });
175
+ return { type: 'managed', file_system: { type: 'restricted', entries: [
176
+ { access: 'read', path: { type: 'special', value: { kind: 'root' } } },
177
+ { access: 'write', path: { type: 'path', path: profile.cwd } },
178
+ ...protectedEntries,
179
+ ] }, network: 'restricted' };
138
180
  }
139
181
 
140
182
  function validateRollout(value) {
@@ -146,8 +188,8 @@ function validateRollout(value) {
146
188
  export function attestGovernedCodexSession(input) {
147
189
  exactObject(input, ['profile', 'events'], 'attester input');
148
190
  const profile = validateGovernedCodexProfile(input.profile);
149
- const v2 = profile.version === PROFILE_V2_VALUES.version;
150
- if (v2) {
191
+ const native = profile.version === PROFILE_V2_VALUES.version || profile.version === PROFILE_V3_VALUES.version;
192
+ if (native) {
151
193
  exactArray(input.events, 2, 'events');
152
194
  } else exactArray(input.events, 1, 'events');
153
195
  const event = exactObject(input.events[0], ['jsonrpc', 'method', 'params'], 'event');
@@ -155,27 +197,37 @@ export function attestGovernedCodexSession(input) {
155
197
  const params = exactObject(event.params, ['_meta', 'id', 'msg'], 'event.params'); requireValue(params.id, '', 'event.params.id');
156
198
  const meta = exactObject(params._meta, ['requestId', 'threadId'], 'event._meta'); requireValue(meta.requestId, 2, 'requestId');
157
199
  const hasServiceTier = Object.prototype.propertyIsEnumerable.call(params.msg, 'service_tier');
158
- const msg = exactObject(params.msg, hasServiceTier ? [...SESSION_MSG_KEYS, 'service_tier'] : SESSION_MSG_KEYS, 'event.msg');
200
+ const hasSandbox = Object.prototype.propertyIsEnumerable.call(params.msg, 'sandbox');
201
+ const writer = profile.sandbox === 'workspace-write';
202
+ const sessionKeys = writer ? [...SESSION_MSG_KEYS, ...(hasServiceTier ? ['service_tier'] : []), ...(hasSandbox ? ['sandbox'] : [])]
203
+ : hasServiceTier ? [...SESSION_MSG_KEYS, 'service_tier'] : SESSION_MSG_KEYS;
204
+ const msg = exactObject(params.msg, sessionKeys, 'event.msg');
159
205
  if (hasServiceTier && !SESSION_SERVICE_TIERS.includes(msg.service_tier)) invalid('event.msg');
160
206
  for (const id of [meta.threadId, msg.session_id, msg.thread_id]) if (typeof id !== 'string' || !SAFE_ID.test(id)) invalid('session identity');
161
207
  if (meta.threadId !== msg.session_id || msg.session_id !== msg.thread_id) invalid('session identity');
162
208
  requireValue(msg.type, 'session_configured', 'msg.type'); requireValue(msg.model, profile.model, 'msg.model');
163
209
  requireValue(msg.model_provider_id, 'openai', 'msg.model_provider_id'); requireValue(msg.approval_policy, profile.approvalPolicy, 'msg.approval_policy');
164
210
  requireValue(msg.approvals_reviewer, 'user', 'msg.approvals_reviewer'); requireValue(msg.reasoning_effort, profile.reasoningEffort, 'msg.reasoning_effort');
211
+ if (writer && hasSandbox) requireValue(msg.sandbox, profile.sandbox, 'msg.sandbox');
165
212
  validateRollout(msg.rollout_path);
166
213
  if (canonicalCwd(msg.cwd) !== profile.cwd) invalid('msg.cwd');
167
- const permission = validatePermission(msg.permission_profile);
214
+ const permission = validatePermission(msg.permission_profile, profile);
168
215
  const cwdDigest = digest(profile.cwd);
169
- if (v2) {
216
+ if (native) {
170
217
  const nativeTools = exactObject(input.events[1], ['total', 'tools'], 'native tool evidence');
171
218
  if (!Number.isSafeInteger(nativeTools.total) || nativeTools.total < 0 || nativeTools.total > 256) invalid('native tool total');
172
- exactArray(nativeTools.tools, nativeTools.total === 0 ? 0 : 1, 'native tool aggregates');
173
- if (nativeTools.total > 0) {
174
- const aggregate = exactObject(nativeTools.tools[0], ['name', 'status', 'count'], 'native tool aggregate');
175
- if (!profile.codexNativeTools.includes(aggregate.name)) invalid('undeclared native tool evidence');
219
+ if (!Array.isArray(nativeTools.tools) || nativeTools.tools.length > profile.codexNativeTools.length) invalid('native tool aggregates');
220
+ const seen = new Set(); let aggregateTotal = 0;
221
+ for (const item of nativeTools.tools) {
222
+ const aggregate = exactObject(item, ['name', 'status', 'count'], 'native tool aggregate');
223
+ if (!profile.codexNativeTools.includes(aggregate.name) || seen.has(aggregate.name)) invalid('undeclared native tool evidence');
224
+ seen.add(aggregate.name);
176
225
  requireValue(aggregate.status, 'completed', 'native tool status');
177
- if (!Number.isSafeInteger(aggregate.count) || aggregate.count !== nativeTools.total) invalid('native tool count');
226
+ if (!Number.isSafeInteger(aggregate.count) || aggregate.count < 1 || aggregate.count > 256) invalid('native tool count');
227
+ aggregateTotal += aggregate.count;
178
228
  }
229
+ if (aggregateTotal !== nativeTools.total || (nativeTools.total === 0 && nativeTools.tools.length !== 0) ||
230
+ (nativeTools.total > 0 && nativeTools.tools.length === 0)) invalid('native tool count');
179
231
  return deepFreeze({
180
232
  version: 'probe.governed-codex-attestation/v3', profileId: profile.profileId,
181
233
  requested: { profileDigest: digest(profile), cwdDigest, probeMcpToolsDigest: digest(profile.probeMcpTools),
@@ -184,7 +236,7 @@ export function attestGovernedCodexSession(input) {
184
236
  sandbox: profile.sandbox, approvalPolicy: profile.approvalPolicy },
185
237
  observed: { source: 'session_configured+raw_response_item', model: msg.model, modelProviderId: msg.model_provider_id,
186
238
  reasoningEffort: msg.reasoning_effort, approvalPolicy: msg.approval_policy, cwdDigest,
187
- permissionProfileDigest: digest(permission), filesystem: 'restricted-read-root', network: permission.network,
239
+ permissionProfileDigest: digest(permission), filesystem: profile.sandbox === 'workspace-write' ? 'restricted-write-cwd' : 'restricted-read-root', network: permission.network,
188
240
  nativeTools: { total: nativeTools.total, tools: nativeTools.tools.map((item) => ({ ...item })) } },
189
241
  correlation: { requestId: 2, eventCount: nativeTools.total + 1 }, usage: { status: 'unavailable' },
190
242
  });
@@ -128,3 +128,21 @@ export interface AtomicTerminalReceiptResult {
128
128
  export function writeAtomicTerminalReceipt(
129
129
  options: AtomicTerminalReceiptOptions
130
130
  ): Promise<Readonly<AtomicTerminalReceiptResult>>;
131
+
132
+ export const GOVERNED_CODEX_EXEC_PROTOCOL: 'probe.governed-codex-exec/v1';
133
+ export const GOVERNED_CODEX_EXEC_ATTESTATION_VERSION: 'probe.governed-codex-exec-attestation/v1';
134
+ export const GOVERNED_CODEX_EXEC_TRANSPORT: 'exec-jsonl-default-auth-v1';
135
+ export function buildGovernedCodexExecLaunch(options: Record<string, unknown>): Readonly<Record<string, unknown>>;
136
+ export function createGovernedCodexExecEngine(options: Record<string, unknown>): Promise<Readonly<{
137
+ run(prompt?: string, options?: Record<string, unknown>): Promise<Readonly<Record<string, unknown>>>;
138
+ query(prompt: string, options?: Record<string, unknown>): AsyncGenerator<Readonly<Record<string, unknown>>>;
139
+ close(): Promise<void>;
140
+ readonly launch: Readonly<Record<string, unknown>> | null;
141
+ }>>;
142
+ export function runGovernedCodexExec(options: Record<string, unknown>): Promise<Readonly<Record<string, unknown>>>;
143
+ export function formatGovernedCodexExecAttestation(input: Record<string, unknown>): Readonly<Record<string, unknown>>;
144
+ export const buildGovernedCodexExecAttestation: typeof formatGovernedCodexExecAttestation;
145
+ export function validateGovernedCodexExecAttestation(input: Record<string, unknown>): Readonly<Record<string, unknown>>;
146
+ export function projectGovernedCodexExecFailure(error: unknown): Readonly<Record<string, unknown>> | null;
147
+ export function normalizeGovernedCodexExecFailure(error: unknown, boundary: 'acquire' | 'query' | 'close'): Error;
148
+ export function previewGovernedCodexExecDispatch(prompt: string, systemPrompt?: string): Readonly<{ source: 'probe-host-exec'; tool: 'codex-exec'; promptDigest: `sha256:${string}`; promptBytes: number }>;
@@ -6,3 +6,17 @@
6
6
  export { spawnGovernedProcess } from '../processSupervisor.js';
7
7
  export { createAcknowledgedJsonlChannel } from './acknowledgedJsonlChannel.js';
8
8
  export { writeAtomicTerminalReceipt } from './atomicTerminalReceipt.js';
9
+ export {
10
+ GOVERNED_CODEX_EXEC_PROTOCOL,
11
+ GOVERNED_CODEX_EXEC_ATTESTATION_VERSION,
12
+ GOVERNED_CODEX_EXEC_TRANSPORT,
13
+ buildGovernedCodexExecLaunch,
14
+ createGovernedCodexExecEngine,
15
+ runGovernedCodexExec,
16
+ formatGovernedCodexExecAttestation,
17
+ buildGovernedCodexExecAttestation,
18
+ validateGovernedCodexExecAttestation,
19
+ projectGovernedCodexExecFailure,
20
+ normalizeGovernedCodexExecFailure,
21
+ previewGovernedCodexExecDispatch,
22
+ } from '../engines/governed-codex-exec.js';
package/build/index.js CHANGED
@@ -51,6 +51,20 @@ import { FileTracker } from './tools/fileTracker.js';
51
51
  import { ProbeAgent, ENGINE_ACTIVITY_TIMEOUT_DEFAULT, ENGINE_ACTIVITY_TIMEOUT_MIN, ENGINE_ACTIVITY_TIMEOUT_MAX } from './agent/ProbeAgent.js';
52
52
  import { SimpleTelemetry, SimpleAppTracer, initializeSimpleTelemetryFromOptions } from './agent/simpleTelemetry.js';
53
53
  import { spawnGovernedProcess } from './agent/processSupervisor.js';
54
+ import {
55
+ GOVERNED_CODEX_EXEC_PROTOCOL,
56
+ GOVERNED_CODEX_EXEC_ATTESTATION_VERSION,
57
+ GOVERNED_CODEX_EXEC_TRANSPORT,
58
+ buildGovernedCodexExecLaunch,
59
+ createGovernedCodexExecEngine,
60
+ runGovernedCodexExec,
61
+ formatGovernedCodexExecAttestation,
62
+ buildGovernedCodexExecAttestation,
63
+ validateGovernedCodexExecAttestation,
64
+ projectGovernedCodexExecFailure,
65
+ normalizeGovernedCodexExecFailure,
66
+ previewGovernedCodexExecDispatch
67
+ } from './agent/engines/governed-codex-exec.js';
54
68
  import { listFilesToolInstance, searchFilesToolInstance } from './agent/probeTool.js';
55
69
  import { StorageAdapter, InMemoryStorageAdapter } from './agent/storage/index.js';
56
70
  import { HookManager, HOOK_TYPES } from './agent/hooks/index.js';
@@ -90,6 +104,18 @@ export {
90
104
  SimpleAppTracer,
91
105
  initializeSimpleTelemetryFromOptions,
92
106
  spawnGovernedProcess,
107
+ GOVERNED_CODEX_EXEC_PROTOCOL,
108
+ GOVERNED_CODEX_EXEC_ATTESTATION_VERSION,
109
+ GOVERNED_CODEX_EXEC_TRANSPORT,
110
+ buildGovernedCodexExecLaunch,
111
+ createGovernedCodexExecEngine,
112
+ runGovernedCodexExec,
113
+ formatGovernedCodexExecAttestation,
114
+ buildGovernedCodexExecAttestation,
115
+ validateGovernedCodexExecAttestation,
116
+ projectGovernedCodexExecFailure,
117
+ normalizeGovernedCodexExecFailure,
118
+ previewGovernedCodexExecDispatch,
93
119
  // Export tool generators directly
94
120
  searchTool,
95
121
  queryTool,