wispy-ai 0.1.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 (471) hide show
  1. package/.env.example +20 -0
  2. package/LICENSE +21 -0
  3. package/README.md +232 -0
  4. package/bin/wispy.js +3 -0
  5. package/dist/a2a/delegation.d.ts +19 -0
  6. package/dist/a2a/delegation.d.ts.map +1 -0
  7. package/dist/a2a/delegation.js +156 -0
  8. package/dist/a2a/delegation.js.map +1 -0
  9. package/dist/a2a/peer.d.ts +19 -0
  10. package/dist/a2a/peer.d.ts.map +1 -0
  11. package/dist/a2a/peer.js +27 -0
  12. package/dist/a2a/peer.js.map +1 -0
  13. package/dist/a2a/protocol.d.ts +36 -0
  14. package/dist/a2a/protocol.d.ts.map +1 -0
  15. package/dist/a2a/protocol.js +23 -0
  16. package/dist/a2a/protocol.js.map +1 -0
  17. package/dist/agents/collaboration.d.ts +59 -0
  18. package/dist/agents/collaboration.d.ts.map +1 -0
  19. package/dist/agents/collaboration.js +110 -0
  20. package/dist/agents/collaboration.js.map +1 -0
  21. package/dist/agents/orchestrator.d.ts +59 -0
  22. package/dist/agents/orchestrator.d.ts.map +1 -0
  23. package/dist/agents/orchestrator.js +171 -0
  24. package/dist/agents/orchestrator.js.map +1 -0
  25. package/dist/agents/tool-executor.d.ts +36 -0
  26. package/dist/agents/tool-executor.d.ts.map +1 -0
  27. package/dist/agents/tool-executor.js +363 -0
  28. package/dist/agents/tool-executor.js.map +1 -0
  29. package/dist/agents/types/coder.d.ts +10 -0
  30. package/dist/agents/types/coder.d.ts.map +1 -0
  31. package/dist/agents/types/coder.js +43 -0
  32. package/dist/agents/types/coder.js.map +1 -0
  33. package/dist/agents/types/data.d.ts +7 -0
  34. package/dist/agents/types/data.d.ts.map +1 -0
  35. package/dist/agents/types/data.js +30 -0
  36. package/dist/agents/types/data.js.map +1 -0
  37. package/dist/agents/types/designer.d.ts +7 -0
  38. package/dist/agents/types/designer.d.ts.map +1 -0
  39. package/dist/agents/types/designer.js +30 -0
  40. package/dist/agents/types/designer.js.map +1 -0
  41. package/dist/agents/types/devops.d.ts +7 -0
  42. package/dist/agents/types/devops.d.ts.map +1 -0
  43. package/dist/agents/types/devops.js +30 -0
  44. package/dist/agents/types/devops.js.map +1 -0
  45. package/dist/agents/types/planner.d.ts +7 -0
  46. package/dist/agents/types/planner.d.ts.map +1 -0
  47. package/dist/agents/types/planner.js +35 -0
  48. package/dist/agents/types/planner.js.map +1 -0
  49. package/dist/agents/types/researcher.d.ts +10 -0
  50. package/dist/agents/types/researcher.d.ts.map +1 -0
  51. package/dist/agents/types/researcher.js +33 -0
  52. package/dist/agents/types/researcher.js.map +1 -0
  53. package/dist/agents/types/security.d.ts +7 -0
  54. package/dist/agents/types/security.d.ts.map +1 -0
  55. package/dist/agents/types/security.js +30 -0
  56. package/dist/agents/types/security.js.map +1 -0
  57. package/dist/agents/types/writer.d.ts +7 -0
  58. package/dist/agents/types/writer.d.ts.map +1 -0
  59. package/dist/agents/types/writer.js +30 -0
  60. package/dist/agents/types/writer.js.map +1 -0
  61. package/dist/agents/workspace.d.ts +61 -0
  62. package/dist/agents/workspace.d.ts.map +1 -0
  63. package/dist/agents/workspace.js +115 -0
  64. package/dist/agents/workspace.js.map +1 -0
  65. package/dist/ai/embeddings.d.ts +4 -0
  66. package/dist/ai/embeddings.d.ts.map +1 -0
  67. package/dist/ai/embeddings.js +20 -0
  68. package/dist/ai/embeddings.js.map +1 -0
  69. package/dist/ai/gemini.d.ts +31 -0
  70. package/dist/ai/gemini.d.ts.map +1 -0
  71. package/dist/ai/gemini.js +121 -0
  72. package/dist/ai/gemini.js.map +1 -0
  73. package/dist/ai/model-registry.d.ts +73 -0
  74. package/dist/ai/model-registry.d.ts.map +1 -0
  75. package/dist/ai/model-registry.js +86 -0
  76. package/dist/ai/model-registry.js.map +1 -0
  77. package/dist/ai/prompts.d.ts +3 -0
  78. package/dist/ai/prompts.d.ts.map +1 -0
  79. package/dist/ai/prompts.js +42 -0
  80. package/dist/ai/prompts.js.map +1 -0
  81. package/dist/ai/providers/ollama.d.ts +22 -0
  82. package/dist/ai/providers/ollama.d.ts.map +1 -0
  83. package/dist/ai/providers/ollama.js +144 -0
  84. package/dist/ai/providers/ollama.js.map +1 -0
  85. package/dist/ai/providers/openai-compat.d.ts +25 -0
  86. package/dist/ai/providers/openai-compat.d.ts.map +1 -0
  87. package/dist/ai/providers/openai-compat.js +141 -0
  88. package/dist/ai/providers/openai-compat.js.map +1 -0
  89. package/dist/ai/router.d.ts +10 -0
  90. package/dist/ai/router.d.ts.map +1 -0
  91. package/dist/ai/router.js +23 -0
  92. package/dist/ai/router.js.map +1 -0
  93. package/dist/ai/tools.d.ts +15 -0
  94. package/dist/ai/tools.d.ts.map +1 -0
  95. package/dist/ai/tools.js +134 -0
  96. package/dist/ai/tools.js.map +1 -0
  97. package/dist/autostart/service.d.ts +24 -0
  98. package/dist/autostart/service.d.ts.map +1 -0
  99. package/dist/autostart/service.js +202 -0
  100. package/dist/autostart/service.js.map +1 -0
  101. package/dist/channels/dock.d.ts +22 -0
  102. package/dist/channels/dock.d.ts.map +1 -0
  103. package/dist/channels/dock.js +21 -0
  104. package/dist/channels/dock.js.map +1 -0
  105. package/dist/channels/rest/adapter.d.ts +4 -0
  106. package/dist/channels/rest/adapter.d.ts.map +1 -0
  107. package/dist/channels/rest/adapter.js +86 -0
  108. package/dist/channels/rest/adapter.js.map +1 -0
  109. package/dist/channels/telegram/adapter.d.ts +3 -0
  110. package/dist/channels/telegram/adapter.d.ts.map +1 -0
  111. package/dist/channels/telegram/adapter.js +56 -0
  112. package/dist/channels/telegram/adapter.js.map +1 -0
  113. package/dist/cli/commands.d.ts +17 -0
  114. package/dist/cli/commands.d.ts.map +1 -0
  115. package/dist/cli/commands.js +258 -0
  116. package/dist/cli/commands.js.map +1 -0
  117. package/dist/cli/doctor.d.ts +8 -0
  118. package/dist/cli/doctor.d.ts.map +1 -0
  119. package/dist/cli/doctor.js +34 -0
  120. package/dist/cli/doctor.js.map +1 -0
  121. package/dist/cli/history.d.ts +9 -0
  122. package/dist/cli/history.d.ts.map +1 -0
  123. package/dist/cli/history.js +32 -0
  124. package/dist/cli/history.js.map +1 -0
  125. package/dist/cli/postinstall.d.ts +5 -0
  126. package/dist/cli/postinstall.d.ts.map +1 -0
  127. package/dist/cli/postinstall.js +20 -0
  128. package/dist/cli/postinstall.js.map +1 -0
  129. package/dist/cli/program.d.ts +3 -0
  130. package/dist/cli/program.d.ts.map +1 -0
  131. package/dist/cli/program.js +537 -0
  132. package/dist/cli/program.js.map +1 -0
  133. package/dist/cli/repl.d.ts +7 -0
  134. package/dist/cli/repl.d.ts.map +1 -0
  135. package/dist/cli/repl.js +132 -0
  136. package/dist/cli/repl.js.map +1 -0
  137. package/dist/cli/setup/wizard.d.ts +17 -0
  138. package/dist/cli/setup/wizard.d.ts.map +1 -0
  139. package/dist/cli/setup/wizard.js +157 -0
  140. package/dist/cli/setup/wizard.js.map +1 -0
  141. package/dist/cli/ui/banner.d.ts +2 -0
  142. package/dist/cli/ui/banner.d.ts.map +1 -0
  143. package/dist/cli/ui/banner.js +9 -0
  144. package/dist/cli/ui/banner.js.map +1 -0
  145. package/dist/cli/ui/renderer.d.ts +6 -0
  146. package/dist/cli/ui/renderer.d.ts.map +1 -0
  147. package/dist/cli/ui/renderer.js +55 -0
  148. package/dist/cli/ui/renderer.js.map +1 -0
  149. package/dist/cli/ui/spinner.d.ts +7 -0
  150. package/dist/cli/ui/spinner.d.ts.map +1 -0
  151. package/dist/cli/ui/spinner.js +31 -0
  152. package/dist/cli/ui/spinner.js.map +1 -0
  153. package/dist/cli/ui/theme.d.ts +21 -0
  154. package/dist/cli/ui/theme.d.ts.map +1 -0
  155. package/dist/cli/ui/theme.js +28 -0
  156. package/dist/cli/ui/theme.js.map +1 -0
  157. package/dist/cli/ui/tool-display.d.ts +9 -0
  158. package/dist/cli/ui/tool-display.d.ts.map +1 -0
  159. package/dist/cli/ui/tool-display.js +19 -0
  160. package/dist/cli/ui/tool-display.js.map +1 -0
  161. package/dist/cli/voice/stt.d.ts +37 -0
  162. package/dist/cli/voice/stt.d.ts.map +1 -0
  163. package/dist/cli/voice/stt.js +115 -0
  164. package/dist/cli/voice/stt.js.map +1 -0
  165. package/dist/cli/voice/tts.d.ts +35 -0
  166. package/dist/cli/voice/tts.d.ts.map +1 -0
  167. package/dist/cli/voice/tts.js +142 -0
  168. package/dist/cli/voice/tts.js.map +1 -0
  169. package/dist/cli/voice/voice-mode.d.ts +35 -0
  170. package/dist/cli/voice/voice-mode.d.ts.map +1 -0
  171. package/dist/cli/voice/voice-mode.js +89 -0
  172. package/dist/cli/voice/voice-mode.js.map +1 -0
  173. package/dist/config/config.d.ts +5 -0
  174. package/dist/config/config.d.ts.map +1 -0
  175. package/dist/config/config.js +68 -0
  176. package/dist/config/config.js.map +1 -0
  177. package/dist/config/hot-reload.d.ts +3 -0
  178. package/dist/config/hot-reload.d.ts.map +1 -0
  179. package/dist/config/hot-reload.js +21 -0
  180. package/dist/config/hot-reload.js.map +1 -0
  181. package/dist/config/schema.d.ts +48 -0
  182. package/dist/config/schema.d.ts.map +1 -0
  183. package/dist/config/schema.js +105 -0
  184. package/dist/config/schema.js.map +1 -0
  185. package/dist/content/pipeline.d.ts +12 -0
  186. package/dist/content/pipeline.d.ts.map +1 -0
  187. package/dist/content/pipeline.js +55 -0
  188. package/dist/content/pipeline.js.map +1 -0
  189. package/dist/content/publisher.d.ts +26 -0
  190. package/dist/content/publisher.d.ts.map +1 -0
  191. package/dist/content/publisher.js +101 -0
  192. package/dist/content/publisher.js.map +1 -0
  193. package/dist/core/agent.d.ts +37 -0
  194. package/dist/core/agent.d.ts.map +1 -0
  195. package/dist/core/agent.js +170 -0
  196. package/dist/core/agent.js.map +1 -0
  197. package/dist/core/heartbeat.d.ts +15 -0
  198. package/dist/core/heartbeat.d.ts.map +1 -0
  199. package/dist/core/heartbeat.js +70 -0
  200. package/dist/core/heartbeat.js.map +1 -0
  201. package/dist/core/identity.d.ts +13 -0
  202. package/dist/core/identity.d.ts.map +1 -0
  203. package/dist/core/identity.js +16 -0
  204. package/dist/core/identity.js.map +1 -0
  205. package/dist/core/memory.d.ts +11 -0
  206. package/dist/core/memory.d.ts.map +1 -0
  207. package/dist/core/memory.js +58 -0
  208. package/dist/core/memory.js.map +1 -0
  209. package/dist/core/session.d.ts +29 -0
  210. package/dist/core/session.d.ts.map +1 -0
  211. package/dist/core/session.js +59 -0
  212. package/dist/core/session.js.map +1 -0
  213. package/dist/core/thinking.d.ts +3 -0
  214. package/dist/core/thinking.d.ts.map +1 -0
  215. package/dist/core/thinking.js +27 -0
  216. package/dist/core/thinking.js.map +1 -0
  217. package/dist/cron/service.d.ts +24 -0
  218. package/dist/cron/service.d.ts.map +1 -0
  219. package/dist/cron/service.js +74 -0
  220. package/dist/cron/service.js.map +1 -0
  221. package/dist/entry.d.ts +2 -0
  222. package/dist/entry.d.ts.map +1 -0
  223. package/dist/entry.js +26 -0
  224. package/dist/entry.js.map +1 -0
  225. package/dist/gateway/boot.d.ts +9 -0
  226. package/dist/gateway/boot.d.ts.map +1 -0
  227. package/dist/gateway/boot.js +64 -0
  228. package/dist/gateway/boot.js.map +1 -0
  229. package/dist/gateway/client.d.ts +19 -0
  230. package/dist/gateway/client.d.ts.map +1 -0
  231. package/dist/gateway/client.js +64 -0
  232. package/dist/gateway/client.js.map +1 -0
  233. package/dist/gateway/protocol/index.d.ts +41 -0
  234. package/dist/gateway/protocol/index.d.ts.map +1 -0
  235. package/dist/gateway/protocol/index.js +30 -0
  236. package/dist/gateway/protocol/index.js.map +1 -0
  237. package/dist/gateway/server.d.ts +9 -0
  238. package/dist/gateway/server.d.ts.map +1 -0
  239. package/dist/gateway/server.js +147 -0
  240. package/dist/gateway/server.js.map +1 -0
  241. package/dist/index.d.ts +10 -0
  242. package/dist/index.d.ts.map +1 -0
  243. package/dist/index.js +10 -0
  244. package/dist/index.js.map +1 -0
  245. package/dist/infra/dotenv.d.ts +2 -0
  246. package/dist/infra/dotenv.d.ts.map +1 -0
  247. package/dist/infra/dotenv.js +7 -0
  248. package/dist/infra/dotenv.js.map +1 -0
  249. package/dist/infra/logger.d.ts +4 -0
  250. package/dist/infra/logger.d.ts.map +1 -0
  251. package/dist/infra/logger.js +12 -0
  252. package/dist/infra/logger.js.map +1 -0
  253. package/dist/infra/ports.d.ts +2 -0
  254. package/dist/infra/ports.d.ts.map +1 -0
  255. package/dist/infra/ports.js +12 -0
  256. package/dist/infra/ports.js.map +1 -0
  257. package/dist/integrations/ai-models/anthropic.d.ts +15 -0
  258. package/dist/integrations/ai-models/anthropic.d.ts.map +1 -0
  259. package/dist/integrations/ai-models/anthropic.js +91 -0
  260. package/dist/integrations/ai-models/anthropic.js.map +1 -0
  261. package/dist/integrations/ai-models/ollama.d.ts +17 -0
  262. package/dist/integrations/ai-models/ollama.d.ts.map +1 -0
  263. package/dist/integrations/ai-models/ollama.js +113 -0
  264. package/dist/integrations/ai-models/ollama.js.map +1 -0
  265. package/dist/integrations/ai-models/openai.d.ts +19 -0
  266. package/dist/integrations/ai-models/openai.d.ts.map +1 -0
  267. package/dist/integrations/ai-models/openai.js +136 -0
  268. package/dist/integrations/ai-models/openai.js.map +1 -0
  269. package/dist/integrations/base.d.ts +102 -0
  270. package/dist/integrations/base.d.ts.map +1 -0
  271. package/dist/integrations/base.js +44 -0
  272. package/dist/integrations/base.js.map +1 -0
  273. package/dist/integrations/categories.d.ts +13 -0
  274. package/dist/integrations/categories.d.ts.map +1 -0
  275. package/dist/integrations/categories.js +69 -0
  276. package/dist/integrations/categories.js.map +1 -0
  277. package/dist/integrations/chat/discord.d.ts +19 -0
  278. package/dist/integrations/chat/discord.d.ts.map +1 -0
  279. package/dist/integrations/chat/discord.js +122 -0
  280. package/dist/integrations/chat/discord.js.map +1 -0
  281. package/dist/integrations/chat/slack.d.ts +19 -0
  282. package/dist/integrations/chat/slack.d.ts.map +1 -0
  283. package/dist/integrations/chat/slack.js +113 -0
  284. package/dist/integrations/chat/slack.js.map +1 -0
  285. package/dist/integrations/chat/whatsapp.d.ts +18 -0
  286. package/dist/integrations/chat/whatsapp.d.ts.map +1 -0
  287. package/dist/integrations/chat/whatsapp.js +115 -0
  288. package/dist/integrations/chat/whatsapp.js.map +1 -0
  289. package/dist/integrations/credential-manager.d.ts +68 -0
  290. package/dist/integrations/credential-manager.d.ts.map +1 -0
  291. package/dist/integrations/credential-manager.js +156 -0
  292. package/dist/integrations/credential-manager.js.map +1 -0
  293. package/dist/integrations/google/calendar.d.ts +17 -0
  294. package/dist/integrations/google/calendar.d.ts.map +1 -0
  295. package/dist/integrations/google/calendar.js +126 -0
  296. package/dist/integrations/google/calendar.js.map +1 -0
  297. package/dist/integrations/google/docs.d.ts +19 -0
  298. package/dist/integrations/google/docs.d.ts.map +1 -0
  299. package/dist/integrations/google/docs.js +153 -0
  300. package/dist/integrations/google/docs.js.map +1 -0
  301. package/dist/integrations/google/drive.d.ts +17 -0
  302. package/dist/integrations/google/drive.d.ts.map +1 -0
  303. package/dist/integrations/google/drive.js +130 -0
  304. package/dist/integrations/google/drive.js.map +1 -0
  305. package/dist/integrations/google/gmail.d.ts +19 -0
  306. package/dist/integrations/google/gmail.d.ts.map +1 -0
  307. package/dist/integrations/google/gmail.js +124 -0
  308. package/dist/integrations/google/gmail.js.map +1 -0
  309. package/dist/integrations/google/maps.d.ts +20 -0
  310. package/dist/integrations/google/maps.d.ts.map +1 -0
  311. package/dist/integrations/google/maps.js +115 -0
  312. package/dist/integrations/google/maps.js.map +1 -0
  313. package/dist/integrations/google/meet.d.ts +16 -0
  314. package/dist/integrations/google/meet.d.ts.map +1 -0
  315. package/dist/integrations/google/meet.js +104 -0
  316. package/dist/integrations/google/meet.js.map +1 -0
  317. package/dist/integrations/google/oauth.d.ts +39 -0
  318. package/dist/integrations/google/oauth.d.ts.map +1 -0
  319. package/dist/integrations/google/oauth.js +134 -0
  320. package/dist/integrations/google/oauth.js.map +1 -0
  321. package/dist/integrations/google/search.d.ts +15 -0
  322. package/dist/integrations/google/search.d.ts.map +1 -0
  323. package/dist/integrations/google/search.js +66 -0
  324. package/dist/integrations/google/search.js.map +1 -0
  325. package/dist/integrations/google/sheets.d.ts +17 -0
  326. package/dist/integrations/google/sheets.d.ts.map +1 -0
  327. package/dist/integrations/google/sheets.js +118 -0
  328. package/dist/integrations/google/sheets.js.map +1 -0
  329. package/dist/integrations/google/youtube.d.ts +19 -0
  330. package/dist/integrations/google/youtube.d.ts.map +1 -0
  331. package/dist/integrations/google/youtube.js +128 -0
  332. package/dist/integrations/google/youtube.js.map +1 -0
  333. package/dist/integrations/loader.d.ts +15 -0
  334. package/dist/integrations/loader.d.ts.map +1 -0
  335. package/dist/integrations/loader.js +97 -0
  336. package/dist/integrations/loader.js.map +1 -0
  337. package/dist/integrations/music/spotify.d.ts +21 -0
  338. package/dist/integrations/music/spotify.d.ts.map +1 -0
  339. package/dist/integrations/music/spotify.js +161 -0
  340. package/dist/integrations/music/spotify.js.map +1 -0
  341. package/dist/integrations/productivity/github.d.ts +20 -0
  342. package/dist/integrations/productivity/github.d.ts.map +1 -0
  343. package/dist/integrations/productivity/github.js +146 -0
  344. package/dist/integrations/productivity/github.js.map +1 -0
  345. package/dist/integrations/productivity/linear.d.ts +19 -0
  346. package/dist/integrations/productivity/linear.d.ts.map +1 -0
  347. package/dist/integrations/productivity/linear.js +152 -0
  348. package/dist/integrations/productivity/linear.js.map +1 -0
  349. package/dist/integrations/productivity/notion.d.ts +20 -0
  350. package/dist/integrations/productivity/notion.d.ts.map +1 -0
  351. package/dist/integrations/productivity/notion.js +186 -0
  352. package/dist/integrations/productivity/notion.js.map +1 -0
  353. package/dist/integrations/productivity/obsidian.d.ts +21 -0
  354. package/dist/integrations/productivity/obsidian.d.ts.map +1 -0
  355. package/dist/integrations/productivity/obsidian.js +141 -0
  356. package/dist/integrations/productivity/obsidian.js.map +1 -0
  357. package/dist/integrations/registry.d.ts +78 -0
  358. package/dist/integrations/registry.d.ts.map +1 -0
  359. package/dist/integrations/registry.js +193 -0
  360. package/dist/integrations/registry.js.map +1 -0
  361. package/dist/integrations/smart-home/homeassistant.d.ts +21 -0
  362. package/dist/integrations/smart-home/homeassistant.d.ts.map +1 -0
  363. package/dist/integrations/smart-home/homeassistant.js +129 -0
  364. package/dist/integrations/smart-home/homeassistant.js.map +1 -0
  365. package/dist/integrations/smart-home/hue.d.ts +23 -0
  366. package/dist/integrations/smart-home/hue.d.ts.map +1 -0
  367. package/dist/integrations/smart-home/hue.js +144 -0
  368. package/dist/integrations/smart-home/hue.js.map +1 -0
  369. package/dist/integrations/social/email-smtp.d.ts +23 -0
  370. package/dist/integrations/social/email-smtp.d.ts.map +1 -0
  371. package/dist/integrations/social/email-smtp.js +168 -0
  372. package/dist/integrations/social/email-smtp.js.map +1 -0
  373. package/dist/integrations/social/twitter.d.ts +28 -0
  374. package/dist/integrations/social/twitter.d.ts.map +1 -0
  375. package/dist/integrations/social/twitter.js +168 -0
  376. package/dist/integrations/social/twitter.js.map +1 -0
  377. package/dist/integrations/tools/browser.d.ts +18 -0
  378. package/dist/integrations/tools/browser.d.ts.map +1 -0
  379. package/dist/integrations/tools/browser.js +131 -0
  380. package/dist/integrations/tools/browser.js.map +1 -0
  381. package/dist/integrations/tools/weather.d.ts +17 -0
  382. package/dist/integrations/tools/weather.d.ts.map +1 -0
  383. package/dist/integrations/tools/weather.js +113 -0
  384. package/dist/integrations/tools/weather.js.map +1 -0
  385. package/dist/integrations/tools/webhooks.d.ts +15 -0
  386. package/dist/integrations/tools/webhooks.d.ts.map +1 -0
  387. package/dist/integrations/tools/webhooks.js +89 -0
  388. package/dist/integrations/tools/webhooks.js.map +1 -0
  389. package/dist/mcp/client.d.ts +42 -0
  390. package/dist/mcp/client.d.ts.map +1 -0
  391. package/dist/mcp/client.js +164 -0
  392. package/dist/mcp/client.js.map +1 -0
  393. package/dist/mcp/server.d.ts +2 -0
  394. package/dist/mcp/server.d.ts.map +1 -0
  395. package/dist/mcp/server.js +114 -0
  396. package/dist/mcp/server.js.map +1 -0
  397. package/dist/mcp/tools-adapter.d.ts +14 -0
  398. package/dist/mcp/tools-adapter.d.ts.map +1 -0
  399. package/dist/mcp/tools-adapter.js +133 -0
  400. package/dist/mcp/tools-adapter.js.map +1 -0
  401. package/dist/memory/manager.d.ts +14 -0
  402. package/dist/memory/manager.d.ts.map +1 -0
  403. package/dist/memory/manager.js +49 -0
  404. package/dist/memory/manager.js.map +1 -0
  405. package/dist/memory/vector-store.d.ts +17 -0
  406. package/dist/memory/vector-store.d.ts.map +1 -0
  407. package/dist/memory/vector-store.js +65 -0
  408. package/dist/memory/vector-store.js.map +1 -0
  409. package/dist/security/action-guard.d.ts +12 -0
  410. package/dist/security/action-guard.d.ts.map +1 -0
  411. package/dist/security/action-guard.js +37 -0
  412. package/dist/security/action-guard.js.map +1 -0
  413. package/dist/security/api-key-guard.d.ts +3 -0
  414. package/dist/security/api-key-guard.d.ts.map +1 -0
  415. package/dist/security/api-key-guard.js +36 -0
  416. package/dist/security/api-key-guard.js.map +1 -0
  417. package/dist/security/auth.d.ts +17 -0
  418. package/dist/security/auth.d.ts.map +1 -0
  419. package/dist/security/auth.js +31 -0
  420. package/dist/security/auth.js.map +1 -0
  421. package/dist/security/device-identity.d.ts +11 -0
  422. package/dist/security/device-identity.d.ts.map +1 -0
  423. package/dist/security/device-identity.js +64 -0
  424. package/dist/security/device-identity.js.map +1 -0
  425. package/dist/security/encryption.d.ts +5 -0
  426. package/dist/security/encryption.d.ts.map +1 -0
  427. package/dist/security/encryption.js +13 -0
  428. package/dist/security/encryption.js.map +1 -0
  429. package/dist/security/isolation.d.ts +11 -0
  430. package/dist/security/isolation.d.ts.map +1 -0
  431. package/dist/security/isolation.js +37 -0
  432. package/dist/security/isolation.js.map +1 -0
  433. package/dist/skills/loader.d.ts +17 -0
  434. package/dist/skills/loader.d.ts.map +1 -0
  435. package/dist/skills/loader.js +68 -0
  436. package/dist/skills/loader.js.map +1 -0
  437. package/dist/token/estimator.d.ts +72 -0
  438. package/dist/token/estimator.d.ts.map +1 -0
  439. package/dist/token/estimator.js +165 -0
  440. package/dist/token/estimator.js.map +1 -0
  441. package/dist/utils/crypto.d.ts +4 -0
  442. package/dist/utils/crypto.d.ts.map +1 -0
  443. package/dist/utils/crypto.js +28 -0
  444. package/dist/utils/crypto.js.map +1 -0
  445. package/dist/utils/file.d.ts +14 -0
  446. package/dist/utils/file.d.ts.map +1 -0
  447. package/dist/utils/file.js +54 -0
  448. package/dist/utils/file.js.map +1 -0
  449. package/dist/utils/media.d.ts +6 -0
  450. package/dist/utils/media.d.ts.map +1 -0
  451. package/dist/utils/media.js +65 -0
  452. package/dist/utils/media.js.map +1 -0
  453. package/dist/wallet/x402.d.ts +22 -0
  454. package/dist/wallet/x402.d.ts.map +1 -0
  455. package/dist/wallet/x402.js +63 -0
  456. package/dist/wallet/x402.js.map +1 -0
  457. package/package.json +79 -0
  458. package/wispy/AGENTS.md +46 -0
  459. package/wispy/BOOT.md +28 -0
  460. package/wispy/CONTEXT.md +13 -0
  461. package/wispy/HEARTBEAT.md +17 -0
  462. package/wispy/IDENTITY.md +26 -0
  463. package/wispy/MEMORY.md +16 -0
  464. package/wispy/SOUL.md +35 -0
  465. package/wispy/TOOLS.md +45 -0
  466. package/wispy/USER.md +16 -0
  467. package/wispy/skills/a2a-delegate/SKILL.md +14 -0
  468. package/wispy/skills/content-creator/SKILL.md +14 -0
  469. package/wispy/skills/image-gen/SKILL.md +14 -0
  470. package/wispy/skills/wallet-ops/SKILL.md +14 -0
  471. package/wispy/skills/x-poster/SKILL.md +11 -0
@@ -0,0 +1,105 @@
1
+ import AjvModule from "ajv";
2
+ const Ajv = AjvModule.default ?? AjvModule;
3
+ const configSchema = {
4
+ type: "object",
5
+ required: ["agent", "gemini", "channels", "memory", "security"],
6
+ properties: {
7
+ agent: {
8
+ type: "object",
9
+ required: ["name", "id"],
10
+ properties: {
11
+ name: { type: "string" },
12
+ id: { type: "string" },
13
+ },
14
+ },
15
+ gemini: {
16
+ type: "object",
17
+ required: ["models"],
18
+ properties: {
19
+ apiKey: { type: "string", nullable: true },
20
+ models: {
21
+ type: "object",
22
+ required: ["pro", "flash", "image", "embedding"],
23
+ properties: {
24
+ pro: { type: "string" },
25
+ flash: { type: "string" },
26
+ image: { type: "string" },
27
+ embedding: { type: "string" },
28
+ },
29
+ },
30
+ },
31
+ },
32
+ channels: {
33
+ type: "object",
34
+ required: [],
35
+ properties: {
36
+ telegram: {
37
+ type: "object",
38
+ nullable: true,
39
+ required: ["enabled"],
40
+ properties: {
41
+ enabled: { type: "boolean" },
42
+ token: { type: "string", nullable: true },
43
+ },
44
+ },
45
+ whatsapp: {
46
+ type: "object",
47
+ nullable: true,
48
+ required: ["enabled"],
49
+ properties: {
50
+ enabled: { type: "boolean" },
51
+ },
52
+ },
53
+ web: {
54
+ type: "object",
55
+ nullable: true,
56
+ required: ["enabled", "port"],
57
+ properties: {
58
+ enabled: { type: "boolean" },
59
+ port: { type: "integer" },
60
+ },
61
+ },
62
+ rest: {
63
+ type: "object",
64
+ nullable: true,
65
+ required: ["enabled", "port"],
66
+ properties: {
67
+ enabled: { type: "boolean" },
68
+ port: { type: "integer" },
69
+ bearerToken: { type: "string", nullable: true },
70
+ },
71
+ },
72
+ },
73
+ },
74
+ memory: {
75
+ type: "object",
76
+ required: ["embeddingDimensions", "heartbeatIntervalMinutes"],
77
+ properties: {
78
+ embeddingDimensions: { type: "integer" },
79
+ heartbeatIntervalMinutes: { type: "integer" },
80
+ },
81
+ },
82
+ wallet: {
83
+ type: "object",
84
+ nullable: true,
85
+ required: ["enabled", "chain", "autoPayThreshold"],
86
+ properties: {
87
+ enabled: { type: "boolean" },
88
+ chain: { type: "string" },
89
+ autoPayThreshold: { type: "number" },
90
+ },
91
+ },
92
+ security: {
93
+ type: "object",
94
+ required: ["requireApprovalForExternal", "allowedGroups"],
95
+ properties: {
96
+ requireApprovalForExternal: { type: "boolean" },
97
+ allowedGroups: { type: "array", items: { type: "string" } },
98
+ },
99
+ },
100
+ },
101
+ additionalProperties: false,
102
+ };
103
+ const ajv = new Ajv({ allErrors: true });
104
+ export const validateConfig = ajv.compile(configSchema);
105
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { WispyConfig } from "../config/schema.js";
2
+ export interface ContentPlan {
3
+ topic: string;
4
+ posts: Array<{
5
+ caption: string;
6
+ imagePrompt: string;
7
+ hashtags: string[];
8
+ }>;
9
+ }
10
+ export declare function generateContentPlan(topic: string, postCount: number, config: WispyConfig): Promise<ContentPlan>;
11
+ export declare function generateImage(prompt: string, config: WispyConfig): Promise<string | null>;
12
+ //# sourceMappingURL=pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/content/pipeline.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAKvD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC,CAAC;CACJ;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,WAAW,CAAC,CAmCtB;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAcxB"}
@@ -0,0 +1,55 @@
1
+ import { generate } from "../ai/gemini.js";
2
+ import { createLogger } from "../infra/logger.js";
3
+ const log = createLogger("content-pipeline");
4
+ export async function generateContentPlan(topic, postCount, config) {
5
+ const result = await generate({
6
+ model: config.gemini.models.pro,
7
+ thinkingLevel: "high",
8
+ messages: [
9
+ {
10
+ role: "user",
11
+ content: `Create a content plan for ${postCount} social media posts about: "${topic}".
12
+ For each post, provide:
13
+ 1. A compelling caption (under 280 chars)
14
+ 2. An image generation prompt (detailed, visual description)
15
+ 3. 3-5 relevant hashtags
16
+
17
+ Respond in JSON format:
18
+ {
19
+ "topic": "...",
20
+ "posts": [
21
+ { "caption": "...", "imagePrompt": "...", "hashtags": ["..."] }
22
+ ]
23
+ }`,
24
+ },
25
+ ],
26
+ });
27
+ try {
28
+ // Extract JSON from response
29
+ const jsonMatch = result.text.match(/\{[\s\S]*\}/);
30
+ if (jsonMatch) {
31
+ return JSON.parse(jsonMatch[0]);
32
+ }
33
+ }
34
+ catch (err) {
35
+ log.error({ err }, "Failed to parse content plan");
36
+ }
37
+ return { topic, posts: [] };
38
+ }
39
+ export async function generateImage(prompt, config) {
40
+ try {
41
+ const result = await generate({
42
+ model: config.gemini.models.image,
43
+ messages: [{ role: "user", content: prompt }],
44
+ thinkingLevel: "none",
45
+ });
46
+ // Image generation returns base64 in inlineData
47
+ // This depends on the actual Gemini 3 image gen API response format
48
+ return result.text || null;
49
+ }
50
+ catch (err) {
51
+ log.error({ err }, "Image generation failed");
52
+ return null;
53
+ }
54
+ }
55
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/content/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,GAAG,GAAG,YAAY,CAAC,kBAAkB,CAAC,CAAC;AAW7C,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAAa,EACb,SAAiB,EACjB,MAAmB;IAEnB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC;QAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG;QAC/B,aAAa,EAAE,MAAM;QACrB,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,6BAA6B,SAAS,+BAA+B,KAAK;;;;;;;;;;;;EAYzF;aACK;SACF;KACF,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,6BAA6B;QAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACnD,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,8BAA8B,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAc,EACd,MAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC;YAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK;YACjC,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;YAC7C,aAAa,EAAE,MAAM;SACtB,CAAC,CAAC;QACH,gDAAgD;QAChD,oEAAoE;QACpE,OAAO,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,yBAAyB,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ export interface TwitterCredentials {
2
+ apiKey: string;
3
+ apiSecret: string;
4
+ accessToken: string;
5
+ accessSecret: string;
6
+ }
7
+ export interface TweetOptions {
8
+ text: string;
9
+ mediaIds?: string[];
10
+ replyToId?: string;
11
+ }
12
+ export declare class TwitterPublisher {
13
+ private creds;
14
+ constructor(creds: TwitterCredentials);
15
+ postTweet(opts: TweetOptions): Promise<{
16
+ id: string;
17
+ text: string;
18
+ } | null>;
19
+ postThread(tweets: string[]): Promise<Array<{
20
+ id: string;
21
+ text: string;
22
+ }>>;
23
+ private buildOAuth1Header;
24
+ }
25
+ export declare function createPublisherFromEnv(): TwitterPublisher | null;
26
+ //# sourceMappingURL=publisher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publisher.d.ts","sourceRoot":"","sources":["../../src/content/publisher.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAqB;gBAEtB,KAAK,EAAE,kBAAkB;IAI/B,SAAS,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAoC3E,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAmBhF,OAAO,CAAC,iBAAiB;CAsC1B;AAED,wBAAgB,sBAAsB,IAAI,gBAAgB,GAAG,IAAI,CAWhE"}
@@ -0,0 +1,101 @@
1
+ import { createHmac, randomBytes } from "crypto";
2
+ import { createLogger } from "../infra/logger.js";
3
+ const log = createLogger("publisher");
4
+ export class TwitterPublisher {
5
+ creds;
6
+ constructor(creds) {
7
+ this.creds = creds;
8
+ }
9
+ async postTweet(opts) {
10
+ const url = "https://api.twitter.com/2/tweets";
11
+ const body = { text: opts.text };
12
+ if (opts.mediaIds && opts.mediaIds.length > 0) {
13
+ body.media = { media_ids: opts.mediaIds };
14
+ }
15
+ if (opts.replyToId) {
16
+ body.reply = { in_reply_to_tweet_id: opts.replyToId };
17
+ }
18
+ try {
19
+ const authHeader = this.buildOAuth1Header("POST", url, {});
20
+ const res = await fetch(url, {
21
+ method: "POST",
22
+ headers: {
23
+ Authorization: authHeader,
24
+ "Content-Type": "application/json",
25
+ },
26
+ body: JSON.stringify(body),
27
+ });
28
+ if (!res.ok) {
29
+ const err = await res.text();
30
+ log.error("Tweet failed: %d %s", res.status, err);
31
+ return null;
32
+ }
33
+ const data = (await res.json());
34
+ log.info("Tweet posted: %s", data.data.id);
35
+ return data.data;
36
+ }
37
+ catch (err) {
38
+ log.error({ err }, "Failed to post tweet");
39
+ return null;
40
+ }
41
+ }
42
+ async postThread(tweets) {
43
+ const posted = [];
44
+ let replyToId;
45
+ for (const text of tweets) {
46
+ const result = await this.postTweet({ text, replyToId });
47
+ if (result) {
48
+ posted.push(result);
49
+ replyToId = result.id;
50
+ }
51
+ else {
52
+ log.error("Thread broken at tweet %d", posted.length + 1);
53
+ break;
54
+ }
55
+ }
56
+ return posted;
57
+ }
58
+ // OAuth 1.0a signature for Twitter API v2
59
+ buildOAuth1Header(method, url, params) {
60
+ const { apiKey, apiSecret, accessToken, accessSecret } = this.creds;
61
+ const timestamp = Math.floor(Date.now() / 1000).toString();
62
+ const nonce = randomBytes(16).toString("hex");
63
+ const oauthParams = {
64
+ oauth_consumer_key: apiKey,
65
+ oauth_nonce: nonce,
66
+ oauth_signature_method: "HMAC-SHA1",
67
+ oauth_timestamp: timestamp,
68
+ oauth_token: accessToken,
69
+ oauth_version: "1.0",
70
+ };
71
+ const allParams = { ...oauthParams, ...params };
72
+ const paramString = Object.keys(allParams)
73
+ .sort()
74
+ .map((k) => `${encodeURIComponent(k)}=${encodeURIComponent(allParams[k])}`)
75
+ .join("&");
76
+ const baseString = [
77
+ method.toUpperCase(),
78
+ encodeURIComponent(url),
79
+ encodeURIComponent(paramString),
80
+ ].join("&");
81
+ const signingKey = `${encodeURIComponent(apiSecret)}&${encodeURIComponent(accessSecret)}`;
82
+ const signature = createHmac("sha1", signingKey).update(baseString).digest("base64");
83
+ oauthParams.oauth_signature = signature;
84
+ const authString = Object.keys(oauthParams)
85
+ .sort()
86
+ .map((k) => `${encodeURIComponent(k)}="${encodeURIComponent(oauthParams[k])}"`)
87
+ .join(", ");
88
+ return `OAuth ${authString}`;
89
+ }
90
+ }
91
+ export function createPublisherFromEnv() {
92
+ const apiKey = process.env.TWITTER_API_KEY;
93
+ const apiSecret = process.env.TWITTER_API_SECRET;
94
+ const accessToken = process.env.TWITTER_ACCESS_TOKEN;
95
+ const accessSecret = process.env.TWITTER_ACCESS_SECRET;
96
+ if (!apiKey || !apiSecret || !accessToken || !accessSecret) {
97
+ return null;
98
+ }
99
+ return new TwitterPublisher({ apiKey, apiSecret, accessToken, accessSecret });
100
+ }
101
+ //# sourceMappingURL=publisher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publisher.js","sourceRoot":"","sources":["../../src/content/publisher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { ToolExecutor, type ToolResult } from "../agents/tool-executor.js";
2
+ import { MemoryManager } from "../memory/manager.js";
3
+ import type { IntegrationRegistry } from "../integrations/registry.js";
4
+ import type { SessionType } from "../security/isolation.js";
5
+ import type { WispyConfig } from "../config/schema.js";
6
+ export interface AgentContext {
7
+ config: WispyConfig;
8
+ runtimeDir: string;
9
+ soulDir: string;
10
+ }
11
+ export interface AgentResponse {
12
+ text: string;
13
+ thinking?: string;
14
+ toolCalls?: unknown[];
15
+ toolResults?: ToolResult[];
16
+ }
17
+ export declare class Agent {
18
+ private ctx;
19
+ private toolExecutor;
20
+ private memoryManager;
21
+ private integrationRegistry?;
22
+ constructor(ctx: AgentContext);
23
+ /**
24
+ * Attach an integration registry (loaded externally).
25
+ * Updates the tool executor to route integration tools.
26
+ */
27
+ setIntegrationRegistry(registry: IntegrationRegistry): void;
28
+ getIntegrationRegistry(): IntegrationRegistry | undefined;
29
+ chat(userMessage: string, peerId: string, channel: string, sessionType?: SessionType): Promise<AgentResponse>;
30
+ chatStream(userMessage: string, peerId: string, channel: string, sessionType?: SessionType): AsyncGenerator<{
31
+ type: string;
32
+ content: string;
33
+ }>;
34
+ getMemoryManager(): MemoryManager;
35
+ getToolExecutor(): ToolExecutor;
36
+ }
37
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/core/agent.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,YAAY,EAAiB,KAAK,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAOvD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;CAC5B;AAED,qBAAa,KAAK;IAChB,OAAO,CAAC,GAAG,CAAe;IAC1B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,mBAAmB,CAAC,CAAsB;gBAEtC,GAAG,EAAE,YAAY;IAW7B;;;OAGG;IACH,sBAAsB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI;IAW3D,sBAAsB,IAAI,mBAAmB,GAAG,SAAS;IAInD,IAAI,CACR,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,WAAoB,GAChC,OAAO,CAAC,aAAa,CAAC;IAwHlB,UAAU,CACf,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,WAAoB,GAChC,cAAc,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAoDpD,gBAAgB,IAAI,aAAa;IAIjC,eAAe,IAAI,YAAY;CAGhC"}
@@ -0,0 +1,170 @@
1
+ import { generate, generateStream } from "../ai/gemini.js";
2
+ import { routeTask } from "../ai/router.js";
3
+ import { buildSystemPrompt } from "../ai/prompts.js";
4
+ import { getToolDeclarations } from "../ai/tools.js";
5
+ import { inferThinkingLevel } from "./thinking.js";
6
+ import { getOrCreateSession, appendMessage, loadHistory, } from "./session.js";
7
+ import { ToolExecutor } from "../agents/tool-executor.js";
8
+ import { MemoryManager } from "../memory/manager.js";
9
+ import { sanitizeOutput } from "../security/api-key-guard.js";
10
+ import { createLogger } from "../infra/logger.js";
11
+ const log = createLogger("agent");
12
+ const MAX_TOOL_LOOPS = 10;
13
+ export class Agent {
14
+ ctx;
15
+ toolExecutor;
16
+ memoryManager;
17
+ integrationRegistry;
18
+ constructor(ctx) {
19
+ this.ctx = ctx;
20
+ this.memoryManager = new MemoryManager(ctx.runtimeDir, ctx.config);
21
+ this.toolExecutor = new ToolExecutor(ctx.config, ctx.runtimeDir, ctx.soulDir, this.memoryManager);
22
+ }
23
+ /**
24
+ * Attach an integration registry (loaded externally).
25
+ * Updates the tool executor to route integration tools.
26
+ */
27
+ setIntegrationRegistry(registry) {
28
+ this.integrationRegistry = registry;
29
+ this.toolExecutor = new ToolExecutor(this.ctx.config, this.ctx.runtimeDir, this.ctx.soulDir, this.memoryManager, registry);
30
+ }
31
+ getIntegrationRegistry() {
32
+ return this.integrationRegistry;
33
+ }
34
+ async chat(userMessage, peerId, channel, sessionType = "main") {
35
+ const { config, runtimeDir, soulDir } = this.ctx;
36
+ const agentId = config.agent.id;
37
+ // Get or create session
38
+ const session = getOrCreateSession(runtimeDir, agentId, sessionType, peerId, channel);
39
+ // Save user message
40
+ appendMessage(runtimeDir, agentId, session.sessionKey, {
41
+ role: "user",
42
+ content: userMessage,
43
+ timestamp: new Date().toISOString(),
44
+ channel,
45
+ peerId,
46
+ });
47
+ // Build conversation history
48
+ const history = loadHistory(runtimeDir, agentId, session.sessionKey);
49
+ const messages = history.map((m) => ({
50
+ role: m.role,
51
+ content: m.content,
52
+ }));
53
+ const thinkingLevel = inferThinkingLevel(userMessage);
54
+ const route = routeTask("reasoning", config);
55
+ const systemPrompt = buildSystemPrompt(soulDir, sessionType);
56
+ log.info("Chat [%s] model=%s thinking=%s", session.sessionKey.slice(0, 30), route.model, thinkingLevel);
57
+ // Agentic loop — generate, execute tools, feed results back, repeat
58
+ let allToolResults = [];
59
+ let finalText = "";
60
+ let finalThinking;
61
+ let loopCount = 0;
62
+ while (loopCount < MAX_TOOL_LOOPS) {
63
+ loopCount++;
64
+ const result = await generate({
65
+ model: route.model,
66
+ systemPrompt,
67
+ messages,
68
+ tools: getToolDeclarations(),
69
+ thinkingLevel,
70
+ });
71
+ finalThinking = result.thinking;
72
+ // If no tool calls, we have our final response
73
+ if (!result.toolCalls || result.toolCalls.length === 0) {
74
+ finalText = result.text;
75
+ break;
76
+ }
77
+ // Execute tool calls
78
+ log.info("Agent requested %d tool call(s), loop %d", result.toolCalls.length, loopCount);
79
+ const toolResults = [];
80
+ for (const tc of result.toolCalls) {
81
+ const call = tc;
82
+ const toolResult = await this.toolExecutor.execute(call);
83
+ allToolResults.push(toolResult);
84
+ toolResults.push(`Tool: ${call.name}\nResult: ${toolResult.success ? toolResult.output : "ERROR: " + toolResult.error}`);
85
+ log.info("Tool %s: %s", call.name, toolResult.success ? "OK" : "FAIL");
86
+ }
87
+ // Add the model's partial response + tool results back into the conversation
88
+ if (result.text) {
89
+ messages.push({ role: "model", content: result.text });
90
+ }
91
+ messages.push({
92
+ role: "user",
93
+ content: `[Tool Results]\n${toolResults.join("\n\n")}`,
94
+ });
95
+ // If there was text alongside tools, that might be intermediate thinking
96
+ if (result.text) {
97
+ finalText = result.text;
98
+ }
99
+ }
100
+ if (loopCount >= MAX_TOOL_LOOPS) {
101
+ log.warn("Max tool loops reached (%d)", MAX_TOOL_LOOPS);
102
+ finalText += "\n\n(Reached maximum tool execution steps)";
103
+ }
104
+ const safeText = sanitizeOutput(finalText);
105
+ // Save agent response
106
+ appendMessage(runtimeDir, agentId, session.sessionKey, {
107
+ role: "model",
108
+ content: safeText,
109
+ timestamp: new Date().toISOString(),
110
+ thinking: finalThinking,
111
+ });
112
+ // Index conversation in memory
113
+ try {
114
+ await this.memoryManager.addMemory(`User: ${userMessage}\nAgent: ${safeText.slice(0, 500)}`, "session", session.sessionKey);
115
+ }
116
+ catch { /* non-fatal */ }
117
+ return {
118
+ text: safeText,
119
+ thinking: finalThinking,
120
+ toolCalls: allToolResults.length > 0 ? allToolResults : undefined,
121
+ toolResults: allToolResults.length > 0 ? allToolResults : undefined,
122
+ };
123
+ }
124
+ async *chatStream(userMessage, peerId, channel, sessionType = "main") {
125
+ const { config, runtimeDir, soulDir } = this.ctx;
126
+ const agentId = config.agent.id;
127
+ const session = getOrCreateSession(runtimeDir, agentId, sessionType, peerId, channel);
128
+ appendMessage(runtimeDir, agentId, session.sessionKey, {
129
+ role: "user",
130
+ content: userMessage,
131
+ timestamp: new Date().toISOString(),
132
+ channel,
133
+ peerId,
134
+ });
135
+ const history = loadHistory(runtimeDir, agentId, session.sessionKey);
136
+ const messages = history.map((m) => ({
137
+ role: m.role,
138
+ content: m.content,
139
+ }));
140
+ const thinkingLevel = inferThinkingLevel(userMessage);
141
+ const route = routeTask("reasoning", config);
142
+ const systemPrompt = buildSystemPrompt(soulDir, sessionType);
143
+ let fullText = "";
144
+ for await (const chunk of generateStream({
145
+ model: route.model,
146
+ systemPrompt,
147
+ messages,
148
+ thinkingLevel,
149
+ })) {
150
+ if (chunk.type === "text") {
151
+ fullText += chunk.content;
152
+ }
153
+ yield chunk;
154
+ }
155
+ appendMessage(runtimeDir, agentId, session.sessionKey, {
156
+ role: "model",
157
+ content: sanitizeOutput(fullText),
158
+ timestamp: new Date().toISOString(),
159
+ });
160
+ // Index in memory (non-blocking)
161
+ this.memoryManager.addMemory(`User: ${userMessage}\nAgent: ${fullText.slice(0, 500)}`, "session", session.sessionKey).catch(() => { });
162
+ }
163
+ getMemoryManager() {
164
+ return this.memoryManager;
165
+ }
166
+ getToolExecutor() {
167
+ return this.toolExecutor;
168
+ }
169
+ }
170
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/core/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { MemoryManager } from "../memory/manager.js";
2
+ import type { WispyConfig } from "../config/schema.js";
3
+ export declare class HeartbeatRunner {
4
+ private config;
5
+ private runtimeDir;
6
+ private soulDir;
7
+ private memoryManager;
8
+ private timer;
9
+ constructor(config: WispyConfig, runtimeDir: string, soulDir: string, memoryManager: MemoryManager);
10
+ start(): void;
11
+ stop(): void;
12
+ private tick;
13
+ private syncSessions;
14
+ }
15
+ //# sourceMappingURL=heartbeat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../src/core/heartbeat.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAKvD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,KAAK,CAA+C;gBAG1D,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,aAAa;IAQ9B,KAAK;IAUL,IAAI;YAOU,IAAI;YAqBJ,YAAY;CA8B3B"}
@@ -0,0 +1,70 @@
1
+ import { loadHeartbeatState, saveHeartbeatState, appendDailyNote, } from "./memory.js";
2
+ import { loadHistory, loadRegistry } from "./session.js";
3
+ import { createLogger } from "../infra/logger.js";
4
+ const log = createLogger("heartbeat");
5
+ export class HeartbeatRunner {
6
+ config;
7
+ runtimeDir;
8
+ soulDir;
9
+ memoryManager;
10
+ timer = null;
11
+ constructor(config, runtimeDir, soulDir, memoryManager) {
12
+ this.config = config;
13
+ this.runtimeDir = runtimeDir;
14
+ this.soulDir = soulDir;
15
+ this.memoryManager = memoryManager;
16
+ }
17
+ start() {
18
+ const intervalMs = this.config.memory.heartbeatIntervalMinutes * 60 * 1000;
19
+ log.info("Heartbeat started (every %d min)", this.config.memory.heartbeatIntervalMinutes);
20
+ this.timer = setInterval(() => this.tick(), intervalMs);
21
+ // Run first tick after 10 seconds
22
+ setTimeout(() => this.tick(), 10000);
23
+ }
24
+ stop() {
25
+ if (this.timer) {
26
+ clearInterval(this.timer);
27
+ this.timer = null;
28
+ }
29
+ }
30
+ async tick() {
31
+ log.info("Heartbeat tick");
32
+ const state = loadHeartbeatState(this.soulDir);
33
+ try {
34
+ // 1. Sync recent sessions to memory
35
+ await this.syncSessions(state);
36
+ // 2. Write daily note
37
+ appendDailyNote(this.soulDir, "Heartbeat tick completed");
38
+ // 3. Update state
39
+ state.lastRun = new Date().toISOString();
40
+ saveHeartbeatState(this.soulDir, state);
41
+ log.info("Heartbeat complete");
42
+ }
43
+ catch (err) {
44
+ log.error({ err }, "Heartbeat failed");
45
+ }
46
+ }
47
+ async syncSessions(state) {
48
+ const agentId = this.config.agent.id;
49
+ const reg = loadRegistry(this.runtimeDir, agentId);
50
+ for (const session of Object.values(reg.sessions)) {
51
+ const history = loadHistory(this.runtimeDir, agentId, session.sessionKey);
52
+ // Index new messages since last sync
53
+ const startIdx = state.lastSyncMessageIndex;
54
+ const newMessages = history.slice(startIdx);
55
+ if (newMessages.length === 0)
56
+ continue;
57
+ log.debug("Syncing %d new messages from %s", newMessages.length, session.sessionKey);
58
+ for (const msg of newMessages) {
59
+ if (msg.content && msg.content.length > 20) {
60
+ try {
61
+ await this.memoryManager.addMemory(msg.content.slice(0, 1000), "session", session.sessionKey);
62
+ }
63
+ catch { /* continue on embedding failure */ }
64
+ }
65
+ }
66
+ state.lastSyncMessageIndex = history.length;
67
+ }
68
+ }
69
+ }
70
+ //# sourceMappingURL=heartbeat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../src/core/heartbeat.ts"],"names":[],"mappings":"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"}