botschat 0.1.18 → 0.1.20

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 (59) hide show
  1. package/README.md +4 -0
  2. package/migrations/0013_agents_table.sql +29 -0
  3. package/migrations/0014_agent_sessions.sql +19 -0
  4. package/migrations/0015_message_traces.sql +27 -0
  5. package/migrations/0016_multi_agent_channels_messages.sql +9 -0
  6. package/migrations/0017_rename_cron_job_id.sql +2 -0
  7. package/package.json +1 -1
  8. package/packages/api/src/do/connection-do.ts +375 -42
  9. package/packages/api/src/index.ts +67 -24
  10. package/packages/api/src/protocol-v2.ts +154 -0
  11. package/packages/api/src/routes/agents-v2.ts +192 -0
  12. package/packages/api/src/routes/agents.ts +3 -3
  13. package/packages/api/src/routes/channels.ts +11 -11
  14. package/packages/api/src/routes/history-v2.ts +221 -0
  15. package/packages/api/src/routes/migrate-v2.ts +110 -0
  16. package/packages/api/src/routes/sessions.ts +5 -5
  17. package/packages/api/src/routes/tasks.ts +33 -33
  18. package/packages/plugin/dist/index.d.ts +1 -0
  19. package/packages/plugin/dist/index.d.ts.map +1 -1
  20. package/packages/plugin/dist/index.js +2 -1
  21. package/packages/plugin/dist/index.js.map +1 -1
  22. package/packages/plugin/dist/src/channel.d.ts +10 -0
  23. package/packages/plugin/dist/src/channel.d.ts.map +1 -1
  24. package/packages/plugin/dist/src/channel.js +311 -69
  25. package/packages/plugin/dist/src/channel.js.map +1 -1
  26. package/packages/plugin/dist/src/runtime.d.ts +2 -0
  27. package/packages/plugin/dist/src/runtime.d.ts.map +1 -1
  28. package/packages/plugin/dist/src/runtime.js +10 -0
  29. package/packages/plugin/dist/src/runtime.js.map +1 -1
  30. package/packages/plugin/dist/src/types.d.ts +25 -0
  31. package/packages/plugin/dist/src/types.d.ts.map +1 -1
  32. package/packages/plugin/package.json +1 -1
  33. package/packages/web/dist/assets/{index-B5GU1yVt.css → index-BARPtt0v.css} +1 -1
  34. package/packages/web/dist/assets/index-Bf-XL3te.js +2 -0
  35. package/packages/web/dist/assets/{index-DzYqprDN.js → index-CYQMu_-c.js} +1 -1
  36. package/packages/web/dist/assets/index-CYlvfpX9.js +1519 -0
  37. package/packages/web/dist/assets/index-CxcpA4Qo.js +1 -0
  38. package/packages/web/dist/assets/{index-D3T7sc-R.js → index-DYCO-ry1.js} +1 -1
  39. package/packages/web/dist/assets/index-QebPVqwj.js +2 -0
  40. package/packages/web/dist/assets/{index.esm-COzWPkKi.js → index.esm-CvOpngZM.js} +1 -1
  41. package/packages/web/dist/assets/{web-CxXbaApe.js → web-1cdhq2RW.js} +1 -1
  42. package/packages/web/dist/assets/{web-DFQypSd0.js → web-D3LMODYp.js} +1 -1
  43. package/packages/web/dist/index.html +2 -2
  44. package/packages/web/src/App.tsx +84 -5
  45. package/packages/web/src/api.ts +61 -3
  46. package/packages/web/src/components/AgentSettings.tsx +328 -0
  47. package/packages/web/src/components/ChatWindow.tsx +124 -4
  48. package/packages/web/src/components/CronDetail.tsx +1 -1
  49. package/packages/web/src/components/SessionTabs.tsx +1 -1
  50. package/packages/web/src/components/Sidebar.tsx +3 -1
  51. package/packages/web/src/store.ts +86 -11
  52. package/packages/web/src/ws.ts +22 -1
  53. package/scripts/dev.sh +53 -0
  54. package/scripts/mock-openclaw-v2.mjs +486 -0
  55. package/scripts/mock-openclaw.mjs +35 -0
  56. package/packages/web/dist/assets/index-CO9YgLst.js +0 -2
  57. package/packages/web/dist/assets/index-ClDrCe_c.js +0 -1
  58. package/packages/web/dist/assets/index-DPEosppm.js +0 -2
  59. package/packages/web/dist/assets/index-IVUdSd9w.js +0 -1516
package/README.md CHANGED
@@ -3,6 +3,8 @@
3
3
  [![npm](https://img.shields.io/npm/v/botschat)](https://www.npmjs.com/package/botschat)
4
4
  [![npm](https://img.shields.io/npm/v/@botschat/botschat)](https://www.npmjs.com/package/@botschat/botschat)
5
5
  [![License](https://img.shields.io/badge/license-Apache--2.0-blue)](LICENSE)
6
+ [![macOS](https://img.shields.io/badge/Download-macOS_App-black?logo=apple&logoColor=white)](https://github.com/botschat-app/botsChat/releases/latest/download/BotsChat-mac.dmg)
7
+ [![iOS](https://img.shields.io/badge/Download-iOS_App-blue?logo=apple&logoColor=white)](https://apps.apple.com/app/botschat-chat-with-agent/id6759292058)
6
8
 
7
9
  A self-hosted, **end-to-end encrypted** chat interface for [OpenClaw](https://github.com/openclaw/openclaw) AI agents.
8
10
 
@@ -103,6 +105,8 @@ BotsChat is **100% open source** — the [same code](https://github.com/botschat
103
105
  | **B. Run Locally** | Development, no cloud account | Yes |
104
106
  | **C. Deploy to Cloudflare** | Remote access (e.g. from phone) | Yes |
105
107
 
108
+ > **Native Apps**: A macOS client is available — [download the latest DMG](https://github.com/botschat-app/botsChat/releases/latest/download/BotsChat-mac.dmg) (signed and notarized, Apple Silicon + Intel). An iOS app is also available on the [App Store](https://apps.apple.com/app/botschat-chat-with-agent/id6759292058).
109
+
106
110
  Pick one below and follow its steps, then continue to [Install the OpenClaw Plugin](#install-the-openclaw-plugin).
107
111
 
108
112
  ---
@@ -0,0 +1,29 @@
1
+ -- Multi-Agent Architecture: agents table
2
+ -- Agent = Type (engine) x Role (persona), independent of channels.
3
+
4
+ CREATE TABLE IF NOT EXISTS agents (
5
+ id TEXT PRIMARY KEY, -- 'agt_xxx'
6
+ user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
7
+ name TEXT NOT NULL, -- display name: "OpenClaw", "Cursor", "PM小明"
8
+ type TEXT NOT NULL CHECK (type IN ('openclaw', 'cursor_cli', 'cursor_cloud', 'claude_code', 'mock')),
9
+ -- Role & Skills
10
+ role TEXT NOT NULL DEFAULT 'general', -- 'product_manager', 'developer', 'qa', 'devops', 'general'
11
+ system_prompt TEXT NOT NULL DEFAULT '',
12
+ skills_json TEXT NOT NULL DEFAULT '[]', -- JSON: [{"name":"...","description":"..."}]
13
+ -- Connection credentials (provider-specific, at most one populated)
14
+ pairing_token TEXT, -- OpenClaw bc_pat_xxx
15
+ api_key TEXT, -- Cursor / Claude API key
16
+ config_json TEXT NOT NULL DEFAULT '{}', -- extra: { workspace, repository, ref, ... }
17
+ -- Technical capabilities (derived from type)
18
+ capabilities TEXT NOT NULL DEFAULT '["chat"]', -- JSON: ["chat","streaming","cron","a2ui","media","code_edit","delegate"]
19
+ -- Runtime state
20
+ status TEXT NOT NULL DEFAULT 'disconnected' CHECK (status IN ('connected', 'disconnected')),
21
+ last_connected_at INTEGER,
22
+ connection_count INTEGER NOT NULL DEFAULT 0,
23
+ last_ip TEXT,
24
+ created_at INTEGER NOT NULL DEFAULT (unixepoch()),
25
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch())
26
+ );
27
+ CREATE INDEX IF NOT EXISTS idx_agents_user ON agents(user_id);
28
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_agents_pairing_token ON agents(pairing_token) WHERE pairing_token IS NOT NULL;
29
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_agents_api_key ON agents(api_key) WHERE api_key IS NOT NULL;
@@ -0,0 +1,19 @@
1
+ -- Multi-Agent Architecture: agent_sessions mapping table
2
+ -- Maps BotsChat sessions to each agent's provider-side session identifier.
3
+ -- e.g. BotsChat ses_001 x Cursor agent -> Cursor chatId "abc-123"
4
+
5
+ CREATE TABLE IF NOT EXISTS agent_sessions (
6
+ id TEXT PRIMARY KEY, -- 'as_xxx'
7
+ session_id TEXT NOT NULL, -- BotsChat session (ses_xxx)
8
+ agent_id TEXT NOT NULL REFERENCES agents(id) ON DELETE CASCADE,
9
+ provider_session_id TEXT, -- provider-specific session ID
10
+ -- OpenClaw: session_key "agent:main:botschat:u_xxx:ses:ses_xxx"
11
+ -- Cursor CLI: chatId (uuid from `agent create-chat`)
12
+ -- Cursor Cloud: cloud agent id "bc_xxx"
13
+ metadata_json TEXT NOT NULL DEFAULT '{}',
14
+ created_at INTEGER NOT NULL DEFAULT (unixepoch()),
15
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch()),
16
+ UNIQUE(session_id, agent_id)
17
+ );
18
+ CREATE INDEX IF NOT EXISTS idx_agent_sessions_session ON agent_sessions(session_id);
19
+ CREATE INDEX IF NOT EXISTS idx_agent_sessions_agent ON agent_sessions(agent_id);
@@ -0,0 +1,27 @@
1
+ -- Multi-Agent Architecture: message_traces table
2
+ -- Stores agent execution traces at different verbosity levels.
3
+ -- lv1 = conclusions (stored in messages table)
4
+ -- lv2 = thinking / reasoning process
5
+ -- lv3 = reference material / tool call results
6
+
7
+ CREATE TABLE IF NOT EXISTS message_traces (
8
+ id TEXT PRIMARY KEY, -- 'mt_xxx'
9
+ message_id TEXT NOT NULL, -- parent lv1 message (messages.id)
10
+ user_id TEXT NOT NULL,
11
+ session_key TEXT NOT NULL,
12
+ agent_id TEXT NOT NULL REFERENCES agents(id) ON DELETE CASCADE,
13
+ verbose_level INTEGER NOT NULL CHECK (verbose_level IN (2, 3)),
14
+ trace_type TEXT NOT NULL,
15
+ -- lv2: 'thinking', 'planning', 'reasoning', 'decision'
16
+ -- lv3: 'file_read', 'file_write', 'command_exec', 'search_result', 'tool_call', 'reference'
17
+ content BLOB NOT NULL,
18
+ metadata_json TEXT NOT NULL DEFAULT '{}',
19
+ -- lv3 file_read: { "path": "src/auth.ts", "lines": 42 }
20
+ -- lv3 command_exec: { "command": "npm test", "exitCode": 0 }
21
+ -- lv3 file_write: { "path": "src/auth.ts", "linesChanged": 5 }
22
+ encrypted INTEGER NOT NULL DEFAULT 0,
23
+ created_at INTEGER NOT NULL DEFAULT (unixepoch())
24
+ );
25
+ CREATE INDEX IF NOT EXISTS idx_traces_message ON message_traces(message_id);
26
+ CREATE INDEX IF NOT EXISTS idx_traces_session_level ON message_traces(session_key, verbose_level, created_at);
27
+ CREATE INDEX IF NOT EXISTS idx_traces_agent ON message_traces(agent_id, created_at);
@@ -0,0 +1,9 @@
1
+ -- Multi-Agent Architecture: extend channels and messages for multi-agent support.
2
+
3
+ -- Channels: add default agent + rename openclaw-specific column
4
+ ALTER TABLE channels ADD COLUMN default_agent_id TEXT REFERENCES agents(id);
5
+ ALTER TABLE channels RENAME COLUMN openclaw_agent_id TO provider_agent_id;
6
+
7
+ -- Messages: track which agent sent/received each message
8
+ ALTER TABLE messages ADD COLUMN sender_agent_id TEXT REFERENCES agents(id);
9
+ ALTER TABLE messages ADD COLUMN target_agent_id TEXT REFERENCES agents(id);
@@ -0,0 +1,2 @@
1
+ -- Multi-Agent: rename openclaw_cron_job_id -> provider_job_id in tasks table
2
+ ALTER TABLE tasks RENAME COLUMN openclaw_cron_job_id TO provider_job_id;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "botschat",
3
- "version": "0.1.18",
3
+ "version": "0.1.20",
4
4
  "description": "A self-hosted chat interface for OpenClaw AI agents",
5
5
  "workspaces": [
6
6
  "packages/*"