@jack200714/mafw 4.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (631) hide show
  1. package/.opencode/mafw/.backup-v61/parametric/base-skill-manifest.yaml +2 -0
  2. package/.opencode/mafw/STATUS.md +6 -0
  3. package/.opencode/mafw/ledger.md +20 -0
  4. package/.opencode/mafw/memory/.harmonic_index.json +28 -0
  5. package/.opencode/mafw/memory/.review_queue.json +1 -0
  6. package/.opencode/mafw/memory/tier3/parametric.json +13 -0
  7. package/.opencode/mafw/memory/tier3/test-goal.json +19 -0
  8. package/.opencode/mafw/memory-index.json +6 -0
  9. package/.opencode/mafw/parametric/base-skill-manifest.yaml +2 -0
  10. package/.opencode/mafw/waves.json +4 -0
  11. package/.opencode/opencode.json +3 -0
  12. package/.opencode/plugins/mafw-plugin.ts +8 -0
  13. package/.opencode/skills/banner-design/SKILL.md +196 -0
  14. package/.opencode/skills/banner-design/references/banner-sizes-and-styles.md +118 -0
  15. package/.opencode/skills/brand/SKILL.md +97 -0
  16. package/.opencode/skills/brand/references/approval-checklist.md +169 -0
  17. package/.opencode/skills/brand/references/asset-organization.md +157 -0
  18. package/.opencode/skills/brand/references/brand-guideline-template.md +140 -0
  19. package/.opencode/skills/brand/references/color-palette-management.md +186 -0
  20. package/.opencode/skills/brand/references/consistency-checklist.md +94 -0
  21. package/.opencode/skills/brand/references/logo-usage-rules.md +185 -0
  22. package/.opencode/skills/brand/references/messaging-framework.md +85 -0
  23. package/.opencode/skills/brand/references/typography-specifications.md +214 -0
  24. package/.opencode/skills/brand/references/update.md +118 -0
  25. package/.opencode/skills/brand/references/visual-identity.md +96 -0
  26. package/.opencode/skills/brand/references/voice-framework.md +88 -0
  27. package/.opencode/skills/brand/scripts/extract-colors.cjs +341 -0
  28. package/.opencode/skills/brand/scripts/inject-brand-context.cjs +349 -0
  29. package/.opencode/skills/brand/scripts/sync-brand-to-tokens.cjs +248 -0
  30. package/.opencode/skills/brand/scripts/tests/test_sync_brand_to_tokens.py +52 -0
  31. package/.opencode/skills/brand/scripts/validate-asset.cjs +387 -0
  32. package/.opencode/skills/brand/templates/brand-guidelines-starter.md +275 -0
  33. package/.opencode/skills/design/SKILL.md +313 -0
  34. package/.opencode/skills/design/data/cip/deliverables.csv +51 -0
  35. package/.opencode/skills/design/data/cip/industries.csv +21 -0
  36. package/.opencode/skills/design/data/cip/mockup-contexts.csv +21 -0
  37. package/.opencode/skills/design/data/cip/styles.csv +21 -0
  38. package/.opencode/skills/design/data/icon/styles.csv +16 -0
  39. package/.opencode/skills/design/data/logo/colors.csv +56 -0
  40. package/.opencode/skills/design/data/logo/industries.csv +56 -0
  41. package/.opencode/skills/design/data/logo/styles.csv +56 -0
  42. package/.opencode/skills/design/references/banner-sizes-and-styles.md +118 -0
  43. package/.opencode/skills/design/references/cip-deliverable-guide.md +95 -0
  44. package/.opencode/skills/design/references/cip-design.md +121 -0
  45. package/.opencode/skills/design/references/cip-prompt-engineering.md +84 -0
  46. package/.opencode/skills/design/references/cip-style-guide.md +68 -0
  47. package/.opencode/skills/design/references/design-routing.md +207 -0
  48. package/.opencode/skills/design/references/icon-design.md +122 -0
  49. package/.opencode/skills/design/references/logo-color-psychology.md +101 -0
  50. package/.opencode/skills/design/references/logo-design.md +92 -0
  51. package/.opencode/skills/design/references/logo-prompt-engineering.md +158 -0
  52. package/.opencode/skills/design/references/logo-style-guide.md +109 -0
  53. package/.opencode/skills/design/references/slides-copywriting-formulas.md +84 -0
  54. package/.opencode/skills/design/references/slides-create.md +4 -0
  55. package/.opencode/skills/design/references/slides-html-template.md +295 -0
  56. package/.opencode/skills/design/references/slides-layout-patterns.md +137 -0
  57. package/.opencode/skills/design/references/slides-strategies.md +94 -0
  58. package/.opencode/skills/design/references/slides.md +42 -0
  59. package/.opencode/skills/design/references/social-photos-design.md +329 -0
  60. package/.opencode/skills/design/scripts/cip/core.py +215 -0
  61. package/.opencode/skills/design/scripts/cip/generate.py +484 -0
  62. package/.opencode/skills/design/scripts/cip/render-html.py +424 -0
  63. package/.opencode/skills/design/scripts/cip/search.py +127 -0
  64. package/.opencode/skills/design/scripts/icon/generate.py +487 -0
  65. package/.opencode/skills/design/scripts/logo/core.py +175 -0
  66. package/.opencode/skills/design/scripts/logo/generate.py +362 -0
  67. package/.opencode/skills/design/scripts/logo/search.py +114 -0
  68. package/.opencode/skills/design-system/SKILL.md +244 -0
  69. package/.opencode/skills/design-system/data/slide-backgrounds.csv +11 -0
  70. package/.opencode/skills/design-system/data/slide-charts.csv +26 -0
  71. package/.opencode/skills/design-system/data/slide-color-logic.csv +14 -0
  72. package/.opencode/skills/design-system/data/slide-copy.csv +26 -0
  73. package/.opencode/skills/design-system/data/slide-layout-logic.csv +16 -0
  74. package/.opencode/skills/design-system/data/slide-layouts.csv +26 -0
  75. package/.opencode/skills/design-system/data/slide-strategies.csv +16 -0
  76. package/.opencode/skills/design-system/data/slide-typography.csv +15 -0
  77. package/.opencode/skills/design-system/references/component-specs.md +236 -0
  78. package/.opencode/skills/design-system/references/component-tokens.md +214 -0
  79. package/.opencode/skills/design-system/references/primitive-tokens.md +203 -0
  80. package/.opencode/skills/design-system/references/semantic-tokens.md +215 -0
  81. package/.opencode/skills/design-system/references/states-and-variants.md +241 -0
  82. package/.opencode/skills/design-system/references/tailwind-integration.md +251 -0
  83. package/.opencode/skills/design-system/references/token-architecture.md +224 -0
  84. package/.opencode/skills/design-system/scripts/embed-tokens.cjs +99 -0
  85. package/.opencode/skills/design-system/scripts/fetch-background.py +317 -0
  86. package/.opencode/skills/design-system/scripts/generate-slide.py +770 -0
  87. package/.opencode/skills/design-system/scripts/generate-tokens.cjs +205 -0
  88. package/.opencode/skills/design-system/scripts/html-token-validator.py +327 -0
  89. package/.opencode/skills/design-system/scripts/search-slides.py +218 -0
  90. package/.opencode/skills/design-system/scripts/slide-token-validator.py +35 -0
  91. package/.opencode/skills/design-system/scripts/slide_search_core.py +453 -0
  92. package/.opencode/skills/design-system/scripts/tests/test_validate_tokens.py +48 -0
  93. package/.opencode/skills/design-system/scripts/validate-tokens.cjs +246 -0
  94. package/.opencode/skills/design-system/templates/design-tokens-starter.json +143 -0
  95. package/.opencode/skills/frontend-design/LICENSE.txt +21 -0
  96. package/.opencode/skills/frontend-design/SKILL.md +115 -0
  97. package/.opencode/skills/mafw-automation-interview/SKILL.md +43 -0
  98. package/.opencode/skills/mafw-cli-scanner/SKILL.md +37 -0
  99. package/.opencode/skills/mafw-compression-verifier/SKILL.md +52 -0
  100. package/.opencode/skills/mafw-desktop-inspector/SKILL.md +170 -0
  101. package/.opencode/skills/mafw-execute/SKILL.md +62 -0
  102. package/.opencode/skills/mafw-gateway-restart/SKILL.md +87 -0
  103. package/.opencode/skills/mafw-github-scanner/SKILL.md +38 -0
  104. package/.opencode/skills/mafw-goal/SKILL.md +76 -0
  105. package/.opencode/skills/mafw-interview/SKILL.md +68 -0
  106. package/.opencode/skills/mafw-memory-extractor/SKILL.md +65 -0
  107. package/.opencode/skills/mafw-plan/SKILL.md +58 -0
  108. package/.opencode/skills/mafw-review/SKILL.md +85 -0
  109. package/.opencode/skills/runtime-plugin-authoring/SKILL.md +791 -0
  110. package/.opencode/skills/slides/SKILL.md +40 -0
  111. package/.opencode/skills/slides/references/copywriting-formulas.md +84 -0
  112. package/.opencode/skills/slides/references/create.md +4 -0
  113. package/.opencode/skills/slides/references/html-template.md +295 -0
  114. package/.opencode/skills/slides/references/layout-patterns.md +137 -0
  115. package/.opencode/skills/slides/references/slide-strategies.md +94 -0
  116. package/.opencode/skills/ui-styling/LICENSE.txt +202 -0
  117. package/.opencode/skills/ui-styling/SKILL.md +324 -0
  118. package/.opencode/skills/ui-styling/references/canvas-design-system.md +320 -0
  119. package/.opencode/skills/ui-styling/references/shadcn-accessibility.md +471 -0
  120. package/.opencode/skills/ui-styling/references/shadcn-components.md +424 -0
  121. package/.opencode/skills/ui-styling/references/shadcn-theming.md +373 -0
  122. package/.opencode/skills/ui-styling/references/tailwind-customization.md +483 -0
  123. package/.opencode/skills/ui-styling/references/tailwind-responsive.md +382 -0
  124. package/.opencode/skills/ui-styling/references/tailwind-utilities.md +455 -0
  125. package/.opencode/skills/ui-styling/scripts/requirements.txt +17 -0
  126. package/.opencode/skills/ui-styling/scripts/shadcn_add.py +308 -0
  127. package/.opencode/skills/ui-styling/scripts/tailwind_config_gen.py +473 -0
  128. package/.opencode/skills/ui-styling/scripts/tests/coverage-ui.json +1 -0
  129. package/.opencode/skills/ui-styling/scripts/tests/requirements.txt +3 -0
  130. package/.opencode/skills/ui-styling/scripts/tests/test_shadcn_add.py +266 -0
  131. package/.opencode/skills/ui-styling/scripts/tests/test_tailwind_config_gen.py +394 -0
  132. package/.opencode/skills/ui-ux-pro-max/SKILL.md +388 -0
  133. package/.opencode/skills/ui-ux-pro-max/data/app-interface.csv +31 -0
  134. package/.opencode/skills/ui-ux-pro-max/data/charts.csv +26 -0
  135. package/.opencode/skills/ui-ux-pro-max/data/colors.csv +193 -0
  136. package/.opencode/skills/ui-ux-pro-max/data/google-fonts.csv +1924 -0
  137. package/.opencode/skills/ui-ux-pro-max/data/icons.csv +106 -0
  138. package/.opencode/skills/ui-ux-pro-max/data/landing.csv +35 -0
  139. package/.opencode/skills/ui-ux-pro-max/data/motion.csv +17 -0
  140. package/.opencode/skills/ui-ux-pro-max/data/products.csv +193 -0
  141. package/.opencode/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
  142. package/.opencode/skills/ui-ux-pro-max/data/stacks/angular.csv +51 -0
  143. package/.opencode/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
  144. package/.opencode/skills/ui-ux-pro-max/data/stacks/avalonia.csv +57 -0
  145. package/.opencode/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  146. package/.opencode/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  147. package/.opencode/skills/ui-ux-pro-max/data/stacks/javafx.csv +76 -0
  148. package/.opencode/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  149. package/.opencode/skills/ui-ux-pro-max/data/stacks/laravel.csv +51 -0
  150. package/.opencode/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  151. package/.opencode/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +71 -0
  152. package/.opencode/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  153. package/.opencode/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  154. package/.opencode/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
  155. package/.opencode/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  156. package/.opencode/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  157. package/.opencode/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  158. package/.opencode/skills/ui-ux-pro-max/data/stacks/threejs.csv +54 -0
  159. package/.opencode/skills/ui-ux-pro-max/data/stacks/uno.csv +60 -0
  160. package/.opencode/skills/ui-ux-pro-max/data/stacks/uwp.csv +56 -0
  161. package/.opencode/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  162. package/.opencode/skills/ui-ux-pro-max/data/stacks/winui.csv +60 -0
  163. package/.opencode/skills/ui-ux-pro-max/data/stacks/wpf.csv +57 -0
  164. package/.opencode/skills/ui-ux-pro-max/data/styles.csv +85 -0
  165. package/.opencode/skills/ui-ux-pro-max/data/typography.csv +75 -0
  166. package/.opencode/skills/ui-ux-pro-max/data/ui-reasoning.csv +162 -0
  167. package/.opencode/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  168. package/.opencode/skills/ui-ux-pro-max/scripts/core.py +464 -0
  169. package/.opencode/skills/ui-ux-pro-max/scripts/design_system.py +1479 -0
  170. package/.opencode/skills/ui-ux-pro-max/scripts/search.py +162 -0
  171. package/.opencode/skills/ui-ux-pro-max/scripts/tests/test_core.py +134 -0
  172. package/.opencode/skills/ui-ux-pro-max/scripts/tests/test_design_system_mode.py +159 -0
  173. package/.opencode/skills/ui-ux-pro-max/scripts/validate_data.py +114 -0
  174. package/LICENSE +21 -0
  175. package/README.md +199 -0
  176. package/bin/mafw.js +436 -0
  177. package/dist/hooks/bash-python-guide.d.ts +4 -0
  178. package/dist/hooks/bash-python-guide.d.ts.map +1 -0
  179. package/dist/hooks/bash-python-guide.js +67 -0
  180. package/dist/hooks/bash-python-guide.js.map +1 -0
  181. package/dist/hooks/handoff.d.ts +9 -0
  182. package/dist/hooks/handoff.d.ts.map +1 -0
  183. package/dist/hooks/handoff.js +8 -0
  184. package/dist/hooks/handoff.js.map +1 -0
  185. package/dist/hooks/hook-manager.d.ts +32 -0
  186. package/dist/hooks/hook-manager.d.ts.map +1 -0
  187. package/dist/hooks/hook-manager.js +91 -0
  188. package/dist/hooks/hook-manager.js.map +1 -0
  189. package/dist/hooks/llm-after.d.ts +8 -0
  190. package/dist/hooks/llm-after.d.ts.map +1 -0
  191. package/dist/hooks/llm-after.js +8 -0
  192. package/dist/hooks/llm-after.js.map +1 -0
  193. package/dist/hooks/media-ingest.d.ts +43 -0
  194. package/dist/hooks/media-ingest.d.ts.map +1 -0
  195. package/dist/hooks/media-ingest.js +269 -0
  196. package/dist/hooks/media-ingest.js.map +1 -0
  197. package/dist/hooks/memory-guide.d.ts +3 -0
  198. package/dist/hooks/memory-guide.d.ts.map +1 -0
  199. package/dist/hooks/memory-guide.js +47 -0
  200. package/dist/hooks/memory-guide.js.map +1 -0
  201. package/dist/hooks/observation-capture.d.ts +17 -0
  202. package/dist/hooks/observation-capture.d.ts.map +1 -0
  203. package/dist/hooks/observation-capture.js +20 -0
  204. package/dist/hooks/observation-capture.js.map +1 -0
  205. package/dist/hooks/session-compacting.d.ts +6 -0
  206. package/dist/hooks/session-compacting.d.ts.map +1 -0
  207. package/dist/hooks/session-compacting.js +6 -0
  208. package/dist/hooks/session-compacting.js.map +1 -0
  209. package/dist/hooks/session-ending.d.ts +20 -0
  210. package/dist/hooks/session-ending.d.ts.map +1 -0
  211. package/dist/hooks/session-ending.js +113 -0
  212. package/dist/hooks/session-ending.js.map +1 -0
  213. package/dist/hooks/session-recall.d.ts +2 -0
  214. package/dist/hooks/session-recall.d.ts.map +1 -0
  215. package/dist/hooks/session-recall.js +103 -0
  216. package/dist/hooks/session-recall.js.map +1 -0
  217. package/dist/hooks/session-start.d.ts +9 -0
  218. package/dist/hooks/session-start.d.ts.map +1 -0
  219. package/dist/hooks/session-start.js +42 -0
  220. package/dist/hooks/session-start.js.map +1 -0
  221. package/dist/hooks/tool-before.d.ts +10 -0
  222. package/dist/hooks/tool-before.d.ts.map +1 -0
  223. package/dist/hooks/tool-before.js +6 -0
  224. package/dist/hooks/tool-before.js.map +1 -0
  225. package/dist/hooks/tool-executed.d.ts +19 -0
  226. package/dist/hooks/tool-executed.d.ts.map +1 -0
  227. package/dist/hooks/tool-executed.js +12 -0
  228. package/dist/hooks/tool-executed.js.map +1 -0
  229. package/dist/hooks/user-profile.d.ts +2 -0
  230. package/dist/hooks/user-profile.d.ts.map +1 -0
  231. package/dist/hooks/user-profile.js +30 -0
  232. package/dist/hooks/user-profile.js.map +1 -0
  233. package/dist/hooks/user-prompt.d.ts +9 -0
  234. package/dist/hooks/user-prompt.d.ts.map +1 -0
  235. package/dist/hooks/user-prompt.js +8 -0
  236. package/dist/hooks/user-prompt.js.map +1 -0
  237. package/dist/hooks/voice-guide.d.ts +8 -0
  238. package/dist/hooks/voice-guide.d.ts.map +1 -0
  239. package/dist/hooks/voice-guide.js +101 -0
  240. package/dist/hooks/voice-guide.js.map +1 -0
  241. package/dist/plugin.d.ts +55 -0
  242. package/dist/plugin.d.ts.map +1 -0
  243. package/dist/plugin.js +342 -0
  244. package/dist/plugin.js.map +1 -0
  245. package/dist/tools/add-memory.d.ts +17 -0
  246. package/dist/tools/add-memory.d.ts.map +1 -0
  247. package/dist/tools/add-memory.js +60 -0
  248. package/dist/tools/add-memory.js.map +1 -0
  249. package/dist/tools/media-ask.d.ts +14 -0
  250. package/dist/tools/media-ask.d.ts.map +1 -0
  251. package/dist/tools/media-ask.js +224 -0
  252. package/dist/tools/media-ask.js.map +1 -0
  253. package/dist/tools/media-speak.d.ts +16 -0
  254. package/dist/tools/media-speak.d.ts.map +1 -0
  255. package/dist/tools/media-speak.js +78 -0
  256. package/dist/tools/media-speak.js.map +1 -0
  257. package/dist/tools/media-upload.d.ts +14 -0
  258. package/dist/tools/media-upload.d.ts.map +1 -0
  259. package/dist/tools/media-upload.js +155 -0
  260. package/dist/tools/media-upload.js.map +1 -0
  261. package/dist/tools/python-exec.d.ts +13 -0
  262. package/dist/tools/python-exec.d.ts.map +1 -0
  263. package/dist/tools/python-exec.js +99 -0
  264. package/dist/tools/python-exec.js.map +1 -0
  265. package/dist/tools/python-restart.d.ts +11 -0
  266. package/dist/tools/python-restart.d.ts.map +1 -0
  267. package/dist/tools/python-restart.js +33 -0
  268. package/dist/tools/python-restart.js.map +1 -0
  269. package/dist/utils/circuit-breaker.d.ts +23 -0
  270. package/dist/utils/circuit-breaker.d.ts.map +1 -0
  271. package/dist/utils/circuit-breaker.js +75 -0
  272. package/dist/utils/circuit-breaker.js.map +1 -0
  273. package/dist/utils/config-loader.d.ts +20 -0
  274. package/dist/utils/config-loader.d.ts.map +1 -0
  275. package/dist/utils/config-loader.js +194 -0
  276. package/dist/utils/config-loader.js.map +1 -0
  277. package/dist/utils/fallback.d.ts +7 -0
  278. package/dist/utils/fallback.d.ts.map +1 -0
  279. package/dist/utils/fallback.js +20 -0
  280. package/dist/utils/fallback.js.map +1 -0
  281. package/dist/utils/git.d.ts +24 -0
  282. package/dist/utils/git.d.ts.map +1 -0
  283. package/dist/utils/git.js +71 -0
  284. package/dist/utils/git.js.map +1 -0
  285. package/dist/utils/github.d.ts +37 -0
  286. package/dist/utils/github.d.ts.map +1 -0
  287. package/dist/utils/github.js +53 -0
  288. package/dist/utils/github.js.map +1 -0
  289. package/dist/utils/global-path.d.ts +2 -0
  290. package/dist/utils/global-path.d.ts.map +1 -0
  291. package/dist/utils/global-path.js +32 -0
  292. package/dist/utils/global-path.js.map +1 -0
  293. package/dist/utils/logger.d.ts +6 -0
  294. package/dist/utils/logger.d.ts.map +1 -0
  295. package/dist/utils/logger.js +69 -0
  296. package/dist/utils/logger.js.map +1 -0
  297. package/dist/utils/obs-capture.d.ts +7 -0
  298. package/dist/utils/obs-capture.d.ts.map +1 -0
  299. package/dist/utils/obs-capture.js +49 -0
  300. package/dist/utils/obs-capture.js.map +1 -0
  301. package/dist/utils/retry.d.ts +11 -0
  302. package/dist/utils/retry.d.ts.map +1 -0
  303. package/dist/utils/retry.js +45 -0
  304. package/dist/utils/retry.js.map +1 -0
  305. package/dist/utils/self-wiring.d.ts +13 -0
  306. package/dist/utils/self-wiring.d.ts.map +1 -0
  307. package/dist/utils/self-wiring.js +86 -0
  308. package/dist/utils/self-wiring.js.map +1 -0
  309. package/dist/utils/state.d.ts +106 -0
  310. package/dist/utils/state.d.ts.map +1 -0
  311. package/dist/utils/state.js +166 -0
  312. package/dist/utils/state.js.map +1 -0
  313. package/dist/utils/status.d.ts +47 -0
  314. package/dist/utils/status.d.ts.map +1 -0
  315. package/dist/utils/status.js +147 -0
  316. package/dist/utils/status.js.map +1 -0
  317. package/dist/utils/ttl-map.d.ts +17 -0
  318. package/dist/utils/ttl-map.d.ts.map +1 -0
  319. package/dist/utils/ttl-map.js +67 -0
  320. package/dist/utils/ttl-map.js.map +1 -0
  321. package/gateway/dist/automation-engine.js +729 -0
  322. package/gateway/dist/chat/chat-sessions.js +95 -0
  323. package/gateway/dist/chat/graph-runner.js +76 -0
  324. package/gateway/dist/chat/index.js +7 -0
  325. package/gateway/dist/chat/intent-classifier.js +23 -0
  326. package/gateway/dist/config.js +416 -0
  327. package/gateway/dist/core/auth.js +96 -0
  328. package/gateway/dist/core/budget-guard.js +52 -0
  329. package/gateway/dist/core/compression/bm25-index.js +176 -0
  330. package/gateway/dist/core/compression/compression-pipeline.js +157 -0
  331. package/gateway/dist/core/compression/compression-strategy-selector.js +32 -0
  332. package/gateway/dist/core/compression/compression-verifier.js +79 -0
  333. package/gateway/dist/core/compression/diff-compressor.js +69 -0
  334. package/gateway/dist/core/compression/hybrid-compressor.js +104 -0
  335. package/gateway/dist/core/compression/lesson-compactor.js +114 -0
  336. package/gateway/dist/core/compression/memory-index.js +190 -0
  337. package/gateway/dist/core/compression/observation-classifier.js +41 -0
  338. package/gateway/dist/core/compression/observation-deduplicator.js +43 -0
  339. package/gateway/dist/core/compression/rrf-fusion.js +63 -0
  340. package/gateway/dist/core/compression/session-pruner.js +137 -0
  341. package/gateway/dist/core/compression/token-budget-allocator.js +141 -0
  342. package/gateway/dist/core/compression/vector-index.js +117 -0
  343. package/gateway/dist/core/compression/zero-token-compressor.js +80 -0
  344. package/gateway/dist/core/cost/cognitive-router.js +41 -0
  345. package/gateway/dist/core/cost/cost-estimator.js +63 -0
  346. package/gateway/dist/core/cost/types.js +19 -0
  347. package/gateway/dist/core/engine/degradation.js +159 -0
  348. package/gateway/dist/core/engine/goal-worktree-manager.js +131 -0
  349. package/gateway/dist/core/engine/lesson-manager.js +222 -0
  350. package/gateway/dist/core/engine/optimistic-sync.js +100 -0
  351. package/gateway/dist/core/engine/phase-orchestrator.js +153 -0
  352. package/gateway/dist/core/engine/report-generator.js +131 -0
  353. package/gateway/dist/core/engine/state-lock.js +91 -0
  354. package/gateway/dist/core/engine/task-branch-manager.js +102 -0
  355. package/gateway/dist/core/engine/wave-dependency.js +67 -0
  356. package/gateway/dist/core/engine/wave-executor.js +112 -0
  357. package/gateway/dist/core/goal-budget.js +63 -0
  358. package/gateway/dist/core/graph/entity-extractor.js +53 -0
  359. package/gateway/dist/core/graph/graph-searcher.js +120 -0
  360. package/gateway/dist/core/graph/knowledge-graph-manager.js +138 -0
  361. package/gateway/dist/core/graph/relation-inferencer.js +67 -0
  362. package/gateway/dist/core/graph/types.js +2 -0
  363. package/gateway/dist/core/hooks/handoff.js +7 -0
  364. package/gateway/dist/core/hooks/hook-manager.js +91 -0
  365. package/gateway/dist/core/hooks/llm-after.js +7 -0
  366. package/gateway/dist/core/hooks/observation-capture.js +19 -0
  367. package/gateway/dist/core/hooks/session-compacting.js +5 -0
  368. package/gateway/dist/core/hooks/session-ending.js +123 -0
  369. package/gateway/dist/core/hooks/session-start.js +51 -0
  370. package/gateway/dist/core/hooks/tool-before.js +5 -0
  371. package/gateway/dist/core/hooks/tool-executed.js +11 -0
  372. package/gateway/dist/core/hooks/user-prompt.js +7 -0
  373. package/gateway/dist/core/index.js +119 -0
  374. package/gateway/dist/core/langchain/agent-adapter.js +39 -0
  375. package/gateway/dist/core/langchain/index.js +12 -0
  376. package/gateway/dist/core/langchain/memory.js +35 -0
  377. package/gateway/dist/core/langchain/node-runner.js +115 -0
  378. package/gateway/dist/core/langchain/retriever.js +28 -0
  379. package/gateway/dist/core/langgraph/checkpointer.js +200 -0
  380. package/gateway/dist/core/langgraph/graph.js +57 -0
  381. package/gateway/dist/core/langgraph/index.js +25 -0
  382. package/gateway/dist/core/langgraph/loop-state.js +71 -0
  383. package/gateway/dist/core/langgraph/nodes/archive.node.js +27 -0
  384. package/gateway/dist/core/langgraph/nodes/execute.node.js +5 -0
  385. package/gateway/dist/core/langgraph/nodes/plan.node.js +101 -0
  386. package/gateway/dist/core/langgraph/nodes/review.node.js +89 -0
  387. package/gateway/dist/core/langgraph/nodes/sync.node.js +70 -0
  388. package/gateway/dist/core/langgraph/review-parser.js +35 -0
  389. package/gateway/dist/core/langgraph/signature-detector.js +23 -0
  390. package/gateway/dist/core/manager/goal-snapshot.js +73 -0
  391. package/gateway/dist/core/manager/milestone-push.js +81 -0
  392. package/gateway/dist/core/manager/question-ledger.js +121 -0
  393. package/gateway/dist/core/manager/system-rule-templates.js +76 -0
  394. package/gateway/dist/core/mcp/tools.js +562 -0
  395. package/gateway/dist/core/mcp/validator.js +165 -0
  396. package/gateway/dist/core/mcp-server.js +86 -0
  397. package/gateway/dist/core/memory/abstraction-distiller.js +44 -0
  398. package/gateway/dist/core/memory/cognitive-graph.js +103 -0
  399. package/gateway/dist/core/memory/energy-system.js +69 -0
  400. package/gateway/dist/core/memory/extractor.js +164 -0
  401. package/gateway/dist/core/memory/harmonic-index.js +530 -0
  402. package/gateway/dist/core/memory/harmonic-types.js +6 -0
  403. package/gateway/dist/core/memory/injector.js +111 -0
  404. package/gateway/dist/core/memory/l5-store.js +141 -0
  405. package/gateway/dist/core/memory/matcher.js +66 -0
  406. package/gateway/dist/core/memory/merger.js +95 -0
  407. package/gateway/dist/core/memory/migrate-v6.1.js +133 -0
  408. package/gateway/dist/core/memory/minhash-merger.js +195 -0
  409. package/gateway/dist/core/memory/observation-service.js +87 -0
  410. package/gateway/dist/core/memory/privacy-filter.js +163 -0
  411. package/gateway/dist/core/memory/reranker.js +208 -0
  412. package/gateway/dist/core/memory/review-scheduler.js +100 -0
  413. package/gateway/dist/core/memory/salience-perceptor.js +24 -0
  414. package/gateway/dist/core/memory/store.js +284 -0
  415. package/gateway/dist/core/memory/t1-store.js +183 -0
  416. package/gateway/dist/core/memory/t1-to-t2-compressor.js +119 -0
  417. package/gateway/dist/core/memory/validator.js +66 -0
  418. package/gateway/dist/core/plugin.js +902 -0
  419. package/gateway/dist/core/skills/mafw-execute/entry.js +226 -0
  420. package/gateway/dist/core/skills/mafw-goal/entry.js +203 -0
  421. package/gateway/dist/core/skills/mafw-plan/entry.js +184 -0
  422. package/gateway/dist/core/skills/mafw-review/entry.js +200 -0
  423. package/gateway/dist/core/storage/file-storage.js +120 -0
  424. package/gateway/dist/core/storage/sqlite-storage.js +205 -0
  425. package/gateway/dist/core/storage/types.js +2 -0
  426. package/gateway/dist/core/tools/archive-worktree.js +208 -0
  427. package/gateway/dist/core/tools/remote-cli.js +106 -0
  428. package/gateway/dist/core/tools/run-ask-user.js +79 -0
  429. package/gateway/dist/core/tools/run-execute-wave.js +32 -0
  430. package/gateway/dist/core/tools/run-plan.js +42 -0
  431. package/gateway/dist/core/tools/run-record-feedback.js +55 -0
  432. package/gateway/dist/core/tools/run-review.js +46 -0
  433. package/gateway/dist/core/tools/write-lesson.js +97 -0
  434. package/gateway/dist/core/utils/circuit-breaker.js +74 -0
  435. package/gateway/dist/core/utils/config-loader.js +203 -0
  436. package/gateway/dist/core/utils/fallback.js +19 -0
  437. package/gateway/dist/core/utils/git.js +70 -0
  438. package/gateway/dist/core/utils/github.js +52 -0
  439. package/gateway/dist/core/utils/global-path.js +41 -0
  440. package/gateway/dist/core/utils/logger.js +71 -0
  441. package/gateway/dist/core/utils/retry.js +44 -0
  442. package/gateway/dist/core/utils/state.js +175 -0
  443. package/gateway/dist/core/utils/status.js +156 -0
  444. package/gateway/dist/cost/service.js +17 -0
  445. package/gateway/dist/dashboard/api.js +1156 -0
  446. package/gateway/dist/dashboard/public/assets/index-DOXm39dm.css +1 -0
  447. package/gateway/dist/dashboard/public/index.html +13 -0
  448. package/gateway/dist/dashboard/server.js +140 -0
  449. package/gateway/dist/dashboard/types.js +2 -0
  450. package/gateway/dist/desktop-client.js +124 -0
  451. package/gateway/dist/eval-endpoint.js +219 -0
  452. package/gateway/dist/event-bus.js +7 -0
  453. package/gateway/dist/feedback/anchor-promotion.js +99 -0
  454. package/gateway/dist/feedback/deferred-memory.js +13 -0
  455. package/gateway/dist/feedback/miss-attribution.js +20 -0
  456. package/gateway/dist/graph/anchor-graph-store.js +113 -0
  457. package/gateway/dist/graph/anchor-graph.js +48 -0
  458. package/gateway/dist/health.js +53 -0
  459. package/gateway/dist/heartbeat.js +109 -0
  460. package/gateway/dist/index.js +6377 -0
  461. package/gateway/dist/interceptors/memory-injector.js +79 -0
  462. package/gateway/dist/ledger.js +121 -0
  463. package/gateway/dist/loop-monitor.js +74 -0
  464. package/gateway/dist/mcp/handlers/add-memory.js +113 -0
  465. package/gateway/dist/mcp/handlers/ask-user.js +63 -0
  466. package/gateway/dist/mcp/handlers/commit-heuristic.js +19 -0
  467. package/gateway/dist/mcp/handlers/create-goal.js +83 -0
  468. package/gateway/dist/mcp/handlers/desktop-click.js +18 -0
  469. package/gateway/dist/mcp/handlers/desktop-get-state.js +15 -0
  470. package/gateway/dist/mcp/handlers/desktop-navigate.js +18 -0
  471. package/gateway/dist/mcp/handlers/desktop-screenshot.js +16 -0
  472. package/gateway/dist/mcp/handlers/desktop-scroll.js +19 -0
  473. package/gateway/dist/mcp/handlers/desktop-type.js +19 -0
  474. package/gateway/dist/mcp/handlers/draft-automation-rule.js +45 -0
  475. package/gateway/dist/mcp/handlers/get-automation-history.js +15 -0
  476. package/gateway/dist/mcp/handlers/get-automation-rule.js +26 -0
  477. package/gateway/dist/mcp/handlers/get-axioms.js +14 -0
  478. package/gateway/dist/mcp/handlers/get-deltas.js +77 -0
  479. package/gateway/dist/mcp/handlers/get-memory.js +67 -0
  480. package/gateway/dist/mcp/handlers/get-model-route.js +16 -0
  481. package/gateway/dist/mcp/handlers/get-triage-item.js +17 -0
  482. package/gateway/dist/mcp/handlers/list-automation-rules.js +24 -0
  483. package/gateway/dist/mcp/handlers/list-triage-items.js +14 -0
  484. package/gateway/dist/mcp/handlers/load-state.js +54 -0
  485. package/gateway/dist/mcp/handlers/manager-answer-question.js +67 -0
  486. package/gateway/dist/mcp/handlers/manager-cancel-goal.js +58 -0
  487. package/gateway/dist/mcp/handlers/manager-get-evidence.js +57 -0
  488. package/gateway/dist/mcp/handlers/manager-get-goal-status.js +58 -0
  489. package/gateway/dist/mcp/handlers/manager-list-goals.js +60 -0
  490. package/gateway/dist/mcp/handlers/manager-list-pending-questions.js +67 -0
  491. package/gateway/dist/mcp/handlers/manager-set-goal.js +78 -0
  492. package/gateway/dist/mcp/handlers/merge-memory.js +184 -0
  493. package/gateway/dist/mcp/handlers/pin-memory.js +53 -0
  494. package/gateway/dist/mcp/handlers/propose-triage-decision.js +38 -0
  495. package/gateway/dist/mcp/handlers/record-feedback.js +59 -0
  496. package/gateway/dist/mcp/handlers/resolve-merge.js +92 -0
  497. package/gateway/dist/mcp/handlers/restart-agent.js +22 -0
  498. package/gateway/dist/mcp/handlers/run-automation.js +28 -0
  499. package/gateway/dist/mcp/handlers/search-hybrid.js +181 -0
  500. package/gateway/dist/mcp/handlers/supersede-memory.js +47 -0
  501. package/gateway/dist/mcp/handlers/update-state.js +59 -0
  502. package/gateway/dist/mcp/handlers/validate-rule.js +39 -0
  503. package/gateway/dist/mcp/sse-transport.js +97 -0
  504. package/gateway/dist/mcp/streamable-endpoint.js +98 -0
  505. package/gateway/dist/mcp/tool-registry.js +630 -0
  506. package/gateway/dist/media/media-agent.js +755 -0
  507. package/gateway/dist/media/media-plugin-loader.js +254 -0
  508. package/gateway/dist/media/media-runtime-executor.js +227 -0
  509. package/gateway/dist/media/media-service.js +199 -0
  510. package/gateway/dist/media/pi-adapter.js +159 -0
  511. package/gateway/dist/media/plugin-context.js +14 -0
  512. package/gateway/dist/media/tts-service.js +173 -0
  513. package/gateway/dist/memory/abstraction-matcher.js +28 -0
  514. package/gateway/dist/memory/consolidation-service.js +209 -0
  515. package/gateway/dist/memory/derived-terms.js +50 -0
  516. package/gateway/dist/memory/embedding-provider.js +330 -0
  517. package/gateway/dist/memory/embedding-runtime.js +174 -0
  518. package/gateway/dist/memory/event-log.js +84 -0
  519. package/gateway/dist/memory/gateway-db.js +465 -0
  520. package/gateway/dist/memory/harmonic-file-store.js +338 -0
  521. package/gateway/dist/memory/llamacpp-provider.js +370 -0
  522. package/gateway/dist/memory/okf-index-renderer.js +61 -0
  523. package/gateway/dist/memory/okf-migrator.js +71 -0
  524. package/gateway/dist/memory/okf-parser.js +57 -0
  525. package/gateway/dist/memory/okf-writer.js +107 -0
  526. package/gateway/dist/memory/service.js +81 -0
  527. package/gateway/dist/memory/t1-db.js +139 -0
  528. package/gateway/dist/memory/unmerge-cleanup.js +82 -0
  529. package/gateway/dist/memory/vector-store.js +246 -0
  530. package/gateway/dist/memory/write-queue.js +31 -0
  531. package/gateway/dist/metrics/collector.js +28 -0
  532. package/gateway/dist/mobile/device-store.js +123 -0
  533. package/gateway/dist/mobile/mdns-advertiser.js +55 -0
  534. package/gateway/dist/mobile/media-proxy.js +292 -0
  535. package/gateway/dist/mobile/pairing.js +139 -0
  536. package/gateway/dist/mobile/push-gateway.js +126 -0
  537. package/gateway/dist/mobile/tts-artifact.js +43 -0
  538. package/gateway/dist/opencode-adapter.js +241 -0
  539. package/gateway/dist/orchestration/outcome-recorder.js +218 -0
  540. package/gateway/dist/orchestration/policy.js +57 -0
  541. package/gateway/dist/orchestration/registry.js +47 -0
  542. package/gateway/dist/plugins/hub.js +188 -0
  543. package/gateway/dist/poll.js +110 -0
  544. package/gateway/dist/python/kernel-service.js +762 -0
  545. package/gateway/dist/recall/constraints-migrate.js +108 -0
  546. package/gateway/dist/recall/data-dir-migrate.js +120 -0
  547. package/gateway/dist/recall/gateway-db-migrate.js +134 -0
  548. package/gateway/dist/recall/index-scan.js +437 -0
  549. package/gateway/dist/recall/inject-format.js +222 -0
  550. package/gateway/dist/recall/legacy-t1-archive.js +86 -0
  551. package/gateway/dist/recall/memory-worker.js +128 -0
  552. package/gateway/dist/recall/pipeline-rules.js +76 -0
  553. package/gateway/dist/recall/recall-context.js +297 -0
  554. package/gateway/dist/recall/reflect-cursor.js +50 -0
  555. package/gateway/dist/recall/reflection.js +318 -0
  556. package/gateway/dist/recall/session-worker-pool.js +100 -0
  557. package/gateway/dist/recall/stale-verify.js +72 -0
  558. package/gateway/dist/recall/step-inject.js +173 -0
  559. package/gateway/dist/recall/time-anchor.js +143 -0
  560. package/gateway/dist/recall/ttl-map.js +72 -0
  561. package/gateway/dist/recall/turn-completion.js +44 -0
  562. package/gateway/dist/recall/turn-pipeline.js +150 -0
  563. package/gateway/dist/recovery.js +158 -0
  564. package/gateway/dist/resources/sdk-session.js +202 -0
  565. package/gateway/dist/retrieval/guided-retriever.js +131 -0
  566. package/gateway/dist/retrieval/idf-stats.js +31 -0
  567. package/gateway/dist/routes/embedding-config.js +100 -0
  568. package/gateway/dist/routes/goal-sessions.js +45 -0
  569. package/gateway/dist/routes/manager-rotate.js +55 -0
  570. package/gateway/dist/routes/media-switch.js +78 -0
  571. package/gateway/dist/routes/model-config.js +132 -0
  572. package/gateway/dist/routes/note-board.js +51 -0
  573. package/gateway/dist/routes/permission.js +43 -0
  574. package/gateway/dist/routes/pinned-recall.js +36 -0
  575. package/gateway/dist/routes/plugins.js +77 -0
  576. package/gateway/dist/routes/restart-agent.js +28 -0
  577. package/gateway/dist/routes/runtime-switch.js +80 -0
  578. package/gateway/dist/routes/session-branch.js +63 -0
  579. package/gateway/dist/routes/session-mutations.js +58 -0
  580. package/gateway/dist/routes/session-summarize.js +49 -0
  581. package/gateway/dist/routes/usage-plugins.js +251 -0
  582. package/gateway/dist/runtime/agent-definition.js +2 -0
  583. package/gateway/dist/runtime/auth.js +80 -0
  584. package/gateway/dist/runtime/completion-http.js +97 -0
  585. package/gateway/dist/runtime/contract.js +37 -0
  586. package/gateway/dist/runtime/loader.js +240 -0
  587. package/gateway/dist/runtime/normalize.js +59 -0
  588. package/gateway/dist/runtime/opencode-runtime.js +336 -0
  589. package/gateway/dist/runtime/pi/pi-agent-config.js +294 -0
  590. package/gateway/dist/runtime/pi/pi-approval-bridge.js +44 -0
  591. package/gateway/dist/runtime/pi/pi-approval-extension.js +62 -0
  592. package/gateway/dist/runtime/pi/pi-events.js +122 -0
  593. package/gateway/dist/runtime/pi/pi-messages.js +20 -0
  594. package/gateway/dist/runtime/pi/pi-provider.js +19 -0
  595. package/gateway/dist/runtime/pi/pi-session-storage.js +44 -0
  596. package/gateway/dist/runtime/pi/pi-session.js +328 -0
  597. package/gateway/dist/runtime/plugins/pi-runtime.js +285 -0
  598. package/gateway/dist/runtime/serve-for-runtime.js +22 -0
  599. package/gateway/dist/runtime/serve-sidecar.js +164 -0
  600. package/gateway/dist/runtime/serve-supervisor.js +80 -0
  601. package/gateway/dist/self-update.js +309 -0
  602. package/gateway/dist/skills/manager-agent-config.js +37 -0
  603. package/gateway/dist/skills/manager-identity.js +11 -0
  604. package/gateway/dist/skills/memory-curator-agent.js +55 -0
  605. package/gateway/dist/trajectory/api.js +154 -0
  606. package/gateway/dist/trajectory/backfill-provider.js +41 -0
  607. package/gateway/dist/trajectory/collector.js +337 -0
  608. package/gateway/dist/trajectory/trajectory-store.js +336 -0
  609. package/gateway/dist/trajectory/types.js +17 -0
  610. package/gateway/dist/tray/index.js +131 -0
  611. package/gateway/dist/tray/tray.ps1 +96 -0
  612. package/gateway/dist/types.js +2 -0
  613. package/gateway/dist/usage/builtin-plugins/commandcode.js +71 -0
  614. package/gateway/dist/usage/builtin-plugins/deepseek.js +56 -0
  615. package/gateway/dist/usage/builtin-plugins/gateway.js +127 -0
  616. package/gateway/dist/usage/builtin-plugins/kimi-for-coding.js +93 -0
  617. package/gateway/dist/usage/builtin-plugins/kimi.js +48 -0
  618. package/gateway/dist/usage/builtin-plugins/opencode-go.js +54 -0
  619. package/gateway/dist/usage/builtin-plugins/openrouter.js +48 -0
  620. package/gateway/dist/usage/builtin-plugins/siliconflow-cn.js +49 -0
  621. package/gateway/dist/usage/builtin-plugins/zhipuai-coding-plan.js +44 -0
  622. package/gateway/dist/usage/model-prices.js +39 -0
  623. package/gateway/dist/usage/model-stats.js +21 -0
  624. package/gateway/dist/usage/plugin-context.js +79 -0
  625. package/gateway/dist/usage/plugin-loader.js +280 -0
  626. package/gateway/dist/usage/templates.js +227 -0
  627. package/gateway/dist/usage/types.js +2 -0
  628. package/gateway/dist/usage/usage-poller.js +216 -0
  629. package/gateway/package.json +37 -0
  630. package/package.json +78 -0
  631. package/packages/tui/dist/cli.js +4664 -0
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.archiveLegacyT1 = archiveLegacyT1;
37
+ // One-time archival of the legacy spiral-*.jsonl T1 observation files (turnID
38
+ // era before the SQLite T1 store). Files move into tier1/archive/ (preserving
39
+ // the goalId subdirectory structure) so nothing is lost. Idempotent via an
40
+ // ARCHIVED marker file.
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const logger_1 = require("../core/utils/logger");
44
+ function archiveLegacyT1(projectDirs) {
45
+ let archived = 0;
46
+ let projects = 0;
47
+ for (const projectDir of projectDirs) {
48
+ const tier1 = path.join(projectDir, '.mafw', 'memory', 'tier1');
49
+ if (!fs.existsSync(tier1))
50
+ continue;
51
+ const archive = path.join(tier1, 'archive');
52
+ if (fs.existsSync(path.join(archive, 'ARCHIVED')))
53
+ continue;
54
+ // spiral files live under tier1/<goalId>/ (and legacy flat tier1/).
55
+ const spiralFiles = [];
56
+ const scan = (dir, relDir) => {
57
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
58
+ if (entry.name === 'archive')
59
+ continue;
60
+ const full = path.join(dir, entry.name);
61
+ if (entry.isDirectory())
62
+ scan(full, path.join(relDir, entry.name));
63
+ else if (entry.name.endsWith('.jsonl'))
64
+ spiralFiles.push({ from: full, rel: path.join(relDir, entry.name) });
65
+ }
66
+ };
67
+ scan(tier1, '');
68
+ if (spiralFiles.length === 0)
69
+ continue;
70
+ try {
71
+ for (const f of spiralFiles) {
72
+ const dest = path.join(archive, f.rel);
73
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
74
+ fs.renameSync(f.from, dest);
75
+ }
76
+ fs.writeFileSync(path.join(archive, 'ARCHIVED'), new Date().toISOString(), 'utf-8');
77
+ archived += spiralFiles.length;
78
+ projects++;
79
+ logger_1.log.info(`[t1-archive] moved ${spiralFiles.length} legacy spiral files to ${archive}`);
80
+ }
81
+ catch (err) {
82
+ logger_1.log.warn(`[t1-archive] failed for ${tier1}: ${err.message}`);
83
+ }
84
+ }
85
+ return { archived, projects };
86
+ }
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ // Persistent LLM execution channel for the memory pipelines. One long-lived
3
+ // gateway-internal session per worker, lazily created and reused (mirrors the
4
+ // /api/llm/compress pattern but uses the synchronous `session.prompt` so the
5
+ // caller gets the extracted text back). Failure invalidates the cached session
6
+ // so the next call re-creates it; sessions rotate periodically to keep the
7
+ // accumulated history (and its token cost) bounded.
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.MemoryWorker = void 0;
10
+ class MemoryWorker {
11
+ client;
12
+ opts;
13
+ sessionId = null;
14
+ label;
15
+ promptCount = 0;
16
+ lastPromptAt = 0;
17
+ constructor(client, opts) {
18
+ this.client = client;
19
+ this.opts = opts;
20
+ this.label = opts.label ?? 'memory-worker';
21
+ }
22
+ /** Lazily (re)create the worker session. Persistent: no rotation — the same
23
+ * session is reused for every prompt; only failures / serve restarts
24
+ * invalidate it. Throws on failure — caller decides fallback. */
25
+ async ensureSession() {
26
+ if (this.sessionId)
27
+ return this.sessionId;
28
+ const created = await this.client.session.create({ directory: this.opts.directory });
29
+ this.sessionId = created?.id ?? null;
30
+ if (!this.sessionId)
31
+ throw new Error('memory worker: failed to create session');
32
+ console.log(`[MemoryWorker] ${this.label} created session ${this.sessionId}`);
33
+ this.opts.onSessionCreated?.(this.sessionId);
34
+ return this.sessionId;
35
+ }
36
+ /**
37
+ * Compact the session after an idle period to bound the per-prompt token cost.
38
+ * Uses opencode's native session.summarize() so the system prefix and recent
39
+ * context survive. Falls back to rotation (dispose + recreate) on failure.
40
+ */
41
+ async maybeCompact(sessionId, model) {
42
+ const compactIdleMs = this.opts.compactIdleMs ?? 8 * 60 * 60 * 1000;
43
+ if (compactIdleMs <= 0)
44
+ return;
45
+ if (this.promptCount === 0 || this.lastPromptAt === 0)
46
+ return;
47
+ const idleMs = Date.now() - this.lastPromptAt;
48
+ if (idleMs < compactIdleMs)
49
+ return;
50
+ const timeoutMs = this.opts.promptTimeoutMs ?? 120_000;
51
+ try {
52
+ const res = await Promise.race([
53
+ this.client.session.summarize({
54
+ sessionID: sessionId,
55
+ ...(model ? { providerID: model.providerID, modelID: model.modelID } : {}),
56
+ }),
57
+ new Promise((_, reject) => {
58
+ const timer = setTimeout(() => reject(new Error(`${this.label}: summarize timed out after ${timeoutMs}ms`)), timeoutMs);
59
+ timer.unref?.();
60
+ }),
61
+ ]);
62
+ const ok = res;
63
+ if (ok === true) {
64
+ console.log(`[MemoryWorker] ${this.label} compacted session ${sessionId}`);
65
+ }
66
+ else {
67
+ console.log(`[MemoryWorker] ${this.label} summarize returned ${ok}; session ${sessionId} kept`);
68
+ }
69
+ }
70
+ catch (err) {
71
+ // Summarize failed — rotate this worker session. A fresh session is
72
+ // cheaper than keeping an ever-growing history.
73
+ console.warn(`[MemoryWorker] ${this.label} summarize failed, rotating: ${err.message}`);
74
+ await this.dispose();
75
+ throw err; // caller sees the prompt-like failure; next prompt creates a new session
76
+ }
77
+ }
78
+ /**
79
+ * Run one extraction/reflection prompt. Returns the assistant text reply.
80
+ * Bounded by promptTimeoutMs (default 120s) so a hung LLM call can never
81
+ * lock the whole pipeline (the action-level guard is skip-once semantics).
82
+ * Any failure invalidates the cached session and rethrows.
83
+ */
84
+ async prompt(message, system, model, agent) {
85
+ const sessionId = await this.ensureSession();
86
+ await this.maybeCompact(sessionId, model);
87
+ const timeoutMs = this.opts.promptTimeoutMs ?? 120_000;
88
+ try {
89
+ const result = await Promise.race([
90
+ this.client.session.prompt({
91
+ sessionID: sessionId,
92
+ parts: [{ type: 'text', text: message }],
93
+ ...(system ? { system } : {}),
94
+ ...(model ? { model } : {}),
95
+ ...(agent ? { agent } : {}),
96
+ }),
97
+ new Promise((_, reject) => {
98
+ const timer = setTimeout(() => reject(new Error(`${this.label}: prompt timed out after ${timeoutMs}ms`)), timeoutMs);
99
+ timer.unref?.(); // never keep the process alive just for the timeout
100
+ }),
101
+ ]);
102
+ const text = (Array.isArray(result?.parts)
103
+ ? result.parts.filter((p) => p?.type === 'text').map((p) => p.text).join('\n')
104
+ : '') || '';
105
+ this.promptCount++;
106
+ this.lastPromptAt = Date.now();
107
+ return text;
108
+ }
109
+ catch (err) {
110
+ this.sessionId = null;
111
+ throw err;
112
+ }
113
+ }
114
+ async dispose() {
115
+ if (this.sessionId) {
116
+ try {
117
+ await this.client.session.delete({ sessionID: this.sessionId });
118
+ }
119
+ catch {
120
+ // ignore
121
+ }
122
+ this.promptCount = 0;
123
+ this.lastPromptAt = 0;
124
+ this.sessionId = null;
125
+ }
126
+ }
127
+ }
128
+ exports.MemoryWorker = MemoryWorker;
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ensureMemoryPipelineRules = ensureMemoryPipelineRules;
37
+ // Idempotent provisioning of the memory-pipeline cron rules
38
+ // (turn-compress hourly, memory-reflect daily). Fresh installs otherwise have
39
+ // no rules and the pipelines never run.
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const logger_1 = require("../core/utils/logger");
43
+ const RULES = [
44
+ { id: 'turn-compress', schedule: '0 * * * *', timezone: 'UTC', action: 'memory:turnCompress' },
45
+ { id: 'memory-reflect', schedule: '0 3 * * *', timezone: 'UTC', action: 'memory:reflect' },
46
+ // Daily energy decay — memories fade by elapsed time (0.005/day base rate).
47
+ { id: 'memory-decay', schedule: '30 3 * * *', timezone: 'UTC', action: 'memory:decay' },
48
+ // Weekly stale-memory verification — the curator re-checks high-value
49
+ // procedural/semantic memories against the live environment (read-only
50
+ // probes) and supersedes contradicted ones (env-probing curation).
51
+ { id: 'memory-review', schedule: '0 4 * * 0', timezone: 'UTC', action: 'memory:review' },
52
+ ];
53
+ function ensureMemoryPipelineRules(mafwDir) {
54
+ const dir = path.join(mafwDir, 'automations');
55
+ for (const rule of RULES) {
56
+ const file = path.join(dir, `${rule.id}.json`);
57
+ if (fs.existsSync(file))
58
+ continue;
59
+ try {
60
+ fs.mkdirSync(dir, { recursive: true });
61
+ fs.writeFileSync(file, JSON.stringify({
62
+ id: rule.id,
63
+ enabled: true,
64
+ trigger: { type: 'cron', schedule: rule.schedule, timezone: rule.timezone },
65
+ action: { type: rule.action },
66
+ skill: '',
67
+ args: {},
68
+ onResult: { type: 'goal' },
69
+ }, null, 2), 'utf-8');
70
+ logger_1.log.info(`[Scheduler] provisioned pipeline rule ${rule.id}`);
71
+ }
72
+ catch (err) {
73
+ logger_1.log.warn(`[Scheduler] failed to provision rule ${rule.id}: ${err.message}`);
74
+ }
75
+ }
76
+ }
@@ -0,0 +1,297 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.blobPenalty = blobPenalty;
4
+ exports.searchRecallMemories = searchRecallMemories;
5
+ exports.mergeScanResults = mergeScanResults;
6
+ exports.searchRecallMemoriesSync = searchRecallMemoriesSync;
7
+ const config_1 = require("../config");
8
+ const logger_1 = require("../core/utils/logger");
9
+ /**
10
+ * Detect multi-hop/comparison questions that need facts from multiple sessions.
11
+ * Returns sub-queries that decompose the question into independent searches.
12
+ */
13
+ function decomposeMultiHopQuery(query) {
14
+ const lower = query.toLowerCase();
15
+ const subQueries = [];
16
+ // Comparison patterns: "how much older/younger", "difference between", "compare", "vs"
17
+ const isComparison = /\b(how much|what is the|difference between|compare|vs\.?|older|younger|more|less|bigger|smaller|higher|lower|faster|slower|better|worse)\b/i.test(query);
18
+ // Temporal/aggregation: "average", "total", "sum", "count", "when did"
19
+ const hasAggregation = /\b(average|total|sum|count|how many|how often|when did|what time|which)\b/i.test(query);
20
+ if (isComparison || hasAggregation) {
21
+ // Extract noun phrases as entity candidates
22
+ // Simple heuristic: words that are not common question words
23
+ const questionWords = new Set(['how', 'what', 'when', 'where', 'why', 'which', 'who', 'whom', 'whose', 'is', 'are', 'was', 'were', 'do', 'does', 'did', 'have', 'has', 'had', 'can', 'could', 'will', 'would', 'should', 'may', 'might', 'shall', 'the', 'a', 'an', 'and', 'or', 'but', 'in', 'on', 'at', 'to', 'for', 'of', 'with', 'by', 'from', 'as', 'into', 'than', 'that', 'this', 'these', 'those', 'it', 'its', 'my', 'your', 'our', 'their', 'his', 'her', 'i', 'me', 'we', 'you', 'they', 'he', 'she']);
24
+ const words = lower.replace(/[^a-z0-9\s]/g, ' ').split(/\s+/).filter(w => w.length >= 2 && !questionWords.has(w));
25
+ // Sub-query 1: personal/user info patterns
26
+ const userPatterns = words.filter(w => /\b(age|birthday|born|live|work|job|salary|income|family|married|single|children|kid|pet|car|house|home|school|college|university|degree|major|hobby|interest|preference|like|dislike|favorite|eat|drink|travel|visit|read|watch|listen)\b/.test(w));
27
+ if (userPatterns.length > 0) {
28
+ subQueries.push('user ' + userPatterns.join(' '));
29
+ }
30
+ // Sub-query 2: entity/topic patterns
31
+ const entityWords = words.filter(w => !userPatterns.includes(w));
32
+ if (entityWords.length > 0) {
33
+ subQueries.push(entityWords.join(' '));
34
+ }
35
+ // Sub-query 3: the full noun phrase (without question words)
36
+ if (words.length >= 2) {
37
+ subQueries.push(words.join(' '));
38
+ }
39
+ }
40
+ return subQueries.slice(0, 4); // Cap at 4 sub-queries
41
+ }
42
+ /**
43
+ * Extract key entities from a query for cross-session topic linking.
44
+ * Looks for quoted strings, camelCase/PascalCase identifiers, ALL_CAPS words,
45
+ * common technical terms, and natural language entity nouns.
46
+ */
47
+ function extractQueryEntities(query) {
48
+ const entities = [];
49
+ // Quoted strings (e.g., "React", 'auth module')
50
+ const quoted = query.match(/['"]([^'"]+)['"]/g);
51
+ if (quoted) {
52
+ for (const q of quoted) {
53
+ const inner = q.slice(1, -1).trim();
54
+ if (inner.length >= 2)
55
+ entities.push(inner);
56
+ }
57
+ }
58
+ // camelCase/PascalCase identifiers (e.g., "getUserAuth", "AuthModule")
59
+ const camelPascal = query.match(/\b[A-Z][a-z]+(?:[A-Z][a-z]+)+\b/g);
60
+ if (camelPascal) {
61
+ for (const c of camelPascal) {
62
+ entities.push(c);
63
+ // Also add split version: "getUserAuth" -> "get User Auth"
64
+ const split = c.replace(/([a-z])([A-Z])/g, '$1 $2');
65
+ if (split !== c)
66
+ entities.push(split);
67
+ }
68
+ }
69
+ // ALL_CAPS words (e.g., "API", "URL", "HTTP")
70
+ const allCaps = query.match(/\b[A-Z]{2,}\b/g);
71
+ if (allCaps) {
72
+ for (const a of allCaps) {
73
+ if (a.length >= 2 && !['THE', 'AND', 'FOR', 'NOT', 'BUT', 'ARE', 'WAS', 'HAS', 'CAN', 'DID', 'DOES'].includes(a)) {
74
+ entities.push(a);
75
+ }
76
+ }
77
+ }
78
+ // Natural language entity nouns (common content words that appear in memories)
79
+ const lower = query.toLowerCase();
80
+ const nlEntities = lower.match(/\b(?:age|birthday|salary|income|department|employee|manager|team|company|project|product|feature|service|server|database|api|endpoint|config|setting|preference|language|framework|library|tool|plugin|extension|theme|template|pattern|convention|standard|protocol|interface|model|schema|type|class|function|method|module|package|library|framework|component|file|directory|path|url|link|user|admin|role|permission|access|session|token|auth|oauth|jwt|deploy|build|test|debug|error|exception|log|monitor|metric|alert|notification|webhook|cron|schedule|timer|cache|queue|stack|tree|graph|node|edge|list|map|set|dict|array|string|number|boolean|null|undefined|true|false|yes|no|ok|done|failed|success|pending|active|inactive|enabled|disabled|public|private|internal|external|local|remote|global|shared|custom|default|primary|secondary|main|sub|child|parent|root|head|tail|first|last|next|prev|current|old|new|temporary|permanent)\b/g);
81
+ if (nlEntities) {
82
+ for (const e of nlEntities) {
83
+ if (e.length >= 3 && !entities.includes(e)) {
84
+ entities.push(e);
85
+ }
86
+ }
87
+ }
88
+ // Deduplicate and return (case-insensitive dedup)
89
+ const seen = new Set();
90
+ const unique = [];
91
+ for (const e of entities) {
92
+ const lower = e.toLowerCase();
93
+ if (!seen.has(lower) && lower.length >= 2) {
94
+ seen.add(lower);
95
+ unique.push(e);
96
+ }
97
+ }
98
+ return unique.slice(0, 10); // Cap at 10 entities
99
+ }
100
+ /**
101
+ * Expand a query by searching for entity-related memories.
102
+ * Uses both entity extraction and multi-hop decomposition to catch
103
+ * cross-session topic links that BM25 might miss.
104
+ */
105
+ function expandQuery(index, query, pushed, topK = 3) {
106
+ const expandedScores = new Map();
107
+ const accumulate = (hits, weight) => {
108
+ const norms = maxNormalize(hits.map(h => h.score));
109
+ hits.forEach((h, i) => {
110
+ if (pushed.has(h.entry.id) || h.entry.superseded_by)
111
+ return;
112
+ const existing = expandedScores.get(h.entry.id) || 0;
113
+ expandedScores.set(h.entry.id, existing + norms[i] * weight);
114
+ });
115
+ };
116
+ // Strategy 1: entity-based expansion (individual entity searches)
117
+ const entities = extractQueryEntities(query);
118
+ for (const entity of entities) {
119
+ const hits = fetchScored(index, entity, topK, {});
120
+ accumulate(hits, 0.4);
121
+ }
122
+ // Strategy 2: multi-hop decomposition (sub-query searches)
123
+ const subQueries = decomposeMultiHopQuery(query);
124
+ for (const sq of subQueries) {
125
+ const hits = fetchScored(index, sq, topK, {});
126
+ accumulate(hits, 0.35);
127
+ }
128
+ // Sort by accumulated score
129
+ return [...expandedScores.entries()]
130
+ .map(([id, score]) => ({ id, score }))
131
+ .sort((a, b) => b.score - a.score)
132
+ .slice(0, topK * 2);
133
+ }
134
+ /** Multi-topic blob abstraction (chained MinHash merges) 鈥?dilutes precision. */
135
+ function blobPenalty(abstraction) {
136
+ const segs = (abstraction || '').split('|').map(s => s.trim()).filter(Boolean).length;
137
+ return segs >= 4 ? 0.5 : 1;
138
+ }
139
+ /**
140
+ * Max-normalize scores to [0,1] (score/max). Deliberately NOT min-max: min-max
141
+ * stretches the weakest candidate to 0, which makes any multiplicative penalty
142
+ * unable to flip order among few candidates and exaggerates raw-score gaps.
143
+ */
144
+ function maxNormalize(values) {
145
+ if (values.length === 0)
146
+ return [];
147
+ const max = Math.max(...values);
148
+ if (max <= 0)
149
+ return values.map(() => 0);
150
+ return values.map(v => v / max);
151
+ }
152
+ /** Fetch scored candidates preferring searchScored (raw scores) with a legacy search() fallback. */
153
+ function fetchScored(index, query, topK, options) {
154
+ if (typeof index.searchScored === 'function') {
155
+ return index.searchScored(query, topK, { retriever: options.retriever ?? 'bm25' }) || [];
156
+ }
157
+ return (index.search(query, topK, options) || []).map((e) => ({ entry: e, score: 0.5 }));
158
+ }
159
+ /**
160
+ * Search recall memories using BM25 + query expansion. This is the *sync*
161
+ * recall path (<50ms): the plugin-side client aborts after 100ms, so the
162
+ * index scan must never be awaited here 鈥?its results arrive via async
163
+ * prefetch snapshots merged by mergeScanResults() instead.
164
+ *
165
+ * Scoring: candidate-set-normalized BM25 脳 blob penalty as the base; expansion
166
+ * hits add norm 脳 0.4 per entity; scan direct/graph hits get fixed boosts
167
+ * (0.35 / 0.2). energy no longer doubles as the score.
168
+ */
169
+ async function searchRecallMemories(index, query, pushed, topK = 3, options = {}) {
170
+ if (!index)
171
+ return [];
172
+ const scored = fetchScored(index, query, topK * 2, options)
173
+ .filter((s) => s.entry && !pushed.has(s.entry.id) && !s.entry.superseded_by);
174
+ const norms = maxNormalize(scored.map((s) => s.score));
175
+ const resultMap = new Map();
176
+ scored.forEach((s, i) => {
177
+ resultMap.set(s.entry.id, {
178
+ id: s.entry.id,
179
+ primary_abstraction: s.entry.primary_abstraction || '',
180
+ memory_value: s.entry.memory_value || s.entry.content || '',
181
+ energy: s.entry.energy || 0,
182
+ score: norms[i] * blobPenalty(s.entry.primary_abstraction),
183
+ type: s.entry.type,
184
+ created_at: s.entry.created_at,
185
+ source: 'bm25',
186
+ });
187
+ });
188
+ // Query expansion: entity / sub-query hits join with a RELATIVE weight
189
+ // (norm 脳 0.4, capped) instead of flat energy 鈥?wide blobs no longer rack
190
+ // up multiples of a constant.
191
+ const expandedResults = expandQuery(index, query, pushed, topK);
192
+ for (const exp of expandedResults) {
193
+ if (resultMap.has(exp.id))
194
+ continue; // Already from BM25 鈥?don't override
195
+ const entry = index.getIndex?.()?.entries?.find((e) => e.id === exp.id);
196
+ if (!entry || entry.superseded_by)
197
+ continue;
198
+ resultMap.set(exp.id, {
199
+ id: exp.id,
200
+ primary_abstraction: entry.primary_abstraction || '',
201
+ memory_value: entry.memory_value || entry.content || '',
202
+ energy: entry.energy || 0,
203
+ score: exp.score * blobPenalty(entry.primary_abstraction),
204
+ type: entry.type,
205
+ created_at: entry.created_at,
206
+ source: 'expansion',
207
+ });
208
+ }
209
+ // Merge scan results if a prefetch snapshot is provided (never awaited 鈥?
210
+ // snapshots are precomputed, so this is a pure in-memory operation).
211
+ const scanSnapshot = options.scanSnapshot;
212
+ if (scanSnapshot && scanSnapshot.relevantIds.length > 0) {
213
+ const expanded = mergeScanResults(resultMap, scanSnapshot, index, pushed);
214
+ logger_1.log.info(`[Recall] bm25=${scored.length} scan=${scanSnapshot.relevantIds.length} expanded=${expanded} union=${resultMap.size} confidence=${scanSnapshot.confidence}`);
215
+ }
216
+ // Sort by score descending, then slice to topK
217
+ const results = [...resultMap.values()]
218
+ .sort((a, b) => b.score - a.score)
219
+ .slice(0, topK);
220
+ return results;
221
+ }
222
+ /**
223
+ * Merge precomputed scan results into a recall result map: anchor-graph 1-hop
224
+ * expansion, dedup against BM25 (BM25 wins, direct scan hits get a +0.3 boost,
225
+ * graph neighbors +0.15). Pure function over in-memory data 鈥?safe to call on
226
+ * the sync recall path with a prefetch snapshot.
227
+ */
228
+ function mergeScanResults(resultMap, scanResult, index, pushed) {
229
+ const indexEntries = index?.getIndex?.()?.entries || [];
230
+ // Anchor graph 1-hop expansion: for each scan-selected ID, bring in its
231
+ // graph neighbors. This catches multi-session relationships that the
232
+ // scan alone might miss (e.g., scan picks "restaurant" but not "hotel
233
+ // near the restaurant" 鈥?the graph edge connects them).
234
+ const graphStore = index?.getAnchorGraphStore?.();
235
+ const expandedIds = new Set(scanResult.relevantIds);
236
+ if (graphStore) {
237
+ for (const id of scanResult.relevantIds) {
238
+ try {
239
+ const neighbors = graphStore.getNeighbors([id], config_1.config.search.graph.maxNeighbors, new Set(scanResult.relevantIds));
240
+ for (const [nbId] of neighbors) {
241
+ expandedIds.add(nbId);
242
+ }
243
+ }
244
+ catch { /* non-fatal */ }
245
+ }
246
+ }
247
+ let expandedCount = 0;
248
+ for (const id of expandedIds) {
249
+ if (resultMap.has(id)) {
250
+ // Already from BM25 鈥?mark as 'both'
251
+ resultMap.get(id).source = 'both';
252
+ continue;
253
+ }
254
+ if (pushed.has(id))
255
+ continue;
256
+ const entry = indexEntries.find((e) => e.id === id);
257
+ if (!entry || entry.superseded_by)
258
+ continue;
259
+ expandedCount++;
260
+ const isDirectScan = scanResult.relevantIds.includes(id);
261
+ const boost = isDirectScan ? 0.35 : 0.2;
262
+ resultMap.set(id, {
263
+ id: entry.id,
264
+ primary_abstraction: entry.primary_abstraction || '',
265
+ memory_value: entry.memory_value || entry.content || '',
266
+ energy: entry.energy || 0,
267
+ score: boost * blobPenalty(entry.primary_abstraction),
268
+ type: entry.type,
269
+ created_at: entry.created_at,
270
+ source: isDirectScan ? 'scan' : 'scan+graph',
271
+ });
272
+ }
273
+ return expandedCount;
274
+ }
275
+ /**
276
+ * Synchronous BM25-only search (backward compatible).
277
+ * Used by step injection and other latency-sensitive paths.
278
+ * Shares the normalized scoring with the async variant.
279
+ */
280
+ function searchRecallMemoriesSync(index, query, pushed, topK = 3, options = {}) {
281
+ if (!index)
282
+ return [];
283
+ const scored = fetchScored(index, query, topK * 2, options)
284
+ .filter((s) => s.entry && !pushed.has(s.entry.id) && !s.entry.superseded_by)
285
+ .slice(0, topK);
286
+ const norms = maxNormalize(scored.map((s) => s.score));
287
+ return scored.map((s, i) => ({
288
+ id: s.entry.id,
289
+ primary_abstraction: s.entry.primary_abstraction || '',
290
+ memory_value: s.entry.memory_value || s.entry.content || '',
291
+ energy: s.entry.energy || 0,
292
+ score: norms[i] * blobPenalty(s.entry.primary_abstraction),
293
+ type: s.entry.type,
294
+ created_at: s.entry.created_at,
295
+ source: 'bm25',
296
+ })).sort((a, b) => b.score - a.score);
297
+ }
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ReflectCursor = exports.MAX_IDS_PER_SESSION = void 0;
4
+ exports.MAX_IDS_PER_SESSION = 500;
5
+ const SCOPE = 'reflect-cursor';
6
+ class ReflectCursor {
7
+ db;
8
+ constructor(db) {
9
+ this.db = db;
10
+ }
11
+ reflectedIds(sessionID) {
12
+ const ids = this.db.kvGet(SCOPE, sessionID);
13
+ return new Set(Array.isArray(ids) ? ids : []);
14
+ }
15
+ isReflected(sessionID, id) {
16
+ const ids = this.db.kvGet(SCOPE, sessionID);
17
+ return Array.isArray(ids) && ids.includes(id);
18
+ }
19
+ /** Mark ids as reflected (atomic single-row upsert). */
20
+ markReflected(sessionID, ids) {
21
+ if (ids.length === 0)
22
+ return;
23
+ const existing = this.db.kvGet(SCOPE, sessionID) ?? [];
24
+ const seen = new Set(existing);
25
+ for (const id of ids) {
26
+ if (!seen.has(id)) {
27
+ seen.add(id);
28
+ existing.push(id);
29
+ }
30
+ }
31
+ // bound the list (prune oldest beyond the cap)
32
+ const trimmed = existing.length > exports.MAX_IDS_PER_SESSION ? existing.slice(-exports.MAX_IDS_PER_SESSION) : existing;
33
+ this.db.kvSet(SCOPE, sessionID, trimmed);
34
+ }
35
+ /** Drop ids that no longer exist in the index (best-effort maintenance). */
36
+ prune(liveIds) {
37
+ for (const { key, value } of this.db.kvAll(SCOPE)) {
38
+ if (!Array.isArray(value))
39
+ continue;
40
+ const kept = value.filter((id) => liveIds.has(id));
41
+ if (kept.length !== value.length) {
42
+ if (kept.length === 0)
43
+ this.db.kvDelete(SCOPE, key);
44
+ else
45
+ this.db.kvSet(SCOPE, key, kept);
46
+ }
47
+ }
48
+ }
49
+ }
50
+ exports.ReflectCursor = ReflectCursor;