target-supabase-sdk 0.1.7 → 0.1.9

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 (171) hide show
  1. package/README.md +8 -6
  2. package/dist/auth/auth.api.d.ts.map +1 -1
  3. package/dist/auth/auth.api.js +8 -7
  4. package/dist/auth/auth.api.js.map +1 -1
  5. package/dist/command/command.api.d.ts +43 -0
  6. package/dist/command/command.api.d.ts.map +1 -0
  7. package/dist/command/command.api.js +58 -0
  8. package/dist/command/command.api.js.map +1 -0
  9. package/dist/command/command.interface.d.ts +14 -0
  10. package/dist/command/command.interface.d.ts.map +1 -0
  11. package/dist/command/command.interface.js +9 -0
  12. package/dist/command/command.interface.js.map +1 -0
  13. package/dist/core.api.d.ts +116 -12
  14. package/dist/core.api.d.ts.map +1 -1
  15. package/dist/core.api.js +289 -103
  16. package/dist/core.api.js.map +1 -1
  17. package/dist/core.interface.d.ts +2 -1
  18. package/dist/core.interface.d.ts.map +1 -1
  19. package/dist/core.interface.js +1 -1
  20. package/dist/core.interface.js.map +1 -1
  21. package/dist/core.utils.d.ts +0 -2
  22. package/dist/core.utils.d.ts.map +1 -1
  23. package/dist/core.utils.js +0 -5
  24. package/dist/core.utils.js.map +1 -1
  25. package/dist/file/file-manager.d.ts +1 -1
  26. package/dist/file/file-manager.d.ts.map +1 -1
  27. package/dist/file/file-manager.js +1 -1
  28. package/dist/file/file-manager.js.map +1 -1
  29. package/dist/file-list/file-list.api.js +1 -1
  30. package/dist/file-list/file-list.api.js.map +1 -1
  31. package/dist/index.d.ts +12 -1
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +11 -1
  34. package/dist/index.js.map +1 -1
  35. package/dist/list/list.interface.d.ts +2 -2
  36. package/dist/list/list.interface.d.ts.map +1 -1
  37. package/dist/node/node-manager.d.ts +48 -0
  38. package/dist/node/node-manager.d.ts.map +1 -0
  39. package/dist/node/node-manager.js +619 -0
  40. package/dist/node/node-manager.js.map +1 -0
  41. package/dist/node/node-task.preset.d.ts +1 -0
  42. package/dist/node/node-task.preset.d.ts.map +1 -0
  43. package/dist/node/node-task.preset.js +14 -0
  44. package/dist/node/node-task.preset.js.map +1 -0
  45. package/dist/node/node.api.d.ts +68 -0
  46. package/dist/node/node.api.d.ts.map +1 -0
  47. package/dist/node/node.api.js +100 -0
  48. package/dist/node/node.api.js.map +1 -0
  49. package/dist/node/node.interface.d.ts +35 -0
  50. package/dist/node/node.interface.d.ts.map +1 -0
  51. package/dist/node/node.interface.js +19 -0
  52. package/dist/node/node.interface.js.map +1 -0
  53. package/dist/node/node.utils.d.ts +5 -0
  54. package/dist/node/node.utils.d.ts.map +1 -0
  55. package/dist/node/node.utils.js +36 -0
  56. package/dist/node/node.utils.js.map +1 -0
  57. package/dist/parcel/parcel-manager.d.ts +1 -1
  58. package/dist/parcel/parcel-manager.d.ts.map +1 -1
  59. package/dist/parcel/parcel-manager.js +1 -1
  60. package/dist/parcel/parcel-manager.js.map +1 -1
  61. package/dist/question-list/question-list.api.js +1 -1
  62. package/dist/question-list/question-list.api.js.map +1 -1
  63. package/dist/repo/repo-context.utils.d.ts +24 -0
  64. package/dist/repo/repo-context.utils.d.ts.map +1 -0
  65. package/dist/repo/repo-context.utils.js +81 -0
  66. package/dist/repo/repo-context.utils.js.map +1 -0
  67. package/dist/repo/repo-manager.d.ts +31 -0
  68. package/dist/repo/repo-manager.d.ts.map +1 -0
  69. package/dist/repo/repo-manager.js +156 -0
  70. package/dist/repo/repo-manager.js.map +1 -0
  71. package/dist/repo/repo.api.d.ts +16 -0
  72. package/dist/repo/repo.api.d.ts.map +1 -0
  73. package/dist/repo/repo.api.js +40 -0
  74. package/dist/repo/repo.api.js.map +1 -0
  75. package/dist/repo/repo.interface.d.ts +27 -0
  76. package/dist/repo/repo.interface.d.ts.map +1 -0
  77. package/dist/repo/repo.interface.js +8 -0
  78. package/dist/repo/repo.interface.js.map +1 -0
  79. package/dist/repo/repo.script-loader.d.ts +19 -0
  80. package/dist/repo/repo.script-loader.d.ts.map +1 -0
  81. package/dist/repo/repo.script-loader.js +108 -0
  82. package/dist/repo/repo.script-loader.js.map +1 -0
  83. package/dist/review/review.api.js +5 -5
  84. package/dist/review/review.api.js.map +1 -1
  85. package/dist/shared/log/create-api-logger.d.ts +17 -0
  86. package/dist/shared/log/create-api-logger.d.ts.map +1 -0
  87. package/dist/shared/log/create-api-logger.js +15 -0
  88. package/dist/shared/log/create-api-logger.js.map +1 -0
  89. package/dist/shared/log/log-manager.d.ts +114 -0
  90. package/dist/shared/log/log-manager.d.ts.map +1 -0
  91. package/dist/shared/log/log-manager.js +218 -0
  92. package/dist/shared/log/log-manager.js.map +1 -0
  93. package/dist/shared/utils/config-path.utils.d.ts +38 -0
  94. package/dist/shared/utils/config-path.utils.d.ts.map +1 -0
  95. package/dist/shared/utils/config-path.utils.js +85 -0
  96. package/dist/shared/utils/config-path.utils.js.map +1 -0
  97. package/dist/shared/utils/error.utils.d.ts +11 -0
  98. package/dist/shared/utils/error.utils.d.ts.map +1 -0
  99. package/dist/shared/utils/error.utils.js +15 -0
  100. package/dist/shared/utils/error.utils.js.map +1 -0
  101. package/dist/shared/utils/id.utils.d.ts +3 -0
  102. package/dist/shared/utils/id.utils.d.ts.map +1 -0
  103. package/dist/shared/utils/id.utils.js +5 -0
  104. package/dist/shared/utils/id.utils.js.map +1 -0
  105. package/dist/supabase.js +1 -1
  106. package/dist/supabase.js.map +1 -1
  107. package/dist/task/local-task-registry.d.ts +27 -0
  108. package/dist/task/local-task-registry.d.ts.map +1 -0
  109. package/dist/task/local-task-registry.js +153 -0
  110. package/dist/task/local-task-registry.js.map +1 -0
  111. package/dist/task/task-manager.d.ts +52 -0
  112. package/dist/task/task-manager.d.ts.map +1 -0
  113. package/dist/task/task-manager.js +217 -0
  114. package/dist/task/task-manager.js.map +1 -0
  115. package/dist/task/task-repo-context.d.ts +95 -0
  116. package/dist/task/task-repo-context.d.ts.map +1 -0
  117. package/dist/task/task-repo-context.js +12 -0
  118. package/dist/task/task-repo-context.js.map +1 -0
  119. package/dist/task/task.api.d.ts +241 -0
  120. package/dist/task/task.api.d.ts.map +1 -0
  121. package/dist/task/task.api.js +351 -0
  122. package/dist/task/task.api.js.map +1 -0
  123. package/dist/task/task.interface.d.ts +56 -0
  124. package/dist/task/task.interface.d.ts.map +1 -0
  125. package/dist/task/task.interface.js +36 -0
  126. package/dist/task/task.interface.js.map +1 -0
  127. package/dist/task/task.utils.d.ts +1 -0
  128. package/dist/task/task.utils.d.ts.map +1 -0
  129. package/dist/task/task.utils.js +2 -0
  130. package/dist/task/task.utils.js.map +1 -0
  131. package/dist/word/word.api.d.ts +5 -5
  132. package/dist/word/word.api.d.ts.map +1 -1
  133. package/dist/word/word.api.js +1 -1
  134. package/dist/word/word.api.js.map +1 -1
  135. package/package.json +10 -3
  136. package/src/auth/auth.api.ts +9 -7
  137. package/src/command/command.api.ts +88 -0
  138. package/src/command/command.interface.ts +17 -0
  139. package/src/core.api.ts +489 -133
  140. package/src/core.interface.ts +3 -1
  141. package/src/core.utils.ts +0 -6
  142. package/src/file/file-manager.ts +1 -1
  143. package/src/file-list/file-list.api.ts +1 -1
  144. package/src/index.ts +22 -1
  145. package/src/list/list.interface.ts +2 -2
  146. package/src/node/node-manager.ts +673 -0
  147. package/src/node/node-task.preset.ts +13 -0
  148. package/src/node/node.api.ts +139 -0
  149. package/src/node/node.interface.ts +40 -0
  150. package/src/node/node.utils.ts +36 -0
  151. package/src/parcel/parcel-manager.ts +1 -1
  152. package/src/question-list/question-list.api.ts +1 -1
  153. package/src/repo/repo-context.utils.ts +111 -0
  154. package/src/repo/repo-manager.ts +217 -0
  155. package/src/repo/repo.api.ts +50 -0
  156. package/src/repo/repo.interface.ts +31 -0
  157. package/src/repo/repo.script-loader.ts +140 -0
  158. package/src/review/review.api.ts +5 -5
  159. package/src/shared/log/create-api-logger.ts +25 -0
  160. package/src/shared/log/log-manager.ts +340 -0
  161. package/src/shared/utils/config-path.utils.ts +104 -0
  162. package/src/shared/utils/error.utils.ts +15 -0
  163. package/src/shared/utils/id.utils.ts +4 -0
  164. package/src/supabase.ts +1 -1
  165. package/src/task/local-task-registry.ts +195 -0
  166. package/src/task/task-manager.ts +312 -0
  167. package/src/task/task-repo-context.ts +103 -0
  168. package/src/task/task.api.ts +429 -0
  169. package/src/task/task.interface.ts +68 -0
  170. package/src/task/task.utils.ts +0 -0
  171. package/src/word/word.api.ts +6 -6
@@ -0,0 +1,156 @@
1
+ import { getPossibleTarget } from "../core.api";
2
+ import { SupabaseInitializer } from "../supabase";
3
+ import { TASK_REPO_SCRIPT_CATEGORY } from "../task/task-repo-context";
4
+ import { assertScriptLoadable, isTaskRepoContext, pickEntryScript, } from "./repo-context.utils";
5
+ import { CategoryRepo } from "./repo.interface";
6
+ import { clearRepoScriptModuleCache, loadRepoContextFromScript, loadRepoContextFromUrl, } from "./repo.script-loader";
7
+ const supabase = SupabaseInitializer.getInstance();
8
+ const localRepoRegistry = new Map();
9
+ const remoteContextCache = new Map();
10
+ function buildRemoteCacheKey(taskTypeKey, contentHash) {
11
+ return `${taskTypeKey}@${contentHash}`;
12
+ }
13
+ async function fetchRemoteRepo(taskTypeKey) {
14
+ const { data } = await getPossibleTarget({
15
+ filterList: [
16
+ { field: "category", operator: "eq", value: CategoryRepo.REPO },
17
+ { field: "value", operator: "eq", value: taskTypeKey },
18
+ ],
19
+ });
20
+ return data ?? null;
21
+ }
22
+ async function fetchRemoteScripts(taskTypeKey) {
23
+ const { data, error } = await supabase.client
24
+ .from("target")
25
+ .select("id, value, details")
26
+ .eq("category", TASK_REPO_SCRIPT_CATEGORY)
27
+ .eq("value", taskTypeKey);
28
+ if (error) {
29
+ throw error;
30
+ }
31
+ return (data ?? []);
32
+ }
33
+ async function loadLocalEntry(logger, entry, taskTypeKey) {
34
+ if (entry.kind === "context") {
35
+ return entry.context;
36
+ }
37
+ const loaded = await loadRepoContextFromScript({
38
+ logger,
39
+ script: {
40
+ id: `local:${taskTypeKey}`,
41
+ value: taskTypeKey,
42
+ details: {
43
+ manifestVersion: 0,
44
+ modulePath: entry.modulePath,
45
+ exportName: entry.exportName,
46
+ isEntry: true,
47
+ },
48
+ },
49
+ taskTypeKey,
50
+ });
51
+ return loaded?.context ?? null;
52
+ }
53
+ async function loadRemoteRepoContext(logger, taskTypeKey) {
54
+ logger.info("從 Supabase 加載 Repo", { topic: "repo", context: { taskTypeKey } });
55
+ const remoteRepo = await fetchRemoteRepo(taskTypeKey);
56
+ if (remoteRepo == null) {
57
+ const error = `Supabase 未找到 Repo (value=${taskTypeKey})`;
58
+ logger.warn(error, { topic: "repo", context: { taskTypeKey } });
59
+ return { context: null, error };
60
+ }
61
+ const repoUrl = remoteRepo.details?.url?.trim() ?? "";
62
+ const repoHash = remoteRepo.details?.hash?.trim() ?? repoUrl;
63
+ const cacheKey = buildRemoteCacheKey(taskTypeKey, repoHash);
64
+ const cached = remoteContextCache.get(cacheKey);
65
+ if (cached != null) {
66
+ logger.info("命中遠程 Repo 上下文緩存", { topic: "repo", context: { cacheKey } });
67
+ return { context: cached };
68
+ }
69
+ const scripts = await fetchRemoteScripts(taskTypeKey);
70
+ const entryScript = pickEntryScript(scripts);
71
+ let loaded = entryScript != null && assertScriptLoadable(entryScript.details)
72
+ ? await loadRepoContextFromScript({ logger, script: entryScript, taskTypeKey })
73
+ : null;
74
+ if (loaded == null && repoUrl !== "") {
75
+ logger.info("未找到 script 行,嘗試從 Repo.details.url 加載", {
76
+ topic: "repo",
77
+ context: { taskTypeKey, url: repoUrl },
78
+ });
79
+ loaded = await loadRepoContextFromUrl({ logger, url: repoUrl, taskTypeKey });
80
+ }
81
+ if (loaded == null) {
82
+ const error = `無法從 Repo 加載 TaskRepoContext (hasUrl=${repoUrl !== ""}, scriptCount=${scripts.length})`;
83
+ logger.warn(error, {
84
+ topic: "repo",
85
+ context: { taskTypeKey, hasUrl: repoUrl !== "", scriptCount: scripts.length },
86
+ });
87
+ return { context: null, error };
88
+ }
89
+ remoteContextCache.set(cacheKey, loaded.context);
90
+ return { context: loaded.context };
91
+ }
92
+ const getRepoContext = async ({ logger, taskTypeKey, }) => {
93
+ const localEntry = localRepoRegistry.get(taskTypeKey);
94
+ if (localEntry != null) {
95
+ logger.info("使用本地註冊的 Repo", { topic: "repo", context: { taskTypeKey } });
96
+ const context = await loadLocalEntry(logger, localEntry, taskTypeKey);
97
+ if (context != null && isTaskRepoContext(context)) {
98
+ return { context: context };
99
+ }
100
+ const error = "本地 Repo 模組加載失敗或未導出有效的 TaskRepoContext";
101
+ logger.warn(error, { topic: "repo", context: { taskTypeKey } });
102
+ return { context: null, error };
103
+ }
104
+ try {
105
+ const result = await loadRemoteRepoContext(logger, taskTypeKey);
106
+ if (result.context != null && isTaskRepoContext(result.context)) {
107
+ return { context: result.context };
108
+ }
109
+ return {
110
+ context: null,
111
+ error: result.error ?? "遠程 Repo 上下文無效",
112
+ };
113
+ }
114
+ catch (error) {
115
+ const message = error instanceof Error ? error.message : String(error);
116
+ logger.error("從 Supabase 加載 Repo 失敗", {
117
+ topic: "repo",
118
+ context: { taskTypeKey, error: message },
119
+ });
120
+ return { context: null, error: message };
121
+ }
122
+ };
123
+ /** Register an in-process TaskRepoContext (highest priority — no Supabase fetch). */
124
+ function registerLocalRepoContext(taskTypeKey, context) {
125
+ if (!isTaskRepoContext(context)) {
126
+ throw new Error("[RepoManager] Invalid TaskRepoContext");
127
+ }
128
+ localRepoRegistry.set(taskTypeKey, { kind: "context", context });
129
+ }
130
+ /** Register a local ESM module path; loaded via dynamic import when the task runs. */
131
+ function registerLocalModule(taskTypeKey, modulePath, exportName) {
132
+ if (modulePath.trim() === "") {
133
+ throw new Error("[RepoManager] modulePath must not be empty");
134
+ }
135
+ localRepoRegistry.set(taskTypeKey, { kind: "modulePath", modulePath, exportName });
136
+ }
137
+ function unregisterLocalRepo(taskTypeKey) {
138
+ localRepoRegistry.delete(taskTypeKey);
139
+ }
140
+ function getRegisteredLocalTaskTypeKeys() {
141
+ return [...localRepoRegistry.keys()];
142
+ }
143
+ function clearRemoteContextCache() {
144
+ remoteContextCache.clear();
145
+ }
146
+ const RepoManager = {
147
+ getRepoContext,
148
+ registerLocalRepoContext,
149
+ registerLocalModule,
150
+ unregisterLocalRepo,
151
+ getRegisteredLocalTaskTypeKeys,
152
+ clearRemoteContextCache,
153
+ clearRepoScriptModuleCache,
154
+ };
155
+ export { RepoManager };
156
+ //# sourceMappingURL=repo-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-manager.js","sourceRoot":"","sources":["../../src/repo/repo-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { SupabaseResponse } from "../core.interface";
2
+ import { z } from "zod";
3
+ export declare const getScanRemoteRepoValuesSchema: z.ZodObject<{
4
+ usage: z.ZodString;
5
+ }, "strip", z.ZodTypeAny, {
6
+ usage: string;
7
+ }, {
8
+ usage: string;
9
+ }>;
10
+ export type GetScanRemoteRepoValuesPayload = z.infer<typeof getScanRemoteRepoValuesSchema>;
11
+ /**
12
+ * Scan `Repo.value` keys for `category=repo` with matching `details.usage`.
13
+ * Returns `{ data: string[] }` on success; validation and DB failures use `{ error }` (never throws).
14
+ */
15
+ export declare const getScanRemoteRepoValues: (payload: GetScanRemoteRepoValuesPayload) => Promise<SupabaseResponse<string[]>>;
16
+ //# sourceMappingURL=repo.api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo.api.d.ts","sourceRoot":"","sources":["../../src/repo/repo.api.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,6BAA6B;;;;;;EAExC,CAAC;AAEH,MAAM,MAAM,8BAA8B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAE3F;;;GAGG;AACH,eAAO,MAAM,uBAAuB,YACvB,8BAA8B,KACxC,OAAO,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAOpC,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { scanTargetList, validateWithSchema } from "../core.api";
2
+ import { generateResponse } from "../core.interface";
3
+ import { z } from "zod";
4
+ import { CategoryRepo } from "./repo.interface";
5
+ const REPO_USAGE_FIELD = "details->>usage";
6
+ export const getScanRemoteRepoValuesSchema = z.object({
7
+ usage: z.string().trim().min(1),
8
+ });
9
+ /**
10
+ * Scan `Repo.value` keys for `category=repo` with matching `details.usage`.
11
+ * Returns `{ data: string[] }` on success; validation and DB failures use `{ error }` (never throws).
12
+ */
13
+ export const getScanRemoteRepoValues = async (payload) => {
14
+ try {
15
+ return await getScanRemoteRepoValuesValidated(payload);
16
+ }
17
+ catch (error) {
18
+ const message = error instanceof Error ? error.message : String(error);
19
+ return generateResponse.error(message);
20
+ }
21
+ };
22
+ const getScanRemoteRepoValuesValidated = validateWithSchema(getScanRemoteRepoValuesSchema, "getScanRemoteRepoValuesSchema")(async ({ usage }) => {
23
+ try {
24
+ const { data } = await scanTargetList({
25
+ category: CategoryRepo.REPO,
26
+ selectFields: "value",
27
+ orderBy: { field: "value", ascending: true },
28
+ filterList: [{ field: REPO_USAGE_FIELD, operator: "eq", value: usage }],
29
+ });
30
+ const values = (data ?? [])
31
+ .map((row) => row.value?.trim())
32
+ .filter((value) => value != null && value !== "");
33
+ return generateResponse.success([...new Set(values)]);
34
+ }
35
+ catch (error) {
36
+ const message = error instanceof Error ? error.message : String(error);
37
+ return generateResponse.error(message);
38
+ }
39
+ });
40
+ //# sourceMappingURL=repo.api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo.api.js","sourceRoot":"","sources":["../../src/repo/repo.api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAoB,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAQ,MAAM,kBAAkB,CAAC;AAEtD,MAAM,gBAAgB,GAAG,iBAA0B,CAAC;AAEpD,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,CAAC,MAAM,CAAC;IAClD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAClC,CAAC,CAAC;AAIH;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,EACxC,OAAuC,EACJ,EAAE;IACrC,IAAI,CAAC;QACD,OAAO,MAAM,gCAAgC,CAAC,OAAO,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAA+B,CAAC;IACzE,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,gCAAgC,GAAG,kBAAkB,CACvD,6BAA6B,EAC7B,+BAA+B,CAClC,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAuC,EAAE;IACvD,IAAI,CAAC;QACD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,cAAc,CAAO;YACxC,QAAQ,EAAE,YAAY,CAAC,IAAI;YAC3B,YAAY,EAAE,OAAO;YACrB,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE;YAC5C,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;SAC1E,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;aACtB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;aAC/B,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;QAEvE,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAA+B,CAAC;IACzE,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { Target } from "../core.interface";
2
+ export declare enum CategoryRepo {
3
+ /** Project */
4
+ REPO = "repo"
5
+ }
6
+ /** `Repo.details.usage` for task worker remote discovery ({@link registerTasks}). */
7
+ export declare const TASK_REPO_USAGE = "task";
8
+ export interface Repo extends Target {
9
+ /** Human readable name */
10
+ name: string;
11
+ /** Unique key, consumers use this to determine which repo to use */
12
+ value: string;
13
+ details: RepoDetails;
14
+ category: CategoryRepo;
15
+ }
16
+ export interface RepoDetails {
17
+ manifestVersion: number;
18
+ /**
19
+ * Business usage partition for discovery and load (caller-defined string, e.g. `"task"`).
20
+ * Used by {@link getScanRemoteRepoValues} to narrow scan scope; validity is the caller's responsibility.
21
+ */
22
+ usage: string;
23
+ /** Repo entry module URL or filesystem path — used to dynamic-import TaskRepoContext. */
24
+ url: string;
25
+ hash: string;
26
+ }
27
+ //# sourceMappingURL=repo.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo.interface.d.ts","sourceRoot":"","sources":["../../src/repo/repo.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,oBAAY,YAAY;IACpB,cAAc;IACd,IAAI,SAAS;CAChB;AAED,qFAAqF;AACrF,eAAO,MAAM,eAAe,SAAS,CAAC;AAEtC,MAAM,WAAW,IAAK,SAAQ,MAAM;IAChC,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,YAAY,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,yFAAyF;IACzF,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,8 @@
1
+ export var CategoryRepo;
2
+ (function (CategoryRepo) {
3
+ /** Project */
4
+ CategoryRepo["REPO"] = "repo";
5
+ })(CategoryRepo || (CategoryRepo = {}));
6
+ /** `Repo.details.usage` for task worker remote discovery ({@link registerTasks}). */
7
+ export const TASK_REPO_USAGE = "task";
8
+ //# sourceMappingURL=repo.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo.interface.js","sourceRoot":"","sources":["../../src/repo/repo.interface.ts"],"names":[],"mappings":"AAEA,MAAM,CAAN,IAAY,YAGX;AAHD,WAAY,YAAY;IACpB,cAAc;IACd,6BAAa,CAAA;AACjB,CAAC,EAHW,YAAY,KAAZ,YAAY,QAGvB;AAED,qFAAqF;AACrF,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { LoggerWithContext } from "../shared/log/log-manager";
2
+ import { TaskRepoScriptRecord } from "../task/task-repo-context";
3
+ import { LoadedRepoContext } from "./repo-context.utils";
4
+ /** Resolve repo `details.url` to a value suitable for dynamic `import()`. */
5
+ export declare function resolveRepoEntryHref(url: string, cwd?: string): string;
6
+ export declare function loadRepoContextFromScript({ logger, script, taskTypeKey, }: {
7
+ logger: LoggerWithContext;
8
+ script: TaskRepoScriptRecord;
9
+ taskTypeKey: string;
10
+ }): Promise<LoadedRepoContext | null>;
11
+ export declare function loadRepoContextFromUrl({ logger, url, taskTypeKey, exportName, }: {
12
+ logger: LoggerWithContext;
13
+ url: string;
14
+ taskTypeKey: string;
15
+ exportName?: string;
16
+ }): Promise<LoadedRepoContext | null>;
17
+ /** Clear in-memory imported module cache (tests / hot reload). */
18
+ export declare function clearRepoScriptModuleCache(): void;
19
+ //# sourceMappingURL=repo.script-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo.script-loader.d.ts","sourceRoot":"","sources":["../../src/repo/repo.script-loader.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAEH,iBAAiB,EAEpB,MAAM,sBAAsB,CAAC;AAQ9B,6EAA6E;AAC7E,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,SAAgB,GAAG,MAAM,CAM7E;AAWD,wBAAsB,yBAAyB,CAAC,EAC5C,MAAM,EACN,MAAM,EACN,WAAW,GACd,EAAE;IACC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,EAAE,oBAAoB,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CA8CpC;AAED,wBAAsB,sBAAsB,CAAC,EACzC,MAAM,EACN,GAAG,EACH,WAAW,EACX,UAAU,GACb,EAAE;IACC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CA8BpC;AAED,kEAAkE;AAClE,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD"}
@@ -0,0 +1,108 @@
1
+ import { createHash } from "node:crypto";
2
+ import { mkdir, writeFile } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { tmpdir } from "node:os";
5
+ import { resolvePathFromCwd, toFileImportHref } from "../shared/utils/config-path.utils";
6
+ import { getScriptLoadKey, normalizeRepoContextModule, } from "./repo-context.utils";
7
+ const importedModuleCache = new Map();
8
+ async function importFromFilePath(modulePath) {
9
+ return import(toFileImportHref(modulePath));
10
+ }
11
+ /** Resolve repo `details.url` to a value suitable for dynamic `import()`. */
12
+ export function resolveRepoEntryHref(url, cwd = process.cwd()) {
13
+ const trimmed = url.trim();
14
+ if (trimmed.includes("://")) {
15
+ return trimmed;
16
+ }
17
+ return toFileImportHref(resolvePathFromCwd(cwd, trimmed));
18
+ }
19
+ async function importFromSource(source, cacheKey) {
20
+ const hash = createHash("sha256").update(source).digest("hex").slice(0, 16);
21
+ const dir = join(tmpdir(), "target-supabase-sdk", "repo-scripts");
22
+ await mkdir(dir, { recursive: true });
23
+ const filePath = join(dir, `${cacheKey}-${hash}.mjs`);
24
+ await writeFile(filePath, source, "utf8");
25
+ return importFromFilePath(filePath);
26
+ }
27
+ export async function loadRepoContextFromScript({ logger, script, taskTypeKey, }) {
28
+ const loadKey = getScriptLoadKey(script);
29
+ const cacheKey = `${taskTypeKey}@${loadKey}`;
30
+ const cached = importedModuleCache.get(cacheKey);
31
+ if (cached != null) {
32
+ logger.info("命中 Repo 脚本模块缓存", { topic: "repo", context: { cacheKey } });
33
+ return cached;
34
+ }
35
+ const { source, modulePath, exportName } = script.details;
36
+ try {
37
+ let moduleExports;
38
+ if (source != null && source.trim() !== "") {
39
+ logger.info("从 source 动态加载 Repo 脚本", { topic: "repo", context: { scriptId: script.id } });
40
+ moduleExports = await importFromSource(source, cacheKey);
41
+ }
42
+ else if (modulePath != null && modulePath.trim() !== "") {
43
+ logger.info("从 modulePath 动态加载 Repo 脚本", {
44
+ topic: "repo",
45
+ context: { scriptId: script.id, modulePath },
46
+ });
47
+ moduleExports = await importFromFilePath(modulePath);
48
+ }
49
+ else {
50
+ logger.warn("脚本缺少 source 或 modulePath", { topic: "repo", context: { scriptId: script.id } });
51
+ return null;
52
+ }
53
+ const context = normalizeRepoContextModule(moduleExports, taskTypeKey, exportName);
54
+ if (context == null) {
55
+ logger.warn("脚本模块未导出合法的 TaskRepoContext", {
56
+ topic: "repo",
57
+ context: { scriptId: script.id, exportName: exportName ?? "default" },
58
+ });
59
+ return null;
60
+ }
61
+ const loaded = { context, contentHash: loadKey };
62
+ importedModuleCache.set(cacheKey, loaded);
63
+ return loaded;
64
+ }
65
+ catch (error) {
66
+ logger.error("动态加载 Repo 脚本失败", {
67
+ topic: "repo",
68
+ context: { scriptId: script.id, error: error instanceof Error ? error.message : error },
69
+ });
70
+ return null;
71
+ }
72
+ }
73
+ export async function loadRepoContextFromUrl({ logger, url, taskTypeKey, exportName, }) {
74
+ const href = resolveRepoEntryHref(url);
75
+ const cacheKey = `${taskTypeKey}@url:${href}`;
76
+ const cached = importedModuleCache.get(cacheKey);
77
+ if (cached != null) {
78
+ logger.info("命中 Repo URL 模块缓存", { topic: "repo", context: { cacheKey } });
79
+ return cached;
80
+ }
81
+ try {
82
+ logger.info("从 Repo URL 动态加载脚本", { topic: "repo", context: { url, href } });
83
+ const moduleExports = await import(href);
84
+ const context = normalizeRepoContextModule(moduleExports, taskTypeKey, exportName);
85
+ if (context == null) {
86
+ logger.warn("Repo URL 模块未导出合法的 TaskRepoContext", {
87
+ topic: "repo",
88
+ context: { url, exportName: exportName ?? "default" },
89
+ });
90
+ return null;
91
+ }
92
+ const loaded = { context, contentHash: cacheKey };
93
+ importedModuleCache.set(cacheKey, loaded);
94
+ return loaded;
95
+ }
96
+ catch (error) {
97
+ logger.error("从 Repo URL 动态加载失败", {
98
+ topic: "repo",
99
+ context: { url, error: error instanceof Error ? error.message : error },
100
+ });
101
+ return null;
102
+ }
103
+ }
104
+ /** Clear in-memory imported module cache (tests / hot reload). */
105
+ export function clearRepoScriptModuleCache() {
106
+ importedModuleCache.clear();
107
+ }
108
+ //# sourceMappingURL=repo.script-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo.script-loader.js","sourceRoot":"","sources":["../../src/repo/repo.script-loader.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { cloneDeep } from "lodash-es";
2
2
  import { createTarget, getPossibleTarget, updateTargetDetails } from "../core.api";
3
- import { createResponse } from "../core.interface";
3
+ import { generateResponse } from "../core.interface";
4
4
  import { BaseValidator } from "../core.utils";
5
5
  import { CategoryReview } from "./review.interface";
6
6
  class PatchUpsertReviewValidator extends BaseValidator {
@@ -10,7 +10,7 @@ class PatchUpsertReviewValidator extends BaseValidator {
10
10
  constructor() {
11
11
  super();
12
12
  // Add custom
13
- this.addValidator((val) => {
13
+ this.addCustomValidator((val) => {
14
14
  if (val.reviewResult == null || Object.values(val.reviewResult).some((v) => typeof v !== "number")) {
15
15
  return "[Check reviewResult] reviewResult invalid";
16
16
  }
@@ -64,7 +64,7 @@ export const patchUpsertReview = async (payload) => {
64
64
  return details;
65
65
  },
66
66
  });
67
- return createResponse.success(data);
67
+ return generateResponse.success(data);
68
68
  }
69
69
  // Create
70
70
  const { data: newReview } = await postReview({
@@ -76,7 +76,7 @@ export const patchUpsertReview = async (payload) => {
76
76
  console.error(msg);
77
77
  throw new Error(msg);
78
78
  }
79
- return createResponse.success(newReview);
79
+ return generateResponse.success(newReview);
80
80
  };
81
81
  export class PostReviewValidator extends BaseValidator {
82
82
  requiredFields = ["reviewTargetId", "reviewDomain"];
@@ -84,7 +84,7 @@ export class PostReviewValidator extends BaseValidator {
84
84
  constructor() {
85
85
  super();
86
86
  // Add custom
87
- this.addValidator((val) => {
87
+ this.addCustomValidator((val) => {
88
88
  return true;
89
89
  });
90
90
  }
@@ -1 +1 @@
1
- {"version":3,"file":"review.api.js","sourceRoot":"","sources":["../../src/review/review.api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"review.api.js","sourceRoot":"","sources":["../../src/review/review.api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type LogContext, type LoggerWithContext } from "./log-manager";
2
+ /**
3
+ * Options for {@link createApiLogger}.
4
+ *
5
+ * - **Core:** optional `traceId` (generated when omitted)
6
+ * - **Business:** any other {@link LogContext} field (e.g. `nodeId`)
7
+ */
8
+ export type CreateApiLoggerOptions = {
9
+ traceId?: string;
10
+ } & Partial<Omit<LogContext, "module" | "traceId">>;
11
+ /**
12
+ * Logger for one SDK API invocation.
13
+ *
14
+ * Binds required `module` + optional caller `traceId`; business fields (e.g. `nodeId`) are optional.
15
+ */
16
+ export declare function createApiLogger(module: string, options?: CreateApiLoggerOptions): LoggerWithContext;
17
+ //# sourceMappingURL=create-api-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-api-logger.d.ts","sourceRoot":"","sources":["../../../src/shared/log/create-api-logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEpF;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC;AAEpD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,iBAAiB,CAOnG"}
@@ -0,0 +1,15 @@
1
+ import { logManager } from "./log-manager";
2
+ /**
3
+ * Logger for one SDK API invocation.
4
+ *
5
+ * Binds required `module` + optional caller `traceId`; business fields (e.g. `nodeId`) are optional.
6
+ */
7
+ export function createApiLogger(module, options) {
8
+ const { traceId, ...businessFields } = options ?? {};
9
+ return logManager.withContext({
10
+ module,
11
+ traceId: traceId ?? logManager.generateTraceId(),
12
+ ...businessFields,
13
+ }).logger;
14
+ }
15
+ //# sourceMappingURL=create-api-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-api-logger.js","sourceRoot":"","sources":["../../../src/shared/log/create-api-logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA2C,MAAM,eAAe,CAAC;AAYpF;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,OAAgC;IAC5E,MAAM,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IACrD,OAAO,UAAU,CAAC,WAAW,CAAC;QAC1B,MAAM;QACN,OAAO,EAAE,OAAO,IAAI,UAAU,CAAC,eAAe,EAAE;QAChD,GAAG,cAAc;KACpB,CAAC,CAAC,MAAM,CAAC;AACd,CAAC"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Log severity and semantics (low → high). `minLevel` filters by {@link LOG_LEVEL_RANK}.
3
+ *
4
+ * | Level | Rank | When to use |
5
+ * |----------|------|-------------|
6
+ * | DEBUG | 0 | Diagnostic detail for dev/troubleshooting; noisy, safe to drop in prod. |
7
+ * | INFO | 1 | Normal operational flow (startup, polling, state transitions). |
8
+ * | SUCCESS | 2 | Positive milestone within a flow (not a separate severity axis — same band as INFO). |
9
+ * | WARN | 3 | Recoverable anomaly or degradation; work continues but worth watching. |
10
+ * | ERROR | 4 | A concrete operation failed (API, task step, I/O); investigate and retry/fix locally. |
11
+ * | CRITICAL | 5 | Invariant violated — design flaw, data-integrity risk, or business rule broken; escalate and fix urgently. |
12
+ */
13
+ declare enum LogLevel {
14
+ DEBUG = "DEBUG",
15
+ INFO = "INFO",
16
+ SUCCESS = "SUCCESS",
17
+ WARN = "WARN",
18
+ ERROR = "ERROR",
19
+ CRITICAL = "CRITICAL"
20
+ }
21
+ interface LogEntry {
22
+ timestamp: number;
23
+ level: LogLevel;
24
+ /** Tell people what happened, but more structured */
25
+ message: string;
26
+ /** Category of a kind of log */
27
+ topic: string | null;
28
+ /** Where the log comes from */
29
+ module: string;
30
+ /** Specific process — correlates one logical chain (loop, request). */
31
+ traceId: string;
32
+ /** Worker node id when the log is node-scoped; omit for scheduler / admin / API-only paths. */
33
+ nodeId?: string;
34
+ extra?: string;
35
+ context?: unknown;
36
+ }
37
+ interface LogContext {
38
+ module: LogEntry["module"];
39
+ traceId: LogEntry["traceId"];
40
+ nodeId?: LogEntry["nodeId"];
41
+ }
42
+ type LogRestParams = Omit<LogParams, "message">;
43
+ interface LogEntryPayload {
44
+ message: LogEntry["message"];
45
+ topic?: LogEntry["topic"];
46
+ extra?: LogEntry["extra"];
47
+ context?: LogEntry["context"];
48
+ level: LogEntry["level"];
49
+ module: LogEntry["module"];
50
+ traceId: LogEntry["traceId"];
51
+ nodeId?: LogEntry["nodeId"];
52
+ }
53
+ type LogParams = Pick<LogEntryPayload, "message" | "topic" | "extra" | "context">;
54
+ interface LogOptions {
55
+ defaultTopic: LogEntry["topic"];
56
+ formatTimestamp: boolean;
57
+ formatEmoji: boolean;
58
+ formatPrefix: string;
59
+ maxHistoryLength: number;
60
+ /** Logs below this level are skipped. Defaults to DEBUG in dev, INFO in production. */
61
+ minLevel?: LogLevel;
62
+ onLog?: (entry: LogEntry) => void;
63
+ }
64
+ interface LoggerWithContext {
65
+ /** Rank 0 — diagnostic detail; dev/troubleshooting only. */
66
+ debug: (message: LogParams["message"], restParams?: LogRestParams) => void;
67
+ /** Rank 1 — normal operational flow. */
68
+ info: (message: LogParams["message"], restParams?: LogRestParams) => void;
69
+ /** Rank 2 — positive milestone (semantic INFO, not higher severity). */
70
+ success: (message: LogParams["message"], restParams?: LogRestParams) => void;
71
+ /** Rank 3 — recoverable anomaly; system continues. */
72
+ warn: (message: LogParams["message"], restParams?: LogRestParams) => void;
73
+ /** Rank 4 — a concrete operation failed; needs investigation. */
74
+ error: (message: LogParams["message"], restParams?: LogRestParams) => void;
75
+ /** Rank 5 — invariant / design / integrity breach; escalate immediately. */
76
+ critical: (message: LogParams["message"], restParams?: LogRestParams) => void;
77
+ /** Merge partial fields into this logger's bound context (e.g. nodeId after register). */
78
+ resetContext: (fields: Partial<LogContext>) => void;
79
+ }
80
+ declare class LogManager {
81
+ private static instance;
82
+ private options;
83
+ private history;
84
+ private readonly levelEmojis;
85
+ private constructor();
86
+ static getInstance(options?: Partial<LogOptions>): LogManager;
87
+ setOptions(options: Partial<LogOptions>): void;
88
+ getHistory(): LogEntry[];
89
+ clearHistory(): void;
90
+ private getMinLevel;
91
+ private shouldLog;
92
+ private createLogEntry;
93
+ private formatLevelTag;
94
+ private formatLog;
95
+ private emitLog;
96
+ private log;
97
+ generateTraceId(): string;
98
+ debug(message: LogParams["message"], logContext: LogContext, restParams?: LogRestParams): void;
99
+ info(message: LogParams["message"], logContext: LogContext, restParams?: LogRestParams): void;
100
+ success(message: LogParams["message"], logContext: LogContext, restParams?: LogRestParams): void;
101
+ warn(message: LogParams["message"], logContext: LogContext, restParams?: LogRestParams): void;
102
+ error(message: LogParams["message"], logContext: LogContext, restParams?: LogRestParams): void;
103
+ critical(message: LogParams["message"], logContext: LogContext, restParams?: LogRestParams): void;
104
+ withContext(context: LogContext): {
105
+ logger: LoggerWithContext;
106
+ context: LogContext;
107
+ };
108
+ }
109
+ export declare const logManager: LogManager;
110
+ export { LogManager, LogLevel };
111
+ export { createApiLogger } from "./create-api-logger";
112
+ export type { CreateApiLoggerOptions } from "./create-api-logger";
113
+ export type { LogOptions, LogEntry, LogContext, LoggerWithContext, LogRestParams };
114
+ //# sourceMappingURL=log-manager.d.ts.map