simple-module-images 0.0.14__py3-none-any.whl

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 (347) hide show
  1. simple_module_images-0.0.14.dist-info/METADATA +202 -0
  2. simple_module_images-0.0.14.dist-info/RECORD +347 -0
  3. simple_module_images-0.0.14.dist-info/WHEEL +4 -0
  4. simple_module_images-0.0.14.dist-info/entry_points.txt +2 -0
  5. simple_module_images-0.0.14.dist-info/licenses/NOTICE +61 -0
  6. sm_images/__init__.py +7 -0
  7. sm_images/contracts/__init__.py +78 -0
  8. sm_images/contracts/events.py +86 -0
  9. sm_images/contracts/reads.py +145 -0
  10. sm_images/contracts/schemas.py +93 -0
  11. sm_images/core/__init__.py +5 -0
  12. sm_images/core/access/__init__.py +275 -0
  13. sm_images/core/access/redaction.py +173 -0
  14. sm_images/core/access/resource_types.py +66 -0
  15. sm_images/core/access/starter_right.py +81 -0
  16. sm_images/core/access/write.py +91 -0
  17. sm_images/core/billing/__init__.py +203 -0
  18. sm_images/core/billing/install.py +206 -0
  19. sm_images/core/billing/metering_keys.py +27 -0
  20. sm_images/core/billing/ops.py +275 -0
  21. sm_images/core/billing/repair.py +224 -0
  22. sm_images/core/billing/repair_cursor.py +100 -0
  23. sm_images/core/billing/settle.py +211 -0
  24. sm_images/core/billing/subject.py +156 -0
  25. sm_images/core/clock/__init__.py +17 -0
  26. sm_images/core/clock/db.py +43 -0
  27. sm_images/core/constants.py +277 -0
  28. sm_images/core/errors.py +199 -0
  29. sm_images/core/events.py +82 -0
  30. sm_images/core/settings/__init__.py +141 -0
  31. sm_images/core/settings/boot.py +49 -0
  32. sm_images/core/storage/__init__.py +145 -0
  33. sm_images/core/storage/intents.py +73 -0
  34. sm_images/core/storage/keys.py +71 -0
  35. sm_images/core/tenancy/__init__.py +263 -0
  36. sm_images/core/tenancy/_guard.py +100 -0
  37. sm_images/core/tenancy/_mode.py +273 -0
  38. sm_images/core/tenancy/request_context.py +50 -0
  39. sm_images/index.ts +11 -0
  40. sm_images/ingest/__init__.py +23 -0
  41. sm_images/ingest/_holds_host.py +30 -0
  42. sm_images/ingest/admission.py +148 -0
  43. sm_images/ingest/b64.py +40 -0
  44. sm_images/ingest/dedupe.py +122 -0
  45. sm_images/ingest/direct.py +247 -0
  46. sm_images/ingest/guards.py +106 -0
  47. sm_images/ingest/imports/__init__.py +1 -0
  48. sm_images/ingest/imports/access.py +106 -0
  49. sm_images/ingest/imports/beat.py +85 -0
  50. sm_images/ingest/imports/chunk.py +216 -0
  51. sm_images/ingest/imports/claims.py +71 -0
  52. sm_images/ingest/imports/cleanup.py +132 -0
  53. sm_images/ingest/imports/controls.py +194 -0
  54. sm_images/ingest/imports/dns.py +115 -0
  55. sm_images/ingest/imports/download.py +195 -0
  56. sm_images/ingest/imports/errors.py +27 -0
  57. sm_images/ingest/imports/features.py +212 -0
  58. sm_images/ingest/imports/fetch.py +252 -0
  59. sm_images/ingest/imports/filename_pattern.py +138 -0
  60. sm_images/ingest/imports/geojson_stream.py +173 -0
  61. sm_images/ingest/imports/item_claim.py +140 -0
  62. sm_images/ingest/imports/item_errors.py +93 -0
  63. sm_images/ingest/imports/jobs.py +244 -0
  64. sm_images/ingest/imports/launch.py +80 -0
  65. sm_images/ingest/imports/log_redact.py +70 -0
  66. sm_images/ingest/imports/lookup.py +63 -0
  67. sm_images/ingest/imports/manage_right.py +82 -0
  68. sm_images/ingest/imports/mapping.py +73 -0
  69. sm_images/ingest/imports/netsafe.py +100 -0
  70. sm_images/ingest/imports/rate_limit.py +144 -0
  71. sm_images/ingest/imports/recover.py +261 -0
  72. sm_images/ingest/imports/reset.py +159 -0
  73. sm_images/ingest/imports/retrying.py +188 -0
  74. sm_images/ingest/imports/runner.py +229 -0
  75. sm_images/ingest/imports/service.py +132 -0
  76. sm_images/ingest/imports/settle.py +279 -0
  77. sm_images/ingest/imports/stage.py +82 -0
  78. sm_images/ingest/imports/staging.py +158 -0
  79. sm_images/ingest/imports/tasks.py +60 -0
  80. sm_images/ingest/imports/terminal.py +178 -0
  81. sm_images/ingest/imports/url_safety.py +181 -0
  82. sm_images/ingest/imports/values.py +165 -0
  83. sm_images/ingest/imports/zip_abort.py +47 -0
  84. sm_images/ingest/imports/zip_entries.py +126 -0
  85. sm_images/ingest/imports/zip_eocd.py +83 -0
  86. sm_images/ingest/imports/zip_import.py +241 -0
  87. sm_images/ingest/imports/zip_metadata.py +70 -0
  88. sm_images/ingest/imports/zip_safety.py +252 -0
  89. sm_images/ingest/imports/zip_source.py +127 -0
  90. sm_images/ingest/imports/zip_upload.py +260 -0
  91. sm_images/ingest/meta.py +137 -0
  92. sm_images/ingest/multipart.py +165 -0
  93. sm_images/ingest/service.py +238 -0
  94. sm_images/ingest/service_holds.py +67 -0
  95. sm_images/ingest/slots.py +194 -0
  96. sm_images/ingest/sniff.py +50 -0
  97. sm_images/ingest/ticket.py +92 -0
  98. sm_images/ingest/upload_reaper.py +111 -0
  99. sm_images/ingest/upload_session.py +220 -0
  100. sm_images/jobs/__init__.py +1 -0
  101. sm_images/jobs/janitor.py +256 -0
  102. sm_images/jobs/phases.py +52 -0
  103. sm_images/jobs/placeholders.py +78 -0
  104. sm_images/jobs/purge.py +222 -0
  105. sm_images/jobs/purge_delete.py +121 -0
  106. sm_images/jobs/purge_select.py +241 -0
  107. sm_images/jobs/reconcile.py +204 -0
  108. sm_images/jobs/reconcile_dispatch.py +121 -0
  109. sm_images/jobs/regroup/__init__.py +1 -0
  110. sm_images/jobs/regroup/control.py +103 -0
  111. sm_images/jobs/regroup/jobs.py +257 -0
  112. sm_images/jobs/regroup/runner.py +103 -0
  113. sm_images/locales/de.json +682 -0
  114. sm_images/locales/en.json +682 -0
  115. sm_images/map/__init__.py +15 -0
  116. sm_images/map/build.py +223 -0
  117. sm_images/map/objects.py +33 -0
  118. sm_images/map/pmtiles_build.py +147 -0
  119. sm_images/map/points.py +136 -0
  120. sm_images/map/recover.py +56 -0
  121. sm_images/map/revoke.py +121 -0
  122. sm_images/map/schedule.py +208 -0
  123. sm_images/map/style.py +71 -0
  124. sm_images/map/tasks.py +35 -0
  125. sm_images/models/__init__.py +66 -0
  126. sm_images/models/_base.py +14 -0
  127. sm_images/models/_cols.py +56 -0
  128. sm_images/models/billing_op.py +84 -0
  129. sm_images/models/collection.py +82 -0
  130. sm_images/models/enums.py +88 -0
  131. sm_images/models/group.py +25 -0
  132. sm_images/models/image.py +120 -0
  133. sm_images/models/import_item.py +51 -0
  134. sm_images/models/import_job.py +71 -0
  135. sm_images/models/object_intent.py +35 -0
  136. sm_images/models/pipeline_restart.py +37 -0
  137. sm_images/models/prompt.py +93 -0
  138. sm_images/models/regroup_job.py +94 -0
  139. sm_images/models/rendition.py +30 -0
  140. sm_images/models/step_run.py +50 -0
  141. sm_images/models/upload_admission.py +33 -0
  142. sm_images/models/upload_session.py +59 -0
  143. sm_images/module.py +245 -0
  144. sm_images/package.json +31 -0
  145. sm_images/pagebuilder-blocks.ts +43 -0
  146. sm_images/pages/Collection.tsx +254 -0
  147. sm_images/pages/Collections.tsx +75 -0
  148. sm_images/pages/Image.tsx +111 -0
  149. sm_images/pages/PublicCollection.tsx +72 -0
  150. sm_images/pages/Review.tsx +190 -0
  151. sm_images/pipeline/__init__.py +91 -0
  152. sm_images/pipeline/advance.py +196 -0
  153. sm_images/pipeline/ai/__init__.py +21 -0
  154. sm_images/pipeline/ai/codes.py +46 -0
  155. sm_images/pipeline/ai/cross_check.py +138 -0
  156. sm_images/pipeline/ai/group_inputs.py +103 -0
  157. sm_images/pipeline/ai/group_lease.py +189 -0
  158. sm_images/pipeline/ai/group_load.py +179 -0
  159. sm_images/pipeline/ai/group_members.py +159 -0
  160. sm_images/pipeline/ai/group_request.py +145 -0
  161. sm_images/pipeline/ai/group_run.py +221 -0
  162. sm_images/pipeline/ai/group_store.py +78 -0
  163. sm_images/pipeline/ai/prompt_steps.py +171 -0
  164. sm_images/pipeline/ai/reads.py +51 -0
  165. sm_images/pipeline/ai/results.py +193 -0
  166. sm_images/pipeline/ai/review.py +150 -0
  167. sm_images/pipeline/ai/run.py +191 -0
  168. sm_images/pipeline/ai/runner.py +158 -0
  169. sm_images/pipeline/ai/schema_model.py +172 -0
  170. sm_images/pipeline/ai/schema_safety.py +221 -0
  171. sm_images/pipeline/builtin_steps.py +103 -0
  172. sm_images/pipeline/claim.py +250 -0
  173. sm_images/pipeline/config.py +214 -0
  174. sm_images/pipeline/control.py +163 -0
  175. sm_images/pipeline/cycle.py +113 -0
  176. sm_images/pipeline/eager_drain.py +70 -0
  177. sm_images/pipeline/executor.py +218 -0
  178. sm_images/pipeline/extensions.py +122 -0
  179. sm_images/pipeline/finish.py +243 -0
  180. sm_images/pipeline/keeper.py +17 -0
  181. sm_images/pipeline/load.py +135 -0
  182. sm_images/pipeline/orchestrate.py +203 -0
  183. sm_images/pipeline/plan.py +237 -0
  184. sm_images/pipeline/presets.py +102 -0
  185. sm_images/pipeline/processing/__init__.py +1 -0
  186. sm_images/pipeline/processing/exif.py +147 -0
  187. sm_images/pipeline/processing/heif.py +28 -0
  188. sm_images/pipeline/processing/renditions.py +58 -0
  189. sm_images/pipeline/publish.py +222 -0
  190. sm_images/pipeline/registry.py +247 -0
  191. sm_images/pipeline/reopen.py +84 -0
  192. sm_images/pipeline/restart.py +165 -0
  193. sm_images/pipeline/runtime.py +129 -0
  194. sm_images/pipeline/step.py +152 -0
  195. sm_images/pipeline/steps/__init__.py +1 -0
  196. sm_images/pipeline/steps/anonymize/__init__.py +19 -0
  197. sm_images/pipeline/steps/anonymize/blur.py +72 -0
  198. sm_images/pipeline/steps/anonymize/detectors.py +138 -0
  199. sm_images/pipeline/steps/anonymize/models.py +229 -0
  200. sm_images/pipeline/steps/anonymize/step.py +200 -0
  201. sm_images/pipeline/steps/anonymize/weights.py +191 -0
  202. sm_images/pipeline/steps/classify.py +111 -0
  203. sm_images/pipeline/steps/quality.py +115 -0
  204. sm_images/pipeline/storage_hold.py +229 -0
  205. sm_images/pipeline/worker_runtime.py +196 -0
  206. sm_images/task_config.py +65 -0
  207. sm_images/tasks.py +179 -0
  208. sm_images/ui/components/ChipGroup.tsx +39 -0
  209. sm_images/ui/components/ConfirmDialog.tsx +90 -0
  210. sm_images/ui/components/ImagesLayout.tsx +9 -0
  211. sm_images/ui/components/block/ImageGalleryBlock.tsx +118 -0
  212. sm_images/ui/components/block/ImageStatsBlock.tsx +106 -0
  213. sm_images/ui/components/block/ImageStatsRender.tsx +118 -0
  214. sm_images/ui/components/collections/CollectionCard.tsx +32 -0
  215. sm_images/ui/components/collections/CreateCollectionDialog.tsx +126 -0
  216. sm_images/ui/components/collections/PublicLink.tsx +42 -0
  217. sm_images/ui/components/collections/VisibilitySelect.tsx +42 -0
  218. sm_images/ui/components/gallery/Gallery.tsx +105 -0
  219. sm_images/ui/components/gallery/GalleryTile.tsx +62 -0
  220. sm_images/ui/components/gallery/UploadButton.tsx +81 -0
  221. sm_images/ui/components/groups/GroupCard.tsx +95 -0
  222. sm_images/ui/components/groups/GroupForm.tsx +81 -0
  223. sm_images/ui/components/groups/GroupsTab.tsx +116 -0
  224. sm_images/ui/components/groups/MemberThumb.tsx +36 -0
  225. sm_images/ui/components/groups/RegroupPanel.tsx +159 -0
  226. sm_images/ui/components/imports/ImportFailures.tsx +54 -0
  227. sm_images/ui/components/imports/ImportWizard.tsx +261 -0
  228. sm_images/ui/components/imports/ImportsTab.tsx +70 -0
  229. sm_images/ui/components/imports/JobRow.tsx +157 -0
  230. sm_images/ui/components/imports/MappingFields.tsx +98 -0
  231. sm_images/ui/components/imports/PreviewSummary.tsx +68 -0
  232. sm_images/ui/components/map/CollectionMap.tsx +98 -0
  233. sm_images/ui/components/map/MapCanvas.tsx +214 -0
  234. sm_images/ui/components/map/mapRevision.ts +15 -0
  235. sm_images/ui/components/map/mapSource.ts +101 -0
  236. sm_images/ui/components/map/mapWorker.ts +22 -0
  237. sm_images/ui/components/pipeline/ParamsForm.tsx +246 -0
  238. sm_images/ui/components/pipeline/PipelineTab.tsx +271 -0
  239. sm_images/ui/components/pipeline/StepCard.tsx +103 -0
  240. sm_images/ui/components/prompts/GroupResults.tsx +128 -0
  241. sm_images/ui/components/prompts/PresetPicker.tsx +85 -0
  242. sm_images/ui/components/prompts/PromptForm.tsx +196 -0
  243. sm_images/ui/components/prompts/PromptRow.tsx +169 -0
  244. sm_images/ui/components/prompts/PromptsTab.tsx +178 -0
  245. sm_images/ui/components/prompts/RunConfirm.tsx +79 -0
  246. sm_images/ui/components/prompts/RunOnImages.tsx +113 -0
  247. sm_images/ui/components/prompts/SchemaEditor.tsx +122 -0
  248. sm_images/ui/components/prompts/SchemaFieldBuilder.tsx +139 -0
  249. sm_images/ui/components/public/Lightbox.tsx +78 -0
  250. sm_images/ui/components/public/PublicGallery.tsx +138 -0
  251. sm_images/ui/components/results/GenericResultView.tsx +61 -0
  252. sm_images/ui/components/results/PromptAnswer.tsx +54 -0
  253. sm_images/ui/components/results/ResultView.tsx +13 -0
  254. sm_images/ui/components/results/plugins.ts +14 -0
  255. sm_images/ui/components/results/registry.ts +55 -0
  256. sm_images/ui/components/review/CorrectionForm.tsx +187 -0
  257. sm_images/ui/components/review/ReviewPanel.tsx +136 -0
  258. sm_images/ui/components/share/ShareDialog.tsx +155 -0
  259. sm_images/ui/components/viewer/GroupEditor.tsx +170 -0
  260. sm_images/ui/components/viewer/ImageMeta.tsx +86 -0
  261. sm_images/ui/components/viewer/ImageViewer.tsx +85 -0
  262. sm_images/ui/components/viewer/NeighborNav.tsx +74 -0
  263. sm_images/ui/hooks/useCollections.ts +21 -0
  264. sm_images/ui/hooks/useCursorList.ts +90 -0
  265. sm_images/ui/hooks/useGeoJsonPreview.ts +37 -0
  266. sm_images/ui/hooks/useGroups.ts +42 -0
  267. sm_images/ui/hooks/useImages.ts +47 -0
  268. sm_images/ui/hooks/useImportJobs.ts +99 -0
  269. sm_images/ui/hooks/usePipelinePoll.ts +57 -0
  270. sm_images/ui/hooks/usePromptResults.ts +121 -0
  271. sm_images/ui/hooks/useRegroupJob.ts +71 -0
  272. sm_images/ui/hooks/useReviewKeys.ts +43 -0
  273. sm_images/ui/hooks/useReviewQueue.ts +148 -0
  274. sm_images/ui/hooks/useShares.ts +83 -0
  275. sm_images/ui/utils/api-groups.ts +66 -0
  276. sm_images/ui/utils/api-imports.ts +60 -0
  277. sm_images/ui/utils/api-net.ts +76 -0
  278. sm_images/ui/utils/api-prompts.ts +71 -0
  279. sm_images/ui/utils/api-public.ts +67 -0
  280. sm_images/ui/utils/api-review.ts +48 -0
  281. sm_images/ui/utils/api-shares.ts +42 -0
  282. sm_images/ui/utils/api.ts +175 -0
  283. sm_images/ui/utils/csrf.ts +62 -0
  284. sm_images/ui/utils/direct-upload.ts +92 -0
  285. sm_images/ui/utils/geojsonDetect.ts +81 -0
  286. sm_images/ui/utils/geojsonHeadScanner.ts +197 -0
  287. sm_images/ui/utils/geojsonPreview.ts +146 -0
  288. sm_images/ui/utils/i18n.ts +182 -0
  289. sm_images/ui/utils/labels.ts +86 -0
  290. sm_images/ui/utils/schemaFields.ts +134 -0
  291. sm_images/ui/utils/types-prompts.ts +70 -0
  292. sm_images/ui/utils/types-public.ts +39 -0
  293. sm_images/ui/utils/types.ts +245 -0
  294. sm_images/web/__init__.py +3 -0
  295. sm_images/web/endpoints/__init__.py +1 -0
  296. sm_images/web/endpoints/api/__init__.py +50 -0
  297. sm_images/web/endpoints/api/_runtime.py +24 -0
  298. sm_images/web/endpoints/api/collections.py +118 -0
  299. sm_images/web/endpoints/api/groups.py +199 -0
  300. sm_images/web/endpoints/api/images.py +246 -0
  301. sm_images/web/endpoints/api/imports.py +227 -0
  302. sm_images/web/endpoints/api/map.py +58 -0
  303. sm_images/web/endpoints/api/pipeline.py +107 -0
  304. sm_images/web/endpoints/api/presets.py +50 -0
  305. sm_images/web/endpoints/api/prompts.py +188 -0
  306. sm_images/web/endpoints/api/review.py +90 -0
  307. sm_images/web/endpoints/api/serve.py +65 -0
  308. sm_images/web/endpoints/api/shares.py +60 -0
  309. sm_images/web/endpoints/api/uploads.py +163 -0
  310. sm_images/web/endpoints/csrf.py +26 -0
  311. sm_images/web/endpoints/deps.py +29 -0
  312. sm_images/web/endpoints/map_params.py +69 -0
  313. sm_images/web/endpoints/menu.py +29 -0
  314. sm_images/web/endpoints/public.py +173 -0
  315. sm_images/web/endpoints/public_views.py +58 -0
  316. sm_images/web/endpoints/views.py +150 -0
  317. sm_images/web/schemas/__init__.py +1 -0
  318. sm_images/web/schemas/collection.py +65 -0
  319. sm_images/web/schemas/group.py +100 -0
  320. sm_images/web/schemas/image.py +179 -0
  321. sm_images/web/schemas/imports.py +85 -0
  322. sm_images/web/schemas/pipeline.py +30 -0
  323. sm_images/web/schemas/prompt.py +132 -0
  324. sm_images/web/schemas/review.py +38 -0
  325. sm_images/web/services/__init__.py +32 -0
  326. sm_images/web/services/collections.py +169 -0
  327. sm_images/web/services/cursor.py +62 -0
  328. sm_images/web/services/gallery.py +155 -0
  329. sm_images/web/services/groups.py +265 -0
  330. sm_images/web/services/neighbors.py +50 -0
  331. sm_images/web/services/present.py +102 -0
  332. sm_images/web/services/presets.py +161 -0
  333. sm_images/web/services/prompt_answers.py +48 -0
  334. sm_images/web/services/prompts.py +211 -0
  335. sm_images/web/services/public_gallery.py +81 -0
  336. sm_images/web/services/public_stats.py +113 -0
  337. sm_images/web/services/regroup.py +198 -0
  338. sm_images/web/services/regroup_write.py +153 -0
  339. sm_images/web/services/review_queue.py +101 -0
  340. sm_images/web/services/slugs.py +19 -0
  341. sm_images/web/services/stats.py +150 -0
  342. sm_images/web/services/viewer_stats.py +89 -0
  343. sm_images/web/serving/__init__.py +2 -0
  344. sm_images/web/serving/cache.py +156 -0
  345. sm_images/web/serving/ranges.py +90 -0
  346. sm_images/web/serving/respond.py +263 -0
  347. sm_images/web/serving/urls.py +124 -0
@@ -0,0 +1,202 @@
1
+ Metadata-Version: 2.5
2
+ Name: simple_module_images
3
+ Version: 0.0.14
4
+ Summary: Image collections with a processing pipeline: EXIF, renditions, quality checks, optional anonymisation, geo-located imports and map tiles
5
+ Project-URL: Repository, https://github.com/antosubash/simple_module_python_modules
6
+ Author-email: Anto Subash <antosubash@live.com>
7
+ License-Expression: MIT
8
+ License-File: NOTICE
9
+ Keywords: exif,gallery,geo,images,simple-module
10
+ Requires-Python: >=3.12
11
+ Requires-Dist: httpx>=0.27
12
+ Requires-Dist: ijson>=3.2
13
+ Requires-Dist: itsdangerous<3,>=2.0
14
+ Requires-Dist: pillow-heif>=1.4
15
+ Requires-Dist: pillow>=10.0
16
+ Requires-Dist: pydantic-settings>=2.0
17
+ Requires-Dist: regex>=2023.0
18
+ Requires-Dist: simple-module-background-tasks<0.1,>=0.0.44
19
+ Requires-Dist: simple-module-core<0.1,>=0.0.42
20
+ Requires-Dist: simple-module-db<0.1,>=0.0.41
21
+ Requires-Dist: simple-module-file-storage<0.1,>=0.0.44
22
+ Requires-Dist: simple-module-hosting<0.1,>=0.0.42
23
+ Requires-Dist: simple-module-inertia<0.1,>=0.0.41
24
+ Requires-Dist: simple-module-settings<0.1,>=0.0.41
25
+ Requires-Dist: simple-module-sharing<0.1,>=0.0.44
26
+ Provides-Extra: ai
27
+ Requires-Dist: simple-module-ai<0.1,>=0.0.14; extra == 'ai'
28
+ Provides-Extra: anonymize
29
+ Requires-Dist: onnxruntime>=1.18; extra == 'anonymize'
30
+ Provides-Extra: billing
31
+ Requires-Dist: simple-module-billing<0.1,>=0.0.14; extra == 'billing'
32
+ Provides-Extra: dev
33
+ Requires-Dist: pmtiles>=3.2; extra == 'dev'
34
+ Requires-Dist: pytest-asyncio>=0.24; extra == 'dev'
35
+ Requires-Dist: pytest>=8.0; extra == 'dev'
36
+ Requires-Dist: simple-module-test<0.1,>=0.0.41; extra == 'dev'
37
+ Provides-Extra: pagebuilder
38
+ Requires-Dist: simple-module-pagebuilder<0.1,>=0.0.12; extra == 'pagebuilder'
39
+ Provides-Extra: quality
40
+ Requires-Dist: opencv-python-headless>=4.9; extra == 'quality'
41
+ Description-Content-Type: text/markdown
42
+
43
+ # simple_module_images
44
+
45
+ Image collections for SimpleModule hosts. A collection holds images whose
46
+ **originals are immutable**; everything derived from them (EXIF and location,
47
+ renditions, quality metrics, an optionally anonymised display copy, map tiles)
48
+ is produced by pipeline steps that run as background tasks. Collections are
49
+ private to their owner, shared with chosen users, internal to the organisation
50
+ or public.
51
+
52
+ Imports take single files, batches, large direct uploads, ZIP archives and
53
+ GeoJSON sources of up to a million located images. Groups, AI prompts with a
54
+ review queue, a map (GeoJSON points and PMTiles) and a public gallery are
55
+ included. Design:
56
+ `docs/superpowers/specs/2026-10-28-images-module-design.md` in the source repo;
57
+ the guides are in [`docs/`](docs/index.md).
58
+
59
+ ## Install
60
+
61
+ ```bash
62
+ pip install simple_module_images
63
+ ```
64
+
65
+ Add `simple_module_images` to your host's dependencies; for an in-repo checkout,
66
+ resolve it from the workspace:
67
+
68
+ ```toml
69
+ [tool.uv.sources.simple_module_images]
70
+ workspace = true
71
+ ```
72
+
73
+ A plain install pulls no onnxruntime or OpenCV. Heavy processors are
74
+ extras, imported only inside the step that needs them:
75
+
76
+ | Extra | Adds |
77
+ | --- | --- |
78
+ | `quality` | OpenCV: resolution, blur and exposure metrics |
79
+ | `anonymize` | onnxruntime: YuNet face and YOLOv9 plate detection (MIT models), blurred into a display copy (the original is kept); weights from `anonymize_weights_path` or a pinned, checksummed download on first use |
80
+ | `ai` | `simple_module_ai`: prompt-based image analysis |
81
+ | `billing` | `simple_module_billing`: storage and request metering |
82
+ | `pagebuilder` | `simple_module_pagebuilder`: an image gallery block |
83
+
84
+ The map view needs no extra: its PMTiles archive is built by the `tippecanoe`
85
+ binary (`tippecanoe_path`), which must be on the worker's machine.
86
+
87
+ **Models and licences.** The `anonymize` extra installs only onnxruntime
88
+ (MIT). The step downloads two MIT-licensed ONNX models on first use, pinned by
89
+ SHA-256: **YuNet** (faces; Shiqi Yu, via
90
+ [OpenCV Zoo](https://github.com/opencv/opencv_zoo/tree/eb9f4f2d4b79b58e5513b5d25d5f0243a8357bf4/models/face_detection_yunet))
91
+ and **YOLOv9 licence-plate detector** (ankandrew,
92
+ [open-image-models](https://github.com/ankandrew/open-image-models)). Their
93
+ copyright notices are in this module's `NOTICE`. Recall is unverified, and
94
+ weights are cached under `~/.cache/simple_module_images/models` unless
95
+ `anonymize_weights_path` points at `face.onnx` and `plate.onnx`. See
96
+ [docs/index.md](docs/index.md#anonymize-models-and-licences).
97
+
98
+ The module needs the framework's `settings`, `sharing`, `file_storage` and
99
+ `background_tasks` modules. Migrations live in the consuming host
100
+ (`make migration`), never in the wheel.
101
+
102
+ Image processing runs in Celery workers (`make worker`, `worker-imports`,
103
+ `worker-heavy`, `worker-gpu`, `beat`) or inline with
104
+ `SM_BG_TASKS_TASK_ALWAYS_EAGER=true`. A plugin that adds steps ships an
105
+ `images_extensions.py` and must be installed in the web process and every
106
+ worker. See [docs/worker.md](docs/worker.md) and
107
+ [docs/writing-a-plugin.md](docs/writing-a-plugin.md).
108
+
109
+ ## Usage
110
+
111
+ The console is at `/admin/images`, the JSON API under `/api/images` and public
112
+ collections at `/images/c/{slug}`. Every router binds a tenant: a single-tenant
113
+ host uses `default`, a multi-tenant host the organisation the framework
114
+ resolved (403 `tenant_required` for the console, 404 for public routes when
115
+ none).
116
+
117
+ ### Permissions
118
+
119
+ | Permission | Allows |
120
+ | --- | --- |
121
+ | `images.view` | See collections and images the access policy admits |
122
+ | `images.create` | Create collections and upload images |
123
+ | `images.publish` | Make a collection public or internal |
124
+ | `images.manage` | Manage every collection regardless of owner |
125
+ | `images.originals.view` | Download the immutable original |
126
+
127
+ ### Settings
128
+
129
+ The module's settings are governed by the framework's `settings.edit`, as every
130
+ other module's are; images has no settings permission of its own.
131
+
132
+ Stored in the database and edited on the Settings screen; there is no
133
+ `SM_IMAGES_*` environment variable. System scope: one configuration for every
134
+ tenant. Fields marked as needing a restart (`tippecanoe_path`,
135
+ `public_asset_base_url`) are read once at boot; workers pick up the rest within
136
+ about 30 seconds.
137
+
138
+ | Setting | Default |
139
+ | --- | --- |
140
+ | `max_image_bytes` | 50 MiB |
141
+ | `batch_max` | 50 |
142
+ | `upload_body_max_bytes` | 100 MiB |
143
+ | `direct_upload_threshold` | 20 MiB |
144
+ | `max_open_uploads_per_tenant` | 20 |
145
+ | `zip_max_bytes` / `zip_max_entries` | 2 GiB / 10 000 |
146
+ | `zip_max_entry_bytes` / `zip_max_total_bytes` / `zip_max_ratio` | 200 MiB / 8 GiB / 200 |
147
+ | `geojson_max_features` / `geojson_max_bytes` / `geojson_max_feature_bytes` | 1 000 000 / 2 GiB / 60 MiB |
148
+ | `download_concurrency_per_domain` / `download_concurrency_total` (per download task) / `download_timeout` | 4 / 32 / 60 s |
149
+ | `thumbnail_sizes` | marker 64, small 160, medium 400, large 1024 |
150
+ | `dedupe_by_hash` | off |
151
+ | `tippecanoe_path`, `anonymize_weights_path` | `tippecanoe`, empty |
152
+ | `map_rebuild_threshold_pct` / `map_rebuild_threshold_abs` | 5 / 100 |
153
+ | `map_style_url` (basemap; empty = flat, no third-party request) | `https://tiles.openfreemap.org/styles/positron` |
154
+ | `public_asset_base_url` | empty |
155
+ | `janitor_grace_days`, `step_output_max_bytes`, `step_lease_seconds` | 7, 65 536, 1 800 |
156
+
157
+ ### Routes
158
+
159
+ Upload routes (`/api/images/collections/{id}/images`, `.../imports`,
160
+ `.../imports/zip` and `/api/images/uploads/`) carry a request-body ceiling of
161
+ `upload_body_max_bytes` plus multipart framing; the rest use the host's global
162
+ limit. Public exemptions are `GET`/`HEAD` only, under `/images/c/` and
163
+ `/api/images/public/`.
164
+
165
+ ### Map
166
+
167
+ - `GET /api/images/collections/{id}/points?bbox=minx,miny,maxx,maxy&limit=&cursor=`
168
+ (anonymous twin: `/api/images/public/c/{slug}/points`) answers a GeoJSON
169
+ `FeatureCollection`. Each point carries only `id`, `captured_at` and
170
+ `group_id`; an image whose display mutator has not settled is not a point.
171
+ `limit` is clamped to 5000; follow `next_cursor` for the rest.
172
+ - `GET|HEAD …/collections/{id}/map.pmtiles` (twin: `/api/images/public/c/{slug}/map.pmtiles`)
173
+ serves the collection's PMTiles archive with `Range`, checking access on
174
+ every request. It is a 404 until a map is built.
175
+ - `images.build_map` (queue `images`) builds the archive with `tippecanoe`.
176
+ A rebuild starts once the changes since the last build reach
177
+ `map_rebuild_threshold_abs` or `map_rebuild_threshold_pct` percent of its
178
+ points (both at least 1). A move does not wait for the threshold. A visibility
179
+ change, a removed point (an image trashed or its location cleared) and a
180
+ pipeline save that changes the redaction gate withdraw the archive in the
181
+ same transaction and build a fresh one. An archive is stamped with the
182
+ redaction gate it was built under, and is a 404 under any other (for
183
+ example once a mutator plugin is removed) until `images.reconcile` rebuilds it.
184
+ - The `images.tippecanoe` health check is degraded while the binary cannot be
185
+ found. Points keep working.
186
+ - The points are drawn over the basemap `map_style_url` names (OpenFreeMap's
187
+ Positron by default; its origin is added to the CSP). Viewers' browsers
188
+ fetch its tiles from that host, so it sees their IP and the area they view;
189
+ set it to empty for a flat background with no third-party request. A style
190
+ that cannot be fetched falls back to the flat background.
191
+
192
+ ## Documentation
193
+
194
+ | Page | For |
195
+ | --- | --- |
196
+ | [docs/index.md](docs/index.md) | Concepts, install, permissions, every setting |
197
+ | [docs/access.md](docs/access.md) | Visibility, shares, originals, withheld images |
198
+ | [docs/imports.md](docs/imports.md) | Uploads, direct upload and bucket CORS, ZIP, GeoJSON, limits |
199
+ | [docs/pipeline.md](docs/pipeline.md) | Steps, leases, AI prompts, groups, presets, review, storage metering |
200
+ | [docs/writing-a-plugin.md](docs/writing-a-plugin.md) | Steps, presets and result views from another module |
201
+ | [docs/worker.md](docs/worker.md) | Workers, beat, timeouts, tuning, recovery times |
202
+ | [docs/migrating-from-portal.md](docs/migrating-from-portal.md) | Moving off the portal's feature |
@@ -0,0 +1,347 @@
1
+ sm_images/__init__.py,sha256=HSXu6Hb_yVHwjSdZTeL43_-XCPP50Y8qjeyHMD7gtiY,322
2
+ sm_images/index.ts,sha256=-TD0puzeS4opjOoHuzMvzcQw-QIPywbmI5caHL8XbIo,408
3
+ sm_images/module.py,sha256=FmcHTX-1Wgfv9IMZBoWGrW67dd95m-S4x_1a3K6b93U,10756
4
+ sm_images/pagebuilder-blocks.ts,sha256=3sCmb770qZe6-5uc4yU2BtxuwWpculV1ALk0Dy9sHOw,1909
5
+ sm_images/task_config.py,sha256=P1fsg40DEopmnr0W8hTZAJmUoC8DGHHsBiUhb7RdVfw,2425
6
+ sm_images/tasks.py,sha256=8q4f6kvcfc14_WoFH0CWZWOHqHeh8x9_uAABwLbQfiA,6967
7
+ sm_images/contracts/__init__.py,sha256=7hp3--CROSDi_bABNFsiqPgjyfeKxb8wWOdB2YaAua4,2000
8
+ sm_images/contracts/events.py,sha256=K3HCyaZOZAhpmhFlfciHaw0p0rjqF_bsdyghB24jjKE,2332
9
+ sm_images/contracts/reads.py,sha256=TSANLnWgZSHCQXQf-JtAMa940yrCepw74wersi_1tec,5982
10
+ sm_images/contracts/schemas.py,sha256=w_NVu6F_B1X55dVNYuaIqToWzufk6PUidC1e_St1WHU,2836
11
+ sm_images/core/__init__.py,sha256=ybFmv5A5UPCGT5j2sQiwB4XtwCjFx9nxP_bfxtURnWM,244
12
+ sm_images/core/constants.py,sha256=XrC9D6KQjZO5FlsHoX_JXOTG6BXTyw-2_qWsf2Mk0gA,11806
13
+ sm_images/core/errors.py,sha256=u5u0XlsZs7bCg_lPoZBF-saZVztQs4PJamigM75moIs,6643
14
+ sm_images/core/events.py,sha256=t1s0gcIcuDusUYjbbHUvIFQ_CPI3--hOPefBtaB6oLY,2662
15
+ sm_images/core/access/__init__.py,sha256=tnVh5F61oyMID4BooYQLd8N66fzwf-gOdeaP2FRQJVA,10850
16
+ sm_images/core/access/redaction.py,sha256=HRZHnYHlkUorOoKEvhFFjr6uZUkKd8gfq5SIPsNUGK8,7525
17
+ sm_images/core/access/resource_types.py,sha256=apI5MDp7j_0R3CYOnUJii_1kjqYK6QnMAw8WPLft8JQ,2961
18
+ sm_images/core/access/starter_right.py,sha256=EQkoPddR2LdoHR61i61HATTN_VwMCzk5NDw5ZDq0XJg,3189
19
+ sm_images/core/access/write.py,sha256=ai0IkoAc172R73VHK-mOxUvNhWzwkQOi4x4D1yJw6xs,3744
20
+ sm_images/core/billing/__init__.py,sha256=KfgEbiT4TAwJjc8Q-K8s4HIcNdJzQuILEMuJxqbNVGo,8119
21
+ sm_images/core/billing/install.py,sha256=6R5uPZyuBqJE35iqa1dVMSFfE1eQDBricWQSAbh1hK4,9574
22
+ sm_images/core/billing/metering_keys.py,sha256=AXX88BLd4e4DjCEcz2bZUgQJeKRRPwKYjIsC8Z2kzAQ,1136
23
+ sm_images/core/billing/ops.py,sha256=Ny5tKgc7Bvl2Joo8mjzGoUpOZUzx-Ba_ts5zGKfReUE,9804
24
+ sm_images/core/billing/repair.py,sha256=YTgzLe0ulvKZGwtFYWvsOnhaxQt5md_5J8MRLCc_pXM,9602
25
+ sm_images/core/billing/repair_cursor.py,sha256=ksehqpCOPfLYaHTGwvaG39N-IFHOIIbGRcpGqvd78X4,3810
26
+ sm_images/core/billing/settle.py,sha256=V9_T_Dv8vMXfdJN13WeSdndeOzt-Fn9OVzLk_ByCcpo,7384
27
+ sm_images/core/billing/subject.py,sha256=QNarJ0OUP4XS8URJXbe1arP9LQ4N8xKITlqtNje1BUg,5243
28
+ sm_images/core/clock/__init__.py,sha256=0lP6FaUsQn2zSOdeN1556GDQz7k5D8Ov3x22ZdzAE3k,491
29
+ sm_images/core/clock/db.py,sha256=f8JeYO_nSePswWli-SeB-x0BUUHhx-nRkLR2I4NcICk,1856
30
+ sm_images/core/settings/__init__.py,sha256=2S8RjzoHuEQZQtBAkGqxk7UWGOPJvFTGgwgIfs-XBBY,6360
31
+ sm_images/core/settings/boot.py,sha256=Rs2XWPxGAvtXBVqMXxXepk6dvKP4F_im8_f40tV_8ww,2314
32
+ sm_images/core/storage/__init__.py,sha256=I0bz3GEPj8lrE_uCblzze-Fpux7A46PjfeCDuaAn8Y4,5325
33
+ sm_images/core/storage/intents.py,sha256=ycmi3RLiAjv3Ox4C7v0QXTmp89s-b1GabYKSsrILDsg,2843
34
+ sm_images/core/storage/keys.py,sha256=rsRUIcs7EMyvzmxwdGYHPbJs703y1QJ3CerB64TpjY8,2579
35
+ sm_images/core/tenancy/__init__.py,sha256=k7JUScSr3imro04fq2gv9nUE0FAW8uNAHpGTbPIlONk,10943
36
+ sm_images/core/tenancy/_guard.py,sha256=2WweajWIDDP3aYjeSm75YA0esYy9kOHKkd5geHsL8RM,4220
37
+ sm_images/core/tenancy/_mode.py,sha256=cFChRaHk1gJhrfWgjp2rCxTC0xhxrUTjIbC1Gcns114,10909
38
+ sm_images/core/tenancy/request_context.py,sha256=R8Huk2xOQ4zLrLNPShDEsDAB-bXxKR_ighF1xm_HHLc,1940
39
+ sm_images/ingest/__init__.py,sha256=llCKSJzXFoDxPZh7Z_mRbiYCNy-3NMUruxa96A-e8Hc,628
40
+ sm_images/ingest/_holds_host.py,sha256=WnmgfDQTObuyL672ima2nRGqX-LAgDk2pgnNOcV3uNk,930
41
+ sm_images/ingest/admission.py,sha256=rofjGE7yJ4NLlA4EU2SS9_KyAGnf_aFjDXMtwsbNxf8,6904
42
+ sm_images/ingest/b64.py,sha256=KkflI3mG7JK05pyk3L3cmuL8lpYaVmn5kTnO4ZB8j-I,1332
43
+ sm_images/ingest/dedupe.py,sha256=pNuCuieiQTMYrgkaRpoZ-BrluNUW1a8w5x_M9Tv3p8A,4924
44
+ sm_images/ingest/direct.py,sha256=QnAyXVooD6oSTRE4GWGeKPIxFLUO-7Zkk_agbqyDS08,9855
45
+ sm_images/ingest/guards.py,sha256=1YPW0i0r5ZKOgOx8reM_f4vXM2SQuoC5z2nRO0x5waM,4100
46
+ sm_images/ingest/meta.py,sha256=5x0rsURSFVTTkUO9-hueeXA6rH5EiPOPAzijngpNmwY,5032
47
+ sm_images/ingest/multipart.py,sha256=VY_B0Kux3LBCw5Jo0s8Z6uVPNrcvSQ8CJodHIlBiFpQ,6172
48
+ sm_images/ingest/service.py,sha256=0Ic4xzuFDJrKIIFNTm8hAfipY0PU_dC25Vb3wCGoR2Y,10599
49
+ sm_images/ingest/service_holds.py,sha256=olsqSPg875jVk8KE7of7Z4zn1xEKxJWkyri-RqJFcz4,2833
50
+ sm_images/ingest/slots.py,sha256=ZpBvMOB5PmKmYTsum9N8Gvaxt0VppyES7sUhWEAX2Y4,8015
51
+ sm_images/ingest/sniff.py,sha256=CSIJAZ8ygyi8RqS-eh-vtKGKTMQGzpXwMMM5fVjn0KQ,1607
52
+ sm_images/ingest/ticket.py,sha256=sFBbhKTaPGEMt_CYJxFCiRZunlIJ1H8kGwYPwIQR-98,3366
53
+ sm_images/ingest/upload_reaper.py,sha256=grwi_zxvD8FjV5y-evxK-P5h-AuHT95BQVoX6zbD2Lg,4405
54
+ sm_images/ingest/upload_session.py,sha256=vk-Y9No0HJEcWiQIBQlm3o_YO44MGulv8-LUOAozOj8,8992
55
+ sm_images/ingest/imports/__init__.py,sha256=LbM9hjCo3TYKjXc2S5i1lGd2BGCo2Z2MyLTnnjAigvI,80
56
+ sm_images/ingest/imports/access.py,sha256=DM1Oj0vzi5r7NtUnFLacuOZ7DfXMJyXWgveJ53dJG-I,4287
57
+ sm_images/ingest/imports/beat.py,sha256=bH-B_-TBnzV9C5AAIOcYt_m8slr3BdL4iOH1SRpG6O8,3154
58
+ sm_images/ingest/imports/chunk.py,sha256=DLlQbK9RPm-81BbyhGvBolx_ZZOTWNR1TCLwH6nJjTg,8320
59
+ sm_images/ingest/imports/claims.py,sha256=YLAHZ5h2sQxMQtuKRwEJbf_q0I_u8Z3WCHETCpoN8Fs,2815
60
+ sm_images/ingest/imports/cleanup.py,sha256=AM1cqEW4cuTBxaIKNPmvRxBZ4OlAub1P98P5t8a32vs,5370
61
+ sm_images/ingest/imports/controls.py,sha256=TKnGcgCD7KnF3jD0aKktJZELNpvH0lGpEA-uyJRvNuU,8112
62
+ sm_images/ingest/imports/dns.py,sha256=5IE0qXql2vdJfmi1vNj0vSr2MCXyNubGV2SMKfb8faY,3917
63
+ sm_images/ingest/imports/download.py,sha256=MYFdxlClgSEjgo4L6mTYh-pZKCrz1zoxp_UCp9wo8mU,7670
64
+ sm_images/ingest/imports/errors.py,sha256=0cOHCKghgBUelqC6JQBNoAK0BQgmxoa5Vegq5C_MtLI,777
65
+ sm_images/ingest/imports/features.py,sha256=AazLcGvVEiaHOQktgF1Sq-sTQPixW0rcX6ViAhfl_14,7490
66
+ sm_images/ingest/imports/fetch.py,sha256=wVFUeQwOYQR9GHmmus1lg59Xqovq895tc-I75qhtu-0,10858
67
+ sm_images/ingest/imports/filename_pattern.py,sha256=gPulcraJVpKppG0qpIwDy_HfUWEcUG9Lq1XQM-0XhKI,4647
68
+ sm_images/ingest/imports/geojson_stream.py,sha256=2B-Gvgodua-WZTOZ99mK0r5EY1iaekNZguh4eYTKTc4,6498
69
+ sm_images/ingest/imports/item_claim.py,sha256=BjjZ7WDcEizQjAwM2P9fovs5mF1PfOvfcW6po37E6ck,5466
70
+ sm_images/ingest/imports/item_errors.py,sha256=9sDU2o6dsdXwSWnBP4Sxie41O2qPMV0rDhQOu4Bu4OI,3036
71
+ sm_images/ingest/imports/jobs.py,sha256=ZsdCD3SaqwxtK8Nf4aHI0golGje-i-k774n2ew__wRY,8528
72
+ sm_images/ingest/imports/launch.py,sha256=-ISM8KQD-Almbw6viZoPZ9WMceoIDlG2-YJnsDCMGOU,2989
73
+ sm_images/ingest/imports/log_redact.py,sha256=pEbVRn5TAtQ3ALpoxd9ydXSMsUasWXVIQ171H4ImXY0,2376
74
+ sm_images/ingest/imports/lookup.py,sha256=rQtpkVf2N5g-L5J5QwGxhr8mOuN4asANfNK65MYU9vM,2525
75
+ sm_images/ingest/imports/manage_right.py,sha256=tXLEnRF7BLVtjvG8EJo5Qe04fcELpdpIX5mcJUmO2dQ,3101
76
+ sm_images/ingest/imports/mapping.py,sha256=u0LhtcOxCm6NvObkxDAmfLP02Iwnwpi3JS56gd8iC-8,2624
77
+ sm_images/ingest/imports/netsafe.py,sha256=FKnjOzxpu-mCyK5X_p74ONzuVbK_cKxQ8OVilktcLxc,3752
78
+ sm_images/ingest/imports/rate_limit.py,sha256=K9PSycZ7inxTlkZQh7Hm5pXlaV57CEJ5DjL9jHskzp0,5369
79
+ sm_images/ingest/imports/recover.py,sha256=KD24dWu2CRkhhoFD5o3VGE0TbvaPslYMXCvgQcPID-Y,11189
80
+ sm_images/ingest/imports/reset.py,sha256=UiKl4fs-CLSGjUnQgL_x-L6AS0UwQX54oZG1Qzbg7sk,6718
81
+ sm_images/ingest/imports/retrying.py,sha256=KKGRT42eZTnOY6-FRE9rIjJPSXDT83xPTRUoGfHLLy0,7074
82
+ sm_images/ingest/imports/runner.py,sha256=MHGGBuAdGhWbMjIqdYHxXoRtxtk1lEdI4Tnz-IYLxew,10153
83
+ sm_images/ingest/imports/service.py,sha256=QB6BtZT-0mu2P-UhY9UrWcRStg5WZ02A8GwHQezLtSA,5000
84
+ sm_images/ingest/imports/settle.py,sha256=T7KFCnB07qtquGXgpOQtxkD1BoOiQfTD-RIwfpmbEek,9608
85
+ sm_images/ingest/imports/stage.py,sha256=9quPrL6iNg7rj3IZBAgVAtQhTKPiO2QVPl_FlcZkAKc,3030
86
+ sm_images/ingest/imports/staging.py,sha256=qVshiWPo6PWqPV2sS4kJvOMVCT5rfuZBcFGsK9n9FgY,5419
87
+ sm_images/ingest/imports/tasks.py,sha256=GSGpVqwojw6QPcffwoWDEHDucBeiSMs45pNryyi86Fg,2252
88
+ sm_images/ingest/imports/terminal.py,sha256=8tyaIm7rblirYcddloglGRO7zcRu0_S06B241AUwXTI,6978
89
+ sm_images/ingest/imports/url_safety.py,sha256=FSarKA6rgD2iz7mDj1g7gD5_ZC1aX336CoDUj3L7S8I,6694
90
+ sm_images/ingest/imports/values.py,sha256=vix5SdCXeKsAkr4WqAkz0jUkkUTTjZTaQUIN86qVwq0,5979
91
+ sm_images/ingest/imports/zip_abort.py,sha256=wpvD30rUlHAM3pDI3GEyVzOYVcfwOrMvY7DmWYnDs1w,1702
92
+ sm_images/ingest/imports/zip_entries.py,sha256=JpL3Rz4901A121Q6x9Fq579med1wJ879EHuysy8jeWc,4938
93
+ sm_images/ingest/imports/zip_eocd.py,sha256=W0Lu587GVPPzar5uzEdNP3U2gYPK4akH29PRuNRE5y4,3620
94
+ sm_images/ingest/imports/zip_import.py,sha256=mYJSZwk3pKfHZU8X4Dx1pgCp_IXBIRBVAQnbMy_Q9wg,10178
95
+ sm_images/ingest/imports/zip_metadata.py,sha256=GU-OCrFS3dK3dZoxHdFkixVWH-ZgHf_V5npU9tG-dS8,2537
96
+ sm_images/ingest/imports/zip_safety.py,sha256=8ecMtq8OK2-mLMRacQv6iTnFTNlvzcS57nnqg3zvNeM,9511
97
+ sm_images/ingest/imports/zip_source.py,sha256=rLT5IkVI_3nzV-oUunrzKuyfd2It3MELlz2jBifqQx4,4957
98
+ sm_images/ingest/imports/zip_upload.py,sha256=3sVNWS7GaywG8SwJylY3BNDdvsIrzxe6QcI-kmRNIqw,10807
99
+ sm_images/jobs/__init__.py,sha256=JhRn8BxU-5rrmDfiFMU_L0l7DatR2r0NhtqzaSU3dTY,77
100
+ sm_images/jobs/janitor.py,sha256=DTwzdIrORxMWnLSu3Tcy6_VFhl15H4ujrbdLxNsnzPM,9846
101
+ sm_images/jobs/phases.py,sha256=r4m5lX5YHoPA42VFCQJ-YznWo49C6v4dMjPD8vdUN20,2135
102
+ sm_images/jobs/placeholders.py,sha256=uUinhzTpgYAffe0fmYyrRyCVJ_r31yAKtBtSr1KrrMw,3137
103
+ sm_images/jobs/purge.py,sha256=kIlQoLVrLaoWoWKnZr8-jefYZYhsVtuKv4yzF8apqO4,9359
104
+ sm_images/jobs/purge_delete.py,sha256=_0a16yf8UauruuFuGzWmR6BQdYyPwP0HLu9MaEoe0SE,4496
105
+ sm_images/jobs/purge_select.py,sha256=MHCTI-MIMbx0Wy0odWiKvyknKnSW7BbkikPdgBPqxcQ,9768
106
+ sm_images/jobs/reconcile.py,sha256=_tkfmGeYtQULumHrEy4TyjYw8FQt1inA1MaEgf6dtrs,9204
107
+ sm_images/jobs/reconcile_dispatch.py,sha256=FltMFJ8QtJ7Zpa5FjBOMnYXAhT7_j5AwWWExjV7NCME,4499
108
+ sm_images/jobs/regroup/__init__.py,sha256=uno06q9oDnx3sOhukeyMnm--H_02WSt4wUDzdbcSY0w,76
109
+ sm_images/jobs/regroup/control.py,sha256=hYDt7rWZg92isyoqoITGlf7K7fL-ywYvrHF9Z69i7lk,4011
110
+ sm_images/jobs/regroup/jobs.py,sha256=qhIKOQOf1oCCUYb26J7PPNG7NgNHDqAn4_hDE9qdTf4,8123
111
+ sm_images/jobs/regroup/runner.py,sha256=QeRmoFJoSFP0963wLpXT9NnrmFEYCPNbMmGLPO7DAoI,4325
112
+ sm_images/locales/de.json,sha256=0dE7anI-RfmcGMjIR6yDGMIvO8ftHsIvYS1MLIbvyXw,32936
113
+ sm_images/locales/en.json,sha256=jG5fJJKRtr28F1JLJvyClf43p_ItMryx2PObChl5lLk,29537
114
+ sm_images/map/__init__.py,sha256=Rcyhl3Q7NAfUohfcGLqzonRfRdE3Cc-miDva_j6F_kQ,911
115
+ sm_images/map/build.py,sha256=Wlxjl-zT4uyLyXzKq0fMGa1hQYpT1099z1zbM-jgcn8,8779
116
+ sm_images/map/objects.py,sha256=WMLlOrLtBK9i3NR8TuaC_YEFZoZf3Z3qIqxNBKEXYcA,1150
117
+ sm_images/map/pmtiles_build.py,sha256=pWsoNvYYsA3dT5jCtiph6e6APDr7MDlcOduqunAzS3A,4926
118
+ sm_images/map/points.py,sha256=SgYOnq5ZXgPn-w_tfJvlh66XYnutGn9dS-5xAnnMF2g,4626
119
+ sm_images/map/recover.py,sha256=FGzWaaXAH0fmS64HY0U49h4EfY_JrsJTFpdTm19D9yM,2349
120
+ sm_images/map/revoke.py,sha256=uwWRx4SWm8iuAZF_L-w04xL8shJOqqrEP2Taqj6biaE,5506
121
+ sm_images/map/schedule.py,sha256=c5QC_i5wVm35h2208NrVj29U5JK0mBndt2sohBdLIe8,8066
122
+ sm_images/map/style.py,sha256=QBHxjC44C-HuggOQuYLFzPsLPsMI6oZbq2qYlB1fWSw,2803
123
+ sm_images/map/tasks.py,sha256=ItvUTUrKBICPMau6EplxPcq140mUqLX16cPSDI6oXNY,1170
124
+ sm_images/models/__init__.py,sha256=PtojriTo1sAqI609kPJBFnrf6rYubeSVLha7AY-7D2E,1789
125
+ sm_images/models/_base.py,sha256=QdQiKebX9tM-fnrP5AH1uyhkEvsYx0EeBwPTPKbgYe4,411
126
+ sm_images/models/_cols.py,sha256=ixI2SVDefOSNLukgN8F8PULDcvmzD4ADF33sYFgfF9U,1644
127
+ sm_images/models/billing_op.py,sha256=_-WUZsQ4jWcEIuuLcdOZWVgad-HzpTLKIHv6wZVTcYA,4291
128
+ sm_images/models/collection.py,sha256=UNJhZufFwrE1onClMmtIeYO4ToaZoAcdYB9ceV3Gm1o,4305
129
+ sm_images/models/enums.py,sha256=4Rq2nPwsjT6vk7pOTJxFzWlLNfkiQGu75QkdIGzytoM,2271
130
+ sm_images/models/group.py,sha256=9xuFTEv-ifAgdIUjgRfuwab8YZxzsld4-GMmRC88VmE,858
131
+ sm_images/models/image.py,sha256=j3C81C0PDu4bnAItWhVXhQMc0RSKZMCDj2WU3KDANOk,5721
132
+ sm_images/models/import_item.py,sha256=NdYiaGFs9lHUdtmmdiljl-bVy9p2wX__GScB2eRn6bw,2575
133
+ sm_images/models/import_job.py,sha256=EanTLYDQQ5dre65edOER32F7R5wP-uyZaGXExoM60dw,4229
134
+ sm_images/models/object_intent.py,sha256=xYQ-xFIrYLKCzVoLLuLP5YYh8KZBQOYAcwpzbjOagIs,1406
135
+ sm_images/models/pipeline_restart.py,sha256=EbH6ia7QUsYQOwMSIBvzJ3YJGdArvF7dvRPgNI1NUG0,1693
136
+ sm_images/models/prompt.py,sha256=qXaOur0jLMxP08cksim3dPvlUMhaixlbqiBhUUm5DYc,4921
137
+ sm_images/models/regroup_job.py,sha256=6-ha03xbbQnf_1ksvVXl9VfuDnRBVzVyOMjL9l-YIE8,3618
138
+ sm_images/models/rendition.py,sha256=YaG5wGZDUxqbnkNKh3rQXw9WoktFy9wUkQtFJPhTa9w,1370
139
+ sm_images/models/step_run.py,sha256=oSWt3dcdxY3h-46u5N83KgivLvReabDoOexuakVZmfU,2257
140
+ sm_images/models/upload_admission.py,sha256=kse4GtoshMxjZVtZHzBc1xGZlEnFZsnL1RpWgOiDW-4,1356
141
+ sm_images/models/upload_session.py,sha256=EvXQiMRcMSHM8sHc5H_i0BiodUZsoX5pLZJlXo177QU,2893
142
+ sm_images/pages/Collection.tsx,sha256=SrgjSF6YsZWuTH1B-7nMJtV74VM9Cl9ZKl36FnPu9oI,9844
143
+ sm_images/pages/Collections.tsx,sha256=YF_8xqWK2FTb9KQa_ad1QBbJ7MninLn864imDZbiN6M,2872
144
+ sm_images/pages/Image.tsx,sha256=t4VVz2QDTFfBcQatAakxUcgSibrZ8hAvzg5ANCRP4b8,3847
145
+ sm_images/pages/PublicCollection.tsx,sha256=UOWd98y9VmqisAmRX8nlWmVpVyCxm1G_PP1XraZ3Rxo,2819
146
+ sm_images/pages/Review.tsx,sha256=z-zw-EZVTv1x6uVDT5Ut-pv-hfNTiGiFwk_yOjvJ8Og,7246
147
+ sm_images/pipeline/__init__.py,sha256=4c3J_0kzDlUBdCE_QRBuDB0T5tSJJsXJBq1A9apG47o,3632
148
+ sm_images/pipeline/advance.py,sha256=75vAwd0erb3VSLwOgQkNeQ4kFVVdyHeUB6-0wa7RfD4,7537
149
+ sm_images/pipeline/builtin_steps.py,sha256=YvVHZSAMA1qjVkUXrC8ivOc6foold9HZu95Pvdm2ba8,3507
150
+ sm_images/pipeline/claim.py,sha256=kbQSSo-lkMJoWMup26sZlLVmpg-nv8C0jUY3N0A9r88,7936
151
+ sm_images/pipeline/config.py,sha256=591xPvjEnw9PelnRzPwVkVm7whNaz68-SsVyq26r2GI,8660
152
+ sm_images/pipeline/control.py,sha256=XteFMDz8kLyTXa3-zkCzI_RF42U5TAQElcXKNDARZMg,6856
153
+ sm_images/pipeline/cycle.py,sha256=-3Km_vfmqzCUPqEkFBAdCUvMASCntY8xM7f8Yv27qls,4177
154
+ sm_images/pipeline/eager_drain.py,sha256=kn2QvgdmnwvKmp5878cD_f-bXGivJ5dfIDVfmoG79L4,3080
155
+ sm_images/pipeline/executor.py,sha256=hGhOq6ltybRtNkQiGABhyKuh6vEkWcK0hchB4ppiNH8,8927
156
+ sm_images/pipeline/extensions.py,sha256=vXe-gEzWYxusxA4HuhnQUCZtNuQjNMoPb23EUF7c23Q,3969
157
+ sm_images/pipeline/finish.py,sha256=51r3bXaVIFOVndd5tndKaljLH0L-YdcqabL5HyYTW7M,10966
158
+ sm_images/pipeline/keeper.py,sha256=pI8nGepVCHzbmM9MXivSu4eFWI0V1WM9wNFw0Q01XLY,622
159
+ sm_images/pipeline/load.py,sha256=EdcncxsmqI3E0dKI8Bdkgi6fcWdZGi-qK4e4HPtewJg,5337
160
+ sm_images/pipeline/orchestrate.py,sha256=ibowrznS_07IaQFY1tjU6zA7ETIZLBkr_H33fB3Lc-0,7740
161
+ sm_images/pipeline/plan.py,sha256=SazmQXoaOMIW5kbZ_No7_2n8qp8UdzoJx9ZHauwoMBo,9098
162
+ sm_images/pipeline/presets.py,sha256=YyK-3pFwA8U0IixZhIEqo-2fo7NIdb0SquxmnVKaPuA,4124
163
+ sm_images/pipeline/publish.py,sha256=HxUe_dZrYEzbOVa6gYMwKHW5uKVVE-9Z9hXpzDxaJKY,7786
164
+ sm_images/pipeline/registry.py,sha256=gXkQkcK7yvskX7CQb29LZ2FBbBpj7CLcZgahwpGONR4,8186
165
+ sm_images/pipeline/reopen.py,sha256=CDTXrBzPkBh-QQbzKajcg_9XHmjdv8mOGelJ2RiekSE,3031
166
+ sm_images/pipeline/restart.py,sha256=2dN4DbHX6-OUpM2c7uGWiASOEJVvM1_Zq3GBjytxQSo,6316
167
+ sm_images/pipeline/runtime.py,sha256=Z8PovtWpz7k6w8QYDbNqYrqvbTAXL6eVVRH2a0fmMjA,4609
168
+ sm_images/pipeline/step.py,sha256=FOzdGgsacMkXjcDrsLw7RVEXjZcN26_NtRWfIsTDjPw,5422
169
+ sm_images/pipeline/storage_hold.py,sha256=lmAYZIAnUTGUMv6Okq60kxGItOqlhRz5LBL1Jt-8WVY,10122
170
+ sm_images/pipeline/worker_runtime.py,sha256=Jd5fNU6icO8I7hZPnaFg7KMh4BQkwIKECvTjsDP0LHA,6728
171
+ sm_images/pipeline/ai/__init__.py,sha256=O6go4rDhhQKrw0W4cKNNTKo5pFgSBI8C-znnlSAlXhM,739
172
+ sm_images/pipeline/ai/codes.py,sha256=SUCrlfhqXxgDeT61hYHFYtu1Pbt6tZTeGN3c6BS96do,1466
173
+ sm_images/pipeline/ai/cross_check.py,sha256=54Mb7Nd62QsHUhwQFbO5vqq06Ajh9QXTUTvwiEUJ_1Y,6064
174
+ sm_images/pipeline/ai/group_inputs.py,sha256=ntkKoFi5H9zeTmMcos_WBVxeo4hR1w6ymnjclvqXVx0,3888
175
+ sm_images/pipeline/ai/group_lease.py,sha256=miVtcx3axlr-MyrOzOk5vxIS0c1O_BX_Iys1UGZQGAM,6270
176
+ sm_images/pipeline/ai/group_load.py,sha256=YulhCAX60l1yZnsTK8YR80h8AmpdU2fOS9GpZ3QN6G4,6610
177
+ sm_images/pipeline/ai/group_members.py,sha256=3Atv8OUKSdo2AnYhH_Lv8IcDy5Lca0Q6ty5sHTB_kW8,5974
178
+ sm_images/pipeline/ai/group_request.py,sha256=SQvtSnK5EFbo3cDfzSTipRPqkKK23rTVQYeF-c9EM4Q,5815
179
+ sm_images/pipeline/ai/group_run.py,sha256=gegYLHwwWFbJFFhTLDr4AO_AA2oGCUPA2uEPrfpIJUM,10223
180
+ sm_images/pipeline/ai/group_store.py,sha256=Yh7LWaWb-u_JWQKQYR757ktRy5oHvsT-zxNru1Ckwig,2969
181
+ sm_images/pipeline/ai/prompt_steps.py,sha256=RTP-hJBGrEkDfAkIfiB63Mr4Jrg_3x_FffYZcFAGL7I,6491
182
+ sm_images/pipeline/ai/reads.py,sha256=hNmg4d3OJC90SsuHPwwCs0v8E_cJQLrx_CIZ8zNouok,1475
183
+ sm_images/pipeline/ai/results.py,sha256=1NUJ8ovbZSexDuU3UR7ya_ORnV517up4WmMJ-I7ZTzQ,7126
184
+ sm_images/pipeline/ai/review.py,sha256=p8d2ePy7H846jmGUwiu7lRXVilxDyRXCphRSAuPYmww,5679
185
+ sm_images/pipeline/ai/run.py,sha256=2qKKlpCymL5BGzSARSdInfL5TTR74PoakD79XR4RAUE,7116
186
+ sm_images/pipeline/ai/runner.py,sha256=qYoc30Udn2RDHvO_u1rm37PCN96-jyxa-Xea3iqDodI,6847
187
+ sm_images/pipeline/ai/schema_model.py,sha256=VQ2untKlrpnh9aG3S75oqbZF27FCvGaIGL3BZV5eu-8,7556
188
+ sm_images/pipeline/ai/schema_safety.py,sha256=eV8RVrbkgaCI3y7Vhda7_v40i0Za9jE8CkYhroQYaPk,9760
189
+ sm_images/pipeline/processing/__init__.py,sha256=1UMUhWJK-zueKVhVoV2qGsuy9zSU92toH1a8VnOIz18,68
190
+ sm_images/pipeline/processing/exif.py,sha256=P4XJe8UCV_oc0xJ0KgWO5OXDTcSE5hxTycfmB7batR0,4579
191
+ sm_images/pipeline/processing/heif.py,sha256=keunA60WIdnhixM0EyXEtckCAAhupVVIe-yqlb922og,718
192
+ sm_images/pipeline/processing/renditions.py,sha256=qn0D43rdno5nbuFqsRoUfNH_A4QD65mbBqsksoIrjnw,2158
193
+ sm_images/pipeline/steps/__init__.py,sha256=El6hLKlwmkKUS9O8NKpb6qghAaFXhoTatCA8TPzOruc,57
194
+ sm_images/pipeline/steps/classify.py,sha256=oZlH2ALmPpbfhrPrvJvRA38JSS-G6C15K-zXn2QCtdY,3932
195
+ sm_images/pipeline/steps/quality.py,sha256=0llYeYjEb9jwyaOVkSYWHrQqitb5WtRUcqsgc2rP1Yw,4499
196
+ sm_images/pipeline/steps/anonymize/__init__.py,sha256=-T_5MgQbVrzymR-yVx1YKHnkF8iUvID-Pe-v7xcnUzk,516
197
+ sm_images/pipeline/steps/anonymize/blur.py,sha256=zQQDkr2y8D_3DYIQkh8AnSjzvtpcdvBIe3zf-VQSmQ4,2302
198
+ sm_images/pipeline/steps/anonymize/detectors.py,sha256=xT1VPLTyVxGcryjFiYFDvMGJ2OvnKx2P-rEBo9QPRWE,4944
199
+ sm_images/pipeline/steps/anonymize/models.py,sha256=O1BL-0tAV8qGgqx9D8zAyYdakmLbLcnqQHk0t8ykybw,9505
200
+ sm_images/pipeline/steps/anonymize/step.py,sha256=NBFslMeHRkfacCCi09kHDv8dtKoInTzo3wWpc2z_L-Q,8444
201
+ sm_images/pipeline/steps/anonymize/weights.py,sha256=OzQdOAESJVF92DimtOWr9OWFiOMjqPmcyR15dvhv1D8,6910
202
+ sm_images/ui/components/ChipGroup.tsx,sha256=WDqBCzcU9IxMkdtm6bl-hTJIEmFKl1wT1_K6y_ZE0Tc,1013
203
+ sm_images/ui/components/ConfirmDialog.tsx,sha256=DykvcitNKaxp991T0NU4a4O6ldKm8F4KE_scbbgWpdw,2486
204
+ sm_images/ui/components/ImagesLayout.tsx,sha256=HxKOZE3460qJbxHzzgop9VVA0kTHH9k8K4ZW5Q9aAMY,410
205
+ sm_images/ui/components/block/ImageGalleryBlock.tsx,sha256=L6ry17_mghg87cnrlAmgu2XRRedwgbA2Geg8uX76UDc,4528
206
+ sm_images/ui/components/block/ImageStatsBlock.tsx,sha256=Qx65X2RuOlBsuhqeXQrXr4S3Z6xsm8nNsDBSda9P2hI,3465
207
+ sm_images/ui/components/block/ImageStatsRender.tsx,sha256=ebCcdrZ3uzuvt0N1JjgB5JCQchcgsPncGcKxxymn3u0,4422
208
+ sm_images/ui/components/collections/CollectionCard.tsx,sha256=AqS0jLhIAahhPNKbXD-hNYJM29g1usNyfU5dHXu0iqc,1298
209
+ sm_images/ui/components/collections/CreateCollectionDialog.tsx,sha256=mgf8vtT9XT74rDS846OeL-YHBdJeRchpftZMKjICIWA,4276
210
+ sm_images/ui/components/collections/PublicLink.tsx,sha256=SpBtxgLMsc5qSnNiM5LfCm_qikieieT3Z-dCoSwqE9Y,1283
211
+ sm_images/ui/components/collections/VisibilitySelect.tsx,sha256=muq7G4voOibrSiP5DcEfWpR2IKuDR9dsj-4OTECGloA,1118
212
+ sm_images/ui/components/gallery/Gallery.tsx,sha256=BluXW6hioUIpzdOP6uTbgM_kvrJ1BrVwi0JVCmISSGE,3647
213
+ sm_images/ui/components/gallery/GalleryTile.tsx,sha256=AfmIWzNo0uOJib42O9e3CWVOgYxG1fr7BvG1OBlQmQU,2084
214
+ sm_images/ui/components/gallery/UploadButton.tsx,sha256=4PUIdhN6FPEmDVUsgPEX3RIcubMoUzynYTlUYoASV58,2409
215
+ sm_images/ui/components/groups/GroupCard.tsx,sha256=h2q623OtZR9GXR1nn-QYnNrsXV1BCzADiSz5u9XUCB4,3148
216
+ sm_images/ui/components/groups/GroupForm.tsx,sha256=NIFbo0tCgbAprtJihi56Tkxgw91d6X2_wdNyNjGJf30,2523
217
+ sm_images/ui/components/groups/GroupsTab.tsx,sha256=DSPzPXDj8caPYPCTYvOWIvSx5ELMQQtSQKYXWfrVTzM,3661
218
+ sm_images/ui/components/groups/MemberThumb.tsx,sha256=RlI1MwGQOhyrm4ug8BhZuCogmjQYpu1Pxw3Si3bvCS0,1307
219
+ sm_images/ui/components/groups/RegroupPanel.tsx,sha256=d0A6Pt-W6VL302ruclMHuNYtBUARVTRz5qIVXA0JoCM,5166
220
+ sm_images/ui/components/imports/ImportFailures.tsx,sha256=Cl8PBT794R4BELcAzRoo7rr9OEesgb2edhbRhO-5ATA,2052
221
+ sm_images/ui/components/imports/ImportWizard.tsx,sha256=9X9vtlPZd3Znh7uXDAF1NWLmz_YXwXP5AeDkMYB9fp0,9849
222
+ sm_images/ui/components/imports/ImportsTab.tsx,sha256=B_y3w9VVzu2qRNuJ3J94kt0hAGBKVfJWPnRZziEDtKQ,2355
223
+ sm_images/ui/components/imports/JobRow.tsx,sha256=V7bTAWwXQftTexeKH4MPddwMAf-qGmo3RdrTANhleMI,5776
224
+ sm_images/ui/components/imports/MappingFields.tsx,sha256=8aarMUhrim1_bnO-Tq3TUke3mecIaUG6i55WYJLPxQU,3234
225
+ sm_images/ui/components/imports/PreviewSummary.tsx,sha256=L8olqfaciIUgDTHWfo6p7tY446T56ZSt3g2TqeY28RE,2570
226
+ sm_images/ui/components/map/CollectionMap.tsx,sha256=hH0h5_x6huo3ViZpzmGbpysWax3gGL879ew1vHTblqc,3412
227
+ sm_images/ui/components/map/MapCanvas.tsx,sha256=Ra2tQKmEwRHXh0jzR5TA36VV41oNtM3m7ZaNJ03Q68c,7645
228
+ sm_images/ui/components/map/mapRevision.ts,sha256=ZoWCCdnXZtmqC1fLcQz6iipUum6aWXwrqVo7tOeAzb0,572
229
+ sm_images/ui/components/map/mapSource.ts,sha256=Q6HSAy_hUAXz2zTZrhiD8hNe1wIB901qlLDKHWbh3wM,3841
230
+ sm_images/ui/components/map/mapWorker.ts,sha256=vR0KUUJwAgAcVt4bglAz3jXb5qyajSW4v8SkqDA_Cvk,936
231
+ sm_images/ui/components/pipeline/ParamsForm.tsx,sha256=V29dCYv0OUp931YIkbXm0XzM0-p1e-vBGdUo2rq8EWY,7407
232
+ sm_images/ui/components/pipeline/PipelineTab.tsx,sha256=zpTjVBxzCBGNEMEGYoL7IDC-G_8HaJnudaOr4KZilT4,9395
233
+ sm_images/ui/components/pipeline/StepCard.tsx,sha256=OSXyuEzhqAR1clbcGgjDtylC88ncWxeCV9pTAyTY4IA,3658
234
+ sm_images/ui/components/prompts/GroupResults.tsx,sha256=9A8D8lG4ziCJS2tLux41uGQ-H0AvyDLvUtOvnSMg9RQ,4686
235
+ sm_images/ui/components/prompts/PresetPicker.tsx,sha256=H0_tirlIKRyHnoymrx05gTj0OwfiHjwfHG8yqolni9w,2785
236
+ sm_images/ui/components/prompts/PromptForm.tsx,sha256=B89DhTuep8bq19lc58qbwQlt7KpBlvB3k7kobqOBvT4,7008
237
+ sm_images/ui/components/prompts/PromptRow.tsx,sha256=pHVP_6Hqd3mGk0r82gD8P4C65pz3sFGCaHZjz8eafgQ,5821
238
+ sm_images/ui/components/prompts/PromptsTab.tsx,sha256=ercDo3RJD0QIpSMzCRVUaRHzgf2XGQQms-SZ7C_zsf0,5743
239
+ sm_images/ui/components/prompts/RunConfirm.tsx,sha256=ZM__-PwSFByvERDujT0km8Z3XraE6Ty4dzcyZtPGqto,2432
240
+ sm_images/ui/components/prompts/RunOnImages.tsx,sha256=UiiSOu9dL-Ia5jW4HYCDIA6C1tQZyqaOtfZ9jcKQSmI,3568
241
+ sm_images/ui/components/prompts/SchemaEditor.tsx,sha256=GazRO0-ATwGVoyTrXY7mIZJxTxlJmJIthA81Naq_L7c,4103
242
+ sm_images/ui/components/prompts/SchemaFieldBuilder.tsx,sha256=yCTHnqdlp1-lredu5DJFNGaPekMaXW4h80EzsgnXbcY,5098
243
+ sm_images/ui/components/public/Lightbox.tsx,sha256=aLJF128c0MAT_mZxdGxVSlOi0JQ2dt81VsLPtoZJ72c,2769
244
+ sm_images/ui/components/public/PublicGallery.tsx,sha256=DXACBLsbW9WIv0j3oEntEiXW6VpfCKdkv4sPEHXjip0,4791
245
+ sm_images/ui/components/results/GenericResultView.tsx,sha256=OFNBBF53O1RDK99mGMGj4Bmvr8lf-yq8U5gxDJbzXhA,2643
246
+ sm_images/ui/components/results/PromptAnswer.tsx,sha256=ZS9q0dBaLBTUznshl-4Y9HH9VFcnPH4uIia4C8bTm1g,1767
247
+ sm_images/ui/components/results/ResultView.tsx,sha256=Bp0Yg0MsZ5syQ0FJ_K2DmLLLcD8u4D9cvmKClvA_Has,551
248
+ sm_images/ui/components/results/plugins.ts,sha256=n78V2vQlBWzeoG7WFM0w__tkuSJYqUfQUarkPKSm4c4,695
249
+ sm_images/ui/components/results/registry.ts,sha256=s_6hOaogxny2X89SaG_Pn1bJjaHOlZF36kvoPff1LuI,1833
250
+ sm_images/ui/components/review/CorrectionForm.tsx,sha256=iSeRrPz5XS64Tgi6pmfVljykcFN5VmAO5BPM2e0KAIw,7511
251
+ sm_images/ui/components/review/ReviewPanel.tsx,sha256=Wsxpmpa9JusGlmbH7iFttS5Ar7484Lm_p8f2c-xTbOI,4344
252
+ sm_images/ui/components/share/ShareDialog.tsx,sha256=9hsWx6RubdvpICL0I2YLKgsI8VkDqS3iPdDu_57h0x8,5954
253
+ sm_images/ui/components/viewer/GroupEditor.tsx,sha256=yprdUgqt-IPZs5z6kg1ykboDVh-yCjdEqrEH-0o7Yng,6050
254
+ sm_images/ui/components/viewer/ImageMeta.tsx,sha256=rhVE8RknOufbjECqqgSzvYRJHNj5hfqVqcfWbGWCt2Y,3506
255
+ sm_images/ui/components/viewer/ImageViewer.tsx,sha256=td8vy_iVgor2lLbnLmAIztTlc6XbxQGkvaQhEixUcCo,2938
256
+ sm_images/ui/components/viewer/NeighborNav.tsx,sha256=MUzGi06P1w3DmC10-VftpnE0Nl6DeixEcazBnp7WVJ4,2626
257
+ sm_images/ui/hooks/useCollections.ts,sha256=HsZZ-G_O9lXin26VOWYAasCybQmW6_I9vytdgFePaF0,794
258
+ sm_images/ui/hooks/useCursorList.ts,sha256=tyty64HwqLVjI9yg36P4UHlzB0RXvfzHeYbnDTQ79vI,3089
259
+ sm_images/ui/hooks/useGeoJsonPreview.ts,sha256=4YKD6X2bhm6uxWCTu_JwsZt6HH-HHibXJuEfbwU6_UE,1217
260
+ sm_images/ui/hooks/useGroups.ts,sha256=yGlAr32JNfWqIKxnBUw443Rvm4c0MnM22dGuhGsaTwQ,1355
261
+ sm_images/ui/hooks/useImages.ts,sha256=b34hMcklIkFcfVPbOSETFbm4Nzw3DU1Y3gMFyREqc0I,1712
262
+ sm_images/ui/hooks/useImportJobs.ts,sha256=WTTnb76EgddvMG6PxhjRjDWirSYqnIUNbmWDdY7T8js,3520
263
+ sm_images/ui/hooks/usePipelinePoll.ts,sha256=acAUINjdz-sq-vBW09odNb9noMJ_0ff3AUW15pOzKQo,2117
264
+ sm_images/ui/hooks/usePromptResults.ts,sha256=SzncniV5bl0ZAnDZrXPFh2OUiXJbdfJitEaOIyQPS1k,4758
265
+ sm_images/ui/hooks/useRegroupJob.ts,sha256=7bWBExnGqg0upvWFNBhRut0Gsf2igHVbupLsRbnSKP8,2394
266
+ sm_images/ui/hooks/useReviewKeys.ts,sha256=eK3aM8rG2rQ_q4dJoNnLHpu2xVTlWBNv7JvjzXpgSAY,1412
267
+ sm_images/ui/hooks/useReviewQueue.ts,sha256=6MHzIlazEozA-GC0tgy85K3KBXxlfCskqrYku-Ly6R4,4911
268
+ sm_images/ui/hooks/useShares.ts,sha256=ILF8-U8hroUzYaRTgMzlzpRBPvvTOQO53OFAfxpqrZU,2451
269
+ sm_images/ui/utils/api-groups.ts,sha256=BpoNUzmBNtYxJatBRRQ73XekGz5kMOprRofUltlQLLg,2238
270
+ sm_images/ui/utils/api-imports.ts,sha256=Vm-evn1AtRcsCJoOyUso7scsV2faQTTe1QG109u_9WM,2293
271
+ sm_images/ui/utils/api-net.ts,sha256=U13JAs7ewvREoINmmkup7NjGyXAy5YVCwyymy3xN034,2986
272
+ sm_images/ui/utils/api-prompts.ts,sha256=Pbn4gMTziH6T8QYPscdeJ9VwtTcTiLZumWuzRm1WHWE,2492
273
+ sm_images/ui/utils/api-public.ts,sha256=4moGDtwEGLbk4qi72UurmF5jCj0104lu5V8vqU1D-xo,2696
274
+ sm_images/ui/utils/api-review.ts,sha256=GAkiYknQ1mvH3tWwT6fJfIo4moygESDTXg4xrdovF9s,1707
275
+ sm_images/ui/utils/api-shares.ts,sha256=h34BACw83_8bdue9Sz1E25onyBGNVhOHgt8Naqw0_dg,1348
276
+ sm_images/ui/utils/api.ts,sha256=7n8ROXmE4KGpDOUl_ErfCAIRFZIK6Lv1basew1V_ZqQ,5758
277
+ sm_images/ui/utils/csrf.ts,sha256=qB5iM8KV6uaP6mHY7BsVtyNnk3iZDexh_gUDhshf2r4,2416
278
+ sm_images/ui/utils/direct-upload.ts,sha256=99H11Z7KGdLQtcCPx7Fba4kQS2Jy8LdTa-wv46oGvDk,3213
279
+ sm_images/ui/utils/geojsonDetect.ts,sha256=fIlDhTturkapAoEeGavgILv-2BTNibEIqsXiSDiYnLA,2502
280
+ sm_images/ui/utils/geojsonHeadScanner.ts,sha256=xMKmYjT57DBav6m4GIF3KvAUg8e688cdd4ArNQBaKpk,5827
281
+ sm_images/ui/utils/geojsonPreview.ts,sha256=6b1s2c9WRQoZNw6IGYpHeGY1Xvvm73n9Z4GXXjCtAJw,5356
282
+ sm_images/ui/utils/i18n.ts,sha256=TqOZvsF5zCemu9ZHjCTvNRbg_YC-CcJqFo8UoMWGbt0,8258
283
+ sm_images/ui/utils/labels.ts,sha256=vE9D_3mBs1FkP5HNTEMpe0SYOM64JSL_o5uOAu8WlA0,3278
284
+ sm_images/ui/utils/schemaFields.ts,sha256=AcUZrx_dIOfWKSBT3WT6L-b-G6Jz6StsfKadTrc0vpQ,5405
285
+ sm_images/ui/utils/types-prompts.ts,sha256=Vjx4CBMLHC2fQwu12prFu0sFXOSvIt4NWfu6diLmze4,1928
286
+ sm_images/ui/utils/types-public.ts,sha256=NJ5PDpcBNpT54VLIh7G-Uo-O4AG4IXZCNTiQRsDfLs8,1070
287
+ sm_images/ui/utils/types.ts,sha256=78TIPvYHkR-ehHV-6sAhhkm3JN5vRf1c8ckmMb7-eOA,6514
288
+ sm_images/web/__init__.py,sha256=AbtYQlSWpcA7ldYE6qcU3lIkUapM8ilKV90i2s_m42k,185
289
+ sm_images/web/endpoints/__init__.py,sha256=5raioaQwVYbt_yZMdMQTJVce6wqCjvcYppjnWYsQyQk,47
290
+ sm_images/web/endpoints/csrf.py,sha256=JzFgkJx9OTDgLIsZDGJ4gmGsTSn3GkFSJ7qp5S0FMvo,1113
291
+ sm_images/web/endpoints/deps.py,sha256=HaKw5_Y5rRRZW2SJyXEXOHRSVaZuTY_Mjf2CFk-dbH0,1174
292
+ sm_images/web/endpoints/map_params.py,sha256=A2NHUhEiezliro04T_JbbBfJeo8sDse8Ofo8RTsXmik,2907
293
+ sm_images/web/endpoints/menu.py,sha256=52mFb-L2M4XNahrtpaamj8P3qHjGiF31RkdK9np1rp8,979
294
+ sm_images/web/endpoints/public.py,sha256=yJrmUkr8RUhKLOA6tLfoPvYahXmsA6mZZ7caibuQexI,6603
295
+ sm_images/web/endpoints/public_views.py,sha256=GlwLB_oQBXxRQwKKBubT88oD59SAPRUVvc9iCqHQTGM,2412
296
+ sm_images/web/endpoints/views.py,sha256=32uBZ0xG1GHshhI0c_-0O5-87Ax1dPvqloSrWguxL2I,6248
297
+ sm_images/web/endpoints/api/__init__.py,sha256=nvkS_TS6Le2f5ssFi82a0A66uzgAir1cWbTepbCRQdw,1788
298
+ sm_images/web/endpoints/api/_runtime.py,sha256=yQPhyjwFwFvjFGJ7Gk2ZvH4JR7TkWWVYcQKwUbbFE9c,725
299
+ sm_images/web/endpoints/api/collections.py,sha256=7fHu3Uh7rbQIbGa_DZGZdJSai89qzoOO218Z8ER_WWs,4411
300
+ sm_images/web/endpoints/api/groups.py,sha256=hqaUhukkY0FK0XhZxLOyYLDQfP5M8xlFfoM1zoyNIkY,7562
301
+ sm_images/web/endpoints/api/images.py,sha256=KtkYgKItYQya8ri1HhJqc8UloG-JZ7g99KLtYPIf_DE,10059
302
+ sm_images/web/endpoints/api/imports.py,sha256=mKP7NcsH3VFJq3TcBwAUIS0mcsNXoB4gURkBfARflSk,9113
303
+ sm_images/web/endpoints/api/map.py,sha256=l4joj69usp-oZP7JqUCVZ0b_vr-wj_UxOLPAIf-02VE,2280
304
+ sm_images/web/endpoints/api/pipeline.py,sha256=ilbq4fAVBR6xlPq2tt4uPa1aV4_FNrigIn2nGc60Trc,4545
305
+ sm_images/web/endpoints/api/presets.py,sha256=_thrpclzOboO9IG1wPeX6Iad5eMPU6mZo7oQIyHf28g,1760
306
+ sm_images/web/endpoints/api/prompts.py,sha256=MBIRjdj99yI8cnjeqI-p4EbJaksOtpAOpWWVA29LnEE,7538
307
+ sm_images/web/endpoints/api/review.py,sha256=44M0agDePYdB9CPauXn2s7tQD4V6AiVYjtVL-ipZYMg,3510
308
+ sm_images/web/endpoints/api/serve.py,sha256=g5y-SLCuLrHKWEq6SHtV1fsGEoC-joLnKIJ-J_D5Xbw,2262
309
+ sm_images/web/endpoints/api/shares.py,sha256=J3WNf_Om1cW-8pysKeDZM1xBGYJZjn78ZrSMbFf8azU,2718
310
+ sm_images/web/endpoints/api/uploads.py,sha256=ne6TIou7feeilgFk6aSwiWzkVphMXUl01MKBNblqu9k,6318
311
+ sm_images/web/schemas/__init__.py,sha256=5W1t2TwgcSzRuHvU3yyB4hvfoGRVFvckEZ4ZC0Hk_JQ,53
312
+ sm_images/web/schemas/collection.py,sha256=G6NTLJtuNtOkD4JiqfFdK2pNGzmgn-5b5n11OA3-L6E,1769
313
+ sm_images/web/schemas/group.py,sha256=UuRT6gXJ1h1z7ZHvOsiIeEa1-ongowe9haUwk9jpD0Q,2897
314
+ sm_images/web/schemas/image.py,sha256=MgY9ghF4_5vbwnfeO1hYUy0ASpENmr16hr57e4DzQ0A,5606
315
+ sm_images/web/schemas/imports.py,sha256=OCsLFNtxvQGyICaRb3cc0Yfg56qhaIfsVYDWB0dSmYY,2453
316
+ sm_images/web/schemas/pipeline.py,sha256=2aAH5zzvzT-ooe5HokeycDyb_Yj3wwNMncRvuKzPUFM,678
317
+ sm_images/web/schemas/prompt.py,sha256=5S-yds5i3NhvFkZYHtRtm9_FvmtFRxbVkvFywBHkgWw,4536
318
+ sm_images/web/schemas/review.py,sha256=TgmNf11SSUmZSGWojDmfh0wqWIMonQ0ZPLvcnuxvjgU,1007
319
+ sm_images/web/services/__init__.py,sha256=A1fA8XSUmjAkD8Gc1_0yNxZbIGuG1qEJmiLnrLrHTa8,1040
320
+ sm_images/web/services/collections.py,sha256=MVxg-9WwCcf6uVDy28iSProt8EXYizm9kamEruS4YRo,6139
321
+ sm_images/web/services/cursor.py,sha256=Kn2oikfHryDD762pGyClS6l9lyqh16of1IzjbQqF0KY,2135
322
+ sm_images/web/services/gallery.py,sha256=ScywKX4Sn8Si5VQDBxLHpQaLI5E8W-9VfcdAngzBncs,5964
323
+ sm_images/web/services/groups.py,sha256=EuZYya16tbNFiBoevNubDfa6jtJfWRO7fxPrcWxznEo,9766
324
+ sm_images/web/services/neighbors.py,sha256=XwzIl02TOq9kW2YHKaOSOJ6L-Tucm1SjJ8Of8Hh7wEA,1963
325
+ sm_images/web/services/present.py,sha256=AYZkGFpcZFaeEPL1LHqDQ8ZNnQn83zByHSrnolMUJM4,4011
326
+ sm_images/web/services/presets.py,sha256=bEbhFA-Cg6gsOJwNjM0Kh7ASzn5hPy1d51xIi8sM7Nk,6382
327
+ sm_images/web/services/prompt_answers.py,sha256=UsvCxXDUlKxjm58-CKlNjkCq36cODS2BVQruKiiDaNM,1706
328
+ sm_images/web/services/prompts.py,sha256=AQG0Z8tQM4fRBUlF1GV0O1-MljngRoHmJDhUpE3ucac,8099
329
+ sm_images/web/services/public_gallery.py,sha256=15V500HfxjDTJ-Xv9i8tnmgLREWlZlrA5iPrRP2PpWI,3436
330
+ sm_images/web/services/public_stats.py,sha256=UeRu5xkotgGEoJ22JWTcvGe3fypfEe7nyC-QPvlStz0,5314
331
+ sm_images/web/services/regroup.py,sha256=9lb5spwIDMEoxra7ZBNXfaEWvhcHf54Z4s4AFlYP_sM,6531
332
+ sm_images/web/services/regroup_write.py,sha256=AywkhdUwjq5QciOY51mfojxSyNwJM9lSTqd-n_Tck3Q,5804
333
+ sm_images/web/services/review_queue.py,sha256=-TRNKzqxOOhPzGn1mJkc7hrIXwBIY0uTitmABNO38hc,3793
334
+ sm_images/web/services/slugs.py,sha256=DKKefn71brC0YFLbt6jwVy6253I5dILwzT5AcqMDrrk,541
335
+ sm_images/web/services/stats.py,sha256=qsytz95WLe5K5052dzSQ3FNZDfyh5RDGFuQeUwTr37I,5852
336
+ sm_images/web/services/viewer_stats.py,sha256=b8ulmiYANBL0XnG2FkVAi4p2sxR7EyAhF7YV3w9eL5g,3317
337
+ sm_images/web/serving/__init__.py,sha256=viIRftaT6m8JpT9kAQfNLkuKjqD3ZyeCRP-FCXBDjX4,103
338
+ sm_images/web/serving/cache.py,sha256=OwnDI7Odb7Xuj0d_fM6VvzqPJzyUyaa-bppWW3pMEaE,5945
339
+ sm_images/web/serving/ranges.py,sha256=tuNHnRvAgguk0_hGW97PqJb4qCUjqcQ2UTKpdLswuwk,2790
340
+ sm_images/web/serving/respond.py,sha256=7yPnrhoN1nURhnMNflJ9sr6xgeYxoAUlW6Is1sG7xf4,11664
341
+ sm_images/web/serving/urls.py,sha256=jfCu_gXE-zT49m16-Ys-8nI2LmBZy4AmvKOgzEW65aA,5019
342
+ sm_images/package.json,sha256=DnSmfXgA6nBlGRFCyeGp75u5Nq89_efEwLGl48U7bjA,722
343
+ simple_module_images-0.0.14.dist-info/METADATA,sha256=czRm7dq2UuRbdB7YeKvIEZAiHI_Rg--17D9DnxR7rFs,9948
344
+ simple_module_images-0.0.14.dist-info/WHEEL,sha256=2iZrJkDIkeDh0k9SikKMqFuRP-ua6mb4Ir1AsER4BEw,87
345
+ simple_module_images-0.0.14.dist-info/entry_points.txt,sha256=dYEBmA8DdiFdbB1BDSYBPOVf2GXCmYbK3DhDR3Pc8Tk,55
346
+ simple_module_images-0.0.14.dist-info/licenses/NOTICE,sha256=Ga_2bnnnesggVSqtyuCBp9RsbKWT5HJq6_8a2oFKeSA,3042
347
+ simple_module_images-0.0.14.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: hatchling 1.33.0
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,2 @@
1
+ [simple_module]
2
+ images = sm_images.module:ImagesModule
@@ -0,0 +1,61 @@
1
+ simple_module_images
2
+ Copyright (c) Anto Subash. Licensed under the MIT License.
3
+
4
+ The optional `anonymize` step downloads the following third-party models at
5
+ run time. They are not included in this package; their notices are reproduced
6
+ here because a deployment that caches or redistributes them must keep them.
7
+
8
+ -------------------------------------------------------------------------------
9
+ YuNet face detector - face_detection_yunet_2026may.onnx
10
+ Source: https://github.com/opencv/opencv_zoo/tree/eb9f4f2d4b79b58e5513b5d25d5f0243a8357bf4/models/face_detection_yunet
11
+ Training code: https://github.com/ShiqiYu/libfacedetection.train
12
+ License: MIT
13
+
14
+ MIT License
15
+
16
+ Copyright (c) 2020 Shiqi Yu <shiqi.yu@gmail.com>
17
+
18
+ Permission is hereby granted, free of charge, to any person obtaining a copy
19
+ of this software and associated documentation files (the "Software"), to deal
20
+ in the Software without restriction, including without limitation the rights
21
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
22
+ copies of the Software, and to permit persons to whom the Software is
23
+ furnished to do so, subject to the following conditions:
24
+
25
+ The above copyright notice and this permission notice shall be included in all
26
+ copies or substantial portions of the Software.
27
+
28
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
29
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
30
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
31
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
32
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
33
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
34
+ SOFTWARE.
35
+
36
+ -------------------------------------------------------------------------------
37
+ YOLOv9 licence-plate detector - yolo-v9-s-608-license-plates-end2end.onnx
38
+ Source: https://github.com/ankandrew/open-image-models/releases/tag/assets
39
+ License: MIT
40
+
41
+ MIT License
42
+
43
+ Copyright (c) 2024 ankandrew
44
+
45
+ Permission is hereby granted, free of charge, to any person obtaining a copy
46
+ of this software and associated documentation files (the "Software"), to deal
47
+ in the Software without restriction, including without limitation the rights
48
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
49
+ copies of the Software, and to permit persons to whom the Software is
50
+ furnished to do so, subject to the following conditions:
51
+
52
+ The above copyright notice and this permission notice shall be included in all
53
+ copies or substantial portions of the Software.
54
+
55
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
56
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
57
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
58
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
59
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
60
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
61
+ SOFTWARE.
sm_images/__init__.py ADDED
@@ -0,0 +1,7 @@
1
+ """Images - collections of images with a processing pipeline.
2
+
3
+ Originals are immutable. Derived data (EXIF, renditions, quality metrics, an
4
+ optionally anonymised display copy, map tiles) is produced by pipeline steps
5
+ that run as background tasks. Design:
6
+ ``docs/superpowers/specs/2026-10-28-images-module-design.md``.
7
+ """