@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 +2 -2
- package/dist/audit-hooks.d.ts +12 -2
- package/dist/audit-hooks.d.ts.map +1 -1
- package/dist/audit-hooks.js +41 -2
- package/dist/audit-hooks.js.map +1 -1
- package/dist/backends/agent-backend.d.ts +10 -5
- package/dist/backends/agent-backend.d.ts.map +1 -1
- package/dist/backends/codex/codex-backend.d.ts +2 -1
- package/dist/backends/codex/codex-backend.d.ts.map +1 -1
- package/dist/backends/codex/codex-backend.js +140 -9
- package/dist/backends/codex/codex-backend.js.map +1 -1
- package/dist/cli/connect.d.ts +10 -0
- package/dist/cli/connect.d.ts.map +1 -1
- package/dist/cli/connect.js +58 -1
- package/dist/cli/connect.js.map +1 -1
- package/dist/focus-executor.d.ts +1 -1
- package/dist/focus-executor.d.ts.map +1 -1
- package/dist/focus-executor.js +3 -3
- package/dist/focus-executor.js.map +1 -1
- package/dist/focus-lifecycle.d.ts.map +1 -1
- package/dist/focus-lifecycle.js +2 -1
- package/dist/focus-lifecycle.js.map +1 -1
- package/dist/focus-provisioning.d.ts.map +1 -1
- package/dist/focus-provisioning.js +2 -1
- package/dist/focus-provisioning.js.map +1 -1
- package/dist/git.d.ts +1 -1
- package/dist/git.d.ts.map +1 -1
- package/dist/git.js +1 -1
- package/dist/git.js.map +1 -1
- package/dist/worktree.d.ts +24 -0
- package/dist/worktree.d.ts.map +1 -1
- package/dist/worktree.js +83 -2
- package/dist/worktree.js.map +1 -1
- package/package.json +1 -1
package/build-info.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"commitSha": "
|
|
3
|
-
"builtAt": "2026-06-
|
|
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",
|
package/dist/audit-hooks.d.ts
CHANGED
|
@@ -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
|
|
33
|
-
*
|
|
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;
|
|
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"}
|
package/dist/audit-hooks.js
CHANGED
|
@@ -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
|
|
90
|
-
*
|
|
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
|
package/dist/audit-hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit-hooks.js","sourceRoot":"","sources":["../src/audit-hooks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;
|
|
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`).
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
* the engine's
|
|
34
|
-
*
|
|
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;
|
|
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.* -`
|
|
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
|
|
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.* -`
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
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":"AAAA
|
|
1
|
+
{"version":3,"file":"codex-backend.js","sourceRoot":"","sources":["../../../src/backends/codex/codex-backend.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/connect.d.ts
CHANGED
|
@@ -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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"}
|
package/dist/cli/connect.js
CHANGED
|
@@ -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 });
|