triflux 10.4.0 → 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.
Files changed (391) hide show
  1. package/.claude-plugin/marketplace.json +34 -0
  2. package/.claude-plugin/plugin.json +22 -0
  3. package/bin/tfx-doctor-tui.mjs +1 -1
  4. package/bin/tfx-doctor.mjs +6 -1
  5. package/bin/tfx-profile.mjs +1 -1
  6. package/bin/tfx-setup-tui.mjs +1 -1
  7. package/bin/tfx-setup.mjs +6 -1
  8. package/bin/triflux.mjs +2396 -1140
  9. package/config/mcp-registry.json +29 -0
  10. package/hooks/agent-route-guard.mjs +12 -8
  11. package/hooks/cross-review-tracker.mjs +21 -8
  12. package/hooks/error-context.mjs +19 -7
  13. package/hooks/hook-adaptive-collector.mjs +18 -16
  14. package/hooks/hook-manager.mjs +93 -32
  15. package/hooks/hook-orchestrator.mjs +108 -24
  16. package/hooks/hook-registry.json +267 -256
  17. package/hooks/keyword-rules.json +6 -10
  18. package/hooks/lib/resolve-root.mjs +1 -1
  19. package/hooks/mcp-config-watcher.mjs +6 -2
  20. package/hooks/pipeline-stop.mjs +3 -6
  21. package/hooks/safety-guard.mjs +99 -28
  22. package/hooks/session-start-fast.mjs +143 -0
  23. package/hooks/subagent-verifier.mjs +5 -4
  24. package/hub/account-broker.mjs +256 -60
  25. package/hub/adaptive-diagnostic.mjs +75 -48
  26. package/hub/adaptive-inject.mjs +96 -58
  27. package/hub/adaptive-memory.mjs +156 -42
  28. package/hub/adaptive.mjs +60 -31
  29. package/hub/assign-callbacks.mjs +163 -126
  30. package/hub/bridge.mjs +0 -1
  31. package/hub/cli-adapter-base.mjs +200 -48
  32. package/hub/codex-adapter.mjs +76 -96
  33. package/hub/codex-compat.mjs +3 -3
  34. package/hub/codex-preflight.mjs +63 -37
  35. package/hub/delegator/contracts.mjs +19 -23
  36. package/hub/delegator/index.mjs +14 -14
  37. package/hub/delegator/service.mjs +88 -64
  38. package/hub/delegator/tool-definitions.mjs +35 -35
  39. package/hub/fullcycle.mjs +33 -17
  40. package/hub/gemini-adapter.mjs +69 -94
  41. package/hub/hitl.mjs +202 -143
  42. package/hub/intent.mjs +161 -38
  43. package/hub/lib/cache-guard.mjs +43 -17
  44. package/hub/lib/mcp-response-cache.mjs +66 -32
  45. package/hub/lib/memory-store.mjs +285 -111
  46. package/hub/lib/path-utils.mjs +35 -37
  47. package/hub/lib/process-utils.mjs +106 -37
  48. package/hub/lib/spawn-trace.mjs +527 -0
  49. package/hub/lib/ssh-command.mjs +34 -4
  50. package/hub/lib/ssh-retry.mjs +5 -1
  51. package/hub/lib/uuidv7.mjs +4 -3
  52. package/hub/memory-doctor.mjs +266 -106
  53. package/hub/middleware/request-logger.mjs +61 -34
  54. package/hub/paths.mjs +9 -9
  55. package/hub/pipeline/gates/confidence.mjs +34 -15
  56. package/hub/pipeline/gates/consensus.mjs +27 -15
  57. package/hub/pipeline/gates/index.mjs +7 -3
  58. package/hub/pipeline/gates/selfcheck.mjs +57 -19
  59. package/hub/pipeline/index.mjs +77 -42
  60. package/hub/pipeline/state.mjs +10 -10
  61. package/hub/pipeline/transitions.mjs +40 -23
  62. package/hub/platform.mjs +57 -48
  63. package/hub/promote-penalties.mjs +25 -7
  64. package/hub/quality/deslop.mjs +70 -49
  65. package/hub/research.mjs +32 -25
  66. package/hub/router.mjs +924 -791
  67. package/hub/routing/complexity.mjs +132 -29
  68. package/hub/routing/index.mjs +17 -12
  69. package/hub/routing/q-learning.mjs +76 -28
  70. package/hub/server.mjs +4 -4
  71. package/hub/session-fingerprint.mjs +127 -61
  72. package/hub/state.mjs +84 -43
  73. package/hub/store-adapter.mjs +59 -26
  74. package/hub/store.mjs +356 -153
  75. package/hub/team/agent-map.json +22 -7
  76. package/hub/team/ansi.mjs +186 -122
  77. package/hub/team/backend.mjs +28 -10
  78. package/hub/team/cli/commands/attach.mjs +57 -37
  79. package/hub/team/cli/commands/control.mjs +29 -8
  80. package/hub/team/cli/commands/debug.mjs +95 -74
  81. package/hub/team/cli/commands/focus.mjs +80 -53
  82. package/hub/team/cli/commands/interrupt.mjs +18 -6
  83. package/hub/team/cli/commands/kill.mjs +16 -5
  84. package/hub/team/cli/commands/list.mjs +31 -24
  85. package/hub/team/cli/commands/send.mjs +19 -6
  86. package/hub/team/cli/commands/start/index.mjs +154 -31
  87. package/hub/team/cli/commands/start/parse-args.mjs +38 -11
  88. package/hub/team/cli/commands/start/start-headless.mjs +112 -36
  89. package/hub/team/cli/commands/start/start-in-process.mjs +50 -40
  90. package/hub/team/cli/commands/start/start-mux.mjs +122 -73
  91. package/hub/team/cli/commands/start/start-wt.mjs +86 -69
  92. package/hub/team/cli/commands/status.mjs +43 -14
  93. package/hub/team/cli/commands/stop.mjs +11 -4
  94. package/hub/team/cli/commands/task.mjs +8 -3
  95. package/hub/team/cli/commands/tasks.mjs +13 -13
  96. package/hub/team/cli/index.mjs +2 -2
  97. package/hub/team/cli/manifest.mjs +38 -8
  98. package/hub/team/cli/render.mjs +52 -30
  99. package/hub/team/cli/services/attach-fallback.mjs +74 -54
  100. package/hub/team/cli/services/hub-client.mjs +42 -14
  101. package/hub/team/cli/services/member-selector.mjs +37 -30
  102. package/hub/team/cli/services/native-control.mjs +143 -116
  103. package/hub/team/cli/services/runtime-mode.mjs +2 -1
  104. package/hub/team/cli/services/state-store.mjs +25 -8
  105. package/hub/team/cli/services/task-model.mjs +40 -30
  106. package/hub/team/conductor-mesh-bridge.mjs +24 -23
  107. package/hub/team/conductor.mjs +8 -4
  108. package/hub/team/dashboard-anchor.mjs +4 -5
  109. package/hub/team/dashboard-layout.mjs +3 -1
  110. package/hub/team/dashboard-open.mjs +41 -21
  111. package/hub/team/dashboard.mjs +76 -28
  112. package/hub/team/event-log.mjs +18 -10
  113. package/hub/team/handoff.mjs +31 -15
  114. package/hub/team/headless.mjs +2 -1
  115. package/hub/team/health-probe.mjs +69 -54
  116. package/hub/team/launcher-template.mjs +16 -13
  117. package/hub/team/native-supervisor.mjs +65 -21
  118. package/hub/team/native.mjs +74 -35
  119. package/hub/team/nativeProxy.mjs +184 -113
  120. package/hub/team/notify.mjs +120 -77
  121. package/hub/team/orchestrator.mjs +166 -161
  122. package/hub/team/pane.mjs +12 -7
  123. package/hub/team/process-cleanup.mjs +25 -16
  124. package/hub/team/psmux.mjs +491 -201
  125. package/hub/team/remote-probe.mjs +68 -52
  126. package/hub/team/remote-session.mjs +117 -59
  127. package/hub/team/remote-watcher.mjs +61 -33
  128. package/hub/team/routing.mjs +51 -25
  129. package/hub/team/runtime-strategy.mjs +3 -1
  130. package/hub/team/session.mjs +675 -611
  131. package/hub/team/shared.mjs +13 -13
  132. package/hub/team/staleState.mjs +72 -30
  133. package/hub/team/swarm-locks.mjs +15 -13
  134. package/hub/team/swarm-planner.mjs +32 -21
  135. package/hub/team/swarm-reconciler.mjs +48 -23
  136. package/hub/team/tui-lite.mjs +266 -68
  137. package/hub/team/tui-remote-adapter.mjs +14 -10
  138. package/hub/team/tui-viewer.mjs +99 -43
  139. package/hub/team/tui.mjs +708 -271
  140. package/hub/team/worktree-lifecycle.mjs +152 -58
  141. package/hub/team/wt-manager.mjs +24 -14
  142. package/hub/token-mode.mjs +71 -71
  143. package/hub/tray.mjs +411 -368
  144. package/hub/workers/claude-worker.mjs +162 -118
  145. package/hub/workers/codex-mcp.mjs +558 -507
  146. package/hub/workers/delegator-mcp.mjs +507 -333
  147. package/hub/workers/factory.mjs +21 -21
  148. package/hub/workers/gemini-worker.mjs +115 -84
  149. package/hub/workers/interface.mjs +6 -1
  150. package/hub/workers/worker-utils.mjs +21 -14
  151. package/hud/colors.mjs +27 -9
  152. package/hud/constants.mjs +162 -26
  153. package/hud/context-monitor.mjs +82 -41
  154. package/hud/hud-qos-status.mjs +129 -49
  155. package/hud/mission-board.mjs +6 -3
  156. package/hud/providers/claude.mjs +226 -115
  157. package/hud/providers/codex.mjs +62 -22
  158. package/hud/providers/gemini.mjs +168 -56
  159. package/hud/renderers.mjs +384 -119
  160. package/hud/terminal.mjs +101 -31
  161. package/hud/utils.mjs +78 -38
  162. package/mesh/index.mjs +11 -5
  163. package/mesh/mesh-budget.mjs +18 -9
  164. package/mesh/mesh-heartbeat.mjs +1 -1
  165. package/mesh/mesh-queue.mjs +3 -5
  166. package/mesh/mesh-router.mjs +5 -4
  167. package/package.json +56 -21
  168. package/scripts/__tests__/gen-skill-docs.test.mjs +36 -7
  169. package/scripts/__tests__/keyword-detector.test.mjs +77 -28
  170. package/scripts/__tests__/mcp-guard-engine.test.mjs +58 -20
  171. package/scripts/__tests__/remote-spawn-transfer.test.mjs +30 -19
  172. package/scripts/__tests__/remote-spawn.test.mjs +10 -4
  173. package/scripts/__tests__/session-start-fast.test.mjs +36 -0
  174. package/scripts/__tests__/skill-template.test.mjs +98 -50
  175. package/scripts/__tests__/smoke.test.mjs +1 -1
  176. package/scripts/__tests__/spawn-trace.test.mjs +102 -0
  177. package/scripts/__tests__/tfx-doctor-diagnose.test.mjs +48 -0
  178. package/scripts/cache-doctor.mjs +11 -4
  179. package/scripts/cache-warmup.mjs +96 -37
  180. package/scripts/claudemd-sync.mjs +27 -17
  181. package/scripts/codex-gateway-preflight.mjs +52 -37
  182. package/scripts/codex-mcp-gateway-sync.mjs +59 -39
  183. package/scripts/config-audit.mjs +232 -0
  184. package/scripts/convert-to-tmpl.mjs +54 -0
  185. package/scripts/cross-review-gate.mjs +35 -12
  186. package/scripts/cross-review-tracker.mjs +21 -8
  187. package/scripts/demo.mjs +35 -17
  188. package/scripts/doctor-diagnose.mjs +284 -0
  189. package/scripts/gen-skill-docs.mjs +7 -2
  190. package/scripts/gen-skill-manifest.mjs +2 -1
  191. package/scripts/headless-guard.mjs +86 -48
  192. package/scripts/hub-ensure.mjs +139 -120
  193. package/scripts/keyword-detector.mjs +293 -272
  194. package/scripts/keyword-rules-expander.mjs +538 -521
  195. package/scripts/lib/claudemd-scanner.mjs +6 -1
  196. package/scripts/lib/context.mjs +3 -3
  197. package/scripts/lib/cross-review-utils.mjs +6 -3
  198. package/scripts/lib/env-probe.mjs +47 -28
  199. package/scripts/lib/gemini-profiles.mjs +44 -10
  200. package/scripts/lib/handoff.mjs +33 -17
  201. package/scripts/lib/hook-utils.mjs +8 -6
  202. package/scripts/lib/keyword-rules.mjs +43 -19
  203. package/scripts/lib/logger.mjs +24 -24
  204. package/scripts/lib/mcp-filter.mjs +377 -239
  205. package/scripts/lib/mcp-guard-engine.mjs +194 -79
  206. package/scripts/lib/mcp-manifest.mjs +23 -13
  207. package/scripts/lib/mcp-server-catalog.mjs +355 -118
  208. package/scripts/lib/psmux-info.mjs +11 -6
  209. package/scripts/lib/remote-spawn-transfer.mjs +44 -14
  210. package/scripts/lib/skill-template.mjs +30 -7
  211. package/scripts/mcp-check.mjs +58 -39
  212. package/scripts/mcp-gateway-config.mjs +83 -39
  213. package/scripts/mcp-gateway-ensure.mjs +43 -35
  214. package/scripts/mcp-gateway-integration-test.mjs +70 -58
  215. package/scripts/mcp-gateway-start.mjs +126 -60
  216. package/scripts/mcp-gateway-verify.mjs +24 -22
  217. package/scripts/mcp-safety-guard.mjs +44 -11
  218. package/scripts/notion-read.mjs +669 -554
  219. package/scripts/pack.mjs +94 -89
  220. package/scripts/preflight-cache.mjs +27 -10
  221. package/scripts/preinstall.mjs +42 -13
  222. package/scripts/remote-spawn.mjs +309 -94
  223. package/scripts/run.cjs +8 -5
  224. package/scripts/session-spawn-helper.mjs +130 -39
  225. package/scripts/session-stale-cleanup.mjs +123 -0
  226. package/scripts/setup.mjs +941 -492
  227. package/scripts/test-lock.mjs +20 -7
  228. package/scripts/test-tfx-route-no-claude-native.mjs +61 -57
  229. package/scripts/tfx-batch-stats.mjs +117 -96
  230. package/scripts/tfx-gate-activate.mjs +11 -4
  231. package/scripts/tfx-route-post.mjs +87 -20
  232. package/scripts/tfx-route-worker.mjs +57 -51
  233. package/scripts/tfx-route.sh +41 -124
  234. package/scripts/tmp-cleanup.mjs +21 -7
  235. package/scripts/token-snapshot.mjs +204 -85
  236. package/skills/.omc/state/idle-notif-cooldown.json +1 -1
  237. package/skills/.omc/state/last-tool-error.json +1 -1
  238. package/skills/.omc/state/subagent-tracking.json +1 -1
  239. package/skills/_templates/base.md +1 -6
  240. package/skills/merge-worktree/SKILL.md.tmpl +144 -0
  241. package/skills/shared/telemetry-segment.md +6 -0
  242. package/skills/star-prompt/SKILL.md.tmpl +222 -0
  243. package/skills/tfx-analysis/SKILL.md.tmpl +107 -0
  244. package/skills/tfx-analysis/skill.json +1 -6
  245. package/skills/tfx-auto/SKILL.md +1 -0
  246. package/skills/{tfx-workspace/skill-snapshot/tfx-auto-codex/SKILL.md → tfx-auto-codex/SKILL.md.tmpl} +33 -4
  247. package/skills/tfx-auto-codex/skill.json +1 -3
  248. package/skills/tfx-autopilot/SKILL.md.tmpl +116 -0
  249. package/skills/tfx-autopilot/skill.json +1 -5
  250. package/skills/tfx-autoresearch/SKILL.md.tmpl +136 -0
  251. package/skills/tfx-autoroute/SKILL.md.tmpl +189 -0
  252. package/skills/tfx-autoroute/skill.json +1 -7
  253. package/skills/tfx-codex/SKILL.md +1 -0
  254. package/skills/tfx-codex/skill.json +1 -3
  255. package/skills/tfx-codex-swarm/SKILL.md.tmpl +16 -0
  256. package/skills/tfx-codex-swarm/evals/evals.json +1 -1
  257. package/skills/tfx-codex-swarm/skill.json +1 -4
  258. package/skills/tfx-codex-swarm-workspace/iteration-1/benchmark.json +54 -12
  259. package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/with_skill/grading.json +35 -7
  260. package/skills/tfx-codex-swarm-workspace/iteration-1/full-swarm-all-prds/without_skill/grading.json +35 -7
  261. package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/with_skill/grading.json +25 -5
  262. package/skills/tfx-codex-swarm-workspace/iteration-1/implicit-swarm-no-keywords/without_skill/grading.json +25 -5
  263. package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/with_skill/grading.json +20 -4
  264. package/skills/tfx-codex-swarm-workspace/iteration-1/selective-spawn-with-override/without_skill/grading.json +16 -4
  265. package/skills/tfx-consensus/SKILL.md.tmpl +146 -0
  266. package/skills/tfx-debate/SKILL.md.tmpl +192 -0
  267. package/skills/tfx-debate/skill.json +1 -7
  268. package/skills/tfx-deep-analysis/SKILL.md.tmpl +228 -0
  269. package/skills/tfx-deep-analysis/skill.json +1 -5
  270. package/skills/tfx-deep-interview/SKILL.md.tmpl +203 -0
  271. package/skills/tfx-deep-plan/SKILL.md.tmpl +282 -0
  272. package/skills/tfx-deep-qa/SKILL.md.tmpl +165 -0
  273. package/skills/tfx-deep-qa/skill.json +1 -6
  274. package/skills/tfx-deep-research/SKILL.md.tmpl +217 -0
  275. package/skills/tfx-deep-review/SKILL.md.tmpl +179 -0
  276. package/skills/tfx-doctor/SKILL.md +21 -0
  277. package/skills/tfx-doctor/SKILL.md.tmpl +172 -0
  278. package/skills/tfx-doctor/skill.json +1 -3
  279. package/skills/tfx-find/SKILL.md +1 -0
  280. package/skills/tfx-forge/SKILL.md.tmpl +187 -0
  281. package/skills/tfx-fullcycle/SKILL.md.tmpl +286 -0
  282. package/skills/tfx-fullcycle/skill.json +1 -6
  283. package/skills/{tfx-workspace/skill-snapshot/tfx-gemini/SKILL.md → tfx-gemini/SKILL.md.tmpl} +16 -7
  284. package/skills/tfx-gemini/skill.json +1 -3
  285. package/skills/tfx-hooks/SKILL.md.tmpl +216 -0
  286. package/skills/tfx-hooks/skill.json +1 -3
  287. package/skills/tfx-hub/SKILL.md.tmpl +212 -0
  288. package/skills/tfx-hub/skill.json +1 -3
  289. package/skills/tfx-index/SKILL.md +1 -0
  290. package/skills/tfx-index/skill.json +1 -6
  291. package/skills/tfx-interview/SKILL.md.tmpl +285 -0
  292. package/skills/tfx-multi/SKILL.md.tmpl +183 -0
  293. package/skills/tfx-multi/skill.json +1 -3
  294. package/skills/tfx-panel/SKILL.md.tmpl +189 -0
  295. package/skills/tfx-panel/skill.json +1 -7
  296. package/skills/tfx-persist/SKILL.md.tmpl +270 -0
  297. package/skills/tfx-persist/skill.json +1 -7
  298. package/skills/tfx-plan/SKILL.md +1 -0
  299. package/skills/tfx-plan/skill.json +1 -6
  300. package/skills/tfx-profile/SKILL.md.tmpl +239 -0
  301. package/skills/tfx-profile/skill.json +1 -3
  302. package/skills/tfx-prune/SKILL.md.tmpl +200 -0
  303. package/skills/tfx-prune/skill.json +1 -7
  304. package/skills/tfx-psmux-rules/SKILL.md.tmpl +326 -0
  305. package/skills/tfx-psmux-rules/skill.json +1 -4
  306. package/skills/tfx-qa/SKILL.md +1 -0
  307. package/skills/tfx-qa/skill.json +1 -6
  308. package/skills/tfx-ralph/SKILL.md.tmpl +28 -0
  309. package/skills/tfx-ralph/skill.json +1 -4
  310. package/skills/tfx-remote-setup/SKILL.md.tmpl +576 -0
  311. package/skills/tfx-remote-setup/skill.json +1 -3
  312. package/skills/tfx-remote-spawn/SKILL.md.tmpl +263 -0
  313. package/skills/tfx-remote-spawn/references/hosts.json +16 -16
  314. package/skills/tfx-remote-spawn/skill.json +1 -4
  315. package/skills/tfx-research/SKILL.md +1 -0
  316. package/skills/tfx-review/SKILL.md +1 -0
  317. package/skills/tfx-review/skill.json +1 -6
  318. package/skills/tfx-setup/SKILL.md.tmpl +504 -0
  319. package/skills/tfx-setup/skill.json +1 -3
  320. package/skills/tfx-swarm/SKILL.md +22 -0
  321. package/skills/tfx-swarm/SKILL.md.tmpl +218 -0
  322. package/tui/codex-profile.mjs +457 -0
  323. package/tui/core.mjs +266 -0
  324. package/tui/doctor.mjs +375 -0
  325. package/tui/gemini-profile.mjs +299 -0
  326. package/tui/monitor-data.mjs +152 -0
  327. package/tui/monitor.mjs +339 -0
  328. package/tui/setup.mjs +533 -0
  329. package/CLAUDE.md +0 -193
  330. package/references/hosts.json +0 -33
  331. package/skills/tfx-workspace/async-tests/run-tests.sh +0 -203
  332. package/skills/tfx-workspace/evals/evals.json +0 -79
  333. package/skills/tfx-workspace/iteration-1/benchmark.json +0 -162
  334. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/eval_metadata.json +0 -11
  335. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/old_skill/grading.json +0 -9
  336. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/old_skill/outputs/analysis.md +0 -154
  337. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/old_skill/timing.json +0 -5
  338. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/with_skill/grading.json +0 -9
  339. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/with_skill/outputs/analysis.md +0 -126
  340. package/skills/tfx-workspace/iteration-1/codex-gemini-remap/with_skill/timing.json +0 -5
  341. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/eval_metadata.json +0 -11
  342. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/old_skill/grading.json +0 -9
  343. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/old_skill/outputs/analysis.md +0 -119
  344. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/old_skill/timing.json +0 -5
  345. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/with_skill/grading.json +0 -9
  346. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/with_skill/outputs/analysis.md +0 -115
  347. package/skills/tfx-workspace/iteration-1/doctor-diagnosis/with_skill/timing.json +0 -5
  348. package/skills/tfx-workspace/iteration-1/hub-start-sequence/eval_metadata.json +0 -10
  349. package/skills/tfx-workspace/iteration-1/hub-start-sequence/old_skill/grading.json +0 -8
  350. package/skills/tfx-workspace/iteration-1/hub-start-sequence/old_skill/outputs/analysis.md +0 -86
  351. package/skills/tfx-workspace/iteration-1/hub-start-sequence/old_skill/timing.json +0 -5
  352. package/skills/tfx-workspace/iteration-1/hub-start-sequence/with_skill/grading.json +0 -8
  353. package/skills/tfx-workspace/iteration-1/hub-start-sequence/with_skill/outputs/analysis.md +0 -81
  354. package/skills/tfx-workspace/iteration-1/hub-start-sequence/with_skill/timing.json +0 -5
  355. package/skills/tfx-workspace/iteration-1/multi-team-creation/eval_metadata.json +0 -12
  356. package/skills/tfx-workspace/iteration-1/multi-team-creation/old_skill/grading.json +0 -10
  357. package/skills/tfx-workspace/iteration-1/multi-team-creation/old_skill/outputs/analysis.md +0 -316
  358. package/skills/tfx-workspace/iteration-1/multi-team-creation/old_skill/timing.json +0 -5
  359. package/skills/tfx-workspace/iteration-1/multi-team-creation/with_skill/grading.json +0 -10
  360. package/skills/tfx-workspace/iteration-1/multi-team-creation/with_skill/outputs/analysis.md +0 -352
  361. package/skills/tfx-workspace/iteration-1/multi-team-creation/with_skill/timing.json +0 -5
  362. package/skills/tfx-workspace/iteration-1/review.html +0 -1325
  363. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/eval_metadata.json +0 -12
  364. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/old_skill/grading.json +0 -10
  365. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/old_skill/outputs/analysis.md +0 -97
  366. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/old_skill/timing.json +0 -5
  367. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/with_skill/grading.json +0 -10
  368. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/with_skill/outputs/analysis.md +0 -94
  369. package/skills/tfx-workspace/iteration-1/routing-implement-shortcut/with_skill/timing.json +0 -5
  370. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/eval_metadata.json +0 -12
  371. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/old_skill/grading.json +0 -10
  372. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/old_skill/outputs/analysis.md +0 -209
  373. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/old_skill/timing.json +0 -5
  374. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/with_skill/grading.json +0 -10
  375. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/with_skill/outputs/analysis.md +0 -193
  376. package/skills/tfx-workspace/iteration-1/routing-multi-task-triage/with_skill/timing.json +0 -5
  377. package/skills/tfx-workspace/iteration-2/benchmark.json +0 -62
  378. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/eval_metadata.json +0 -13
  379. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/old_skill/grading.json +0 -11
  380. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/old_skill/outputs/analysis.md +0 -382
  381. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/old_skill/timing.json +0 -5
  382. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/with_skill/grading.json +0 -11
  383. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/with_skill/outputs/analysis.md +0 -333
  384. package/skills/tfx-workspace/iteration-2/multi-team-creation-refactored/with_skill/timing.json +0 -5
  385. package/skills/tfx-workspace/iteration-2/review.html +0 -1325
  386. package/skills/tfx-workspace/skill-snapshot/tfx-auto/SKILL.md +0 -217
  387. package/skills/tfx-workspace/skill-snapshot/tfx-codex/SKILL.md +0 -65
  388. package/skills/tfx-workspace/skill-snapshot/tfx-doctor/SKILL.md +0 -94
  389. package/skills/tfx-workspace/skill-snapshot/tfx-hub/SKILL.md +0 -133
  390. package/skills/tfx-workspace/skill-snapshot/tfx-multi/SKILL.md +0 -426
  391. package/skills/tfx-workspace/skill-snapshot/tfx-setup/SKILL.md +0 -101
@@ -0,0 +1,527 @@
1
+ import * as childProcess from "node:child_process";
2
+ import { EventEmitter } from "node:events";
3
+ import { createWriteStream, mkdirSync } from "node:fs";
4
+ import { homedir } from "node:os";
5
+ import { basename, join } from "node:path";
6
+
7
+ const LOG_DIR = join(homedir(), ".triflux", "logs");
8
+ const DEDUPE_WINDOW_MS = 5_000;
9
+ const RATE_WINDOW_MS = 1_000;
10
+ const WINDOWS_TERMINAL_COMMANDS = new Set([
11
+ "wt",
12
+ "wt.exe",
13
+ "windowsterminal.exe",
14
+ ]);
15
+
16
+ export const MAX_WT_TABS = 8;
17
+ export const MAX_SPAWN_PER_SEC = resolvePositiveInteger(
18
+ process.env.TRIFLUX_MAX_SPAWN_RATE,
19
+ 10,
20
+ );
21
+ export const MAX_TOTAL_DESCENDANTS = resolvePositiveInteger(
22
+ process.env.TRIFLUX_MAX_DESCENDANTS,
23
+ 50,
24
+ );
25
+
26
+ let logDay = "";
27
+ let logStream = null;
28
+ let traceSequence = 0;
29
+
30
+ const recentSpawnTimes = [];
31
+ const dedupeEntries = new Map();
32
+ const activeChildren = new Map();
33
+ const activeWtChildren = new Set();
34
+
35
+ function resolvePositiveInteger(...values) {
36
+ for (const value of values) {
37
+ const parsed = Number.parseInt(String(value ?? ""), 10);
38
+ if (Number.isInteger(parsed) && parsed > 0) {
39
+ return parsed;
40
+ }
41
+ }
42
+
43
+ return null;
44
+ }
45
+
46
+ function nowIso() {
47
+ return new Date().toISOString();
48
+ }
49
+
50
+ function getLogPath(day = nowIso().slice(0, 10)) {
51
+ return join(LOG_DIR, `spawn-trace-${day}.jsonl`);
52
+ }
53
+
54
+ function ensureLogStream() {
55
+ const day = nowIso().slice(0, 10);
56
+ if (logStream && logDay === day) {
57
+ return logStream;
58
+ }
59
+
60
+ mkdirSync(LOG_DIR, { recursive: true });
61
+
62
+ if (logStream) {
63
+ try {
64
+ logStream.end();
65
+ } catch {
66
+ /* ignore */
67
+ }
68
+ }
69
+
70
+ logDay = day;
71
+ logStream = createWriteStream(getLogPath(day), { flags: "a" });
72
+ logStream.on("error", () => {
73
+ /* ignore logging failures */
74
+ });
75
+ return logStream;
76
+ }
77
+
78
+ function appendTrace(data, { sync = false } = {}) {
79
+ const entry = {
80
+ ts: nowIso(),
81
+ session_id: process.env.TRIFLUX_SESSION_ID ?? null,
82
+ parent_pid: process.pid,
83
+ ...data,
84
+ };
85
+
86
+ try {
87
+ ensureLogStream().write(`${JSON.stringify(entry)}\n`);
88
+ } catch {
89
+ if (!sync) {
90
+ /* ignore logging failures */
91
+ }
92
+ }
93
+ }
94
+
95
+ function nextTraceId() {
96
+ traceSequence += 1;
97
+ return `spawn-trace-${Date.now()}-${traceSequence}`;
98
+ }
99
+
100
+ function trimRecentSpawnTimes(now) {
101
+ while (
102
+ recentSpawnTimes.length > 0 &&
103
+ now - recentSpawnTimes[0] >= RATE_WINDOW_MS
104
+ ) {
105
+ recentSpawnTimes.shift();
106
+ }
107
+ }
108
+
109
+ function trimDedupeEntries(now) {
110
+ for (const [key, ts] of dedupeEntries.entries()) {
111
+ if (now - ts >= DEDUPE_WINDOW_MS) {
112
+ dedupeEntries.delete(key);
113
+ }
114
+ }
115
+ }
116
+
117
+ function stripTraceOptions(options) {
118
+ if (!options || typeof options !== "object") {
119
+ return undefined;
120
+ }
121
+
122
+ const { reason: _reason, dedupe: _dedupe, ...rest } = options;
123
+ return rest;
124
+ }
125
+
126
+ function getReason(options) {
127
+ if (!options || typeof options !== "object") {
128
+ return null;
129
+ }
130
+
131
+ return options.reason ?? null;
132
+ }
133
+
134
+ function getDedupeKey(options) {
135
+ if (!options || typeof options !== "object") {
136
+ return null;
137
+ }
138
+
139
+ return typeof options.dedupe === "string" && options.dedupe.trim()
140
+ ? options.dedupe.trim()
141
+ : null;
142
+ }
143
+
144
+ function getCwd(options) {
145
+ if (!options || typeof options !== "object") {
146
+ return process.cwd();
147
+ }
148
+
149
+ return options.cwd || process.cwd();
150
+ }
151
+
152
+ function getCommandBasename(command) {
153
+ return basename(String(command || "")).toLowerCase();
154
+ }
155
+
156
+ function isWindowsTerminalSpawn(command) {
157
+ return WINDOWS_TERMINAL_COMMANDS.has(getCommandBasename(command));
158
+ }
159
+
160
+ function createPolicyError(reasonCode, message, meta = {}) {
161
+ const error = new Error(message);
162
+ error.code = "TRIFLUX_SPAWN_BLOCKED";
163
+ error.reasonCode = reasonCode;
164
+ Object.assign(error, meta);
165
+ return error;
166
+ }
167
+
168
+ function logBlocked(traceId, command, args, options, error, extra = {}) {
169
+ appendTrace({
170
+ event: "blocked",
171
+ trace_id: traceId,
172
+ command,
173
+ args,
174
+ cwd: getCwd(options),
175
+ reason: getReason(options),
176
+ warning: error.message,
177
+ warning_code: error.reasonCode || error.code || "unknown",
178
+ ...extra,
179
+ });
180
+ }
181
+
182
+ function enforceGuards(command, args, options) {
183
+ const now = Date.now();
184
+ trimRecentSpawnTimes(now);
185
+ trimDedupeEntries(now);
186
+
187
+ const dedupeKey = getDedupeKey(options);
188
+ if (dedupeKey) {
189
+ const lastSeenAt = dedupeEntries.get(dedupeKey);
190
+ if (lastSeenAt != null && now - lastSeenAt < DEDUPE_WINDOW_MS) {
191
+ return createPolicyError(
192
+ "dedupe",
193
+ `spawn-trace dedupe blocked for key "${dedupeKey}"`,
194
+ { dedupeKey },
195
+ );
196
+ }
197
+ }
198
+
199
+ if (recentSpawnTimes.length >= MAX_SPAWN_PER_SEC) {
200
+ return createPolicyError(
201
+ "rate_limit",
202
+ `spawn-trace rate limit exceeded (${MAX_SPAWN_PER_SEC}/sec)`,
203
+ { maxPerSec: MAX_SPAWN_PER_SEC },
204
+ );
205
+ }
206
+
207
+ if (activeChildren.size >= MAX_TOTAL_DESCENDANTS) {
208
+ return createPolicyError(
209
+ "max_descendants",
210
+ `spawn-trace max descendants exceeded (${MAX_TOTAL_DESCENDANTS})`,
211
+ { maxDescendants: MAX_TOTAL_DESCENDANTS },
212
+ );
213
+ }
214
+
215
+ if (isWindowsTerminalSpawn(command) && activeWtChildren.size >= MAX_WT_TABS) {
216
+ return createPolicyError(
217
+ "wt_tab_cap",
218
+ `spawn-trace Windows Terminal cap exceeded (${MAX_WT_TABS})`,
219
+ { maxWtTabs: MAX_WT_TABS },
220
+ );
221
+ }
222
+
223
+ recentSpawnTimes.push(now);
224
+ if (dedupeKey) {
225
+ dedupeEntries.set(dedupeKey, now);
226
+ }
227
+
228
+ return null;
229
+ }
230
+
231
+ function trackChild(child, meta) {
232
+ if (!child || typeof child.once !== "function") {
233
+ return child;
234
+ }
235
+
236
+ activeChildren.set(child, meta);
237
+ if (meta.isWindowsTerminalSpawn) {
238
+ activeWtChildren.add(child);
239
+ }
240
+
241
+ let finalized = false;
242
+ const finalize = (event, payload = {}) => {
243
+ if (finalized) {
244
+ return;
245
+ }
246
+
247
+ finalized = true;
248
+ activeChildren.delete(child);
249
+ activeWtChildren.delete(child);
250
+
251
+ appendTrace({
252
+ event,
253
+ trace_id: meta.traceId,
254
+ command: meta.command,
255
+ args: meta.args,
256
+ cwd: meta.cwd,
257
+ reason: meta.reason,
258
+ child_pid: child.pid ?? null,
259
+ duration_ms: Date.now() - meta.startedAt,
260
+ ...payload,
261
+ });
262
+ };
263
+
264
+ child.once("exit", (code, signal) => {
265
+ finalize("exit", {
266
+ exit_code: code,
267
+ signal: signal ?? null,
268
+ });
269
+ });
270
+
271
+ child.once("error", (error) => {
272
+ finalize("error", {
273
+ error: error.message,
274
+ });
275
+ });
276
+
277
+ return child;
278
+ }
279
+
280
+ function createRejectedChild(command, args, error) {
281
+ const child = new EventEmitter();
282
+ child.pid = undefined;
283
+ child.stdin = null;
284
+ child.stdout = null;
285
+ child.stderr = null;
286
+ child.stdio = [null, null, null];
287
+ child.spawnfile = String(command);
288
+ child.spawnargs = [String(command), ...args.map((arg) => String(arg))];
289
+ child.kill = () => false;
290
+ child.killed = false;
291
+ child.connected = false;
292
+ child.exitCode = 1;
293
+ child.signalCode = null;
294
+
295
+ queueMicrotask(() => {
296
+ child.emit("error", error);
297
+ child.emit("exit", 1, null);
298
+ child.emit("close", 1, null);
299
+ });
300
+
301
+ return child;
302
+ }
303
+
304
+ function normalizeSpawnArgs(args, options) {
305
+ if (Array.isArray(args)) {
306
+ return {
307
+ argsList: [...args],
308
+ options,
309
+ };
310
+ }
311
+
312
+ return {
313
+ argsList: [],
314
+ options: args,
315
+ };
316
+ }
317
+
318
+ function normalizeExecFileArgs(args, options, callback) {
319
+ let argsList = [];
320
+ let normalizedOptions;
321
+ let normalizedCallback;
322
+
323
+ if (typeof args === "function") {
324
+ normalizedCallback = args;
325
+ } else if (Array.isArray(args)) {
326
+ argsList = [...args];
327
+ if (typeof options === "function") {
328
+ normalizedCallback = options;
329
+ } else {
330
+ normalizedOptions = options;
331
+ if (typeof callback === "function") {
332
+ normalizedCallback = callback;
333
+ }
334
+ }
335
+ } else {
336
+ normalizedOptions = args;
337
+ if (typeof options === "function") {
338
+ normalizedCallback = options;
339
+ }
340
+ }
341
+
342
+ return {
343
+ argsList,
344
+ options: normalizedOptions,
345
+ callback: normalizedCallback,
346
+ };
347
+ }
348
+
349
+ export function spawn(command, args, options) {
350
+ const { argsList, options: normalizedOptions } = normalizeSpawnArgs(
351
+ args,
352
+ options,
353
+ );
354
+ const traceId = nextTraceId();
355
+ const blockedError = enforceGuards(command, argsList, normalizedOptions);
356
+ if (blockedError) {
357
+ logBlocked(traceId, command, argsList, normalizedOptions, blockedError);
358
+ throw blockedError;
359
+ }
360
+
361
+ const startedAt = Date.now();
362
+ const child = childProcess.spawn(
363
+ command,
364
+ argsList,
365
+ stripTraceOptions(normalizedOptions),
366
+ );
367
+ appendTrace({
368
+ event: "spawn",
369
+ trace_id: traceId,
370
+ command,
371
+ args: argsList,
372
+ cwd: getCwd(normalizedOptions),
373
+ reason: getReason(normalizedOptions),
374
+ child_pid: child.pid ?? null,
375
+ });
376
+
377
+ return trackChild(child, {
378
+ traceId,
379
+ startedAt,
380
+ command,
381
+ args: argsList,
382
+ cwd: getCwd(normalizedOptions),
383
+ reason: getReason(normalizedOptions),
384
+ isWindowsTerminalSpawn: isWindowsTerminalSpawn(command),
385
+ });
386
+ }
387
+
388
+ export function execFile(file, args, options, callback) {
389
+ const normalized = normalizeExecFileArgs(args, options, callback);
390
+ const traceId = nextTraceId();
391
+ const blockedError = enforceGuards(
392
+ file,
393
+ normalized.argsList,
394
+ normalized.options,
395
+ );
396
+ if (blockedError) {
397
+ logBlocked(traceId, file, normalized.argsList, normalized.options, blockedError);
398
+ if (typeof normalized.callback === "function") {
399
+ queueMicrotask(() => normalized.callback(blockedError, "", ""));
400
+ return createRejectedChild(file, normalized.argsList, blockedError);
401
+ }
402
+ throw blockedError;
403
+ }
404
+
405
+ const startedAt = Date.now();
406
+ const wrappedCallback =
407
+ typeof normalized.callback === "function"
408
+ ? (error, stdout, stderr) => normalized.callback(error, stdout, stderr)
409
+ : undefined;
410
+
411
+ const child = childProcess.execFile(
412
+ file,
413
+ normalized.argsList,
414
+ stripTraceOptions(normalized.options),
415
+ wrappedCallback,
416
+ );
417
+
418
+ appendTrace({
419
+ event: "spawn",
420
+ trace_id: traceId,
421
+ command: file,
422
+ args: normalized.argsList,
423
+ cwd: getCwd(normalized.options),
424
+ reason: getReason(normalized.options),
425
+ child_pid: child.pid ?? null,
426
+ });
427
+
428
+ return trackChild(child, {
429
+ traceId,
430
+ startedAt,
431
+ command: file,
432
+ args: normalized.argsList,
433
+ cwd: getCwd(normalized.options),
434
+ reason: getReason(normalized.options),
435
+ isWindowsTerminalSpawn: isWindowsTerminalSpawn(file),
436
+ });
437
+ }
438
+
439
+ export function execFileSync(file, args, options) {
440
+ const normalized = Array.isArray(args)
441
+ ? { argsList: [...args], options }
442
+ : { argsList: [], options: args };
443
+ const traceId = nextTraceId();
444
+ const blockedError = enforceGuards(
445
+ file,
446
+ normalized.argsList,
447
+ normalized.options,
448
+ );
449
+ if (blockedError) {
450
+ logBlocked(traceId, file, normalized.argsList, normalized.options, blockedError, {
451
+ sync: true,
452
+ });
453
+ throw blockedError;
454
+ }
455
+
456
+ const startedAt = Date.now();
457
+ appendTrace(
458
+ {
459
+ event: "spawn",
460
+ trace_id: traceId,
461
+ command: file,
462
+ args: normalized.argsList,
463
+ cwd: getCwd(normalized.options),
464
+ reason: getReason(normalized.options),
465
+ sync: true,
466
+ },
467
+ { sync: true },
468
+ );
469
+
470
+ try {
471
+ const result = childProcess.execFileSync(
472
+ file,
473
+ normalized.argsList,
474
+ stripTraceOptions(normalized.options),
475
+ );
476
+ appendTrace(
477
+ {
478
+ event: "exit",
479
+ trace_id: traceId,
480
+ command: file,
481
+ args: normalized.argsList,
482
+ cwd: getCwd(normalized.options),
483
+ reason: getReason(normalized.options),
484
+ exit_code: 0,
485
+ duration_ms: Date.now() - startedAt,
486
+ sync: true,
487
+ },
488
+ { sync: true },
489
+ );
490
+ return result;
491
+ } catch (error) {
492
+ appendTrace(
493
+ {
494
+ event: "exit",
495
+ trace_id: traceId,
496
+ command: file,
497
+ args: normalized.argsList,
498
+ cwd: getCwd(normalized.options),
499
+ reason: getReason(normalized.options),
500
+ exit_code: error?.status ?? null,
501
+ signal: error?.signal ?? null,
502
+ duration_ms: Date.now() - startedAt,
503
+ error: error?.message,
504
+ sync: true,
505
+ },
506
+ { sync: true },
507
+ );
508
+ throw error;
509
+ }
510
+ }
511
+
512
+ export const ChildProcess = childProcess.ChildProcess;
513
+ export const _forkChild = childProcess._forkChild;
514
+ export const exec = childProcess.exec;
515
+ export const execSync = childProcess.execSync;
516
+ export const fork = childProcess.fork;
517
+ export const spawnSync = childProcess.spawnSync;
518
+
519
+ export default {
520
+ ...childProcess,
521
+ spawn,
522
+ execFile,
523
+ execFileSync,
524
+ MAX_WT_TABS,
525
+ MAX_SPAWN_PER_SEC,
526
+ MAX_TOTAL_DESCENDANTS,
527
+ };
@@ -112,8 +112,10 @@ export function buildSshArgs(host, remoteCmd, opts = {}) {
112
112
  const remoteCmdStr = [cmd, ...quotedArgs].join(" ");
113
113
 
114
114
  const sshArgs = [
115
- "-o", `ConnectTimeout=${connectTimeout}`,
116
- "-o", "BatchMode=yes",
115
+ "-o",
116
+ `ConnectTimeout=${connectTimeout}`,
117
+ "-o",
118
+ "BatchMode=yes",
117
119
  ];
118
120
 
119
121
  if (keepalive) {
@@ -189,9 +191,10 @@ export function resolveHostAlias(alias, repoRoot) {
189
191
 
190
192
  /**
191
193
  * 특정 capability를 보유한 호스트 목록을 반환한다.
194
+ * 명시적 선택 UI에서 바로 리소스 정보를 보여줄 수 있도록 specs를 평탄화한다.
192
195
  * @param {string} capability — e.g. "codex", "claude", "gpu"
193
196
  * @param {string} [repoRoot]
194
- * @returns {Array<{ name: string, config: object }>}
197
+ * @returns {Array<{ name: string, config: object, specs: { cores?: number, ram_gb?: number } }>}
195
198
  */
196
199
  export function selectHostForCapability(capability, repoRoot) {
197
200
  loadHostsCache(repoRoot);
@@ -199,12 +202,39 @@ export function selectHostForCapability(capability, repoRoot) {
199
202
  const matches = [];
200
203
  for (const [name, cfg] of Object.entries(hostsCache.hosts || {})) {
201
204
  if (cfg.capabilities?.includes(capability)) {
202
- matches.push({ name, config: cfg });
205
+ matches.push({
206
+ name,
207
+ config: cfg,
208
+ specs: {
209
+ cores: cfg.specs?.cores,
210
+ ram_gb: cfg.specs?.ram_gb,
211
+ },
212
+ });
203
213
  }
204
214
  }
205
215
  return matches;
206
216
  }
207
217
 
218
+ /**
219
+ * 특정 capability를 가진 호스트를 리소스 기준으로 정렬해 반환한다.
220
+ * 자동 선택은 하지 않고, 명시적 선택 목록 정렬에만 사용한다.
221
+ * @param {string} capability — e.g. "codex", "claude", "gpu"
222
+ * @param {"cores"|"ram_gb"} sortBy
223
+ * @param {string} [repoRoot]
224
+ * @returns {Array<{ name: string, config: object, specs: { cores?: number, ram_gb?: number } }>}
225
+ */
226
+ export function selectHostByResources(capability, sortBy, repoRoot) {
227
+ if (sortBy !== "cores" && sortBy !== "ram_gb") {
228
+ throw new TypeError('sortBy must be "cores" or "ram_gb"');
229
+ }
230
+
231
+ return selectHostForCapability(capability, repoRoot).sort((a, b) => {
232
+ const aValue = a.specs?.[sortBy] ?? -Infinity;
233
+ const bValue = b.specs?.[sortBy] ?? -Infinity;
234
+ return bValue - aValue;
235
+ });
236
+ }
237
+
208
238
  /** hosts.json 캐시 초기화 (테스트용) */
209
239
  export function resetHostsCache() {
210
240
  hostsCache = null;
@@ -21,7 +21,11 @@ const TRANSIENT_RE =
21
21
  * @returns {string|Buffer} ssh stdout
22
22
  */
23
23
  export function execSshWithRetry(args, opts = {}) {
24
- const { maxRetries = DEFAULT_MAX_RETRIES, baseDelayMs = DEFAULT_BASE_DELAY_MS, ...execOpts } = opts;
24
+ const {
25
+ maxRetries = DEFAULT_MAX_RETRIES,
26
+ baseDelayMs = DEFAULT_BASE_DELAY_MS,
27
+ ...execOpts
28
+ } = opts;
25
29
 
26
30
  let lastError;
27
31
  for (let attempt = 0; attempt <= maxRetries; attempt++) {
@@ -1,7 +1,8 @@
1
1
  // hub/lib/uuidv7.mjs — UUIDv7 generator (RFC 9562, monotonic)
2
- import { randomBytes } from 'node:crypto';
2
+ import { randomBytes } from "node:crypto";
3
3
 
4
- let _rndPool = Buffer.alloc(0), _rndOff = 0;
4
+ let _rndPool = Buffer.alloc(0),
5
+ _rndOff = 0;
5
6
 
6
7
  function pooledRandom(n) {
7
8
  if (_rndOff + n > _rndPool.length) {
@@ -39,6 +40,6 @@ export function uuidv7() {
39
40
  buf[6] = ((_seq >> 8) & 0x0f) | 0x70;
40
41
  buf[7] = _seq & 0xff;
41
42
  buf[8] = (buf[8] & 0x3f) | 0x80;
42
- const h = buf.toString('hex');
43
+ const h = buf.toString("hex");
43
44
  return `${h.slice(0, 8)}-${h.slice(8, 12)}-${h.slice(12, 16)}-${h.slice(16, 20)}-${h.slice(20)}`;
44
45
  }