@lark-base-open/base-database-cli 1.1.0 → 1.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +86 -0
- package/LICENSE +6 -0
- package/README.md +55 -31
- package/dist/ai-functions.d.ts +42 -0
- package/dist/ai-functions.d.ts.map +1 -0
- package/dist/ai-functions.js +327 -0
- package/dist/ai-functions.js.map +1 -0
- package/dist/archive.d.ts +21 -0
- package/dist/archive.d.ts.map +1 -1
- package/dist/archive.js +65 -10
- package/dist/archive.js.map +1 -1
- package/dist/auth.d.ts +8 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +60 -6
- package/dist/auth.js.map +1 -1
- package/dist/check.d.ts +74 -0
- package/dist/check.d.ts.map +1 -0
- package/dist/check.js +283 -0
- package/dist/check.js.map +1 -0
- package/dist/dependency-policy.d.ts +10 -0
- package/dist/dependency-policy.d.ts.map +1 -0
- package/dist/dependency-policy.js +162 -0
- package/dist/dependency-policy.js.map +1 -0
- package/dist/deploy.d.ts +1 -0
- package/dist/deploy.d.ts.map +1 -1
- package/dist/deploy.js +122 -175
- package/dist/deploy.js.map +1 -1
- package/dist/environment-variables.d.ts +52 -0
- package/dist/environment-variables.d.ts.map +1 -0
- package/dist/environment-variables.js +563 -0
- package/dist/environment-variables.js.map +1 -0
- package/dist/environment.d.ts +1 -1
- package/dist/environment.js +1 -1
- package/dist/environment.js.map +1 -1
- package/dist/function-input-types.d.ts +10 -0
- package/dist/function-input-types.d.ts.map +1 -0
- package/dist/function-input-types.js +160 -0
- package/dist/function-input-types.js.map +1 -0
- package/dist/function-schema.d.ts.map +1 -1
- package/dist/function-schema.js +89 -36
- package/dist/function-schema.js.map +1 -1
- package/dist/init-field-retry.d.ts +17 -0
- package/dist/init-field-retry.d.ts.map +1 -0
- package/dist/init-field-retry.js +127 -0
- package/dist/init-field-retry.js.map +1 -0
- package/dist/init-journal.d.ts +98 -0
- package/dist/init-journal.d.ts.map +1 -0
- package/dist/init-journal.js +492 -0
- package/dist/init-journal.js.map +1 -0
- package/dist/init-schema.d.ts +8 -0
- package/dist/init-schema.d.ts.map +1 -0
- package/dist/init-schema.js +423 -0
- package/dist/init-schema.js.map +1 -0
- package/dist/init.d.ts +14 -0
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +886 -243
- package/dist/init.js.map +1 -1
- package/dist/lark-cli-error.d.ts +46 -0
- package/dist/lark-cli-error.d.ts.map +1 -0
- package/dist/lark-cli-error.js +171 -0
- package/dist/lark-cli-error.js.map +1 -0
- package/dist/lark-cli.d.ts +2 -1
- package/dist/lark-cli.d.ts.map +1 -1
- package/dist/lark-cli.js +292 -29
- package/dist/lark-cli.js.map +1 -1
- package/dist/mutation-schema.d.ts +146 -0
- package/dist/mutation-schema.d.ts.map +1 -0
- package/dist/mutation-schema.js +153 -0
- package/dist/mutation-schema.js.map +1 -0
- package/dist/mutation.d.ts +10 -0
- package/dist/mutation.d.ts.map +1 -0
- package/dist/mutation.js +131 -0
- package/dist/mutation.js.map +1 -0
- package/dist/npm.d.ts +1 -0
- package/dist/npm.d.ts.map +1 -1
- package/dist/npm.js +2 -2
- package/dist/npm.js.map +1 -1
- package/dist/preview-receipt.d.ts.map +1 -1
- package/dist/preview-receipt.js +15 -5
- package/dist/preview-receipt.js.map +1 -1
- package/dist/process.d.ts +3 -1
- package/dist/process.d.ts.map +1 -1
- package/dist/process.js +16 -4
- package/dist/process.js.map +1 -1
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +241 -42
- package/dist/program.js.map +1 -1
- package/dist/project-build.d.ts +25 -0
- package/dist/project-build.d.ts.map +1 -0
- package/dist/project-build.js +229 -0
- package/dist/project-build.js.map +1 -0
- package/dist/project-context.d.ts +344 -0
- package/dist/project-context.d.ts.map +1 -0
- package/dist/project-context.js +485 -0
- package/dist/project-context.js.map +1 -0
- package/dist/project-layout.d.ts +5 -0
- package/dist/project-layout.d.ts.map +1 -0
- package/dist/project-layout.js +24 -0
- package/dist/project-layout.js.map +1 -0
- package/dist/public-sql-error.d.ts +25 -0
- package/dist/public-sql-error.d.ts.map +1 -0
- package/dist/public-sql-error.js +81 -0
- package/dist/public-sql-error.js.map +1 -0
- package/dist/pull.d.ts.map +1 -1
- package/dist/pull.js +54 -15
- package/dist/pull.js.map +1 -1
- package/dist/site-readme.d.ts +3 -0
- package/dist/site-readme.d.ts.map +1 -0
- package/dist/site-readme.js +83 -0
- package/dist/site-readme.js.map +1 -0
- package/dist/workspace-fingerprint.d.ts +21 -1
- package/dist/workspace-fingerprint.d.ts.map +1 -1
- package/dist/workspace-fingerprint.js +81 -2
- package/dist/workspace-fingerprint.js.map +1 -1
- package/package.json +2 -1
- package/skills/lark-base-database/SKILL.md +70 -53
- package/skills/lark-base-database/references/ai-function.md +471 -0
- package/skills/lark-base-database/references/base-capability-routing.md +3 -3
- package/skills/lark-base-database/references/database-function-limitations.md +46 -0
- package/skills/lark-base-database/references/database-function.md +349 -0
- package/skills/lark-base-database/references/design/components/actions-fields.md +16 -0
- package/skills/lark-base-database/references/design/components/code/controls.css +122 -0
- package/skills/lark-base-database/references/design/components/code/controls.tsx +73 -0
- package/skills/lark-base-database/references/design/components/code/date-picker.tsx +42 -0
- package/skills/lark-base-database/references/design/components/code/floating.tsx +41 -0
- package/skills/lark-base-database/references/design/components/code/overlays.tsx +19 -0
- package/skills/lark-base-database/references/design/components/code/select.tsx +34 -0
- package/skills/lark-base-database/references/design/components/code/styles.d.ts +1 -0
- package/skills/lark-base-database/references/design/components/code/theme.css +49 -0
- package/skills/lark-base-database/references/design/components/code/usage.tsx +38 -0
- package/skills/lark-base-database/references/design/components/date-time-number.md +9 -0
- package/skills/lark-base-database/references/design/components/feedback-navigation.md +9 -0
- package/skills/lark-base-database/references/design/components/index.md +18 -0
- package/skills/lark-base-database/references/design/components/overlays.md +9 -0
- package/skills/lark-base-database/references/design/components/patterns/flat-business.md +7 -0
- package/skills/lark-base-database/references/design/components/selection.md +24 -0
- package/skills/lark-base-database/references/design/components.md +91 -0
- package/skills/lark-base-database/references/design/composition.md +90 -0
- package/skills/lark-base-database/references/design/control-recipes.md +107 -0
- package/skills/lark-base-database/references/design/examples.md +172 -0
- package/skills/lark-base-database/references/design/foundations.md +126 -0
- package/skills/lark-base-database/references/design/review.md +82 -0
- package/skills/lark-base-database/references/design/scenes/analysis-report.md +66 -0
- package/skills/lark-base-database/references/design/scenes/brand-showcase.md +70 -0
- package/skills/lark-base-database/references/design/scenes/business-operations.md +85 -0
- package/skills/lark-base-database/references/design/scenes/campaign-report.md +66 -0
- package/skills/lark-base-database/references/design/scenes/dashboard.md +77 -0
- package/skills/lark-base-database/references/design/scenes/festive-campaign.md +69 -0
- package/skills/lark-base-database/references/design/theme.md +27 -0
- package/skills/lark-base-database/references/design/typography.md +56 -0
- package/skills/lark-base-database/references/development.md +165 -32
- package/skills/lark-base-database/references/environment-variables.md +55 -0
- package/skills/lark-base-database/references/faas.md +41 -48
- package/skills/lark-base-database/references/file-transfer.md +25 -25
- package/skills/lark-base-database/references/frontend-design-guide.md +33 -77
- package/skills/lark-base-database/references/mutations.md +295 -0
- package/skills/lark-base-database/references/permission-design.md +24 -24
- package/skills/lark-base-database/references/release.md +54 -27
- package/skills/lark-base-database/references/style-guide.md +10 -67
- package/skills/lark-base-database/references/verification.md +17 -13
- package/skills/lark-base-database/references/workspace.md +71 -22
- package/templates/database-starter/README.md +34 -4
- package/templates/database-starter/database-functions/README.md +8 -0
- package/templates/database-starter/mutations/README.md +19 -0
- package/templates/database-starter/page/README.md +25 -19
- package/templates/database-starter/page/package-lock.json +8 -16
- package/templates/database-starter/page/package.json +2 -3
- package/templates/database-starter/page/src/App.tsx +23 -3
- package/templates/database-starter/page/src/components/UserSelectorEditor/index.tsx +32 -4
- package/templates/database-starter/page/src/components/UserSelectorPanel/index.tsx +104 -34
- package/templates/database-starter/page/src/components/UserSelectorPanel/user-search.test.ts +55 -11
- package/templates/database-starter/page/src/components/UserSelectorPanel/user-search.ts +68 -25
- package/templates/database-starter/page/src/components/database-runtime-ready.tsx +1 -1
- package/templates/database-starter/page/src/components/database-user-menu/index.tsx +4 -7
- package/templates/database-starter/page/src/components/feedback/page-state.tsx +40 -5
- package/templates/database-starter/page/src/components/floating-button/assets/edit-active.svg +3 -0
- package/templates/database-starter/page/src/components/floating-button/assets/edit-default.svg +3 -0
- package/templates/database-starter/page/src/components/floating-button/index.tsx +75 -112
- package/templates/database-starter/page/src/components/floating-button/utils/project-meta.test.ts +107 -37
- package/templates/database-starter/page/src/components/floating-button/utils/project-meta.ts +13 -50
- package/templates/database-starter/page/src/components/ui-language.test.tsx +101 -0
- package/templates/database-starter/page/src/examples/ai-function/ImageTaskOperation.tsx +202 -0
- package/templates/database-starter/page/src/examples/ai-function/README.md +14 -0
- package/templates/database-starter/page/src/examples/ai-function/TextStreamOperation.tsx +184 -0
- package/templates/database-starter/page/src/examples/ai-function/ai-copy.ts +173 -0
- package/templates/database-starter/page/src/examples/ai-function/ai-delta.test.ts +30 -0
- package/templates/database-starter/page/src/examples/ai-function/ai-delta.ts +26 -0
- package/templates/database-starter/page/src/examples/ai-function/ai-language.test.tsx +86 -0
- package/templates/database-starter/page/src/examples/ai-function/ai-media-panel.test.ts +201 -0
- package/templates/database-starter/page/src/examples/ai-function/ai-media-panel.tsx +382 -0
- package/templates/database-starter/page/src/lib/attachment-image.tsx +144 -0
- package/templates/database-starter/page/src/lib/database-function-inputs.generated.ts +4 -0
- package/templates/database-starter/page/src/lib/database-runtime-attachment.test.ts +180 -76
- package/templates/database-starter/page/src/lib/database-runtime.test.ts +130 -10
- package/templates/database-starter/page/src/lib/database-runtime.ts +484 -51
- package/templates/database-starter/page/src/lib/date-time.ts +61 -0
- package/templates/database-starter/page/src/lib/ui-language.ts +86 -0
- package/templates/database-starter/page/src/main.tsx +1 -1
- package/templates/database-starter/page/tsconfig.json +2 -2
- package/templates/database-starter/page/vite.config.ts +1 -2
- package/templates/database-starter/prettierignore +1 -1
- package/templates/database-starter/server-functions/README.md +2 -2
- package/templates/database-starter/server-functions/package-lock.json +4 -4
- package/templates/database-starter/server-functions/package.json +1 -1
- package/dist/agent-guide.d.ts +0 -19
- package/dist/agent-guide.d.ts.map +0 -1
- package/dist/agent-guide.js +0 -31
- package/dist/agent-guide.js.map +0 -1
- package/dist/database-skill.d.ts +0 -24
- package/dist/database-skill.d.ts.map +0 -1
- package/dist/database-skill.js +0 -151
- package/dist/database-skill.js.map +0 -1
- package/skills/lark-base-database/references/base-sql-unsupported.md +0 -42
- package/skills/lark-base-database/references/database-capability-skill.md +0 -40
- package/skills/lark-base-database/references/sql-function.md +0 -289
- package/templates/database-capability/SKILL.md.tmpl +0 -58
- package/templates/database-starter/page/src/components/floating-button/chatbot-entry.test.ts +0 -23
- package/templates/database-starter/page/src/components/floating-button/chatbot-entry.tsx +0 -873
- package/templates/database-starter/page/src/components/floating-button/local-chat-panel.test.ts +0 -25
- package/templates/database-starter/page/src/components/floating-button/local-chat-panel.tsx +0 -197
- package/templates/database-starter/page/src/components/floating-button/utils/env.ts +0 -18
- package/templates/database-starter/sql/README.md +0 -8
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/** 将时间点投影到显式指定的业务时区,不使用浏览器或服务器默认时区。 */
|
|
2
|
+
function zonedParts(epochMs: number, timeZone: string) {
|
|
3
|
+
if (
|
|
4
|
+
!Number.isFinite(epochMs) ||
|
|
5
|
+
!Number.isFinite(new Date(epochMs).getTime())
|
|
6
|
+
) {
|
|
7
|
+
throw new RangeError('Expected a valid Unix timestamp in milliseconds')
|
|
8
|
+
}
|
|
9
|
+
if (!timeZone || timeZone.trim() !== timeZone) {
|
|
10
|
+
throw new RangeError('An explicit business time zone is required')
|
|
11
|
+
}
|
|
12
|
+
const formatter = new Intl.DateTimeFormat('en-US', {
|
|
13
|
+
timeZone,
|
|
14
|
+
calendar: 'gregory',
|
|
15
|
+
numberingSystem: 'latn',
|
|
16
|
+
era: 'short',
|
|
17
|
+
year: 'numeric',
|
|
18
|
+
month: '2-digit',
|
|
19
|
+
day: '2-digit',
|
|
20
|
+
hour: '2-digit',
|
|
21
|
+
minute: '2-digit',
|
|
22
|
+
second: '2-digit',
|
|
23
|
+
hourCycle: 'h23',
|
|
24
|
+
})
|
|
25
|
+
const parts = formatter.formatToParts(new Date(epochMs))
|
|
26
|
+
const get = (type: Intl.DateTimeFormatPartTypes) =>
|
|
27
|
+
parts.find((part) => part.type === type)!.value
|
|
28
|
+
if (get('era') !== 'AD' || Number(get('year')) > 9999) {
|
|
29
|
+
throw new RangeError('Expected a calendar year between 0001 and 9999')
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
date: `${get('year').padStart(4, '0')}-${get('month')}-${get('day')}`,
|
|
33
|
+
time: `${get('hour')}:${get('minute')}:${get('second')}`,
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** TIMESTAMP → date input;空值由表单显式处理,不转换成今天。 */
|
|
38
|
+
export function formatDateInput(epochMs: number, timeZone: string): string {
|
|
39
|
+
return zonedParts(epochMs, timeZone).date
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** 时间点 → 指定时区的无偏移文本;写入方必须使用同一时区解析。 */
|
|
43
|
+
export function formatBaseDateTime(epochMs: number, timeZone: string): string {
|
|
44
|
+
const { date, time } = zonedParts(epochMs, timeZone)
|
|
45
|
+
return `${date} ${time}`
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** 日历日期 → Base 日期字段文本;不经 Date 解析或时区偏移。 */
|
|
49
|
+
export function dateInputToBaseDateTime(value: string): string {
|
|
50
|
+
const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(value)
|
|
51
|
+
if (!match) throw new RangeError('Expected a calendar date: YYYY-MM-DD')
|
|
52
|
+
const year = Number(match[1])
|
|
53
|
+
const month = Number(match[2])
|
|
54
|
+
const day = Number(match[3])
|
|
55
|
+
const leap = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0)
|
|
56
|
+
const days = [31, leap ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
|
|
57
|
+
if (year < 1 || month < 1 || month > 12 || day < 1 || day > days[month - 1]) {
|
|
58
|
+
throw new RangeError('Invalid calendar date')
|
|
59
|
+
}
|
|
60
|
+
return `${value} 00:00:00`
|
|
61
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { useEffect, useSyncExternalStore } from 'react'
|
|
2
|
+
|
|
3
|
+
import { siteRuntime } from './database-runtime'
|
|
4
|
+
|
|
5
|
+
const LANGUAGES = [
|
|
6
|
+
{ id: 'en', locale: 'en-US', match: /^en(?:-|$)/ },
|
|
7
|
+
{ id: 'zh', locale: 'zh-CN', match: /^zh(?:-|$)/ },
|
|
8
|
+
{ id: 'ja', locale: 'ja-JP', match: /^ja(?:-|$)/ },
|
|
9
|
+
] as const
|
|
10
|
+
|
|
11
|
+
export type UiLanguage = (typeof LANGUAGES)[number]['id']
|
|
12
|
+
|
|
13
|
+
const listeners = new Set<() => void>()
|
|
14
|
+
let hostLanguage: UiLanguage | undefined
|
|
15
|
+
let hostLanguageRequest: Promise<UiLanguage> | null = null
|
|
16
|
+
|
|
17
|
+
function supportedLanguage(locale: unknown): UiLanguage | undefined {
|
|
18
|
+
if (typeof locale !== 'string') return undefined
|
|
19
|
+
const normalized = locale.trim().replace(/_/g, '-').toLowerCase()
|
|
20
|
+
return LANGUAGES.find(({ match }) => match.test(normalized))?.id
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function browserLocale(): string | undefined {
|
|
24
|
+
return typeof navigator === 'undefined' ? undefined : navigator.language
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Supported host locale wins; otherwise use the browser, then English. */
|
|
28
|
+
export function selectUiLanguage(
|
|
29
|
+
hostLocale: unknown,
|
|
30
|
+
fallbackLocale: unknown,
|
|
31
|
+
): UiLanguage {
|
|
32
|
+
return (
|
|
33
|
+
supportedLanguage(hostLocale) ?? supportedLanguage(fallbackLocale) ?? 'en'
|
|
34
|
+
)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function getUiLanguage(): UiLanguage {
|
|
38
|
+
return hostLanguage ?? selectUiLanguage(undefined, browserLocale())
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function getUiLocale(language = getUiLanguage()): string {
|
|
42
|
+
return LANGUAGES.find(({ id }) => id === language)?.locale ?? 'en-US'
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function subscribe(listener: () => void): () => void {
|
|
46
|
+
listeners.add(listener)
|
|
47
|
+
return () => listeners.delete(listener)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function applyHostLocale(locale: unknown): UiLanguage {
|
|
51
|
+
hostLanguage = supportedLanguage(locale)
|
|
52
|
+
const language = getUiLanguage()
|
|
53
|
+
setDocumentLanguage(language)
|
|
54
|
+
for (const listener of listeners) listener()
|
|
55
|
+
return language
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function setDocumentLanguage(language: UiLanguage): void {
|
|
59
|
+
if (typeof document !== 'undefined') {
|
|
60
|
+
document.documentElement.lang = getUiLocale(language)
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** The Channel waits for the host handshake. All components share one request. */
|
|
65
|
+
export function initializeUiLanguage(): Promise<UiLanguage> {
|
|
66
|
+
if (!hostLanguageRequest) {
|
|
67
|
+
setDocumentLanguage(getUiLanguage())
|
|
68
|
+
hostLanguageRequest = siteRuntime
|
|
69
|
+
.getRuntimeContext()
|
|
70
|
+
.then((context) => applyHostLocale(context?.locale))
|
|
71
|
+
.catch(() => applyHostLocale(undefined))
|
|
72
|
+
}
|
|
73
|
+
return hostLanguageRequest
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function useUiLanguage(): UiLanguage {
|
|
77
|
+
const language = useSyncExternalStore(
|
|
78
|
+
subscribe,
|
|
79
|
+
getUiLanguage,
|
|
80
|
+
() => 'en' as const,
|
|
81
|
+
)
|
|
82
|
+
useEffect(() => {
|
|
83
|
+
void initializeUiLanguage()
|
|
84
|
+
}, [])
|
|
85
|
+
return language
|
|
86
|
+
}
|
|
@@ -12,7 +12,7 @@ function bootstrapDatabaseApp(): void {
|
|
|
12
12
|
const rootElement = document.getElementById('root')
|
|
13
13
|
|
|
14
14
|
if (!rootElement) {
|
|
15
|
-
throw new Error('
|
|
15
|
+
throw new Error('Application mount element #root was not found')
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
createRoot(rootElement).render(
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"compilerOptions": {
|
|
3
3
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
|
4
|
-
"target": "
|
|
4
|
+
"target": "ES2021",
|
|
5
5
|
"useDefineForClassFields": true,
|
|
6
|
-
"lib": ["
|
|
6
|
+
"lib": ["ES2021", "DOM", "DOM.Iterable"],
|
|
7
7
|
"module": "ESNext",
|
|
8
8
|
"skipLibCheck": true,
|
|
9
9
|
"moduleResolution": "bundler",
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { createArgusCsrfPlugin } from '@lark-base-open/base-site-js/vite'
|
|
2
1
|
import tailwindcss from '@tailwindcss/vite'
|
|
3
2
|
import react from '@vitejs/plugin-react'
|
|
4
3
|
import { defineConfig } from 'vite'
|
|
@@ -9,5 +8,5 @@ export default defineConfig({
|
|
|
9
8
|
build: {
|
|
10
9
|
sourcemap: false,
|
|
11
10
|
},
|
|
12
|
-
plugins: [
|
|
11
|
+
plugins: [react(), tailwindcss()],
|
|
13
12
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
database-functions/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Server Functions
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
This directory contains FaaS business actions. For new writes, choose the implementation using the installed Skill's `references/mutations.md#写入方式选择`. Place each FaaS action in:
|
|
4
4
|
|
|
5
5
|
```text
|
|
6
6
|
functions/<functionId>/
|
|
@@ -8,4 +8,4 @@ functions/<functionId>/
|
|
|
8
8
|
└── meta.json
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
This directory contains source and build files for server-side FaaS Functions; it is not a long-running service. Use this directory's `package.json` for dependencies and scripts. See the `lark-base-database` Skill's `references/faas.md` for Function IDs, handlers, `rawParams`, `context`, read and write paths, and response shapes.
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"devDependencies": {
|
|
11
11
|
"@types/node": "^22.15.30",
|
|
12
12
|
"oxlint": "^1.42.0",
|
|
13
|
-
"prettier": "
|
|
13
|
+
"prettier": "3.6.2",
|
|
14
14
|
"typescript": "~5.8.3",
|
|
15
15
|
"vitest": "^4.1.0"
|
|
16
16
|
}
|
|
@@ -1345,9 +1345,9 @@
|
|
|
1345
1345
|
}
|
|
1346
1346
|
},
|
|
1347
1347
|
"node_modules/prettier": {
|
|
1348
|
-
"version": "3.
|
|
1349
|
-
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.
|
|
1350
|
-
"integrity": "sha512
|
|
1348
|
+
"version": "3.6.2",
|
|
1349
|
+
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz",
|
|
1350
|
+
"integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==",
|
|
1351
1351
|
"dev": true,
|
|
1352
1352
|
"license": "MIT",
|
|
1353
1353
|
"bin": {
|
package/dist/agent-guide.d.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { RuntimeProfile } from './environment.js';
|
|
2
|
-
export declare function deploymentAgentGuide(appToken: string, target: 'preview' | 'prod', options: {
|
|
3
|
-
workspace: string;
|
|
4
|
-
profile: RuntimeProfile;
|
|
5
|
-
larkProfile?: string;
|
|
6
|
-
}): {
|
|
7
|
-
target: 'prod';
|
|
8
|
-
availability: string;
|
|
9
|
-
skill: {
|
|
10
|
-
status: "installed" | "updated";
|
|
11
|
-
name: string;
|
|
12
|
-
path: string;
|
|
13
|
-
} | {
|
|
14
|
-
status: 'failed';
|
|
15
|
-
error: string;
|
|
16
|
-
};
|
|
17
|
-
message: string;
|
|
18
|
-
};
|
|
19
|
-
//# sourceMappingURL=agent-guide.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-guide.d.ts","sourceRoot":"","sources":["../src/agent-guide.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAKvD,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,SAAS,GAAG,MAAM,EAC1B,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,cAAc,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE;YAiBnE,MAAM;;;;;;;gBALJ,QAAQ;;;;EAgBrB"}
|
package/dist/agent-guide.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { validatePageTitle } from './page-title.js';
|
|
2
|
-
import { installDatabaseSkill } from './database-skill.js';
|
|
3
|
-
// Runs only after successful publication; never discovers or invokes Functions.
|
|
4
|
-
export function deploymentAgentGuide(appToken, target, options) {
|
|
5
|
-
let skill;
|
|
6
|
-
try {
|
|
7
|
-
skill = installDatabaseSkill({
|
|
8
|
-
appToken,
|
|
9
|
-
title: validatePageTitle(options.workspace),
|
|
10
|
-
profile: options.profile,
|
|
11
|
-
larkProfile: options.larkProfile,
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
catch (error) {
|
|
15
|
-
skill = {
|
|
16
|
-
status: 'failed',
|
|
17
|
-
error: error instanceof Error ? error.message : String(error),
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
return {
|
|
21
|
-
target: 'prod',
|
|
22
|
-
availability: target === 'prod'
|
|
23
|
-
? '正式版发布成功;实际发现结果以服务端接口及开关状态为准,尚未自动验证。'
|
|
24
|
-
: '本次仅发布预览版;本应用 Skill 只发现正式版,不代表本次 Preview。不要因安装而额外发现或调用正式版能力;本次约定的 Preview 数据验证与通知收尾仍须完成。',
|
|
25
|
-
skill,
|
|
26
|
-
message: skill.status === 'failed'
|
|
27
|
-
? '应用发布成功,但专属 Skill 安装失败;向用户报告原因,不要重新发布应用来修复安装。'
|
|
28
|
-
: `已${skill.status === 'installed' ? '安装' : '更新'}本应用 Skill。请告知用户可直接让 Agent 使用本应用能力,或使用 $${skill.name};先确认安装路径属于目标客户端的发现目录,再按客户端方式刷新;仅重开会话不能修复目录不匹配。安装不代表业务操作授权。`,
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=agent-guide.js.map
|
package/dist/agent-guide.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-guide.js","sourceRoot":"","sources":["../src/agent-guide.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,gFAAgF;AAChF,MAAM,UAAU,oBAAoB,CAClC,QAAgB,EAChB,MAA0B,EAC1B,OAA6E;IAE7E,IAAI,KAAK,CAAC;IACV,IAAI,CAAC;QACH,KAAK,GAAG,oBAAoB,CAAC;YAC3B,QAAQ;YACR,KAAK,EAAE,iBAAiB,CAAC,OAAO,CAAC,SAAS,CAAC;YAC3C,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,KAAK,GAAG;YACN,MAAM,EAAE,QAAiB;YACzB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC;IACJ,CAAC;IACD,OAAO;QACL,MAAM,EAAE,MAAe;QACvB,YAAY,EACV,MAAM,KAAK,MAAM;YACf,CAAC,CAAC,qCAAqC;YACvC,CAAC,CAAC,yFAAyF;QAC/F,KAAK;QACL,OAAO,EACL,KAAK,CAAC,MAAM,KAAK,QAAQ;YACvB,CAAC,CAAC,8CAA8C;YAChD,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,0CAA0C,KAAK,CAAC,IAAI,4DAA4D;KACrK,CAAC;AACJ,CAAC"}
|
package/dist/database-skill.d.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { RuntimeProfile } from './environment.js';
|
|
2
|
-
export declare function databaseSkillName(token: string, environment: string, larkProfile?: string): string;
|
|
3
|
-
export declare function databaseSkillCommandPrefix(profile: RuntimeProfile): string;
|
|
4
|
-
export declare function renderDatabaseSkill(options: {
|
|
5
|
-
larkProfile?: string;
|
|
6
|
-
appToken: string;
|
|
7
|
-
title: string;
|
|
8
|
-
profile: RuntimeProfile;
|
|
9
|
-
}): string;
|
|
10
|
-
export declare function installDatabaseSkill(options: {
|
|
11
|
-
larkProfile?: string;
|
|
12
|
-
appToken: string;
|
|
13
|
-
title: string;
|
|
14
|
-
profile: RuntimeProfile;
|
|
15
|
-
directory?: string;
|
|
16
|
-
}): {
|
|
17
|
-
status: "installed" | "updated";
|
|
18
|
-
name: string;
|
|
19
|
-
path: string;
|
|
20
|
-
};
|
|
21
|
-
export declare function discoveryArgs(appToken: string, pageSize: number, pageToken?: string): string[];
|
|
22
|
-
export declare function invocationArgs(appToken: string, functionId: string, params: string): string[];
|
|
23
|
-
export declare function runDatabaseSkillRequest(profile: RuntimeProfile, args: string[], larkProfile?: string): Promise<import("./types.js").CommandResult>;
|
|
24
|
-
//# sourceMappingURL=database-skill.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"database-skill.d.ts","sourceRoot":"","sources":["../src/database-skill.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AASvD,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAWR;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAO1E;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,cAAc,CAAC;CACzB,GAAG,MAAM,CAoCT;AAoCD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,cAAc,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;;;;EAgCA;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,EAAE,CAgBV;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,MAAM,EAAE,CAgBV;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,MAAM,EAAE,EACd,WAAW,CAAC,EAAE,MAAM,+CASrB"}
|
package/dist/database-skill.js
DELETED
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
-
import { lstatSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from 'node:fs';
|
|
3
|
-
import { homedir } from 'node:os';
|
|
4
|
-
import { join, resolve } from 'node:path';
|
|
5
|
-
import { packageRoot } from './assets.js';
|
|
6
|
-
import { runLarkCli, resolveLarkProfileEnvironment } from './lark-cli.js';
|
|
7
|
-
import { validateLarkProfile } from './profile-name.js';
|
|
8
|
-
function validateAppToken(token) {
|
|
9
|
-
if (!/^[A-Za-z0-9_-]{1,128}$/.test(token))
|
|
10
|
-
throw new Error('Invalid Application token');
|
|
11
|
-
}
|
|
12
|
-
export function databaseSkillName(token, environment, larkProfile) {
|
|
13
|
-
validateAppToken(token);
|
|
14
|
-
if (larkProfile !== undefined)
|
|
15
|
-
validateLarkProfile(larkProfile);
|
|
16
|
-
return `base-database-${createHash('sha256')
|
|
17
|
-
.update(JSON.stringify(larkProfile ? [environment, token, larkProfile] : [environment, token]))
|
|
18
|
-
.digest('hex')
|
|
19
|
-
.slice(0, 20)}`;
|
|
20
|
-
}
|
|
21
|
-
export function databaseSkillCommandPrefix(profile) {
|
|
22
|
-
if (!profile.deployCommand.endsWith(' deploy'))
|
|
23
|
-
throw new Error('Runtime profile has no CLI command prefix');
|
|
24
|
-
const command = profile.deployCommand.slice(0, -' deploy'.length);
|
|
25
|
-
return profile.name === 'online' && command === 'base-database-cli'
|
|
26
|
-
? 'npx @lark-base-open/base-database-cli'
|
|
27
|
-
: command;
|
|
28
|
-
}
|
|
29
|
-
export function renderDatabaseSkill(options) {
|
|
30
|
-
const { appToken, profile } = options;
|
|
31
|
-
const name = databaseSkillName(appToken, profile.name, options.larkProfile);
|
|
32
|
-
if (!/^[a-z][a-z0-9-]*$/.test(profile.name))
|
|
33
|
-
throw new Error('Invalid runtime profile name');
|
|
34
|
-
const title = options.title.replace(/\s+/g, ' ').trim().slice(0, 200) || appToken;
|
|
35
|
-
const values = {
|
|
36
|
-
skill_name: name,
|
|
37
|
-
description_json: JSON.stringify(`当用户希望查询或操作“${title}”应用时使用。当前能力发现仅限应用所有者,通过实时 Function 发现和参数 Schema 使用该应用业务能力;不用于修改源码或部署。应用 ${appToken},环境 ${profile.name}${options.larkProfile ? `,profile ${options.larkProfile}` : ''}。`),
|
|
38
|
-
app_token: appToken,
|
|
39
|
-
environment: profile.name,
|
|
40
|
-
command_prefix: databaseSkillCommandPrefix(profile),
|
|
41
|
-
profile_option: options.larkProfile
|
|
42
|
-
? ` --profile '${options.larkProfile}'`
|
|
43
|
-
: '',
|
|
44
|
-
profile_guidance: options.larkProfile
|
|
45
|
-
? `lark-cli profile 固定为 ${JSON.stringify(options.larkProfile)};每条命令显式携带 --profile,不跟随默认账号。该 profile 必须在本机存在并已授权;缺失或凭证来源冲突时停止,不回退其他账号。`
|
|
46
|
-
: '本应用使用宿主提供的凭证上下文;不自动选择或创建本地 profile。',
|
|
47
|
-
managed_marker: databaseSkillMarker(appToken, profile.name, options.larkProfile),
|
|
48
|
-
};
|
|
49
|
-
return readFileSync(join(packageRoot, 'templates/database-capability/SKILL.md.tmpl'), 'utf8').replace(/\{\{([a-z_]+)\}\}/g, (_, key) => {
|
|
50
|
-
const value = values[key];
|
|
51
|
-
if (value === undefined)
|
|
52
|
-
throw new Error(`Unknown Skill template field: ${key}`);
|
|
53
|
-
return value;
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
function fileStat(path) {
|
|
57
|
-
try {
|
|
58
|
-
return lstatSync(path);
|
|
59
|
-
}
|
|
60
|
-
catch (error) {
|
|
61
|
-
if (error.code === 'ENOENT')
|
|
62
|
-
return undefined;
|
|
63
|
-
throw error;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
function assertManagedDirectory(directory, marker) {
|
|
67
|
-
const directoryStat = fileStat(directory);
|
|
68
|
-
if (!directoryStat)
|
|
69
|
-
return false;
|
|
70
|
-
if (!directoryStat.isDirectory() || directoryStat.isSymbolicLink()) {
|
|
71
|
-
throw new Error(`Refusing to replace non-directory or symlink: ${directory}`);
|
|
72
|
-
}
|
|
73
|
-
const path = join(directory, 'SKILL.md');
|
|
74
|
-
const existing = fileStat(path);
|
|
75
|
-
if (!existing) {
|
|
76
|
-
throw new Error(`Skill directory is not managed by Base Database CLI: ${directory}`);
|
|
77
|
-
}
|
|
78
|
-
if (!existing.isFile() ||
|
|
79
|
-
existing.isSymbolicLink() ||
|
|
80
|
-
!readFileSync(path, 'utf8').split('\n').includes(marker)) {
|
|
81
|
-
throw new Error(`Refusing to overwrite an unmanaged Skill: ${path}`);
|
|
82
|
-
}
|
|
83
|
-
return true;
|
|
84
|
-
}
|
|
85
|
-
export function installDatabaseSkill(options) {
|
|
86
|
-
const name = databaseSkillName(options.appToken, options.profile.name, options.larkProfile);
|
|
87
|
-
const root = resolve(options.directory ??
|
|
88
|
-
join(process.env.CODEX_HOME || join(homedir(), '.codex'), 'skills'));
|
|
89
|
-
const directory = join(root, name);
|
|
90
|
-
const path = join(directory, 'SKILL.md');
|
|
91
|
-
const content = renderDatabaseSkill(options);
|
|
92
|
-
const marker = databaseSkillMarker(options.appToken, options.profile.name, options.larkProfile);
|
|
93
|
-
const existing = assertManagedDirectory(directory, marker);
|
|
94
|
-
mkdirSync(directory, { recursive: true });
|
|
95
|
-
const temporary = join(directory, `.SKILL-${randomUUID()}.tmp`);
|
|
96
|
-
try {
|
|
97
|
-
writeFileSync(temporary, content, { flag: 'wx', mode: 0o600 });
|
|
98
|
-
renameSync(temporary, path);
|
|
99
|
-
}
|
|
100
|
-
finally {
|
|
101
|
-
if (fileStat(temporary))
|
|
102
|
-
unlinkSync(temporary);
|
|
103
|
-
}
|
|
104
|
-
return {
|
|
105
|
-
status: existing ? 'updated' : 'installed',
|
|
106
|
-
name,
|
|
107
|
-
path,
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
export function discoveryArgs(appToken, pageSize, pageToken) {
|
|
111
|
-
validateAppToken(appToken);
|
|
112
|
-
if (!Number.isSafeInteger(pageSize) || pageSize < 1)
|
|
113
|
-
throw new Error('page-size must be a positive integer');
|
|
114
|
-
return [
|
|
115
|
-
'api',
|
|
116
|
-
'GET',
|
|
117
|
-
`/open-apis/base/v3/sites/${appToken}/functions`,
|
|
118
|
-
'--params',
|
|
119
|
-
JSON.stringify({
|
|
120
|
-
pageSize,
|
|
121
|
-
...(pageToken === undefined ? {} : { pageToken }),
|
|
122
|
-
}),
|
|
123
|
-
'--as',
|
|
124
|
-
'user',
|
|
125
|
-
];
|
|
126
|
-
}
|
|
127
|
-
export function invocationArgs(appToken, functionId, params) {
|
|
128
|
-
validateAppToken(appToken);
|
|
129
|
-
if (!/^[A-Za-z0-9_-]{1,64}$/.test(functionId))
|
|
130
|
-
throw new Error('Invalid Function ID');
|
|
131
|
-
const value = JSON.parse(params);
|
|
132
|
-
return [
|
|
133
|
-
'api',
|
|
134
|
-
'POST',
|
|
135
|
-
`/open-apis/base/v3/sites/${appToken}/invoke_function/${functionId}`,
|
|
136
|
-
'--params',
|
|
137
|
-
'{"env":"prod"}',
|
|
138
|
-
'--data',
|
|
139
|
-
JSON.stringify({ params: value }),
|
|
140
|
-
'--as',
|
|
141
|
-
'user',
|
|
142
|
-
];
|
|
143
|
-
}
|
|
144
|
-
export async function runDatabaseSkillRequest(profile, args, larkProfile) {
|
|
145
|
-
const { env } = resolveLarkProfileEnvironment(await profile.commandEnvironment(), larkProfile, undefined, profile);
|
|
146
|
-
return runLarkCli(args, env);
|
|
147
|
-
}
|
|
148
|
-
function databaseSkillMarker(appToken, environment, larkProfile) {
|
|
149
|
-
return `<!-- base-database-managed-skill:${environment}:${appToken}${larkProfile ? `:profile=${encodeURIComponent(larkProfile)}` : ''} -->`;
|
|
150
|
-
}
|
|
151
|
-
//# sourceMappingURL=database-skill.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"database-skill.js","sourceRoot":"","sources":["../src/database-skill.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
# Base SQL 能力边界
|
|
2
|
-
|
|
3
|
-
仅在判断支持集之外的 SQL 语法、评审或排查 SQL,或者处理 SQL 编译与运行兼容失败时读取。本文件是当前生成与兼容策略:明确不支持的协议不使用;“默认不生成”“支持不统一”属于保守生成边界,不据此声称平台整体不支持。已知限制正常开发直接遵守,只有版本或验证证据变化时复核。以下形态不写入常规 `main.sql`:
|
|
4
|
-
|
|
5
|
-
## Stored Query 与分页
|
|
6
|
-
|
|
7
|
-
- 参数 kind 不使用 `OPTION`;SingleSelect 选项名使用 `TEXT` 参数,并在 Page/FaaS 按 Catalog 选项白名单约束输入后用于 `=`、`!=`、`IN`、`NOT IN`。
|
|
8
|
-
- 不把 `USER`、`GROUP`、`FILE`、数组或集合声明为正常业务参数;也不传 null 参数。
|
|
9
|
-
- 不通过移除服务端筛选、读取固定前 N 条后在 Page 分页来声称完整分页或全量导出。业务确实需要任意翻页、完整搜索或全量导出时记录平台限制。
|
|
10
|
-
|
|
11
|
-
## 查询结构与引用
|
|
12
|
-
|
|
13
|
-
- 查询结构:`SELECT *`、`table.*`、`UNION`、`INTERSECT`、`EXCEPT`、`INSERT`、`UPDATE`、`DELETE`、`MERGE`、递归 CTE、嵌套 CTE,以及右侧会展开为多个 FROM item 的右深嵌套 JOIN。
|
|
14
|
-
- 无真实表依赖查询:`SELECT 1`、`SELECT $1`、仅 `FROM (SELECT 1) AS x`、仅常量 CTE 或仅 `UNNEST(...)` 的查询。绑定 Base 的 SQL Function 必须直接或经由派生表/CTE 引用至少一个 Catalog 真实表,否则 Project 执行可能报“BaseSQL 上下文路由失败:SQL 未引用可路由表”。与 Base 数据无关的常量在 Page/FaaS 中用代码返回。
|
|
15
|
-
- 分组:`GROUP BY` 超过 5 项;需要更多展示列时拆成聚合 SQL 与明细 SQL 后在 Page/FaaS 合并。
|
|
16
|
-
- JOIN:`RIGHT JOIN`、`FULL JOIN`、`NATURAL JOIN`、`JOIN ... USING`、JOIN group alias、`LEFT JOIN UNNEST(...)`、`INNER JOIN UNNEST(...)`、含 `GROUP BY` 或聚合函数的派生表 JOIN,以及单条查询超过 16 个 JOIN。
|
|
17
|
-
- 列引用:`table_alias.user_field.userId` 等三段引用;标量对象子字段只使用 `"人员字段".userId` 或 `UNNEST` 后的 `u.userId` 两段形式。
|
|
18
|
-
- 派生对象:把 `USER`、`GROUP`、`FILE` 完整对象投影到派生表后再 JOIN。frontend 可能接受该形态,online backend 仍可能统一返回 `SQL is not supported`。
|
|
19
|
-
|
|
20
|
-
## 类型、表达式与字段操作
|
|
21
|
-
|
|
22
|
-
- 类型与表达式:`CURRENT_DATE`、`COALESCE`、`CASE expr WHEN value THEN ... END`、显式 `CAST` / Coerce,以及固定支持集之外的函数调用。
|
|
23
|
-
- CASE:应该写 `CASE WHEN expr = value THEN ... ELSE ... END`;不要写 `CASE expr WHEN value THEN ... END`。
|
|
24
|
-
- 条件聚合:不要写 `SUM/AVG(CASE WHEN ... THEN 1 ELSE 0 END)`;改用 `SUM(CASE WHEN ... THEN 1.0 ELSE 0.0 END)`。
|
|
25
|
-
- `ILIKE`、`NOT ILIKE`:字段支持不统一,正常查询使用 `LIKE`、`NOT LIKE`。
|
|
26
|
-
- 子查询表达式:投影、`WHERE` 或 `ORDER BY` 表达式里的标量子查询。用单独 SQL Function 查询聚合或明细,再在 Page/FaaS 合并。
|
|
27
|
-
- 聚合与窗口函数:`STDDEV`、`VARIANCE`、`PERCENTILE`、`MEDIAN`、`ROW_NUMBER()`、`RANK()`。
|
|
28
|
-
- 字符串函数:`SPLIT`、`SUBSTRING`、`REPLACE`、`POSITION`、`REGEXP` / `RLIKE`。
|
|
29
|
-
- 数字函数:`POWER`、`SQRT`、`LOG`、`EXP`。
|
|
30
|
-
- 日期函数:`DATEDIFF` 及其他未列入支持集的 DURATION 函数。
|
|
31
|
-
- `rec_id`、`TEXT`、Phone:顺序比较、`BETWEEN`、`NOT BETWEEN`。文本日期字符串不能用 `<`、`<=`、`>`、`>=` 做范围筛选;需要日期范围时把字段建成 DateTime/TIMESTAMP,或改用 Text 支持的 `=`、`IN`、`LIKE` 后在 Page/FaaS 中判断范围。
|
|
32
|
-
- Checkbox:`IN`、顺序比较、`BETWEEN`、`NOT BETWEEN`。
|
|
33
|
-
- DateTime:`IN`、`NOT IN`、`LIKE`、`ILIKE`。
|
|
34
|
-
- SingleSelect:顺序比较、`BETWEEN`、`NOT BETWEEN`、`LIKE`、`ILIKE`,以及与 `''` 空字符串比较;动态选项名筛选使用 `TEXT` 参数,不使用 `OPTION` 参数 kind。
|
|
35
|
-
- MultiSelect:`LIKE`。
|
|
36
|
-
|
|
37
|
-
## 不要误判为整体不支持
|
|
38
|
-
|
|
39
|
-
- `LIKE $1` 本身可用,参数携带 `%`;历史复合查询失败主要来自 `OPTION` 参数 kind 或其他不支持节点,不要把参数化 `LIMIT/OFFSET` 误判为 backend 不支持。
|
|
40
|
-
- OPTION 字段可以与 Catalog 中合法的固定选项名或 `TEXT` 参数使用 `=`、`!=`、`IN`、`NOT IN` 比较;不支持的是 Stored Query 的 `OPTION` 参数 kind。
|
|
41
|
-
- 参数化 `LIMIT $n` / `OFFSET $n` 可用;页面输入不能直接决定返回规模,确需动态条数时由 Page/FaaS 先校验为非负整数并限制最大值。
|
|
42
|
-
- 支持集内的 `CASE WHEN ... THEN ... END`、`INNER JOIN`、`LEFT JOIN`、`CROSS JOIN`、非递归顶层 CTE、派生标量列、`FROM` 子查询、逗号连接或 `CROSS JOIN` 形态的 `UNNEST`、`TIMESTAMP` 字面量、`INTERVAL`、`EXTRACT`、DURATION 运算、`ARRAY_AGG`、`CEIL` 和 `FLOOR` 可以使用;某个复合查询失败时先按错误节点缩小,不把这些能力整体降级。
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
# 应用能力 Skill
|
|
2
|
-
|
|
3
|
-
本应用 Skill 用于在后续会话中发现并调用已发布的正式版 Function,不依赖建站工程。生成文件仅保存应用、环境与 profile 定位、发现及调用流程,不缓存 Function 列表或参数 Schema,不包含凭证、源码或工程绝对路径。当前发现范围仅限 应用所有者;安装成功不证明接口已开通或当前用户有访问权限。
|
|
4
|
-
|
|
5
|
-
## 安装与恢复
|
|
6
|
-
|
|
7
|
-
普通 `deploy` 在本次 Preview / Prod 轮询成功后自动安装或更新本地 Skill;安装结果在 `agentGuide.skill`。按实际证据交付:
|
|
8
|
-
|
|
9
|
-
| 返回状态 | 可报告的结果 | 后续动作 |
|
|
10
|
-
| --- | --- | --- |
|
|
11
|
-
| `installed` / `updated` | 本地安装成功,附 `name`、`path` | 核对目标客户端的发现目录,再按客户端方式刷新 |
|
|
12
|
-
| `failed` | 应用发布成功,但 Skill 安装失败 | 说明 `error`,处理目录权限或冲突;此分支没有 `name`、`path` |
|
|
13
|
-
| 仅通过 `deployments status` 查询或恢复发布成功 | 发布成功,Skill 安装状态未确认 | 不假定安装成功;需要时显式安装 |
|
|
14
|
-
|
|
15
|
-
`deployments status`(包括 `--wait`)只查询发布任务并按需恢复回执,不安装 Skill,也不返回 `agentGuide`。补装不需要再次 deploy。使用发布结果中的真实 应用 appToken 和已确认的应用名称:
|
|
16
|
-
|
|
17
|
-
```bash
|
|
18
|
-
npx @lark-base-open/base-database-cli --profile <profile-name> database-skill install --app-token <app-token> --title '<应用名称>'
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
此操作通过 `lark-cli config show` 读取所选账号的本地元信息,再安装 Skill,不发布应用、不调用远端、不更改授权。安装器仅更新带有相同应用/环境/profile 管理标记的 `SKILL.md`;无管理标记的文件、同名目录或符号链接冲突会报错。报告冲突路径,不删除用户文件来强行安装。
|
|
22
|
-
|
|
23
|
-
默认安装到 `$CODEX_HOME/skills`,未配置时使用 `~/.codex/skills`。其他客户端可通过 `--dir <skills-root>` 指定其实际技能目录,但先确认目标路径可写且被客户端发现。不能由“文件已写入”推断“当前 Agent 已加载”;目录正确时才尝试客户端支持的刷新或重开会话。受管沙箱可能使用另一发现目录或只读技能目录,不能为安装擅自修改其全局配置或权限。
|
|
24
|
-
|
|
25
|
-
跨设备使用须在目标设备安装对应 CLI 和 Skill,并完成该环境的用户登录。沙箱内安装不等于用户电脑已安装;不能通过拷贝凭证完成迁移。
|
|
26
|
-
|
|
27
|
-
独立 `database-skill` 命令不读取项目配置,修复安装时显式传入部署使用的 profile。发现与调用固定该 profile,不跟随默认账号变化;宿主提供凭证且未选择 profile 时保持宿主凭证模式,不写入本地 profile。跨设备须配置并授权同名 profile;缺失或与注入凭证冲突时停止,不回退其他账号。
|
|
28
|
-
|
|
29
|
-
## 发现与调用
|
|
30
|
-
|
|
31
|
-
后续命令可在任意目录执行;环境由当前 CLI 固定,不支持在调用参数里覆盖环境或用户身份:
|
|
32
|
-
|
|
33
|
-
```bash
|
|
34
|
-
npx @lark-base-open/base-database-cli --profile <profile-name> database-skill discover --app-token <app-token> --page-size 20
|
|
35
|
-
npx @lark-base-open/base-database-cli --profile <profile-name> database-skill invoke --app-token <app-token> --function-id <发现的-id> --params '<业务参数JSON>'
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
发现始终读取正式版。Preview 部署不代表正式版已有对应能力;不要因安装而额外发现或调用正式版,本次约定的 Preview 数据验证与通知收尾仍须完成。
|
|
39
|
-
|
|
40
|
-
`invoke --params` 是业务值本身(SQL 为数组),CLI 只包一层 `params` 并固定使用 `env=prod`。仅按实时发现的 Function 与 Schema 调用。写操作需用户明确授权相应业务动作,自动安装不构成授权;写入结果未知时仅用已发现的只读能力核对,无法核对则保留待确认,不自动重试写入。
|