target-supabase-sdk 0.2.23 → 0.2.24

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 (77) hide show
  1. package/README.md +3 -3
  2. package/dist/browser.d.ts +2 -0
  3. package/dist/browser.d.ts.map +1 -1
  4. package/dist/browser.js +1 -1
  5. package/dist/chunks/{task-queue-Ba8S21I6.js → task-queue-C_nUaM2S.js} +202 -21
  6. package/dist/chunks/task-queue-C_nUaM2S.js.map +1 -0
  7. package/dist/link/index.d.ts +2 -0
  8. package/dist/link/index.d.ts.map +1 -1
  9. package/dist/link/link.query.d.ts +9 -0
  10. package/dist/link/link.query.d.ts.map +1 -0
  11. package/dist/node.d.ts +2 -0
  12. package/dist/node.d.ts.map +1 -1
  13. package/dist/node.js +108 -6
  14. package/dist/node.js.map +1 -1
  15. package/dist/shared/feed/feed.query.d.ts.map +1 -1
  16. package/dist/shared/idea/idea.build.d.ts +35 -0
  17. package/dist/shared/idea/idea.build.d.ts.map +1 -0
  18. package/dist/shared/idea/idea.interface.d.ts +23 -0
  19. package/dist/shared/idea/idea.interface.d.ts.map +1 -0
  20. package/dist/shared/idea/idea.normalize.d.ts +3 -0
  21. package/dist/shared/idea/idea.normalize.d.ts.map +1 -0
  22. package/dist/shared/idea/idea.parse.d.ts +3 -0
  23. package/dist/shared/idea/idea.parse.d.ts.map +1 -0
  24. package/dist/shared/idea/idea.query.d.ts +6 -0
  25. package/dist/shared/idea/idea.query.d.ts.map +1 -0
  26. package/dist/shared/idea/idea.schema.d.ts +60 -0
  27. package/dist/shared/idea/idea.schema.d.ts.map +1 -0
  28. package/dist/shared/idea/index.d.ts +15 -0
  29. package/dist/shared/idea/index.d.ts.map +1 -0
  30. package/dist/shared/idea/node/idea.hash.d.ts +3 -0
  31. package/dist/shared/idea/node/idea.hash.d.ts.map +1 -0
  32. package/dist/shared/idea/node/idea.locator.d.ts +9 -0
  33. package/dist/shared/idea/node/idea.locator.d.ts.map +1 -0
  34. package/dist/shared/idea/node/index.d.ts +3 -0
  35. package/dist/shared/idea/node/index.d.ts.map +1 -0
  36. package/dist/shared/media/media.query.d.ts.map +1 -1
  37. package/dist/shared/review/review.query.d.ts.map +1 -1
  38. package/dist/shared/utils/config-path.utils.d.ts +1 -1
  39. package/dist/shared/utils/postgrest.utils.d.ts +1 -1
  40. package/dist/task/index.d.ts +1 -1
  41. package/dist/task/local-task-registry.d.ts +1 -1
  42. package/dist/trigger/trigger.api.d.ts +6 -1
  43. package/dist/trigger/trigger.api.d.ts.map +1 -1
  44. package/package.json +1 -1
  45. package/src/browser.ts +21 -0
  46. package/src/link/index.ts +2 -0
  47. package/src/link/link.query.ts +18 -0
  48. package/src/node.ts +8 -0
  49. package/src/shared/feed/README.md +1 -1
  50. package/src/shared/feed/feed.query.ts +2 -7
  51. package/src/shared/idea/README.md +82 -0
  52. package/src/shared/idea/VALIDATION-MATRIX.md +69 -0
  53. package/src/shared/idea/idea.build.ts +160 -0
  54. package/src/shared/idea/idea.interface.ts +34 -0
  55. package/src/shared/idea/idea.normalize.ts +17 -0
  56. package/src/shared/idea/idea.parse.ts +16 -0
  57. package/src/shared/idea/idea.query.ts +16 -0
  58. package/src/shared/idea/idea.schema.ts +32 -0
  59. package/src/shared/idea/index.ts +21 -0
  60. package/src/shared/idea/node/idea.hash.ts +6 -0
  61. package/src/shared/idea/node/idea.locator.ts +61 -0
  62. package/src/shared/idea/node/index.ts +7 -0
  63. package/src/shared/media/README.md +1 -1
  64. package/src/shared/media/media.query.ts +2 -7
  65. package/src/shared/review/review.query.ts +2 -7
  66. package/src/shared/utils/config-path.utils.ts +1 -1
  67. package/src/shared/utils/postgrest.utils.ts +1 -1
  68. package/src/task/index.ts +1 -1
  69. package/src/task/local-task-registry.ts +1 -1
  70. package/src/trigger/trigger.api.ts +6 -1
  71. package/dist/chunks/task-queue-Ba8S21I6.js.map +0 -1
  72. package/dist/resource/resource.interface.d.ts +0 -20
  73. package/dist/resource/resource.interface.d.ts.map +0 -1
  74. package/dist/task/task.utils.d.ts +0 -1
  75. package/dist/task/task.utils.d.ts.map +0 -1
  76. package/src/resource/resource.interface.ts +0 -37
  77. package/src/task/task.utils.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"feed.query.d.ts","sourceRoot":"","sources":["../../../src/shared/feed/feed.query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,+EAA+E;AAC/E,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,WAAW,EAAE,CAO7F"}
1
+ {"version":3,"file":"feed.query.d.ts","sourceRoot":"","sources":["../../../src/shared/feed/feed.query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,+EAA+E;AAC/E,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,WAAW,EAAE,CAE7F"}
@@ -0,0 +1,35 @@
1
+ import type { TargetDraft } from "../../core.interface";
2
+ import type { Link } from "../../link/link.interface";
3
+ export interface BuildIdeaLinkDraftInput {
4
+ /** Article title — Link.name (not used for image ideas). */
5
+ name: string;
6
+ /** Body or image content hash — `details.original.content`. */
7
+ content: string;
8
+ reviewList?: readonly string[];
9
+ url?: string;
10
+ heat?: number;
11
+ tagList?: readonly string[];
12
+ description?: string;
13
+ preview?: string;
14
+ }
15
+ export interface BuildIdeaImageLinkDraftInput {
16
+ /** SHA-256 hex of image bytes — stored in `details.original.content`. */
17
+ contentHash: string;
18
+ /** Temp download or other absolute URL — `details.original.url`. */
19
+ url: string;
20
+ heat?: number;
21
+ tagList?: readonly string[];
22
+ description?: string;
23
+ preview?: string;
24
+ }
25
+ /**
26
+ * Assemble a text idea {@link Link} draft (`category=link`, `loaderKey === value === "idea"`).
27
+ * Does not write to Supabase or enforce title uniqueness.
28
+ */
29
+ export declare function buildIdeaLinkDraft(input: BuildIdeaLinkDraftInput): TargetDraft<Link>;
30
+ /**
31
+ * Assemble a clipboard-image idea Link (`name=idea.image`, `value=idea`).
32
+ * Caller stores bytes and supplies hash + temp URL; no dedup by content hash.
33
+ */
34
+ export declare function buildIdeaImageLinkDraft(input: BuildIdeaImageLinkDraftInput): TargetDraft<Link>;
35
+ //# sourceMappingURL=idea.build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idea.build.d.ts","sourceRoot":"","sources":["../../../src/shared/idea/idea.build.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AAUtD,MAAM,WAAW,uBAAuB;IACpC,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,4BAA4B;IACzC,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAuCD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,WAAW,CAAC,IAAI,CAAC,CAsCpF;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,4BAA4B,GAAG,WAAW,CAAC,IAAI,CAAC,CAsC9F"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Idea Link protocol — Link rows with `value` / `loaderKey` === {@link IDEA_LINK_VALUE}.
3
+ * Clipboard images use fixed `name` {@link IDEA_IMAGE_LINK_NAME} (not a separate value).
4
+ */
5
+ export declare const IDEA_LINK_VALUE: "idea";
6
+ /** Discriminator stored in both `Link.value` and `details.loaderKey`. */
7
+ export type IdeaLinkValue = typeof IDEA_LINK_VALUE;
8
+ /** Link.name for clipboard-image ideas (distinct from title-based text ideas). */
9
+ export declare const IDEA_IMAGE_LINK_NAME: "idea.image";
10
+ /** Default tag for raw captures (quick-note, paste-image). Leading `.` = system tag. */
11
+ export declare const IDEA_IMAGE_TAG_RAW: ".raw";
12
+ /** Temp sandbox prefix for pasted images (`TEMP_FS_ROOT` on upload-service). */
13
+ export declare const IDEA_IMAGE_TEMP_DIR: "idea/paste";
14
+ /** `Link.details.original` for idea Links (text and image). */
15
+ export interface IdeaOriginal {
16
+ content: string;
17
+ reviewList: string[];
18
+ url: string;
19
+ heat: number;
20
+ }
21
+ export declare function isIdeaLinkValue(value: string): value is IdeaLinkValue;
22
+ export declare function isIdeaImageLinkName(name: string): boolean;
23
+ //# sourceMappingURL=idea.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idea.interface.d.ts","sourceRoot":"","sources":["../../../src/shared/idea/idea.interface.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,eAAe,EAAG,MAAe,CAAC;AAE/C,yEAAyE;AACzE,MAAM,MAAM,aAAa,GAAG,OAAO,eAAe,CAAC;AAEnD,kFAAkF;AAClF,eAAO,MAAM,oBAAoB,EAAG,YAAqB,CAAC;AAE1D,wFAAwF;AACxF,eAAO,MAAM,kBAAkB,EAAG,MAAe,CAAC;AAElD,gFAAgF;AAChF,eAAO,MAAM,mBAAmB,EAAG,YAAqB,CAAC;AAEzD,+DAA+D;AAC/D,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,aAAa,CAErE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD"}
@@ -0,0 +1,3 @@
1
+ /** Trim, dedupe, and drop empty strings from tag/review lists. */
2
+ export declare function normalizeStringList(raw: readonly string[] | undefined | null): string[];
3
+ //# sourceMappingURL=idea.normalize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idea.normalize.d.ts","sourceRoot":"","sources":["../../../src/shared/idea/idea.normalize.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,EAAE,CAevF"}
@@ -0,0 +1,3 @@
1
+ import type { IdeaOriginal } from "./idea.interface";
2
+ export declare function parseIdeaOriginal(original: unknown): IdeaOriginal | null;
3
+ //# sourceMappingURL=idea.parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idea.parse.d.ts","sourceRoot":"","sources":["../../../src/shared/idea/idea.parse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIrD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,GAAG,YAAY,GAAG,IAAI,CAWxE"}
@@ -0,0 +1,6 @@
1
+ import type { QueryFilter } from "../../core.interface";
2
+ /** List/get filters: `category=link` and `value=idea` (do not filter on `details.loaderKey`). */
3
+ export declare function ideaLinkValueFilters(): QueryFilter[];
4
+ /** Clipboard-image ideas only (`name=idea.image`). */
5
+ export declare function ideaImageLinkFilters(): QueryFilter[];
6
+ //# sourceMappingURL=idea.query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idea.query.d.ts","sourceRoot":"","sources":["../../../src/shared/idea/idea.query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAIxD,iGAAiG;AACjG,wBAAgB,oBAAoB,IAAI,WAAW,EAAE,CAKpD;AAED,sDAAsD;AACtD,wBAAgB,oBAAoB,IAAI,WAAW,EAAE,CAEpD"}
@@ -0,0 +1,60 @@
1
+ import { z } from "zod";
2
+ /** Runtime shape of `Link.details.original` for value=idea. */
3
+ export declare const ideaOriginalSchema: z.ZodObject<{
4
+ content: z.ZodString;
5
+ reviewList: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
6
+ url: z.ZodDefault<z.ZodString>;
7
+ heat: z.ZodDefault<z.ZodNumber>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ url: string;
10
+ content: string;
11
+ reviewList: string[];
12
+ heat: number;
13
+ }, {
14
+ content: string;
15
+ url?: string | undefined;
16
+ reviewList?: string[] | undefined;
17
+ heat?: number | undefined;
18
+ }>;
19
+ /** HTTP / API create body limits (upload-service `POST /v0/upload/idea`). */
20
+ export declare const ideaCreateSchema: z.ZodObject<{
21
+ name: z.ZodString;
22
+ content: z.ZodString;
23
+ reviewList: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
24
+ url: z.ZodDefault<z.ZodString>;
25
+ tagList: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
26
+ }, "strip", z.ZodTypeAny, {
27
+ name: string;
28
+ tagList: string[];
29
+ url: string;
30
+ content: string;
31
+ reviewList: string[];
32
+ }, {
33
+ name: string;
34
+ content: string;
35
+ tagList?: string[] | undefined;
36
+ url?: string | undefined;
37
+ reviewList?: string[] | undefined;
38
+ }>;
39
+ export type IdeaCreateSchemaInput = z.infer<typeof ideaCreateSchema>;
40
+ export declare const ideaUpdateSchema: z.ZodObject<{
41
+ name: z.ZodOptional<z.ZodString>;
42
+ content: z.ZodOptional<z.ZodString>;
43
+ reviewList: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
44
+ url: z.ZodOptional<z.ZodString>;
45
+ tagList: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
46
+ }, "strip", z.ZodTypeAny, {
47
+ name?: string | undefined;
48
+ tagList?: string[] | undefined;
49
+ url?: string | undefined;
50
+ content?: string | undefined;
51
+ reviewList?: string[] | undefined;
52
+ }, {
53
+ name?: string | undefined;
54
+ tagList?: string[] | undefined;
55
+ url?: string | undefined;
56
+ content?: string | undefined;
57
+ reviewList?: string[] | undefined;
58
+ }>;
59
+ export type IdeaUpdateSchemaInput = z.infer<typeof ideaUpdateSchema>;
60
+ //# sourceMappingURL=idea.schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idea.schema.d.ts","sourceRoot":"","sources":["../../../src/shared/idea/idea.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,+DAA+D;AAC/D,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;EAK7B,CAAC;AAIH,6EAA6E;AAC7E,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;EAM3B,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAErE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;EAM3B,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Idea Link — browser-safe public barrel only.
3
+ *
4
+ * Node-only code lives in `./node/` and is exported from `src/node.ts`.
5
+ */
6
+ export type { BuildIdeaImageLinkDraftInput, BuildIdeaLinkDraftInput } from "./idea.build";
7
+ export { buildIdeaImageLinkDraft, buildIdeaLinkDraft } from "./idea.build";
8
+ export type { IdeaOriginal } from "./idea.interface";
9
+ export { IDEA_IMAGE_LINK_NAME, IDEA_IMAGE_TAG_RAW, IDEA_IMAGE_TEMP_DIR, IDEA_LINK_VALUE, isIdeaImageLinkName, } from "./idea.interface";
10
+ export { normalizeStringList } from "./idea.normalize";
11
+ export { parseIdeaOriginal } from "./idea.parse";
12
+ export { ideaLinkValueFilters } from "./idea.query";
13
+ export type { IdeaCreateSchemaInput, IdeaUpdateSchemaInput } from "./idea.schema";
14
+ export { ideaCreateSchema, ideaUpdateSchema } from "./idea.schema";
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/idea/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,4BAA4B,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC1F,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC3E,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EACH,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,mBAAmB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,YAAY,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** SHA-256 hex of image bytes (filename + `details.original.content` for paste-image ideas). */
2
+ export declare function hashIdeaPasteImage(buffer: Buffer): string;
3
+ //# sourceMappingURL=idea.hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idea.hash.d.ts","sourceRoot":"","sources":["../../../../src/shared/idea/node/idea.hash.ts"],"names":[],"mappings":"AAEA,gGAAgG;AAChG,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEzD"}
@@ -0,0 +1,9 @@
1
+ /** Path suffix on upload-service public URL for temp file download. */
2
+ export declare const IDEA_TEMP_DOWNLOAD_PATH_SUFFIX = "/v0/upload/temp/download";
3
+ /** Flat path under temp sandbox: `idea/paste/{sha256}.{ext}`. */
4
+ export declare function buildIdeaPasteRelativePath(contentHash: string, ext: string): string;
5
+ /** Build absolute locator stored in `details.original.url`. */
6
+ export declare function buildIdeaTempDownloadLocator(relativePath: string, publicBaseUrl: string): string;
7
+ /** Parse temp download URL → sandbox-relative path, or null when not a temp download URL. */
8
+ export declare function parseIdeaTempDownloadLocator(locator: string): string | null;
9
+ //# sourceMappingURL=idea.locator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idea.locator.d.ts","sourceRoot":"","sources":["../../../../src/shared/idea/node/idea.locator.ts"],"names":[],"mappings":"AAEA,uEAAuE;AACvE,eAAO,MAAM,8BAA8B,6BAA6B,CAAC;AAEzE,iEAAiE;AACjE,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAOnF;AAUD,+DAA+D;AAC/D,wBAAgB,4BAA4B,CAAC,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAShG;AAED,6FAA6F;AAC7F,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwB3E"}
@@ -0,0 +1,3 @@
1
+ export { hashIdeaPasteImage } from "./idea.hash";
2
+ export { buildIdeaPasteRelativePath, buildIdeaTempDownloadLocator, IDEA_TEMP_DOWNLOAD_PATH_SUFFIX, parseIdeaTempDownloadLocator, } from "./idea.locator";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/shared/idea/node/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EACH,0BAA0B,EAC1B,4BAA4B,EAC5B,8BAA8B,EAC9B,4BAA4B,GAC/B,MAAM,gBAAgB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"media.query.d.ts","sourceRoot":"","sources":["../../../src/shared/media/media.query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,+EAA+E;AAC/E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,WAAW,EAAE,CAO/F"}
1
+ {"version":3,"file":"media.query.d.ts","sourceRoot":"","sources":["../../../src/shared/media/media.query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,+EAA+E;AAC/E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,WAAW,EAAE,CAE/F"}
@@ -1 +1 @@
1
- {"version":3,"file":"review.query.d.ts","sourceRoot":"","sources":["../../../src/shared/review/review.query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAIxD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAOrE"}
1
+ {"version":3,"file":"review.query.d.ts","sourceRoot":"","sources":["../../../src/shared/review/review.query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAIxD;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAErE"}
@@ -8,7 +8,7 @@ export declare function getConfigFileDir(configFilePath: string): string;
8
8
  * - Absolute `pathInConfig` → returned as-is
9
9
  * - Relative `pathInConfig` → `resolve(dirname(configFilePath), pathInConfig)`
10
10
  *
11
- * **Not** relative to `process.cwd()`. See `.cursor/skills/config-file-relative-paths/SKILL.md`.
11
+ * **Not** relative to `process.cwd()`. See `.cursor/skills/task-local-discovery/SKILL.md`.
12
12
  */
13
13
  export declare function resolvePathFromConfigFile(configFilePath: string, pathInConfig: string): string;
14
14
  /**
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * PostgREST / Supabase JS client helpers for `target` table filters.
3
3
  *
4
- * @see `.cursor/skills/postgrest-query-filters/SKILL.md`
4
+ * @see `.cursor/skills/target-list-query/SKILL.md`
5
5
  */
6
6
  /**
7
7
  * Escape `%`, `_`, and `\` for PostgREST `ilike` patterns.
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Task domain public API — curated re-exports only.
3
- * Internal modules (local-task-registry, task-repo-context, task.utils) stay private.
3
+ * Internal modules (local-task-registry, task-repo-context) stay private.
4
4
  */
5
5
  export type { PatchChangeTaskStatusPayload, PatchClaimTaskPayload, PatchTaskProgressPayload, } from "./task.api";
6
6
  export { patchChangeTaskStatus, patchChangeTaskStatusSchema, patchClaimTask, patchClaimTaskSchema, patchTaskProgress, patchTaskProgressSchema, } from "./task.api";
@@ -25,7 +25,7 @@ export interface BootstrapLocalTasksOptions {
25
25
  * ./tasks/my-task/index.mjs
26
26
  * ```
27
27
  *
28
- * `taskDir` / `entry` paths are relative to **their config file's directory** (see config-file-relative-paths skill).
28
+ * `taskDir` / `entry` paths are relative to **their config file's directory** (see task-local-discovery skill).
29
29
  *
30
30
  * Legacy fallback: `./task.config.js` at project root (`taskDir: "./tasks"`).
31
31
  */
@@ -103,7 +103,12 @@ export declare const patchTriggerFiredSchema: z.ZodObject<{
103
103
  expectedLastFireKey?: string | null | undefined;
104
104
  }>;
105
105
  export type PatchTriggerFiredPayload = z.infer<typeof patchTriggerFiredSchema>;
106
- /** List all ENABLED triggers (Phase 1: in-memory due check). */
106
+ /**
107
+ * List all ENABLED triggers. Due-check is in-memory on the caller:
108
+ * filter with `isTriggerDue`, then `patchTriggerFired` with `buildFireKey`
109
+ * (both from `trigger.utils`, exported on `/node`).
110
+ * Do not call this from TriggerNode (local interval runners only).
111
+ */
107
112
  export declare const scanEnabledTriggers: (payload: {
108
113
  traceId?: string | undefined;
109
114
  }) => SupabaseResponse<Trigger[]> | Promise<SupabaseResponse<Trigger[]>>;
@@ -1 +1 @@
1
- {"version":3,"file":"trigger.api.d.ts","sourceRoot":"","sources":["../../src/trigger/trigger.api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE5E,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAEH,KAAK,OAAO,EAGZ,aAAa,EAChB,MAAM,qBAAqB,CAAC;AAoB7B,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQ5B,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEnE,eAAO,MAAM,yBAAyB;;;;;;EAEpC,CAAC;AAEH,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAEnF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;EAKlC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAM/E,gEAAgE;AAChE,eAAO,MAAM,mBAAmB;;wEAwB9B,CAAC;AAEH,gDAAgD;AAChD,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;oEAgCtB,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;oEAqC5B,CAAC"}
1
+ {"version":3,"file":"trigger.api.d.ts","sourceRoot":"","sources":["../../src/trigger/trigger.api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE5E,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAEH,KAAK,OAAO,EAGZ,aAAa,EAChB,MAAM,qBAAqB,CAAC;AAoB7B,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQ5B,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEnE,eAAO,MAAM,yBAAyB;;;;;;EAEpC,CAAC;AAEH,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAEnF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;EAKlC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAM/E;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB;;wEAwB9B,CAAC;AAEH,gDAAgD;AAChD,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;oEAgCtB,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;oEAqC5B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "target-supabase-sdk",
3
- "version": "0.2.23",
3
+ "version": "0.2.24",
4
4
  "description": "Supabase client initializer and data access APIs",
5
5
  "license": "MIT",
6
6
  "author": "KyLoc20",
package/src/browser.ts CHANGED
@@ -204,6 +204,27 @@ export {
204
204
  isRetryableHttpStatus,
205
205
  requestHasBody,
206
206
  } from "./shared/http/fetch-retry";
207
+ export type {
208
+ BuildIdeaImageLinkDraftInput,
209
+ BuildIdeaLinkDraftInput,
210
+ IdeaCreateSchemaInput,
211
+ IdeaOriginal,
212
+ IdeaUpdateSchemaInput,
213
+ } from "./shared/idea";
214
+ export {
215
+ buildIdeaImageLinkDraft,
216
+ buildIdeaLinkDraft,
217
+ IDEA_IMAGE_LINK_NAME,
218
+ IDEA_IMAGE_TAG_RAW,
219
+ IDEA_IMAGE_TEMP_DIR,
220
+ IDEA_LINK_VALUE,
221
+ ideaCreateSchema,
222
+ ideaLinkValueFilters,
223
+ ideaUpdateSchema,
224
+ isIdeaImageLinkName,
225
+ normalizeStringList,
226
+ parseIdeaOriginal,
227
+ } from "./shared/idea";
207
228
  export type {
208
229
  CreateLoggerInput,
209
230
  DecodedLogBatch,
package/src/link/index.ts CHANGED
@@ -8,3 +8,5 @@ export type { LinkTargetDraftBuildInput } from "./link.build";
8
8
  export { buildLinkTargetDraft, LINK_MANIFEST_VERSION, linkTargetDraftBuildInputSchema } from "./link.build";
9
9
  export type { Link, LinkDetails } from "./link.interface";
10
10
  export { CategoryLink } from "./link.interface";
11
+ export type { LinkDedupFiltersInput } from "./link.query";
12
+ export { linkDedupFilters } from "./link.query";
@@ -0,0 +1,18 @@
1
+ import type { QueryFilter } from "../core.interface";
2
+ import { CategoryLink } from "./link.interface";
3
+
4
+ /** Dedup / lookup key: `category=link` + `value` + `name`. */
5
+ export type LinkDedupFiltersInput = {
6
+ value: string;
7
+ name: string;
8
+ };
9
+
10
+ /** Shared Link filters used by feed, media, and review query helpers. */
11
+ export function linkDedupFilters(input: LinkDedupFiltersInput): QueryFilter[] {
12
+ const name = input.name.trim();
13
+ return [
14
+ { field: "category", operator: "eq", value: CategoryLink.LINK },
15
+ { field: "value", operator: "eq", value: input.value },
16
+ { field: "name", operator: "eq", value: name },
17
+ ];
18
+ }
package/src/node.ts CHANGED
@@ -176,6 +176,13 @@ export {
176
176
  isFeedIngestSource,
177
177
  registerFeed,
178
178
  } from "./shared/feed/node";
179
+ export {
180
+ buildIdeaPasteRelativePath,
181
+ buildIdeaTempDownloadLocator,
182
+ hashIdeaPasteImage,
183
+ IDEA_TEMP_DOWNLOAD_PATH_SUFFIX,
184
+ parseIdeaTempDownloadLocator,
185
+ } from "./shared/idea/node";
179
186
  export { runCollectLogTick } from "./shared/log/spool/collector";
180
187
  export { LOG_SPOOL_SERVICE_ID_ENV } from "./shared/log/spool/config";
181
188
  export type { LogSpoolCoordinator, LogSpoolCoordinatorOptions } from "./shared/log/spool/coordinator";
@@ -289,5 +296,6 @@ export type {
289
296
  TriggerRunnerFn,
290
297
  } from "./trigger/trigger.interface";
291
298
  export * from "./trigger/trigger.interface";
299
+ export { buildDailyFireKey, buildFireKey, isDailyScheduleDue, isTriggerDue } from "./trigger/trigger.utils";
292
300
  export { TriggerManager } from "./trigger/trigger-manager";
293
301
  export { TriggerNode } from "./trigger/trigger-node";
@@ -159,6 +159,6 @@ Same variable as media register — see `src/shared/media/README.md`.
159
159
 
160
160
  ## Related
161
161
 
162
- - `.cursor/skills/feed-link/SKILL.md`
162
+ - `.cursor/skills/link-conventions/SKILL.md`
163
163
  - Media register pattern: `src/shared/media/README.md`
164
164
  - Optimistic lock: `.cursor/skills/optimistic-lock-update/SKILL.md`
@@ -1,13 +1,8 @@
1
1
  import type { QueryFilter } from "../../core.interface";
2
- import { CategoryLink } from "../../link/link.interface";
2
+ import { linkDedupFilters } from "../../link/link.query";
3
3
  import type { FeedValue } from "./feed.interface";
4
4
 
5
5
  /** Dedup key: `category=link` + `value` + `name` (matches register / find). */
6
6
  export function feedLinkDedupFilters(input: { value: FeedValue; name: string }): QueryFilter[] {
7
- const name = input.name.trim();
8
- return [
9
- { field: "category", operator: "eq", value: CategoryLink.LINK },
10
- { field: "value", operator: "eq", value: input.value },
11
- { field: "name", operator: "eq", value: name },
12
- ];
7
+ return linkDedupFilters(input);
13
8
  }
@@ -0,0 +1,82 @@
1
+ # Idea Links (`shared/idea`)
2
+
3
+ Ideas are a **convention on `Link`**, not a new Target category (`category` stays `link`).
4
+
5
+ ```text
6
+ src/shared/idea/
7
+ index.ts ← browser-safe barrel ONLY (never export ./node)
8
+ idea.interface.ts
9
+ idea.schema.ts
10
+ idea.build.ts
11
+ idea.normalize.ts
12
+ idea.parse.ts
13
+ idea.query.ts
14
+ README.md
15
+ VALIDATION-MATRIX.md
16
+ node/ ← Node-only (hash + temp download URL helpers)
17
+ index.ts
18
+ idea.hash.ts
19
+ idea.locator.ts
20
+ ```
21
+
22
+ ## Variants
23
+
24
+ | Kind | `value` | `name` | `original.content` | `original.url` |
25
+ |------|---------|--------|--------------------|----------------|
26
+ | Text note | `idea` | Title (caller) | Body text | Source page URL, etc. |
27
+ | Clipboard image | `idea` | **`idea.image`** (fixed) | SHA-256 hex of bytes | Temp download URL |
28
+
29
+ Filter rows with **`value=idea`** only — do not query `details.loaderKey`. When assembling drafts, set **`loaderKey === value === "idea"`**.
30
+
31
+ There is **no content-hash dedup** for image ideas.
32
+
33
+ ## Package entry split
34
+
35
+ | Consumer import | What you get | Source |
36
+ |-----------------|--------------|--------|
37
+ | `from "target-supabase-sdk"` | Draft builders, schemas, parse, list filters | `shared/idea/index.ts` → `browser.ts` |
38
+ | `from "target-supabase-sdk/node"` | + `hashIdeaPasteImage`, temp download locators | `shared/idea/node/` → `node.ts` |
39
+
40
+ **Do not** re-export `./node` from `index.ts` / `browser.ts`.
41
+
42
+ ```typescript
43
+ import {
44
+ buildIdeaLinkDraft,
45
+ buildIdeaImageLinkDraft,
46
+ ideaLinkValueFilters,
47
+ IDEA_LINK_VALUE,
48
+ IDEA_IMAGE_LINK_NAME,
49
+ ideaCreateSchema,
50
+ parseIdeaOriginal,
51
+ } from "target-supabase-sdk";
52
+
53
+ import {
54
+ hashIdeaPasteImage,
55
+ buildIdeaTempDownloadLocator,
56
+ buildIdeaPasteRelativePath,
57
+ } from "target-supabase-sdk/node";
58
+ ```
59
+
60
+ Quick-note (chrome extension) should wrap `buildIdeaLinkDraft` **locally** with extension tags — not via a dedicated SDK export.
61
+
62
+ ---
63
+
64
+ ## Link field rules
65
+
66
+ | Field | Rule |
67
+ |-------|------|
68
+ | `value` | Always `idea` |
69
+ | `details.loaderKey` | Always `idea` |
70
+ | Text `name` | Title; max 500; must not be `idea.image` |
71
+ | Image `name` | Fixed `idea.image` via `buildIdeaImageLinkDraft` |
72
+ | `description` / `preview` | Default `""` |
73
+ | `tagList` | User/system tags; image default `[ ".raw" ]` |
74
+
75
+ See [VALIDATION-MATRIX.md](./VALIDATION-MATRIX.md) for limits across Zod, builders, and HTTP.
76
+
77
+ ---
78
+
79
+ ## Related
80
+
81
+ - upload-service: `.cursor/skills/idea-link/SKILL.md`
82
+ - `.cursor/skills/link-conventions/SKILL.md`
@@ -0,0 +1,69 @@
1
+ # Idea Link validation matrix
2
+
3
+ Single reference for **where** each constraint is enforced. Limits match upload-service `POST/PATCH /v0/upload/idea` and paste-image behavior.
4
+
5
+ Legend: **Z** = `ideaOriginalSchema` / `ideaCreateSchema` / `ideaUpdateSchema` (Zod); **B** = `buildIdeaLinkDraft` / `buildIdeaImageLinkDraft`; **H** = upload-service HTTP handler (Zod on request body); **P** = paste-image route (MIME, size, empty buffer).
6
+
7
+ ## Row identity
8
+
9
+ | Rule | Z | B | H | Notes |
10
+ |------|---|---|---|-------|
11
+ | `category=link` | — | — | — | Set by `createTarget` / SDK category, not in draft builder |
12
+ | `value=idea` | — | ✓ | — | Fixed in builders |
13
+ | `loaderKey=idea` | — | ✓ | — | Same as `value` |
14
+ | Text `name` non-empty | ✓ create | ✓ | ✓ | `ideaCreateSchema` / builder |
15
+ | Text `name` max 500 | ✓ create/update | ✓ | ✓ | |
16
+ | Text `name` ≠ `idea.image` | — | ✓ | — | Use `buildIdeaImageLinkDraft` for images |
17
+ | Image `name=idea.image` | — | ✓ | — | Fixed in `buildIdeaImageLinkDraft` |
18
+ | No title uniqueness / dedup | — | — | — | By design |
19
+
20
+ ## `details.original`
21
+
22
+ | Field | Z | B | H | Limit / rule |
23
+ |-------|---|---|---|----------------|
24
+ | `content` | ✓ min 1, max 100_000 | ✓ same | ✓ create/update | Text body or image SHA-256 hex |
25
+ | `reviewList` | ✓ max 32 items, each 1–8000 | ✓ | ✓ | Normalized (trim, dedupe) |
26
+ | `url` | ✓ max 2000, default `""` | ✓ | ✓ | Image: temp download URL required in builder |
27
+ | `heat` | ✓ int ≥ 0, default 0 | ✓ floor 0 | — | PATCH +1 is upload-service only |
28
+ | Image `reviewList` | — | ✓ `[]` | — | Builder fixed |
29
+ | Image `heat` | — | ✓ `0` | — | Builder fixed |
30
+
31
+ ## `tagList`
32
+
33
+ | Rule | Z create | B text | B image | Notes |
34
+ |------|----------|--------|---------|-------|
35
+ | Max 32 tags | ✓ | ✓ | ✓ | |
36
+ | Each tag 1–128 chars | ✓ | ✓ | — | Builder checks length on text tags |
37
+ | Default image tags | — | — | ✓ `[ ".raw" ]` if omitted | |
38
+ | Quick-note `.raw` | — | — | — | Extension local wrapper only |
39
+
40
+ ## Paste-image (bytes → Link)
41
+
42
+ | Rule | P | B image | Node hash/locator |
43
+ |------|---|---------|-------------------|
44
+ | MIME whitelist | ✓ | — | — |
45
+ | Non-empty buffer | ✓ | — | — |
46
+ | Max file size | ✓ `TEMP_FS_MAX_FILE_SIZE` | — | — |
47
+ | Optional paste `content` field | — | — | upload-service: caption → `original.content`; empty → hash |
48
+ | Content hash (file path) | — | — | `hashIdeaPasteImage` + `buildIdeaPasteRelativePath` |
49
+ | Stored `original.content` | ✓ min 1 | ✓ | user text or hash fallback |
50
+ | Temp path `idea/paste/{hash}.{ext}` | — | — | `buildIdeaPasteRelativePath` |
51
+ | `original.url` temp download | — | ✓ non-empty URL | `buildIdeaTempDownloadLocator` |
52
+ | Content-hash dedup before create | — | — | **Not implemented** |
53
+
54
+ ## Query / read
55
+
56
+ | Rule | SDK | upload-service |
57
+ |------|-----|----------------|
58
+ | Filter by `value=idea` | `ideaLinkValueFilters` | list/get/delete |
59
+ | Image-only list | `ideaImageLinkFilters` | `linkName=idea.image` |
60
+ | Parse row `original` | `parseIdeaOriginal` | `toIdeaView` throws if invalid |
61
+ | Search `name` / `content` ilike | — | list API only |
62
+
63
+ ## Error style
64
+
65
+ | Layer | Behavior |
66
+ |-------|----------|
67
+ | Zod (H / optional client) | Field errors in HTTP 400 |
68
+ | `buildIdea*Draft` | `throw new Error("buildIdeaLinkDraft: …")` |
69
+ | `parseIdeaOriginal` | Returns `null` (no throw) |