@lark-base-open/base-database-cli 1.1.1 → 1.3.8

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 (199) hide show
  1. package/CHANGELOG.md +97 -0
  2. package/LICENSE +6 -0
  3. package/README.md +47 -27
  4. package/dist/ai-functions.d.ts +53 -0
  5. package/dist/ai-functions.d.ts.map +1 -0
  6. package/dist/ai-functions.js +436 -0
  7. package/dist/ai-functions.js.map +1 -0
  8. package/dist/archive.d.ts +21 -0
  9. package/dist/archive.d.ts.map +1 -1
  10. package/dist/archive.js +69 -10
  11. package/dist/archive.js.map +1 -1
  12. package/dist/auth.d.ts +5 -0
  13. package/dist/auth.d.ts.map +1 -1
  14. package/dist/auth.js +26 -3
  15. package/dist/auth.js.map +1 -1
  16. package/dist/check.d.ts +74 -0
  17. package/dist/check.d.ts.map +1 -0
  18. package/dist/check.js +283 -0
  19. package/dist/check.js.map +1 -0
  20. package/dist/dependency-policy.d.ts +10 -0
  21. package/dist/dependency-policy.d.ts.map +1 -0
  22. package/dist/dependency-policy.js +162 -0
  23. package/dist/dependency-policy.js.map +1 -0
  24. package/dist/deploy.d.ts +5 -0
  25. package/dist/deploy.d.ts.map +1 -1
  26. package/dist/deploy.js +141 -176
  27. package/dist/deploy.js.map +1 -1
  28. package/dist/environment-variables.d.ts +52 -0
  29. package/dist/environment-variables.d.ts.map +1 -0
  30. package/dist/environment-variables.js +563 -0
  31. package/dist/environment-variables.js.map +1 -0
  32. package/dist/environment.d.ts +1 -1
  33. package/dist/environment.js +1 -1
  34. package/dist/environment.js.map +1 -1
  35. package/dist/function-input-types.d.ts +10 -0
  36. package/dist/function-input-types.d.ts.map +1 -0
  37. package/dist/function-input-types.js +160 -0
  38. package/dist/function-input-types.js.map +1 -0
  39. package/dist/function-schema.d.ts.map +1 -1
  40. package/dist/function-schema.js +89 -36
  41. package/dist/function-schema.js.map +1 -1
  42. package/dist/init-field-retry.d.ts +17 -0
  43. package/dist/init-field-retry.d.ts.map +1 -0
  44. package/dist/init-field-retry.js +127 -0
  45. package/dist/init-field-retry.js.map +1 -0
  46. package/dist/init-journal.d.ts +98 -0
  47. package/dist/init-journal.d.ts.map +1 -0
  48. package/dist/init-journal.js +492 -0
  49. package/dist/init-journal.js.map +1 -0
  50. package/dist/init-schema.d.ts +8 -0
  51. package/dist/init-schema.d.ts.map +1 -0
  52. package/dist/init-schema.js +423 -0
  53. package/dist/init-schema.js.map +1 -0
  54. package/dist/init.d.ts +15 -1
  55. package/dist/init.d.ts.map +1 -1
  56. package/dist/init.js +884 -261
  57. package/dist/init.js.map +1 -1
  58. package/dist/lark-cli-error.d.ts +47 -0
  59. package/dist/lark-cli-error.d.ts.map +1 -0
  60. package/dist/lark-cli-error.js +201 -0
  61. package/dist/lark-cli-error.js.map +1 -0
  62. package/dist/lark-cli.d.ts +1 -1
  63. package/dist/lark-cli.d.ts.map +1 -1
  64. package/dist/lark-cli.js +78 -18
  65. package/dist/lark-cli.js.map +1 -1
  66. package/dist/mutation-schema.d.ts +146 -0
  67. package/dist/mutation-schema.d.ts.map +1 -0
  68. package/dist/mutation-schema.js +153 -0
  69. package/dist/mutation-schema.js.map +1 -0
  70. package/dist/mutation.d.ts +10 -0
  71. package/dist/mutation.d.ts.map +1 -0
  72. package/dist/mutation.js +131 -0
  73. package/dist/mutation.js.map +1 -0
  74. package/dist/npm.d.ts +1 -0
  75. package/dist/npm.d.ts.map +1 -1
  76. package/dist/npm.js +2 -2
  77. package/dist/npm.js.map +1 -1
  78. package/dist/preview-receipt.d.ts.map +1 -1
  79. package/dist/preview-receipt.js +15 -5
  80. package/dist/preview-receipt.js.map +1 -1
  81. package/dist/process.d.ts +3 -1
  82. package/dist/process.d.ts.map +1 -1
  83. package/dist/process.js +16 -4
  84. package/dist/process.js.map +1 -1
  85. package/dist/program.d.ts.map +1 -1
  86. package/dist/program.js +246 -42
  87. package/dist/program.js.map +1 -1
  88. package/dist/project-build.d.ts +25 -0
  89. package/dist/project-build.d.ts.map +1 -0
  90. package/dist/project-build.js +229 -0
  91. package/dist/project-build.js.map +1 -0
  92. package/dist/project-context.d.ts +344 -0
  93. package/dist/project-context.d.ts.map +1 -0
  94. package/dist/project-context.js +485 -0
  95. package/dist/project-context.js.map +1 -0
  96. package/dist/project-layout.d.ts +5 -0
  97. package/dist/project-layout.d.ts.map +1 -0
  98. package/dist/project-layout.js +24 -0
  99. package/dist/project-layout.js.map +1 -0
  100. package/dist/public-sql-error.d.ts +25 -0
  101. package/dist/public-sql-error.d.ts.map +1 -0
  102. package/dist/public-sql-error.js +65 -0
  103. package/dist/public-sql-error.js.map +1 -0
  104. package/dist/pull.d.ts +1 -0
  105. package/dist/pull.d.ts.map +1 -1
  106. package/dist/pull.js +67 -15
  107. package/dist/pull.js.map +1 -1
  108. package/dist/site-readme.d.ts +3 -0
  109. package/dist/site-readme.d.ts.map +1 -0
  110. package/dist/site-readme.js +83 -0
  111. package/dist/site-readme.js.map +1 -0
  112. package/dist/workspace-fingerprint.d.ts +21 -1
  113. package/dist/workspace-fingerprint.d.ts.map +1 -1
  114. package/dist/workspace-fingerprint.js +81 -2
  115. package/dist/workspace-fingerprint.js.map +1 -1
  116. package/package.json +2 -1
  117. package/skills/lark-base-database/SKILL.md +86 -52
  118. package/skills/lark-base-database/references/ai-function.md +479 -0
  119. package/skills/lark-base-database/references/base-capability-routing.md +7 -7
  120. package/skills/lark-base-database/references/base-sql-errors.generated.md +403 -0
  121. package/skills/lark-base-database/references/database-function-limitations.md +29 -0
  122. package/skills/lark-base-database/references/database-function.md +323 -0
  123. package/skills/lark-base-database/references/development.md +166 -33
  124. package/skills/lark-base-database/references/environment-variables.md +55 -0
  125. package/skills/lark-base-database/references/faas.md +46 -53
  126. package/skills/lark-base-database/references/file-transfer.md +25 -25
  127. package/skills/lark-base-database/references/frontend-design-guide.md +151 -65
  128. package/skills/lark-base-database/references/mutations.md +295 -0
  129. package/skills/lark-base-database/references/notifications.md +9 -9
  130. package/skills/lark-base-database/references/permission-design.md +24 -24
  131. package/skills/lark-base-database/references/release.md +57 -30
  132. package/skills/lark-base-database/references/style-guide.md +10 -67
  133. package/skills/lark-base-database/references/verification.md +19 -13
  134. package/skills/lark-base-database/references/workspace.md +57 -17
  135. package/templates/database-starter/README.md +34 -4
  136. package/templates/database-starter/database-functions/README.md +8 -0
  137. package/templates/database-starter/gitignore +7 -0
  138. package/templates/database-starter/mutations/README.md +19 -0
  139. package/templates/database-starter/page/README.md +25 -19
  140. package/templates/database-starter/page/package-lock.json +8 -16
  141. package/templates/database-starter/page/package.json +2 -3
  142. package/templates/database-starter/page/src/App.tsx +23 -3
  143. package/templates/database-starter/page/src/components/UserSelectorEditor/index.tsx +32 -4
  144. package/templates/database-starter/page/src/components/UserSelectorPanel/index.tsx +104 -34
  145. package/templates/database-starter/page/src/components/UserSelectorPanel/user-search.test.ts +55 -11
  146. package/templates/database-starter/page/src/components/UserSelectorPanel/user-search.ts +68 -25
  147. package/templates/database-starter/page/src/components/database-runtime-ready.tsx +1 -1
  148. package/templates/database-starter/page/src/components/database-user-menu/index.tsx +4 -7
  149. package/templates/database-starter/page/src/components/feedback/page-state.tsx +40 -5
  150. package/templates/database-starter/page/src/components/floating-button/assets/edit-active.svg +3 -0
  151. package/templates/database-starter/page/src/components/floating-button/assets/edit-default.svg +3 -0
  152. package/templates/database-starter/page/src/components/floating-button/assets/toast-close.svg +3 -0
  153. package/templates/database-starter/page/src/components/floating-button/assets/toast-info.svg +5 -0
  154. package/templates/database-starter/page/src/components/floating-button/assets/tooltip-caret.svg +3 -0
  155. package/templates/database-starter/page/src/components/floating-button/index.tsx +193 -113
  156. package/templates/database-starter/page/src/components/floating-button/utils/project-meta.test.ts +107 -37
  157. package/templates/database-starter/page/src/components/floating-button/utils/project-meta.ts +13 -50
  158. package/templates/database-starter/page/src/components/ui-language.test.tsx +101 -0
  159. package/templates/database-starter/page/src/examples/ai-function/ImageTaskOperation.tsx +202 -0
  160. package/templates/database-starter/page/src/examples/ai-function/README.md +14 -0
  161. package/templates/database-starter/page/src/examples/ai-function/TextStreamOperation.tsx +184 -0
  162. package/templates/database-starter/page/src/examples/ai-function/ai-copy.ts +173 -0
  163. package/templates/database-starter/page/src/examples/ai-function/ai-delta.test.ts +30 -0
  164. package/templates/database-starter/page/src/examples/ai-function/ai-delta.ts +26 -0
  165. package/templates/database-starter/page/src/examples/ai-function/ai-language.test.tsx +86 -0
  166. package/templates/database-starter/page/src/examples/ai-function/ai-media-panel.test.ts +201 -0
  167. package/templates/database-starter/page/src/examples/ai-function/ai-media-panel.tsx +382 -0
  168. package/templates/database-starter/page/src/lib/attachment-image.tsx +144 -0
  169. package/templates/database-starter/page/src/lib/database-function-inputs.generated.ts +4 -0
  170. package/templates/database-starter/page/src/lib/database-runtime-attachment.test.ts +180 -76
  171. package/templates/database-starter/page/src/lib/database-runtime.test.ts +130 -10
  172. package/templates/database-starter/page/src/lib/database-runtime.ts +484 -51
  173. package/templates/database-starter/page/src/lib/date-time.ts +61 -0
  174. package/templates/database-starter/page/src/lib/ui-language.ts +86 -0
  175. package/templates/database-starter/page/src/main.tsx +1 -1
  176. package/templates/database-starter/page/tsconfig.json +2 -2
  177. package/templates/database-starter/page/vite.config.ts +1 -2
  178. package/templates/database-starter/prettierignore +1 -1
  179. package/templates/database-starter/server-functions/README.md +2 -2
  180. package/templates/database-starter/server-functions/package-lock.json +4 -4
  181. package/templates/database-starter/server-functions/package.json +1 -1
  182. package/dist/agent-guide.d.ts +0 -19
  183. package/dist/agent-guide.d.ts.map +0 -1
  184. package/dist/agent-guide.js +0 -31
  185. package/dist/agent-guide.js.map +0 -1
  186. package/dist/database-skill.d.ts +0 -24
  187. package/dist/database-skill.d.ts.map +0 -1
  188. package/dist/database-skill.js +0 -148
  189. package/dist/database-skill.js.map +0 -1
  190. package/skills/lark-base-database/references/base-sql-unsupported.md +0 -42
  191. package/skills/lark-base-database/references/database-capability-skill.md +0 -40
  192. package/skills/lark-base-database/references/sql-function.md +0 -289
  193. package/templates/database-capability/SKILL.md.tmpl +0 -58
  194. package/templates/database-starter/page/src/components/floating-button/chatbot-entry.test.ts +0 -23
  195. package/templates/database-starter/page/src/components/floating-button/chatbot-entry.tsx +0 -873
  196. package/templates/database-starter/page/src/components/floating-button/local-chat-panel.test.ts +0 -25
  197. package/templates/database-starter/page/src/components/floating-button/local-chat-panel.tsx +0 -197
  198. package/templates/database-starter/page/src/components/floating-button/utils/env.ts +0 -18
  199. package/templates/database-starter/sql/README.md +0 -8
@@ -0,0 +1,436 @@
1
+ import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync, } from 'node:fs';
2
+ import { basename, dirname, join, resolve } from 'node:path';
3
+ import { readConfig } from './config.js';
4
+ import { assertProjectRuntimeProfile, ONLINE_RUNTIME_PROFILE, } from './environment.js';
5
+ import { LarkCliError } from './lark-cli-error.js';
6
+ import { responseData, runLarkCli } from './lark-cli.js';
7
+ // 服务端对 AI Function 管理接口(list/get/upsert/delete/validate/update/usage)做用户级 feature gate,
8
+ // 未开通时返回 800004011 "ai function feature is not enabled"。这不是 scope 缺失,重新登录无法解决;
9
+ // 这里把它翻译成可执行的降级路径,避免 Agent 把它当作权限错误循环授权。
10
+ export const AI_FUNCTION_FEATURE_NOT_ENABLED_CODE = 800004011;
11
+ export const AI_FUNCTION_FEATURE_NOT_ENABLED_MESSAGE = 'AI Function management is not enabled for the current user (800004011). This is a feature gate, not a missing scope, so `auth login` does not help. Publish without AI Functions via `deploy --skip-ai-functions` (or remove ai/) and report the AI Function part as blocked.';
12
+ export function isAIFunctionFeatureNotEnabled(error) {
13
+ return (error instanceof LarkCliError &&
14
+ Number(error.details.code) === AI_FUNCTION_FEATURE_NOT_ENABLED_CODE);
15
+ }
16
+ function aiFunctionAccessError(error) {
17
+ if (error instanceof LarkCliError &&
18
+ Number(error.details.code) === AI_FUNCTION_FEATURE_NOT_ENABLED_CODE) {
19
+ return new LarkCliError({
20
+ ...error.details,
21
+ message: AI_FUNCTION_FEATURE_NOT_ENABLED_MESSAGE,
22
+ });
23
+ }
24
+ return error;
25
+ }
26
+ function runAIFunctionApi(args, env, cwd) {
27
+ try {
28
+ return runLarkCli(args, env, cwd);
29
+ }
30
+ catch (error) {
31
+ throw aiFunctionAccessError(error);
32
+ }
33
+ }
34
+ // AI Function 是「功能清单」里的一类声明式资源(function_type=4):model/System Prompt/能力配置都在
35
+ // ai/<functionKey>/meta.json 里维护,随 deploy 走 OpenAPI 全量覆盖同步。不进 site.zip(不是部署代码,是配置)。
36
+ const FUNCTION_ID_PATTERN = /^[A-Za-z0-9_-]+$/;
37
+ const MAX_AI_FUNCTIONS = 200;
38
+ const AI_FUNCTIONS_DIR = 'ai';
39
+ const CAPABILITY_TYPES = new Set(['text', 'vision', 'image', 'video']);
40
+ function stripPlatformManagedFields(config) {
41
+ const normalized = { ...config };
42
+ delete normalized.limits;
43
+ const text = config.text;
44
+ if (text && typeof text === 'object' && !Array.isArray(text)) {
45
+ const rest = { ...text };
46
+ delete rest.max_tokens;
47
+ normalized.text = rest;
48
+ }
49
+ return normalized;
50
+ }
51
+ function aiFunctionsRoot(workspace) {
52
+ return join(resolve(workspace), AI_FUNCTIONS_DIR);
53
+ }
54
+ function readAIFunctionMeta(path) {
55
+ const functionKey = basename(dirname(path));
56
+ if (functionKey.length < 1 ||
57
+ functionKey.length > 64 ||
58
+ !FUNCTION_ID_PATTERN.test(functionKey)) {
59
+ throw new Error(`Invalid AI Function key: ${functionKey}`);
60
+ }
61
+ const manifest = JSON.parse(readFileSync(path, 'utf8'));
62
+ if (typeof manifest.name !== 'string' || manifest.name === '') {
63
+ throw new Error(`AI Function name must be a non-empty string: ${path}`);
64
+ }
65
+ if (manifest.description !== undefined &&
66
+ typeof manifest.description !== 'string') {
67
+ throw new Error(`AI Function description must be a string: ${path}`);
68
+ }
69
+ if (!manifest.config || typeof manifest.config !== 'object') {
70
+ throw new Error(`AI Function config must be an object: ${path}`);
71
+ }
72
+ const config = stripPlatformManagedFields(manifest.config);
73
+ if (typeof config.capability_type !== 'string' ||
74
+ !CAPABILITY_TYPES.has(config.capability_type)) {
75
+ throw new Error(`AI Function capability_type must be one of text|vision|image|video: ${path}`);
76
+ }
77
+ return {
78
+ configJson: JSON.stringify(config),
79
+ description: manifest.description ?? '',
80
+ functionKey,
81
+ name: manifest.name,
82
+ };
83
+ }
84
+ // collectLocalAIFunctions 读取 ai/<key>/meta.json 全集(本地声明),供 deploy 全量覆盖同步与 sync 命令共用。
85
+ export function collectLocalAIFunctions(workspace) {
86
+ const root = aiFunctionsRoot(workspace);
87
+ if (!existsSync(root)) {
88
+ return [];
89
+ }
90
+ const items = [];
91
+ const seen = new Set();
92
+ for (const entry of readdirSync(root, { withFileTypes: true })) {
93
+ if (!entry.isDirectory())
94
+ continue;
95
+ const path = join(root, entry.name, 'meta.json');
96
+ if (!existsSync(path) || !statSync(path).isFile())
97
+ continue;
98
+ const item = readAIFunctionMeta(path);
99
+ if (seen.has(item.functionKey)) {
100
+ throw new Error(`Duplicate AI Function key: ${item.functionKey}`);
101
+ }
102
+ seen.add(item.functionKey);
103
+ items.push(item);
104
+ }
105
+ if (items.length > MAX_AI_FUNCTIONS) {
106
+ throw new Error(`AI Functions cannot exceed ${MAX_AI_FUNCTIONS}`);
107
+ }
108
+ return items;
109
+ }
110
+ // buildUpdatePayload 把本地全集转成 OpenAPIUpsertAIFunctions 的全量覆盖请求体。
111
+ function buildUpdatePayload(items) {
112
+ return JSON.stringify({
113
+ ai_functions: items.map((item) => ({
114
+ config_json: item.configJson,
115
+ description: item.description,
116
+ function_key: item.functionKey,
117
+ name: item.name,
118
+ })),
119
+ });
120
+ }
121
+ // assertAIFunctionResultsOk 严格校验逐条结果:任一条 code != 0 立即抛错。
122
+ // 后端整批拒绝时会同时返回顶层失败和 data.results;调用方必须保留逐条诊断,
123
+ // 并阻止 deploy 继续上传产物或发布失败快照。
124
+ function assertAIFunctionResultsOk(data) {
125
+ const results = data.results ?? data.Results;
126
+ if (results === undefined || results === null) {
127
+ return;
128
+ }
129
+ if (!Array.isArray(results)) {
130
+ throw new Error('AI Function sync returned an invalid results payload');
131
+ }
132
+ const failures = [];
133
+ for (const entry of results) {
134
+ if (!entry || typeof entry !== 'object')
135
+ continue;
136
+ const record = entry;
137
+ const code = record.code ?? record.Code;
138
+ if (typeof code === 'number' && code !== 0) {
139
+ const key = record.function_key ?? record.functionKey ?? record.FunctionKey;
140
+ const message = record.msg ?? record.Msg ?? record.message ?? '';
141
+ failures.push(`${String(key ?? '(unknown)')}: code=${code}${message ? ` ${String(message)}` : ''}`);
142
+ }
143
+ }
144
+ if (failures.length > 0) {
145
+ throw new Error(`AI Function sync failed for ${failures.length} function(s): ${failures.join('; ')}`);
146
+ }
147
+ }
148
+ // syncAIFunctionsFullCover 走 OpenAPI 全量覆盖同步(对齐 update_functions 心智):传本地全集,服务端 diff 出
149
+ // add/update/delete + 逐条校验码。deploy 与 `ai sync` 命令共用。空集合仍会清空远端 AI Function(全量覆盖语义)。
150
+ // 任一条 results[].code != 0 立即抛错,避免 deploy 在 AI 同步失败后继续 artifact/publish。
151
+ export function syncAIFunctionsFullCover(appToken, items, env, cwd) {
152
+ const token = encodeURIComponent(appToken);
153
+ let response;
154
+ try {
155
+ response = runLarkCli([
156
+ 'api',
157
+ 'POST',
158
+ `/open-apis/base/v3/sites/${token}/ai_functions/update`,
159
+ '--data',
160
+ buildUpdatePayload(items),
161
+ ], env, cwd);
162
+ }
163
+ catch (error) {
164
+ // 顶层失败不能覆盖服务端保留的逐条诊断。
165
+ if (error instanceof LarkCliError && error.details.results) {
166
+ assertAIFunctionResultsOk({ results: error.details.results });
167
+ }
168
+ throw aiFunctionAccessError(error);
169
+ }
170
+ const data = responseData(response);
171
+ assertAIFunctionResultsOk(data);
172
+ return data;
173
+ }
174
+ function remoteAIFunctionKeys(appToken, env, cwd) {
175
+ const data = responseData(runAIFunctionApi([
176
+ 'api',
177
+ 'GET',
178
+ `/open-apis/base/v3/sites/${encodeURIComponent(appToken)}/ai_functions`,
179
+ ], env, cwd));
180
+ const list = Array.isArray(data.functions) ? data.functions : [];
181
+ return list.flatMap((entry) => {
182
+ if (!entry || typeof entry !== 'object')
183
+ return [];
184
+ const record = entry;
185
+ const key = record.function_key ?? record.functionKey;
186
+ return typeof key === 'string' && key !== '' ? [key] : [];
187
+ });
188
+ }
189
+ // restoreRemoteAIFunctions 把远端 AI Function 草稿配置写回 <workspace>/ai/<key>/meta.json。
190
+ // pull 调用它,让"修改已有应用前先恢复远端 AI Function"由 CLI 完成,而不是交给 Agent 判断。
191
+ // 当前用户未开通 AI Function(800004011)时不算失败:本地不落 ai/,后续 deploy 自动跳过同步,远端保持原样。
192
+ export function restoreRemoteAIFunctions(appToken, workspace, env, cwd) {
193
+ let keys;
194
+ try {
195
+ keys = remoteAIFunctionKeys(appToken, env, cwd);
196
+ }
197
+ catch (error) {
198
+ if (isAIFunctionFeatureNotEnabled(error))
199
+ return { status: 'not_enabled' };
200
+ throw error;
201
+ }
202
+ const root = aiFunctionsRoot(workspace);
203
+ for (const functionKey of keys) {
204
+ if (functionKey.length > 64 || !FUNCTION_ID_PATTERN.test(functionKey)) {
205
+ throw new Error(`Remote AI Function key is not restorable: ${functionKey}`);
206
+ }
207
+ const detail = responseData(runAIFunctionApi([
208
+ 'api',
209
+ 'GET',
210
+ `/open-apis/base/v3/sites/${encodeURIComponent(appToken)}/ai_functions/${encodeURIComponent(functionKey)}`,
211
+ ], env, cwd));
212
+ const view = (detail.function ?? detail);
213
+ const configJson = view.config_json ?? view.configJson;
214
+ if (typeof view.name !== 'string' || typeof configJson !== 'string') {
215
+ throw new Error(`Remote AI Function ${functionKey} did not return name and config_json`);
216
+ }
217
+ let config;
218
+ try {
219
+ config = JSON.parse(configJson);
220
+ }
221
+ catch {
222
+ throw new Error(`Remote AI Function ${functionKey} config_json is not valid JSON`);
223
+ }
224
+ const directory = join(root, functionKey);
225
+ mkdirSync(directory, { recursive: true });
226
+ writeFileSync(join(directory, 'meta.json'), `${JSON.stringify({
227
+ name: view.name,
228
+ ...(typeof view.description === 'string' && view.description !== ''
229
+ ? { description: view.description }
230
+ : {}),
231
+ config,
232
+ }, null, 2)}\n`);
233
+ }
234
+ return { status: 'restored', functionKeys: keys };
235
+ }
236
+ // assertNoRemoteAIFunctionLoss 在全量覆盖前核对:远端已有的 key 必须都在本地全集中,否则拒绝,
237
+ // 防止本地不完整(未 pull、他人新增)时把远端 AI Function 静默删除。删除只能经显式 `ai-functions sync`。
238
+ // 未开通 AI Function 的用户 list 会被拦(800004011);此时直接放行,随后的同步会返回带降级说明的同一错误。
239
+ export function assertNoRemoteAIFunctionLoss(appToken, items, env, cwd) {
240
+ let remote;
241
+ try {
242
+ remote = remoteAIFunctionKeys(appToken, env, cwd);
243
+ }
244
+ catch (error) {
245
+ if (isAIFunctionFeatureNotEnabled(error))
246
+ return;
247
+ throw error;
248
+ }
249
+ const local = new Set(items.map((item) => item.functionKey));
250
+ const missing = remote.filter((key) => !local.has(key));
251
+ if (missing.length > 0) {
252
+ throw new Error(`deploy would delete remote AI Functions missing from local ai/: ${missing.join(', ')}. Restore them with \`pull\` into a fresh directory or \`ai-functions pull <functionKey>\`; deleting requires explicit user authorization and \`ai-functions sync\`.`);
253
+ }
254
+ }
255
+ // deploy 只在本地声明了 AI Function 时同步。空集合不代表用户显式要求清空远端资源,
256
+ // 因而不能为普通 Page/Database Function/FaaS 发布额外请求尚未开放的 AI Function 接口。
257
+ // 显式 `ai sync` 仍直接调用 syncAIFunctionsFullCover,保留空集合全量清空语义。
258
+ export function syncAIFunctionsForDeploy(appToken, items, env, cwd) {
259
+ if (items.length === 0) {
260
+ return { skipped: true, reason: 'no_local_ai_functions' };
261
+ }
262
+ assertNoRemoteAIFunctionLoss(appToken, items, env, cwd);
263
+ return syncAIFunctionsFullCover(appToken, items, env, cwd);
264
+ }
265
+ async function resolveEnv(workspace, runtimeProfile) {
266
+ const config = readConfig(workspace);
267
+ assertProjectRuntimeProfile(config.runtimeProfile, runtimeProfile);
268
+ const env = await runtimeProfile.commandEnvironment();
269
+ return { config, env };
270
+ }
271
+ // listAIFunctions 列出 Site 下 AI Function。
272
+ export async function listAIFunctions(options) {
273
+ const workspace = resolve(options.directory);
274
+ const runtimeProfile = options.runtimeProfile ?? ONLINE_RUNTIME_PROFILE;
275
+ const { config, env } = await resolveEnv(workspace, runtimeProfile);
276
+ const response = runAIFunctionApi([
277
+ 'api',
278
+ 'GET',
279
+ `/open-apis/base/v3/sites/${encodeURIComponent(config.appToken)}/ai_functions`,
280
+ ], env, workspace);
281
+ return responseData(response);
282
+ }
283
+ // getAIFunction 读取单个 AI Function 配置(用于本地编辑 / diff)。
284
+ export async function getAIFunction(functionKey, options) {
285
+ const workspace = resolve(options.directory);
286
+ const runtimeProfile = options.runtimeProfile ?? ONLINE_RUNTIME_PROFILE;
287
+ const { config, env } = await resolveEnv(workspace, runtimeProfile);
288
+ const response = runAIFunctionApi([
289
+ 'api',
290
+ 'GET',
291
+ `/open-apis/base/v3/sites/${encodeURIComponent(config.appToken)}/ai_functions/${encodeURIComponent(functionKey)}`,
292
+ ], env, workspace);
293
+ return responseData(response);
294
+ }
295
+ // syncAIFunctions 把本地 ai/ 全集全量覆盖同步到 Site。
296
+ export async function syncAIFunctions(options) {
297
+ const workspace = resolve(options.directory);
298
+ const runtimeProfile = options.runtimeProfile ?? ONLINE_RUNTIME_PROFILE;
299
+ const { config, env } = await resolveEnv(workspace, runtimeProfile);
300
+ const items = collectLocalAIFunctions(workspace);
301
+ const data = syncAIFunctionsFullCover(config.appToken, items, env, workspace);
302
+ return {
303
+ ok: true,
304
+ appToken: config.appToken,
305
+ count: items.length,
306
+ results: data,
307
+ };
308
+ }
309
+ // validateAIFunction 静态校验单个本地 AI Function(保存/发布前,按能力分支),不落库。
310
+ export async function validateAIFunction(functionKey, options) {
311
+ const workspace = resolve(options.directory);
312
+ const runtimeProfile = options.runtimeProfile ?? ONLINE_RUNTIME_PROFILE;
313
+ const { config, env } = await resolveEnv(workspace, runtimeProfile);
314
+ const items = collectLocalAIFunctions(workspace);
315
+ const target = items.find((item) => item.functionKey === functionKey);
316
+ if (!target) {
317
+ throw new Error(`AI Function not found in ${AI_FUNCTIONS_DIR}/: ${functionKey}`);
318
+ }
319
+ const response = runAIFunctionApi([
320
+ 'api',
321
+ 'POST',
322
+ `/open-apis/base/v3/sites/${encodeURIComponent(config.appToken)}/ai_functions/validate`,
323
+ '--data',
324
+ JSON.stringify({
325
+ function: {
326
+ config_json: target.configJson,
327
+ description: target.description,
328
+ function_key: target.functionKey,
329
+ name: target.name,
330
+ },
331
+ }),
332
+ ], env, workspace);
333
+ const data = responseData(response);
334
+ if (data.is_success !== true) {
335
+ const message = String(data.err_msg ?? 'unknown validation error');
336
+ throw new Error(`AI Function validation failed: ${message}`);
337
+ }
338
+ return data;
339
+ }
340
+ function readCapabilityType(data) {
341
+ const value = data.function;
342
+ if (!value || typeof value !== 'object') {
343
+ throw new Error('AI Function detail does not contain function');
344
+ }
345
+ const view = value;
346
+ const raw = view.config_json;
347
+ if (typeof raw !== 'string' || raw === '') {
348
+ throw new Error('AI Function detail is missing config_json');
349
+ }
350
+ let parsed;
351
+ try {
352
+ parsed = JSON.parse(raw);
353
+ }
354
+ catch {
355
+ throw new Error('AI Function detail config_json is not valid JSON');
356
+ }
357
+ if (!parsed || typeof parsed !== 'object') {
358
+ throw new Error('AI Function detail config_json is not an object');
359
+ }
360
+ const capability = parsed.capability_type;
361
+ if (typeof capability !== 'string' || !CAPABILITY_TYPES.has(capability)) {
362
+ throw new Error('AI Function detail contains invalid capability_type');
363
+ }
364
+ return capability;
365
+ }
366
+ // debugAIFunction 调试 text/vision 时走 unary 聚合;image/video 走统一 tasks 提交接口。
367
+ export async function debugAIFunction(functionKey, options) {
368
+ const workspace = resolve(options.directory);
369
+ const runtimeProfile = options.runtimeProfile ?? ONLINE_RUNTIME_PROFILE;
370
+ const { config, env } = await resolveEnv(workspace, runtimeProfile);
371
+ const token = encodeURIComponent(config.appToken);
372
+ const key = encodeURIComponent(functionKey);
373
+ const detail = runAIFunctionApi(['api', 'GET', `/open-apis/base/v3/sites/${token}/ai_functions/${key}`], env, workspace);
374
+ const capabilityType = readCapabilityType(responseData(detail));
375
+ const body = JSON.stringify({
376
+ input: options.input ?? {},
377
+ messages: options.messages ?? [],
378
+ variables: options.variables ?? {},
379
+ });
380
+ const response = runAIFunctionApi([
381
+ 'api',
382
+ 'POST',
383
+ `/open-apis/base/v3/sites/${token}/ai_functions/${key}/${capabilityType === 'image' || capabilityType === 'video' ? 'tasks' : 'invoke'}`,
384
+ '--params',
385
+ JSON.stringify({ env: options.env }),
386
+ '--data',
387
+ body,
388
+ ], env, workspace);
389
+ return responseData(response);
390
+ }
391
+ // getAIFunctionTask 查询 OpenAPI image/video 媒体任务状态。
392
+ export async function getAIFunctionTask(functionKey, taskId, options) {
393
+ const workspace = resolve(options.directory);
394
+ const runtimeProfile = options.runtimeProfile ?? ONLINE_RUNTIME_PROFILE;
395
+ const { config, env } = await resolveEnv(workspace, runtimeProfile);
396
+ const token = encodeURIComponent(config.appToken);
397
+ const key = encodeURIComponent(functionKey);
398
+ const task = encodeURIComponent(taskId);
399
+ const response = runAIFunctionApi([
400
+ 'api',
401
+ 'GET',
402
+ `/open-apis/base/v3/sites/${token}/ai_functions/${key}/tasks/${task}`,
403
+ '--params',
404
+ JSON.stringify({ env: options.env }),
405
+ ], env, workspace);
406
+ return responseData(response);
407
+ }
408
+ // getAIFunctionUsage 读天表聚合的 Owner 可见用量(总量 + 按日期/function/能力分布),走 OpenAPI usage/summary。
409
+ export async function getAIFunctionUsage(options) {
410
+ const workspace = resolve(options.directory);
411
+ const runtimeProfile = options.runtimeProfile ?? ONLINE_RUNTIME_PROFILE;
412
+ const { config, env } = await resolveEnv(workspace, runtimeProfile);
413
+ const token = encodeURIComponent(config.appToken);
414
+ const params = {};
415
+ if (options.from !== undefined)
416
+ params.from = options.from;
417
+ if (options.to !== undefined)
418
+ params.to = options.to;
419
+ if (options.env)
420
+ params.env = options.env;
421
+ if (options.functionKey)
422
+ params.function_key = options.functionKey;
423
+ if (options.model)
424
+ params.model = options.model;
425
+ if (options.capabilityType)
426
+ params.capability_type = options.capabilityType;
427
+ const response = runAIFunctionApi([
428
+ 'api',
429
+ 'GET',
430
+ `/open-apis/base/v3/sites/${token}/ai_functions/usage/summary`,
431
+ '--params',
432
+ JSON.stringify(params),
433
+ ], env, workspace);
434
+ return responseData(response);
435
+ }
436
+ //# sourceMappingURL=ai-functions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-functions.js","sourceRoot":"","sources":["../src/ai-functions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,SAAS,EACT,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,2BAA2B,EAC3B,sBAAsB,GAEvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEzD,wFAAwF;AACxF,+EAA+E;AAC/E,yCAAyC;AACzC,MAAM,CAAC,MAAM,oCAAoC,GAAG,SAAS,CAAC;AAC9D,MAAM,CAAC,MAAM,uCAAuC,GAClD,+QAA+Q,CAAC;AAElR,MAAM,UAAU,6BAA6B,CAAC,KAAc;IAC1D,OAAO,CACL,KAAK,YAAY,YAAY;QAC7B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,oCAAoC,CACpE,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc;IAC3C,IACE,KAAK,YAAY,YAAY;QAC7B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,oCAAoC,EACnE,CAAC;QACD,OAAO,IAAI,YAAY,CAAC;YACtB,GAAG,KAAK,CAAC,OAAO;YAChB,OAAO,EAAE,uCAAuC;SACjD,CAAC,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CACvB,IAAc,EACd,GAAsB,EACtB,GAAY;IAEZ,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,2EAA2E;AAC3E,oFAAoF;AAEpF,MAAM,mBAAmB,GAAG,kBAAkB,CAAC;AAC/C,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAE9B,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAUvE,SAAS,0BAA0B,CACjC,MAA+B;IAE/B,MAAM,UAAU,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IACjC,OAAO,UAAU,CAAC,MAAM,CAAC;IACzB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,GAAG,EAAE,GAAI,IAAgC,EAAE,CAAC;QACtD,OAAO,IAAI,CAAC,UAAU,CAAC;QACvB,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC;IACzB,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,eAAe,CAAC,SAAiB;IACxC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,gBAAgB,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,IACE,WAAW,CAAC,MAAM,GAAG,CAAC;QACtB,WAAW,CAAC,MAAM,GAAG,EAAE;QACvB,CAAC,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,EACtC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,4BAA4B,WAAW,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAIrD,CAAC;IACF,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,EAAE,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,gDAAgD,IAAI,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,IACE,QAAQ,CAAC,WAAW,KAAK,SAAS;QAClC,OAAO,QAAQ,CAAC,WAAW,KAAK,QAAQ,EACxC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,6CAA6C,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,OAAO,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,yCAAyC,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,MAAM,GAAG,0BAA0B,CACvC,QAAQ,CAAC,MAAiC,CAC3C,CAAC;IACF,IACE,OAAO,MAAM,CAAC,eAAe,KAAK,QAAQ;QAC1C,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,EAC7C,CAAC;QACD,MAAM,IAAI,KAAK,CACb,uEAAuE,IAAI,EAAE,CAC9E,CAAC;IACJ,CAAC;IACD,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QAClC,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,EAAE;QACvC,WAAW;QACX,IAAI,EAAE,QAAQ,CAAC,IAAI;KACpB,CAAC;AACJ,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,uBAAuB,CAAC,SAAiB;IACvD,MAAM,IAAI,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,KAAK,GAAsB,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/D,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAAE,SAAS;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE;YAAE,SAAS;QAC5D,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,8BAA8B,gBAAgB,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,gEAAgE;AAChE,SAAS,kBAAkB,CAAC,KAAwB;IAClD,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACjC,WAAW,EAAE,IAAI,CAAC,UAAU;YAC5B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,YAAY,EAAE,IAAI,CAAC,WAAW;YAC9B,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;KACJ,CAAC,CAAC;AACL,CAAC;AAED,yDAAyD;AACzD,8CAA8C;AAC9C,4BAA4B;AAC5B,SAAS,yBAAyB,CAAC,IAA6B;IAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC;IAC7C,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAC9C,OAAO;IACT,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAClD,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC;QACxC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YAC3C,MAAM,GAAG,GACP,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC;YAClE,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;YACjE,QAAQ,CAAC,IAAI,CACX,GAAG,MAAM,CAAC,GAAG,IAAI,WAAW,CAAC,UAAU,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACrF,CAAC;QACJ,CAAC;IACH,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,+BAA+B,QAAQ,CAAC,MAAM,iBAAiB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,qFAAqF;AACrF,mFAAmF;AACnF,wEAAwE;AACxE,MAAM,UAAU,wBAAwB,CACtC,QAAgB,EAChB,KAAwB,EACxB,GAAsB,EACtB,GAAY;IAEZ,MAAM,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,QAAQ,CAAC;IACb,IAAI,CAAC;QACH,QAAQ,GAAG,UAAU,CACnB;YACE,KAAK;YACL,MAAM;YACN,4BAA4B,KAAK,sBAAsB;YACvD,QAAQ;YACR,kBAAkB,CAAC,KAAK,CAAC;SAC1B,EACD,GAAG,EACH,GAAG,CACJ,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sBAAsB;QACtB,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAC3D,yBAAyB,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IACD,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACpC,yBAAyB,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,oBAAoB,CAC3B,QAAgB,EAChB,GAAsB,EACtB,GAAY;IAEZ,MAAM,IAAI,GAAG,YAAY,CACvB,gBAAgB,CACd;QACE,KAAK;QACL,KAAK;QACL,4BAA4B,kBAAkB,CAAC,QAAQ,CAAC,eAAe;KACxE,EACD,GAAG,EACH,GAAG,CACJ,CACF,CAAC;IACF,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IACjE,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC5B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,WAAW,CAAC;QACtD,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC;AAMD,kFAAkF;AAClF,+DAA+D;AAC/D,wEAAwE;AACxE,MAAM,UAAU,wBAAwB,CACtC,QAAgB,EAChB,SAAiB,EACjB,GAAsB,EACtB,GAAY;IAEZ,IAAI,IAAc,CAAC;IACnB,IAAI,CAAC;QACH,IAAI,GAAG,oBAAoB,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,6BAA6B,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;QAC3E,MAAM,KAAK,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IACxC,KAAK,MAAM,WAAW,IAAI,IAAI,EAAE,CAAC;QAC/B,IAAI,WAAW,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACtE,MAAM,IAAI,KAAK,CACb,6CAA6C,WAAW,EAAE,CAC3D,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,CACzB,gBAAgB,CACd;YACE,KAAK;YACL,KAAK;YACL,4BAA4B,kBAAkB,CAAC,QAAQ,CAAC,iBAAiB,kBAAkB,CAAC,WAAW,CAAC,EAAE;SAC3G,EACD,GAAG,EACH,GAAG,CACJ,CACF,CAAC;QACF,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAA4B,CAAC;QACpE,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,UAAU,CAAC;QACvD,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;YACpE,MAAM,IAAI,KAAK,CACb,sBAAsB,WAAW,sCAAsC,CACxE,CAAC;QACJ,CAAC;QACD,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CACb,sBAAsB,WAAW,gCAAgC,CAClE,CAAC;QACJ,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC1C,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,aAAa,CACX,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAC5B,GAAG,IAAI,CAAC,SAAS,CACf;YACE,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,GAAG,CAAC,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,KAAK,EAAE;gBACjE,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE;gBACnC,CAAC,CAAC,EAAE,CAAC;YACP,MAAM;SACP,EACD,IAAI,EACJ,CAAC,CACF,IAAI,CACN,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;AACpD,CAAC;AAED,kEAAkE;AAClE,yEAAyE;AACzE,qEAAqE;AACrE,MAAM,UAAU,4BAA4B,CAC1C,QAAgB,EAChB,KAAwB,EACxB,GAAsB,EACtB,GAAY;IAEZ,IAAI,MAAgB,CAAC;IACrB,IAAI,CAAC;QACH,MAAM,GAAG,oBAAoB,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,6BAA6B,CAAC,KAAK,CAAC;YAAE,OAAO;QACjD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACxD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,mEAAmE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,sKAAsK,CAC5P,CAAC;IACJ,CAAC;AACH,CAAC;AAED,qDAAqD;AACrD,kEAAkE;AAClE,2DAA2D;AAC3D,MAAM,UAAU,wBAAwB,CACtC,QAAgB,EAChB,KAAwB,EACxB,GAAsB,EACtB,GAAY;IAEZ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;IAC5D,CAAC;IACD,4BAA4B,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACxD,OAAO,wBAAwB,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAC7D,CAAC;AAED,KAAK,UAAU,UAAU,CACvB,SAAiB,EACjB,cAA8B;IAE9B,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACrC,2BAA2B,CAAC,MAAM,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;IACnE,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,kBAAkB,EAAE,CAAC;IACtD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACzB,CAAC;AAOD,yCAAyC;AACzC,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAiC;IAEjC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,sBAAsB,CAAC;IACxE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,gBAAgB,CAC/B;QACE,KAAK;QACL,KAAK;QACL,4BAA4B,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe;KAC/E,EACD,GAAG,EACH,SAAS,CACV,CAAC;IACF,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC;AAED,oDAAoD;AACpD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,WAAmB,EACnB,OAAiC;IAEjC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,sBAAsB,CAAC;IACxE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,gBAAgB,CAC/B;QACE,KAAK;QACL,KAAK;QACL,4BAA4B,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,kBAAkB,CAAC,WAAW,CAAC,EAAE;KAClH,EACD,GAAG,EACH,SAAS,CACV,CAAC;IACF,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC;AAED,0CAA0C;AAC1C,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAiC;IAEjC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,sBAAsB,CAAC;IACxE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACpE,MAAM,KAAK,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,wBAAwB,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IAC9E,OAAO;QACL,EAAE,EAAE,IAAI;QACR,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,KAAK,EAAE,KAAK,CAAC,MAAM;QACnB,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED,6DAA6D;AAC7D,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,WAAmB,EACnB,OAAiC;IAEjC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,sBAAsB,CAAC;IACxE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACpE,MAAM,KAAK,GAAG,uBAAuB,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC;IACtE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,4BAA4B,gBAAgB,MAAM,WAAW,EAAE,CAChE,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,gBAAgB,CAC/B;QACE,KAAK;QACL,MAAM;QACN,4BAA4B,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB;QACvF,QAAQ;QACR,IAAI,CAAC,SAAS,CAAC;YACb,QAAQ,EAAE;gBACR,WAAW,EAAE,MAAM,CAAC,UAAU;gBAC9B,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,YAAY,EAAE,MAAM,CAAC,WAAW;gBAChC,IAAI,EAAE,MAAM,CAAC,IAAI;aAClB;SACF,CAAC;KACH,EACD,GAAG,EACH,SAAS,CACV,CAAC;IACF,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,0BAA0B,CAAC,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,kCAAkC,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAYD,SAAS,kBAAkB,CAAC,IAA6B;IACvD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC5B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,IAAI,GAAG,KAAgC,CAAC;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC;IAC7B,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,UAAU,GAAI,MAAkC,CAAC,eAAe,CAAC;IACvE,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,WAAmB,EACnB,OAA+B;IAE/B,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,sBAAsB,CAAC;IACxE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACpE,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,gBAAgB,CAC7B,CAAC,KAAK,EAAE,KAAK,EAAE,4BAA4B,KAAK,iBAAiB,GAAG,EAAE,CAAC,EACvE,GAAG,EACH,SAAS,CACV,CAAC;IACF,MAAM,cAAc,GAAG,kBAAkB,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;QAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;QAChC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE;KACnC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,gBAAgB,CAC/B;QACE,KAAK;QACL,MAAM;QACN,4BAA4B,KAAK,iBAAiB,GAAG,IAAI,cAAc,KAAK,OAAO,IAAI,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;QACxI,UAAU;QACV,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;QACpC,QAAQ;QACR,IAAI;KACL,EACD,GAAG,EACH,SAAS,CACV,CAAC;IACF,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC;AAMD,mDAAmD;AACnD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,WAAmB,EACnB,MAAc,EACd,OAA8B;IAE9B,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,sBAAsB,CAAC;IACxE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACpE,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,gBAAgB,CAC/B;QACE,KAAK;QACL,KAAK;QACL,4BAA4B,KAAK,iBAAiB,GAAG,UAAU,IAAI,EAAE;QACrE,UAAU;QACV,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KACrC,EACD,GAAG,EACH,SAAS,CACV,CAAC;IACF,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC;AAaD,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAA+B;IAE/B,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,sBAAsB,CAAC;IACxE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IACpE,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;QAAE,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3D,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS;QAAE,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;IACrD,IAAI,OAAO,CAAC,GAAG;QAAE,MAAM,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAC1C,IAAI,OAAO,CAAC,WAAW;QAAE,MAAM,CAAC,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IACnE,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAChD,IAAI,OAAO,CAAC,cAAc;QAAE,MAAM,CAAC,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAC5E,MAAM,QAAQ,GAAG,gBAAgB,CAC/B;QACE,KAAK;QACL,KAAK;QACL,4BAA4B,KAAK,6BAA6B;QAC9D,UAAU;QACV,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;KACvB,EACD,GAAG,EACH,SAAS,CACV,CAAC;IACF,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC"}
package/dist/archive.d.ts CHANGED
@@ -1,3 +1,15 @@
1
+ interface MetaItem {
2
+ functionId: string;
3
+ functionType: 1 | 2 | 5;
4
+ name: string;
5
+ description: string;
6
+ sourceCode: string;
7
+ }
8
+ export interface DatabaseFunctionInputContract {
9
+ functionId: string;
10
+ functionType: MetaItem['functionType'];
11
+ inputSchema: Record<string, unknown>;
12
+ }
1
13
  export interface SQLValidationArtifact {
2
14
  functionId: string;
3
15
  path: string;
@@ -6,6 +18,14 @@ export interface DatabaseMetadataArtifacts {
6
18
  metaList: string;
7
19
  sqlValidation: SQLValidationArtifact[];
8
20
  }
21
+ /** Read the validated Function input contracts used by Page type generation. */
22
+ export declare function readDatabaseFunctionInputContracts(workspace: string): DatabaseFunctionInputContract[];
23
+ /** Validate Function contracts without changing metadata or publish artifacts. */
24
+ export declare function validateDatabaseMetadata(workspace: string): {
25
+ sql: number;
26
+ faas: number;
27
+ mutation: number;
28
+ };
9
29
  export declare function prepareDatabaseMetadata(workspace: string): DatabaseMetadataArtifacts;
10
30
  export declare function archiveDatabase(workspace: string, metadata?: DatabaseMetadataArtifacts): Promise<{
11
31
  archive: string;
@@ -13,4 +33,5 @@ export declare function archiveDatabase(workspace: string, metadata?: DatabaseMe
13
33
  sqlValidation: SQLValidationArtifact[];
14
34
  displayArchive: string;
15
35
  }>;
36
+ export {};
16
37
  //# sourceMappingURL=archive.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../src/archive.ts"],"names":[],"mappings":"AA8BA,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,qBAAqB,EAAE,CAAC;CACxC;AAmKD,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,GAChB,yBAAyB,CAK3B;AAED,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,QAAQ,GAAE,yBAA8D;;;;;GAazE"}
1
+ {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../src/archive.ts"],"names":[],"mappings":"AA4BA,UAAU,QAAQ;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,6BAA6B;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;IACvC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,qBAAqB,EAAE,CAAC;CACxC;AAqID,gFAAgF;AAChF,wBAAgB,kCAAkC,CAChD,SAAS,EAAE,MAAM,GAChB,6BAA6B,EAAE,CAcjC;AAED,kFAAkF;AAClF,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM;IAGtD,GAAG;IACH,IAAI;IACJ,QAAQ;EAEX;AAmFD,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,GAChB,yBAAyB,CAK3B;AAED,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,QAAQ,GAAE,yBAA8D;;;;;GAazE"}
package/dist/archive.js CHANGED
@@ -1,7 +1,9 @@
1
- import { createWriteStream, existsSync, mkdirSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync, } from 'node:fs';
1
+ import { createWriteStream, existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync, } from 'node:fs';
2
2
  import { basename, dirname, join, relative, resolve } from 'node:path';
3
3
  import { ZipArchive } from 'archiver';
4
+ import { readMutationMetaItem } from './mutation.js';
4
5
  import { deriveSQLInputSchema, normalizeFunctionInputSchema, } from './function-schema.js';
6
+ import { DATABASE_FUNCTIONS_DIRECTORY, requireDatabaseFunctionsDirectory, } from './project-layout.js';
5
7
  const FUNCTION_ID_PATTERN = /^[A-Za-z0-9_-]+$/;
6
8
  const MAX_FUNCTIONS = 200;
7
9
  function findMetaFiles(directory) {
@@ -38,20 +40,20 @@ function readMetaItem(type, path) {
38
40
  };
39
41
  if (type === 'sql') {
40
42
  if (manifest.inputSchema !== undefined) {
41
- throw new Error(`SQL inputSchema is derived from meta.params and must not be set: ${path}`);
43
+ throw new Error(`Database Function inputSchema is derived from meta.params and must not be set: ${path}`);
42
44
  }
43
45
  let meta = manifest.meta;
44
46
  if (meta === undefined) {
45
47
  meta = { params: [] };
46
48
  }
47
49
  else if (!meta || typeof meta !== 'object' || Array.isArray(meta)) {
48
- throw new Error(`SQL meta must be an object: ${path}`);
50
+ throw new Error(`Database Function meta must be an object: ${path}`);
49
51
  }
50
52
  else if (!Object.hasOwn(meta, 'params')) {
51
53
  meta = { ...meta, params: [] };
52
54
  }
53
55
  else if (!Array.isArray(meta.params)) {
54
- throw new Error(`SQL meta.params must be an array: ${path}`);
56
+ throw new Error(`Database Function meta.params must be an array: ${path}`);
55
57
  }
56
58
  const sql = readFileSync(join(dirname(path), 'main.sql'), 'utf8');
57
59
  item.sourceCode = JSON.stringify({
@@ -70,13 +72,28 @@ function readMetaItem(type, path) {
70
72
  }
71
73
  return item;
72
74
  }
73
- function writeMetadata(workspace, output) {
75
+ function readMetadata(workspace) {
76
+ const databaseFunctions = requireDatabaseFunctionsDirectory(workspace);
77
+ const mutationRoot = join(workspace, 'mutations');
78
+ if (existsSync(mutationRoot)) {
79
+ for (const entry of readdirSync(mutationRoot, { withFileTypes: true })) {
80
+ if (entry.isDirectory() &&
81
+ (!existsSync(join(mutationRoot, entry.name, 'meta.json')) ||
82
+ !existsSync(join(mutationRoot, entry.name, 'spec.json')))) {
83
+ throw new Error(`Mutation requires meta.json and spec.json: ${entry.name}`);
84
+ }
85
+ }
86
+ }
74
87
  const files = [
88
+ ...findMetaFiles(mutationRoot).map((path) => ({
89
+ type: 'mutation',
90
+ path,
91
+ })),
75
92
  ...findMetaFiles(join(workspace, 'server-functions/functions')).map((path) => ({
76
93
  type: 'faas',
77
94
  path,
78
95
  })),
79
- ...findMetaFiles(join(workspace, 'sql')).map((path) => ({
96
+ ...findMetaFiles(join(workspace, databaseFunctions)).map((path) => ({
80
97
  type: 'sql',
81
98
  path,
82
99
  })),
@@ -86,13 +103,39 @@ function writeMetadata(workspace, output) {
86
103
  }
87
104
  const ids = new Set();
88
105
  const items = files.map(({ type, path }) => {
89
- const item = readMetaItem(type, path);
106
+ const item = type === 'mutation'
107
+ ? readMutationMetaItem(path, workspace)
108
+ : readMetaItem(type, path);
90
109
  if (ids.has(item.functionId)) {
91
110
  throw new Error(`Duplicate Function ID: ${item.functionId}`);
92
111
  }
93
112
  ids.add(item.functionId);
94
113
  return item;
95
114
  });
115
+ return items;
116
+ }
117
+ /** Read the validated Function input contracts used by Page type generation. */
118
+ export function readDatabaseFunctionInputContracts(workspace) {
119
+ return readMetadata(databaseProject(workspace)).map((item) => ({
120
+ functionId: item.functionId,
121
+ functionType: item.functionType,
122
+ // Mutation uses spec.params rather than discovery inputSchema; keep its local call input as an array.
123
+ inputSchema: item.functionType === 5
124
+ ? { type: 'array' }
125
+ : JSON.parse(item.sourceCode).inputSchema,
126
+ }));
127
+ }
128
+ /** Validate Function contracts without changing metadata or publish artifacts. */
129
+ export function validateDatabaseMetadata(workspace) {
130
+ const items = readMetadata(databaseProject(workspace));
131
+ return {
132
+ sql: items.filter((item) => item.functionType === 1).length,
133
+ faas: items.filter((item) => item.functionType === 2).length,
134
+ mutation: items.filter((item) => item.functionType === 5).length,
135
+ };
136
+ }
137
+ function writeMetadata(workspace, output) {
138
+ const items = readMetadata(workspace);
96
139
  const validations = join(output, 'sql-validation');
97
140
  mkdirSync(output, { recursive: true });
98
141
  rmSync(validations, { recursive: true, force: true });
@@ -109,6 +152,11 @@ function writeMetadata(workspace, output) {
109
152
  return { metaList, sqlValidation };
110
153
  }
111
154
  function createArchive(workspace, destination) {
155
+ const readme = join(workspace, 'README.md');
156
+ const readmeMetadata = lstatSync(readme, { throwIfNoEntry: false });
157
+ if (readmeMetadata && !readmeMetadata.isFile()) {
158
+ return Promise.reject(new Error('Project README.md must be a regular file'));
159
+ }
112
160
  return new Promise((resolvePromise, reject) => {
113
161
  const output = createWriteStream(destination);
114
162
  const zip = new ZipArchive({ zlib: { level: 9 } });
@@ -117,7 +165,7 @@ function createArchive(workspace, destination) {
117
165
  zip.once('warning', reject);
118
166
  zip.once('error', reject);
119
167
  zip.pipe(output);
120
- zip.glob('{page,server-functions,sql}/**/*', {
168
+ const globOptions = {
121
169
  cwd: workspace,
122
170
  dot: true,
123
171
  ignore: [
@@ -126,18 +174,29 @@ function createArchive(workspace, destination) {
126
174
  '**/.DS_Store',
127
175
  '**/.env',
128
176
  '**/.env.*',
177
+ '**/.npmrc',
178
+ '**/.yarnrc',
179
+ '**/.yarnrc.yml',
180
+ '**/.pnpmrc',
129
181
  ],
130
- });
182
+ };
183
+ zip.glob('{page,server-functions,mutations}/**/*', globOptions);
184
+ const databaseFunctions = requireDatabaseFunctionsDirectory(workspace);
185
+ zip.glob('**/*', { ...globOptions, cwd: join(workspace, databaseFunctions) }, { prefix: DATABASE_FUNCTIONS_DIRECTORY });
186
+ if (readmeMetadata) {
187
+ zip.file(readme, { name: 'README.md' });
188
+ }
131
189
  void zip.finalize();
132
190
  });
133
191
  }
134
192
  function databaseProject(workspace) {
135
193
  const project = resolve(workspace);
136
- for (const directory of ['page', 'server-functions', 'sql']) {
194
+ for (const directory of ['page', 'server-functions']) {
137
195
  if (!existsSync(join(project, directory))) {
138
196
  throw new Error(`application source not found: ${join(project, directory)}`);
139
197
  }
140
198
  }
199
+ requireDatabaseFunctionsDirectory(project);
141
200
  return project;
142
201
  }
143
202
  export function prepareDatabaseMetadata(workspace) {