@symerian/symi 3.0.17 → 3.0.18

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 (146) hide show
  1. package/dist/{audio-preflight-CBDFctZN.js → audio-preflight-BfmZbg4Y.js} +4 -4
  2. package/dist/{audio-preflight-gsZSpG-6.js → audio-preflight-DcuC-liM.js} +4 -4
  3. package/dist/build-info.json +3 -3
  4. package/dist/bundled/boot-md/handler.js +8 -8
  5. package/dist/bundled/session-memory/handler.js +7 -7
  6. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  7. package/dist/{chrome-nPMY1XTJ.js → chrome-Bo7cbvFK.js} +5 -5
  8. package/dist/{chrome-BjVab8gM.js → chrome-DYp18Q0t.js} +5 -5
  9. package/dist/{deliver-D-QFqm31.js → deliver-ChSIbiMM.js} +1 -1
  10. package/dist/{deliver-B4-bcot9.js → deliver-DEgRQM4J.js} +1 -1
  11. package/dist/extensionAPI.js +7 -7
  12. package/dist/{image-CDwtQjmt.js → image-Bx-hvoNJ.js} +1 -1
  13. package/dist/{image-CcS-vzTA.js → image-CQl_mjWk.js} +1 -1
  14. package/dist/llm-slug-generator.js +7 -7
  15. package/dist/{manager-BnEdHzmO.js → manager-D_pn0urG.js} +1 -1
  16. package/dist/{manager-09r0qPze.js → manager-YQxK2t0C.js} +1 -1
  17. package/dist/{pi-embedded-CWsY69-4.js → pi-embedded-CLw_ZzEZ.js} +16 -16
  18. package/dist/{pi-embedded-helpers-BBMy-lqr.js → pi-embedded-helpers-B5I53aw6.js} +4 -4
  19. package/dist/{pi-embedded-helpers-ChEYbgVj.js → pi-embedded-helpers-sUAEIC9X.js} +4 -4
  20. package/dist/plugin-sdk/{accounts-BfyWsC_i.js → accounts-CWFytwbR.js} +3 -3
  21. package/dist/plugin-sdk/{active-listener-DcJW7xAT.js → active-listener-BkZ4jHrL.js} +2 -2
  22. package/dist/plugin-sdk/{agent-scope-ChbGV6of.js → agent-scope-C9gfY_Gk.js} +2 -2
  23. package/dist/plugin-sdk/{audio-preflight-D3GtNLqW.js → audio-preflight-HKbdzXLZ.js} +21 -21
  24. package/dist/plugin-sdk/{bindings-CN2Qmefj.js → bindings-BaKIqPPy.js} +2 -2
  25. package/dist/plugin-sdk/{channel-web-DTyqujjA.js → channel-web-D5nWiTH1.js} +18 -18
  26. package/dist/plugin-sdk/{chrome-BKzAKr3K.js → chrome-klTSnz-9.js} +3 -3
  27. package/dist/plugin-sdk/{chunk-DhDkBujV.js → chunk-BbrYSny_.js} +1 -1
  28. package/dist/plugin-sdk/{command-format-CVrYFyZS.js → command-format-BN6tyZt6.js} +1 -1
  29. package/dist/plugin-sdk/{commands-registry-17yfZkHZ.js → commands-registry-CTzKKtY6.js} +4 -4
  30. package/dist/plugin-sdk/{config-7wk65zKC.js → config-Crv2qEdJ.js} +9 -9
  31. package/dist/plugin-sdk/{consolidate-exbAW0ml.js → consolidate-DT1QH65Q.js} +2 -2
  32. package/dist/plugin-sdk/{deliver-TxAcw7J5.js → deliver-7rOvAlrc.js} +12 -12
  33. package/dist/plugin-sdk/{diagnostic-Debx4frd.js → diagnostic-0nsxhWp7.js} +1 -1
  34. package/dist/plugin-sdk/{fs-safe-wBYbAkJF.js → fs-safe-DfWYBeWF.js} +1 -1
  35. package/dist/plugin-sdk/{gemini-auth-7U2pm2Ky.js → gemini-auth-C0N0_u49.js} +1 -1
  36. package/dist/plugin-sdk/{image-BtDVmYA5.js → image-WOSl2apK.js} +4 -4
  37. package/dist/plugin-sdk/index.js +43 -43
  38. package/dist/plugin-sdk/{ir-CKMvRrGW.js → ir-9J84MTls.js} +4 -4
  39. package/dist/plugin-sdk/{local-roots-c_gaPs01.js → local-roots-OLRDbvyY.js} +3 -3
  40. package/dist/plugin-sdk/{login-DUym1Jy0.js → login-C7x4q0i2.js} +7 -7
  41. package/dist/plugin-sdk/{login-qr-B-WBdvrX.js → login-qr-Dv5_MoAW.js} +9 -9
  42. package/dist/plugin-sdk/{manager-B71SCzos.js → manager-C83tK17x.js} +8 -8
  43. package/dist/plugin-sdk/{manifest-registry-Dnic6Chh.js → manifest-registry-CJMV-PI7.js} +1 -1
  44. package/dist/plugin-sdk/{markdown-tables-Dur7OTlM.js → markdown-tables-DXNKz5y_.js} +1 -1
  45. package/dist/plugin-sdk/{message-channel-BrAhJJV_.js → message-channel-aGy1HbQQ.js} +1 -1
  46. package/dist/plugin-sdk/{model-selection-B9qaVQSJ.js → model-selection-C-3-tpe7.js} +4 -4
  47. package/dist/plugin-sdk/{outbound-DB1wDM8b.js → outbound-DquCeSy5.js} +6 -6
  48. package/dist/plugin-sdk/{pi-auth-json-ZO118hoy.js → pi-auth-json-D9PDCXGn.js} +1 -1
  49. package/dist/plugin-sdk/{pi-embedded-helpers-s_U0Un7j.js → pi-embedded-helpers-D3ygfH7l.js} +16 -16
  50. package/dist/plugin-sdk/{plugins-DF81oSaI.js → plugins-DOwnSg9D.js} +4 -4
  51. package/dist/plugin-sdk/{pw-ai-CTwP02uv.js → pw-ai-rlengLjb.js} +8 -8
  52. package/dist/plugin-sdk/{qmd-manager-CBaSGant.js → qmd-manager-BzxFjRFa.js} +4 -4
  53. package/dist/plugin-sdk/{registry-CZVURNhF.js → registry-5iFfixlB.js} +2 -2
  54. package/dist/plugin-sdk/{replies-hwRbkU3z.js → replies-BXOzO_H5.js} +7 -7
  55. package/dist/plugin-sdk/{reply-prefix-CaXmzZlx.js → reply-prefix-INAKTqCU.js} +1 -1
  56. package/dist/plugin-sdk/{resolve-outbound-target-fxVSOBmk.js → resolve-outbound-target-DvbxHtqp.js} +2 -2
  57. package/dist/plugin-sdk/{resolve-route-ClCyiOeu.js → resolve-route-URXlY3AK.js} +3 -3
  58. package/dist/plugin-sdk/{runner-Cq5jvwQ7.js → runner-Bv0_DWoH.js} +9 -9
  59. package/dist/plugin-sdk/{session-B_TkB65Y.js → session-C3r8l7ou.js} +4 -4
  60. package/dist/plugin-sdk/{skill-commands-0LF9HTGr.js → skill-commands-KjLUGIdZ.js} +5 -5
  61. package/dist/plugin-sdk/{skills-BIT_O7J0.js → skills-BrsD4L5c.js} +7 -7
  62. package/dist/plugin-sdk/{sqlite-Bx5Y5U5X.js → sqlite-CjW7ME1H.js} +1 -1
  63. package/dist/plugin-sdk/{subsystem-CXqYeDy-.js → subsystem-DcOg1xJr.js} +1 -1
  64. package/dist/plugin-sdk/{synthesis-DtsYAj1E.js → synthesis-CY7YAasV.js} +38 -38
  65. package/dist/plugin-sdk/{target-errors-B8mokOeH.js → target-errors-BVWJGWFq.js} +2 -2
  66. package/dist/plugin-sdk/{thinking-Ca0DhqzO.js → thinking-CtsTDPOi.js} +3 -3
  67. package/dist/plugin-sdk/{tokens-CvlONEqh.js → tokens-8lqOTZCB.js} +1 -1
  68. package/dist/plugin-sdk/{tool-images-DpBaWEHT.js → tool-images-Cl_rGIUZ.js} +2 -2
  69. package/dist/plugin-sdk/{tool-loop-detection-BOvUFa0f.js → tool-loop-detection-Da4WUT_P.js} +2 -2
  70. package/dist/plugin-sdk/{unified-runner-CnM7lyNd.js → unified-runner-nwMnsZyj.js} +60 -60
  71. package/dist/plugin-sdk/web-BlweOZDp.js +54 -0
  72. package/dist/plugin-sdk/{whatsapp-actions-CvnfsFJm.js → whatsapp-actions-DpfaGYs7.js} +21 -21
  73. package/dist/{pw-ai-BW8_KeDf.js → pw-ai-BqxJG-Wh.js} +1 -1
  74. package/dist/{pw-ai-j9IE1K0-.js → pw-ai-C-NSGye0.js} +1 -1
  75. package/dist/{runner-8ALr2UII.js → runner-COGFTeDw.js} +1 -1
  76. package/dist/{runner-C4-9kFdR.js → runner-DhCi2lT1.js} +1 -1
  77. package/dist/{synthesis-Cph3LhA1.js → synthesis-CXZu24Vx.js} +7 -7
  78. package/dist/{synthesis-Cus0A2dL.js → synthesis-DrPxcMlQ.js} +7 -7
  79. package/dist/{unified-runner-CX80YMTk.js → unified-runner-iByUazvW.js} +16 -16
  80. package/dist/{web-ChozvJ7I.js → web-EsMQBIYf.js} +7 -7
  81. package/dist/{web-DFlsbXmQ.js → web-PPg5y6xI.js} +7 -7
  82. package/package.json +1 -1
  83. package/dist/plugin-sdk/web-CIPJBHAU.js +0 -54
  84. package/skills/1password/SKILL.md +0 -71
  85. package/skills/1password/references/cli-examples.md +0 -29
  86. package/skills/1password/references/get-started.md +0 -17
  87. package/skills/apple-notes/SKILL.md +0 -78
  88. package/skills/apple-reminders/SKILL.md +0 -119
  89. package/skills/bear-notes/SKILL.md +0 -108
  90. package/skills/blogwatcher/SKILL.md +0 -70
  91. package/skills/blucli/SKILL.md +0 -48
  92. package/skills/bluebubbles/SKILL.md +0 -132
  93. package/skills/camsnap/SKILL.md +0 -46
  94. package/skills/canvas/SKILL.md +0 -204
  95. package/skills/connect-email/SKILL.md +0 -142
  96. package/skills/document-generation/SKILL.md +0 -83
  97. package/skills/eightctl/SKILL.md +0 -51
  98. package/skills/food-order/SKILL.md +0 -49
  99. package/skills/gemini/SKILL.md +0 -44
  100. package/skills/gh-issues/SKILL.md +0 -865
  101. package/skills/gifgrep/SKILL.md +0 -80
  102. package/skills/github/SKILL.md +0 -164
  103. package/skills/gog/SKILL.md +0 -117
  104. package/skills/goplaces/SKILL.md +0 -53
  105. package/skills/healthcheck/SKILL.md +0 -246
  106. package/skills/himalaya/SKILL.md +0 -258
  107. package/skills/himalaya/references/configuration.md +0 -184
  108. package/skills/himalaya/references/message-composition.md +0 -199
  109. package/skills/imsg/SKILL.md +0 -122
  110. package/skills/long-task/SKILL.md +0 -58
  111. package/skills/long-task/scripts/detach-task.sh +0 -187
  112. package/skills/nano-banana-pro/SKILL.md +0 -59
  113. package/skills/nano-banana-pro/scripts/generate_image.py +0 -184
  114. package/skills/nano-pdf/SKILL.md +0 -39
  115. package/skills/notion/SKILL.md +0 -173
  116. package/skills/obsidian/SKILL.md +0 -82
  117. package/skills/openai-image-gen/SKILL.md +0 -90
  118. package/skills/openai-image-gen/scripts/gen.py +0 -240
  119. package/skills/openai-whisper/SKILL.md +0 -39
  120. package/skills/openai-whisper-api/SKILL.md +0 -53
  121. package/skills/openai-whisper-api/scripts/transcribe.sh +0 -85
  122. package/skills/openhue/SKILL.md +0 -113
  123. package/skills/oracle/SKILL.md +0 -126
  124. package/skills/ordercli/SKILL.md +0 -79
  125. package/skills/peekaboo/SKILL.md +0 -191
  126. package/skills/reactions-extensive/SKILL.md +0 -30
  127. package/skills/reactions-minimal/SKILL.md +0 -31
  128. package/skills/safe-edit/SKILL.md +0 -51
  129. package/skills/sag/SKILL.md +0 -88
  130. package/skills/sherpa-onnx-tts/SKILL.md +0 -104
  131. package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +0 -178
  132. package/skills/songsee/SKILL.md +0 -50
  133. package/skills/sonoscli/SKILL.md +0 -66
  134. package/skills/spotify-player/SKILL.md +0 -65
  135. package/skills/symihub/SKILL.md +0 -78
  136. package/skills/things-mac/SKILL.md +0 -87
  137. package/skills/tmux/SKILL.md +0 -153
  138. package/skills/tmux/scripts/find-sessions.sh +0 -112
  139. package/skills/tmux/scripts/wait-for-text.sh +0 -83
  140. package/skills/trello/SKILL.md +0 -96
  141. package/skills/video-frames/SKILL.md +0 -47
  142. package/skills/video-frames/scripts/frame.sh +0 -81
  143. package/skills/voice-call/SKILL.md +0 -46
  144. package/skills/wacli/SKILL.md +0 -73
  145. package/skills/weather/SKILL.md +0 -113
  146. package/skills/xurl/SKILL.md +0 -462
@@ -1,108 +0,0 @@
1
- ---
2
- name: bear-notes
3
- description: Create, search, and manage Bear notes via grizzly CLI.
4
- homepage: https://bear.app
5
- metadata:
6
- {
7
- "symi":
8
- {
9
- "emoji": "🐻",
10
- "os": ["darwin"],
11
- "requires": { "bins": ["grizzly"] },
12
- "install":
13
- [
14
- {
15
- "id": "go",
16
- "kind": "go",
17
- "module": "github.com/tylerwince/grizzly/cmd/grizzly@latest",
18
- "bins": ["grizzly"],
19
- "label": "Install grizzly (go)",
20
- },
21
- ],
22
- },
23
- }
24
- triggers: [bear-notes, bear, notes]
25
- ---
26
-
27
- # Bear Notes
28
-
29
- Use `grizzly` to create, read, and manage notes in Bear on macOS.
30
-
31
- Requirements
32
-
33
- - Bear app installed and running
34
- - For some operations (add-text, tags, open-note --selected), a Bear app token (stored in `~/.config/grizzly/token`)
35
-
36
- ## Getting a Bear Token
37
-
38
- For operations that require a token (add-text, tags, open-note --selected), you need an authentication token:
39
-
40
- 1. Open Bear → Help → API Token → Copy Token
41
- 2. Save it: `echo "YOUR_TOKEN" > ~/.config/grizzly/token`
42
-
43
- ## Common Commands
44
-
45
- Create a note
46
-
47
- ```bash
48
- echo "Note content here" | grizzly create --title "My Note" --tag work
49
- grizzly create --title "Quick Note" --tag inbox < /dev/null
50
- ```
51
-
52
- Open/read a note by ID
53
-
54
- ```bash
55
- grizzly open-note --id "NOTE_ID" --enable-callback --json
56
- ```
57
-
58
- Append text to a note
59
-
60
- ```bash
61
- echo "Additional content" | grizzly add-text --id "NOTE_ID" --mode append --token-file ~/.config/grizzly/token
62
- ```
63
-
64
- List all tags
65
-
66
- ```bash
67
- grizzly tags --enable-callback --json --token-file ~/.config/grizzly/token
68
- ```
69
-
70
- Search notes (via open-tag)
71
-
72
- ```bash
73
- grizzly open-tag --name "work" --enable-callback --json
74
- ```
75
-
76
- ## Options
77
-
78
- Common flags:
79
-
80
- - `--dry-run` — Preview the URL without executing
81
- - `--print-url` — Show the x-callback-url
82
- - `--enable-callback` — Wait for Bear's response (needed for reading data)
83
- - `--json` — Output as JSON (when using callbacks)
84
- - `--token-file PATH` — Path to Bear API token file
85
-
86
- ## Configuration
87
-
88
- Grizzly reads config from (in priority order):
89
-
90
- 1. CLI flags
91
- 2. Environment variables (`GRIZZLY_TOKEN_FILE`, `GRIZZLY_CALLBACK_URL`, `GRIZZLY_TIMEOUT`)
92
- 3. `.grizzly.toml` in current directory
93
- 4. `~/.config/grizzly/config.toml`
94
-
95
- Example `~/.config/grizzly/config.toml`:
96
-
97
- ```toml
98
- token_file = "~/.config/grizzly/token"
99
- callback_url = "http://127.0.0.1:42123/success"
100
- timeout = "5s"
101
- ```
102
-
103
- ## Notes
104
-
105
- - Bear must be running for commands to work
106
- - Note IDs are Bear's internal identifiers (visible in note info or via callbacks)
107
- - Use `--enable-callback` when you need to read data back from Bear
108
- - Some operations require a valid token (add-text, tags, open-note --selected)
@@ -1,70 +0,0 @@
1
- ---
2
- name: blogwatcher
3
- description: Monitor blogs and RSS/Atom feeds for updates using the blogwatcher CLI.
4
- homepage: https://github.com/Hyaxia/blogwatcher
5
- metadata:
6
- {
7
- "symi":
8
- {
9
- "emoji": "📰",
10
- "requires": { "bins": ["blogwatcher"] },
11
- "install":
12
- [
13
- {
14
- "id": "go",
15
- "kind": "go",
16
- "module": "github.com/Hyaxia/blogwatcher/cmd/blogwatcher@latest",
17
- "bins": ["blogwatcher"],
18
- "label": "Install blogwatcher (go)",
19
- },
20
- ],
21
- },
22
- }
23
- triggers: [blogwatcher]
24
- ---
25
-
26
- # blogwatcher
27
-
28
- Track blog and RSS/Atom feed updates with the `blogwatcher` CLI.
29
-
30
- Install
31
-
32
- - Go: `go install github.com/Hyaxia/blogwatcher/cmd/blogwatcher@latest`
33
-
34
- Quick start
35
-
36
- - `blogwatcher --help`
37
-
38
- Common commands
39
-
40
- - Add a blog: `blogwatcher add "My Blog" https://example.com`
41
- - List blogs: `blogwatcher blogs`
42
- - Scan for updates: `blogwatcher scan`
43
- - List articles: `blogwatcher articles`
44
- - Mark an article read: `blogwatcher read 1`
45
- - Mark all articles read: `blogwatcher read-all`
46
- - Remove a blog: `blogwatcher remove "My Blog"`
47
-
48
- Example output
49
-
50
- ```
51
- $ blogwatcher blogs
52
- Tracked blogs (1):
53
-
54
- xkcd
55
- URL: https://xkcd.com
56
- ```
57
-
58
- ```
59
- $ blogwatcher scan
60
- Scanning 1 blog(s)...
61
-
62
- xkcd
63
- Source: RSS | Found: 4 | New: 4
64
-
65
- Found 4 new article(s) total!
66
- ```
67
-
68
- Notes
69
-
70
- - Use `blogwatcher <command> --help` to discover flags and options.
@@ -1,48 +0,0 @@
1
- ---
2
- name: blucli
3
- description: BluOS CLI (blu) for discovery, playback, grouping, and volume.
4
- homepage: https://blucli.sh
5
- metadata:
6
- {
7
- "symi":
8
- {
9
- "emoji": "🫐",
10
- "requires": { "bins": ["blu"] },
11
- "install":
12
- [
13
- {
14
- "id": "go",
15
- "kind": "go",
16
- "module": "github.com/steipete/blucli/cmd/blu@latest",
17
- "bins": ["blu"],
18
- "label": "Install blucli (go)",
19
- },
20
- ],
21
- },
22
- }
23
- triggers: [blucli]
24
- ---
25
-
26
- # blucli (blu)
27
-
28
- Use `blu` to control Bluesound/NAD players.
29
-
30
- Quick start
31
-
32
- - `blu devices` (pick target)
33
- - `blu --device <id> status`
34
- - `blu play|pause|stop`
35
- - `blu volume set 15`
36
-
37
- Target selection (in priority order)
38
-
39
- - `--device <id|name|alias>`
40
- - `BLU_DEVICE`
41
- - config default (if set)
42
-
43
- Common tasks
44
-
45
- - Grouping: `blu group status|add|remove`
46
- - TuneIn search/play: `blu tunein search "query"`, `blu tunein play "query"`
47
-
48
- Prefer `--json` for scripts. Confirm the target device before changing playback.
@@ -1,132 +0,0 @@
1
- ---
2
- name: bluebubbles
3
- description: Use when you need to send or manage iMessages via BlueBubbles (recommended iMessage integration). Calls go through the generic message tool with channel="bluebubbles".
4
- metadata: { "symi": { "emoji": "🫧", "requires": { "config": ["channels.bluebubbles"] } } }
5
- triggers: [bluebubbles]
6
- ---
7
-
8
- # BlueBubbles Actions
9
-
10
- ## Overview
11
-
12
- BlueBubbles is Symi’s recommended iMessage integration. Use the `message` tool with `channel: "bluebubbles"` to send messages and manage iMessage conversations: send texts and attachments, react (tapbacks), edit/unsend, reply in threads, and manage group participants/names/icons.
13
-
14
- ## Inputs to collect
15
-
16
- - `target` (prefer `chat_guid:...`; also `+15551234567` in E.164 or `user@example.com`)
17
- - `message` text for send/edit/reply
18
- - `messageId` for react/edit/unsend/reply
19
- - Attachment `path` for local files, or `buffer` + `filename` for base64
20
-
21
- If the user is vague ("text my mom"), ask for the recipient handle or chat guid and the exact message content.
22
-
23
- ## Actions
24
-
25
- ### Send a message
26
-
27
- ```json
28
- {
29
- "action": "send",
30
- "channel": "bluebubbles",
31
- "target": "+15551234567",
32
- "message": "hello from Symi"
33
- }
34
- ```
35
-
36
- ### React (tapback)
37
-
38
- ```json
39
- {
40
- "action": "react",
41
- "channel": "bluebubbles",
42
- "target": "+15551234567",
43
- "messageId": "<message-guid>",
44
- "emoji": "❤️"
45
- }
46
- ```
47
-
48
- ### Remove a reaction
49
-
50
- ```json
51
- {
52
- "action": "react",
53
- "channel": "bluebubbles",
54
- "target": "+15551234567",
55
- "messageId": "<message-guid>",
56
- "emoji": "❤️",
57
- "remove": true
58
- }
59
- ```
60
-
61
- ### Edit a previously sent message
62
-
63
- ```json
64
- {
65
- "action": "edit",
66
- "channel": "bluebubbles",
67
- "target": "+15551234567",
68
- "messageId": "<message-guid>",
69
- "message": "updated text"
70
- }
71
- ```
72
-
73
- ### Unsend a message
74
-
75
- ```json
76
- {
77
- "action": "unsend",
78
- "channel": "bluebubbles",
79
- "target": "+15551234567",
80
- "messageId": "<message-guid>"
81
- }
82
- ```
83
-
84
- ### Reply to a specific message
85
-
86
- ```json
87
- {
88
- "action": "reply",
89
- "channel": "bluebubbles",
90
- "target": "+15551234567",
91
- "replyTo": "<message-guid>",
92
- "message": "replying to that"
93
- }
94
- ```
95
-
96
- ### Send an attachment
97
-
98
- ```json
99
- {
100
- "action": "sendAttachment",
101
- "channel": "bluebubbles",
102
- "target": "+15551234567",
103
- "path": "/tmp/photo.jpg",
104
- "caption": "here you go"
105
- }
106
- ```
107
-
108
- ### Send with an iMessage effect
109
-
110
- ```json
111
- {
112
- "action": "sendWithEffect",
113
- "channel": "bluebubbles",
114
- "target": "+15551234567",
115
- "message": "big news",
116
- "effect": "balloons"
117
- }
118
- ```
119
-
120
- ## Notes
121
-
122
- - Requires gateway config `channels.bluebubbles` (serverUrl/password/webhookPath).
123
- - Prefer `chat_guid` targets when you have them (especially for group chats).
124
- - BlueBubbles supports rich actions, but some are macOS-version dependent (for example, edit may be broken on macOS 26 Tahoe).
125
- - The gateway may expose both short and full message ids; full ids are more durable across restarts.
126
- - Developer reference for the underlying plugin lives in `extensions/bluebubbles/README.md`.
127
-
128
- ## Ideas to try
129
-
130
- - React with a tapback to acknowledge a request.
131
- - Reply in-thread when a user references a specific message.
132
- - Send a file attachment with a short caption.
@@ -1,46 +0,0 @@
1
- ---
2
- name: camsnap
3
- description: Capture frames or clips from RTSP/ONVIF cameras.
4
- homepage: https://camsnap.ai
5
- metadata:
6
- {
7
- "symi":
8
- {
9
- "emoji": "📸",
10
- "requires": { "bins": ["camsnap"] },
11
- "install":
12
- [
13
- {
14
- "id": "brew",
15
- "kind": "brew",
16
- "formula": "steipete/tap/camsnap",
17
- "bins": ["camsnap"],
18
- "label": "Install camsnap (brew)",
19
- },
20
- ],
21
- },
22
- }
23
- triggers: [camsnap]
24
- ---
25
-
26
- # camsnap
27
-
28
- Use `camsnap` to grab snapshots, clips, or motion events from configured cameras.
29
-
30
- Setup
31
-
32
- - Config file: `~/.config/camsnap/config.yaml`
33
- - Add camera: `camsnap add --name kitchen --host 192.168.0.10 --user user --pass pass`
34
-
35
- Common commands
36
-
37
- - Discover: `camsnap discover --info`
38
- - Snapshot: `camsnap snap kitchen --out shot.jpg`
39
- - Clip: `camsnap clip kitchen --dur 5s --out clip.mp4`
40
- - Motion watch: `camsnap watch kitchen --threshold 0.2 --action '...'`
41
- - Doctor: `camsnap doctor --probe`
42
-
43
- Notes
44
-
45
- - Requires `ffmpeg` on PATH.
46
- - Prefer a short test capture before longer clips.
@@ -1,204 +0,0 @@
1
- ---
2
- name: canvas
3
- description: Display HTML content on connected Symi nodes (Mac app, iOS, Android). Use for games, visualizations, dashboards, generated HTML, and interactive demos.
4
- triggers: [canvas, display, html, visualize, dashboard, demo]
5
- ---
6
-
7
- # Canvas Skill
8
-
9
- Display HTML content on connected Symi nodes (Mac app, iOS, Android).
10
-
11
- ## Overview
12
-
13
- The canvas tool lets you present web content on any connected node's canvas view. Great for:
14
-
15
- - Displaying games, visualizations, dashboards
16
- - Showing generated HTML content
17
- - Interactive demos
18
-
19
- ## How It Works
20
-
21
- ### Architecture
22
-
23
- ```
24
- ┌─────────────────┐ ┌──────────────────┐ ┌─────────────┐
25
- │ Canvas Host │────▶│ Node Bridge │────▶│ Node App │
26
- │ (HTTP Server) │ │ (TCP Server) │ │ (Mac/iOS/ │
27
- │ Port 18793 │ │ Port 18790 │ │ Android) │
28
- └─────────────────┘ └──────────────────┘ └─────────────┘
29
- ```
30
-
31
- 1. **Canvas Host Server**: Serves static HTML/CSS/JS files from `canvasHost.root` directory
32
- 2. **Node Bridge**: Communicates canvas URLs to connected nodes
33
- 3. **Node Apps**: Render the content in a WebView
34
-
35
- ### Tailscale Integration
36
-
37
- The canvas host server binds based on `gateway.bind` setting:
38
-
39
- | Bind Mode | Server Binds To | Canvas URL Uses |
40
- | ---------- | ------------------- | -------------------------- |
41
- | `loopback` | 127.0.0.1 | localhost (local only) |
42
- | `lan` | LAN interface | LAN IP address |
43
- | `tailnet` | Tailscale interface | Tailscale hostname |
44
- | `auto` | Best available | Tailscale > LAN > loopback |
45
-
46
- **Key insight:** The `canvasHostHostForBridge` is derived from `bridgeHost`. When bound to Tailscale, nodes receive URLs like:
47
-
48
- ```
49
- http://<tailscale-hostname>:18793/__symi__/canvas/<file>.html
50
- ```
51
-
52
- This is why localhost URLs don't work - the node receives the Tailscale hostname from the bridge!
53
-
54
- ## Actions
55
-
56
- | Action | Description |
57
- | ---------- | ------------------------------------ |
58
- | `present` | Show canvas with optional target URL |
59
- | `hide` | Hide the canvas |
60
- | `navigate` | Navigate to a new URL |
61
- | `eval` | Execute JavaScript in the canvas |
62
- | `snapshot` | Capture screenshot of canvas |
63
-
64
- ## Configuration
65
-
66
- In `~/.symi/symi.json`:
67
-
68
- ```json
69
- {
70
- "canvasHost": {
71
- "enabled": true,
72
- "port": 18793,
73
- "root": "/Users/you/symi/canvas",
74
- "liveReload": true
75
- },
76
- "gateway": {
77
- "bind": "auto"
78
- }
79
- }
80
- ```
81
-
82
- ### Live Reload
83
-
84
- When `liveReload: true` (default), the canvas host:
85
-
86
- - Watches the root directory for changes (via chokidar)
87
- - Injects a WebSocket client into HTML files
88
- - Automatically reloads connected canvases when files change
89
-
90
- Great for development!
91
-
92
- ## Workflow
93
-
94
- ### 1. Create HTML content
95
-
96
- Place files in the canvas root directory (default `~/symi/canvas/`):
97
-
98
- ```bash
99
- cat > ~/symi/canvas/my-game.html << 'HTML'
100
- <!DOCTYPE html>
101
- <html>
102
- <head><title>My Game</title></head>
103
- <body>
104
- <h1>Hello Canvas!</h1>
105
- </body>
106
- </html>
107
- HTML
108
- ```
109
-
110
- ### 2. Find your canvas host URL
111
-
112
- Check how your gateway is bound:
113
-
114
- ```bash
115
- cat ~/.symi/symi.json | jq '.gateway.bind'
116
- ```
117
-
118
- Then construct the URL:
119
-
120
- - **loopback**: `http://127.0.0.1:18793/__symi__/canvas/<file>.html`
121
- - **lan/tailnet/auto**: `http://<hostname>:18793/__symi__/canvas/<file>.html`
122
-
123
- Find your Tailscale hostname:
124
-
125
- ```bash
126
- tailscale status --json | jq -r '.Self.DNSName' | sed 's/\.$//'
127
- ```
128
-
129
- ### 3. Find connected nodes
130
-
131
- ```bash
132
- symi nodes list
133
- ```
134
-
135
- Look for Mac/iOS/Android nodes with canvas capability.
136
-
137
- ### 4. Present content
138
-
139
- ```
140
- canvas action:present node:<node-id> target:<full-url>
141
- ```
142
-
143
- **Example:**
144
-
145
- ```
146
- canvas action:present node:mac-63599bc4-b54d-4392-9048-b97abd58343a target:http://peters-mac-studio-1.sheep-coho.ts.net:18793/__symi__/canvas/snake.html
147
- ```
148
-
149
- ### 5. Navigate, snapshot, or hide
150
-
151
- ```
152
- canvas action:navigate node:<node-id> url:<new-url>
153
- canvas action:snapshot node:<node-id>
154
- canvas action:hide node:<node-id>
155
- ```
156
-
157
- ## Debugging
158
-
159
- ### White screen / content not loading
160
-
161
- **Cause:** URL mismatch between server bind and node expectation.
162
-
163
- **Debug steps:**
164
-
165
- 1. Check server bind: `cat ~/.symi/symi.json | jq '.gateway.bind'`
166
- 2. Check what port canvas is on: `lsof -i :18793`
167
- 3. Test URL directly: `curl http://<hostname>:18793/__symi__/canvas/<file>.html`
168
-
169
- **Solution:** Use the full hostname matching your bind mode, not localhost.
170
-
171
- ### "node required" error
172
-
173
- Always specify `node:<node-id>` parameter.
174
-
175
- ### "node not connected" error
176
-
177
- Node is offline. Use `symi nodes list` to find online nodes.
178
-
179
- ### Content not updating
180
-
181
- If live reload isn't working:
182
-
183
- 1. Check `liveReload: true` in config
184
- 2. Ensure file is in the canvas root directory
185
- 3. Check for watcher errors in logs
186
-
187
- ## URL Path Structure
188
-
189
- The canvas host serves from `/__symi__/canvas/` prefix:
190
-
191
- ```
192
- http://<host>:18793/__symi__/canvas/index.html → ~/symi/canvas/index.html
193
- http://<host>:18793/__symi__/canvas/games/snake.html → ~/symi/canvas/games/snake.html
194
- ```
195
-
196
- The `/__symi__/canvas/` prefix is defined by `CANVAS_HOST_PATH` constant.
197
-
198
- ## Tips
199
-
200
- - Keep HTML self-contained (inline CSS/JS) for best results
201
- - Use the default index.html as a test page (has bridge diagnostics)
202
- - The canvas persists until you `hide` it or navigate away
203
- - Live reload makes development fast - just save and it updates!
204
- - A2UI JSON push is WIP - use HTML files for now