@howells/stow-server 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -389,6 +389,8 @@ type FileIncludeField = "tags" | "taxonomies";
389
389
  /** Input payload for text-based semantic search. */
390
390
  interface TextSearchRequest {
391
391
  bucket?: string;
392
+ /** File keys to exclude from results (e.g. already-seen items). Max 500. */
393
+ excludeKeys?: string[];
392
394
  filters?: SearchFilters;
393
395
  include?: SearchIncludeField[];
394
396
  limit?: number;
@@ -457,7 +459,7 @@ interface SimilarSearchRequest {
457
459
  clusterId?: string;
458
460
  /** Blend multiple cluster centroids as query vector. Requires profileId. */
459
461
  clusterIds?: string[];
460
- /** File keys to exclude from results (e.g. already-seen items). Max 200. */
462
+ /** File keys to exclude from results (e.g. already-seen items). Max 500. */
461
463
  excludeKeys?: string[];
462
464
  /** Find files similar to this file key */
463
465
  fileKey?: string;
@@ -480,7 +482,7 @@ interface DiverseSearchRequest {
480
482
  clusterId?: string;
481
483
  /** Blend multiple cluster centroids as query vector. Requires profileId. */
482
484
  clusterIds?: string[];
483
- /** File keys to exclude from results (e.g. already-seen items). Max 200. */
485
+ /** File keys to exclude from results (e.g. already-seen items). Max 500. */
484
486
  excludeKeys?: string[];
485
487
  /** Find diverse files seeded by this file key */
486
488
  fileKey?: string;
@@ -525,8 +527,18 @@ interface SearchResultItem {
525
527
  }>;
526
528
  width?: number | null;
527
529
  }
530
+ /** Which filter categories were active in the request. */
531
+ interface AppliedFilters {
532
+ color?: string[];
533
+ contentType?: string[];
534
+ metadata?: string[];
535
+ tags?: string[];
536
+ taxonomies?: string[];
537
+ taxonomyGroups?: string[];
538
+ }
528
539
  /** Metadata describing server-side filter pruning. */
529
540
  interface FilteredMetadata {
541
+ appliedFilters: AppliedFilters;
530
542
  candidatesScanned: number;
531
543
  requested: number;
532
544
  returned: number;
@@ -542,6 +554,8 @@ interface ColorSearchRequest {
542
554
  bucket?: string;
543
555
  /** Only search the dominant (first) color per file */
544
556
  dominantOnly?: boolean;
557
+ /** File keys to exclude from results (e.g. already-seen items). Max 500. */
558
+ excludeKeys?: string[];
545
559
  /** Target color as hex (e.g. "#FF0000") */
546
560
  hex?: string;
547
561
  /** Max results (default 10, max 50) */
@@ -561,6 +575,7 @@ interface ColorSearchResultItem {
561
575
  colorDistance: number;
562
576
  contentType: string;
563
577
  createdAt: string;
578
+ height: number | null;
564
579
  id: string;
565
580
  key: string;
566
581
  matchedColor: {
@@ -573,11 +588,27 @@ interface ColorSearchResultItem {
573
588
  position: number;
574
589
  proportion: number;
575
590
  };
591
+ width: number | null;
576
592
  }
577
593
  /** Result payload for color similarity search. */
578
594
  interface ColorSearchResult {
579
595
  results: ColorSearchResultItem[];
580
596
  }
597
+ /** A taxonomy term within a group. */
598
+ interface TaxonomyTerm {
599
+ name: string;
600
+ slug: string;
601
+ }
602
+ /** A taxonomy group with its terms. */
603
+ interface TaxonomyGroup {
604
+ name: string;
605
+ slug: string;
606
+ taxonomies: TaxonomyTerm[];
607
+ }
608
+ /** Result payload for taxonomy listing. */
609
+ interface TaxonomyListResult {
610
+ groups: TaxonomyGroup[];
611
+ }
581
612
  /** Server-side SDK client for Stow's API. */
582
613
  declare class StowServer {
583
614
  private readonly apiKey;
@@ -850,6 +881,21 @@ declare class StowServer {
850
881
  removeTag(key: string, tagId: string, options?: {
851
882
  bucket?: string;
852
883
  }): Promise<void>;
884
+ /**
885
+ * Taxonomies namespace for discovering available taxonomy terms.
886
+ *
887
+ * @example
888
+ * ```typescript
889
+ * const { groups } = await stow.taxonomies.list();
890
+ * for (const group of groups) {
891
+ * console.log(group.slug, group.taxonomies.map(t => t.slug));
892
+ * }
893
+ * ```
894
+ */
895
+ get taxonomies(): {
896
+ list: () => Promise<TaxonomyListResult>;
897
+ };
898
+ private listTaxonomies;
853
899
  /**
854
900
  * Search namespace for vector similarity search
855
901
  */
@@ -918,4 +964,4 @@ declare class StowServer {
918
964
  private renameProfileCluster;
919
965
  }
920
966
 
921
- export { type BucketResult, type ColorSearchRequest, type ColorSearchResult, type ColorSearchResultItem, type ConfirmUploadRequest, type CreateBucketRequest, type DeleteProfileSignalsResult, type DiverseSearchRequest, type Drop, type DropResult, type FileColor, type FileColorProfile, type FileIncludeField, type FileResult, type FileTag, type FileTaxonomy, type FilteredMetadata, type ListBucketsResult, type ListDropsResult, type ListFilesItem, type ListFilesResult, type PresignDedupeResult, type PresignNewResult, type PresignRequest, type PresignResult, type ProfileClusterResult, type ProfileCreateRequest, type ProfileFilesResult, type ProfileResult, type ProfileSignalInput, type ProfileSignalResult, type ProfileSignalType, type ProfileSignalsResponse, type QueuedResult, type ReclusterRequest, type ReclusterResult, type RenameClusterRequest, type ReplaceResult, type SearchFilters, type SearchIncludeField, type SearchResultItem, type SimilarSearchRequest, type SimilarSearchResult, StowError, StowServer, type StowServerConfig, type TaskTriggerResult, type TextSearchRequest, type TransformOptions, type UpdateBucketRequest, type UploadResult, type WhoamiResult };
967
+ export { type AppliedFilters, type BucketResult, type ColorSearchRequest, type ColorSearchResult, type ColorSearchResultItem, type ConfirmUploadRequest, type CreateBucketRequest, type DeleteProfileSignalsResult, type DiverseSearchRequest, type Drop, type DropResult, type FileColor, type FileColorProfile, type FileIncludeField, type FileResult, type FileTag, type FileTaxonomy, type FilteredMetadata, type ListBucketsResult, type ListDropsResult, type ListFilesItem, type ListFilesResult, type PresignDedupeResult, type PresignNewResult, type PresignRequest, type PresignResult, type ProfileClusterResult, type ProfileCreateRequest, type ProfileFilesResult, type ProfileResult, type ProfileSignalInput, type ProfileSignalResult, type ProfileSignalType, type ProfileSignalsResponse, type QueuedResult, type ReclusterRequest, type ReclusterResult, type RenameClusterRequest, type ReplaceResult, type SearchFilters, type SearchIncludeField, type SearchResultItem, type SimilarSearchRequest, type SimilarSearchResult, StowError, StowServer, type StowServerConfig, type TaskTriggerResult, type TaxonomyGroup, type TaxonomyListResult, type TaxonomyTerm, type TextSearchRequest, type TransformOptions, type UpdateBucketRequest, type UploadResult, type WhoamiResult };
package/dist/index.d.ts CHANGED
@@ -389,6 +389,8 @@ type FileIncludeField = "tags" | "taxonomies";
389
389
  /** Input payload for text-based semantic search. */
390
390
  interface TextSearchRequest {
391
391
  bucket?: string;
392
+ /** File keys to exclude from results (e.g. already-seen items). Max 500. */
393
+ excludeKeys?: string[];
392
394
  filters?: SearchFilters;
393
395
  include?: SearchIncludeField[];
394
396
  limit?: number;
@@ -457,7 +459,7 @@ interface SimilarSearchRequest {
457
459
  clusterId?: string;
458
460
  /** Blend multiple cluster centroids as query vector. Requires profileId. */
459
461
  clusterIds?: string[];
460
- /** File keys to exclude from results (e.g. already-seen items). Max 200. */
462
+ /** File keys to exclude from results (e.g. already-seen items). Max 500. */
461
463
  excludeKeys?: string[];
462
464
  /** Find files similar to this file key */
463
465
  fileKey?: string;
@@ -480,7 +482,7 @@ interface DiverseSearchRequest {
480
482
  clusterId?: string;
481
483
  /** Blend multiple cluster centroids as query vector. Requires profileId. */
482
484
  clusterIds?: string[];
483
- /** File keys to exclude from results (e.g. already-seen items). Max 200. */
485
+ /** File keys to exclude from results (e.g. already-seen items). Max 500. */
484
486
  excludeKeys?: string[];
485
487
  /** Find diverse files seeded by this file key */
486
488
  fileKey?: string;
@@ -525,8 +527,18 @@ interface SearchResultItem {
525
527
  }>;
526
528
  width?: number | null;
527
529
  }
530
+ /** Which filter categories were active in the request. */
531
+ interface AppliedFilters {
532
+ color?: string[];
533
+ contentType?: string[];
534
+ metadata?: string[];
535
+ tags?: string[];
536
+ taxonomies?: string[];
537
+ taxonomyGroups?: string[];
538
+ }
528
539
  /** Metadata describing server-side filter pruning. */
529
540
  interface FilteredMetadata {
541
+ appliedFilters: AppliedFilters;
530
542
  candidatesScanned: number;
531
543
  requested: number;
532
544
  returned: number;
@@ -542,6 +554,8 @@ interface ColorSearchRequest {
542
554
  bucket?: string;
543
555
  /** Only search the dominant (first) color per file */
544
556
  dominantOnly?: boolean;
557
+ /** File keys to exclude from results (e.g. already-seen items). Max 500. */
558
+ excludeKeys?: string[];
545
559
  /** Target color as hex (e.g. "#FF0000") */
546
560
  hex?: string;
547
561
  /** Max results (default 10, max 50) */
@@ -561,6 +575,7 @@ interface ColorSearchResultItem {
561
575
  colorDistance: number;
562
576
  contentType: string;
563
577
  createdAt: string;
578
+ height: number | null;
564
579
  id: string;
565
580
  key: string;
566
581
  matchedColor: {
@@ -573,11 +588,27 @@ interface ColorSearchResultItem {
573
588
  position: number;
574
589
  proportion: number;
575
590
  };
591
+ width: number | null;
576
592
  }
577
593
  /** Result payload for color similarity search. */
578
594
  interface ColorSearchResult {
579
595
  results: ColorSearchResultItem[];
580
596
  }
597
+ /** A taxonomy term within a group. */
598
+ interface TaxonomyTerm {
599
+ name: string;
600
+ slug: string;
601
+ }
602
+ /** A taxonomy group with its terms. */
603
+ interface TaxonomyGroup {
604
+ name: string;
605
+ slug: string;
606
+ taxonomies: TaxonomyTerm[];
607
+ }
608
+ /** Result payload for taxonomy listing. */
609
+ interface TaxonomyListResult {
610
+ groups: TaxonomyGroup[];
611
+ }
581
612
  /** Server-side SDK client for Stow's API. */
582
613
  declare class StowServer {
583
614
  private readonly apiKey;
@@ -850,6 +881,21 @@ declare class StowServer {
850
881
  removeTag(key: string, tagId: string, options?: {
851
882
  bucket?: string;
852
883
  }): Promise<void>;
884
+ /**
885
+ * Taxonomies namespace for discovering available taxonomy terms.
886
+ *
887
+ * @example
888
+ * ```typescript
889
+ * const { groups } = await stow.taxonomies.list();
890
+ * for (const group of groups) {
891
+ * console.log(group.slug, group.taxonomies.map(t => t.slug));
892
+ * }
893
+ * ```
894
+ */
895
+ get taxonomies(): {
896
+ list: () => Promise<TaxonomyListResult>;
897
+ };
898
+ private listTaxonomies;
853
899
  /**
854
900
  * Search namespace for vector similarity search
855
901
  */
@@ -918,4 +964,4 @@ declare class StowServer {
918
964
  private renameProfileCluster;
919
965
  }
920
966
 
921
- export { type BucketResult, type ColorSearchRequest, type ColorSearchResult, type ColorSearchResultItem, type ConfirmUploadRequest, type CreateBucketRequest, type DeleteProfileSignalsResult, type DiverseSearchRequest, type Drop, type DropResult, type FileColor, type FileColorProfile, type FileIncludeField, type FileResult, type FileTag, type FileTaxonomy, type FilteredMetadata, type ListBucketsResult, type ListDropsResult, type ListFilesItem, type ListFilesResult, type PresignDedupeResult, type PresignNewResult, type PresignRequest, type PresignResult, type ProfileClusterResult, type ProfileCreateRequest, type ProfileFilesResult, type ProfileResult, type ProfileSignalInput, type ProfileSignalResult, type ProfileSignalType, type ProfileSignalsResponse, type QueuedResult, type ReclusterRequest, type ReclusterResult, type RenameClusterRequest, type ReplaceResult, type SearchFilters, type SearchIncludeField, type SearchResultItem, type SimilarSearchRequest, type SimilarSearchResult, StowError, StowServer, type StowServerConfig, type TaskTriggerResult, type TextSearchRequest, type TransformOptions, type UpdateBucketRequest, type UploadResult, type WhoamiResult };
967
+ export { type AppliedFilters, type BucketResult, type ColorSearchRequest, type ColorSearchResult, type ColorSearchResultItem, type ConfirmUploadRequest, type CreateBucketRequest, type DeleteProfileSignalsResult, type DiverseSearchRequest, type Drop, type DropResult, type FileColor, type FileColorProfile, type FileIncludeField, type FileResult, type FileTag, type FileTaxonomy, type FilteredMetadata, type ListBucketsResult, type ListDropsResult, type ListFilesItem, type ListFilesResult, type PresignDedupeResult, type PresignNewResult, type PresignRequest, type PresignResult, type ProfileClusterResult, type ProfileCreateRequest, type ProfileFilesResult, type ProfileResult, type ProfileSignalInput, type ProfileSignalResult, type ProfileSignalType, type ProfileSignalsResponse, type QueuedResult, type ReclusterRequest, type ReclusterResult, type RenameClusterRequest, type ReplaceResult, type SearchFilters, type SearchIncludeField, type SearchResultItem, type SimilarSearchRequest, type SimilarSearchResult, StowError, StowServer, type StowServerConfig, type TaskTriggerResult, type TaxonomyGroup, type TaxonomyListResult, type TaxonomyTerm, type TextSearchRequest, type TransformOptions, type UpdateBucketRequest, type UploadResult, type WhoamiResult };
package/dist/index.js CHANGED
@@ -908,6 +908,28 @@ var StowServer = class {
908
908
  });
909
909
  }
910
910
  // ============================================================
911
+ // TAXONOMIES - Discover taxonomy groups and terms
912
+ // ============================================================
913
+ /**
914
+ * Taxonomies namespace for discovering available taxonomy terms.
915
+ *
916
+ * @example
917
+ * ```typescript
918
+ * const { groups } = await stow.taxonomies.list();
919
+ * for (const group of groups) {
920
+ * console.log(group.slug, group.taxonomies.map(t => t.slug));
921
+ * }
922
+ * ```
923
+ */
924
+ get taxonomies() {
925
+ return {
926
+ list: () => this.listTaxonomies()
927
+ };
928
+ }
929
+ listTaxonomies() {
930
+ return this.request("/api/taxonomies", { method: "GET" });
931
+ }
932
+ // ============================================================
911
933
  // SEARCH - Vector similarity search
912
934
  // ============================================================
913
935
  /**
@@ -969,6 +991,7 @@ var StowServer = class {
969
991
  query: params.query,
970
992
  ...bucket ? { bucket } : {},
971
993
  ...params.limit ? { limit: params.limit } : {},
994
+ ...params.excludeKeys?.length ? { excludeKeys: params.excludeKeys } : {},
972
995
  ...params.filters ? { filters: params.filters } : {},
973
996
  ...params.include?.length ? { include: params.include } : {}
974
997
  })
@@ -984,6 +1007,7 @@ var StowServer = class {
984
1007
  ...params.oklab ? { oklab: params.oklab } : {},
985
1008
  ...bucket ? { bucket } : {},
986
1009
  ...params.limit ? { limit: params.limit } : {},
1010
+ ...params.excludeKeys?.length ? { excludeKeys: params.excludeKeys } : {},
987
1011
  ...params.minProportion !== void 0 ? { minProportion: params.minProportion } : {},
988
1012
  ...params.dominantOnly ? { dominantOnly: params.dominantOnly } : {}
989
1013
  })
package/dist/index.mjs CHANGED
@@ -883,6 +883,28 @@ var StowServer = class {
883
883
  });
884
884
  }
885
885
  // ============================================================
886
+ // TAXONOMIES - Discover taxonomy groups and terms
887
+ // ============================================================
888
+ /**
889
+ * Taxonomies namespace for discovering available taxonomy terms.
890
+ *
891
+ * @example
892
+ * ```typescript
893
+ * const { groups } = await stow.taxonomies.list();
894
+ * for (const group of groups) {
895
+ * console.log(group.slug, group.taxonomies.map(t => t.slug));
896
+ * }
897
+ * ```
898
+ */
899
+ get taxonomies() {
900
+ return {
901
+ list: () => this.listTaxonomies()
902
+ };
903
+ }
904
+ listTaxonomies() {
905
+ return this.request("/api/taxonomies", { method: "GET" });
906
+ }
907
+ // ============================================================
886
908
  // SEARCH - Vector similarity search
887
909
  // ============================================================
888
910
  /**
@@ -944,6 +966,7 @@ var StowServer = class {
944
966
  query: params.query,
945
967
  ...bucket ? { bucket } : {},
946
968
  ...params.limit ? { limit: params.limit } : {},
969
+ ...params.excludeKeys?.length ? { excludeKeys: params.excludeKeys } : {},
947
970
  ...params.filters ? { filters: params.filters } : {},
948
971
  ...params.include?.length ? { include: params.include } : {}
949
972
  })
@@ -959,6 +982,7 @@ var StowServer = class {
959
982
  ...params.oklab ? { oklab: params.oklab } : {},
960
983
  ...bucket ? { bucket } : {},
961
984
  ...params.limit ? { limit: params.limit } : {},
985
+ ...params.excludeKeys?.length ? { excludeKeys: params.excludeKeys } : {},
962
986
  ...params.minProportion !== void 0 ? { minProportion: params.minProportion } : {},
963
987
  ...params.dominantOnly ? { dominantOnly: params.dominantOnly } : {}
964
988
  })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@howells/stow-server",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "Server-side SDK for Stow file storage",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -29,21 +29,21 @@
29
29
  "files": [
30
30
  "dist"
31
31
  ],
32
+ "scripts": {
33
+ "build": "tsup src/index.ts --format cjs,esm --dts",
34
+ "dev": "tsup src/index.ts --format cjs,esm --dts --watch",
35
+ "test": "vitest run",
36
+ "test:watch": "vitest"
37
+ },
32
38
  "peerDependencies": {
33
39
  "zod": "^3.0.0 || ^4.0.0"
34
40
  },
35
41
  "devDependencies": {
42
+ "@stow/typescript-config": "workspace:*",
36
43
  "@types/node": "^25.3.0",
37
44
  "tsup": "^8.5.1",
38
45
  "typescript": "^5.9.3",
39
46
  "vitest": "^4.0.18",
40
- "zod": "^4.3.6",
41
- "@stow/typescript-config": "0.0.0"
42
- },
43
- "scripts": {
44
- "build": "tsup src/index.ts --format cjs,esm --dts",
45
- "dev": "tsup src/index.ts --format cjs,esm --dts --watch",
46
- "test": "vitest run",
47
- "test:watch": "vitest"
47
+ "zod": "^4.3.6"
48
48
  }
49
- }
49
+ }
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 Stow
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.