prjct-cli 3.94.0 → 3.96.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +27 -21
  3. package/dist/bin/hook-chunks/{agent-identity-45BYQBU2.mjs → agent-identity-DH6DX72X.mjs} +1 -1
  4. package/dist/bin/hook-chunks/{agent-switch-2U2LOBGR.mjs → agent-switch-I4MTVE56.mjs} +1 -1
  5. package/dist/bin/hook-chunks/{analysis-N4NYGIG3.mjs → analysis-VN7APBHR.mjs} +3 -3
  6. package/dist/bin/hook-chunks/{auth-config-SP4PBALR.mjs → auth-config-JIITQ6GY.mjs} +1 -1
  7. package/dist/bin/hook-chunks/{auto-flush-BN6L6QHO.mjs → auto-flush-DX3FVSQE.mjs} +1 -1
  8. package/dist/bin/hook-chunks/{capture-gate-FRF2G3IG.mjs → capture-gate-MEIQD7ZS.mjs} +1 -1
  9. package/dist/bin/hook-chunks/{chunk-OZJ6UKKP.mjs → chunk-22GFTUER.mjs} +1 -1
  10. package/dist/bin/hook-chunks/chunk-32RX4YGI.mjs +9 -0
  11. package/dist/bin/hook-chunks/{chunk-Q3EYM4GJ.mjs → chunk-33BHU4OM.mjs} +2 -2
  12. package/dist/bin/hook-chunks/{chunk-HNEKXKOI.mjs → chunk-3AHW4XQH.mjs} +1 -1
  13. package/dist/bin/hook-chunks/{chunk-JMCMTX6U.mjs → chunk-3CKNJ5RA.mjs} +1 -1
  14. package/dist/bin/hook-chunks/{chunk-6RLCUGGG.mjs → chunk-3FEXJUO2.mjs} +1 -1
  15. package/dist/bin/hook-chunks/{chunk-7GNWHWOO.mjs → chunk-3HGQPUKG.mjs} +1 -1
  16. package/dist/bin/hook-chunks/{chunk-D6IONKRA.mjs → chunk-3UB6SFRA.mjs} +1 -1
  17. package/dist/bin/hook-chunks/{chunk-AVRNHROK.mjs → chunk-64ZEBHDX.mjs} +1 -1
  18. package/dist/bin/hook-chunks/{chunk-MI3JEFON.mjs → chunk-7PBWIO4K.mjs} +3 -3
  19. package/dist/bin/hook-chunks/{chunk-UA4Z5TGG.mjs → chunk-7WO5CEH3.mjs} +1 -1
  20. package/dist/bin/hook-chunks/chunk-A6K4H3YT.mjs +9 -0
  21. package/dist/bin/hook-chunks/{chunk-3VWBNLBC.mjs → chunk-ADYTBOCZ.mjs} +1 -1
  22. package/dist/bin/hook-chunks/{chunk-TG5CQJD5.mjs → chunk-AORD3YDQ.mjs} +1 -1
  23. package/dist/bin/hook-chunks/{chunk-EHEQOF6Z.mjs → chunk-B36LC2JR.mjs} +1 -1
  24. package/dist/bin/hook-chunks/{chunk-FX6VHIKB.mjs → chunk-BKJHD5JI.mjs} +1 -1
  25. package/dist/bin/hook-chunks/{chunk-S7HQQILD.mjs → chunk-BVK7ZDLX.mjs} +1 -1
  26. package/dist/bin/hook-chunks/{chunk-HHIGNKDO.mjs → chunk-CPR4FPXG.mjs} +1 -1
  27. package/dist/bin/hook-chunks/{chunk-6UH244CC.mjs → chunk-D7DQABWO.mjs} +1 -1
  28. package/dist/bin/hook-chunks/{chunk-Y4DUB7UN.mjs → chunk-DB226JIV.mjs} +2 -2
  29. package/dist/bin/hook-chunks/{chunk-KOCROTRM.mjs → chunk-DCHIPMOG.mjs} +1 -1
  30. package/dist/bin/hook-chunks/{chunk-IKIB42F7.mjs → chunk-E7NA34VQ.mjs} +1 -1
  31. package/dist/bin/hook-chunks/{chunk-MHQTGU45.mjs → chunk-EGCYDLSO.mjs} +1 -1
  32. package/dist/bin/hook-chunks/{chunk-ZMKTR2IO.mjs → chunk-EI6VQZOX.mjs} +1 -1
  33. package/dist/bin/hook-chunks/{chunk-INXNK57E.mjs → chunk-ETTDRXQ6.mjs} +1 -1
  34. package/dist/bin/hook-chunks/{chunk-EQ5KNMLG.mjs → chunk-EXVL2OFE.mjs} +1 -1
  35. package/dist/bin/hook-chunks/{chunk-5EQLQ7GF.mjs → chunk-FZS3XGEA.mjs} +1 -1
  36. package/dist/bin/hook-chunks/{chunk-QYEASMFV.mjs → chunk-GSPDJSJ5.mjs} +1 -1
  37. package/dist/bin/hook-chunks/{chunk-TKWAFYF7.mjs → chunk-H2DGDAQP.mjs} +1 -1
  38. package/dist/bin/hook-chunks/chunk-H5AVBDCH.mjs +8 -0
  39. package/dist/bin/hook-chunks/{chunk-SDUS2AT7.mjs → chunk-HGZQWYBL.mjs} +1 -1
  40. package/dist/bin/hook-chunks/{chunk-EMTCZG5I.mjs → chunk-IJ523YO2.mjs} +1 -1
  41. package/dist/bin/hook-chunks/{chunk-NBKEOLDH.mjs → chunk-IWUF2LGO.mjs} +5 -5
  42. package/dist/bin/hook-chunks/chunk-JGZ3QGWX.mjs +11 -0
  43. package/dist/bin/hook-chunks/{chunk-66GE3IHX.mjs → chunk-JZDZH6IV.mjs} +1 -1
  44. package/dist/bin/hook-chunks/{chunk-PUHX3ECX.mjs → chunk-KDNUQPAK.mjs} +1 -1
  45. package/dist/bin/hook-chunks/chunk-KV4NXLPT.mjs +11 -0
  46. package/dist/bin/hook-chunks/{chunk-XE4MJNBQ.mjs → chunk-LF3S3MYE.mjs} +1 -1
  47. package/dist/bin/hook-chunks/chunk-LQLCYBFF.mjs +36 -0
  48. package/dist/bin/hook-chunks/{chunk-YUKGWWL7.mjs → chunk-LR24AIEW.mjs} +1 -1
  49. package/dist/bin/hook-chunks/{chunk-2HB2JHQE.mjs → chunk-M4YM7Z3F.mjs} +15 -15
  50. package/dist/bin/hook-chunks/{chunk-F4T7IAA7.mjs → chunk-MW54MTLB.mjs} +1 -1
  51. package/dist/bin/hook-chunks/{chunk-7O6OMD4X.mjs → chunk-NCLONKOT.mjs} +1 -1
  52. package/dist/bin/hook-chunks/{chunk-HRWXMF7P.mjs → chunk-NJ74RHNC.mjs} +1 -1
  53. package/dist/bin/hook-chunks/{chunk-JUZ5LNDI.mjs → chunk-NLL5AV2G.mjs} +2 -2
  54. package/dist/bin/hook-chunks/{chunk-OIU4Y5WL.mjs → chunk-OC4CYF7V.mjs} +1 -1
  55. package/dist/bin/hook-chunks/chunk-OLQAMCYV.mjs +18 -0
  56. package/dist/bin/hook-chunks/{chunk-C3W2HLJT.mjs → chunk-PPWPUEBH.mjs} +1 -1
  57. package/dist/bin/hook-chunks/chunk-PVCEWFHS.mjs +51 -0
  58. package/dist/bin/hook-chunks/{chunk-Y3J7UUMR.mjs → chunk-QOQZHR3E.mjs} +1 -1
  59. package/dist/bin/hook-chunks/{chunk-2UC4DTDO.mjs → chunk-QXCEBAIA.mjs} +1 -1
  60. package/dist/bin/hook-chunks/chunk-RT2DFIWF.mjs +19 -0
  61. package/dist/bin/hook-chunks/{chunk-NCOOKPXX.mjs → chunk-SQW2B7NW.mjs} +1 -1
  62. package/dist/bin/hook-chunks/{chunk-IHECXD2M.mjs → chunk-SWJ7TLBD.mjs} +1 -1
  63. package/dist/bin/hook-chunks/{chunk-X2AGNDGD.mjs → chunk-TB57OYGW.mjs} +1 -1
  64. package/dist/bin/hook-chunks/{chunk-QPRNRLG6.mjs → chunk-TF6PN7IB.mjs} +1 -1
  65. package/dist/bin/hook-chunks/{chunk-KG7Z6OMK.mjs → chunk-TKXOMN4K.mjs} +4 -4
  66. package/dist/bin/hook-chunks/chunk-UMJ5D5I6.mjs +9 -0
  67. package/dist/bin/hook-chunks/{chunk-NWIQNII6.mjs → chunk-UVATSTRF.mjs} +1 -1
  68. package/dist/bin/hook-chunks/{chunk-NHIWYDQD.mjs → chunk-WJV24WE6.mjs} +1 -1
  69. package/dist/bin/hook-chunks/{chunk-Q3Z53QTH.mjs → chunk-WL6PKX3U.mjs} +1 -1
  70. package/dist/bin/hook-chunks/chunk-WUOVBBPC.mjs +11 -0
  71. package/dist/bin/hook-chunks/{chunk-TYEAIX3X.mjs → chunk-XDBJSJOT.mjs} +1 -1
  72. package/dist/bin/hook-chunks/{chunk-JCYXFHQZ.mjs → chunk-XSJ7SPVR.mjs} +1 -1
  73. package/dist/bin/hook-chunks/{chunk-J6TAD3OZ.mjs → chunk-XV2LJVYB.mjs} +1 -1
  74. package/dist/bin/hook-chunks/{chunk-7JEKBJAP.mjs → chunk-XYKVWO23.mjs} +1 -1
  75. package/dist/bin/hook-chunks/{chunk-4O4D6DV7.mjs → chunk-Y3RHBU2R.mjs} +2 -2
  76. package/dist/bin/hook-chunks/{chunk-JPSJWCFD.mjs → chunk-Y7MZA2G4.mjs} +1 -1
  77. package/dist/bin/hook-chunks/{chunk-T2FCU3ZS.mjs → chunk-YHOZTAZH.mjs} +1 -1
  78. package/dist/bin/hook-chunks/chunk-YLOK4WRR.mjs +8 -0
  79. package/dist/bin/hook-chunks/{chunk-OENWCYLF.mjs → chunk-ZJW27EUC.mjs} +1 -1
  80. package/dist/bin/hook-chunks/{chunk-VWOIUTAX.mjs → chunk-ZQI4TJ5C.mjs} +3 -3
  81. package/dist/bin/hook-chunks/chunk-ZYCNW75E.mjs +9 -0
  82. package/dist/bin/hook-chunks/{chunk-AZHE4VOM.mjs → chunk-ZZBNFNMG.mjs} +1 -1
  83. package/dist/bin/hook-chunks/{client-ERZ5CM3D.mjs → client-K3ZA2BLB.mjs} +3 -3
  84. package/dist/bin/hook-chunks/{code-graph-cloud-4GRWQSUK.mjs → code-graph-cloud-XGQF7XYC.mjs} +1 -1
  85. package/dist/bin/hook-chunks/{codex-skill-6DYQMPDJ.mjs → codex-skill-6CRFUF3A.mjs} +1 -1
  86. package/dist/bin/hook-chunks/{command-installer-MF4KUM3X.mjs → command-installer-MUHZWDZA.mjs} +1 -1
  87. package/dist/bin/hook-chunks/{config-manager-2VZPHUDG.mjs → config-manager-2JJPCLKC.mjs} +1 -1
  88. package/dist/bin/hook-chunks/{context7-service-V7CIDF3Q.mjs → context7-service-NH4BMGSJ.mjs} +1 -1
  89. package/dist/bin/hook-chunks/{custom-workflow-storage-UOBQXY42.mjs → custom-workflow-storage-VBMWLKA7.mjs} +1 -1
  90. package/dist/bin/hook-chunks/cwd-changed-UTD6Y4MS.mjs +8 -0
  91. package/dist/bin/hook-chunks/{database-XYKQF3KR.mjs → database-ZCP76LMM.mjs} +1 -1
  92. package/dist/bin/hook-chunks/{detect-changes-DFRJOOB3.mjs → detect-changes-5W6EGEZG.mjs} +1 -1
  93. package/dist/bin/hook-chunks/{developer-evolution-SLC34HUU.mjs → developer-evolution-UTY3CWOK.mjs} +1 -1
  94. package/dist/bin/hook-chunks/{distill-U2LJGUG3.mjs → distill-5TNAM3LY.mjs} +1 -1
  95. package/dist/bin/hook-chunks/{editors-config-6XFYIOE6.mjs → editors-config-2CACBNS4.mjs} +1 -1
  96. package/dist/bin/hook-chunks/{enriched-recall-X6RDNNIE.mjs → enriched-recall-6VOIUNLN.mjs} +1 -1
  97. package/dist/bin/hook-chunks/{format-ALUX4QSI.mjs → format-IIOFTSBF.mjs} +1 -1
  98. package/dist/bin/hook-chunks/{judgment-ledger-storage-SCGU3URM.mjs → judgment-ledger-storage-7Q7AEEY6.mjs} +1 -1
  99. package/dist/bin/hook-chunks/{judgment-orchestrator-BYPG65RS.mjs → judgment-orchestrator-AAON4ZJ4.mjs} +1 -1
  100. package/dist/bin/hook-chunks/{judgment-receipt-GWSSCLAB.mjs → judgment-receipt-QLV3MYFT.mjs} +1 -1
  101. package/dist/bin/hook-chunks/{land-cue-MMISX2BI.mjs → land-cue-57B23PEL.mjs} +1 -1
  102. package/dist/bin/hook-chunks/{land-synthesis-WG5JAS7B.mjs → land-synthesis-ZVPFJERV.mjs} +1 -1
  103. package/dist/bin/hook-chunks/{legacy-crew-sweep-2WSO5KEB.mjs → legacy-crew-sweep-GR6HRSHX.mjs} +2 -2
  104. package/dist/bin/hook-chunks/{memory-index-QK5QJOFJ.mjs → memory-index-XE2MWKQS.mjs} +1 -1
  105. package/dist/bin/hook-chunks/{notification-MPVWVV52.mjs → notification-GU2ZJP5K.mjs} +1 -1
  106. package/dist/bin/hook-chunks/{pack-integrity-XRYOROK5.mjs → pack-integrity-WV5U3AFF.mjs} +1 -1
  107. package/dist/bin/hook-chunks/{pack-manager-WWGQNJDQ.mjs → pack-manager-QLFQKP24.mjs} +1 -1
  108. package/dist/bin/hook-chunks/{path-manager-ZR5RAKTK.mjs → path-manager-375HH6TB.mjs} +1 -1
  109. package/dist/bin/hook-chunks/{planning-S55KBPN2.mjs → planning-VPAX5DZL.mjs} +2 -2
  110. package/dist/bin/hook-chunks/{post-edit-QMHSZHDN.mjs → post-edit-UXCFSR3Y.mjs} +1 -1
  111. package/dist/bin/hook-chunks/{pre-bash-RAM6L3G4.mjs → pre-bash-MB4JNNYG.mjs} +1 -1
  112. package/dist/bin/hook-chunks/{pre-commit-736ZLMDL.mjs → pre-commit-U7TRFKWX.mjs} +1 -1
  113. package/dist/bin/hook-chunks/pre-edit-MDCQXI5F.mjs +11 -0
  114. package/dist/bin/hook-chunks/{pre-package-LCIAWWGK.mjs → pre-package-A6ZI5R64.mjs} +1 -1
  115. package/dist/bin/hook-chunks/{pre-search-J5EOFMYN.mjs → pre-search-ZZO3LGXJ.mjs} +1 -1
  116. package/dist/bin/hook-chunks/{pre-secrets-TSUMTXHH.mjs → pre-secrets-MWPPZPWK.mjs} +1 -1
  117. package/dist/bin/hook-chunks/{prjct-md-T2DG236Y.mjs → prjct-md-MS52YLI2.mjs} +1 -1
  118. package/dist/bin/hook-chunks/{project-agent-surfaces-VRY22I66.mjs → project-agent-surfaces-6AIW7KL6.mjs} +1 -1
  119. package/dist/bin/hook-chunks/{project-file-inventory-5DEN5VLF.mjs → project-file-inventory-HHURZTMH.mjs} +1 -1
  120. package/dist/bin/hook-chunks/project-memory-UDH56VFP.mjs +8 -0
  121. package/dist/bin/hook-chunks/{project-style-evolution-7MAUSED2.mjs → project-style-evolution-IJXT2MCP.mjs} +1 -1
  122. package/dist/bin/hook-chunks/prompt-7VZLYONO.mjs +24 -0
  123. package/dist/bin/hook-chunks/{publish-helper-G54XQV5K.mjs → publish-helper-ZSL27HSX.mjs} +1 -1
  124. package/dist/bin/hook-chunks/{purge-MC5LFSAO.mjs → purge-N2WN6NDB.mjs} +1 -1
  125. package/dist/bin/hook-chunks/retention-RET4P2RO.mjs +8 -0
  126. package/dist/bin/hook-chunks/{sdd-5UCVX43H.mjs → sdd-PB6WKSLE.mjs} +1 -1
  127. package/dist/bin/hook-chunks/{session-continuity-RKNAJJHR.mjs → session-continuity-BIJXMN44.mjs} +1 -1
  128. package/dist/bin/hook-chunks/session-start-R2VMKW2L.mjs +8 -0
  129. package/dist/bin/hook-chunks/settings-installer-CQKMGMRG.mjs +9 -0
  130. package/dist/bin/hook-chunks/{setup-WQRJ6TQL.mjs → setup-PPIZHVXS.mjs} +3 -3
  131. package/dist/bin/hook-chunks/{shipping-5D5LTJ3P.mjs → shipping-C637PCOF.mjs} +4 -4
  132. package/dist/bin/hook-chunks/{skill-index-RAVJMC4P.mjs → skill-index-55I3HLAI.mjs} +1 -1
  133. package/dist/bin/hook-chunks/{spec-context-inference-7DDSTRTV.mjs → spec-context-inference-RTTDOZZO.mjs} +1 -1
  134. package/dist/bin/hook-chunks/{spec-service-LAO5Z2M5.mjs → spec-service-ENLAAMVL.mjs} +2 -2
  135. package/dist/bin/hook-chunks/{spec-task-breakdown-K3GMQKGH.mjs → spec-task-breakdown-RUDEP3AY.mjs} +1 -1
  136. package/dist/bin/hook-chunks/{state-storage-EIFGUO7X.mjs → state-storage-AJUPG7J5.mjs} +1 -1
  137. package/dist/bin/hook-chunks/stop-DPXAWJFN.mjs +16 -0
  138. package/dist/bin/hook-chunks/subagent-start-AFHPXL2S.mjs +8 -0
  139. package/dist/bin/hook-chunks/{subagent-stop-RBD2OILE.mjs → subagent-stop-5BMV63ML.mjs} +1 -1
  140. package/dist/bin/hook-chunks/{surface-attribution-K37N2NK7.mjs → surface-attribution-EGIKCVMF.mjs} +1 -1
  141. package/dist/bin/hook-chunks/{symbol-graph-BKQIMFRG.mjs → symbol-graph-MH42JSPX.mjs} +1 -1
  142. package/dist/bin/hook-chunks/{sync-client-EGBMWF3J.mjs → sync-client-PIRHMHXL.mjs} +1 -1
  143. package/dist/bin/hook-chunks/{sync-cursor-storage-E3LMZISA.mjs → sync-cursor-storage-ZB7FGT6D.mjs} +1 -1
  144. package/dist/bin/hook-chunks/{task-orchestration-2ZYE5M6J.mjs → task-orchestration-7NGRIISS.mjs} +1 -1
  145. package/dist/bin/hook-chunks/{task-overview-ITY5OSHX.mjs → task-overview-F3GB77OA.mjs} +1 -1
  146. package/dist/bin/hook-chunks/task-service-FZABHPFV.mjs +8 -0
  147. package/dist/bin/hook-chunks/{tdd-7S55S5C3.mjs → tdd-TAMBOPN3.mjs} +1 -1
  148. package/dist/bin/hook-chunks/{template-loader-SCM4C2A3.mjs → template-loader-MXOMU4XH.mjs} +1 -1
  149. package/dist/bin/hook-chunks/{transcript-jsonl-6X4DDD6R.mjs → transcript-jsonl-7W2NOJPZ.mjs} +1 -1
  150. package/dist/bin/hook-chunks/{usefulness-SCH5ARGV.mjs → usefulness-TBD5EYAL.mjs} +1 -1
  151. package/dist/bin/hook-chunks/{vault-retire-notice-HT756AND.mjs → vault-retire-notice-7XHVNHU6.mjs} +1 -1
  152. package/dist/bin/hook-chunks/{velocity-storage-47CF3XWZ.mjs → velocity-storage-IOCVK2LU.mjs} +1 -1
  153. package/dist/bin/hook-chunks/{weak-model-mode-FLCEQ2BV.mjs → weak-model-mode-BMSPGEQY.mjs} +1 -1
  154. package/dist/bin/hook-chunks/{work-graph-JQHVVXIZ.mjs → work-graph-AVAOKY63.mjs} +1 -1
  155. package/dist/bin/hook-chunks/work-scope-YCS4GTXW.mjs +8 -0
  156. package/dist/bin/hook-chunks/{workspace-occupancy-UUW4UGGB.mjs → workspace-occupancy-JOBYNNXV.mjs} +1 -1
  157. package/dist/bin/hook-fast-darwin-arm64 +0 -0
  158. package/dist/bin/hook-fast-darwin-x64 +0 -0
  159. package/dist/bin/hook-fast-linux-x64 +0 -0
  160. package/dist/bin/prjct-core.mjs +739 -714
  161. package/dist/bin/prjct-hooks.mjs +3 -3
  162. package/dist/bin/prjct.mjs +22 -9
  163. package/dist/daemon/entry.mjs +620 -593
  164. package/dist/mcp/server.mjs +317 -303
  165. package/package.json +3 -5
  166. package/scripts/install.sh +28 -496
  167. package/dist/bin/hook-chunks/chunk-27XFSCOE.mjs +0 -43
  168. package/dist/bin/hook-chunks/chunk-4SKJWNKE.mjs +0 -11
  169. package/dist/bin/hook-chunks/chunk-AZYQFRPJ.mjs +0 -9
  170. package/dist/bin/hook-chunks/chunk-DRGI5UHQ.mjs +0 -10
  171. package/dist/bin/hook-chunks/chunk-GFY4GY3Z.mjs +0 -8
  172. package/dist/bin/hook-chunks/chunk-JAMSIKDE.mjs +0 -9
  173. package/dist/bin/hook-chunks/chunk-NUJASVHN.mjs +0 -18
  174. package/dist/bin/hook-chunks/chunk-NWZEBCTC.mjs +0 -19
  175. package/dist/bin/hook-chunks/chunk-PW3KYKVS.mjs +0 -9
  176. package/dist/bin/hook-chunks/chunk-TFCLMTJ5.mjs +0 -9
  177. package/dist/bin/hook-chunks/chunk-TRMBRDKH.mjs +0 -8
  178. package/dist/bin/hook-chunks/chunk-V2BSS7HW.mjs +0 -36
  179. package/dist/bin/hook-chunks/chunk-ZJXH76Q5.mjs +0 -11
  180. package/dist/bin/hook-chunks/cwd-changed-J6O46KS7.mjs +0 -8
  181. package/dist/bin/hook-chunks/pre-edit-GZ4QJ2MU.mjs +0 -11
  182. package/dist/bin/hook-chunks/project-memory-KKEMTEMP.mjs +0 -8
  183. package/dist/bin/hook-chunks/prompt-DVF6V2X2.mjs +0 -22
  184. package/dist/bin/hook-chunks/retention-LWETHQX3.mjs +0 -8
  185. package/dist/bin/hook-chunks/session-start-MFMFKUPK.mjs +0 -8
  186. package/dist/bin/hook-chunks/settings-installer-QDM3GB6J.mjs +0 -9
  187. package/dist/bin/hook-chunks/stop-RYLI4FGF.mjs +0 -16
  188. package/dist/bin/hook-chunks/subagent-start-CCUPSANT.mjs +0 -8
  189. package/dist/bin/hook-chunks/task-service-XREJLWEF.mjs +0 -8
  190. package/dist/bin/hook-chunks/work-scope-CDLSZ4U5.mjs +0 -8
@@ -5,9 +5,9 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{a as f}from"./chunk-Y5NQV46G.mjs";import{a as v}from"./chunk-27XFSCOE.mjs";import{e as p,g as I}from"./chunk-KG7Z6OMK.mjs";import{a as R,b as q}from"./chunk-WUHGODSQ.mjs";import{b as H,p as F}from"./chunk-QWQFF2UG.mjs";import{b as x}from"./chunk-GCKILEXJ.mjs";import{a as s}from"./chunk-E66B27AL.mjs";I();var U="https://api.openai.com/v1";function M(r,e){return/openrouter\.ai/i.test(e)&&r&&!r.includes("/")?`openai/${r}`:r}s(M,"normalizeModelForBaseUrl");var G="embeddings.provider",V="embeddings.baseUrl",$="embeddings.model",Y="embeddings.authHeader",j="embeddings.authScheme",z="embeddings.headers",W="embeddings.query";function J(r){if(!(typeof r!="string"||!r.trim()))try{let e=JSON.parse(r);if(e&&typeof e=="object"&&!Array.isArray(e)){let n={};for(let[t,i]of Object.entries(e))n[t]=String(i);return Object.keys(n).length?n:void 0}}catch{}}s(J,"parseHeaders");function w(){let r=f(G),e=f($);if(r!=="openai-compatible"||!e)return null;let n=f(j),t=f(Y),i=f(W),o=String(f(V)??U);return{provider:"openai-compatible",baseUrl:o,model:M(String(e),o),authHeader:t!=null?String(t):void 0,authScheme:n!=null?String(n):void 0,extraHeaders:J(f(z)),query:i!=null?String(i):void 0}}s(w,"resolveGlobalEmbeddings");q();F();import X from"node:fs";import Q from"node:path";var D="PRJCT_EMBEDDINGS_API_KEY",Z="prjct-embeddings",ee="prjct";function re(){return Q.join(R(),"config","embeddings.key")}s(re,"keyFilePath");var S={value:void 0};function ne(){return process.platform==="darwin"}s(ne,"isDarwin");async function te(){try{let{stdout:r}=await H("security",["find-generic-password","-a",ee,"-s",Z,"-w"]);return r.trim()||null}catch{return null}}s(te,"readKeychain");function ie(){try{return X.readFileSync(re(),"utf-8").trim()||null}catch{return null}}s(ie,"readFileKey");async function k(){if(S.value!==void 0)return S.value;let r=process.env[D]?.trim();if(r)return S.value=r,r;let e=(ne()?await te():null)??ie();return S.value=e,e}s(k,"getEmbeddingsKey");function oe(r){let e=r?.embeddings;return!e||!e.provider||!e.model?null:e.provider==="openai-compatible"?new _(e.baseUrl??"https://api.openai.com/v1",e.model,{authHeader:e.authHeader,authScheme:e.authScheme,extraHeaders:e.headers,query:e.query}):null}s(oe,"resolveProvider");function se(r,e,n,t,i={}){let o=r.replace(/\/+$/,""),a=i.query?.trim().replace(/^\?/,""),u=`${o}/embeddings${a?`?${a}`:""}`,l=M(e,o),g={"content-type":"application/json",...i.extraHeaders??{}};if(t){let b=i.authHeader?.trim()||"authorization",m=i.authScheme??"Bearer";g[b]=m?`${m} ${t}`:t}return{url:u,init:{method:"POST",headers:g,body:JSON.stringify({model:l,input:n})}}}s(se,"buildEmbeddingsRequest");var _=class{constructor(e,n,t={}){this.baseUrl=e;this.model=n;this.auth=t}baseUrl;model;auth;static{s(this,"HttpEmbeddingProvider")}async embed(e){if(e.length===0)return[];let n=await k(),{url:t,init:i}=se(this.baseUrl,this.model,e,n,this.auth),o=await fetch(t,i);if(!o.ok)throw new Error(`embeddings endpoint ${o.status}: ${await o.text().catch(()=>"")}`);return((await o.json()).data??[]).map(u=>u.embedding)}},de="local-subword-v1",N=256,ae=800;function ce(r){return r.split("").reduce((n,t)=>Math.imul(n^t.charCodeAt(0),16777619),2166136261)>>>0}s(ce,"fnv1a");function ue(r,e,n){let t=[];if(r.length<e)return t.push(r),t;for(let i of Array.from({length:n-e+1},(o,a)=>e+a))t.push(...Array.from({length:Math.max(0,r.length-i+1)},(o,a)=>r.slice(a,a+i)));return t}s(ue,"charNGrams");function P(r){let e=new Float64Array(N),n=(r.toLowerCase().match(/[\p{L}\p{N}]+/gu)??[]).slice(0,ae);for(let i of n){let o=ue(`<${i}>`,3,5);o.push(i);for(let a of o){let u=ce(a),l=u%N,g=u&65536?1:-1;e[l]+=g}}let t=Math.sqrt(e.reduce((i,o)=>i+o*o,0))||1;return Array.from(e,i=>i/t)}s(P,"embedLocal");function Oe(r){return P(r)}s(Oe,"embedLocalText");var L=class{static{s(this,"LocalSubwordEmbeddingProvider")}model=de;isLocal=!0;async embed(e){return e.map(n=>P(n))}};function O(r){let e=oe(r);if(e)return e;let n=w();return n?new _(n.baseUrl,n.model,{authHeader:n.authHeader,authScheme:n.authScheme,extraHeaders:n.extraHeaders,query:n.query}):new L}s(O,"resolveActiveProvider");function me(r){return Buffer.from(new Float32Array(r).buffer)}s(me,"packVector");function le(r){let e=Uint8Array.from(r);return new Float32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}s(le,"unpackVector");function Ce(r,e){let n=E(r)*E(e);return n===0?0:T(r,e)/n}s(Ce,"cosineSimilarity");function E(r){let e=Array.from({length:r.length},(n,t)=>r[t]).reduce((n,t)=>n+t*t,0);return Math.sqrt(e)}s(E,"l2Norm");function T(r,e){let n=Math.min(r.length,e.length);return Array.from({length:n},(t,i)=>r[i]*e[i]).reduce((t,i)=>t+i,0)}s(T,"dot");var ge=2e3,fe=10,C=new Map,Pe={isEnabled(r){return!0},store(r,e,n,t,i){p.run(r,`INSERT INTO memory_embeddings (memory_id, vector, model, dims, norm, created_at)
8
+ import{a as f}from"./chunk-Y5NQV46G.mjs";import{b as v}from"./chunk-PVCEWFHS.mjs";import{e as p,g as I}from"./chunk-TKXOMN4K.mjs";import{a as H,b as K}from"./chunk-WUHGODSQ.mjs";import{b as N,p as q}from"./chunk-QWQFF2UG.mjs";import{b as A}from"./chunk-GCKILEXJ.mjs";import{a as s}from"./chunk-E66B27AL.mjs";I();var L="https://api.openai.com/v1";function M(r,e){return/openrouter\.ai/i.test(e)&&r&&!r.includes("/")?`openai/${r}`:r}s(M,"normalizeModelForBaseUrl");var G="embeddings.provider",V="embeddings.baseUrl",$="embeddings.model",Y="embeddings.authHeader",j="embeddings.authScheme",z="embeddings.headers",W="embeddings.query";function J(r){if(!(typeof r!="string"||!r.trim()))try{let e=JSON.parse(r);if(e&&typeof e=="object"&&!Array.isArray(e)){let n={};for(let[t,i]of Object.entries(e))n[t]=String(i);return Object.keys(n).length?n:void 0}}catch{}}s(J,"parseHeaders");function w(){let r=f(G),e=f($);if(r!=="openai-compatible"||!e)return null;let n=f(j),t=f(Y),i=f(W),o=String(f(V)??L);return{provider:"openai-compatible",baseUrl:o,model:M(String(e),o),authHeader:t!=null?String(t):void 0,authScheme:n!=null?String(n):void 0,extraHeaders:J(f(z)),query:i!=null?String(i):void 0}}s(w,"resolveGlobalEmbeddings");K();q();import X from"node:fs";import Q from"node:path";var U="PRJCT_EMBEDDINGS_API_KEY",Z="prjct-embeddings",ee="prjct";function re(){return Q.join(H(),"config","embeddings.key")}s(re,"keyFilePath");var S={value:void 0};function ne(){return process.platform==="darwin"}s(ne,"isDarwin");async function te(){try{let{stdout:r}=await N("security",["find-generic-password","-a",ee,"-s",Z,"-w"]);return r.trim()||null}catch{return null}}s(te,"readKeychain");function ie(){try{return X.readFileSync(re(),"utf-8").trim()||null}catch{return null}}s(ie,"readFileKey");async function D(){if(S.value!==void 0)return S.value;let r=process.env[U]?.trim();if(r)return S.value=r,r;let e=(ne()?await te():null)??ie();return S.value=e,e}s(D,"getEmbeddingsKey");function oe(r){let e=r?.embeddings;return!e||!e.provider||!e.model?null:e.provider==="openai-compatible"?new _(e.baseUrl??"https://api.openai.com/v1",e.model,{authHeader:e.authHeader,authScheme:e.authScheme,extraHeaders:e.headers,query:e.query}):null}s(oe,"resolveProvider");function se(r,e,n,t,i={}){let o=r.replace(/\/+$/,""),a=i.query?.trim().replace(/^\?/,""),u=`${o}/embeddings${a?`?${a}`:""}`,l=M(e,o),g={"content-type":"application/json",...i.extraHeaders??{}};if(t){let b=i.authHeader?.trim()||"authorization",m=i.authScheme??"Bearer";g[b]=m?`${m} ${t}`:t}return{url:u,init:{method:"POST",headers:g,body:JSON.stringify({model:l,input:n})}}}s(se,"buildEmbeddingsRequest");var _=class{constructor(e,n,t={}){this.baseUrl=e;this.model=n;this.auth=t}baseUrl;model;auth;static{s(this,"HttpEmbeddingProvider")}async embed(e){if(e.length===0)return[];let n=await D(),{url:t,init:i}=se(this.baseUrl,this.model,e,n,this.auth),o=await fetch(t,i);if(!o.ok)throw new Error(`embeddings endpoint ${o.status}: ${await o.text().catch(()=>"")}`);return((await o.json()).data??[]).map(u=>u.embedding)}},de="local-subword-v1",O=256,ae=800;function ce(r){return Array.from({length:r.length},(n,t)=>r.charCodeAt(t)).reduce((n,t)=>Math.imul(n^t,16777619),2166136261)>>>0}s(ce,"fnv1a");function ue(r,e,n){let t=[];if(r.length<e)return t.push(r),t;for(let i of Array.from({length:n-e+1},(o,a)=>e+a))t.push(...Array.from({length:Math.max(0,r.length-i+1)},(o,a)=>r.slice(a,a+i)));return t}s(ue,"charNGrams");function k(r){let e=new Float64Array(O),n=(r.toLowerCase().match(/[\p{L}\p{N}]+/gu)??[]).slice(0,ae);for(let i of n){let o=ue(`<${i}>`,3,5);o.push(i);for(let a of o){let u=ce(a),l=u%O,g=u&65536?1:-1;e[l]+=g}}let t=Math.sqrt(e.reduce((i,o)=>i+o*o,0))||1;return Array.from(e,i=>i/t)}s(k,"embedLocal");function Ce(r){return k(r)}s(Ce,"embedLocalText");var R=class{static{s(this,"LocalSubwordEmbeddingProvider")}model=de;isLocal=!0;async embed(e){return e.map(n=>k(n))}};function C(r){let e=oe(r);if(e)return e;let n=w();return n?new _(n.baseUrl,n.model,{authHeader:n.authHeader,authScheme:n.authScheme,extraHeaders:n.extraHeaders,query:n.query}):new R}s(C,"resolveActiveProvider");function me(r){return Buffer.from(new Float32Array(r).buffer)}s(me,"packVector");function le(r){let e=Uint8Array.from(r);return new Float32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4))}s(le,"unpackVector");function Pe(r,e){let n=E(r)*E(e);return n===0?0:F(r,e)/n}s(Pe,"cosineSimilarity");function E(r){return Math.sqrt(r.reduce((e,n)=>e+n*n,0))}s(E,"l2Norm");function F(r,e){let n=Math.min(r.length,e.length);return r.reduce((t,i,o)=>o<n?t+i*e[o]:t,0)}s(F,"dot");var ge=2e3,fe=10,P=new Map,ke={isEnabled(r){return!0},store(r,e,n,t,i){p.run(r,`INSERT INTO memory_embeddings (memory_id, vector, model, dims, norm, created_at)
9
9
  VALUES (?, ?, ?, ?, ?, ?)
10
10
  ON CONFLICT(memory_id) DO UPDATE SET
11
11
  vector = excluded.vector, model = excluded.model,
12
- dims = excluded.dims, norm = excluded.norm, created_at = excluded.created_at`,e,me(n),t,n.length,E(n),i)},embeddedIds(r,e){try{let n=p.query(r,"SELECT memory_id FROM memory_embeddings WHERE model = ?",e);return new Set(n.map(t=>t.memory_id))}catch{return new Set}},async backfill(r,e,n,t={}){let i=t.provider??O(e),o=t.batchSize??64,a=await(async()=>{try{let{evaluateRetention:d}=await import("./retention-LWETHQX3.mjs");return d(r,Date.now()).byId}catch{return null}})(),u=v.unembeddedEntriesForIndex(r,i.model).filter(d=>{if(!x(d)||d.content.trim().length===0)return!1;let c=a?.get(d.id);return!(c&&c.verdict!=="active")});if(this.shouldPruneThisRun(r)){let c=v.allEntriesForIndex(r).filter(h=>{if(!x(h))return!0;let y=a?.get(h.id);return y!=null&&y.verdict!=="active"}).map(h=>h.id);this.pruneNonModelVectors(r,c)}let l=this.countByModel(r,i.model),g=Array.from({length:Math.ceil(u.length/o)},(d,c)=>u.slice(c*o,(c+1)*o)),b=[];for(let d of g)try{let c=await i.embed(d.map(y=>y.content)),h=d.reduce((y,B,K)=>{let A=c[K];return!A||A.length===0?y:(this.store(r,B.id,A,i.model,n),y+1)},0);b.push(h)}catch{}return{embedded:b.reduce((d,c)=>d+c,0),skipped:l,total:l+u.length}},countByModel(r,e){try{return p.get(r,"SELECT COUNT(*) AS n FROM memory_embeddings WHERE model = ?",e)?.n??0}catch{return 0}},shouldPruneThisRun(r){let e=C.get(r)??0;return C.set(r,(e+1)%fe),e===0},pruneNonModelVectors(r,e){if(e.length!==0)try{let n=e.map(()=>"?").join(",");p.run(r,`DELETE FROM memory_embeddings WHERE memory_id IN (${n})`,...e)}catch{}},async semanticSearch(r,e,n,t=10,i){let o=i??O(n);if(!e.trim())return[];let a=await(async()=>{try{return(await o.embed([e]))[0]}catch{return}})();if(!a||a.length===0)return[];let u=(()=>{try{return p.query(r,`SELECT memory_id, vector, norm FROM memory_embeddings
13
- WHERE model = ? ORDER BY rowid DESC LIMIT ?`,o.model,ge)}catch{return null}})();if(!u)return[];let l=E(a);if(l===0)return[];let g=u.map(m=>{let d=le(m.vector),c=l*(m.norm??E(d));return{id:m.memory_id,score:c===0?0:T(a,d)/c}}).sort((m,d)=>d.score-m.score).slice(0,t),b=[];for(let m of g){let d=v.getById(r,m.id);d&&b.push(d)}return b}};export{Oe as a,Ce as b,Pe as c};
12
+ dims = excluded.dims, norm = excluded.norm, created_at = excluded.created_at`,e,me(n),t,n.length,E(n),i)},embeddedIds(r,e){try{let n=p.query(r,"SELECT memory_id FROM memory_embeddings WHERE model = ?",e);return new Set(n.map(t=>t.memory_id))}catch{return new Set}},async backfill(r,e,n,t={}){let i=t.provider??C(e),o=t.batchSize??64,a=await(async()=>{try{let{evaluateRetention:d}=await import("./retention-RET4P2RO.mjs");return d(r,Date.now()).byId}catch{return null}})(),u=v.unembeddedEntriesForIndex(r,i.model).filter(d=>{if(!A(d)||d.content.trim().length===0)return!1;let c=a?.get(d.id);return!(c&&c.verdict!=="active")});if(this.shouldPruneThisRun(r)){let c=v.allEntriesForIndex(r).filter(h=>{if(!A(h))return!0;let y=a?.get(h.id);return y!=null&&y.verdict!=="active"}).map(h=>h.id);this.pruneNonModelVectors(r,c)}let l=this.countByModel(r,i.model),g=Array.from({length:Math.ceil(u.length/o)},(d,c)=>u.slice(c*o,(c+1)*o)),b=[];for(let d of g)try{let c=await i.embed(d.map(y=>y.content)),h=d.reduce((y,T,B)=>{let x=c[B];return!x||x.length===0?y:(this.store(r,T.id,x,i.model,n),y+1)},0);b.push(h)}catch{}return{embedded:b.reduce((d,c)=>d+c,0),skipped:l,total:l+u.length}},countByModel(r,e){try{return p.get(r,"SELECT COUNT(*) AS n FROM memory_embeddings WHERE model = ?",e)?.n??0}catch{return 0}},shouldPruneThisRun(r){let e=P.get(r)??0;return P.set(r,(e+1)%fe),e===0},pruneNonModelVectors(r,e){if(e.length!==0)try{let n=e.map(()=>"?").join(",");p.run(r,`DELETE FROM memory_embeddings WHERE memory_id IN (${n})`,...e)}catch{}},async semanticSearch(r,e,n,t=10,i){let o=i??C(n);if(!e.trim())return[];let a=await(async()=>{try{return(await o.embed([e]))[0]}catch{return}})();if(!a||a.length===0)return[];let u=(()=>{try{return p.query(r,`SELECT memory_id, vector, norm FROM memory_embeddings
13
+ WHERE model = ? ORDER BY rowid DESC LIMIT ?`,o.model,ge)}catch{return null}})();if(!u)return[];let l=E(a);if(l===0)return[];let g=u.map(m=>{let d=le(m.vector),c=l*(m.norm??E(d));return{id:m.memory_id,score:c===0?0:F(a,d)/c}}).sort((m,d)=>d.score-m.score).slice(0,t),b=[];for(let m of g){let d=v.getById(r,m.id);d&&b.push(d)}return b}};export{Ce as a,Pe as b,F as c,ke as d};
@@ -5,4 +5,4 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{a as r}from"./chunk-TG5CQJD5.mjs";import{c as d}from"./chunk-M5E2YOZ4.mjs";import{a as i}from"./chunk-E66B27AL.mjs";var u={upsert:"updated",delete:"deleted"},o={value:null};async function p(){if(o.value)return o.value;try{let{default:e}=await import("./auth-config-SP4PBALR.mjs"),t=e;if(typeof t.getDeviceId=="function"){let n=await t.getDeviceId();return o.value=n,n}return"unknown-device"}catch{return"unknown-device"}}i(p,"resolveDeviceId");async function v(e){try{let t=await p(),n=d(e.data),c={type:`${e.entityType}.${u[e.eventType]}`,path:[e.entityType,e.entityId],data:e.data,timestamp:new Date().toISOString(),projectId:e.projectId,entityType:e.entityType,entityId:e.entityId,eventType:e.eventType,contentHash:n,deviceId:t,originDeviceId:e.originDeviceId??t,revisionCount:e.revisionCount??1};await r.publish(c)}catch{}}i(v,"publishCRUD");function a(e){v(e)}i(a,"publishCRUDSync");export{v as a,a as b};
8
+ import{a as r}from"./chunk-AORD3YDQ.mjs";import{c as d}from"./chunk-M5E2YOZ4.mjs";import{a as i}from"./chunk-E66B27AL.mjs";var u={upsert:"updated",delete:"deleted"},o={value:null};async function p(){if(o.value)return o.value;try{let{default:e}=await import("./auth-config-JIITQ6GY.mjs"),t=e;if(typeof t.getDeviceId=="function"){let n=await t.getDeviceId();return o.value=n,n}return"unknown-device"}catch{return"unknown-device"}}i(p,"resolveDeviceId");async function v(e){try{let t=await p(),n=d(e.data),c={type:`${e.entityType}.${u[e.eventType]}`,path:[e.entityType,e.entityId],data:e.data,timestamp:new Date().toISOString(),projectId:e.projectId,entityType:e.entityType,entityId:e.entityId,eventType:e.eventType,contentHash:n,deviceId:t,originDeviceId:e.originDeviceId??t,revisionCount:e.revisionCount??1};await r.publish(c)}catch{}}i(v,"publishCRUD");function a(e){v(e)}i(a,"publishCRUDSync");export{v as a,a as b};
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ import { dirname as __pathDirname } from 'path';
5
+ const require = __createRequire(import.meta.url);
6
+ const __filename = __fileURLToPath(import.meta.url);
7
+ const __dirname = __pathDirname(__filename);
8
+ import{c as y,d as D,e as Q,f as vt}from"./chunk-HDSS6UB3.mjs";import{a as Y,b as m,c as q,d as wt}from"./chunk-JQE2F2RK.mjs";import{a as z,b as Dt}from"./chunk-WUHGODSQ.mjs";import{g as K,k as l,l as N,m as P,o as S}from"./chunk-UH4MD3F3.mjs";import{a as J,b as A,p as W}from"./chunk-QWQFF2UG.mjs";import{a as i,c as h,d as yt,e as F}from"./chunk-E66B27AL.mjs";function $t(e){let t=e.getFullYear(),n=(e.getMonth()+1).toString().padStart(2,"0"),r=e.getDate().toString().padStart(2,"0");return`${t}-${n}-${r}`}function X(e){return{year:e.getFullYear().toString(),month:(e.getMonth()+1).toString().padStart(2,"0"),day:e.getDate().toString().padStart(2,"0")}}function _t(){return new Date().toISOString()}function xt(e){let t=new Date;return t.setDate(t.getDate()-e),t}function Bt(e){return xt(e).toISOString()}function Lt(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:null}function Ut(e,t){if(!e||!t)return null;let n=Date.parse(e),r=Date.parse(t);return!Number.isFinite(n)||!Number.isFinite(r)||r<n?null:Math.round((r-n)/6e4)}function Vt(e){let t=Math.floor(e/1e3),n=Math.floor(t/60),r=Math.floor(n/60),o=Math.floor(r/24);return o>0?`${o}d ${r%24}h`:r>0?`${r}h ${n%60}m`:n>0?`${n}m`:`${t}s`}var zt,Z=h(()=>{"use strict";i($t,"formatDate");i(X,"getYearMonthDay");i(_t,"getTimestamp");i(xt,"getDaysAgo");i(Bt,"sinceIso");i(Lt,"nullableNumber");i(Ut,"durationMinutes");i(Vt,"formatDuration");zt=new Intl.RelativeTimeFormat("en",{numeric:"always"})});import St from"node:fs";import w from"node:fs/promises";import u from"node:path";async function R(e){let t={isMonorepo:!1,type:null,rootPath:e,packages:[]},n=[{file:"pnpm-workspace.yaml",type:"pnpm"},{file:"lerna.json",type:"lerna"},{file:"nx.json",type:"nx"},{file:"rush.json",type:"rush"},{file:"turbo.json",type:"turborepo"}];for(let r of n)if(await l(u.join(e,r.file))){t.isMonorepo=!0,t.type=r.type;break}if(!t.isMonorepo){let r=u.join(e,"package.json");if(await l(r))try{JSON.parse(await w.readFile(r,"utf-8")).workspaces&&(t.isMonorepo=!0,t.type="npm")}catch{}}return t.isMonorepo&&(t.packages=await T(e,t.type)),t}async function T(e,t){let n=[];try{let r=await(async()=>{if(t==="pnpm"){let g=(await w.readFile(u.join(e,"pnpm-workspace.yaml"),"utf-8")).match(/packages:\s*\n((?:\s*-\s*.+\n?)+)/);return g?g[1].split(`
9
+ `).map(c=>c.replace(/^\s*-\s*['"]?|['"]?\s*$/g,"")).filter(Boolean):[]}if(t==="npm"||t==="lerna"){let a=u.join(e,"package.json"),g=JSON.parse(await w.readFile(a,"utf-8")),c=Array.isArray(g.workspaces)?g.workspaces:g.workspaces?.packages??[];if(t==="lerna"){let d=u.join(e,"lerna.json");if(await l(d)){let p=JSON.parse(await w.readFile(d,"utf-8"));if(p.packages)return p.packages}}return c}if(t==="nx")return["apps/*","libs/*","packages/*"];if(t==="turborepo"){let a=JSON.parse(await w.readFile(u.join(e,"package.json"),"utf-8"));return Array.isArray(a.workspaces)?a.workspaces:[]}return[]})(),o=r.length>0?r:["packages/*","apps/*","libs/*"];for(let a of o){if(a.startsWith("!"))continue;let g=Ct(a,{cwd:e});for(let c of g){let d=u.join(e,c),p=u.join(d,"package.json");if(await l(p))try{let f=JSON.parse(await w.readFile(p,"utf-8")),j=u.join(d,"PRJCT.md");n.push({name:f.name||u.basename(c),path:d,relativePath:c,hasPrjctMd:await l(j)})}catch{}}}}catch{}return n}async function tt(e,t){if(!t.isMonorepo)return null;let n=u.resolve(e);for(let r of t.packages){let o=u.resolve(r.path);if(n.startsWith(o))return r}return null}async function E(e){let t=u.resolve(e),n=u.parse(t).root;return t===n?null:(await R(t)).isMonorepo?t:E(u.dirname(t))}var Ct,et=h(()=>{"use strict";S();Ct=St.globSync;i(R,"detectMonorepo");i(T,"discoverMonorepoPackages");i(tt,"findContainingPackage");i(E,"findMonorepoRoot")});function rt(e,t){let n=typeof e=="string"?new Date(e).getTime():e;return Date.now()-n>t}var nt,it=h(()=>{"use strict";i(rt,"isExpired");nt=class{static{i(this,"TTLCache")}cache=new Map;ttl;maxSize;constructor(t={}){this.ttl=t.ttl??5e3,this.maxSize=t.maxSize??50}isValid(t){let n=this.cache.get(t);return n?Date.now()-n.timestamp<this.ttl:!1}get(t){let n=this.cache.get(t);return n?this.isValid(t)?n.data:(this.cache.delete(t),null):null}set(t,n){this.cache.set(t,{data:n,timestamp:Date.now()}),this.evictOldEntries()}delete(t){this.cache.delete(t)}clear(){this.cache.clear()}has(t){return this.cache.has(t)}get size(){return this.cache.size}evictOldEntries(){if(this.cache.size<=this.maxSize)return;let n=Array.from(this.cache.entries()).sort((r,o)=>r[1].timestamp-o[1].timestamp).slice(0,this.cache.size-this.maxSize);for(let[r]of n)this.cache.delete(r)}stats(){return{size:this.cache.size,maxSize:this.maxSize,ttl:this.ttl}}prune(){let t=[...this.cache.keys()].filter(n=>!this.isValid(n));for(let n of t)this.cache.delete(n);return t.length}}});import kt from"node:fs/promises";import Mt from"node:path";async function st(){try{let e=await kt.readFile(ot(),"utf-8"),t=JSON.parse(e);return!t.timestamp||!t.detection||!t.detection.claude||!t.detection.gemini||!t.detection.codex||rt(t.timestamp,It)?null:t.detection}catch{return null}}async function at(e){let t={timestamp:new Date().toISOString(),detection:e};await K(ot(),t)}var ot,It,ct=h(()=>{"use strict";ut();it();S();ot=i(()=>Mt.join(lt.getCachePath(),"providers.json"),"cacheFile"),It=600*1e3;i(st,"readProviderCache");i(at,"writeProviderCache")});import{execFileSync as G}from"node:child_process";function x(e){for(let t of e.split(/\r?\n/)){let n=t.trim();if(n)return n}return null}function gt(e){if(!e||e.includes("\0"))return null;try{if(process.platform==="win32"){let t=G("where.exe",[e],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],windowsHide:!0});return x(t)}try{let t=G("which",[e],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]});return x(t)}catch{let t=G("/bin/sh",["-c",`command -v ${JSON.stringify(e)}`],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]});return x(t)}}catch{return null}}async function H(e){if(!e||e.includes("\0"))return null;try{if(process.platform==="win32"){let{stdout:t}=await A("where.exe",[e],{encoding:"utf-8",windowsHide:!0});return x(String(t))}try{let{stdout:t}=await A("which",[e]);return x(String(t))}catch{return gt(e)}}catch{return null}}function le(e){return gt(e)!==null}var mt=h(()=>{"use strict";W();i(x,"firstNonEmptyLine");i(gt,"whichSync");i(H,"whichAsync");i(le,"commandOnPath")});var k={};yt(k,{ClaudeProvider:()=>C,CursorProvider:()=>pt,GeminiProvider:()=>_,Providers:()=>v,detectAllProviders:()=>U,detectAntigravity:()=>Tt,detectCodex:()=>ht,detectKimi:()=>Et,detectProvider:()=>$,getActiveProvider:()=>Nt,getProviderBranding:()=>Rt,selectProvider:()=>Gt,validateCliVersion:()=>ft});import O from"node:path";async function L(e){let t=await H(e);return t||(process.platform==="win32"?H(`${e}.cmd`):null)}async function At(e){try{let{stdout:t}=await J(`${e} --version`,{timeout:2e3}),n=t.match(/\d+\.\d+\.\d+/);return n?n[0]:t.trim()}catch{return null}}async function $(e){let t=v[e];if(!t.cliCommand)return{installed:!1};let n=await L(t.cliCommand);if(!n)return{installed:!1};let r=await At(t.cliCommand),o=ft(e,r||void 0);return{installed:!0,version:r||void 0,path:n,versionWarning:o||void 0}}function ft(e,t){let n=v[e];return!n.minCliVersion||!t?null:Q(t,n.minCliVersion)<0?`\u26A0\uFE0F ${n.displayName} v${t} is below minimum v${n.minCliVersion}. Some features may not work correctly.`:null}async function U(e=!1){if(!e){let g=await st();if(g)return g}let[t,n,r]=await Promise.all([$("claude"),$("gemini"),ht()]),o={installed:r.installed},a={claude:t,gemini:n,codex:o};return await at(a).catch(()=>{}),a}async function Nt(e){if(e&&v[e])return v[e];let t=await U(),n=[t.claude.installed?"claude":null,t.gemini.installed?"gemini":null,t.codex.installed?"codex":null].filter(Boolean);return n.length===1?v[n[0]]:t.claude.installed?C:t.gemini.installed?_:t.codex.installed?B:C}function Rt(e){return{commitFooter:"Generated with [p/](https://www.prjct.app/)",signature:{claude:"\u26A1 prjct + Claude",gemini:"\u26A1 prjct + Gemini",cursor:"\u26A1 prjct + Cursor",antigravity:"\u26A1 prjct + Antigravity",codex:"\u26A1 prjct + Codex"}[e]||"\u26A1 prjct"}}async function Tt(){let e=dt.configDir;if(!e)return{installed:!1,skillInstalled:!1};let t=O.join(e,"skills","prjct","SKILL.md"),[n,r]=await Promise.all([l(e),l(t)]);return{installed:n,skillInstalled:r,configPath:n?e:void 0}}async function ht(){let e=B.configDir;if(!e)return{installed:!1,skillInstalled:!1};let t=await L("codex"),n=O.join(e,"skills","prjct","SKILL.md"),r=await l(n),o=!!t||await l(O.join(e,"auth.json"));return{installed:o,skillInstalled:r,configPath:o?e:void 0}}async function Et(){let e=m(".kimi-code"),t=m(".kimi"),[n,r,o]=await Promise.all([L("kimi"),l(e),l(t)]),a=!!n||r||o;return{installed:a,configPath:a?r||!o?e:t:void 0}}async function Gt(){let e=await U();return{provider:e.claude.installed?"claude":e.gemini.installed?"gemini":e.codex.installed?"codex":"claude",detection:e}}var C,_,dt,pt,B,v,M=h(()=>{"use strict";wt();vt();W();S();ct();mt();q();C={name:"claude",displayName:"Claude Code",cliCommand:"claude",get configDir(){return m(".claude")},contextFile:"CLAUDE.md",get skillsDir(){return m(".claude","skills")},commandsDir:".claude/commands",commandFormat:"md",settingsFile:"settings.json",projectSettingsFile:"settings.local.json",ignoreFile:".claudeignore",websiteUrl:"https://www.anthropic.com/claude",docsUrl:"https://docs.anthropic.com/claude-code",get defaultModel(){return D(this.name)},get supportedModels(){return y(this.name)},minCliVersion:"1.0.0"},_={name:"gemini",displayName:"Gemini CLI",cliCommand:"gemini",get configDir(){return m(".gemini")},contextFile:"GEMINI.md",get skillsDir(){return m(".gemini","skills")},commandsDir:".gemini/commands",commandFormat:"toml",settingsFile:"settings.json",projectSettingsFile:"settings.json",ignoreFile:".geminiignore",websiteUrl:"https://geminicli.com",docsUrl:"https://geminicli.com/docs",get defaultModel(){return D(this.name)},get supportedModels(){return y(this.name)},minCliVersion:"1.0.0"},dt={name:"antigravity",displayName:"Google Antigravity",cliCommand:null,get configDir(){return m(".gemini","antigravity")},contextFile:"ANTIGRAVITY.md",get skillsDir(){return m(".gemini","antigravity","global_skills")},commandsDir:".agent/skills",commandFormat:"md",settingsFile:"mcp_config.json",projectSettingsFile:null,ignoreFile:".agentignore",websiteUrl:"https://gemini.google.com/app/antigravity",docsUrl:"https://gemini.google.com/app/antigravity",get defaultModel(){return D(this.name)},get supportedModels(){return y(this.name)},minCliVersion:null},pt={name:"cursor",displayName:"Cursor IDE",cliCommand:null,configDir:null,contextFile:"prjct.mdc",skillsDir:null,commandsDir:".cursor/commands",rulesDir:".cursor/rules",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".cursorignore",isProjectLevel:!0,websiteUrl:"https://cursor.com",docsUrl:"https://cursor.com/docs",get defaultModel(){return D(this.name)},get supportedModels(){return y(this.name)},minCliVersion:null},B={name:"codex",displayName:"OpenAI Codex",cliCommand:"codex",get configDir(){return m(".codex")},contextFile:"AGENTS.md",get skillsDir(){return m(".codex","skills")},commandsDir:".agents/skills",commandFormat:"md",settingsFile:null,projectSettingsFile:null,ignoreFile:".codexignore",websiteUrl:"https://openai.com/codex",docsUrl:"https://github.com/openai/codex",get defaultModel(){return D(this.name)},get supportedModels(){return y(this.name)},minCliVersion:null},v={claude:C,gemini:_,cursor:pt,antigravity:dt,codex:B};i(L,"whichCommand");i(At,"getCliVersion");i($,"detectProvider");i(ft,"validateCliVersion");i(U,"detectAllProviders");i(Nt,"getActiveProvider");i(Rt,"getProviderBranding");i(Tt,"detectAntigravity");i(ht,"detectCodex");i(Et,"detectKimi");i(Gt,"selectProvider")});import Ht from"node:crypto";import I from"node:fs/promises";import s from"node:path";var V,Ot,lt,ut=h(()=>{Z();S();Dt();et();q();V=class{static{i(this,"PathManager")}globalBaseDir;globalConfigDir;constructor(){this.globalBaseDir=z(),this.globalConfigDir=s.join(this.globalBaseDir,"config")}get globalProjectsDir(){let t=process.env.PRJCT_PROJECTS_DIR;return t?s.resolve(t):s.join(this.globalBaseDir,"projects")}setGlobalBaseDir(t){this.globalBaseDir=s.resolve(t),this.globalConfigDir=s.join(this.globalBaseDir,"config")}generateProjectId(t){return Ht.randomUUID()}getGlobalBasePath(){return this.globalBaseDir}getGlobalProjectPath(t){return s.join(this.globalProjectsDir,t)}getLocalConfigPath(t){return s.join(t,".prjct","prjct.config.json")}getGlobalProjectConfigPath(t){return s.join(this.getGlobalProjectPath(t),"project.json")}getLegacyPrjctPath(t){return s.join(t,".prjct")}async hasLegacyStructure(t){return await N(this.getLegacyPrjctPath(t))}async hasConfig(t){return await l(this.getLocalConfigPath(t))}async ensureGlobalStructure(){await P(this.globalBaseDir),await P(this.globalProjectsDir),await P(this.globalConfigDir)}async ensureProjectStructure(t){await this.ensureGlobalStructure();let n=this.getGlobalProjectPath(t),r=["analysis","memory"];for(let o of r)await P(s.join(n,o));return await P(s.join(n,"sessions")),n}getSessionPath(t,n=new Date){let{year:r,month:o,day:a}=X(n);return s.join(this.getGlobalProjectPath(t),"sessions",r,o,a)}getCurrentSessionPath(t){return this.getSessionPath(t,new Date)}async ensureSessionPath(t,n=new Date){let r=this.getSessionPath(t,n);return await P(r),r}async listSessions(t,n=null,r=null){let o=s.join(this.getGlobalProjectPath(t),"sessions"),a=[];try{let g=await I.readdir(o,{withFileTypes:!0});for(let c of g){if(!c.isDirectory()||n&&c.name!==n.toString())continue;let d=s.join(o,c.name),p=await I.readdir(d,{withFileTypes:!0});for(let f of p){if(!f.isDirectory()||r&&f.name!==r.toString().padStart(2,"0"))continue;let j=s.join(d,f.name),Pt=await I.readdir(j,{withFileTypes:!0});for(let b of Pt)b.isDirectory()&&a.push({year:c.name,month:f.name,day:b.name,path:s.join(j,b.name),date:new Date(`${c.name}-${f.name}-${b.name}`)})}}return a.sort((c,d)=>d.date.getTime()-c.date.getTime()),a}catch{return[]}}async getSessionsInRange(t,n,r=new Date){return(await this.listSessions(t)).filter(a=>a.date>=n&&a.date<=r)}getFilePath(t,n,r){return s.join(this.getGlobalProjectPath(t),n,r)}async listProjects(){try{return await this.ensureGlobalStructure(),(await I.readdir(this.globalProjectsDir,{withFileTypes:!0})).filter(n=>n.isDirectory()).map(n=>n.name)}catch{return[]}}async projectExists(t){return await N(this.getGlobalProjectPath(t))}getDisplayPath(t){let n=Y();return t.startsWith(n)?t.replace(n,"~"):t}getAuthConfigPath(){return s.join(this.globalConfigDir,"auth.json")}getSyncPendingPath(t){return s.join(this.getGlobalProjectPath(t),"sync","pending.json")}getLastSyncPath(t){return s.join(this.getGlobalProjectPath(t),"sync","last-sync.json")}getRunningStatusPath(){return s.join(this.globalBaseDir,".running")}getCachePath(){return s.join(this.globalBaseDir,"cache")}getStatePath(){return s.join(this.globalBaseDir,"state")}getStatusLinePath(){return s.join(this.globalBaseDir,"statusline")}async getAgentDir(){return(await(M(),F(k)).getActiveProvider()).configDir}async getAgentSettingsPath(){let t=await(M(),F(k)).getActiveProvider();return(M(),F(k)).getGlobalSettingsPath(t.name)}getClaudeDir(){return m(".claude")}getClaudeSettingsPath(){return s.join(this.getClaudeDir(),"settings.json")}getStoragePath(t,n){return s.join(this.getGlobalProjectPath(t),"storage",n)}getContextPath(t){return s.join(this.getGlobalProjectPath(t),"context")}async detectMonorepo(t){return R(t)}async discoverMonorepoPackages(t,n){return T(t,n)}async findContainingPackage(t,n){return tt(t,n)}async findMonorepoRoot(t){return E(t)}},Ot=new V,lt=Ot});export{$t as a,_t as b,xt as c,Bt as d,Lt as e,Ut as f,Vt as g,Z as h,rt as i,nt as j,it as k,H as l,le as m,mt as n,v as o,Nt as p,Rt as q,ht as r,Et as s,k as t,M as u,lt as v,ut as w};
@@ -5,4 +5,4 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{c as t}from"./chunk-QPRNRLG6.mjs";import{a as e}from"./chunk-E66B27AL.mjs";async function f(r,o,i){if(i.length!==0)try{let{resolveActiveTask:s}=await import("./task-service-XREJLWEF.mjs"),c=await s(r,o);c?.id&&t.recordSurfaced(r,i,c.id);for(let n of i)t.recordFetch(r,n)}catch{}}e(f,"recordSurfacedForActiveTask");export{f as a};
8
+ import{c as t}from"./chunk-TF6PN7IB.mjs";import{a as e}from"./chunk-E66B27AL.mjs";async function f(r,o,i){if(i.length!==0)try{let{resolveActiveTask:s}=await import("./task-service-FZABHPFV.mjs"),c=await s(r,o);c?.id&&t.recordSurfaced(r,i,c.id);for(let n of i)t.recordFetch(r,n)}catch{}}e(f,"recordSurfacedForActiveTask");export{f as a};
@@ -5,7 +5,7 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{e as r,g as S}from"./chunk-KG7Z6OMK.mjs";import{b as o,h as p,v as a,w as _}from"./chunk-JAMSIKDE.mjs";import{f as g,g as l,o as m}from"./chunk-UH4MD3F3.mjs";import{a as s}from"./chunk-E66B27AL.mjs";_();p();S();var c=class{static{s(this,"SyncPendingStorage")}append(n,e){let t=o(),u=JSON.stringify(e);return e.entityType&&e.entityId&&e.contentHash&&r.run(n,`DELETE FROM sync_pending
8
+ import{e as r,g as S}from"./chunk-TKXOMN4K.mjs";import{b as o,h as p,v as a,w as _}from"./chunk-A6K4H3YT.mjs";import{f as g,g as l,o as m}from"./chunk-UH4MD3F3.mjs";import{a as s}from"./chunk-E66B27AL.mjs";_();p();S();var c=class{static{s(this,"SyncPendingStorage")}append(n,e){let t=o(),u=JSON.stringify(e);return e.entityType&&e.entityId&&e.contentHash&&r.run(n,`DELETE FROM sync_pending
9
9
  WHERE project_id = ?
10
10
  AND entity_type = ?
11
11
  AND entity_id = ?
@@ -5,4 +5,4 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{u as t}from"./chunk-JAMSIKDE.mjs";import{f as e}from"./chunk-HDSS6UB3.mjs";t();e();var m=[{name:"leader",role:"orchestrator",kind:"orchestrate"},{name:"implementer",role:"implementer",kind:"implement"},{name:"reviewer",role:"reviewer",kind:"review"}];export{m as a};
8
+ import{u as t}from"./chunk-A6K4H3YT.mjs";import{f as e}from"./chunk-HDSS6UB3.mjs";t();e();var m=[{name:"leader",role:"orchestrator",kind:"orchestrate"},{name:"implementer",role:"implementer",kind:"implement"},{name:"reviewer",role:"reviewer",kind:"review"}];export{m as a};
@@ -5,4 +5,4 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{d as p,g as b}from"./chunk-KG7Z6OMK.mjs";import{d as f,o as S}from"./chunk-UH4MD3F3.mjs";import{a as o}from"./chunk-E66B27AL.mjs";b();S();import a from"node:path";var g="file-inventory",m=/^(package-lock\.json|pnpm-lock\.yaml|yarn\.lock|bun\.lockb?|composer\.lock|Cargo\.lock|poetry\.lock|CHANGELOG(\.md)?|LICENSE(\.md)?|\.DS_Store)$/i,x=/(^|\/)(node_modules|dist|build|\.git|coverage|\.next|target|vendor)(\/|$)/i,y=new Set([".png",".jpg",".jpeg",".gif",".webp",".ico",".woff",".woff2",".ttf",".eot",".mp4",".mp3",".zip",".gz",".tar",".wasm",".exe",".dll",".so",".dylib",".bin",".pdf",".ico"]),v={".ts":"TypeScript",".tsx":"TypeScript",".js":"JavaScript",".jsx":"JavaScript",".mjs":"JavaScript",".cjs":"JavaScript",".vue":"Vue",".svelte":"Svelte",".py":"Python",".go":"Go",".rs":"Rust",".java":"Java",".kt":"Kotlin",".kts":"Kotlin",".swift":"Swift",".rb":"Ruby",".php":"PHP",".cs":"C#",".fs":"F#",".cpp":"C++",".cc":"C++",".c":"C",".h":"C/C++",".hpp":"C++",".m":"Objective-C",".mm":"Objective-C++",".scala":"Scala",".clj":"Clojure",".ex":"Elixir",".exs":"Elixir",".erl":"Erlang",".hs":"Haskell",".lua":"Lua",".r":"R",".dart":"Dart",".sql":"SQL",".graphql":"GraphQL",".gql":"GraphQL",".proto":"Protobuf",".md":"Markdown",".mdx":"MDX",".json":"JSON",".yml":"YAML",".yaml":"YAML",".toml":"TOML",".css":"CSS",".scss":"SCSS",".sass":"Sass",".less":"Less",".html":"HTML",".htm":"HTML",".sh":"Shell",".bash":"Shell",".zsh":"Shell",".ps1":"PowerShell",".swiftui":"Swift"};async function h(e,n={}){let t=(await f(e,{skipDotfiles:!0,maxFiles:n.maxFiles??5e4})).filter(l=>{if(x.test(l))return!1;let u=a.basename(l);if(m.test(u))return!1;let c=a.extname(u).toLowerCase();return!!(c&&c!=="."&&!y.has(c))}),r=t.reduce((l,u)=>{let c=a.extname(a.basename(u)).toLowerCase();return l[c]=(l[c]??0)+1,l},Object.create(null)),i=j(r);return{extensions:r,languages:i,fileCount:t.length,builtAt:new Date().toISOString(),projectHint:a.basename(e)}}o(h,"buildFileInventory");function j(e){let n=new Set,s=Object.entries(e).sort((t,r)=>r[1]-t[1]);for(let[t]of s){let r=v[t];r&&n.add(r)}return[...n]}o(j,"languagesFromExtensions");function C(e,n){p.setDoc(e,g,n)}o(C,"saveFileInventory");function d(e){try{return p.getDoc(e,g)}catch{return null}}o(d,"loadFileInventory");async function L(e,n){let s=await h(n);return C(e,s),s}o(L,"refreshFileInventory");function E(e){let n=d(e);return n?.extensions?new Set(Object.keys(n.extensions).map(s=>s.toLowerCase())):new Set}o(E,"inventoryExtensions");function k(e,n,s={}){let t=n.replace(/^\.\//,"").replace(/\\/g,"/").trim();if(!t||x.test(t))return!1;let r=t.split("/").pop()??t;if(m.test(r))return!1;let i=a.extname(r).toLowerCase();return i?!y.has(i):t.includes("/")}o(k,"pathMatchesInventory");function O(e,n){let s=n.replace(/^\.\//,"").replace(/\\/g,"/").trim(),t=s.split("/").pop()??s,r=a.extname(t).toLowerCase();if(!r)return .7;let i=E(e);return i.size===0||i.has(r)?1:.45}o(O,"inventoryPathWeight");function P(e){if(!e||Object.keys(e.extensions).length===0)return"File inventory: empty \u2014 run `prjct sync` to discover languages/extensions.";let n=Object.entries(e.extensions).sort((t,r)=>r[1]-t[1]).slice(0,12).map(([t,r])=>`${t}\xD7${r}`).join(" "),s=e.languages.length>0?e.languages.join(", "):"unknown";return`File inventory: ${e.fileCount} files \xB7 langs: ${s} \xB7 ${n}`}o(P,"formatInventorySummary");export{g as a,h as b,j as c,C as d,d as e,L as f,E as g,k as h,O as i,P as j};
8
+ import{d as p,g as b}from"./chunk-TKXOMN4K.mjs";import{d as f,o as S}from"./chunk-UH4MD3F3.mjs";import{a as o}from"./chunk-E66B27AL.mjs";b();S();import a from"node:path";var g="file-inventory",m=/^(package-lock\.json|pnpm-lock\.yaml|yarn\.lock|bun\.lockb?|composer\.lock|Cargo\.lock|poetry\.lock|CHANGELOG(\.md)?|LICENSE(\.md)?|\.DS_Store)$/i,x=/(^|\/)(node_modules|dist|build|\.git|coverage|\.next|target|vendor)(\/|$)/i,y=new Set([".png",".jpg",".jpeg",".gif",".webp",".ico",".woff",".woff2",".ttf",".eot",".mp4",".mp3",".zip",".gz",".tar",".wasm",".exe",".dll",".so",".dylib",".bin",".pdf",".ico"]),v={".ts":"TypeScript",".tsx":"TypeScript",".js":"JavaScript",".jsx":"JavaScript",".mjs":"JavaScript",".cjs":"JavaScript",".vue":"Vue",".svelte":"Svelte",".py":"Python",".go":"Go",".rs":"Rust",".java":"Java",".kt":"Kotlin",".kts":"Kotlin",".swift":"Swift",".rb":"Ruby",".php":"PHP",".cs":"C#",".fs":"F#",".cpp":"C++",".cc":"C++",".c":"C",".h":"C/C++",".hpp":"C++",".m":"Objective-C",".mm":"Objective-C++",".scala":"Scala",".clj":"Clojure",".ex":"Elixir",".exs":"Elixir",".erl":"Erlang",".hs":"Haskell",".lua":"Lua",".r":"R",".dart":"Dart",".sql":"SQL",".graphql":"GraphQL",".gql":"GraphQL",".proto":"Protobuf",".md":"Markdown",".mdx":"MDX",".json":"JSON",".yml":"YAML",".yaml":"YAML",".toml":"TOML",".css":"CSS",".scss":"SCSS",".sass":"Sass",".less":"Less",".html":"HTML",".htm":"HTML",".sh":"Shell",".bash":"Shell",".zsh":"Shell",".ps1":"PowerShell",".swiftui":"Swift"};async function h(e,n={}){let t=(await f(e,{skipDotfiles:!0,maxFiles:n.maxFiles??5e4})).filter(l=>{if(x.test(l))return!1;let u=a.basename(l);if(m.test(u))return!1;let c=a.extname(u).toLowerCase();return!!(c&&c!=="."&&!y.has(c))}),r=t.reduce((l,u)=>{let c=a.extname(a.basename(u)).toLowerCase();return l[c]=(l[c]??0)+1,l},Object.create(null)),i=j(r);return{extensions:r,languages:i,fileCount:t.length,builtAt:new Date().toISOString(),projectHint:a.basename(e)}}o(h,"buildFileInventory");function j(e){let n=new Set,s=Object.entries(e).sort((t,r)=>r[1]-t[1]);for(let[t]of s){let r=v[t];r&&n.add(r)}return[...n]}o(j,"languagesFromExtensions");function C(e,n){p.setDoc(e,g,n)}o(C,"saveFileInventory");function d(e){try{return p.getDoc(e,g)}catch{return null}}o(d,"loadFileInventory");async function L(e,n){let s=await h(n);return C(e,s),s}o(L,"refreshFileInventory");function E(e){let n=d(e);return n?.extensions?new Set(Object.keys(n.extensions).map(s=>s.toLowerCase())):new Set}o(E,"inventoryExtensions");function k(e,n,s={}){let t=n.replace(/^\.\//,"").replace(/\\/g,"/").trim();if(!t||x.test(t))return!1;let r=t.split("/").pop()??t;if(m.test(r))return!1;let i=a.extname(r).toLowerCase();return i?!y.has(i):t.includes("/")}o(k,"pathMatchesInventory");function O(e,n){let s=n.replace(/^\.\//,"").replace(/\\/g,"/").trim(),t=s.split("/").pop()??s,r=a.extname(t).toLowerCase();if(!r)return .7;let i=E(e);return i.size===0||i.has(r)?1:.45}o(O,"inventoryPathWeight");function P(e){if(!e||Object.keys(e.extensions).length===0)return"File inventory: empty \u2014 run `prjct sync` to discover languages/extensions.";let n=Object.entries(e.extensions).sort((t,r)=>r[1]-t[1]).slice(0,12).map(([t,r])=>`${t}\xD7${r}`).join(" "),s=e.languages.length>0?e.languages.join(", "):"unknown";return`File inventory: ${e.fileCount} files \xB7 langs: ${s} \xB7 ${n}`}o(P,"formatInventorySummary");export{g as a,h as b,j as c,C as d,d as e,L as f,E as g,k as h,O as i,P as j};
@@ -5,4 +5,4 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{a as r}from"./chunk-ZJXH76Q5.mjs";import{b as t}from"./chunk-XS45K7ZQ.mjs";import{a as e}from"./chunk-E66B27AL.mjs";function u(o){let n=t(o);return n.allow?null:{deny:n.denyMessage}}e(u,"decideSecrets");function l(o=process.cwd(),n){return r({event:"PreToolUse",projectPath:o,decide:e(async c=>{try{return u(c)}catch{return null}},"decide")},n)}e(l,"runPreSecretsHook");var p={decideSecrets:u};export{u as a,l as b,p as c};
8
+ import{a as r}from"./chunk-WUOVBBPC.mjs";import{b as t}from"./chunk-XS45K7ZQ.mjs";import{a as e}from"./chunk-E66B27AL.mjs";function u(o){let n=t(o);return n.allow?null:{deny:n.denyMessage}}e(u,"decideSecrets");function l(o=process.cwd(),n){return r({event:"PreToolUse",projectPath:o,decide:e(async c=>{try{return u(c)}catch{return null}},"decide")},n)}e(l,"runPreSecretsHook");var p={decideSecrets:u};export{u as a,l as b,p as c};
@@ -5,4 +5,4 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{e as u,g as C}from"./chunk-KG7Z6OMK.mjs";import{a as E,b as _,c as A,d as w,e as v,o as b}from"./chunk-UH4MD3F3.mjs";import{a as c}from"./chunk-E66B27AL.mjs";A();C();b();import I from"node:fs/promises";import d from"node:path";function O(t){let r=new RegExp(_.source,"g");return[...t.matchAll(r)].map(e=>e[1]).filter(e=>e.startsWith(".")||e.startsWith("@/"))}c(O,"extractImportSources");async function R(t,r,e){let n=t.startsWith("@/")?d.join(e,"src",t.slice(2)):d.resolve(d.dirname(d.join(e,r)),t);for(let o of E){let i=n+o;try{if((await I.stat(i)).isFile())return d.relative(e,i)}catch{}}return null}c(R,"resolveImport");async function x(t){let r=await w(t),e={},n={},o=await v(r,50,async i=>{let s=await G(t,i);return s&&s.imports.length>0?s:null});for(let{filePath:i,imports:s}of o){e[i]=s;for(let f of s)n[f]||(n[f]=[]),n[f].push(i)}return{forward:e,reverse:n,fileCount:r.length,edgeCount:o.reduce((i,s)=>i+s.imports.length,0),builtAt:new Date().toISOString()}}c(x,"buildGraph");function B(t,r,e=2){let n=new Set(t),o=new Map,i=[];for(let s of t){let f=r.forward[s]||[],a=r.reverse[s]||[];for(let p of[...f,...a])n.has(p)||i.push({file:p,depth:1})}for(let{file:s,depth:f}of i){if(f>e)continue;let a=1/(f+1),p=o.get(s);if(p){a>p.score&&o.set(s,{score:a,depth:f});continue}if(o.set(s,{score:a,depth:f}),f<e){let g=r.forward[s]||[],y=r.reverse[s]||[];for(let h of[...g,...y])!n.has(h)&&!o.has(h)&&i.push({file:h,depth:f+1})}}return Array.from(o.entries()).map(([s,{score:f,depth:a}])=>({path:s,score:f,depth:a})).sort((s,f)=>f.score-s.score)}c(B,"scoreFromSeeds");var l="import-graph",m=new Map;function D(t){return Object.values(t).reduce((r,e)=>r+e.length,0)}c(D,"countEdges");function T(t,r){let e=t.forward[r]||[];delete t.forward[r];for(let n of e){let o=(t.reverse[n]||[]).filter(i=>i!==r);o.length===0?delete t.reverse[n]:t.reverse[n]=o}}c(T,"removeOutgoingEdges");function P(t,r){let e=t.reverse[r]||[];delete t.reverse[r];let n=[];for(let o of e){let i=(t.forward[o]||[]).filter(s=>s!==r);i.length===0?delete t.forward[o]:t.forward[o]=i,n.push(o)}return n}c(P,"removeIncomingEdges");function M(t,r,e){if(e.length===0)return;let n=Array.from(new Set(e));t.forward[r]=n;for(let o of n)t.reverse[o]||(t.reverse[o]=[]),t.reverse[o].includes(r)||t.reverse[o].push(r)}c(M,"addEdges");async function G(t,r){try{let e=await I.readFile(d.join(t,r),"utf-8"),n=O(e),o=[];for(let i of n){let s=await R(i,r,t);s&&s!==r&&o.push(s)}return{filePath:r,imports:o}}catch{return null}}c(G,"importsForFile");function S(t){return{schemaVersion:2,fileCount:t.fileCount,edgeCount:t.edgeCount,builtAt:t.builtAt}}c(S,"graphMetadata");function F(t,r){try{u.transaction(t,e=>{e.prepare("DELETE FROM import_graph_edges").run();let n=e.prepare("INSERT INTO import_graph_edges (from_path, to_path, sort_order) VALUES (?, ?, ?)");for(let[o,i]of Object.entries(r.forward))for(let[s,f]of i.entries())n.run(o,f,s)})}catch{}}c(F,"replacePerFileEdges");function L(t,r,e,n){try{u.transaction(t,o=>{let i=o.prepare("DELETE FROM import_graph_edges WHERE from_path = ?"),s=o.prepare("INSERT INTO import_graph_edges (from_path, to_path, sort_order) VALUES (?, ?, ?)");for(let f of new Set([...e,...n]))i.run(f);for(let f of e){let a=r.forward[f]||[];for(let[p,g]of a.entries())s.run(f,g,p)}})}catch{}}c(L,"updatePerFileEdges");function N(t,r,e){try{let n=u.query(t,"SELECT from_path, to_path FROM import_graph_edges ORDER BY from_path, sort_order, to_path");if(n.length===0){if(e?.edgeCount===0){let a={forward:{},reverse:{},fileCount:e.fileCount,edgeCount:0,builtAt:e.builtAt};return m.set(t,{graph:a,updatedAt:r}),a}return null}let o={},i={};for(let a of n)o[a.from_path]||(o[a.from_path]=[]),o[a.from_path].push(a.to_path),i[a.to_path]||(i[a.to_path]=[]),i[a.to_path].push(a.from_path);let s=new Set;for(let[a,p]of Object.entries(o)){s.add(a);for(let g of p)s.add(g)}let f={forward:o,reverse:i,fileCount:e?.fileCount??s.size,edgeCount:n.length,builtAt:e?.builtAt??r};return m.set(t,{graph:f,updatedAt:r}),f}catch{return null}}c(N,"loadGraphFromPerFileEdges");function V(t,r){u.setDoc(t,l,S(r)),F(t,r),m.delete(t)}c(V,"saveGraph");function W(t,r,e,n){u.setDoc(t,l,S(r)),L(t,r,e,n),m.delete(t)}c(W,"saveGraphUpdate");function k(t){let r=u.get(t,"SELECT updated_at FROM kv_store WHERE key = ?",l);if(!r)return m.delete(t),null;let e=m.get(t);if(e&&e.updatedAt===r.updated_at)return e.graph;let n=u.getDoc(t,l),o=N(t,r.updated_at,n);if(o)return o;if(!n?.forward||!n?.reverse)return null;let i={forward:n.forward,reverse:n.reverse,fileCount:n.fileCount,edgeCount:n.edgeCount,builtAt:n.builtAt};return m.set(t,{graph:i,updatedAt:r.updated_at}),i}c(k,"loadGraph");async function q(t,r){let e=await x(t);return V(r,e),e}c(q,"indexImports");async function K(t,r,e,n=[]){let o=k(r);if(!o)return q(t,r);let i=new Set([...e,...n]);for(let a of i)T(o,a);let s=new Set;for(let a of n)for(let p of P(o,a))s.add(p);let f=await v(e,50,a=>G(t,a));for(let a of f)M(o,a.filePath,a.imports);return o.edgeCount=D(o.forward),o.builtAt=new Date().toISOString(),W(r,o,[...e,...s],n),o}c(K,"updateImportGraph");export{B as a,k as b,q as c,K as d};
8
+ import{e as u,g as C}from"./chunk-TKXOMN4K.mjs";import{a as E,b as _,c as A,d as w,e as v,o as b}from"./chunk-UH4MD3F3.mjs";import{a as c}from"./chunk-E66B27AL.mjs";A();C();b();import I from"node:fs/promises";import d from"node:path";function O(t){let r=new RegExp(_.source,"g");return[...t.matchAll(r)].map(e=>e[1]).filter(e=>e.startsWith(".")||e.startsWith("@/"))}c(O,"extractImportSources");async function R(t,r,e){let n=t.startsWith("@/")?d.join(e,"src",t.slice(2)):d.resolve(d.dirname(d.join(e,r)),t);for(let o of E){let i=n+o;try{if((await I.stat(i)).isFile())return d.relative(e,i)}catch{}}return null}c(R,"resolveImport");async function x(t){let r=await w(t),e={},n={},o=await v(r,50,async i=>{let s=await G(t,i);return s&&s.imports.length>0?s:null});for(let{filePath:i,imports:s}of o){e[i]=s;for(let f of s)n[f]||(n[f]=[]),n[f].push(i)}return{forward:e,reverse:n,fileCount:r.length,edgeCount:o.reduce((i,s)=>i+s.imports.length,0),builtAt:new Date().toISOString()}}c(x,"buildGraph");function B(t,r,e=2){let n=new Set(t),o=new Map,i=[];for(let s of t){let f=r.forward[s]||[],a=r.reverse[s]||[];for(let p of[...f,...a])n.has(p)||i.push({file:p,depth:1})}for(let{file:s,depth:f}of i){if(f>e)continue;let a=1/(f+1),p=o.get(s);if(p){a>p.score&&o.set(s,{score:a,depth:f});continue}if(o.set(s,{score:a,depth:f}),f<e){let g=r.forward[s]||[],y=r.reverse[s]||[];for(let h of[...g,...y])!n.has(h)&&!o.has(h)&&i.push({file:h,depth:f+1})}}return Array.from(o.entries()).map(([s,{score:f,depth:a}])=>({path:s,score:f,depth:a})).sort((s,f)=>f.score-s.score)}c(B,"scoreFromSeeds");var l="import-graph",m=new Map;function D(t){return Object.values(t).reduce((r,e)=>r+e.length,0)}c(D,"countEdges");function T(t,r){let e=t.forward[r]||[];delete t.forward[r];for(let n of e){let o=(t.reverse[n]||[]).filter(i=>i!==r);o.length===0?delete t.reverse[n]:t.reverse[n]=o}}c(T,"removeOutgoingEdges");function P(t,r){let e=t.reverse[r]||[];delete t.reverse[r];let n=[];for(let o of e){let i=(t.forward[o]||[]).filter(s=>s!==r);i.length===0?delete t.forward[o]:t.forward[o]=i,n.push(o)}return n}c(P,"removeIncomingEdges");function M(t,r,e){if(e.length===0)return;let n=Array.from(new Set(e));t.forward[r]=n;for(let o of n)t.reverse[o]||(t.reverse[o]=[]),t.reverse[o].includes(r)||t.reverse[o].push(r)}c(M,"addEdges");async function G(t,r){try{let e=await I.readFile(d.join(t,r),"utf-8"),n=O(e),o=[];for(let i of n){let s=await R(i,r,t);s&&s!==r&&o.push(s)}return{filePath:r,imports:o}}catch{return null}}c(G,"importsForFile");function S(t){return{schemaVersion:2,fileCount:t.fileCount,edgeCount:t.edgeCount,builtAt:t.builtAt}}c(S,"graphMetadata");function F(t,r){try{u.transaction(t,e=>{e.prepare("DELETE FROM import_graph_edges").run();let n=e.prepare("INSERT INTO import_graph_edges (from_path, to_path, sort_order) VALUES (?, ?, ?)");for(let[o,i]of Object.entries(r.forward))for(let[s,f]of i.entries())n.run(o,f,s)})}catch{}}c(F,"replacePerFileEdges");function L(t,r,e,n){try{u.transaction(t,o=>{let i=o.prepare("DELETE FROM import_graph_edges WHERE from_path = ?"),s=o.prepare("INSERT INTO import_graph_edges (from_path, to_path, sort_order) VALUES (?, ?, ?)");for(let f of new Set([...e,...n]))i.run(f);for(let f of e){let a=r.forward[f]||[];for(let[p,g]of a.entries())s.run(f,g,p)}})}catch{}}c(L,"updatePerFileEdges");function N(t,r,e){try{let n=u.query(t,"SELECT from_path, to_path FROM import_graph_edges ORDER BY from_path, sort_order, to_path");if(n.length===0){if(e?.edgeCount===0){let a={forward:{},reverse:{},fileCount:e.fileCount,edgeCount:0,builtAt:e.builtAt};return m.set(t,{graph:a,updatedAt:r}),a}return null}let o={},i={};for(let a of n)o[a.from_path]||(o[a.from_path]=[]),o[a.from_path].push(a.to_path),i[a.to_path]||(i[a.to_path]=[]),i[a.to_path].push(a.from_path);let s=new Set;for(let[a,p]of Object.entries(o)){s.add(a);for(let g of p)s.add(g)}let f={forward:o,reverse:i,fileCount:e?.fileCount??s.size,edgeCount:n.length,builtAt:e?.builtAt??r};return m.set(t,{graph:f,updatedAt:r}),f}catch{return null}}c(N,"loadGraphFromPerFileEdges");function V(t,r){u.setDoc(t,l,S(r)),F(t,r),m.delete(t)}c(V,"saveGraph");function W(t,r,e,n){u.setDoc(t,l,S(r)),L(t,r,e,n),m.delete(t)}c(W,"saveGraphUpdate");function k(t){let r=u.get(t,"SELECT updated_at FROM kv_store WHERE key = ?",l);if(!r)return m.delete(t),null;let e=m.get(t);if(e&&e.updatedAt===r.updated_at)return e.graph;let n=u.getDoc(t,l),o=N(t,r.updated_at,n);if(o)return o;if(!n?.forward||!n?.reverse)return null;let i={forward:n.forward,reverse:n.reverse,fileCount:n.fileCount,edgeCount:n.edgeCount,builtAt:n.builtAt};return m.set(t,{graph:i,updatedAt:r.updated_at}),i}c(k,"loadGraph");async function q(t,r){let e=await x(t);return V(r,e),e}c(q,"indexImports");async function K(t,r,e,n=[]){let o=k(r);if(!o)return q(t,r);let i=new Set([...e,...n]);for(let a of i)T(o,a);let s=new Set;for(let a of n)for(let p of P(o,a))s.add(p);let f=await v(e,50,a=>G(t,a));for(let a of f)M(o,a.filePath,a.imports);return o.edgeCount=D(o.forward),o.builtAt=new Date().toISOString(),W(r,o,[...e,...s],n),o}c(K,"updateImportGraph");export{B as a,k as b,q as c,K as d};
@@ -5,7 +5,7 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{a as W,b as R}from"./chunk-OUAS3LZ3.mjs";import{a as I}from"./chunk-INXNK57E.mjs";import{a as _,c as B}from"./chunk-5EQLQ7GF.mjs";import{d as x,e as b,g as E}from"./chunk-KG7Z6OMK.mjs";import{b as d,h as g}from"./chunk-JAMSIKDE.mjs";import{a as u}from"./chunk-E66B27AL.mjs";g();var f={idle:{transitions:["task"],prompt:"prjct work <intent> Start working",description:"No active work cycle"},working:{transitions:["done","pause"],prompt:"prjct status done Complete work | prjct status paused Switch context",description:"Work in progress"},paused:{transitions:["resume","task","ship"],prompt:"prjct status active Continue | prjct work <new> Start different | prjct ship Ship directly",description:"Task paused"},completed:{transitions:["ship","task","pause","reopen"],prompt:"prjct ship Ship it | prjct work <next> Start next | prjct status active Reopen",description:"Task completed"},shipped:{transitions:["task"],prompt:"prjct work <intent> Start new work cycle",description:"Feature shipped"}},h=class{static{u(this,"WorkflowStateMachine")}getCurrentState(t,s){if(s){let a=(t?.activeTasks??[]).find(n=>n.workspaceId===s);return a?this.statusToState(a):"idle"}let e=t?.currentTask;return e?this.statusToState(e):(t?.pausedTasks?.length||0)>0||t?.previousTask?.status==="paused"?"paused":"idle"}statusToState(t){switch((typeof t.status=="string"?t.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return"working"}}canTransition(t,s){if(f[t].transitions.includes(s))return{valid:!0};let a=this.formatNextSteps(t).join(" | ");return{valid:!1,error:`Cannot transition to '${s}' from '${t}' state`,suggestion:`Valid next steps: ${a}`}}getNextState(t,s){switch(s){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";default:return t}}getStateInfo(t){return f[t]}getPrompt(t){return f[t].prompt}getValidCommands(t){return f[t].transitions}formatNextSteps(t){return f[t].transitions.map(e=>{switch(e){case"task":return"prjct work <intent> Start new work cycle";case"done":return"prjct status done Complete current work";case"pause":return"prjct status paused Pause and switch context";case"resume":return"prjct status active Continue paused task";case"ship":return"prjct ship Ship the feature";case"reopen":return"prjct status active Reopen completed task";default:return`prjct ${e}`}})}},S=new h;E();g();async function H(r,t,s){let e={pausedCount:0};if(await r.update(t,n=>{if(!n.currentTask)return n;r.validateTransition(n,"pause"),e.pausedTask={...n.currentTask,status:"paused",pausedAt:d(),pauseReason:s};let i=[e.pausedTask,...r.getPausedTasksFromState(n)].slice(0,r.maxPausedTasks);return e.pausedCount=i.length,{...n,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:d()}}),!e.pausedTask)return null;let a=e.pausedTask;return await r.publish(t,"task.paused",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:s,pausedCount:e.pausedCount}),a}u(H,"pauseTask");async function O(r,t,s){let e={remainingPaused:0};if(await r.update(t,n=>{let i=r.getPausedTasksFromState(n);if(i.length===0)return n;r.validateTransition(n,"resume");let o=s?i.findIndex(A=>A.id===s):0;if(o===-1)return n;let c=i[o],k=i.filter((A,lt)=>lt!==o),{status:l,pausedAt:T,pauseReason:p,...m}=c;return e.currentTask={...m,startedAt:d(),sessionId:c.sessionId??_()},e.remainingPaused=k.length,{...n,currentTask:e.currentTask,previousTask:null,pausedTasks:k,lastUpdated:d()}}),!e.currentTask)return null;let a=e.currentTask;return await r.publish(t,"task.resumed",{taskId:a.id,description:a.description,resumedAt:a.startedAt,remainingPaused:e.remainingPaused}),a}u(O,"resumeTask");async function D(r,t){let s=await r.read(t),e=r.getPausedTasksFromState(s),a=Date.now()-r.stalenessThresholdDays*24*60*60*1e3;return e.filter(n=>new Date(n.pausedAt).getTime()<a)}u(D,"getStalePausedTasks");async function F(r,t){let s=Date.now()-r.stalenessThresholdDays*24*60*60*1e3,e=[];await r.update(t,n=>{let i=r.getPausedTasksFromState(n),o=i.filter(k=>new Date(k.pausedAt).getTime()<s);if(e.push(o),o.length===0)return n;let c=i.filter(k=>new Date(k.pausedAt).getTime()>=s);return{...n,pausedTasks:c,previousTask:null,lastUpdated:d()}});let a=e[0]??[];if(a.length===0)return[];B.archiveMany(t,a.map(n=>({entityType:"paused_task",entityId:n.id,entityData:n,summary:n.description,reason:"staleness"})));for(let n of a)await r.publish(t,"task.archived",{taskId:n.id,description:n.description,pausedAt:n.pausedAt,reason:"staleness"});return a}u(F,"archiveStalePausedTasks");g();E();var mt=20;function Tt(r){let t=(()=>{if(!r.data)return{};try{return JSON.parse(r.data)}catch{return{}}})(),s={taskId:r.id,title:t.title??r.description,classification:r.type??"improvement",startedAt:r.started_at,completedAt:r.completed_at,subtaskCount:t.subtaskCount??0,subtaskSummaries:t.subtaskSummaries??[],outcome:t.outcome??"Task completed",branchName:r.branch??"unknown"};return r.linear_id!=null&&(s.linearId=r.linear_id),t.linearUuid!=null&&(s.linearUuid=t.linearUuid),r.pr_url!=null&&(s.prUrl=r.pr_url),t.feedback&&(s.feedback=t.feedback),t.harness&&(s.harness=t.harness),r.tokens_in&&(s.tokensIn=r.tokens_in),r.tokens_out&&(s.tokensOut=r.tokens_out),s}u(Tt,"rowToHistoryEntry");function w(r,t="",...s){try{return x.query(r,`SELECT id, description, type, branch, linear_id, pr_url, started_at, completed_at, tokens_in, tokens_out, data
8
+ import{a as W,b as R}from"./chunk-OUAS3LZ3.mjs";import{a as I}from"./chunk-ETTDRXQ6.mjs";import{a as _,c as B}from"./chunk-FZS3XGEA.mjs";import{d as x,e as b,g as E}from"./chunk-TKXOMN4K.mjs";import{b as d,h as g}from"./chunk-A6K4H3YT.mjs";import{a as u}from"./chunk-E66B27AL.mjs";g();var f={idle:{transitions:["task"],prompt:"prjct work <intent> Start working",description:"No active work cycle"},working:{transitions:["done","pause"],prompt:"prjct status done Complete work | prjct status paused Switch context",description:"Work in progress"},paused:{transitions:["resume","task","ship"],prompt:"prjct status active Continue | prjct work <new> Start different | prjct ship Ship directly",description:"Task paused"},completed:{transitions:["ship","task","pause","reopen"],prompt:"prjct ship Ship it | prjct work <next> Start next | prjct status active Reopen",description:"Task completed"},shipped:{transitions:["task"],prompt:"prjct work <intent> Start new work cycle",description:"Feature shipped"}},h=class{static{u(this,"WorkflowStateMachine")}getCurrentState(t,s){if(s){let a=(t?.activeTasks??[]).find(n=>n.workspaceId===s);return a?this.statusToState(a):"idle"}let e=t?.currentTask;return e?this.statusToState(e):(t?.pausedTasks?.length||0)>0||t?.previousTask?.status==="paused"?"paused":"idle"}statusToState(t){switch((typeof t.status=="string"?t.status:"").toLowerCase()){case"in_progress":case"working":return"working";case"paused":return"paused";case"completed":case"done":return"completed";case"shipped":return"shipped";default:return"working"}}canTransition(t,s){if(f[t].transitions.includes(s))return{valid:!0};let a=this.formatNextSteps(t).join(" | ");return{valid:!1,error:`Cannot transition to '${s}' from '${t}' state`,suggestion:`Valid next steps: ${a}`}}getNextState(t,s){switch(s){case"task":return"working";case"done":return"completed";case"pause":return"paused";case"resume":return"working";case"ship":return"shipped";case"reopen":return"working";default:return t}}getStateInfo(t){return f[t]}getPrompt(t){return f[t].prompt}getValidCommands(t){return f[t].transitions}formatNextSteps(t){return f[t].transitions.map(e=>{switch(e){case"task":return"prjct work <intent> Start new work cycle";case"done":return"prjct status done Complete current work";case"pause":return"prjct status paused Pause and switch context";case"resume":return"prjct status active Continue paused task";case"ship":return"prjct ship Ship the feature";case"reopen":return"prjct status active Reopen completed task";default:return`prjct ${e}`}})}},S=new h;E();g();async function H(r,t,s){let e={pausedCount:0};if(await r.update(t,n=>{if(!n.currentTask)return n;r.validateTransition(n,"pause"),e.pausedTask={...n.currentTask,status:"paused",pausedAt:d(),pauseReason:s};let i=[e.pausedTask,...r.getPausedTasksFromState(n)].slice(0,r.maxPausedTasks);return e.pausedCount=i.length,{...n,currentTask:null,previousTask:null,pausedTasks:i,lastUpdated:d()}}),!e.pausedTask)return null;let a=e.pausedTask;return await r.publish(t,"task.paused",{taskId:a.id,description:a.description,pausedAt:a.pausedAt,reason:s,pausedCount:e.pausedCount}),a}u(H,"pauseTask");async function O(r,t,s){let e={remainingPaused:0};if(await r.update(t,n=>{let i=r.getPausedTasksFromState(n);if(i.length===0)return n;r.validateTransition(n,"resume");let o=s?i.findIndex(A=>A.id===s):0;if(o===-1)return n;let c=i[o],k=i.filter((A,lt)=>lt!==o),{status:l,pausedAt:T,pauseReason:p,...m}=c;return e.currentTask={...m,startedAt:d(),sessionId:c.sessionId??_()},e.remainingPaused=k.length,{...n,currentTask:e.currentTask,previousTask:null,pausedTasks:k,lastUpdated:d()}}),!e.currentTask)return null;let a=e.currentTask;return await r.publish(t,"task.resumed",{taskId:a.id,description:a.description,resumedAt:a.startedAt,remainingPaused:e.remainingPaused}),a}u(O,"resumeTask");async function D(r,t){let s=await r.read(t),e=r.getPausedTasksFromState(s),a=Date.now()-r.stalenessThresholdDays*24*60*60*1e3;return e.filter(n=>new Date(n.pausedAt).getTime()<a)}u(D,"getStalePausedTasks");async function F(r,t){let s=Date.now()-r.stalenessThresholdDays*24*60*60*1e3,e=[];await r.update(t,n=>{let i=r.getPausedTasksFromState(n),o=i.filter(k=>new Date(k.pausedAt).getTime()<s);if(e.push(o),o.length===0)return n;let c=i.filter(k=>new Date(k.pausedAt).getTime()>=s);return{...n,pausedTasks:c,previousTask:null,lastUpdated:d()}});let a=e[0]??[];if(a.length===0)return[];B.archiveMany(t,a.map(n=>({entityType:"paused_task",entityId:n.id,entityData:n,summary:n.description,reason:"staleness"})));for(let n of a)await r.publish(t,"task.archived",{taskId:n.id,description:n.description,pausedAt:n.pausedAt,reason:"staleness"});return a}u(F,"archiveStalePausedTasks");g();E();var mt=20;function Tt(r){let t=(()=>{if(!r.data)return{};try{return JSON.parse(r.data)}catch{return{}}})(),s={taskId:r.id,title:t.title??r.description,classification:r.type??"improvement",startedAt:r.started_at,completedAt:r.completed_at,subtaskCount:t.subtaskCount??0,subtaskSummaries:t.subtaskSummaries??[],outcome:t.outcome??"Task completed",branchName:r.branch??"unknown"};return r.linear_id!=null&&(s.linearId=r.linear_id),t.linearUuid!=null&&(s.linearUuid=t.linearUuid),r.pr_url!=null&&(s.prUrl=r.pr_url),t.feedback&&(s.feedback=t.feedback),t.harness&&(s.harness=t.harness),r.tokens_in&&(s.tokensIn=r.tokens_in),r.tokens_out&&(s.tokensOut=r.tokens_out),s}u(Tt,"rowToHistoryEntry");function w(r,t="",...s){try{return x.query(r,`SELECT id, description, type, branch, linear_id, pr_url, started_at, completed_at, tokens_in, tokens_out, data
9
9
  FROM tasks
10
10
  WHERE status = 'completed' AND completed_at IS NOT NULL ${t}
11
11
  ORDER BY completed_at DESC, rowid DESC LIMIT ${mt}`,...s).map(Tt)}catch{return[]}}u(w,"queryHistory");async function N(r,t){await r.update(t,()=>({currentTask:null,previousTask:null,pausedTasks:[],activeTasks:[],lastUpdated:d()}))}u(N,"clearTask");async function U(r,t){let s=await r.read(t),e=r.getPausedTasksFromState(s);return s.currentTask!==null||e.length>0}u(U,"hasTask");async function J(r,t){let s=await r.read(t);return r.getPausedTasksFromState(s)[0]||null}u(J,"getPausedTask");async function L(r,t){let s=await r.read(t);return r.getPausedTasksFromState(s)}u(L,"getAllPausedTasks");async function P(r,t){return w(t)}u(P,"getTaskHistory");async function q(r,t){return w(t)[0]||null}u(q,"getMostRecentTask");async function M(r,t,s){return w(t,"AND type = ?",s)}u(M,"getTaskHistoryByType");async function $(r,t){let e=(await P(r,t)).filter(p=>p.feedback),a=[],n=[],i=[],o=[];for(let p of e){let m=p.feedback;Array.isArray(m.stackConfirmed)&&a.push(...m.stackConfirmed),Array.isArray(m.patternsDiscovered)&&n.push(...m.patternsDiscovered),Array.isArray(m.agentAccuracy)&&i.push(...m.agentAccuracy),Array.isArray(m.issuesEncountered)&&o.push(...m.issuesEncountered)}let c=[...new Set(a)],k=[...new Set(n)],l=new Map;for(let p of o)l.set(p,(l.get(p)||0)+1);let T=[...l.entries()].filter(([p,m])=>m>=2).map(([p])=>p);return{stackConfirmed:c,patternsDiscovered:k,agentAccuracy:i,issuesEncountered:[...new Set(o)],knownGotchas:T}}u($,"getAggregatedFeedback");g();var ft=u(r=>r.filter(t=>t.status==="completed").length,"countCompleted"),j=u(r=>r.filter(t=>t.status==="completed"||t.status==="failed"||t.status==="skipped").length,"countResolved");async function y(r,t,s,e){let a={};return await r.update(t,n=>{if(!n.currentTask?.subtasks)return n;let i=n.currentTask.currentSubtaskIndex||0,o=n.currentTask.subtasks[i];if(!o)return n;let c=[...n.currentTask.subtasks];c[i]=s(o);let k=i+1,l=c.length;k<l&&(c[k]={...c[k],status:"in_progress",startedAt:d()});let T=k<l?c[k]:null,p=e?Q(e(c),l):void 0;return a.value={taskId:n.currentTask.id,current:c[i],next:T,...p?{progress:p}:{}},{...n,currentTask:{...n.currentTask,subtasks:c,currentSubtaskIndex:k<l?k:i,...p?{subtaskProgress:p}:{}},lastUpdated:d()}}),a.value??null}u(y,"mutateCurrentSubtask");function Q(r,t){return{completed:r,total:t,percentage:t>0?Math.round(r/t*100):0}}u(Q,"progressFrom");async function V(r,t,s){let e=await r.update(t,i=>{if(!i.currentTask)return i;let o=s.map((c,k)=>({...c,status:k===0?"in_progress":"pending",startedAt:k===0?d():void 0,dependsOn:c.dependsOn||[]}));return{...i,currentTask:{...i.currentTask,subtasks:o,currentSubtaskIndex:0,subtaskProgress:Q(0,o.length)},lastUpdated:d()}}),a=e.currentTask?.id??null,n=e.currentTask?.subtasks??[];a&&await r.publish(t,"subtasks.created",{taskId:a,subtaskCount:n.length,subtasks:n.map(i=>({id:i.id,description:i.description,domain:i.domain}))})}u(V,"createSubtasks");async function G(r,t,s){let e=W.safeParse(s);if(!e.success){let o=e.error.issues.map(c=>`${c.path.join(".")}: ${c.message}`);throw new Error(`Subtask completion requires handoff data:
@@ -5,7 +5,7 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{a as O}from"./chunk-66GE3IHX.mjs";import{a as A}from"./chunk-J6TAD3OZ.mjs";import{a as h}from"./chunk-T2FCU3ZS.mjs";import{c as I}from"./chunk-KOCROTRM.mjs";import{a as P,h as tt}from"./chunk-UUULLTQV.mjs";import{a as w,b,c as S}from"./chunk-OIU4Y5WL.mjs";import{c as E}from"./chunk-TYEAIX3X.mjs";import{b as R}from"./chunk-6UH244CC.mjs";import{a as m}from"./chunk-TG5CQJD5.mjs";import{c as x}from"./chunk-M5E2YOZ4.mjs";import{b as N}from"./chunk-6RLCUGGG.mjs";import{a as T,b as j,e as p,g as _}from"./chunk-KG7Z6OMK.mjs";import{b as D,h as Z}from"./chunk-JAMSIKDE.mjs";import{a as d}from"./chunk-E66B27AL.mjs";_();function g(e,t,n){return e[t]??e[n]??""}d(g,"str");var L={async upsert(e,t){let n=g(t,"id","id"),r=g(t,"entity_type","entityType"),s=g(t,"entity_id","entityId");if(!n||!r||!s||p.get(e,"SELECT id FROM archives WHERE entity_type = ? AND entity_id = ? LIMIT 1",r,s))return;let c=typeof t.entity_data=="string"?t.entity_data:t.entity_data!=null?JSON.stringify(t.entity_data):"{}",o=g(t,"archived_at","archivedAt")||g(t,"created_at","createdAt")||new Date().toISOString(),a=t.summary??null,u=g(t,"reason","reason")||"sync";try{p.run(e,`INSERT OR IGNORE INTO archives
8
+ import{a as O}from"./chunk-JZDZH6IV.mjs";import{a as A}from"./chunk-XV2LJVYB.mjs";import{a as h}from"./chunk-YHOZTAZH.mjs";import{c as I}from"./chunk-DCHIPMOG.mjs";import{a as P,h as tt}from"./chunk-UUULLTQV.mjs";import{a as w,b,c as S}from"./chunk-OC4CYF7V.mjs";import{c as E}from"./chunk-XDBJSJOT.mjs";import{b as R}from"./chunk-D7DQABWO.mjs";import{a as m}from"./chunk-AORD3YDQ.mjs";import{c as x}from"./chunk-M5E2YOZ4.mjs";import{b as N}from"./chunk-3FEXJUO2.mjs";import{a as T,b as j,e as p,g as _}from"./chunk-TKXOMN4K.mjs";import{b as D,h as Z}from"./chunk-A6K4H3YT.mjs";import{a as d}from"./chunk-E66B27AL.mjs";_();function g(e,t,n){return e[t]??e[n]??""}d(g,"str");var L={async upsert(e,t){let n=g(t,"id","id"),r=g(t,"entity_type","entityType"),s=g(t,"entity_id","entityId");if(!n||!r||!s||p.get(e,"SELECT id FROM archives WHERE entity_type = ? AND entity_id = ? LIMIT 1",r,s))return;let c=typeof t.entity_data=="string"?t.entity_data:t.entity_data!=null?JSON.stringify(t.entity_data):"{}",o=g(t,"archived_at","archivedAt")||g(t,"created_at","createdAt")||new Date().toISOString(),a=t.summary??null,u=g(t,"reason","reason")||"sync";try{p.run(e,`INSERT OR IGNORE INTO archives
9
9
  (id, entity_type, entity_id, entity_data, summary, archived_at, reason)
10
10
  VALUES (?, ?, ?, ?, ?, ?, ?)`,n,r,s,c,a,o,u)}catch{}},async delete(e,t){}};_();var C={async upsert(e,t){let n=t.name||"";if(!n)return;let r=t.description??null,s=et(t.metadata),i=new Date().toISOString(),c=p.get(e,"SELECT id, is_builtin FROM custom_workflows WHERE name = ?",n);if(c){if(c.is_builtin===1)return;p.run(e,"UPDATE custom_workflows SET description = ?, metadata = ?, updated_at = ? WHERE name = ? AND is_builtin = 0",r,s,i,n);return}p.run(e,`INSERT INTO custom_workflows (name, description, created_at, updated_at, is_builtin, enabled, metadata)
11
11
  VALUES (?, ?, ?, ?, 0, 0, ?)`,n,r,t.created_at||i,i,s)},async delete(e,t){}};function et(e){if(e==null)return null;if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return null}}d(et,"serializeMetadata");var M={async upsert(e,t){let n=t.id||"";if(!n)return;let r=t.title||t.text||"";if(!r.trim())return;let s=t.priority||"medium",i=t.status||"active";await O.upsertIdea(e,{id:n,text:r,priority:s,status:i==="archived"?"archived":"pending",addedAt:t.created_at??t.addedAt??new Date().toISOString()})},async delete(e,t){}};j();tt();_();function nt(e){if(!e)return{};if(typeof e=="string")try{return JSON.parse(e)}catch{return{}}return typeof e=="object"?e:{}}d(nt,"asTags");function f(e,t,n){return e[t]??e[n]??""}d(f,"field");var W={async upsert(e,t){let n=f(t,"content","content"),r=f(t,"type","type");if(!n||!r)return;let s=nt(t.tags),i=f(t,"provenance","provenance")||"declared",c=t.source??null,o=T(n);if(p.get(e,"SELECT id FROM memory_entries WHERE content_hash = ? AND type = ? AND deleted_at IS NULL LIMIT 1",o,r))return;let u=t.created_at||t.createdAt||new Date().toISOString();p.appendEvent(e,`memory.${P}${r}`,{content:n,tags:s,source:c,provenance:i,content_hash:o,project_id:e,created_at:u})},async delete(e,t){let n=f(t,"id","id"),r=f(t,"content","content"),s=f(t,"type","type"),i=[];if(/^mem_\d+$/.test(n)&&i.push(n),r&&s){let o=T(r),a=p.query(e,"SELECT id FROM memory_entries WHERE content_hash = ? AND type = ? AND deleted_at IS NULL",o,s);i.push(...a.map(u=>u.id))}let c=[...new Set(i)];for(let o of c){let a=o.match(/^mem_(\d+)$/)?.[1];a&&p.run(e,"UPDATE events SET type = ? WHERE id = ?","memory.deleted.context-quality",Number(a)),p.run(e,"UPDATE memory_entries SET deleted_at = ? WHERE id = ?",Date.now(),o),p.run(e,"DELETE FROM memory_embeddings WHERE memory_id = ?",o)}}};var F={async upsert(e,t){let n=t.description||"";if(!n.trim())return;let r=t.id||"";if(!r){await h.addTask(e,{description:n,priority:t.priority||"medium",type:t.type||"feature",section:t.section||"backlog"});return}await h.upsertTask(e,{id:r,description:n,...t.priority?{priority:t.priority}:{},...t.type?{type:t.type}:{},...t.section?{section:t.section}:{}})},async delete(e,t){}};var k={async upsert(e,t){await A.addShipped(e,{name:t.name||t.title||"",version:t.version||"",description:t.description||""},t.created_at||t.shippedAt||t.shipped_at)},async delete(e,t){}};var U={async upsert(e,t){let n=t.id||"";n&&I.applyRemote(e,{id:n,title:t.title,status:t.status,content:t.content??{},tags:t.tags,created_at:t.created_at,updated_at:t.updated_at})},async delete(e,t){}};var $={async upsert(e,t){let n=t.id||"";if(!n)return;let r=t.status||"";if(r==="completed"||r==="shipped"){await R.update(e,s=>s.currentTask?.id===n?{...s,currentTask:null}:s);return}if(r==="active"||t.started_at||t.startedAt){await R.update(e,s=>({...s,currentTask:{id:n,description:t.description,startedAt:t.started_at||t.startedAt||new Date().toISOString(),sessionId:t.session_id||t.sessionId||""}}));return}(t.description||"").trim()&&await h.upsertTask(e,{id:n,description:t.description,...t.priority?{priority:t.priority}:{},...t.type?{type:t.type}:{}})},async delete(e,t){}};_();var q={async upsert(e,t){let n=Number(t.id);if(!Number.isSafeInteger(n)||n<=0)return;let r=-n;p.transaction(e,s=>{s.prepare(`INSERT INTO workflow_rules
@@ -28,4 +28,4 @@ import{a as O}from"./chunk-66GE3IHX.mjs";import{a as A}from"./chunk-J6TAD3OZ.mjs
28
28
  ON CONFLICT(entity_type, entity_id) DO UPDATE SET
29
29
  content_hash = excluded.content_hash,
30
30
  applied_at = excluded.applied_at,
31
- created_at = COALESCE(excluded.created_at, sync_applied_hashes.created_at)`,t,n,r,D(),s??null)}catch{}}d(B,"recordApplied");function V(e,t,n){if(!(!t||!n))try{p.run(e,"DELETE FROM sync_applied_hashes WHERE entity_type = ? AND entity_id = ?",t,n)}catch{}}d(V,"clearApplied");var G=new Set;function rt(e){if(G.has(e))return;G.add(e);let n=Y.has(e)?"CLI does not track this entity locally yet \u2014 see Phase 2 spec":"no local handler registered";console.warn(`[sync] apply skipped: entity_type='${e}' (${n}). code=no_local_handler`)}d(rt,"warnNoLocalHandler");var J=new Set;function st(e){J.has(e)||(J.add(e),console.warn(`[sync] inbound '${e}' event has no created_at \u2014 origin chronology cannot be preserved. The producer should include created_at in its payload. code=missing_origin_created_at`))}d(st,"warnMissingCreatedAt");function it(e){let t=e.data??{},n=e.content_hash??e.contentHash;if(e.entity_type){let c=(e.event_type||"upsert")==="delete"?"delete":"upsert";return{entityType:e.entity_type,eventType:c,data:t,contentHash:n}}if(e.entityType){let c=e.eventType||"upsert";return{entityType:e.entityType,eventType:c==="delete"?"delete":"upsert",data:t,contentHash:n}}let[r,s]=(e.type||"").split("."),i=s==="deleted"||s==="archived"||s==="removed";return{entityType:w(r)||r||"unknown",eventType:i?"delete":"upsert",data:t,contentHash:n}}d(it,"normalizeEventShape");function K(e){return e instanceof Error?e.message:e&&typeof e=="object"&&"message"in e?String(e.message):"Unknown error"}d(K,"errorMessage");function X(e){if(e&&typeof e=="object"&&"code"in e)return e.code}d(X,"errorCode");var H=class{static{d(this,"SyncManager")}async hasAuth(){return await E.hasAuth()}async getStatus(t){if(!await this.hasAuth())return null;try{return await S.getStatus(t)}catch{return null}}async sync(t,n){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};let r={success:!0,skipped:!1};try{await A.republishShips(t)}catch{}let s=await this.push(t,n);s.success&&!s.skipped&&(r.pushed={count:s.count||0,syncedAt:s.syncedAt||new Date().toISOString()});let i=await this.pull(t);return i.success&&!i.skipped&&(r.pulled={count:i.count||0,syncedAt:i.syncedAt||new Date().toISOString()}),(!s.success||!i.success)&&(r.success=!1,r.error=s.error||i.error,r.code=s.code||i.code),r}async push(t,n){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let r=await m.getPending(t),s=n?.include?r.filter(a=>{let u=w(a.entityType)??w(a.type?.split(".")[0]);return u?b(u,n.include):!0}):r;if(s.length===0)return{success:!0,skipped:!0,reason:"no_pending"};let i=await this.createProjectLinkEvent(t),c=i?[i,...s]:s,o=await S.pushEvents(t,c);if(o.success)return await m.clearPending(t),await m.updateLastSync(t),{success:!0,skipped:!1,count:o.processed,syncedAt:o.syncedAt};{let a=o.processed,u=o.errors.length,l=o.errors.map(y=>y.error).join(", ");return{success:!1,skipped:!1,count:a,syncedAt:o.syncedAt,error:`${u} events failed: ${l}`}}}catch(r){return{success:!1,skipped:!1,reason:"error",error:K(r),code:X(r)}}}async pull(t){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let{syncCursorStorage:n}=await import("./sync-cursor-storage-E3LMZISA.mjs"),r=await E.read(),s=r.deviceId??null,i=r.userId??null,o=(s?n.get(t,i,s):null)?.lastEventId??0,a=await S.pullEvents(t,o);if(a.events.length===0)return await m.updateLastSync(t),{success:!0,skipped:!1,count:0,applied:0,syncedAt:a.syncedAt};let u=await this.applyPulledEvents(t,a.events),l=a.events.flatMap(y=>[y.event_id,y.eventId]).filter(y=>typeof y=="number").reduce((y,Q)=>Math.max(y,Q),o);return s&&l>o&&n.advance(t,l,{userId:i,deviceId:s}),await m.updateLastSync(t),{success:!0,skipped:!1,count:a.events.length,applied:u,syncedAt:a.syncedAt}}catch(n){return{success:!1,skipped:!1,reason:"error",error:K(n),code:X(n)}}}async applyPulledEvents(t,n){let r=[];for(let s of n)try{await this.applyEvent(t,s),r.push(s)}catch(i){let c=s.entity_type||s.type||"unknown";console.error(`Failed to apply event ${c}:`,i)}return r.length}async applyRealtimeEvent(t,n){try{let r=await E.read(),s=r.deviceId??null,i=n.origin_device_id??n.originDeviceId;if(s&&i&&i===s)return!1;await this.applyEvent(t,n);let c=typeof n.event_id=="number"?n.event_id:typeof n.eventId=="number"?n.eventId:null;if(c!==null){let{syncCursorStorage:o}=await import("./sync-cursor-storage-E3LMZISA.mjs"),a=r.userId??null,u=r.deviceId??null;if(u){let l=o.get(t,a,u);(!l||c>l.lastEventId)&&o.advance(t,c,{userId:a,deviceId:u})}}return!0}catch(r){return console.error("[realtime] apply failed:",r instanceof Error?r.message:r),!1}}async applyEvent(t,n){let{entityType:r,eventType:s,data:i,contentHash:c}=it(n),o=i.id??"",a=v[r];if(!a){rt(r);return}if(s==="delete"){await a.delete(t,i),o&&V(t,r,o);return}if(!(c&&this.alreadyApplied(t,r,o,c))&&(await a.upsert(t,i),o)){let u=i.created_at??i.createdAt??null;u||st(r);let l=c??x(i);B(t,r,o,l,u)}}alreadyApplied(t,n,r,s){if(!r)return!1;let i=z(t,n,r);return i!==null&&i===s}async createProjectLinkEvent(t){try{let n=await N(t).catch(()=>({}));return{type:"project.updated",path:["project"],data:{id:t,cli_project_id:t,meta:n},timestamp:new Date().toISOString(),projectId:t}}catch{return null}}},ot=new H,ee=ot;export{ee as a};
31
+ created_at = COALESCE(excluded.created_at, sync_applied_hashes.created_at)`,t,n,r,D(),s??null)}catch{}}d(B,"recordApplied");function V(e,t,n){if(!(!t||!n))try{p.run(e,"DELETE FROM sync_applied_hashes WHERE entity_type = ? AND entity_id = ?",t,n)}catch{}}d(V,"clearApplied");var G=new Set;function rt(e){if(G.has(e))return;G.add(e);let n=Y.has(e)?"CLI does not track this entity locally yet \u2014 see Phase 2 spec":"no local handler registered";console.warn(`[sync] apply skipped: entity_type='${e}' (${n}). code=no_local_handler`)}d(rt,"warnNoLocalHandler");var J=new Set;function st(e){J.has(e)||(J.add(e),console.warn(`[sync] inbound '${e}' event has no created_at \u2014 origin chronology cannot be preserved. The producer should include created_at in its payload. code=missing_origin_created_at`))}d(st,"warnMissingCreatedAt");function it(e){let t=e.data??{},n=e.content_hash??e.contentHash;if(e.entity_type){let c=(e.event_type||"upsert")==="delete"?"delete":"upsert";return{entityType:e.entity_type,eventType:c,data:t,contentHash:n}}if(e.entityType){let c=e.eventType||"upsert";return{entityType:e.entityType,eventType:c==="delete"?"delete":"upsert",data:t,contentHash:n}}let[r,s]=(e.type||"").split("."),i=s==="deleted"||s==="archived"||s==="removed";return{entityType:w(r)||r||"unknown",eventType:i?"delete":"upsert",data:t,contentHash:n}}d(it,"normalizeEventShape");function K(e){return e instanceof Error?e.message:e&&typeof e=="object"&&"message"in e?String(e.message):"Unknown error"}d(K,"errorMessage");function X(e){if(e&&typeof e=="object"&&"code"in e)return e.code}d(X,"errorCode");var H=class{static{d(this,"SyncManager")}async hasAuth(){return await E.hasAuth()}async getStatus(t){if(!await this.hasAuth())return null;try{return await S.getStatus(t)}catch{return null}}async sync(t,n){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};let r={success:!0,skipped:!1};try{await A.republishShips(t)}catch{}let s=await this.push(t,n);s.success&&!s.skipped&&(r.pushed={count:s.count||0,syncedAt:s.syncedAt||new Date().toISOString()});let i=await this.pull(t);return i.success&&!i.skipped&&(r.pulled={count:i.count||0,syncedAt:i.syncedAt||new Date().toISOString()}),(!s.success||!i.success)&&(r.success=!1,r.error=s.error||i.error,r.code=s.code||i.code),r}async push(t,n){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let r=await m.getPending(t),s=n?.include?r.filter(a=>{let u=w(a.entityType)??w(a.type?.split(".")[0]);return u?b(u,n.include):!0}):r;if(s.length===0)return{success:!0,skipped:!0,reason:"no_pending"};let i=await this.createProjectLinkEvent(t),c=i?[i,...s]:s,o=await S.pushEvents(t,c);if(o.success)return await m.clearPending(t),await m.updateLastSync(t),{success:!0,skipped:!1,count:o.processed,syncedAt:o.syncedAt};{let a=o.processed,u=o.errors.length,l=o.errors.map(y=>y.error).join(", ");return{success:!1,skipped:!1,count:a,syncedAt:o.syncedAt,error:`${u} events failed: ${l}`}}}catch(r){return{success:!1,skipped:!1,reason:"error",error:K(r),code:X(r)}}}async pull(t){if(!await this.hasAuth())return{success:!0,skipped:!0,reason:"no_auth"};try{let{syncCursorStorage:n}=await import("./sync-cursor-storage-ZB7FGT6D.mjs"),r=await E.read(),s=r.deviceId??null,i=r.userId??null,o=(s?n.get(t,i,s):null)?.lastEventId??0,a=await S.pullEvents(t,o);if(a.events.length===0)return await m.updateLastSync(t),{success:!0,skipped:!1,count:0,applied:0,syncedAt:a.syncedAt};let u=await this.applyPulledEvents(t,a.events),l=a.events.flatMap(y=>[y.event_id,y.eventId]).filter(y=>typeof y=="number").reduce((y,Q)=>Math.max(y,Q),o);return s&&l>o&&n.advance(t,l,{userId:i,deviceId:s}),await m.updateLastSync(t),{success:!0,skipped:!1,count:a.events.length,applied:u,syncedAt:a.syncedAt}}catch(n){return{success:!1,skipped:!1,reason:"error",error:K(n),code:X(n)}}}async applyPulledEvents(t,n){let r=[];for(let s of n)try{await this.applyEvent(t,s),r.push(s)}catch(i){let c=s.entity_type||s.type||"unknown";console.error(`Failed to apply event ${c}:`,i)}return r.length}async applyRealtimeEvent(t,n){try{let r=await E.read(),s=r.deviceId??null,i=n.origin_device_id??n.originDeviceId;if(s&&i&&i===s)return!1;await this.applyEvent(t,n);let c=typeof n.event_id=="number"?n.event_id:typeof n.eventId=="number"?n.eventId:null;if(c!==null){let{syncCursorStorage:o}=await import("./sync-cursor-storage-ZB7FGT6D.mjs"),a=r.userId??null,u=r.deviceId??null;if(u){let l=o.get(t,a,u);(!l||c>l.lastEventId)&&o.advance(t,c,{userId:a,deviceId:u})}}return!0}catch(r){return console.error("[realtime] apply failed:",r instanceof Error?r.message:r),!1}}async applyEvent(t,n){let{entityType:r,eventType:s,data:i,contentHash:c}=it(n),o=i.id??"",a=v[r];if(!a){rt(r);return}if(s==="delete"){await a.delete(t,i),o&&V(t,r,o);return}if(!(c&&this.alreadyApplied(t,r,o,c))&&(await a.upsert(t,i),o)){let u=i.created_at??i.createdAt??null;u||st(r);let l=c??x(i);B(t,r,o,l,u)}}alreadyApplied(t,n,r,s){if(!r)return!1;let i=z(t,n,r);return i!==null&&i===s}async createProjectLinkEvent(t){try{let n=await N(t).catch(()=>({}));return{type:"project.updated",path:["project"],data:{id:t,cli_project_id:t,meta:n},timestamp:new Date().toISOString(),projectId:t}}catch{return null}}},ot=new H,ee=ot;export{ee as a};
@@ -5,7 +5,7 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{a as D}from"./chunk-DYHYDHCW.mjs";import{a as x}from"./chunk-5EQLQ7GF.mjs";import{b as N}from"./chunk-UA4Z5TGG.mjs";import{e as u,g as M}from"./chunk-KG7Z6OMK.mjs";import{b as m,h as C}from"./chunk-JAMSIKDE.mjs";import{a as d}from"./chunk-E66B27AL.mjs";import{z as r}from"zod";var R=["draft","reviewed","in_progress","shipped","archived"];var k=r.object({verdict:r.enum(["pass","fail"]),notes:r.string(),ts:r.string(),candidateHash:r.string().optional()}),P=r.object({risk:r.string().min(1),mitigation:r.string().min(1)}),b=r.object({name:r.string().min(1),given:r.array(r.string()).default([]),when:r.array(r.string()).default([]),then:r.array(r.string()).default([])}),q=r.object({slug:r.string().min(1),name:r.string().min(1),statement:r.string().min(1),scenarios:r.array(b).default([])}),$=r.object({added:r.array(q).default([]),modified:r.array(q).default([]),removed:r.array(r.string().min(1)).default([])}),H=r.object({id:r.string().min(1),ts:r.string(),ops:$}),h=r.object({goal:r.string().min(1),eli10:r.string().default(""),stakes:r.string().default(""),acceptance_criteria:r.array(r.string().min(1)).default([]),scope:r.array(r.string()).default([]),out_of_scope:r.array(r.string()).default([]),risks:r.array(P).default([]),test_plan:r.array(r.string()).default([]),reviews:r.record(r.string(),k).optional(),selected_reviewers:r.array(r.string()).default([]),linked_tasks:r.array(r.string()).default([]),notes:r.string().default(""),tasks_created_at:r.string().nullable().default(null),audit_candidate_hash:r.string().nullable().default(null),scenarios:r.record(r.string(),r.array(b)).default({}),delta_log:r.array(H).default([])});import{createHash as W}from"node:crypto";C();function F(l){return l.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}d(F,"slugifyRequirement");function z(l){return`delta-${W("sha256").update(l.trim()).digest("hex").slice(0,12)}`}d(z,"deltaIdFor");function v(l){return[...l].sort((t,e)=>t.ts===e.ts?t.id<e.id?-1:t.id>e.id?1:0:t.ts<e.ts?-1:1)}d(v,"sortDeltaLog");function L(l,t){let e=new Map;for(let n of[...l,...t])e.has(n.id)||e.set(n.id,n);return v([...e.values()])}d(L,"mergeDeltaLogs");function A(l){let t=new Set;for(let e of l)for(let n of[...e.ops.added,...e.ops.modified])t.add(n.statement);return t}d(A,"allDeltaStatements");function U(l){let t={order:[],statements:new Map,scenarios:new Map},e=d(n=>{t.statements.has(n.slug)||t.order.push(n.slug),t.statements.set(n.slug,n.statement),n.scenarios.length>0?t.scenarios.set(n.slug,n.scenarios):t.scenarios.delete(n.slug)},"upsert");for(let n of v(l)){for(let s of n.ops.added)e(s);for(let s of n.ops.modified)e(s);for(let s of n.ops.removed){t.statements.delete(s),t.scenarios.delete(s);let i=t.order.indexOf(s);i>=0&&t.order.splice(i,1)}}return t}d(U,"foldEntries");function O(l){let t=U(l),e={};for(let n of t.order){let s=t.scenarios.get(n);s&&(e[n]=s)}return{acceptance_criteria:t.order.map(n=>t.statements.get(n)??""),scenarios:e}}d(O,"materializeDeltas");function J(l){let t=[],e=[],n=[],s={section:null,req:null,scenario:null},i=d(()=>{s.scenario&&s.req&&s.req.scenarios.push({name:s.scenario.name,given:s.scenario.given,when:s.scenario.when,then:s.scenario.then}),s.scenario=null},"flushScenario"),c=d(()=>{i();let a=s.req;if(s.req=null,!a)return;let o=F(a.name);if(!o)throw new Error(`DELTA_PARSE: requirement name yields an empty slug: "${a.name}"`);if(s.section==="removed"){n.push(o);return}let g=a.statementLines.join(`
8
+ import{a as D}from"./chunk-DYHYDHCW.mjs";import{a as x}from"./chunk-FZS3XGEA.mjs";import{b as N}from"./chunk-7WO5CEH3.mjs";import{e as u,g as M}from"./chunk-TKXOMN4K.mjs";import{b as m,h as C}from"./chunk-A6K4H3YT.mjs";import{a as d}from"./chunk-E66B27AL.mjs";import{z as r}from"zod";var R=["draft","reviewed","in_progress","shipped","archived"];var k=r.object({verdict:r.enum(["pass","fail"]),notes:r.string(),ts:r.string(),candidateHash:r.string().optional()}),P=r.object({risk:r.string().min(1),mitigation:r.string().min(1)}),b=r.object({name:r.string().min(1),given:r.array(r.string()).default([]),when:r.array(r.string()).default([]),then:r.array(r.string()).default([])}),q=r.object({slug:r.string().min(1),name:r.string().min(1),statement:r.string().min(1),scenarios:r.array(b).default([])}),$=r.object({added:r.array(q).default([]),modified:r.array(q).default([]),removed:r.array(r.string().min(1)).default([])}),H=r.object({id:r.string().min(1),ts:r.string(),ops:$}),h=r.object({goal:r.string().min(1),eli10:r.string().default(""),stakes:r.string().default(""),acceptance_criteria:r.array(r.string().min(1)).default([]),scope:r.array(r.string()).default([]),out_of_scope:r.array(r.string()).default([]),risks:r.array(P).default([]),test_plan:r.array(r.string()).default([]),reviews:r.record(r.string(),k).optional(),selected_reviewers:r.array(r.string()).default([]),linked_tasks:r.array(r.string()).default([]),notes:r.string().default(""),tasks_created_at:r.string().nullable().default(null),audit_candidate_hash:r.string().nullable().default(null),scenarios:r.record(r.string(),r.array(b)).default({}),delta_log:r.array(H).default([])});import{createHash as W}from"node:crypto";C();function F(l){return l.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}d(F,"slugifyRequirement");function z(l){return`delta-${W("sha256").update(l.trim()).digest("hex").slice(0,12)}`}d(z,"deltaIdFor");function v(l){return[...l].sort((t,e)=>t.ts===e.ts?t.id<e.id?-1:t.id>e.id?1:0:t.ts<e.ts?-1:1)}d(v,"sortDeltaLog");function L(l,t){let e=new Map;for(let n of[...l,...t])e.has(n.id)||e.set(n.id,n);return v([...e.values()])}d(L,"mergeDeltaLogs");function A(l){let t=new Set;for(let e of l)for(let n of[...e.ops.added,...e.ops.modified])t.add(n.statement);return t}d(A,"allDeltaStatements");function U(l){let t={order:[],statements:new Map,scenarios:new Map},e=d(n=>{t.statements.has(n.slug)||t.order.push(n.slug),t.statements.set(n.slug,n.statement),n.scenarios.length>0?t.scenarios.set(n.slug,n.scenarios):t.scenarios.delete(n.slug)},"upsert");for(let n of v(l)){for(let s of n.ops.added)e(s);for(let s of n.ops.modified)e(s);for(let s of n.ops.removed){t.statements.delete(s),t.scenarios.delete(s);let i=t.order.indexOf(s);i>=0&&t.order.splice(i,1)}}return t}d(U,"foldEntries");function O(l){let t=U(l),e={};for(let n of t.order){let s=t.scenarios.get(n);s&&(e[n]=s)}return{acceptance_criteria:t.order.map(n=>t.statements.get(n)??""),scenarios:e}}d(O,"materializeDeltas");function J(l){let t=[],e=[],n=[],s={section:null,req:null,scenario:null},i=d(()=>{s.scenario&&s.req&&s.req.scenarios.push({name:s.scenario.name,given:s.scenario.given,when:s.scenario.when,then:s.scenario.then}),s.scenario=null},"flushScenario"),c=d(()=>{i();let a=s.req;if(s.req=null,!a)return;let o=F(a.name);if(!o)throw new Error(`DELTA_PARSE: requirement name yields an empty slug: "${a.name}"`);if(s.section==="removed"){n.push(o);return}let g=a.statementLines.join(`
9
9
  `).trim();if(!g)throw new Error(`DELTA_PARSE: requirement "${a.name}" has no SHALL statement`);(s.section==="modified"?e:t).push({slug:o,name:a.name,statement:g,scenarios:a.scenarios})},"flushReq");for(let a of l.split(`
10
10
  `)){let o=a.trim(),g=o.match(/^##\s+(ADDED|MODIFIED|REMOVED)\s+Requirements\s*$/i);if(g){c(),s.section=g[1].toLowerCase();continue}if(/^#{1,2}\s/.test(o)){c(),s.section=null;continue}let f=o.match(/^###\s+Requirement:\s*(.+)$/i);if(f){if(c(),!s.section)throw new Error('DELTA_PARSE: "### Requirement:" outside an ADDED/MODIFIED/REMOVED Requirements section');s.req={name:f[1].trim(),statementLines:[],scenarios:[]};continue}let S=o.match(/^####\s+Scenario:\s*(.+)$/i);if(S){if(i(),!s.req)throw new Error('DELTA_PARSE: "#### Scenario:" outside a "### Requirement:" block');s.scenario={name:S[1].trim(),given:[],when:[],then:[],last:null};continue}if(s.scenario&&o.startsWith("-")){let p=o.replace(/^-\s+/,"").match(/^(?:\*\*)?(GIVEN|WHEN|THEN|AND)\b\s*:?\s*(?:\*\*)?\s*(.*)$/i);if(p){let _=p[1].toUpperCase(),y=_==="AND"?s.scenario.last??"when":_.toLowerCase();s.scenario[y].push(p[2].trim()),s.scenario.last=y}continue}s.req&&!s.scenario&&o!==""&&s.req.statementLines.push(o)}if(c(),t.length+e.length+n.length===0)throw new Error("DELTA_EMPTY: no ADDED/MODIFIED/REMOVED Requirements sections found");return{added:t,modified:e,removed:n}}d(J,"parseDelta");function X(l,t,e={}){let n=J(t),s=e.id??z(t);if(l.delta_log.some(p=>p.id===s))return l;let i=U(l.delta_log).statements,c=new Set(n.added.map(p=>p.slug));for(let p of n.modified)if(!i.has(p.slug)&&!c.has(p.slug))throw new Error(`DELTA_UNKNOWN_REQUIREMENT: MODIFIED target "${p.name}" (slug: ${p.slug}) does not exist`);for(let p of n.removed)if(!i.has(p)&&!c.has(p))throw new Error(`DELTA_UNKNOWN_REQUIREMENT: REMOVED target slug "${p}" does not exist`);let a={id:s,ts:e.ts??m(),ops:n},o=v([...l.delta_log,a]),g=A(o),f=l.acceptance_criteria.filter(p=>!g.has(p)),S=O(o);return h.parse({...l,acceptance_criteria:[...f,...S.acceptance_criteria],scenarios:S.scenarios,delta_log:o})}d(X,"applyDelta");C();M();var E=class extends Error{constructor(e,n){super(`spec relational projection failed for ${e} (content write rolled back): ${n instanceof Error?n.message:String(n)}`);this.specId=e;this.name="SpecProjectionError"}specId;static{d(this,"SpecProjectionError")}};function w(l,t,e){try{u.run(l,"DELETE FROM spec_review WHERE spec_id = ?",t),u.run(l,"DELETE FROM spec_selected_reviewer WHERE spec_id = ?",t);for(let[n,s]of Object.entries(e.reviews??{}))u.run(l,"INSERT INTO spec_review (id, spec_id, lens, verdict, notes, created_at) VALUES (?, ?, ?, ?, ?, ?)",`${t}-rev-${n}`,t,n,s.verdict,s.notes??null,Date.now());for(let n of e.selected_reviewers)u.run(l,"INSERT OR IGNORE INTO spec_selected_reviewer (spec_id, lens) VALUES (?, ?)",t,n)}catch(n){throw new E(t,n)}}d(w,"projectSpecRelational");var T=class{static{d(this,"SpecStorage")}nextUpdatedAt(t,e){let n=m(),i=u.get(t,"SELECT updated_at FROM specs WHERE id = ?",e)?.updated_at;return!i||n>i?n:new Date(new Date(i).getTime()+1).toISOString()}create(t,e){let n=x(),s=m(),i=h.parse(e.content);try{u.transaction(t,()=>{u.run(t,`INSERT INTO specs (id, title, status, content, tags, created_at, updated_at)
11
11
  VALUES (?, ?, 'draft', ?, ?, ?, ?)`,n,e.title,JSON.stringify(i),e.tags?JSON.stringify(e.tags):null,s,s),w(t,n,i)})}catch(a){if(a instanceof E)D.warn(a.message);else throw a}let c={id:n,title:e.title,status:"draft",content:i,tags:e.tags??{},createdAt:s,updatedAt:s,shippedAt:null,shippedPr:null,shippedSha:null,archivedAt:null};return this.publishSync(t,c),c}get(t,e){let n=u.get(t,"SELECT * FROM specs WHERE id = ?",e);return n?this.rowToSpec(n):null}list(t,e={}){let n=[];e.status&&n.push(e.status);let i=`SELECT * FROM specs WHERE 1=1${e.status?" AND status = ?":e.includeArchived?"":" AND status != 'archived'"} ORDER BY created_at DESC`;return u.query(t,i,...n).map(a=>this.rowToSpec(a))}search(t,e){let n=`%${e}%`;return u.query(t,"SELECT * FROM specs WHERE title LIKE ? OR content LIKE ? ORDER BY created_at DESC",n,n).map(i=>this.rowToSpec(i))}updateContent(t,e,n){let s=h.parse(n),i=this.nextUpdatedAt(t,e);try{u.transaction(t,()=>{u.run(t,"UPDATE specs SET content = ?, updated_at = ? WHERE id = ?",JSON.stringify(s),i,e),w(t,e,s)})}catch(a){if(a instanceof E)D.warn(a.message);else throw a}let c=this.get(t,e);return c&&this.publishSync(t,c),c}casUpdate(t,e,n,s){let i=h.parse(n),c=this.nextUpdatedAt(t,e),a=(()=>{try{return u.transaction(t,()=>{let g=u.run(t,"UPDATE specs SET content = ?, updated_at = ? WHERE id = ? AND updated_at = ?",JSON.stringify(i),c,e,s).changes===1;return g&&w(t,e,i),g})}catch(o){if(o instanceof E)return D.warn(o.message),!1;throw o}})();if(a){let o=this.get(t,e);o&&this.publishSync(t,o)}return a}setStatus(t,e,n){if(!R.includes(n))throw new Error(`invalid spec status: ${n}`);let s=this.nextUpdatedAt(t,e),i=[],c=[n,s];n==="shipped"&&(i.push("shipped_at = ?"),c.push(s)),n==="archived"&&(i.push("archived_at = ?"),c.push(s));let a=["status = ?","updated_at = ?",...i].join(", ");c.push(e),u.run(t,`UPDATE specs SET ${a} WHERE id = ?`,...c);let o=this.get(t,e);return o&&this.publishSync(t,o),o}setShippedPr(t,e,n){u.run(t,"UPDATE specs SET shipped_pr = ?, updated_at = ? WHERE id = ?",n,this.nextUpdatedAt(t,e),e);let s=this.get(t,e);return s&&this.publishSync(t,s),s}setShippedSha(t,e,n){u.run(t,"UPDATE specs SET shipped_sha = ?, updated_at = ? WHERE id = ?",n,this.nextUpdatedAt(t,e),e);let s=this.get(t,e);return s&&this.publishSync(t,s),s}linkTask(t,e,n){let s=this.get(t,e);if(!s)return null;if(s.content.linked_tasks.includes(n))return s;let i={...s.content,linked_tasks:[...s.content.linked_tasks,n]};return this.updateContent(t,e,i)}delete(t,e){let n=this.get(t,e);return n?(u.run(t,"DELETE FROM specs WHERE id = ?",e),this.publishSync(t,n,"delete"),!0):!1}applyRemote(t,e){if(!e.id)return;let n=typeof e.content=="string"?e.content:JSON.stringify(e.content??{}),s=R.includes(e.status)?e.status:"draft",i=e.tags==null?null:typeof e.tags=="string"?e.tags:JSON.stringify(e.tags),c=m();if(u.run(t,`INSERT INTO specs (id, title, status, content, tags, created_at, updated_at)
@@ -5,7 +5,7 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{a as R}from"./chunk-SDUS2AT7.mjs";import{a}from"./chunk-ZMLA5SKR.mjs";import{a as h}from"./chunk-27XFSCOE.mjs";import{d as l,g as E}from"./chunk-KG7Z6OMK.mjs";import{a as c}from"./chunk-E66B27AL.mjs";E();var _="land-receipt",k="judgment-receipt",g="receipt-v1";function D(e){let s=e.trapsSurfaced??[],t=e.decisions??[],n=(e.journal??[]).filter(r=>r.trim()),o=(e.openRisksNext??[]).filter(r=>r.trim()),u=e.cycleDescription?.trim()||null,y=e.tokensIn!=null||e.tokensOut!=null||!!e.model;if(!u&&s.length===0&&t.length===0&&n.length===0&&o.length===0&&!y)return null;let i=["# Judgment Receipt",""],m=[];if(u&&m.push(`cycle: "${a(u,100)}"`),n.length>0&&m.push(`journal: ${n.slice(0,4).map(r=>a(r,70)).join(" \xB7 ")}`),m.length>0&&i.push("## Applied judgment",...m.map(r=>`- ${r}`),""),s.length>0&&i.push("## Traps re-surfaced",...s.slice(0,8).map(r=>`- **[${r.type}]** ${a(r.title,100)} \`${r.id}\``),""),t.length>0&&i.push("## Decisions contested or honored",...t.slice(0,8).map(r=>`- **${r.status}** [${r.type}] ${a(r.title,100)} \`${r.id}\``),""),o.length>0||u){let r=o.length>0?o.slice(0,5).map(d=>`- ${a(d,120)}`):["- Finish or pause open cycle; next agent: `prjct prime` / `prjct work --md`."];i.push("## Open risks / next",...r,"")}if(y){let r=[];if(e.tokensIn!=null||e.tokensOut!=null){let d=e.tokensIn??0,f=e.tokensOut??0;r.push(`tokens in=${d} out=${f} total=${d+f}`)}e.model&&r.push(`model=${e.model}`),e.author&&r.push(`author=${e.author}`),i.push("## Session economics",`- ${r.join(" \xB7 ")}`,"")}return i.push("_Closed-loop judgment continuity \u2014 not bulk memory. Proof of traps prevented and decisions applied._"),i.join(`
8
+ import{a as R}from"./chunk-HGZQWYBL.mjs";import{a}from"./chunk-ZMLA5SKR.mjs";import{b as h}from"./chunk-PVCEWFHS.mjs";import{d as l,g as E}from"./chunk-TKXOMN4K.mjs";import{a as c}from"./chunk-E66B27AL.mjs";E();var _="land-receipt",k="judgment-receipt",g="receipt-v1";function D(e){let s=e.trapsSurfaced??[],t=e.decisions??[],n=(e.journal??[]).filter(r=>r.trim()),o=(e.openRisksNext??[]).filter(r=>r.trim()),u=e.cycleDescription?.trim()||null,y=e.tokensIn!=null||e.tokensOut!=null||!!e.model;if(!u&&s.length===0&&t.length===0&&n.length===0&&o.length===0&&!y)return null;let i=["# Judgment Receipt",""],m=[];if(u&&m.push(`cycle: "${a(u,100)}"`),n.length>0&&m.push(`journal: ${n.slice(0,4).map(r=>a(r,70)).join(" \xB7 ")}`),m.length>0&&i.push("## Applied judgment",...m.map(r=>`- ${r}`),""),s.length>0&&i.push("## Traps re-surfaced",...s.slice(0,8).map(r=>`- **[${r.type}]** ${a(r.title,100)} \`${r.id}\``),""),t.length>0&&i.push("## Decisions contested or honored",...t.slice(0,8).map(r=>`- **${r.status}** [${r.type}] ${a(r.title,100)} \`${r.id}\``),""),o.length>0||u){let r=o.length>0?o.slice(0,5).map(d=>`- ${a(d,120)}`):["- Finish or pause open cycle; next agent: `prjct prime` / `prjct work --md`."];i.push("## Open risks / next",...r,"")}if(y){let r=[];if(e.tokensIn!=null||e.tokensOut!=null){let d=e.tokensIn??0,f=e.tokensOut??0;r.push(`tokens in=${d} out=${f} total=${d+f}`)}e.model&&r.push(`model=${e.model}`),e.author&&r.push(`author=${e.author}`),i.push("## Session economics",`- ${r.join(" \xB7 ")}`,"")}return i.push("_Closed-loop judgment continuity \u2014 not bulk memory. Proof of traps prevented and decisions applied._"),i.join(`
9
9
  `).trim()}c(D,"buildJudgmentReceipt");function I(e){if(!e)return null;let s=(e.match(/## Traps re-surfaced/g)||[]).length,t=p(e,"Traps re-surfaced"),n=p(e,"Decisions contested or honored"),o=[];return t>0&&o.push(`${t} trap(s) re-surfaced`),n>0&&o.push(`${n} decision(s) tracked`),o.length===0&&o.push("session judgment landed"),`Judgment receipt: ${o.join(", ")}`}c(I,"summarizeJudgmentReceipt");function p(e,s){let t=new RegExp(`## ${s}\\n([\\s\\S]*?)(?=\\n## |\\n_|$)`),n=e.match(t);return n?(n[1].match(/^- /gm)||[]).length:0}c(p,"countSectionBullets");async function S(e,s,t){let n=D(t);if(!n)return{wrote:!1,content:null,summary:null,reason:"nothing-to-receipt"};try{return await h.remember(e,{type:"context",content:n,tags:{source:_,topic:k,capture:g,synthesis:"deterministic"},provenance:"extracted",projectId:s}),{wrote:!0,content:n,summary:I(n)}}catch(o){return{wrote:!1,content:n,summary:I(n),reason:`remember-failed: ${o.message}`}}}c(S,"persistJudgmentReceipt");async function b(e){let s=R(e.projectId,e.cycleId),t=O(e.projectId),n=j(e.projectId);return S(e.projectPath,e.projectId,{cycleDescription:e.cycleDescription,cycleId:e.cycleId,journal:s,trapsSurfaced:t,decisions:n,tokensIn:e.tokensIn,tokensOut:e.tokensOut,model:e.model,author:e.author,openRisksNext:e.cycleDescription?["Open cycle still needs finish or pause before context dies."]:[]})}c(b,"synthesizeJudgmentReceipt");function C(e){try{let s=Date.now()-864e5,n=l.query(e,`SELECT me.id, me.content
10
10
  FROM memory_entries me
11
11
  JOIN memory_entry_tags t ON t.entry_id = me.id
@@ -5,4 +5,4 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{a as x,b as h}from"./chunk-MI3JEFON.mjs";import{a as M,h as I}from"./chunk-DXQMKW2B.mjs";import{e as b}from"./chunk-NWZEBCTC.mjs";import{a as S}from"./chunk-27XFSCOE.mjs";import{a as l,b as D}from"./chunk-KG7Z6OMK.mjs";import{b as R}from"./chunk-GCKILEXJ.mjs";import{a as c}from"./chunk-E66B27AL.mjs";D();var F=.92,v=.18;function d(e){let r=new Map,n=[];for(let s of e){r.set(l(s.content),s.id);let o=x(s.content);n.push(Float64Array.from(o))}return{entries:e,fingerprints:r,vectors:n}}c(d,"buildReferenceIndex");function g(e,r,n){if(!r||r.entries.length===0)return{excess:1,maxSim:0,nearestId:null,exactDup:!1,nearDup:!1};let s=l(e),o=r.fingerprints.get(s);if(o&&o!==n)return{excess:0,maxSim:1,nearestId:o,exactDup:!0,nearDup:!0};let f=x(e),a=r.entries.reduce((t,m,_)=>{if(n&&m.id===n)return t;let E=h(f,r.vectors[_]);return E>t.maxSim?{maxSim:E,nearestId:m.id}:t},{maxSim:0,nearestId:null}),i=Math.max(0,Math.min(1,a.maxSim)),u=a.nearestId,p=i>=F;return{excess:p?0:Math.max(0,Math.min(1,1-i)),maxSim:i,nearestId:u,exactDup:!1,nearDup:p}}c(g,"excessAgainstIndex");function L(e,r,n){return g(e,d(r),n)}c(L,"computeExcess");var $=new Set(["decision","gotcha","learning","fact","feedback","pattern","anti-pattern","identity","voice","glossary","framework","spec","context"]),k=150,N={declared:3,extracted:2,ambiguous:1,inferred:0};function T(e){return e.tags?.context_schema==="living-v2"||e.tags?.synthesis==="model-authored"||e.tags?.synthesis==="deterministic"||e.tags?.source==="land-auto"||e.tags?.capture==="land-v2"}c(T,"isLivingV2");function w(e){return!(!R(e)||e.content.trim().length<40||!$.has(e.type)||e.type==="context"&&!T(e)||e.type==="inbox"||e.type==="todo"||e.type==="idea")}c(w,"isReferenceEligible");function A(e){let r=N[e.provenance]??1,n=e.type==="decision"||e.type==="gotcha"?100:e.type==="learning"||e.type==="fact"?50:e.type==="context"?30:20,s=Date.parse(e.rememberedAt),o=Number.isFinite(s)?s/1e13:0;return n*10+r*3+o}c(A,"referenceRank");function C(e){let r=e.filter(w);return r.sort((n,s)=>A(s)-A(n)),r.slice(0,k)}c(C,"buildReferenceModel");var P=new Set(["decision","gotcha","red-herring","learning","fact","feedback","pattern","anti-pattern","identity","voice","glossary","framework","spec","shipped"]),j=.28;function Q(e,r,n,s){let o=n.trim();if(o.length===0)return{accept:!1,reason:"empty content"};let f=M(o,r);if(f.junk)return{accept:!1,reason:`junk capture: ${f.reason}`};let a=I(o,r,{force:s?.force==="true"||s?.["precision:force"]==="true"});if(a.action==="refuse")return{accept:!1,reason:`precision: ${a.reason}`};if(a.action==="demote")return{accept:!1,reason:`precision demote\u2192${a.demoteTo??"context"}: ${a.reason}`};let i=b(s?.source);if(P.has(r)&&!i)return{accept:!0,reason:"judgment type \u2014 always accept novel content"};let u=(()=>{try{return S.allEntriesForIndex(e)}catch{return null}})();if(!u)return{accept:!0,reason:"gate skipped (read failure)"};if(u.length===0)return{accept:!0,reason:"empty vault \u2014 seed accepted"};let p=C(u);if(p.length===0)return{accept:!0,reason:"empty reference \u2014 accept"};let y=d(p),t=g(o,y),m=i?j:v;return t.exactDup||t.nearDup||t.excess<m?{accept:!1,reason:t.exactDup?`redundant exact match of ${t.nearestId}`:i?`auto-source low excess ${t.excess.toFixed(2)} (floor ${m}) vs R nearest ${t.nearestId}`:`low excess ${t.excess.toFixed(2)} vs reference (nearest ${t.nearestId}, sim ${t.maxSim.toFixed(2)})`,excess:t.excess,nearestId:t.nearestId}:{accept:!0,reason:i?`auto-source excess ${t.excess.toFixed(2)} above floor`:`excess ${t.excess.toFixed(2)} above capture floor`,excess:t.excess,nearestId:t.nearestId}}c(Q,"captureGate");export{k as a,w as b,C as c,F as d,v as e,d as f,g,L as h,Q as i};
8
+ import{a as x,c as h}from"./chunk-7PBWIO4K.mjs";import{a as M,h as I}from"./chunk-DXQMKW2B.mjs";import{e as b}from"./chunk-RT2DFIWF.mjs";import{b as S}from"./chunk-PVCEWFHS.mjs";import{a as l,b as D}from"./chunk-TKXOMN4K.mjs";import{b as R}from"./chunk-GCKILEXJ.mjs";import{a as c}from"./chunk-E66B27AL.mjs";D();var F=.92,v=.18;function d(e){let r=new Map,n=[];for(let s of e){r.set(l(s.content),s.id);let o=x(s.content);n.push(Float64Array.from(o))}return{entries:e,fingerprints:r,vectors:n}}c(d,"buildReferenceIndex");function g(e,r,n){if(!r||r.entries.length===0)return{excess:1,maxSim:0,nearestId:null,exactDup:!1,nearDup:!1};let s=l(e),o=r.fingerprints.get(s);if(o&&o!==n)return{excess:0,maxSim:1,nearestId:o,exactDup:!0,nearDup:!0};let f=x(e),a=r.entries.reduce((t,m,_)=>{if(n&&m.id===n)return t;let E=h(f,r.vectors[_]);return E>t.maxSim?{maxSim:E,nearestId:m.id}:t},{maxSim:0,nearestId:null}),i=Math.max(0,Math.min(1,a.maxSim)),u=a.nearestId,p=i>=F;return{excess:p?0:Math.max(0,Math.min(1,1-i)),maxSim:i,nearestId:u,exactDup:!1,nearDup:p}}c(g,"excessAgainstIndex");function L(e,r,n){return g(e,d(r),n)}c(L,"computeExcess");var $=new Set(["decision","gotcha","learning","fact","feedback","pattern","anti-pattern","identity","voice","glossary","framework","spec","context"]),k=150,N={declared:3,extracted:2,ambiguous:1,inferred:0};function T(e){return e.tags?.context_schema==="living-v2"||e.tags?.synthesis==="model-authored"||e.tags?.synthesis==="deterministic"||e.tags?.source==="land-auto"||e.tags?.capture==="land-v2"}c(T,"isLivingV2");function w(e){return!(!R(e)||e.content.trim().length<40||!$.has(e.type)||e.type==="context"&&!T(e)||e.type==="inbox"||e.type==="todo"||e.type==="idea")}c(w,"isReferenceEligible");function A(e){let r=N[e.provenance]??1,n=e.type==="decision"||e.type==="gotcha"?100:e.type==="learning"||e.type==="fact"?50:e.type==="context"?30:20,s=Date.parse(e.rememberedAt),o=Number.isFinite(s)?s/1e13:0;return n*10+r*3+o}c(A,"referenceRank");function C(e){let r=e.filter(w);return r.sort((n,s)=>A(s)-A(n)),r.slice(0,k)}c(C,"buildReferenceModel");var P=new Set(["decision","gotcha","red-herring","learning","fact","feedback","pattern","anti-pattern","identity","voice","glossary","framework","spec","shipped"]),j=.28;function Q(e,r,n,s){let o=n.trim();if(o.length===0)return{accept:!1,reason:"empty content"};let f=M(o,r);if(f.junk)return{accept:!1,reason:`junk capture: ${f.reason}`};let a=I(o,r,{force:s?.force==="true"||s?.["precision:force"]==="true"});if(a.action==="refuse")return{accept:!1,reason:`precision: ${a.reason}`};if(a.action==="demote")return{accept:!1,reason:`precision demote\u2192${a.demoteTo??"context"}: ${a.reason}`};let i=b(s?.source);if(P.has(r)&&!i)return{accept:!0,reason:"judgment type \u2014 always accept novel content"};let u=(()=>{try{return S.allEntriesForIndex(e)}catch{return null}})();if(!u)return{accept:!0,reason:"gate skipped (read failure)"};if(u.length===0)return{accept:!0,reason:"empty vault \u2014 seed accepted"};let p=C(u);if(p.length===0)return{accept:!0,reason:"empty reference \u2014 accept"};let y=d(p),t=g(o,y),m=i?j:v;return t.exactDup||t.nearDup||t.excess<m?{accept:!1,reason:t.exactDup?`redundant exact match of ${t.nearestId}`:i?`auto-source low excess ${t.excess.toFixed(2)} (floor ${m}) vs R nearest ${t.nearestId}`:`low excess ${t.excess.toFixed(2)} vs reference (nearest ${t.nearestId}, sim ${t.maxSim.toFixed(2)})`,excess:t.excess,nearestId:t.nearestId}:{accept:!0,reason:i?`auto-source excess ${t.excess.toFixed(2)} above floor`:`excess ${t.excess.toFixed(2)} above capture floor`,excess:t.excess,nearestId:t.nearestId}}c(Q,"captureGate");export{k as a,w as b,C as c,F as d,v as e,d as f,g,L as h,Q as i};
@@ -5,7 +5,7 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{a as p}from"./chunk-27XFSCOE.mjs";import{d as g,g as M}from"./chunk-KG7Z6OMK.mjs";import{a as o}from"./chunk-E66B27AL.mjs";M();var h=300,x=3;function v(t){let e=t?.judgment?.conflictMode;if(e==="off"||e==="advisory"||e==="strict")return e;let n=t?.persona?.packs??[];return n.includes("code-strict")?"strict":n.includes("code")?"advisory":"off"}o(v,"effectiveConflictMode");function N(t){let e={action:"none",memoryIds:[],reason:"",recovery:"",message:""};if(t.mode==="off")return e;let n=new Set(t.overriddenIds??[]),r=t.candidates.filter(c=>c.id&&!n.has(c.id));if(r.length===0)return e;let i=r.filter(c=>c.confidence==="high"),l=r.filter(c=>c.confidence==="low"),s=i[0]??l[0];if(!s)return e;let f=r.map(c=>c.id),u=t.fileLabel?` on \`${t.fileLabel}\``:"",a=`Edit may contradict [${s.type}] ${m(s.content,80)} (\`${s.id}\`)${u}`,d='To supersede: `prjct remember decision "\u2026why supersede\u2026" --tags supersedes:'+s.id+'`. To lift deny for this memory: `prjct remember feedback "override conflict '+s.id+': <why>" --tags conflict:override,memory:'+s.id+"`.";return i.length===0?{action:"warn",memoryIds:f,reason:`Low-confidence preventive signal${u}: ${m(s.content,80)}`,recovery:d,message:y(a,d,f,!1)}:t.mode==="strict"?{action:"deny",memoryIds:i.map(c=>c.id),reason:a,recovery:d,message:_(a,d,i.map(c=>c.id))}:{action:"warn",memoryIds:f,reason:a,recovery:d,message:y(a,d,f,!0)}}o(N,"decisionConflictVerdict");function y(t,e,n,r){return[r?"# prjct: CONFLICT \u2014 decision/gotcha may block this path":"# prjct: heads-up \u2014 weak preventive signal","",t,"",`Memory: ${n.map(l=>`\`${l}\``).join(", ")}`,"",e,"",r?"> Not a soft nudge. Revise the edit or supersede the decision with rationale before proceeding.":"> Apply if it still holds; proceed if not."].join(`
8
+ import{b as p}from"./chunk-PVCEWFHS.mjs";import{d as g,g as M}from"./chunk-TKXOMN4K.mjs";import{a as o}from"./chunk-E66B27AL.mjs";M();var h=300,x=3;function v(t){let e=t?.judgment?.conflictMode;if(e==="off"||e==="advisory"||e==="strict")return e;let n=t?.persona?.packs??[];return n.includes("code-strict")?"strict":n.includes("code")?"advisory":"off"}o(v,"effectiveConflictMode");function N(t){let e={action:"none",memoryIds:[],reason:"",recovery:"",message:""};if(t.mode==="off")return e;let n=new Set(t.overriddenIds??[]),r=t.candidates.filter(c=>c.id&&!n.has(c.id));if(r.length===0)return e;let i=r.filter(c=>c.confidence==="high"),l=r.filter(c=>c.confidence==="low"),s=i[0]??l[0];if(!s)return e;let f=r.map(c=>c.id),u=t.fileLabel?` on \`${t.fileLabel}\``:"",a=`Edit may contradict [${s.type}] ${m(s.content,80)} (\`${s.id}\`)${u}`,d='To supersede: `prjct remember decision "\u2026why supersede\u2026" --tags supersedes:'+s.id+'`. To lift deny for this memory: `prjct remember feedback "override conflict '+s.id+': <why>" --tags conflict:override,memory:'+s.id+"`.";return i.length===0?{action:"warn",memoryIds:f,reason:`Low-confidence preventive signal${u}: ${m(s.content,80)}`,recovery:d,message:y(a,d,f,!1)}:t.mode==="strict"?{action:"deny",memoryIds:i.map(c=>c.id),reason:a,recovery:d,message:_(a,d,i.map(c=>c.id))}:{action:"warn",memoryIds:f,reason:a,recovery:d,message:y(a,d,f,!0)}}o(N,"decisionConflictVerdict");function y(t,e,n,r){return[r?"# prjct: CONFLICT \u2014 decision/gotcha may block this path":"# prjct: heads-up \u2014 weak preventive signal","",t,"",`Memory: ${n.map(l=>`\`${l}\``).join(", ")}`,"",e,"",r?"> Not a soft nudge. Revise the edit or supersede the decision with rationale before proceeding.":"> Apply if it still holds; proceed if not."].join(`
9
9
  `)}o(y,"formatWarnMessage");function _(t,e,n){return[`\u26D4 prjct conflict deny: ${t}`,`Memories: ${n.join(", ")}`,e,"Host will block Edit|Write until override or supersede. Fail-open only on hook errors, not on intentional deny."].join(" ")}o(_,"formatDenyMessage");function E(t){let e=new Set;try{let n=Date.now()-6048e5,r=g.query(t,`SELECT t.value AS value
10
10
  FROM memory_entry_tags t
11
11
  JOIN memory_entries me ON me.id = t.entry_id
@@ -5,4 +5,4 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{a as h}from"./chunk-TG5CQJD5.mjs";import{c as p}from"./chunk-M5E2YOZ4.mjs";import{d as c,g}from"./chunk-KG7Z6OMK.mjs";import{b as a,h as m,j as d,k as f}from"./chunk-JAMSIKDE.mjs";import{a as r}from"./chunk-E66B27AL.mjs";f();m();g();function v(i){let[e,t]=i.split(".");return e?{entityType:e.endsWith("s")?e:`${e}s`,eventType:t==="deleted"||t==="archived"||t==="removed"?"delete":"upsert"}:{}}r(v,"deriveEntityShape");function T(i){if(!i||typeof i!="object")return;let e=i;for(let t of["taskId","task_id","id","feature_id","featureId","specId","spec_id"]){let n=e[t];if(typeof n=="string"&&n.length>0)return n}}r(T,"entityIdOf");var u={value:null};async function w(){if(u.value)return u.value;try{let{default:i}=await import("./auth-config-SP4PBALR.mjs"),e=i;if(typeof e.getDeviceId=="function"){let t=await e.getDeviceId();return u.value=t,t}return"unknown-device"}catch{return"unknown-device"}}r(w,"_resolveDeviceId");var y=class{static{r(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new d({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){if(!(process.env.PRJCT_IN_DAEMON==="1")){let n=this.cache.get(e);if(n!==null)return n}try{let n=c.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){c.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=this.getStoreKey(),s=c.updateDoc(e,n,t,()=>this.getDefault());return this.cache.set(e,s),s}async publishEvent(e,t,n){let s=v(t),o={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:a(),projectId:e,entityType:s.entityType,entityId:T(n),eventType:s.eventType,contentHash:p(n),deviceId:await w(),revisionCount:1};await h.publish(o)}async publishEntityEvent(e,t,n,s){let o=`${t}.${n}`,l={...s,timestamp:a()};await this.publishEvent(e,o,l)}async exists(e){try{return c.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}};export{y as a};
8
+ import{a as h}from"./chunk-AORD3YDQ.mjs";import{c as p}from"./chunk-M5E2YOZ4.mjs";import{d as c,g}from"./chunk-TKXOMN4K.mjs";import{b as a,h as m,j as d,k as f}from"./chunk-A6K4H3YT.mjs";import{a as r}from"./chunk-E66B27AL.mjs";f();m();g();function v(i){let[e,t]=i.split(".");return e?{entityType:e.endsWith("s")?e:`${e}s`,eventType:t==="deleted"||t==="archived"||t==="removed"?"delete":"upsert"}:{}}r(v,"deriveEntityShape");function T(i){if(!i||typeof i!="object")return;let e=i;for(let t of["taskId","task_id","id","feature_id","featureId","specId","spec_id"]){let n=e[t];if(typeof n=="string"&&n.length>0)return n}}r(T,"entityIdOf");var u={value:null};async function w(){if(u.value)return u.value;try{let{default:i}=await import("./auth-config-JIITQ6GY.mjs"),e=i;if(typeof e.getDeviceId=="function"){let t=await e.getDeviceId();return u.value=t,t}return"unknown-device"}catch{return"unknown-device"}}r(w,"_resolveDeviceId");var y=class{static{r(this,"StorageManager")}filename;cache;constructor(e,t){this.filename=e,this.cache=new d({ttl:5e3,maxSize:50})}getStoreKey(){return this.filename.replace(".json","")}async read(e){if(!(process.env.PRJCT_IN_DAEMON==="1")){let n=this.cache.get(e);if(n!==null)return n}try{let n=c.getDoc(e,this.getStoreKey());if(n!==null)return this.cache.set(e,n),n}catch{}return this.getDefault()}async write(e,t){c.setDoc(e,this.getStoreKey(),t),this.cache.set(e,t)}async update(e,t){let n=this.getStoreKey(),s=c.updateDoc(e,n,t,()=>this.getDefault());return this.cache.set(e,s),s}async publishEvent(e,t,n){let s=v(t),o={type:t,path:[this.filename.replace(".json","")],data:n,timestamp:a(),projectId:e,entityType:s.entityType,entityId:T(n),eventType:s.eventType,contentHash:p(n),deviceId:await w(),revisionCount:1};await h.publish(o)}async publishEntityEvent(e,t,n,s){let o=`${t}.${n}`,l={...s,timestamp:a()};await this.publishEvent(e,o,l)}async exists(e){try{return c.hasDoc(e,this.getStoreKey())}catch{return!1}}clearCache(e){e?this.cache.delete(e):this.cache.clear()}getCacheStats(){return this.cache.stats()}};export{y as a};
@@ -5,7 +5,7 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{d as b}from"./chunk-SYHDEUVU.mjs";import{a as j}from"./chunk-GCKILEXJ.mjs";import{c as p,e as A}from"./chunk-EMTCZG5I.mjs";import{b as w}from"./chunk-PKDYFXMI.mjs";import{a as e}from"./chunk-E66B27AL.mjs";import g from"node:fs";import H from"node:fs/promises";import m from"node:path";var I=j.join("/"),R="Generated with [p/](https://www.prjct.app/)",P="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",L="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->",n={rag:"prjct is a RAG-backed project memory harness; do not preload project history.",entrypoint:'Tasks \u2192 `prjct work "\u2026"`. Known cmds (`sync`/`search`/`remember`/\u2026) \u2192 `prjct <cmd>` \u2014 never work-wrap.',pull:"Pull only what surfaces: `prjct search` / `context memory` / `guard` / MCP \u2014 not something to load wholesale.",remember:'Save synthesized memory in English: `prjct remember <decision|learning|gotcha|context> "<text>"`.',kb:`KB (\`${I}\`): \`remember <facet>\` / \`context memory <facet>\` \u2014 on demand, never injected here.`,ship:"Ship only after user OKs: `prjct ship --md`.",loop:"Loop: land; H2+ intent; tip\u2192user SoT; close.",identity:"L0 portable; id=cwd."};function S(){return`${["---","name: prjct","description: prjct work cycles + memory; run prjct verbs, do not preload context.","---","","# prjct","","Run `prjct <cmd> --md` and follow it.","",`- ${n.rag}`,`- ${n.entrypoint}`,`- ${n.pull}`,`- ${n.remember}`,`- ${n.kb}`,`- ${n.ship}`,`- ${n.loop}`,`- ${n.identity}`,"",`Commit footer: \`${R}\``].join(`
8
+ import{d as b}from"./chunk-SYHDEUVU.mjs";import{a as j}from"./chunk-GCKILEXJ.mjs";import{c as p,e as A}from"./chunk-IJ523YO2.mjs";import{b as w}from"./chunk-PKDYFXMI.mjs";import{a as e}from"./chunk-E66B27AL.mjs";import g from"node:fs";import H from"node:fs/promises";import m from"node:path";var I=j.join("/"),R="Generated with [p/](https://www.prjct.app/)",P="<!-- prjct:start - DO NOT REMOVE THIS MARKER -->",L="<!-- prjct:end - DO NOT REMOVE THIS MARKER -->",n={rag:"prjct is a RAG-backed project memory harness; do not preload project history.",entrypoint:'Tasks \u2192 `prjct work "\u2026"`. Known cmds (`sync`/`search`/`remember`/\u2026) \u2192 `prjct <cmd>` \u2014 never work-wrap.',pull:"Pull only what surfaces: `prjct search` / `context memory` / `guard` / MCP \u2014 not something to load wholesale.",remember:'Save synthesized memory in English: `prjct remember <decision|learning|gotcha|context> "<text>"`.',kb:`KB (\`${I}\`): \`remember <facet>\` / \`context memory <facet>\` \u2014 on demand, never injected here.`,ship:"Ship only after user OKs: `prjct ship --md`.",loop:"Loop: land; H2+ intent; tip\u2192user SoT; close.",identity:"L0 portable; id=cwd."};function S(){return`${["---","name: prjct","description: prjct work cycles + memory; run prjct verbs, do not preload context.","---","","# prjct","","Run `prjct <cmd> --md` and follow it.","",`- ${n.rag}`,`- ${n.entrypoint}`,`- ${n.pull}`,`- ${n.remember}`,`- ${n.kb}`,`- ${n.ship}`,`- ${n.loop}`,`- ${n.identity}`,"",`Commit footer: \`${R}\``].join(`
9
9
  `)}
10
10
  `}e(S,"buildCompactSkill");var M=S,_=S;function O(t){return`${["<!-- prjct:start - DO NOT REMOVE THIS MARKER -->","# p/ \u2014 Context layer for AI agents","","Skills auto-activate for: work, intent, ship, sync, guard, remember, search, insights, performance","Other commands: run `prjct <command> --md` and follow CLI output","","Flow: known verbs run as `prjct <cmd> --md` (sync, search, remember, ship, guard, land, prime\u2026).",'`prjct work` is only for task/work cycles \u2014 never wrap a bare verb as work "sync".',"Substantive implementation follows the persisted work-cycle station from `prjct work --md`:","reviewed intent, evidence, tests when required, then code.","Sync analysis: prefer schema v1 JSON via `prjct analysis-save-llm` (markdown = thin notes only).","","Data:","- Persist everything (memories, context, intents) in ENGLISH, whatever language the user speaks",`- ${n.rag}`,`- ${n.entrypoint}`,`- ${n.pull}`,`- Sovereign knowledge base \u2014 ${n.kb}`,`- ${n.remember}`,`- ${n.loop}`,"- On close, save synthesized context; raw quotes, counters, detector rows, and transcript chunks are inputs, not final memory","- prjct remembers and shows the path; the agent decides how to execute with its own native tools","- Treat prjct output as signals, not a prescriptive harness",`- Commit footer: \`${R}\``,"- Path resolution: `.prjct/prjct.config.json` \u2192 `~/.prjct-cli/projects/{projectId}`","- Storage: `prjct` CLI (SQLite internally)","- Worktree hygiene: if working in a git worktree, remove it AFTER its PR merges \u2014 `git worktree remove` from the main worktree; never with uncommitted/unpushed work, never `--force`","",`Crew (opt-in via \`prjct crew install\`): Leader (blue) \xB7 Implementer (purple) \xB7 Reviewer (pink). Subagent dispatch is Claude-Code-only; in ${t}, identify the role you are playing explicitly.`,"","**Auto-managed by prjct-cli** | https://prjct.app","<!-- prjct:end - DO NOT REMOVE THIS MARKER -->"].join(`
11
11
  `)}
@@ -5,4 +5,4 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{b as u}from"./chunk-UA4Z5TGG.mjs";import{d as i,g as T}from"./chunk-KG7Z6OMK.mjs";import{b as y,h as _}from"./chunk-JAMSIKDE.mjs";import{a as o}from"./chunk-E66B27AL.mjs";import g from"node:crypto";function E(){return g.randomUUID()}o(E,"generateUUID");_();T();function v(d,t,e){return{id:d,entity_type:t.entityType,entity_id:t.entityId,entity_data:JSON.stringify(t.entityData),summary:t.summary??null,reason:t.reason,archived_at:e,created_at:e}}o(v,"archiveSyncPayload");var l={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},h=class{static{o(this,"ArchiveStorage")}archive(t,e){let r=E(),n=y();return i.run(t,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",r,e.entityType,e.entityId,JSON.stringify(e.entityData),e.summary??null,n,e.reason),u({projectId:t,entityType:"archives",entityId:r,eventType:"upsert",data:v(r,e,n)}),r}archiveMany(t,e){if(e.length===0)return 0;let r=y(),n=[];i.transaction(t,a=>{let c=a.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let s of e){let p=E();c.run(p,s.entityType,s.entityId,JSON.stringify(s.entityData),s.summary??null,r,s.reason),n.push({id:p,item:s})}});for(let{id:a,item:c}of n)u({projectId:t,entityType:"archives",entityId:a,eventType:"upsert",data:v(a,c,r)});return e.length}getArchived(t,e,r=50){return e?i.query(t,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",e,r):i.query(t,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",r)}getStats(t){let e=i.query(t,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),r={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let n of e){let a=n.entity_type;a in r&&(r[a]=n.count),r.total+=n.count}return r}restore(t,e){let r=i.get(t,"SELECT * FROM archives WHERE id = ?",e);return r?(i.run(t,"DELETE FROM archives WHERE id = ?",e),JSON.parse(r.entity_data)):null}pruneOldArchives(t,e){let r=new Date(Date.now()-e*24*60*60*1e3).toISOString(),n=this.getTotalCount(t);i.run(t,"DELETE FROM archives WHERE archived_at < ?",r);let a=this.getTotalCount(t);return n-a}getTotalCount(t){return i.get(t,"SELECT COUNT(*) as count FROM archives")?.count??0}},I=new h;export{E as a,l as b,I as c};
8
+ import{b as u}from"./chunk-7WO5CEH3.mjs";import{d as i,g as T}from"./chunk-TKXOMN4K.mjs";import{b as y,h as _}from"./chunk-A6K4H3YT.mjs";import{a as o}from"./chunk-E66B27AL.mjs";import g from"node:crypto";function E(){return g.randomUUID()}o(E,"generateUUID");_();T();function v(d,t,e){return{id:d,entity_type:t.entityType,entity_id:t.entityId,entity_data:JSON.stringify(t.entityData),summary:t.summary??null,reason:t.reason,archived_at:e,created_at:e}}o(v,"archiveSyncPayload");var l={SHIPPED_RETENTION_DAYS:90,IDEA_DORMANT_DAYS:180,QUEUE_COMPLETED_DAYS:7,PAUSED_TASK_DAYS:30,MEMORY_MAX_ENTRIES:500},h=class{static{o(this,"ArchiveStorage")}archive(t,e){let r=E(),n=y();return i.run(t,"INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)",r,e.entityType,e.entityId,JSON.stringify(e.entityData),e.summary??null,n,e.reason),u({projectId:t,entityType:"archives",entityId:r,eventType:"upsert",data:v(r,e,n)}),r}archiveMany(t,e){if(e.length===0)return 0;let r=y(),n=[];i.transaction(t,a=>{let c=a.prepare("INSERT INTO archives (id, entity_type, entity_id, entity_data, summary, archived_at, reason) VALUES (?, ?, ?, ?, ?, ?, ?)");for(let s of e){let p=E();c.run(p,s.entityType,s.entityId,JSON.stringify(s.entityData),s.summary??null,r,s.reason),n.push({id:p,item:s})}});for(let{id:a,item:c}of n)u({projectId:t,entityType:"archives",entityId:a,eventType:"upsert",data:v(a,c,r)});return e.length}getArchived(t,e,r=50){return e?i.query(t,"SELECT * FROM archives WHERE entity_type = ? ORDER BY archived_at DESC LIMIT ?",e,r):i.query(t,"SELECT * FROM archives ORDER BY archived_at DESC LIMIT ?",r)}getStats(t){let e=i.query(t,"SELECT entity_type, COUNT(*) as count FROM archives GROUP BY entity_type"),r={shipped:0,idea:0,queue_task:0,paused_task:0,memory_entry:0,total:0};for(let n of e){let a=n.entity_type;a in r&&(r[a]=n.count),r.total+=n.count}return r}restore(t,e){let r=i.get(t,"SELECT * FROM archives WHERE id = ?",e);return r?(i.run(t,"DELETE FROM archives WHERE id = ?",e),JSON.parse(r.entity_data)):null}pruneOldArchives(t,e){let r=new Date(Date.now()-e*24*60*60*1e3).toISOString(),n=this.getTotalCount(t);i.run(t,"DELETE FROM archives WHERE archived_at < ?",r);let a=this.getTotalCount(t);return n-a}getTotalCount(t){return i.get(t,"SELECT COUNT(*) as count FROM archives")?.count??0}},I=new h;export{E as a,l as b,I as c};
@@ -5,7 +5,7 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{a as C}from"./chunk-INXNK57E.mjs";import{d as l,g as A}from"./chunk-KG7Z6OMK.mjs";import{a as d}from"./chunk-E66B27AL.mjs";import{z as t}from"zod";var O=t.enum(["improving","stable","declining"]),R=t.object({sprintNumber:t.number(),startDate:t.string(),endDate:t.string(),pointsCompleted:t.number(),tasksCompleted:t.number(),avgVariance:t.number(),estimationAccuracy:t.number()}),D=t.object({category:t.string(),avgVariance:t.number(),taskCount:t.number()}),I=t.object({totalPoints:t.number(),sprints:t.number(),estimatedDate:t.string()}),P=t.object({sprints:t.array(R),averageVelocity:t.number(),velocityTrend:O,estimationAccuracy:t.number(),overEstimated:t.array(D),underEstimated:t.array(D),lastUpdated:t.string()}),U=t.object({sprintLengthDays:t.number().min(1).max(90).default(7),startDay:t.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:t.number().min(1).max(52).default(6),accuracyTolerance:t.number().min(0).max(100).default(20)});var f={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""};A();var h=10080*60*1e3;function M(m){let r=new Date(m).getTime();return Number.isFinite(r)?Math.floor(r/h):null}d(M,"epochWeek");function k(m){return new Date(m*h).toISOString()}d(k,"weekStartIso");function w(m){return new Date((m+1)*h-1).toISOString()}d(w,"weekEndIso");var E=class extends C{static{d(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:f,lastUpdated:""}}getEventType(r){return`velocity.${r}d`}async recompute(r){let o=l.query(r,"SELECT completed_at FROM tasks WHERE completed_at IS NOT NULL"),_=l.query(r,"SELECT shipped_at FROM shipped_features"),c=new Map;for(let a of o){let n=M(a.completed_at);if(n===null)continue;let p=c.get(n)??{tasks:0,ships:0};p.tasks++,c.set(n,p)}for(let a of _){let n=M(a.shipped_at);if(n===null)continue;let p=c.get(n)??{tasks:0,ships:0};p.ships++,c.set(n,p)}for(let[a,n]of c)l.run(r,`INSERT INTO velocity_sprints
8
+ import{a as C}from"./chunk-ETTDRXQ6.mjs";import{d as l,g as A}from"./chunk-TKXOMN4K.mjs";import{a as d}from"./chunk-E66B27AL.mjs";import{z as t}from"zod";var O=t.enum(["improving","stable","declining"]),R=t.object({sprintNumber:t.number(),startDate:t.string(),endDate:t.string(),pointsCompleted:t.number(),tasksCompleted:t.number(),avgVariance:t.number(),estimationAccuracy:t.number()}),D=t.object({category:t.string(),avgVariance:t.number(),taskCount:t.number()}),I=t.object({totalPoints:t.number(),sprints:t.number(),estimatedDate:t.string()}),P=t.object({sprints:t.array(R),averageVelocity:t.number(),velocityTrend:O,estimationAccuracy:t.number(),overEstimated:t.array(D),underEstimated:t.array(D),lastUpdated:t.string()}),U=t.object({sprintLengthDays:t.number().min(1).max(90).default(7),startDay:t.enum(["monday","tuesday","wednesday","thursday","friday","saturday","sunday"]).default("monday"),windowSize:t.number().min(1).max(52).default(6),accuracyTolerance:t.number().min(0).max(100).default(20)});var f={sprints:[],averageVelocity:0,velocityTrend:"stable",estimationAccuracy:0,overEstimated:[],underEstimated:[],lastUpdated:""};A();var h=10080*60*1e3;function M(m){let r=new Date(m).getTime();return Number.isFinite(r)?Math.floor(r/h):null}d(M,"epochWeek");function k(m){return new Date(m*h).toISOString()}d(k,"weekStartIso");function w(m){return new Date((m+1)*h-1).toISOString()}d(w,"weekEndIso");var E=class extends C{static{d(this,"VelocityStorage")}constructor(){super("velocity.json")}getDefault(){return{metrics:f,lastUpdated:""}}getEventType(r){return`velocity.${r}d`}async recompute(r){let o=l.query(r,"SELECT completed_at FROM tasks WHERE completed_at IS NOT NULL"),_=l.query(r,"SELECT shipped_at FROM shipped_features"),c=new Map;for(let a of o){let n=M(a.completed_at);if(n===null)continue;let p=c.get(n)??{tasks:0,ships:0};p.tasks++,c.set(n,p)}for(let a of _){let n=M(a.shipped_at);if(n===null)continue;let p=c.get(n)??{tasks:0,ships:0};p.ships++,c.set(n,p)}for(let[a,n]of c)l.run(r,`INSERT INTO velocity_sprints
9
9
  (sprint_number, points_completed, tasks_completed, estimation_accuracy, avg_variance, started_at, ended_at)
10
10
  VALUES (?, ?, ?, 0, 0, ?, ?)
11
11
  ON CONFLICT(sprint_number) DO UPDATE SET
@@ -5,7 +5,7 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{d as p}from"./chunk-7JEKBJAP.mjs";import{e as f}from"./chunk-NWZEBCTC.mjs";import{a as g}from"./chunk-27XFSCOE.mjs";import{e as m,g as _}from"./chunk-KG7Z6OMK.mjs";import{a as l}from"./chunk-E66B27AL.mjs";_();var S=8,y=140;function h(d,r){if(r.length===0)return 0;let n=[];try{m.transaction(d,s=>{let i=s.prepare("DELETE FROM memory_embeddings WHERE memory_id = ?"),c=s.prepare("DELETE FROM memory_entries WHERE id = ?"),t=s.prepare("DELETE FROM events WHERE id = ? AND type LIKE 'memory.remember.%'");for(let e of r){try{i.run(e)}catch{}c.run(e).changes&&n.push(e);let a=e.match(/^mem_(\d+)$/);if(a)try{t.run(Number(a[1]))}catch{}}})}catch{return n.length}return n.length}l(h,"hardDeleteEntries");function w(d,r,n){let s=new Map;for(let e of r)s.set(e.type,(s.get(e.type)??0)+1);let i=[...s.entries()].sort((e,o)=>o[1]-e[1]).map(([e,o])=>`${e}\xD7${o}`).join(", "),c=r.map(e=>p(e).replace(/\s+/g," ").trim()).filter(e=>e.length>20).slice(0,S).map(e=>`- ${e.length>y?`${e.slice(0,y-1)}\u2026`:e}`),t=[`Distill of discarded auto-history (${d}).`,`Context synthesis: ${r.length} low-value rows collapsed \u2014 raw history deleted; only this digest remains for the project model.`,`Key data: source=retention-distill; discarded=${r.length}; types=${i}; at=${n}`,"What happened: purged auto-generated / redundant captures that added no excess vs the reference model.","Why it mattered: prevent vault bloat; agents must not re-read detector noise.",`Outcome: ${r.length} raw entries hard-deleted after distillation.`,"Next implication: prefer high-excess judgment; re-run detectors only when code/model changes."];return c.length>0&&t.push(`Sample cues (not full bodies):
8
+ import{d as p}from"./chunk-XYKVWO23.mjs";import{e as f}from"./chunk-RT2DFIWF.mjs";import{b as g}from"./chunk-PVCEWFHS.mjs";import{e as m,g as _}from"./chunk-TKXOMN4K.mjs";import{a as l}from"./chunk-E66B27AL.mjs";_();var S=8,y=140;function h(d,r){if(r.length===0)return 0;let n=[];try{m.transaction(d,s=>{let i=s.prepare("DELETE FROM memory_embeddings WHERE memory_id = ?"),c=s.prepare("DELETE FROM memory_entries WHERE id = ?"),t=s.prepare("DELETE FROM events WHERE id = ? AND type LIKE 'memory.remember.%'");for(let e of r){try{i.run(e)}catch{}c.run(e).changes&&n.push(e);let a=e.match(/^mem_(\d+)$/);if(a)try{t.run(Number(a[1]))}catch{}}})}catch{return n.length}return n.length}l(h,"hardDeleteEntries");function w(d,r,n){let s=new Map;for(let e of r)s.set(e.type,(s.get(e.type)??0)+1);let i=[...s.entries()].sort((e,o)=>o[1]-e[1]).map(([e,o])=>`${e}\xD7${o}`).join(", "),c=r.map(e=>p(e).replace(/\s+/g," ").trim()).filter(e=>e.length>20).slice(0,S).map(e=>`- ${e.length>y?`${e.slice(0,y-1)}\u2026`:e}`),t=[`Distill of discarded auto-history (${d}).`,`Context synthesis: ${r.length} low-value rows collapsed \u2014 raw history deleted; only this digest remains for the project model.`,`Key data: source=retention-distill; discarded=${r.length}; types=${i}; at=${n}`,"What happened: purged auto-generated / redundant captures that added no excess vs the reference model.","Why it mattered: prevent vault bloat; agents must not re-read detector noise.",`Outcome: ${r.length} raw entries hard-deleted after distillation.`,"Next implication: prefer high-excess judgment; re-run detectors only when code/model changes."];return c.length>0&&t.push(`Sample cues (not full bodies):
9
9
  ${c.join(`
10
10
  `)}`),t.join(" ")}l(w,"buildDistillContent");async function A(d,r,n,s,i){if(s.length<=i)return{discarded:0,digested:!1};let t=[...s].sort((u,b)=>b.rememberedAt.localeCompare(u.rememberedAt)).slice(i);if(t.length===0)return{discarded:0,digested:!1};let e=new Date().toISOString(),o=`auto-distill:${n}`,a=w(n,t,e),E=await g.remember(d,{type:"learning",content:a,tags:{source:"retention-distill",topic:o,capture:"distill-discard-v1",context_schema:"living-v2",synthesis:"deterministic",discarded_count:String(t.length),auto_source:n},provenance:"inferred",projectId:r}).then(()=>!0).catch(()=>!1),D=t.map(u=>u.id);return{discarded:h(r,D),digested:E,digestTopic:o}}l(A,"distillAndDiscardAutoSource");async function v(d,r,n){let s=g.allEntriesForIndex(r),i=new Map;for(let t of s){let e=t.tags?.source;if(!f(e)||e==="retention-distill"||t.tags?.source==="retention-distill")continue;let o=i.get(e)??[];o.push(t),i.set(e,o)}let c=[];for(let[t,e]of i){if(e.length<=n)continue;let o=await A(d,r,t,e,n);c.push(o)}return{discarded:c.reduce((t,e)=>t+e.discarded,0),digests:c.filter(t=>t.digested).length}}l(v,"distillAndDiscardAllAutoSources");function x(d,r,n=1e3){let s=Date.now()-r*864e5;try{let i=m.query(d,`SELECT id, type, content FROM memory_entries
11
11
  WHERE deleted_at IS NOT NULL AND deleted_at < ?
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __createRequire } from 'module';
3
+ import { fileURLToPath as __fileURLToPath } from 'url';
4
+ import { dirname as __pathDirname } from 'path';
5
+ const require = __createRequire(import.meta.url);
6
+ const __filename = __fileURLToPath(import.meta.url);
7
+ const __dirname = __pathDirname(__filename);
8
+ import{a as o}from"./chunk-TPESWBA7.mjs";import{a as r}from"./chunk-E66B27AL.mjs";var c=new Set(["claude","codex","gemini","grok","cursor","opencode","pi","antigravity","kimi","unknown"]);function p(){let n=process.env.PRJCT_AGENT_RUNTIME?.trim().toLowerCase();return n&&c.has(n)?n:n?n.slice(0,32):process.env.CLAUDE_AGENT||process.env.ANTHROPIC_CLAUDE||process.env.CLAUDECODE?"claude":process.env.CODEX_SANDBOX||process.env.PRJCT_SANDBOX==="1"?"codex":process.env.GEMINI_CLI||process.env.GEMINI_API_KEY?"gemini":process.env.CURSOR_TRACE_ID||process.env.CURSOR_AGENT||process.env.CURSOR_SESSION_ID?"cursor":process.env.GROK_API_KEY||process.env.XAI_API_KEY||process.env.GROK_SESSION?"grok":process.env.OPENCODE||process.env.OPENCODE_SESSION||process.env.OPENCODE_CONFIG?"opencode":process.env.PI_CODING_AGENT_DIR||process.env.PI_SESSION||process.env.PI_AGENT?"pi":"unknown"}r(p,"detectRuntimeAgent");function u(n="session"){let e=p(),s=process.env.CLAUDE_SESSION_ID||process.env.CODEX_SESSION_ID||process.env.PRJCT_SESSION_ID||void 0,t=process.env.PRJCT_AGENT?.trim(),i=t&&t.length>0?t:o(`identity:${e}:${n}`);return{agent:e,identity:i,sessionId:s}}r(u,"resolveCallerIdentity");function d(n){let e=n.trim().toLowerCase();return e==="claude-code"||e==="anthropic"?"claude":e==="openai"||e==="oai"?"codex":e==="google"?"gemini":e==="xai"||e==="grok-build"?"grok":e==="opencode-ai"||e==="open-code"?"opencode":e==="pi-coding-agent"||e==="pi-agent"?"pi":e.slice(0,32)}r(d,"normalizeAgentName");function E(n,e){return n?!!(n.ownerSessionId&&e.sessionId&&n.ownerSessionId===e.sessionId||n.ownerIdentity&&e.identity&&n.ownerIdentity===e.identity):!1}r(E,"sameOwner");export{c as a,p as b,u as c,d,E as e};
@@ -5,4 +5,4 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{d as n,g as o}from"./chunk-KG7Z6OMK.mjs";import{a as i}from"./chunk-E66B27AL.mjs";o();function u(r,e){try{return e?n.query(r,"SELECT content FROM task_log WHERE task_id = ? ORDER BY id DESC LIMIT 5",e).map(t=>t.content):n.query(r,"SELECT content FROM task_log ORDER BY id DESC LIMIT 5").map(t=>t.content)}catch{return[]}}i(u,"recentJournal");export{u as a};
8
+ import{d as n,g as o}from"./chunk-TKXOMN4K.mjs";import{a as i}from"./chunk-E66B27AL.mjs";o();function u(r,e){try{return e?n.query(r,"SELECT content FROM task_log WHERE task_id = ? ORDER BY id DESC LIMIT 5",e).map(t=>t.content):n.query(r,"SELECT content FROM task_log ORDER BY id DESC LIMIT 5").map(t=>t.content)}catch{return[]}}i(u,"recentJournal");export{u as a};
@@ -5,4 +5,4 @@ import { dirname as __pathDirname } from 'path';
5
5
  const require = __createRequire(import.meta.url);
6
6
  const __filename = __fileURLToPath(import.meta.url);
7
7
  const __dirname = __pathDirname(__filename);
8
- import{e as g,f as l}from"./chunk-BUDZL4DW.mjs";import{a as r,c as u,d as f}from"./chunk-E66B27AL.mjs";var m={};f(m,{PACKAGE_ROOT:()=>d,VERSION:()=>R,getPackageRoot:()=>i,getVersion:()=>p,resetPackageRoot:()=>v});import a from"node:fs";import s from"node:path";function i(){if(n.packageRoot)return n.packageRoot;let o=r((e,t)=>{if(t>=5)return null;let c=s.join(e,"package.json");if(a.existsSync(c))try{if(JSON.parse(a.readFileSync(c,"utf-8")).name==="prjct-cli")return e}catch{}return o(s.dirname(e),t+1)},"findPackageRoot");return n.packageRoot=o(__dirname,0)??s.join(__dirname,"..","..",".."),n.packageRoot}function p(){if(n.version)return n.version;let o="3.94.0";if(o&&/^\d+\.\d+\.\d+/.test(o))return n.version=o,n.version;try{let e=s.join(i(),"package.json"),t=JSON.parse(a.readFileSync(e,"utf-8"));return n.version=t.version,n.version}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",g(e)),"0.0.0"}}function v(o){n.packageRoot=o,n.version=null}var n,R,d,P=u(()=>{"use strict";l();n={version:null,packageRoot:null};r(i,"getPackageRoot");r(p,"getVersion");r(v,"resetPackageRoot");R=p(),d=i()});export{p as a,R as b,d as c,m as d,P as e};
8
+ import{e as g,f as l}from"./chunk-BUDZL4DW.mjs";import{a as r,c as u,d as f}from"./chunk-E66B27AL.mjs";var m={};f(m,{PACKAGE_ROOT:()=>d,VERSION:()=>R,getPackageRoot:()=>i,getVersion:()=>p,resetPackageRoot:()=>v});import a from"node:fs";import s from"node:path";function i(){if(n.packageRoot)return n.packageRoot;let o=r((e,t)=>{if(t>=5)return null;let c=s.join(e,"package.json");if(a.existsSync(c))try{if(JSON.parse(a.readFileSync(c,"utf-8")).name==="prjct-cli")return e}catch{}return o(s.dirname(e),t+1)},"findPackageRoot");return n.packageRoot=o(__dirname,0)??s.join(__dirname,"..","..",".."),n.packageRoot}function p(){if(n.version)return n.version;let o="3.96.0";if(o&&/^\d+\.\d+\.\d+/.test(o))return n.version=o,n.version;try{let e=s.join(i(),"package.json"),t=JSON.parse(a.readFileSync(e,"utf-8"));return n.version=t.version,n.version}catch(e){return process.env.PRJCT_DEBUG==="1"&&console.error("Failed to read version from package.json:",g(e)),"0.0.0"}}function v(o){n.packageRoot=o,n.version=null}var n,R,d,P=u(()=>{"use strict";l();n={version:null,packageRoot:null};r(i,"getPackageRoot");r(p,"getVersion");r(v,"resetPackageRoot");R=p(),d=i()});export{p as a,R as b,d as c,m as d,P as e};