@quantiya/codevibe-codex-plugin 2.0.6 → 2.0.8

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 (562) hide show
  1. package/README.md +20 -23
  2. package/dist/server.js +21 -21
  3. package/hooks/common.sh +506 -19
  4. package/{bin/codevibe-codex → libexec/companion-launcher} +37 -76
  5. package/node_modules/@quantiya/codevibe-core/README.md +7 -5
  6. package/node_modules/@quantiya/codevibe-core/dist/agy-cli-contract.d.ts +14 -0
  7. package/node_modules/@quantiya/codevibe-core/dist/appsync/appsync-client.d.ts +229 -61
  8. package/node_modules/@quantiya/codevibe-core/dist/appsync/event-throttle.d.ts +33 -0
  9. package/node_modules/@quantiya/codevibe-core/dist/appsync/index.d.ts +3 -2
  10. package/node_modules/@quantiya/codevibe-core/dist/appsync/queries.d.ts +6 -2
  11. package/node_modules/@quantiya/codevibe-core/dist/auth/auth-telemetry.d.ts +26 -0
  12. package/node_modules/@quantiya/codevibe-core/dist/auth/keychain-cli.d.ts +6 -0
  13. package/node_modules/@quantiya/codevibe-core/dist/auth/vendor-key-cli.d.ts +49 -0
  14. package/node_modules/@quantiya/codevibe-core/dist/companion-mode/index.d.ts +50 -22
  15. package/node_modules/@quantiya/codevibe-core/dist/companion-mode/persist-preference.d.ts +1 -5
  16. package/node_modules/@quantiya/codevibe-core/dist/companion-mode/resolve-agent.d.ts +5 -4
  17. package/node_modules/@quantiya/codevibe-core/dist/config/config.d.ts +0 -5
  18. package/node_modules/@quantiya/codevibe-core/dist/credential-broker/__tests__/oauth-refresh.test.d.ts +1 -0
  19. package/node_modules/@quantiya/codevibe-core/dist/credential-broker/__tests__/upstream-result-helpers.d.ts +21 -0
  20. package/node_modules/@quantiya/codevibe-core/dist/credential-broker/broker.d.ts +196 -12
  21. package/node_modules/@quantiya/codevibe-core/dist/credential-broker/chatgpt-config.d.ts +40 -0
  22. package/node_modules/@quantiya/codevibe-core/dist/credential-broker/index.d.ts +4 -1
  23. package/node_modules/@quantiya/codevibe-core/dist/credential-broker/oauth-account-lock.d.ts +150 -0
  24. package/node_modules/@quantiya/codevibe-core/dist/credential-broker/oauth-refresh.d.ts +72 -0
  25. package/node_modules/@quantiya/codevibe-core/dist/credential-broker/types.d.ts +165 -17
  26. package/node_modules/@quantiya/codevibe-core/dist/credential-broker/upstream-client.d.ts +3 -2
  27. package/node_modules/@quantiya/codevibe-core/dist/credential-broker/vendor-key-store.d.ts +32 -1
  28. package/node_modules/@quantiya/codevibe-core/dist/crypto/__tests__/encrypt-for-emit.test.d.ts +1 -0
  29. package/node_modules/@quantiya/codevibe-core/dist/crypto/__tests__/open-prompt-id.test.d.ts +1 -0
  30. package/node_modules/@quantiya/codevibe-core/dist/crypto/encrypt-for-emit.d.ts +39 -0
  31. package/node_modules/@quantiya/codevibe-core/dist/crypto/index.d.ts +3 -0
  32. package/node_modules/@quantiya/codevibe-core/dist/crypto/open-prompt-id.d.ts +36 -0
  33. package/node_modules/@quantiya/codevibe-core/dist/daemon/__tests__/process-guards.test.d.ts +1 -0
  34. package/node_modules/@quantiya/codevibe-core/dist/daemon/index.d.ts +2 -0
  35. package/node_modules/@quantiya/codevibe-core/dist/daemon/process-guards.d.ts +38 -0
  36. package/node_modules/@quantiya/codevibe-core/dist/e1/__tests__/prompt-raise.test.d.ts +1 -0
  37. package/node_modules/@quantiya/codevibe-core/dist/e1/index.d.ts +2 -0
  38. package/node_modules/@quantiya/codevibe-core/dist/e1/prompt-raise.d.ts +65 -0
  39. package/node_modules/@quantiya/codevibe-core/dist/index.d.ts +20 -2
  40. package/node_modules/@quantiya/codevibe-core/dist/index.js +4543 -288
  41. package/node_modules/@quantiya/codevibe-core/dist/keychain/__tests__/keychain-manager.test.d.ts +1 -0
  42. package/node_modules/@quantiya/codevibe-core/dist/keychain/__tests__/keychain-migrate.test.d.ts +1 -0
  43. package/node_modules/@quantiya/codevibe-core/dist/keychain/keychain-backend.d.ts +105 -0
  44. package/node_modules/@quantiya/codevibe-core/dist/keychain/keychain-manager.d.ts +40 -5
  45. package/node_modules/@quantiya/codevibe-core/dist/keychain/keychain-migrate.d.ts +46 -0
  46. package/node_modules/@quantiya/codevibe-core/dist/local-executor/__tests__/anchored-fs.test.d.ts +1 -0
  47. package/node_modules/@quantiya/codevibe-core/dist/local-executor/__tests__/bounded-directory.test.d.ts +1 -0
  48. package/node_modules/@quantiya/codevibe-core/dist/local-executor/__tests__/bounded-output.test.d.ts +1 -0
  49. package/node_modules/@quantiya/codevibe-core/dist/local-executor/__tests__/durable-directory.test.d.ts +1 -0
  50. package/node_modules/@quantiya/codevibe-core/dist/local-executor/__tests__/hosted-class-a-sink.test.d.ts +1 -0
  51. package/node_modules/@quantiya/codevibe-core/dist/local-executor/__tests__/process-identity.test.d.ts +1 -0
  52. package/node_modules/@quantiya/codevibe-core/dist/local-executor/__tests__/process-tree.test.d.ts +1 -0
  53. package/node_modules/@quantiya/codevibe-core/dist/local-executor/__tests__/publication-authority-capability.test.d.ts +1 -0
  54. package/node_modules/@quantiya/codevibe-core/dist/local-executor/__tests__/reviewer-rationale-flag.test.d.ts +1 -0
  55. package/node_modules/@quantiya/codevibe-core/dist/local-executor/__tests__/snapshot-merge.test.d.ts +1 -0
  56. package/node_modules/@quantiya/codevibe-core/dist/local-executor/__tests__/workspace-authority-fixture.d.ts +3 -0
  57. package/node_modules/@quantiya/codevibe-core/dist/local-executor/__tests__/workspace-authority.test.d.ts +1 -0
  58. package/node_modules/@quantiya/codevibe-core/dist/local-executor/__tests__/workspace-materializer.test.d.ts +1 -0
  59. package/node_modules/@quantiya/codevibe-core/dist/local-executor/agentic-disposable-repo.d.ts +23 -6
  60. package/node_modules/@quantiya/codevibe-core/dist/local-executor/agentic-resolve.d.ts +16 -0
  61. package/node_modules/@quantiya/codevibe-core/dist/local-executor/anchored-fs.d.ts +243 -0
  62. package/node_modules/@quantiya/codevibe-core/dist/local-executor/bounded-directory.d.ts +64 -0
  63. package/node_modules/@quantiya/codevibe-core/dist/local-executor/bounded-helper.d.ts +22 -0
  64. package/node_modules/@quantiya/codevibe-core/dist/local-executor/bounded-output.d.ts +11 -0
  65. package/node_modules/@quantiya/codevibe-core/dist/local-executor/class-a-emit.d.ts +13 -1
  66. package/node_modules/@quantiya/codevibe-core/dist/local-executor/class-a-sign.d.ts +15 -0
  67. package/node_modules/@quantiya/codevibe-core/dist/local-executor/durable-directory.d.ts +25 -0
  68. package/node_modules/@quantiya/codevibe-core/dist/local-executor/durable-store.d.ts +217 -25
  69. package/node_modules/@quantiya/codevibe-core/dist/local-executor/group-decision-outcome.d.ts +11 -0
  70. package/node_modules/@quantiya/codevibe-core/dist/local-executor/hosted-class-a-sink.d.ts +27 -0
  71. package/node_modules/@quantiya/codevibe-core/dist/local-executor/implementor-argv.d.ts +89 -7
  72. package/node_modules/@quantiya/codevibe-core/dist/local-executor/index.d.ts +3 -2
  73. package/node_modules/@quantiya/codevibe-core/dist/local-executor/local-executor-impl.d.ts +177 -76
  74. package/node_modules/@quantiya/codevibe-core/dist/local-executor/merge-conflict-resolve.d.ts +19 -0
  75. package/node_modules/@quantiya/codevibe-core/dist/local-executor/process-identity.d.ts +16 -0
  76. package/node_modules/@quantiya/codevibe-core/dist/local-executor/process-tree.d.ts +123 -0
  77. package/node_modules/@quantiya/codevibe-core/dist/local-executor/revert-reconcile.d.ts +16 -0
  78. package/node_modules/@quantiya/codevibe-core/dist/local-executor/revert-runner.d.ts +14 -1
  79. package/node_modules/@quantiya/codevibe-core/dist/local-executor/reviewer-rationale-flag.d.ts +10 -0
  80. package/node_modules/@quantiya/codevibe-core/dist/local-executor/snapshot-merge.d.ts +124 -0
  81. package/node_modules/@quantiya/codevibe-core/dist/local-executor/task-group-types.d.ts +7 -6
  82. package/node_modules/@quantiya/codevibe-core/dist/local-executor/team-execution-flag.d.ts +2 -2
  83. package/node_modules/@quantiya/codevibe-core/dist/local-executor/track-registry.d.ts +2 -0
  84. package/node_modules/@quantiya/codevibe-core/dist/local-executor/types.d.ts +34 -2
  85. package/node_modules/@quantiya/codevibe-core/dist/local-executor/verification-gates/build.d.ts +5 -0
  86. package/node_modules/@quantiya/codevibe-core/dist/local-executor/verification-gates/deploy-preflight.d.ts +2 -0
  87. package/node_modules/@quantiya/codevibe-core/dist/local-executor/verification-gates/diff-sanity.d.ts +12 -0
  88. package/node_modules/@quantiya/codevibe-core/dist/local-executor/verification-gates/hostile-grep.d.ts +2 -0
  89. package/node_modules/@quantiya/codevibe-core/dist/local-executor/verification-gates/lint.d.ts +2 -0
  90. package/node_modules/@quantiya/codevibe-core/dist/local-executor/verification-gates/shell-runner.d.ts +5 -0
  91. package/node_modules/@quantiya/codevibe-core/dist/local-executor/verification-gates/source-traceability.d.ts +2 -0
  92. package/node_modules/@quantiya/codevibe-core/dist/local-executor/verification-gates/tests.d.ts +3 -0
  93. package/node_modules/@quantiya/codevibe-core/dist/local-executor/verification-gates/typecheck.d.ts +3 -0
  94. package/node_modules/@quantiya/codevibe-core/dist/local-executor/verification-runner.d.ts +6 -0
  95. package/node_modules/@quantiya/codevibe-core/dist/local-executor/workspace-authority.d.ts +45 -0
  96. package/node_modules/@quantiya/codevibe-core/dist/local-executor/workspace-materializer.d.ts +27 -0
  97. package/node_modules/@quantiya/codevibe-core/dist/local-executor/workspace-shadow.d.ts +378 -85
  98. package/node_modules/@quantiya/codevibe-core/dist/local-model/manager.d.ts +1 -1
  99. package/node_modules/@quantiya/codevibe-core/dist/local-model/ollama.d.ts +40 -0
  100. package/node_modules/@quantiya/codevibe-core/dist/orchestration/__tests__/detect-agents.test.d.ts +1 -0
  101. package/node_modules/@quantiya/codevibe-core/dist/orchestration/detect-agents.d.ts +10 -30
  102. package/node_modules/@quantiya/codevibe-core/dist/orchestration/index.d.ts +1 -2
  103. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/__tests__/a1a-planner-offers.test.d.ts +1 -0
  104. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/__tests__/a6-cli-surface.test.d.ts +1 -0
  105. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/__tests__/advisory-attachment-journal.test.d.ts +1 -0
  106. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/__tests__/advisory-attachments-dir-race.test.d.ts +1 -0
  107. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/__tests__/advisory-multi-mention-panel.test.d.ts +1 -0
  108. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/__tests__/advisory-panel-attachments.test.d.ts +1 -0
  109. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/__tests__/advisory-quota-stdout-result.test.d.ts +1 -0
  110. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/__tests__/agent-turn-context-batch.test.d.ts +1 -0
  111. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/__tests__/bounded-shutdown.test.d.ts +1 -0
  112. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/__tests__/brainstorm-quorum-wiring.test.d.ts +1 -0
  113. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/__tests__/brainstorm-quorum.test.d.ts +1 -0
  114. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/__tests__/cli-team-session-key.test.d.ts +1 -0
  115. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/__tests__/command-intent.test.d.ts +1 -0
  116. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/__tests__/context-compaction.test.d.ts +1 -0
  117. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/__tests__/context-items-hosted-sync.test.d.ts +1 -0
  118. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/__tests__/context-items-wiring.test.d.ts +1 -0
  119. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/__tests__/context-items.test.d.ts +1 -0
  120. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/__tests__/cp8-full-team-events.test.d.ts +1 -0
  121. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/__tests__/cp8-team-decomposed-zk.test.d.ts +1 -0
  122. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/__tests__/explicit-tty-exit.test.d.ts +1 -0
  123. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/__tests__/mention-suggest.test.d.ts +1 -0
  124. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/__tests__/planner-offer-e1.test.d.ts +1 -0
  125. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/__tests__/route-browse-summarize-recovery.test.d.ts +1 -0
  126. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/__tests__/workspace-shutdown.test.d.ts +1 -0
  127. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/advisory-attachment-journal.d.ts +165 -0
  128. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/attachments.d.ts +53 -8
  129. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/bounded-shutdown.d.ts +22 -0
  130. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/brainstorm-quorum.d.ts +118 -0
  131. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/cli.d.ts +97 -70
  132. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/cli.js +51847 -33465
  133. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/command-intent.d.ts +56 -0
  134. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/components/InputBar.d.ts +6 -0
  135. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/components/OrchestrationApp.d.ts +2 -0
  136. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/context-compaction.d.ts +264 -0
  137. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/context-items-hosted-sync.d.ts +19 -0
  138. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/context-items.d.ts +408 -0
  139. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/context-store.d.ts +162 -0
  140. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/declared-test-runner.d.ts +21 -2
  141. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/emit-shell-event.d.ts +41 -13
  142. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/explicit-tty-exit.d.ts +17 -0
  143. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/gate-decision-submit.d.ts +11 -0
  144. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/gate-prompts.d.ts +78 -3
  145. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/index.d.ts +309 -37
  146. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/mention-suggest.d.ts +11 -0
  147. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/mode-selection.d.ts +4 -22
  148. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/planner-offer-e1.d.ts +97 -0
  149. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/quorum-loop.d.ts +603 -77
  150. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/reducer.d.ts +9 -0
  151. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/task-progress.d.ts +17 -4
  152. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/team-decompose.d.ts +47 -29
  153. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/types.d.ts +103 -6
  154. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/workspace-shutdown.d.ts +27 -0
  155. package/node_modules/@quantiya/codevibe-core/dist/planner/index.d.ts +1 -1
  156. package/node_modules/@quantiya/codevibe-core/dist/planner/local-advisory.d.ts +12 -0
  157. package/node_modules/@quantiya/codevibe-core/dist/planner/local-gemma.d.ts +27 -0
  158. package/node_modules/@quantiya/codevibe-core/dist/planner/types.d.ts +7 -0
  159. package/node_modules/@quantiya/codevibe-core/dist/reviewer/index.d.ts +0 -2
  160. package/node_modules/@quantiya/codevibe-core/dist/reviewer/output-parser.d.ts +19 -0
  161. package/node_modules/@quantiya/codevibe-core/dist/reviewer/provider.d.ts +9 -6
  162. package/node_modules/@quantiya/codevibe-core/dist/reviewer/providers/antigravity.d.ts +2 -3
  163. package/node_modules/@quantiya/codevibe-core/dist/reviewer/registry.d.ts +9 -4
  164. package/node_modules/@quantiya/codevibe-core/dist/reviewer/token-usage.d.ts +10 -0
  165. package/node_modules/@quantiya/codevibe-core/dist/reviewer/types.d.ts +3 -0
  166. package/node_modules/@quantiya/codevibe-core/dist/reviewer/verdict-classifier.d.ts +1 -0
  167. package/node_modules/@quantiya/codevibe-core/dist/session/__tests__/device-registration-lease.test.d.ts +1 -0
  168. package/node_modules/@quantiya/codevibe-core/dist/session/__tests__/pending-session-create.test.d.ts +1 -0
  169. package/node_modules/@quantiya/codevibe-core/dist/session/__tests__/session-rekey-fingerprint.test.d.ts +1 -0
  170. package/node_modules/@quantiya/codevibe-core/dist/session/__tests__/session-resume-key-reconciliation.test.d.ts +1 -0
  171. package/node_modules/@quantiya/codevibe-core/dist/session/__tests__/session-resume-pending-first.test.d.ts +1 -0
  172. package/node_modules/@quantiya/codevibe-core/dist/session/device-key-watcher.d.ts +1 -0
  173. package/node_modules/@quantiya/codevibe-core/dist/session/index.d.ts +4 -2
  174. package/node_modules/@quantiya/codevibe-core/dist/session/pending-session-create.d.ts +61 -0
  175. package/node_modules/@quantiya/codevibe-core/dist/session/register-device-key.d.ts +11 -1
  176. package/node_modules/@quantiya/codevibe-core/dist/session/session-rekey.d.ts +8 -8
  177. package/node_modules/@quantiya/codevibe-core/dist/session/session-resume.d.ts +21 -1
  178. package/node_modules/@quantiya/codevibe-core/dist/substrate/command-runner.d.ts +2 -0
  179. package/node_modules/@quantiya/codevibe-core/dist/substrate/docker.d.ts +14 -32
  180. package/node_modules/@quantiya/codevibe-core/dist/substrate/index.d.ts +0 -1
  181. package/node_modules/@quantiya/codevibe-core/dist/substrate/sandbox-exec.d.ts +17 -16
  182. package/node_modules/@quantiya/codevibe-core/dist/substrate/types.d.ts +39 -5
  183. package/node_modules/@quantiya/codevibe-core/dist/substrate-launch/__tests__/reviewer-credential-preflight.test.d.ts +1 -0
  184. package/node_modules/@quantiya/codevibe-core/dist/substrate-launch/apikey-bootstrap.d.ts +24 -1
  185. package/node_modules/@quantiya/codevibe-core/dist/substrate-launch/engage-substrate.d.ts +20 -0
  186. package/node_modules/@quantiya/codevibe-core/dist/substrate-launch/index.d.ts +2 -0
  187. package/node_modules/@quantiya/codevibe-core/dist/substrate-launch/reviewer-credential-preflight.d.ts +50 -0
  188. package/node_modules/@quantiya/codevibe-core/dist/substrate-launch/sanitized-env.d.ts +5 -5
  189. package/node_modules/@quantiya/codevibe-core/dist/test-publication-authority-setup.d.ts +1 -0
  190. package/node_modules/@quantiya/codevibe-core/dist/tool-activity/__tests__/consolidator.test.d.ts +1 -0
  191. package/node_modules/@quantiya/codevibe-core/dist/tool-activity/__tests__/digest.test.d.ts +1 -0
  192. package/node_modules/@quantiya/codevibe-core/dist/tool-activity/__tests__/flock-rollout-lock.test.d.ts +1 -0
  193. package/node_modules/@quantiya/codevibe-core/dist/tool-activity/__tests__/ledger.test.d.ts +1 -0
  194. package/node_modules/@quantiya/codevibe-core/dist/tool-activity/__tests__/outbox.test.d.ts +1 -0
  195. package/node_modules/@quantiya/codevibe-core/dist/tool-activity/__tests__/replay-cursor.test.d.ts +1 -0
  196. package/node_modules/@quantiya/codevibe-core/dist/tool-activity/__tests__/session-map.test.d.ts +1 -0
  197. package/node_modules/@quantiya/codevibe-core/dist/tool-activity/__tests__/socket-rollout-lock.test.d.ts +1 -0
  198. package/node_modules/@quantiya/codevibe-core/dist/tool-activity/atomic-file.d.ts +27 -0
  199. package/node_modules/@quantiya/codevibe-core/dist/tool-activity/consolidator.d.ts +253 -0
  200. package/node_modules/@quantiya/codevibe-core/dist/tool-activity/digest.d.ts +4 -0
  201. package/node_modules/@quantiya/codevibe-core/dist/tool-activity/flock-rollout-lock.d.ts +68 -0
  202. package/node_modules/@quantiya/codevibe-core/dist/tool-activity/index.d.ts +9 -0
  203. package/node_modules/@quantiya/codevibe-core/dist/tool-activity/ledger.d.ts +274 -0
  204. package/node_modules/@quantiya/codevibe-core/dist/tool-activity/outbox.d.ts +60 -0
  205. package/node_modules/@quantiya/codevibe-core/dist/tool-activity/replay-cursor.d.ts +190 -0
  206. package/node_modules/@quantiya/codevibe-core/dist/tool-activity/session-map.d.ts +133 -0
  207. package/node_modules/@quantiya/codevibe-core/dist/tool-activity/socket-rollout-lock.d.ts +57 -0
  208. package/node_modules/@quantiya/codevibe-core/dist/tool-activity/types.d.ts +368 -0
  209. package/node_modules/@quantiya/codevibe-core/dist/types/encryption.d.ts +9 -0
  210. package/node_modules/@quantiya/codevibe-core/dist/types/events.d.ts +29 -4
  211. package/node_modules/@quantiya/codevibe-core/dist/types/session.d.ts +32 -2
  212. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/README.md +207 -163
  213. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/index.d.ts +15 -0
  214. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/index.js +31 -0
  215. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/max.d.ts +2 -0
  216. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/max.js +3 -0
  217. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/md5.d.ts +4 -0
  218. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/md5.js +13 -0
  219. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/native.d.ts +6 -0
  220. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/native.js +4 -0
  221. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/nil.d.ts +2 -0
  222. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/nil.js +3 -0
  223. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/package.json +1 -0
  224. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/parse.d.ts +2 -0
  225. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/parse.js +11 -0
  226. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/regex.d.ts +2 -0
  227. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/regex.js +3 -0
  228. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/rng.d.ts +1 -0
  229. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/rng.js +13 -0
  230. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/sha1.d.ts +4 -0
  231. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/sha1.js +13 -0
  232. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/stringify.d.ts +3 -0
  233. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/stringify.js +39 -0
  234. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/types.d.ts +21 -0
  235. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/types.js +2 -0
  236. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/uuid-bin.d.ts +1 -0
  237. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/uuid-bin.js +72 -0
  238. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/v1.d.ts +11 -0
  239. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/v1.js +87 -0
  240. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/v1ToV6.d.ts +2 -0
  241. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/v1ToV6.js +13 -0
  242. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/v3.d.ts +9 -0
  243. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/v3.js +14 -0
  244. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/v35.d.ts +7 -0
  245. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/v35.js +44 -0
  246. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/v4.d.ts +4 -0
  247. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/v4.js +29 -0
  248. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/v5.d.ts +9 -0
  249. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/v5.js +14 -0
  250. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/v6.d.ts +4 -0
  251. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/v6.js +22 -0
  252. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/v6ToV1.d.ts +2 -0
  253. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/v6ToV1.js +13 -0
  254. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/v7.d.ts +9 -0
  255. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/v7.js +69 -0
  256. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/validate.d.ts +2 -0
  257. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/validate.js +7 -0
  258. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/version.d.ts +2 -0
  259. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs/version.js +10 -0
  260. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/index.d.ts +15 -0
  261. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/index.js +31 -0
  262. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/max.d.ts +2 -0
  263. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/max.js +3 -0
  264. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/md5.d.ts +2 -0
  265. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/md5.js +137 -0
  266. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/native.d.ts +4 -0
  267. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/native.js +4 -0
  268. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/nil.d.ts +2 -0
  269. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/nil.js +3 -0
  270. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/package.json +1 -0
  271. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/parse.d.ts +2 -0
  272. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/parse.js +11 -0
  273. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/regex.d.ts +2 -0
  274. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/regex.js +3 -0
  275. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/rng.d.ts +1 -0
  276. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/rng.js +14 -0
  277. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/sha1.d.ts +2 -0
  278. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/sha1.js +72 -0
  279. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/stringify.d.ts +3 -0
  280. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/stringify.js +39 -0
  281. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/types.d.ts +21 -0
  282. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/types.js +2 -0
  283. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/uuid-bin.d.ts +1 -0
  284. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/uuid-bin.js +72 -0
  285. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/v1.d.ts +11 -0
  286. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/v1.js +87 -0
  287. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/v1ToV6.d.ts +2 -0
  288. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/v1ToV6.js +13 -0
  289. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/v3.d.ts +9 -0
  290. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/v3.js +14 -0
  291. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/v35.d.ts +7 -0
  292. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/v35.js +44 -0
  293. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/v4.d.ts +4 -0
  294. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/v4.js +29 -0
  295. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/v5.d.ts +9 -0
  296. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/v5.js +14 -0
  297. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/v6.d.ts +4 -0
  298. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/v6.js +22 -0
  299. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/v6ToV1.d.ts +2 -0
  300. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/v6ToV1.js +13 -0
  301. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/v7.d.ts +9 -0
  302. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/v7.js +69 -0
  303. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/validate.d.ts +2 -0
  304. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/validate.js +7 -0
  305. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/version.d.ts +2 -0
  306. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/cjs-browser/version.js +10 -0
  307. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/bin/uuid +2 -0
  308. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/index.d.ts +15 -0
  309. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/{esm-node → esm}/index.js +9 -4
  310. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/max.d.ts +2 -0
  311. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/max.js +1 -0
  312. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/md5.d.ts +4 -0
  313. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/md5.js +11 -0
  314. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/native.d.ts +6 -0
  315. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/native.js +2 -0
  316. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/nil.d.ts +2 -0
  317. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/nil.js +1 -0
  318. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/parse.d.ts +2 -0
  319. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/parse.js +9 -0
  320. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/regex.d.ts +2 -0
  321. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/regex.js +1 -0
  322. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/rng.d.ts +1 -0
  323. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/rng.js +10 -0
  324. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/sha1.d.ts +4 -0
  325. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/sha1.js +11 -0
  326. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/stringify.d.ts +3 -0
  327. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/stringify.js +35 -0
  328. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/types.d.ts +21 -0
  329. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/types.js +1 -0
  330. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/uuid-bin.d.ts +1 -0
  331. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/uuid-bin.js +70 -0
  332. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/v1.d.ts +11 -0
  333. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/v1.js +83 -0
  334. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/v1ToV6.d.ts +2 -0
  335. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/v1ToV6.js +10 -0
  336. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/v3.d.ts +9 -0
  337. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/v3.js +9 -0
  338. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/v35.d.ts +7 -0
  339. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/v35.js +39 -0
  340. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/v4.d.ts +4 -0
  341. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/v4.js +27 -0
  342. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/v5.d.ts +9 -0
  343. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/v5.js +9 -0
  344. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/v6.d.ts +4 -0
  345. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/v6.js +20 -0
  346. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/v6ToV1.d.ts +2 -0
  347. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/v6ToV1.js +10 -0
  348. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/v7.d.ts +9 -0
  349. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/v7.js +65 -0
  350. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/validate.d.ts +2 -0
  351. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/validate.js +5 -0
  352. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/version.d.ts +2 -0
  353. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm/version.js +8 -0
  354. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/index.d.ts +15 -0
  355. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/index.js +9 -4
  356. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/max.d.ts +2 -0
  357. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/max.js +1 -0
  358. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/md5.d.ts +2 -0
  359. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/md5.js +113 -193
  360. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/native.d.ts +4 -0
  361. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/native.js +1 -3
  362. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/nil.d.ts +2 -0
  363. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/nil.js +1 -1
  364. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/parse.d.ts +2 -0
  365. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/parse.js +6 -32
  366. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/regex.d.ts +2 -0
  367. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/regex.js +1 -1
  368. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/rng.d.ts +1 -0
  369. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/rng.js +6 -13
  370. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/sha1.d.ts +2 -0
  371. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/sha1.js +62 -88
  372. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/stringify.d.ts +3 -0
  373. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/stringify.js +27 -25
  374. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/types.d.ts +21 -0
  375. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/types.js +1 -0
  376. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/uuid-bin.d.ts +1 -0
  377. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/uuid-bin.js +70 -0
  378. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/v1.d.ts +11 -0
  379. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/v1.js +78 -90
  380. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/v1ToV6.d.ts +2 -0
  381. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/v1ToV6.js +10 -0
  382. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/v3.d.ts +9 -0
  383. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/v3.js +8 -3
  384. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/v35.d.ts +7 -0
  385. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/v35.js +30 -57
  386. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/v4.d.ts +4 -0
  387. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/v4.js +21 -23
  388. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/v5.d.ts +9 -0
  389. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/v5.js +8 -3
  390. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/v6.d.ts +4 -0
  391. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/v6.js +20 -0
  392. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/v6ToV1.d.ts +2 -0
  393. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/v6ToV1.js +10 -0
  394. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/v7.d.ts +9 -0
  395. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/v7.js +65 -0
  396. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/validate.d.ts +2 -0
  397. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/validate.js +2 -4
  398. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/version.d.ts +2 -0
  399. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-browser/version.js +5 -8
  400. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/package.json +73 -76
  401. package/node_modules/@quantiya/codevibe-core/package.json +7 -6
  402. package/node_modules/fs-ext/.eslintrc +53 -0
  403. package/node_modules/fs-ext/.github/workflows/node.js.yml +31 -0
  404. package/node_modules/fs-ext/.travis.yml +25 -0
  405. package/node_modules/fs-ext/LICENSE.txt +18 -0
  406. package/node_modules/fs-ext/README.md +130 -0
  407. package/node_modules/fs-ext/appveyor.yml +20 -0
  408. package/node_modules/fs-ext/binding.gyp +11 -0
  409. package/node_modules/fs-ext/build/Makefile +347 -0
  410. package/node_modules/fs-ext/build/Release/.deps/Release/fs_ext.node.d +1 -0
  411. package/node_modules/fs-ext/build/Release/.deps/Release/obj.target/fs_ext/fs-ext.o.d +165 -0
  412. package/node_modules/fs-ext/build/Release/fs_ext.node +0 -0
  413. package/node_modules/fs-ext/build/Release/obj.target/fs_ext/fs-ext.o +0 -0
  414. package/node_modules/fs-ext/build/binding.Makefile +6 -0
  415. package/node_modules/fs-ext/build/config.gypi +504 -0
  416. package/node_modules/fs-ext/build/fs_ext.target.mk +183 -0
  417. package/node_modules/fs-ext/build/gyp-mac-tool +768 -0
  418. package/node_modules/fs-ext/example.js +57 -0
  419. package/node_modules/fs-ext/fs-ext.cc +622 -0
  420. package/node_modules/fs-ext/fs-ext.js +131 -0
  421. package/node_modules/fs-ext/package.json +42 -0
  422. package/node_modules/fs-ext/run_tests.js +17 -0
  423. package/node_modules/fs-ext/tests/test-fs-fcntl.js +350 -0
  424. package/node_modules/fs-ext/tests/test-fs-flock.js +452 -0
  425. package/node_modules/fs-ext/tests/test-fs-flock_stress.js +239 -0
  426. package/node_modules/fs-ext/tests/test-fs-seek.js +607 -0
  427. package/node_modules/fs-ext/tests/test-fs-seek_stress.js +313 -0
  428. package/node_modules/fs-ext/tests/test-fs-statvfs.js +15 -0
  429. package/node_modules/fs-ext/tests/worker-test.js +56 -0
  430. package/node_modules/fs-ext/wscript +15 -0
  431. package/node_modules/nan/.github/workflows/ci.yml +46 -0
  432. package/node_modules/nan/.pre-commit-config.yaml +8 -0
  433. package/node_modules/nan/CHANGELOG.md +605 -0
  434. package/node_modules/nan/CMakeLists.txt +138 -0
  435. package/node_modules/nan/LICENSE.md +9 -0
  436. package/node_modules/nan/README.md +457 -0
  437. package/node_modules/nan/doc/asyncworker.md +146 -0
  438. package/node_modules/nan/doc/buffers.md +54 -0
  439. package/node_modules/nan/doc/callback.md +76 -0
  440. package/node_modules/nan/doc/converters.md +41 -0
  441. package/node_modules/nan/doc/errors.md +226 -0
  442. package/node_modules/nan/doc/json.md +62 -0
  443. package/node_modules/nan/doc/maybe_types.md +583 -0
  444. package/node_modules/nan/doc/methods.md +689 -0
  445. package/node_modules/nan/doc/new.md +147 -0
  446. package/node_modules/nan/doc/node_misc.md +123 -0
  447. package/node_modules/nan/doc/object_wrappers.md +263 -0
  448. package/node_modules/nan/doc/persistent.md +296 -0
  449. package/node_modules/nan/doc/scopes.md +73 -0
  450. package/node_modules/nan/doc/script.md +58 -0
  451. package/node_modules/nan/doc/string_bytes.md +81 -0
  452. package/node_modules/nan/doc/v8_internals.md +211 -0
  453. package/node_modules/nan/doc/v8_misc.md +85 -0
  454. package/node_modules/nan/include_dirs.js +1 -0
  455. package/node_modules/nan/nan.h +3202 -0
  456. package/node_modules/nan/nan_callbacks.h +141 -0
  457. package/node_modules/nan/nan_callbacks_12_inl.h +730 -0
  458. package/node_modules/nan/nan_callbacks_pre_12_inl.h +528 -0
  459. package/node_modules/nan/nan_converters.h +72 -0
  460. package/node_modules/nan/nan_converters_43_inl.h +68 -0
  461. package/node_modules/nan/nan_converters_pre_43_inl.h +42 -0
  462. package/node_modules/nan/nan_define_own_property_helper.h +29 -0
  463. package/node_modules/nan/nan_implementation_12_inl.h +446 -0
  464. package/node_modules/nan/nan_implementation_pre_12_inl.h +263 -0
  465. package/node_modules/nan/nan_json.h +166 -0
  466. package/node_modules/nan/nan_maybe_43_inl.h +360 -0
  467. package/node_modules/nan/nan_maybe_pre_43_inl.h +268 -0
  468. package/node_modules/nan/nan_new.h +340 -0
  469. package/node_modules/nan/nan_object_wrap.h +156 -0
  470. package/node_modules/nan/nan_persistent_12_inl.h +132 -0
  471. package/node_modules/nan/nan_persistent_pre_12_inl.h +242 -0
  472. package/node_modules/nan/nan_private.h +73 -0
  473. package/node_modules/nan/nan_scriptorigin.h +97 -0
  474. package/node_modules/nan/nan_string_bytes.h +305 -0
  475. package/node_modules/nan/nan_typedarray_contents.h +96 -0
  476. package/node_modules/nan/nan_weak.h +453 -0
  477. package/node_modules/nan/package.json +38 -0
  478. package/node_modules/nan/tools/1to2.js +412 -0
  479. package/node_modules/nan/tools/README.md +14 -0
  480. package/node_modules/nan/tools/package.json +19 -0
  481. package/package.json +5 -5
  482. package/node_modules/@quantiya/codevibe-core/dist/orchestration/orchestration-cli.d.ts +0 -12
  483. package/node_modules/@quantiya/codevibe-core/dist/orchestration/setup-bootstrap.d.ts +0 -146
  484. package/node_modules/@quantiya/codevibe-core/dist/orchestration/setup-failure-recourse.d.ts +0 -23
  485. package/node_modules/@quantiya/codevibe-core/dist/orchestration/setup-save.d.ts +0 -47
  486. package/node_modules/@quantiya/codevibe-core/dist/orchestration/setup-seat-picker.d.ts +0 -72
  487. package/node_modules/@quantiya/codevibe-core/dist/orchestration/setup-telemetry.d.ts +0 -54
  488. package/node_modules/@quantiya/codevibe-core/dist/orchestration/setup-test-agents.d.ts +0 -108
  489. package/node_modules/@quantiya/codevibe-core/dist/orchestration/setup-types.d.ts +0 -146
  490. package/node_modules/@quantiya/codevibe-core/dist/orchestration/setup-wizard.d.ts +0 -57
  491. package/node_modules/@quantiya/codevibe-core/dist/orchestration-shell/cohort-flag.d.ts +0 -16
  492. package/node_modules/@quantiya/codevibe-core/dist/reviewer/providers/gemini.d.ts +0 -109
  493. package/node_modules/@quantiya/codevibe-core/dist/substrate/git-proxy.d.ts +0 -35
  494. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/CHANGELOG.md +0 -274
  495. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/CONTRIBUTING.md +0 -18
  496. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/bin/uuid +0 -2
  497. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/commonjs-browser/index.js +0 -79
  498. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/commonjs-browser/md5.js +0 -223
  499. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/commonjs-browser/native.js +0 -11
  500. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/commonjs-browser/nil.js +0 -8
  501. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/commonjs-browser/parse.js +0 -45
  502. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/commonjs-browser/regex.js +0 -8
  503. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/commonjs-browser/rng.js +0 -25
  504. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/commonjs-browser/sha1.js +0 -104
  505. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/commonjs-browser/stringify.js +0 -44
  506. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/commonjs-browser/v1.js +0 -107
  507. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/commonjs-browser/v3.js +0 -16
  508. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/commonjs-browser/v35.js +0 -80
  509. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/commonjs-browser/v4.js +0 -43
  510. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/commonjs-browser/v5.js +0 -16
  511. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/commonjs-browser/validate.js +0 -17
  512. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/commonjs-browser/version.js +0 -21
  513. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-node/md5.js +0 -13
  514. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-node/native.js +0 -4
  515. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-node/nil.js +0 -1
  516. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-node/parse.js +0 -35
  517. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-node/regex.js +0 -1
  518. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-node/rng.js +0 -12
  519. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-node/sha1.js +0 -13
  520. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-node/stringify.js +0 -33
  521. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-node/v1.js +0 -95
  522. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-node/v3.js +0 -4
  523. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-node/v35.js +0 -66
  524. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-node/v4.js +0 -29
  525. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-node/v5.js +0 -4
  526. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-node/validate.js +0 -7
  527. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/esm-node/version.js +0 -11
  528. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/index.js +0 -79
  529. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/md5-browser.js +0 -223
  530. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/md5.js +0 -23
  531. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/native-browser.js +0 -11
  532. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/native.js +0 -15
  533. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/nil.js +0 -8
  534. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/parse.js +0 -45
  535. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/regex.js +0 -8
  536. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/rng-browser.js +0 -25
  537. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/rng.js +0 -24
  538. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/sha1-browser.js +0 -104
  539. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/sha1.js +0 -23
  540. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/stringify.js +0 -44
  541. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/uuid-bin.js +0 -85
  542. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/v1.js +0 -107
  543. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/v3.js +0 -16
  544. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/v35.js +0 -80
  545. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/v4.js +0 -43
  546. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/v5.js +0 -16
  547. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/validate.js +0 -17
  548. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/dist/version.js +0 -21
  549. package/node_modules/@quantiya/codevibe-core/node_modules/uuid/wrapper.mjs +0 -10
  550. /package/node_modules/@quantiya/codevibe-core/dist/{companion-mode/__tests__/detect-parallel.test.d.ts → appsync/__tests__/appsync-client-context-items.test.d.ts} +0 -0
  551. /package/node_modules/@quantiya/codevibe-core/dist/{orchestration-shell/__tests__/cli-stub-session-adapter.test.d.ts → appsync/__tests__/heartbeat-active.test.d.ts} +0 -0
  552. /package/node_modules/@quantiya/codevibe-core/dist/{orchestration/__tests__/setup-bootstrap.test.d.ts → appsync/__tests__/orphan-sweep-null-heartbeat.test.d.ts} +0 -0
  553. /package/node_modules/@quantiya/codevibe-core/dist/{orchestration/__tests__/setup-failure-recourse.test.d.ts → appsync/__tests__/refresh-open-prompt-ttl-chunk.test.d.ts} +0 -0
  554. /package/node_modules/@quantiya/codevibe-core/dist/{orchestration/__tests__/setup-save.test.d.ts → auth/__tests__/keychain-cli.test.d.ts} +0 -0
  555. /package/node_modules/@quantiya/codevibe-core/dist/{orchestration/__tests__/setup-seat-picker.test.d.ts → auth/__tests__/vendor-key-cli.test.d.ts} +0 -0
  556. /package/node_modules/@quantiya/codevibe-core/dist/{orchestration/__tests__/setup-telemetry.test.d.ts → companion-mode/__tests__/mode-selected-emit.test.d.ts} +0 -0
  557. /package/node_modules/@quantiya/codevibe-core/dist/{orchestration/__tests__/setup-test-agents.test.d.ts → companion-mode/__tests__/private-launcher-detection.test.d.ts} +0 -0
  558. /package/node_modules/@quantiya/codevibe-core/dist/{orchestration/__tests__/setup-types.test.d.ts → companion-mode/__tests__/private-launcher-path.test.d.ts} +0 -0
  559. /package/node_modules/@quantiya/codevibe-core/dist/{orchestration/__tests__/setup-wizard.test.d.ts → credential-broker/__tests__/broker-c4.test.d.ts} +0 -0
  560. /package/node_modules/@quantiya/codevibe-core/dist/{reviewer/providers/__tests__/gemini-live-smoke.test.d.ts → credential-broker/__tests__/broker-streaming.test.d.ts} +0 -0
  561. /package/node_modules/@quantiya/codevibe-core/dist/{reviewer/providers/__tests__/gemini.test.d.ts → credential-broker/__tests__/chatgpt-config.test.d.ts} +0 -0
  562. /package/node_modules/@quantiya/codevibe-core/dist/{substrate/__tests__/git-proxy.test.d.ts → credential-broker/__tests__/oauth-account-lock.test.d.ts} +0 -0
package/hooks/common.sh CHANGED
@@ -87,40 +87,527 @@ read_json_input() {
87
87
  cat
88
88
  }
89
89
 
90
- send_to_server() {
91
- local endpoint="$1"
92
- local json_data="$2"
90
+ # (#638) Ensure the Codex companion daemon is running for THIS tmux session;
91
+ # echo its port on stdout. The daemon is normally launched by the private
92
+ # libexec/companion-launcher (one `node dist/server.js` per tmux session, keyed on
93
+ # CODEVIBE_CODEX_TMUX_SESSION). When it dies (Mac sleep + network drop → the daemon
94
+ # stops heart-beating and exits), hook POSTs hit a dead port (HTTP 000) or find no
95
+ # port file. This relaunches the daemon with the SAME launch shape the wrapper used
96
+ # — matching its port-file model (${TMPDIR}/codevibe-codex-<tmux>.port) and its env
97
+ # (CODEVIBE_CODEX_TMUX_SESSION + ENVIRONMENT, default production) — clearing any
98
+ # stale port file first, then waits for the fresh port. Echoes the port and returns
99
+ # 0 on success, non-zero on failure.
100
+ # Helper: if the port file exists AND a CODEVIBE-CODEX daemon is listening on that
101
+ # port, echo the port and return 0; else return 1. Codex has no PID mapping the
102
+ # hook can read, so liveness is a GET /health probe — but we REQUIRE the response
103
+ # body to carry the `"service":"codevibe-codex"` marker (#638 finding-2). Matching
104
+ # ANY non-000 code would false-positive on a recycled ephemeral port grabbed by an
105
+ # unrelated local HTTP server (which returns some other body / a 404), making us
106
+ # reuse the wrong port and never relaunch the real daemon. Bounded via --max-time.
107
+ # (#638 G5) True (0) iff PID is still a codevibe-codex daemon process (`ps -o
108
+ # command=` match on node + codevibe-codex + server.js — covers the npm cache path
109
+ # and the dev path). Codex's reap previously had NO identity guard: the launched
110
+ # PID can die between SIGTERM and the SIGKILL escalation (there IS a sleep window)
111
+ # and be recycled to an unrelated process — signaling it blind could kill a foreign
112
+ # process. Mirror of the claude plugin's is_codevibe_daemon.
113
+ is_codevibe_codex_daemon() {
114
+ local pid="$1"
115
+ local cmd
116
+ cmd=$(ps -o command= -p "$pid" 2>/dev/null)
117
+ case "$cmd" in
118
+ *node*codevibe-codex*server.js*) return 0 ;;
119
+ *) return 1 ;;
120
+ esac
121
+ }
93
122
 
94
- local server_url
95
- server_url=$(get_server_url)
96
- if [ -z "$server_url" ]; then
97
- log "ERROR" "No server URL cannot send event"
123
+ # (#638 G5/H2/H3) THE identity-guarded reap: TERM → bounded wait → identity
124
+ # re-check → KILL → settle. Identity (is_codevibe_codex_daemon) is re-verified
125
+ # immediately before EVERY signal — the PID can die after the SIGTERM and be
126
+ # recycled to an unrelated process during the settle poll, so signaling blind
127
+ # could kill a foreign process. Works for BOTH our own background child (`wait`
128
+ # collects its status instantly, closing the PID-reuse window) and a non-child
129
+ # daemon from a prior hook (`wait` is a silent no-op there; the bounded ps-poll
130
+ # provides the settle). Returns 0 when the daemon is provably gone, 1 when the
131
+ # PID was not (or stopped being) our daemon and was left alone.
132
+ _reap_codevibe_codex_daemon_pid() {
133
+ local pid="$1" why="$2"
134
+ [ -n "$pid" ] || return 1
135
+ if ! is_codevibe_codex_daemon "$pid"; then
136
+ log "WARN" "reap($why): pid $pid is not our daemon (recycled/replaced) — not signaling"
137
+ return 1
138
+ fi
139
+ kill "$pid" 2>/dev/null # SIGTERM: let it run its graceful shutdown
140
+ local reap=0
141
+ while [ $reap -lt 10 ] && ps -p "$pid" > /dev/null 2>&1; do
142
+ sleep 0.2
143
+ reap=$((reap + 1))
144
+ done
145
+ if ps -p "$pid" > /dev/null 2>&1; then
146
+ # (#638 G5) Re-verify identity IMMEDIATELY before the KILL escalation.
147
+ if is_codevibe_codex_daemon "$pid"; then
148
+ log "WARN" "reap($why): pid $pid ignored SIGTERM, sending SIGKILL"
149
+ kill -9 "$pid" 2>/dev/null
150
+ # SIGKILL is un-ignorable: collect our own background child promptly (no-op
151
+ # for a non-child), then bound the non-child settle with a short ps-poll.
152
+ wait "$pid" 2>/dev/null
153
+ local settle=0
154
+ while [ $settle -lt 5 ] && ps -p "$pid" > /dev/null 2>&1; do
155
+ sleep 0.1
156
+ settle=$((settle + 1))
157
+ done
158
+ else
159
+ log "WARN" "reap($why): pid $pid is no longer our daemon (recycled/replaced) — NOT sending SIGKILL"
160
+ return 1
161
+ fi
162
+ else
163
+ # (#638 G5) Already exited from SIGTERM — `wait` on our own background child
164
+ # returns its saved status instantly (no blocking) and closes the reuse window.
165
+ wait "$pid" 2>/dev/null
166
+ fi
167
+ return 0
168
+ }
169
+
170
+ # (#638 G3) Owner-crash cleanup for the relaunch lock. Installed as an EXIT trap for
171
+ # the lock-HELD region of ensure_codex_daemon only. ensure_codex_daemon always runs
172
+ # in a command-substitution subshell at its call site (send_to_server's
173
+ # `$(ensure_codex_daemon)`), so the trap scope is that subshell — it never leaks into
174
+ # the sourcing hook script. If the lock owner is interrupted mid-cold-start
175
+ # (TERM/INT/HUP or any abnormal exit), this:
176
+ # (a) (#638 H3) FIRST re-checks whether the child already PUBLISHED its port file
177
+ # in the window between the port-file write and the publish-clear of
178
+ # CODEVIBE_ENSURE_CHILD_PID. A published child is a HEALTHY daemon — do NOT
179
+ # signal it; just clear the marker and release the lock (the port file IS
180
+ # codex's full publication — there is no separate mapping). Pre-H3 the trap
181
+ # TERMed the just-published daemon (and rmdir'd while its shutdown was still
182
+ # async), killing a healthy daemon the next hook then had to relaunch.
183
+ # Safe keying: the launch path `rm -f "$port_file"`s BEFORE spawning, so while
184
+ # CODEVIBE_ENSURE_CHILD_PID is set, an existing port file was written by the child.
185
+ # (b) reaps a genuinely-UNPUBLISHED child via the bounded identity-rechecked
186
+ # TERM→wait→KILL helper (pre-H3 it sent a single bare TERM and released the
187
+ # lock immediately, leaving the child's async shutdown racing the next owner);
188
+ # (c) releases the lock immediately instead of stranding it for the +2min mtime
189
+ # reaper (which stays as the backstop for the untrappable SIGKILL case).
190
+ CODEVIBE_ENSURE_LOCK_DIR=""
191
+ CODEVIBE_ENSURE_CHILD_PID=""
192
+ CODEVIBE_ENSURE_PORT_FILE=""
193
+ _codevibe_ensure_lock_cleanup() {
194
+ if [ -n "$CODEVIBE_ENSURE_CHILD_PID" ]; then
195
+ if [ -n "$CODEVIBE_ENSURE_PORT_FILE" ] && [ -f "$CODEVIBE_ENSURE_PORT_FILE" ]; then
196
+ # (#638 H3) PUBLISHED between port-file write and publish-clear → healthy;
197
+ # do NOT signal. Releasing the lock below finalizes the publication.
198
+ log "WARN" "ensure_codex_daemon: interrupted AFTER child published (pid $CODEVIBE_ENSURE_CHILD_PID, port $(cat "$CODEVIBE_ENSURE_PORT_FILE" 2>/dev/null)) — NOT signaling (#638 H3)"
199
+ else
200
+ log "WARN" "ensure_codex_daemon: interrupted while holding relaunch lock — reaping unpublished child pid $CODEVIBE_ENSURE_CHILD_PID (#638 H3 bounded reap)"
201
+ _reap_codevibe_codex_daemon_pid "$CODEVIBE_ENSURE_CHILD_PID" "owner-trap unpublished child"
202
+ fi
203
+ fi
204
+ if [ -n "$CODEVIBE_ENSURE_LOCK_DIR" ]; then
205
+ rmdir "$CODEVIBE_ENSURE_LOCK_DIR" 2>/dev/null
206
+ fi
207
+ CODEVIBE_ENSURE_LOCK_DIR=""
208
+ CODEVIBE_ENSURE_CHILD_PID=""
209
+ CODEVIBE_ENSURE_PORT_FILE=""
210
+ }
211
+
212
+ _reuse_live_codex_daemon() {
213
+ local port_file="$1" port body
214
+ [ -f "$port_file" ] || return 1
215
+ port=$(cat "$port_file" 2>/dev/null)
216
+ [ -n "$port" ] || return 1
217
+ body=$(curl -s --max-time 2 "http://localhost:${port}/health" 2>/dev/null)
218
+ # (#638 F8) Require a TOP-LEVEL `.service == "codevibe-codex"` parsed with jq, NOT a
219
+ # substring match. A substring match false-positives on a foreign body that merely
220
+ # CONTAINS or NESTS the marker text — e.g. {"data":{"service":"codevibe-codex"}} or a
221
+ # log line quoting it — which would make us reuse an unrelated server's recycled port
222
+ # and never relaunch the real daemon. jq -e exits non-zero on non-JSON / a missing or
223
+ # non-matching top-level field, so a dead port (empty body) and a foreign body both
224
+ # correctly fail closed.
225
+ if echo "$body" | jq -e '.service == "codevibe-codex"' > /dev/null 2>&1; then
226
+ echo "$port"
227
+ return 0
228
+ fi
229
+ return 1
230
+ }
231
+
232
+ # (#638 J1) Echo the pid a live codevibe-codex daemon on <port> reports in its
233
+ # /health body (top-level `.pid`, honored only when the `.service` marker matches
234
+ # — a foreign server lying about `pid` is ignored). One bounded probe. Echoes a
235
+ # validated numeric pid (return 0) or nothing (return 1: dead port / foreign
236
+ # server / marker-less legacy daemon).
237
+ _codex_daemon_pid_on_port() {
238
+ local port="$1" pid
239
+ [ -n "$port" ] || return 1
240
+ pid=$(curl -s --max-time 2 "http://localhost:${port}/health" 2>/dev/null \
241
+ | jq -r 'if .service == "codevibe-codex" then (.pid // empty) else empty end' 2>/dev/null)
242
+ case "$pid" in
243
+ ''|*[!0-9]*) return 1 ;;
244
+ esac
245
+ echo "$pid"
246
+ }
247
+
248
+ # (#638 J1) True (0) iff the reuse candidate that just passed
249
+ # _reuse_live_codex_daemon IS the excluded (wedged) daemon. exclude_port alone is
250
+ # NOT identity: ephemeral ports get recycled, so a concurrent hook's fresh winner
251
+ # can legitimately come up on the SAME port the wedged daemon held — skipping
252
+ # reuse (and then reaping) on a port match alone would kill that healthy winner
253
+ # (it passes is_codevibe_codex_daemon because it IS a codevibe daemon — just a
254
+ # different lifecycle) and break exactly-once launch. So whenever the caller
255
+ # could snapshot the wedged daemon's pid at exclusion time, require the
256
+ # candidate's CURRENT pid (its own /health `.pid`, bounded probe) to match too.
257
+ # With no exclude_pid (the failed daemon's /health was already dead at snapshot
258
+ # time) fall back to port-only — no identity is available; the eventual reap is
259
+ # still is_codevibe-guarded, which bounds the damage to our own daemon class.
260
+ # Usage: _codex_candidate_is_excluded <cand_port> <exclude_port> <exclude_pid>
261
+ _codex_candidate_is_excluded() {
262
+ local cand_port="$1" exclude_port="$2" exclude_pid="$3"
263
+ [ -n "$exclude_port" ] || return 1
264
+ [ "$cand_port" = "$exclude_port" ] || return 1
265
+ [ -n "$exclude_pid" ] || return 0 # port-only fallback (no snapshot identity)
266
+ local cand_pid
267
+ cand_pid=$(_codex_daemon_pid_on_port "$cand_port")
268
+ [ -n "$cand_pid" ] || return 0 # candidate pid unknowable → conservative port-only
269
+ [ "$cand_pid" = "$exclude_pid" ]
270
+ }
271
+
272
+ ensure_codex_daemon() {
273
+ # (#638 H2) Optional: a port KNOWN-BAD for /event delivery (send_to_server's
274
+ # POST timed out / transport-failed against it). The reuse fast path verifies
275
+ # /health only — a daemon can answer /health 200 while its /event pipeline is
276
+ # WEDGED, so without the exclusion the transport-failure retry reused the SAME
277
+ # wedged port and the promised relaunch never happened (recovery dead until
278
+ # the daemon un-wedged). When the reuse candidate's port equals exclude_port
279
+ # we SKIP reuse, take the instance lock, identity-reap that daemon (PID from
280
+ # its own /health body, then is_codevibe_codex_daemon-verified), and launch
281
+ # exactly once. Only send_to_server's transport-failure retry passes this.
282
+ local exclude_port="$1"
283
+ # (#638 J1) Optional: the wedged daemon's pid, SNAPSHOTTED by send_to_server at
284
+ # exclusion time (one bounded /health `.pid` probe right after the POST
285
+ # transport-failed — probing at reap time instead would be the WRONG moment:
286
+ # by then the port may already be a concurrent hook's fresh winner). Port alone
287
+ # is NOT identity — a fresh winner can come up on the SAME recycled ephemeral
288
+ # port — so skip-reuse and the wedged reap fire ONLY when the candidate matches
289
+ # BOTH port AND pid; a same-port/different-pid candidate is a legitimate winner
290
+ # and is REUSED. Empty when the failed daemon's /health was already dead (pid
291
+ # unknowable) → port-only fallback (pre-J1 behavior; reap stays is_codevibe-
292
+ # guarded).
293
+ local exclude_pid="$2"
294
+ local tmux_session="${CODEVIBE_CODEX_TMUX_SESSION:-}"
295
+ if [ -z "$tmux_session" ]; then
296
+ log "ERROR" "ensure_codex_daemon: CODEVIBE_CODEX_TMUX_SESSION unset — cannot relaunch"
98
297
  return 1
99
298
  fi
100
299
 
101
- log "DEBUG" "POST $server_url/$endpoint"
300
+ # Plugin dir = parent of the hooks dir that DEFINES this function (common.sh).
301
+ local hooks_dir plugin_dir
302
+ hooks_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
303
+ plugin_dir="$(cd "$hooks_dir/.." && pwd)"
304
+ if [ ! -f "$plugin_dir/dist/server.js" ]; then
305
+ log "ERROR" "ensure_codex_daemon: $plugin_dir/dist/server.js not found — cannot relaunch"
306
+ return 1
307
+ fi
102
308
 
103
- local response
104
- response=$(curl -s -w "\n%{http_code}" \
105
- -X POST \
106
- -H "Content-Type: application/json" \
107
- -d "$json_data" \
108
- "$server_url/$endpoint" 2>&1)
309
+ local port_file="${CODEVIBE_TMPDIR}/codevibe-codex-${tmux_session}.port"
310
+ # (#638 G3) Lock key VERIFIED against daemon scope: codex's port_file is already
311
+ # per-tmux-INSTANCE (codevibe-codex-<tmux>.port — one daemon per tmux session), so
312
+ # ${port_file}.lock is instance-scoped and matches the daemon being launched. No
313
+ # re-key needed (unlike claude, whose port file is session_id-scoped).
314
+ local lock_dir="${port_file}.lock"
109
315
 
110
- local http_code
111
- http_code=$(echo "$response" | tail -n 1)
316
+ # ── Fast path: reuse a live daemon (no lock needed) ──
317
+ local reuse
318
+ if reuse=$(_reuse_live_codex_daemon "$port_file"); then
319
+ if _codex_candidate_is_excluded "$reuse" "$exclude_port" "$exclude_pid"; then
320
+ # (#638 H2) Health-passing but /event-wedged daemon — do NOT reuse; fall
321
+ # through to the lock so it gets reaped + relaunched.
322
+ # (#638 J1) Only when the candidate matches port AND (when snapshotted) pid
323
+ # — a same-port/different-pid candidate is a fresh winner and reuses above.
324
+ log "WARN" "ensure_codex_daemon: reuse candidate port $reuse is the excluded (wedged) daemon — skipping reuse, will reap + relaunch (#638 H2/J1)"
325
+ else
326
+ log "INFO" "ensure_codex_daemon: reusing live daemon (port $reuse)"
327
+ echo "$reuse"
328
+ return 0
329
+ fi
330
+ fi
331
+
332
+ # ── Serialize the LAUNCH (double-checked locking) ──
333
+ # Two near-simultaneous hooks that both hit a dead port would otherwise BOTH
334
+ # relaunch → two daemons on `app.listen(0)` (duplicate mobile events + double
335
+ # heartbeat, no daemon-side singleton). A mkdir-lock elects ONE launcher; the
336
+ # loser(s) wait briefly and reuse the winner's daemon via the /health probe.
337
+ # Reap a clearly-abandoned lock first. The lock is now held for the FULL cold
338
+ # start (up to ~60s — see the readiness wait below), so the reaper threshold
339
+ # MUST stay strictly above that max hold (>2min ⇒ abandoned) or it could reap a
340
+ # live, slow-starting holder.
341
+ if [ -d "$lock_dir" ] && [ -n "$(find "$lock_dir" -maxdepth 0 -mmin +2 2>/dev/null)" ]; then
342
+ log "WARN" "ensure_codex_daemon: removing stale relaunch lock $lock_dir"
343
+ rmdir "$lock_dir" 2>/dev/null
344
+ fi
112
345
 
113
- if [ "$http_code" = "200" ]; then
114
- log "INFO" "Sent successfully (HTTP $http_code)"
346
+ # Cold-start readiness cap (0.5s units). The elected launcher HOLDS the lock for the
347
+ # whole cold start, up to this cap (see the readiness wait below). Overridable for
348
+ # tests; production default = 120 × 0.5s = 60s.
349
+ local max_wait="${CODEVIBE_DAEMON_MAX_WAIT_UNITS:-120}"
350
+ # (#638 F2) The contender's acquire/reuse-poll bound MUST be ≥ the launcher's max
351
+ # hold, or a slow launch (woken Mac + returning network → a ~60s cold start) makes the
352
+ # contender abandon at ~12s BEFORE the winner has published its port — its last-chance
353
+ # reuse then fails and the hook's event is silently DROPPED. Derive it from the cap
354
+ # (+5s margin) so it always outlasts the launcher and reuses the winner's daemon.
355
+ local contender_wait=$((max_wait + 10))
356
+
357
+ local acquired=0 waited=0
358
+ while [ $waited -lt $contender_wait ]; do # ≥ cold-start cap + margin; no spin
359
+ if mkdir "$lock_dir" 2>/dev/null; then acquired=1; break; fi
360
+ sleep 0.5
361
+ waited=$((waited + 1))
362
+ # (#638 H2) Never hand back the excluded (wedged) daemon from here either.
363
+ # (#638 J1) port+pid match — a same-port fresh winner is reused, not skipped.
364
+ if reuse=$(_reuse_live_codex_daemon "$port_file"); then
365
+ if _codex_candidate_is_excluded "$reuse" "$exclude_port" "$exclude_pid"; then
366
+ continue # wedged candidate — keep waiting for the lock to reap+relaunch
367
+ fi
368
+ log "INFO" "ensure_codex_daemon: reusing daemon launched concurrently (port $reuse)"
369
+ echo "$reuse"
370
+ return 0
371
+ fi
372
+ done
373
+ if [ $acquired -ne 1 ]; then
374
+ # (#638 H2) The excluded (wedged) daemon is never an acceptable last-chance
375
+ # answer. (#638 J1) port+pid match — a same-port fresh winner IS acceptable.
376
+ if reuse=$(_reuse_live_codex_daemon "$port_file") \
377
+ && ! _codex_candidate_is_excluded "$reuse" "$exclude_port" "$exclude_pid"; then
378
+ echo "$reuse"; return 0
379
+ fi
380
+ log "WARN" "ensure_codex_daemon: could not acquire relaunch lock $lock_dir within timeout"
381
+ return 1
382
+ fi
383
+
384
+ # (#638 G3) LOCK IS HELD from here to the release rmdir. Install the owner-crash
385
+ # cleanup so an interrupted owner releases the lock + reaps its unpublished child.
386
+ # Catchable signals route through `exit` (conventional 128+signum codes) so the
387
+ # EXIT trap runs; SIGKILL is untrappable — the +2min mtime reaper is that backstop.
388
+ CODEVIBE_ENSURE_LOCK_DIR="$lock_dir"
389
+ CODEVIBE_ENSURE_CHILD_PID=""
390
+ # (#638 H3) Publication context for the owner-crash trap: while CHILD_PID is
391
+ # set, an EXISTING port file was provably written by the child (the launch path
392
+ # rm -f's it first), so the trap can distinguish published from unpublished and
393
+ # leave a healthy just-published daemon alone.
394
+ CODEVIBE_ENSURE_PORT_FILE="$port_file"
395
+ trap '_codevibe_ensure_lock_cleanup' EXIT
396
+ trap 'exit 129' HUP
397
+ trap 'exit 130' INT
398
+ trap 'exit 143' TERM
399
+
400
+ # ── Double-check UNDER the lock: did a concurrent hook already bring one up? ──
401
+ # (#638 H2) The excluded (wedged) daemon is not "already live" — fall through.
402
+ # (#638 J1) port+pid match — a same-port fresh winner IS "already live": reuse.
403
+ if reuse=$(_reuse_live_codex_daemon "$port_file") \
404
+ && ! _codex_candidate_is_excluded "$reuse" "$exclude_port" "$exclude_pid"; then
405
+ rmdir "$lock_dir" 2>/dev/null
406
+ trap - EXIT HUP INT TERM # (#638 G3) lock released — clear the crash-cleanup trap
407
+ CODEVIBE_ENSURE_LOCK_DIR=""
408
+ CODEVIBE_ENSURE_PORT_FILE=""
409
+ log "INFO" "ensure_codex_daemon: daemon already live under lock (port $reuse)"
410
+ echo "$reuse"
115
411
  return 0
412
+ fi
413
+
414
+ # ── (#638 H2) Reap the WEDGED daemon before relaunching ──
415
+ # We hold the instance lock and the reuse candidate (if any) was the excluded
416
+ # port: a daemon that answers /health but whose /event pipeline is wedged.
417
+ # Leaving it alive would leak an orphan that keeps winning /health-based reuse.
418
+ # Codex has no instance-mapping/pid file the hook can read, so resolve the PID
419
+ # from the daemon's own /health body (top-level `.pid`, only when the marker
420
+ # matches) and identity-reap it (TERM→wait→KILL, G5 discipline) — the command
421
+ # line re-check means a foreign server lying about `pid` is never signaled.
422
+ if [ -n "$exclude_port" ]; then
423
+ local wedged_pid wedged_src
424
+ if [ -n "$exclude_pid" ]; then
425
+ # (#638 J1) Use the pid the CALLER snapshotted right when the POST failed.
426
+ # Probing /health HERE would be the wrong moment: the wedged daemon may
427
+ # have died and a concurrent hook's fresh winner may now hold the SAME
428
+ # recycled port — a reap-time probe would resolve (and reap) the healthy
429
+ # winner. The identity-guarded reap still refuses a dead/foreign pid.
430
+ wedged_pid="$exclude_pid"
431
+ wedged_src="snapshot"
432
+ else
433
+ # (#638 J1) No snapshot (the failed daemon's /health was already dead at
434
+ # exclusion time — pid unknowable): port-only fallback, reap-time probe,
435
+ # pre-J1 behavior. The reap below is still is_codevibe-guarded.
436
+ wedged_pid=$(_codex_daemon_pid_on_port "$exclude_port")
437
+ wedged_src="reap-time /health"
438
+ fi
439
+ case "$wedged_pid" in
440
+ ''|*[!0-9]*)
441
+ log "WARN" "ensure_codex_daemon: excluded port $exclude_port has no discoverable daemon pid (/health absent or foreign) — relaunching without reap (#638 H2)"
442
+ ;;
443
+ *)
444
+ log "WARN" "ensure_codex_daemon: reaping wedged daemon pid $wedged_pid on excluded port $exclude_port (via $wedged_src) before relaunch (#638 H2)"
445
+ _reap_codevibe_codex_daemon_pid "$wedged_pid" "wedged /event on port $exclude_port"
446
+ ;;
447
+ esac
448
+ fi
449
+
450
+ # ── Launch (single cleanup point: rmdir at the end) ──
451
+ # Delete any STALE port file left by a prior dead daemon BEFORE relaunch — the
452
+ # readiness wait below keys off port-file existence, so a leftover would make it
453
+ # read the OLD dead port.
454
+ rm -f "$port_file"
455
+
456
+ log "INFO" "ensure_codex_daemon: relaunching Codex companion daemon (tmux $tmux_session)"
457
+ # Same launch shape as libexec/companion-launcher: cd to plugin dir, exec node so the
458
+ # backgrounded process is the node daemon (PPID=1, detached). The daemon derives
459
+ # its port-file path + tmux target from CODEVIBE_CODEX_TMUX_SESSION.
460
+ (cd "$plugin_dir" && exec env CODEVIBE_CODEX_TMUX_SESSION="$tmux_session" CODEVIBE_CODEX_DAEMON_RECOVERY=1 ENVIRONMENT="${ENVIRONMENT:-production}" node "$plugin_dir/dist/server.js") >> "${CODEVIBE_TMPDIR}/codevibe-codex-mcp.log" 2>&1 &
461
+ local server_pid=$! # capture so we can hold the lock while the daemon cold-starts
462
+ # (#638 G3) Child is launched but UNPUBLISHED (no port yet) — eligible for the
463
+ # owner-crash trap's identity-guarded reap until publish clears this.
464
+ CODEVIBE_ENSURE_CHILD_PID="$server_pid"
465
+
466
+ # HOLD THE LOCK THROUGH THE FULL COLD START. The daemon writes its port file
467
+ # only inside app.listen(), which runs AFTER start() awaits authenticate +
468
+ # registerDeviceEncryptionKey + orphan-sweep (all NETWORK). On the incident
469
+ # (woken Mac, slow/returning network) that can far exceed a few seconds; if we
470
+ # released the lock early a hook firing in the gap would find the port file
471
+ # still absent (we rm'd it) and launch a DUPLICATE. Wait WHILE the daemon PID
472
+ # is alive, up to ~60s, breaking the instant the port appears OR the PID dies
473
+ # (→ auth-fail death: give up immediately; do NOT wait the full cap).
474
+ local waited2=0 # readiness cap is $max_wait (computed above)
475
+ while [ ! -f "$port_file" ] && ps -p "$server_pid" > /dev/null 2>&1 && [ $waited2 -lt $max_wait ]; do
476
+ sleep 0.5
477
+ waited2=$((waited2 + 1))
478
+ done
479
+
480
+ local rc=1 out_port=""
481
+ if [ -f "$port_file" ]; then
482
+ out_port=$(cat "$port_file" 2>/dev/null)
483
+ if [ -n "$out_port" ]; then
484
+ log "INFO" "ensure_codex_daemon: daemon ready on port $out_port"
485
+ # (#638 G3) PUBLISHED — the live daemon is now discoverable; it must never be
486
+ # reaped by the owner-crash trap.
487
+ CODEVIBE_ENSURE_CHILD_PID=""
488
+ rc=0
489
+ fi
490
+ fi
491
+ if [ $rc -ne 0 ]; then
492
+ if ! ps -p "$server_pid" > /dev/null 2>&1; then
493
+ log "ERROR" "ensure_codex_daemon: daemon died on startup (likely auth failure)"
494
+ else
495
+ # (#638 F3) Cold-start cap elapsed and the port never appeared, but the launched
496
+ # PID is STILL ALIVE. Leaving it alive-and-unmapped is the #638 duplicate bug: the
497
+ # next hook's ensure finds no live daemon, relaunches, and now TWO daemons run for
498
+ # one tmux session. A daemon that hasn't bound its port within the cap is not making
499
+ # progress, so TERMINATE + REAP it BEFORE releasing the lock — no orphan survives for
500
+ # a duplicate to race; a clean relaunch on the next ensure is correct.
501
+ # (#638 G5) The old "continuously-alive so identity-safe" claim was WRONG for the
502
+ # KILL escalation: there IS a sleep window between the SIGTERM and the SIGKILL in
503
+ # which the PID can die and be recycled to an unrelated process. The shared reap
504
+ # helper re-verifies identity (is_codevibe_codex_daemon) immediately before EVERY
505
+ # signal — TERM and KILL; a foreign PID is logged + left alone.
506
+ log "WARN" "ensure_codex_daemon: port not bound within cold-start cap; reaping stuck daemon pid $server_pid to avoid an orphan+duplicate"
507
+ _reap_codevibe_codex_daemon_pid "$server_pid" "stuck cold-start (port never bound)"
508
+ CODEVIBE_ENSURE_CHILD_PID="" # reaped (or intentionally left) — trap must not re-signal
509
+ fi
510
+ fi
511
+
512
+ rmdir "$lock_dir" 2>/dev/null # release the launch lock (held for the whole cold start)
513
+ trap - EXIT HUP INT TERM # (#638 G3) lock released — clear the crash-cleanup trap
514
+ CODEVIBE_ENSURE_LOCK_DIR=""
515
+ CODEVIBE_ENSURE_CHILD_PID=""
516
+ CODEVIBE_ENSURE_PORT_FILE=""
517
+ [ $rc -eq 0 ] && echo "$out_port"
518
+ return $rc
519
+ }
520
+
521
+ send_to_server() {
522
+ local endpoint="$1"
523
+ local json_data="$2"
524
+
525
+ local server_url curl_exit http_code response
526
+ server_url=$(get_server_url)
527
+
528
+ if [ -n "$server_url" ]; then
529
+ log "DEBUG" "POST $server_url/$endpoint"
530
+ # (#638 G6) Bounded like the /health probe: a wedged-but-health-passing daemon
531
+ # (accepts TCP, never responds) must not hang the hook indefinitely — hooks
532
+ # block the agent UI. --connect-timeout 2 bounds connection establishment;
533
+ # --max-time 10 bounds the whole POST (generous for a slow-network POST).
534
+ response=$(curl -s --connect-timeout 2 --max-time 10 -w "\n%{http_code}" \
535
+ -X POST \
536
+ -H "Content-Type: application/json" \
537
+ -d "$json_data" \
538
+ "$server_url/$endpoint" 2>&1)
539
+ curl_exit=$?
540
+ http_code=$(echo "$response" | tail -n 1)
541
+ # (#638 G6) Success requires BOTH curl exit 0 AND HTTP 200. A curl timeout
542
+ # (exit 28) can still report a 200 status line if headers arrived before the
543
+ # response wedged — that is a TRANSPORT failure (delivery unconfirmed,
544
+ # eligible for the one relaunch+retry below), not a success or app failure.
545
+ if [ "$curl_exit" -eq 0 ] && [ "$http_code" = "200" ]; then
546
+ log "INFO" "Sent successfully (HTTP $http_code)"
547
+ return 0
548
+ fi
116
549
  else
117
- log "ERROR" "Failed (HTTP $http_code)"
550
+ # No port file at all = dead/absent daemon (the wrapper removes the port file
551
+ # on exit). Treat as a transport failure so the relaunch path below fires.
552
+ curl_exit=1
553
+ http_code="000"
554
+ log "WARN" "No server URL (port file missing) — will attempt daemon relaunch"
555
+ fi
556
+
557
+ # (#638) TRANSPORT failure = curl non-zero OR HTTP 000 (dead daemon / missing
558
+ # port file). Relaunch the daemon ONCE and retry the POST once (one relaunch
559
+ # max, no loops). NOT for app 4xx/5xx — the daemon is alive and rejected the
560
+ # request; relaunching wouldn't help.
561
+ if [ "$curl_exit" -ne 0 ] || [ "$http_code" = "000" ]; then
562
+ log "WARN" "Transport failure to Codex daemon (curl exit ${curl_exit}, HTTP ${http_code}) — relaunching daemon and retrying once"
563
+ # (#638 H2) Pass the port that just transport-failed as the EXCLUDED port so
564
+ # ensure_codex_daemon cannot hand the same wedged daemon back (its /health
565
+ # may still answer 200 while /event is wedged) — it reaps it and launches
566
+ # fresh. Empty when there was no port file at all (nothing to exclude).
567
+ local failed_port=""
568
+ [ -n "$server_url" ] && failed_port="${server_url##*:}"
569
+ # (#638 J1) Snapshot the wedged daemon's IDENTITY (pid) NOW — one bounded
570
+ # /health `.pid` probe right after the transport failure, BEFORE calling
571
+ # ensure (which may wait on the lock while a concurrent hook reaps +
572
+ # relaunches on the SAME recycled port). Passing (port, pid) lets ensure
573
+ # tell THE wedged daemon from that healthy winner. Empty when /health is
574
+ # dead too (daemon fully dead — pid unknowable) → port-only fallback.
575
+ local failed_pid=""
576
+ [ -n "$failed_port" ] && failed_pid=$(_codex_daemon_pid_on_port "$failed_port")
577
+ local new_port retry
578
+ if new_port=$(ensure_codex_daemon "$failed_port" "$failed_pid"); then
579
+ log "INFO" "Relaunched Codex daemon on port $new_port, retrying POST /$endpoint"
580
+ retry=$(curl -s --connect-timeout 2 --max-time 10 -w "\n%{http_code}" \
581
+ -X POST \
582
+ -H "Content-Type: application/json" \
583
+ -d "$json_data" \
584
+ "http://localhost:${new_port}/$endpoint" 2>&1)
585
+ curl_exit=$?
586
+ http_code=$(echo "$retry" | tail -n 1)
587
+ if [ "$curl_exit" -eq 0 ] && [ "$http_code" = "200" ]; then
588
+ log "INFO" "Retry succeeded (HTTP $http_code)"
589
+ return 0
590
+ fi
591
+ log "WARN" "Retry after relaunch failed (curl exit $curl_exit, HTTP $http_code)"
592
+ return 1
593
+ fi
594
+ log "WARN" "Codex daemon relaunch failed; giving up on POST /$endpoint"
118
595
  return 1
119
596
  fi
597
+
598
+ log "ERROR" "Failed (HTTP $http_code)"
599
+ return 1
120
600
  }
121
601
 
122
602
  export CODEVIBE_TMPDIR
123
603
  export -f log
124
604
  export -f get_server_url
125
605
  export -f read_json_input
606
+ export -f is_codevibe_codex_daemon
607
+ export -f _reap_codevibe_codex_daemon_pid
608
+ export -f _codevibe_ensure_lock_cleanup
609
+ export -f _reuse_live_codex_daemon
610
+ export -f _codex_daemon_pid_on_port
611
+ export -f _codex_candidate_is_excluded
612
+ export -f ensure_codex_daemon
126
613
  export -f send_to_server