@rozek/nanoclaw 1.2.17

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 (305) hide show
  1. package/.claude/settings.json +1 -0
  2. package/.claude/skills/add-compact/SKILL.md +135 -0
  3. package/.claude/skills/add-discord/SKILL.md +203 -0
  4. package/.claude/skills/add-gmail/SKILL.md +220 -0
  5. package/.claude/skills/add-image-vision/SKILL.md +94 -0
  6. package/.claude/skills/add-ollama-tool/SKILL.md +153 -0
  7. package/.claude/skills/add-parallel/SKILL.md +290 -0
  8. package/.claude/skills/add-pdf-reader/SKILL.md +104 -0
  9. package/.claude/skills/add-reactions/SKILL.md +117 -0
  10. package/.claude/skills/add-slack/SKILL.md +207 -0
  11. package/.claude/skills/add-telegram/SKILL.md +222 -0
  12. package/.claude/skills/add-telegram-swarm/SKILL.md +384 -0
  13. package/.claude/skills/add-voice-transcription/SKILL.md +148 -0
  14. package/.claude/skills/add-whatsapp/SKILL.md +372 -0
  15. package/.claude/skills/convert-to-apple-container/SKILL.md +175 -0
  16. package/.claude/skills/customize/SKILL.md +110 -0
  17. package/.claude/skills/debug/SKILL.md +349 -0
  18. package/.claude/skills/get-qodo-rules/SKILL.md +122 -0
  19. package/.claude/skills/get-qodo-rules/references/output-format.md +41 -0
  20. package/.claude/skills/get-qodo-rules/references/pagination.md +33 -0
  21. package/.claude/skills/get-qodo-rules/references/repository-scope.md +26 -0
  22. package/.claude/skills/qodo-pr-resolver/SKILL.md +326 -0
  23. package/.claude/skills/qodo-pr-resolver/resources/providers.md +329 -0
  24. package/.claude/skills/setup/SKILL.md +218 -0
  25. package/.claude/skills/update-nanoclaw/SKILL.md +235 -0
  26. package/.claude/skills/update-skills/SKILL.md +130 -0
  27. package/.claude/skills/use-local-whisper/SKILL.md +152 -0
  28. package/.claude/skills/x-integration/SKILL.md +417 -0
  29. package/.claude/skills/x-integration/agent.ts +243 -0
  30. package/.claude/skills/x-integration/host.ts +159 -0
  31. package/.claude/skills/x-integration/lib/browser.ts +148 -0
  32. package/.claude/skills/x-integration/lib/config.ts +62 -0
  33. package/.claude/skills/x-integration/scripts/like.ts +56 -0
  34. package/.claude/skills/x-integration/scripts/post.ts +66 -0
  35. package/.claude/skills/x-integration/scripts/quote.ts +80 -0
  36. package/.claude/skills/x-integration/scripts/reply.ts +74 -0
  37. package/.claude/skills/x-integration/scripts/retweet.ts +62 -0
  38. package/.claude/skills/x-integration/scripts/setup.ts +87 -0
  39. package/.env.example +1 -0
  40. package/.github/CODEOWNERS +10 -0
  41. package/.github/PULL_REQUEST_TEMPLATE.md +14 -0
  42. package/.github/workflows/bump-version.yml +32 -0
  43. package/.github/workflows/ci.yml +25 -0
  44. package/.github/workflows/merge-forward-skills.yml +160 -0
  45. package/.github/workflows/update-tokens.yml +42 -0
  46. package/.husky/pre-commit +1 -0
  47. package/.mcp.json +3 -0
  48. package/.nvmrc +1 -0
  49. package/.prettierrc +3 -0
  50. package/CHANGELOG.md +8 -0
  51. package/CLAUDE.md +64 -0
  52. package/CONTRIBUTING.md +23 -0
  53. package/CONTRIBUTORS.md +15 -0
  54. package/LICENSE +21 -0
  55. package/NanoClaw_with_Web-Support.md +290 -0
  56. package/README.md +261 -0
  57. package/README_zh.md +200 -0
  58. package/assets/nanoclaw-favicon.png +0 -0
  59. package/assets/nanoclaw-icon.png +0 -0
  60. package/assets/nanoclaw-logo-dark.png +0 -0
  61. package/assets/nanoclaw-logo.png +0 -0
  62. package/assets/nanoclaw-profile.jpeg +0 -0
  63. package/assets/nanoclaw-sales.png +0 -0
  64. package/assets/social-preview.jpg +0 -0
  65. package/config-examples/mount-allowlist.json +25 -0
  66. package/container/Dockerfile +70 -0
  67. package/container/agent-runner/package-lock.json +1524 -0
  68. package/container/agent-runner/package.json +21 -0
  69. package/container/agent-runner/src/index.ts +558 -0
  70. package/container/agent-runner/src/ipc-mcp-stdio.ts +338 -0
  71. package/container/agent-runner/tsconfig.json +15 -0
  72. package/container/build.sh +23 -0
  73. package/container/skills/agent-browser/SKILL.md +159 -0
  74. package/container/skills/capabilities/SKILL.md +100 -0
  75. package/container/skills/status/SKILL.md +104 -0
  76. package/dist/channels/index.d.ts +2 -0
  77. package/dist/channels/index.d.ts.map +1 -0
  78. package/dist/channels/index.js +9 -0
  79. package/dist/channels/index.js.map +1 -0
  80. package/dist/channels/registry.d.ts +13 -0
  81. package/dist/channels/registry.d.ts.map +1 -0
  82. package/dist/channels/registry.js +11 -0
  83. package/dist/channels/registry.js.map +1 -0
  84. package/dist/channels/registry.test.d.ts +2 -0
  85. package/dist/channels/registry.test.d.ts.map +1 -0
  86. package/dist/channels/registry.test.js +32 -0
  87. package/dist/channels/registry.test.js.map +1 -0
  88. package/dist/channels/web.d.ts +2 -0
  89. package/dist/channels/web.d.ts.map +1 -0
  90. package/dist/channels/web.js +1738 -0
  91. package/dist/channels/web.js.map +1 -0
  92. package/dist/cli.d.ts +11 -0
  93. package/dist/cli.d.ts.map +1 -0
  94. package/dist/cli.js +182 -0
  95. package/dist/cli.js.map +1 -0
  96. package/dist/config.d.ts +19 -0
  97. package/dist/config.d.ts.map +1 -0
  98. package/dist/config.js +36 -0
  99. package/dist/config.js.map +1 -0
  100. package/dist/container-runner.d.ts +44 -0
  101. package/dist/container-runner.d.ts.map +1 -0
  102. package/dist/container-runner.js +467 -0
  103. package/dist/container-runner.js.map +1 -0
  104. package/dist/container-runner.test.d.ts +2 -0
  105. package/dist/container-runner.test.d.ts.map +1 -0
  106. package/dist/container-runner.test.js +150 -0
  107. package/dist/container-runner.test.js.map +1 -0
  108. package/dist/container-runtime.d.ts +22 -0
  109. package/dist/container-runtime.d.ts.map +1 -0
  110. package/dist/container-runtime.js +96 -0
  111. package/dist/container-runtime.js.map +1 -0
  112. package/dist/container-runtime.test.d.ts +2 -0
  113. package/dist/container-runtime.test.d.ts.map +1 -0
  114. package/dist/container-runtime.test.js +93 -0
  115. package/dist/container-runtime.test.js.map +1 -0
  116. package/dist/credential-proxy.d.ts +21 -0
  117. package/dist/credential-proxy.d.ts.map +1 -0
  118. package/dist/credential-proxy.js +95 -0
  119. package/dist/credential-proxy.js.map +1 -0
  120. package/dist/credential-proxy.test.d.ts +2 -0
  121. package/dist/credential-proxy.test.d.ts.map +1 -0
  122. package/dist/credential-proxy.test.js +134 -0
  123. package/dist/credential-proxy.test.js.map +1 -0
  124. package/dist/db.d.ts +115 -0
  125. package/dist/db.d.ts.map +1 -0
  126. package/dist/db.js +549 -0
  127. package/dist/db.js.map +1 -0
  128. package/dist/db.test.d.ts +2 -0
  129. package/dist/db.test.d.ts.map +1 -0
  130. package/dist/db.test.js +360 -0
  131. package/dist/db.test.js.map +1 -0
  132. package/dist/env.d.ts +8 -0
  133. package/dist/env.d.ts.map +1 -0
  134. package/dist/env.js +42 -0
  135. package/dist/env.js.map +1 -0
  136. package/dist/formatting.test.d.ts +2 -0
  137. package/dist/formatting.test.d.ts.map +1 -0
  138. package/dist/formatting.test.js +183 -0
  139. package/dist/formatting.test.js.map +1 -0
  140. package/dist/group-folder.d.ts +5 -0
  141. package/dist/group-folder.d.ts.map +1 -0
  142. package/dist/group-folder.js +44 -0
  143. package/dist/group-folder.js.map +1 -0
  144. package/dist/group-folder.test.d.ts +2 -0
  145. package/dist/group-folder.test.d.ts.map +1 -0
  146. package/dist/group-folder.test.js +29 -0
  147. package/dist/group-folder.test.js.map +1 -0
  148. package/dist/group-queue.d.ts +34 -0
  149. package/dist/group-queue.d.ts.map +1 -0
  150. package/dist/group-queue.js +263 -0
  151. package/dist/group-queue.js.map +1 -0
  152. package/dist/group-queue.test.d.ts +2 -0
  153. package/dist/group-queue.test.d.ts.map +1 -0
  154. package/dist/group-queue.test.js +341 -0
  155. package/dist/group-queue.test.js.map +1 -0
  156. package/dist/index.d.ts +12 -0
  157. package/dist/index.d.ts.map +1 -0
  158. package/dist/index.js +518 -0
  159. package/dist/index.js.map +1 -0
  160. package/dist/ipc-auth.test.d.ts +2 -0
  161. package/dist/ipc-auth.test.d.ts.map +1 -0
  162. package/dist/ipc-auth.test.js +434 -0
  163. package/dist/ipc-auth.test.js.map +1 -0
  164. package/dist/ipc.d.ts +32 -0
  165. package/dist/ipc.d.ts.map +1 -0
  166. package/dist/ipc.js +311 -0
  167. package/dist/ipc.js.map +1 -0
  168. package/dist/logger.d.ts +3 -0
  169. package/dist/logger.d.ts.map +1 -0
  170. package/dist/logger.js +14 -0
  171. package/dist/logger.js.map +1 -0
  172. package/dist/mount-security.d.ts +34 -0
  173. package/dist/mount-security.d.ts.map +1 -0
  174. package/dist/mount-security.js +325 -0
  175. package/dist/mount-security.js.map +1 -0
  176. package/dist/remote-control.d.ts +32 -0
  177. package/dist/remote-control.d.ts.map +1 -0
  178. package/dist/remote-control.js +185 -0
  179. package/dist/remote-control.js.map +1 -0
  180. package/dist/remote-control.test.d.ts +2 -0
  181. package/dist/remote-control.test.d.ts.map +1 -0
  182. package/dist/remote-control.test.js +321 -0
  183. package/dist/remote-control.test.js.map +1 -0
  184. package/dist/router.d.ts +8 -0
  185. package/dist/router.d.ts.map +1 -0
  186. package/dist/router.js +37 -0
  187. package/dist/router.js.map +1 -0
  188. package/dist/routing.test.d.ts +2 -0
  189. package/dist/routing.test.d.ts.map +1 -0
  190. package/dist/routing.test.js +81 -0
  191. package/dist/routing.test.js.map +1 -0
  192. package/dist/sender-allowlist.d.ts +14 -0
  193. package/dist/sender-allowlist.d.ts.map +1 -0
  194. package/dist/sender-allowlist.js +79 -0
  195. package/dist/sender-allowlist.js.map +1 -0
  196. package/dist/sender-allowlist.test.d.ts +2 -0
  197. package/dist/sender-allowlist.test.d.ts.map +1 -0
  198. package/dist/sender-allowlist.test.js +186 -0
  199. package/dist/sender-allowlist.test.js.map +1 -0
  200. package/dist/session-commands.d.ts +47 -0
  201. package/dist/session-commands.d.ts.map +1 -0
  202. package/dist/session-commands.js +102 -0
  203. package/dist/session-commands.js.map +1 -0
  204. package/dist/session-commands.test.d.ts +2 -0
  205. package/dist/session-commands.test.d.ts.map +1 -0
  206. package/dist/session-commands.test.js +190 -0
  207. package/dist/session-commands.test.js.map +1 -0
  208. package/dist/task-scheduler.d.ts +22 -0
  209. package/dist/task-scheduler.d.ts.map +1 -0
  210. package/dist/task-scheduler.js +210 -0
  211. package/dist/task-scheduler.js.map +1 -0
  212. package/dist/task-scheduler.test.d.ts +2 -0
  213. package/dist/task-scheduler.test.d.ts.map +1 -0
  214. package/dist/task-scheduler.test.js +107 -0
  215. package/dist/task-scheduler.test.js.map +1 -0
  216. package/dist/timezone.d.ts +6 -0
  217. package/dist/timezone.d.ts.map +1 -0
  218. package/dist/timezone.js +17 -0
  219. package/dist/timezone.js.map +1 -0
  220. package/dist/timezone.test.d.ts +2 -0
  221. package/dist/timezone.test.d.ts.map +1 -0
  222. package/dist/timezone.test.js +23 -0
  223. package/dist/timezone.test.js.map +1 -0
  224. package/dist/types.d.ts +78 -0
  225. package/dist/types.d.ts.map +1 -0
  226. package/dist/types.js +2 -0
  227. package/dist/types.js.map +1 -0
  228. package/docs/APPLE-CONTAINER-NETWORKING.md +90 -0
  229. package/docs/DEBUG_CHECKLIST.md +143 -0
  230. package/docs/REQUIREMENTS.md +196 -0
  231. package/docs/SDK_DEEP_DIVE.md +643 -0
  232. package/docs/SECURITY.md +122 -0
  233. package/docs/SPEC.md +785 -0
  234. package/docs/docker-sandboxes.md +359 -0
  235. package/docs/nanoclaw-architecture-final.md +1063 -0
  236. package/docs/nanorepo-architecture.md +168 -0
  237. package/docs/skills-as-branches.md +662 -0
  238. package/groups/global/CLAUDE.md +58 -0
  239. package/groups/main/CLAUDE.md +246 -0
  240. package/launchd/com.nanoclaw.plist +32 -0
  241. package/package.json +45 -0
  242. package/repo-tokens/README.md +113 -0
  243. package/repo-tokens/action.yml +186 -0
  244. package/repo-tokens/badge.svg +23 -0
  245. package/repo-tokens/examples/green.svg +14 -0
  246. package/repo-tokens/examples/red.svg +14 -0
  247. package/repo-tokens/examples/yellow-green.svg +14 -0
  248. package/repo-tokens/examples/yellow.svg +14 -0
  249. package/scripts/run-migrations.ts +105 -0
  250. package/setup/container.ts +144 -0
  251. package/setup/environment.test.ts +121 -0
  252. package/setup/environment.ts +94 -0
  253. package/setup/groups.ts +229 -0
  254. package/setup/index.ts +58 -0
  255. package/setup/mounts.ts +115 -0
  256. package/setup/platform.test.ts +120 -0
  257. package/setup/platform.ts +132 -0
  258. package/setup/register.test.ts +257 -0
  259. package/setup/register.ts +177 -0
  260. package/setup/service.test.ts +187 -0
  261. package/setup/service.ts +362 -0
  262. package/setup/status.ts +16 -0
  263. package/setup/verify.ts +192 -0
  264. package/setup.sh +161 -0
  265. package/src/channels/index.ts +12 -0
  266. package/src/channels/registry.test.ts +42 -0
  267. package/src/channels/registry.ts +32 -0
  268. package/src/channels/web.ts +1856 -0
  269. package/src/cli.ts +209 -0
  270. package/src/config.ts +73 -0
  271. package/src/container-runner.test.ts +210 -0
  272. package/src/container-runner.ts +707 -0
  273. package/src/container-runtime.test.ts +149 -0
  274. package/src/container-runtime.ts +127 -0
  275. package/src/credential-proxy.test.ts +192 -0
  276. package/src/credential-proxy.ts +125 -0
  277. package/src/db.test.ts +484 -0
  278. package/src/db.ts +803 -0
  279. package/src/env.ts +42 -0
  280. package/src/formatting.test.ts +256 -0
  281. package/src/group-folder.test.ts +43 -0
  282. package/src/group-folder.ts +44 -0
  283. package/src/group-queue.test.ts +484 -0
  284. package/src/group-queue.ts +365 -0
  285. package/src/index.ts +731 -0
  286. package/src/ipc-auth.test.ts +679 -0
  287. package/src/ipc.ts +461 -0
  288. package/src/logger.ts +16 -0
  289. package/src/mount-security.ts +419 -0
  290. package/src/remote-control.test.ts +397 -0
  291. package/src/remote-control.ts +224 -0
  292. package/src/router.ts +52 -0
  293. package/src/routing.test.ts +170 -0
  294. package/src/sender-allowlist.test.ts +216 -0
  295. package/src/sender-allowlist.ts +128 -0
  296. package/src/session-commands.test.ts +247 -0
  297. package/src/session-commands.ts +163 -0
  298. package/src/task-scheduler.test.ts +129 -0
  299. package/src/task-scheduler.ts +295 -0
  300. package/src/timezone.test.ts +29 -0
  301. package/src/timezone.ts +16 -0
  302. package/src/types.ts +107 -0
  303. package/tsconfig.json +20 -0
  304. package/vitest.config.ts +7 -0
  305. package/vitest.skills.config.ts +7 -0
package/dist/index.js ADDED
@@ -0,0 +1,518 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { ASSISTANT_NAME, CREDENTIAL_PROXY_PORT, IDLE_TIMEOUT, POLL_INTERVAL, TIMEZONE, TRIGGER_PATTERN, } from './config.js';
4
+ import { startCredentialProxy } from './credential-proxy.js';
5
+ import './channels/index.js';
6
+ import { getChannelFactory, getRegisteredChannelNames, } from './channels/registry.js';
7
+ import { runContainerAgent, writeGroupsSnapshot, writeTasksSnapshot, } from './container-runner.js';
8
+ import { cleanupOrphans, ensureContainerRuntimeRunning, PROXY_BIND_HOST, } from './container-runtime.js';
9
+ import { getAllChats, getAllRegisteredGroups, getAllSessions, getAllTasks, getMessagesSince, getNewMessages, getRouterState, initDatabase, setRegisteredGroup, setRouterState, setSession, storeChatMetadata, storeMessage, } from './db.js';
10
+ import { GroupQueue } from './group-queue.js';
11
+ import { resolveGroupFolderPath } from './group-folder.js';
12
+ import { startIpcWatcher } from './ipc.js';
13
+ import { findChannel, formatMessages, formatOutbound } from './router.js';
14
+ import { restoreRemoteControl, startRemoteControl, stopRemoteControl, } from './remote-control.js';
15
+ import { isSenderAllowed, isTriggerAllowed, loadSenderAllowlist, shouldDropMessage, } from './sender-allowlist.js';
16
+ import { startSchedulerLoop } from './task-scheduler.js';
17
+ import { logger } from './logger.js';
18
+ // Re-export for backwards compatibility during refactor
19
+ export { escapeXml, formatMessages } from './router.js';
20
+ let lastTimestamp = '';
21
+ let sessions = {};
22
+ let registeredGroups = {};
23
+ let lastAgentTimestamp = {};
24
+ let messageLoopRunning = false;
25
+ const channels = [];
26
+ const queue = new GroupQueue();
27
+ function loadState() {
28
+ lastTimestamp = getRouterState('last_timestamp') || '';
29
+ const agentTs = getRouterState('last_agent_timestamp');
30
+ try {
31
+ lastAgentTimestamp = agentTs ? JSON.parse(agentTs) : {};
32
+ }
33
+ catch {
34
+ logger.warn('Corrupted last_agent_timestamp in DB, resetting');
35
+ lastAgentTimestamp = {};
36
+ }
37
+ sessions = getAllSessions();
38
+ registeredGroups = getAllRegisteredGroups();
39
+ logger.info({ groupCount: Object.keys(registeredGroups).length }, 'State loaded');
40
+ }
41
+ function saveState() {
42
+ setRouterState('last_timestamp', lastTimestamp);
43
+ setRouterState('last_agent_timestamp', JSON.stringify(lastAgentTimestamp));
44
+ }
45
+ function registerGroup(jid, group) {
46
+ let groupDir;
47
+ try {
48
+ groupDir = resolveGroupFolderPath(group.folder);
49
+ }
50
+ catch (err) {
51
+ logger.warn({ jid, folder: group.folder, err }, 'Rejecting group registration with invalid folder');
52
+ return;
53
+ }
54
+ registeredGroups[jid] = group;
55
+ setRegisteredGroup(jid, group);
56
+ // Create group folder
57
+ fs.mkdirSync(path.join(groupDir, 'logs'), { recursive: true });
58
+ logger.info({ jid, name: group.name, folder: group.folder }, 'Group registered');
59
+ }
60
+ /**
61
+ * Get available groups list for the agent.
62
+ * Returns groups ordered by most recent activity.
63
+ */
64
+ export function getAvailableGroups() {
65
+ const chats = getAllChats();
66
+ const registeredJids = new Set(Object.keys(registeredGroups));
67
+ return chats
68
+ .filter((c) => c.jid !== '__group_sync__' && c.is_group)
69
+ .map((c) => ({
70
+ jid: c.jid,
71
+ name: c.name,
72
+ lastActivity: c.last_message_time,
73
+ isRegistered: registeredJids.has(c.jid),
74
+ }));
75
+ }
76
+ /** @internal - exported for testing */
77
+ export function _setRegisteredGroups(groups) {
78
+ registeredGroups = groups;
79
+ }
80
+ /**
81
+ * Classify an Anthropic SDK error string and return a user-facing message
82
+ * plus whether the error is permanent (no retry) or transient (retry).
83
+ * Returns null if the error is not a recognized API error.
84
+ */
85
+ function formatApiError(error) {
86
+ if (/401|unauthorized|invalid.*key|expired.*key|authentication/i.test(error)) {
87
+ return {
88
+ message: '⚠️ Anthropic-Anmeldung fehlgeschlagen (401). Bitte prüfe die API-Konfiguration.',
89
+ permanent: true,
90
+ };
91
+ }
92
+ if (/429|rate.?limit/i.test(error)) {
93
+ return {
94
+ message: '⚠️ Anthropic-Anfragelimit erreicht (429). Ich versuche es in Kürze erneut.',
95
+ permanent: false,
96
+ };
97
+ }
98
+ if (/529|503|overload|unavailable/i.test(error)) {
99
+ return {
100
+ message: '⚠️ Anthropic ist gerade überlastet. Ich versuche es in Kürze erneut.',
101
+ permanent: false,
102
+ };
103
+ }
104
+ if (/\b500\b|internal.server.error/i.test(error)) {
105
+ return {
106
+ message: '⚠️ Anthropic-Serverfehler (500). Ich versuche es in Kürze erneut.',
107
+ permanent: false,
108
+ };
109
+ }
110
+ return null;
111
+ }
112
+ /**
113
+ * Process all pending messages for a group.
114
+ * Called by the GroupQueue when it's this group's turn.
115
+ */
116
+ async function processGroupMessages(chatJid) {
117
+ const group = registeredGroups[chatJid];
118
+ if (!group)
119
+ return true;
120
+ const channel = findChannel(channels, chatJid);
121
+ if (!channel) {
122
+ logger.warn({ chatJid }, 'No channel owns JID, skipping messages');
123
+ return true;
124
+ }
125
+ const isMainGroup = group.isMain === true;
126
+ const sinceTimestamp = lastAgentTimestamp[chatJid] || '';
127
+ const missedMessages = getMessagesSince(chatJid, sinceTimestamp, ASSISTANT_NAME);
128
+ if (missedMessages.length === 0)
129
+ return true;
130
+ // For non-main groups, check if trigger is required and present
131
+ if (!isMainGroup && group.requiresTrigger !== false) {
132
+ const allowlistCfg = loadSenderAllowlist();
133
+ const hasTrigger = missedMessages.some((m) => TRIGGER_PATTERN.test(m.content.trim()) &&
134
+ (m.is_from_me || isTriggerAllowed(chatJid, m.sender, allowlistCfg)));
135
+ if (!hasTrigger)
136
+ return true;
137
+ }
138
+ const prompt = formatMessages(missedMessages, TIMEZONE);
139
+ // Advance cursor so the piping path in startMessageLoop won't re-fetch
140
+ // these messages. Save the old cursor so we can roll back on error.
141
+ const previousCursor = lastAgentTimestamp[chatJid] || '';
142
+ lastAgentTimestamp[chatJid] =
143
+ missedMessages[missedMessages.length - 1].timestamp;
144
+ saveState();
145
+ logger.info({ group: group.name, messageCount: missedMessages.length }, 'Processing messages');
146
+ // Track idle timer for closing stdin when agent is idle
147
+ let idleTimer = null;
148
+ const resetIdleTimer = () => {
149
+ if (idleTimer)
150
+ clearTimeout(idleTimer);
151
+ idleTimer = setTimeout(() => {
152
+ logger.debug({ group: group.name }, 'Idle timeout, closing container stdin');
153
+ queue.closeStdin(chatJid);
154
+ }, IDLE_TIMEOUT);
155
+ };
156
+ await channel.setTyping?.(chatJid, true);
157
+ let hadError = false;
158
+ let outputSentToUser = false;
159
+ const output = await runAgent(group, prompt, chatJid, async (result) => {
160
+ // Streaming output callback — called for each agent result
161
+ if (result.result) {
162
+ const raw = typeof result.result === 'string'
163
+ ? result.result
164
+ : JSON.stringify(result.result);
165
+ // Strip <internal>...</internal> blocks — agent uses these for internal reasoning
166
+ const text = raw.replace(/<internal>[\s\S]*?<\/internal>/g, '').trim();
167
+ logger.info({ group: group.name }, `Agent output: ${raw.slice(0, 200)}`);
168
+ if (text) {
169
+ await channel.sendMessage(chatJid, text);
170
+ outputSentToUser = true;
171
+ }
172
+ // Only reset idle timer on actual results, not session-update markers (result: null)
173
+ resetIdleTimer();
174
+ }
175
+ if (result.status === 'success') {
176
+ queue.notifyIdle(chatJid);
177
+ }
178
+ if (result.status === 'error') {
179
+ hadError = true;
180
+ if (result.error && !outputSentToUser) {
181
+ const apiError = formatApiError(result.error);
182
+ if (apiError) {
183
+ logger.info({ group: group.name, permanent: apiError.permanent }, 'Anthropic API error detected, notifying user');
184
+ try {
185
+ await channel.sendMessage(chatJid, apiError.message);
186
+ // For permanent errors (e.g. 401), mark as "output sent" to prevent
187
+ // cursor rollback and infinite retry. For transient errors (429/529/500),
188
+ // leave outputSentToUser=false so the cursor rolls back and retries.
189
+ if (apiError.permanent) {
190
+ outputSentToUser = true;
191
+ }
192
+ }
193
+ catch { /* ignore send failure */ }
194
+ }
195
+ }
196
+ }
197
+ });
198
+ await channel.setTyping?.(chatJid, false);
199
+ if (idleTimer)
200
+ clearTimeout(idleTimer);
201
+ if (output === 'error' || hadError) {
202
+ // If we already sent output to the user, don't roll back the cursor —
203
+ // the user got their response and re-processing would send duplicates.
204
+ if (outputSentToUser) {
205
+ logger.warn({ group: group.name }, 'Agent error after output was sent, skipping cursor rollback to prevent duplicates');
206
+ return true;
207
+ }
208
+ // Roll back cursor so retries can re-process these messages
209
+ lastAgentTimestamp[chatJid] = previousCursor;
210
+ saveState();
211
+ logger.warn({ group: group.name }, 'Agent error, rolled back message cursor for retry');
212
+ return false;
213
+ }
214
+ return true;
215
+ }
216
+ async function runAgent(group, prompt, chatJid, onOutput) {
217
+ const isMain = group.isMain === true;
218
+ const sessionId = sessions[group.folder];
219
+ // Update tasks snapshot for container to read (filtered by group)
220
+ const tasks = getAllTasks();
221
+ writeTasksSnapshot(group.folder, isMain, tasks.map((t) => ({
222
+ id: t.id,
223
+ groupFolder: t.group_folder,
224
+ prompt: t.prompt,
225
+ schedule_type: t.schedule_type,
226
+ schedule_value: t.schedule_value,
227
+ status: t.status,
228
+ next_run: t.next_run,
229
+ })));
230
+ // Update available groups snapshot (main group only can see all groups)
231
+ const availableGroups = getAvailableGroups();
232
+ writeGroupsSnapshot(group.folder, isMain, availableGroups, new Set(Object.keys(registeredGroups)));
233
+ // Wrap onOutput to track session ID from streamed results
234
+ const wrappedOnOutput = onOutput
235
+ ? async (output) => {
236
+ if (output.newSessionId) {
237
+ sessions[group.folder] = output.newSessionId;
238
+ setSession(group.folder, output.newSessionId);
239
+ }
240
+ await onOutput(output);
241
+ }
242
+ : undefined;
243
+ try {
244
+ const output = await runContainerAgent(group, {
245
+ prompt,
246
+ sessionId,
247
+ groupFolder: group.folder,
248
+ chatJid,
249
+ isMain,
250
+ assistantName: ASSISTANT_NAME,
251
+ }, (proc, containerName) => queue.registerProcess(chatJid, proc, containerName, group.folder), wrappedOnOutput);
252
+ if (output.newSessionId) {
253
+ sessions[group.folder] = output.newSessionId;
254
+ setSession(group.folder, output.newSessionId);
255
+ }
256
+ if (output.status === 'error') {
257
+ logger.error({ group: group.name, error: output.error }, 'Container agent error');
258
+ return 'error';
259
+ }
260
+ return 'success';
261
+ }
262
+ catch (err) {
263
+ logger.error({ group: group.name, err }, 'Agent error');
264
+ return 'error';
265
+ }
266
+ }
267
+ async function startMessageLoop() {
268
+ if (messageLoopRunning) {
269
+ logger.debug('Message loop already running, skipping duplicate start');
270
+ return;
271
+ }
272
+ messageLoopRunning = true;
273
+ logger.info(`NanoClaw running (trigger: @${ASSISTANT_NAME})`);
274
+ while (true) {
275
+ try {
276
+ const jids = Object.keys(registeredGroups);
277
+ const { messages, newTimestamp } = getNewMessages(jids, lastTimestamp, ASSISTANT_NAME);
278
+ if (messages.length > 0) {
279
+ logger.info({ count: messages.length }, 'New messages');
280
+ // Advance the "seen" cursor for all messages immediately
281
+ lastTimestamp = newTimestamp;
282
+ saveState();
283
+ // Deduplicate by group
284
+ const messagesByGroup = new Map();
285
+ for (const msg of messages) {
286
+ const existing = messagesByGroup.get(msg.chat_jid);
287
+ if (existing) {
288
+ existing.push(msg);
289
+ }
290
+ else {
291
+ messagesByGroup.set(msg.chat_jid, [msg]);
292
+ }
293
+ }
294
+ for (const [chatJid, groupMessages] of messagesByGroup) {
295
+ const group = registeredGroups[chatJid];
296
+ if (!group)
297
+ continue;
298
+ const channel = findChannel(channels, chatJid);
299
+ if (!channel) {
300
+ logger.warn({ chatJid }, 'No channel owns JID, skipping messages');
301
+ continue;
302
+ }
303
+ const isMainGroup = group.isMain === true;
304
+ const needsTrigger = !isMainGroup && group.requiresTrigger !== false;
305
+ // For non-main groups, only act on trigger messages.
306
+ // Non-trigger messages accumulate in DB and get pulled as
307
+ // context when a trigger eventually arrives.
308
+ if (needsTrigger) {
309
+ const allowlistCfg = loadSenderAllowlist();
310
+ const hasTrigger = groupMessages.some((m) => TRIGGER_PATTERN.test(m.content.trim()) &&
311
+ (m.is_from_me ||
312
+ isTriggerAllowed(chatJid, m.sender, allowlistCfg)));
313
+ if (!hasTrigger)
314
+ continue;
315
+ }
316
+ // Pull all messages since lastAgentTimestamp so non-trigger
317
+ // context that accumulated between triggers is included.
318
+ const allPending = getMessagesSince(chatJid, lastAgentTimestamp[chatJid] || '', ASSISTANT_NAME);
319
+ const messagesToSend = allPending.length > 0 ? allPending : groupMessages;
320
+ const formatted = formatMessages(messagesToSend, TIMEZONE);
321
+ if (queue.sendMessage(chatJid, formatted)) {
322
+ logger.debug({ chatJid, count: messagesToSend.length }, 'Piped messages to active container');
323
+ lastAgentTimestamp[chatJid] =
324
+ messagesToSend[messagesToSend.length - 1].timestamp;
325
+ saveState();
326
+ // Show typing indicator while the container processes the piped message
327
+ channel
328
+ .setTyping?.(chatJid, true)
329
+ ?.catch((err) => logger.warn({ chatJid, err }, 'Failed to set typing indicator'));
330
+ }
331
+ else {
332
+ // No active container — enqueue for a new one
333
+ queue.enqueueMessageCheck(chatJid);
334
+ }
335
+ }
336
+ }
337
+ }
338
+ catch (err) {
339
+ logger.error({ err }, 'Error in message loop');
340
+ }
341
+ await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL));
342
+ }
343
+ }
344
+ /**
345
+ * Startup recovery: check for unprocessed messages in registered groups.
346
+ * Handles crash between advancing lastTimestamp and processing messages.
347
+ */
348
+ function recoverPendingMessages() {
349
+ for (const [chatJid, group] of Object.entries(registeredGroups)) {
350
+ const sinceTimestamp = lastAgentTimestamp[chatJid] || '';
351
+ const pending = getMessagesSince(chatJid, sinceTimestamp, ASSISTANT_NAME);
352
+ if (pending.length > 0) {
353
+ logger.info({ group: group.name, pendingCount: pending.length }, 'Recovery: found unprocessed messages');
354
+ queue.enqueueMessageCheck(chatJid);
355
+ }
356
+ }
357
+ }
358
+ function ensureContainerSystemRunning() {
359
+ ensureContainerRuntimeRunning();
360
+ cleanupOrphans();
361
+ }
362
+ export async function main() {
363
+ ensureContainerSystemRunning();
364
+ initDatabase();
365
+ logger.info('Database initialized');
366
+ loadState();
367
+ restoreRemoteControl();
368
+ // Start credential proxy (containers route API calls through this)
369
+ const proxyServer = await startCredentialProxy(CREDENTIAL_PROXY_PORT, PROXY_BIND_HOST);
370
+ // Graceful shutdown handlers
371
+ const shutdown = async (signal) => {
372
+ logger.info({ signal }, 'Shutdown signal received');
373
+ proxyServer.close();
374
+ await queue.shutdown(10000);
375
+ for (const ch of channels)
376
+ await ch.disconnect();
377
+ process.exit(0);
378
+ };
379
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
380
+ process.on('SIGINT', () => shutdown('SIGINT'));
381
+ // Handle /remote-control and /remote-control-end commands
382
+ async function handleRemoteControl(command, chatJid, msg) {
383
+ const group = registeredGroups[chatJid];
384
+ if (!group?.isMain) {
385
+ logger.warn({ chatJid, sender: msg.sender }, 'Remote control rejected: not main group');
386
+ return;
387
+ }
388
+ const channel = findChannel(channels, chatJid);
389
+ if (!channel)
390
+ return;
391
+ if (command === '/remote-control') {
392
+ const result = await startRemoteControl(msg.sender, chatJid, process.cwd());
393
+ if (result.ok) {
394
+ await channel.sendMessage(chatJid, result.url);
395
+ }
396
+ else {
397
+ await channel.sendMessage(chatJid, `Remote Control failed: ${result.error}`);
398
+ }
399
+ }
400
+ else {
401
+ const result = stopRemoteControl();
402
+ if (result.ok) {
403
+ await channel.sendMessage(chatJid, 'Remote Control session ended.');
404
+ }
405
+ else {
406
+ await channel.sendMessage(chatJid, result.error);
407
+ }
408
+ }
409
+ }
410
+ // Channel callbacks (shared by all channels)
411
+ const channelOpts = {
412
+ onMessage: (chatJid, msg) => {
413
+ // Remote control commands — intercept before storage
414
+ const trimmed = msg.content.trim();
415
+ if (trimmed === '/remote-control' || trimmed === '/remote-control-end') {
416
+ handleRemoteControl(trimmed, chatJid, msg).catch((err) => logger.error({ err, chatJid }, 'Remote control command error'));
417
+ return;
418
+ }
419
+ // Sender allowlist drop mode: discard messages from denied senders before storing
420
+ if (!msg.is_from_me && !msg.is_bot_message && registeredGroups[chatJid]) {
421
+ const cfg = loadSenderAllowlist();
422
+ if (shouldDropMessage(chatJid, cfg) &&
423
+ !isSenderAllowed(chatJid, msg.sender, cfg)) {
424
+ if (cfg.logDenied) {
425
+ logger.debug({ chatJid, sender: msg.sender }, 'sender-allowlist: dropping message (drop mode)');
426
+ }
427
+ return;
428
+ }
429
+ }
430
+ storeMessage(msg);
431
+ },
432
+ onChatMetadata: (chatJid, timestamp, name, channel, isGroup) => storeChatMetadata(chatJid, timestamp, name, channel, isGroup),
433
+ registeredGroups: () => registeredGroups,
434
+ };
435
+ // Create and connect all registered channels.
436
+ // Each channel self-registers via the barrel import above.
437
+ // Factories return null when credentials are missing, so unconfigured channels are skipped.
438
+ for (const channelName of getRegisteredChannelNames()) {
439
+ const factory = getChannelFactory(channelName);
440
+ const channel = factory(channelOpts);
441
+ if (!channel) {
442
+ logger.warn({ channel: channelName }, 'Channel installed but credentials missing — skipping. Check .env or re-run the channel skill.');
443
+ continue;
444
+ }
445
+ channels.push(channel);
446
+ await channel.connect();
447
+ }
448
+ if (channels.length === 0) {
449
+ logger.fatal('No channels connected');
450
+ process.exit(1);
451
+ }
452
+ // Start subsystems (independently of connection handler)
453
+ startSchedulerLoop({
454
+ registeredGroups: () => registeredGroups,
455
+ getSessions: () => sessions,
456
+ queue,
457
+ onProcess: (groupJid, proc, containerName, groupFolder) => queue.registerProcess(groupJid, proc, containerName, groupFolder),
458
+ sendMessage: async (jid, rawText) => {
459
+ const channel = findChannel(channels, jid);
460
+ if (!channel) {
461
+ logger.warn({ jid }, 'No channel owns JID, cannot send message');
462
+ return;
463
+ }
464
+ const text = formatOutbound(rawText);
465
+ if (text)
466
+ await channel.sendMessage(jid, text);
467
+ },
468
+ });
469
+ startIpcWatcher({
470
+ sendMessage: (jid, text) => {
471
+ const channel = findChannel(channels, jid);
472
+ if (!channel)
473
+ throw new Error(`No channel for JID: ${jid}`);
474
+ return channel.sendMessage(jid, text);
475
+ },
476
+ registeredGroups: () => registeredGroups,
477
+ registerGroup,
478
+ syncGroups: async (force) => {
479
+ await Promise.all(channels
480
+ .filter((ch) => ch.syncGroups)
481
+ .map((ch) => ch.syncGroups(force)));
482
+ },
483
+ getAvailableGroups,
484
+ writeGroupsSnapshot: (gf, im, ag, rj) => writeGroupsSnapshot(gf, im, ag, rj),
485
+ onTasksChanged: () => {
486
+ const tasks = getAllTasks();
487
+ const taskRows = tasks.map((t) => ({
488
+ id: t.id,
489
+ groupFolder: t.group_folder,
490
+ prompt: t.prompt,
491
+ schedule_type: t.schedule_type,
492
+ schedule_value: t.schedule_value,
493
+ status: t.status,
494
+ next_run: t.next_run,
495
+ }));
496
+ for (const group of Object.values(registeredGroups)) {
497
+ writeTasksSnapshot(group.folder, group.isMain === true, taskRows);
498
+ }
499
+ },
500
+ });
501
+ queue.setProcessMessagesFn(processGroupMessages);
502
+ recoverPendingMessages();
503
+ startMessageLoop().catch((err) => {
504
+ logger.fatal({ err }, 'Message loop crashed unexpectedly');
505
+ process.exit(1);
506
+ });
507
+ }
508
+ // Guard: only run when executed directly, not when imported by tests
509
+ const isDirectRun = process.argv[1] &&
510
+ new URL(import.meta.url).pathname ===
511
+ new URL(`file://${process.argv[1]}`).pathname;
512
+ if (isDirectRun) {
513
+ main().catch((err) => {
514
+ logger.error({ err }, 'Failed to start NanoClaw');
515
+ process.exit(1);
516
+ });
517
+ }
518
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ipc-auth.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc-auth.test.d.ts","sourceRoot":"","sources":["../src/ipc-auth.test.ts"],"names":[],"mappings":""}