@runcore-sh/runcore 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (523) hide show
  1. package/README.md +19 -19
  2. package/brain-template/agents/README.md +20 -0
  3. package/brain-template/identity/README.md +20 -0
  4. package/brain-template/identity/brand.md +25 -0
  5. package/brain-template/identity/principles.md +21 -0
  6. package/brain-template/identity/tone-of-voice.md +23 -0
  7. package/brain-template/knowledge/notes/tier-gated-ui-spec.md +1 -1
  8. package/brain-template/metrics/README.md +13 -0
  9. package/brain-template/operations/goals.yaml +12 -0
  10. package/brain-template/operations/todos.md +17 -0
  11. package/brain-template/ops/README.md +13 -0
  12. package/brain-template/scheduling/README.md +2 -2
  13. package/brain-template/skills/README.md +23 -0
  14. package/brain-template/templates/README.md +9 -0
  15. package/brain-template/training/README.md +20 -0
  16. package/dictionary.json +2 -2
  17. package/dist/activity/log.d.ts +3 -0
  18. package/dist/activity/log.d.ts.map +1 -1
  19. package/dist/activity/log.js +12 -0
  20. package/dist/activity/log.js.map +1 -1
  21. package/dist/agents/autonomous.js +1 -0
  22. package/dist/agents/autonomous.js.map +1 -1
  23. package/dist/agents/commit.d.ts.map +1 -1
  24. package/dist/agents/commit.js +3 -10
  25. package/dist/agents/commit.js.map +1 -1
  26. package/dist/agents/dedup-guard.d.ts.map +1 -1
  27. package/dist/agents/dedup-guard.js +26 -23
  28. package/dist/agents/dedup-guard.js.map +1 -1
  29. package/dist/agents/feed.d.ts +69 -0
  30. package/dist/agents/feed.d.ts.map +1 -0
  31. package/dist/agents/feed.js +176 -0
  32. package/dist/agents/feed.js.map +1 -0
  33. package/dist/agents/governance.d.ts +14 -0
  34. package/dist/agents/governance.d.ts.map +1 -1
  35. package/dist/agents/governance.js +73 -1
  36. package/dist/agents/governance.js.map +1 -1
  37. package/dist/agents/governed-spawn.d.ts +12 -0
  38. package/dist/agents/governed-spawn.d.ts.map +1 -1
  39. package/dist/agents/governed-spawn.js +8 -2
  40. package/dist/agents/governed-spawn.js.map +1 -1
  41. package/dist/agents/index.d.ts +2 -0
  42. package/dist/agents/index.d.ts.map +1 -1
  43. package/dist/agents/index.js +1 -0
  44. package/dist/agents/index.js.map +1 -1
  45. package/dist/agents/issue-reporter.d.ts +15 -0
  46. package/dist/agents/issue-reporter.d.ts.map +1 -0
  47. package/dist/agents/issue-reporter.js +123 -0
  48. package/dist/agents/issue-reporter.js.map +1 -0
  49. package/dist/agents/issues.d.ts +33 -0
  50. package/dist/agents/issues.d.ts.map +1 -0
  51. package/dist/agents/issues.js +141 -0
  52. package/dist/agents/issues.js.map +1 -0
  53. package/dist/agents/reflection.js +3 -3
  54. package/dist/agents/reflection.js.map +1 -1
  55. package/dist/agents/runtime/driver.d.ts.map +1 -1
  56. package/dist/agents/runtime/driver.js +1 -2
  57. package/dist/agents/runtime/driver.js.map +1 -1
  58. package/dist/agents/runtime/manager.d.ts.map +1 -1
  59. package/dist/agents/runtime/manager.js +1 -0
  60. package/dist/agents/runtime/manager.js.map +1 -1
  61. package/dist/agents/runtime/types.d.ts +2 -0
  62. package/dist/agents/runtime/types.d.ts.map +1 -1
  63. package/dist/agents/spawn.d.ts.map +1 -1
  64. package/dist/agents/spawn.js +20 -26
  65. package/dist/agents/spawn.js.map +1 -1
  66. package/dist/agents/store.d.ts.map +1 -1
  67. package/dist/agents/store.js +34 -1
  68. package/dist/agents/store.js.map +1 -1
  69. package/dist/agents/types.d.ts +27 -0
  70. package/dist/agents/types.d.ts.map +1 -1
  71. package/dist/auth/identity.d.ts +3 -0
  72. package/dist/auth/identity.d.ts.map +1 -1
  73. package/dist/auth/identity.js +9 -1
  74. package/dist/auth/identity.js.map +1 -1
  75. package/dist/auth/middleware.d.ts.map +1 -1
  76. package/dist/auth/middleware.js +4 -0
  77. package/dist/auth/middleware.js.map +1 -1
  78. package/dist/calibration/conversation.d.ts +46 -0
  79. package/dist/calibration/conversation.d.ts.map +1 -0
  80. package/dist/calibration/conversation.js +295 -0
  81. package/dist/calibration/conversation.js.map +1 -0
  82. package/dist/calibration/index.d.ts +5 -0
  83. package/dist/calibration/index.d.ts.map +1 -0
  84. package/dist/calibration/index.js +5 -0
  85. package/dist/calibration/index.js.map +1 -0
  86. package/dist/calibration/runner.d.ts +127 -0
  87. package/dist/calibration/runner.d.ts.map +1 -0
  88. package/dist/calibration/runner.js +307 -0
  89. package/dist/calibration/runner.js.map +1 -0
  90. package/dist/calibration/store.d.ts +49 -0
  91. package/dist/calibration/store.d.ts.map +1 -0
  92. package/dist/calibration/store.js +140 -0
  93. package/dist/calibration/store.js.map +1 -0
  94. package/dist/calibration/types.d.ts +93 -0
  95. package/dist/calibration/types.d.ts.map +1 -0
  96. package/dist/calibration/types.js +53 -0
  97. package/dist/calibration/types.js.map +1 -0
  98. package/dist/cli.d.ts +1 -1
  99. package/dist/cli.js +17 -2
  100. package/dist/cli.js.map +1 -1
  101. package/dist/config/index.d.ts +5 -0
  102. package/dist/config/index.d.ts.map +1 -0
  103. package/dist/config/index.js +3 -0
  104. package/dist/config/index.js.map +1 -0
  105. package/dist/config/loader.d.ts +28 -0
  106. package/dist/config/loader.d.ts.map +1 -0
  107. package/dist/config/loader.js +181 -0
  108. package/dist/config/loader.js.map +1 -0
  109. package/dist/config/schema.d.ts +76 -0
  110. package/dist/config/schema.d.ts.map +1 -0
  111. package/dist/config/schema.js +93 -0
  112. package/dist/config/schema.js.map +1 -0
  113. package/dist/dictionary/challenge.d.ts +66 -0
  114. package/dist/dictionary/challenge.d.ts.map +1 -0
  115. package/dist/dictionary/challenge.js +145 -0
  116. package/dist/dictionary/challenge.js.map +1 -0
  117. package/dist/dictionary/client.d.ts +32 -0
  118. package/dist/dictionary/client.d.ts.map +1 -0
  119. package/dist/dictionary/client.js +139 -0
  120. package/dist/dictionary/client.js.map +1 -0
  121. package/dist/dictionary/compatibility.d.ts +8 -0
  122. package/dist/dictionary/compatibility.d.ts.map +1 -0
  123. package/dist/dictionary/compatibility.js +56 -0
  124. package/dist/dictionary/compatibility.js.map +1 -0
  125. package/dist/dictionary/index.d.ts +22 -0
  126. package/dist/dictionary/index.d.ts.map +1 -0
  127. package/dist/dictionary/index.js +15 -0
  128. package/dist/dictionary/index.js.map +1 -0
  129. package/dist/dictionary/matcher.d.ts +18 -0
  130. package/dist/dictionary/matcher.d.ts.map +1 -0
  131. package/dist/dictionary/matcher.js +98 -0
  132. package/dist/dictionary/matcher.js.map +1 -0
  133. package/dist/dictionary/publisher.d.ts +17 -0
  134. package/dist/dictionary/publisher.d.ts.map +1 -0
  135. package/dist/dictionary/publisher.js +156 -0
  136. package/dist/dictionary/publisher.js.map +1 -0
  137. package/dist/dictionary/sync.d.ts +28 -0
  138. package/dist/dictionary/sync.d.ts.map +1 -0
  139. package/dist/dictionary/sync.js +268 -0
  140. package/dist/dictionary/sync.js.map +1 -0
  141. package/dist/dictionary/types.d.ts +75 -0
  142. package/dist/dictionary/types.d.ts.map +1 -0
  143. package/dist/dictionary/types.js +8 -0
  144. package/dist/dictionary/types.js.map +1 -0
  145. package/dist/dictionary/updater.d.ts +23 -0
  146. package/dist/dictionary/updater.d.ts.map +1 -0
  147. package/dist/dictionary/updater.js +84 -0
  148. package/dist/dictionary/updater.js.map +1 -0
  149. package/dist/dictionary/versioning.d.ts +15 -0
  150. package/dist/dictionary/versioning.d.ts.map +1 -0
  151. package/dist/dictionary/versioning.js +52 -0
  152. package/dist/dictionary/versioning.js.map +1 -0
  153. package/dist/errors.d.ts +36 -0
  154. package/dist/errors.d.ts.map +1 -0
  155. package/dist/errors.js +66 -0
  156. package/dist/errors.js.map +1 -0
  157. package/dist/events/event-bus.d.ts +37 -0
  158. package/dist/events/event-bus.d.ts.map +1 -0
  159. package/dist/events/event-bus.js +261 -0
  160. package/dist/events/event-bus.js.map +1 -0
  161. package/dist/events/index.d.ts +3 -0
  162. package/dist/events/index.d.ts.map +1 -0
  163. package/dist/events/index.js +2 -0
  164. package/dist/events/index.js.map +1 -0
  165. package/dist/events/types.d.ts +71 -0
  166. package/dist/events/types.d.ts.map +1 -0
  167. package/dist/events/types.js +7 -0
  168. package/dist/events/types.js.map +1 -0
  169. package/dist/feed/client.d.ts +34 -0
  170. package/dist/feed/client.d.ts.map +1 -0
  171. package/dist/feed/client.js +206 -0
  172. package/dist/feed/client.js.map +1 -0
  173. package/dist/feed/index.d.ts +61 -0
  174. package/dist/feed/index.d.ts.map +1 -0
  175. package/dist/feed/index.js +115 -0
  176. package/dist/feed/index.js.map +1 -0
  177. package/dist/feed/metrics.d.ts +51 -0
  178. package/dist/feed/metrics.d.ts.map +1 -0
  179. package/dist/feed/metrics.js +84 -0
  180. package/dist/feed/metrics.js.map +1 -0
  181. package/dist/feed/mixer.d.ts +89 -0
  182. package/dist/feed/mixer.d.ts.map +1 -0
  183. package/dist/feed/mixer.js +230 -0
  184. package/dist/feed/mixer.js.map +1 -0
  185. package/dist/feed/tiers.d.ts +15 -0
  186. package/dist/feed/tiers.d.ts.map +1 -0
  187. package/dist/feed/tiers.js +75 -0
  188. package/dist/feed/tiers.js.map +1 -0
  189. package/dist/feed/types.d.ts +76 -0
  190. package/dist/feed/types.d.ts.map +1 -0
  191. package/dist/feed/types.js +6 -0
  192. package/dist/feed/types.js.map +1 -0
  193. package/dist/files/registry.d.ts +77 -0
  194. package/dist/files/registry.d.ts.map +1 -0
  195. package/dist/files/registry.js +222 -0
  196. package/dist/files/registry.js.map +1 -0
  197. package/dist/google/plugin.d.ts +17 -0
  198. package/dist/google/plugin.d.ts.map +1 -0
  199. package/dist/google/plugin.js +169 -0
  200. package/dist/google/plugin.js.map +1 -0
  201. package/dist/health/checker.d.ts.map +1 -1
  202. package/dist/health/checker.js +14 -4
  203. package/dist/health/checker.js.map +1 -1
  204. package/dist/health/checks/openrouter.js +1 -1
  205. package/dist/health/checks/openrouter.js.map +1 -1
  206. package/dist/health/checks.d.ts +1 -1
  207. package/dist/health/checks.d.ts.map +1 -1
  208. package/dist/health/checks.js +9 -3
  209. package/dist/health/checks.js.map +1 -1
  210. package/dist/ledger/distance.d.ts +19 -0
  211. package/dist/ledger/distance.d.ts.map +1 -0
  212. package/dist/ledger/distance.js +70 -0
  213. package/dist/ledger/distance.js.map +1 -0
  214. package/dist/ledger/index.d.ts +8 -0
  215. package/dist/ledger/index.d.ts.map +1 -0
  216. package/dist/ledger/index.js +7 -0
  217. package/dist/ledger/index.js.map +1 -0
  218. package/dist/ledger/store.d.ts +27 -0
  219. package/dist/ledger/store.d.ts.map +1 -0
  220. package/dist/ledger/store.js +123 -0
  221. package/dist/ledger/store.js.map +1 -0
  222. package/dist/ledger/types.d.ts +109 -0
  223. package/dist/ledger/types.d.ts.map +1 -0
  224. package/dist/ledger/types.js +57 -0
  225. package/dist/ledger/types.js.map +1 -0
  226. package/dist/literacy.d.ts +50 -0
  227. package/dist/literacy.d.ts.map +1 -0
  228. package/dist/literacy.js +141 -0
  229. package/dist/literacy.js.map +1 -0
  230. package/dist/llm/complete.d.ts.map +1 -1
  231. package/dist/llm/complete.js +36 -3
  232. package/dist/llm/complete.js.map +1 -1
  233. package/dist/llm/fetch-guard.d.ts.map +1 -1
  234. package/dist/llm/fetch-guard.js +2 -0
  235. package/dist/llm/fetch-guard.js.map +1 -1
  236. package/dist/llm/membrane.d.ts +5 -0
  237. package/dist/llm/membrane.d.ts.map +1 -1
  238. package/dist/llm/membrane.js +48 -8
  239. package/dist/llm/membrane.js.map +1 -1
  240. package/dist/llm/nlp-detect.d.ts +17 -0
  241. package/dist/llm/nlp-detect.d.ts.map +1 -0
  242. package/dist/llm/nlp-detect.js +45 -0
  243. package/dist/llm/nlp-detect.js.map +1 -0
  244. package/dist/llm/ollama.d.ts +5 -0
  245. package/dist/llm/ollama.d.ts.map +1 -1
  246. package/dist/llm/ollama.js +39 -1
  247. package/dist/llm/ollama.js.map +1 -1
  248. package/dist/llm/openrouter.d.ts.map +1 -1
  249. package/dist/llm/openrouter.js +17 -1
  250. package/dist/llm/openrouter.js.map +1 -1
  251. package/dist/llm/providers/ollama.d.ts +7 -2
  252. package/dist/llm/providers/ollama.d.ts.map +1 -1
  253. package/dist/llm/providers/ollama.js +109 -17
  254. package/dist/llm/providers/ollama.js.map +1 -1
  255. package/dist/llm/providers/openrouter.js +1 -1
  256. package/dist/llm/providers/openrouter.js.map +1 -1
  257. package/dist/llm/sensitive-registry.d.ts +6 -0
  258. package/dist/llm/sensitive-registry.d.ts.map +1 -1
  259. package/dist/llm/sensitive-registry.js +60 -1
  260. package/dist/llm/sensitive-registry.js.map +1 -1
  261. package/dist/mcp-server.js +25 -18
  262. package/dist/mcp-server.js.map +1 -1
  263. package/dist/metrics/collector.d.ts +6 -0
  264. package/dist/metrics/collector.d.ts.map +1 -1
  265. package/dist/metrics/collector.js +150 -0
  266. package/dist/metrics/collector.js.map +1 -1
  267. package/dist/metrics/types.d.ts +1 -1
  268. package/dist/metrics/types.d.ts.map +1 -1
  269. package/dist/middleware/error-handler.d.ts +13 -0
  270. package/dist/middleware/error-handler.d.ts.map +1 -0
  271. package/dist/middleware/error-handler.js +71 -0
  272. package/dist/middleware/error-handler.js.map +1 -0
  273. package/dist/notifications/channels/adapter.d.ts +28 -0
  274. package/dist/notifications/channels/adapter.d.ts.map +1 -0
  275. package/dist/notifications/channels/adapter.js +55 -0
  276. package/dist/notifications/channels/adapter.js.map +1 -0
  277. package/dist/notifications/channels/index.d.ts +6 -0
  278. package/dist/notifications/channels/index.d.ts.map +1 -0
  279. package/dist/notifications/channels/index.js +6 -0
  280. package/dist/notifications/channels/index.js.map +1 -0
  281. package/dist/notifications/channels/log.d.ts +15 -0
  282. package/dist/notifications/channels/log.d.ts.map +1 -0
  283. package/dist/notifications/channels/log.js +29 -0
  284. package/dist/notifications/channels/log.js.map +1 -0
  285. package/dist/notifications/engine.d.ts +37 -0
  286. package/dist/notifications/engine.d.ts.map +1 -0
  287. package/dist/notifications/engine.js +198 -0
  288. package/dist/notifications/engine.js.map +1 -0
  289. package/dist/notifications/index.d.ts +12 -3
  290. package/dist/notifications/index.d.ts.map +1 -1
  291. package/dist/notifications/index.js +15 -3
  292. package/dist/notifications/index.js.map +1 -1
  293. package/dist/notifications/types.d.ts +97 -0
  294. package/dist/notifications/types.d.ts.map +1 -0
  295. package/dist/notifications/types.js +14 -0
  296. package/dist/notifications/types.js.map +1 -0
  297. package/dist/onboarding/bootstrap.d.ts +51 -0
  298. package/dist/onboarding/bootstrap.d.ts.map +1 -0
  299. package/dist/onboarding/bootstrap.js +92 -0
  300. package/dist/onboarding/bootstrap.js.map +1 -0
  301. package/dist/onboarding/conversation.d.ts +131 -0
  302. package/dist/onboarding/conversation.d.ts.map +1 -0
  303. package/dist/onboarding/conversation.js +259 -0
  304. package/dist/onboarding/conversation.js.map +1 -0
  305. package/dist/onboarding/flow.d.ts +63 -0
  306. package/dist/onboarding/flow.d.ts.map +1 -0
  307. package/dist/onboarding/flow.js +287 -0
  308. package/dist/onboarding/flow.js.map +1 -0
  309. package/dist/onboarding/index.d.ts +17 -0
  310. package/dist/onboarding/index.d.ts.map +1 -0
  311. package/dist/onboarding/index.js +23 -0
  312. package/dist/onboarding/index.js.map +1 -0
  313. package/dist/onboarding/name-extraction.d.ts +42 -0
  314. package/dist/onboarding/name-extraction.d.ts.map +1 -0
  315. package/dist/onboarding/name-extraction.js +164 -0
  316. package/dist/onboarding/name-extraction.js.map +1 -0
  317. package/dist/onboarding/nerve-link.d.ts +23 -0
  318. package/dist/onboarding/nerve-link.d.ts.map +1 -0
  319. package/dist/onboarding/nerve-link.js +24 -0
  320. package/dist/onboarding/nerve-link.js.map +1 -0
  321. package/dist/onboarding/phases.d.ts +66 -0
  322. package/dist/onboarding/phases.d.ts.map +1 -0
  323. package/dist/onboarding/phases.js +167 -0
  324. package/dist/onboarding/phases.js.map +1 -0
  325. package/dist/onboarding/safe-word.d.ts +39 -0
  326. package/dist/onboarding/safe-word.d.ts.map +1 -0
  327. package/dist/onboarding/safe-word.js +90 -0
  328. package/dist/onboarding/safe-word.js.map +1 -0
  329. package/dist/onboarding/types.d.ts +124 -0
  330. package/dist/onboarding/types.d.ts.map +1 -0
  331. package/dist/onboarding/types.js +46 -0
  332. package/dist/onboarding/types.js.map +1 -0
  333. package/dist/openloop/resolution-scanner.d.ts +1 -1
  334. package/dist/openloop/resolution-scanner.d.ts.map +1 -1
  335. package/dist/openloop/resolution-scanner.js +4 -14
  336. package/dist/openloop/resolution-scanner.js.map +1 -1
  337. package/dist/plugins/index.d.ts +24 -0
  338. package/dist/plugins/index.d.ts.map +1 -0
  339. package/dist/plugins/index.js +91 -0
  340. package/dist/plugins/index.js.map +1 -0
  341. package/dist/plugins/status.d.ts +10 -0
  342. package/dist/plugins/status.d.ts.map +1 -0
  343. package/dist/plugins/status.js +12 -0
  344. package/dist/plugins/status.js.map +1 -0
  345. package/dist/posture/index.d.ts +2 -2
  346. package/dist/posture/index.d.ts.map +1 -1
  347. package/dist/posture/index.js +1 -1
  348. package/dist/posture/index.js.map +1 -1
  349. package/dist/posture/types.d.ts +34 -0
  350. package/dist/posture/types.d.ts.map +1 -1
  351. package/dist/posture/types.js +28 -0
  352. package/dist/posture/types.js.map +1 -1
  353. package/dist/pulse/activation-event.d.ts +5 -4
  354. package/dist/pulse/activation-event.d.ts.map +1 -1
  355. package/dist/pulse/activation-event.js +31 -8
  356. package/dist/pulse/activation-event.js.map +1 -1
  357. package/dist/pulse/activation-log.d.ts.map +1 -1
  358. package/dist/pulse/activation-log.js.map +1 -1
  359. package/dist/pulse/index.d.ts +3 -0
  360. package/dist/pulse/index.d.ts.map +1 -1
  361. package/dist/pulse/index.js +4 -0
  362. package/dist/pulse/index.js.map +1 -1
  363. package/dist/pulse/tier.d.ts +67 -0
  364. package/dist/pulse/tier.d.ts.map +1 -0
  365. package/dist/pulse/tier.js +104 -0
  366. package/dist/pulse/tier.js.map +1 -0
  367. package/dist/pulse/work.d.ts +66 -0
  368. package/dist/pulse/work.d.ts.map +1 -0
  369. package/dist/pulse/work.js +117 -0
  370. package/dist/pulse/work.js.map +1 -0
  371. package/dist/runtime-lock.d.ts +51 -0
  372. package/dist/runtime-lock.d.ts.map +1 -0
  373. package/dist/runtime-lock.js +147 -0
  374. package/dist/runtime-lock.js.map +1 -0
  375. package/dist/server.d.ts.map +1 -1
  376. package/dist/server.js +1244 -188
  377. package/dist/server.js.map +1 -1
  378. package/dist/services/whatsapp.js +1 -1
  379. package/dist/services/whatsapp.js.map +1 -1
  380. package/dist/settings.d.ts +15 -0
  381. package/dist/settings.d.ts.map +1 -1
  382. package/dist/settings.js +48 -1
  383. package/dist/settings.js.map +1 -1
  384. package/dist/skills/index.d.ts +2 -2
  385. package/dist/skills/index.d.ts.map +1 -1
  386. package/dist/skills/index.js +2 -2
  387. package/dist/skills/index.js.map +1 -1
  388. package/dist/skills/registry.d.ts +53 -142
  389. package/dist/skills/registry.d.ts.map +1 -1
  390. package/dist/skills/registry.js +249 -611
  391. package/dist/skills/registry.js.map +1 -1
  392. package/dist/stream/emitter.d.ts +36 -0
  393. package/dist/stream/emitter.d.ts.map +1 -0
  394. package/dist/stream/emitter.js +177 -0
  395. package/dist/stream/emitter.js.map +1 -0
  396. package/dist/stream/index.d.ts +4 -0
  397. package/dist/stream/index.d.ts.map +1 -0
  398. package/dist/stream/index.js +3 -0
  399. package/dist/stream/index.js.map +1 -0
  400. package/dist/stream/types.d.ts +100 -0
  401. package/dist/stream/types.d.ts.map +1 -0
  402. package/dist/stream/types.js +19 -0
  403. package/dist/stream/types.js.map +1 -0
  404. package/dist/threads/index.d.ts +3 -0
  405. package/dist/threads/index.d.ts.map +1 -0
  406. package/dist/threads/index.js +2 -0
  407. package/dist/threads/index.js.map +1 -0
  408. package/dist/threads/store.d.ts +36 -0
  409. package/dist/threads/store.d.ts.map +1 -0
  410. package/dist/threads/store.js +171 -0
  411. package/dist/threads/store.js.map +1 -0
  412. package/dist/threads/types.d.ts +16 -0
  413. package/dist/threads/types.d.ts.map +1 -0
  414. package/dist/threads/types.js +6 -0
  415. package/dist/threads/types.js.map +1 -0
  416. package/dist/tick/index.d.ts +10 -0
  417. package/dist/tick/index.d.ts.map +1 -0
  418. package/dist/tick/index.js +8 -0
  419. package/dist/tick/index.js.map +1 -0
  420. package/dist/tick/runner.d.ts +56 -0
  421. package/dist/tick/runner.d.ts.map +1 -0
  422. package/dist/tick/runner.js +235 -0
  423. package/dist/tick/runner.js.map +1 -0
  424. package/dist/tick/types.d.ts +73 -0
  425. package/dist/tick/types.d.ts.map +1 -0
  426. package/dist/tick/types.js +8 -0
  427. package/dist/tick/types.js.map +1 -0
  428. package/dist/tier/types.js +3 -3
  429. package/dist/tier/types.js.map +1 -1
  430. package/dist/ui-sync.d.ts +34 -0
  431. package/dist/ui-sync.d.ts.map +1 -0
  432. package/dist/ui-sync.js +108 -0
  433. package/dist/ui-sync.js.map +1 -0
  434. package/dist/utils/git.d.ts +12 -0
  435. package/dist/utils/git.d.ts.map +1 -0
  436. package/dist/utils/git.js +44 -0
  437. package/dist/utils/git.js.map +1 -0
  438. package/dist/volumes/index.d.ts +3 -0
  439. package/dist/volumes/index.d.ts.map +1 -0
  440. package/dist/volumes/index.js +2 -0
  441. package/dist/volumes/index.js.map +1 -0
  442. package/dist/volumes/manager.d.ts +83 -0
  443. package/dist/volumes/manager.d.ts.map +1 -0
  444. package/dist/volumes/manager.js +462 -0
  445. package/dist/volumes/manager.js.map +1 -0
  446. package/dist/volumes/types.d.ts +66 -0
  447. package/dist/volumes/types.d.ts.map +1 -0
  448. package/dist/volumes/types.js +8 -0
  449. package/dist/volumes/types.js.map +1 -0
  450. package/package.json +8 -5
  451. package/public/avatar/Hey-Dash_en_windows_v4_0_0.zip +0 -0
  452. package/public/avatar/README.md +43 -0
  453. package/public/avatar/cache/06fa55aececcc478.mp4 +0 -0
  454. package/public/avatar/cache/07a65738ba170827.mp4 +0 -0
  455. package/public/avatar/cache/08b6f4880f59a385.mp4 +0 -0
  456. package/public/avatar/cache/0ef9e0e78d715af4.mp4 +0 -0
  457. package/public/avatar/cache/0fa85e9e8f444a8b.mp4 +0 -0
  458. package/public/avatar/cache/1185fd491f413406.mp4 +0 -0
  459. package/public/avatar/cache/1b374d5390258fea.mp4 +0 -0
  460. package/public/avatar/cache/1e2367029b92f8aa.mp4 +0 -0
  461. package/public/avatar/cache/272c004a41087de5.mp4 +0 -0
  462. package/public/avatar/cache/2a0f3ff34d92521a.mp4 +0 -0
  463. package/public/avatar/cache/307a6f70859aeab8.mp4 +0 -0
  464. package/public/avatar/cache/332384e088ca214b.mp4 +0 -0
  465. package/public/avatar/cache/39fc4e81574d14ed.mp4 +0 -0
  466. package/public/avatar/cache/4a5c6051c1ef6a71.mp4 +0 -0
  467. package/public/avatar/cache/51f4aa76398c8c29.mp4 +0 -0
  468. package/public/avatar/cache/5d9a960bbf71732c.mp4 +0 -0
  469. package/public/avatar/cache/5e0954401e15af89.mp4 +0 -0
  470. package/public/avatar/cache/884ae6717fcacdd5.mp4 +0 -0
  471. package/public/avatar/cache/8ea0b7220d139615.mp4 +0 -0
  472. package/public/avatar/cache/9b9c4f7b8508eecc.mp4 +0 -0
  473. package/public/avatar/cache/9be1030ec2aa2b01.mp4 +0 -0
  474. package/public/avatar/cache/b35f7a3d558f22cb.mp4 +0 -0
  475. package/public/avatar/cache/be89f49970672374.mp4 +0 -0
  476. package/public/avatar/cache/c11fdc99479492b6.mp4 +0 -0
  477. package/public/avatar/cache/c900811e3382ac6d.mp4 +0 -0
  478. package/public/avatar/cache/d42a73667acf5716.mp4 +0 -0
  479. package/public/avatar/cache/e539f247a8908603.mp4 +0 -0
  480. package/public/avatar/cache/e78fceae2373b7c1.mp4 +0 -0
  481. package/public/avatar/cache/ec95af57d33b3f07.mp4 +0 -0
  482. package/public/avatar/cache/eeb8d775f40dbe2c.mp4 +0 -0
  483. package/public/avatar/dash_headhshot_v1.png +0 -0
  484. package/public/avatar/idle.mp4 +0 -0
  485. package/public/avatar/photo.png +0 -0
  486. package/public/board.html +6 -0
  487. package/public/browser.html +6 -2
  488. package/public/demo-data/Family Photos/2024/christmas-dinner.txt +13 -0
  489. package/public/demo-data/Family Photos/2025/summer-cookout.txt +13 -0
  490. package/public/demo-data/Financial/Insurance/auto-policy.txt +26 -0
  491. package/public/demo-data/Financial/Insurance/homeowners-policy.txt +20 -0
  492. package/public/demo-data/Financial/Taxes/property-tax-2025.txt +18 -0
  493. package/public/demo-data/Financial/Taxes/w2-2025.txt +18 -0
  494. package/public/demo-data/Health Records/lab-results-2026.txt +26 -0
  495. package/public/demo-data/Health Records/prescription-list.txt +24 -0
  496. package/public/demo-data/Health Records/vaccination-record.csv +8 -0
  497. package/public/demo-data/Legal/Estate/beneficiary-contacts.csv +4 -0
  498. package/public/demo-data/Legal/Estate/will-summary.txt +22 -0
  499. package/public/demo-data/Recipes/christmas-cookies.md +25 -0
  500. package/public/demo-data/Recipes/grandmas-chili.md +30 -0
  501. package/public/demo-data/Work/Contracts/lawn-service-2026.txt +23 -0
  502. package/public/demo-data/Work/Projects/project-status.md +19 -0
  503. package/public/demo-data/passwords.txt +13 -0
  504. package/public/demo-ingest.html +388 -0
  505. package/public/help.html +4 -1
  506. package/public/icon-192.png +0 -0
  507. package/public/icon-512.png +0 -0
  508. package/public/index.html +2641 -574
  509. package/public/library.html +51 -29
  510. package/public/manifest.json +21 -0
  511. package/public/nerve/icon-192.svg +6 -0
  512. package/public/nerve/icon-512.svg +6 -0
  513. package/public/nerve/index.html +698 -0
  514. package/public/nerve/manifest.json +24 -0
  515. package/public/nerve/sw.js +84 -0
  516. package/public/observatory.html +5 -1
  517. package/public/ops.html +33 -3
  518. package/public/pulse.html +3 -0
  519. package/public/registry.html +6 -2
  520. package/public/roadmap.html +7 -2
  521. package/public/sw.js +65 -0
  522. package/brain-template/registry.md +0 -566
  523. package/brain-template/rest_api-integration.md +0 -522
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Feed module — public API.
3
+ * Wires FeedClient + MixingEngine + Metrics into a single facade.
4
+ *
5
+ * Portability: Field/compost resonance is injectable via ResonanceComputer.
6
+ * Without it, the feed works — compost signals are simply skipped.
7
+ */
8
+ import { MixingEngine, type ResonanceComputer, type FieldShape } from "./mixer.js";
9
+ import type { FeedConfig, FeedTier, MixedInsight, FeedStatus } from "./types.js";
10
+ import type { LongTermMemoryStore } from "../memory/long-term.js";
11
+ import type { WorkingMemory } from "../types.js";
12
+ export interface FeedOptions {
13
+ config: FeedConfig;
14
+ ltm: LongTermMemoryStore;
15
+ /** Optional resonance computer for compost signal filtering. */
16
+ resonanceComputer?: ResonanceComputer;
17
+ /** Optional initial field shape for compost resonance. */
18
+ fieldShape?: FieldShape;
19
+ }
20
+ export declare class Feed {
21
+ private client;
22
+ private mixer;
23
+ private metricsCollector;
24
+ private ltm;
25
+ private workingMemory;
26
+ private unsubscribe;
27
+ constructor(options: FeedOptions);
28
+ /** Start the feed. Brain/agents/nerves work without this — it's additive. */
29
+ start(): void;
30
+ /** Stop the feed. Everything else keeps working. */
31
+ stop(): void;
32
+ /** Update working memory reference (call each turn so mixer has fresh context). */
33
+ setWorkingMemory(wm: WorkingMemory): void;
34
+ /** Update the local field shape (refreshes resonance in the mixer). */
35
+ setFieldShape(shape: FieldShape): void;
36
+ /** Set the resonance computer for compost signal processing. */
37
+ setResonanceComputer(computer: ResonanceComputer): void;
38
+ /** Get mixed insights relevant to a query, for injection into context assembly. */
39
+ getInsightsForContext(query: string, limit?: number): MixedInsight[];
40
+ /** Get all recent insights sorted by relevance. */
41
+ getInsights(limit?: number): MixedInsight[];
42
+ /** Format insights as a context block for injection into supporting content. */
43
+ formatInsightsForContext(query: string, limit?: number): string;
44
+ /** Current tier. */
45
+ get tier(): FeedTier;
46
+ /** Update subscription tier. */
47
+ setTier(tier: FeedTier): void;
48
+ /** Feed health status. */
49
+ getStatus(): FeedStatus;
50
+ /** Feed metrics for dashboards/reporting. */
51
+ getMetrics(): import("./metrics.js").FeedMetrics;
52
+ /** Access the mixing engine for custom strategy registration. */
53
+ getMixer(): MixingEngine;
54
+ private handleNewItems;
55
+ }
56
+ export type { FeedConfig, FeedItem, FeedTier, FeedSignalType, FeedStatus, MixedInsight, TierCapabilities, } from "./types.js";
57
+ export { FeedClient } from "./client.js";
58
+ export { MixingEngine, type MixStrategy, type LocalContext, type BrainStats, type ResonanceComputer, type FieldShape, type CompostSignal, type ResonanceResult } from "./mixer.js";
59
+ export { FeedMetricsCollector, type FeedMetrics } from "./metrics.js";
60
+ export { getTierCapabilities, tierMeetsMinimum, filterByTier, isSignalAvailable } from "./tiers.js";
61
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/feed/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAEnF,OAAO,KAAK,EAAE,UAAU,EAAY,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,GAAG,EAAE,mBAAmB,CAAC;IACzB,gEAAgE;IAChE,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,0DAA0D;IAC1D,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,qBAAa,IAAI;IACf,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,WAAW,CAA6B;gBAEpC,OAAO,EAAE,WAAW;IAchC,6EAA6E;IAC7E,KAAK,IAAI,IAAI;IAKb,oDAAoD;IACpD,IAAI,IAAI,IAAI;IAQZ,mFAAmF;IACnF,gBAAgB,CAAC,EAAE,EAAE,aAAa,GAAG,IAAI;IAIzC,uEAAuE;IACvE,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAItC,gEAAgE;IAChE,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAIvD,mFAAmF;IACnF,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,YAAY,EAAE;IAQ/D,mDAAmD;IACnD,WAAW,CAAC,KAAK,SAAK,GAAG,YAAY,EAAE;IAIvC,gFAAgF;IAChF,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,MAAM;IAU1D,oBAAoB;IACpB,IAAI,IAAI,IAAI,QAAQ,CAEnB;IAED,gCAAgC;IAChC,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAK7B,0BAA0B;IAC1B,SAAS,IAAI,UAAU;IASvB,6CAA6C;IAC7C,UAAU;IAIV,iEAAiE;IACjE,QAAQ,IAAI,YAAY;YAMV,cAAc;CAY7B;AAGD,YAAY,EACV,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,UAAU,EACV,YAAY,EACZ,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,UAAU,EAAE,KAAK,iBAAiB,EAAE,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AACnL,OAAO,EAAE,oBAAoB,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Feed module — public API.
3
+ * Wires FeedClient + MixingEngine + Metrics into a single facade.
4
+ *
5
+ * Portability: Field/compost resonance is injectable via ResonanceComputer.
6
+ * Without it, the feed works — compost signals are simply skipped.
7
+ */
8
+ import { FeedClient } from "./client.js";
9
+ import { MixingEngine } from "./mixer.js";
10
+ import { FeedMetricsCollector } from "./metrics.js";
11
+ export class Feed {
12
+ client;
13
+ mixer;
14
+ metricsCollector;
15
+ ltm;
16
+ workingMemory = null;
17
+ unsubscribe = null;
18
+ constructor(options) {
19
+ this.client = new FeedClient(options.config);
20
+ this.mixer = new MixingEngine();
21
+ this.metricsCollector = new FeedMetricsCollector(options.config.tier);
22
+ this.ltm = options.ltm;
23
+ if (options.resonanceComputer) {
24
+ this.mixer.setResonanceComputer(options.resonanceComputer);
25
+ }
26
+ if (options.fieldShape) {
27
+ this.mixer.setFieldShape(options.fieldShape);
28
+ }
29
+ }
30
+ /** Start the feed. Brain/agents/nerves work without this — it's additive. */
31
+ start() {
32
+ this.unsubscribe = this.client.onItems(items => this.handleNewItems(items));
33
+ this.client.start();
34
+ }
35
+ /** Stop the feed. Everything else keeps working. */
36
+ stop() {
37
+ this.client.stop();
38
+ if (this.unsubscribe) {
39
+ this.unsubscribe();
40
+ this.unsubscribe = null;
41
+ }
42
+ }
43
+ /** Update working memory reference (call each turn so mixer has fresh context). */
44
+ setWorkingMemory(wm) {
45
+ this.workingMemory = wm;
46
+ }
47
+ /** Update the local field shape (refreshes resonance in the mixer). */
48
+ setFieldShape(shape) {
49
+ this.mixer.setFieldShape(shape);
50
+ }
51
+ /** Set the resonance computer for compost signal processing. */
52
+ setResonanceComputer(computer) {
53
+ this.mixer.setResonanceComputer(computer);
54
+ }
55
+ /** Get mixed insights relevant to a query, for injection into context assembly. */
56
+ getInsightsForContext(query, limit = 3) {
57
+ const insights = this.mixer.getRelevantInsights(query, limit);
58
+ for (const _ of insights) {
59
+ this.metricsCollector.recordInsightSurfaced();
60
+ }
61
+ return insights;
62
+ }
63
+ /** Get all recent insights sorted by relevance. */
64
+ getInsights(limit = 10) {
65
+ return this.mixer.getInsights(limit);
66
+ }
67
+ /** Format insights as a context block for injection into supporting content. */
68
+ formatInsightsForContext(query, limit = 3) {
69
+ const insights = this.getInsightsForContext(query, limit);
70
+ if (insights.length === 0)
71
+ return "";
72
+ const lines = insights.map(i => `- [${i.feedSignalType}] ${i.insight} (relevance: ${(i.relevance * 100).toFixed(0)}%)`);
73
+ return `Feed insights:\n${lines.join("\n")}`;
74
+ }
75
+ /** Current tier. */
76
+ get tier() {
77
+ return this.client.getStatus().tier;
78
+ }
79
+ /** Update subscription tier. */
80
+ setTier(tier) {
81
+ this.client.setTier(tier);
82
+ this.metricsCollector.setTier(tier);
83
+ }
84
+ /** Feed health status. */
85
+ getStatus() {
86
+ const clientStatus = this.client.getStatus();
87
+ return {
88
+ ...clientStatus,
89
+ insightsGenerated: this.mixer.insightCount,
90
+ avgRelevance: this.mixer.avgRelevance,
91
+ };
92
+ }
93
+ /** Feed metrics for dashboards/reporting. */
94
+ getMetrics() {
95
+ return this.metricsCollector.getMetrics();
96
+ }
97
+ /** Access the mixing engine for custom strategy registration. */
98
+ getMixer() {
99
+ return this.mixer;
100
+ }
101
+ // --- Private ---
102
+ async handleNewItems(items) {
103
+ this.metricsCollector.setConnected(true);
104
+ this.metricsCollector.recordItemsReceived(items.length, items.map(i => i.type));
105
+ const insights = await this.mixer.mix(items, this.ltm, this.workingMemory);
106
+ if (insights.length > 0) {
107
+ this.metricsCollector.recordInsights(insights);
108
+ }
109
+ }
110
+ }
111
+ export { FeedClient } from "./client.js";
112
+ export { MixingEngine } from "./mixer.js";
113
+ export { FeedMetricsCollector } from "./metrics.js";
114
+ export { getTierCapabilities, tierMeetsMinimum, filterByTier, isSignalAvailable } from "./tiers.js";
115
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/feed/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Feed metrics — measure feed value and engagement.
3
+ * Tracks whether the feed is earning its price.
4
+ */
5
+ import type { FeedTier, FeedSignalType, MixedInsight, FeedStatus } from "./types.js";
6
+ export interface FeedMetrics {
7
+ /** Total feed items received since startup. */
8
+ itemsReceived: number;
9
+ /** Items by signal type. */
10
+ itemsByType: Partial<Record<FeedSignalType, number>>;
11
+ /** Total insights generated by the mixing engine. */
12
+ insightsGenerated: number;
13
+ /** Insights that were surfaced to the user (injected into context). */
14
+ insightsSurfaced: number;
15
+ /** Average relevance score of generated insights. */
16
+ avgRelevance: number;
17
+ /** Feed uptime ratio (connected time / total time). */
18
+ uptimeRatio: number;
19
+ /** Current tier. */
20
+ tier: FeedTier;
21
+ /** Timestamp of first item received. */
22
+ firstItemAt: string | null;
23
+ /** Timestamp of most recent item. */
24
+ lastItemAt: string | null;
25
+ }
26
+ export declare class FeedMetricsCollector {
27
+ private itemsReceived;
28
+ private itemsByType;
29
+ private insightsGenerated;
30
+ private insightsSurfaced;
31
+ private relevanceSum;
32
+ private connectedMs;
33
+ private totalMs;
34
+ private lastTickAt;
35
+ private connected;
36
+ private tier;
37
+ private firstItemAt;
38
+ private lastItemAt;
39
+ constructor(tier: FeedTier);
40
+ /** Call periodically (or before reading metrics) to update uptime tracking. */
41
+ tick(): void;
42
+ recordItemsReceived(count: number, types: FeedSignalType[]): void;
43
+ recordInsights(insights: MixedInsight[]): void;
44
+ recordInsightSurfaced(): void;
45
+ setConnected(connected: boolean): void;
46
+ setTier(tier: FeedTier): void;
47
+ getMetrics(): FeedMetrics;
48
+ /** Snapshot for feed status reporting. */
49
+ toFeedStatus(cachedItems: number): FeedStatus;
50
+ }
51
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/feed/metrics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAErF,MAAM,WAAW,WAAW;IAC1B,+CAA+C;IAC/C,aAAa,EAAE,MAAM,CAAC;IACtB,4BAA4B;IAC5B,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;IACrD,qDAAqD;IACrD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uEAAuE;IACvE,gBAAgB,EAAE,MAAM,CAAC;IACzB,qDAAqD;IACrD,YAAY,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB;IACpB,IAAI,EAAE,QAAQ,CAAC;IACf,wCAAwC;IACxC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,qCAAqC;IACrC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,WAAW,CAA+C;IAClE,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,IAAI,CAAW;IACvB,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,UAAU,CAAuB;gBAE7B,IAAI,EAAE,QAAQ;IAI1B,+EAA+E;IAC/E,IAAI,IAAI,IAAI;IAUZ,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI;IAUjE,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI;IAO9C,qBAAqB,IAAI,IAAI;IAI7B,YAAY,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IAKtC,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAI7B,UAAU,IAAI,WAAW;IAezB,0CAA0C;IAC1C,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU;CAW9C"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Feed metrics — measure feed value and engagement.
3
+ * Tracks whether the feed is earning its price.
4
+ */
5
+ export class FeedMetricsCollector {
6
+ itemsReceived = 0;
7
+ itemsByType = {};
8
+ insightsGenerated = 0;
9
+ insightsSurfaced = 0;
10
+ relevanceSum = 0;
11
+ connectedMs = 0;
12
+ totalMs = 0;
13
+ lastTickAt = Date.now();
14
+ connected = false;
15
+ tier;
16
+ firstItemAt = null;
17
+ lastItemAt = null;
18
+ constructor(tier) {
19
+ this.tier = tier;
20
+ }
21
+ /** Call periodically (or before reading metrics) to update uptime tracking. */
22
+ tick() {
23
+ const now = Date.now();
24
+ const elapsed = now - this.lastTickAt;
25
+ this.totalMs += elapsed;
26
+ if (this.connected) {
27
+ this.connectedMs += elapsed;
28
+ }
29
+ this.lastTickAt = now;
30
+ }
31
+ recordItemsReceived(count, types) {
32
+ this.itemsReceived += count;
33
+ const now = new Date().toISOString();
34
+ if (!this.firstItemAt)
35
+ this.firstItemAt = now;
36
+ this.lastItemAt = now;
37
+ for (const t of types) {
38
+ this.itemsByType[t] = (this.itemsByType[t] ?? 0) + 1;
39
+ }
40
+ }
41
+ recordInsights(insights) {
42
+ this.insightsGenerated += insights.length;
43
+ for (const i of insights) {
44
+ this.relevanceSum += i.relevance;
45
+ }
46
+ }
47
+ recordInsightSurfaced() {
48
+ this.insightsSurfaced++;
49
+ }
50
+ setConnected(connected) {
51
+ this.tick();
52
+ this.connected = connected;
53
+ }
54
+ setTier(tier) {
55
+ this.tier = tier;
56
+ }
57
+ getMetrics() {
58
+ this.tick();
59
+ return {
60
+ itemsReceived: this.itemsReceived,
61
+ itemsByType: { ...this.itemsByType },
62
+ insightsGenerated: this.insightsGenerated,
63
+ insightsSurfaced: this.insightsSurfaced,
64
+ avgRelevance: this.insightsGenerated > 0 ? this.relevanceSum / this.insightsGenerated : 0,
65
+ uptimeRatio: this.totalMs > 0 ? this.connectedMs / this.totalMs : 0,
66
+ tier: this.tier,
67
+ firstItemAt: this.firstItemAt,
68
+ lastItemAt: this.lastItemAt,
69
+ };
70
+ }
71
+ /** Snapshot for feed status reporting. */
72
+ toFeedStatus(cachedItems) {
73
+ this.tick();
74
+ return {
75
+ connected: this.connected,
76
+ tier: this.tier,
77
+ lastReceivedAt: this.lastItemAt,
78
+ itemsCached: cachedItems,
79
+ insightsGenerated: this.insightsGenerated,
80
+ avgRelevance: this.insightsGenerated > 0 ? this.relevanceSum / this.insightsGenerated : 0,
81
+ };
82
+ }
83
+ }
84
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/feed/metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * MixingEngine — the core of the feed business model.
3
+ * Combines public/paid feed signal with private local brain data.
4
+ *
5
+ * KEY INVARIANT: Private data never leaves this host.
6
+ * The mix is computed locally. runcore.sh never sees the result.
7
+ *
8
+ * Portability: ResonanceComputer is injectable. The compost/field system
9
+ * injects the concrete implementation at runtime. Without it, compost
10
+ * signals are simply skipped — all other strategies work standalone.
11
+ */
12
+ import type { FeedItem, MixedInsight, FeedSignalType } from "./types.js";
13
+ import type { MemoryEntry, WorkingMemory } from "../types.js";
14
+ import type { LongTermMemoryStore } from "../memory/long-term.js";
15
+ /** Shape of a field — opaque to the mixer, interpreted by the resonance computer. */
16
+ export type FieldShape = Record<string, number>;
17
+ /** Compost signal extracted from a feed item payload. */
18
+ export interface CompostSignal {
19
+ id: string;
20
+ signalType: string;
21
+ pattern: Record<string, unknown>;
22
+ originShape: FieldShape;
23
+ producedAt: string;
24
+ receivedAt: string;
25
+ }
26
+ /** Result of computing resonance between a compost signal and a local field. */
27
+ export interface ResonanceResult {
28
+ score: number;
29
+ shouldSurface: boolean;
30
+ dimensions: Array<{
31
+ dimension: string;
32
+ similarity: number;
33
+ }>;
34
+ }
35
+ /** Injectable interface for computing compost resonance. */
36
+ export interface ResonanceComputer {
37
+ compute(signal: CompostSignal, localShape: FieldShape): ResonanceResult;
38
+ }
39
+ /** Strategy for mixing a specific signal type with local data. */
40
+ export interface MixStrategy {
41
+ signalType: FeedSignalType;
42
+ /** Compute a mixed insight from a feed item + local context. Returns null if not relevant. */
43
+ mix(item: FeedItem, localContext: LocalContext): MixedInsight | null;
44
+ }
45
+ /** Local context snapshot provided to mix strategies. Never transmitted. */
46
+ export interface LocalContext {
47
+ recentMemories: MemoryEntry[];
48
+ workingMemory: WorkingMemory | null;
49
+ /** Summary stats about the brain (counts, not content). */
50
+ brainStats: BrainStats;
51
+ }
52
+ export interface BrainStats {
53
+ totalMemories: number;
54
+ episodicCount: number;
55
+ semanticCount: number;
56
+ proceduralCount: number;
57
+ activeGoal: string | null;
58
+ agentCount: number;
59
+ }
60
+ export declare class MixingEngine {
61
+ private strategies;
62
+ private insights;
63
+ private maxInsights;
64
+ private fieldShape;
65
+ private resonanceComputer;
66
+ constructor();
67
+ /** Set the local field shape for compost resonance filtering. */
68
+ setFieldShape(shape: FieldShape): void;
69
+ /** Set the resonance computer for compost signal processing. */
70
+ setResonanceComputer(computer: ResonanceComputer): void;
71
+ private createCompostStrategy;
72
+ /** Register a custom mix strategy for a signal type. */
73
+ registerStrategy(strategy: MixStrategy): void;
74
+ /**
75
+ * Mix a batch of feed items with local brain context.
76
+ * Returns only the insights that are relevant (relevance > 0).
77
+ */
78
+ mix(items: FeedItem[], ltm: LongTermMemoryStore, workingMemory: WorkingMemory | null): Promise<MixedInsight[]>;
79
+ /** Get recent mixed insights, sorted by relevance. */
80
+ getInsights(limit?: number): MixedInsight[];
81
+ /** Get insights relevant to a query (simple keyword match on insight text). */
82
+ getRelevantInsights(query: string, limit?: number): MixedInsight[];
83
+ /** Total insights generated (for metrics). */
84
+ get insightCount(): number;
85
+ /** Average relevance of stored insights. */
86
+ get avgRelevance(): number;
87
+ private buildLocalContext;
88
+ }
89
+ //# sourceMappingURL=mixer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mixer.d.ts","sourceRoot":"","sources":["../../src/feed/mixer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAIlE,qFAAqF;AACrF,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEhD,yDAAyD;AACzD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,WAAW,EAAE,UAAU,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,gFAAgF;AAChF,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9D;AAED,4DAA4D;AAC5D,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,GAAG,eAAe,CAAC;CACzE;AAID,kEAAkE;AAClE,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,cAAc,CAAC;IAC3B,8FAA8F;IAC9F,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,GAAG,YAAY,GAAG,IAAI,CAAC;CACtE;AAED,4EAA4E;AAC5E,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,WAAW,EAAE,CAAC;IAC9B,aAAa,EAAE,aAAa,GAAG,IAAI,CAAC;IACpC,2DAA2D;IAC3D,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,WAAW,CAAO;IAC1B,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,iBAAiB,CAAkC;;IAW3D,iEAAiE;IACjE,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAItC,gEAAgE;IAChE,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAIvD,OAAO,CAAC,qBAAqB;IAoC7B,wDAAwD;IACxD,gBAAgB,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IAI7C;;;OAGG;IACG,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,mBAAmB,EAAE,aAAa,EAAE,aAAa,GAAG,IAAI,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAuBpH,sDAAsD;IACtD,WAAW,CAAC,KAAK,SAAK,GAAG,YAAY,EAAE;IAMvC,+EAA+E;IAC/E,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,YAAY,EAAE;IAU7D,8CAA8C;IAC9C,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,4CAA4C;IAC5C,IAAI,YAAY,IAAI,MAAM,CAIzB;YAEa,iBAAiB;CAyBhC"}
@@ -0,0 +1,230 @@
1
+ /**
2
+ * MixingEngine — the core of the feed business model.
3
+ * Combines public/paid feed signal with private local brain data.
4
+ *
5
+ * KEY INVARIANT: Private data never leaves this host.
6
+ * The mix is computed locally. runcore.sh never sees the result.
7
+ *
8
+ * Portability: ResonanceComputer is injectable. The compost/field system
9
+ * injects the concrete implementation at runtime. Without it, compost
10
+ * signals are simply skipped — all other strategies work standalone.
11
+ */
12
+ // ─── Engine ─────────────────────────────────────────────────────────────────
13
+ export class MixingEngine {
14
+ strategies = new Map();
15
+ insights = [];
16
+ maxInsights = 100;
17
+ fieldShape = null;
18
+ resonanceComputer = null;
19
+ constructor() {
20
+ // Register built-in strategies
21
+ this.registerStrategy(patternIntelligenceStrategy);
22
+ this.registerStrategy(securityPatchStrategy);
23
+ this.registerStrategy(dictionaryUpdateStrategy);
24
+ this.registerStrategy(communitySignalStrategy);
25
+ this.registerStrategy(this.createCompostStrategy());
26
+ }
27
+ /** Set the local field shape for compost resonance filtering. */
28
+ setFieldShape(shape) {
29
+ this.fieldShape = shape;
30
+ }
31
+ /** Set the resonance computer for compost signal processing. */
32
+ setResonanceComputer(computer) {
33
+ this.resonanceComputer = computer;
34
+ }
35
+ createCompostStrategy() {
36
+ return {
37
+ signalType: "compost",
38
+ mix: (item, _ctx) => {
39
+ if (!this.fieldShape || !this.resonanceComputer)
40
+ return null;
41
+ // Extract compost signal from feed item payload
42
+ const signal = {
43
+ id: item.id,
44
+ signalType: item.payload["signalType"] ?? "unknown",
45
+ pattern: item.payload["pattern"] ?? {},
46
+ originShape: item.payload["originShape"],
47
+ producedAt: item.publishedAt,
48
+ receivedAt: item.receivedAt,
49
+ };
50
+ if (!signal.originShape)
51
+ return null;
52
+ const result = this.resonanceComputer.compute(signal, this.fieldShape);
53
+ if (!result.shouldSurface)
54
+ return null;
55
+ return {
56
+ feedItemId: item.id,
57
+ feedSignalType: "compost",
58
+ insight: `Compost pattern "${item.title}" resonates with your field (${(result.score * 100).toFixed(0)}%). Signal type: ${signal.signalType}.`,
59
+ relevance: result.score,
60
+ localSources: result.dimensions
61
+ .filter(d => d.similarity > 0.7)
62
+ .map(d => d.dimension),
63
+ mixedAt: new Date().toISOString(),
64
+ };
65
+ },
66
+ };
67
+ }
68
+ /** Register a custom mix strategy for a signal type. */
69
+ registerStrategy(strategy) {
70
+ this.strategies.set(strategy.signalType, strategy);
71
+ }
72
+ /**
73
+ * Mix a batch of feed items with local brain context.
74
+ * Returns only the insights that are relevant (relevance > 0).
75
+ */
76
+ async mix(items, ltm, workingMemory) {
77
+ const localContext = await this.buildLocalContext(ltm, workingMemory);
78
+ const newInsights = [];
79
+ for (const item of items) {
80
+ const strategy = this.strategies.get(item.type);
81
+ if (!strategy)
82
+ continue;
83
+ const insight = strategy.mix(item, localContext);
84
+ if (insight && insight.relevance > 0) {
85
+ newInsights.push(insight);
86
+ }
87
+ }
88
+ // Store insights
89
+ this.insights.push(...newInsights);
90
+ if (this.insights.length > this.maxInsights) {
91
+ this.insights = this.insights.slice(-this.maxInsights);
92
+ }
93
+ return newInsights;
94
+ }
95
+ /** Get recent mixed insights, sorted by relevance. */
96
+ getInsights(limit = 10) {
97
+ return [...this.insights]
98
+ .sort((a, b) => b.relevance - a.relevance)
99
+ .slice(0, limit);
100
+ }
101
+ /** Get insights relevant to a query (simple keyword match on insight text). */
102
+ getRelevantInsights(query, limit = 5) {
103
+ const terms = query.toLowerCase().split(/\s+/).filter(t => t.length > 2);
104
+ if (terms.length === 0)
105
+ return this.getInsights(limit);
106
+ return this.insights
107
+ .filter(i => terms.some(t => i.insight.toLowerCase().includes(t)))
108
+ .sort((a, b) => b.relevance - a.relevance)
109
+ .slice(0, limit);
110
+ }
111
+ /** Total insights generated (for metrics). */
112
+ get insightCount() {
113
+ return this.insights.length;
114
+ }
115
+ /** Average relevance of stored insights. */
116
+ get avgRelevance() {
117
+ if (this.insights.length === 0)
118
+ return 0;
119
+ const sum = this.insights.reduce((acc, i) => acc + i.relevance, 0);
120
+ return sum / this.insights.length;
121
+ }
122
+ async buildLocalContext(ltm, workingMemory) {
123
+ const [episodic, semantic, procedural] = await Promise.all([
124
+ ltm.list("episodic"),
125
+ ltm.list("semantic"),
126
+ ltm.list("procedural"),
127
+ ]);
128
+ const allMemories = [...episodic, ...semantic, ...procedural];
129
+ const recentMemories = allMemories
130
+ .sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime())
131
+ .slice(0, 50); // last 50 for mix context
132
+ return {
133
+ recentMemories,
134
+ workingMemory,
135
+ brainStats: {
136
+ totalMemories: allMemories.length,
137
+ episodicCount: episodic.length,
138
+ semanticCount: semantic.length,
139
+ proceduralCount: procedural.length,
140
+ activeGoal: workingMemory?.activeGoal ?? null,
141
+ agentCount: 0, // populated by caller if needed
142
+ },
143
+ };
144
+ }
145
+ }
146
+ // --- Built-in mix strategies ---
147
+ const patternIntelligenceStrategy = {
148
+ signalType: "pattern_intelligence",
149
+ mix(item, ctx) {
150
+ const pattern = item.payload["pattern"];
151
+ if (!pattern)
152
+ return null;
153
+ // Check if pattern is relevant to local brain state
154
+ const patternTerms = pattern.toLowerCase().split(/\s+/).filter(t => t.length > 3);
155
+ const matchingMemories = ctx.recentMemories.filter(m => patternTerms.some(t => m.content.toLowerCase().includes(t)));
156
+ if (matchingMemories.length === 0)
157
+ return null;
158
+ const relevance = Math.min(1, matchingMemories.length / 5);
159
+ const localSources = [...new Set(matchingMemories.map(m => m.type))];
160
+ return {
161
+ feedItemId: item.id,
162
+ feedSignalType: item.type,
163
+ insight: `Field pattern "${item.title}" may apply to your brain. ${matchingMemories.length} local memories relate to this pattern.`,
164
+ relevance,
165
+ localSources,
166
+ mixedAt: new Date().toISOString(),
167
+ };
168
+ },
169
+ };
170
+ const securityPatchStrategy = {
171
+ signalType: "security_patch",
172
+ mix(item, _ctx) {
173
+ // Security patches are always relevant
174
+ return {
175
+ feedItemId: item.id,
176
+ feedSignalType: item.type,
177
+ insight: `Security update: ${item.title}. Apply immediately.`,
178
+ relevance: 1.0,
179
+ localSources: ["membrane"],
180
+ mixedAt: new Date().toISOString(),
181
+ };
182
+ },
183
+ };
184
+ const dictionaryUpdateStrategy = {
185
+ signalType: "dictionary_update",
186
+ mix(item, ctx) {
187
+ const topics = item.payload["topics"] ?? [];
188
+ if (topics.length === 0) {
189
+ return {
190
+ feedItemId: item.id,
191
+ feedSignalType: item.type,
192
+ insight: `Dictionary update: ${item.title}.`,
193
+ relevance: 0.5,
194
+ localSources: [],
195
+ mixedAt: new Date().toISOString(),
196
+ };
197
+ }
198
+ // Check overlap with local procedural/semantic knowledge
199
+ const matchCount = ctx.recentMemories.filter(m => topics.some(t => m.content.toLowerCase().includes(t.toLowerCase()))).length;
200
+ const relevance = matchCount > 0 ? Math.min(1, 0.3 + matchCount * 0.15) : 0.3;
201
+ return {
202
+ feedItemId: item.id,
203
+ feedSignalType: item.type,
204
+ insight: `Dictionary update: ${item.title}. ${matchCount > 0 ? `Touches ${matchCount} areas of your existing knowledge.` : "New area for your brain."}`,
205
+ relevance,
206
+ localSources: matchCount > 0 ? ["semantic", "procedural"] : [],
207
+ mixedAt: new Date().toISOString(),
208
+ };
209
+ },
210
+ };
211
+ const communitySignalStrategy = {
212
+ signalType: "community_signal",
213
+ mix(item, ctx) {
214
+ const trend = item.payload["trend"];
215
+ if (!trend)
216
+ return null;
217
+ // Light relevance based on brain size — more active brains benefit more from community signal
218
+ const relevance = ctx.brainStats.totalMemories > 100 ? 0.6 :
219
+ ctx.brainStats.totalMemories > 10 ? 0.4 : 0.2;
220
+ return {
221
+ feedItemId: item.id,
222
+ feedSignalType: item.type,
223
+ insight: `Community trend: ${item.title}. ${trend}`,
224
+ relevance,
225
+ localSources: ["aggregate"],
226
+ mixedAt: new Date().toISOString(),
227
+ };
228
+ },
229
+ };
230
+ //# sourceMappingURL=mixer.js.map