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.
- package/README.md +3 -3
- package/dist/browser.d.ts +2 -0
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +1 -1
- package/dist/chunks/{task-queue-Ba8S21I6.js → task-queue-C_nUaM2S.js} +202 -21
- package/dist/chunks/task-queue-C_nUaM2S.js.map +1 -0
- package/dist/link/index.d.ts +2 -0
- package/dist/link/index.d.ts.map +1 -1
- package/dist/link/link.query.d.ts +9 -0
- package/dist/link/link.query.d.ts.map +1 -0
- package/dist/node.d.ts +2 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +108 -6
- package/dist/node.js.map +1 -1
- package/dist/shared/feed/feed.query.d.ts.map +1 -1
- package/dist/shared/idea/idea.build.d.ts +35 -0
- package/dist/shared/idea/idea.build.d.ts.map +1 -0
- package/dist/shared/idea/idea.interface.d.ts +23 -0
- package/dist/shared/idea/idea.interface.d.ts.map +1 -0
- package/dist/shared/idea/idea.normalize.d.ts +3 -0
- package/dist/shared/idea/idea.normalize.d.ts.map +1 -0
- package/dist/shared/idea/idea.parse.d.ts +3 -0
- package/dist/shared/idea/idea.parse.d.ts.map +1 -0
- package/dist/shared/idea/idea.query.d.ts +6 -0
- package/dist/shared/idea/idea.query.d.ts.map +1 -0
- package/dist/shared/idea/idea.schema.d.ts +60 -0
- package/dist/shared/idea/idea.schema.d.ts.map +1 -0
- package/dist/shared/idea/index.d.ts +15 -0
- package/dist/shared/idea/index.d.ts.map +1 -0
- package/dist/shared/idea/node/idea.hash.d.ts +3 -0
- package/dist/shared/idea/node/idea.hash.d.ts.map +1 -0
- package/dist/shared/idea/node/idea.locator.d.ts +9 -0
- package/dist/shared/idea/node/idea.locator.d.ts.map +1 -0
- package/dist/shared/idea/node/index.d.ts +3 -0
- package/dist/shared/idea/node/index.d.ts.map +1 -0
- package/dist/shared/media/media.query.d.ts.map +1 -1
- package/dist/shared/review/review.query.d.ts.map +1 -1
- package/dist/shared/utils/config-path.utils.d.ts +1 -1
- package/dist/shared/utils/postgrest.utils.d.ts +1 -1
- package/dist/task/index.d.ts +1 -1
- package/dist/task/local-task-registry.d.ts +1 -1
- package/dist/trigger/trigger.api.d.ts +6 -1
- package/dist/trigger/trigger.api.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/browser.ts +21 -0
- package/src/link/index.ts +2 -0
- package/src/link/link.query.ts +18 -0
- package/src/node.ts +8 -0
- package/src/shared/feed/README.md +1 -1
- package/src/shared/feed/feed.query.ts +2 -7
- package/src/shared/idea/README.md +82 -0
- package/src/shared/idea/VALIDATION-MATRIX.md +69 -0
- package/src/shared/idea/idea.build.ts +160 -0
- package/src/shared/idea/idea.interface.ts +34 -0
- package/src/shared/idea/idea.normalize.ts +17 -0
- package/src/shared/idea/idea.parse.ts +16 -0
- package/src/shared/idea/idea.query.ts +16 -0
- package/src/shared/idea/idea.schema.ts +32 -0
- package/src/shared/idea/index.ts +21 -0
- package/src/shared/idea/node/idea.hash.ts +6 -0
- package/src/shared/idea/node/idea.locator.ts +61 -0
- package/src/shared/idea/node/index.ts +7 -0
- package/src/shared/media/README.md +1 -1
- package/src/shared/media/media.query.ts +2 -7
- package/src/shared/review/review.query.ts +2 -7
- package/src/shared/utils/config-path.utils.ts +1 -1
- package/src/shared/utils/postgrest.utils.ts +1 -1
- package/src/task/index.ts +1 -1
- package/src/task/local-task-registry.ts +1 -1
- package/src/trigger/trigger.api.ts +6 -1
- package/dist/chunks/task-queue-Ba8S21I6.js.map +0 -1
- package/dist/resource/resource.interface.d.ts +0 -20
- package/dist/resource/resource.interface.d.ts.map +0 -1
- package/dist/task/task.utils.d.ts +0 -1
- package/dist/task/task.utils.d.ts.map +0 -1
- package/src/resource/resource.interface.ts +0 -37
- 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,
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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,
|
|
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,
|
|
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/
|
|
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
|
/**
|
package/dist/task/index.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|
-
/**
|
|
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
|
|
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
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/
|
|
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 {
|
|
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
|
-
|
|
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) |
|