triflux 10.64.0 → 10.65.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.
@@ -35,6 +35,8 @@ macOS의 iTerm2에서 로컬 tmux 세션을 `start`하면 리드가 있는 창
35
35
 
36
36
  Codex 폴더 신뢰 화면이나 Claude 프로젝트 MCP 승인 화면이 뜨면 `start`는 화면에 답하지 않고 `ready: false`, `blockedBy`(`codex-trust-folder` 또는 `claude-mcp-approval`), 할 일을 적은 `warning`을 반환한다. 세션은 남아 있으므로 tmux 세션에 붙어 직접 고른 뒤 지시를 보낸다.
37
37
 
38
+ Claude, agy, 예전 Codex 문구(`Do you trust the contents of this directory`)의 폴더 신뢰 화면은 기본으로 자동 승인한다. `start --no-auto-trust`를 주면 이 화면에도 키를 보내지 않고 같은 형식으로 `blockedBy`(`claude-trust-folder`, `agy-trust-folder`, `codex-trust-folder`)를 반환한다. `--resume`, `--resume-last`, `--remote`에도 똑같이 적용된다.
39
+
38
40
  ## agy 세션
39
41
 
40
42
  ```bash
package/bin/tfx-live.mjs CHANGED
@@ -89,6 +89,7 @@ const BOOLEAN_FLAGS = new Set([
89
89
  "no-wait",
90
90
  "no-relay-tag",
91
91
  "sandbox",
92
+ "no-auto-trust",
92
93
  ]);
93
94
  const PEER_HOP_DONE_MARKER = "<<<TFX_PEER_HOP_DONE>>>";
94
95
  // uds-fallback diagnostics land here, written async so a failed daemon attach
@@ -100,7 +101,7 @@ const BUG_REPORT_DIR =
100
101
  function usage(command) {
101
102
  const lines = [
102
103
  "Usage:",
103
- " tfx-live start --session NAME [--name NAME] [--group NAME] [--cli codex|claude|agy] [--sandbox] [--unset-env PATTERNS] [--model ID] [--effort TIER] [--cwd DIR] [--remote HOST] [--resume ID] [--resume-last 1] [--ready-timeout 30] [--poll-interval 1500]",
104
+ " tfx-live start --session NAME [--name NAME] [--group NAME] [--cli codex|claude|agy] [--sandbox] [--no-auto-trust] [--unset-env PATTERNS] [--model ID] [--effort TIER] [--cwd DIR] [--remote HOST] [--resume ID] [--resume-last 1] [--ready-timeout 30] [--poll-interval 1500]",
104
105
  " tfx-live ask --session NAME[:WINDOW.PANE] --prompt TEXT [--cli codex|claude|agy] [--if-busy wait|fail|interrupt|queue] [--busy-timeout 60] [--timeout 60] [--remote HOST] [--settle 1500] [--poll-interval 1500]",
105
106
  " tfx-live ask --cli codex [--transport queue|tmux] (--session NAME[:WINDOW.PANE] | --thread UUID) --prompt TEXT [--from NAME] [--timeout 60] [--no-wait]",
106
107
  " Codex ask defaults to the app-server queue (thread/queue/add, `codex queue --message` only when add is unavailable; delivered when the TUI picks it up); tmux paste is the reported fallback and the path for slash commands.",
@@ -1793,6 +1794,29 @@ function isCodexTrustFolderPrompt(text) {
1793
1794
  );
1794
1795
  }
1795
1796
 
1797
+ // 신뢰 화면 판정. 자동 승인과 --no-auto-trust 차단이 같이 쓴다. 문구만 보면 재개 대화의 인용에도 걸리므로 메뉴 구조까지 본다.
1798
+ // 항목 문구는 Claude 2.1.296 바이너리, 0.162.1 에 없는 예전 Codex 문구는 dismissCodexTrustPrompt 기준.
1799
+ function isClaudeTrustMenu(text) {
1800
+ const menu = splitAtLastSelector(text, "❯");
1801
+ return (
1802
+ Boolean(menu) &&
1803
+ !menu.inComposerBox &&
1804
+ isClaudeTrustPrompt(menu.above) &&
1805
+ /^❯\s*(?:\d+\.\s*)?(?:yes, i trust this folder|no, exit|no, continue without these permissions)/i.test(
1806
+ menu.selected,
1807
+ )
1808
+ );
1809
+ }
1810
+
1811
+ function isLegacyCodexTrustMenu(text) {
1812
+ const menu = splitAtLastSelector(text, "›");
1813
+ return (
1814
+ Boolean(menu) &&
1815
+ isCodexTrustPrompt(menu.above) &&
1816
+ /^›\s*(?:\d+\.\s*)?(?:yes, continue|no, quit)/i.test(menu.selected)
1817
+ );
1818
+ }
1819
+
1796
1820
  // 다중 선택 항목은 한 글자 체크박스로 그린다. 바이너리 상수: [ ] [×] [✔] [√] ☐ ☒, 라디오 ( ) (*) ◯ ◉.
1797
1821
  function isClaudeMcpApprovalPrompt(text) {
1798
1822
  const menu = splitAtLastSelector(text, "❯");
@@ -1841,7 +1865,7 @@ function isSafeSkipLine(line) {
1841
1865
 
1842
1866
  async function dismissCodexTrustPrompt(remote, session) {
1843
1867
  let raw = await captureVisible(remote, session);
1844
- if (!isCodexTrustPrompt(raw)) {
1868
+ if (!isLegacyCodexTrustMenu(raw)) {
1845
1869
  return { dismissed: false, raw };
1846
1870
  }
1847
1871
 
@@ -1917,7 +1941,7 @@ async function dismissCodexDaemonSettingsPrompt(remote, session) {
1917
1941
 
1918
1942
  async function dismissClaudeTrustPrompt(remote, session) {
1919
1943
  let raw = await captureVisible(remote, session);
1920
- if (!isClaudeTrustPrompt(raw)) {
1944
+ if (!isClaudeTrustMenu(raw)) {
1921
1945
  return { dismissed: false, raw };
1922
1946
  }
1923
1947
 
@@ -1997,6 +2021,16 @@ function isAgyTrustPrompt(text) {
1997
2021
  return /Do you trust the contents of this project\?/.test(stripAnsi(text));
1998
2022
  }
1999
2023
 
2024
+ // --no-auto-trust 차단에만 쓴다. agy 1.3.3 바이너리에서 "No, exit" 가 신뢰 화면 항목인지 확정하지 못해 자동 승인과 isReady 는 문구 판정을 유지한다.
2025
+ function isAgyTrustMenu(text) {
2026
+ const menu = splitAtLastSelector(text, ">");
2027
+ return (
2028
+ Boolean(menu) &&
2029
+ isAgyTrustPrompt(menu.above) &&
2030
+ /^>\s*(?:yes, i trust this folder|no, exit)/i.test(menu.selected)
2031
+ );
2032
+ }
2033
+
2000
2034
  function isAgyQueuedCapture(text) {
2001
2035
  return /Press up to edit queued messages/i.test(stripAnsi(text));
2002
2036
  }
@@ -2046,8 +2080,11 @@ const ADAPTERS = {
2046
2080
  startupScreens: [
2047
2081
  {
2048
2082
  name: "trust",
2049
- isPresent: isCodexTrustPrompt,
2083
+ blockedBy: "codex-trust-folder",
2084
+ isPresent: isLegacyCodexTrustMenu,
2050
2085
  dismiss: dismissCodexTrustPrompt,
2086
+ warning:
2087
+ "Codex is asking whether to trust this folder; attach to the tmux session and answer it yourself",
2051
2088
  },
2052
2089
  {
2053
2090
  name: "update",
@@ -2112,8 +2149,11 @@ const ADAPTERS = {
2112
2149
  startupScreens: [
2113
2150
  {
2114
2151
  name: "trust",
2115
- isPresent: isClaudeTrustPrompt,
2152
+ blockedBy: "claude-trust-folder",
2153
+ isPresent: isClaudeTrustMenu,
2116
2154
  dismiss: dismissClaudeTrustPrompt,
2155
+ warning:
2156
+ "Claude is asking whether to trust this folder; attach to the tmux session and answer it yourself",
2117
2157
  },
2118
2158
  {
2119
2159
  name: "external-imports",
@@ -2149,8 +2189,12 @@ const ADAPTERS = {
2149
2189
  startupScreens: [
2150
2190
  {
2151
2191
  name: "trust",
2192
+ blockedBy: "agy-trust-folder",
2193
+ isBlocking: isAgyTrustMenu,
2152
2194
  isPresent: isAgyTrustPrompt,
2153
2195
  dismiss: dismissAgyTrustPrompt,
2196
+ warning:
2197
+ "agy is asking whether to trust this folder; attach to the tmux session and answer it yourself",
2154
2198
  },
2155
2199
  ],
2156
2200
  },
@@ -2694,7 +2738,25 @@ end tell`;
2694
2738
  });
2695
2739
  }
2696
2740
 
2697
- async function doStart(adapter, opts) {
2741
+ async function doStart(launchAdapter, opts) {
2742
+ // --no-auto-trust 면 신뢰 화면을 고르지 않고 승인 화면과 같이 ready:false 로 끝낸다.
2743
+ const trustScreens = opts.noAutoTrust
2744
+ ? launchAdapter.startupScreens.filter((screen) => screen.blockedBy)
2745
+ : [];
2746
+ const adapter = {
2747
+ ...launchAdapter,
2748
+ startupScreens: launchAdapter.startupScreens.filter(
2749
+ (screen) => !trustScreens.includes(screen),
2750
+ ),
2751
+ blockingScreens: [
2752
+ ...trustScreens.map((screen) => ({
2753
+ name: screen.blockedBy,
2754
+ isPresent: screen.isBlocking ?? screen.isPresent,
2755
+ warning: screen.warning,
2756
+ })),
2757
+ ...(launchAdapter.blockingScreens ?? []),
2758
+ ],
2759
+ };
2698
2760
  const {
2699
2761
  session,
2700
2762
  remote,
@@ -4053,6 +4115,7 @@ function startOpts(flags) {
4053
4115
  name: flags.name,
4054
4116
  group: flags.group,
4055
4117
  sandbox: Object.hasOwn(flags, "sandbox"),
4118
+ noAutoTrust: Object.hasOwn(flags, "no-auto-trust"),
4056
4119
  unsetEnv,
4057
4120
  readyTimeoutMs: secondsFlag(
4058
4121
  flags,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "triflux",
3
- "version": "10.64.0",
3
+ "version": "10.65.0",
4
4
  "description": "CLI-first multi-model orchestrator for Claude Code — route tasks to Codex, Antigravity, and Claude",
5
5
  "type": "module",
6
6
  "bin": {
@@ -31,6 +31,8 @@ macOS의 iTerm2에서 로컬 tmux 세션을 `start`하면 리드가 있는 창
31
31
 
32
32
  Codex 폴더 신뢰 화면이나 Claude 프로젝트 MCP 승인 화면이 뜨면 `start`는 화면에 답하지 않고 `ready: false`, `blockedBy`(`codex-trust-folder` 또는 `claude-mcp-approval`), 할 일을 적은 `warning`을 반환한다. 세션은 남아 있으므로 tmux 세션에 붙어 직접 고른 뒤 지시를 보낸다.
33
33
 
34
+ Claude, agy, 예전 Codex 문구(`Do you trust the contents of this directory`)의 폴더 신뢰 화면은 기본으로 자동 승인한다. `start --no-auto-trust`를 주면 이 화면에도 키를 보내지 않고 같은 형식으로 `blockedBy`(`claude-trust-folder`, `agy-trust-folder`, `codex-trust-folder`)를 반환한다. `--resume`, `--resume-last`, `--remote`에도 똑같이 적용된다.
35
+
34
36
  ## agy 세션
35
37
 
36
38
  ```bash