triflux 10.64.0 → 10.65.1
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 (!
|
|
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 (!
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
package/skills/tfx-live/SKILL.md
CHANGED
|
@@ -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
|