zob-harness 0.1.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 (356) hide show
  1. package/.pi/adapters/registry.json +103 -0
  2. package/.pi/agents/architecture-cartographer.md +53 -0
  3. package/.pi/agents/chief-vision.md +39 -0
  4. package/.pi/agents/clarifier.md +58 -0
  5. package/.pi/agents/context-steward.md +52 -0
  6. package/.pi/agents/doc-steward.md +34 -0
  7. package/.pi/agents/explore.md +49 -0
  8. package/.pi/agents/factory.md +41 -0
  9. package/.pi/agents/implementer.md +44 -0
  10. package/.pi/agents/librarian.md +32 -0
  11. package/.pi/agents/oracle-merge.md +50 -0
  12. package/.pi/agents/oracle.md +55 -0
  13. package/.pi/agents/pattern-miner.md +53 -0
  14. package/.pi/agents/planner.md +39 -0
  15. package/.pi/agents/project-dna-golden-evaluator.md +32 -0
  16. package/.pi/agents/project-dna-ontology-steward.md +30 -0
  17. package/.pi/agents/project-dna-oracle.md +56 -0
  18. package/.pi/agents/project-dna-orchestrator.md +60 -0
  19. package/.pi/agents/project-dna-query-steward.md +38 -0
  20. package/.pi/agents/project-dna-safety-preflight.md +54 -0
  21. package/.pi/agents/project-dna-test-linker.md +27 -0
  22. package/.pi/agents/qa.md +38 -0
  23. package/.pi/agents/refactor-cartographer.md +28 -0
  24. package/.pi/agents/refactor-mover.md +31 -0
  25. package/.pi/agents/refactor-oracle.md +49 -0
  26. package/.pi/agents/repo-scout.md +60 -0
  27. package/.pi/agents/sample-architect.md +48 -0
  28. package/.pi/agents/specifier.md +57 -0
  29. package/.pi/agents/symbol-range-curator.md +41 -0
  30. package/.pi/agents/synthesis.md +52 -0
  31. package/.pi/agents/temp-agent-creator.md +35 -0
  32. package/.pi/autonomy-policy.json +67 -0
  33. package/.pi/budget-policy.json +54 -0
  34. package/.pi/capabilities/zob-public-runtime-capabilities.json +1700 -0
  35. package/.pi/chains/explore-plan-oracle.json +78 -0
  36. package/.pi/chains/explore-spec-clarify-plan-oracle.json +64 -0
  37. package/.pi/chains/explore-spec-plan-oracle.json +53 -0
  38. package/.pi/chains/spec-clarify-plan-oracle.json +53 -0
  39. package/.pi/chains/spec-factory-oracle.json +42 -0
  40. package/.pi/chains/spec-plan-oracle.json +42 -0
  41. package/.pi/compute-profiles/defaults.json +19 -0
  42. package/.pi/compute-profiles/overrides.json +13 -0
  43. package/.pi/compute-profiles/risk-rules.json +16 -0
  44. package/.pi/daemon-policy.json +80 -0
  45. package/.pi/damage-control-rules.json +45 -0
  46. package/.pi/extensions/zob-child-safety/index.ts +212 -0
  47. package/.pi/extensions/zob-harness/AGENTS.md +28 -0
  48. package/.pi/extensions/zob-harness/index.ts +391 -0
  49. package/.pi/extensions/zob-harness/src/AGENTS.md +25 -0
  50. package/.pi/extensions/zob-harness/src/agents.ts +82 -0
  51. package/.pi/extensions/zob-harness/src/autonomous-runtime.ts +2912 -0
  52. package/.pi/extensions/zob-harness/src/autonomy-readiness.ts +778 -0
  53. package/.pi/extensions/zob-harness/src/budget-policy.ts +308 -0
  54. package/.pi/extensions/zob-harness/src/capabilities.ts +249 -0
  55. package/.pi/extensions/zob-harness/src/child-runner.ts +249 -0
  56. package/.pi/extensions/zob-harness/src/chronicle.ts +262 -0
  57. package/.pi/extensions/zob-harness/src/compute-profile.ts +602 -0
  58. package/.pi/extensions/zob-harness/src/compute-workflow-shape.ts +168 -0
  59. package/.pi/extensions/zob-harness/src/coms-v2/AGENTS.md +16 -0
  60. package/.pi/extensions/zob-harness/src/coms-v2/envelope.ts +121 -0
  61. package/.pi/extensions/zob-harness/src/coms-v2/identity.ts +53 -0
  62. package/.pi/extensions/zob-harness/src/coms-v2/ledger-bridge.ts +67 -0
  63. package/.pi/extensions/zob-harness/src/coms-v2/local-transport.ts +147 -0
  64. package/.pi/extensions/zob-harness/src/coms-v2/pending-replies.ts +80 -0
  65. package/.pi/extensions/zob-harness/src/coms-v2/policy.ts +125 -0
  66. package/.pi/extensions/zob-harness/src/coms-v2/presence.ts +55 -0
  67. package/.pi/extensions/zob-harness/src/coms-v2/registry.ts +113 -0
  68. package/.pi/extensions/zob-harness/src/coms-v2/response-capture.ts +50 -0
  69. package/.pi/extensions/zob-harness/src/coms-v2/transcript-capture.ts +164 -0
  70. package/.pi/extensions/zob-harness/src/coms-v2/types.ts +149 -0
  71. package/.pi/extensions/zob-harness/src/coms-v2/zpeer-profile.ts +140 -0
  72. package/.pi/extensions/zob-harness/src/coms-v2/zpeer.ts +452 -0
  73. package/.pi/extensions/zob-harness/src/constants.ts +108 -0
  74. package/.pi/extensions/zob-harness/src/context-gbrain.ts +465 -0
  75. package/.pi/extensions/zob-harness/src/daemon-policy.ts +223 -0
  76. package/.pi/extensions/zob-harness/src/daemon-readiness.ts +134 -0
  77. package/.pi/extensions/zob-harness/src/daemon-runtime.ts +393 -0
  78. package/.pi/extensions/zob-harness/src/factory/AGENTS.md +24 -0
  79. package/.pi/extensions/zob-harness/src/factory/agentic-plan.ts +65 -0
  80. package/.pi/extensions/zob-harness/src/factory/quarantine.ts +319 -0
  81. package/.pi/extensions/zob-harness/src/factory/run.ts +520 -0
  82. package/.pi/extensions/zob-harness/src/factory/validation.ts +454 -0
  83. package/.pi/extensions/zob-harness/src/factory-selector.ts +318 -0
  84. package/.pi/extensions/zob-harness/src/full-autonomy-test.ts +226 -0
  85. package/.pi/extensions/zob-harness/src/git-ops.ts +868 -0
  86. package/.pi/extensions/zob-harness/src/goal-room.ts +178 -0
  87. package/.pi/extensions/zob-harness/src/goal-runtime.ts +1569 -0
  88. package/.pi/extensions/zob-harness/src/goal-todo-imports.ts +111 -0
  89. package/.pi/extensions/zob-harness/src/goal-todo-types.ts +231 -0
  90. package/.pi/extensions/zob-harness/src/goal-todos.ts +1410 -0
  91. package/.pi/extensions/zob-harness/src/goal.ts +152 -0
  92. package/.pi/extensions/zob-harness/src/governed-requests.ts +436 -0
  93. package/.pi/extensions/zob-harness/src/interactive-autonomy.ts +595 -0
  94. package/.pi/extensions/zob-harness/src/launch-apply.ts +313 -0
  95. package/.pi/extensions/zob-harness/src/merge-queue.ts +290 -0
  96. package/.pi/extensions/zob-harness/src/mission-control.ts +573 -0
  97. package/.pi/extensions/zob-harness/src/model-availability.ts +52 -0
  98. package/.pi/extensions/zob-harness/src/model-routing.ts +429 -0
  99. package/.pi/extensions/zob-harness/src/orchestration/AGENTS.md +23 -0
  100. package/.pi/extensions/zob-harness/src/orchestration/adaptive-delegation.ts +547 -0
  101. package/.pi/extensions/zob-harness/src/orchestration/adaptive-workflow.ts +585 -0
  102. package/.pi/extensions/zob-harness/src/orchestration/lead-plan.ts +192 -0
  103. package/.pi/extensions/zob-harness/src/orchestration/plan.ts +168 -0
  104. package/.pi/extensions/zob-harness/src/orchestration/room.ts +346 -0
  105. package/.pi/extensions/zob-harness/src/orchestration/run.ts +134 -0
  106. package/.pi/extensions/zob-harness/src/orchestration/supervised-readonly.ts +1147 -0
  107. package/.pi/extensions/zob-harness/src/orchestration/widget-readers.ts +132 -0
  108. package/.pi/extensions/zob-harness/src/output-contracts.ts +656 -0
  109. package/.pi/extensions/zob-harness/src/project-dna.ts +533 -0
  110. package/.pi/extensions/zob-harness/src/promotion/AGENTS.md +24 -0
  111. package/.pi/extensions/zob-harness/src/promotion/candidate.ts +336 -0
  112. package/.pi/extensions/zob-harness/src/promotion/coms.ts +127 -0
  113. package/.pi/extensions/zob-harness/src/promotion/documentation.ts +142 -0
  114. package/.pi/extensions/zob-harness/src/promotion/factory.ts +107 -0
  115. package/.pi/extensions/zob-harness/src/promotion/ledger.ts +2 -0
  116. package/.pi/extensions/zob-harness/src/promotion/temp-agent.ts +151 -0
  117. package/.pi/extensions/zob-harness/src/promotion/types.ts +149 -0
  118. package/.pi/extensions/zob-harness/src/promotion/validate.ts +6 -0
  119. package/.pi/extensions/zob-harness/src/promotion/write-lane.ts +162 -0
  120. package/.pi/extensions/zob-harness/src/prompt-packs.ts +239 -0
  121. package/.pi/extensions/zob-harness/src/queue.ts +386 -0
  122. package/.pi/extensions/zob-harness/src/rules.ts +225 -0
  123. package/.pi/extensions/zob-harness/src/runtime/AGENTS.md +26 -0
  124. package/.pi/extensions/zob-harness/src/runtime/adaptive-zmode.ts +116 -0
  125. package/.pi/extensions/zob-harness/src/runtime/auto-compaction.ts +715 -0
  126. package/.pi/extensions/zob-harness/src/runtime/commands.ts +1315 -0
  127. package/.pi/extensions/zob-harness/src/runtime/compaction-policy.ts +516 -0
  128. package/.pi/extensions/zob-harness/src/runtime/delegation-click-markers.ts +141 -0
  129. package/.pi/extensions/zob-harness/src/runtime/delegation-feed.ts +415 -0
  130. package/.pi/extensions/zob-harness/src/runtime/delegation-markdown.ts +97 -0
  131. package/.pi/extensions/zob-harness/src/runtime/delegation-monitor.ts +553 -0
  132. package/.pi/extensions/zob-harness/src/runtime/delegation-mouse.ts +205 -0
  133. package/.pi/extensions/zob-harness/src/runtime/delegation-overlay.ts +434 -0
  134. package/.pi/extensions/zob-harness/src/runtime/events.ts +736 -0
  135. package/.pi/extensions/zob-harness/src/runtime/goal-todo-overlay.ts +214 -0
  136. package/.pi/extensions/zob-harness/src/runtime/mode-intent.ts +144 -0
  137. package/.pi/extensions/zob-harness/src/runtime/plan-capture.ts +270 -0
  138. package/.pi/extensions/zob-harness/src/runtime/state.ts +403 -0
  139. package/.pi/extensions/zob-harness/src/runtime/tools-autonomous.ts +117 -0
  140. package/.pi/extensions/zob-harness/src/runtime/tools-compute.ts +136 -0
  141. package/.pi/extensions/zob-harness/src/runtime/tools-coms.ts +365 -0
  142. package/.pi/extensions/zob-harness/src/runtime/tools-context.ts +70 -0
  143. package/.pi/extensions/zob-harness/src/runtime/tools-delegation.ts +1854 -0
  144. package/.pi/extensions/zob-harness/src/runtime/tools-factory.ts +810 -0
  145. package/.pi/extensions/zob-harness/src/runtime/tools-goal-room.ts +46 -0
  146. package/.pi/extensions/zob-harness/src/runtime/tools-governed-requests.ts +38 -0
  147. package/.pi/extensions/zob-harness/src/runtime/tools-merge-queue.ts +61 -0
  148. package/.pi/extensions/zob-harness/src/runtime/tools-mission-control.ts +77 -0
  149. package/.pi/extensions/zob-harness/src/runtime/tools-orchestration.ts +106 -0
  150. package/.pi/extensions/zob-harness/src/runtime/tools-project-dna.ts +123 -0
  151. package/.pi/extensions/zob-harness/src/runtime/tools-worker-pool.ts +93 -0
  152. package/.pi/extensions/zob-harness/src/runtime/tools-workspace-claims.ts +62 -0
  153. package/.pi/extensions/zob-harness/src/runtime/tools-zcommit.ts +147 -0
  154. package/.pi/extensions/zob-harness/src/runtime/widget.ts +353 -0
  155. package/.pi/extensions/zob-harness/src/runtime/zobHarness.ts +60 -0
  156. package/.pi/extensions/zob-harness/src/safety.ts +338 -0
  157. package/.pi/extensions/zob-harness/src/sandbox.ts +1508 -0
  158. package/.pi/extensions/zob-harness/src/schemas-project-dna.ts +47 -0
  159. package/.pi/extensions/zob-harness/src/schemas.ts +695 -0
  160. package/.pi/extensions/zob-harness/src/telemetry.ts +373 -0
  161. package/.pi/extensions/zob-harness/src/topology/AGENTS.md +22 -0
  162. package/.pi/extensions/zob-harness/src/topology/chains.ts +236 -0
  163. package/.pi/extensions/zob-harness/src/topology/coms.ts +211 -0
  164. package/.pi/extensions/zob-harness/src/topology/orchestration-profiles.ts +204 -0
  165. package/.pi/extensions/zob-harness/src/topology/teams.ts +113 -0
  166. package/.pi/extensions/zob-harness/src/types/core.ts +47 -0
  167. package/.pi/extensions/zob-harness/src/types.ts +939 -0
  168. package/.pi/extensions/zob-harness/src/utils/AGENTS.md +22 -0
  169. package/.pi/extensions/zob-harness/src/utils/formatting.ts +34 -0
  170. package/.pi/extensions/zob-harness/src/utils/hashing.ts +11 -0
  171. package/.pi/extensions/zob-harness/src/utils/json.ts +28 -0
  172. package/.pi/extensions/zob-harness/src/utils/paths.ts +54 -0
  173. package/.pi/extensions/zob-harness/src/utils/records.ts +25 -0
  174. package/.pi/extensions/zob-harness/src/utils/resources.ts +38 -0
  175. package/.pi/extensions/zob-harness/src/worker-pool.ts +672 -0
  176. package/.pi/extensions/zob-harness/src/workspace-claims.ts +297 -0
  177. package/.pi/extensions/zob-switch/index.ts +180 -0
  178. package/.pi/factories/budget-preflight-dry-run/batch-manifest.json +59 -0
  179. package/.pi/factories/budget-preflight-dry-run/factory.json +94 -0
  180. package/.pi/factories/budget-preflight-dry-run/pilot-manifest.json +50 -0
  181. package/.pi/factories/budget-preflight-dry-run/smoke-manifest.json +43 -0
  182. package/.pi/factories/code-review-matrix/batch-manifest.json +61 -0
  183. package/.pi/factories/code-review-matrix/factory.json +163 -0
  184. package/.pi/factories/code-review-matrix/pilot-manifest.json +41 -0
  185. package/.pi/factories/code-review-matrix/smoke-manifest.json +35 -0
  186. package/.pi/factories/factory-forge/batch-manifest.json +56 -0
  187. package/.pi/factories/factory-forge/factory.json +84 -0
  188. package/.pi/factories/factory-forge/pilot-manifest.json +32 -0
  189. package/.pi/factories/factory-forge/smoke-manifest.json +19 -0
  190. package/.pi/factories/opencode-pattern-canonizer/batch-manifest.json +54 -0
  191. package/.pi/factories/opencode-pattern-canonizer/factory.json +86 -0
  192. package/.pi/factories/opencode-pattern-canonizer/pilot-manifest.json +39 -0
  193. package/.pi/factories/opencode-pattern-canonizer/smoke-manifest.json +26 -0
  194. package/.pi/factories/project-dna/README.md +182 -0
  195. package/.pi/factories/project-dna/batch-manifest.json +37 -0
  196. package/.pi/factories/project-dna/example-project-dna-manifest-v2.json +80 -0
  197. package/.pi/factories/project-dna/example-project-dna-manifest.json +58 -0
  198. package/.pi/factories/project-dna/factory.json +131 -0
  199. package/.pi/factories/project-dna/golden-cases-smoke.json +62 -0
  200. package/.pi/factories/project-dna/pi-agentic-ontology.json +88 -0
  201. package/.pi/factories/project-dna/pilot-manifest.json +32 -0
  202. package/.pi/factories/project-dna/schemas/benchmark-suite.schema.json +27 -0
  203. package/.pi/factories/project-dna/schemas/code-knowledge-graph.schema.json +97 -0
  204. package/.pi/factories/project-dna/schemas/context-pack.schema.json +43 -0
  205. package/.pi/factories/project-dna/schemas/golden-case.schema.json +36 -0
  206. package/.pi/factories/project-dna/schemas/manifest-v2.schema.json +128 -0
  207. package/.pi/factories/project-dna/schemas/manifest.schema.json +77 -0
  208. package/.pi/factories/project-dna/schemas/ontology.schema.json +45 -0
  209. package/.pi/factories/project-dna/schemas/project-fingerprint.schema.json +28 -0
  210. package/.pi/factories/project-dna/schemas/query-steward-report.schema.json +52 -0
  211. package/.pi/factories/project-dna/smoke-manifest.json +27 -0
  212. package/.pi/factories/roadmap-smoke-lots/batch-manifest.json +49 -0
  213. package/.pi/factories/roadmap-smoke-lots/factory.json +89 -0
  214. package/.pi/factories/roadmap-smoke-lots/pilot-manifest.json +50 -0
  215. package/.pi/factories/roadmap-smoke-lots/smoke-manifest.json +35 -0
  216. package/.pi/git-policy.json +120 -0
  217. package/.pi/mission-control/zob_coms_transport.json +64 -0
  218. package/.pi/model-catalog.example.json +345 -0
  219. package/.pi/model-economy.example.json +196 -0
  220. package/.pi/model-routing.json +86 -0
  221. package/.pi/orchestrations/adaptive-chief-vision.json +193 -0
  222. package/.pi/orchestrations/ceo-feature-build.json +182 -0
  223. package/.pi/orchestrations/readonly-dynamic-smoke.json +75 -0
  224. package/.pi/output-contracts/agent-event.v1.json +19 -0
  225. package/.pi/output-contracts/base.v1.json +24 -0
  226. package/.pi/output-contracts/brain-lookup.v1.json +21 -0
  227. package/.pi/output-contracts/clarification.v1.json +21 -0
  228. package/.pi/output-contracts/context-pack.v1.json +20 -0
  229. package/.pi/output-contracts/context-request.v1.json +21 -0
  230. package/.pi/output-contracts/context-steward.v1.json +19 -0
  231. package/.pi/output-contracts/context-writeback-proposal.v1.json +18 -0
  232. package/.pi/output-contracts/delegation-request.v1.json +21 -0
  233. package/.pi/output-contracts/explore.v1.json +52 -0
  234. package/.pi/output-contracts/factory.v1.json +48 -0
  235. package/.pi/output-contracts/guidance-steward.v1.json +18 -0
  236. package/.pi/output-contracts/implement.v1.json +40 -0
  237. package/.pi/output-contracts/launch-authorization.v1.json +21 -0
  238. package/.pi/output-contracts/lead-plan.v1.json +22 -0
  239. package/.pi/output-contracts/mission-readiness.v1.json +20 -0
  240. package/.pi/output-contracts/oracle-merge.v1.json +44 -0
  241. package/.pi/output-contracts/oracle-request.v1.json +20 -0
  242. package/.pi/output-contracts/oracle.v1.json +44 -0
  243. package/.pi/output-contracts/orchestration-profile.v1.json +22 -0
  244. package/.pi/output-contracts/plan.v1.json +48 -0
  245. package/.pi/output-contracts/prompt-pack.v1.json +20 -0
  246. package/.pi/output-contracts/qa.v1.json +40 -0
  247. package/.pi/output-contracts/research.v1.json +36 -0
  248. package/.pi/output-contracts/spec.v1.json +22 -0
  249. package/.pi/output-contracts/synthesis.v1.json +44 -0
  250. package/.pi/output-contracts/temp-agent-card.v1.json +23 -0
  251. package/.pi/output-contracts/todo-child-result.v1.json +20 -0
  252. package/.pi/output-contracts/todo-child-result.v2.json +22 -0
  253. package/.pi/output-contracts/todo-claim-validation.v1.json +22 -0
  254. package/.pi/output-contracts/todo-split-request.v1.json +20 -0
  255. package/.pi/prompts/adaptive-workflow.md +63 -0
  256. package/.pi/prompts/autonomous-runtime.md +15 -0
  257. package/.pi/prompts/benchmark-contender.md +15 -0
  258. package/.pi/prompts/benchmark-judge.md +19 -0
  259. package/.pi/prompts/clarify-spec.md +20 -0
  260. package/.pi/prompts/compute-plan.md +36 -0
  261. package/.pi/prompts/compute-preview.md +42 -0
  262. package/.pi/prompts/contract.md +29 -0
  263. package/.pi/prompts/explore.md +13 -0
  264. package/.pi/prompts/factory-run.md +36 -0
  265. package/.pi/prompts/factory.md +20 -0
  266. package/.pi/prompts/implement.md +27 -0
  267. package/.pi/prompts/model-catalog.md +68 -0
  268. package/.pi/prompts/model-economy.md +64 -0
  269. package/.pi/prompts/oracle-merge.md +18 -0
  270. package/.pi/prompts/oracle.md +13 -0
  271. package/.pi/prompts/orchestrator.md +48 -0
  272. package/.pi/prompts/parallel-review.md +21 -0
  273. package/.pi/prompts/plan.md +21 -0
  274. package/.pi/prompts/project-dna.md +90 -0
  275. package/.pi/prompts/refactor-oracle.md +23 -0
  276. package/.pi/prompts/refactor-slice.md +24 -0
  277. package/.pi/prompts/research.md +20 -0
  278. package/.pi/prompts/spec.md +19 -0
  279. package/.pi/prompts/synthesis.md +18 -0
  280. package/.pi/rules/always.md +38 -0
  281. package/.pi/rules/docs.md +32 -0
  282. package/.pi/rules/factory.md +44 -0
  283. package/.pi/rules/oracle.md +34 -0
  284. package/.pi/rules/orchestration.md +44 -0
  285. package/.pi/rules/project.md +34 -0
  286. package/.pi/rules/prompts.md +43 -0
  287. package/.pi/rules/runtime.md +43 -0
  288. package/.pi/rules/sandbox.md +43 -0
  289. package/.pi/settings.json +28 -0
  290. package/.pi/skills/zob-agentic-access/SKILL.md +20 -0
  291. package/.pi/skills/zob-autonomous-runtime/SKILL.md +41 -0
  292. package/.pi/skills/zob-commit/SKILL.md +79 -0
  293. package/.pi/skills/zob-compaction-policy/SKILL.md +92 -0
  294. package/.pi/skills/zob-compute-profile/SKILL.md +108 -0
  295. package/.pi/skills/zob-coms-safety/SKILL.md +54 -0
  296. package/.pi/skills/zob-coms-v2-live/SKILL.md +47 -0
  297. package/.pi/skills/zob-delegation-routing/SKILL.md +82 -0
  298. package/.pi/skills/zob-factory/SKILL.md +28 -0
  299. package/.pi/skills/zob-goal-todo-tree/SKILL.md +279 -0
  300. package/.pi/skills/zob-harness/SKILL.md +68 -0
  301. package/.pi/skills/zob-mission-control-coms/SKILL.md +39 -0
  302. package/.pi/skills/zob-oracle/SKILL.md +21 -0
  303. package/.pi/skills/zob-owner-pool-drill-writer/SKILL.md +244 -0
  304. package/.pi/skills/zob-owner-pool-launcher/SKILL.md +261 -0
  305. package/.pi/skills/zob-project-dna/SKILL.md +275 -0
  306. package/.pi/skills/zob-sandbox/SKILL.md +29 -0
  307. package/.pi/skills/zob-spec/SKILL.md +25 -0
  308. package/.pi/skills/zob-split-refactor/SKILL.md +39 -0
  309. package/.pi/skills/zob-tool-router/SKILL.md +104 -0
  310. package/.pi/teams/zob-core.json +122 -0
  311. package/AGENTS.md +89 -0
  312. package/CONTRIBUTING.md +56 -0
  313. package/LICENSE +21 -0
  314. package/README.md +360 -0
  315. package/SECURITY.md +35 -0
  316. package/SOURCE_INDEX.md +46 -0
  317. package/package.json +135 -0
  318. package/scripts/README.md +57 -0
  319. package/scripts/autonomy/mission-readiness-secret-smoke.mjs +90 -0
  320. package/scripts/compute-profile/plan-workflow.mjs +85 -0
  321. package/scripts/compute-profile/preview.mjs +242 -0
  322. package/scripts/compute-profile/regression-smoke.mjs +38 -0
  323. package/scripts/compute-profile/summarize.mjs +72 -0
  324. package/scripts/compute-profile/validate-policy.mjs +50 -0
  325. package/scripts/compute-profile/validate-preview.mjs +95 -0
  326. package/scripts/compute-profile/validate-workflow.mjs +58 -0
  327. package/scripts/git-ops/commit-policy-smoke.mjs +221 -0
  328. package/scripts/goal-todo/child-goal-ref-smoke.mjs +252 -0
  329. package/scripts/harness-switch/static-smoke.mjs +43 -0
  330. package/scripts/model-catalog/validate-economy.mjs +223 -0
  331. package/scripts/model-catalog/validate.mjs +199 -0
  332. package/scripts/package-surface/validate-script-refs.mjs +190 -0
  333. package/scripts/path-policy/validate-smoke.mjs +103 -0
  334. package/scripts/project-dna/bench-smoke.mjs +217 -0
  335. package/scripts/project-dna/build-capsules.mjs +207 -0
  336. package/scripts/project-dna/build-sample-spec.mjs +140 -0
  337. package/scripts/project-dna/emit-golden-cases.mjs +75 -0
  338. package/scripts/project-dna/emit-ontology.mjs +75 -0
  339. package/scripts/project-dna/generate-sample.mjs +302 -0
  340. package/scripts/project-dna/oracle-review-smoke.mjs +157 -0
  341. package/scripts/project-dna/plan-workflow.mjs +289 -0
  342. package/scripts/project-dna/query-context.mjs +276 -0
  343. package/scripts/project-dna/query-steward.mjs +149 -0
  344. package/scripts/project-dna/scan.mjs +553 -0
  345. package/scripts/project-dna/validate-5of5.mjs +159 -0
  346. package/scripts/project-dna/validate-golden-cases.mjs +78 -0
  347. package/scripts/project-dna/validate-ontology.mjs +97 -0
  348. package/scripts/project-dna/validate-sample-project.mjs +105 -0
  349. package/scripts/project-dna/validate-scaffold.mjs +383 -0
  350. package/scripts/project-dna/validate-scan-artifacts.mjs +187 -0
  351. package/scripts/project-dna/validate-workflow.mjs +166 -0
  352. package/scripts/start-pi.sh +4 -0
  353. package/scripts/worker-pool/static-smoke.mjs +54 -0
  354. package/scripts/zpeer-local-e2e-smoke.mjs +395 -0
  355. package/scripts/zpeer-static-smoke.mjs +129 -0
  356. package/tsconfig.json +12 -0
@@ -0,0 +1,168 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { sha256 } from "./utils/hashing.js";
3
+ import { resolveRepoPath } from "./utils/paths.js";
4
+ import { isRecord } from "./utils/records.js";
5
+ import { resolveComputeProfile, type ComputeDomain, type ComputeEffectiveProfile, type ComputePreviewInput, type ComputeRequestedProfile } from "./compute-profile.js";
6
+
7
+ export interface ComputeWorkflowShapeInput extends ComputePreviewInput {
8
+ resolutionPath?: string;
9
+ }
10
+
11
+ const PROFILE_LANES: Record<ComputeEffectiveProfile, Array<{ id: string; agent: string; maxWorkers: number; tools: string[]; outputContract: string; validation: string }>> = {
12
+ low: [
13
+ { id: "deterministic_preview", agent: "agent", maxWorkers: 1, tools: ["read", "grep", "find", "ls"], outputContract: "metadata.v1", validation: "narrow" },
14
+ ],
15
+ medium: [
16
+ { id: "deterministic_preview", agent: "agent", maxWorkers: 1, tools: ["read", "grep", "find", "ls"], outputContract: "metadata.v1", validation: "targeted" },
17
+ { id: "targeted_validation", agent: "qa", maxWorkers: 1, tools: ["read", "grep", "find", "ls", "bash"], outputContract: "oracle.v1", validation: "smoke" },
18
+ ],
19
+ high: [
20
+ { id: "architecture", agent: "explore", maxWorkers: 2, tools: ["read", "grep", "find", "ls"], outputContract: "explore.v1", validation: "cited" },
21
+ { id: "implementation", agent: "implementer", maxWorkers: 2, tools: ["read", "grep", "find", "ls"], outputContract: "implement.v1", validation: "full_local" },
22
+ { id: "validation", agent: "oracle", maxWorkers: 1, tools: ["read", "grep", "find", "ls", "bash"], outputContract: "oracle.v1", validation: "required" },
23
+ ],
24
+ xhigh: [
25
+ { id: "architecture", agent: "explore", maxWorkers: 3, tools: ["read", "grep", "find", "ls"], outputContract: "explore.v1", validation: "cited" },
26
+ { id: "safety", agent: "oracle", maxWorkers: 2, tools: ["read", "grep", "find", "ls"], outputContract: "oracle.v1", validation: "adversarial" },
27
+ { id: "implementation", agent: "implementer", maxWorkers: 4, tools: ["read", "grep", "find", "ls"], outputContract: "implement.v1", validation: "full_plus_adversarial" },
28
+ { id: "benchmark", agent: "qa", maxWorkers: 2, tools: ["read", "grep", "find", "ls", "bash"], outputContract: "qa.v1", validation: "suite" },
29
+ ],
30
+ max: [
31
+ { id: "architecture", agent: "explore", maxWorkers: 4, tools: ["read", "grep", "find", "ls"], outputContract: "explore.v1", validation: "cited" },
32
+ { id: "safety", agent: "oracle", maxWorkers: 4, tools: ["read", "grep", "find", "ls"], outputContract: "oracle.v1", validation: "multi_oracle" },
33
+ { id: "implementation", agent: "implementer", maxWorkers: 8, tools: ["read", "grep", "find", "ls"], outputContract: "implement.v1", validation: "exhaustive_within_scope" },
34
+ { id: "benchmark", agent: "qa", maxWorkers: 4, tools: ["read", "grep", "find", "ls", "bash"], outputContract: "qa.v1", validation: "suite_plus_regression" },
35
+ { id: "human_approval_packet", agent: "planner", maxWorkers: 1, tools: ["read", "grep", "find", "ls"], outputContract: "plan.v1", validation: "human_required" },
36
+ ],
37
+ };
38
+
39
+ function readResolution(repoRoot: string, repoPath: string | undefined): Record<string, unknown> | undefined {
40
+ if (!repoPath) return undefined;
41
+ const resolved = resolveRepoPath(repoRoot, repoPath);
42
+ if (resolved.errors.length > 0 || !existsSync(resolved.path)) return undefined;
43
+ const parsed = JSON.parse(readFileSync(resolved.path, "utf8")) as unknown;
44
+ return isRecord(parsed) ? parsed : undefined;
45
+ }
46
+
47
+ function numberFrom(value: unknown, fallback: number): number {
48
+ return typeof value === "number" && Number.isFinite(value) ? value : fallback;
49
+ }
50
+
51
+ export function buildComputeWorkflowShape(repoRoot: string, input: ComputeWorkflowShapeInput = {}): Record<string, unknown> {
52
+ const resolution = readResolution(repoRoot, input.resolutionPath) ?? resolveComputeProfile(repoRoot, input);
53
+ const effectiveProfile = resolution.effectiveProfile as ComputeEffectiveProfile;
54
+ const caps = isRecord(resolution.caps) ? resolution.caps : {};
55
+ const maxParallel = numberFrom(caps.maxParallel, 1);
56
+ const maxDepth = numberFrom(caps.maxDelegationDepth, 0);
57
+ const maxAgents = numberFrom(caps.maxAgents, 1);
58
+ const lanes = (PROFILE_LANES[effectiveProfile] ?? PROFILE_LANES.low).map((lane) => ({
59
+ ...lane,
60
+ maxWorkers: Math.min(lane.maxWorkers, maxAgents, maxParallel),
61
+ parentOwnedDispatch: true,
62
+ childDirectDispatch: false,
63
+ }));
64
+ const highScale = effectiveProfile === "max" || maxAgents > 20;
65
+ const scalePolicy = {
66
+ schema: "zob.adaptive-scale-policy.v1",
67
+ requestedScale: highScale ? "large" : "default",
68
+ maxTotalAgents: maxAgents,
69
+ maxParallelAgents: maxParallel,
70
+ maxAgentsPerWave: Math.max(1, Math.min(maxParallel, maxAgents)),
71
+ maxWaves: Math.max(1, Math.ceil(maxAgents / Math.max(1, Math.min(maxParallel, maxAgents)))),
72
+ requiresBudget: caps.strictBudgetRequired === true,
73
+ requiresScaleApproval: highScale,
74
+ requiresOracleAfterWave: highScale || caps.oracleRequired === true,
75
+ duplicateDetectionRequired: true,
76
+ stalePeerBlocksCompletion: true,
77
+ bodyStored: false,
78
+ promptBodiesStored: false,
79
+ outputBodiesStored: false,
80
+ };
81
+ const modelPolicy = {
82
+ schema: "zob.adaptive-model-policy.v1",
83
+ downgradePolicy: "blocked_for_oracle_security",
84
+ laneAssignments: lanes.map((lane) => ({ laneId: lane.id, agent: lane.agent, outputContract: lane.outputContract, modelClass: lane.agent === "oracle" ? "strong_oracle" : lane.agent === "planner" || lane.id === "architecture" ? "strong_reasoning" : lane.agent === "agent" || lane.agent === "explore" ? "cheap_scout" : "balanced_worker", reasonHash: sha256(JSON.stringify({ laneId: lane.id, agent: lane.agent, outputContract: lane.outputContract })) })),
85
+ bodyStored: false,
86
+ promptBodiesStored: false,
87
+ outputBodiesStored: false,
88
+ };
89
+ const promptPolicy = {
90
+ schema: "zob.adaptive-prompt-policy-hint.v1",
91
+ rootCanWriteDirectly: false,
92
+ rootDirectWriteToolsBlocked: ["bash", "edit", "write"],
93
+ promptStackHashRequired: true,
94
+ bodyStored: false,
95
+ promptBodiesStored: false,
96
+ outputBodiesStored: false,
97
+ };
98
+ const documentationPolicy = {
99
+ schema: "zob.adaptive-documentation-policy-hint.v1",
100
+ required: true,
101
+ rootDocs: ["AGENTS.md", "README.md"],
102
+ layerDocsRequired: true,
103
+ roleDocPacksRequired: true,
104
+ writebackPolicy: "human_approval_required",
105
+ maxDocsPerAgent: 12,
106
+ bodyStored: false,
107
+ promptBodiesStored: false,
108
+ outputBodiesStored: false,
109
+ };
110
+ return {
111
+ schema: "zob.compute-workflow-shape.v1",
112
+ runId: input.runId,
113
+ domain: (resolution.domain as ComputeDomain | undefined) ?? input.domain ?? "generic",
114
+ requestedProfile: (resolution.requestedProfile as ComputeRequestedProfile | undefined) ?? input.requestedProfile ?? "auto",
115
+ effectiveProfile,
116
+ resolutionHash: sha256(JSON.stringify(resolution)),
117
+ resolutionEmbedded: false,
118
+ caps: { maxAgents, maxDelegationDepth: maxDepth, maxParallel, maxIterations: caps.maxIterations, maxDurationMs: caps.maxDurationMs, maxContextTokens: caps.maxContextTokens },
119
+ lanes,
120
+ promptPolicy,
121
+ modelPolicy,
122
+ scalePolicy,
123
+ documentationPolicy,
124
+ validationLevel: caps.validationLevel,
125
+ oraclePolicy: caps.oraclePolicy,
126
+ benchmarkLevel: caps.benchmarkLevel,
127
+ adaptiveDelegationPolicyHint: resolution.adaptiveDelegationPolicyHint,
128
+ parentOwnedDispatch: true,
129
+ childDirectDispatch: false,
130
+ liveDispatchEnabled: false,
131
+ noExecution: true,
132
+ networkAccessed: false,
133
+ sourceProjectModified: false,
134
+ bodyStored: false,
135
+ promptBodiesStored: false,
136
+ outputBodiesStored: false,
137
+ noShip: resolution.noShip === true,
138
+ blockers: Array.isArray(resolution.blockers) ? resolution.blockers : [],
139
+ generatedAt: new Date().toISOString(),
140
+ };
141
+ }
142
+
143
+ export function validateComputeWorkflowShape(shape: unknown): string[] {
144
+ const errors: string[] = [];
145
+ if (!isRecord(shape)) return ["workflow shape must be a JSON object"];
146
+ if (shape.schema !== "zob.compute-workflow-shape.v1") errors.push("workflow shape schema must be zob.compute-workflow-shape.v1");
147
+ if (shape.parentOwnedDispatch !== true) errors.push("workflow shape parentOwnedDispatch must be true");
148
+ if (shape.childDirectDispatch !== false) errors.push("workflow shape childDirectDispatch must be false");
149
+ if (shape.liveDispatchEnabled !== false) errors.push("workflow shape liveDispatchEnabled must be false");
150
+ if (shape.noExecution !== true) errors.push("workflow shape noExecution must be true");
151
+ if (!Array.isArray(shape.lanes) || shape.lanes.length < 1) errors.push("workflow shape requires at least one lane");
152
+ if (!isRecord(shape.promptPolicy) || shape.promptPolicy.rootCanWriteDirectly !== false) errors.push("workflow shape promptPolicy must keep rootCanWriteDirectly=false");
153
+ if (!isRecord(shape.modelPolicy) || shape.modelPolicy.downgradePolicy !== "blocked_for_oracle_security") errors.push("workflow shape modelPolicy must block oracle/security downgrade");
154
+ if (!isRecord(shape.scalePolicy) || shape.scalePolicy.stalePeerBlocksCompletion !== true || shape.scalePolicy.duplicateDetectionRequired !== true) errors.push("workflow shape scalePolicy must require stale and duplicate safeguards");
155
+ if (!isRecord(shape.documentationPolicy) || shape.documentationPolicy.roleDocPacksRequired !== true || shape.documentationPolicy.writebackPolicy !== "human_approval_required") errors.push("workflow shape documentationPolicy must require role doc packs and human-approved writeback");
156
+ if (Array.isArray(shape.lanes)) {
157
+ for (const [index, lane] of shape.lanes.entries()) {
158
+ if (!isRecord(lane)) {
159
+ errors.push(`lane ${index} must be an object`);
160
+ continue;
161
+ }
162
+ if (lane.parentOwnedDispatch !== true) errors.push(`lane ${index} parentOwnedDispatch must be true`);
163
+ if (lane.childDirectDispatch !== false) errors.push(`lane ${index} childDirectDispatch must be false`);
164
+ if (!Array.isArray(lane.tools)) errors.push(`lane ${index} tools must be an array`);
165
+ }
166
+ }
167
+ return errors;
168
+ }
@@ -0,0 +1,16 @@
1
+ # ZOB Coms v2 module instructions
2
+
3
+ Scope: observe-only/live communication runtime primitives for ZOB.
4
+
5
+ MUST DO:
6
+ - Preserve hash-only ledger semantics.
7
+ - Keep persisted records metadata-only and body-free.
8
+ - Keep transport dispatch disabled unless an explicit later phase enables it.
9
+ - Prefer additive compatibility with existing `zob_coms_*` tools.
10
+ - Treat stale/offline peers as blockers, never completion evidence.
11
+
12
+ MUST NOT:
13
+ - Do not persist raw prompt, task, output, content, text, rationale, diff, or patch bodies.
14
+ - Do not introduce worker-to-worker free chat.
15
+ - Do not enable network transport without auth/locality policy.
16
+ - Do not make append-only ledger writes count as live delivery.
@@ -0,0 +1,121 @@
1
+ import { sha256 } from "../utils/hashing.js";
2
+ import { isRecord } from "../utils/records.js";
3
+
4
+ const FORBIDDEN_PERSISTED_KEYS = new Set(["body", "task", "prompt", "output", "content", "message", "rationale", "text", "diff", "patch"]);
5
+ const ENVELOPE_TYPES = new Set(["ping", "pong", "prompt", "ack", "response", "error"]);
6
+
7
+ export type ZobLiveEnvelopeType = "ping" | "pong" | "prompt" | "ack" | "response" | "error";
8
+
9
+ export interface ZobLiveEnvelope {
10
+ schema: "zob.live-envelope.v1";
11
+ type: ZobLiveEnvelopeType;
12
+ msgId: string;
13
+ runId?: string;
14
+ sender?: string;
15
+ receiver?: string;
16
+ team?: string;
17
+ hops: number;
18
+ taskHash?: string;
19
+ contextHash?: string;
20
+ outputHash?: string;
21
+ artifactRefs?: string[];
22
+ artifactHashes?: string[];
23
+ replyEndpoint?: string;
24
+ replyEndpointHash?: string;
25
+ transientPrompt?: string;
26
+ transientResponse?: string;
27
+ errorCode?: string;
28
+ errorHash?: string;
29
+ timestamp: string;
30
+ bodyStored: false;
31
+ }
32
+
33
+ function hasForbiddenExactKey(value: unknown): boolean {
34
+ if (!value || typeof value !== "object") return false;
35
+ if (Array.isArray(value)) return value.some(hasForbiddenExactKey);
36
+ return Object.entries(value).some(([key, child]) => FORBIDDEN_PERSISTED_KEYS.has(key) || hasForbiddenExactKey(child));
37
+ }
38
+
39
+ function isStringArray(value: unknown): value is string[] {
40
+ return Array.isArray(value) && value.every((item) => typeof item === "string");
41
+ }
42
+
43
+ export function buildZobLiveEnvelope(input: Omit<ZobLiveEnvelope, "schema" | "timestamp" | "bodyStored" | "hops"> & { hops?: number }): ZobLiveEnvelope {
44
+ return {
45
+ schema: "zob.live-envelope.v1",
46
+ hops: input.hops ?? 0,
47
+ timestamp: new Date().toISOString(),
48
+ bodyStored: false,
49
+ ...input,
50
+ };
51
+ }
52
+
53
+ export function buildZobLiveAckEnvelope(request: ZobLiveEnvelope): ZobLiveEnvelope {
54
+ return buildZobLiveEnvelope({
55
+ type: "ack",
56
+ msgId: request.msgId,
57
+ runId: request.runId,
58
+ sender: request.receiver,
59
+ receiver: request.sender,
60
+ team: request.team,
61
+ hops: request.hops,
62
+ taskHash: request.taskHash,
63
+ });
64
+ }
65
+
66
+ export function buildZobLivePongEnvelope(request: ZobLiveEnvelope): ZobLiveEnvelope {
67
+ return buildZobLiveEnvelope({
68
+ type: "pong",
69
+ msgId: request.msgId,
70
+ runId: request.runId,
71
+ sender: request.receiver,
72
+ receiver: request.sender,
73
+ team: request.team,
74
+ hops: request.hops,
75
+ });
76
+ }
77
+
78
+ export function buildZobLiveErrorEnvelope(request: Partial<ZobLiveEnvelope>, error: string, code = "transport_error"): ZobLiveEnvelope {
79
+ return buildZobLiveEnvelope({
80
+ type: "error",
81
+ msgId: typeof request.msgId === "string" ? request.msgId : `error-${Date.now()}`,
82
+ runId: request.runId,
83
+ sender: request.receiver,
84
+ receiver: request.sender,
85
+ team: request.team,
86
+ hops: typeof request.hops === "number" ? request.hops : 0,
87
+ errorCode: code,
88
+ errorHash: sha256(error),
89
+ });
90
+ }
91
+
92
+ export function validateZobLiveEnvelope(value: unknown): string[] {
93
+ const errors: string[] = [];
94
+ if (!isRecord(value)) return ["ZOB live envelope must be an object"];
95
+ if (value.schema !== "zob.live-envelope.v1") errors.push("ZOB live envelope schema must be zob.live-envelope.v1");
96
+ if (typeof value.type !== "string" || !ENVELOPE_TYPES.has(value.type)) errors.push("ZOB live envelope type is invalid");
97
+ if (typeof value.msgId !== "string" || value.msgId.trim().length === 0) errors.push("ZOB live envelope requires msgId");
98
+ if (typeof value.hops !== "number" || !Number.isFinite(value.hops) || value.hops < 0 || value.hops > 5) errors.push("ZOB live envelope hops must be 0..5");
99
+ if (value.bodyStored !== false) errors.push("ZOB live envelope bodyStored must be false");
100
+ if (typeof value.timestamp !== "string") errors.push("ZOB live envelope requires timestamp");
101
+ if (hasForbiddenExactKey(value)) errors.push("ZOB live envelope must not use persisted raw-body key names");
102
+ if (value.artifactRefs !== undefined && !isStringArray(value.artifactRefs)) errors.push("ZOB live envelope artifactRefs must be string[] when provided");
103
+ if (value.artifactHashes !== undefined && !isStringArray(value.artifactHashes)) errors.push("ZOB live envelope artifactHashes must be string[] when provided");
104
+ if (value.type === "prompt") {
105
+ if (typeof value.sender !== "string" || typeof value.receiver !== "string") errors.push("ZOB live prompt envelope requires sender and receiver");
106
+ if (typeof value.taskHash !== "string") errors.push("ZOB live prompt envelope requires taskHash");
107
+ if (typeof value.transientPrompt !== "string" || value.transientPrompt.length === 0) errors.push("ZOB live prompt envelope requires transientPrompt");
108
+ }
109
+ if (value.type === "response" && typeof value.outputHash !== "string" && typeof value.transientResponse !== "string") errors.push("ZOB live response envelope requires outputHash or transientResponse");
110
+ return errors;
111
+ }
112
+
113
+ export function parseZobLiveEnvelopeLine(line: string): { envelope?: ZobLiveEnvelope; errors: string[] } {
114
+ try {
115
+ const parsed = JSON.parse(line) as unknown;
116
+ const errors = validateZobLiveEnvelope(parsed);
117
+ return errors.length === 0 ? { envelope: parsed as ZobLiveEnvelope, errors } : { errors };
118
+ } catch (error) {
119
+ return { errors: [`Could not parse ZOB live envelope: ${error instanceof Error ? error.message : String(error)}`] };
120
+ }
121
+ }
@@ -0,0 +1,53 @@
1
+ import { basename } from "node:path";
2
+
3
+ import type { TeamDefinition, TeamLead, TeamWorker } from "../types.js";
4
+ import { sha256 } from "../utils/hashing.js";
5
+ import { safeFileStem } from "../utils/paths.js";
6
+ import type { ZobComsV2Policy, ZobLivePeerCard, ZobLiveRoleType } from "./types.js";
7
+
8
+ const PROCESS_STARTED_AT = new Date().toISOString();
9
+ const PROCESS_SESSION_ID = safeFileStem(process.env.ZOB_COMS_SESSION_ID ?? `session-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`);
10
+
11
+ export function buildZobComsProjectId(repoRoot: string): string {
12
+ return safeFileStem(`${basename(repoRoot)}-${sha256(repoRoot).slice(0, 12)}`);
13
+ }
14
+
15
+ function roleFromTeam(definition: TeamDefinition, requestedRoleId: string): { roleId: string; roleType: ZobLiveRoleType; leadId?: string; agent: string } {
16
+ if (definition.orchestrator.id === requestedRoleId) return { roleId: definition.orchestrator.id, roleType: "orchestrator", agent: definition.orchestrator.agent };
17
+ const lead = definition.leads.find((candidate: TeamLead) => candidate.id === requestedRoleId);
18
+ if (lead) return { roleId: lead.id, roleType: "lead", agent: lead.agent };
19
+ const worker = definition.workers.find((candidate: TeamWorker) => candidate.id === requestedRoleId);
20
+ if (worker) return { roleId: worker.id, roleType: "worker", leadId: worker.leadId, agent: worker.agent };
21
+ return { roleId: definition.orchestrator.id, roleType: "orchestrator", agent: definition.orchestrator.agent };
22
+ }
23
+
24
+ export function buildCurrentZobLivePeerCard(repoRoot: string, definition: TeamDefinition, policy: ZobComsV2Policy): ZobLivePeerCard {
25
+ const requestedRoleId = process.env.ZOB_COMS_ROLE_ID ?? definition.orchestrator.id;
26
+ const role = roleFromTeam(definition, requestedRoleId);
27
+ const sessionId = PROCESS_SESSION_ID;
28
+ const endpoint = policy.mode === "observe_only" ? "observe-only" : `pending-${policy.mode}`;
29
+ return {
30
+ schema: "zob.live-peer-card.v1",
31
+ projectId: buildZobComsProjectId(repoRoot),
32
+ team: definition.name,
33
+ roleId: role.roleId,
34
+ roleType: role.roleType,
35
+ leadId: role.leadId,
36
+ agent: role.agent,
37
+ sessionId,
38
+ sessionHash: sha256(sessionId),
39
+ transport: policy.mode === "required_network" ? "sse" : policy.mode === "required_local" ? "local_socket" : "observe_only",
40
+ endpoint,
41
+ endpointHash: sha256(endpoint),
42
+ cwdHash: sha256(repoRoot),
43
+ pid: typeof process.pid === "number" ? process.pid : undefined,
44
+ startedAt: PROCESS_STARTED_AT,
45
+ heartbeatAt: new Date().toISOString(),
46
+ contextUsedPct: 0,
47
+ queueDepth: 0,
48
+ status: policy.mode === "off" ? "offline" : "online",
49
+ staleAfterMs: policy.heartbeat.staleAfterMs,
50
+ offlineAfterMs: policy.heartbeat.offlineAfterMs,
51
+ bodyStored: false,
52
+ };
53
+ }
@@ -0,0 +1,67 @@
1
+ import type { TeamDefinition } from "../types.js";
2
+ import { appendZobComsMessage, replyZobComsMessage, transitionZobComsStatus } from "../topology/coms.js";
3
+ import type { ZobLiveEnvelope } from "./envelope.js";
4
+
5
+ export function appendLiveSendRequestedRef(repoRoot: string, definition: TeamDefinition, envelope: ZobLiveEnvelope): Record<string, unknown> {
6
+ return appendZobComsMessage(repoRoot, definition, {
7
+ runId: envelope.runId ?? "unknown-run",
8
+ sender: envelope.sender ?? definition.orchestrator.id,
9
+ receiver: envelope.receiver ?? definition.orchestrator.id,
10
+ kind: "live_handoff_ref",
11
+ taskId: envelope.msgId,
12
+ taskHash: envelope.taskHash,
13
+ status: "send_requested",
14
+ ack: "not_sent",
15
+ metadata: {
16
+ schema: "zob.coms-live-ref.v1",
17
+ transport: "local_socket",
18
+ liveDelivery: "send_requested",
19
+ hops: envelope.hops,
20
+ transientBodyTransport: true,
21
+ persistBodies: false,
22
+ artifactRefs: envelope.artifactRefs ?? [],
23
+ artifactHashes: envelope.artifactHashes ?? [],
24
+ captureBodyStored: false,
25
+ },
26
+ });
27
+ }
28
+
29
+ export function appendLiveDeliveredStatus(repoRoot: string, msgId: string, actor: string): Record<string, unknown> {
30
+ return transitionZobComsStatus(repoRoot, msgId, actor, "delivered");
31
+ }
32
+
33
+ export function appendLiveRunningStatus(repoRoot: string, msgId: string, actor: string): Record<string, unknown> {
34
+ return transitionZobComsStatus(repoRoot, msgId, actor, "running");
35
+ }
36
+
37
+ export function appendLiveCompletedRef(repoRoot: string, definition: TeamDefinition, parentMsgId: string, envelope: ZobLiveEnvelope): Record<string, unknown> {
38
+ return replyZobComsMessage(repoRoot, definition, parentMsgId, {
39
+ sender: envelope.sender ?? definition.orchestrator.id,
40
+ receiver: envelope.receiver ?? definition.orchestrator.id,
41
+ kind: "live_response_ref",
42
+ taskId: `${envelope.msgId}:response`,
43
+ taskHash: envelope.taskHash,
44
+ outputHash: envelope.outputHash ?? null,
45
+ status: "completed",
46
+ ack: "received",
47
+ metadata: {
48
+ schema: "zob.coms-live-ref.v1",
49
+ transport: "local_socket",
50
+ liveDelivery: "completed",
51
+ hops: envelope.hops,
52
+ transientBodyTransport: true,
53
+ persistBodies: false,
54
+ artifactRefs: envelope.artifactRefs ?? [],
55
+ artifactHashes: envelope.artifactHashes ?? [],
56
+ captureBodyStored: false,
57
+ },
58
+ });
59
+ }
60
+
61
+ export function appendLiveErrorStatus(repoRoot: string, msgId: string, actor: string): Record<string, unknown> {
62
+ return transitionZobComsStatus(repoRoot, msgId, actor, "error");
63
+ }
64
+
65
+ export function appendPeerStaleStatus(repoRoot: string, msgId: string, actor: string): Record<string, unknown> {
66
+ return transitionZobComsStatus(repoRoot, msgId, actor, "stale_blocked");
67
+ }
@@ -0,0 +1,147 @@
1
+ import { existsSync, mkdirSync, unlinkSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import { dirname, join } from "node:path";
4
+ import { createConnection, createServer, type Server, type Socket } from "node:net";
5
+
6
+ import { safeFileStem } from "../utils/paths.js";
7
+ import { buildZobLiveErrorEnvelope, parseZobLiveEnvelopeLine, validateZobLiveEnvelope, type ZobLiveEnvelope } from "./envelope.js";
8
+
9
+ export interface ZobLocalTransportServer {
10
+ endpoint: string;
11
+ close(): Promise<void>;
12
+ }
13
+
14
+ export interface ZobLocalTransportOptions {
15
+ timeoutMs?: number;
16
+ maxLineBytes?: number;
17
+ }
18
+
19
+ export type ZobLocalEnvelopeHandler = (envelope: ZobLiveEnvelope) => Promise<ZobLiveEnvelope> | ZobLiveEnvelope;
20
+
21
+ const DEFAULT_TIMEOUT_MS = 5_000;
22
+ const DEFAULT_MAX_LINE_BYTES = 256 * 1024;
23
+
24
+ export function makeZobLocalEndpoint(sessionId: string): string {
25
+ return join(tmpdir(), "zob-coms-v2", `${safeFileStem(sessionId)}.sock`);
26
+ }
27
+
28
+ function safeUnlinkSocket(endpoint: string): void {
29
+ if (!endpoint.endsWith(".sock") || !existsSync(endpoint)) return;
30
+ unlinkSync(endpoint);
31
+ }
32
+
33
+ function boundedTimeout(value: number | undefined): number {
34
+ return Math.max(25, Math.min(30_000, Math.floor(value ?? DEFAULT_TIMEOUT_MS)));
35
+ }
36
+
37
+ function boundedMaxLineBytes(value: number | undefined): number {
38
+ return Math.max(1024, Math.min(1024 * 1024, Math.floor(value ?? DEFAULT_MAX_LINE_BYTES)));
39
+ }
40
+
41
+ async function writeEnvelope(socket: Socket, envelope: ZobLiveEnvelope): Promise<void> {
42
+ await new Promise<void>((resolve, reject) => {
43
+ socket.write(`${JSON.stringify(envelope)}\n`, "utf8", (error) => error ? reject(error) : resolve());
44
+ });
45
+ }
46
+
47
+ export async function bindZobLocalEndpoint(endpoint: string, handler: ZobLocalEnvelopeHandler, options: ZobLocalTransportOptions = {}): Promise<ZobLocalTransportServer> {
48
+ mkdirSync(dirname(endpoint), { recursive: true });
49
+ safeUnlinkSocket(endpoint);
50
+ const maxLineBytes = boundedMaxLineBytes(options.maxLineBytes);
51
+ const server = createServer((socket) => {
52
+ let buffer = "";
53
+ socket.setEncoding("utf8");
54
+ socket.on("data", async (chunk) => {
55
+ buffer += chunk;
56
+ if (Buffer.byteLength(buffer, "utf8") > maxLineBytes) {
57
+ await writeEnvelope(socket, buildZobLiveErrorEnvelope({}, "max line bytes exceeded", "max_line_bytes"));
58
+ socket.end();
59
+ return;
60
+ }
61
+ const newlineIndex = buffer.indexOf("\n");
62
+ if (newlineIndex < 0) return;
63
+ const line = buffer.slice(0, newlineIndex).trim();
64
+ buffer = buffer.slice(newlineIndex + 1);
65
+ const parsed = parseZobLiveEnvelopeLine(line);
66
+ if (!parsed.envelope) {
67
+ await writeEnvelope(socket, buildZobLiveErrorEnvelope({}, parsed.errors.join("; "), "invalid_envelope"));
68
+ socket.end();
69
+ return;
70
+ }
71
+ try {
72
+ const response = await handler(parsed.envelope);
73
+ const responseErrors = validateZobLiveEnvelope(response);
74
+ await writeEnvelope(socket, responseErrors.length === 0 ? response : buildZobLiveErrorEnvelope(parsed.envelope, responseErrors.join("; "), "invalid_response"));
75
+ } catch (error) {
76
+ await writeEnvelope(socket, buildZobLiveErrorEnvelope(parsed.envelope, error instanceof Error ? error.message : String(error), "handler_error"));
77
+ } finally {
78
+ socket.end();
79
+ }
80
+ });
81
+ });
82
+ await new Promise<void>((resolve, reject) => {
83
+ server.once("error", reject);
84
+ server.listen(endpoint, () => {
85
+ server.off("error", reject);
86
+ resolve();
87
+ });
88
+ });
89
+ return {
90
+ endpoint,
91
+ async close() {
92
+ await new Promise<void>((resolve, reject) => server.close((error) => error ? reject(error) : resolve()));
93
+ safeUnlinkSocket(endpoint);
94
+ },
95
+ };
96
+ }
97
+
98
+ export async function sendZobLocalEnvelope(endpoint: string, envelope: ZobLiveEnvelope, options: ZobLocalTransportOptions = {}): Promise<ZobLiveEnvelope> {
99
+ const requestErrors = validateZobLiveEnvelope(envelope);
100
+ if (requestErrors.length > 0) throw new Error(requestErrors.join("; "));
101
+ const timeoutMs = boundedTimeout(options.timeoutMs);
102
+ const maxLineBytes = boundedMaxLineBytes(options.maxLineBytes);
103
+ return await new Promise<ZobLiveEnvelope>((resolve, reject) => {
104
+ const socket = createConnection(endpoint);
105
+ let buffer = "";
106
+ const timeout = setTimeout(() => {
107
+ socket.destroy();
108
+ reject(new Error(`ZOB local transport timeout after ${timeoutMs}ms`));
109
+ }, timeoutMs);
110
+ const finish = (fn: () => void): void => {
111
+ clearTimeout(timeout);
112
+ socket.removeAllListeners();
113
+ fn();
114
+ };
115
+ socket.setEncoding("utf8");
116
+ socket.on("connect", () => {
117
+ socket.write(`${JSON.stringify(envelope)}\n`, "utf8");
118
+ });
119
+ socket.on("data", (chunk) => {
120
+ buffer += chunk;
121
+ if (Buffer.byteLength(buffer, "utf8") > maxLineBytes) {
122
+ finish(() => reject(new Error("ZOB local transport response exceeded max line bytes")));
123
+ socket.destroy();
124
+ return;
125
+ }
126
+ const newlineIndex = buffer.indexOf("\n");
127
+ if (newlineIndex < 0) return;
128
+ const parsed = parseZobLiveEnvelopeLine(buffer.slice(0, newlineIndex).trim());
129
+ finish(() => parsed.envelope ? resolve(parsed.envelope) : reject(new Error(parsed.errors.join("; "))));
130
+ socket.end();
131
+ });
132
+ socket.on("error", (error) => finish(() => reject(error)));
133
+ });
134
+ }
135
+
136
+ export async function pingZobLocalEndpoint(endpoint: string, msgId = `ping-${Date.now()}`): Promise<ZobLiveEnvelope> {
137
+ return sendZobLocalEnvelope(endpoint, {
138
+ schema: "zob.live-envelope.v1",
139
+ type: "ping",
140
+ msgId,
141
+ hops: 0,
142
+ timestamp: new Date().toISOString(),
143
+ bodyStored: false,
144
+ });
145
+ }
146
+
147
+ export { safeUnlinkSocket as pruneZobLocalEndpoint };
@@ -0,0 +1,80 @@
1
+ import type { ZobLiveEnvelope } from "./envelope.js";
2
+
3
+ export interface ZobPendingReplyResult {
4
+ msgId: string;
5
+ status: "completed" | "error" | "timeout";
6
+ envelope?: ZobLiveEnvelope;
7
+ errorHash?: string;
8
+ }
9
+
10
+ interface PendingReply {
11
+ msgId: string;
12
+ createdAt: number;
13
+ resolve: (result: ZobPendingReplyResult) => void;
14
+ timer: ReturnType<typeof setTimeout>;
15
+ }
16
+
17
+ export class ZobPendingReplies {
18
+ private readonly pending = new Map<string, PendingReply>();
19
+ private readonly completed = new Map<string, ZobPendingReplyResult>();
20
+
21
+ wait(msgId: string, timeoutMs: number): Promise<ZobPendingReplyResult> {
22
+ const completed = this.completed.get(msgId);
23
+ if (completed) {
24
+ this.completed.delete(msgId);
25
+ return Promise.resolve(completed);
26
+ }
27
+ const boundedTimeout = Math.max(25, Math.min(30 * 60 * 1000, Math.floor(timeoutMs)));
28
+ this.cancel(msgId);
29
+ return new Promise<ZobPendingReplyResult>((resolve) => {
30
+ const timer = setTimeout(() => {
31
+ this.pending.delete(msgId);
32
+ resolve({ msgId, status: "timeout" });
33
+ }, boundedTimeout);
34
+ timer.unref?.();
35
+ this.pending.set(msgId, { msgId, createdAt: Date.now(), resolve, timer });
36
+ });
37
+ }
38
+
39
+ complete(msgId: string, envelope: ZobLiveEnvelope): boolean {
40
+ const result: ZobPendingReplyResult = { msgId, status: "completed", envelope };
41
+ const item = this.pending.get(msgId);
42
+ if (!item) {
43
+ this.completed.set(msgId, result);
44
+ return false;
45
+ }
46
+ clearTimeout(item.timer);
47
+ this.pending.delete(msgId);
48
+ item.resolve(result);
49
+ return true;
50
+ }
51
+
52
+ fail(msgId: string, errorHash: string): boolean {
53
+ const result: ZobPendingReplyResult = { msgId, status: "error", errorHash };
54
+ const item = this.pending.get(msgId);
55
+ if (!item) {
56
+ this.completed.set(msgId, result);
57
+ return false;
58
+ }
59
+ clearTimeout(item.timer);
60
+ this.pending.delete(msgId);
61
+ item.resolve(result);
62
+ return true;
63
+ }
64
+
65
+ cancel(msgId: string): boolean {
66
+ const item = this.pending.get(msgId);
67
+ if (!item) return false;
68
+ clearTimeout(item.timer);
69
+ this.pending.delete(msgId);
70
+ return true;
71
+ }
72
+
73
+ snapshot(): Array<Record<string, unknown>> {
74
+ const now = Date.now();
75
+ return [
76
+ ...[...this.pending.values()].map((item) => ({ msgId: item.msgId, ageMs: now - item.createdAt, status: "pending", bodyStored: false })),
77
+ ...[...this.completed.values()].map((item) => ({ msgId: item.msgId, status: item.status, bodyStored: false })),
78
+ ];
79
+ }
80
+ }