@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,134 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import http from 'http';
3
+ const mockEnv = {};
4
+ vi.mock('./env.js', () => ({
5
+ readEnvFile: vi.fn(() => ({ ...mockEnv })),
6
+ }));
7
+ vi.mock('./logger.js', () => ({
8
+ logger: { info: vi.fn(), error: vi.fn(), debug: vi.fn(), warn: vi.fn() },
9
+ }));
10
+ import { startCredentialProxy } from './credential-proxy.js';
11
+ function makeRequest(port, options, body = '') {
12
+ return new Promise((resolve, reject) => {
13
+ const req = http.request({ ...options, hostname: '127.0.0.1', port }, (res) => {
14
+ const chunks = [];
15
+ res.on('data', (c) => chunks.push(c));
16
+ res.on('end', () => {
17
+ resolve({
18
+ statusCode: res.statusCode,
19
+ body: Buffer.concat(chunks).toString(),
20
+ headers: res.headers,
21
+ });
22
+ });
23
+ });
24
+ req.on('error', reject);
25
+ req.write(body);
26
+ req.end();
27
+ });
28
+ }
29
+ describe('credential-proxy', () => {
30
+ let proxyServer;
31
+ let upstreamServer;
32
+ let proxyPort;
33
+ let upstreamPort;
34
+ let lastUpstreamHeaders;
35
+ beforeEach(async () => {
36
+ lastUpstreamHeaders = {};
37
+ upstreamServer = http.createServer((req, res) => {
38
+ lastUpstreamHeaders = { ...req.headers };
39
+ res.writeHead(200, { 'content-type': 'application/json' });
40
+ res.end(JSON.stringify({ ok: true }));
41
+ });
42
+ await new Promise((resolve) => upstreamServer.listen(0, '127.0.0.1', resolve));
43
+ upstreamPort = upstreamServer.address().port;
44
+ });
45
+ afterEach(async () => {
46
+ await new Promise((r) => proxyServer?.close(() => r()));
47
+ await new Promise((r) => upstreamServer?.close(() => r()));
48
+ for (const key of Object.keys(mockEnv))
49
+ delete mockEnv[key];
50
+ });
51
+ async function startProxy(env) {
52
+ Object.assign(mockEnv, env, {
53
+ ANTHROPIC_BASE_URL: `http://127.0.0.1:${upstreamPort}`,
54
+ });
55
+ proxyServer = await startCredentialProxy(0);
56
+ return proxyServer.address().port;
57
+ }
58
+ it('API-key mode injects x-api-key and strips placeholder', async () => {
59
+ proxyPort = await startProxy({ ANTHROPIC_API_KEY: 'sk-ant-real-key' });
60
+ await makeRequest(proxyPort, {
61
+ method: 'POST',
62
+ path: '/v1/messages',
63
+ headers: {
64
+ 'content-type': 'application/json',
65
+ 'x-api-key': 'placeholder',
66
+ },
67
+ }, '{}');
68
+ expect(lastUpstreamHeaders['x-api-key']).toBe('sk-ant-real-key');
69
+ });
70
+ it('OAuth mode replaces Authorization when container sends one', async () => {
71
+ proxyPort = await startProxy({
72
+ CLAUDE_CODE_OAUTH_TOKEN: 'real-oauth-token',
73
+ });
74
+ await makeRequest(proxyPort, {
75
+ method: 'POST',
76
+ path: '/api/oauth/claude_cli/create_api_key',
77
+ headers: {
78
+ 'content-type': 'application/json',
79
+ authorization: 'Bearer placeholder',
80
+ },
81
+ }, '{}');
82
+ expect(lastUpstreamHeaders['authorization']).toBe('Bearer real-oauth-token');
83
+ });
84
+ it('OAuth mode does not inject Authorization when container omits it', async () => {
85
+ proxyPort = await startProxy({
86
+ CLAUDE_CODE_OAUTH_TOKEN: 'real-oauth-token',
87
+ });
88
+ // Post-exchange: container uses x-api-key only, no Authorization header
89
+ await makeRequest(proxyPort, {
90
+ method: 'POST',
91
+ path: '/v1/messages',
92
+ headers: {
93
+ 'content-type': 'application/json',
94
+ 'x-api-key': 'temp-key-from-exchange',
95
+ },
96
+ }, '{}');
97
+ expect(lastUpstreamHeaders['x-api-key']).toBe('temp-key-from-exchange');
98
+ expect(lastUpstreamHeaders['authorization']).toBeUndefined();
99
+ });
100
+ it('strips hop-by-hop headers', async () => {
101
+ proxyPort = await startProxy({ ANTHROPIC_API_KEY: 'sk-ant-real-key' });
102
+ await makeRequest(proxyPort, {
103
+ method: 'POST',
104
+ path: '/v1/messages',
105
+ headers: {
106
+ 'content-type': 'application/json',
107
+ connection: 'keep-alive',
108
+ 'keep-alive': 'timeout=5',
109
+ 'transfer-encoding': 'chunked',
110
+ },
111
+ }, '{}');
112
+ // Proxy strips client hop-by-hop headers. Node's HTTP client may re-add
113
+ // its own Connection header (standard HTTP/1.1 behavior), but the client's
114
+ // custom keep-alive and transfer-encoding must not be forwarded.
115
+ expect(lastUpstreamHeaders['keep-alive']).toBeUndefined();
116
+ expect(lastUpstreamHeaders['transfer-encoding']).toBeUndefined();
117
+ });
118
+ it('returns 502 when upstream is unreachable', async () => {
119
+ Object.assign(mockEnv, {
120
+ ANTHROPIC_API_KEY: 'sk-ant-real-key',
121
+ ANTHROPIC_BASE_URL: 'http://127.0.0.1:59999',
122
+ });
123
+ proxyServer = await startCredentialProxy(0);
124
+ proxyPort = proxyServer.address().port;
125
+ const res = await makeRequest(proxyPort, {
126
+ method: 'POST',
127
+ path: '/v1/messages',
128
+ headers: { 'content-type': 'application/json' },
129
+ }, '{}');
130
+ expect(res.statusCode).toBe(502);
131
+ expect(res.body).toBe('Bad Gateway');
132
+ });
133
+ });
134
+ //# sourceMappingURL=credential-proxy.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-proxy.test.js","sourceRoot":"","sources":["../src/credential-proxy.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,MAAM,OAAO,GAA2B,EAAE,CAAC;AAC3C,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IACzB,WAAW,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;CAC3C,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5B,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE;CACzE,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,SAAS,WAAW,CAClB,IAAY,EACZ,OAA4B,EAC5B,IAAI,GAAG,EAAE;IAMT,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CACtB,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,EAC3C,CAAC,GAAG,EAAE,EAAE;YACN,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,OAAO,CAAC;oBACN,UAAU,EAAE,GAAG,CAAC,UAAW;oBAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;oBACtC,OAAO,EAAE,GAAG,CAAC,OAAO;iBACrB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CACF,CAAC;QACF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACxB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChB,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,IAAI,WAAwB,CAAC;IAC7B,IAAI,cAA2B,CAAC;IAChC,IAAI,SAAiB,CAAC;IACtB,IAAI,YAAoB,CAAC;IACzB,IAAI,mBAA6C,CAAC;IAElD,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,mBAAmB,GAAG,EAAE,CAAC;QAEzB,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC9C,mBAAmB,GAAG,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;YACzC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAClC,cAAc,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,CAC/C,CAAC;QACF,YAAY,GAAI,cAAc,CAAC,OAAO,EAAkB,CAAC,IAAI,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9D,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,KAAK,UAAU,UAAU,CAAC,GAA2B;QACnD,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE;YAC1B,kBAAkB,EAAE,oBAAoB,YAAY,EAAE;SACvD,CAAC,CAAC;QACH,WAAW,GAAG,MAAM,oBAAoB,CAAC,CAAC,CAAC,CAAC;QAC5C,OAAQ,WAAW,CAAC,OAAO,EAAkB,CAAC,IAAI,CAAC;IACrD,CAAC;IAED,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,SAAS,GAAG,MAAM,UAAU,CAAC,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAEvE,MAAM,WAAW,CACf,SAAS,EACT;YACE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,WAAW,EAAE,aAAa;aAC3B;SACF,EACD,IAAI,CACL,CAAC;QAEF,MAAM,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,SAAS,GAAG,MAAM,UAAU,CAAC;YAC3B,uBAAuB,EAAE,kBAAkB;SAC5C,CAAC,CAAC;QAEH,MAAM,WAAW,CACf,SAAS,EACT;YACE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,sCAAsC;YAC5C,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,oBAAoB;aACpC;SACF,EACD,IAAI,CACL,CAAC;QAEF,MAAM,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAC/C,yBAAyB,CAC1B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,SAAS,GAAG,MAAM,UAAU,CAAC;YAC3B,uBAAuB,EAAE,kBAAkB;SAC5C,CAAC,CAAC;QAEH,wEAAwE;QACxE,MAAM,WAAW,CACf,SAAS,EACT;YACE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,WAAW,EAAE,wBAAwB;aACtC;SACF,EACD,IAAI,CACL,CAAC;QAEF,MAAM,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACxE,MAAM,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,SAAS,GAAG,MAAM,UAAU,CAAC,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAEvE,MAAM,WAAW,CACf,SAAS,EACT;YACE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,UAAU,EAAE,YAAY;gBACxB,YAAY,EAAE,WAAW;gBACzB,mBAAmB,EAAE,SAAS;aAC/B;SACF,EACD,IAAI,CACL,CAAC;QAEF,wEAAwE;QACxE,2EAA2E;QAC3E,iEAAiE;QACjE,MAAM,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAC1D,MAAM,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE;YACrB,iBAAiB,EAAE,iBAAiB;YACpC,kBAAkB,EAAE,wBAAwB;SAC7C,CAAC,CAAC;QACH,WAAW,GAAG,MAAM,oBAAoB,CAAC,CAAC,CAAC,CAAC;QAC5C,SAAS,GAAI,WAAW,CAAC,OAAO,EAAkB,CAAC,IAAI,CAAC;QAExD,MAAM,GAAG,GAAG,MAAM,WAAW,CAC3B,SAAS,EACT;YACE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;SAChD,EACD,IAAI,CACL,CAAC;QAEF,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/dist/db.d.ts ADDED
@@ -0,0 +1,115 @@
1
+ import { NewMessage, RegisteredGroup, ScheduledTask, TaskRunLog } from './types.js';
2
+ export declare function initDatabase(): void;
3
+ /** @internal - for tests only. Creates a fresh in-memory database. */
4
+ export declare function _initTestDatabase(): void;
5
+ /**
6
+ * Store chat metadata only (no message content).
7
+ * Used for all chats to enable group discovery without storing sensitive content.
8
+ */
9
+ export declare function storeChatMetadata(chatJid: string, timestamp: string, name?: string, channel?: string, isGroup?: boolean): void;
10
+ /**
11
+ * Update chat name, guarded by a timestamp comparison.
12
+ * The name is only written if nameUpdatedAt is >= the currently stored name_updated_at,
13
+ * so that an older push from another client can never overwrite a newer rename.
14
+ * New chats (INSERT path) always get the supplied values.
15
+ */
16
+ export declare function updateChatName(chatJid: string, name: string, nameUpdatedAt?: number): void;
17
+ export interface ChatInfo {
18
+ jid: string;
19
+ name: string;
20
+ last_message_time: string;
21
+ channel: string;
22
+ is_group: number;
23
+ name_updated_at: number;
24
+ cwd: string;
25
+ }
26
+ /**
27
+ * Get all known chats, ordered by most recent activity.
28
+ */
29
+ export declare function getAllChats(): ChatInfo[];
30
+ /**
31
+ * Get the user-defined display order for web sessions.
32
+ * Returns an array of chat JIDs (local@web-<id>) in the desired order.
33
+ * An empty array means no custom order has been saved yet.
34
+ */
35
+ export declare function getWebSessionOrder(): string[];
36
+ /**
37
+ * Persist the user-defined display order for web sessions.
38
+ * @param jids - Ordered array of chat JIDs (local@web-<id>)
39
+ */
40
+ export declare function setWebSessionOrder(jids: string[]): void;
41
+ /**
42
+ * Persist the current working directory for a web session.
43
+ */
44
+ export declare function updateChatCwd(chatJid: string, cwd: string): void;
45
+ /**
46
+ * Get full conversation history for a chat (both user and bot messages),
47
+ * ordered chronologically. Used by the web channel history endpoint.
48
+ */
49
+ export declare function getConversation(chatJid: string, limit?: number): NewMessage[];
50
+ /**
51
+ * Delete a chat and all its messages from the database.
52
+ * Used by the web channel when a session is deleted.
53
+ */
54
+ export declare function deleteChat(chatJid: string): void;
55
+ /**
56
+ * Delete only the messages of a chat, keeping the chat entry itself.
57
+ * Used by the web channel /clear command.
58
+ */
59
+ export declare function clearChatMessages(chatJid: string): void;
60
+ /**
61
+ * Get timestamp of last group metadata sync.
62
+ */
63
+ export declare function getLastGroupSync(): string | null;
64
+ /**
65
+ * Record that group metadata was synced.
66
+ */
67
+ export declare function setLastGroupSync(): void;
68
+ /**
69
+ * Store a message with full content.
70
+ * Only call this for registered groups where message history is needed.
71
+ */
72
+ export declare function storeMessage(msg: NewMessage): void;
73
+ /**
74
+ * Store a message directly.
75
+ */
76
+ export declare function storeMessageDirect(msg: {
77
+ id: string;
78
+ chat_jid: string;
79
+ sender: string;
80
+ sender_name: string;
81
+ content: string;
82
+ timestamp: string;
83
+ is_from_me: boolean;
84
+ is_bot_message?: boolean;
85
+ }): void;
86
+ export declare function getNewMessages(jids: string[], lastTimestamp: string, botPrefix: string, limit?: number): {
87
+ messages: NewMessage[];
88
+ newTimestamp: string;
89
+ };
90
+ export declare function getMessagesSince(chatJid: string, sinceTimestamp: string, botPrefix: string, limit?: number): NewMessage[];
91
+ /**
92
+ * Delete a single message by its ID.
93
+ * Used by the web channel when the user clicks the trash icon on a message.
94
+ */
95
+ export declare function deleteMessage(id: string): void;
96
+ export declare function createTask(task: Omit<ScheduledTask, 'last_run' | 'last_result'>): void;
97
+ export declare function getTaskById(id: string): ScheduledTask | undefined;
98
+ export declare function getTasksForGroup(groupFolder: string): ScheduledTask[];
99
+ export declare function getAllTasks(): ScheduledTask[];
100
+ export declare function updateTask(id: string, updates: Partial<Pick<ScheduledTask, 'prompt' | 'schedule_type' | 'schedule_value' | 'next_run' | 'status'>>): void;
101
+ export declare function deleteTask(id: string): void;
102
+ export declare function getDueTasks(): ScheduledTask[];
103
+ export declare function updateTaskAfterRun(id: string, nextRun: string | null, lastResult: string): void;
104
+ export declare function logTaskRun(log: TaskRunLog): void;
105
+ export declare function getRouterState(key: string): string | undefined;
106
+ export declare function setRouterState(key: string, value: string): void;
107
+ export declare function getSession(groupFolder: string): string | undefined;
108
+ export declare function setSession(groupFolder: string, sessionId: string): void;
109
+ export declare function getAllSessions(): Record<string, string>;
110
+ export declare function getRegisteredGroup(jid: string): (RegisteredGroup & {
111
+ jid: string;
112
+ }) | undefined;
113
+ export declare function setRegisteredGroup(jid: string, group: RegisteredGroup): void;
114
+ export declare function getAllRegisteredGroups(): Record<string, RegisteredGroup>;
115
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}