@goondocks/myco 0.19.6 → 0.20.1

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 (185) hide show
  1. package/dist/{agent-run-WK5NKBYA.js → agent-run-PQXC246Y.js} +8 -8
  2. package/dist/{agent-tasks-2E73GG3A.js → agent-tasks-323BZEBX.js} +8 -8
  3. package/dist/{chunk-VLGBWOBY.js → chunk-22JALAXN.js} +6 -6
  4. package/dist/chunk-22JALAXN.js.map +1 -0
  5. package/dist/{chunk-DURKJTVO.js → chunk-3WOS4TAR.js} +9 -1
  6. package/dist/chunk-3WOS4TAR.js.map +1 -0
  7. package/dist/{chunk-QH5HS54N.js → chunk-3WWJOTYG.js} +3 -3
  8. package/dist/{chunk-Q4QD6LJT.js → chunk-4M7EWPIA.js} +3 -3
  9. package/dist/{chunk-FGKCE5AE.js → chunk-4YFKBL3F.js} +2 -2
  10. package/dist/{chunk-KYH4V4ML.js → chunk-57O67XVF.js} +3 -3
  11. package/dist/{chunk-7ONVLO43.js → chunk-5XIVBO25.js} +2 -2
  12. package/dist/{chunk-W3JUH5S3.js → chunk-63ZGP4Q2.js} +4 -4
  13. package/dist/{chunk-ST2D3SGM.js → chunk-AIYFHQRX.js} +2 -2
  14. package/dist/{chunk-6ZDJXSEO.js → chunk-BPRIYNLE.js} +3 -3
  15. package/dist/chunk-CUDIZJY7.js +36 -0
  16. package/dist/chunk-CUDIZJY7.js.map +1 -0
  17. package/dist/{chunk-WKNAKQKA.js → chunk-DCSGJ7W4.js} +13 -19
  18. package/dist/chunk-DCSGJ7W4.js.map +1 -0
  19. package/dist/{chunk-Q6OEZM3S.js → chunk-EVDQKYCG.js} +237 -10
  20. package/dist/chunk-EVDQKYCG.js.map +1 -0
  21. package/dist/{chunk-P5VNHGVZ.js → chunk-FGY7J6EZ.js} +67 -16
  22. package/dist/chunk-FGY7J6EZ.js.map +1 -0
  23. package/dist/{chunk-I54KLC6H.js → chunk-FLLBJLHM.js} +3 -1
  24. package/dist/{chunk-I54KLC6H.js.map → chunk-FLLBJLHM.js.map} +1 -1
  25. package/dist/{chunk-PMT2LSTQ.js → chunk-FMRZ26U5.js} +2 -2
  26. package/dist/{chunk-3J6TUJSV.js → chunk-KHT24OWC.js} +3 -3
  27. package/dist/{chunk-TMNFCUAD.js → chunk-LZP4IJB3.js} +51 -23
  28. package/dist/chunk-LZP4IJB3.js.map +1 -0
  29. package/dist/{chunk-6DDRJQ4X.js → chunk-MYOZLMB2.js} +2 -2
  30. package/dist/{chunk-UVKQ62II.js → chunk-NGROSFOH.js} +24 -2
  31. package/dist/chunk-NGROSFOH.js.map +1 -0
  32. package/dist/{chunk-FKBPXCH3.js → chunk-QS5TWZBL.js} +4 -4
  33. package/dist/{chunk-NKQZ73LL.js → chunk-SRXTSI25.js} +109 -3
  34. package/dist/chunk-SRXTSI25.js.map +1 -0
  35. package/dist/{chunk-NCBLB2C6.js → chunk-UEWMSIL3.js} +7 -4
  36. package/dist/chunk-UEWMSIL3.js.map +1 -0
  37. package/dist/{chunk-GFR542SM.js → chunk-US4LNCAT.js} +5 -11
  38. package/dist/chunk-US4LNCAT.js.map +1 -0
  39. package/dist/{chunk-44PZCAYS.js → chunk-XL75KZGI.js} +23 -13
  40. package/dist/chunk-XL75KZGI.js.map +1 -0
  41. package/dist/chunk-ZXZPJJN3.js +54 -0
  42. package/dist/chunk-ZXZPJJN3.js.map +1 -0
  43. package/dist/{cli-LCTXK7N6.js → cli-UWBAOHLL.js} +43 -43
  44. package/dist/{client-S47ENM76.js → client-SLDDMSKN.js} +4 -4
  45. package/dist/{config-IO5WALOD.js → config-XPV5GDE4.js} +8 -16
  46. package/dist/config-XPV5GDE4.js.map +1 -0
  47. package/dist/{detect-BEOIHGBC.js → detect-PXNM6TA7.js} +2 -2
  48. package/dist/{detect-providers-2EY55EHK.js → detect-providers-5KOPZ7J2.js} +4 -4
  49. package/dist/{doctor-EE6GAC54.js → doctor-UUUOVDZS.js} +14 -14
  50. package/dist/doctor-UUUOVDZS.js.map +1 -0
  51. package/dist/{executor-NXNSUEMQ.js → executor-J4IBXSBY.js} +21 -22
  52. package/dist/executor-J4IBXSBY.js.map +1 -0
  53. package/dist/{init-IPL3XV6F.js → init-UDH3ZBDD.js} +17 -21
  54. package/dist/init-UDH3ZBDD.js.map +1 -0
  55. package/dist/{installer-WMTB4NCX.js → installer-I6KRGJOO.js} +4 -4
  56. package/dist/{llm-SWDDQQWY.js → llm-TH4NLIRM.js} +4 -4
  57. package/dist/{loader-V774GZU4.js → loader-H7OFASVC.js} +15 -3
  58. package/dist/{loader-AAZ6VUIA.js → loader-TSB5M7FD.js} +3 -3
  59. package/dist/{logs-KNKPQE5A.js → logs-7YVGGBIS.js} +2 -2
  60. package/dist/{main-RPJSS7PT.js → main-E7HU4QYR.js} +842 -249
  61. package/dist/main-E7HU4QYR.js.map +1 -0
  62. package/dist/{open-OYBKVBYX.js → open-4UGDPBKN.js} +8 -8
  63. package/dist/{post-compact-E2OVMNGQ.js → post-compact-BFU3WZSV.js} +9 -8
  64. package/dist/{post-compact-E2OVMNGQ.js.map → post-compact-BFU3WZSV.js.map} +1 -1
  65. package/dist/{post-tool-use-FGQE26GJ.js → post-tool-use-RYHXLCTC.js} +8 -7
  66. package/dist/{post-tool-use-FGQE26GJ.js.map → post-tool-use-RYHXLCTC.js.map} +1 -1
  67. package/dist/{post-tool-use-failure-3CITJYQK.js → post-tool-use-failure-DCVHK2P3.js} +9 -8
  68. package/dist/{post-tool-use-failure-3CITJYQK.js.map → post-tool-use-failure-DCVHK2P3.js.map} +1 -1
  69. package/dist/{pre-compact-GYMHCXII.js → pre-compact-EZZCJ6AG.js} +9 -8
  70. package/dist/{pre-compact-GYMHCXII.js.map → pre-compact-EZZCJ6AG.js.map} +1 -1
  71. package/dist/{provider-check-WCM3SDTM.js → provider-check-43LAMSMH.js} +4 -4
  72. package/dist/{registry-OCM4WAPJ.js → registry-MGJSJBAS.js} +4 -4
  73. package/dist/{remove-72ER3TG5.js → remove-GBBQG3SJ.js} +10 -10
  74. package/dist/{restart-EQHEJCGT.js → restart-RMIGKMA6.js} +9 -9
  75. package/dist/{search-JOBYIW43.js → search-2A5AJVNG.js} +9 -9
  76. package/dist/{server-PZCWYWZL.js → server-TSYZMFFK.js} +40 -27
  77. package/dist/{server-PZCWYWZL.js.map → server-TSYZMFFK.js.map} +1 -1
  78. package/dist/{session-APO4A2C7.js → session-NKREOTEO.js} +9 -10
  79. package/dist/{session-APO4A2C7.js.map → session-NKREOTEO.js.map} +1 -1
  80. package/dist/{session-end-4V4VHAOQ.js → session-end-DQELLTGJ.js} +8 -7
  81. package/dist/{session-end-4V4VHAOQ.js.map → session-end-DQELLTGJ.js.map} +1 -1
  82. package/dist/{session-start-K6ESRZU7.js → session-start-5SUTR5GP.js} +17 -17
  83. package/dist/session-start-5SUTR5GP.js.map +1 -0
  84. package/dist/{setup-llm-QUWOSB7A.js → setup-llm-SLX5764H.js} +10 -9
  85. package/dist/{setup-llm-QUWOSB7A.js.map → setup-llm-SLX5764H.js.map} +1 -1
  86. package/dist/src/cli.js +1 -1
  87. package/dist/src/daemon/main.js +1 -1
  88. package/dist/src/hooks/post-tool-use.js +1 -1
  89. package/dist/src/hooks/session-end.js +1 -1
  90. package/dist/src/hooks/session-start.js +1 -1
  91. package/dist/src/hooks/stop.js +1 -1
  92. package/dist/src/hooks/user-prompt-submit.js +1 -1
  93. package/dist/src/mcp/server.js +1 -1
  94. package/dist/src/symbionts/manifests/codex.yaml +28 -0
  95. package/dist/{stats-TYOZAOP2.js → stats-ARBLNEE3.js} +9 -9
  96. package/dist/{stop-2COOWEYG.js → stop-5AJXBKEE.js} +8 -7
  97. package/dist/{stop-2COOWEYG.js.map → stop-5AJXBKEE.js.map} +1 -1
  98. package/dist/{stop-failure-UQ33GZLE.js → stop-failure-XGKTZPLR.js} +9 -8
  99. package/dist/{stop-failure-UQ33GZLE.js.map → stop-failure-XGKTZPLR.js.map} +1 -1
  100. package/dist/{subagent-start-YENEY6VF.js → subagent-start-2JLIPGJN.js} +9 -8
  101. package/dist/{subagent-start-YENEY6VF.js.map → subagent-start-2JLIPGJN.js.map} +1 -1
  102. package/dist/{subagent-stop-W2757YDB.js → subagent-stop-FV4EOKWZ.js} +9 -8
  103. package/dist/{subagent-stop-W2757YDB.js.map → subagent-stop-FV4EOKWZ.js.map} +1 -1
  104. package/dist/{task-completed-KU6GWMWV.js → task-completed-XJKT366I.js} +9 -8
  105. package/dist/{task-completed-KU6GWMWV.js.map → task-completed-XJKT366I.js.map} +1 -1
  106. package/dist/{team-SNLC6FZM.js → team-3JKF7VAD.js} +5 -5
  107. package/dist/ui/assets/index-C2JuNtRB.css +1 -0
  108. package/dist/ui/assets/index-JLVaQKV2.js +832 -0
  109. package/dist/ui/favicon-dusk.svg +11 -0
  110. package/dist/ui/favicon-moss.svg +11 -0
  111. package/dist/ui/favicon-plum.svg +11 -0
  112. package/dist/ui/favicon-sage.svg +11 -0
  113. package/dist/ui/favicon-slate.svg +11 -0
  114. package/dist/ui/favicon-terracotta.svg +11 -0
  115. package/dist/ui/index.html +3 -3
  116. package/dist/{update-5VYNQZJ4.js → update-XVSAMN4O.js} +10 -10
  117. package/dist/{user-prompt-submit-KATLHAKA.js → user-prompt-submit-TTBTHBBH.js} +9 -8
  118. package/dist/{user-prompt-submit-KATLHAKA.js.map → user-prompt-submit-TTBTHBBH.js.map} +1 -1
  119. package/dist/{verify-BGJVB3K2.js → verify-LMHNEYIP.js} +7 -7
  120. package/dist/verify-LMHNEYIP.js.map +1 -0
  121. package/dist/{version-MKNN5GYM.js → version-HRVSEMUR.js} +2 -2
  122. package/package.json +1 -1
  123. package/skills/myco/SKILL.md +78 -43
  124. package/skills/myco/references/vault-status.md +1 -1
  125. package/dist/chunk-44PZCAYS.js.map +0 -1
  126. package/dist/chunk-5ZT2Q6P5.js +0 -25
  127. package/dist/chunk-5ZT2Q6P5.js.map +0 -1
  128. package/dist/chunk-AULBWINA.js +0 -227
  129. package/dist/chunk-AULBWINA.js.map +0 -1
  130. package/dist/chunk-DURKJTVO.js.map +0 -1
  131. package/dist/chunk-GFR542SM.js.map +0 -1
  132. package/dist/chunk-NCBLB2C6.js.map +0 -1
  133. package/dist/chunk-NKQZ73LL.js.map +0 -1
  134. package/dist/chunk-P5VNHGVZ.js.map +0 -1
  135. package/dist/chunk-Q6OEZM3S.js.map +0 -1
  136. package/dist/chunk-TMNFCUAD.js.map +0 -1
  137. package/dist/chunk-UVKQ62II.js.map +0 -1
  138. package/dist/chunk-VLGBWOBY.js.map +0 -1
  139. package/dist/chunk-VQF5E4ZX.js +0 -91
  140. package/dist/chunk-VQF5E4ZX.js.map +0 -1
  141. package/dist/chunk-WKNAKQKA.js.map +0 -1
  142. package/dist/config-IO5WALOD.js.map +0 -1
  143. package/dist/doctor-EE6GAC54.js.map +0 -1
  144. package/dist/executor-NXNSUEMQ.js.map +0 -1
  145. package/dist/init-IPL3XV6F.js.map +0 -1
  146. package/dist/main-RPJSS7PT.js.map +0 -1
  147. package/dist/resolution-events-PYLSI6QT.js +0 -15
  148. package/dist/session-start-K6ESRZU7.js.map +0 -1
  149. package/dist/ui/assets/index-816yFmz_.js +0 -842
  150. package/dist/ui/assets/index-Dj6vQpFd.css +0 -1
  151. package/dist/verify-BGJVB3K2.js.map +0 -1
  152. package/dist/version-MKNN5GYM.js.map +0 -1
  153. /package/dist/{agent-run-WK5NKBYA.js.map → agent-run-PQXC246Y.js.map} +0 -0
  154. /package/dist/{agent-tasks-2E73GG3A.js.map → agent-tasks-323BZEBX.js.map} +0 -0
  155. /package/dist/{chunk-QH5HS54N.js.map → chunk-3WWJOTYG.js.map} +0 -0
  156. /package/dist/{chunk-Q4QD6LJT.js.map → chunk-4M7EWPIA.js.map} +0 -0
  157. /package/dist/{chunk-FGKCE5AE.js.map → chunk-4YFKBL3F.js.map} +0 -0
  158. /package/dist/{chunk-KYH4V4ML.js.map → chunk-57O67XVF.js.map} +0 -0
  159. /package/dist/{chunk-7ONVLO43.js.map → chunk-5XIVBO25.js.map} +0 -0
  160. /package/dist/{chunk-W3JUH5S3.js.map → chunk-63ZGP4Q2.js.map} +0 -0
  161. /package/dist/{chunk-ST2D3SGM.js.map → chunk-AIYFHQRX.js.map} +0 -0
  162. /package/dist/{chunk-6ZDJXSEO.js.map → chunk-BPRIYNLE.js.map} +0 -0
  163. /package/dist/{chunk-PMT2LSTQ.js.map → chunk-FMRZ26U5.js.map} +0 -0
  164. /package/dist/{chunk-3J6TUJSV.js.map → chunk-KHT24OWC.js.map} +0 -0
  165. /package/dist/{chunk-6DDRJQ4X.js.map → chunk-MYOZLMB2.js.map} +0 -0
  166. /package/dist/{chunk-FKBPXCH3.js.map → chunk-QS5TWZBL.js.map} +0 -0
  167. /package/dist/{cli-LCTXK7N6.js.map → cli-UWBAOHLL.js.map} +0 -0
  168. /package/dist/{client-S47ENM76.js.map → client-SLDDMSKN.js.map} +0 -0
  169. /package/dist/{detect-BEOIHGBC.js.map → detect-PXNM6TA7.js.map} +0 -0
  170. /package/dist/{detect-providers-2EY55EHK.js.map → detect-providers-5KOPZ7J2.js.map} +0 -0
  171. /package/dist/{installer-WMTB4NCX.js.map → installer-I6KRGJOO.js.map} +0 -0
  172. /package/dist/{llm-SWDDQQWY.js.map → llm-TH4NLIRM.js.map} +0 -0
  173. /package/dist/{loader-AAZ6VUIA.js.map → loader-H7OFASVC.js.map} +0 -0
  174. /package/dist/{loader-V774GZU4.js.map → loader-TSB5M7FD.js.map} +0 -0
  175. /package/dist/{logs-KNKPQE5A.js.map → logs-7YVGGBIS.js.map} +0 -0
  176. /package/dist/{open-OYBKVBYX.js.map → open-4UGDPBKN.js.map} +0 -0
  177. /package/dist/{provider-check-WCM3SDTM.js.map → provider-check-43LAMSMH.js.map} +0 -0
  178. /package/dist/{registry-OCM4WAPJ.js.map → registry-MGJSJBAS.js.map} +0 -0
  179. /package/dist/{remove-72ER3TG5.js.map → remove-GBBQG3SJ.js.map} +0 -0
  180. /package/dist/{restart-EQHEJCGT.js.map → restart-RMIGKMA6.js.map} +0 -0
  181. /package/dist/{search-JOBYIW43.js.map → search-2A5AJVNG.js.map} +0 -0
  182. /package/dist/{stats-TYOZAOP2.js.map → stats-ARBLNEE3.js.map} +0 -0
  183. /package/dist/{resolution-events-PYLSI6QT.js.map → team-3JKF7VAD.js.map} +0 -0
  184. /package/dist/{update-5VYNQZJ4.js.map → update-XVSAMN4O.js.map} +0 -0
  185. /package/dist/{team-SNLC6FZM.js.map → version-HRVSEMUR.js.map} +0 -0
@@ -1,16 +1,16 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  connectToDaemon
4
- } from "./chunk-NCBLB2C6.js";
4
+ } from "./chunk-UEWMSIL3.js";
5
5
  import "./chunk-SAKJMNSR.js";
6
- import "./chunk-TMNFCUAD.js";
7
- import "./chunk-PMT2LSTQ.js";
8
- import "./chunk-NKQZ73LL.js";
6
+ import "./chunk-LZP4IJB3.js";
7
+ import "./chunk-FMRZ26U5.js";
8
+ import "./chunk-SRXTSI25.js";
9
9
  import "./chunk-MYX5NCRH.js";
10
- import "./chunk-QH5HS54N.js";
11
- import "./chunk-ST2D3SGM.js";
10
+ import "./chunk-3WWJOTYG.js";
11
+ import "./chunk-AIYFHQRX.js";
12
12
  import "./chunk-LPUQPDC2.js";
13
- import "./chunk-I54KLC6H.js";
13
+ import "./chunk-FLLBJLHM.js";
14
14
  import "./chunk-UUHLLQXO.js";
15
15
  import "./chunk-6LQIMRTC.js";
16
16
  import "./chunk-ODXLRR4U.js";
@@ -36,4 +36,4 @@ async function run(args, vaultDir) {
36
36
  export {
37
37
  run
38
38
  };
39
- //# sourceMappingURL=agent-run-WK5NKBYA.js.map
39
+ //# sourceMappingURL=agent-run-PQXC246Y.js.map
@@ -1,16 +1,16 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  connectToDaemon
4
- } from "./chunk-NCBLB2C6.js";
4
+ } from "./chunk-UEWMSIL3.js";
5
5
  import "./chunk-SAKJMNSR.js";
6
- import "./chunk-TMNFCUAD.js";
7
- import "./chunk-PMT2LSTQ.js";
8
- import "./chunk-NKQZ73LL.js";
6
+ import "./chunk-LZP4IJB3.js";
7
+ import "./chunk-FMRZ26U5.js";
8
+ import "./chunk-SRXTSI25.js";
9
9
  import "./chunk-MYX5NCRH.js";
10
- import "./chunk-QH5HS54N.js";
11
- import "./chunk-ST2D3SGM.js";
10
+ import "./chunk-3WWJOTYG.js";
11
+ import "./chunk-AIYFHQRX.js";
12
12
  import "./chunk-LPUQPDC2.js";
13
- import "./chunk-I54KLC6H.js";
13
+ import "./chunk-FLLBJLHM.js";
14
14
  import "./chunk-UUHLLQXO.js";
15
15
  import "./chunk-6LQIMRTC.js";
16
16
  import "./chunk-ODXLRR4U.js";
@@ -182,4 +182,4 @@ async function run(args, vaultDir) {
182
182
  export {
183
183
  run
184
184
  };
185
- //# sourceMappingURL=agent-tasks-2E73GG3A.js.map
185
+ //# sourceMappingURL=agent-tasks-323BZEBX.js.map
@@ -1,16 +1,16 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  isProcessAlive
4
- } from "./chunk-NCBLB2C6.js";
4
+ } from "./chunk-UEWMSIL3.js";
5
5
  import {
6
- loadConfig
7
- } from "./chunk-NKQZ73LL.js";
6
+ loadMergedConfig
7
+ } from "./chunk-SRXTSI25.js";
8
8
  import {
9
9
  getDatabase
10
10
  } from "./chunk-MYX5NCRH.js";
11
11
  import {
12
12
  DIGEST_TIERS
13
- } from "./chunk-I54KLC6H.js";
13
+ } from "./chunk-FLLBJLHM.js";
14
14
 
15
15
  // src/db/queries/embeddings.ts
16
16
  var EMBEDDABLE_TABLES = ["sessions", "spores", "plans", "artifacts", "skill_records"];
@@ -87,7 +87,7 @@ function countTable(db, table) {
87
87
  }
88
88
  function gatherStats(vaultDir, options) {
89
89
  const db = getDatabase();
90
- const config = loadConfig(vaultDir);
90
+ const config = loadMergedConfig(vaultDir);
91
91
  const session_count = countTable(db, "sessions");
92
92
  const batch_count = countTable(db, "prompt_batches");
93
93
  const spore_count = countTable(db, "spores");
@@ -187,4 +187,4 @@ export {
187
187
  getEmbeddingQueueDepth,
188
188
  gatherStats
189
189
  };
190
- //# sourceMappingURL=chunk-VLGBWOBY.js.map
190
+ //# sourceMappingURL=chunk-22JALAXN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/db/queries/embeddings.ts","../src/services/stats.ts"],"sourcesContent":["/**\n * Embedded flag management — tracks which rows have been indexed in the external vector store.\n *\n * All vector storage and similarity search is handled by the external VectorStore.\n * This module only manages the `embedded` flag on relational tables.\n */\n\nimport { getDatabase } from '@myco/db/client.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Tables that participate in vector embedding. */\nexport const EMBEDDABLE_TABLES = ['sessions', 'spores', 'plans', 'artifacts', 'skill_records'] as const;\n\n/** TypeScript type for valid embeddable table names. */\nexport type EmbeddableTable = (typeof EMBEDDABLE_TABLES)[number];\n\n/** Per-table column that holds the text content used for embedding. */\nexport const EMBEDDABLE_TEXT_COLUMNS: Record<EmbeddableTable, string> = {\n sessions: 'summary',\n spores: 'content',\n plans: 'content',\n artifacts: 'content',\n skill_records: 'description',\n};\n\n/** Error message for invalid table names. */\nconst INVALID_TABLE_MSG = 'Invalid table name — must be one of: sessions, spores, plans, artifacts, skill_records';\n\n/** Default number of rows returned by getUnembedded. */\nconst DEFAULT_UNEMBEDDED_LIMIT = 100;\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Validate that a table name is in the allowlist.\n *\n * @throws if the table name is not one of the embeddable tables.\n */\nexport function assertValidTable(table: string): asserts table is EmbeddableTable {\n if (!(EMBEDDABLE_TABLES as readonly string[]).includes(table)) {\n throw new Error(INVALID_TABLE_MSG);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/** Mark a row as embedded in the external vector store. */\nexport function markEmbedded(table: string, id: string | number): void {\n assertValidTable(table);\n const db = getDatabase();\n db.prepare(`UPDATE ${table} SET embedded = 1 WHERE id = ?`).run(id);\n}\n\n/** Clear the embedded flag (e.g., when vector is removed or needs re-embedding). */\nexport function clearEmbedded(table: string, id: string | number): void {\n assertValidTable(table);\n const db = getDatabase();\n db.prepare(`UPDATE ${table} SET embedded = 0 WHERE id = ?`).run(id);\n}\n\n/** Find rows that have not yet been embedded, oldest first. */\nexport function getUnembedded(\n table: string,\n limit: number = DEFAULT_UNEMBEDDED_LIMIT,\n): Array<{ id: string | number; created_at: number; text: string }> {\n assertValidTable(table);\n const db = getDatabase();\n const textCol = EMBEDDABLE_TEXT_COLUMNS[table as EmbeddableTable];\n const contentFilter = table === 'sessions' ? ' AND summary IS NOT NULL' : '';\n const statusFilter = (table === 'spores' || table === 'skill_records') ? \" AND status = 'active'\" : '';\n\n return db.prepare(\n `SELECT id, created_at, ${textCol} AS text\n FROM ${table}\n WHERE embedded = 0${contentFilter}${statusFilter}\n ORDER BY created_at ASC\n LIMIT ?`\n ).all(limit) as Array<{ id: string | number; created_at: number; text: string }>;\n}\n\n/** Get aggregated embedding queue depth across all embeddable tables. */\nexport function getEmbeddingQueueDepth(): {\n queue_depth: number;\n embedded_count: number;\n total: number;\n} {\n const db = getDatabase();\n\n const queueRow = db.prepare(`\n SELECT\n (SELECT COUNT(*) FROM sessions WHERE embedded = 0 AND summary IS NOT NULL) +\n (SELECT COUNT(*) FROM spores WHERE embedded = 0 AND status = 'active') +\n (SELECT COUNT(*) FROM plans WHERE embedded = 0 AND content IS NOT NULL) +\n (SELECT COUNT(*) FROM artifacts WHERE embedded = 0 AND content IS NOT NULL) +\n (SELECT COUNT(*) FROM skill_records WHERE embedded = 0 AND status = 'active')\n AS cnt\n `).get() as { cnt: number };\n\n const embeddedRow = db.prepare(`\n SELECT\n (SELECT COUNT(*) FROM sessions WHERE embedded = 1) +\n (SELECT COUNT(*) FROM spores WHERE embedded = 1) +\n (SELECT COUNT(*) FROM plans WHERE embedded = 1) +\n (SELECT COUNT(*) FROM artifacts WHERE embedded = 1) +\n (SELECT COUNT(*) FROM skill_records WHERE embedded = 1)\n AS cnt\n `).get() as { cnt: number };\n\n const queue_depth = Number(queueRow.cnt ?? 0);\n const embedded_count = Number(embeddedRow.cnt ?? 0);\n return { queue_depth, embedded_count, total: queue_depth + embedded_count };\n}\n","/**\n * Vault statistics — gathered from SQLite.\n */\n\nimport { getDatabase } from '@myco/db/client.js';\nimport { getEmbeddingQueueDepth } from '@myco/db/queries/embeddings.js';\nimport { loadMergedConfig } from '@myco/config/loader.js';\nimport { isProcessAlive } from '@myco/cli/shared.js';\nimport { DIGEST_TIERS } from '@myco/constants.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Process uptime is available directly from the daemon process via process.uptime(). */\nconst DAEMON_JSON_FILENAME = 'daemon.json';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface V2Stats {\n daemon: {\n pid: number;\n port: number;\n version: string;\n uptime_seconds: number;\n active_sessions: string[];\n };\n vault: {\n path: string;\n name: string;\n session_count: number;\n batch_count: number;\n spore_count: number;\n plan_count: number;\n artifact_count: number;\n entity_count: number;\n edge_count: number;\n };\n embedding: {\n provider: string;\n model: string;\n queue_depth: number;\n embedded_count: number;\n total_embeddable: number;\n };\n agent: {\n last_run_at: number | null;\n last_run_status: string | null;\n total_runs: number;\n };\n digest: {\n freshest_tier: number | null;\n generated_at: number | null;\n tiers_available: number[];\n };\n unprocessed_batches: number;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Count rows in a table (sync). */\nfunction countTable(db: ReturnType<typeof getDatabase>, table: string): number {\n const row = db.prepare(`SELECT COUNT(*) AS cnt FROM ${table}`).get() as { cnt: number };\n return Number(row.cnt);\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport function gatherStats(vaultDir: string, options?: { active_sessions?: string[] }): V2Stats {\n const db = getDatabase();\n\n // Load config for embedding provider info (sync — already on disk)\n const config = loadMergedConfig(vaultDir);\n\n // All queries are synchronous — no Promise.all needed\n const session_count = countTable(db, 'sessions');\n const batch_count = countTable(db, 'prompt_batches');\n const spore_count = countTable(db, 'spores');\n const plan_count = countTable(db, 'plans');\n const artifact_count = countTable(db, 'artifacts');\n const entity_count = countTable(db, 'entities');\n const edge_count = countTable(db, 'graph_edges');\n\n // Shared embedding queue depth helper (consistent filter logic)\n const embeddingStats = getEmbeddingQueueDepth();\n const { queue_depth, embedded_count, total: total_embeddable } = embeddingStats;\n\n // Unprocessed batches\n const unprocessedRow = db.prepare(\n 'SELECT COUNT(*) AS cnt FROM prompt_batches WHERE processed = 0',\n ).get() as { cnt: number };\n const unprocessed_batches = Number(unprocessedRow.cnt ?? 0);\n\n // Agent: most recent run\n const lastRun = db.prepare(\n 'SELECT started_at, status FROM agent_runs ORDER BY started_at DESC LIMIT 1',\n ).get() as { started_at: number; status: string } | undefined;\n const last_run_at = lastRun ? lastRun.started_at : null;\n const last_run_status = lastRun ? lastRun.status : null;\n\n // Total agent runs\n const agentTotalRow = db.prepare(\n 'SELECT COUNT(*) AS cnt FROM agent_runs',\n ).get() as { cnt: number };\n const total_runs = Number(agentTotalRow.cnt ?? 0);\n\n // Digest extracts: only report tiers that are currently configured\n const digestRows = db.prepare(\n 'SELECT tier, generated_at FROM digest_extracts ORDER BY tier ASC',\n ).all() as Array<{ tier: number; generated_at: number }>;\n const configuredTiers = new Set<number>(DIGEST_TIERS);\n const activeDigestRows = digestRows.filter((r) => configuredTiers.has(r.tier));\n const tiers_available = activeDigestRows.map((r) => r.tier);\n const freshest_tier = tiers_available.length > 0 ? Math.max(...tiers_available) : null;\n const freshestRow = activeDigestRows.find((r) => r.tier === freshest_tier);\n const generated_at = freshestRow ? freshestRow.generated_at : null;\n\n // Daemon info from daemon.json\n let daemonPid = 0;\n let daemonPort = 0;\n let daemonVersion = '';\n let daemonUptimeSeconds = 0;\n const daemonPath = path.join(vaultDir, DAEMON_JSON_FILENAME);\n if (fs.existsSync(daemonPath)) {\n try {\n const info = JSON.parse(fs.readFileSync(daemonPath, 'utf-8')) as Record<string, unknown>;\n daemonPid = (info.pid as number) ?? 0;\n daemonPort = (info.port as number) ?? 0;\n daemonVersion = (info.version as string) ?? '';\n // uptime: if daemon is alive, compute from started timestamp\n if (typeof info.started === 'string' && isProcessAlive(daemonPid)) {\n const startedMs = new Date(info.started as string).getTime();\n daemonUptimeSeconds = Math.floor((Date.now() - startedMs) / 1000);\n }\n } catch { /* ignore corrupt daemon.json */ }\n }\n\n return {\n daemon: {\n pid: daemonPid,\n port: daemonPort,\n version: daemonVersion,\n uptime_seconds: daemonUptimeSeconds,\n active_sessions: options?.active_sessions ?? [],\n },\n vault: {\n path: vaultDir,\n name: path.basename(path.dirname(vaultDir)),\n session_count,\n batch_count,\n spore_count,\n plan_count,\n artifact_count,\n entity_count,\n edge_count,\n },\n embedding: {\n provider: config.embedding.provider,\n model: config.embedding.model,\n queue_depth,\n embedded_count,\n total_embeddable,\n },\n agent: {\n last_run_at,\n last_run_status,\n total_runs,\n },\n digest: {\n freshest_tier,\n generated_at,\n tiers_available,\n },\n unprocessed_batches,\n };\n}\n"],"mappings":"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","names":[]}
@@ -38,6 +38,14 @@ var DaemonLogger = class {
38
38
  setPersistFn(fn) {
39
39
  this.persistFn = fn;
40
40
  }
41
+ /**
42
+ * Change the active log level at runtime. Subsequent writes use the new
43
+ * threshold immediately — no restart required. Used by the
44
+ * daemon.log_level config reaction.
45
+ */
46
+ setLevel(level) {
47
+ this.level = level;
48
+ }
41
49
  debug(kind, message, data) {
42
50
  this.write("debug", kind, message, data);
43
51
  }
@@ -113,4 +121,4 @@ export {
113
121
  LEVEL_ORDER,
114
122
  DaemonLogger
115
123
  };
116
- //# sourceMappingURL=chunk-DURKJTVO.js.map
124
+ //# sourceMappingURL=chunk-3WOS4TAR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/daemon/logger.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { kindToComponent } from '@myco/constants/log-kinds.js';\n\nexport interface LogEntry {\n timestamp: string;\n level: string;\n kind: string;\n component: string;\n message: string;\n [key: string]: unknown;\n}\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nexport type LogPersistFn = (entry: LogEntry) => void;\n\n/**\n * Structural logger interface consumed by manager classes.\n * `DaemonLogger` is the concrete implementation, but managers accept any\n * object matching this shape so tests can substitute mocks.\n */\nexport interface Logger {\n debug(cat: string, msg: string, data?: Record<string, unknown>): void;\n info(cat: string, msg: string, data?: Record<string, unknown>): void;\n warn(cat: string, msg: string, data?: Record<string, unknown>): void;\n error(cat: string, msg: string, data?: Record<string, unknown>): void;\n}\n\nexport const LEVEL_ORDER: Record<LogLevel, number> = {\n debug: 0, info: 1, warn: 2, error: 3,\n};\n\ninterface LoggerOptions {\n level?: LogLevel;\n maxSize?: number;\n maxFiles?: number;\n}\n\nexport class DaemonLogger {\n private logPath: string;\n private fd: number | null = null;\n private currentSize = 0;\n private level: LogLevel;\n private maxSize: number;\n private maxFiles: number;\n private logDir: string;\n private persistFn: LogPersistFn | null = null;\n\n constructor(logDir: string, options: LoggerOptions = {}) {\n this.logDir = logDir;\n this.logPath = path.join(logDir, 'daemon.log');\n this.level = options.level ?? 'info';\n this.maxSize = options.maxSize ?? 5_242_880;\n this.maxFiles = options.maxFiles ?? 3;\n\n fs.mkdirSync(logDir, { recursive: true });\n this.fd = fs.openSync(this.logPath, 'a');\n try {\n this.currentSize = fs.fstatSync(this.fd).size;\n } catch {\n this.currentSize = 0;\n }\n }\n\n setPersistFn(fn: LogPersistFn): void {\n this.persistFn = fn;\n }\n\n /**\n * Change the active log level at runtime. Subsequent writes use the new\n * threshold immediately — no restart required. Used by the\n * daemon.log_level config reaction.\n */\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n debug(kind: string, message: string, data?: Record<string, unknown>): void {\n this.write('debug', kind, message, data);\n }\n\n info(kind: string, message: string, data?: Record<string, unknown>): void {\n this.write('info', kind, message, data);\n }\n\n warn(kind: string, message: string, data?: Record<string, unknown>): void {\n this.write('warn', kind, message, data);\n }\n\n error(kind: string, message: string, data?: Record<string, unknown>): void {\n this.write('error', kind, message, data);\n }\n\n /** Dispatch a log entry by dynamic level string. */\n log(level: string, kind: string, message: string, data?: Record<string, unknown>): void {\n if (level in LEVEL_ORDER) {\n this.write(level as LogLevel, kind, message, data);\n }\n }\n\n close(): void {\n if (this.fd !== null) {\n fs.closeSync(this.fd);\n this.fd = null;\n }\n }\n\n private write(level: LogLevel, kind: string, message: string, data?: Record<string, unknown>): void {\n if (LEVEL_ORDER[level] < LEVEL_ORDER[this.level]) return;\n\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n level,\n kind,\n component: kindToComponent(kind),\n message,\n ...data,\n };\n\n if (this.persistFn !== null) {\n try {\n this.persistFn(entry);\n } catch {\n // File write is the safety net — persist failures are non-fatal\n }\n }\n\n const line = JSON.stringify(entry) + '\\n';\n const bytes = Buffer.byteLength(line);\n\n if (this.currentSize + bytes > this.maxSize) {\n this.rotate();\n }\n\n if (this.fd !== null) {\n fs.writeSync(this.fd, line);\n this.currentSize += bytes;\n }\n }\n\n private rotate(): void {\n this.close();\n\n for (let i = this.maxFiles - 1; i >= 1; i--) {\n const from = path.join(this.logDir, `daemon.${i}.log`);\n const to = path.join(this.logDir, `daemon.${i + 1}.log`);\n if (fs.existsSync(from)) {\n if (i + 1 > this.maxFiles) {\n fs.unlinkSync(from);\n } else {\n fs.renameSync(from, to);\n }\n }\n }\n\n if (fs.existsSync(this.logPath)) {\n fs.renameSync(this.logPath, path.join(this.logDir, 'daemon.1.log'));\n }\n\n this.fd = fs.openSync(this.logPath, 'a');\n this.currentSize = 0;\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,13 +1,13 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
2
  import {
3
3
  getPluginVersion
4
- } from "./chunk-ST2D3SGM.js";
4
+ } from "./chunk-AIYFHQRX.js";
5
5
  import {
6
6
  DAEMON_CLIENT_TIMEOUT_MS,
7
7
  DAEMON_HEALTH_CHECK_TIMEOUT_MS,
8
8
  DAEMON_HEALTH_RETRY_DELAYS,
9
9
  DAEMON_STALE_GRACE_PERIOD_MS
10
- } from "./chunk-I54KLC6H.js";
10
+ } from "./chunk-FLLBJLHM.js";
11
11
 
12
12
  // src/hooks/client.ts
13
13
  import fs from "fs";
@@ -185,4 +185,4 @@ export {
185
185
  resolveCliEntryPath,
186
186
  DaemonClient
187
187
  };
188
- //# sourceMappingURL=chunk-QH5HS54N.js.map
188
+ //# sourceMappingURL=chunk-3WWJOTYG.js.map
@@ -11,7 +11,7 @@ import {
11
11
  SCHEDULABLE_POWER_STATES,
12
12
  USER_TASK_SOURCE,
13
13
  epochSeconds
14
- } from "./chunk-I54KLC6H.js";
14
+ } from "./chunk-FLLBJLHM.js";
15
15
  import {
16
16
  require_dist
17
17
  } from "./chunk-6LQIMRTC.js";
@@ -464,7 +464,7 @@ async function registerBuiltInAgentsAndTasks(definitionsDir, vaultDir) {
464
464
  ).run(BUILT_IN_SOURCE, definition.name, ...validTaskIds);
465
465
  }
466
466
  if (vaultDir) {
467
- const { loadAllTasks } = await import("./registry-OCM4WAPJ.js");
467
+ const { loadAllTasks } = await import("./registry-MGJSJBAS.js");
468
468
  const allTasks = loadAllTasks(definitionsDir, vaultDir);
469
469
  for (const [name, task] of allTasks) {
470
470
  if (task.source === USER_TASK_SOURCE) {
@@ -505,4 +505,4 @@ export {
505
505
  resolveEffectiveConfig,
506
506
  registerBuiltInAgentsAndTasks
507
507
  };
508
- //# sourceMappingURL=chunk-Q4QD6LJT.js.map
508
+ //# sourceMappingURL=chunk-4M7EWPIA.js.map
@@ -2,7 +2,7 @@ import { createRequire as __cr } from 'node:module'; const require = __cr(import
2
2
  import {
3
3
  getTeamMachineId,
4
4
  syncRow
5
- } from "./chunk-AULBWINA.js";
5
+ } from "./chunk-EVDQKYCG.js";
6
6
  import {
7
7
  getDatabase
8
8
  } from "./chunk-MYX5NCRH.js";
@@ -192,4 +192,4 @@ export {
192
192
  listSporeIdsSince,
193
193
  updateSporeStatus
194
194
  };
195
- //# sourceMappingURL=chunk-FGKCE5AE.js.map
195
+ //# sourceMappingURL=chunk-4YFKBL3F.js.map
@@ -3,14 +3,14 @@ import {
3
3
  AgentTaskSchema,
4
4
  loadAgentTasks,
5
5
  taskFromParsed
6
- } from "./chunk-Q4QD6LJT.js";
6
+ } from "./chunk-4M7EWPIA.js";
7
7
  import {
8
8
  BUILT_IN_SOURCE,
9
9
  MAX_TASK_NAME_LENGTH,
10
10
  TASK_NAME_PATTERN,
11
11
  USER_TASKS_DIR,
12
12
  USER_TASK_SOURCE
13
- } from "./chunk-I54KLC6H.js";
13
+ } from "./chunk-FLLBJLHM.js";
14
14
  import {
15
15
  require_dist
16
16
  } from "./chunk-6LQIMRTC.js";
@@ -100,4 +100,4 @@ export {
100
100
  deleteUserTask,
101
101
  copyTaskToUser
102
102
  };
103
- //# sourceMappingURL=chunk-KYH4V4ML.js.map
103
+ //# sourceMappingURL=chunk-57O67XVF.js.map
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  SEARCH_PREVIEW_CHARS,
7
7
  SEARCH_RESULTS_DEFAULT_LIMIT
8
- } from "./chunk-I54KLC6H.js";
8
+ } from "./chunk-FLLBJLHM.js";
9
9
 
10
10
  // src/db/queries/search.ts
11
11
  function fullTextSearch(query, options = {}) {
@@ -228,4 +228,4 @@ export {
228
228
  fullTextSearch,
229
229
  hydrateSearchResults
230
230
  };
231
- //# sourceMappingURL=chunk-7ONVLO43.js.map
231
+ //# sourceMappingURL=chunk-5XIVBO25.js.map
@@ -5,13 +5,13 @@ import {
5
5
  import {
6
6
  normalizeHookInput,
7
7
  readStdin
8
- } from "./chunk-WKNAKQKA.js";
8
+ } from "./chunk-DCSGJ7W4.js";
9
9
  import {
10
10
  resolveVaultDir
11
- } from "./chunk-5ZT2Q6P5.js";
11
+ } from "./chunk-CUDIZJY7.js";
12
12
  import {
13
13
  DaemonClient
14
- } from "./chunk-QH5HS54N.js";
14
+ } from "./chunk-3WWJOTYG.js";
15
15
 
16
16
  // src/hooks/send-event.ts
17
17
  import fs from "fs";
@@ -39,4 +39,4 @@ async function sendEvent(hookName, buildEvent) {
39
39
  export {
40
40
  sendEvent
41
41
  };
42
- //# sourceMappingURL=chunk-W3JUH5S3.js.map
42
+ //# sourceMappingURL=chunk-63ZGP4Q2.js.map
@@ -11,7 +11,7 @@ var cached;
11
11
  function getPluginVersion() {
12
12
  if (cached) return cached;
13
13
  if (true) {
14
- cached = "0.19.6";
14
+ cached = "0.20.1";
15
15
  return cached;
16
16
  }
17
17
  const root = findPackageRoot(path.dirname(fileURLToPath(import.meta.url)));
@@ -32,4 +32,4 @@ function getPluginVersion() {
32
32
  export {
33
33
  getPluginVersion
34
34
  };
35
- //# sourceMappingURL=chunk-ST2D3SGM.js.map
35
+ //# sourceMappingURL=chunk-AIYFHQRX.js.map
@@ -2,10 +2,10 @@ import { createRequire as __cr } from 'node:module'; const require = __cr(import
2
2
  import {
3
3
  LmStudioBackend,
4
4
  OllamaBackend
5
- } from "./chunk-PMT2LSTQ.js";
5
+ } from "./chunk-FMRZ26U5.js";
6
6
  import {
7
7
  PROVIDER_DETECT_TIMEOUT_MS
8
- } from "./chunk-I54KLC6H.js";
8
+ } from "./chunk-FLLBJLHM.js";
9
9
 
10
10
  // src/intelligence/provider-check.ts
11
11
  async function checkLocalProvider(type, baseUrl) {
@@ -19,4 +19,4 @@ async function checkLocalProvider(type, baseUrl) {
19
19
  export {
20
20
  checkLocalProvider
21
21
  };
22
- //# sourceMappingURL=chunk-6ZDJXSEO.js.map
22
+ //# sourceMappingURL=chunk-BPRIYNLE.js.map
@@ -0,0 +1,36 @@
1
+ import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
+
3
+ // src/vault/resolve.ts
4
+ import path from "path";
5
+ import { execFileSync } from "child_process";
6
+ var MYCO_PROJECT_ROOT_ENV = "MYCO_PROJECT_ROOT";
7
+ var MYCO_VAULT_DIR_ENV = "MYCO_VAULT_DIR";
8
+ function resolveVaultDir(cwd = process.cwd(), env = process.env) {
9
+ const explicitVaultDir = readAbsoluteEnv(env, MYCO_VAULT_DIR_ENV);
10
+ if (explicitVaultDir) return explicitVaultDir;
11
+ const explicitProjectRoot = readAbsoluteEnv(env, MYCO_PROJECT_ROOT_ENV);
12
+ if (explicitProjectRoot) return path.join(explicitProjectRoot, ".myco");
13
+ return path.join(resolveRepoRoot(cwd), ".myco");
14
+ }
15
+ function readAbsoluteEnv(env, key) {
16
+ const raw = env[key];
17
+ if (typeof raw !== "string" || raw.length === 0) return null;
18
+ return path.isAbsolute(raw) ? raw : null;
19
+ }
20
+ function resolveRepoRoot(cwd) {
21
+ try {
22
+ const gitCommon = execFileSync(
23
+ "git",
24
+ ["rev-parse", "--git-common-dir"],
25
+ { cwd, encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }
26
+ ).trim();
27
+ return path.resolve(cwd, gitCommon, "..");
28
+ } catch {
29
+ return cwd;
30
+ }
31
+ }
32
+
33
+ export {
34
+ resolveVaultDir
35
+ };
36
+ //# sourceMappingURL=chunk-CUDIZJY7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/vault/resolve.ts"],"sourcesContent":["import path from 'node:path';\nimport { execFileSync } from 'node:child_process';\n\nexport const MYCO_PROJECT_ROOT_ENV = 'MYCO_PROJECT_ROOT';\nexport const MYCO_VAULT_DIR_ENV = 'MYCO_VAULT_DIR';\n\n/**\n * Resolve the vault directory.\n *\n * Always `.myco/` in the project root. The vault is a SQLite database\n * that lives with the project — no external overrides needed.\n *\n * Uses git to find the repo root so this works correctly in\n * git worktrees — worktree agents resolve to the same vault\n * as the main working tree. Some symbionts launch their MCP child with\n * cwd=/, so explicit env anchors win before any cwd-based fallback.\n */\nexport function resolveVaultDir(\n cwd = process.cwd(),\n env: NodeJS.ProcessEnv = process.env,\n): string {\n const explicitVaultDir = readAbsoluteEnv(env, MYCO_VAULT_DIR_ENV);\n if (explicitVaultDir) return explicitVaultDir;\n\n const explicitProjectRoot = readAbsoluteEnv(env, MYCO_PROJECT_ROOT_ENV);\n if (explicitProjectRoot) return path.join(explicitProjectRoot, '.myco');\n\n return path.join(resolveRepoRoot(cwd), '.myco');\n}\n\nfunction readAbsoluteEnv(\n env: NodeJS.ProcessEnv,\n key: string,\n): string | null {\n const raw = env[key];\n if (typeof raw !== 'string' || raw.length === 0) return null;\n return path.isAbsolute(raw) ? raw : null;\n}\n\n/**\n * Find the main repo root, even from a git worktree.\n *\n * `git rev-parse --git-common-dir` returns the shared .git directory:\n * - In a normal repo: \".git\" (relative)\n * - In a worktree: \"/abs/path/to/main-repo/.git\" (absolute)\n *\n * The repo root is the parent of that path.\n * Falls back to cwd if not in a git repo.\n */\nfunction resolveRepoRoot(cwd: string): string {\n try {\n const gitCommon = execFileSync(\n 'git', ['rev-parse', '--git-common-dir'],\n { cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] },\n ).trim();\n return path.resolve(cwd, gitCommon, '..');\n } catch {\n return cwd;\n }\n}\n"],"mappings":";;;AAAA,OAAO,UAAU;AACjB,SAAS,oBAAoB;AAEtB,IAAM,wBAAwB;AAC9B,IAAM,qBAAqB;AAa3B,SAAS,gBACd,MAAM,QAAQ,IAAI,GAClB,MAAyB,QAAQ,KACzB;AACR,QAAM,mBAAmB,gBAAgB,KAAK,kBAAkB;AAChE,MAAI,iBAAkB,QAAO;AAE7B,QAAM,sBAAsB,gBAAgB,KAAK,qBAAqB;AACtE,MAAI,oBAAqB,QAAO,KAAK,KAAK,qBAAqB,OAAO;AAEtE,SAAO,KAAK,KAAK,gBAAgB,GAAG,GAAG,OAAO;AAChD;AAEA,SAAS,gBACP,KACA,KACe;AACf,QAAM,MAAM,IAAI,GAAG;AACnB,MAAI,OAAO,QAAQ,YAAY,IAAI,WAAW,EAAG,QAAO;AACxD,SAAO,KAAK,WAAW,GAAG,IAAI,MAAM;AACtC;AAYA,SAAS,gBAAgB,KAAqB;AAC5C,MAAI;AACF,UAAM,YAAY;AAAA,MAChB;AAAA,MAAO,CAAC,aAAa,kBAAkB;AAAA,MACvC,EAAE,KAAK,UAAU,SAAS,OAAO,CAAC,QAAQ,QAAQ,MAAM,EAAE;AAAA,IAC5D,EAAE,KAAK;AACP,WAAO,KAAK,QAAQ,KAAK,WAAW,IAAI;AAAA,EAC1C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -1,10 +1,13 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
+ import {
3
+ getAtPath
4
+ } from "./chunk-ZXZPJJN3.js";
2
5
  import {
3
6
  loadManifests
4
- } from "./chunk-UVKQ62II.js";
7
+ } from "./chunk-NGROSFOH.js";
5
8
  import {
6
9
  STDIN_TIMEOUT_MS
7
- } from "./chunk-I54KLC6H.js";
10
+ } from "./chunk-FLLBJLHM.js";
8
11
 
9
12
  // src/hooks/read-stdin.ts
10
13
  function readStdin() {
@@ -82,30 +85,21 @@ function detectManifest(input) {
82
85
  cachedManifest = null;
83
86
  return null;
84
87
  }
85
- function resolveField(input, fieldPath) {
86
- const parts = fieldPath.split(".");
87
- let current = input;
88
- for (const part of parts) {
89
- if (current === null || current === void 0 || typeof current !== "object") return void 0;
90
- current = current[part];
91
- }
92
- return current;
93
- }
94
88
  function normalizeHookInput(input) {
95
89
  const manifest = detectManifest(input);
96
90
  const fields = manifest?.hookFields ?? DEFAULT_HOOK_FIELDS;
97
- const sessionIdFromInput = resolveField(input, fields.sessionId);
91
+ const sessionIdFromInput = getAtPath(input, fields.sessionId);
98
92
  const sessionIdFromEnv = "sessionIdEnv" in fields && fields.sessionIdEnv ? process.env[fields.sessionIdEnv] : void 0;
99
93
  const sessionId = sessionIdFromInput ?? sessionIdFromEnv ?? process.env.MYCO_SESSION_ID ?? `s-${Date.now()}`;
100
94
  return {
101
95
  agent: manifest?.name ?? DEFAULT_AGENT_NAME,
102
96
  sessionId,
103
- transcriptPath: resolveField(input, fields.transcriptPath),
104
- lastResponse: resolveField(input, fields.lastResponse),
105
- prompt: resolveField(input, fields.prompt),
106
- toolName: resolveField(input, fields.toolName),
107
- toolInput: resolveField(input, fields.toolInput),
108
- toolOutput: resolveField(input, fields.toolOutput),
97
+ transcriptPath: getAtPath(input, fields.transcriptPath),
98
+ lastResponse: getAtPath(input, fields.lastResponse),
99
+ prompt: getAtPath(input, fields.prompt),
100
+ toolName: getAtPath(input, fields.toolName),
101
+ toolInput: getAtPath(input, fields.toolInput),
102
+ toolOutput: getAtPath(input, fields.toolOutput),
109
103
  raw: input
110
104
  };
111
105
  }
@@ -114,4 +108,4 @@ export {
114
108
  readStdin,
115
109
  normalizeHookInput
116
110
  };
117
- //# sourceMappingURL=chunk-WKNAKQKA.js.map
111
+ //# sourceMappingURL=chunk-DCSGJ7W4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/read-stdin.ts","../src/hooks/normalize.ts"],"sourcesContent":["import { STDIN_TIMEOUT_MS } from '../constants.js';\n\nexport function readStdin(): Promise<string> {\n return new Promise((resolve) => {\n let data = '';\n process.stdin.on('data', (chunk: Buffer) => { data += chunk; });\n process.stdin.on('end', () => resolve(data));\n setTimeout(() => resolve(data || '{}'), STDIN_TIMEOUT_MS);\n });\n}\n","/**\n * Hook payload normalization layer.\n *\n * Each agent sends different field names in hook stdin (e.g., Claude Code uses\n * `session_id`, VS Code uses `sessionId`, Windsurf uses `trajectory_id`).\n * This module detects the active agent, loads its manifest, and maps the\n * raw input to a canonical shape that all hooks can consume uniformly.\n */\n\nimport { loadManifests } from '../symbionts/detect.js';\nimport type { SymbiontManifest } from '../symbionts/manifest-schema.js';\nimport { getAtPath } from '../utils/dot-path.js';\n\n/** Default field mappings when no agent manifest is detected (Claude Code conventions). */\nconst DEFAULT_HOOK_FIELDS = {\n sessionId: 'session_id',\n transcriptPath: 'transcript_path',\n lastResponse: 'last_assistant_message',\n prompt: 'prompt',\n toolName: 'tool_name',\n toolInput: 'tool_input',\n toolOutput: 'tool_output',\n} as const;\n\n/** Canonical hook input with normalized field names. */\nexport interface NormalizedHookInput {\n /** Detected agent name from manifest (e.g., 'claude-code', 'codex', 'windsurf'). */\n agent: string;\n sessionId: string;\n transcriptPath?: string;\n lastResponse?: string;\n prompt?: string;\n toolName?: string;\n toolInput?: unknown;\n toolOutput?: unknown;\n /** The full raw input for any fields not covered by the mapping. */\n raw: Record<string, unknown>;\n}\n\n/** Default agent name when no manifest is detected. */\nconst DEFAULT_AGENT_NAME = 'claude-code';\n\n/** Cached manifest for the detected agent — resolved once per process. */\nlet cachedManifest: SymbiontManifest | null | undefined;\n\n/**\n * Parse `--symbiont <name>` from process argv.\n *\n * The hook command line rendered by the installer for every symbiont's\n * hooks.json looks like:\n *\n * node .agents/myco-run.cjs hook session-start --symbiont codex\n *\n * `.agents/myco-run.cjs` resolves the myco binary via\n * `.myco/runtime.command` and execs it with all argv passed through, so\n * by the time the hook handler module loads, `process.argv` contains\n * the flag. This is the installer's explicit declaration of which\n * symbiont owns this invocation — strictly more reliable than any\n * runtime heuristic.\n *\n * Supports both `--symbiont codex` (two args) and `--symbiont=codex`\n * (one arg) to be forgiving about shell quoting on Windows.\n */\nexport function readSymbiontFlag(argv: readonly string[]): string | undefined {\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (arg === '--symbiont') {\n const next = argv[i + 1];\n if (next && !next.startsWith('-')) return next;\n } else if (arg.startsWith('--symbiont=')) {\n return arg.slice('--symbiont='.length);\n }\n }\n return undefined;\n}\n\n/**\n * Detect which symbiont is driving this hook invocation.\n *\n * Detection strategies in order:\n * 1. **Primary** — `--symbiont <name>` argv flag rendered into each\n * agent's hooks.json at install time. Dead simple and unambiguous:\n * the installer knows which agent it's writing into, so we bake\n * the identity into the hook command itself.\n * 2. `pluginRootEnvVar` (e.g., `CLAUDE_PLUGIN_ROOT`) — set natively by\n * agents that cooperate with a plugin system. Fallback for older\n * installs that predate the argv flag.\n * 3. `sessionIdEnv` fallback (e.g., `GEMINI_SESSION_ID`) — set by agents\n * that expose the session via env var rather than payload field.\n * 4. Payload-driven heuristic: match the event's `transcript_path` /\n * `cwd` against each manifest's `configDir`. Safety net for pre-\n * flag installations that have somehow also lost their env-var\n * signal. Generic — works for every manifest without per-agent\n * branching.\n *\n * The cache is per-process, which is fine: each hook invocation is a\n * short-lived Node process. `input` is optional so callers that just\n * want env-based detection (e.g., at module import time) still work.\n */\nfunction detectManifest(input?: Record<string, unknown>): SymbiontManifest | null {\n if (cachedManifest !== undefined) return cachedManifest;\n\n const manifests = loadManifests();\n\n // 1) Primary: explicit --symbiont flag from the installer-rendered\n // hook command. This is the source of truth when present.\n const flagName = readSymbiontFlag(process.argv);\n if (flagName) {\n const m = manifests.find((x) => x.name === flagName);\n if (m) {\n cachedManifest = m;\n return m;\n }\n // Flag specified an unknown manifest — fall through to heuristics\n // rather than guessing. Logging happens at the handler level.\n }\n\n // 2) Env-var detection: check pluginRootEnvVar for each manifest.\n for (const m of manifests) {\n if (process.env[m.pluginRootEnvVar]) {\n cachedManifest = m;\n return m;\n }\n }\n\n // 3) sessionIdEnv fallback (e.g., GEMINI_SESSION_ID).\n for (const m of manifests) {\n if (m.hookFields.sessionIdEnv && process.env[m.hookFields.sessionIdEnv]) {\n cachedManifest = m;\n return m;\n }\n }\n\n // 4) Payload-driven heuristic: match configDir against transcript_path\n // / cwd. Kept as a safety net for pre-flag installations. Preferred\n // signals above always win when they're available.\n if (input) {\n const candidates: string[] = [];\n const tp = input.transcript_path;\n const cwd = input.cwd;\n if (typeof tp === 'string' && tp.length > 0) candidates.push(tp);\n if (typeof cwd === 'string' && cwd.length > 0) candidates.push(cwd);\n for (const m of manifests) {\n const marker = `/${m.configDir}/`;\n if (candidates.some((c) => c.includes(marker))) {\n cachedManifest = m;\n return m;\n }\n }\n }\n\n cachedManifest = null;\n return null;\n}\n\n/**\n * Normalize a raw hook input using the active agent's manifest field mappings.\n * Falls back to Claude Code field names if no agent is detected.\n */\nexport function normalizeHookInput(input: Record<string, unknown>): NormalizedHookInput {\n const manifest = detectManifest(input);\n const fields = manifest?.hookFields ?? DEFAULT_HOOK_FIELDS;\n\n // Resolve session ID: try the mapped field, then env var fallback, then MYCO_SESSION_ID\n const sessionIdFromInput = getAtPath(input, fields.sessionId) as string | undefined;\n const sessionIdFromEnv = 'sessionIdEnv' in fields && fields.sessionIdEnv\n ? process.env[fields.sessionIdEnv]\n : undefined;\n const sessionId = sessionIdFromInput\n ?? sessionIdFromEnv\n ?? process.env.MYCO_SESSION_ID\n ?? `s-${Date.now()}`;\n\n return {\n agent: manifest?.name ?? DEFAULT_AGENT_NAME,\n sessionId,\n transcriptPath: getAtPath(input, fields.transcriptPath) as string | undefined,\n lastResponse: getAtPath(input, fields.lastResponse) as string | undefined,\n prompt: getAtPath(input, fields.prompt) as string | undefined,\n toolName: getAtPath(input, fields.toolName) as string | undefined,\n toolInput: getAtPath(input, fields.toolInput),\n toolOutput: getAtPath(input, fields.toolOutput),\n raw: input,\n };\n}\n\n/** Reset cached manifest — exposed for testing only. */\nexport function _resetManifestCache(): void {\n cachedManifest = undefined;\n}\n"],"mappings":";;;;;;;;;;;;AAEO,SAAS,YAA6B;AAC3C,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,QAAI,OAAO;AACX,YAAQ,MAAM,GAAG,QAAQ,CAAC,UAAkB;AAAE,cAAQ;AAAA,IAAO,CAAC;AAC9D,YAAQ,MAAM,GAAG,OAAO,MAAM,QAAQ,IAAI,CAAC;AAC3C,eAAW,MAAM,QAAQ,QAAQ,IAAI,GAAG,gBAAgB;AAAA,EAC1D,CAAC;AACH;;;ACKA,IAAM,sBAAsB;AAAA,EAC1B,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,WAAW;AAAA,EACX,YAAY;AACd;AAkBA,IAAM,qBAAqB;AAG3B,IAAI;AAoBG,SAAS,iBAAiB,MAA6C;AAC5E,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,MAAM,KAAK,CAAC;AAClB,QAAI,QAAQ,cAAc;AACxB,YAAM,OAAO,KAAK,IAAI,CAAC;AACvB,UAAI,QAAQ,CAAC,KAAK,WAAW,GAAG,EAAG,QAAO;AAAA,IAC5C,WAAW,IAAI,WAAW,aAAa,GAAG;AACxC,aAAO,IAAI,MAAM,cAAc,MAAM;AAAA,IACvC;AAAA,EACF;AACA,SAAO;AACT;AAyBA,SAAS,eAAe,OAA0D;AAChF,MAAI,mBAAmB,OAAW,QAAO;AAEzC,QAAM,YAAY,cAAc;AAIhC,QAAM,WAAW,iBAAiB,QAAQ,IAAI;AAC9C,MAAI,UAAU;AACZ,UAAM,IAAI,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ;AACnD,QAAI,GAAG;AACL,uBAAiB;AACjB,aAAO;AAAA,IACT;AAAA,EAGF;AAGA,aAAW,KAAK,WAAW;AACzB,QAAI,QAAQ,IAAI,EAAE,gBAAgB,GAAG;AACnC,uBAAiB;AACjB,aAAO;AAAA,IACT;AAAA,EACF;AAGA,aAAW,KAAK,WAAW;AACzB,QAAI,EAAE,WAAW,gBAAgB,QAAQ,IAAI,EAAE,WAAW,YAAY,GAAG;AACvE,uBAAiB;AACjB,aAAO;AAAA,IACT;AAAA,EACF;AAKA,MAAI,OAAO;AACT,UAAM,aAAuB,CAAC;AAC9B,UAAM,KAAK,MAAM;AACjB,UAAM,MAAM,MAAM;AAClB,QAAI,OAAO,OAAO,YAAY,GAAG,SAAS,EAAG,YAAW,KAAK,EAAE;AAC/D,QAAI,OAAO,QAAQ,YAAY,IAAI,SAAS,EAAG,YAAW,KAAK,GAAG;AAClE,eAAW,KAAK,WAAW;AACzB,YAAM,SAAS,IAAI,EAAE,SAAS;AAC9B,UAAI,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,CAAC,GAAG;AAC9C,yBAAiB;AACjB,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,mBAAiB;AACjB,SAAO;AACT;AAMO,SAAS,mBAAmB,OAAqD;AACtF,QAAM,WAAW,eAAe,KAAK;AACrC,QAAM,SAAS,UAAU,cAAc;AAGvC,QAAM,qBAAqB,UAAU,OAAO,OAAO,SAAS;AAC5D,QAAM,mBAAmB,kBAAkB,UAAU,OAAO,eACxD,QAAQ,IAAI,OAAO,YAAY,IAC/B;AACJ,QAAM,YAAY,sBACb,oBACA,QAAQ,IAAI,mBACZ,KAAK,KAAK,IAAI,CAAC;AAEpB,SAAO;AAAA,IACL,OAAO,UAAU,QAAQ;AAAA,IACzB;AAAA,IACA,gBAAgB,UAAU,OAAO,OAAO,cAAc;AAAA,IACtD,cAAc,UAAU,OAAO,OAAO,YAAY;AAAA,IAClD,QAAQ,UAAU,OAAO,OAAO,MAAM;AAAA,IACtC,UAAU,UAAU,OAAO,OAAO,QAAQ;AAAA,IAC1C,WAAW,UAAU,OAAO,OAAO,SAAS;AAAA,IAC5C,YAAY,UAAU,OAAO,OAAO,UAAU;AAAA,IAC9C,KAAK;AAAA,EACP;AACF;","names":[]}