@triflux/remote 10.1.0 → 10.26.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.
Files changed (162) hide show
  1. package/hub/pipe.mjs +239 -121
  2. package/hub/public/dashboard.html +61 -0
  3. package/hub/server.mjs +2179 -709
  4. package/hub/store-adapter.mjs +59 -26
  5. package/hub/store.mjs +356 -153
  6. package/hub/team/agent-map.json +26 -7
  7. package/hub/team/ansi.mjs +245 -146
  8. package/hub/team/backend.mjs +78 -17
  9. package/hub/team/build-worker-prompt.mjs +73 -0
  10. package/hub/team/check-mcp-hub.mjs +49 -0
  11. package/hub/team/claude-daemon-control.mjs +1130 -0
  12. package/hub/team/claude-native-bridge.mjs +1011 -0
  13. package/hub/team/claude-session-projection.mjs +74 -0
  14. package/hub/team/cli/commands/attach.mjs +57 -37
  15. package/hub/team/cli/commands/control.mjs +29 -8
  16. package/hub/team/cli/commands/debug.mjs +95 -74
  17. package/hub/team/cli/commands/focus.mjs +80 -53
  18. package/hub/team/cli/commands/interrupt.mjs +18 -6
  19. package/hub/team/cli/commands/kill.mjs +16 -5
  20. package/hub/team/cli/commands/list.mjs +31 -24
  21. package/hub/team/cli/commands/send.mjs +19 -6
  22. package/hub/team/cli/commands/start/index.mjs +151 -33
  23. package/hub/team/cli/commands/start/parse-args.mjs +97 -13
  24. package/hub/team/cli/commands/start/start-headless.mjs +155 -37
  25. package/hub/team/cli/commands/start/start-in-process.mjs +50 -40
  26. package/hub/team/cli/commands/start/start-mux.mjs +122 -73
  27. package/hub/team/cli/commands/start/start-wt.mjs +86 -69
  28. package/hub/team/cli/commands/status.mjs +43 -14
  29. package/hub/team/cli/commands/stop.mjs +11 -4
  30. package/hub/team/cli/commands/task.mjs +8 -3
  31. package/hub/team/cli/commands/tasks.mjs +13 -13
  32. package/hub/team/cli/help.mjs +1 -1
  33. package/hub/team/cli/index.mjs +2 -2
  34. package/hub/team/cli/manifest.mjs +38 -8
  35. package/hub/team/cli/render.mjs +52 -30
  36. package/hub/team/cli/services/attach-fallback.mjs +74 -54
  37. package/hub/team/cli/services/hub-client.mjs +44 -16
  38. package/hub/team/cli/services/member-selector.mjs +37 -30
  39. package/hub/team/cli/services/native-control.mjs +144 -116
  40. package/hub/team/cli/services/runtime-mode.mjs +61 -4
  41. package/hub/team/cli/services/state-store.mjs +66 -9
  42. package/hub/team/cli/services/task-model.mjs +40 -30
  43. package/hub/team/codex-review.mjs +521 -0
  44. package/hub/team/conductor-mesh-bridge.mjs +25 -24
  45. package/hub/team/conductor-registry.mjs +121 -0
  46. package/hub/team/conductor.mjs +1379 -671
  47. package/hub/team/consensus-meta.mjs +176 -0
  48. package/hub/team/dashboard-anchor.mjs +4 -5
  49. package/hub/team/dashboard-layout.mjs +3 -1
  50. package/hub/team/dashboard-open.mjs +20 -118
  51. package/hub/team/dashboard.mjs +76 -28
  52. package/hub/team/event-log.mjs +18 -10
  53. package/hub/team/execution-mode.mjs +256 -0
  54. package/hub/team/extract-completion-payload.mjs +110 -0
  55. package/hub/team/git-preflight.mjs +286 -0
  56. package/hub/team/handoff.mjs +49 -18
  57. package/hub/team/headless-bridge-session.mjs +17 -0
  58. package/hub/team/headless.mjs +2213 -1156
  59. package/hub/team/health-probe.mjs +232 -69
  60. package/hub/team/interactive-native-launcher.mjs +106 -0
  61. package/hub/team/interactive-native-worker.mjs +80 -0
  62. package/hub/team/interactive-tui-transport.mjs +465 -0
  63. package/hub/team/launcher-template.mjs +49 -17
  64. package/hub/team/lead-control.mjs +91 -4
  65. package/hub/team/mcp-selector.mjs +145 -0
  66. package/hub/team/native-supervisor.mjs +90 -26
  67. package/hub/team/native.mjs +120 -42
  68. package/hub/team/nativeProxy.mjs +184 -113
  69. package/hub/team/notify.mjs +147 -78
  70. package/hub/team/orchestrator.mjs +173 -161
  71. package/hub/team/pane.mjs +43 -20
  72. package/hub/team/process-cleanup.mjs +69 -25
  73. package/hub/team/psmux.mjs +1022 -281
  74. package/hub/team/recovery-store.mjs +149 -0
  75. package/hub/team/remote-probe.mjs +68 -52
  76. package/hub/team/remote-session.mjs +131 -59
  77. package/hub/team/remote-watcher.mjs +61 -33
  78. package/hub/team/retry-state-machine.mjs +336 -0
  79. package/hub/team/routing.mjs +51 -25
  80. package/hub/team/runtime-strategy.mjs +200 -0
  81. package/hub/team/schemas/worker-completion.json +39 -0
  82. package/hub/team/sentinel-capture.mjs +127 -0
  83. package/hub/team/session-sync.mjs +153 -6
  84. package/hub/team/session.mjs +574 -611
  85. package/hub/team/shared.mjs +13 -13
  86. package/hub/team/staleState.mjs +72 -30
  87. package/hub/team/swarm-cli.mjs +390 -0
  88. package/hub/team/swarm-hypervisor.mjs +1544 -193
  89. package/hub/team/swarm-intent.mjs +216 -0
  90. package/hub/team/swarm-locks.mjs +140 -25
  91. package/hub/team/swarm-planner.mjs +121 -21
  92. package/hub/team/swarm-preflight.mjs +319 -0
  93. package/hub/team/swarm-reconciler.mjs +128 -23
  94. package/hub/team/synapse-cli.mjs +458 -0
  95. package/hub/team/synapse-http.mjs +60 -0
  96. package/hub/team/synapse-registry.mjs +329 -0
  97. package/hub/team/terminal-opener.mjs +216 -0
  98. package/hub/team/tui-core.mjs +292 -0
  99. package/hub/team/tui-lite.mjs +237 -148
  100. package/hub/team/tui-remote-adapter.mjs +18 -34
  101. package/hub/team/tui-synapse.mjs +223 -0
  102. package/hub/team/tui-viewer.mjs +108 -48
  103. package/hub/team/tui-widgets.mjs +262 -0
  104. package/hub/team/tui.mjs +931 -439
  105. package/hub/team/worker-completion-validator.mjs +84 -0
  106. package/hub/team/worker-sandbox.mjs +97 -0
  107. package/hub/team/worker-signal.mjs +263 -0
  108. package/hub/team/worker-signal.types.d.ts +52 -0
  109. package/hub/team/worktree-lifecycle.mjs +517 -63
  110. package/hub/team/wt-manager.mjs +297 -26
  111. package/hub/tools.mjs +477 -252
  112. package/hub/tray.mjs +411 -368
  113. package/hub/workers/antigravity-route-worker.mjs +169 -0
  114. package/hub/workers/claude-worker.mjs +162 -118
  115. package/hub/workers/codex-app-server-worker.mjs +1015 -0
  116. package/hub/workers/codex-mcp.mjs +724 -507
  117. package/hub/workers/delegator-mcp.mjs +570 -499
  118. package/hub/workers/factory.mjs +103 -21
  119. package/hub/workers/gemini-worker.mjs +126 -284
  120. package/hub/workers/interface.mjs +24 -2
  121. package/hub/workers/lib/jsonrpc-stdio.mjs +463 -0
  122. package/hub/workers/worker-utils.mjs +23 -17
  123. package/package.json +4 -3
  124. package/scripts/lib/agent-json.mjs +27 -0
  125. package/scripts/lib/async.mjs +174 -0
  126. package/scripts/lib/claudemd-scanner.mjs +223 -0
  127. package/scripts/lib/cli-agy.mjs +62 -0
  128. package/scripts/lib/cli-claude.mjs +78 -0
  129. package/scripts/lib/cli-codex.mjs +199 -0
  130. package/scripts/lib/cli-gemini.mjs +37 -0
  131. package/scripts/lib/codex-recovery.sh +50 -0
  132. package/scripts/lib/context.mjs +67 -0
  133. package/scripts/lib/cross-review-utils.mjs +59 -0
  134. package/scripts/lib/doctor-env-checks.mjs +121 -0
  135. package/scripts/lib/dynamic-route-cli.mjs +107 -0
  136. package/scripts/lib/env-probe.mjs +269 -0
  137. package/scripts/lib/env.mjs +14 -0
  138. package/scripts/lib/gemini-profiles.mjs +119 -0
  139. package/scripts/lib/handoff.mjs +187 -0
  140. package/scripts/lib/hook-utils.mjs +16 -0
  141. package/scripts/lib/hub.mjs +48 -0
  142. package/scripts/lib/keyword-rules.mjs +195 -0
  143. package/scripts/lib/logger.mjs +105 -0
  144. package/scripts/lib/mcp-filter.mjs +883 -0
  145. package/scripts/lib/mcp-gateway-health-check.mjs +159 -0
  146. package/scripts/lib/mcp-gateway-servers.mjs +70 -0
  147. package/scripts/lib/mcp-gateway-wrapper-check.mjs +35 -0
  148. package/scripts/lib/mcp-guard-engine.mjs +2120 -0
  149. package/scripts/lib/mcp-health.mjs +773 -0
  150. package/scripts/lib/mcp-manifest.mjs +89 -0
  151. package/scripts/lib/mcp-server-catalog.mjs +355 -0
  152. package/scripts/lib/pid.mjs +63 -0
  153. package/scripts/lib/process-utils.mjs +26 -0
  154. package/scripts/lib/psmux-info.mjs +224 -0
  155. package/scripts/lib/quota.mjs +47 -0
  156. package/scripts/lib/remote-spawn-transfer.mjs +226 -0
  157. package/scripts/lib/skill-state.mjs +220 -0
  158. package/scripts/lib/skill-template.mjs +375 -0
  159. package/scripts/lib/team.mjs +75 -0
  160. package/scripts/lib/timeout.mjs +66 -0
  161. package/scripts/lib/tmp.mjs +26 -0
  162. package/scripts/lib/toml.mjs +113 -0
@@ -44,8 +44,7 @@ Rules:
44
44
  /**
45
45
  * CLI 프롬프트 길이 제한을 고려한 축약 HANDOFF 지시
46
46
  */
47
- export const HANDOFF_INSTRUCTION_SHORT =
48
- `After completing, output this block at the end:
47
+ export const HANDOFF_INSTRUCTION_SHORT = `After completing, output this block at the end:
49
48
  --- HANDOFF ---
50
49
  status: ok | partial | failed
51
50
  lead_action: accept | needs_read | retry | reassign
@@ -71,13 +70,20 @@ export function parseHandoff(rawText) {
71
70
  const endIdx = rest.indexOf("\n---");
72
71
  const block = endIdx === -1 ? rest : rest.slice(0, endIdx);
73
72
 
74
- const lines = block.split("\n").map((l) => l.trim()).filter(Boolean);
73
+ const lines = block
74
+ .split("\n")
75
+ .map((l) => l.trim())
76
+ .filter(Boolean);
75
77
  const parsed = {};
76
78
 
77
79
  for (const line of lines) {
78
80
  const colonIdx = line.indexOf(":");
79
81
  if (colonIdx === -1) continue;
80
- const key = line.slice(0, colonIdx).trim().toLowerCase().replace(/\s+/g, "_");
82
+ const key = line
83
+ .slice(0, colonIdx)
84
+ .trim()
85
+ .toLowerCase()
86
+ .replace(/\s+/g, "_");
81
87
  const value = line.slice(colonIdx + 1).trim();
82
88
  if (key && value) parsed[key] = value;
83
89
  }
@@ -169,14 +175,18 @@ export function validateHandoff(parsed, context = {}) {
169
175
  if (h.status === "failed" || h.status === "partial") {
170
176
  if (h.error_stage) {
171
177
  const v = validateEnum(h.error_stage, ERROR_STAGE_VALUES);
172
- if (!v) { warnings.push(`error_stage: "${h.error_stage}" invalid`); delete h.error_stage; }
173
- else h.error_stage = v;
178
+ if (!v) {
179
+ warnings.push(`error_stage: "${h.error_stage}" invalid`);
180
+ delete h.error_stage;
181
+ } else h.error_stage = v;
174
182
  }
175
183
  for (const f of ["retryable", "partial_output"]) {
176
184
  if (h[f]) {
177
185
  const v = validateEnum(h[f], YES_NO);
178
- if (!v) { warnings.push(`${f}: "${h[f]}" invalid`); delete h[f]; }
179
- else h[f] = v;
186
+ if (!v) {
187
+ warnings.push(`${f}: "${h[f]}" invalid`);
188
+ delete h[f];
189
+ } else h[f] = v;
180
190
  }
181
191
  }
182
192
  }
@@ -204,7 +214,17 @@ export function validateHandoff(parsed, context = {}) {
204
214
  const rest = h.files_changed.length - 3;
205
215
  h.files_changed = [...h.files_changed.slice(0, 3), `+${rest} more`];
206
216
  }
207
- warnings.push(`token cap exceeded (${tokens} > ${TOKEN_HARD_CAP}), trimmed`);
217
+ warnings.push(
218
+ `token cap exceeded (${tokens} > ${TOKEN_HARD_CAP}), trimmed`,
219
+ );
220
+ }
221
+
222
+ const filesChangedCount = Array.isArray(h.files_changed)
223
+ ? h.files_changed.filter(Boolean).length
224
+ : 0;
225
+ if (filesChangedCount === 0 && h.lead_action === "accept") {
226
+ h.lead_action = "needs_read";
227
+ warnings.push("files_changed empty: accept → needs_read");
208
228
  }
209
229
 
210
230
  const missingCore = coreRequired.filter((f) => !h[f]);
@@ -219,23 +239,31 @@ export function validateHandoff(parsed, context = {}) {
219
239
  * @param {number} exitCode
220
240
  * @param {string} resultFile
221
241
  * @param {string} [cli]
242
+ * @param {object} [context]
243
+ * @param {string[]} [context.filesChanged]
222
244
  * @returns {object}
223
245
  */
224
- export function buildFallbackHandoff(exitCode, resultFile, cli) {
246
+ export function buildFallbackHandoff(exitCode, resultFile, cli, context = {}) {
225
247
  const ok = exitCode === 0;
248
+ const filesChanged = Array.isArray(context.filesChanged)
249
+ ? context.filesChanged.filter(Boolean)
250
+ : [];
226
251
  return {
227
252
  status: ok ? "ok" : "failed",
228
- lead_action: ok ? "accept" : "retry",
253
+ lead_action:
254
+ ok && filesChanged.length > 0 ? "accept" : ok ? "needs_read" : "retry",
229
255
  task: "unknown",
230
- files_changed: [],
256
+ files_changed: filesChanged,
231
257
  verdict: `${cli || "worker"} completed (exit ${exitCode})`,
232
258
  confidence: "low",
233
259
  risk: "low",
234
260
  detail: resultFile || "none",
235
- ...(ok ? {} : {
236
- error_stage: exitCode === 124 ? "timeout" : "execution",
237
- retryable: exitCode === 124 ? "no" : "yes",
238
- }),
261
+ ...(ok
262
+ ? {}
263
+ : {
264
+ error_stage: exitCode === 124 ? "timeout" : "execution",
265
+ retryable: exitCode === 124 ? "no" : "yes",
266
+ }),
239
267
  _fallback: true,
240
268
  };
241
269
  }
@@ -248,8 +276,10 @@ export function buildFallbackHandoff(exitCode, resultFile, cli) {
248
276
  export function formatHandoffForLead(handoff) {
249
277
  const h = handoff;
250
278
  const files = Array.isArray(h.files_changed)
251
- ? (h.files_changed.length > 0 ? h.files_changed.join(", ") : "none")
252
- : (h.files_changed || "none");
279
+ ? h.files_changed.length > 0
280
+ ? h.files_changed.join(", ")
281
+ : "none"
282
+ : h.files_changed || "none";
253
283
 
254
284
  const lines = [
255
285
  `[HANDOFF] status=${h.status || "?"} action=${h.lead_action || "?"} confidence=${h.confidence || "?"}`,
@@ -282,6 +312,7 @@ export function processHandoff(rawText, context = {}) {
282
312
  context.exitCode ?? 1,
283
313
  context.resultFile || "none",
284
314
  context.cli,
315
+ { filesChanged: context.gitDiffFiles },
285
316
  );
286
317
  return {
287
318
  handoff: fb,
@@ -0,0 +1,17 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+
4
+ export async function writeBridgeSession(sessionId, socketPath, baseDir) {
5
+ const sessionsDir = path.join(baseDir, "sessions");
6
+ await fs.mkdir(sessionsDir, { recursive: true });
7
+
8
+ const sessionData = {
9
+ session_id: sessionId,
10
+ messagingSock: socketPath,
11
+ status: "RUNNING",
12
+ created_at: new Date().toISOString(),
13
+ };
14
+
15
+ const filePath = path.join(sessionsDir, `${sessionId}.json`);
16
+ await fs.writeFile(filePath, JSON.stringify(sessionData, null, 2), "utf8");
17
+ }