@khoavu882/doflow 2.0.0-beta.5 → 2.0.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 (471) hide show
  1. package/README.md +12 -11
  2. package/bin/doflow.js +21 -11
  3. package/core/.antigravity-plugin/plugin.json +1 -2
  4. package/core/.claude-plugin/plugin.json +1 -1
  5. package/core/.codex-plugin/plugin.json +1 -1
  6. package/core/.plugin/plugin.json +1 -1
  7. package/core/harnesses/claude/hooks/lib.sh +43 -24
  8. package/core/harnesses/claude/hooks/permission-audit.sh +3 -0
  9. package/core/harnesses/claude/hooks/post-compact.sh +35 -32
  10. package/core/harnesses/claude/hooks/post-edit-lint.sh +2 -0
  11. package/core/harnesses/claude/hooks/post-shell-observe.sh +48 -0
  12. package/core/harnesses/claude/hooks/post-tool-failure.sh +3 -0
  13. package/core/harnesses/claude/hooks/pre-compact.sh +23 -27
  14. package/core/harnesses/claude/hooks/session-end.sh +23 -10
  15. package/core/harnesses/claude/hooks/skill-config-audit.sh +3 -0
  16. package/core/harnesses/claude/settings/settings.json +18 -0
  17. package/core/harnesses/claude/statusline/doflow-statusline.sh +1 -0
  18. package/core/harnesses/codex/agents/core-implementer.toml +1 -0
  19. package/core/harnesses/codex/agents/delivery-lead.toml +10 -0
  20. package/core/harnesses/codex/agents/quality-guardian.toml +1 -1
  21. package/core/harnesses/codex/agents/research-writer.toml +1 -1
  22. package/core/harnesses/codex/agents/reviewer.toml +10 -0
  23. package/core/harnesses/codex/agents/spec-analyst.toml +1 -1
  24. package/core/harnesses/codex/agents/system-architect.toml +1 -1
  25. package/core/harnesses/codex/hooks/lib.sh +44 -25
  26. package/core/harnesses/codex/hooks/post-edit-lint.impl.sh +3 -1
  27. package/core/harnesses/codex/hooks/pre-compact.impl.sh +29 -26
  28. package/core/harnesses/codex/hooks/session-end.impl.sh +23 -10
  29. package/core/harnesses/codex/hooks/subagent-audit.sh +1 -0
  30. package/core/harnesses/copilot/hooks/doflow-lib.sh +93 -0
  31. package/core/harnesses/copilot/hooks/doflow-mcp-tool-guard.sh +9 -0
  32. package/core/harnesses/copilot/hooks/doflow-pre-bash-guard.sh +9 -0
  33. package/core/harnesses/copilot/hooks/doflow-pre-implement-gate.sh +9 -0
  34. package/core/harnesses/copilot/hooks/doflow-session-start.sh +9 -0
  35. package/core/harnesses/copilot/hooks/doflow-stop-check.sh +9 -0
  36. package/core/harnesses/copilot/hooks/doflow-subagent-start.sh +9 -0
  37. package/core/harnesses/copilot/hooks/doflow-subagent-stop.sh +9 -0
  38. package/core/harnesses/copilot/hooks/doflow.json +57 -0
  39. package/core/harnesses/kiro/agents/doflow.json +1 -1
  40. package/core/harnesses/kiro/hooks/lib.sh +26 -6
  41. package/core/harnesses/kiro/hooks/mcp-tool-guard.sh +1 -0
  42. package/core/harnesses/kiro/hooks/pre-bash-guard.sh +1 -0
  43. package/core/harnesses/kiro/hooks/pre-implement-gate.sh +1 -0
  44. package/core/harnesses/kiro/hooks/session-start.sh +1 -0
  45. package/core/harnesses/kiro/hooks/stop-check.sh +1 -0
  46. package/core/harnesses/pi/extensions/doflow-guard.js +8 -0
  47. package/core/harnesses/shared/hooks/ENVELOPE_MIGRATION.md +0 -1
  48. package/core/harnesses/shared/hooks/bridge/bridge.sh +102 -9
  49. package/core/harnesses/shared/hooks/bridge/envelope.jq +87 -18
  50. package/core/harnesses/shared/hooks/bridge/observe-model.sh +75 -0
  51. package/core/harnesses/shared/hooks/bridge/respond.sh +10 -2
  52. package/core/harnesses/shared/hooks/policies/blocked-patterns.conf +28 -14
  53. package/core/harnesses/shared/hooks/policies/capture-failure.sh +48 -15
  54. package/core/harnesses/shared/hooks/policies/compact-text.sh +46 -0
  55. package/core/harnesses/shared/hooks/policies/contract.sh +3 -0
  56. package/core/harnesses/shared/hooks/policies/deny-json.sh +2 -11
  57. package/core/harnesses/shared/hooks/policies/emission-rules.sh +37 -0
  58. package/core/harnesses/shared/hooks/policies/emission.jq +209 -0
  59. package/core/harnesses/shared/hooks/policies/emission.sh +383 -0
  60. package/core/harnesses/shared/hooks/policies/identity.sh +177 -0
  61. package/core/harnesses/shared/hooks/policies/lib.sh +63 -40
  62. package/core/harnesses/shared/hooks/policies/mcp-tool-guard.sh +3 -2
  63. package/core/harnesses/shared/hooks/policies/pre-bash-guard.sh +213 -12
  64. package/core/harnesses/shared/hooks/policies/pre-implementation-gate.sh +114 -38
  65. package/core/harnesses/shared/hooks/policies/session-context.sh +30 -1
  66. package/core/harnesses/shared/hooks/policies/stop-check.sh +20 -9
  67. package/core/harnesses/shared/hooks/policies/subagent-audit.sh +5 -2
  68. package/core/harnesses/shared/hooks/policies/summary-store.sh +347 -0
  69. package/core/harnesses/shared/hooks/policies/user-prompt-submit.sh +60 -155
  70. package/core/harnesses/shared/hooks/stream-hook-runner.js +47 -8
  71. package/core/harnesses/shared/locator/doflow-run +2 -3
  72. package/core/registry/advice.json +3 -3
  73. package/core/registry/assets.json +55 -82
  74. package/core/registry/capabilities.json +12 -0
  75. package/core/registry/contracts.json +58 -31
  76. package/core/registry/contribution-points.json +32 -0
  77. package/core/registry/gates.json +32 -0
  78. package/core/registry/guidance-caps.json +40 -0
  79. package/core/registry/harnesses.json +1442 -363
  80. package/core/registry/lifecycle.json +485 -304
  81. package/core/registry/mcp.json +5 -1
  82. package/core/registry/models.json +7 -1
  83. package/core/registry/package-templates/README.md +19 -0
  84. package/core/registry/package-templates/agent/files/agent.md +9 -0
  85. package/core/registry/package-templates/agent/template.json +4 -0
  86. package/core/registry/package-templates/capability-provider/files/provider.json +9 -0
  87. package/core/registry/package-templates/capability-provider/template.json +11 -0
  88. package/core/registry/package-templates/debate-preset/files/preset.json +26 -0
  89. package/core/registry/package-templates/debate-preset/template.json +4 -0
  90. package/core/registry/package-templates/review-preset/files/preset.json +30 -0
  91. package/core/registry/package-templates/review-preset/template.json +4 -0
  92. package/core/registry/package-templates/skill/files/SKILL.md +8 -0
  93. package/core/registry/package-templates/skill/template.json +4 -0
  94. package/core/registry/package-templates/worker/files/worker.json +92 -0
  95. package/core/registry/package-templates/worker/template.json +11 -0
  96. package/core/registry/packages/doflow/doflow-package.json +15 -0
  97. package/core/registry/packages/doflow/presets/debate-3.json +26 -0
  98. package/core/registry/protocols.json +61 -0
  99. package/core/registry/routes.json +17 -0
  100. package/core/registry/rules.json +431 -0
  101. package/core/registry/settings.json +276 -0
  102. package/core/registry/storage.json +679 -31
  103. package/core/registry/telemetry.json +236 -0
  104. package/core/registry/transcripts.json +142 -0
  105. package/core/registry/verification.json +76 -1
  106. package/core/registry/workflows.json +55 -0
  107. package/core/shared/agent-specs/core-implementer.md +3 -0
  108. package/core/shared/agent-specs/delivery-lead.md +68 -0
  109. package/core/shared/agent-specs/quality-guardian.md +5 -1
  110. package/core/shared/agent-specs/research-writer.md +10 -3
  111. package/core/shared/agent-specs/reviewer.md +53 -0
  112. package/core/shared/agent-specs/spec-analyst.md +5 -6
  113. package/core/shared/agent-specs/system-architect.md +5 -1
  114. package/core/shared/guidance/DOFLOW_CORE.md +1 -5
  115. package/core/shared/guidance/modes/MODE_DeepResearch.md +1 -1
  116. package/core/shared/guidance/modes/MODE_Orchestration.md +4 -3
  117. package/core/shared/guidance/modes/MODE_Task_Management.md +14 -14
  118. package/core/shared/guidance/pointers/codex.md +1 -4
  119. package/core/shared/guidance/references/ARTIFACT_FORMAT.md +30 -16
  120. package/core/shared/guidance/references/ARTIFACT_VOICE.md +3 -2
  121. package/core/shared/guidance/references/CONSTITUTION_BASE.md +17 -15
  122. package/core/shared/guidance/references/DIAGRAM_GUIDE.md +1 -1
  123. package/core/shared/guidance/references/DOFLOW_CHAIN.md +17 -19
  124. package/core/shared/guidance/references/EVIDENCE_LEDGER.md +7 -8
  125. package/core/shared/guidance/references/MODEL_SELECTION.md +5 -3
  126. package/core/shared/guidance/references/ORCHESTRATION.md +1 -2
  127. package/core/shared/guidance/rules/RULES.md +45 -0
  128. package/core/shared/scripts/doflow/bash/do-args.sh +37 -0
  129. package/core/shared/scripts/doflow/bash/do-exec-paths.sh +4 -0
  130. package/core/shared/scripts/doflow/bash/do-git-state.sh +15 -4
  131. package/core/shared/scripts/doflow/bash/do-parallel-check.sh +4 -0
  132. package/core/shared/scripts/doflow/bash/do-paths.sh +40 -2
  133. package/core/shared/scripts/doflow/bash/do-prereqs.sh +2 -1
  134. package/core/shared/scripts/doflow/bash/do-review-package.sh +4 -0
  135. package/core/shared/scripts/doflow/bash/do-task-brief.sh +58 -16
  136. package/core/shared/scripts/doflow/bash/render-audit.sh +26 -2
  137. package/core/shared/scripts/doflow/bash/render-diagrams.sh +1 -0
  138. package/core/shared/scripts/doflow/bash/render-puml.sh +2 -1
  139. package/core/shared/scripts/doflow/bash/validate-artifacts.sh +48 -4
  140. package/core/shared/scripts/doflow/bin/doflow-run +149 -34
  141. package/core/shared/skills/do/SKILL.md +12 -10
  142. package/core/shared/skills/do/references/advice_calls.md +26 -0
  143. package/core/shared/skills/do/references/pm_routing.md +1 -2
  144. package/core/shared/skills/do/references/program_mode.md +31 -0
  145. package/core/shared/skills/do-brainstorm/SKILL.md +20 -74
  146. package/core/shared/skills/do-brainstorm/references/handoff_branches.md +35 -0
  147. package/core/shared/skills/do-brainstorm/references/intent_seed.md +21 -0
  148. package/core/shared/skills/do-brainstorm/references/round_log.md +17 -0
  149. package/core/shared/skills/do-code-review/SKILL.md +41 -144
  150. package/core/shared/skills/do-code-review/content-types/markdown.md +24 -2
  151. package/core/shared/skills/do-code-review/references/tools.md +90 -0
  152. package/core/shared/skills/do-code-review/scripts/doc_quality_checker.py +549 -7
  153. package/core/shared/skills/do-design/SKILL.md +18 -17
  154. package/core/shared/skills/do-diagnose/SKILL.md +14 -4
  155. package/core/shared/skills/do-document/SKILL.md +11 -1
  156. package/core/shared/skills/do-document/references/deep_research.md +1 -2
  157. package/core/shared/skills/do-document/references/embedded-research.md +18 -6
  158. package/core/shared/skills/do-document/references/implementation-flow.md +5 -6
  159. package/core/shared/skills/do-execute-plan/SKILL.md +15 -58
  160. package/core/shared/skills/do-execute-plan/references/handoff_record.md +7 -2
  161. package/core/shared/skills/do-execute-plan/references/parallel_dispatch.md +13 -0
  162. package/core/shared/skills/do-execute-plan/references/readiness_gate.md +26 -1
  163. package/core/shared/skills/do-execute-plan/references/run_position.md +13 -1
  164. package/core/shared/skills/do-execute-plan/references/scaffold.md +17 -9
  165. package/core/shared/skills/do-execute-plan/references/state_checkpoint.md +11 -0
  166. package/core/shared/skills/do-execute-plan/references/task_attempts.md +78 -24
  167. package/core/shared/skills/do-flow/SKILL.md +8 -9
  168. package/core/shared/skills/do-flow/references/task_classes.md +2 -2
  169. package/core/shared/skills/do-git/SKILL.md +4 -0
  170. package/core/shared/skills/do-implement/SKILL.md +4 -7
  171. package/core/shared/skills/do-plan/SKILL.md +26 -15
  172. package/core/shared/skills/do-test/SKILL.md +7 -4
  173. package/core/shared/templates/doflow/constitution-template.md +9 -3
  174. package/core/shared/templates/doflow/data-model-template.md +1 -1
  175. package/core/shared/templates/doflow/design-template.md +113 -16
  176. package/core/shared/templates/doflow/plan-template.md +11 -10
  177. package/core/shared/templates/doflow/question-log-template.md +14 -2
  178. package/core/shared/templates/doflow/requirement-template.md +1 -1
  179. package/core/worker-evidence/antigravity/checks.json +14 -0
  180. package/core/worker-evidence/codex/2026-10-18-cli-check.json +107 -0
  181. package/core/worker-evidence/codex/2026-10-18-live-run-edit.json +73 -0
  182. package/core/worker-evidence/codex/2026-10-18-live-run-read-only.json +62 -0
  183. package/core/worker-evidence/codex/2026-10-24-cli-check.json +126 -0
  184. package/core/worker-evidence/codex/checks.json +38 -0
  185. package/package.json +10 -6
  186. package/src/adapters/antigravity/index.js +143 -66
  187. package/src/adapters/claude/index.js +24 -4
  188. package/src/adapters/codex/agents.js +25 -15
  189. package/src/adapters/codex/index.js +48 -13
  190. package/src/adapters/codex/native-projection.js +6 -2
  191. package/src/adapters/copilot/index.js +58 -23
  192. package/src/adapters/copy-tree.js +290 -44
  193. package/src/adapters/guidance-manifest.js +71 -0
  194. package/src/adapters/guidance-pointer.js +19 -0
  195. package/src/adapters/hook-commands.js +6 -10
  196. package/src/adapters/index.js +1 -0
  197. package/src/adapters/kiro/index.js +23 -12
  198. package/src/adapters/opencode/index.js +8 -8
  199. package/src/adapters/pi/hooks.js +2 -1
  200. package/src/adapters/pi/index.js +14 -7
  201. package/src/adapters/resolve-source.js +26 -2
  202. package/src/cli/commands/install.js +2 -1
  203. package/src/cli/commands/reconcile.js +53 -9
  204. package/src/cli/commands/remove.js +2 -2
  205. package/src/cli/commands/rollback.js +6 -3
  206. package/src/cli/commands/self-update.js +18 -9
  207. package/src/cli/commands/status.js +21 -2
  208. package/src/cli/commands/ui.js +99 -0
  209. package/src/cli/commands/update.js +2 -1
  210. package/src/cli/index.js +322 -29
  211. package/src/cli/runtime-commands.js +209 -57
  212. package/src/cli/shared.js +0 -2
  213. package/src/helper/git.js +1 -1
  214. package/src/helper/guardrails.js +1 -1
  215. package/src/helper/marker-merge.js +31 -13
  216. package/src/helper/package-ids.js +37 -0
  217. package/src/helper/semver.js +94 -0
  218. package/src/install/backup.js +105 -15
  219. package/src/install/context.js +1 -1
  220. package/src/install/targets.js +31 -16
  221. package/src/lifecycle/coverage.js +20 -3
  222. package/src/lifecycle/hook-tier.js +160 -0
  223. package/src/lifecycle/index.js +412 -78
  224. package/src/lifecycle/retired-harnesses.js +318 -0
  225. package/src/lifecycle/view.js +35 -15
  226. package/src/registry/index.js +551 -26
  227. package/src/registry/worker-ids.js +45 -0
  228. package/src/release/build-package.js +0 -3
  229. package/src/release/docs-blocks.js +492 -0
  230. package/src/release/preflight.js +425 -0
  231. package/src/release/rehearse.js +401 -0
  232. package/src/release/release-workflow.js +733 -0
  233. package/src/release/sync-plugin-versions.js +43 -7
  234. package/src/runtime/advice/bench-gate.js +25 -0
  235. package/src/runtime/advice/cli.js +59 -16
  236. package/src/runtime/advice/client.js +32 -9
  237. package/src/runtime/advice/config.js +98 -133
  238. package/src/runtime/advice/doctor.js +1 -1
  239. package/src/runtime/advice/elevation.js +97 -0
  240. package/src/runtime/advice/endpoint-guard.js +9 -3
  241. package/src/runtime/advice/mode.js +37 -0
  242. package/src/runtime/advice/record.js +18 -5
  243. package/src/runtime/advice/registry.js +4 -1
  244. package/src/runtime/advice/shadow-config.js +229 -0
  245. package/src/runtime/advice/shadow-dispatcher.js +276 -0
  246. package/src/runtime/brief-rules.js +81 -0
  247. package/src/runtime/brief-tools.js +111 -34
  248. package/src/runtime/candidate.js +20 -11
  249. package/src/runtime/capabilities/executor.js +450 -0
  250. package/src/runtime/capabilities/loopback.js +41 -0
  251. package/src/runtime/capabilities/sanitizer.js +88 -0
  252. package/src/runtime/capability-router.js +135 -3
  253. package/src/runtime/checkouts.js +73 -11
  254. package/src/runtime/claims.js +13 -7
  255. package/src/runtime/cli.js +196 -19
  256. package/src/runtime/config-home.js +42 -0
  257. package/src/runtime/context/arbitrate.js +767 -0
  258. package/src/runtime/context/delivery-store.js +4 -6
  259. package/src/runtime/context/emission-rules.js +118 -0
  260. package/src/runtime/context/identity.js +227 -0
  261. package/src/runtime/context/primary-command.js +117 -0
  262. package/src/runtime/context/primary.js +344 -0
  263. package/src/runtime/context/summary-store.js +655 -0
  264. package/src/runtime/context-pack.js +154 -78
  265. package/src/runtime/decision-register.js +13 -4
  266. package/src/runtime/dispatch/admission.js +392 -0
  267. package/src/runtime/dispatch/attempt-end.js +274 -0
  268. package/src/runtime/dispatch/command.js +628 -0
  269. package/src/runtime/dispatch/controls.js +904 -0
  270. package/src/runtime/dispatch/envelope.js +276 -0
  271. package/src/runtime/dispatch/grants.js +310 -0
  272. package/src/runtime/dispatch/integrate.js +617 -0
  273. package/src/runtime/dispatch/loop.js +1835 -0
  274. package/src/runtime/dispatch/store.js +352 -0
  275. package/src/runtime/dispatch/verify-run.js +201 -0
  276. package/src/runtime/evidence-ledger.js +34 -7
  277. package/src/runtime/failure/capture.js +3 -1
  278. package/src/runtime/failure/cli.js +25 -9
  279. package/src/runtime/failure/home.js +57 -30
  280. package/src/runtime/failure/store.js +7 -2
  281. package/src/runtime/feature-pointer.js +174 -0
  282. package/src/runtime/feature-resolve.js +13 -2
  283. package/src/runtime/fleet/command.js +77 -0
  284. package/src/runtime/fleet/projects.js +178 -0
  285. package/src/runtime/fleet/tree.js +383 -0
  286. package/src/runtime/freshness.js +33 -3
  287. package/src/runtime/git-memo.js +46 -0
  288. package/src/runtime/guidance/ablation.js +427 -0
  289. package/src/runtime/health.js +565 -17
  290. package/src/runtime/history-compactor.js +13 -3
  291. package/src/runtime/implementation-gate.js +277 -22
  292. package/src/runtime/inventory/coverage.js +1 -1
  293. package/src/runtime/inventory/index.js +1 -1
  294. package/src/runtime/inventory/precedence.js +2 -2
  295. package/src/runtime/inventory/siblings.js +6 -4
  296. package/src/runtime/knowledge/code-corpus.js +277 -0
  297. package/src/runtime/knowledge/code-lexical.js +130 -0
  298. package/src/runtime/knowledge/code-retrieval.js +307 -0
  299. package/src/runtime/knowledge/code-validation.js +106 -0
  300. package/src/runtime/knowledge/gp3-gate.js +74 -0
  301. package/src/runtime/knowledge/graph-adapter.js +288 -0
  302. package/src/runtime/knowledge/graph-fallback.js +394 -0
  303. package/src/runtime/knowledge/hybrid.js +136 -8
  304. package/src/runtime/knowledge/retrieval.js +34 -1
  305. package/src/runtime/knowledge/rtk-compress.js +77 -0
  306. package/src/runtime/knowledge/semble-bridge.py +106 -0
  307. package/src/runtime/knowledge/semble-lifecycle.js +114 -0
  308. package/src/runtime/knowledge/semble-provider.js +365 -0
  309. package/src/runtime/lifecycle/cli.js +16 -6
  310. package/src/runtime/lifecycle/event-store.js +8 -6
  311. package/src/runtime/lifecycle/followup.js +6 -1
  312. package/src/runtime/lifecycle/overview.js +24 -1
  313. package/src/runtime/lifecycle/report-store.js +8 -10
  314. package/src/runtime/lifecycle/retention.js +95 -31
  315. package/src/runtime/lifecycle/root.js +9 -1
  316. package/src/runtime/lifecycle/status.js +34 -17
  317. package/src/runtime/lifecycle/store-upkeep.js +56 -7
  318. package/src/runtime/mask.js +134 -7
  319. package/src/runtime/mcp-consultations.js +40 -6
  320. package/src/runtime/model-router.js +79 -7
  321. package/src/runtime/models/catalogue.js +191 -0
  322. package/src/runtime/models/command.js +153 -0
  323. package/src/runtime/off-words.js +12 -0
  324. package/src/runtime/outcome.js +2 -2
  325. package/src/runtime/packages/command.js +1009 -0
  326. package/src/runtime/packages/contributions.js +116 -0
  327. package/src/runtime/packages/digest.js +132 -0
  328. package/src/runtime/packages/fetch.js +182 -0
  329. package/src/runtime/packages/grants.js +192 -0
  330. package/src/runtime/packages/index-file.js +134 -0
  331. package/src/runtime/packages/instruction.js +90 -0
  332. package/src/runtime/packages/manifest.js +331 -0
  333. package/src/runtime/packages/points.js +477 -0
  334. package/src/runtime/packages/programs.js +216 -0
  335. package/src/runtime/packages/scaffold.js +277 -0
  336. package/src/runtime/packages/source.js +90 -0
  337. package/src/runtime/packages/state.js +164 -0
  338. package/src/runtime/packages/store.js +449 -0
  339. package/src/runtime/packages/tar.js +106 -0
  340. package/src/runtime/packages/view.js +406 -0
  341. package/src/runtime/plan-check.js +59 -0
  342. package/src/runtime/plan-content.js +324 -0
  343. package/src/runtime/policy-init.js +118 -0
  344. package/src/runtime/profiles/doctor.js +96 -0
  345. package/src/runtime/profiles/resolve.js +244 -0
  346. package/src/runtime/profiles/rollback.js +254 -0
  347. package/src/runtime/profiles/sampler.js +41 -0
  348. package/src/runtime/readiness-record.js +16 -11
  349. package/src/runtime/readiness.js +46 -5
  350. package/src/runtime/research-request.js +50 -25
  351. package/src/runtime/retrieval-plan.js +10 -30
  352. package/src/runtime/retrieval-record.js +75 -5
  353. package/src/runtime/review/command.js +246 -0
  354. package/src/runtime/review/dominance.js +68 -0
  355. package/src/runtime/review/findings.js +434 -0
  356. package/src/runtime/review/identity.js +255 -0
  357. package/src/runtime/review/protocol-command.js +109 -0
  358. package/src/runtime/review/protocols.js +405 -0
  359. package/src/runtime/review/resolve-protocol.js +302 -0
  360. package/src/runtime/review/start.js +530 -0
  361. package/src/runtime/roadmap/facts.js +479 -0
  362. package/src/runtime/roadmap/gates.js +270 -0
  363. package/src/runtime/roadmap/loop.js +1636 -0
  364. package/src/runtime/roadmap/merge.js +381 -0
  365. package/src/runtime/roadmap/rows.js +1113 -0
  366. package/src/runtime/roadmap/seed.js +951 -0
  367. package/src/runtime/rules-report.js +336 -0
  368. package/src/runtime/scaffold/artifacts.js +60 -9
  369. package/src/runtime/scaffold/generate.js +21 -9
  370. package/src/runtime/settings/autopilot.js +106 -0
  371. package/src/runtime/settings/cli.js +280 -0
  372. package/src/runtime/settings/config-write.js +314 -0
  373. package/src/runtime/settings/files.js +271 -0
  374. package/src/runtime/settings/legacy.js +154 -0
  375. package/src/runtime/settings/lexical.js +56 -0
  376. package/src/runtime/settings/prepared-run.js +269 -0
  377. package/src/runtime/settings/project-layers.js +118 -0
  378. package/src/runtime/settings/refs.js +288 -0
  379. package/src/runtime/settings/registry.js +553 -0
  380. package/src/runtime/settings/resolve.js +713 -0
  381. package/src/runtime/settings/shared.js +37 -0
  382. package/src/runtime/settings/worker-billing.js +107 -0
  383. package/src/runtime/settings/write.js +269 -0
  384. package/src/runtime/slot-command.js +78 -0
  385. package/src/runtime/slots.js +671 -0
  386. package/src/runtime/source-version.js +1 -0
  387. package/src/runtime/state-root.js +217 -0
  388. package/src/runtime/storage/cli.js +12 -5
  389. package/src/runtime/storage/engine.js +9 -2
  390. package/src/runtime/storage/registry.js +14 -1
  391. package/src/runtime/storage/roots.js +66 -16
  392. package/src/runtime/storage/rules.js +82 -10
  393. package/src/runtime/storage/upkeep.js +10 -2
  394. package/src/runtime/storage/work-status.js +245 -26
  395. package/src/runtime/task-attempts.js +589 -69
  396. package/src/runtime/task-classifier.js +47 -11
  397. package/src/runtime/task-graph.js +373 -0
  398. package/src/runtime/task-run.js +778 -0
  399. package/src/runtime/task-scope.js +176 -55
  400. package/src/runtime/task-sources.js +147 -0
  401. package/src/runtime/task-state.js +374 -64
  402. package/src/runtime/team/admission.js +301 -0
  403. package/src/runtime/team/envelope.js +324 -0
  404. package/src/runtime/team/review-guard.js +156 -0
  405. package/src/runtime/trace/analyze.js +427 -0
  406. package/src/runtime/trace/baseline.js +770 -0
  407. package/src/runtime/trace/ledger.js +63 -140
  408. package/src/runtime/trace/otlp-export.js +568 -0
  409. package/src/runtime/trace/otlp-map.js +481 -0
  410. package/src/runtime/trace/spans.js +745 -0
  411. package/src/runtime/trace/telemetry.js +225 -0
  412. package/src/runtime/trace/views.js +1 -0
  413. package/src/runtime/transcripts/command.js +98 -0
  414. package/src/runtime/transcripts/cursor.js +326 -0
  415. package/src/runtime/transcripts/read.js +126 -0
  416. package/src/runtime/transcripts/readers/claude-jsonl.js +74 -0
  417. package/src/runtime/transcripts/readers/codex-rollout.js +70 -0
  418. package/src/runtime/transcripts/readers/copilot-events.js +90 -0
  419. package/src/runtime/transcripts/readers/kiro-jsonl.js +77 -0
  420. package/src/runtime/transcripts/readers/pi-jsonl.js +59 -0
  421. package/src/runtime/transcripts/registry.js +161 -0
  422. package/src/runtime/transcripts/stats.js +161 -0
  423. package/src/runtime/verification/check-key.js +628 -0
  424. package/src/runtime/verification/contract-runner.js +546 -11
  425. package/src/runtime/verification/engine.js +499 -9
  426. package/src/runtime/verification/impact.js +617 -0
  427. package/src/runtime/verification/inflight.js +205 -0
  428. package/src/runtime/verification/registry.js +176 -0
  429. package/src/runtime/verification/reuse.js +184 -0
  430. package/src/runtime/verification/telemetry-emit.js +254 -0
  431. package/src/runtime/verification/test-selection.js +67 -7
  432. package/src/runtime/worker/active.js +90 -0
  433. package/src/runtime/worker/cancel.js +222 -0
  434. package/src/runtime/worker/catalogue.js +122 -0
  435. package/src/runtime/worker/command.js +677 -0
  436. package/src/runtime/worker/evidence.js +288 -0
  437. package/src/runtime/worker/launch.js +288 -0
  438. package/src/runtime/worker/models.js +137 -0
  439. package/src/runtime/worker/parsers.js +218 -0
  440. package/src/runtime/worker/probes/index.js +706 -0
  441. package/src/runtime/worker/process-tree.js +415 -0
  442. package/src/runtime/worker/quota.js +43 -0
  443. package/src/runtime/worker/readiness.js +713 -0
  444. package/src/runtime/worker/run-store.js +166 -0
  445. package/src/runtime/worker/supervisor.js +541 -0
  446. package/src/runtime/worker/worktree-check.js +252 -0
  447. package/src/runtime/workflow-engine.js +5 -1
  448. package/src/runtime/workflow-orchestrator.js +578 -63
  449. package/src/runtime/worktree.js +149 -22
  450. package/src/state/index.js +1 -1
  451. package/src/state/lockfile.js +64 -10
  452. package/src/state/run-lock.js +1 -1
  453. package/types/node-commonjs.d.ts +106 -7
  454. package/core/harnesses/gemini/hooks/hooks.json +0 -77
  455. package/core/harnesses/gemini/hooks/lib.sh +0 -302
  456. package/core/harnesses/gemini/hooks/mcp-tool-guard.sh +0 -10
  457. package/core/harnesses/gemini/hooks/post-edit-lint.sh +0 -39
  458. package/core/harnesses/gemini/hooks/pre-bash-guard.sh +0 -10
  459. package/core/harnesses/gemini/hooks/pre-compact.sh +0 -38
  460. package/core/harnesses/gemini/hooks/pre-implement-gate.sh +0 -10
  461. package/core/harnesses/gemini/hooks/session-end.impl.sh +0 -89
  462. package/core/harnesses/gemini/hooks/session-end.sh +0 -5
  463. package/core/harnesses/gemini/hooks/session-start.sh +0 -7
  464. package/core/harnesses/gemini/settings/adapter-defaults.json +0 -4
  465. package/core/shared/guidance/FLAGS.md +0 -25
  466. package/core/shared/guidance/rules/RULE_01_SAFETY.md +0 -25
  467. package/core/shared/guidance/rules/RULE_02_WORKFLOW.md +0 -23
  468. package/core/shared/guidance/rules/RULE_03_QUALITY.md +0 -14
  469. package/core/shared/guidance/rules/RULE_04_QUESTIONS.md +0 -46
  470. package/src/adapters/gemini/hooks.js +0 -251
  471. package/src/adapters/gemini/index.js +0 -429
@@ -0,0 +1,481 @@
1
+ 'use strict';
2
+
3
+ // TypeScript migration (agent-docs/BRIEF_GOAL_DOFLOW.md): run directly by Node native type-stripping.
4
+
5
+ const crypto = require('node:crypto');
6
+ const nodeFs = require('node:fs');
7
+ const path = require('node:path');
8
+ const { SAFE_TOKEN } = require('./telemetry.js');
9
+ const { REPO_ROOT } = require('../../helper/repo-root.js');
10
+
11
+ const cmp = (a , b ) => (a < b ? -1 : a > b ? 1 : 0);
12
+
13
+ /** Object keys sorted at every level, so the JSON form is byte-identical for the same inputs. */
14
+ function sorted(value ) {
15
+ if (Array.isArray(value)) return value.map(sorted);
16
+ if (value && typeof value === 'object') {
17
+ return Object.fromEntries(
18
+ Object.keys(value)
19
+ .sort(cmp)
20
+ .map((k) => [k, sorted(value[k])])
21
+ );
22
+ }
23
+ return value;
24
+ }
25
+
26
+ let cachedPkgVersion = '';
27
+ function packageVersion() {
28
+ if (cachedPkgVersion) return cachedPkgVersion;
29
+ try {
30
+ const pkg = JSON.parse(nodeFs.readFileSync(path.join(REPO_ROOT, 'package.json'), 'utf8'));
31
+ cachedPkgVersion = typeof pkg.version === 'string' ? pkg.version : '0.0.0';
32
+ } catch {
33
+ cachedPkgVersion = '0.0.0';
34
+ }
35
+ return cachedPkgVersion;
36
+ }
37
+
38
+ /**
39
+ * Returns the three lists owned outside telemetry.json:
40
+ * - cli-commands: Object.keys(COMMANDS) loaded lazily inside to avoid load cycles.
41
+ * - workflow-stages: stage ids in core/registry/workflows.json.
42
+ * - workflow-classes: class ids in core/registry/workflows.json.
43
+ */
44
+ function ownedLists(repoRoot )
45
+
46
+
47
+
48
+ {
49
+ const root = repoRoot || REPO_ROOT;
50
+ const { COMMANDS } = require('../../cli/index.js');
51
+ const cliCommands = Object.keys(COMMANDS || {});
52
+
53
+ let workflowStages = [];
54
+ let workflowClasses = [];
55
+
56
+ try {
57
+ const workflowsFile = path.join(root, 'core', 'registry', 'workflows.json');
58
+ const workflows = JSON.parse(nodeFs.readFileSync(workflowsFile, 'utf8'));
59
+ workflowClasses = Object.keys(workflows.classes || {});
60
+ const stageSet = new Set ();
61
+ for (const cls of Object.values(workflows.classes || {}) ) {
62
+ for (const st of cls.stages || []) {
63
+ if (st && typeof st.id === 'string' && st.id && !stageSet.has(st.id)) {
64
+ stageSet.add(st.id);
65
+ workflowStages.push(st.id);
66
+ }
67
+ }
68
+ }
69
+ } catch {
70
+ // best-effort fallback
71
+ }
72
+
73
+ return {
74
+ 'cli-commands': cliCommands,
75
+ 'workflow-stages': workflowStages,
76
+ 'workflow-classes': workflowClasses,
77
+ };
78
+ }
79
+
80
+ /** Resolves the mapped span name per IC-008 rule 6. */
81
+ function resolveSpanName(span , spanSpec , registry , lists ) {
82
+ if (!spanSpec || typeof spanSpec.name !== 'string') {
83
+ return `doflow.${span.kind}`;
84
+ }
85
+ let pattern = spanSpec.name;
86
+
87
+ if (pattern.includes('{tool}')) {
88
+ const toolList = lists.tool || registry?.vocabularies?.tool || [];
89
+ const raw = span.attrs?.tool;
90
+ if (typeof raw === 'string' && toolList.includes(raw)) {
91
+ pattern = pattern.replace('{tool}', raw);
92
+ } else {
93
+ pattern = pattern.replace(/\s*\{tool\}/, '');
94
+ }
95
+ }
96
+
97
+ if (pattern.includes('{harness}')) {
98
+ const harnessList = lists.harness || registry?.vocabularies?.harness || [];
99
+ const raw = span.attrs?.harness;
100
+ if (typeof raw === 'string' && harnessList.includes(raw)) {
101
+ pattern = pattern.replace('{harness}', raw);
102
+ } else {
103
+ pattern = pattern.replace(/\s*\{harness\}/, '');
104
+ }
105
+ }
106
+
107
+ if (pattern.includes('{kind}')) {
108
+ pattern = pattern.replace('{kind}', span.kind);
109
+ }
110
+
111
+ if (pattern.includes('{name}')) {
112
+ const names = registry?.export?.names || {};
113
+ let nameKey = null;
114
+ if (span.kind === 'ledger') {
115
+ nameKey = 'verb';
116
+ } else if (Object.hasOwn(names, span.kind)) {
117
+ nameKey = span.kind;
118
+ } else if (span.attrs && typeof span.attrs === 'object') {
119
+ for (const k of Object.keys(names)) {
120
+ if (Object.hasOwn(span.attrs, k) && span.attrs[k] === span.name) {
121
+ nameKey = k;
122
+ break;
123
+ }
124
+ }
125
+ }
126
+
127
+ if (!nameKey || !names[nameKey]) {
128
+ pattern = pattern.replace(/\s*\{name\}/, '');
129
+ } else {
130
+ const listName = names[nameKey];
131
+ const list = lists[listName] || registry?.vocabularies?.[listName] || [];
132
+ const raw = span.name;
133
+ if (typeof raw === 'string' && list.includes(raw)) {
134
+ pattern = pattern.replace('{name}', raw);
135
+ } else {
136
+ pattern = pattern.replace(/\s*\{name\}/, '');
137
+ }
138
+ }
139
+ }
140
+
141
+ return pattern.trim();
142
+ }
143
+
144
+ const RULE_KEYS = ['id', 'vocabulary', 'measure'];
145
+ const SPEC_KEYS = new Set([...RULE_KEYS, 'export']);
146
+
147
+ /**
148
+ * The one typed check of an `export.attributes` entry (091 C-1), shared by the mapper and G45.7.
149
+ * An entry holds exactly one rule key: `id: true` (boolean, only on `tool_call_id`), `vocabulary:
150
+ * <non-empty list name>` or `measure: true`, plus an optional `export: <non-empty key>`. Anything
151
+ * else is an error, and the mapper drops the attribute (fail closed).
152
+ */
153
+ function attributeRule(key , attrSpec ) {
154
+ if (!attrSpec || typeof attrSpec !== 'object' || Array.isArray(attrSpec)) return { error: `'${key}' rule must be an object` };
155
+ const unknown = Object.keys(attrSpec).filter((k) => !SPEC_KEYS.has(k));
156
+ if (unknown.length) return { error: `'${key}' has unknown rule key(s) ${unknown.join(',')}` };
157
+ const rules = RULE_KEYS.filter((k) => Object.hasOwn(attrSpec, k));
158
+ if (rules.length !== 1) return { error: `'${key}' must hold exactly one of id, vocabulary, measure (has ${rules.length})` };
159
+ if (Object.hasOwn(attrSpec, 'export') && (typeof attrSpec.export !== 'string' || attrSpec.export === '')) {
160
+ return { error: `'${key}' export must be a non-empty string` };
161
+ }
162
+ const exportKey = Object.hasOwn(attrSpec, 'export') ? attrSpec.export : null;
163
+ const rule = rules[0] ;
164
+ if (rule === 'id') {
165
+ if (attrSpec.id !== true) return { error: `'${key}' id must be the boolean true` };
166
+ if (key !== 'tool_call_id') return { error: `'${key}' declared id: true but only tool_call_id may declare id: true` };
167
+ } else if (rule === 'vocabulary') {
168
+ if (typeof attrSpec.vocabulary !== 'string' || attrSpec.vocabulary === '') return { error: `'${key}' vocabulary must name a list` };
169
+ } else if (attrSpec.measure !== true) {
170
+ return { error: `'${key}' measure must be the boolean true` };
171
+ }
172
+ return { rule, exportKey };
173
+ }
174
+
175
+ /** Resolves span attributes per IC-008 rules 1-5 and 7. */
176
+ function resolveAttributes(span , spanSpec , registry , lists ) {
177
+ const attrs = [];
178
+ const exportAttrs = registry?.export?.attributes || {};
179
+ const spanAttrs = span.attrs || {};
180
+
181
+ for (const [key, rawValue] of Object.entries(spanAttrs)) {
182
+ if (rawValue === null || rawValue === undefined) continue;
183
+ if (!Object.hasOwn(exportAttrs, key)) continue;
184
+
185
+ const attrSpec = exportAttrs[key];
186
+ const checked = attributeRule(key, attrSpec);
187
+ if ('error' in checked) continue; // fail closed: a malformed rule exports nothing
188
+ const exportKey =
189
+ checked.exportKey ||
190
+ registry?.kinds?.[span.kind]?.fields?.[key]?.name ||
191
+ `doflow.${span.kind}.${key}`;
192
+
193
+ let valueObj = null;
194
+
195
+ if (checked.rule === 'id') {
196
+ // rule 2: id: true (tool_call_id only) exports the value unchanged only when it passes SAFE_TOKEN
197
+ if (typeof rawValue === 'string' && SAFE_TOKEN.test(rawValue)) {
198
+ valueObj = { stringValue: rawValue };
199
+ }
200
+ } else if (checked.rule === 'vocabulary') {
201
+ // rule 3: vocabulary exports the value when it is a member of the named list, else "other"
202
+ const listName = attrSpec.vocabulary;
203
+ const list = lists[listName] || registry?.vocabularies?.[listName] || [];
204
+ if (typeof rawValue === 'string' && list.includes(rawValue)) {
205
+ valueObj = { stringValue: rawValue };
206
+ } else {
207
+ valueObj = { stringValue: 'other' };
208
+ }
209
+ } else if (checked.rule === 'measure') {
210
+ // rule 4: measure: true exports a number unchanged
211
+ if (typeof rawValue === 'number' && Number.isFinite(rawValue)) {
212
+ if (Math.trunc(rawValue) === rawValue) {
213
+ valueObj = { intValue: String(rawValue) };
214
+ } else {
215
+ valueObj = { doubleValue: rawValue };
216
+ }
217
+ } else if (typeof rawValue === 'bigint') {
218
+ valueObj = { intValue: rawValue.toString() };
219
+ } else if (typeof rawValue === 'boolean') {
220
+ valueObj = { boolValue: rawValue };
221
+ }
222
+ }
223
+
224
+ if (valueObj !== null) {
225
+ attrs.push({ key: exportKey, value: valueObj });
226
+ }
227
+ }
228
+
229
+ // rule 7: gen_ai.operation.name is set from operation. No other gen_ai.* key is emitted.
230
+ if (spanSpec && typeof spanSpec.operation === 'string' && spanSpec.operation) {
231
+ attrs.push({ key: 'gen_ai.operation.name', value: { stringValue: spanSpec.operation } });
232
+ }
233
+
234
+ return attrs;
235
+ }
236
+
237
+ const sha16 = (text ) => crypto.createHash('sha256').update(text).digest('hex').slice(0, 16);
238
+ const byStartThenId = (x , y ) => {
239
+ const a = BigInt(x.body.startTimeUnixNano);
240
+ const b = BigInt(y.body.startTimeUnixNano);
241
+ return a < b ? -1 : a > b ? 1 : cmp(x.id, y.id);
242
+ };
243
+
244
+ /**
245
+ * Export-time span ids (091 C-4, D-ORCH option a). The local view's span ids are digests of record
246
+ * locators (slug, task id, run key, path hash), so they are never exported. Each exported id is
247
+ * `sha16` of values already in the payload only: the trace id, the remapped parent id, the span's
248
+ * exported body (name, times, attributes, status), and an ordinal among spans whose inputs are equal,
249
+ * ordered by the exported content of their subtrees. A parent that is not exported is dropped.
250
+ * Sets `id` and `parent` (exported id or null) on each entry.
251
+ */
252
+ function remapSpanIds(traceId , entries ) {
253
+ const byLocal = new Map ();
254
+ for (const e of entries) if (e.localId && !byLocal.has(e.localId)) byLocal.set(e.localId, e);
255
+ const parentOf = (e ) => {
256
+ const p = e.localParent ? byLocal.get(e.localParent) : undefined;
257
+ return p && p !== e ? p : null;
258
+ };
259
+ const children = new Map ();
260
+ for (const e of entries) {
261
+ const p = parentOf(e);
262
+ if (p) {
263
+ if (!children.has(p)) children.set(p, []);
264
+ children.get(p) .push(e);
265
+ }
266
+ }
267
+ // Content signature of a subtree, from exported values only (cycle-safe).
268
+ const sig = new Map ();
269
+ const subtree = (e , seen ) => {
270
+ if (sig.has(e)) return sig.get(e) ;
271
+ if (seen.has(e)) return '';
272
+ seen.add(e);
273
+ const kids = (children.get(e) || []).map((c) => subtree(c, seen)).sort(cmp);
274
+ const value = sha16(`${e.content}\n${kids.join(',')}`);
275
+ seen.delete(e);
276
+ sig.set(e, value);
277
+ return value;
278
+ };
279
+ for (const e of entries) subtree(e, new Set());
280
+
281
+ const done = new Map ();
282
+ const assign = (group , parentId , pass = '') => {
283
+ const bases = new Map ();
284
+ for (const e of group) {
285
+ const base = `${traceId}\n${parentId}\n${e.content}${pass}`;
286
+ if (!bases.has(base)) bases.set(base, []);
287
+ bases.get(base) .push(e);
288
+ }
289
+ for (const [base, same] of bases) {
290
+ same.sort((x, y) => cmp(sig.get(x), sig.get(y)));
291
+ same.forEach((e, ordinal) => {
292
+ if (done.has(e)) return;
293
+ const id = sha16(`doflow-otlp-span-v1\n${base}\n${ordinal}`);
294
+ done.set(e, id);
295
+ e.id = id;
296
+ e.parent = parentId === '' ? null : parentId;
297
+ });
298
+ }
299
+ for (const e of group) {
300
+ const kids = (children.get(e) || []).filter((c) => !done.has(c));
301
+ if (kids.length) assign(kids, e.id);
302
+ }
303
+ };
304
+ // Roots: no exported parent. Spans caught in a parent cycle are treated as roots.
305
+ assign(entries.filter((e) => parentOf(e) === null), '');
306
+ const rest = entries.filter((e) => !done.has(e));
307
+ // The pass is part of the id input: without it a cycle member equal in content to a root would
308
+ // restart the ordinal at 0 and take the root's id.
309
+ if (rest.length) assign(rest, '', '\ncycle');
310
+ }
311
+
312
+ /**
313
+ * Builds OTLP/HTTP JSON request bodies from a spans view per IC-007 and IC-008.
314
+ *
315
+ * @param {Object} view spans view { v, traces, ungrouped, gaps }
316
+ * @param {Object} registry loaded telemetry.json
317
+ * @param {Object} [meta] { version, lists }
318
+ * @returns {{ requests: any[], skipped: { ungrouped: number, noStart: number } }}
319
+ */
320
+ function buildOtlpRequests(
321
+ view ,
322
+ registry ,
323
+ meta
324
+
325
+
326
+
327
+
328
+
329
+
330
+
331
+
332
+ ) {
333
+ const lists = {
334
+ ...ownedLists(),
335
+ ...(meta?.lists || {}),
336
+ } ;
337
+
338
+ const version = meta?.version || packageVersion();
339
+ const serviceName = registry?.export?.resource?.['service.name'] || 'doflow';
340
+ const schemaUrl = registry?.export?.semconv?.schemaUrl || '';
341
+
342
+ let skippedUngrouped = 0;
343
+ for (const group of view?.ungrouped || []) {
344
+ skippedUngrouped += (group?.spans || []).length;
345
+ }
346
+
347
+ let skippedNoStart = 0;
348
+ const traces = view?.traces || [];
349
+
350
+ // Map every exportable span first (no ids yet), then remap ids from payload values only (C-4).
351
+ const mappedTraces = [];
352
+ for (const trace of traces) {
353
+ const traceId = String(trace.traceId || '').toLowerCase();
354
+ const traceLink = trace.traceLink ? String(trace.traceLink).toLowerCase() : null;
355
+ const entries = [];
356
+
357
+ for (const span of trace.spans || []) {
358
+ if (span.start == null) {
359
+ skippedNoStart++;
360
+ continue;
361
+ }
362
+
363
+ const kind = 1;
364
+ const startMs = Date.parse(span.start);
365
+ const startTimeUnixNano = (BigInt(startMs) * 1000000n).toString();
366
+ const endMs = span.end != null ? Date.parse(span.end) : startMs;
367
+ const endTimeUnixNano = (BigInt(endMs) * 1000000n).toString();
368
+
369
+ const spanSpec = registry?.export?.spans?.[span.kind] || registry?.export?.spans?.['*'];
370
+ const name = resolveSpanName(span, spanSpec, registry, lists);
371
+ const attributes = resolveAttributes(span, spanSpec, registry, lists);
372
+
373
+ const statusVal = span.attrs?.status;
374
+ const exitCode = span.attrs?.exit_code;
375
+ const isError =
376
+ statusVal === 'FAIL' ||
377
+ statusVal === 'fail' ||
378
+ statusVal === 'error' ||
379
+ (typeof exitCode === 'number' && exitCode !== 0);
380
+
381
+ let status = undefined;
382
+ if (isError) {
383
+ status = { code: 2 };
384
+ const errorType =
385
+ statusVal === 'FAIL' || statusVal === 'fail' || statusVal === 'error'
386
+ ? statusVal
387
+ : `exit:${exitCode}`;
388
+ attributes.push({ key: 'error.type', value: { stringValue: errorType } });
389
+ }
390
+
391
+ const body = {
392
+ name,
393
+ kind,
394
+ startTimeUnixNano,
395
+ endTimeUnixNano,
396
+ attributes: attributes.sort((x , y ) => cmp(x.key, y.key)),
397
+ ...(status !== undefined ? { status } : {}),
398
+ };
399
+ entries.push({
400
+ localId: String(span.spanId || '').toLowerCase(),
401
+ localParent: span.parentSpanId != null && span.parentSpanId !== '' ? String(span.parentSpanId).toLowerCase() : null,
402
+ body,
403
+ content: JSON.stringify(sorted(body)),
404
+ });
405
+ }
406
+ mappedTraces.push({ traceId, traceLink, spans: entries });
407
+ }
408
+ // Remap once per trace id, so spans of two segments that share a trace id never share an id.
409
+ const byTrace = new Map ();
410
+ for (const t of mappedTraces) byTrace.set(t.traceId, [...(byTrace.get(t.traceId) || []), ...t.spans]);
411
+ for (const [traceId, entries] of byTrace) remapSpanIds(traceId, entries);
412
+
413
+ // A trace's root for links: the earliest exported span without an exported parent.
414
+ const traceRoots = new Map ();
415
+ for (const t of mappedTraces) {
416
+ const root = t.spans.filter((e) => e.parent === null).sort(byStartThenId)[0];
417
+ if (root && !traceRoots.has(t.traceId)) traceRoots.set(t.traceId, root.id);
418
+ }
419
+
420
+ const mappedSpans = [];
421
+ for (const t of mappedTraces) {
422
+ for (const e of [...t.spans].sort(byStartThenId)) {
423
+ let links = undefined;
424
+ if (e.parent === null && t.traceLink && traceRoots.has(t.traceLink)) {
425
+ links = [{ traceId: t.traceLink, spanId: traceRoots.get(t.traceLink) }];
426
+ }
427
+ mappedSpans.push({
428
+ traceId: t.traceId,
429
+ spanId: e.id,
430
+ ...(e.parent !== null ? { parentSpanId: e.parent } : {}),
431
+ ...e.body,
432
+ ...(links !== undefined ? { links } : {}),
433
+ });
434
+ }
435
+ }
436
+
437
+ const requests = [];
438
+ const CHUNK_SIZE = 512;
439
+
440
+ for (let i = 0; i < mappedSpans.length; i += CHUNK_SIZE) {
441
+ const chunk = mappedSpans.slice(i, i + CHUNK_SIZE);
442
+ const req = {
443
+ resourceSpans: [
444
+ {
445
+ resource: {
446
+ attributes: [
447
+ { key: 'service.name', value: { stringValue: serviceName } },
448
+ { key: 'service.version', value: { stringValue: version } },
449
+ ],
450
+ },
451
+ schemaUrl,
452
+ scopeSpans: [
453
+ {
454
+ scope: {
455
+ name: 'doflow',
456
+ version,
457
+ },
458
+ schemaUrl,
459
+ spans: chunk,
460
+ },
461
+ ],
462
+ },
463
+ ],
464
+ };
465
+ requests.push(sorted(req));
466
+ }
467
+
468
+ return {
469
+ requests,
470
+ skipped: {
471
+ ungrouped: skippedUngrouped,
472
+ noStart: skippedNoStart,
473
+ },
474
+ };
475
+ }
476
+
477
+ module.exports = {
478
+ attributeRule,
479
+ buildOtlpRequests,
480
+ ownedLists,
481
+ };