@symerian/symi 3.0.17 → 3.0.19

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 (259) 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/extensions/copilot-proxy/README.md +0 -24
  85. package/extensions/copilot-proxy/index.ts +0 -154
  86. package/extensions/copilot-proxy/node_modules/.bin/symi +0 -21
  87. package/extensions/copilot-proxy/package.json +0 -15
  88. package/extensions/copilot-proxy/symi.plugin.json +0 -9
  89. package/extensions/device-pair/index.ts +0 -642
  90. package/extensions/device-pair/symi.plugin.json +0 -20
  91. package/extensions/diagnostics-otel/index.ts +0 -15
  92. package/extensions/diagnostics-otel/node_modules/.bin/acorn +0 -21
  93. package/extensions/diagnostics-otel/node_modules/.bin/symi +0 -21
  94. package/extensions/diagnostics-otel/package.json +0 -27
  95. package/extensions/diagnostics-otel/src/service.test.ts +0 -290
  96. package/extensions/diagnostics-otel/src/service.ts +0 -666
  97. package/extensions/diagnostics-otel/symi.plugin.json +0 -8
  98. package/extensions/google-antigravity-auth/README.md +0 -24
  99. package/extensions/google-antigravity-auth/index.ts +0 -424
  100. package/extensions/google-antigravity-auth/node_modules/.bin/symi +0 -21
  101. package/extensions/google-antigravity-auth/package.json +0 -15
  102. package/extensions/google-antigravity-auth/symi.plugin.json +0 -9
  103. package/extensions/google-gemini-cli-auth/README.md +0 -35
  104. package/extensions/google-gemini-cli-auth/index.ts +0 -75
  105. package/extensions/google-gemini-cli-auth/node_modules/.bin/symi +0 -21
  106. package/extensions/google-gemini-cli-auth/oauth.test.ts +0 -162
  107. package/extensions/google-gemini-cli-auth/oauth.ts +0 -636
  108. package/extensions/google-gemini-cli-auth/package.json +0 -15
  109. package/extensions/google-gemini-cli-auth/symi.plugin.json +0 -9
  110. package/extensions/learning-loop/index.ts +0 -159
  111. package/extensions/learning-loop/node_modules/.bin/symi +0 -21
  112. package/extensions/learning-loop/package.json +0 -18
  113. package/extensions/learning-loop/src/analytics/gateway-methods.ts +0 -230
  114. package/extensions/learning-loop/src/analytics/metrics-aggregator.ts +0 -153
  115. package/extensions/learning-loop/src/capture/run-tracker.ts +0 -181
  116. package/extensions/learning-loop/src/capture/serializer.ts +0 -74
  117. package/extensions/learning-loop/src/db.ts +0 -583
  118. package/extensions/learning-loop/src/feedback/explicit-feedback.ts +0 -58
  119. package/extensions/learning-loop/src/feedback/implicit-signals.ts +0 -89
  120. package/extensions/learning-loop/src/graph/edge-inference.ts +0 -189
  121. package/extensions/learning-loop/src/graph/graph-retrieval.ts +0 -144
  122. package/extensions/learning-loop/src/graph/graph-store.ts +0 -183
  123. package/extensions/learning-loop/src/hooks.ts +0 -244
  124. package/extensions/learning-loop/src/injection/cache.ts +0 -73
  125. package/extensions/learning-loop/src/injection/context-injector.ts +0 -104
  126. package/extensions/learning-loop/src/injection/prompt-builder.ts +0 -43
  127. package/extensions/learning-loop/src/learning/embedding-bridge.ts +0 -54
  128. package/extensions/learning-loop/src/learning/learning-extractor.ts +0 -217
  129. package/extensions/learning-loop/src/learning/learning-store.ts +0 -158
  130. package/extensions/learning-loop/src/learning/retrieval.ts +0 -87
  131. package/extensions/learning-loop/src/math/confidence-intervals.ts +0 -62
  132. package/extensions/learning-loop/src/math/ewma.ts +0 -51
  133. package/extensions/learning-loop/src/math/weighted-scorer.ts +0 -42
  134. package/extensions/learning-loop/src/schema.ts +0 -176
  135. package/extensions/learning-loop/src/scoring/normalization.ts +0 -32
  136. package/extensions/learning-loop/src/scoring/quality-engine.ts +0 -78
  137. package/extensions/learning-loop/src/scoring/signal-extractors.ts +0 -155
  138. package/extensions/learning-loop/src/test/context-injector.test.ts +0 -142
  139. package/extensions/learning-loop/src/test/fixes.test.ts +0 -1286
  140. package/extensions/learning-loop/src/test/graph.test.ts +0 -711
  141. package/extensions/learning-loop/src/test/integration.test.ts +0 -312
  142. package/extensions/learning-loop/src/test/learning-store.test.ts +0 -191
  143. package/extensions/learning-loop/src/test/math.test.ts +0 -148
  144. package/extensions/learning-loop/src/test/quality-engine.test.ts +0 -231
  145. package/extensions/learning-loop/src/test/run-tracker.test.ts +0 -143
  146. package/extensions/learning-loop/src/types.ts +0 -281
  147. package/extensions/learning-loop/symi.plugin.json +0 -46
  148. package/extensions/llm-task/README.md +0 -97
  149. package/extensions/llm-task/index.ts +0 -6
  150. package/extensions/llm-task/package.json +0 -12
  151. package/extensions/llm-task/src/llm-task-tool.test.ts +0 -138
  152. package/extensions/llm-task/src/llm-task-tool.ts +0 -249
  153. package/extensions/llm-task/symi.plugin.json +0 -21
  154. package/extensions/memory-lancedb/config.ts +0 -161
  155. package/extensions/memory-lancedb/index.test.ts +0 -330
  156. package/extensions/memory-lancedb/index.ts +0 -670
  157. package/extensions/memory-lancedb/node_modules/.bin/arrow2csv +0 -21
  158. package/extensions/memory-lancedb/node_modules/.bin/openai +0 -21
  159. package/extensions/memory-lancedb/node_modules/.bin/symi +0 -21
  160. package/extensions/memory-lancedb/package.json +0 -20
  161. package/extensions/memory-lancedb/symi.plugin.json +0 -71
  162. package/extensions/minimax-portal-auth/README.md +0 -33
  163. package/extensions/minimax-portal-auth/index.ts +0 -161
  164. package/extensions/minimax-portal-auth/node_modules/.bin/symi +0 -21
  165. package/extensions/minimax-portal-auth/oauth.ts +0 -247
  166. package/extensions/minimax-portal-auth/package.json +0 -15
  167. package/extensions/minimax-portal-auth/symi.plugin.json +0 -9
  168. package/extensions/model-equalizer/index.ts +0 -80
  169. package/extensions/model-equalizer/skills/model-equalizer/SKILL.md +0 -58
  170. package/extensions/model-equalizer/src/detection.ts +0 -62
  171. package/extensions/model-equalizer/src/enhancer.ts +0 -63
  172. package/extensions/model-equalizer/src/test/detection.test.ts +0 -218
  173. package/extensions/model-equalizer/src/test/enhancer.test.ts +0 -137
  174. package/extensions/model-equalizer/src/test/integration.test.ts +0 -185
  175. package/extensions/model-equalizer/src/types.ts +0 -24
  176. package/extensions/model-equalizer/symi.plugin.json +0 -12
  177. package/extensions/phone-control/index.ts +0 -421
  178. package/extensions/phone-control/symi.plugin.json +0 -10
  179. package/extensions/pipeline/README.md +0 -75
  180. package/extensions/pipeline/SKILL.md +0 -97
  181. package/extensions/pipeline/index.ts +0 -18
  182. package/extensions/pipeline/package.json +0 -11
  183. package/extensions/pipeline/src/pipeline-tool.test.ts +0 -345
  184. package/extensions/pipeline/src/pipeline-tool.ts +0 -266
  185. package/extensions/pipeline/src/windows-spawn.test.ts +0 -148
  186. package/extensions/pipeline/src/windows-spawn.ts +0 -193
  187. package/extensions/pipeline/symi.plugin.json +0 -10
  188. package/extensions/qwen-portal-auth/README.md +0 -24
  189. package/extensions/qwen-portal-auth/index.ts +0 -134
  190. package/extensions/qwen-portal-auth/oauth.ts +0 -190
  191. package/extensions/qwen-portal-auth/symi.plugin.json +0 -9
  192. package/extensions/talk-voice/index.ts +0 -150
  193. package/extensions/talk-voice/symi.plugin.json +0 -10
  194. package/extensions/thread-ownership/index.test.ts +0 -180
  195. package/extensions/thread-ownership/index.ts +0 -133
  196. package/extensions/thread-ownership/symi.plugin.json +0 -28
  197. package/skills/1password/SKILL.md +0 -71
  198. package/skills/1password/references/cli-examples.md +0 -29
  199. package/skills/1password/references/get-started.md +0 -17
  200. package/skills/apple-notes/SKILL.md +0 -78
  201. package/skills/apple-reminders/SKILL.md +0 -119
  202. package/skills/bear-notes/SKILL.md +0 -108
  203. package/skills/blogwatcher/SKILL.md +0 -70
  204. package/skills/blucli/SKILL.md +0 -48
  205. package/skills/bluebubbles/SKILL.md +0 -132
  206. package/skills/camsnap/SKILL.md +0 -46
  207. package/skills/canvas/SKILL.md +0 -204
  208. package/skills/connect-email/SKILL.md +0 -142
  209. package/skills/document-generation/SKILL.md +0 -83
  210. package/skills/eightctl/SKILL.md +0 -51
  211. package/skills/food-order/SKILL.md +0 -49
  212. package/skills/gemini/SKILL.md +0 -44
  213. package/skills/gh-issues/SKILL.md +0 -865
  214. package/skills/gifgrep/SKILL.md +0 -80
  215. package/skills/github/SKILL.md +0 -164
  216. package/skills/gog/SKILL.md +0 -117
  217. package/skills/goplaces/SKILL.md +0 -53
  218. package/skills/healthcheck/SKILL.md +0 -246
  219. package/skills/himalaya/SKILL.md +0 -258
  220. package/skills/himalaya/references/configuration.md +0 -184
  221. package/skills/himalaya/references/message-composition.md +0 -199
  222. package/skills/imsg/SKILL.md +0 -122
  223. package/skills/long-task/SKILL.md +0 -58
  224. package/skills/long-task/scripts/detach-task.sh +0 -187
  225. package/skills/nano-banana-pro/SKILL.md +0 -59
  226. package/skills/nano-banana-pro/scripts/generate_image.py +0 -184
  227. package/skills/nano-pdf/SKILL.md +0 -39
  228. package/skills/notion/SKILL.md +0 -173
  229. package/skills/obsidian/SKILL.md +0 -82
  230. package/skills/openai-image-gen/SKILL.md +0 -90
  231. package/skills/openai-image-gen/scripts/gen.py +0 -240
  232. package/skills/openai-whisper/SKILL.md +0 -39
  233. package/skills/openai-whisper-api/SKILL.md +0 -53
  234. package/skills/openai-whisper-api/scripts/transcribe.sh +0 -85
  235. package/skills/openhue/SKILL.md +0 -113
  236. package/skills/oracle/SKILL.md +0 -126
  237. package/skills/ordercli/SKILL.md +0 -79
  238. package/skills/peekaboo/SKILL.md +0 -191
  239. package/skills/reactions-extensive/SKILL.md +0 -30
  240. package/skills/reactions-minimal/SKILL.md +0 -31
  241. package/skills/safe-edit/SKILL.md +0 -51
  242. package/skills/sag/SKILL.md +0 -88
  243. package/skills/sherpa-onnx-tts/SKILL.md +0 -104
  244. package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +0 -178
  245. package/skills/songsee/SKILL.md +0 -50
  246. package/skills/sonoscli/SKILL.md +0 -66
  247. package/skills/spotify-player/SKILL.md +0 -65
  248. package/skills/symihub/SKILL.md +0 -78
  249. package/skills/things-mac/SKILL.md +0 -87
  250. package/skills/tmux/SKILL.md +0 -153
  251. package/skills/tmux/scripts/find-sessions.sh +0 -112
  252. package/skills/tmux/scripts/wait-for-text.sh +0 -83
  253. package/skills/trello/SKILL.md +0 -96
  254. package/skills/video-frames/SKILL.md +0 -47
  255. package/skills/video-frames/scripts/frame.sh +0 -81
  256. package/skills/voice-call/SKILL.md +0 -46
  257. package/skills/wacli/SKILL.md +0 -73
  258. package/skills/weather/SKILL.md +0 -113
  259. package/skills/xurl/SKILL.md +0 -462
@@ -1,133 +0,0 @@
1
- import type { SymiConfig, SymiPluginApi } from "symi/plugin-sdk";
2
-
3
- type ThreadOwnershipConfig = {
4
- forwarderUrl?: string;
5
- abTestChannels?: string[];
6
- };
7
-
8
- type AgentEntry = NonNullable<NonNullable<SymiConfig["agents"]>["list"]>[number];
9
-
10
- // In-memory set of {channel}:{thread} keys where this agent was @-mentioned.
11
- // Entries expire after 5 minutes.
12
- const mentionedThreads = new Map<string, number>();
13
- const MENTION_TTL_MS = 5 * 60 * 1000;
14
-
15
- function cleanExpiredMentions(): void {
16
- const now = Date.now();
17
- for (const [key, ts] of mentionedThreads) {
18
- if (now - ts > MENTION_TTL_MS) {
19
- mentionedThreads.delete(key);
20
- }
21
- }
22
- }
23
-
24
- function resolveOwnershipAgent(config: SymiConfig): { id: string; name: string } {
25
- const list = Array.isArray(config.agents?.list)
26
- ? config.agents.list.filter((entry): entry is AgentEntry =>
27
- Boolean(entry && typeof entry === "object"),
28
- )
29
- : [];
30
- const selected = list.find((entry) => entry.default === true) ?? list[0];
31
-
32
- const id =
33
- typeof selected?.id === "string" && selected.id.trim() ? selected.id.trim() : "unknown";
34
- const identityName =
35
- typeof selected?.identity?.name === "string" ? selected.identity.name.trim() : "";
36
- const fallbackName = typeof selected?.name === "string" ? selected.name.trim() : "";
37
- const name = identityName || fallbackName;
38
-
39
- return { id, name };
40
- }
41
-
42
- export default function register(api: SymiPluginApi) {
43
- const pluginCfg = (api.pluginConfig ?? {}) as ThreadOwnershipConfig;
44
- const forwarderUrl = (
45
- pluginCfg.forwarderUrl ??
46
- process.env.SLACK_FORWARDER_URL ??
47
- "http://slack-forwarder:8750"
48
- ).replace(/\/$/, "");
49
-
50
- const abTestChannels = new Set(
51
- pluginCfg.abTestChannels ??
52
- process.env.THREAD_OWNERSHIP_CHANNELS?.split(",").filter(Boolean) ??
53
- [],
54
- );
55
-
56
- const { id: agentId, name: agentName } = resolveOwnershipAgent(api.config);
57
- const botUserId = process.env.SLACK_BOT_USER_ID ?? "";
58
-
59
- // ---------------------------------------------------------------------------
60
- // message_received: track @-mentions so the agent can reply even if it
61
- // doesn't own the thread.
62
- // ---------------------------------------------------------------------------
63
- api.on("message_received", async (event, ctx) => {
64
- if (ctx.channelId !== "slack") return;
65
-
66
- const text = event.content ?? "";
67
- const threadTs = (event.metadata?.threadTs as string) ?? "";
68
- const channelId = (event.metadata?.channelId as string) ?? ctx.conversationId ?? "";
69
-
70
- if (!threadTs || !channelId) return;
71
-
72
- // Check if this agent was @-mentioned.
73
- const mentioned =
74
- (agentName && text.includes(`@${agentName}`)) ||
75
- (botUserId && text.includes(`<@${botUserId}>`));
76
-
77
- if (mentioned) {
78
- cleanExpiredMentions();
79
- mentionedThreads.set(`${channelId}:${threadTs}`, Date.now());
80
- }
81
- });
82
-
83
- // ---------------------------------------------------------------------------
84
- // message_sending: check thread ownership before sending to Slack.
85
- // Returns { cancel: true } if another agent owns the thread.
86
- // ---------------------------------------------------------------------------
87
- api.on("message_sending", async (event, ctx) => {
88
- if (ctx.channelId !== "slack") return;
89
-
90
- const threadTs = (event.metadata?.threadTs as string) ?? "";
91
- const channelId = (event.metadata?.channelId as string) ?? event.to;
92
-
93
- // Top-level messages (no thread) are always allowed.
94
- if (!threadTs) return;
95
-
96
- // Only enforce in A/B test channels (if set is empty, skip entirely).
97
- if (abTestChannels.size > 0 && !abTestChannels.has(channelId)) return;
98
-
99
- // If this agent was @-mentioned in this thread recently, skip ownership check.
100
- cleanExpiredMentions();
101
- if (mentionedThreads.has(`${channelId}:${threadTs}`)) return;
102
-
103
- // Try to claim ownership via the forwarder HTTP API.
104
- try {
105
- const resp = await fetch(`${forwarderUrl}/api/v1/ownership/${channelId}/${threadTs}`, {
106
- method: "POST",
107
- headers: { "Content-Type": "application/json" },
108
- body: JSON.stringify({ agent_id: agentId }),
109
- signal: AbortSignal.timeout(3000),
110
- });
111
-
112
- if (resp.ok) {
113
- // We own it (or just claimed it), proceed.
114
- return;
115
- }
116
-
117
- if (resp.status === 409) {
118
- // Another agent owns this thread — cancel the send.
119
- const body = (await resp.json()) as { owner?: string };
120
- api.logger.info?.(
121
- `thread-ownership: cancelled send to ${channelId}:${threadTs} — owned by ${body.owner}`,
122
- );
123
- return { cancel: true };
124
- }
125
-
126
- // Unexpected status — fail open.
127
- api.logger.warn?.(`thread-ownership: unexpected status ${resp.status}, allowing send`);
128
- } catch (err) {
129
- // Network error — fail open.
130
- api.logger.warn?.(`thread-ownership: ownership check failed (${String(err)}), allowing send`);
131
- }
132
- });
133
- }
@@ -1,28 +0,0 @@
1
- {
2
- "id": "thread-ownership",
3
- "name": "Thread Ownership",
4
- "description": "Prevents multiple agents from responding in the same Slack thread. Uses HTTP calls to the slack-forwarder ownership API.",
5
- "configSchema": {
6
- "type": "object",
7
- "additionalProperties": false,
8
- "properties": {
9
- "forwarderUrl": {
10
- "type": "string"
11
- },
12
- "abTestChannels": {
13
- "type": "array",
14
- "items": { "type": "string" }
15
- }
16
- }
17
- },
18
- "uiHints": {
19
- "forwarderUrl": {
20
- "label": "Forwarder URL",
21
- "help": "Base URL of the slack-forwarder ownership API (default: http://slack-forwarder:8750)"
22
- },
23
- "abTestChannels": {
24
- "label": "A/B Test Channels",
25
- "help": "Slack channel IDs where thread ownership is enforced"
26
- }
27
- }
28
- }
@@ -1,71 +0,0 @@
1
- ---
2
- name: 1password
3
- description: Set up and use 1Password CLI (op). Use when installing the CLI, enabling desktop app integration, signing in (single or multi-account), or reading/injecting/running secrets via op.
4
- homepage: https://developer.1password.com/docs/cli/get-started/
5
- metadata:
6
- {
7
- "symi":
8
- {
9
- "emoji": "🔐",
10
- "requires": { "bins": ["op"] },
11
- "install":
12
- [
13
- {
14
- "id": "brew",
15
- "kind": "brew",
16
- "formula": "1password-cli",
17
- "bins": ["op"],
18
- "label": "Install 1Password CLI (brew)",
19
- },
20
- ],
21
- },
22
- }
23
- triggers: [1password]
24
- ---
25
-
26
- # 1Password CLI
27
-
28
- Follow the official CLI get-started steps. Don't guess install commands.
29
-
30
- ## References
31
-
32
- - `references/get-started.md` (install + app integration + sign-in flow)
33
- - `references/cli-examples.md` (real `op` examples)
34
-
35
- ## Workflow
36
-
37
- 1. Check OS + shell.
38
- 2. Verify CLI present: `op --version`.
39
- 3. Confirm desktop app integration is enabled (per get-started) and the app is unlocked.
40
- 4. REQUIRED: create a fresh tmux session for all `op` commands (no direct `op` calls outside tmux).
41
- 5. Sign in / authorize inside tmux: `op signin` (expect app prompt).
42
- 6. Verify access inside tmux: `op whoami` (must succeed before any secret read).
43
- 7. If multiple accounts: use `--account` or `OP_ACCOUNT`.
44
-
45
- ## REQUIRED tmux session (T-Max)
46
-
47
- The shell tool uses a fresh TTY per command. To avoid re-prompts and failures, always run `op` inside a dedicated tmux session with a fresh socket/session name.
48
-
49
- Example (see `tmux` skill for socket conventions, do not reuse old session names):
50
-
51
- ```bash
52
- SOCKET_DIR="${SYMI_TMUX_SOCKET_DIR:-${SYMI_TMUX_SOCKET_DIR:-${TMPDIR:-/tmp}/symi-tmux-sockets}}"
53
- mkdir -p "$SOCKET_DIR"
54
- SOCKET="$SOCKET_DIR/symi-op.sock"
55
- SESSION="op-auth-$(date +%Y%m%d-%H%M%S)"
56
-
57
- tmux -S "$SOCKET" new -d -s "$SESSION" -n shell
58
- tmux -S "$SOCKET" send-keys -t "$SESSION":0.0 -- "op signin --account my.1password.com" Enter
59
- tmux -S "$SOCKET" send-keys -t "$SESSION":0.0 -- "op whoami" Enter
60
- tmux -S "$SOCKET" send-keys -t "$SESSION":0.0 -- "op vault list" Enter
61
- tmux -S "$SOCKET" capture-pane -p -J -t "$SESSION":0.0 -S -200
62
- tmux -S "$SOCKET" kill-session -t "$SESSION"
63
- ```
64
-
65
- ## Guardrails
66
-
67
- - Never paste secrets into logs, chat, or code.
68
- - Prefer `op run` / `op inject` over writing secrets to disk.
69
- - If sign-in without app integration is needed, use `op account add`.
70
- - If a command returns "account is not signed in", re-run `op signin` inside tmux and authorize in the app.
71
- - Do not run `op` outside tmux; stop and ask if tmux is unavailable.
@@ -1,29 +0,0 @@
1
- # op CLI examples (from op help)
2
-
3
- ## Sign in
4
-
5
- - `op signin`
6
- - `op signin --account <shorthand|signin-address|account-id|user-id>`
7
-
8
- ## Read
9
-
10
- - `op read op://app-prod/db/password`
11
- - `op read "op://app-prod/db/one-time password?attribute=otp"`
12
- - `op read "op://app-prod/ssh key/private key?ssh-format=openssh"`
13
- - `op read --out-file ./key.pem op://app-prod/server/ssh/key.pem`
14
-
15
- ## Run
16
-
17
- - `export DB_PASSWORD="op://app-prod/db/password"`
18
- - `op run --no-masking -- printenv DB_PASSWORD`
19
- - `op run --env-file="./.env" -- printenv DB_PASSWORD`
20
-
21
- ## Inject
22
-
23
- - `echo "db_password: {{ op://app-prod/db/password }}" | op inject`
24
- - `op inject -i config.yml.tpl -o config.yml`
25
-
26
- ## Whoami / accounts
27
-
28
- - `op whoami`
29
- - `op account list`
@@ -1,17 +0,0 @@
1
- # 1Password CLI get-started (summary)
2
-
3
- - Works on macOS, Windows, and Linux.
4
- - macOS/Linux shells: bash, zsh, sh, fish.
5
- - Windows shell: PowerShell.
6
- - Requires a 1Password subscription and the desktop app to use app integration.
7
- - macOS requirement: Big Sur 11.0.0 or later.
8
- - Linux app integration requires PolKit + an auth agent.
9
- - Install the CLI per the official doc for your OS.
10
- - Enable desktop app integration in the 1Password app:
11
- - Open and unlock the app, then select your account/collection.
12
- - macOS: Settings > Developer > Integrate with 1Password CLI (Touch ID optional).
13
- - Windows: turn on Windows Hello, then Settings > Developer > Integrate.
14
- - Linux: Settings > Security > Unlock using system authentication, then Settings > Developer > Integrate.
15
- - After integration, run any command to sign in (example in docs: `op vault list`).
16
- - If multiple accounts: use `op signin` to pick one, or `--account` / `OP_ACCOUNT`.
17
- - For non-integration auth, use `op account add`.
@@ -1,78 +0,0 @@
1
- ---
2
- name: apple-notes
3
- description: Manage Apple Notes via the `memo` CLI on macOS (create, view, edit, delete, search, move, and export notes). Use when a user asks Symi to add a note, list notes, search notes, or manage note folders.
4
- homepage: https://github.com/antoniorodr/memo
5
- metadata:
6
- {
7
- "symi":
8
- {
9
- "emoji": "📝",
10
- "os": ["darwin"],
11
- "requires": { "bins": ["memo"] },
12
- "install":
13
- [
14
- {
15
- "id": "brew",
16
- "kind": "brew",
17
- "formula": "antoniorodr/memo/memo",
18
- "bins": ["memo"],
19
- "label": "Install memo via Homebrew",
20
- },
21
- ],
22
- },
23
- }
24
- triggers: [apple-notes, apple, notes]
25
- ---
26
-
27
- # Apple Notes CLI
28
-
29
- Use `memo notes` to manage Apple Notes directly from the terminal. Create, view, edit, delete, search, move notes between folders, and export to HTML/Markdown.
30
-
31
- Setup
32
-
33
- - Install (Homebrew): `brew tap antoniorodr/memo && brew install antoniorodr/memo/memo`
34
- - Manual (pip): `pip install .` (after cloning the repo)
35
- - macOS-only; if prompted, grant Automation access to Notes.app.
36
-
37
- View Notes
38
-
39
- - List all notes: `memo notes`
40
- - Filter by folder: `memo notes -f "Folder Name"`
41
- - Search notes (fuzzy): `memo notes -s "query"`
42
-
43
- Create Notes
44
-
45
- - Add a new note: `memo notes -a`
46
- - Opens an interactive editor to compose the note.
47
- - Quick add with title: `memo notes -a "Note Title"`
48
-
49
- Edit Notes
50
-
51
- - Edit existing note: `memo notes -e`
52
- - Interactive selection of note to edit.
53
-
54
- Delete Notes
55
-
56
- - Delete a note: `memo notes -d`
57
- - Interactive selection of note to delete.
58
-
59
- Move Notes
60
-
61
- - Move note to folder: `memo notes -m`
62
- - Interactive selection of note and destination folder.
63
-
64
- Export Notes
65
-
66
- - Export to HTML/Markdown: `memo notes -ex`
67
- - Exports selected note; uses Mistune for markdown processing.
68
-
69
- Limitations
70
-
71
- - Cannot edit notes containing images or attachments.
72
- - Interactive prompts may require terminal access.
73
-
74
- Notes
75
-
76
- - macOS-only.
77
- - Requires Apple Notes.app to be accessible.
78
- - For automation, grant permissions in System Settings > Privacy & Security > Automation.
@@ -1,119 +0,0 @@
1
- ---
2
- name: apple-reminders
3
- description: Manage Apple Reminders via remindctl CLI (list, add, edit, complete, delete). Supports lists, date filters, and JSON/plain output.
4
- homepage: https://github.com/steipete/remindctl
5
- metadata:
6
- {
7
- "symi":
8
- {
9
- "emoji": "⏰",
10
- "os": ["darwin"],
11
- "requires": { "bins": ["remindctl"] },
12
- "install":
13
- [
14
- {
15
- "id": "brew",
16
- "kind": "brew",
17
- "formula": "steipete/tap/remindctl",
18
- "bins": ["remindctl"],
19
- "label": "Install remindctl via Homebrew",
20
- },
21
- ],
22
- },
23
- }
24
- triggers: [apple-reminders, apple, reminders]
25
- ---
26
-
27
- # Apple Reminders CLI (remindctl)
28
-
29
- Use `remindctl` to manage Apple Reminders directly from the terminal.
30
-
31
- ## When to Use
32
-
33
- ✅ **USE this skill when:**
34
-
35
- - User explicitly mentions "reminder" or "Reminders app"
36
- - Creating personal to-dos with due dates that sync to iOS
37
- - Managing Apple Reminders lists
38
- - User wants tasks to appear in their iPhone/iPad Reminders app
39
-
40
- ## When NOT to Use
41
-
42
- ❌ **DON'T use this skill when:**
43
-
44
- - Scheduling Symi tasks or alerts → use `cron` tool with systemEvent instead
45
- - Calendar events or appointments → use Apple Calendar
46
- - Project/work task management → use Notion, GitHub Issues, or task queue
47
- - One-time notifications → use `cron` tool for timed alerts
48
- - User says "remind me" but means a Symi alert → clarify first
49
-
50
- ## Setup
51
-
52
- - Install: `brew install steipete/tap/remindctl`
53
- - macOS-only; grant Reminders permission when prompted
54
- - Check status: `remindctl status`
55
- - Request access: `remindctl authorize`
56
-
57
- ## Common Commands
58
-
59
- ### View Reminders
60
-
61
- ```bash
62
- remindctl # Today's reminders
63
- remindctl today # Today
64
- remindctl tomorrow # Tomorrow
65
- remindctl week # This week
66
- remindctl overdue # Past due
67
- remindctl all # Everything
68
- remindctl 2026-01-04 # Specific date
69
- ```
70
-
71
- ### Manage Lists
72
-
73
- ```bash
74
- remindctl list # List all lists
75
- remindctl list Work # Show specific list
76
- remindctl list Projects --create # Create list
77
- remindctl list Work --delete # Delete list
78
- ```
79
-
80
- ### Create Reminders
81
-
82
- ```bash
83
- remindctl add "Buy milk"
84
- remindctl add --title "Call mom" --list Personal --due tomorrow
85
- remindctl add --title "Meeting prep" --due "2026-02-15 09:00"
86
- ```
87
-
88
- ### Complete/Delete
89
-
90
- ```bash
91
- remindctl complete 1 2 3 # Complete by ID
92
- remindctl delete 4A83 --force # Delete by ID
93
- ```
94
-
95
- ### Output Formats
96
-
97
- ```bash
98
- remindctl today --json # JSON for scripting
99
- remindctl today --plain # TSV format
100
- remindctl today --quiet # Counts only
101
- ```
102
-
103
- ## Date Formats
104
-
105
- Accepted by `--due` and date filters:
106
-
107
- - `today`, `tomorrow`, `yesterday`
108
- - `YYYY-MM-DD`
109
- - `YYYY-MM-DD HH:mm`
110
- - ISO 8601 (`2026-01-04T12:34:56Z`)
111
-
112
- ## Example: Clarifying User Intent
113
-
114
- User: "Remind me to check on the deploy in 2 hours"
115
-
116
- **Ask:** "Do you want this in Apple Reminders (syncs to your phone) or as a Symi alert (I'll message you here)?"
117
-
118
- - Apple Reminders → use this skill
119
- - Symi alert → use `cron` tool with systemEvent
@@ -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.