sidebud 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -0
- package/THIRD_PARTY_NOTICES.md +29 -0
- package/dist/cli.js +7 -0
- package/dist/main.js +12201 -0
- package/package.json +41 -0
- package/packs/BRAND_ASSETS.md +8 -0
- package/packs/calendar/logo.png +0 -0
- package/packs/calendar/pack.json +127 -0
- package/packs/discord/pack.json +107 -0
- package/packs/filesystem/pack.json +84 -0
- package/packs/github/pack.json +127 -0
- package/packs/gmail/logo.png +0 -0
- package/packs/gmail/pack.json +274 -0
- package/packs/obsidian/pack.json +88 -0
- package/packs/t3-agents/logo.png +0 -0
- package/packs/t3-agents/pack.json +492 -0
- package/packs/telegram/pack.json +137 -0
- package/packs/trello/pack.json +102 -0
- package/packs/whatsapp/pack.json +118 -0
- package/src/manage/favicon.png +0 -0
- package/src/manage/index.html +91 -0
- package/src/manage/manage.css +1246 -0
- package/src/manage/manage.js +1054 -0
- package/src/manage/settings.js +112 -0
- package/src/manage/setup.js +210 -0
- package/src/manage/sidebud-icon.png +0 -0
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "sidebud",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Sidebud companion: talk to the agents on your computer from your phone.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"sidebud",
|
|
7
|
+
"voice",
|
|
8
|
+
"assistant",
|
|
9
|
+
"agents",
|
|
10
|
+
"companion",
|
|
11
|
+
"mcp"
|
|
12
|
+
],
|
|
13
|
+
"homepage": "https://sidebud.app",
|
|
14
|
+
"author": "JJ Eaton",
|
|
15
|
+
"license": "UNLICENSED",
|
|
16
|
+
"type": "module",
|
|
17
|
+
"bin": {
|
|
18
|
+
"sidebud": "dist/cli.js",
|
|
19
|
+
"rva-companion": "dist/cli.js"
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist",
|
|
23
|
+
"src/manage",
|
|
24
|
+
"packs",
|
|
25
|
+
"THIRD_PARTY_NOTICES.md",
|
|
26
|
+
"CHANGELOG.md"
|
|
27
|
+
],
|
|
28
|
+
"engines": {
|
|
29
|
+
"node": ">=22.13.0"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@anthropic-ai/claude-agent-sdk": "^0.3.280",
|
|
33
|
+
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
34
|
+
"@noble/curves": "^2.0.1",
|
|
35
|
+
"@noble/hashes": "^2.0.1",
|
|
36
|
+
"diff": "^8.0.4",
|
|
37
|
+
"qrcode": "^1.5.4",
|
|
38
|
+
"ws": "^8.18.3",
|
|
39
|
+
"zod": "^4.5.4"
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Integration logos
|
|
2
|
+
|
|
3
|
+
The Gmail and Google Calendar `logo.png` files identify their respective integrations. They are rendered at 192 px from Google's official product assets, retrieved 2026-09-23:
|
|
4
|
+
|
|
5
|
+
- https://www.gstatic.com/images/branding/productlogos/gmail_2026/v2/web/192px.svg
|
|
6
|
+
- https://www.gstatic.com/images/branding/productlogos/calendar_2026/v2/web/192px.svg
|
|
7
|
+
|
|
8
|
+
Google retains its trademarks and rights in these logos; they are not covered by this repository's MIT license. Their use does not imply Google endorsement. The companion serves the small raster files by content hash over the paired connection; the mobile widget JSON contains only that hash.
|
|
Binary file
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"id": "dev.remotevoiceagent.calendar",
|
|
4
|
+
"name": "Calendar",
|
|
5
|
+
"description": "Upcoming events and calendar availability. Read-only Google API access stays on your computer.",
|
|
6
|
+
"version": "1.0.2",
|
|
7
|
+
"author": {
|
|
8
|
+
"name": "Sidebud"
|
|
9
|
+
},
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"logo": {
|
|
12
|
+
"kind": "file",
|
|
13
|
+
"path": "logo.png"
|
|
14
|
+
},
|
|
15
|
+
"tile": {
|
|
16
|
+
"size": "medium"
|
|
17
|
+
},
|
|
18
|
+
"mcp": {
|
|
19
|
+
"transport": "builtin",
|
|
20
|
+
"service": "calendar"
|
|
21
|
+
},
|
|
22
|
+
"auth": {
|
|
23
|
+
"type": "oauth2",
|
|
24
|
+
"authorizationUrl": "https://accounts.google.com/o/oauth2/v2/auth",
|
|
25
|
+
"tokenUrl": "https://oauth2.googleapis.com/token",
|
|
26
|
+
"scopes": [
|
|
27
|
+
"https://www.googleapis.com/auth/calendar.calendarlist.readonly",
|
|
28
|
+
"https://www.googleapis.com/auth/calendar.events.readonly",
|
|
29
|
+
"https://www.googleapis.com/auth/calendar.events.freebusy"
|
|
30
|
+
],
|
|
31
|
+
"clientIdSecret": "GOOGLE_OAUTH_CLIENT_ID",
|
|
32
|
+
"clientSecretSecret": "GOOGLE_OAUTH_CLIENT_SECRET",
|
|
33
|
+
"authorizationParams": {
|
|
34
|
+
"access_type": "offline",
|
|
35
|
+
"prompt": "consent"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"secrets": [
|
|
39
|
+
{
|
|
40
|
+
"name": "GOOGLE_OAUTH_CLIENT_ID",
|
|
41
|
+
"description": "Desktop OAuth client ID with Calendar API enabled"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"name": "GOOGLE_OAUTH_CLIENT_SECRET",
|
|
45
|
+
"description": "Desktop OAuth client secret"
|
|
46
|
+
}
|
|
47
|
+
],
|
|
48
|
+
"permissions": {
|
|
49
|
+
"tools": [
|
|
50
|
+
{
|
|
51
|
+
"name": "list_calendars",
|
|
52
|
+
"access": "read",
|
|
53
|
+
"description": "List calendars"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"name": "list_events",
|
|
57
|
+
"access": "read",
|
|
58
|
+
"description": "Read upcoming events"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"name": "get_event",
|
|
62
|
+
"access": "read",
|
|
63
|
+
"description": "Read one event"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"name": "get_free_busy",
|
|
67
|
+
"access": "read",
|
|
68
|
+
"description": "Read availability"
|
|
69
|
+
}
|
|
70
|
+
],
|
|
71
|
+
"network": [
|
|
72
|
+
"www.googleapis.com",
|
|
73
|
+
"accounts.google.com",
|
|
74
|
+
"oauth2.googleapis.com"
|
|
75
|
+
]
|
|
76
|
+
},
|
|
77
|
+
"settings": [
|
|
78
|
+
{
|
|
79
|
+
"id": "calendarId",
|
|
80
|
+
"label": "Calendar ID",
|
|
81
|
+
"type": "text",
|
|
82
|
+
"default": "primary",
|
|
83
|
+
"description": "Use primary for your main calendar."
|
|
84
|
+
}
|
|
85
|
+
],
|
|
86
|
+
"data": [
|
|
87
|
+
{
|
|
88
|
+
"id": "upcoming",
|
|
89
|
+
"tool": "list_events",
|
|
90
|
+
"arguments": {
|
|
91
|
+
"calendarId": "{{setting.calendarId}}",
|
|
92
|
+
"pageSize": 20
|
|
93
|
+
},
|
|
94
|
+
"refreshSeconds": 60
|
|
95
|
+
}
|
|
96
|
+
],
|
|
97
|
+
"glance": {
|
|
98
|
+
"stats": [
|
|
99
|
+
{
|
|
100
|
+
"label": "Next 7 days",
|
|
101
|
+
"value": "{{upcoming/events|count}}",
|
|
102
|
+
"tone": "info"
|
|
103
|
+
}
|
|
104
|
+
]
|
|
105
|
+
},
|
|
106
|
+
"blocks": [
|
|
107
|
+
{
|
|
108
|
+
"type": "list",
|
|
109
|
+
"items": "{{upcoming/events}}",
|
|
110
|
+
"item": {
|
|
111
|
+
"title": "{{item/summary}}",
|
|
112
|
+
"subtitle": "{{item/startsAt}}"
|
|
113
|
+
},
|
|
114
|
+
"limit": 10,
|
|
115
|
+
"emptyText": "No upcoming events."
|
|
116
|
+
}
|
|
117
|
+
],
|
|
118
|
+
"controls": [
|
|
119
|
+
{
|
|
120
|
+
"id": "agenda",
|
|
121
|
+
"kind": "prompt",
|
|
122
|
+
"label": "Read my agenda",
|
|
123
|
+
"prompt": "Summarize my upcoming calendar events.",
|
|
124
|
+
"default": true
|
|
125
|
+
}
|
|
126
|
+
]
|
|
127
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../../../docs/schemas/pack-v2.schema.json",
|
|
3
|
+
"schemaVersion": 2,
|
|
4
|
+
"id": "dev.remotevoiceagent.discord",
|
|
5
|
+
"name": "Discord",
|
|
6
|
+
"description": "A Discord channel through a bot (barryyip0625/mcp-discord). Bots see only servers they are in and DMs sent to the bot, never your personal DMs. Read-only here.",
|
|
7
|
+
"version": "1.1.0",
|
|
8
|
+
"author": {
|
|
9
|
+
"name": "Sidebud"
|
|
10
|
+
},
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"logo": {
|
|
13
|
+
"kind": "icon",
|
|
14
|
+
"name": "chat"
|
|
15
|
+
},
|
|
16
|
+
"tile": {
|
|
17
|
+
"size": "small"
|
|
18
|
+
},
|
|
19
|
+
"mcp": {
|
|
20
|
+
"transport": "stdio",
|
|
21
|
+
"command": "npx",
|
|
22
|
+
"args": [
|
|
23
|
+
"-y",
|
|
24
|
+
"mcp-discord@1.5.1"
|
|
25
|
+
],
|
|
26
|
+
"env": {
|
|
27
|
+
"DISCORD_TOKEN": "{{secret.DISCORD_TOKEN}}"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"secrets": [
|
|
31
|
+
{
|
|
32
|
+
"name": "DISCORD_TOKEN",
|
|
33
|
+
"description": "A bot token from the Discord Developer Portal (never a user token: that breaks Discord's terms)"
|
|
34
|
+
}
|
|
35
|
+
],
|
|
36
|
+
"permissions": {
|
|
37
|
+
"tools": [
|
|
38
|
+
{
|
|
39
|
+
"name": "discord_read_messages",
|
|
40
|
+
"access": "read",
|
|
41
|
+
"description": "Messages in a channel",
|
|
42
|
+
"argumentSettings": {
|
|
43
|
+
"channelId": "channelId"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
]
|
|
47
|
+
},
|
|
48
|
+
"settings": [
|
|
49
|
+
{
|
|
50
|
+
"id": "channelId",
|
|
51
|
+
"label": "Channel id",
|
|
52
|
+
"type": "text",
|
|
53
|
+
"default": "",
|
|
54
|
+
"description": "The channel (or bot DM channel) to watch; enable Developer Mode in Discord and copy the channel id.",
|
|
55
|
+
"required": true
|
|
56
|
+
}
|
|
57
|
+
],
|
|
58
|
+
"data": [
|
|
59
|
+
{
|
|
60
|
+
"id": "recent",
|
|
61
|
+
"tool": "discord_read_messages",
|
|
62
|
+
"arguments": {
|
|
63
|
+
"channelId": "{{setting.channelId}}",
|
|
64
|
+
"limit": 20
|
|
65
|
+
},
|
|
66
|
+
"extract": "text-json",
|
|
67
|
+
"refreshSeconds": 30
|
|
68
|
+
}
|
|
69
|
+
],
|
|
70
|
+
"glance": {
|
|
71
|
+
"line": "{{recent/messages/0/author/username|default:No messages}}: {{recent/messages/0/content|truncate:50}}"
|
|
72
|
+
},
|
|
73
|
+
"blocks": [
|
|
74
|
+
{
|
|
75
|
+
"type": "list",
|
|
76
|
+
"items": "{{recent/messages}}",
|
|
77
|
+
"item": {
|
|
78
|
+
"title": "{{item/author/username}}",
|
|
79
|
+
"subtitle": "{{item/content|truncate:120}}"
|
|
80
|
+
},
|
|
81
|
+
"limit": 8,
|
|
82
|
+
"emptyText": "No messages"
|
|
83
|
+
}
|
|
84
|
+
],
|
|
85
|
+
"controls": [
|
|
86
|
+
{
|
|
87
|
+
"id": "summarize",
|
|
88
|
+
"kind": "prompt",
|
|
89
|
+
"label": "Summarize the channel",
|
|
90
|
+
"prompt": "Summarize the recent messages in my Discord channel.",
|
|
91
|
+
"default": true
|
|
92
|
+
}
|
|
93
|
+
],
|
|
94
|
+
"alerts": [
|
|
95
|
+
{
|
|
96
|
+
"id": "incoming",
|
|
97
|
+
"items": "{{recent/messages}}",
|
|
98
|
+
"key": "{{item/id}}",
|
|
99
|
+
"sender": [
|
|
100
|
+
"{{item/author/username}}",
|
|
101
|
+
"{{item/author/id}}"
|
|
102
|
+
],
|
|
103
|
+
"text": "{{item/content}}",
|
|
104
|
+
"fromMe": "{{item/author/bot}}"
|
|
105
|
+
}
|
|
106
|
+
]
|
|
107
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../../../docs/schemas/pack-v2.schema.json",
|
|
3
|
+
"schemaVersion": 2,
|
|
4
|
+
"id": "app.sidebud.filesystem",
|
|
5
|
+
"name": "Filesystem",
|
|
6
|
+
"description": "Read and search one explicitly selected folder on this computer. This baseline exposes no write tools.",
|
|
7
|
+
"version": "1.0.0",
|
|
8
|
+
"author": {
|
|
9
|
+
"name": "Sidebud"
|
|
10
|
+
},
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"logo": {
|
|
13
|
+
"kind": "emoji",
|
|
14
|
+
"value": "\ud83d\udcc1"
|
|
15
|
+
},
|
|
16
|
+
"controls": [
|
|
17
|
+
{
|
|
18
|
+
"id": "summarize",
|
|
19
|
+
"kind": "prompt",
|
|
20
|
+
"label": "Summarize",
|
|
21
|
+
"prompt": "Summarize the information available through my Filesystem integration.",
|
|
22
|
+
"default": true
|
|
23
|
+
}
|
|
24
|
+
],
|
|
25
|
+
"mcp": {
|
|
26
|
+
"transport": "stdio",
|
|
27
|
+
"command": "npx",
|
|
28
|
+
"args": [
|
|
29
|
+
"-y",
|
|
30
|
+
"@modelcontextprotocol/server-filesystem@2026.8.31",
|
|
31
|
+
"{{setting.folder}}"
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
"settings": [
|
|
35
|
+
{
|
|
36
|
+
"id": "folder",
|
|
37
|
+
"label": "Allowed folder",
|
|
38
|
+
"type": "text",
|
|
39
|
+
"required": true,
|
|
40
|
+
"format": "directory",
|
|
41
|
+
"description": "An existing absolute folder. Select the smallest folder needed; do not select your home or disk root."
|
|
42
|
+
}
|
|
43
|
+
],
|
|
44
|
+
"permissions": {
|
|
45
|
+
"tools": [
|
|
46
|
+
{
|
|
47
|
+
"name": "read_text_file",
|
|
48
|
+
"access": "read"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"name": "list_directory",
|
|
52
|
+
"access": "read"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"name": "search_files",
|
|
56
|
+
"access": "read"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"name": "get_file_info",
|
|
60
|
+
"access": "read"
|
|
61
|
+
}
|
|
62
|
+
]
|
|
63
|
+
},
|
|
64
|
+
"data": [
|
|
65
|
+
{
|
|
66
|
+
"id": "files",
|
|
67
|
+
"tool": "list_directory",
|
|
68
|
+
"arguments": {
|
|
69
|
+
"path": "{{setting.folder}}"
|
|
70
|
+
},
|
|
71
|
+
"extract": "text",
|
|
72
|
+
"refreshSeconds": 300
|
|
73
|
+
}
|
|
74
|
+
],
|
|
75
|
+
"glance": {
|
|
76
|
+
"line": "{{setting.folder}}"
|
|
77
|
+
},
|
|
78
|
+
"blocks": [
|
|
79
|
+
{
|
|
80
|
+
"type": "text",
|
|
81
|
+
"text": "{{files|truncate:550}}"
|
|
82
|
+
}
|
|
83
|
+
]
|
|
84
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../../../docs/schemas/pack-v2.schema.json",
|
|
3
|
+
"schemaVersion": 2,
|
|
4
|
+
"id": "app.sidebud.github",
|
|
5
|
+
"name": "GitHub",
|
|
6
|
+
"description": "Read issues, pull requests, and files in one selected repository through GitHub\u2019s official hosted MCP server.",
|
|
7
|
+
"version": "1.0.0",
|
|
8
|
+
"author": {
|
|
9
|
+
"name": "Sidebud"
|
|
10
|
+
},
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"logo": {
|
|
13
|
+
"kind": "emoji",
|
|
14
|
+
"value": "\ud83d\udc19"
|
|
15
|
+
},
|
|
16
|
+
"controls": [
|
|
17
|
+
{
|
|
18
|
+
"id": "summarize",
|
|
19
|
+
"kind": "prompt",
|
|
20
|
+
"label": "Summarize",
|
|
21
|
+
"prompt": "Summarize the information available through my GitHub integration.",
|
|
22
|
+
"default": true
|
|
23
|
+
}
|
|
24
|
+
],
|
|
25
|
+
"mcp": {
|
|
26
|
+
"transport": "http",
|
|
27
|
+
"url": "https://api.githubcopilot.com/mcp/readonly",
|
|
28
|
+
"headers": {
|
|
29
|
+
"Authorization": "Bearer {{secret.GITHUB_TOKEN}}"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"secrets": [
|
|
33
|
+
{
|
|
34
|
+
"name": "GITHUB_TOKEN",
|
|
35
|
+
"description": "Fine-grained token restricted to the selected repository, with read access to contents, issues, and pull requests."
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"settings": [
|
|
39
|
+
{
|
|
40
|
+
"id": "owner",
|
|
41
|
+
"label": "Repository owner",
|
|
42
|
+
"type": "text",
|
|
43
|
+
"required": true
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"id": "repo",
|
|
47
|
+
"label": "Repository name",
|
|
48
|
+
"type": "text",
|
|
49
|
+
"required": true
|
|
50
|
+
}
|
|
51
|
+
],
|
|
52
|
+
"permissions": {
|
|
53
|
+
"network": [
|
|
54
|
+
"api.githubcopilot.com"
|
|
55
|
+
],
|
|
56
|
+
"tools": [
|
|
57
|
+
{
|
|
58
|
+
"name": "list_issues",
|
|
59
|
+
"access": "read",
|
|
60
|
+
"argumentSettings": {
|
|
61
|
+
"owner": "owner",
|
|
62
|
+
"repo": "repo"
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"name": "list_pull_requests",
|
|
67
|
+
"access": "read",
|
|
68
|
+
"argumentSettings": {
|
|
69
|
+
"owner": "owner",
|
|
70
|
+
"repo": "repo"
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"name": "issue_read",
|
|
75
|
+
"access": "read",
|
|
76
|
+
"argumentSettings": {
|
|
77
|
+
"owner": "owner",
|
|
78
|
+
"repo": "repo"
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"name": "pull_request_read",
|
|
83
|
+
"access": "read",
|
|
84
|
+
"argumentSettings": {
|
|
85
|
+
"owner": "owner",
|
|
86
|
+
"repo": "repo"
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"name": "get_file_contents",
|
|
91
|
+
"access": "read",
|
|
92
|
+
"argumentSettings": {
|
|
93
|
+
"owner": "owner",
|
|
94
|
+
"repo": "repo"
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
]
|
|
98
|
+
},
|
|
99
|
+
"data": [
|
|
100
|
+
{
|
|
101
|
+
"id": "issues",
|
|
102
|
+
"tool": "list_issues",
|
|
103
|
+
"arguments": {
|
|
104
|
+
"owner": "{{setting.owner}}",
|
|
105
|
+
"repo": "{{setting.repo}}",
|
|
106
|
+
"state": "OPEN",
|
|
107
|
+
"perPage": 8
|
|
108
|
+
},
|
|
109
|
+
"refreshSeconds": 300
|
|
110
|
+
}
|
|
111
|
+
],
|
|
112
|
+
"glance": {
|
|
113
|
+
"line": "{{setting.owner}}/{{setting.repo}}"
|
|
114
|
+
},
|
|
115
|
+
"blocks": [
|
|
116
|
+
{
|
|
117
|
+
"type": "list",
|
|
118
|
+
"items": "{{issues/issues}}",
|
|
119
|
+
"item": {
|
|
120
|
+
"title": "{{item/title}}",
|
|
121
|
+
"subtitle": "#{{item/number}}"
|
|
122
|
+
},
|
|
123
|
+
"limit": 8,
|
|
124
|
+
"emptyText": "No open issues"
|
|
125
|
+
}
|
|
126
|
+
]
|
|
127
|
+
}
|
|
Binary file
|