@askexenow/exe-os 0.9.166 → 0.9.167

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 (244) hide show
  1. package/deploy/compose/backup.sh +45 -7
  2. package/deploy/compose/setup.sh +7 -0
  3. package/deploy/stack-manifests/v0.9.json +40 -1
  4. package/dist/{active-agent-R2KMWMR6.js → active-agent-DGTIJN2U.js} +2 -2
  5. package/dist/{active-agent-CYMM3QQA.js → active-agent-HVMLG6FH.js} +2 -2
  6. package/dist/{agentic-ontology-GKAKYNPE.js → agentic-ontology-S54AFODT.js} +1 -1
  7. package/dist/{backfill-metadata-Z5SYUWAV.js → backfill-metadata-74IWETRF.js} +4 -3
  8. package/dist/{behaviors-QGU6XI5R.js → behaviors-LZVAVHTC.js} +2 -2
  9. package/dist/bin/agentic-ontology-backfill.js +5 -4
  10. package/dist/bin/agentic-reflection-backfill.js +6 -5
  11. package/dist/bin/agentic-semantic-label.js +5 -4
  12. package/dist/bin/backfill-conversations.js +5 -4
  13. package/dist/bin/backfill-responses.js +5 -4
  14. package/dist/bin/backfill-vectors.js +6 -5
  15. package/dist/bin/bulk-sync-postgres.js +6 -5
  16. package/dist/bin/cleanup-stale-review-tasks.js +9 -9
  17. package/dist/bin/cli.js +16 -13
  18. package/dist/bin/daily-summary.js +0 -217
  19. package/dist/bin/deferred-daemon-restart.js +8 -0
  20. package/dist/bin/exe-agent-config.js +1 -1
  21. package/dist/bin/exe-agent.js +10 -10
  22. package/dist/bin/exe-assign.js +7 -6
  23. package/dist/bin/exe-boot.js +20 -19
  24. package/dist/bin/exe-call.js +4 -4
  25. package/dist/bin/exe-cloud.js +3 -3
  26. package/dist/bin/exe-dispatch.js +9 -9
  27. package/dist/bin/exe-doctor.js +1 -1
  28. package/dist/bin/exe-export-behaviors.js +7 -6
  29. package/dist/bin/exe-forget.js +6 -5
  30. package/dist/bin/exe-gateway.js +5 -5
  31. package/dist/bin/exe-heartbeat.js +9 -9
  32. package/dist/bin/exe-kill.js +13 -12
  33. package/dist/bin/exe-launch-agent.js +11 -10
  34. package/dist/bin/exe-new-employee.js +6 -6
  35. package/dist/bin/exe-pending-messages.js +10 -10
  36. package/dist/bin/exe-pending-notifications.js +9 -9
  37. package/dist/bin/exe-pending-reviews.js +9 -9
  38. package/dist/bin/exe-rename.js +4 -4
  39. package/dist/bin/exe-review.js +12 -11
  40. package/dist/bin/exe-search.js +5 -4
  41. package/dist/bin/exe-session-cleanup.js +19 -14
  42. package/dist/bin/exe-settings.js +3 -3
  43. package/dist/bin/exe-start-codex.js +11 -10
  44. package/dist/bin/exe-start-opencode.js +8 -7
  45. package/dist/bin/exe-status.js +10 -10
  46. package/dist/bin/exe-team.js +2 -2
  47. package/dist/bin/git-sweep.js +9 -9
  48. package/dist/bin/graph-backfill.js +4 -3
  49. package/dist/bin/graph-export.js +5 -4
  50. package/dist/bin/import-history.js +171 -0
  51. package/dist/bin/install-launchd.js +41 -0
  52. package/dist/bin/install.js +50 -74
  53. package/dist/bin/intercom-check.js +4 -4
  54. package/dist/bin/postgres-agentic-reflection-backfill.js +2 -2
  55. package/dist/bin/postgres-agentic-semantic-backfill.js +4 -4
  56. package/dist/bin/pre-publish.js +1 -1
  57. package/dist/bin/scan-tasks.js +22 -12
  58. package/dist/bin/setup.js +1 -1
  59. package/dist/bin/shard-migrate.js +4 -3
  60. package/dist/bin/stack-update.js +61 -857
  61. package/dist/bin/vps-backup.js +170 -0
  62. package/dist/bin/vps-health-gate.js +232 -0
  63. package/dist/{capacity-monitor-ZEAE4WP2.js → capacity-monitor-JBZB2S4P.js} +10 -10
  64. package/dist/{catchup-brief-OGWCHENC.js → catchup-brief-HE2EMZS5.js} +12 -11
  65. package/dist/{chunk-DJJNB47C.js → chunk-27DO3EZO.js} +1 -1
  66. package/dist/{chunk-45FYZIHI.js → chunk-32YUET3Y.js} +2 -2
  67. package/dist/{chunk-Y75ECPO5.js → chunk-3FW5LUGI.js} +2 -2
  68. package/dist/{chunk-4OZGQZ4U.js → chunk-3M3O56VT.js} +636 -179
  69. package/dist/{chunk-77WQOD6J.js → chunk-4CXUZ4NI.js} +2 -2
  70. package/dist/{chunk-PBXWPHEK.js → chunk-4VEHJZ6R.js} +1 -1
  71. package/dist/{chunk-TH22QIEC.js → chunk-6A4COFDG.js} +1 -1
  72. package/dist/{chunk-ACBTCC2L.js → chunk-7OJH2A6I.js} +1 -1
  73. package/dist/{chunk-NHCOTCI6.js → chunk-A7SGEBXJ.js} +2 -2
  74. package/dist/{chunk-5MPQSNZF.js → chunk-AUTCT6AY.js} +1 -1
  75. package/dist/{chunk-OEKSTOTE.js → chunk-AZAZ2C75.js} +1 -1
  76. package/dist/chunk-CHCA3ZM2.js +167 -0
  77. package/dist/{chunk-X347L57O.js → chunk-CSTJQDOE.js} +4 -3
  78. package/dist/{chunk-B234R3VW.js → chunk-D7WLV6WD.js} +2 -2
  79. package/dist/{chunk-GMXF3AHJ.js → chunk-DGAONW36.js} +1 -1
  80. package/dist/chunk-EAT5YL3W.js +229 -0
  81. package/dist/{chunk-OD4H5YCJ.js → chunk-EKTQE2R5.js} +8 -8
  82. package/dist/{chunk-Z44PC42G.js → chunk-ELUBA7XL.js} +2 -2
  83. package/dist/{chunk-ZWS6XQER.js → chunk-F5AKOE4P.js} +7 -7
  84. package/dist/{chunk-T5YULDDO.js → chunk-FVI4UBKO.js} +27 -4
  85. package/dist/{chunk-ESRI7MFI.js → chunk-GAN7PW6G.js} +28 -24
  86. package/dist/{chunk-K4OWYJSP.js → chunk-GM2WZTG3.js} +2 -2
  87. package/dist/{chunk-TAB5QGIK.js → chunk-GZYQTPTF.js} +3 -3
  88. package/dist/{chunk-CXDU5DE3.js → chunk-IAUNGATJ.js} +1 -1
  89. package/dist/{chunk-YS63NS6M.js → chunk-IHSM5GR4.js} +1 -1
  90. package/dist/{chunk-23PTS2ZD.js → chunk-IP7KJAUW.js} +117 -15
  91. package/dist/{chunk-D6IMJAV2.js → chunk-J64P2LB2.js} +2 -2
  92. package/dist/{chunk-CXAVSQZM.js → chunk-JXMSCKRM.js} +1 -1
  93. package/dist/{chunk-RQMK3IQH.js → chunk-K4OTJP6N.js} +14 -7
  94. package/dist/{chunk-L7ROZR2H.js → chunk-KXAUMIOX.js} +1 -1
  95. package/dist/{chunk-TPC3LAP7.js → chunk-LGY2BIOT.js} +13 -0
  96. package/dist/{chunk-RPIDSBK7.js → chunk-LLHRJEE4.js} +3 -3
  97. package/dist/{chunk-6WG2VIKC.js → chunk-LM7H6XU4.js} +1 -1
  98. package/dist/{chunk-Y6GMKZZ2.js → chunk-LOFFGJSY.js} +150 -23
  99. package/dist/{chunk-W7SDGBEC.js → chunk-MFI5OXYW.js} +52 -84
  100. package/dist/{chunk-KNPEVPYG.js → chunk-MSSQWF6X.js} +2 -2
  101. package/dist/{chunk-QIQAO3VG.js → chunk-NEFFFKMD.js} +3 -3
  102. package/dist/{chunk-YUC552KZ.js → chunk-NEHONJJC.js} +3 -3
  103. package/dist/{chunk-KZ7SXZ2V.js → chunk-NFMQRLCD.js} +1 -1
  104. package/dist/{chunk-52HCNDPG.js → chunk-O4TATDOV.js} +1 -1
  105. package/dist/{chunk-AR3OYGLB.js → chunk-PEFBRL4S.js} +28 -6
  106. package/dist/{chunk-AEUXUEJG.js → chunk-PEXVU3HU.js} +5 -3
  107. package/dist/chunk-Q2G5C3HV.js +217 -0
  108. package/dist/{chunk-KOO56JVC.js → chunk-Q6N6LDEJ.js} +1 -1
  109. package/dist/{chunk-TXSJ2L5O.js → chunk-QI4IXJN7.js} +1 -1
  110. package/dist/{chunk-HLVQ5Y7B.js → chunk-RE4VLK45.js} +1 -1
  111. package/dist/{chunk-TF6SZGDT.js → chunk-SA2PH6WY.js} +1 -1
  112. package/dist/{chunk-5RSYY7BE.js → chunk-SJYOPYXH.js} +117 -9
  113. package/dist/{chunk-PJGHBANY.js → chunk-TTJE7CCU.js} +1 -1
  114. package/dist/{chunk-A7KEWR6S.js → chunk-TXWQPL2U.js} +1 -1
  115. package/dist/{chunk-XXSJ35J5.js → chunk-U5ZH52FB.js} +2 -2
  116. package/dist/{chunk-G4FDG3LK.js → chunk-UVNDLF74.js} +63 -40
  117. package/dist/{chunk-5OD3AFRW.js → chunk-V6RCZ25F.js} +1 -1
  118. package/dist/{chunk-LHMBIFKD.js → chunk-VYNNN2S3.js} +4 -4
  119. package/dist/chunk-WCYT54XP.js +934 -0
  120. package/dist/{chunk-5AMSQRHT.js → chunk-XGYSTVUH.js} +1 -1
  121. package/dist/{chunk-MKZBHM6A.js → chunk-XLWF3C4R.js} +4 -4
  122. package/dist/{chunk-YL36L2SN.js → chunk-Y7YHLV57.js} +1 -1
  123. package/dist/{chunk-HZC4MR4H.js → chunk-YBKB2PXY.js} +1 -1
  124. package/dist/{chunk-NWM3A4TK.js → chunk-ZDNLKXZA.js} +1 -1
  125. package/dist/{chunk-O7KW6QMH.js → chunk-ZW4TKQUM.js} +15 -5
  126. package/dist/{chunk-6BURHBE6.js → chunk-ZXB44R3E.js} +32 -11
  127. package/dist/co-occurrence-WCED475N.js +73 -0
  128. package/dist/{code-context-index-B6VIWPSF.js → code-context-index-LSZ3DKTJ.js} +2 -2
  129. package/dist/{crdt-sync-XA22KI3S.js → crdt-sync-PBXZTHZC.js} +1 -1
  130. package/dist/{crm-webhook-CIZNOEY4.js → crm-webhook-W7Q25VZU.js} +2 -2
  131. package/dist/{cto-delegation-gate-H5IULFRC.js → cto-delegation-gate-JKULOLMC.js} +8 -8
  132. package/dist/{daemon-orchestration-VO5XQIJL.js → daemon-orchestration-CHV6MB42.js} +13 -11
  133. package/dist/{exe-drift-DMT75WR3.js → exe-drift-PW36OULT.js} +2 -2
  134. package/dist/{exe-export-2RZWOSX6.js → exe-export-XQOD3KE6.js} +6 -5
  135. package/dist/{exe-import-NFNYATHL.js → exe-import-QOFP67LW.js} +6 -5
  136. package/dist/{exe-key-4D7CF3BU.js → exe-key-WQ34UZR6.js} +1 -1
  137. package/dist/{fast-db-init-LAEISZQ2.js → fast-db-init-UKETGWQI.js} +1 -1
  138. package/dist/gateway/index.js +6 -6
  139. package/dist/{git-staleness-M46AYLPP.js → git-staleness-ATV5CGAP.js} +1 -1
  140. package/dist/{git-task-sweep-PXOS56YT.js → git-task-sweep-KXZRIP4T.js} +9 -9
  141. package/dist/{global-procedures-KROQQX54.js → global-procedures-G6IKCYKM.js} +3 -3
  142. package/dist/{graph-auto-extract-QJ2BBJM2.js → graph-auto-extract-ZJXJOLE2.js} +1 -1
  143. package/dist/hooks/bug-report-worker.js +10 -10
  144. package/dist/hooks/codex-stop-task-finalizer.js +10 -10
  145. package/dist/hooks/commit-complete.js +11 -11
  146. package/dist/hooks/error-recall.js +8 -7
  147. package/dist/hooks/exe-heartbeat-hook.js +2 -2
  148. package/dist/hooks/ingest-worker.js +3 -3
  149. package/dist/hooks/ingest.js +9 -9
  150. package/dist/hooks/instructions-loaded.js +3 -3
  151. package/dist/hooks/notification.js +3 -3
  152. package/dist/hooks/post-compact.js +10 -10
  153. package/dist/hooks/post-tool-combined.js +5 -5
  154. package/dist/hooks/pre-compact.js +16 -16
  155. package/dist/hooks/pre-tool-use.js +14 -14
  156. package/dist/hooks/prompt-submit.js +30 -29
  157. package/dist/hooks/session-end.js +46 -25
  158. package/dist/hooks/session-start.js +48 -10
  159. package/dist/hooks/stop.js +17 -17
  160. package/dist/hooks/subagent-stop.js +10 -10
  161. package/dist/hooks/summary-worker.js +17 -16
  162. package/dist/index.js +17 -17
  163. package/dist/{installer-SDBLJBAB.js → installer-DE2LH5EC.js} +4 -4
  164. package/dist/{installer-ZA6QNQ4P.js → installer-M2MDS7HC.js} +4 -4
  165. package/dist/{installer-6KAY6LD6.js → installer-VE23YFXU.js} +4 -4
  166. package/dist/{intercom-queue-K3DVKSPJ.js → intercom-queue-RNM6EPGA.js} +1 -1
  167. package/dist/keyword-extractor-UJHFWVZE.js +11 -0
  168. package/dist/lib/cloud-sync.js +3 -3
  169. package/dist/lib/consolidation.js +5 -4
  170. package/dist/lib/database.js +1 -1
  171. package/dist/lib/db-daemon-client.js +1 -1
  172. package/dist/lib/db.js +1 -1
  173. package/dist/lib/embed-worker.js +98 -0
  174. package/dist/lib/embedder.js +2 -2
  175. package/dist/lib/employee-templates.js +4 -4
  176. package/dist/lib/employees.js +1 -1
  177. package/dist/lib/exe-daemon-client.js +1 -1
  178. package/dist/lib/exe-daemon.js +523 -500
  179. package/dist/lib/hybrid-search.js +5 -6
  180. package/dist/lib/identity.js +1 -1
  181. package/dist/lib/messaging.js +9 -9
  182. package/dist/lib/reminders.js +2 -2
  183. package/dist/lib/schedules.js +5 -4
  184. package/dist/lib/skill-learning.js +3 -3
  185. package/dist/lib/store.js +4 -3
  186. package/dist/lib/task-router.js +2 -2
  187. package/dist/lib/tasks.js +9 -9
  188. package/dist/lib/tmux-routing.js +8 -8
  189. package/dist/lib/tmux-transport.js +1 -1
  190. package/dist/lib/token-spend.js +2 -2
  191. package/dist/lib/transport.js +2 -2
  192. package/dist/lib/ws-client.js +3 -1
  193. package/dist/mcp/register-tools.js +54 -51
  194. package/dist/mcp/server.js +58 -55
  195. package/dist/mcp/tools/complete-reminder.js +3 -3
  196. package/dist/mcp/tools/create-reminder.js +3 -3
  197. package/dist/mcp/tools/create-task.js +11 -11
  198. package/dist/mcp/tools/deactivate-behavior.js +4 -4
  199. package/dist/mcp/tools/list-reminders.js +3 -3
  200. package/dist/mcp/tools/list-tasks.js +11 -11
  201. package/dist/mcp/tools/send-message.js +11 -11
  202. package/dist/mcp/tools/update-task.js +10 -10
  203. package/dist/{mcp-http-config-LK2EDOEJ.js → mcp-http-config-Z2E4VUOF.js} +2 -2
  204. package/dist/{memory-cards-V3DKSRWL.js → memory-cards-SFDKDIAW.js} +1 -1
  205. package/dist/memory-graph-extractor-YD4GNH7T.js +16 -0
  206. package/dist/{memory-poisoning-defense-3B75HS74.js → memory-poisoning-defense-VEGNFELN.js} +1 -1
  207. package/dist/{memory-queue-client-LFPZPPQA.js → memory-queue-client-5HB2XUH7.js} +2 -2
  208. package/dist/{memory-reflection-HTDAUUE5.js → memory-reflection-MTPRQNI6.js} +2 -2
  209. package/dist/{notifications-76VCYXWW.js → notifications-6TCE6OBG.js} +8 -8
  210. package/dist/{orchestrator-CBNSBI5P.js → orchestrator-W2GYJR23.js} +10 -10
  211. package/dist/{plan-limits-SOR3QXKV.js → plan-limits-4EP46323.js} +2 -2
  212. package/dist/{projection-worker-FK5YOEIL.js → projection-worker-EBUYNMU2.js} +1 -1
  213. package/dist/{review-polling-ZLNDUKL4.js → review-polling-2N7KQFZZ.js} +9 -9
  214. package/dist/runtime/index.js +15 -15
  215. package/dist/{session-events-CUSPL25D.js → session-events-K47FHAXJ.js} +9 -9
  216. package/dist/{session-kill-telemetry-FLBRHBDP.js → session-kill-telemetry-275YUXM5.js} +2 -2
  217. package/dist/{session-scope-PX2ABSJO.js → session-scope-XSFJZEER.js} +8 -8
  218. package/dist/{setup-wizard-Y6PBZGFX.js → setup-wizard-UEO7HYLQ.js} +1 -1
  219. package/dist/{skill-refinement-L7PGKCYO.js → skill-refinement-WXBTANDQ.js} +1 -1
  220. package/dist/stack-update-2B2UXREV.js +50 -0
  221. package/dist/{task-enforcement-7FUILB63.js → task-enforcement-2JIJSXPU.js} +14 -16
  222. package/dist/{task-scope-2N45TE32.js → task-scope-W73Z3XWE.js} +8 -8
  223. package/dist/{tasks-crud-ADLCGHGH.js → tasks-crud-HPJKI3QQ.js} +8 -8
  224. package/dist/{tasks-review-PJ2DUI6N.js → tasks-review-MXLMPGNZ.js} +8 -8
  225. package/dist/{token-budget-T5DFXVTM.js → token-budget-BA46CVHX.js} +1 -1
  226. package/dist/{tool-capability-index-6JJN6ZRC.js → tool-capability-index-42VVN5BS.js} +1 -1
  227. package/dist/{tool-telemetry-72PVO5HV.js → tool-telemetry-GZ5E2AUL.js} +1 -1
  228. package/dist/tui/App.js +22 -18
  229. package/dist/{tui-data-63JHE6EZ.js → tui-data-PVXWQCJX.js} +8 -8
  230. package/dist/{worker-gate-REVBJUZ6.js → worker-gate-WTTK64TK.js} +1 -1
  231. package/dist/{workflow-engine-W2WNHJG5.js → workflow-engine-LT3WTT7V.js} +2 -2
  232. package/package.json +1 -1
  233. package/release-notes.json +209 -209
  234. /package/dist/{chunk-BNOZUS6J.js → chunk-6VVCAVRT.js} +0 -0
  235. /package/dist/{chunk-IC7GKK6I.js → chunk-CWQZZ7X3.js} +0 -0
  236. /package/dist/{chunk-ZI2ZVERO.js → chunk-EIW5GOBW.js} +0 -0
  237. /package/dist/{chunk-2BGGDNRD.js → chunk-IPPJEM26.js} +0 -0
  238. /package/dist/{chunk-4ISDU5KR.js → chunk-K5UR73PM.js} +0 -0
  239. /package/dist/{chunk-ZWRTVUQ6.js → chunk-KIMO5S45.js} +0 -0
  240. /package/dist/{chunk-S2FX5KJ4.js → chunk-WBLILGAP.js} +0 -0
  241. /package/dist/{core-memory-PCJ3L46L.js → core-memory-RAC6M67J.js} +0 -0
  242. /package/dist/{entity-boost-GHFPE6A2.js → entity-boost-5FIRFRDC.js} +0 -0
  243. /package/dist/{message-queue-client-CHRQYBH5.js → message-queue-client-PTQ2S7D7.js} +0 -0
  244. /package/dist/{wiki-acl-QYRAYYVQ.js → wiki-acl-MSDRCIAI.js} +0 -0
@@ -1,15 +1,15 @@
1
+ import {
2
+ getCachedLicenseGate
3
+ } from "./chunk-PLNYW6PA.js";
1
4
  import {
2
5
  getToolUsageStats
3
- } from "./chunk-IC7GKK6I.js";
6
+ } from "./chunk-CWQZZ7X3.js";
4
7
  import {
5
8
  AUTO_WAKE_MAX_RETRIES
6
- } from "./chunk-Y6GMKZZ2.js";
9
+ } from "./chunk-LOFFGJSY.js";
7
10
  import {
8
11
  getToolCapabilityIndex
9
- } from "./chunk-ESRI7MFI.js";
10
- import {
11
- getCachedLicenseGate
12
- } from "./chunk-PLNYW6PA.js";
12
+ } from "./chunk-GAN7PW6G.js";
13
13
  import {
14
14
  getEntityByName,
15
15
  getEntityNeighbors,
@@ -24,7 +24,7 @@ import {
24
24
  } from "./chunk-E6ORBQHP.js";
25
25
  import {
26
26
  listRecentSessionEvents
27
- } from "./chunk-CXDU5DE3.js";
27
+ } from "./chunk-IAUNGATJ.js";
28
28
  import {
29
29
  isRerankerAvailable,
30
30
  rerankWithScores
@@ -37,66 +37,76 @@ import {
37
37
  searchCodeContext,
38
38
  searchCodeContextSemantic,
39
39
  traceCodeSymbol
40
- } from "./chunk-KOO56JVC.js";
40
+ } from "./chunk-Q6N6LDEJ.js";
41
41
  import {
42
42
  exportOrchestration,
43
43
  importOrchestration,
44
44
  validatePackage
45
- } from "./chunk-XXSJ35J5.js";
45
+ } from "./chunk-U5ZH52FB.js";
46
46
  import {
47
47
  runDriftProbes
48
- } from "./chunk-52HCNDPG.js";
48
+ } from "./chunk-O4TATDOV.js";
49
49
  import {
50
50
  loadOrchestrationPhase,
51
51
  setOrchestrationPhase
52
52
  } from "./chunk-DH65L4XI.js";
53
53
  import {
54
54
  createOrRefreshResumeTask
55
- } from "./chunk-MKZBHM6A.js";
55
+ } from "./chunk-XLWF3C4R.js";
56
+ import {
57
+ registerCompleteReminder
58
+ } from "./chunk-JXMSCKRM.js";
59
+ import {
60
+ registerDeactivateBehavior
61
+ } from "./chunk-GZYQTPTF.js";
62
+ import {
63
+ registerSendMessage
64
+ } from "./chunk-D7WLV6WD.js";
65
+ import {
66
+ registerCreateTask
67
+ } from "./chunk-PEFBRL4S.js";
68
+ import {
69
+ registerListTasks
70
+ } from "./chunk-PEXVU3HU.js";
56
71
  import {
57
72
  registerUpdateTask
58
- } from "./chunk-RPIDSBK7.js";
73
+ } from "./chunk-LLHRJEE4.js";
59
74
  import {
60
75
  registerCreateReminder
61
- } from "./chunk-TF6SZGDT.js";
76
+ } from "./chunk-SA2PH6WY.js";
62
77
  import {
63
78
  registerListReminders
64
- } from "./chunk-ACBTCC2L.js";
65
- import {
66
- registerCompleteReminder
67
- } from "./chunk-CXAVSQZM.js";
68
- import {
69
- registerDeactivateBehavior
70
- } from "./chunk-TAB5QGIK.js";
79
+ } from "./chunk-7OJH2A6I.js";
71
80
  import {
72
81
  completeReminder,
73
82
  createReminder,
74
83
  listReminders
75
- } from "./chunk-TH22QIEC.js";
84
+ } from "./chunk-6A4COFDG.js";
76
85
  import {
77
- registerSendMessage
78
- } from "./chunk-B234R3VW.js";
86
+ TOKENS_PER_IDLE_MINUTE,
87
+ countKillsSince,
88
+ sumTokensSavedSince
89
+ } from "./chunk-FVI4UBKO.js";
79
90
  import {
80
- registerCreateTask
81
- } from "./chunk-AR3OYGLB.js";
91
+ conversationsToMemories,
92
+ detectFormat,
93
+ parseChatGPT,
94
+ parseClaude,
95
+ parseGeneric
96
+ } from "./chunk-Q2G5C3HV.js";
82
97
  import {
83
- registerListTasks
84
- } from "./chunk-AEUXUEJG.js";
98
+ extractMemoryGraph
99
+ } from "./chunk-EAT5YL3W.js";
85
100
  import {
86
101
  createSchedule,
87
102
  parseHumanCron
88
- } from "./chunk-D6IMJAV2.js";
103
+ } from "./chunk-J64P2LB2.js";
89
104
  import {
90
105
  status
91
- } from "./chunk-YUC552KZ.js";
92
- import {
93
- TOKENS_PER_IDLE_MINUTE,
94
- countKillsSince,
95
- sumTokensSavedSince
96
- } from "./chunk-T5YULDDO.js";
106
+ } from "./chunk-NEHONJJC.js";
97
107
  import {
98
108
  getAgentSpend
99
- } from "./chunk-NWM3A4TK.js";
109
+ } from "./chunk-ZDNLKXZA.js";
100
110
  import {
101
111
  exportGraphHTML,
102
112
  generateGraphReport
@@ -108,7 +118,7 @@ import {
108
118
  import {
109
119
  formatReport,
110
120
  runAudit
111
- } from "./chunk-Z44PC42G.js";
121
+ } from "./chunk-ELUBA7XL.js";
112
122
  import {
113
123
  runHealthCheck
114
124
  } from "./chunk-J73N5EJ6.js";
@@ -117,45 +127,45 @@ import {
117
127
  runHealth,
118
128
  runTest
119
129
  } from "./chunk-RGUPIUVT.js";
120
- import {
121
- findSimilarTrajectories,
122
- hashSignature
123
- } from "./chunk-K4OWYJSP.js";
124
- import {
125
- deactivateBehavior,
126
- listBehaviorsByDomain,
127
- listSharedSkills,
128
- storeBehavior
129
- } from "./chunk-PJGHBANY.js";
130
- import {
131
- countUnconsolidated,
132
- groupMemories,
133
- runConsolidation,
134
- selectUnconsolidated
135
- } from "./chunk-RQMK3IQH.js";
136
130
  import {
137
131
  renderClientCOOTemplate
138
- } from "./chunk-PBXWPHEK.js";
132
+ } from "./chunk-4VEHJZ6R.js";
139
133
  import {
140
134
  deactivateGlobalProcedure,
141
135
  loadGlobalProcedures,
142
136
  storeGlobalProcedure
143
- } from "./chunk-NHCOTCI6.js";
137
+ } from "./chunk-A7SGEBXJ.js";
144
138
  import {
145
139
  PLATFORM_PROCEDURES
146
- } from "./chunk-TPC3LAP7.js";
140
+ } from "./chunk-LGY2BIOT.js";
147
141
  import {
148
142
  clearCloudReuploadRequired,
149
143
  cloudSync,
150
144
  getCloudReuploadRequired,
151
145
  markCloudReuploadRequired
152
- } from "./chunk-QIQAO3VG.js";
146
+ } from "./chunk-NEFFFKMD.js";
153
147
  import {
154
148
  createARecord
155
149
  } from "./chunk-X2Z5GT3V.js";
150
+ import {
151
+ findSimilarTrajectories,
152
+ hashSignature
153
+ } from "./chunk-GM2WZTG3.js";
154
+ import {
155
+ deactivateBehavior,
156
+ listBehaviorsByDomain,
157
+ listSharedSkills,
158
+ storeBehavior
159
+ } from "./chunk-TTJE7CCU.js";
160
+ import {
161
+ countUnconsolidated,
162
+ groupMemories,
163
+ runConsolidation,
164
+ selectUnconsolidated
165
+ } from "./chunk-K4OTJP6N.js";
156
166
  import {
157
167
  embed
158
- } from "./chunk-YL36L2SN.js";
168
+ } from "./chunk-Y7YHLV57.js";
159
169
  import {
160
170
  readMcpHttpEvents,
161
171
  summarizeMcpTransport,
@@ -163,21 +173,17 @@ import {
163
173
  } from "./chunk-T5YT64SZ.js";
164
174
  import {
165
175
  updateTask
166
- } from "./chunk-ZWS6XQER.js";
176
+ } from "./chunk-F5AKOE4P.js";
167
177
  import {
168
178
  fastDbInit
169
- } from "./chunk-4ISDU5KR.js";
179
+ } from "./chunk-K5UR73PM.js";
170
180
  import {
171
181
  MAX_CONCURRENT_WORKERS
172
- } from "./chunk-5AMSQRHT.js";
182
+ } from "./chunk-XGYSTVUH.js";
173
183
  import {
174
184
  hybridSearch,
175
- lastSearchDegraded,
176
185
  recentRecords
177
- } from "./chunk-23PTS2ZD.js";
178
- import {
179
- getActiveAgent
180
- } from "./chunk-6WG2VIKC.js";
186
+ } from "./chunk-IP7KJAUW.js";
181
187
  import {
182
188
  attachDocumentMetadata,
183
189
  flushBatch,
@@ -185,7 +191,14 @@ import {
185
191
  reserveVersions,
186
192
  vectorToBlob,
187
193
  writeMemory
188
- } from "./chunk-6BURHBE6.js";
194
+ } from "./chunk-ZXB44R3E.js";
195
+ import {
196
+ extractKeywords,
197
+ keywordsToString
198
+ } from "./chunk-CHCA3ZM2.js";
199
+ import {
200
+ getActiveAgent
201
+ } from "./chunk-LM7H6XU4.js";
189
202
  import {
190
203
  getMySession,
191
204
  resolveExeSession,
@@ -193,7 +206,7 @@ import {
193
206
  sessionScopeFilter,
194
207
  updateTaskStatus,
195
208
  writeCheckpoint
196
- } from "./chunk-W7SDGBEC.js";
209
+ } from "./chunk-MFI5OXYW.js";
197
210
  import {
198
211
  listSessions
199
212
  } from "./chunk-64WZEXXA.js";
@@ -213,7 +226,7 @@ import {
213
226
  assertEmployeeLimit,
214
227
  assertFeature,
215
228
  assertMemoryLimit
216
- } from "./chunk-HLVQ5Y7B.js";
229
+ } from "./chunk-RE4VLK45.js";
217
230
  import {
218
231
  getProjectName
219
232
  } from "./chunk-OPU3NYOO.js";
@@ -229,7 +242,7 @@ import {
229
242
  isScheduledTrigger,
230
243
  loadTriggers,
231
244
  sanitizeParam
232
- } from "./chunk-ZWRTVUQ6.js";
245
+ } from "./chunk-KIMO5S45.js";
233
246
  import {
234
247
  EMPLOYEES_PATH,
235
248
  addEmployee,
@@ -246,7 +259,7 @@ import {
246
259
  loadEmployeesSync,
247
260
  saveEmployees,
248
261
  updateIdentity
249
- } from "./chunk-5RSYY7BE.js";
262
+ } from "./chunk-SJYOPYXH.js";
250
263
  import {
251
264
  getMasterKey
252
265
  } from "./chunk-6D23UNXU.js";
@@ -438,11 +451,11 @@ function registerRecallMyMemory(server) {
438
451
  results = await recentRecords(agentId, searchOptions, limit);
439
452
  }
440
453
  }
441
- const FEDERATION_THRESHOLD = 5;
454
+ const FEDERATION_THRESHOLD = 3;
442
455
  let federatedCount = 0;
443
456
  if (!recent && query && results.length < FEDERATION_THRESHOLD) {
444
457
  try {
445
- const { searchCodeContextSemantic: searchCodeContextSemantic2 } = await import("./code-context-index-B6VIWPSF.js");
458
+ const { searchCodeContextSemantic: searchCodeContextSemantic2 } = await import("./code-context-index-LSZ3DKTJ.js");
446
459
  const codeResults = await Promise.race([
447
460
  searchCodeContextSemantic2(query, { limit: 5 }),
448
461
  new Promise((_, rej) => setTimeout(() => rej(new Error("timeout")), 2e3))
@@ -461,41 +474,7 @@ ${cr.content}`,
461
474
  }
462
475
  } catch {
463
476
  }
464
- try {
465
- const { getClient: getClient2 } = await import("./lib/database.js");
466
- const client = getClient2();
467
- const terms = query.split(/\s+/).filter((t) => t.length > 2).slice(0, 6);
468
- const likeConditions = terms.map(() => "(e.name LIKE ? OR e.properties LIKE ? OR r.type LIKE ?)").join(" OR ");
469
- const likeArgs = terms.flatMap((t) => [`%${t}%`, `%${t}%`, `%${t}%`]);
470
- const graphResults = await Promise.race([
471
- client.execute({
472
- sql: `SELECT DISTINCT e.name, e.type as entity_type, e.properties as description,
473
- r.type as relationship_type, r2.name as related_to, r2.type as related_type
474
- FROM entities e
475
- LEFT JOIN relationships r ON e.id = r.source_entity_id
476
- LEFT JOIN entities r2 ON r.target_entity_id = r2.id
477
- WHERE ${likeConditions || "1=0"}
478
- LIMIT 10`,
479
- args: likeArgs
480
- }),
481
- new Promise((_, rej) => setTimeout(() => rej(new Error("timeout")), 3e3))
482
- ]);
483
- for (let i = 0; i < (graphResults.rows?.length ?? 0); i++) {
484
- const gr = graphResults.rows[i];
485
- const relPart = gr.related_to ? ` \u2192 ${gr.relationship_type} \u2192 ${gr.related_to} (${gr.related_type})` : "";
486
- results.push({
487
- id: `federated-graph-${results.length}`,
488
- raw_text: `[graph] ${gr.name} (${gr.entity_type})${relPart}
489
- ${gr.description ?? ""}`,
490
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
491
- tool_name: "graph",
492
- project_name: project_name ?? "federated",
493
- has_error: false
494
- });
495
- }
496
- } catch {
497
- }
498
- federatedCount = results.filter((r) => r.tool_name === "code_context" || r.tool_name === "graph").length;
477
+ federatedCount = results.filter((r) => r.tool_name === "code_context").length;
499
478
  }
500
479
  if (results.length === 0) {
501
480
  return {
@@ -505,7 +484,8 @@ ${gr.description ?? ""}`,
505
484
  };
506
485
  }
507
486
  const formatted = results.map((r) => {
508
- const header = `[${r.timestamp}] ${r.tool_name} (${r.project_name})${r.has_error ? " [ERROR]" : ""}`;
487
+ const sourceTag = r._source ? ` [via:${r._source}]` : "";
488
+ const header = `[${r.timestamp}] ${r.tool_name} (${r.project_name})${r.has_error ? " [ERROR]" : ""}${sourceTag}`;
509
489
  const body = formatMemoryBody(r.raw_text, resolveMaxChars(max_chars, body_chars), r.id);
510
490
  const parts = [header];
511
491
  parts.push(`id: ${r.id}`);
@@ -521,15 +501,14 @@ ${gr.description ?? ""}`,
521
501
  }).join("\n\n---\n\n");
522
502
  const federatedNote = federatedCount > 0 ? `
523
503
 
524
- [Federated recall: ${federatedCount} result(s) from code_context/graph (memory had < ${FEDERATION_THRESHOLD} matches)]` : "";
525
- const degradedWarning = !recent && lastSearchDegraded ? '\n\n\u26A0\uFE0F DEGRADED SEARCH: Embedding daemon is offline \u2014 using keyword matching only (no semantic search). Results may be incomplete. Try graph(action="query_relationships") or graph(action="entity_neighbors") for structured/relational queries.' : "";
504
+ [Federated recall: ${federatedCount} result(s) from code_context (memory had < ${FEDERATION_THRESHOLD} matches)]` : "";
526
505
  return {
527
506
  content: [
528
507
  {
529
508
  type: "text",
530
509
  text: `Found ${results.length} memories:
531
510
 
532
- ${formatted}${federatedNote}${degradedWarning}`
511
+ ${formatted}${federatedNote}`
533
512
  }
534
513
  ]
535
514
  };
@@ -1462,7 +1441,7 @@ async function handleSupersede(input) {
1462
1441
  }
1463
1442
  try {
1464
1443
  const { getClient: getClient2 } = await import("./lib/database.js");
1465
- const { getActiveAgent: getActiveAgent2 } = await import("./active-agent-CYMM3QQA.js");
1444
+ const { getActiveAgent: getActiveAgent2 } = await import("./active-agent-HVMLG6FH.js");
1466
1445
  const { writeMemory: writeMemory2, flushBatch: flushBatch2 } = await import("./lib/store.js");
1467
1446
  const { randomUUID: randomUUID2 } = await import("crypto");
1468
1447
  const client = getClient2();
@@ -1572,9 +1551,9 @@ function registerMemory(server) {
1572
1551
  return handleSupersede(input);
1573
1552
  }
1574
1553
  if (action === "core_get" || action === "core_set" || action === "core_delete") {
1575
- const { getActiveAgent: getActiveAgent2 } = await import("./active-agent-CYMM3QQA.js");
1554
+ const { getActiveAgent: getActiveAgent2 } = await import("./active-agent-HVMLG6FH.js");
1576
1555
  const { agentId } = getActiveAgent2();
1577
- const { getCoreMemory, setCoreMemory, deleteCoreMemory, formatCoreMemoryBlock } = await import("./core-memory-PCJ3L46L.js");
1556
+ const { getCoreMemory, setCoreMemory, deleteCoreMemory, formatCoreMemoryBlock } = await import("./core-memory-RAC6M67J.js");
1578
1557
  if (action === "core_get") {
1579
1558
  const entries = await getCoreMemory(agentId);
1580
1559
  const block = formatCoreMemoryBlock(entries);
@@ -2283,7 +2262,7 @@ function registerResumeEmployee(server) {
2283
2262
  };
2284
2263
  }
2285
2264
  try {
2286
- const { isTmuxSessionAlive } = await import("./tasks-crud-ADLCGHGH.js");
2265
+ const { isTmuxSessionAlive } = await import("./tasks-crud-HPJKI3QQ.js");
2287
2266
  const now = (/* @__PURE__ */ new Date()).toISOString();
2288
2267
  for (const row of openTasks.rows) {
2289
2268
  const status2 = String(row.status);
@@ -3332,8 +3311,8 @@ function registerIngestDocument(server) {
3332
3311
  },
3333
3312
  async (input) => {
3334
3313
  try {
3335
- const { assertFeature: assertFeature2 } = await import("./plan-limits-SOR3QXKV.js");
3336
- const { assertMemoryLimit: assertMemoryLimit2 } = await import("./plan-limits-SOR3QXKV.js");
3314
+ const { assertFeature: assertFeature2 } = await import("./plan-limits-4EP46323.js");
3315
+ const { assertMemoryLimit: assertMemoryLimit2 } = await import("./plan-limits-4EP46323.js");
3337
3316
  await assertFeature2("wiki");
3338
3317
  await assertMemoryLimit2();
3339
3318
  const result3 = await ingestDocument(input);
@@ -4523,12 +4502,12 @@ function registerExportGraph(server) {
4523
4502
  }
4524
4503
  const html = await exportGraphHTML(client);
4525
4504
  const fs = await import("fs");
4526
- const path17 = await import("path");
4505
+ const path19 = await import("path");
4527
4506
  const os5 = await import("os");
4528
- const outDir = path17.join(os5.homedir(), ".exe-os", "exports");
4507
+ const outDir = path19.join(os5.homedir(), ".exe-os", "exports");
4529
4508
  fs.mkdirSync(outDir, { recursive: true });
4530
4509
  const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-").slice(0, 19);
4531
- const filePath = path17.join(outDir, `graph-${timestamp}.html`);
4510
+ const filePath = path19.join(outDir, `graph-${timestamp}.html`);
4532
4511
  fs.writeFileSync(filePath, html, "utf-8");
4533
4512
  return {
4534
4513
  content: [
@@ -5442,7 +5421,7 @@ async function getAgentSessionLoad() {
5442
5421
  return { sessions: [], totalLive: 0, busySessions: 0, idleSessions: 0 };
5443
5422
  }
5444
5423
  const { getClient: getClient2 } = await import("./lib/database.js");
5445
- const { sessionScopeFilter: sessionScopeFilter2 } = await import("./task-scope-2N45TE32.js");
5424
+ const { sessionScopeFilter: sessionScopeFilter2 } = await import("./task-scope-W73Z3XWE.js");
5446
5425
  const client = getClient2();
5447
5426
  const scope = sessionScopeFilter2();
5448
5427
  for (const s of liveAgentSessions) {
@@ -6416,9 +6395,9 @@ var HostingerApiClient = class {
6416
6395
  }
6417
6396
  this.lastRequestTime = Date.now();
6418
6397
  }
6419
- async request(method, path17, body) {
6398
+ async request(method, path19, body) {
6420
6399
  await this.rateLimit();
6421
- const url = `${this.baseUrl}${path17}`;
6400
+ const url = `${this.baseUrl}${path19}`;
6422
6401
  const headers = {
6423
6402
  Authorization: `Bearer ${this.apiKey}`,
6424
6403
  "Content-Type": "application/json",
@@ -7035,7 +7014,7 @@ function registerCreateTrigger(server) {
7035
7014
  }
7036
7015
  },
7037
7016
  async ({ name, event, conditions, actions, project, enabled, schedule, query }) => {
7038
- const { assertFeature: assertFeature2 } = await import("./plan-limits-SOR3QXKV.js");
7017
+ const { assertFeature: assertFeature2 } = await import("./plan-limits-4EP46323.js");
7039
7018
  const gatedActions = {
7040
7019
  send_whatsapp: "external_agents",
7041
7020
  update_wiki: "wiki"
@@ -7939,7 +7918,7 @@ function registerConfig(server) {
7939
7918
  const existing = loadEmployeesSync2();
7940
7919
  if (existing.some((e) => e.name === employeeName)) return errorResult8(`Employee "${employeeName}" already exists.`);
7941
7920
  try {
7942
- const { assertEmployeeLimit: assertEmployeeLimit2 } = await import("./plan-limits-SOR3QXKV.js");
7921
+ const { assertEmployeeLimit: assertEmployeeLimit2 } = await import("./plan-limits-4EP46323.js");
7943
7922
  await assertEmployeeLimit2();
7944
7923
  } catch (e) {
7945
7924
  return errorResult8(e instanceof Error ? e.message : "Employee limit reached.");
@@ -7955,10 +7934,10 @@ function registerConfig(server) {
7955
7934
  const { getTemplate: getIdentityTemplate, getTemplateForTitle } = await import("./lib/identity-templates.js");
7956
7935
  const { identityPath } = await import("./lib/identity.js");
7957
7936
  const { existsSync: existsSync10, mkdirSync: mkdirSync4, writeFileSync: writeFileSync5 } = await import("fs");
7958
- const path17 = await import("path");
7937
+ const path19 = await import("path");
7959
7938
  const template = getIdentityTemplate(role) ?? getTemplateForTitle(role);
7960
7939
  const idPath = identityPath(employeeName);
7961
- const dir = path17.dirname(idPath);
7940
+ const dir = path19.dirname(idPath);
7962
7941
  if (!existsSync10(dir)) mkdirSync4(dir, { recursive: true });
7963
7942
  if (template) {
7964
7943
  writeFileSync5(idPath, template.replace(/^agent_id: \w+/m, `agent_id: ${employeeName}`), "utf-8");
@@ -7980,7 +7959,7 @@ You are ${employeeName}. Role: ${role}.`, "utf-8");
7980
7959
  }
7981
7960
  try {
7982
7961
  const { generateSessionWrappers } = await import("./lib/session-wrappers.js");
7983
- const { resolvePackageRoot } = await import("./installer-SDBLJBAB.js");
7962
+ const { resolvePackageRoot } = await import("./installer-DE2LH5EC.js");
7984
7963
  generateSessionWrappers(resolvePackageRoot());
7985
7964
  } catch {
7986
7965
  }
@@ -8016,7 +7995,7 @@ function registerListWikiPages(server) {
8016
7995
  }
8017
7996
  },
8018
7997
  async ({ workspace, folder }) => {
8019
- const { assertFeature: assertFeature2 } = await import("./plan-limits-SOR3QXKV.js");
7998
+ const { assertFeature: assertFeature2 } = await import("./plan-limits-4EP46323.js");
8020
7999
  await assertFeature2("wiki");
8021
8000
  const apiUrl = process.env.EXE_WIKI_API_URL;
8022
8001
  const apiKey = process.env.EXE_WIKI_API_KEY;
@@ -8116,7 +8095,7 @@ function registerGetWikiPage(server) {
8116
8095
  }
8117
8096
  },
8118
8097
  async ({ workspace, document_id, title }) => {
8119
- const { assertFeature: assertFeature2 } = await import("./plan-limits-SOR3QXKV.js");
8098
+ const { assertFeature: assertFeature2 } = await import("./plan-limits-4EP46323.js");
8120
8099
  await assertFeature2("wiki");
8121
8100
  const apiUrl = process.env.EXE_WIKI_API_URL;
8122
8101
  const apiKey = process.env.EXE_WIKI_API_KEY;
@@ -8311,7 +8290,7 @@ function registerWiki(server) {
8311
8290
  if (!legacyToolName) return errorResult9(`Unknown wiki action: ${String(input.action)}`);
8312
8291
  const { action: _action, user_id, ...legacyArgs } = input;
8313
8292
  if (user_id && legacyArgs.workspace) {
8314
- const { checkWikiAccess } = await import("./wiki-acl-QYRAYYVQ.js");
8293
+ const { checkWikiAccess } = await import("./wiki-acl-MSDRCIAI.js");
8315
8294
  const { allowed } = await checkWikiAccess(
8316
8295
  String(user_id),
8317
8296
  String(legacyArgs.workspace),
@@ -9481,7 +9460,7 @@ function registerWorkflowTool(server) {
9481
9460
  getWorkflowInstance,
9482
9461
  listWorkflowInstances,
9483
9462
  approveWorkflowStep
9484
- } = await import("./workflow-engine-W2WNHJG5.js");
9463
+ } = await import("./workflow-engine-LT3WTT7V.js");
9485
9464
  try {
9486
9465
  switch (input.action) {
9487
9466
  case "create_workflow": {
@@ -10646,7 +10625,7 @@ function registerCodeContext(server) {
10646
10625
  const index = buildCodeContextIndex(opts);
10647
10626
  let graphExtract;
10648
10627
  try {
10649
- const { autoExtractGraphEntities } = await import("./graph-auto-extract-QJ2BBJM2.js");
10628
+ const { autoExtractGraphEntities } = await import("./graph-auto-extract-ZJXJOLE2.js");
10650
10629
  graphExtract = await autoExtractGraphEntities(opts.projectRoot);
10651
10630
  } catch {
10652
10631
  }
@@ -10881,8 +10860,467 @@ function registerTriageFeatureRequest(server) {
10881
10860
  );
10882
10861
  }
10883
10862
 
10884
- // src/mcp/tools/decision.ts
10863
+ // src/mcp/tools/update-support.ts
10885
10864
  import { z as z91 } from "zod";
10865
+ import { readdir, readFile as readFile2, writeFile as writeFile4 } from "fs/promises";
10866
+ import path17 from "path";
10867
+ var BUG_STATUS = z91.enum(["open", "triaged", "fixed", "closed", "wontfix"]);
10868
+ var FEATURE_STATUS2 = z91.enum(["open", "planned", "in_progress", "shipped", "closed", "wontdo"]);
10869
+ async function findReportFile(dir, id) {
10870
+ try {
10871
+ const files = await readdir(dir);
10872
+ const prefix = id.slice(0, 8);
10873
+ const match = files.find((f) => f.includes(prefix) && f.endsWith(".md"));
10874
+ return match ? path17.join(dir, match) : null;
10875
+ } catch {
10876
+ return null;
10877
+ }
10878
+ }
10879
+ function updateMarkdownField(content, key, value) {
10880
+ const lines = content.split("\n");
10881
+ const keyPattern = new RegExp(`^${key}:\\s*`);
10882
+ let found = false;
10883
+ const updated = lines.map((line) => {
10884
+ if (keyPattern.test(line)) {
10885
+ found = true;
10886
+ return `${key}: ${value}`;
10887
+ }
10888
+ return line;
10889
+ });
10890
+ if (!found) {
10891
+ let insertIdx = -1;
10892
+ for (let i = 0; i < updated.length; i++) {
10893
+ if (/^[a-z_]+:\s/.test(updated[i])) {
10894
+ insertIdx = i;
10895
+ }
10896
+ }
10897
+ if (insertIdx >= 0) {
10898
+ updated.splice(insertIdx + 1, 0, `${key}: ${value}`);
10899
+ } else {
10900
+ const titleIdx = updated.findIndex((l) => l.startsWith("# "));
10901
+ updated.splice(titleIdx >= 0 ? titleIdx + 2 : 0, 0, `${key}: ${value}`);
10902
+ }
10903
+ }
10904
+ return updated.join("\n");
10905
+ }
10906
+ async function sendStatusUpstream(endpointPath, payload) {
10907
+ const config = await loadConfig();
10908
+ const routerUrl = process.env.API_ROUTER_URL?.replace(/\/+$/, "");
10909
+ const baseEndpoint = config.support?.bugReportEndpoint || process.env.EXE_BUG_REPORT_ENDPOINT || (routerUrl ? `${routerUrl}/v1/support` : "https://api.askexe.com/v1/support");
10910
+ const base = baseEndpoint.replace(/\/(bug-reports|feature-requests)\/?$/, "");
10911
+ const endpoint2 = `${base}/${endpointPath}`;
10912
+ const token = config.support?.bugReportToken || process.env.EXE_BUG_REPORT_TOKEN;
10913
+ const licenseKey = loadLicense() || process.env.EXE_LICENSE_KEY || config.cloud?.apiKey;
10914
+ const licenseToken = readCachedLicenseToken();
10915
+ try {
10916
+ const parsed = new URL(endpoint2);
10917
+ if (parsed.protocol !== "https:" && !["localhost", "127.0.0.1", "::1"].includes(parsed.hostname)) {
10918
+ return "failed: insecure endpoint rejected";
10919
+ }
10920
+ const response = await fetch(parsed, {
10921
+ method: "PATCH",
10922
+ headers: {
10923
+ "content-type": "application/json",
10924
+ ...token ? { authorization: `Bearer ${token}` } : {},
10925
+ ...licenseKey ? { "x-exe-license-key": licenseKey } : {},
10926
+ ...licenseToken ? { "x-exe-license-token": licenseToken } : {}
10927
+ },
10928
+ body: JSON.stringify(payload),
10929
+ signal: AbortSignal.timeout(1e4)
10930
+ });
10931
+ if (!response.ok) return `failed: HTTP ${response.status}`;
10932
+ return "sent";
10933
+ } catch (err) {
10934
+ return `failed: ${err instanceof Error ? err.message : String(err)}`;
10935
+ }
10936
+ }
10937
+ function registerUpdateBugReport(server) {
10938
+ server.registerTool(
10939
+ "update_bug_report",
10940
+ {
10941
+ title: "Update Bug Report",
10942
+ description: "Update the status of a previously filed bug report. Updates local markdown file, stores a memory, and POSTs the change to AskExe support. Statuses: open \u2192 triaged \u2192 fixed \u2192 closed \u2192 wontfix.",
10943
+ inputSchema: {
10944
+ id: z91.string().min(8).describe("Bug report ID (UUID or first 8 chars)"),
10945
+ status: BUG_STATUS.describe("New status"),
10946
+ fix_version: z91.string().optional().describe("Version that fixes this bug (e.g. '0.9.161')"),
10947
+ notes: z91.string().optional().describe("Update notes \u2014 why this status change"),
10948
+ send_upstream: z91.boolean().default(true).describe("POST update to AskExe support endpoint")
10949
+ }
10950
+ },
10951
+ async ({ id, status: status2, fix_version, notes, send_upstream }) => {
10952
+ const { agentId, agentRole } = getActiveAgent();
10953
+ const reportDir = path17.join(EXE_AI_DIR, "bug-reports");
10954
+ const reportPath = await findReportFile(reportDir, id);
10955
+ let title = id;
10956
+ if (reportPath) {
10957
+ let content = await readFile2(reportPath, "utf-8");
10958
+ const titleMatch = content.match(/^# Bug Report — (.+)$/m);
10959
+ if (titleMatch) title = titleMatch[1];
10960
+ content = updateMarkdownField(content, "status", status2);
10961
+ if (fix_version) content = updateMarkdownField(content, "fix_version", fix_version);
10962
+ content = updateMarkdownField(content, "updated_at", (/* @__PURE__ */ new Date()).toISOString());
10963
+ if (notes) {
10964
+ content += `
10965
+
10966
+ ## Update \u2014 ${(/* @__PURE__ */ new Date()).toISOString()}
10967
+
10968
+ Status: ${status2}
10969
+ ${fix_version ? `Fix version: ${fix_version}
10970
+ ` : ""}${notes}
10971
+ `;
10972
+ }
10973
+ await writeFile4(reportPath, content, "utf-8");
10974
+ }
10975
+ const memoryText = fix_version ? `Bug "${title}" marked ${status2} in v${fix_version}${notes ? `. ${notes}` : ""}` : `Bug "${title}" marked ${status2}${notes ? `. ${notes}` : ""}`;
10976
+ let vector = null;
10977
+ try {
10978
+ vector = await embed(memoryText);
10979
+ } catch {
10980
+ vector = null;
10981
+ }
10982
+ await writeMemory({
10983
+ id: `${id}-update-${Date.now()}`,
10984
+ agent_id: agentId,
10985
+ agent_role: agentRole,
10986
+ session_id: process.env.SESSION_ID ?? "manual",
10987
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
10988
+ tool_name: "update_bug_report",
10989
+ project_name: "support",
10990
+ has_error: false,
10991
+ raw_text: memoryText,
10992
+ vector,
10993
+ source_path: reportPath ?? void 0,
10994
+ source_type: "bug_report_update",
10995
+ memory_type: "observation",
10996
+ tier: 1,
10997
+ importance: 7,
10998
+ intent: "update",
10999
+ domain: "support",
11000
+ file_paths: null
11001
+ });
11002
+ await flushBatch();
11003
+ const upstreamPayload = {
11004
+ id,
11005
+ status: status2,
11006
+ fix_version,
11007
+ triage_notes: notes,
11008
+ updated_at: (/* @__PURE__ */ new Date()).toISOString(),
11009
+ agent_id: agentId
11010
+ };
11011
+ const upstreamStatus = send_upstream ? await sendStatusUpstream(`bug-reports/${encodeURIComponent(id)}`, upstreamPayload) : "skipped";
11012
+ return {
11013
+ content: [
11014
+ {
11015
+ type: "text",
11016
+ text: `Bug report updated.
11017
+ ID: ${id}
11018
+ Status: ${status2}
11019
+ ${fix_version ? `Fix version: ${fix_version}
11020
+ ` : ""}Local file: ${reportPath ?? "not found (upstream-only update)"}
11021
+ Memory stored: ${memoryText}
11022
+ Upstream status: ${upstreamStatus}`
11023
+ }
11024
+ ]
11025
+ };
11026
+ }
11027
+ );
11028
+ }
11029
+ function registerUpdateFeatureRequest(server) {
11030
+ server.registerTool(
11031
+ "update_feature_request",
11032
+ {
11033
+ title: "Update Feature Request",
11034
+ description: "Update the status of a previously filed feature request. Updates local markdown file, stores a memory, and POSTs the change to AskExe support. Statuses: open \u2192 planned \u2192 in_progress \u2192 shipped \u2192 closed \u2192 wontdo.",
11035
+ inputSchema: {
11036
+ id: z91.string().min(8).describe("Feature request ID (UUID or first 8 chars)"),
11037
+ status: FEATURE_STATUS2.describe("New status"),
11038
+ shipped_version: z91.string().optional().describe("Version that ships this feature (e.g. '0.9.170')"),
11039
+ notes: z91.string().optional().describe("Update notes \u2014 why this status change"),
11040
+ send_upstream: z91.boolean().default(true).describe("POST update to AskExe support endpoint")
11041
+ }
11042
+ },
11043
+ async ({ id, status: status2, shipped_version, notes, send_upstream }) => {
11044
+ const { agentId, agentRole } = getActiveAgent();
11045
+ const reportDir = path17.join(EXE_AI_DIR, "feature-requests");
11046
+ const reportPath = await findReportFile(reportDir, id);
11047
+ let title = id;
11048
+ if (reportPath) {
11049
+ let content = await readFile2(reportPath, "utf-8");
11050
+ const titleMatch = content.match(/^# Feature Request — (.+)$/m);
11051
+ if (titleMatch) title = titleMatch[1];
11052
+ content = updateMarkdownField(content, "status", status2);
11053
+ if (shipped_version) content = updateMarkdownField(content, "shipped_version", shipped_version);
11054
+ content = updateMarkdownField(content, "updated_at", (/* @__PURE__ */ new Date()).toISOString());
11055
+ if (notes) {
11056
+ content += `
11057
+
11058
+ ## Update \u2014 ${(/* @__PURE__ */ new Date()).toISOString()}
11059
+
11060
+ Status: ${status2}
11061
+ ${shipped_version ? `Shipped version: ${shipped_version}
11062
+ ` : ""}${notes}
11063
+ `;
11064
+ }
11065
+ await writeFile4(reportPath, content, "utf-8");
11066
+ }
11067
+ const memoryText = shipped_version ? `Feature "${title}" marked ${status2} in v${shipped_version}${notes ? `. ${notes}` : ""}` : `Feature "${title}" marked ${status2}${notes ? `. ${notes}` : ""}`;
11068
+ let vector = null;
11069
+ try {
11070
+ vector = await embed(memoryText);
11071
+ } catch {
11072
+ vector = null;
11073
+ }
11074
+ await writeMemory({
11075
+ id: `${id}-update-${Date.now()}`,
11076
+ agent_id: agentId,
11077
+ agent_role: agentRole,
11078
+ session_id: process.env.SESSION_ID ?? "manual",
11079
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
11080
+ tool_name: "update_feature_request",
11081
+ project_name: "support",
11082
+ has_error: false,
11083
+ raw_text: memoryText,
11084
+ vector,
11085
+ source_path: reportPath ?? void 0,
11086
+ source_type: "feature_request_update",
11087
+ memory_type: "observation",
11088
+ tier: 1,
11089
+ importance: 7,
11090
+ intent: "update",
11091
+ domain: "support",
11092
+ file_paths: null
11093
+ });
11094
+ await flushBatch();
11095
+ const upstreamPayload = {
11096
+ id,
11097
+ status: status2,
11098
+ shipped_version,
11099
+ response_notes: notes,
11100
+ updated_at: (/* @__PURE__ */ new Date()).toISOString(),
11101
+ agent_id: agentId
11102
+ };
11103
+ const upstreamStatus = send_upstream ? await sendStatusUpstream(`feature-requests/${encodeURIComponent(id)}`, upstreamPayload) : "skipped";
11104
+ return {
11105
+ content: [
11106
+ {
11107
+ type: "text",
11108
+ text: `Feature request updated.
11109
+ ID: ${id}
11110
+ Status: ${status2}
11111
+ ${shipped_version ? `Shipped version: ${shipped_version}
11112
+ ` : ""}Local file: ${reportPath ?? "not found (upstream-only update)"}
11113
+ Memory stored: ${memoryText}
11114
+ Upstream status: ${upstreamStatus}`
11115
+ }
11116
+ ]
11117
+ };
11118
+ }
11119
+ );
11120
+ }
11121
+
11122
+ // src/mcp/tools/import-conversations.ts
11123
+ import { z as z92 } from "zod";
11124
+ import crypto7 from "crypto";
11125
+ import { readFile as readFile3, readdir as readdir2, stat } from "fs/promises";
11126
+ import path18 from "path";
11127
+ var DEFAULT_MAX_MEMORIES = 5e4;
11128
+ var YIELD_INTERVAL = 50;
11129
+ async function parseFile(filePath, format2) {
11130
+ const content = await readFile3(filePath, "utf-8");
11131
+ const detectedFormat = format2 === "auto" ? detectFormat(content, filePath) : format2;
11132
+ let conversations;
11133
+ switch (detectedFormat) {
11134
+ case "chatgpt":
11135
+ conversations = parseChatGPT(content, filePath);
11136
+ break;
11137
+ case "claude":
11138
+ conversations = parseClaude(content, filePath);
11139
+ break;
11140
+ case "markdown":
11141
+ case "generic":
11142
+ default:
11143
+ conversations = parseGeneric(content, filePath);
11144
+ break;
11145
+ }
11146
+ return { conversations, detectedFormat };
11147
+ }
11148
+ async function collectFiles(dirPath) {
11149
+ const entries = await readdir2(dirPath, { withFileTypes: true });
11150
+ const files = [];
11151
+ for (const entry of entries) {
11152
+ const full = path18.join(dirPath, entry.name);
11153
+ if (entry.isDirectory()) {
11154
+ files.push(...await collectFiles(full));
11155
+ } else if (entry.isFile()) {
11156
+ const ext = path18.extname(entry.name).toLowerCase();
11157
+ if ([".json", ".md", ".markdown", ".txt"].includes(ext)) {
11158
+ files.push(full);
11159
+ }
11160
+ }
11161
+ }
11162
+ return files;
11163
+ }
11164
+ function registerImportConversations(server) {
11165
+ server.registerTool(
11166
+ "import_conversations",
11167
+ {
11168
+ title: "Import Conversations",
11169
+ description: "Import conversation history from ChatGPT, Claude, or generic exports. Parses conversations, extracts keywords and graph entities, stores as memories. Supports conversations.json (ChatGPT), Claude JSON export, markdown files, and generic JSON arrays. Deduplicates by content hash.",
11170
+ inputSchema: {
11171
+ path: z92.string().describe("File path or directory to import from"),
11172
+ format: z92.enum(["chatgpt", "claude", "generic", "markdown", "auto"]).default("auto").describe("Conversation format. 'auto' detects from content."),
11173
+ project_name: z92.string().optional().describe("Project name for memory scoping"),
11174
+ dry_run: z92.boolean().default(false).describe("Parse and report counts without storing"),
11175
+ force: z92.boolean().default(false).describe("Override the 50K memory safety cap"),
11176
+ max_memories: z92.number().optional().describe("Custom memory cap (default 50000)")
11177
+ }
11178
+ },
11179
+ async ({ path: inputPath, format: format2, project_name, dry_run, force, max_memories }) => {
11180
+ const { agentId, agentRole } = getActiveAgent();
11181
+ const cap = max_memories ?? DEFAULT_MAX_MEMORIES;
11182
+ const resolvedPath = path18.resolve(inputPath);
11183
+ let files;
11184
+ try {
11185
+ const stats = await stat(resolvedPath);
11186
+ if (stats.isDirectory()) {
11187
+ files = await collectFiles(resolvedPath);
11188
+ } else {
11189
+ files = [resolvedPath];
11190
+ }
11191
+ } catch (err) {
11192
+ return {
11193
+ content: [{
11194
+ type: "text",
11195
+ text: `Path not found: ${resolvedPath}
11196
+ ${err instanceof Error ? err.message : String(err)}`
11197
+ }],
11198
+ isError: true
11199
+ };
11200
+ }
11201
+ if (files.length === 0) {
11202
+ return {
11203
+ content: [{
11204
+ type: "text",
11205
+ text: `No importable files found in ${resolvedPath}. Supported: .json, .md, .markdown, .txt`
11206
+ }],
11207
+ isError: true
11208
+ };
11209
+ }
11210
+ let totalConversations = 0;
11211
+ let allDetectedFormat = "generic";
11212
+ const allConversations = [];
11213
+ for (const file of files) {
11214
+ try {
11215
+ const { conversations, detectedFormat } = await parseFile(file, format2);
11216
+ allConversations.push(...conversations);
11217
+ totalConversations += conversations.length;
11218
+ allDetectedFormat = detectedFormat;
11219
+ } catch (err) {
11220
+ console.warn(`[import] Skipping ${file}: ${err instanceof Error ? err.message : String(err)}`);
11221
+ }
11222
+ }
11223
+ if (allConversations.length === 0) {
11224
+ return {
11225
+ content: [{
11226
+ type: "text",
11227
+ text: `No conversations found in ${files.length} file(s). Format: ${format2}. Path: ${resolvedPath}`
11228
+ }]
11229
+ };
11230
+ }
11231
+ const memories = conversationsToMemories(allConversations, allDetectedFormat);
11232
+ if (memories.length > cap && !force) {
11233
+ return {
11234
+ content: [{
11235
+ type: "text",
11236
+ text: `Import would create ${memories.length} memories (cap: ${cap}). Use force=true to override.
11237
+ Files: ${files.length} | Conversations: ${totalConversations} | Format: ${allDetectedFormat}`
11238
+ }]
11239
+ };
11240
+ }
11241
+ if (dry_run) {
11242
+ return {
11243
+ content: [{
11244
+ type: "text",
11245
+ text: `[dry run] Import summary:
11246
+ Files: ${files.length}
11247
+ Format: ${allDetectedFormat}
11248
+ Conversations: ${totalConversations}
11249
+ Memories to create: ${memories.length}
11250
+ Path: ${resolvedPath}`
11251
+ }]
11252
+ };
11253
+ }
11254
+ let stored = 0;
11255
+ let skipped = 0;
11256
+ const projectName = project_name ?? "import";
11257
+ const sessionId = process.env.SESSION_ID ?? "import";
11258
+ for (let i = 0; i < memories.length; i++) {
11259
+ const mem = memories[i];
11260
+ const keywords = extractKeywords(mem.text);
11261
+ const graphResult = extractMemoryGraph(
11262
+ mem.text,
11263
+ agentId,
11264
+ projectName,
11265
+ "import_conversations"
11266
+ );
11267
+ const memoryId = crypto7.randomUUID();
11268
+ try {
11269
+ await writeMemory({
11270
+ id: memoryId,
11271
+ agent_id: agentId,
11272
+ agent_role: agentRole,
11273
+ session_id: sessionId,
11274
+ timestamp: mem.metadata.original_timestamp ?? (/* @__PURE__ */ new Date()).toISOString(),
11275
+ tool_name: "import_conversations",
11276
+ project_name: projectName,
11277
+ has_error: false,
11278
+ raw_text: mem.text,
11279
+ vector: null,
11280
+ // NULL vectors — backfill later
11281
+ source_path: mem.metadata.source_path,
11282
+ source_type: "conversation_import",
11283
+ memory_type: "conversation",
11284
+ tier: 3,
11285
+ // Passive ingestion
11286
+ importance: 4,
11287
+ // Imported conversations are moderate importance
11288
+ intent: "import",
11289
+ domain: "conversation",
11290
+ keywords: keywordsToString(keywords),
11291
+ referenced_entities: graphResult.entities.length > 0 ? JSON.stringify(graphResult.entities.map((e) => e.name)) : null
11292
+ });
11293
+ stored++;
11294
+ } catch {
11295
+ skipped++;
11296
+ }
11297
+ if ((i + 1) % YIELD_INTERVAL === 0) {
11298
+ await flushBatch();
11299
+ await new Promise((r) => setTimeout(r, 0));
11300
+ if ((i + 1) % (YIELD_INTERVAL * 10) === 0) {
11301
+ console.log(`[import] ${i + 1}/${memories.length} memories processed, ${stored} stored`);
11302
+ }
11303
+ }
11304
+ }
11305
+ await flushBatch();
11306
+ return {
11307
+ content: [{
11308
+ type: "text",
11309
+ text: `Import complete.
11310
+ Files: ${files.length}
11311
+ Format: ${allDetectedFormat}
11312
+ Conversations: ${totalConversations}
11313
+ Memories stored: ${stored}
11314
+ Skipped (duplicates): ${skipped}
11315
+ Path: ${resolvedPath}`
11316
+ }]
11317
+ };
11318
+ }
11319
+ );
11320
+ }
11321
+
11322
+ // src/mcp/tools/decision.ts
11323
+ import { z as z93 } from "zod";
10886
11324
  function buildHandlers6() {
10887
11325
  const tools = /* @__PURE__ */ new Map();
10888
11326
  const fake = {
@@ -10906,12 +11344,12 @@ function registerDecision(server) {
10906
11344
  title: "Decision",
10907
11345
  description: "Store or retrieve authoritative decisions. Actions: store (persist a decision by domain), get (look up a decision by domain/query).",
10908
11346
  inputSchema: {
10909
- action: z91.enum(["store", "get"]).describe("Decision operation"),
10910
- domain: z91.string().optional().describe("Decision domain (e.g. 'architecture', 'hiring')"),
10911
- decision: z91.string().optional().describe("Decision text for action=store"),
10912
- rationale: z91.string().optional().describe("Why this decision was made (action=store)"),
10913
- query: z91.string().optional().describe("Search query for action=get"),
10914
- limit: z91.coerce.number().optional().describe("Max results for action=get")
11347
+ action: z93.enum(["store", "get"]).describe("Decision operation"),
11348
+ domain: z93.string().optional().describe("Decision domain (e.g. 'architecture', 'hiring')"),
11349
+ decision: z93.string().optional().describe("Decision text for action=store"),
11350
+ rationale: z93.string().optional().describe("Why this decision was made (action=store)"),
11351
+ query: z93.string().optional().describe("Search query for action=get"),
11352
+ limit: z93.coerce.number().optional().describe("Max results for action=get")
10915
11353
  }
10916
11354
  },
10917
11355
  async (input, extra) => {
@@ -10927,7 +11365,7 @@ function registerDecision(server) {
10927
11365
  }
10928
11366
 
10929
11367
  // src/mcp/tools/session.ts
10930
- import { z as z92 } from "zod";
11368
+ import { z as z94 } from "zod";
10931
11369
  function buildHandlers7() {
10932
11370
  const tools = /* @__PURE__ */ new Map();
10933
11371
  const fake = {
@@ -10951,9 +11389,9 @@ function registerSession(server) {
10951
11389
  title: "Session",
10952
11390
  description: "Session inspection tools. Actions: events (get session event log), last_response (get the most recent assistant response text).",
10953
11391
  inputSchema: {
10954
- action: z92.enum(["events", "last_response"]).describe("Session operation"),
10955
- session_id: z92.string().optional().describe("Session ID for action=events"),
10956
- limit: z92.coerce.number().optional().describe("Max events for action=events")
11392
+ action: z94.enum(["events", "last_response"]).describe("Session operation"),
11393
+ session_id: z94.string().optional().describe("Session ID for action=events"),
11394
+ limit: z94.coerce.number().optional().describe("Max events for action=events")
10957
11395
  }
10958
11396
  },
10959
11397
  async (input, extra) => {
@@ -10969,7 +11407,7 @@ function registerSession(server) {
10969
11407
  }
10970
11408
 
10971
11409
  // src/mcp/tools/support-consolidated.ts
10972
- import { z as z93 } from "zod";
11410
+ import { z as z95 } from "zod";
10973
11411
  function buildHandlers8() {
10974
11412
  const tools = /* @__PURE__ */ new Map();
10975
11413
  const fake = {
@@ -10979,6 +11417,8 @@ function buildHandlers8() {
10979
11417
  };
10980
11418
  registerCreateBugReport(fake);
10981
11419
  registerCreateFeatureRequest(fake);
11420
+ registerUpdateBugReport(fake);
11421
+ registerUpdateFeatureRequest(fake);
10982
11422
  registerSupportTools(fake);
10983
11423
  registerListBugReports(fake);
10984
11424
  registerGetBugReport(fake);
@@ -10991,6 +11431,8 @@ function buildHandlers8() {
10991
11431
  var ACTION_TO_TOOL5 = {
10992
11432
  create_bug: "create_bug_report",
10993
11433
  create_feature: "create_feature_request",
11434
+ update_bug: "update_bug_report",
11435
+ update_feature: "update_feature_request",
10994
11436
  list_my_bugs: "list_my_bug_reports",
10995
11437
  list_my_features: "list_my_feature_requests",
10996
11438
  list_bugs: "list_bug_reports",
@@ -11008,11 +11450,13 @@ function registerSupportConsolidated(server) {
11008
11450
  "support",
11009
11451
  {
11010
11452
  title: "Support",
11011
- description: "Bug reports, feature requests, and support system. Actions: create_bug, create_feature, list_my_bugs, list_my_features, list_bugs, get_bug, triage_bug, list_features, get_feature, triage_feature, health, test. Use 'product' param to file bugs for any AskExe product (exe-os, exe-create, exe-wiki, etc.).",
11453
+ description: "Bug reports, feature requests, and support system. Actions: create_bug, create_feature, update_bug, update_feature, list_my_bugs, list_my_features, list_bugs, get_bug, triage_bug, list_features, get_feature, triage_feature, health, test. Use 'product' param to file bugs for any AskExe product (exe-os, exe-create, exe-wiki, etc.).",
11012
11454
  inputSchema: {
11013
- action: z93.enum([
11455
+ action: z95.enum([
11014
11456
  "create_bug",
11015
11457
  "create_feature",
11458
+ "update_bug",
11459
+ "update_feature",
11016
11460
  "list_my_bugs",
11017
11461
  "list_my_features",
11018
11462
  "list_bugs",
@@ -11024,27 +11468,27 @@ function registerSupportConsolidated(server) {
11024
11468
  "health",
11025
11469
  "test"
11026
11470
  ]).describe("Support operation"),
11027
- title: z93.string().optional().describe("Bug/feature title"),
11028
- description: z93.string().optional().describe("Bug/feature description"),
11029
- steps_to_reproduce: z93.string().optional().describe("Steps to reproduce (bugs)"),
11030
- expected_behavior: z93.string().optional().describe("Expected behavior (bugs)"),
11031
- actual_behavior: z93.string().optional().describe("Actual behavior (bugs)"),
11032
- severity: z93.string().optional().describe("Severity: p0/p1/p2/p3"),
11033
- product: z93.string().optional().describe("Product: exe-os (default), exe-create, exe-wiki, exe-gateway, exe-crm, exe-build"),
11034
- use_case: z93.string().optional().describe("Use case (features)"),
11035
- proposed_solution: z93.string().optional().describe("Proposed solution (features)"),
11036
- priority: z93.string().optional().describe("Priority (features)"),
11037
- id: z93.string().optional().describe("Bug/feature ID for get/triage"),
11038
- status: z93.string().optional().describe("Filter by status"),
11039
- classification: z93.string().optional().describe("Triage classification"),
11040
- resolution: z93.string().optional().describe("Triage resolution"),
11041
- notes: z93.string().optional().describe("Triage notes (mapped to triage_notes for bug/feature triage)"),
11042
- triage_notes: z93.string().optional().describe("Triage notes (legacy field name)"),
11043
- linked_task_id: z93.string().optional().describe("Linked task ID for triage"),
11044
- linked_commit: z93.string().optional().describe("Linked commit hash for triage"),
11045
- fixed_version: z93.string().optional().describe("Version that fixes this bug"),
11046
- shipped_version: z93.string().optional().describe("Version that ships this feature (features only)"),
11047
- limit: z93.coerce.number().optional().describe("Max results")
11471
+ title: z95.string().optional().describe("Bug/feature title"),
11472
+ description: z95.string().optional().describe("Bug/feature description"),
11473
+ steps_to_reproduce: z95.string().optional().describe("Steps to reproduce (bugs)"),
11474
+ expected_behavior: z95.string().optional().describe("Expected behavior (bugs)"),
11475
+ actual_behavior: z95.string().optional().describe("Actual behavior (bugs)"),
11476
+ severity: z95.string().optional().describe("Severity: p0/p1/p2/p3"),
11477
+ product: z95.string().optional().describe("Product: exe-os (default), exe-create, exe-wiki, exe-gateway, exe-crm, exe-build"),
11478
+ use_case: z95.string().optional().describe("Use case (features)"),
11479
+ proposed_solution: z95.string().optional().describe("Proposed solution (features)"),
11480
+ priority: z95.string().optional().describe("Priority (features)"),
11481
+ id: z95.string().optional().describe("Bug/feature ID for get/triage"),
11482
+ status: z95.string().optional().describe("Filter by status"),
11483
+ classification: z95.string().optional().describe("Triage classification"),
11484
+ resolution: z95.string().optional().describe("Triage resolution"),
11485
+ notes: z95.string().optional().describe("Triage notes (mapped to triage_notes for bug/feature triage)"),
11486
+ triage_notes: z95.string().optional().describe("Triage notes (legacy field name)"),
11487
+ linked_task_id: z95.string().optional().describe("Linked task ID for triage"),
11488
+ linked_commit: z95.string().optional().describe("Linked commit hash for triage"),
11489
+ fixed_version: z95.string().optional().describe("Version that fixes this bug"),
11490
+ shipped_version: z95.string().optional().describe("Version that ships this feature (features only)"),
11491
+ limit: z95.coerce.number().optional().describe("Max results")
11048
11492
  }
11049
11493
  },
11050
11494
  async (input, extra) => {
@@ -11082,6 +11526,16 @@ function registerSupportConsolidated(server) {
11082
11526
  args.use_case = args.description;
11083
11527
  }
11084
11528
  }
11529
+ if (action === "update_bug") {
11530
+ if (args.send_upstream === void 0) args.send_upstream = true;
11531
+ }
11532
+ if (action === "update_feature") {
11533
+ if (args.send_upstream === void 0) args.send_upstream = true;
11534
+ if (args.fixed_version && !args.shipped_version) {
11535
+ args.shipped_version = args.fixed_version;
11536
+ delete args.fixed_version;
11537
+ }
11538
+ }
11085
11539
  if (action === "triage_bug" && args.notes && !args.triage_notes) {
11086
11540
  args.triage_notes = args.notes;
11087
11541
  delete args.notes;
@@ -11106,7 +11560,7 @@ function registerSupportConsolidated(server) {
11106
11560
  }
11107
11561
 
11108
11562
  // src/mcp/tools/diagnostics.ts
11109
- import { z as z94 } from "zod";
11563
+ import { z as z96 } from "zod";
11110
11564
  function buildHandlers9() {
11111
11565
  const tools = /* @__PURE__ */ new Map();
11112
11566
  const fake = {
@@ -11127,17 +11581,17 @@ function registerDiagnostics(server) {
11127
11581
  title: "Diagnostics",
11128
11582
  description: `System diagnostics and admin operations. Actions: ${toolNames.join(", ")}. Covers health checks, update status, cloud status, key management, employee rename, semantic tool discovery (tool_search), identity drift detection (drift), agent liveness monitoring (agent_liveness), and agent memory reassignment (merge_agent_memories).`,
11129
11583
  inputSchema: {
11130
- action: z94.string().describe(`Diagnostic operation: ${toolNames.join(", ")}`),
11584
+ action: z96.string().describe(`Diagnostic operation: ${toolNames.join(", ")}`),
11131
11585
  // Pass-through params used by various sub-tools
11132
- agent_id: z94.string().optional().describe("Agent to probe (drift). Defaults to all agents."),
11133
- name: z94.string().optional().describe("Employee name (rename_employee)"),
11134
- new_name: z94.string().optional().describe("New employee name (rename_employee)"),
11135
- query: z94.string().optional().describe("Search/filter query, or natural language for tool_search"),
11136
- format: z94.string().optional().describe("Output format"),
11137
- limit: z94.coerce.number().int().min(1).max(100).optional().describe("Max results for tool_search (default 20)"),
11138
- from_agent_id: z94.string().optional().describe("Source agent ID to merge from (merge_agent_memories)"),
11139
- to_agent_id: z94.string().optional().describe("Target agent ID to merge into (merge_agent_memories)"),
11140
- dry_run: z94.boolean().optional().default(true).describe("Preview mode \u2014 show count without changing (merge_agent_memories). Default: true")
11586
+ agent_id: z96.string().optional().describe("Agent to probe (drift). Defaults to all agents."),
11587
+ name: z96.string().optional().describe("Employee name (rename_employee)"),
11588
+ new_name: z96.string().optional().describe("New employee name (rename_employee)"),
11589
+ query: z96.string().optional().describe("Search/filter query, or natural language for tool_search"),
11590
+ format: z96.string().optional().describe("Output format"),
11591
+ limit: z96.coerce.number().int().min(1).max(100).optional().describe("Max results for tool_search (default 20)"),
11592
+ from_agent_id: z96.string().optional().describe("Source agent ID to merge from (merge_agent_memories)"),
11593
+ to_agent_id: z96.string().optional().describe("Target agent ID to merge into (merge_agent_memories)"),
11594
+ dry_run: z96.boolean().optional().default(true).describe("Preview mode \u2014 show count without changing (merge_agent_memories). Default: true")
11141
11595
  }
11142
11596
  },
11143
11597
  async (input, extra) => {
@@ -11493,6 +11947,7 @@ function registerAllTools(server, license, hasKey) {
11493
11947
  gate("registerPurgeDocument", registerPurgeDocument);
11494
11948
  gate("registerSetDocumentImportance", registerSetDocumentImportance);
11495
11949
  gate("registerRerankDocuments", registerRerankDocuments);
11950
+ gate("registerImportConversations", registerImportConversations);
11496
11951
  }
11497
11952
  if (exposeLegacyMessages) {
11498
11953
  gate("registerAcknowledgeMessages", registerAcknowledgeMessages);
@@ -11566,6 +12021,8 @@ function registerAllTools(server, license, hasKey) {
11566
12021
  if (exposeLegacySupport) {
11567
12022
  gate("registerCreateBugReport", registerCreateBugReport);
11568
12023
  gate("registerCreateFeatureRequest", registerCreateFeatureRequest);
12024
+ gate("registerUpdateBugReport", registerUpdateBugReport);
12025
+ gate("registerUpdateFeatureRequest", registerUpdateFeatureRequest);
11569
12026
  gate("registerSupportTools", registerSupportTools);
11570
12027
  if (process.env.ASKEXE_SUPPORT_ADMIN_TOKEN || process.env.EXE_SUPPORT_ADMIN_TOKEN) {
11571
12028
  gate("registerListBugReports", registerListBugReports);