superlocalmemory 4.2.5 → 4.2.6

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 (202) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/.cursor-plugin/marketplace.json +29 -0
  3. package/CHANGELOG.md +112 -0
  4. package/README.md +48 -7
  5. package/antigravity-plugin/_GENERATED.md +1 -1
  6. package/antigravity-plugin/agents/slm-governance-advisor.md +1 -1
  7. package/antigravity-plugin/agents/slm-loop-runner.md +1 -1
  8. package/antigravity-plugin/agents/slm-memory-advisor.md +1 -1
  9. package/antigravity-plugin/agents/slm-optimize-advisor.md +1 -1
  10. package/antigravity-plugin/mcp_config.json +1 -2
  11. package/antigravity-plugin/plugin.json +1 -1
  12. package/antigravity-plugin/skills/slm-bot-memory/SKILL.md +1 -1
  13. package/antigravity-plugin/skills/slm-cache/SKILL.md +1 -1
  14. package/antigravity-plugin/skills/slm-compress/SKILL.md +1 -1
  15. package/antigravity-plugin/skills/slm-getting-started-bot/SKILL.md +1 -1
  16. package/antigravity-plugin/skills/slm-governance/SKILL.md +4 -2
  17. package/antigravity-plugin/skills/slm-graph/SKILL.md +7 -13
  18. package/antigravity-plugin/skills/slm-loop/SKILL.md +1 -1
  19. package/antigravity-plugin/skills/slm-media/SKILL.md +1 -1
  20. package/antigravity-plugin/skills/slm-mesh/SKILL.md +1 -1
  21. package/antigravity-plugin/skills/slm-profile/SKILL.md +21 -18
  22. package/antigravity-plugin/skills/slm-recall/SKILL.md +1 -1
  23. package/antigravity-plugin/skills/slm-remember/SKILL.md +1 -1
  24. package/antigravity-plugin/skills/slm-scope/SKILL.md +1 -1
  25. package/antigravity-plugin/skills/slm-session/SKILL.md +1 -1
  26. package/antigravity-plugin/skills/slm-status/SKILL.md +1 -1
  27. package/codex-plugin/.claude-plugin/plugin.json +1 -1
  28. package/codex-plugin/.codex-plugin/plugin.json +7 -3
  29. package/codex-plugin/AGENTS.md +1 -1
  30. package/codex-plugin/README.md +2 -2
  31. package/codex-plugin/_GENERATED.md +2 -1
  32. package/codex-plugin/agents/slm-governance-advisor.md +1 -1
  33. package/codex-plugin/agents/slm-loop-runner.md +1 -1
  34. package/codex-plugin/agents/slm-memory-advisor.md +1 -1
  35. package/codex-plugin/agents/slm-optimize-advisor.md +1 -1
  36. package/codex-plugin/skills/slm-bot-memory/SKILL.md +1 -1
  37. package/codex-plugin/skills/slm-cache/SKILL.md +1 -1
  38. package/codex-plugin/skills/slm-compress/SKILL.md +1 -1
  39. package/codex-plugin/skills/slm-getting-started-bot/SKILL.md +1 -1
  40. package/codex-plugin/skills/slm-governance/SKILL.md +4 -2
  41. package/codex-plugin/skills/slm-graph/SKILL.md +7 -13
  42. package/codex-plugin/skills/slm-loop/SKILL.md +1 -1
  43. package/codex-plugin/skills/slm-media/SKILL.md +1 -1
  44. package/codex-plugin/skills/slm-mesh/SKILL.md +1 -1
  45. package/codex-plugin/skills/slm-profile/SKILL.md +21 -18
  46. package/codex-plugin/skills/slm-recall/SKILL.md +1 -1
  47. package/codex-plugin/skills/slm-remember/SKILL.md +1 -1
  48. package/codex-plugin/skills/slm-scope/SKILL.md +1 -1
  49. package/codex-plugin/skills/slm-session/SKILL.md +1 -1
  50. package/codex-plugin/skills/slm-status/SKILL.md +1 -1
  51. package/copilot-plugin/.github/agents/slm-governance-advisor.agent.md +2 -2
  52. package/copilot-plugin/.github/agents/slm-loop-runner.agent.md +2 -2
  53. package/copilot-plugin/.github/agents/slm-memory-advisor.agent.md +2 -2
  54. package/copilot-plugin/.github/agents/slm-optimize-advisor.agent.md +2 -2
  55. package/copilot-plugin/.github/copilot-instructions.md +4 -4
  56. package/copilot-plugin/.github/prompts/slm-bot-memory.prompt.md +2 -2
  57. package/copilot-plugin/.github/prompts/slm-cache.prompt.md +2 -2
  58. package/copilot-plugin/.github/prompts/slm-compress.prompt.md +2 -2
  59. package/copilot-plugin/.github/prompts/slm-getting-started-bot.prompt.md +2 -2
  60. package/copilot-plugin/.github/prompts/slm-governance.prompt.md +5 -3
  61. package/copilot-plugin/.github/prompts/slm-graph.prompt.md +8 -14
  62. package/copilot-plugin/.github/prompts/slm-loop.prompt.md +2 -2
  63. package/copilot-plugin/.github/prompts/slm-media.prompt.md +2 -2
  64. package/copilot-plugin/.github/prompts/slm-mesh.prompt.md +2 -2
  65. package/copilot-plugin/.github/prompts/slm-profile.prompt.md +22 -19
  66. package/copilot-plugin/.github/prompts/slm-recall.prompt.md +2 -2
  67. package/copilot-plugin/.github/prompts/slm-remember.prompt.md +2 -2
  68. package/copilot-plugin/.github/prompts/slm-scope.prompt.md +2 -2
  69. package/copilot-plugin/.github/prompts/slm-session.prompt.md +2 -2
  70. package/copilot-plugin/.github/prompts/slm-status.prompt.md +2 -2
  71. package/copilot-plugin/.github/prompts/slm-web-access.prompt.md +1 -1
  72. package/copilot-plugin/README.md +2 -2
  73. package/copilot-plugin/_GENERATED.md +3 -3
  74. package/{plugin → cursor-plugin}/.cursor-plugin/plugin.json +3 -3
  75. package/cursor-plugin/LICENSE +24 -0
  76. package/cursor-plugin/assets/logo.svg +36 -0
  77. package/{plugin → cursor-plugin}/cursor-skills/slm-bot-memory/SKILL.md +1 -1
  78. package/cursor-plugin/cursor-skills/slm-cache/SKILL.md +147 -0
  79. package/cursor-plugin/cursor-skills/slm-compress/SKILL.md +150 -0
  80. package/{plugin → cursor-plugin}/cursor-skills/slm-getting-started-bot/SKILL.md +1 -1
  81. package/cursor-plugin/cursor-skills/slm-governance/SKILL.md +279 -0
  82. package/cursor-plugin/cursor-skills/slm-graph/SKILL.md +321 -0
  83. package/cursor-plugin/cursor-skills/slm-loop/SKILL.md +174 -0
  84. package/cursor-plugin/cursor-skills/slm-media/SKILL.md +340 -0
  85. package/cursor-plugin/cursor-skills/slm-mesh/SKILL.md +389 -0
  86. package/cursor-plugin/cursor-skills/slm-profile/SKILL.md +167 -0
  87. package/{plugin → cursor-plugin}/cursor-skills/slm-recall/SKILL.md +1 -1
  88. package/{plugin → cursor-plugin}/cursor-skills/slm-remember/SKILL.md +1 -1
  89. package/{plugin → cursor-plugin}/cursor-skills/slm-scope/SKILL.md +1 -1
  90. package/{plugin → cursor-plugin}/cursor-skills/slm-session/SKILL.md +1 -1
  91. package/cursor-plugin/cursor-skills/slm-status/SKILL.md +231 -0
  92. package/cursor-plugin/cursor-skills/slm-web-access/SKILL.md +179 -0
  93. package/{plugin → cursor-plugin}/mcp.cursor.json +1 -2
  94. package/hermes-plugin/__init__.py +39 -7
  95. package/hermes-plugin/agents/slm-governance-advisor.md +1 -1
  96. package/hermes-plugin/agents/slm-loop-runner.md +1 -1
  97. package/hermes-plugin/agents/slm-memory-advisor.md +1 -1
  98. package/hermes-plugin/agents/slm-optimize-advisor.md +1 -1
  99. package/hermes-plugin/command-inventory.json +2 -2
  100. package/hermes-plugin/plugin.yaml +2 -2
  101. package/hermes-plugin/skills/slm-bot-memory/SKILL.md +1 -1
  102. package/hermes-plugin/skills/slm-cache/SKILL.md +1 -1
  103. package/hermes-plugin/skills/slm-compress/SKILL.md +1 -1
  104. package/hermes-plugin/skills/slm-getting-started-bot/SKILL.md +1 -1
  105. package/hermes-plugin/skills/slm-governance/SKILL.md +4 -2
  106. package/hermes-plugin/skills/slm-graph/SKILL.md +7 -13
  107. package/hermes-plugin/skills/slm-loop/SKILL.md +1 -1
  108. package/hermes-plugin/skills/slm-media/SKILL.md +1 -1
  109. package/hermes-plugin/skills/slm-mesh/SKILL.md +1 -1
  110. package/hermes-plugin/skills/slm-profile/SKILL.md +21 -18
  111. package/hermes-plugin/skills/slm-recall/SKILL.md +1 -1
  112. package/hermes-plugin/skills/slm-remember/SKILL.md +1 -1
  113. package/hermes-plugin/skills/slm-scope/SKILL.md +1 -1
  114. package/hermes-plugin/skills/slm-session/SKILL.md +1 -1
  115. package/hermes-plugin/skills/slm-status/SKILL.md +1 -1
  116. package/ide/configs/copilot-cli-mcp.json +17 -0
  117. package/ide/configs/grok-cli-mcp.toml +11 -0
  118. package/ide/configs/muse-mcp.json +16 -0
  119. package/ide/configs/openclaw-mcp.json +15 -0
  120. package/muse-plugin/.claude-plugin/plugin.json +20 -0
  121. package/muse-plugin/LICENSE +663 -0
  122. package/muse-plugin/README.md +44 -0
  123. package/muse-plugin/_GENERATED.md +3 -0
  124. package/muse-plugin/agents/slm-governance-advisor.md +84 -0
  125. package/muse-plugin/agents/slm-loop-runner.md +82 -0
  126. package/muse-plugin/agents/slm-memory-advisor.md +54 -0
  127. package/muse-plugin/agents/slm-optimize-advisor.md +44 -0
  128. package/muse-plugin/commands/slm-loop.md +33 -0
  129. package/muse-plugin/hooks/hooks.json +102 -0
  130. package/muse-plugin/requirements-cpu-torch.txt +13 -0
  131. package/muse-plugin/requirements.txt +1 -0
  132. package/muse-plugin/scripts/ensure-venv.bat +122 -0
  133. package/muse-plugin/scripts/ensure-venv.sh +169 -0
  134. package/muse-plugin/scripts/slm-launch +207 -0
  135. package/muse-plugin/scripts/slm-launch.bat +32 -0
  136. package/muse-plugin/scripts/slm-resolve.sh +128 -0
  137. package/muse-plugin/scripts/slm-run +76 -0
  138. package/muse-plugin/scripts/torch-cpu-resolve.sh +86 -0
  139. package/muse-plugin/skills/slm-bot-memory/SKILL.md +180 -0
  140. package/muse-plugin/skills/slm-cache/SKILL.md +146 -0
  141. package/muse-plugin/skills/slm-compress/SKILL.md +149 -0
  142. package/muse-plugin/skills/slm-getting-started-bot/SKILL.md +196 -0
  143. package/muse-plugin/skills/slm-governance/SKILL.md +278 -0
  144. package/muse-plugin/skills/slm-graph/SKILL.md +320 -0
  145. package/muse-plugin/skills/slm-loop/SKILL.md +173 -0
  146. package/muse-plugin/skills/slm-media/SKILL.md +339 -0
  147. package/muse-plugin/skills/slm-mesh/SKILL.md +388 -0
  148. package/muse-plugin/skills/slm-profile/SKILL.md +166 -0
  149. package/muse-plugin/skills/slm-recall/SKILL.md +517 -0
  150. package/muse-plugin/skills/slm-remember/SKILL.md +374 -0
  151. package/muse-plugin/skills/slm-scope/SKILL.md +182 -0
  152. package/muse-plugin/skills/slm-session/SKILL.md +290 -0
  153. package/muse-plugin/skills/slm-status/SKILL.md +230 -0
  154. package/muse-plugin/skills/slm-web-access/SKILL.md +178 -0
  155. package/package.json +6 -2
  156. package/plugin/.claude-plugin/plugin.json +4 -2
  157. package/plugin/LICENSE +663 -0
  158. package/plugin/README.md +44 -0
  159. package/plugin/agents/slm-governance-advisor.md +1 -1
  160. package/plugin/agents/slm-loop-runner.md +1 -1
  161. package/plugin/agents/slm-memory-advisor.md +1 -1
  162. package/plugin/agents/slm-optimize-advisor.md +1 -1
  163. package/plugin/hooks/hooks.json +1 -1
  164. package/plugin/requirements.txt +1 -1
  165. package/plugin/skills/slm-bot-memory/SKILL.md +1 -1
  166. package/plugin/skills/slm-cache/SKILL.md +1 -1
  167. package/plugin/skills/slm-compress/SKILL.md +1 -1
  168. package/plugin/skills/slm-getting-started-bot/SKILL.md +1 -1
  169. package/plugin/skills/slm-governance/SKILL.md +4 -2
  170. package/plugin/skills/slm-graph/SKILL.md +7 -13
  171. package/plugin/skills/slm-loop/SKILL.md +1 -1
  172. package/plugin/skills/slm-media/SKILL.md +1 -1
  173. package/plugin/skills/slm-mesh/SKILL.md +1 -1
  174. package/plugin/skills/slm-profile/SKILL.md +21 -18
  175. package/plugin/skills/slm-recall/SKILL.md +1 -1
  176. package/plugin/skills/slm-remember/SKILL.md +1 -1
  177. package/plugin/skills/slm-scope/SKILL.md +1 -1
  178. package/plugin/skills/slm-session/SKILL.md +1 -1
  179. package/plugin/skills/slm-status/SKILL.md +1 -1
  180. package/plugin-src/agents/slm-governance-advisor.md +1 -1
  181. package/plugin-src/agents/slm-loop-runner.md +1 -1
  182. package/plugin-src/agents/slm-memory-advisor.md +1 -1
  183. package/plugin-src/agents/slm-optimize-advisor.md +1 -1
  184. package/plugin-src/rules/AGENTS.md +1 -1
  185. package/plugin-src/rules/CLAUDE.md.fragment +3 -3
  186. package/plugin-src/skills/slm-bot-memory/SKILL.md +1 -1
  187. package/plugin-src/skills/slm-cache/SKILL.md +1 -1
  188. package/plugin-src/skills/slm-compress/SKILL.md +1 -1
  189. package/plugin-src/skills/slm-getting-started-bot/SKILL.md +1 -1
  190. package/plugin-src/skills/slm-governance/SKILL.md +4 -2
  191. package/plugin-src/skills/slm-graph/SKILL.md +7 -13
  192. package/plugin-src/skills/slm-loop/SKILL.md +1 -1
  193. package/plugin-src/skills/slm-media/SKILL.md +1 -1
  194. package/plugin-src/skills/slm-mesh/SKILL.md +1 -1
  195. package/plugin-src/skills/slm-profile/SKILL.md +21 -18
  196. package/plugin-src/skills/slm-recall/SKILL.md +1 -1
  197. package/plugin-src/skills/slm-remember/SKILL.md +1 -1
  198. package/plugin-src/skills/slm-scope/SKILL.md +1 -1
  199. package/plugin-src/skills/slm-session/SKILL.md +1 -1
  200. package/plugin-src/skills/slm-status/SKILL.md +1 -1
  201. package/plugin/CLAUDE.md +0 -56
  202. /package/{plugin/assets/logo.svg → codex-plugin/assets/icon.svg} +0 -0
@@ -0,0 +1,339 @@
1
+ ---
2
+ name: slm-media
3
+ description: Save pictures and PDFs in SuperLocalMemory and find them again by describing them. Covers when to save a picture or document, remember_media, remember_document, get_media, media_status and media_upload_link, how recall returns pictures and PDF pages, the limits, what stays private, turning the feature on with `slm media` (16 GB of memory needed), connecting folders with `slm sources`, and how web apps add files through one-time upload links. Off by default.
4
+ when_to_use: |
5
+ - "Save this screenshot / photo / PDF"
6
+ - "Find the picture where ..." or "which page of the PDF says ..."
7
+ - "Add this document to my memory"
8
+ - A web app (ChatGPT, Claude on the web, Grok Bot, Muse, Composio) cannot send a file itself
9
+ - remember_media, remember_document, get_media, media_status or media_upload_link is missing from the tool list
10
+ - "Turn on pictures and documents", slm media status, slm media repair
11
+ - "Connect my Obsidian vault / notes folder" (slm sources)
12
+ ---
13
+
14
+ # slm-media — Pictures, PDFs and Folders
15
+
16
+ SuperLocalMemory can keep a picture or a PDF as a memory and find it later by
17
+ describing what it shows or what it says. A picture model runs on this
18
+ computer (EmbeddingGemma 2). OCR reads the text inside pictures. Each PDF
19
+ page is indexed by its picture and by its text. No generative model looks at
20
+ the files, so SLM cannot describe a picture to you: it finds it, and you look
21
+ at the thumbnail it returns.
22
+
23
+ This feature is **off by default**. Pictures live in their own database
24
+ (`media.db`); turning it on does not change any existing memory or embedding.
25
+
26
+ ---
27
+
28
+ ## When to save a picture or a PDF
29
+
30
+ Save one when the user asks, or when the file is itself the thing worth
31
+ finding again: a screenshot of an error they will meet again, a diagram of a
32
+ design decision, a receipt, a scanned page, a PDF spec. Do not save a file
33
+ just because it was shown in the conversation.
34
+
35
+ Add words with `content`. The picture is found by what it shows, by the text
36
+ read inside it, and by the words you add, so a short sentence about why it
37
+ matters ("Staging dashboard after the Postgres 17 move") helps recall.
38
+
39
+ Never save a picture or PDF that shows a password, key, token, card number,
40
+ government id or private data about a third party. The text read from a file
41
+ is scanned like any saved text, but a screenshot of a secret should not be
42
+ saved at all. Ask the user first if you are unsure.
43
+
44
+ ---
45
+
46
+ ## Are the tools there?
47
+
48
+ The five tools below are listed only while pictures and documents are on, and
49
+ only in the `full`, `power` and `whole` MCP tool sets. They are not in `core`
50
+ or `code`. The tool set is fixed when the MCP server starts, so after the
51
+ feature is turned on, restart the MCP session (`slm restart` starts the
52
+ picture worker too). Do not guess: run
53
+
54
+ ```bash
55
+ slm media status
56
+ ```
57
+
58
+ It says whether the feature is off, set up, still setting up, or failed
59
+ (`slm doctor` explains a failure). The same status is in the dashboard under
60
+ **Documents & Images**.
61
+
62
+ ### Turning it on (ask the user first)
63
+
64
+ ```bash
65
+ slm media enable # shows the download size and a disk check, then asks; --yes skips the question
66
+ ```
67
+
68
+ Turning it on downloads about 1.5 GB of models and tools, and needs a
69
+ computer with 16 GB of memory (the check passes from 15 GiB). On a smaller
70
+ computer `enable` refuses with the reason and exits with code 4; text memory
71
+ keeps working. Never turn it on, or pass `--yes`, without the user saying
72
+ yes in this conversation. Never set `SLM_MEDIA_ALLOW_LOW_RAM=1` yourself: it
73
+ removes the memory check and the owner must decide that.
74
+
75
+ Supported: macOS on Apple Silicon, Windows x64, Linux x86_64 and Linux ARM64
76
+ (aarch64), Python 3.12 to 3.14. Not supported: Intel Macs and Windows on ARM.
77
+
78
+ Other commands:
79
+
80
+ ```bash
81
+ slm media status # what is on and how set-up is going
82
+ slm media disable # off again; memories are kept (--remove-files also deletes the downloaded models)
83
+ slm media gc # report picture records without a memory and files without a record; removes nothing
84
+ slm media gc --apply # remove them (owner or admin); never touches SLM's databases
85
+ slm media repair --dry-run # count pictures that cannot be found by what they show yet
86
+ slm media repair # re-embed them (owner or admin); run again if it says pictures are left
87
+ ```
88
+
89
+ All take `--json`. Run `slm media repair` when a save says a picture "can't be
90
+ found by what it shows yet", or after the picture model changed.
91
+
92
+ ---
93
+
94
+ ## Tool reference
95
+
96
+ ### `remember_media` — save a picture
97
+
98
+ ```
99
+ remember_media(
100
+ path: str = "", download_url: str = "", base64: str = "", file = None, # give exactly one
101
+ content: str = "", tags: str = "", profile_id: str = "",
102
+ idempotency_key: str = "", scope: str = "", shared_with: str = "",
103
+ ) -> dict
104
+ ```
105
+
106
+ Give exactly one of `path` (a file on this computer), `download_url` (an
107
+ https link), `base64`, or `file` (a picture attached in a ChatGPT chat;
108
+ ChatGPT fills it in, never write it by hand). Two or none is refused
109
+ (`invalid_request`). `scope` (personal, project, shared, global) and
110
+ `shared_with` (comma-separated profile ids) work as in `remember`: leave them
111
+ unset unless the user asked to share. Formats: PNG, JPEG, GIF (first frame)
112
+ and WebP.
113
+
114
+ Returns `success`, `status`, and on success a `media_id` and a `resource`,
115
+ `slm://media/<media_id>`. Report what the tool returned; do not say "saved"
116
+ unless `success` is true.
117
+
118
+ ### `remember_document` — save a PDF
119
+
120
+ ```
121
+ remember_document(
122
+ path: str = "", base64: str = "", download_url: str = "", file = None, # give exactly one
123
+ file_name: str = "", content: str = "", tags: str = "", profile_id: str = "",
124
+ idempotency_key: str = "", scope: str = "", shared_with: str = "",
125
+ ) -> dict
126
+ ```
127
+
128
+ Same sources and rules as `remember_media`, for a PDF. The work continues in
129
+ the background; the answer has a `job_id` (and `document_id`). Follow it with
130
+ `media_status`. Each page is indexed by its picture and its text layer.
131
+
132
+ ### `media_status` — follow a document
133
+
134
+ ```
135
+ media_status(job_id: str, profile_id: str = "") -> dict
136
+ ```
137
+
138
+ `job_id` is the 32-character hex id from `remember_document`. Poll sparingly
139
+ (every few seconds at most) and stop when the job is finished or failed. A PDF that cannot
140
+ be finished (password-protected, over 500 pages, a page that takes too long)
141
+ is marked not finished with the reason in plain words. Pages read before it
142
+ stopped stay in memory. The dashboard has a **Try again** button, or drop the
143
+ same file again.
144
+
145
+ ### `get_media` — look at a saved picture
146
+
147
+ ```
148
+ get_media(media_id: str, variant: str = "thumb", profile_id: str = "") -> image
149
+ ```
150
+
151
+ Returns the thumbnail (WebP) as an image, never as text. Only `thumb`
152
+ exists. A thumbnail is at most 32 KB.
153
+
154
+ ### `media_upload_link` — for web apps only
155
+
156
+ ```
157
+ media_upload_link(kind: str = "image", note: str = "", profile_id: str = "") -> dict
158
+ ```
159
+
160
+ `kind` is `image` or `document`; `note` is the words to save with the file.
161
+ Only an app on another computer can call it (an app on this computer gets
162
+ `not_for_local` and passes a `path` instead). It returns `url`, `expires_at`
163
+ and `max_mb`. Tell the person to open the link in any browser, pick the file
164
+ and press Save. The link works once, expires in 10 minutes, belongs to the app
165
+ that asked for it, and must not be shared. You cannot see the upload: do not
166
+ say the file was saved until the person tells you it was.
167
+
168
+ ### Errors you will see
169
+
170
+ A refused call returns `success: false`, `status: "refused"`, a `code` and a
171
+ plain `error`; `retryable: true` means try again later.
172
+
173
+ | `code` | Meaning | What to do |
174
+ |---|---|---|
175
+ | `invalid_request` | Not exactly one source, a bad job id, or a `file` object without `download_url` and `file_id` | Fix the call |
176
+ | `not_for_remote` | This app has not been given pictures and documents | Ask the owner to allow it (see below) |
177
+ | `path_not_for_remote` | A web app tried to name a file on the owner's computer | Send a link or data, or use `media_upload_link` |
178
+ | `too_large_for_remote` | A web app pasted more than 512 KB | Use `media_upload_link` |
179
+ | `not_allowed`, `refused` | The daemon refused (role, size, type, a link host not on the allowed list) | Read `error`; do not retry the same call |
180
+ | `DAEMON_UNAVAILABLE` | SLM is not running | `slm status`, then `slm restart`; retry once |
181
+ | `error` | Unexpected failure, `retryable: true` | Retry once |
182
+
183
+ ---
184
+
185
+ ## How recall returns pictures and pages
186
+
187
+ A normal `recall` searches pictures and pages beside text memories. A result
188
+ that came from a picture or a PDF page has a `media` block:
189
+
190
+ ```json
191
+ {
192
+ "media": {
193
+ "media_id": "<32 hex>",
194
+ "kind": "image",
195
+ "thumbnail_uri": "slm://media/<media_id>/thumb",
196
+ "page": null,
197
+ "document_id": null,
198
+ "citation": ""
199
+ }
200
+ }
201
+ ```
202
+
203
+ For a PDF page, `kind` is `page`, `page` is the page number, `document_id`
204
+ names the document and `citation` reads `page 12`. When you call `recall` from
205
+ an app on this computer, up to three thumbnails follow the JSON as image
206
+ blocks; the thumbnails are never inside `structuredContent`. Use `get_media`
207
+ for any other result.
208
+
209
+ Rules for reading them:
210
+
211
+ - A score ranks results; it is not a probability that the picture shows what
212
+ was asked. Look at the thumbnail before you say it does.
213
+ - If `abstained` is `true`, say you do not have a picture or page that answers
214
+ the question. See `slm-recall`.
215
+ - When you quote a PDF, give the page (`citation`) so the person can check it.
216
+ - A picture with no readable text is found by what it shows only. It no
217
+ longer comes back for a question about pictures that were never saved.
218
+
219
+ ---
220
+
221
+ ## Limits
222
+
223
+ | What | Limit |
224
+ |---|---|
225
+ | One picture | 25 MB from a file, the dashboard or an upload link; 8 MB as pasted `base64` from an app on this computer; 512 KB when a web app pastes it |
226
+ | One PDF | 100 MB (change with `SLM_DOC_MAX_MB`); 25 MB pasted from an app on this computer; 512 KB when a web app pastes it |
227
+ | PDF pages | 500. A longer PDF is refused as a whole, not cut short |
228
+ | Text kept from a picture | The first 8,000 characters |
229
+ | Pictures and PDFs per profile | 2 GB |
230
+ | Upload links | 3 open at a time per connected app, 20 uploads per app per day |
231
+
232
+ ---
233
+
234
+ ## Privacy: what stays and what leaves
235
+
236
+ - The models run on this computer. Pictures and PDFs are stored on this
237
+ computer in `media.db` and its picture folder. Location data (GPS) in a
238
+ photo is never read.
239
+ - Erasing a memory erases its picture. Removing a PDF hides all its pages.
240
+ - Reading a file by `path` needs the owner or an admin in a company
241
+ workspace. SLM's own data folder can never be named as a path or a source.
242
+ - A web app sees a picture or page only when it holds the pictures and
243
+ documents permission and the text read from that file held no secret or
244
+ personal data. Folders connected with `slm sources` are never shown to web
245
+ apps. A web app cannot change, delete, pin or replace a memory it is not
246
+ allowed to see: it is answered as if that memory did not exist.
247
+ - Pictures saved before picture search arrived are re-checked in the background and become
248
+ visible to web apps once their text is clean. They stay fully searchable on
249
+ this computer.
250
+
251
+ ---
252
+
253
+ ## Web apps: two yeses, then an upload link
254
+
255
+ A web app (ChatGPT, Claude on the web, Grok Bot, Muse, Composio) can use
256
+ these tools only when all of these are true. This is why a call may be
257
+ refused with `not_for_remote` or `not_allowed`.
258
+
259
+ 1. The approval page ticked **Allow images and documents** (and, for saving,
260
+ **Allow saving memories**).
261
+ 2. The **Web access** row in the dashboard's **Connected apps** has the switch
262
+ **Let these apps save and read pictures and documents** on, or
263
+ `slm remote keys allow web-<connection id> media` was run on the SLM
264
+ computer (find the key with `slm remote keys list`).
265
+ 3. The key is a write key.
266
+
267
+ The owner does these steps; an agent cannot. Turning pictures off for the
268
+ connection also ends any upload link not yet used.
269
+
270
+ How a web app adds a file:
271
+
272
+ - **ChatGPT with an attachment.** Pass the attachment as `file` to
273
+ `remember_media` or `remember_document`. The computer downloads it only from
274
+ ChatGPT's own file hosts plus hosts the owner lists in `SLM_MEDIA_URL_HOSTS`.
275
+ If a save is refused with "That host is not on the allowed list", the owner
276
+ must add the host. Never type a link into `download_url` yourself and expect
277
+ it to work: links a model writes need the owner's list.
278
+ - **Anything else, or ChatGPT on a phone.** Call `media_upload_link`, show the
279
+ link, and wait for the person to say they saved the file.
280
+
281
+ A web app saves to its key's own profile only, cannot name a path, and cannot
282
+ pass a file the owner's list does not allow. More: `docs/remote-access/hosts.md`
283
+ and `docs/pictures-and-documents.md`.
284
+
285
+ ---
286
+
287
+ ## Folders and Obsidian vaults
288
+
289
+ ```bash
290
+ slm sources add ~/Notes --kind obsidian # or --kind folder; shows what would be read, then asks
291
+ slm sources list
292
+ slm sources report <id> # what was skipped, held back or failed
293
+ slm sources rescan <id>
294
+ slm sources remove <id> [--purge] # --purge also erases the memories the folder gave
295
+ slm sources forget-empty <id> # for a folder you emptied on purpose
296
+ ```
297
+
298
+ A source is read-only: SLM mirrors Markdown, text, canvas files, PDFs and
299
+ PNG, JPEG and WebP images into memory and never writes to the folder. Files
300
+ that look like they hold a secret are held back and listed in `report`. PDFs
301
+ and pictures inside a folder are read only while pictures and documents are
302
+ on; files skipped earlier are read on the next scan once they are. Connecting
303
+ a folder needs the owner or an admin. `add` asks before it connects and
304
+ `remove --purge` needs the typed word `erase`; without a terminal both need
305
+ `--yes`, so do not pass `--yes` unless the user said yes to that folder. In
306
+ the dashboard, **Choose folder** opens the computer's own folder picker.
307
+
308
+ ---
309
+
310
+ ## Upgrade memory engine (preview)
311
+
312
+ With pictures and documents on, `slm embedder upgrade` (or the card in
313
+ Settings) re-reads existing memories with the same on-device model that reads
314
+ pictures, so text and pictures share one search space. It runs in the
315
+ background, recall keeps working, the previous engine's data stays until the
316
+ owner frees it (`slm embedder forget-previous`), and `slm embedder rollback`
317
+ goes back. If it cannot run, the command prints the reason.
318
+
319
+ It is not available for text yet: recall's answer check is not calibrated for
320
+ EmbeddingGemma 2 (the best fit so far answered questions that have no answer),
321
+ so the command refuses with that reason. Do not offer it, and never pass `--force` for the user.
322
+ If `slm doctor` reports "Answer check fit" as a warning, the user's text already
323
+ moved in an earlier version: tell them `slm embedder rollback` goes back in
324
+ minutes (previous vectors are kept) and let them decide.
325
+
326
+ ---
327
+
328
+ ## Related skills
329
+
330
+ - `slm-recall` — reading results and the answer check
331
+ - `slm-remember` — text memories; use it for facts, this skill for files
332
+ - `slm-web-access` — connecting web apps and the permissions above
333
+ - `slm-mesh` — bots can pass `media:<id>` references in messages
334
+ - `slm-governance` — roles that gate path reads and folders
335
+ - `slm-status` — `slm media status` and `slm doctor`
336
+
337
+ ---
338
+
339
+ *SuperLocalMemory v4.2.6 · Qualixar · AGPL-3.0-or-later*