@telora/daemon 0.17.104 → 0.17.107

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build-info.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
- "commitSha": "bef8c556",
3
- "builtAt": "2026-06-17T14:45:36.290Z",
2
+ "commitSha": "13e96c48",
3
+ "builtAt": "2026-06-18T11:16:27.767Z",
4
4
  "expectedMigrations": [
5
5
  "20250829113330_create_org_nodes_table.sql",
6
6
  "20250829113402_fix_function_security_search_path.sql",
@@ -27,10 +27,20 @@ export declare function installAuditPreCommitHook(worktreePath: string): void;
27
27
  * must never carry a `deny` key.
28
28
  */
29
29
  export declare function writeReadOnlyDenyOverlay(worktreePath: string): void;
30
+ /**
31
+ * Write Codex's read-only audit overlay into the worktree-local project config.
32
+ *
33
+ * Codex project config is a durable record for the worktree; spawn-time `-c`
34
+ * overrides still select `default_permissions="telora_read_only"` so read-only
35
+ * enforcement does not depend on project trust. The profile itself is kept here
36
+ * for parity, inspection, and trusted-project runs.
37
+ */
38
+ export declare function writeCodexReadOnlyOverlay(worktreePath: string): void;
30
39
  /**
31
40
  * Install all read-only audit enforcement in a worktree: the commit-blocking
32
- * pre-commit hook AND the write-deny settings overlay. Single entry point so
33
- * every read-only worktree-setup site gets identical coverage.
41
+ * pre-commit hook, Claude's write-deny settings overlay, and Codex's
42
+ * read-only permission profile. Single entry point so every read-only
43
+ * worktree-setup site gets identical coverage.
34
44
  */
35
45
  export declare function installReadOnlyAuditGuards(worktreePath: string): void;
36
46
  //# sourceMappingURL=audit-hooks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"audit-hooks.d.ts","sourceRoot":"","sources":["../src/audit-hooks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAiCpE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CA0BnE;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAGrE"}
1
+ {"version":3,"file":"audit-hooks.d.ts","sourceRoot":"","sources":["../src/audit-hooks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAiCpE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CA0BnE;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CA8BpE;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAIrE"}
@@ -8,6 +8,9 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
8
8
  import { join } from 'node:path';
9
9
  import { runGitSync } from './git-types.js';
10
10
  import { buildClaudeSettings, mergeClaudeSettings } from './templates/claude-settings.js';
11
+ import { ensureCodexConfigIgnoredInWorktree } from './worktree.js';
12
+ const CODEX_READ_ONLY_BLOCK_START = '# BEGIN TELORA CODEX READ-ONLY';
13
+ const CODEX_READ_ONLY_BLOCK_END = '# END TELORA CODEX READ-ONLY';
11
14
  /**
12
15
  * Install a pre-commit hook in a worktree that blocks all commits.
13
16
  * Used for read-only audit sessions.
@@ -84,13 +87,49 @@ export function writeReadOnlyDenyOverlay(worktreePath) {
84
87
  const merged = mergeClaudeSettings(existing, buildClaudeSettings({ readOnly: true }));
85
88
  writeFileSync(settingsPath, JSON.stringify(merged, null, 2) + '\n');
86
89
  }
90
+ /**
91
+ * Write Codex's read-only audit overlay into the worktree-local project config.
92
+ *
93
+ * Codex project config is a durable record for the worktree; spawn-time `-c`
94
+ * overrides still select `default_permissions="telora_read_only"` so read-only
95
+ * enforcement does not depend on project trust. The profile itself is kept here
96
+ * for parity, inspection, and trusted-project runs.
97
+ */
98
+ export function writeCodexReadOnlyOverlay(worktreePath) {
99
+ ensureCodexConfigIgnoredInWorktree(worktreePath);
100
+ const dir = join(worktreePath, '.codex');
101
+ if (!existsSync(dir)) {
102
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
103
+ }
104
+ const configPath = join(dir, 'config.toml');
105
+ const existing = existsSync(configPath) ? readFileSync(configPath, 'utf-8') : '';
106
+ const block = [
107
+ CODEX_READ_ONLY_BLOCK_START,
108
+ '# Generated by Telora for read-only Codex audit execution.',
109
+ '# Spawn-time overrides select this permission profile.',
110
+ '',
111
+ '[permissions.telora_read_only.filesystem]',
112
+ '":minimal" = "read"',
113
+ '":workspace_roots" = { "." = "read" }',
114
+ '',
115
+ '[permissions.telora_read_only.network]',
116
+ 'enabled = false',
117
+ CODEX_READ_ONLY_BLOCK_END,
118
+ ].join('\n');
119
+ const markerPattern = new RegExp(`${CODEX_READ_ONLY_BLOCK_START}[\\s\\S]*?${CODEX_READ_ONLY_BLOCK_END}\\n?`, 'm');
120
+ const withoutOldBlock = existing.replace(markerPattern, '').trimEnd();
121
+ const separator = withoutOldBlock ? '\n\n' : '';
122
+ writeFileSync(configPath, `${withoutOldBlock}${separator}${block}\n`, { mode: 0o600 });
123
+ }
87
124
  /**
88
125
  * Install all read-only audit enforcement in a worktree: the commit-blocking
89
- * pre-commit hook AND the write-deny settings overlay. Single entry point so
90
- * every read-only worktree-setup site gets identical coverage.
126
+ * pre-commit hook, Claude's write-deny settings overlay, and Codex's
127
+ * read-only permission profile. Single entry point so every read-only
128
+ * worktree-setup site gets identical coverage.
91
129
  */
92
130
  export function installReadOnlyAuditGuards(worktreePath) {
93
131
  installAuditPreCommitHook(worktreePath);
94
132
  writeReadOnlyDenyOverlay(worktreePath);
133
+ writeCodexReadOnlyOverlay(worktreePath);
95
134
  }
96
135
  //# sourceMappingURL=audit-hooks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"audit-hooks.js","sourceRoot":"","sources":["../src/audit-hooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"audit-hooks.js","sourceRoot":"","sources":["../src/audit-hooks.ts"],"names":[],"mappings":"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"}
@@ -27,13 +27,18 @@ export interface AgentSpawnContext {
27
27
  model?: string | null;
28
28
  /**
29
29
  * Least-privilege tool allowlist from the focus's agent role
30
- * (`agent_roles.allowed_tools`). When non-empty, the backend restricts the
31
- * spawned agent to exactly these tools (Claude: `--allowed-tools`). When
32
- * empty/absent, the documented default policy applies: the agent runs with
33
- * the engine's built-in default tool set (no restriction flag). Tighten a
34
- * role by populating its allowed_tools. See docs/security-posture-daemon-execution.md.
30
+ * (`agent_roles.allowed_tools`). Backends apply the strongest native
31
+ * equivalent they support: Claude uses `--allowed-tools`; Codex maps the
32
+ * enforceable subset to MCP enabled_tools, feature toggles, and permission
33
+ * profiles. Empty/absent means the engine's documented default tool set.
34
+ * See docs/security-posture-daemon-execution.md.
35
35
  */
36
36
  allowedTools?: readonly string[];
37
+ /**
38
+ * True for read-only audit/review focuses. Backends that support an
39
+ * execution-policy layer can tighten filesystem permissions for these spawns.
40
+ */
41
+ readOnly?: boolean;
37
42
  }
38
43
  /** Inputs for resuming a prior session. */
39
44
  export interface AgentResumeContext extends AgentSpawnContext {
@@ -1 +1 @@
1
- {"version":3,"file":"agent-backend.d.ts","sourceRoot":"","sources":["../../src/backends/agent-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,wCAAwC;AACxC,MAAM,WAAW,iBAAiB;IAChC,8EAA8E;IAC9E,MAAM,EAAE,YAAY,CAAC;IACrB,iFAAiF;IACjF,YAAY,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED,2CAA2C;AAC3C,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC3D,+EAA+E;IAC/E,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,gFAAgF;AAChF,MAAM,WAAW,mBAAmB;IAClC,iFAAiF;IACjF,SAAS,EAAE,OAAO,CAAC;IACnB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,yEAAyE;IACzE,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAAC;IAE7C,qDAAqD;IACrD,cAAc,CAAC,GAAG,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAAC;IAEjD,mDAAmD;IACnD,eAAe,CAAC,GAAG,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAAC;IAEnD,kFAAkF;IAClF,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IAErC,2EAA2E;IAC3E,YAAY,IAAI,gBAAgB,CAAC;IAEjC,yEAAyE;IACzE,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACvE"}
1
+ {"version":3,"file":"agent-backend.d.ts","sourceRoot":"","sources":["../../src/backends/agent-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,wCAAwC;AACxC,MAAM,WAAW,iBAAiB;IAChC,8EAA8E;IAC9E,MAAM,EAAE,YAAY,CAAC;IACrB,iFAAiF;IACjF,YAAY,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,2CAA2C;AAC3C,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC3D,+EAA+E;IAC/E,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,gFAAgF;AAChF,MAAM,WAAW,mBAAmB;IAClC,iFAAiF;IACjF,SAAS,EAAE,OAAO,CAAC;IACnB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,yEAAyE;IACzE,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAAC;IAE7C,qDAAqD;IACrD,cAAc,CAAC,GAAG,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAAC;IAEjD,mDAAmD;IACnD,eAAe,CAAC,GAAG,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAAC;IAEnD,kFAAkF;IAClF,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IAErC,2EAA2E;IAC3E,YAAY,IAAI,gBAAgB,CAAC;IAEjC,yEAAyE;IACzE,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACvE"}
@@ -3,7 +3,8 @@
3
3
  *
4
4
  * Recipe validated against Codex CLI 0.133.0 (spike: /tmp/codex-spike):
5
5
  * - spawn: `codex exec --json --dangerously-bypass-approvals-and-sandbox
6
- * --cd <worktree> -c mcp_servers.telora.* -` (prompt on stdin)
6
+ * --cd <worktree> -c <daemon execution config> -c mcp_servers.telora.* -`
7
+ * (prompt on stdin)
7
8
  * - resume: `codex exec resume <sessionId> --json --dangerously-bypass-...`
8
9
  * NO `--cd` (the resume subcommand rejects it; workspace is recovered
9
10
  * from the session). NEVER `--ephemeral` (it skips session persistence
@@ -1 +1 @@
1
- {"version":3,"file":"codex-backend.d.ts","sourceRoot":"","sources":["../../../src/backends/codex/codex-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAMH,OAAO,KAAK,EACV,YAAY,EAIb,MAAM,qBAAqB,CAAC;AAyC7B,eAAO,MAAM,YAAY,EAAE,YA4D1B,CAAC"}
1
+ {"version":3,"file":"codex-backend.d.ts","sourceRoot":"","sources":["../../../src/backends/codex/codex-backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAOH,OAAO,KAAK,EACV,YAAY,EAIb,MAAM,qBAAqB,CAAC;AA2L7B,eAAO,MAAM,YAAY,EAAE,YA4D1B,CAAC"}
@@ -3,7 +3,8 @@
3
3
  *
4
4
  * Recipe validated against Codex CLI 0.133.0 (spike: /tmp/codex-spike):
5
5
  * - spawn: `codex exec --json --dangerously-bypass-approvals-and-sandbox
6
- * --cd <worktree> -c mcp_servers.telora.* -` (prompt on stdin)
6
+ * --cd <worktree> -c <daemon execution config> -c mcp_servers.telora.* -`
7
+ * (prompt on stdin)
7
8
  * - resume: `codex exec resume <sessionId> --json --dangerously-bypass-...`
8
9
  * NO `--cd` (the resume subcommand rejects it; workspace is recovered
9
10
  * from the session). NEVER `--ephemeral` (it skips session persistence
@@ -24,13 +25,144 @@
24
25
  * environment, not this backend).
25
26
  */
26
27
  import { existsSync } from 'node:fs';
27
- import { join, isAbsolute } from 'node:path';
28
+ import { execFileSync } from 'node:child_process';
29
+ import { join, isAbsolute, resolve, delimiter } from 'node:path';
28
30
  import { homedir } from 'node:os';
29
31
  import { CodexAgentParser, resolveMcpServerPath } from '@telora/daemon-core';
30
32
  /** Bypass approvals + sandbox -- matches Claude's --dangerously-skip-permissions. */
31
33
  const BYPASS_FLAG = '--dangerously-bypass-approvals-and-sandbox';
34
+ function resolveCommandOnPath(command) {
35
+ const pathEnv = process.env.PATH ?? '';
36
+ for (const dir of pathEnv.split(delimiter).filter(Boolean)) {
37
+ const candidate = resolve(dir, command);
38
+ if (existsSync(candidate))
39
+ return candidate;
40
+ }
41
+ return null;
42
+ }
43
+ function npmGlobalBinDir() {
44
+ if (process.env.NPM_CONFIG_PREFIX) {
45
+ return resolve(process.env.NPM_CONFIG_PREFIX, 'bin');
46
+ }
47
+ try {
48
+ const prefix = execFileSync('npm', ['prefix', '-g'], {
49
+ encoding: 'utf-8',
50
+ timeout: 5_000,
51
+ }).trim();
52
+ return prefix ? resolve(prefix, 'bin') : null;
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ }
58
+ function discoverCodexCommand() {
59
+ const onPath = resolveCommandOnPath('codex');
60
+ if (onPath)
61
+ return onPath;
62
+ const npmBinDir = npmGlobalBinDir();
63
+ const candidates = [
64
+ npmBinDir ? resolve(npmBinDir, 'codex') : null,
65
+ resolve(homedir(), '.npm-global', 'bin', 'codex'),
66
+ resolve(homedir(), '.local', 'bin', 'codex'),
67
+ ];
68
+ for (const candidate of candidates) {
69
+ if (candidate && existsSync(candidate))
70
+ return candidate;
71
+ }
72
+ return null;
73
+ }
32
74
  function codexCommand(config) {
33
- return config.codexPath ?? 'codex';
75
+ return config.codexPath ?? discoverCodexCommand() ?? 'codex';
76
+ }
77
+ function tomlStringArray(values) {
78
+ return `[${values.map(value => JSON.stringify(value)).join(',')}]`;
79
+ }
80
+ function uniqueStrings(values) {
81
+ return [...new Set(values.map(value => value.trim()).filter(Boolean))];
82
+ }
83
+ /**
84
+ * Critical daemon execution posture passed as CLI config overrides. These
85
+ * duplicate the generated worktree `.codex/config.toml` so noninteractive
86
+ * spawns do not silently depend on project-config trust.
87
+ */
88
+ function daemonExecutionConfigFlags(readOnly = false) {
89
+ const flags = [
90
+ '-c', `approval_policy="never"`,
91
+ '-c', `sandbox_mode="workspace-write"`,
92
+ '-c', `web_search="cached"`,
93
+ '-c', `features.multi_agent=true`,
94
+ '-c', `sandbox_workspace_write.network_access=false`,
95
+ '-c', `sandbox_workspace_write.exclude_tmpdir_env_var=false`,
96
+ '-c', `sandbox_workspace_write.exclude_slash_tmp=false`,
97
+ '-c', `shell_environment_policy.inherit="core"`,
98
+ '-c', `shell_environment_policy.ignore_default_excludes=false`,
99
+ ];
100
+ if (readOnly) {
101
+ flags.push('-c', `default_permissions="telora_read_only"`);
102
+ flags.push('-c', `permissions.telora_read_only.filesystem={ ":minimal" = "read", ":workspace_roots" = { "." = "read" } }`);
103
+ flags.push('-c', `permissions.telora_read_only.network.enabled=false`);
104
+ }
105
+ return flags;
106
+ }
107
+ function claudeMcpToolToCodexTool(tool) {
108
+ const match = /^mcp__(telora|telora-products)__([A-Za-z0-9_:-]+)$/.exec(tool);
109
+ return match ? match[2] : null;
110
+ }
111
+ function isNativeShellAllowed(allowedTools) {
112
+ return allowedTools.some(tool => tool === 'Bash' || tool.startsWith('Bash('));
113
+ }
114
+ function isNativeMultiAgentAllowed(allowedTools) {
115
+ return allowedTools.some(tool => tool === 'Task' || tool === 'spawn_agents_on_csv' || tool === 'SpawnAgents');
116
+ }
117
+ function hasNativeWriteSurface(allowedTools) {
118
+ return allowedTools.some(tool => tool === 'Write' ||
119
+ tool === 'Edit' ||
120
+ tool === 'MultiEdit' ||
121
+ tool === 'NotebookEdit' ||
122
+ tool === 'apply_patch' ||
123
+ tool === 'Bash' ||
124
+ tool.startsWith('Bash('));
125
+ }
126
+ /**
127
+ * Best-effort mapping from Claude-style role allowed_tools to Codex controls.
128
+ *
129
+ * Codex has no single `--allowed-tools` equivalent. The enforceable subset is:
130
+ * - Telora MCP tools -> `mcp_servers.telora.enabled_tools`.
131
+ * - Missing Bash -> disable the shell tool feature.
132
+ * - Missing Task/subagent tools -> disable multi-agent.
133
+ * - Read-only native role -> apply a read-only filesystem permission profile.
134
+ */
135
+ function roleAllowedToolsConfigFlags(allowedTools) {
136
+ const tools = uniqueStrings(allowedTools ?? []);
137
+ if (tools.length === 0)
138
+ return [];
139
+ const flags = [];
140
+ const teloraTools = uniqueStrings(tools.map(claudeMcpToolToCodexTool).filter((tool) => tool !== null));
141
+ if (teloraTools.length > 0) {
142
+ flags.push('-c', `mcp_servers.telora.enabled_tools=${tomlStringArray(teloraTools)}`);
143
+ }
144
+ else {
145
+ flags.push('-c', `mcp_servers.telora.enabled=false`);
146
+ }
147
+ if (!isNativeShellAllowed(tools)) {
148
+ flags.push('-c', `features.shell_tool=false`);
149
+ }
150
+ if (!isNativeMultiAgentAllowed(tools)) {
151
+ flags.push('-c', `features.multi_agent=false`);
152
+ }
153
+ if (!hasNativeWriteSurface(tools)) {
154
+ flags.push('-c', `default_permissions="telora_role_read_only"`);
155
+ flags.push('-c', `permissions.telora_role_read_only.filesystem={ ":minimal" = "read", ":workspace_roots" = { "." = "read" } }`);
156
+ flags.push('-c', `permissions.telora_role_read_only.network.enabled=false`);
157
+ }
158
+ const unsupported = tools.filter(tool => claudeMcpToolToCodexTool(tool) === null &&
159
+ !['Read', 'Grep', 'Glob', 'LS', 'Bash', 'Write', 'Edit', 'MultiEdit', 'NotebookEdit', 'Task', 'apply_patch', 'spawn_agents_on_csv', 'SpawnAgents'].includes(tool) &&
160
+ !tool.startsWith('Bash('));
161
+ if (unsupported.length > 0) {
162
+ console.warn(`[codex-backend] Role allowed_tools contains ${unsupported.length} tool(s) with no Codex mapping: ` +
163
+ unsupported.join(', '));
164
+ }
165
+ return flags;
34
166
  }
35
167
  /**
36
168
  * Build `-c mcp_servers.telora.*` config overrides wiring the Telora MCP server
@@ -62,8 +194,7 @@ function mcpConfigFlags(config) {
62
194
  function commandExists(command) {
63
195
  if (isAbsolute(command) || command.includes('/'))
64
196
  return existsSync(command);
65
- const pathEnv = process.env.PATH ?? '';
66
- return pathEnv.split(':').filter(Boolean).some((dir) => existsSync(join(dir, command)));
197
+ return resolveCommandOnPath(command) !== null;
67
198
  }
68
199
  export const codexBackend = {
69
200
  id: 'codex',
@@ -75,11 +206,9 @@ export const codexBackend = {
75
206
  const args = ['exec', '--json', BYPASS_FLAG, '--cd', ctx.worktreePath];
76
207
  if (ctx.model)
77
208
  args.push('--model', ctx.model);
209
+ args.push(...daemonExecutionConfigFlags(ctx.readOnly));
78
210
  args.push(...mcpConfigFlags(ctx.config));
79
- // NOTE: ctx.allowedTools (the role's least-privilege tool list) is honored
80
- // by the Claude backend via --allowed-tools; codex exec has no equivalent
81
- // per-tool allowlist flag, so role tool-scoping is not enforced on the
82
- // codex path today. Tracked in docs/security-posture-daemon-execution.md.
211
+ args.push(...roleAllowedToolsConfigFlags(ctx.allowedTools));
83
212
  // Trailing '-' tells codex exec to read the prompt from stdin.
84
213
  args.push('-');
85
214
  return args;
@@ -89,9 +218,11 @@ export const codexBackend = {
89
218
  const args = ['exec', 'resume', ctx.resumeSessionId, '--json', BYPASS_FLAG];
90
219
  if (ctx.model)
91
220
  args.push('--model', ctx.model);
221
+ args.push(...daemonExecutionConfigFlags(ctx.readOnly));
92
222
  // MCP config overrides are global `-c` flags (accepted by the resume
93
223
  // subcommand) so the resumed agent keeps Telora MCP access.
94
224
  args.push(...mcpConfigFlags(ctx.config));
225
+ args.push(...roleAllowedToolsConfigFlags(ctx.allowedTools));
95
226
  args.push('-');
96
227
  return args;
97
228
  },
@@ -1 +1 @@
1
- {"version":3,"file":"codex-backend.js","sourceRoot":"","sources":["../../../src/backends/codex/codex-backend.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codex-backend.js","sourceRoot":"","sources":["../../../src/backends/codex/codex-backend.ts"],"names":[],"mappings":"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"}
@@ -118,6 +118,14 @@ export declare function redeemEndpoint(teloraUrl: string): string;
118
118
  * Validate that the token has the expected `TOK_*` shape.
119
119
  */
120
120
  export declare function validateTokenShape(token: string): boolean;
121
+ /**
122
+ * Resolve Codex to a stable on-disk executable for daemon config.
123
+ *
124
+ * The daemon runs detached and may not inherit the operator's login-shell PATH.
125
+ * Persisting an absolute path during `connect --harness codex` keeps future
126
+ * agent spawns independent of shell startup files.
127
+ */
128
+ export declare function resolveCodexCliPath(repoPath: string): string | null;
121
129
  /**
122
130
  * Write the daemon config to ~/.telora/daemon.json.
123
131
  *
@@ -142,6 +150,8 @@ export declare function writeConnectDaemonConfig(params: {
142
150
  defaultCodingEngine?: string;
143
151
  /** Model id the local-model server exposes (local-model flow). */
144
152
  codexModel?: string;
153
+ /** Absolute path to the Codex CLI for detached daemon spawns. */
154
+ codexPath?: string;
145
155
  }): string;
146
156
  /**
147
157
  * Write the AHA starter prompt + first-session marker into the repo's
@@ -1 +1 @@
1
- {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/cli/connect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/cli/connect.ts"],"names":[],"mappings":"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"}
@@ -95,6 +95,57 @@ function defaultIO(io) {
95
95
  export function validateTokenShape(token) {
96
96
  return typeof token === 'string' && token.startsWith('TOK_') && token.length > 8;
97
97
  }
98
+ function executableExists(path) {
99
+ return existsSync(path);
100
+ }
101
+ function resolveCommandOnPath(command) {
102
+ const pathEnv = process.env.PATH ?? '';
103
+ for (const dir of pathEnv.split(delimiter).filter(Boolean)) {
104
+ const candidate = resolve(dir, command);
105
+ if (executableExists(candidate))
106
+ return candidate;
107
+ }
108
+ return null;
109
+ }
110
+ function npmGlobalBinDir() {
111
+ if (process.env.NPM_CONFIG_PREFIX) {
112
+ return resolve(process.env.NPM_CONFIG_PREFIX, 'bin');
113
+ }
114
+ try {
115
+ const prefix = execFileSync('npm', ['prefix', '-g'], {
116
+ encoding: 'utf-8',
117
+ timeout: 5_000,
118
+ }).trim();
119
+ return prefix ? resolve(prefix, 'bin') : null;
120
+ }
121
+ catch {
122
+ return null;
123
+ }
124
+ }
125
+ /**
126
+ * Resolve Codex to a stable on-disk executable for daemon config.
127
+ *
128
+ * The daemon runs detached and may not inherit the operator's login-shell PATH.
129
+ * Persisting an absolute path during `connect --harness codex` keeps future
130
+ * agent spawns independent of shell startup files.
131
+ */
132
+ export function resolveCodexCliPath(repoPath) {
133
+ const onPath = resolveCommandOnPath('codex');
134
+ if (onPath)
135
+ return onPath;
136
+ const npmBinDir = npmGlobalBinDir();
137
+ const candidates = [
138
+ npmBinDir ? resolve(npmBinDir, 'codex') : null,
139
+ resolve(homedir(), '.npm-global', 'bin', 'codex'),
140
+ resolve(homedir(), '.local', 'bin', 'codex'),
141
+ resolve(repoPath, 'node_modules', '.bin', 'codex'),
142
+ ];
143
+ for (const candidate of candidates) {
144
+ if (candidate && executableExists(candidate))
145
+ return candidate;
146
+ }
147
+ return null;
148
+ }
98
149
  /**
99
150
  * Write the daemon config to ~/.telora/daemon.json.
100
151
  *
@@ -117,6 +168,7 @@ export function writeConnectDaemonConfig(params) {
117
168
  teloraUrl: params.teloraUrl,
118
169
  trackerId: params.trackerId,
119
170
  organizationId: params.organizationId,
171
+ ...(params.codexPath ? { codexPath: params.codexPath } : {}),
120
172
  products: [
121
173
  {
122
174
  id: params.productId,
@@ -777,6 +829,7 @@ export async function runConnect(opts) {
777
829
  // (e.g. http://supabase-kong:8000) -- unreachable from the user's
778
830
  // machine and silently poisoning daemon.json and .mcp.json.
779
831
  const resolvedTeloraUrl = teloraUrl;
832
+ const harness = opts.harness ?? DEFAULT_OPERATOR_HARNESS;
780
833
  // -- Local-model provisioning (optional) ---------------------------------
781
834
  // When the redeemed token resolves to local-model coordinates, provision
782
835
  // the product's ISOLATED CODEX_HOME (writes config.toml referencing the API
@@ -794,6 +847,10 @@ export async function runConnect(opts) {
794
847
  io.out(renderManualCodexProfile(coords));
795
848
  io.out('\n');
796
849
  }
850
+ const codexPath = harness === 'codex' ? resolveCodexCliPath(repoPath) : null;
851
+ if (harness === 'codex' && !codexPath) {
852
+ io.err(`Warning: Codex CLI was not found during connect; daemon.json will fall back to resolving "codex" on the daemon PATH.\n`);
853
+ }
797
854
  // -- Write daemon config --------------------------------------------------
798
855
  const configPath = writeConnectDaemonConfig({
799
856
  teloraUrl: resolvedTeloraUrl,
@@ -805,6 +862,7 @@ export async function runConnect(opts) {
805
862
  codexHome,
806
863
  defaultCodingEngine: productEngine,
807
864
  codexModel,
865
+ codexPath: codexPath ?? undefined,
808
866
  });
809
867
  io.out(`Wrote ${configPath}.\n`);
810
868
  // -- Write .mcp.json (node + abs-path shape; per-user-machine) -----------
@@ -850,7 +908,6 @@ export async function runConnect(opts) {
850
908
  // ~/.codex/config.toml. The CLAUDE.md omits the product name -- the starter
851
909
  // prompt fetches and surfaces it on phase 1; AGENTS.md bakes the connection
852
910
  // invariant (URL/org/product) because Codex has no SessionStart hook.
853
- const harness = opts.harness ?? DEFAULT_OPERATOR_HARNESS;
854
911
  if (harness === 'codex') {
855
912
  writeOrMergeAgentsMd(repoPath, { productName: null, teloraUrl: resolvedTeloraUrl, organizationId, productId }, io);
856
913
  writeOrMergeCodexMcpToml(io, { trackerId, teloraUrl: resolvedTeloraUrl });