triflux 10.3.4 → 10.7.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.
- package/LICENSE +21 -21
- package/bin/tfx-doctor-tui.mjs +1 -1
- package/bin/tfx-doctor.mjs +6 -1
- package/bin/tfx-profile.mjs +1 -1
- package/bin/tfx-setup-tui.mjs +1 -1
- package/bin/tfx-setup.mjs +6 -1
- package/bin/triflux.mjs +2396 -1140
- package/hooks/agent-route-guard.mjs +12 -8
- package/hooks/cross-review-tracker.mjs +21 -8
- package/hooks/error-context.mjs +19 -7
- package/hooks/hook-adaptive-collector.mjs +18 -16
- package/hooks/hook-manager.mjs +93 -32
- package/hooks/hook-orchestrator.mjs +108 -24
- package/hooks/hook-registry.json +11 -0
- package/hooks/keyword-rules.json +6 -10
- package/hooks/lib/resolve-root.mjs +1 -1
- package/hooks/mcp-config-watcher.mjs +6 -2
- package/hooks/pipeline-stop.mjs +3 -6
- package/hooks/safety-guard.mjs +99 -28
- package/hooks/session-start-fast.mjs +143 -0
- package/hooks/subagent-verifier.mjs +5 -4
- package/hub/account-broker.mjs +256 -60
- package/hub/adaptive-diagnostic.mjs +75 -48
- package/hub/adaptive-inject.mjs +95 -57
- package/hub/adaptive-memory.mjs +156 -42
- package/hub/adaptive.mjs +60 -31
- package/hub/assign-callbacks.mjs +67 -30
- package/hub/bridge.mjs +0 -1
- package/hub/cli-adapter-base.mjs +200 -48
- package/hub/codex-adapter.mjs +76 -96
- package/hub/codex-compat.mjs +3 -3
- package/hub/codex-preflight.mjs +63 -37
- package/hub/delegator/contracts.mjs +19 -23
- package/hub/delegator/index.mjs +3 -3
- package/hub/delegator/service.mjs +88 -64
- package/hub/delegator/tool-definitions.mjs +5 -5
- package/hub/fullcycle.mjs +33 -17
- package/hub/gemini-adapter.mjs +69 -94
- package/hub/hitl.mjs +89 -30
- package/hub/intent.mjs +161 -38
- package/hub/lib/cache-guard.mjs +43 -17
- package/hub/lib/mcp-response-cache.mjs +66 -32
- package/hub/lib/memory-store.mjs +285 -111
- package/hub/lib/path-utils.mjs +35 -37
- package/hub/lib/process-utils.mjs +106 -37
- package/hub/lib/spawn-trace.mjs +527 -0
- package/hub/lib/ssh-command.mjs +34 -4
- package/hub/lib/ssh-retry.mjs +5 -1
- package/hub/lib/uuidv7.mjs +4 -3
- package/hub/memory-doctor.mjs +266 -106
- package/hub/middleware/request-logger.mjs +61 -34
- package/hub/paths.mjs +9 -9
- package/hub/pipeline/gates/confidence.mjs +34 -15
- package/hub/pipeline/gates/consensus.mjs +27 -15
- package/hub/pipeline/gates/index.mjs +7 -3
- package/hub/pipeline/gates/selfcheck.mjs +57 -19
- package/hub/pipeline/index.mjs +77 -42
- package/hub/pipeline/state.mjs +10 -10
- package/hub/pipeline/transitions.mjs +40 -23
- package/hub/platform.mjs +57 -48
- package/hub/promote-penalties.mjs +25 -7
- package/hub/quality/deslop.mjs +70 -49
- package/hub/research.mjs +32 -25
- package/hub/router.mjs +240 -107
- package/hub/routing/complexity.mjs +132 -29
- package/hub/routing/index.mjs +17 -12
- package/hub/routing/q-learning.mjs +76 -28
- package/hub/server.mjs +4 -4
- package/hub/session-fingerprint.mjs +126 -60
- package/hub/state.mjs +84 -43
- package/hub/store-adapter.mjs +59 -26
- package/hub/store.mjs +356 -153
- package/hub/team/agent-map.json +22 -7
- package/hub/team/ansi.mjs +186 -122
- package/hub/team/backend.mjs +28 -10
- package/hub/team/cli/commands/attach.mjs +29 -9
- package/hub/team/cli/commands/control.mjs +29 -8
- package/hub/team/cli/commands/debug.mjs +32 -11
- package/hub/team/cli/commands/focus.mjs +38 -11
- package/hub/team/cli/commands/interrupt.mjs +18 -6
- package/hub/team/cli/commands/kill.mjs +16 -5
- package/hub/team/cli/commands/list.mjs +11 -4
- package/hub/team/cli/commands/send.mjs +19 -6
- package/hub/team/cli/commands/start/index.mjs +154 -31
- package/hub/team/cli/commands/start/parse-args.mjs +38 -11
- package/hub/team/cli/commands/start/start-headless.mjs +112 -36
- package/hub/team/cli/commands/start/start-in-process.mjs +12 -2
- package/hub/team/cli/commands/start/start-mux.mjs +70 -21
- package/hub/team/cli/commands/start/start-wt.mjs +29 -12
- package/hub/team/cli/commands/status.mjs +43 -14
- package/hub/team/cli/commands/stop.mjs +11 -4
- package/hub/team/cli/commands/task.mjs +8 -3
- package/hub/team/cli/commands/tasks.mjs +1 -1
- package/hub/team/cli/index.mjs +2 -2
- package/hub/team/cli/manifest.mjs +38 -8
- package/hub/team/cli/render.mjs +30 -8
- package/hub/team/cli/services/attach-fallback.mjs +31 -11
- package/hub/team/cli/services/hub-client.mjs +42 -14
- package/hub/team/cli/services/member-selector.mjs +11 -4
- package/hub/team/cli/services/native-control.mjs +48 -21
- package/hub/team/cli/services/runtime-mode.mjs +2 -1
- package/hub/team/cli/services/state-store.mjs +25 -8
- package/hub/team/cli/services/task-model.mjs +16 -6
- package/hub/team/conductor-mesh-bridge.mjs +24 -23
- package/hub/team/conductor.mjs +8 -4
- package/hub/team/dashboard-anchor.mjs +4 -5
- package/hub/team/dashboard-layout.mjs +3 -1
- package/hub/team/dashboard-open.mjs +41 -21
- package/hub/team/dashboard.mjs +76 -28
- package/hub/team/event-log.mjs +18 -10
- package/hub/team/handoff.mjs +31 -15
- package/hub/team/headless.mjs +2 -1
- package/hub/team/health-probe.mjs +69 -54
- package/hub/team/launcher-template.mjs +16 -13
- package/hub/team/native-supervisor.mjs +65 -21
- package/hub/team/native.mjs +74 -35
- package/hub/team/nativeProxy.mjs +184 -113
- package/hub/team/notify.mjs +119 -76
- package/hub/team/orchestrator.mjs +9 -4
- package/hub/team/pane.mjs +12 -7
- package/hub/team/process-cleanup.mjs +25 -16
- package/hub/team/psmux.mjs +491 -201
- package/hub/team/remote-probe.mjs +68 -52
- package/hub/team/remote-session.mjs +117 -59
- package/hub/team/remote-watcher.mjs +61 -33
- package/hub/team/routing.mjs +51 -25
- package/hub/team/runtime-strategy.mjs +3 -1
- package/hub/team/session.mjs +98 -34
- package/hub/team/staleState.mjs +72 -30
- package/hub/team/swarm-locks.mjs +15 -13
- package/hub/team/swarm-planner.mjs +32 -21
- package/hub/team/swarm-reconciler.mjs +48 -23
- package/hub/team/tui-lite.mjs +266 -68
- package/hub/team/tui-remote-adapter.mjs +14 -10
- package/hub/team/tui-viewer.mjs +99 -43
- package/hub/team/tui.mjs +708 -271
- package/hub/team/worktree-lifecycle.mjs +152 -58
- package/hub/team/wt-manager.mjs +24 -14
- package/hub/token-mode.mjs +71 -71
- package/hub/tray.mjs +66 -23
- package/hub/workers/claude-worker.mjs +162 -118
- package/hub/workers/codex-mcp.mjs +192 -141
- package/hub/workers/delegator-mcp.mjs +507 -333
- package/hub/workers/factory.mjs +8 -8
- package/hub/workers/gemini-worker.mjs +115 -84
- package/hub/workers/interface.mjs +6 -1
- package/hub/workers/worker-utils.mjs +21 -14
- package/hud/colors.mjs +27 -9
- package/hud/constants.mjs +162 -26
- package/hud/context-monitor.mjs +82 -41
- package/hud/hud-qos-status.mjs +129 -49
- package/hud/mission-board.mjs +6 -3
- package/hud/providers/claude.mjs +226 -115
- package/hud/providers/codex.mjs +62 -22
- package/hud/providers/gemini.mjs +168 -56
- package/hud/renderers.mjs +384 -119
- package/hud/terminal.mjs +101 -31
- package/hud/utils.mjs +78 -38
- package/mesh/index.mjs +11 -5
- package/mesh/mesh-budget.mjs +18 -9
- package/mesh/mesh-heartbeat.mjs +1 -1
- package/mesh/mesh-queue.mjs +3 -5
- package/mesh/mesh-router.mjs +5 -4
- package/package.json +2 -1
- package/scripts/__tests__/gen-skill-docs.test.mjs +36 -7
- package/scripts/__tests__/keyword-detector.test.mjs +77 -28
- package/scripts/__tests__/mcp-guard-engine.test.mjs +58 -20
- package/scripts/__tests__/remote-spawn-transfer.test.mjs +30 -19
- package/scripts/__tests__/remote-spawn.test.mjs +10 -4
- package/scripts/__tests__/session-start-fast.test.mjs +36 -0
- package/scripts/__tests__/skill-template.test.mjs +98 -50
- package/scripts/__tests__/smoke.test.mjs +1 -1
- package/scripts/__tests__/spawn-trace.test.mjs +102 -0
- package/scripts/__tests__/tfx-doctor-diagnose.test.mjs +48 -0
- package/scripts/cache-doctor.mjs +11 -4
- package/scripts/cache-warmup.mjs +96 -37
- package/scripts/claudemd-sync.mjs +27 -17
- package/scripts/codex-gateway-preflight.mjs +52 -37
- package/scripts/codex-mcp-gateway-sync.mjs +59 -39
- package/scripts/completions/tfx.bash +47 -47
- package/scripts/completions/tfx.fish +44 -44
- package/scripts/completions/tfx.zsh +83 -83
- package/scripts/config-audit.mjs +232 -0
- package/scripts/convert-to-tmpl.mjs +54 -0
- package/scripts/cross-review-gate.mjs +35 -12
- package/scripts/cross-review-tracker.mjs +21 -8
- package/scripts/demo.mjs +35 -17
- package/scripts/doctor-diagnose.mjs +284 -0
- package/scripts/gen-skill-docs.mjs +7 -2
- package/scripts/gen-skill-manifest.mjs +2 -1
- package/scripts/headless-guard.mjs +86 -48
- package/scripts/hub-ensure.mjs +45 -26
- package/scripts/keyword-detector.mjs +41 -20
- package/scripts/keyword-rules-expander.mjs +47 -30
- package/scripts/lib/claudemd-scanner.mjs +6 -1
- package/scripts/lib/context.mjs +3 -3
- package/scripts/lib/cross-review-utils.mjs +6 -3
- package/scripts/lib/env-probe.mjs +47 -28
- package/scripts/lib/gemini-profiles.mjs +44 -10
- package/scripts/lib/handoff.mjs +33 -17
- package/scripts/lib/hook-utils.mjs +8 -6
- package/scripts/lib/keyword-rules.mjs +43 -19
- package/scripts/lib/logger.mjs +24 -24
- package/scripts/lib/mcp-filter.mjs +377 -239
- package/scripts/lib/mcp-guard-engine.mjs +194 -79
- package/scripts/lib/mcp-manifest.mjs +23 -13
- package/scripts/lib/mcp-server-catalog.mjs +300 -63
- package/scripts/lib/psmux-info.mjs +11 -6
- package/scripts/lib/remote-spawn-transfer.mjs +44 -14
- package/scripts/lib/skill-template.mjs +30 -7
- package/scripts/mcp-check.mjs +58 -39
- package/scripts/mcp-gateway-config.mjs +83 -39
- package/scripts/mcp-gateway-ensure.mjs +43 -35
- package/scripts/mcp-gateway-integration-test.mjs +70 -58
- package/scripts/mcp-gateway-start.mjs +126 -60
- package/scripts/mcp-gateway-verify.mjs +24 -22
- package/scripts/mcp-safety-guard.mjs +44 -11
- package/scripts/notion-read.mjs +199 -84
- package/scripts/pack.mjs +94 -89
- package/scripts/preflight-cache.mjs +27 -10
- package/scripts/preinstall.mjs +42 -13
- package/scripts/remote-spawn.mjs +309 -94
- package/scripts/run.cjs +8 -5
- package/scripts/session-spawn-helper.mjs +130 -39
- package/scripts/session-stale-cleanup.mjs +123 -0
- package/scripts/setup.mjs +941 -492
- package/scripts/test-lock.mjs +20 -7
- package/scripts/test-tfx-route-no-claude-native.mjs +16 -12
- package/scripts/tfx-batch-stats.mjs +32 -11
- package/scripts/tfx-gate-activate.mjs +11 -4
- package/scripts/tfx-route-post.mjs +87 -20
- package/scripts/tfx-route-worker.mjs +57 -51
- package/scripts/tfx-route.sh +41 -124
- package/scripts/tmp-cleanup.mjs +21 -7
- package/scripts/token-snapshot.mjs +204 -85
- package/skills/.omc/state/agent-replay-8f0e10a9-9693-4410-96f5-a6b07e8ed995.jsonl +1 -0
- package/skills/.omc/state/idle-notif-cooldown.json +3 -0
- package/skills/.omc/state/last-tool-error.json +7 -0
- package/skills/.omc/state/subagent-tracking.json +7 -0
- package/skills/_templates/base.md +1 -6
- package/skills/merge-worktree/SKILL.md.tmpl +144 -0
- package/skills/shared/telemetry-segment.md +6 -0
- package/skills/star-prompt/SKILL.md.tmpl +222 -0
- package/skills/tfx-analysis/SKILL.md.tmpl +107 -0
- package/skills/tfx-analysis/skill.json +1 -6
- package/skills/tfx-auto/SKILL.md +1 -0
- package/skills/tfx-auto-codex/SKILL.md.tmpl +106 -0
- package/skills/tfx-auto-codex/skill.json +1 -3
- package/skills/tfx-autopilot/SKILL.md.tmpl +116 -0
- package/skills/tfx-autopilot/skill.json +1 -5
- package/skills/tfx-autoresearch/SKILL.md.tmpl +136 -0
- package/skills/tfx-autoroute/SKILL.md.tmpl +189 -0
- package/skills/tfx-autoroute/skill.json +1 -7
- package/skills/tfx-codex/SKILL.md +1 -0
- package/skills/tfx-codex/skill.json +1 -3
- package/skills/tfx-codex-swarm/SKILL.md.tmpl +16 -0
- package/skills/tfx-codex-swarm/evals/evals.json +1 -1
- package/skills/tfx-codex-swarm/skill.json +1 -4
- package/skills/tfx-codex-swarm-workspace/iteration-1/benchmark.json +54 -12
- package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/with_skill/grading.json +35 -7
- package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/without_skill/grading.json +35 -7
- package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/with_skill/grading.json +25 -5
- package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/without_skill/grading.json +25 -5
- package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/with_skill/grading.json +20 -4
- package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/without_skill/grading.json +16 -4
- package/skills/tfx-consensus/SKILL.md.tmpl +146 -0
- package/skills/tfx-debate/SKILL.md.tmpl +192 -0
- package/skills/tfx-debate/skill.json +1 -7
- package/skills/tfx-deep-analysis/SKILL.md.tmpl +228 -0
- package/skills/tfx-deep-analysis/skill.json +1 -5
- package/skills/tfx-deep-interview/SKILL.md.tmpl +203 -0
- package/skills/tfx-deep-plan/SKILL.md.tmpl +282 -0
- package/skills/tfx-deep-qa/SKILL.md.tmpl +165 -0
- package/skills/tfx-deep-qa/skill.json +1 -6
- package/skills/tfx-deep-research/SKILL.md.tmpl +217 -0
- package/skills/tfx-deep-review/SKILL.md.tmpl +179 -0
- package/skills/tfx-doctor/SKILL.md +21 -0
- package/skills/tfx-doctor/SKILL.md.tmpl +172 -0
- package/skills/tfx-doctor/skill.json +1 -3
- package/skills/tfx-find/SKILL.md +1 -0
- package/skills/tfx-forge/SKILL.md.tmpl +187 -0
- package/skills/tfx-fullcycle/SKILL.md.tmpl +286 -0
- package/skills/tfx-fullcycle/skill.json +1 -6
- package/skills/tfx-gemini/SKILL.md.tmpl +91 -0
- package/skills/tfx-gemini/skill.json +1 -3
- package/skills/tfx-hooks/SKILL.md.tmpl +216 -0
- package/skills/tfx-hooks/skill.json +1 -3
- package/skills/tfx-hub/SKILL.md.tmpl +212 -0
- package/skills/tfx-hub/skill.json +1 -3
- package/skills/tfx-index/SKILL.md +1 -0
- package/skills/tfx-index/skill.json +1 -6
- package/skills/tfx-interview/SKILL.md.tmpl +285 -0
- package/skills/tfx-multi/SKILL.md.tmpl +183 -0
- package/skills/tfx-multi/skill.json +1 -3
- package/skills/tfx-panel/SKILL.md.tmpl +189 -0
- package/skills/tfx-panel/skill.json +1 -7
- package/skills/tfx-persist/SKILL.md.tmpl +270 -0
- package/skills/tfx-persist/skill.json +1 -7
- package/skills/tfx-plan/SKILL.md +1 -0
- package/skills/tfx-plan/skill.json +1 -6
- package/skills/tfx-profile/SKILL.md.tmpl +239 -0
- package/skills/tfx-profile/skill.json +1 -3
- package/skills/tfx-prune/SKILL.md.tmpl +200 -0
- package/skills/tfx-prune/skill.json +1 -7
- package/skills/tfx-psmux-rules/SKILL.md.tmpl +326 -0
- package/skills/tfx-psmux-rules/skill.json +1 -4
- package/skills/tfx-qa/SKILL.md +1 -0
- package/skills/tfx-qa/skill.json +1 -6
- package/skills/tfx-ralph/SKILL.md.tmpl +28 -0
- package/skills/tfx-ralph/skill.json +1 -4
- package/skills/tfx-remote-setup/SKILL.md.tmpl +576 -0
- package/skills/tfx-remote-setup/skill.json +1 -3
- package/skills/tfx-remote-spawn/SKILL.md.tmpl +263 -0
- package/skills/tfx-remote-spawn/references/hosts.json +16 -0
- package/skills/tfx-remote-spawn/skill.json +1 -4
- package/skills/tfx-research/SKILL.md +1 -0
- package/skills/tfx-review/SKILL.md +1 -0
- package/skills/tfx-review/skill.json +1 -6
- package/skills/tfx-setup/SKILL.md.tmpl +504 -0
- package/skills/tfx-setup/skill.json +1 -3
- package/skills/tfx-swarm/SKILL.md +22 -0
- package/skills/tfx-swarm/SKILL.md.tmpl +218 -0
- package/tui/codex-profile.mjs +88 -33
- package/tui/core.mjs +45 -15
- package/tui/doctor.mjs +75 -28
- package/tui/gemini-profile.mjs +74 -29
- package/tui/monitor-data.mjs +8 -4
- package/tui/monitor.mjs +71 -27
- package/tui/setup.mjs +133 -42
package/hub/team/native.mjs
CHANGED
|
@@ -21,7 +21,8 @@ export const SCOUT_ROLE_CONFIG = {
|
|
|
21
21
|
readOnly: true,
|
|
22
22
|
};
|
|
23
23
|
const ROUTE_LOG_RE = /\[tfx-route\]/i;
|
|
24
|
-
const ROUTE_COMMAND_RE =
|
|
24
|
+
const ROUTE_COMMAND_RE =
|
|
25
|
+
/(?:^|[\s"'`])(?:bash\s+)?(?:[^"'`\s]*\/)?tfx-route\.sh\b/i;
|
|
25
26
|
const ROUTE_PROMPT_RE = /tfx-route\.sh/i;
|
|
26
27
|
const DIRECT_TOOL_BYPASS_RE = /\b(?:Read|Edit|Write)\s*\(/;
|
|
27
28
|
|
|
@@ -33,12 +34,14 @@ function inferWorkerIndex(agentName = "") {
|
|
|
33
34
|
}
|
|
34
35
|
|
|
35
36
|
function buildRouteEnvPrefix(agentName, workerIndex, searchTool) {
|
|
36
|
-
const effectiveWorkerIndex =
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
const effectiveWorkerIndex =
|
|
38
|
+
Number.isInteger(workerIndex) && workerIndex > 0
|
|
39
|
+
? workerIndex
|
|
40
|
+
: inferWorkerIndex(agentName);
|
|
39
41
|
|
|
40
42
|
let envPrefix = "";
|
|
41
|
-
if (effectiveWorkerIndex)
|
|
43
|
+
if (effectiveWorkerIndex)
|
|
44
|
+
envPrefix += ` TFX_WORKER_INDEX="${effectiveWorkerIndex}"`;
|
|
42
45
|
if (searchTool) envPrefix += ` TFX_SEARCH_TOOL="${searchTool}"`;
|
|
43
46
|
return envPrefix;
|
|
44
47
|
}
|
|
@@ -91,7 +94,8 @@ export function verifySlimWrapperRouteExecution(input = {}) {
|
|
|
91
94
|
const sawDirectToolBypass = DIRECT_TOOL_BYPASS_RE.test(stdoutText);
|
|
92
95
|
const usedRoute = sawRouteCommand || sawRouteLog;
|
|
93
96
|
const expectedRouteInvocation = promptMentionsRoute;
|
|
94
|
-
const abnormal =
|
|
97
|
+
const abnormal =
|
|
98
|
+
expectedRouteInvocation && (sawDirectToolBypass || !usedRoute);
|
|
95
99
|
const reason = !abnormal
|
|
96
100
|
? null
|
|
97
101
|
: sawDirectToolBypass
|
|
@@ -123,14 +127,26 @@ function getRouteTimeout(role, _mcpProfile) {
|
|
|
123
127
|
// tfx-route.sh route_agent()의 DEFAULT_TIMEOUT 기반, 최소 1080초(18분) 보장.
|
|
124
128
|
// Bash timeout = 이 값 + 60초 여유. 짧은 역할도 네트워크/스케줄 지연 대비.
|
|
125
129
|
const TIMEOUTS = {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
130
|
+
"build-fixer": 1080,
|
|
131
|
+
debugger: 1080,
|
|
132
|
+
executor: 1080,
|
|
133
|
+
"deep-executor": 3600,
|
|
134
|
+
architect: 3600,
|
|
135
|
+
planner: 3600,
|
|
136
|
+
critic: 3600,
|
|
137
|
+
analyst: 3600,
|
|
138
|
+
scientist: 1800,
|
|
139
|
+
"scientist-deep": 3600,
|
|
140
|
+
"document-specialist": 1800,
|
|
141
|
+
"code-reviewer": 1800,
|
|
142
|
+
"security-reviewer": 1800,
|
|
143
|
+
"quality-reviewer": 1800,
|
|
144
|
+
verifier: 1800,
|
|
145
|
+
designer: 1080,
|
|
146
|
+
writer: 1080,
|
|
147
|
+
explore: 1080,
|
|
148
|
+
"test-engineer": 1080,
|
|
149
|
+
"qa-tester": 1080,
|
|
134
150
|
spark: 600,
|
|
135
151
|
};
|
|
136
152
|
return TIMEOUTS[role] || 1080;
|
|
@@ -176,16 +192,21 @@ export function buildSlimWrapperPrompt(cli, opts = {}) {
|
|
|
176
192
|
const escaped = subtask.replace(/'/g, "'\\''");
|
|
177
193
|
const pipelineHint = pipelinePhase
|
|
178
194
|
? `\n파이프라인 단계: ${pipelinePhase}`
|
|
179
|
-
: '';
|
|
180
|
-
const routeEnvPrefix = buildRouteEnvPrefix(agentName, workerIndex, searchTool);
|
|
181
|
-
const scoutConstraint = (role === "scout" || role === "scientist")
|
|
182
|
-
? "\n이 워커는 scout(탐색 전용)이다. 코드를 수정하거나 파일을 생성하지 마라. 기존 코드를 읽고 분석하여 보고만 하라."
|
|
183
195
|
: "";
|
|
196
|
+
const routeEnvPrefix = buildRouteEnvPrefix(
|
|
197
|
+
agentName,
|
|
198
|
+
workerIndex,
|
|
199
|
+
searchTool,
|
|
200
|
+
);
|
|
201
|
+
const scoutConstraint =
|
|
202
|
+
role === "scout" || role === "scientist"
|
|
203
|
+
? "\n이 워커는 scout(탐색 전용)이다. 코드를 수정하거나 파일을 생성하지 마라. 기존 코드를 읽고 분석하여 보고만 하라."
|
|
204
|
+
: "";
|
|
184
205
|
|
|
185
206
|
// Bash 도구 timeout (모두 600초 이내)
|
|
186
|
-
const launchTimeoutMs = 15000;
|
|
187
|
-
const waitTimeoutMs = 570000;
|
|
188
|
-
const resultTimeoutMs = 30000;
|
|
207
|
+
const launchTimeoutMs = 15000; // Step 1: fork + job_id 반환
|
|
208
|
+
const waitTimeoutMs = 570000; // Step 2: 내부 폴링 (540초 대기 + 여유)
|
|
209
|
+
const resultTimeoutMs = 30000; // Step 3: 결과 읽기
|
|
189
210
|
|
|
190
211
|
return `실행 프로토콜 (subagent_type="${SLIM_WRAPPER_SUBAGENT_TYPE}", async + feedback):
|
|
191
212
|
MAX_ITERATIONS = ${maxIterations}
|
|
@@ -252,9 +273,7 @@ SendMessage(type: "message", recipient: "${leadName}", content: "최종 완료:
|
|
|
252
273
|
*/
|
|
253
274
|
export function buildScoutDispatchPrompt(opts = {}) {
|
|
254
275
|
const { question, scope = "", teamName, taskId, agentName, leadName } = opts;
|
|
255
|
-
const subtask = scope
|
|
256
|
-
? `${question} 탐색 범위: ${scope}`
|
|
257
|
-
: question;
|
|
276
|
+
const subtask = scope ? `${question} 탐색 범위: ${scope}` : question;
|
|
258
277
|
return buildSlimWrapperPrompt("codex", {
|
|
259
278
|
subtask,
|
|
260
279
|
role: "scientist",
|
|
@@ -305,10 +324,16 @@ export function buildHybridWrapperPrompt(cli, opts = {}) {
|
|
|
305
324
|
} = opts;
|
|
306
325
|
|
|
307
326
|
const escaped = subtask.replace(/'/g, "'\\''");
|
|
308
|
-
const pipelineHint = pipelinePhase
|
|
327
|
+
const pipelineHint = pipelinePhase
|
|
328
|
+
? `\n파이프라인 단계: ${pipelinePhase}`
|
|
329
|
+
: "";
|
|
309
330
|
const taskIdRef = taskId ? `taskId: "${taskId}"` : "";
|
|
310
331
|
const taskIdArg = taskIdRef ? `${taskIdRef}, ` : "";
|
|
311
|
-
const routeEnvPrefix = buildRouteEnvPrefix(
|
|
332
|
+
const routeEnvPrefix = buildRouteEnvPrefix(
|
|
333
|
+
agentName,
|
|
334
|
+
workerIndex,
|
|
335
|
+
searchTool,
|
|
336
|
+
);
|
|
312
337
|
|
|
313
338
|
const routeCmd = `TFX_TEAM_NAME="${teamName}" TFX_TEAM_TASK_ID="${taskId}" TFX_TEAM_AGENT_NAME="${agentName}" TFX_TEAM_LEAD_NAME="${leadName}"${routeEnvPrefix} bash ${ROUTE_SCRIPT} "${role}" '${escaped}' ${mcp_profile}`;
|
|
314
339
|
|
|
@@ -374,7 +399,12 @@ export async function pollTeamResults(teamName, expectedTaskIds = []) {
|
|
|
374
399
|
return { completed: [], pending: normalizedTaskIds };
|
|
375
400
|
}
|
|
376
401
|
|
|
377
|
-
const resultDir = path.join(
|
|
402
|
+
const resultDir = path.join(
|
|
403
|
+
os.homedir(),
|
|
404
|
+
".claude",
|
|
405
|
+
"tfx-results",
|
|
406
|
+
normalizedTeamName,
|
|
407
|
+
);
|
|
378
408
|
|
|
379
409
|
let entries;
|
|
380
410
|
try {
|
|
@@ -387,9 +417,7 @@ export async function pollTeamResults(teamName, expectedTaskIds = []) {
|
|
|
387
417
|
}
|
|
388
418
|
|
|
389
419
|
const availableFiles = new Set(
|
|
390
|
-
entries
|
|
391
|
-
.filter((entry) => entry.isFile())
|
|
392
|
-
.map((entry) => entry.name),
|
|
420
|
+
entries.filter((entry) => entry.isFile()).map((entry) => entry.name),
|
|
393
421
|
);
|
|
394
422
|
|
|
395
423
|
const completedCandidates = await Promise.all(
|
|
@@ -418,7 +446,9 @@ export async function pollTeamResults(teamName, expectedTaskIds = []) {
|
|
|
418
446
|
|
|
419
447
|
const completed = completedCandidates.filter(Boolean);
|
|
420
448
|
const completedTaskIds = new Set(completed.map((item) => item.taskId));
|
|
421
|
-
const pending = normalizedTaskIds.filter(
|
|
449
|
+
const pending = normalizedTaskIds.filter(
|
|
450
|
+
(taskId) => !completedTaskIds.has(taskId),
|
|
451
|
+
);
|
|
422
452
|
|
|
423
453
|
return { completed, pending };
|
|
424
454
|
}
|
|
@@ -430,7 +460,9 @@ export async function pollTeamResults(teamName, expectedTaskIds = []) {
|
|
|
430
460
|
* @returns {string}
|
|
431
461
|
*/
|
|
432
462
|
export function formatPollReport(pollResult = {}) {
|
|
433
|
-
const completed = Array.isArray(pollResult.completed)
|
|
463
|
+
const completed = Array.isArray(pollResult.completed)
|
|
464
|
+
? pollResult.completed
|
|
465
|
+
: [];
|
|
434
466
|
const pending = Array.isArray(pollResult.pending) ? pollResult.pending : [];
|
|
435
467
|
const total = completed.length + pending.length;
|
|
436
468
|
|
|
@@ -453,7 +485,10 @@ export function formatPollReport(pollResult = {}) {
|
|
|
453
485
|
* @returns {string}
|
|
454
486
|
*/
|
|
455
487
|
function normalizeText(s) {
|
|
456
|
-
return String(s || "")
|
|
488
|
+
return String(s || "")
|
|
489
|
+
.toLowerCase()
|
|
490
|
+
.replace(/\s+/g, " ")
|
|
491
|
+
.trim();
|
|
457
492
|
}
|
|
458
493
|
|
|
459
494
|
/**
|
|
@@ -523,7 +558,8 @@ export function compressScoutReport(rawReport) {
|
|
|
523
558
|
const text = String(rawReport || "");
|
|
524
559
|
|
|
525
560
|
// 파일:라인 패턴 추출 (path/to/file.ext:123 형태 + 뒤따르는 설명)
|
|
526
|
-
const fileLineRe =
|
|
561
|
+
const fileLineRe =
|
|
562
|
+
/([a-zA-Z0-9_./-]+\.[a-zA-Z]{1,10}):(\d+)\s*[:\-–—]?\s*(.+)/g;
|
|
527
563
|
const findings = [];
|
|
528
564
|
let match;
|
|
529
565
|
while ((match = fileLineRe.exec(text)) !== null) {
|
|
@@ -546,7 +582,10 @@ export function compressScoutReport(rawReport) {
|
|
|
546
582
|
|
|
547
583
|
// findings를 먼저 계산하고, 남은 공간에 맞춰 summary를 자른다
|
|
548
584
|
const findingsJson = JSON.stringify(findings);
|
|
549
|
-
const findingsBudget = Math.min(
|
|
585
|
+
const findingsBudget = Math.min(
|
|
586
|
+
findingsJson.length,
|
|
587
|
+
Math.floor(MAX_CHARS * 0.3),
|
|
588
|
+
);
|
|
550
589
|
|
|
551
590
|
let trimmedFindings = findings;
|
|
552
591
|
if (findingsJson.length > findingsBudget && findings.length > 0) {
|