@rozek/nanoclaw 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (306) 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 +325 -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.json +21 -0
  68. package/container/agent-runner/src/index.ts +774 -0
  69. package/container/agent-runner/src/ipc-mcp-stdio.ts +338 -0
  70. package/container/agent-runner/tsconfig.json +15 -0
  71. package/container/build.sh +23 -0
  72. package/container/skills/agent-browser/SKILL.md +159 -0
  73. package/container/skills/capabilities/SKILL.md +100 -0
  74. package/container/skills/cwd/SKILL.md +32 -0
  75. package/container/skills/pwd/SKILL.md +19 -0
  76. package/container/skills/status/SKILL.md +104 -0
  77. package/dist/channels/index.d.ts +2 -0
  78. package/dist/channels/index.d.ts.map +1 -0
  79. package/dist/channels/index.js +10 -0
  80. package/dist/channels/index.js.map +1 -0
  81. package/dist/channels/registry.d.ts +13 -0
  82. package/dist/channels/registry.d.ts.map +1 -0
  83. package/dist/channels/registry.js +11 -0
  84. package/dist/channels/registry.js.map +1 -0
  85. package/dist/channels/registry.test.d.ts +2 -0
  86. package/dist/channels/registry.test.d.ts.map +1 -0
  87. package/dist/channels/registry.test.js +32 -0
  88. package/dist/channels/registry.test.js.map +1 -0
  89. package/dist/channels/web.d.ts +2 -0
  90. package/dist/channels/web.d.ts.map +1 -0
  91. package/dist/channels/web.js +1843 -0
  92. package/dist/channels/web.js.map +1 -0
  93. package/dist/cli.d.ts +11 -0
  94. package/dist/cli.d.ts.map +1 -0
  95. package/dist/cli.js +182 -0
  96. package/dist/cli.js.map +1 -0
  97. package/dist/config.d.ts +19 -0
  98. package/dist/config.d.ts.map +1 -0
  99. package/dist/config.js +36 -0
  100. package/dist/config.js.map +1 -0
  101. package/dist/container-runner.d.ts +44 -0
  102. package/dist/container-runner.d.ts.map +1 -0
  103. package/dist/container-runner.js +511 -0
  104. package/dist/container-runner.js.map +1 -0
  105. package/dist/container-runner.test.d.ts +2 -0
  106. package/dist/container-runner.test.d.ts.map +1 -0
  107. package/dist/container-runner.test.js +150 -0
  108. package/dist/container-runner.test.js.map +1 -0
  109. package/dist/container-runtime.d.ts +22 -0
  110. package/dist/container-runtime.d.ts.map +1 -0
  111. package/dist/container-runtime.js +96 -0
  112. package/dist/container-runtime.js.map +1 -0
  113. package/dist/container-runtime.test.d.ts +2 -0
  114. package/dist/container-runtime.test.d.ts.map +1 -0
  115. package/dist/container-runtime.test.js +93 -0
  116. package/dist/container-runtime.test.js.map +1 -0
  117. package/dist/credential-proxy.d.ts +21 -0
  118. package/dist/credential-proxy.d.ts.map +1 -0
  119. package/dist/credential-proxy.js +95 -0
  120. package/dist/credential-proxy.js.map +1 -0
  121. package/dist/credential-proxy.test.d.ts +2 -0
  122. package/dist/credential-proxy.test.d.ts.map +1 -0
  123. package/dist/credential-proxy.test.js +134 -0
  124. package/dist/credential-proxy.test.js.map +1 -0
  125. package/dist/db.d.ts +115 -0
  126. package/dist/db.d.ts.map +1 -0
  127. package/dist/db.js +549 -0
  128. package/dist/db.js.map +1 -0
  129. package/dist/db.test.d.ts +2 -0
  130. package/dist/db.test.d.ts.map +1 -0
  131. package/dist/db.test.js +360 -0
  132. package/dist/db.test.js.map +1 -0
  133. package/dist/env.d.ts +8 -0
  134. package/dist/env.d.ts.map +1 -0
  135. package/dist/env.js +42 -0
  136. package/dist/env.js.map +1 -0
  137. package/dist/formatting.test.d.ts +2 -0
  138. package/dist/formatting.test.d.ts.map +1 -0
  139. package/dist/formatting.test.js +183 -0
  140. package/dist/formatting.test.js.map +1 -0
  141. package/dist/group-folder.d.ts +5 -0
  142. package/dist/group-folder.d.ts.map +1 -0
  143. package/dist/group-folder.js +44 -0
  144. package/dist/group-folder.js.map +1 -0
  145. package/dist/group-folder.test.d.ts +2 -0
  146. package/dist/group-folder.test.d.ts.map +1 -0
  147. package/dist/group-folder.test.js +29 -0
  148. package/dist/group-folder.test.js.map +1 -0
  149. package/dist/group-queue.d.ts +40 -0
  150. package/dist/group-queue.d.ts.map +1 -0
  151. package/dist/group-queue.js +276 -0
  152. package/dist/group-queue.js.map +1 -0
  153. package/dist/group-queue.test.d.ts +2 -0
  154. package/dist/group-queue.test.d.ts.map +1 -0
  155. package/dist/group-queue.test.js +341 -0
  156. package/dist/group-queue.test.js.map +1 -0
  157. package/dist/index.d.ts +13 -0
  158. package/dist/index.d.ts.map +1 -0
  159. package/dist/index.js +592 -0
  160. package/dist/index.js.map +1 -0
  161. package/dist/ipc-auth.test.d.ts +2 -0
  162. package/dist/ipc-auth.test.d.ts.map +1 -0
  163. package/dist/ipc-auth.test.js +434 -0
  164. package/dist/ipc-auth.test.js.map +1 -0
  165. package/dist/ipc.d.ts +32 -0
  166. package/dist/ipc.d.ts.map +1 -0
  167. package/dist/ipc.js +311 -0
  168. package/dist/ipc.js.map +1 -0
  169. package/dist/logger.d.ts +3 -0
  170. package/dist/logger.d.ts.map +1 -0
  171. package/dist/logger.js +14 -0
  172. package/dist/logger.js.map +1 -0
  173. package/dist/mount-security.d.ts +34 -0
  174. package/dist/mount-security.d.ts.map +1 -0
  175. package/dist/mount-security.js +325 -0
  176. package/dist/mount-security.js.map +1 -0
  177. package/dist/remote-control.d.ts +32 -0
  178. package/dist/remote-control.d.ts.map +1 -0
  179. package/dist/remote-control.js +185 -0
  180. package/dist/remote-control.js.map +1 -0
  181. package/dist/remote-control.test.d.ts +2 -0
  182. package/dist/remote-control.test.d.ts.map +1 -0
  183. package/dist/remote-control.test.js +321 -0
  184. package/dist/remote-control.test.js.map +1 -0
  185. package/dist/router.d.ts +8 -0
  186. package/dist/router.d.ts.map +1 -0
  187. package/dist/router.js +37 -0
  188. package/dist/router.js.map +1 -0
  189. package/dist/routing.test.d.ts +2 -0
  190. package/dist/routing.test.d.ts.map +1 -0
  191. package/dist/routing.test.js +81 -0
  192. package/dist/routing.test.js.map +1 -0
  193. package/dist/sender-allowlist.d.ts +14 -0
  194. package/dist/sender-allowlist.d.ts.map +1 -0
  195. package/dist/sender-allowlist.js +79 -0
  196. package/dist/sender-allowlist.js.map +1 -0
  197. package/dist/sender-allowlist.test.d.ts +2 -0
  198. package/dist/sender-allowlist.test.d.ts.map +1 -0
  199. package/dist/sender-allowlist.test.js +186 -0
  200. package/dist/sender-allowlist.test.js.map +1 -0
  201. package/dist/session-commands.d.ts +47 -0
  202. package/dist/session-commands.d.ts.map +1 -0
  203. package/dist/session-commands.js +104 -0
  204. package/dist/session-commands.js.map +1 -0
  205. package/dist/session-commands.test.d.ts +2 -0
  206. package/dist/session-commands.test.d.ts.map +1 -0
  207. package/dist/session-commands.test.js +194 -0
  208. package/dist/session-commands.test.js.map +1 -0
  209. package/dist/task-scheduler.d.ts +22 -0
  210. package/dist/task-scheduler.d.ts.map +1 -0
  211. package/dist/task-scheduler.js +241 -0
  212. package/dist/task-scheduler.js.map +1 -0
  213. package/dist/task-scheduler.test.d.ts +2 -0
  214. package/dist/task-scheduler.test.d.ts.map +1 -0
  215. package/dist/task-scheduler.test.js +107 -0
  216. package/dist/task-scheduler.test.js.map +1 -0
  217. package/dist/timezone.d.ts +6 -0
  218. package/dist/timezone.d.ts.map +1 -0
  219. package/dist/timezone.js +17 -0
  220. package/dist/timezone.js.map +1 -0
  221. package/dist/timezone.test.d.ts +2 -0
  222. package/dist/timezone.test.d.ts.map +1 -0
  223. package/dist/timezone.test.js +23 -0
  224. package/dist/timezone.test.js.map +1 -0
  225. package/dist/types.d.ts +79 -0
  226. package/dist/types.d.ts.map +1 -0
  227. package/dist/types.js +2 -0
  228. package/dist/types.js.map +1 -0
  229. package/docs/APPLE-CONTAINER-NETWORKING.md +90 -0
  230. package/docs/DEBUG_CHECKLIST.md +143 -0
  231. package/docs/REQUIREMENTS.md +196 -0
  232. package/docs/SDK_DEEP_DIVE.md +643 -0
  233. package/docs/SECURITY.md +122 -0
  234. package/docs/SPEC.md +785 -0
  235. package/docs/docker-sandboxes.md +359 -0
  236. package/docs/nanoclaw-architecture-final.md +1063 -0
  237. package/docs/nanorepo-architecture.md +168 -0
  238. package/docs/skills-as-branches.md +662 -0
  239. package/groups/global/CLAUDE.md +58 -0
  240. package/groups/main/CLAUDE.md +246 -0
  241. package/launchd/com.nanoclaw.plist +32 -0
  242. package/package.json +45 -0
  243. package/repo-tokens/README.md +113 -0
  244. package/repo-tokens/action.yml +186 -0
  245. package/repo-tokens/badge.svg +23 -0
  246. package/repo-tokens/examples/green.svg +14 -0
  247. package/repo-tokens/examples/red.svg +14 -0
  248. package/repo-tokens/examples/yellow-green.svg +14 -0
  249. package/repo-tokens/examples/yellow.svg +14 -0
  250. package/scripts/run-migrations.ts +105 -0
  251. package/setup/container.ts +144 -0
  252. package/setup/environment.test.ts +121 -0
  253. package/setup/environment.ts +94 -0
  254. package/setup/groups.ts +229 -0
  255. package/setup/index.ts +58 -0
  256. package/setup/mounts.ts +115 -0
  257. package/setup/platform.test.ts +120 -0
  258. package/setup/platform.ts +132 -0
  259. package/setup/register.test.ts +257 -0
  260. package/setup/register.ts +177 -0
  261. package/setup/service.test.ts +187 -0
  262. package/setup/service.ts +362 -0
  263. package/setup/status.ts +16 -0
  264. package/setup/verify.ts +192 -0
  265. package/setup.sh +161 -0
  266. package/src/channels/index.ts +15 -0
  267. package/src/channels/registry.test.ts +42 -0
  268. package/src/channels/registry.ts +32 -0
  269. package/src/channels/web.ts +1931 -0
  270. package/src/cli.ts +209 -0
  271. package/src/config.ts +73 -0
  272. package/src/container-runner.test.ts +210 -0
  273. package/src/container-runner.ts +768 -0
  274. package/src/container-runtime.test.ts +149 -0
  275. package/src/container-runtime.ts +127 -0
  276. package/src/credential-proxy.test.ts +192 -0
  277. package/src/credential-proxy.ts +125 -0
  278. package/src/db.test.ts +484 -0
  279. package/src/db.ts +803 -0
  280. package/src/env.ts +42 -0
  281. package/src/formatting.test.ts +256 -0
  282. package/src/group-folder.test.ts +43 -0
  283. package/src/group-folder.ts +44 -0
  284. package/src/group-queue.test.ts +484 -0
  285. package/src/group-queue.ts +379 -0
  286. package/src/index.ts +832 -0
  287. package/src/ipc-auth.test.ts +679 -0
  288. package/src/ipc.ts +461 -0
  289. package/src/logger.ts +16 -0
  290. package/src/mount-security.ts +419 -0
  291. package/src/remote-control.test.ts +397 -0
  292. package/src/remote-control.ts +224 -0
  293. package/src/router.ts +52 -0
  294. package/src/routing.test.ts +170 -0
  295. package/src/sender-allowlist.test.ts +216 -0
  296. package/src/sender-allowlist.ts +128 -0
  297. package/src/session-commands.test.ts +247 -0
  298. package/src/session-commands.ts +163 -0
  299. package/src/task-scheduler.test.ts +129 -0
  300. package/src/task-scheduler.ts +328 -0
  301. package/src/timezone.test.ts +29 -0
  302. package/src/timezone.ts +16 -0
  303. package/src/types.ts +109 -0
  304. package/tsconfig.json +20 -0
  305. package/vitest.config.ts +7 -0
  306. package/vitest.skills.config.ts +7 -0
@@ -0,0 +1,434 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { _initTestDatabase, createTask, getAllTasks, getRegisteredGroup, getTaskById, setRegisteredGroup, } from './db.js';
3
+ import { processTaskIpc } from './ipc.js';
4
+ // Set up registered groups used across tests
5
+ const MAIN_GROUP = {
6
+ name: 'Main',
7
+ folder: 'whatsapp_main',
8
+ trigger: 'always',
9
+ added_at: '2024-01-01T00:00:00.000Z',
10
+ isMain: true,
11
+ };
12
+ const OTHER_GROUP = {
13
+ name: 'Other',
14
+ folder: 'other-group',
15
+ trigger: '@Andy',
16
+ added_at: '2024-01-01T00:00:00.000Z',
17
+ };
18
+ const THIRD_GROUP = {
19
+ name: 'Third',
20
+ folder: 'third-group',
21
+ trigger: '@Andy',
22
+ added_at: '2024-01-01T00:00:00.000Z',
23
+ };
24
+ let groups;
25
+ let deps;
26
+ beforeEach(() => {
27
+ _initTestDatabase();
28
+ groups = {
29
+ 'main@g.us': MAIN_GROUP,
30
+ 'other@g.us': OTHER_GROUP,
31
+ 'third@g.us': THIRD_GROUP,
32
+ };
33
+ // Populate DB as well
34
+ setRegisteredGroup('main@g.us', MAIN_GROUP);
35
+ setRegisteredGroup('other@g.us', OTHER_GROUP);
36
+ setRegisteredGroup('third@g.us', THIRD_GROUP);
37
+ deps = {
38
+ sendMessage: async () => { },
39
+ registeredGroups: () => groups,
40
+ registerGroup: (jid, group) => {
41
+ groups[jid] = group;
42
+ setRegisteredGroup(jid, group);
43
+ // Mock the fs.mkdirSync that registerGroup does
44
+ },
45
+ syncGroups: async () => { },
46
+ getAvailableGroups: () => [],
47
+ writeGroupsSnapshot: () => { },
48
+ onTasksChanged: () => { },
49
+ };
50
+ });
51
+ // --- schedule_task authorization ---
52
+ describe('schedule_task authorization', () => {
53
+ it('main group can schedule for another group', async () => {
54
+ await processTaskIpc({
55
+ type: 'schedule_task',
56
+ prompt: 'do something',
57
+ schedule_type: 'once',
58
+ schedule_value: '2025-06-01T00:00:00',
59
+ targetJid: 'other@g.us',
60
+ }, 'whatsapp_main', true, deps);
61
+ // Verify task was created in DB for the other group
62
+ const allTasks = getAllTasks();
63
+ expect(allTasks.length).toBe(1);
64
+ expect(allTasks[0].group_folder).toBe('other-group');
65
+ });
66
+ it('non-main group can schedule for itself', async () => {
67
+ await processTaskIpc({
68
+ type: 'schedule_task',
69
+ prompt: 'self task',
70
+ schedule_type: 'once',
71
+ schedule_value: '2025-06-01T00:00:00',
72
+ targetJid: 'other@g.us',
73
+ }, 'other-group', false, deps);
74
+ const allTasks = getAllTasks();
75
+ expect(allTasks.length).toBe(1);
76
+ expect(allTasks[0].group_folder).toBe('other-group');
77
+ });
78
+ it('non-main group cannot schedule for another group', async () => {
79
+ await processTaskIpc({
80
+ type: 'schedule_task',
81
+ prompt: 'unauthorized',
82
+ schedule_type: 'once',
83
+ schedule_value: '2025-06-01T00:00:00',
84
+ targetJid: 'main@g.us',
85
+ }, 'other-group', false, deps);
86
+ const allTasks = getAllTasks();
87
+ expect(allTasks.length).toBe(0);
88
+ });
89
+ it('rejects schedule_task for unregistered target JID', async () => {
90
+ await processTaskIpc({
91
+ type: 'schedule_task',
92
+ prompt: 'no target',
93
+ schedule_type: 'once',
94
+ schedule_value: '2025-06-01T00:00:00',
95
+ targetJid: 'unknown@g.us',
96
+ }, 'whatsapp_main', true, deps);
97
+ const allTasks = getAllTasks();
98
+ expect(allTasks.length).toBe(0);
99
+ });
100
+ });
101
+ // --- pause_task authorization ---
102
+ describe('pause_task authorization', () => {
103
+ beforeEach(() => {
104
+ createTask({
105
+ id: 'task-main',
106
+ group_folder: 'whatsapp_main',
107
+ chat_jid: 'main@g.us',
108
+ prompt: 'main task',
109
+ schedule_type: 'once',
110
+ schedule_value: '2025-06-01T00:00:00',
111
+ context_mode: 'isolated',
112
+ next_run: '2025-06-01T00:00:00.000Z',
113
+ status: 'active',
114
+ created_at: '2024-01-01T00:00:00.000Z',
115
+ });
116
+ createTask({
117
+ id: 'task-other',
118
+ group_folder: 'other-group',
119
+ chat_jid: 'other@g.us',
120
+ prompt: 'other task',
121
+ schedule_type: 'once',
122
+ schedule_value: '2025-06-01T00:00:00',
123
+ context_mode: 'isolated',
124
+ next_run: '2025-06-01T00:00:00.000Z',
125
+ status: 'active',
126
+ created_at: '2024-01-01T00:00:00.000Z',
127
+ });
128
+ });
129
+ it('main group can pause any task', async () => {
130
+ await processTaskIpc({ type: 'pause_task', taskId: 'task-other' }, 'whatsapp_main', true, deps);
131
+ expect(getTaskById('task-other').status).toBe('paused');
132
+ });
133
+ it('non-main group can pause its own task', async () => {
134
+ await processTaskIpc({ type: 'pause_task', taskId: 'task-other' }, 'other-group', false, deps);
135
+ expect(getTaskById('task-other').status).toBe('paused');
136
+ });
137
+ it('non-main group cannot pause another groups task', async () => {
138
+ await processTaskIpc({ type: 'pause_task', taskId: 'task-main' }, 'other-group', false, deps);
139
+ expect(getTaskById('task-main').status).toBe('active');
140
+ });
141
+ });
142
+ // --- resume_task authorization ---
143
+ describe('resume_task authorization', () => {
144
+ beforeEach(() => {
145
+ createTask({
146
+ id: 'task-paused',
147
+ group_folder: 'other-group',
148
+ chat_jid: 'other@g.us',
149
+ prompt: 'paused task',
150
+ schedule_type: 'once',
151
+ schedule_value: '2025-06-01T00:00:00',
152
+ context_mode: 'isolated',
153
+ next_run: '2025-06-01T00:00:00.000Z',
154
+ status: 'paused',
155
+ created_at: '2024-01-01T00:00:00.000Z',
156
+ });
157
+ });
158
+ it('main group can resume any task', async () => {
159
+ await processTaskIpc({ type: 'resume_task', taskId: 'task-paused' }, 'whatsapp_main', true, deps);
160
+ expect(getTaskById('task-paused').status).toBe('active');
161
+ });
162
+ it('non-main group can resume its own task', async () => {
163
+ await processTaskIpc({ type: 'resume_task', taskId: 'task-paused' }, 'other-group', false, deps);
164
+ expect(getTaskById('task-paused').status).toBe('active');
165
+ });
166
+ it('non-main group cannot resume another groups task', async () => {
167
+ await processTaskIpc({ type: 'resume_task', taskId: 'task-paused' }, 'third-group', false, deps);
168
+ expect(getTaskById('task-paused').status).toBe('paused');
169
+ });
170
+ });
171
+ // --- cancel_task authorization ---
172
+ describe('cancel_task authorization', () => {
173
+ it('main group can cancel any task', async () => {
174
+ createTask({
175
+ id: 'task-to-cancel',
176
+ group_folder: 'other-group',
177
+ chat_jid: 'other@g.us',
178
+ prompt: 'cancel me',
179
+ schedule_type: 'once',
180
+ schedule_value: '2025-06-01T00:00:00',
181
+ context_mode: 'isolated',
182
+ next_run: null,
183
+ status: 'active',
184
+ created_at: '2024-01-01T00:00:00.000Z',
185
+ });
186
+ await processTaskIpc({ type: 'cancel_task', taskId: 'task-to-cancel' }, 'whatsapp_main', true, deps);
187
+ expect(getTaskById('task-to-cancel')).toBeUndefined();
188
+ });
189
+ it('non-main group can cancel its own task', async () => {
190
+ createTask({
191
+ id: 'task-own',
192
+ group_folder: 'other-group',
193
+ chat_jid: 'other@g.us',
194
+ prompt: 'my task',
195
+ schedule_type: 'once',
196
+ schedule_value: '2025-06-01T00:00:00',
197
+ context_mode: 'isolated',
198
+ next_run: null,
199
+ status: 'active',
200
+ created_at: '2024-01-01T00:00:00.000Z',
201
+ });
202
+ await processTaskIpc({ type: 'cancel_task', taskId: 'task-own' }, 'other-group', false, deps);
203
+ expect(getTaskById('task-own')).toBeUndefined();
204
+ });
205
+ it('non-main group cannot cancel another groups task', async () => {
206
+ createTask({
207
+ id: 'task-foreign',
208
+ group_folder: 'whatsapp_main',
209
+ chat_jid: 'main@g.us',
210
+ prompt: 'not yours',
211
+ schedule_type: 'once',
212
+ schedule_value: '2025-06-01T00:00:00',
213
+ context_mode: 'isolated',
214
+ next_run: null,
215
+ status: 'active',
216
+ created_at: '2024-01-01T00:00:00.000Z',
217
+ });
218
+ await processTaskIpc({ type: 'cancel_task', taskId: 'task-foreign' }, 'other-group', false, deps);
219
+ expect(getTaskById('task-foreign')).toBeDefined();
220
+ });
221
+ });
222
+ // --- register_group authorization ---
223
+ describe('register_group authorization', () => {
224
+ it('non-main group cannot register a group', async () => {
225
+ await processTaskIpc({
226
+ type: 'register_group',
227
+ jid: 'new@g.us',
228
+ name: 'New Group',
229
+ folder: 'new-group',
230
+ trigger: '@Andy',
231
+ }, 'other-group', false, deps);
232
+ // registeredGroups should not have changed
233
+ expect(groups['new@g.us']).toBeUndefined();
234
+ });
235
+ it('main group cannot register with unsafe folder path', async () => {
236
+ await processTaskIpc({
237
+ type: 'register_group',
238
+ jid: 'new@g.us',
239
+ name: 'New Group',
240
+ folder: '../../outside',
241
+ trigger: '@Andy',
242
+ }, 'whatsapp_main', true, deps);
243
+ expect(groups['new@g.us']).toBeUndefined();
244
+ });
245
+ });
246
+ // --- refresh_groups authorization ---
247
+ describe('refresh_groups authorization', () => {
248
+ it('non-main group cannot trigger refresh', async () => {
249
+ // This should be silently blocked (no crash, no effect)
250
+ await processTaskIpc({ type: 'refresh_groups' }, 'other-group', false, deps);
251
+ // If we got here without error, the auth gate worked
252
+ });
253
+ });
254
+ // --- IPC message authorization ---
255
+ // Tests the authorization pattern from startIpcWatcher (ipc.ts).
256
+ // The logic: isMain || (targetGroup && targetGroup.folder === sourceGroup)
257
+ describe('IPC message authorization', () => {
258
+ // Replicate the exact check from the IPC watcher
259
+ function isMessageAuthorized(sourceGroup, isMain, targetChatJid, registeredGroups) {
260
+ const targetGroup = registeredGroups[targetChatJid];
261
+ return isMain || (!!targetGroup && targetGroup.folder === sourceGroup);
262
+ }
263
+ it('main group can send to any group', () => {
264
+ expect(isMessageAuthorized('whatsapp_main', true, 'other@g.us', groups)).toBe(true);
265
+ expect(isMessageAuthorized('whatsapp_main', true, 'third@g.us', groups)).toBe(true);
266
+ });
267
+ it('non-main group can send to its own chat', () => {
268
+ expect(isMessageAuthorized('other-group', false, 'other@g.us', groups)).toBe(true);
269
+ });
270
+ it('non-main group cannot send to another groups chat', () => {
271
+ expect(isMessageAuthorized('other-group', false, 'main@g.us', groups)).toBe(false);
272
+ expect(isMessageAuthorized('other-group', false, 'third@g.us', groups)).toBe(false);
273
+ });
274
+ it('non-main group cannot send to unregistered JID', () => {
275
+ expect(isMessageAuthorized('other-group', false, 'unknown@g.us', groups)).toBe(false);
276
+ });
277
+ it('main group can send to unregistered JID', () => {
278
+ // Main is always authorized regardless of target
279
+ expect(isMessageAuthorized('whatsapp_main', true, 'unknown@g.us', groups)).toBe(true);
280
+ });
281
+ });
282
+ // --- schedule_task with cron and interval types ---
283
+ describe('schedule_task schedule types', () => {
284
+ it('creates task with cron schedule and computes next_run', async () => {
285
+ await processTaskIpc({
286
+ type: 'schedule_task',
287
+ prompt: 'cron task',
288
+ schedule_type: 'cron',
289
+ schedule_value: '0 9 * * *', // every day at 9am
290
+ targetJid: 'other@g.us',
291
+ }, 'whatsapp_main', true, deps);
292
+ const tasks = getAllTasks();
293
+ expect(tasks).toHaveLength(1);
294
+ expect(tasks[0].schedule_type).toBe('cron');
295
+ expect(tasks[0].next_run).toBeTruthy();
296
+ // next_run should be a valid ISO date in the future
297
+ expect(new Date(tasks[0].next_run).getTime()).toBeGreaterThan(Date.now() - 60000);
298
+ });
299
+ it('rejects invalid cron expression', async () => {
300
+ await processTaskIpc({
301
+ type: 'schedule_task',
302
+ prompt: 'bad cron',
303
+ schedule_type: 'cron',
304
+ schedule_value: 'not a cron',
305
+ targetJid: 'other@g.us',
306
+ }, 'whatsapp_main', true, deps);
307
+ expect(getAllTasks()).toHaveLength(0);
308
+ });
309
+ it('creates task with interval schedule', async () => {
310
+ const before = Date.now();
311
+ await processTaskIpc({
312
+ type: 'schedule_task',
313
+ prompt: 'interval task',
314
+ schedule_type: 'interval',
315
+ schedule_value: '3600000', // 1 hour
316
+ targetJid: 'other@g.us',
317
+ }, 'whatsapp_main', true, deps);
318
+ const tasks = getAllTasks();
319
+ expect(tasks).toHaveLength(1);
320
+ expect(tasks[0].schedule_type).toBe('interval');
321
+ // next_run should be ~1 hour from now
322
+ const nextRun = new Date(tasks[0].next_run).getTime();
323
+ expect(nextRun).toBeGreaterThanOrEqual(before + 3600000 - 1000);
324
+ expect(nextRun).toBeLessThanOrEqual(Date.now() + 3600000 + 1000);
325
+ });
326
+ it('rejects invalid interval (non-numeric)', async () => {
327
+ await processTaskIpc({
328
+ type: 'schedule_task',
329
+ prompt: 'bad interval',
330
+ schedule_type: 'interval',
331
+ schedule_value: 'abc',
332
+ targetJid: 'other@g.us',
333
+ }, 'whatsapp_main', true, deps);
334
+ expect(getAllTasks()).toHaveLength(0);
335
+ });
336
+ it('rejects invalid interval (zero)', async () => {
337
+ await processTaskIpc({
338
+ type: 'schedule_task',
339
+ prompt: 'zero interval',
340
+ schedule_type: 'interval',
341
+ schedule_value: '0',
342
+ targetJid: 'other@g.us',
343
+ }, 'whatsapp_main', true, deps);
344
+ expect(getAllTasks()).toHaveLength(0);
345
+ });
346
+ it('rejects invalid once timestamp', async () => {
347
+ await processTaskIpc({
348
+ type: 'schedule_task',
349
+ prompt: 'bad once',
350
+ schedule_type: 'once',
351
+ schedule_value: 'not-a-date',
352
+ targetJid: 'other@g.us',
353
+ }, 'whatsapp_main', true, deps);
354
+ expect(getAllTasks()).toHaveLength(0);
355
+ });
356
+ });
357
+ // --- context_mode defaulting ---
358
+ describe('schedule_task context_mode', () => {
359
+ it('accepts context_mode=group', async () => {
360
+ await processTaskIpc({
361
+ type: 'schedule_task',
362
+ prompt: 'group context',
363
+ schedule_type: 'once',
364
+ schedule_value: '2025-06-01T00:00:00',
365
+ context_mode: 'group',
366
+ targetJid: 'other@g.us',
367
+ }, 'whatsapp_main', true, deps);
368
+ const tasks = getAllTasks();
369
+ expect(tasks[0].context_mode).toBe('group');
370
+ });
371
+ it('accepts context_mode=isolated', async () => {
372
+ await processTaskIpc({
373
+ type: 'schedule_task',
374
+ prompt: 'isolated context',
375
+ schedule_type: 'once',
376
+ schedule_value: '2025-06-01T00:00:00',
377
+ context_mode: 'isolated',
378
+ targetJid: 'other@g.us',
379
+ }, 'whatsapp_main', true, deps);
380
+ const tasks = getAllTasks();
381
+ expect(tasks[0].context_mode).toBe('isolated');
382
+ });
383
+ it('defaults invalid context_mode to isolated', async () => {
384
+ await processTaskIpc({
385
+ type: 'schedule_task',
386
+ prompt: 'bad context',
387
+ schedule_type: 'once',
388
+ schedule_value: '2025-06-01T00:00:00',
389
+ context_mode: 'bogus',
390
+ targetJid: 'other@g.us',
391
+ }, 'whatsapp_main', true, deps);
392
+ const tasks = getAllTasks();
393
+ expect(tasks[0].context_mode).toBe('isolated');
394
+ });
395
+ it('defaults missing context_mode to isolated', async () => {
396
+ await processTaskIpc({
397
+ type: 'schedule_task',
398
+ prompt: 'no context mode',
399
+ schedule_type: 'once',
400
+ schedule_value: '2025-06-01T00:00:00',
401
+ targetJid: 'other@g.us',
402
+ }, 'whatsapp_main', true, deps);
403
+ const tasks = getAllTasks();
404
+ expect(tasks[0].context_mode).toBe('isolated');
405
+ });
406
+ });
407
+ // --- register_group success path ---
408
+ describe('register_group success', () => {
409
+ it('main group can register a new group', async () => {
410
+ await processTaskIpc({
411
+ type: 'register_group',
412
+ jid: 'new@g.us',
413
+ name: 'New Group',
414
+ folder: 'new-group',
415
+ trigger: '@Andy',
416
+ }, 'whatsapp_main', true, deps);
417
+ // Verify group was registered in DB
418
+ const group = getRegisteredGroup('new@g.us');
419
+ expect(group).toBeDefined();
420
+ expect(group.name).toBe('New Group');
421
+ expect(group.folder).toBe('new-group');
422
+ expect(group.trigger).toBe('@Andy');
423
+ });
424
+ it('register_group rejects request with missing fields', async () => {
425
+ await processTaskIpc({
426
+ type: 'register_group',
427
+ jid: 'partial@g.us',
428
+ name: 'Partial',
429
+ // missing folder and trigger
430
+ }, 'whatsapp_main', true, deps);
431
+ expect(getRegisteredGroup('partial@g.us')).toBeUndefined();
432
+ });
433
+ });
434
+ //# sourceMappingURL=ipc-auth.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc-auth.test.js","sourceRoot":"","sources":["../src/ipc-auth.test.ts"],"names":[],"mappings":"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"}
package/dist/ipc.d.ts ADDED
@@ -0,0 +1,32 @@
1
+ import { AvailableGroup } from './container-runner.js';
2
+ import { RegisteredGroup } from './types.js';
3
+ export interface IpcDeps {
4
+ sendMessage: (jid: string, text: string) => Promise<void>;
5
+ registeredGroups: () => Record<string, RegisteredGroup>;
6
+ registerGroup: (jid: string, group: RegisteredGroup) => void;
7
+ syncGroups: (force: boolean) => Promise<void>;
8
+ getAvailableGroups: () => AvailableGroup[];
9
+ writeGroupsSnapshot: (groupFolder: string, isMain: boolean, availableGroups: AvailableGroup[], registeredJids: Set<string>) => void;
10
+ onTasksChanged: () => void;
11
+ }
12
+ export declare function startIpcWatcher(deps: IpcDeps): void;
13
+ export declare function processTaskIpc(data: {
14
+ type: string;
15
+ taskId?: string;
16
+ prompt?: string;
17
+ schedule_type?: string;
18
+ schedule_value?: string;
19
+ context_mode?: string;
20
+ groupFolder?: string;
21
+ chatJid?: string;
22
+ targetJid?: string;
23
+ jid?: string;
24
+ name?: string;
25
+ folder?: string;
26
+ trigger?: string;
27
+ requiresTrigger?: boolean;
28
+ containerConfig?: RegisteredGroup['containerConfig'];
29
+ }, sourceGroup: string, // Verified identity from IPC directory
30
+ isMain: boolean, // Verified from directory path
31
+ deps: IpcDeps): Promise<void>;
32
+ //# sourceMappingURL=ipc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc.d.ts","sourceRoot":"","sources":["../src/ipc.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAIvD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,OAAO;IACtB,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,gBAAgB,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACxD,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC7D,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,kBAAkB,EAAE,MAAM,cAAc,EAAE,CAAC;IAC3C,mBAAmB,EAAE,CACnB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,OAAO,EACf,eAAe,EAAE,cAAc,EAAE,EACjC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,KACxB,IAAI,CAAC;IACV,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B;AAID,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CA6HnD;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE;IACJ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,eAAe,CAAC,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAC;CACtD,EACD,WAAW,EAAE,MAAM,EAAE,uCAAuC;AAC5D,MAAM,EAAE,OAAO,EAAE,+BAA+B;AAChD,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC,IAAI,CAAC,CA0Rf"}