triflux 6.0.1 → 6.0.2

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.
@@ -81,13 +81,18 @@ export async function runHeadless(sessionName, assignments, opts = {}) {
81
81
 
82
82
  mkdirSync(RESULT_DIR, { recursive: true });
83
83
 
84
+ // onProgress 예외를 삼켜 실행 흐름 보호 (onPoll과 동일 패턴)
85
+ const safeProgress = onProgress
86
+ ? (event) => { try { onProgress(event); } catch { /* 콜백 예외 삼킴 */ } }
87
+ : null;
88
+
84
89
  let dispatches;
85
90
 
86
91
  if (progressive) {
87
92
  // ─── 실시간 스플릿 모드: lead pane만 생성 후, 워커를 하나씩 추가 ───
88
93
  const session = createPsmuxSession(sessionName, { layout, paneCount: 1 });
89
94
  applyTrifluxTheme(sessionName);
90
- if (onProgress) onProgress({ type: "session_created", sessionName, panes: session.panes });
95
+ if (safeProgress) safeProgress({ type: "session_created", sessionName, panes: session.panes });
91
96
 
92
97
  dispatches = assignments.map((assignment, i) => {
93
98
  const paneName = `worker-${i + 1}`;
@@ -104,7 +109,7 @@ export async function runHeadless(sessionName, assignments, opts = {}) {
104
109
  // 타이틀 설정
105
110
  try { psmuxExec(["select-pane", "-t", newPaneId, "-T", paneTitle]); } catch { /* 무시 */ }
106
111
 
107
- if (onProgress) onProgress({ type: "worker_added", paneName, cli: assignment.cli, paneTitle });
112
+ if (safeProgress) safeProgress({ type: "worker_added", paneName, cli: assignment.cli, paneTitle });
108
113
 
109
114
  // 캡처 시작 + 명령 dispatch (paneId 직접 사용 — resolvePane race 회피)
110
115
  const resultFile = join(RESULT_DIR, `${sessionName}-${paneName}.txt`).replace(/\\/g, "/");
@@ -112,7 +117,7 @@ export async function runHeadless(sessionName, assignments, opts = {}) {
112
117
  startCapture(sessionName, newPaneId);
113
118
  const dispatch = dispatchCommand(sessionName, newPaneId, cmd);
114
119
 
115
- if (onProgress) onProgress({ type: "dispatched", paneName, cli: assignment.cli });
120
+ if (safeProgress) safeProgress({ type: "dispatched", paneName, cli: assignment.cli });
116
121
 
117
122
  return { ...dispatch, paneId: newPaneId, paneName, resultFile, cli: assignment.cli, role: assignment.role };
118
123
  });
@@ -125,7 +130,7 @@ export async function runHeadless(sessionName, assignments, opts = {}) {
125
130
  const paneCount = assignments.length + 1;
126
131
  const session = createPsmuxSession(sessionName, { layout, paneCount });
127
132
  applyTrifluxTheme(sessionName);
128
- if (onProgress) onProgress({ type: "session_created", sessionName, panes: session.panes });
133
+ if (safeProgress) safeProgress({ type: "session_created", sessionName, panes: session.panes });
129
134
 
130
135
  dispatches = assignments.map((assignment, i) => {
131
136
  const paneName = `worker-${i + 1}`;
@@ -137,7 +142,7 @@ export async function runHeadless(sessionName, assignments, opts = {}) {
137
142
  // 리네임하면 waitForCompletion이 "codex (role).log"를 찾지만 실제는 "worker-N.log"로 불일치
138
143
  // progressive 모드에서는 split-window 시 새 pane에 바로 타이틀이 설정되므로 문제없음
139
144
 
140
- if (onProgress) onProgress({ type: "dispatched", paneName, cli: assignment.cli });
145
+ if (safeProgress) safeProgress({ type: "dispatched", paneName, cli: assignment.cli });
141
146
 
142
147
  return { ...dispatch, paneName, resultFile, cli: assignment.cli, role: assignment.role };
143
148
  });
@@ -147,14 +152,14 @@ export async function runHeadless(sessionName, assignments, opts = {}) {
147
152
  const results = await Promise.all(dispatches.map(async (d) => {
148
153
  // onPoll → onProgress 변환 (throttle by progressIntervalSec)
149
154
  const pollOpts = {};
150
- if (onProgress && progressIntervalSec > 0) {
155
+ if (safeProgress && progressIntervalSec > 0) {
151
156
  let lastProgressAt = 0;
152
157
  const intervalMs = progressIntervalSec * 1000;
153
158
  pollOpts.onPoll = ({ content }) => {
154
159
  const now = Date.now();
155
160
  if (now - lastProgressAt >= intervalMs) {
156
161
  lastProgressAt = now;
157
- onProgress({
162
+ safeProgress({
158
163
  type: "progress",
159
164
  paneName: d.paneName,
160
165
  cli: d.cli,
@@ -170,8 +175,8 @@ export async function runHeadless(sessionName, assignments, opts = {}) {
170
175
  ? readResult(d.resultFile, d.paneId)
171
176
  : "";
172
177
 
173
- if (onProgress) {
174
- onProgress({
178
+ if (safeProgress) {
179
+ safeProgress({
175
180
  type: "completed",
176
181
  paneName: d.paneName,
177
182
  cli: d.cli,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "triflux",
3
- "version": "6.0.1",
3
+ "version": "6.0.2",
4
4
  "description": "CLI-first multi-model orchestrator for Claude Code — route tasks to Codex, Gemini, and Claude",
5
5
  "type": "module",
6
6
  "bin": {