sa2kit 3.3.0 → 3.6.0
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/dist/{chunk-LGVPFYPR.mjs → chunk-4H3SGG3T.mjs} +27 -3
- package/dist/chunk-4H3SGG3T.mjs.map +1 -0
- package/dist/{chunk-KVYHCGRY.js → chunk-7Z3XR2Y4.js} +552 -263
- package/dist/chunk-7Z3XR2Y4.js.map +1 -0
- package/dist/{chunk-5H2FICSO.js → chunk-LBMUIWJR.js} +27 -3
- package/dist/chunk-LBMUIWJR.js.map +1 -0
- package/dist/chunk-XPY45Y75.js +1143 -0
- package/dist/chunk-XPY45Y75.js.map +1 -0
- package/dist/{chunk-YIRPPMCN.mjs → chunk-XSTMLLJV.mjs} +474 -198
- package/dist/chunk-XSTMLLJV.mjs.map +1 -0
- package/dist/chunk-ZJLS5JU5.mjs +1090 -0
- package/dist/chunk-ZJLS5JU5.mjs.map +1 -0
- package/dist/common/aiApi/client/index.d.mts +71 -0
- package/dist/common/aiApi/client/index.d.ts +71 -0
- package/dist/common/aiApi/client/index.js +165 -0
- package/dist/common/aiApi/client/index.js.map +1 -0
- package/dist/common/aiApi/client/index.mjs +151 -0
- package/dist/common/aiApi/client/index.mjs.map +1 -0
- package/dist/common/aiApi/index.d.mts +184 -0
- package/dist/common/aiApi/index.d.ts +184 -0
- package/dist/common/aiApi/index.js +217 -0
- package/dist/common/aiApi/index.mjs +4 -0
- package/dist/common/aiApi/server/index.d.mts +3 -0
- package/dist/common/aiApi/server/index.d.ts +3 -0
- package/dist/common/aiApi/server/index.js +217 -0
- package/dist/common/aiApi/server/index.mjs +4 -0
- package/dist/common/auth/server/index.js +8 -8
- package/dist/common/auth/server/index.mjs +2 -2
- package/dist/common/components/index.js +176 -177
- package/dist/common/components/index.mjs +1 -2
- package/dist/common/config/bootstrap/index.d.mts +24 -0
- package/dist/common/config/bootstrap/index.d.ts +24 -0
- package/dist/common/config/bootstrap/index.js +15 -15
- package/dist/common/config/bootstrap/index.mjs +1 -1
- package/dist/common/config/server/index.js +14 -14
- package/dist/common/config/server/index.mjs +1 -1
- package/dist/common/index.js +2 -3
- package/dist/common/index.mjs +1 -2
- package/dist/index.d.mts +314 -154
- package/dist/index.d.ts +314 -154
- package/dist/index.js +1055 -369
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1005 -360
- package/dist/index.mjs.map +1 -1
- package/dist/types-CiqMQ-uu.d.mts +166 -0
- package/dist/types-CiqMQ-uu.d.ts +166 -0
- package/package.json +15 -50
- package/dist/chunk-3R6JHA6D.js +0 -120
- package/dist/chunk-3R6JHA6D.js.map +0 -1
- package/dist/chunk-4PJM4752.js +0 -4
- package/dist/chunk-4PJM4752.js.map +0 -1
- package/dist/chunk-5H2FICSO.js.map +0 -1
- package/dist/chunk-7PMT4L4I.js +0 -324
- package/dist/chunk-7PMT4L4I.js.map +0 -1
- package/dist/chunk-FY2X3LYR.mjs +0 -3
- package/dist/chunk-FY2X3LYR.mjs.map +0 -1
- package/dist/chunk-GS4SAW25.mjs +0 -116
- package/dist/chunk-GS4SAW25.mjs.map +0 -1
- package/dist/chunk-HL4H2HF6.js +0 -279
- package/dist/chunk-HL4H2HF6.js.map +0 -1
- package/dist/chunk-IJIQUMAK.mjs +0 -272
- package/dist/chunk-IJIQUMAK.mjs.map +0 -1
- package/dist/chunk-KVYHCGRY.js.map +0 -1
- package/dist/chunk-LGVPFYPR.mjs.map +0 -1
- package/dist/chunk-MMDSZIXD.mjs +0 -286
- package/dist/chunk-MMDSZIXD.mjs.map +0 -1
- package/dist/chunk-N2O3OX5Y.mjs +0 -243
- package/dist/chunk-N2O3OX5Y.mjs.map +0 -1
- package/dist/chunk-RRQ2X26Z.js +0 -106
- package/dist/chunk-RRQ2X26Z.js.map +0 -1
- package/dist/chunk-RVNQI6BI.js +0 -249
- package/dist/chunk-RVNQI6BI.js.map +0 -1
- package/dist/chunk-UJUWDF7M.mjs +0 -336
- package/dist/chunk-UJUWDF7M.mjs.map +0 -1
- package/dist/chunk-VCKXK6V5.js +0 -345
- package/dist/chunk-VCKXK6V5.js.map +0 -1
- package/dist/chunk-VIEXDTNF.mjs +0 -100
- package/dist/chunk-VIEXDTNF.mjs.map +0 -1
- package/dist/chunk-YIRPPMCN.mjs.map +0 -1
- package/dist/common/ai/llm/core/index.d.mts +0 -70
- package/dist/common/ai/llm/core/index.d.ts +0 -70
- package/dist/common/ai/llm/core/index.js +0 -54
- package/dist/common/ai/llm/core/index.mjs +0 -5
- package/dist/common/ai/llm/electron/index.d.mts +0 -6
- package/dist/common/ai/llm/electron/index.d.ts +0 -6
- package/dist/common/ai/llm/electron/index.js +0 -67
- package/dist/common/ai/llm/electron/index.mjs +0 -10
- package/dist/common/ai/llm/index.d.mts +0 -3
- package/dist/common/ai/llm/index.d.ts +0 -3
- package/dist/common/ai/llm/index.js +0 -54
- package/dist/common/ai/llm/index.js.map +0 -1
- package/dist/common/ai/llm/index.mjs +0 -5
- package/dist/common/ai/llm/index.mjs.map +0 -1
- package/dist/common/ai/llm/miniapp/index.d.mts +0 -6
- package/dist/common/ai/llm/miniapp/index.d.ts +0 -6
- package/dist/common/ai/llm/miniapp/index.js +0 -59
- package/dist/common/ai/llm/miniapp/index.js.map +0 -1
- package/dist/common/ai/llm/miniapp/index.mjs +0 -6
- package/dist/common/ai/llm/miniapp/index.mjs.map +0 -1
- package/dist/common/ai/llm/rn/index.d.mts +0 -6
- package/dist/common/ai/llm/rn/index.d.ts +0 -6
- package/dist/common/ai/llm/rn/index.js +0 -59
- package/dist/common/ai/llm/rn/index.js.map +0 -1
- package/dist/common/ai/llm/rn/index.mjs +0 -6
- package/dist/common/ai/llm/rn/index.mjs.map +0 -1
- package/dist/common/ai/llm/ui/electron/index.d.mts +0 -5
- package/dist/common/ai/llm/ui/electron/index.d.ts +0 -5
- package/dist/common/ai/llm/ui/electron/index.js +0 -22
- package/dist/common/ai/llm/ui/electron/index.js.map +0 -1
- package/dist/common/ai/llm/ui/electron/index.mjs +0 -9
- package/dist/common/ai/llm/ui/electron/index.mjs.map +0 -1
- package/dist/common/ai/llm/ui/miniapp/index.d.mts +0 -9
- package/dist/common/ai/llm/ui/miniapp/index.d.ts +0 -9
- package/dist/common/ai/llm/ui/miniapp/index.js +0 -14
- package/dist/common/ai/llm/ui/miniapp/index.js.map +0 -1
- package/dist/common/ai/llm/ui/miniapp/index.mjs +0 -5
- package/dist/common/ai/llm/ui/miniapp/index.mjs.map +0 -1
- package/dist/common/ai/llm/ui/rn/index.d.mts +0 -9
- package/dist/common/ai/llm/ui/rn/index.d.ts +0 -9
- package/dist/common/ai/llm/ui/rn/index.js +0 -14
- package/dist/common/ai/llm/ui/rn/index.js.map +0 -1
- package/dist/common/ai/llm/ui/rn/index.mjs +0 -5
- package/dist/common/ai/llm/ui/rn/index.mjs.map +0 -1
- package/dist/common/ai/llm/ui/web/index.d.mts +0 -15
- package/dist/common/ai/llm/ui/web/index.d.ts +0 -15
- package/dist/common/ai/llm/ui/web/index.js +0 -21
- package/dist/common/ai/llm/ui/web/index.js.map +0 -1
- package/dist/common/ai/llm/ui/web/index.mjs +0 -8
- package/dist/common/ai/llm/ui/web/index.mjs.map +0 -1
- package/dist/common/ai/llm/web/index.d.mts +0 -6
- package/dist/common/ai/llm/web/index.d.ts +0 -6
- package/dist/common/ai/llm/web/index.js +0 -66
- package/dist/common/ai/llm/web/index.js.map +0 -1
- package/dist/common/ai/llm/web/index.mjs +0 -9
- package/dist/common/ai/llm/web/index.mjs.map +0 -1
- package/dist/types-B2rs_jq1.d.mts +0 -38
- package/dist/types-DgACCUpT.d.ts +0 -122
- package/dist/types-DwS2Eg0q.d.ts +0 -38
- package/dist/types-LU_BGSzk.d.mts +0 -122
- /package/dist/common/{ai/llm/core → aiApi}/index.js.map +0 -0
- /package/dist/common/{ai/llm/core → aiApi}/index.mjs.map +0 -0
- /package/dist/common/{ai/llm/electron → aiApi/server}/index.js.map +0 -0
- /package/dist/common/{ai/llm/electron → aiApi/server}/index.mjs.map +0 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/** 音频处理策略:native=chat 内嵌音频,stt=先转写再 chat,auto=按模型能力自动选择(失败时 STT 回退) */
|
|
2
|
+
type AudioStrategy = 'native' | 'stt' | 'auto';
|
|
3
|
+
/** 连接配置(调用方可显式传入,或与 env 合并) */
|
|
4
|
+
interface AiConnectionSettings {
|
|
5
|
+
apiKey: string;
|
|
6
|
+
baseUrl: string;
|
|
7
|
+
model?: string;
|
|
8
|
+
textModel?: string;
|
|
9
|
+
visionModel?: string;
|
|
10
|
+
audioModel?: string;
|
|
11
|
+
audioStrategy?: AudioStrategy;
|
|
12
|
+
timeoutMs?: number;
|
|
13
|
+
maxImageBytes?: number;
|
|
14
|
+
maxAudioBytes?: number;
|
|
15
|
+
}
|
|
16
|
+
/** 客户端/请求可携带的 AI 连接配置(字段均可选,用于覆盖环境变量) */
|
|
17
|
+
type AiClientSettings = Partial<AiConnectionSettings>;
|
|
18
|
+
/** 解析后的完整连接配置 */
|
|
19
|
+
interface AiConnectionConfig extends AiConnectionSettings {
|
|
20
|
+
textModel: string;
|
|
21
|
+
visionModel: string;
|
|
22
|
+
audioModel: string;
|
|
23
|
+
audioStrategy: AudioStrategy;
|
|
24
|
+
timeoutMs: number;
|
|
25
|
+
maxImageBytes: number;
|
|
26
|
+
maxAudioBytes: number;
|
|
27
|
+
}
|
|
28
|
+
/** 统一 AI 任务请求 */
|
|
29
|
+
interface AiApiRunRequest<TInput = unknown> {
|
|
30
|
+
taskId: string;
|
|
31
|
+
input: TInput;
|
|
32
|
+
options?: AiTaskRunOptions;
|
|
33
|
+
clientSettings?: AiClientSettings;
|
|
34
|
+
}
|
|
35
|
+
interface AiTaskRunOptions {
|
|
36
|
+
model?: string;
|
|
37
|
+
temperature?: number;
|
|
38
|
+
maxTokens?: number;
|
|
39
|
+
}
|
|
40
|
+
/** 统一 AI 任务响应 */
|
|
41
|
+
interface AiApiResponse<TData = unknown> {
|
|
42
|
+
success: boolean;
|
|
43
|
+
taskId: string;
|
|
44
|
+
data?: TData;
|
|
45
|
+
error?: AiApiErrorBody;
|
|
46
|
+
meta?: AiApiResponseMeta;
|
|
47
|
+
}
|
|
48
|
+
interface AiApiErrorBody {
|
|
49
|
+
code: AiApiErrorCode;
|
|
50
|
+
message: string;
|
|
51
|
+
details?: unknown;
|
|
52
|
+
}
|
|
53
|
+
type AiApiErrorCode = 'UNAUTHORIZED' | 'INVALID_INPUT' | 'TASK_NOT_FOUND' | 'AI_CONFIG_MISSING' | 'AI_REQUEST_FAILED' | 'AI_PARSE_FAILED' | 'PAYLOAD_TOO_LARGE' | 'UNSUPPORTED_MEDIA';
|
|
54
|
+
interface AiApiResponseMeta {
|
|
55
|
+
model: string;
|
|
56
|
+
latencyMs: number;
|
|
57
|
+
provider?: string;
|
|
58
|
+
confidence?: number;
|
|
59
|
+
rawSummary?: string;
|
|
60
|
+
}
|
|
61
|
+
/** 多模态图片输入(base64) */
|
|
62
|
+
interface AiImageInput {
|
|
63
|
+
base64: string;
|
|
64
|
+
mimeType: string;
|
|
65
|
+
}
|
|
66
|
+
/** 多模态音频输入(base64) */
|
|
67
|
+
interface AiAudioInput {
|
|
68
|
+
base64: string;
|
|
69
|
+
mimeType: string;
|
|
70
|
+
}
|
|
71
|
+
type AiMediaKind = 'image' | 'audio';
|
|
72
|
+
interface AiImageMediaInput extends AiImageInput {
|
|
73
|
+
kind: 'image';
|
|
74
|
+
}
|
|
75
|
+
interface AiAudioMediaInput extends AiAudioInput {
|
|
76
|
+
kind: 'audio';
|
|
77
|
+
}
|
|
78
|
+
type AiMediaInput = AiImageMediaInput | AiAudioMediaInput;
|
|
79
|
+
/** 通用文本补全任务输入 */
|
|
80
|
+
interface TextCompletionInput {
|
|
81
|
+
systemPrompt?: string;
|
|
82
|
+
userPrompt: string;
|
|
83
|
+
model?: string;
|
|
84
|
+
temperature?: number;
|
|
85
|
+
maxTokens?: number;
|
|
86
|
+
/** 显式连接配置,优先级高于 clientSettings / 环境变量 */
|
|
87
|
+
connection?: AiClientSettings;
|
|
88
|
+
}
|
|
89
|
+
/** 通用文本补全任务输出 */
|
|
90
|
+
interface TextCompletionOutput {
|
|
91
|
+
content: string;
|
|
92
|
+
rawText: string;
|
|
93
|
+
}
|
|
94
|
+
/** 通用结构化多模态任务输入 */
|
|
95
|
+
interface StructuredMultimodalInput {
|
|
96
|
+
systemPrompt: string;
|
|
97
|
+
userPrompt: string;
|
|
98
|
+
media?: AiMediaInput[];
|
|
99
|
+
jsonSchemaHint?: string;
|
|
100
|
+
model?: string;
|
|
101
|
+
temperature?: number;
|
|
102
|
+
maxTokens?: number;
|
|
103
|
+
audioStrategy?: AudioStrategy;
|
|
104
|
+
connection?: AiClientSettings;
|
|
105
|
+
}
|
|
106
|
+
/** 通用结构化多模态任务输出 */
|
|
107
|
+
interface StructuredMultimodalOutput {
|
|
108
|
+
json: Record<string, unknown>;
|
|
109
|
+
rawText: string;
|
|
110
|
+
}
|
|
111
|
+
declare const CORE_LLM_COMPLETION_TASK_ID = "core.llmCompletion";
|
|
112
|
+
declare const CORE_STRUCTURED_MULTIMODAL_TASK_ID = "core.structuredMultimodal";
|
|
113
|
+
declare const CORE_CONNECTIVITY_TEST_TASK_ID = "core.connectivityTest";
|
|
114
|
+
interface ConnectivityTestOutput {
|
|
115
|
+
ok: boolean;
|
|
116
|
+
reply: string;
|
|
117
|
+
}
|
|
118
|
+
interface AiModelsListRequest {
|
|
119
|
+
clientSettings?: AiClientSettings;
|
|
120
|
+
}
|
|
121
|
+
interface AiModelsListResponse {
|
|
122
|
+
success: boolean;
|
|
123
|
+
models: string[];
|
|
124
|
+
visionModels: string[];
|
|
125
|
+
suggestedVisionModel?: string;
|
|
126
|
+
error?: {
|
|
127
|
+
code: string;
|
|
128
|
+
message: string;
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
interface AiTaskContext {
|
|
132
|
+
requestId?: string;
|
|
133
|
+
userId?: string | number;
|
|
134
|
+
clientSettings?: AiClientSettings;
|
|
135
|
+
}
|
|
136
|
+
interface AiTaskDefinition<TInput = unknown, TOutput = unknown> {
|
|
137
|
+
id: string;
|
|
138
|
+
description?: string;
|
|
139
|
+
validateInput: (input: unknown) => TInput;
|
|
140
|
+
execute: (input: TInput, ctx: AiTaskContext) => Promise<{
|
|
141
|
+
data: TOutput;
|
|
142
|
+
meta?: Partial<AiApiResponseMeta>;
|
|
143
|
+
}>;
|
|
144
|
+
}
|
|
145
|
+
interface MultimodalChatParams {
|
|
146
|
+
systemPrompt: string;
|
|
147
|
+
userPrompt: string;
|
|
148
|
+
media?: AiMediaInput[];
|
|
149
|
+
model?: string;
|
|
150
|
+
temperature?: number;
|
|
151
|
+
maxTokens?: number;
|
|
152
|
+
jsonMode?: boolean;
|
|
153
|
+
audioStrategy?: AudioStrategy;
|
|
154
|
+
connection?: AiClientSettings;
|
|
155
|
+
}
|
|
156
|
+
interface MultimodalChatResult {
|
|
157
|
+
content: string;
|
|
158
|
+
model: string;
|
|
159
|
+
raw: unknown;
|
|
160
|
+
/** auto/native/stt 实际采用的音频处理方式 */
|
|
161
|
+
audioHandling?: 'none' | 'native' | 'stt';
|
|
162
|
+
/** STT 或 native 失败回退时的转写文本 */
|
|
163
|
+
transcriptions?: string[];
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export { type AiClientSettings as A, type ConnectivityTestOutput as C, type MultimodalChatParams as M, type StructuredMultimodalInput as S, type TextCompletionInput as T, type AiApiResponse as a, type AiModelsListResponse as b, type AudioStrategy as c, type AiConnectionConfig as d, type MultimodalChatResult as e, type AiImageInput as f, type AiAudioInput as g, type AiMediaInput as h, type AiTaskDefinition as i, type AiTaskContext as j, type TextCompletionOutput as k, type StructuredMultimodalOutput as l, type AiConnectionSettings as m, type AiApiRunRequest as n, type AiTaskRunOptions as o, type AiApiErrorBody as p, type AiApiErrorCode as q, type AiApiResponseMeta as r, type AiMediaKind as s, type AiImageMediaInput as t, type AiAudioMediaInput as u, CORE_LLM_COMPLETION_TASK_ID as v, CORE_STRUCTURED_MULTIMODAL_TASK_ID as w, CORE_CONNECTIVITY_TEST_TASK_ID as x, type AiModelsListRequest as y };
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/** 音频处理策略:native=chat 内嵌音频,stt=先转写再 chat,auto=按模型能力自动选择(失败时 STT 回退) */
|
|
2
|
+
type AudioStrategy = 'native' | 'stt' | 'auto';
|
|
3
|
+
/** 连接配置(调用方可显式传入,或与 env 合并) */
|
|
4
|
+
interface AiConnectionSettings {
|
|
5
|
+
apiKey: string;
|
|
6
|
+
baseUrl: string;
|
|
7
|
+
model?: string;
|
|
8
|
+
textModel?: string;
|
|
9
|
+
visionModel?: string;
|
|
10
|
+
audioModel?: string;
|
|
11
|
+
audioStrategy?: AudioStrategy;
|
|
12
|
+
timeoutMs?: number;
|
|
13
|
+
maxImageBytes?: number;
|
|
14
|
+
maxAudioBytes?: number;
|
|
15
|
+
}
|
|
16
|
+
/** 客户端/请求可携带的 AI 连接配置(字段均可选,用于覆盖环境变量) */
|
|
17
|
+
type AiClientSettings = Partial<AiConnectionSettings>;
|
|
18
|
+
/** 解析后的完整连接配置 */
|
|
19
|
+
interface AiConnectionConfig extends AiConnectionSettings {
|
|
20
|
+
textModel: string;
|
|
21
|
+
visionModel: string;
|
|
22
|
+
audioModel: string;
|
|
23
|
+
audioStrategy: AudioStrategy;
|
|
24
|
+
timeoutMs: number;
|
|
25
|
+
maxImageBytes: number;
|
|
26
|
+
maxAudioBytes: number;
|
|
27
|
+
}
|
|
28
|
+
/** 统一 AI 任务请求 */
|
|
29
|
+
interface AiApiRunRequest<TInput = unknown> {
|
|
30
|
+
taskId: string;
|
|
31
|
+
input: TInput;
|
|
32
|
+
options?: AiTaskRunOptions;
|
|
33
|
+
clientSettings?: AiClientSettings;
|
|
34
|
+
}
|
|
35
|
+
interface AiTaskRunOptions {
|
|
36
|
+
model?: string;
|
|
37
|
+
temperature?: number;
|
|
38
|
+
maxTokens?: number;
|
|
39
|
+
}
|
|
40
|
+
/** 统一 AI 任务响应 */
|
|
41
|
+
interface AiApiResponse<TData = unknown> {
|
|
42
|
+
success: boolean;
|
|
43
|
+
taskId: string;
|
|
44
|
+
data?: TData;
|
|
45
|
+
error?: AiApiErrorBody;
|
|
46
|
+
meta?: AiApiResponseMeta;
|
|
47
|
+
}
|
|
48
|
+
interface AiApiErrorBody {
|
|
49
|
+
code: AiApiErrorCode;
|
|
50
|
+
message: string;
|
|
51
|
+
details?: unknown;
|
|
52
|
+
}
|
|
53
|
+
type AiApiErrorCode = 'UNAUTHORIZED' | 'INVALID_INPUT' | 'TASK_NOT_FOUND' | 'AI_CONFIG_MISSING' | 'AI_REQUEST_FAILED' | 'AI_PARSE_FAILED' | 'PAYLOAD_TOO_LARGE' | 'UNSUPPORTED_MEDIA';
|
|
54
|
+
interface AiApiResponseMeta {
|
|
55
|
+
model: string;
|
|
56
|
+
latencyMs: number;
|
|
57
|
+
provider?: string;
|
|
58
|
+
confidence?: number;
|
|
59
|
+
rawSummary?: string;
|
|
60
|
+
}
|
|
61
|
+
/** 多模态图片输入(base64) */
|
|
62
|
+
interface AiImageInput {
|
|
63
|
+
base64: string;
|
|
64
|
+
mimeType: string;
|
|
65
|
+
}
|
|
66
|
+
/** 多模态音频输入(base64) */
|
|
67
|
+
interface AiAudioInput {
|
|
68
|
+
base64: string;
|
|
69
|
+
mimeType: string;
|
|
70
|
+
}
|
|
71
|
+
type AiMediaKind = 'image' | 'audio';
|
|
72
|
+
interface AiImageMediaInput extends AiImageInput {
|
|
73
|
+
kind: 'image';
|
|
74
|
+
}
|
|
75
|
+
interface AiAudioMediaInput extends AiAudioInput {
|
|
76
|
+
kind: 'audio';
|
|
77
|
+
}
|
|
78
|
+
type AiMediaInput = AiImageMediaInput | AiAudioMediaInput;
|
|
79
|
+
/** 通用文本补全任务输入 */
|
|
80
|
+
interface TextCompletionInput {
|
|
81
|
+
systemPrompt?: string;
|
|
82
|
+
userPrompt: string;
|
|
83
|
+
model?: string;
|
|
84
|
+
temperature?: number;
|
|
85
|
+
maxTokens?: number;
|
|
86
|
+
/** 显式连接配置,优先级高于 clientSettings / 环境变量 */
|
|
87
|
+
connection?: AiClientSettings;
|
|
88
|
+
}
|
|
89
|
+
/** 通用文本补全任务输出 */
|
|
90
|
+
interface TextCompletionOutput {
|
|
91
|
+
content: string;
|
|
92
|
+
rawText: string;
|
|
93
|
+
}
|
|
94
|
+
/** 通用结构化多模态任务输入 */
|
|
95
|
+
interface StructuredMultimodalInput {
|
|
96
|
+
systemPrompt: string;
|
|
97
|
+
userPrompt: string;
|
|
98
|
+
media?: AiMediaInput[];
|
|
99
|
+
jsonSchemaHint?: string;
|
|
100
|
+
model?: string;
|
|
101
|
+
temperature?: number;
|
|
102
|
+
maxTokens?: number;
|
|
103
|
+
audioStrategy?: AudioStrategy;
|
|
104
|
+
connection?: AiClientSettings;
|
|
105
|
+
}
|
|
106
|
+
/** 通用结构化多模态任务输出 */
|
|
107
|
+
interface StructuredMultimodalOutput {
|
|
108
|
+
json: Record<string, unknown>;
|
|
109
|
+
rawText: string;
|
|
110
|
+
}
|
|
111
|
+
declare const CORE_LLM_COMPLETION_TASK_ID = "core.llmCompletion";
|
|
112
|
+
declare const CORE_STRUCTURED_MULTIMODAL_TASK_ID = "core.structuredMultimodal";
|
|
113
|
+
declare const CORE_CONNECTIVITY_TEST_TASK_ID = "core.connectivityTest";
|
|
114
|
+
interface ConnectivityTestOutput {
|
|
115
|
+
ok: boolean;
|
|
116
|
+
reply: string;
|
|
117
|
+
}
|
|
118
|
+
interface AiModelsListRequest {
|
|
119
|
+
clientSettings?: AiClientSettings;
|
|
120
|
+
}
|
|
121
|
+
interface AiModelsListResponse {
|
|
122
|
+
success: boolean;
|
|
123
|
+
models: string[];
|
|
124
|
+
visionModels: string[];
|
|
125
|
+
suggestedVisionModel?: string;
|
|
126
|
+
error?: {
|
|
127
|
+
code: string;
|
|
128
|
+
message: string;
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
interface AiTaskContext {
|
|
132
|
+
requestId?: string;
|
|
133
|
+
userId?: string | number;
|
|
134
|
+
clientSettings?: AiClientSettings;
|
|
135
|
+
}
|
|
136
|
+
interface AiTaskDefinition<TInput = unknown, TOutput = unknown> {
|
|
137
|
+
id: string;
|
|
138
|
+
description?: string;
|
|
139
|
+
validateInput: (input: unknown) => TInput;
|
|
140
|
+
execute: (input: TInput, ctx: AiTaskContext) => Promise<{
|
|
141
|
+
data: TOutput;
|
|
142
|
+
meta?: Partial<AiApiResponseMeta>;
|
|
143
|
+
}>;
|
|
144
|
+
}
|
|
145
|
+
interface MultimodalChatParams {
|
|
146
|
+
systemPrompt: string;
|
|
147
|
+
userPrompt: string;
|
|
148
|
+
media?: AiMediaInput[];
|
|
149
|
+
model?: string;
|
|
150
|
+
temperature?: number;
|
|
151
|
+
maxTokens?: number;
|
|
152
|
+
jsonMode?: boolean;
|
|
153
|
+
audioStrategy?: AudioStrategy;
|
|
154
|
+
connection?: AiClientSettings;
|
|
155
|
+
}
|
|
156
|
+
interface MultimodalChatResult {
|
|
157
|
+
content: string;
|
|
158
|
+
model: string;
|
|
159
|
+
raw: unknown;
|
|
160
|
+
/** auto/native/stt 实际采用的音频处理方式 */
|
|
161
|
+
audioHandling?: 'none' | 'native' | 'stt';
|
|
162
|
+
/** STT 或 native 失败回退时的转写文本 */
|
|
163
|
+
transcriptions?: string[];
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export { type AiClientSettings as A, type ConnectivityTestOutput as C, type MultimodalChatParams as M, type StructuredMultimodalInput as S, type TextCompletionInput as T, type AiApiResponse as a, type AiModelsListResponse as b, type AudioStrategy as c, type AiConnectionConfig as d, type MultimodalChatResult as e, type AiImageInput as f, type AiAudioInput as g, type AiMediaInput as h, type AiTaskDefinition as i, type AiTaskContext as j, type TextCompletionOutput as k, type StructuredMultimodalOutput as l, type AiConnectionSettings as m, type AiApiRunRequest as n, type AiTaskRunOptions as o, type AiApiErrorBody as p, type AiApiErrorCode as q, type AiApiResponseMeta as r, type AiMediaKind as s, type AiImageMediaInput as t, type AiAudioMediaInput as u, CORE_LLM_COMPLETION_TASK_ID as v, CORE_STRUCTURED_MULTIMODAL_TASK_ID as w, CORE_CONNECTIVITY_TEST_TASK_ID as x, type AiModelsListRequest as y };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sa2kit",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.6.0",
|
|
4
4
|
"description": "SA2Kit 2.0 — common API 稳定;business 实验田模块逐步迁出 profile-v1",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"react",
|
|
@@ -288,55 +288,20 @@
|
|
|
288
288
|
"import": "./dist/business/vocaloidBooth/web/index.mjs",
|
|
289
289
|
"require": "./dist/business/vocaloidBooth/web/index.js"
|
|
290
290
|
},
|
|
291
|
-
"./common/
|
|
292
|
-
"types": "./dist/common/
|
|
293
|
-
"import": "./dist/common/
|
|
294
|
-
"require": "./dist/common/
|
|
295
|
-
},
|
|
296
|
-
"./common/
|
|
297
|
-
"types": "./dist/common/
|
|
298
|
-
"import": "./dist/common/
|
|
299
|
-
"require": "./dist/common/
|
|
300
|
-
},
|
|
301
|
-
"./common/
|
|
302
|
-
"types": "./dist/common/
|
|
303
|
-
"import": "./dist/common/
|
|
304
|
-
"require": "./dist/common/
|
|
305
|
-
},
|
|
306
|
-
"./common/ai/llm/miniapp": {
|
|
307
|
-
"types": "./dist/common/ai/llm/miniapp/index.d.ts",
|
|
308
|
-
"import": "./dist/common/ai/llm/miniapp/index.mjs",
|
|
309
|
-
"require": "./dist/common/ai/llm/miniapp/index.js"
|
|
310
|
-
},
|
|
311
|
-
"./common/ai/llm/rn": {
|
|
312
|
-
"types": "./dist/common/ai/llm/rn/index.d.ts",
|
|
313
|
-
"import": "./dist/common/ai/llm/rn/index.mjs",
|
|
314
|
-
"require": "./dist/common/ai/llm/rn/index.js"
|
|
315
|
-
},
|
|
316
|
-
"./common/ai/llm/ui/electron": {
|
|
317
|
-
"types": "./dist/common/ai/llm/ui/electron/index.d.ts",
|
|
318
|
-
"import": "./dist/common/ai/llm/ui/electron/index.mjs",
|
|
319
|
-
"require": "./dist/common/ai/llm/ui/electron/index.js"
|
|
320
|
-
},
|
|
321
|
-
"./common/ai/llm/ui/miniapp": {
|
|
322
|
-
"types": "./dist/common/ai/llm/ui/miniapp/index.d.ts",
|
|
323
|
-
"import": "./dist/common/ai/llm/ui/miniapp/index.mjs",
|
|
324
|
-
"require": "./dist/common/ai/llm/ui/miniapp/index.js"
|
|
325
|
-
},
|
|
326
|
-
"./common/ai/llm/ui/rn": {
|
|
327
|
-
"types": "./dist/common/ai/llm/ui/rn/index.d.ts",
|
|
328
|
-
"import": "./dist/common/ai/llm/ui/rn/index.mjs",
|
|
329
|
-
"require": "./dist/common/ai/llm/ui/rn/index.js"
|
|
330
|
-
},
|
|
331
|
-
"./common/ai/llm/ui/web": {
|
|
332
|
-
"types": "./dist/common/ai/llm/ui/web/index.d.ts",
|
|
333
|
-
"import": "./dist/common/ai/llm/ui/web/index.mjs",
|
|
334
|
-
"require": "./dist/common/ai/llm/ui/web/index.js"
|
|
335
|
-
},
|
|
336
|
-
"./common/ai/llm/web": {
|
|
337
|
-
"types": "./dist/common/ai/llm/web/index.d.ts",
|
|
338
|
-
"import": "./dist/common/ai/llm/web/index.mjs",
|
|
339
|
-
"require": "./dist/common/ai/llm/web/index.js"
|
|
291
|
+
"./common/aiApi/client": {
|
|
292
|
+
"types": "./dist/common/aiApi/client/index.d.ts",
|
|
293
|
+
"import": "./dist/common/aiApi/client/index.mjs",
|
|
294
|
+
"require": "./dist/common/aiApi/client/index.js"
|
|
295
|
+
},
|
|
296
|
+
"./common/aiApi": {
|
|
297
|
+
"types": "./dist/common/aiApi/index.d.ts",
|
|
298
|
+
"import": "./dist/common/aiApi/index.mjs",
|
|
299
|
+
"require": "./dist/common/aiApi/index.js"
|
|
300
|
+
},
|
|
301
|
+
"./common/aiApi/server": {
|
|
302
|
+
"types": "./dist/common/aiApi/server/index.d.ts",
|
|
303
|
+
"import": "./dist/common/aiApi/server/index.mjs",
|
|
304
|
+
"require": "./dist/common/aiApi/server/index.js"
|
|
340
305
|
},
|
|
341
306
|
"./common/analytics/server": {
|
|
342
307
|
"types": "./dist/common/analytics/server/index.d.ts",
|
package/dist/chunk-3R6JHA6D.js
DELETED
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var react = require('react');
|
|
4
|
-
|
|
5
|
-
// src/common/ai/llm/prompt/variables.ts
|
|
6
|
-
var normalizePromptVariables = (variables = {}) => {
|
|
7
|
-
const normalized = {};
|
|
8
|
-
Object.entries(variables).forEach(([key, value]) => {
|
|
9
|
-
if (value === null || value === void 0) {
|
|
10
|
-
normalized[key] = "";
|
|
11
|
-
} else {
|
|
12
|
-
normalized[key] = String(value);
|
|
13
|
-
}
|
|
14
|
-
});
|
|
15
|
-
return normalized;
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
// src/common/ai/llm/prompt/template.ts
|
|
19
|
-
var applyPromptTemplate = (template, variables = {}, options = {}) => {
|
|
20
|
-
if (!template) {
|
|
21
|
-
return "";
|
|
22
|
-
}
|
|
23
|
-
const resolved = normalizePromptVariables(variables);
|
|
24
|
-
const missingValue = options.missingValue ?? "";
|
|
25
|
-
return template.replace(/\{\{\s*([a-zA-Z0-9_.-]+)\s*\}\}/g, (_match, key) => {
|
|
26
|
-
if (Object.prototype.hasOwnProperty.call(resolved, key)) {
|
|
27
|
-
return resolved[key] ?? "";
|
|
28
|
-
}
|
|
29
|
-
return options.preserveUnknown ? `{{${key}}}` : missingValue;
|
|
30
|
-
});
|
|
31
|
-
};
|
|
32
|
-
var buildBaseMessages = (systemPrompt, initialMessages) => {
|
|
33
|
-
const baseMessages = [];
|
|
34
|
-
if (systemPrompt) {
|
|
35
|
-
baseMessages.push({ role: "system", content: systemPrompt });
|
|
36
|
-
}
|
|
37
|
-
if (initialMessages?.length) {
|
|
38
|
-
baseMessages.push(...initialMessages);
|
|
39
|
-
}
|
|
40
|
-
return baseMessages;
|
|
41
|
-
};
|
|
42
|
-
var useAiChat = (options) => {
|
|
43
|
-
const systemPromptRef = react.useRef(options.systemPrompt);
|
|
44
|
-
const templateRef = react.useRef(options.template);
|
|
45
|
-
const [messages, setMessages] = react.useState(
|
|
46
|
-
() => buildBaseMessages(systemPromptRef.current, options.initialMessages)
|
|
47
|
-
);
|
|
48
|
-
const messagesRef = react.useRef(messages);
|
|
49
|
-
const [status, setStatus] = react.useState("idle");
|
|
50
|
-
const [error, setError] = react.useState(null);
|
|
51
|
-
const [lastResponse, setLastResponse] = react.useState(null);
|
|
52
|
-
const syncMessages = (nextMessages) => {
|
|
53
|
-
messagesRef.current = nextMessages;
|
|
54
|
-
setMessages(nextMessages);
|
|
55
|
-
};
|
|
56
|
-
const reset = react.useCallback(() => {
|
|
57
|
-
syncMessages(buildBaseMessages(systemPromptRef.current, options.initialMessages));
|
|
58
|
-
setStatus("idle");
|
|
59
|
-
setError(null);
|
|
60
|
-
setLastResponse(null);
|
|
61
|
-
}, [options.initialMessages]);
|
|
62
|
-
const setSystemPrompt = react.useCallback(
|
|
63
|
-
(prompt) => {
|
|
64
|
-
systemPromptRef.current = prompt;
|
|
65
|
-
reset();
|
|
66
|
-
},
|
|
67
|
-
[reset]
|
|
68
|
-
);
|
|
69
|
-
const sendMessage = react.useCallback(
|
|
70
|
-
async (input, requestOptions = {}) => {
|
|
71
|
-
const { template, variables, ...chatOptions } = requestOptions;
|
|
72
|
-
const activeTemplate = template ?? templateRef.current;
|
|
73
|
-
const mergedVariables = { input, ...variables ?? {} };
|
|
74
|
-
const content = activeTemplate ? applyPromptTemplate(activeTemplate, mergedVariables) : input;
|
|
75
|
-
const userMessage = { role: "user", content };
|
|
76
|
-
const nextMessages = [...messagesRef.current, userMessage];
|
|
77
|
-
syncMessages(nextMessages);
|
|
78
|
-
setStatus("loading");
|
|
79
|
-
setError(null);
|
|
80
|
-
try {
|
|
81
|
-
const response = await options.client.sendChat({
|
|
82
|
-
messages: nextMessages,
|
|
83
|
-
...chatOptions
|
|
84
|
-
});
|
|
85
|
-
const assistantMessage = response.message ?? {
|
|
86
|
-
role: "assistant",
|
|
87
|
-
content: response.content,
|
|
88
|
-
toolCalls: response.toolCalls
|
|
89
|
-
};
|
|
90
|
-
const updatedMessages = [...nextMessages, assistantMessage];
|
|
91
|
-
syncMessages(updatedMessages);
|
|
92
|
-
setStatus("success");
|
|
93
|
-
setLastResponse(response);
|
|
94
|
-
return response;
|
|
95
|
-
} catch (err) {
|
|
96
|
-
const nextError = err instanceof Error ? err : new Error(String(err));
|
|
97
|
-
setStatus("error");
|
|
98
|
-
setError(nextError);
|
|
99
|
-
throw nextError;
|
|
100
|
-
}
|
|
101
|
-
},
|
|
102
|
-
[options.client]
|
|
103
|
-
);
|
|
104
|
-
return {
|
|
105
|
-
status,
|
|
106
|
-
isLoading: status === "loading",
|
|
107
|
-
error,
|
|
108
|
-
messages,
|
|
109
|
-
lastResponse,
|
|
110
|
-
sendMessage,
|
|
111
|
-
reset,
|
|
112
|
-
setSystemPrompt
|
|
113
|
-
};
|
|
114
|
-
};
|
|
115
|
-
|
|
116
|
-
exports.applyPromptTemplate = applyPromptTemplate;
|
|
117
|
-
exports.normalizePromptVariables = normalizePromptVariables;
|
|
118
|
-
exports.useAiChat = useAiChat;
|
|
119
|
-
//# sourceMappingURL=chunk-3R6JHA6D.js.map
|
|
120
|
-
//# sourceMappingURL=chunk-3R6JHA6D.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/common/ai/llm/prompt/variables.ts","../src/common/ai/llm/prompt/template.ts","../src/common/ai/llm/hooks/useAiChat.ts"],"names":["useRef","useState","useCallback"],"mappings":"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","file":"chunk-3R6JHA6D.js","sourcesContent":["export type PromptVariableValue = string | number | boolean | null | undefined;\n\nexport type PromptVariables = Record<string, PromptVariableValue>;\n\nexport const normalizePromptVariables = (\n variables: PromptVariables = {}\n): Record<string, string> => {\n const normalized: Record<string, string> = {};\n\n Object.entries(variables).forEach(([key, value]) => {\n if (value === null || value === undefined) {\n normalized[key] = '';\n } else {\n normalized[key] = String(value);\n }\n });\n\n return normalized;\n};\n","import { normalizePromptVariables, PromptVariables } from './variables';\n\nexport interface PromptTemplateOptions {\n missingValue?: string;\n preserveUnknown?: boolean;\n}\n\nexport const applyPromptTemplate = (\n template: string,\n variables: PromptVariables = {},\n options: PromptTemplateOptions = {}\n): string => {\n if (!template) {\n return '';\n }\n\n const resolved = normalizePromptVariables(variables);\n const missingValue = options.missingValue ?? '';\n\n return template.replace(/\\{\\{\\s*([a-zA-Z0-9_.-]+)\\s*\\}\\}/g, (_match, key: string) => {\n if (Object.prototype.hasOwnProperty.call(resolved, key)) {\n return resolved[key] ?? '';\n }\n\n return options.preserveUnknown ? `{{${key}}}` : missingValue;\n });\n};\n","import { useCallback, useRef, useState } from 'react';\nimport { applyPromptTemplate } from '../prompt/template';\nimport type {\n AiChatInputOptions,\n AiChatResponse,\n AiChatStatus,\n AiClient,\n AiMessage,\n} from '../types';\n\nexport interface UseAiChatOptions {\n client: AiClient;\n systemPrompt?: string;\n template?: string;\n initialMessages?: AiMessage[];\n}\n\nconst buildBaseMessages = (systemPrompt?: string, initialMessages?: AiMessage[]): AiMessage[] => {\n const baseMessages: AiMessage[] = [];\n if (systemPrompt) {\n baseMessages.push({ role: 'system', content: systemPrompt });\n }\n if (initialMessages?.length) {\n baseMessages.push(...initialMessages);\n }\n return baseMessages;\n};\n\nexport const useAiChat = (options: UseAiChatOptions) => {\n const systemPromptRef = useRef(options.systemPrompt);\n const templateRef = useRef(options.template);\n const [messages, setMessages] = useState<AiMessage[]>(() =>\n buildBaseMessages(systemPromptRef.current, options.initialMessages)\n );\n const messagesRef = useRef(messages);\n const [status, setStatus] = useState<AiChatStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n const [lastResponse, setLastResponse] = useState<AiChatResponse | null>(null);\n\n const syncMessages = (nextMessages: AiMessage[]) => {\n messagesRef.current = nextMessages;\n setMessages(nextMessages);\n };\n\n const reset = useCallback(() => {\n syncMessages(buildBaseMessages(systemPromptRef.current, options.initialMessages));\n setStatus('idle');\n setError(null);\n setLastResponse(null);\n }, [options.initialMessages]);\n\n const setSystemPrompt = useCallback(\n (prompt?: string) => {\n systemPromptRef.current = prompt;\n reset();\n },\n [reset]\n );\n\n const sendMessage = useCallback(\n async (input: string, requestOptions: AiChatInputOptions = {}) => {\n const { template, variables, ...chatOptions } = requestOptions;\n const activeTemplate = template ?? templateRef.current;\n const mergedVariables = { input, ...(variables ?? {}) };\n const content = activeTemplate ? applyPromptTemplate(activeTemplate, mergedVariables) : input;\n\n const userMessage: AiMessage = { role: 'user', content };\n const nextMessages = [...messagesRef.current, userMessage];\n syncMessages(nextMessages);\n setStatus('loading');\n setError(null);\n\n try {\n const response = await options.client.sendChat({\n messages: nextMessages,\n ...chatOptions,\n });\n\n const assistantMessage: AiMessage =\n response.message ?? {\n role: 'assistant',\n content: response.content,\n toolCalls: response.toolCalls,\n };\n const updatedMessages = [...nextMessages, assistantMessage];\n syncMessages(updatedMessages);\n setStatus('success');\n setLastResponse(response);\n return response;\n } catch (err) {\n const nextError = err instanceof Error ? err : new Error(String(err));\n setStatus('error');\n setError(nextError);\n throw nextError;\n }\n },\n [options.client]\n );\n\n return {\n status,\n isLoading: status === 'loading',\n error,\n messages,\n lastResponse,\n sendMessage,\n reset,\n setSystemPrompt,\n };\n};\n"]}
|
package/dist/chunk-4PJM4752.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-4PJM4752.js"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/common/config/bootstrap/schema.ts","../src/common/config/bootstrap/paths.ts","../src/common/config/bootstrap/apply-to-process-env.ts","../src/common/config/bootstrap/doctor.ts","../src/common/config/bootstrap/load-app-config.ts","../src/common/auth/server/sms/providers/aliyun-pnvs.ts","../src/common/auth/server/sms/providers/console.ts","../src/common/config/bootstrap/resolve-auth-from-config.ts"],"names":["z","resolve","existsSync","readFileSync","parseYaml"],"mappings":"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","file":"chunk-5H2FICSO.js","sourcesContent":["import { z } from 'zod';\n\nconst aliyunSmsSchema = z.object({\n accessKeyId: z.string().optional(),\n accessKeySecret: z.string().optional(),\n signName: z.string().optional(),\n templateCode: z.string().optional(),\n countryCode: z.string().optional(),\n codeValidMinutes: z.coerce.number().int().positive().optional(),\n endpoint: z.string().url().optional(),\n});\n\nconst authSchema = z.object({\n secret: z.string().min(32, 'auth.secret 至少 32 字符'),\n url: z.string().url('auth.url 须为合法 URL'),\n publicUrl: z.string().url('auth.publicUrl 须为合法 URL'),\n trustedOrigins: z.array(z.string().url()).optional(),\n logOtpInDev: z.boolean().optional(),\n sms: z\n .object({\n provider: z.enum(['console', 'aliyun-pnvs', 'none']).optional(),\n aliyun: aliyunSmsSchema.optional(),\n })\n .optional(),\n email: z\n .object({\n provider: z.string().optional(),\n })\n .optional(),\n});\n\nconst databaseSchema = z.object({\n url: z.string().min(1, 'database.url 不能为空'),\n poolSize: z.coerce.number().int().positive().max(100).optional(),\n timeout: z.coerce.number().int().positive().max(30000).optional(),\n sslMode: z.enum(['disable', 'prefer', 'require']).optional(),\n});\n\nconst aliyunOssSchema = z.object({\n enabled: z.boolean().optional(),\n region: z.string().optional(),\n bucket: z.string().optional(),\n accessKeyId: z.string().optional(),\n accessKeySecret: z.string().optional(),\n customDomain: z.string().optional(),\n secure: z.boolean().optional(),\n internal: z.boolean().optional(),\n});\n\nconst aliyunCdnSchema = z.object({\n enabled: z.boolean().optional(),\n domain: z.string().optional(),\n accessKeyId: z.string().optional(),\n accessKeySecret: z.string().optional(),\n});\n\nexport const appConfigSchema = z.object({\n app: z.object({\n name: z.string().min(1),\n env: z.enum(['development', 'production', 'test']).optional(),\n }),\n database: databaseSchema,\n auth: authSchema,\n storage: z\n .object({\n aliyunOss: aliyunOssSchema.optional(),\n aliyunCdn: aliyunCdnSchema.optional(),\n })\n .optional(),\n});\n\nexport type AppConfig = z.infer<typeof appConfigSchema>;\nexport type AppConfigInput = z.input<typeof appConfigSchema>;\n","import { existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\nexport type AppConfigEnvName = 'local' | 'production' | 'test';\n\nexport type ResolveAppConfigPathOptions = {\n cwd?: string;\n env?: AppConfigEnvName;\n explicitPath?: string;\n};\n\nconst FILE_BY_ENV: Record<AppConfigEnvName, string> = {\n local: 'config/app.config.local.yaml',\n production: 'config/app.config.production.yaml',\n test: 'config/app.config.test.yaml',\n};\n\n/** SOPS 密文默认路径(解密前由运维/脚本处理,应用运行时读明文 production.yaml) */\nexport const SOPS_ENCRYPTED_PATH = 'config/production.enc.yaml';\n\nexport function resolveAppConfigEnv(): AppConfigEnvName {\n const fromEnv = process.env.APP_CONFIG_ENV?.trim();\n if (fromEnv === 'local' || fromEnv === 'production' || fromEnv === 'test') {\n return fromEnv;\n }\n if (process.env.NODE_ENV === 'production') return 'production';\n if (process.env.NODE_ENV === 'test') return 'test';\n return 'local';\n}\n\nexport function isNextBuildPhaseWithoutRuntimeEnv(): boolean {\n return (\n process.env.NEXT_PHASE === 'phase-production-build' ||\n process.env.NEXT_PHASE === 'phase-export'\n );\n}\n\nexport function resolveAppConfigPath(options: ResolveAppConfigPathOptions = {}): string {\n const cwd = options.cwd ?? process.cwd();\n\n if (options.explicitPath) {\n return resolve(cwd, options.explicitPath);\n }\n\n const fromEnv = process.env.APP_CONFIG_PATH?.trim();\n if (fromEnv) {\n return resolve(cwd, fromEnv);\n }\n\n const envName = options.env ?? resolveAppConfigEnv();\n const candidate = resolve(cwd, FILE_BY_ENV[envName]);\n\n if (existsSync(candidate)) {\n return candidate;\n }\n\n const examplePath = resolve(cwd, 'config/app.config.example.yaml');\n if (isNextBuildPhaseWithoutRuntimeEnv() && existsSync(examplePath)) {\n return examplePath;\n }\n\n // 开发回退:local 不存在时尝试 production(CI / 解密后路径)\n if (envName === 'local') {\n const productionFallback = resolve(cwd, FILE_BY_ENV.production);\n if (existsSync(productionFallback)) {\n return productionFallback;\n }\n }\n\n return candidate;\n}\n","import type { AppConfig } from './schema';\n\n/**\n * 将 AppConfig 同步到 process.env,兼容仍读取扁平 env 的 sa2kit 模块(ossFile、legacy 脚本)。\n * 仅在进程内调用一次;已有非空 env 不被覆盖。\n */\nexport function applyAppConfigToProcessEnv(config: AppConfig): void {\n const set = (key: string, value: string | undefined) => {\n if (!value || (process.env[key] && process.env[key]!.length > 0)) return;\n process.env[key] = value;\n };\n\n set('DATABASE_URL', config.database.url);\n if (config.database.poolSize !== undefined) {\n set('DATABASE_POOL_SIZE', String(config.database.poolSize));\n }\n if (config.database.timeout !== undefined) {\n set('DATABASE_TIMEOUT', String(config.database.timeout));\n }\n if (config.database.sslMode) {\n set('DATABASE_SSL_MODE', config.database.sslMode);\n }\n\n set('BETTER_AUTH_SECRET', config.auth.secret);\n set('BETTER_AUTH_URL', config.auth.url);\n set('NEXT_PUBLIC_APP_URL', config.auth.publicUrl);\n\n if (config.auth.trustedOrigins?.length) {\n set('BETTER_AUTH_TRUSTED_ORIGINS', config.auth.trustedOrigins.join(','));\n }\n\n const smsProvider = config.auth.sms?.provider;\n if (smsProvider) {\n set('SA2KIT_SMS_PROVIDER', smsProvider);\n }\n\n const aliyunSms = config.auth.sms?.aliyun;\n if (aliyunSms) {\n set('ALIYUN_SMS_ACCESS_KEY_ID', aliyunSms.accessKeyId);\n set('ALIYUN_SMS_ACCESS_KEY_SECRET', aliyunSms.accessKeySecret);\n set('ALIYUN_SMS_SIGN_NAME', aliyunSms.signName);\n set('ALIYUN_SMS_TEMPLATE_CODE', aliyunSms.templateCode);\n set('ALIYUN_SMS_COUNTRY_CODE', aliyunSms.countryCode);\n if (aliyunSms.codeValidMinutes !== undefined) {\n set('ALIYUN_SMS_CODE_VALID_MINUTES', String(aliyunSms.codeValidMinutes));\n }\n set('ALIYUN_SMS_ENDPOINT', aliyunSms.endpoint);\n }\n\n if (config.auth.email?.provider) {\n set('SA2KIT_EMAIL_PROVIDER', config.auth.email.provider);\n }\n\n if (config.auth.logOtpInDev !== undefined) {\n set('SA2KIT_AUTH_LOG_OTP', config.auth.logOtpInDev ? '1' : '0');\n }\n\n const oss = config.storage?.aliyunOss;\n if (oss) {\n if (oss.region) set('ALIYUN_OSS_REGION', oss.region);\n if (oss.bucket) set('ALIYUN_OSS_BUCKET', oss.bucket);\n if (oss.accessKeyId) set('ALIYUN_OSS_ACCESS_KEY_ID', oss.accessKeyId);\n if (oss.accessKeySecret) set('ALIYUN_OSS_ACCESS_KEY_SECRET', oss.accessKeySecret);\n if (oss.customDomain) set('ALIYUN_OSS_CUSTOM_DOMAIN', oss.customDomain);\n if (oss.secure !== undefined) set('ALIYUN_OSS_SECURE', oss.secure ? 'true' : 'false');\n if (oss.internal !== undefined) set('ALIYUN_OSS_INTERNAL', oss.internal ? 'true' : 'false');\n }\n\n const cdn = config.storage?.aliyunCdn;\n if (cdn) {\n if (cdn.domain) set('ALIYUN_CDN_DOMAIN', cdn.domain);\n if (cdn.accessKeyId) set('ALIYUN_CDN_ACCESS_KEY_ID', cdn.accessKeyId);\n if (cdn.accessKeySecret) set('ALIYUN_CDN_ACCESS_KEY_SECRET', cdn.accessKeySecret);\n }\n}\n","import type { AppConfig } from './schema';\n\nexport type ConfigDoctorIssueLevel = 'error' | 'warning' | 'info';\n\nexport type ConfigDoctorIssue = {\n level: ConfigDoctorIssueLevel;\n featureId: string;\n featureName: string;\n message: string;\n hints?: string[];\n};\n\nexport type ConfigDoctorReport = {\n ok: boolean;\n issues: ConfigDoctorIssue[];\n enabledFeatures: string[];\n};\n\nfunction isSet(value: string | undefined): boolean {\n return Boolean(value && value.trim().length > 0);\n}\n\nexport function diagnoseAppConfig(config: AppConfig): ConfigDoctorReport {\n const issues: ConfigDoctorIssue[] = [];\n const enabledFeatures: string[] = ['app', 'database', 'auth-core'];\n\n const env = config.app.env ?? process.env.NODE_ENV ?? 'development';\n const isProd = env === 'production';\n\n // Auth SMS\n const smsProvider = config.auth.sms?.provider ?? (isProd ? undefined : 'console');\n if (smsProvider === 'aliyun-pnvs') {\n const aliyun = config.auth.sms?.aliyun;\n const missing = [\n !isSet(aliyun?.accessKeyId) && 'auth.sms.aliyun.accessKeyId',\n !isSet(aliyun?.accessKeySecret) && 'auth.sms.aliyun.accessKeySecret',\n !isSet(aliyun?.signName) && 'auth.sms.aliyun.signName',\n !isSet(aliyun?.templateCode) && 'auth.sms.aliyun.templateCode',\n ].filter(Boolean) as string[];\n\n if (missing.length === 0) {\n enabledFeatures.push('auth-sms');\n } else {\n issues.push({\n level: 'error',\n featureId: 'auth-sms',\n featureName: '手机短信 OTP',\n message: `sms.provider=aliyun-pnvs 但缺少:${missing.join(', ')}`,\n });\n }\n } else if (smsProvider === 'console') {\n enabledFeatures.push('auth-sms');\n if (isProd) {\n issues.push({\n level: 'warning',\n featureId: 'auth-sms',\n featureName: '手机短信 OTP',\n message: '生产环境使用 console SMS,验证码仅输出到日志。',\n hints: ['生产请改为 aliyun-pnvs 并填写 auth.sms.aliyun.*'],\n });\n }\n } else {\n issues.push({\n level: isProd ? 'warning' : 'info',\n featureId: 'auth-sms',\n featureName: '手机短信 OTP',\n message: isProd\n ? '未配置短信 provider,用户收不到验证码。'\n : '未配置短信;开发可设 auth.sms.provider: console',\n hints: ['开发:auth.sms.provider: console', '生产:auth.sms.provider: aliyun-pnvs'],\n });\n }\n\n // OSS\n const oss = config.storage?.aliyunOss;\n const ossComplete =\n oss?.enabled !== false &&\n isSet(oss?.region) &&\n isSet(oss?.bucket) &&\n isSet(oss?.accessKeyId) &&\n isSet(oss?.accessKeySecret);\n\n if (ossComplete) {\n enabledFeatures.push('storage-oss');\n } else if (oss?.enabled === true) {\n issues.push({\n level: 'error',\n featureId: 'storage-oss',\n featureName: '阿里云 OSS',\n message: 'storage.aliyunOss.enabled 为 true 但配置不完整。',\n });\n } else {\n issues.push({\n level: 'info',\n featureId: 'storage-oss',\n featureName: '阿里云 OSS',\n message: '未启用完整 OSS 配置,文件上传将回退本地存储(若模块允许)。',\n });\n }\n\n const ok = !issues.some((i) => i.level === 'error');\n return { ok, issues, enabledFeatures };\n}\n\nlet loggedOnce = false;\n\nexport function logConfigDoctorReport(report: ConfigDoctorReport, options?: { force?: boolean }): void {\n if (loggedOnce && !options?.force) return;\n loggedOnce = true;\n\n const lines: string[] = ['[sa2kit/config] 配置检查'];\n for (const issue of report.issues) {\n const prefix = issue.level === 'error' ? '✗' : issue.level === 'warning' ? '⚠' : '○';\n lines.push(`${prefix} ${issue.featureName}: ${issue.message}`);\n for (const hint of issue.hints ?? []) {\n lines.push(` → ${hint}`);\n }\n }\n if (report.issues.length === 0) {\n lines.push('✓ 配置项检查通过');\n }\n lines.push(` 已启用: ${report.enabledFeatures.join(', ')}`);\n console.info(lines.join('\\n'));\n}\n","import { readFileSync } from 'node:fs';\nimport { parse as parseYaml } from 'yaml';\nimport { applyAppConfigToProcessEnv } from './apply-to-process-env';\nimport { diagnoseAppConfig, logConfigDoctorReport, type ConfigDoctorReport } from './doctor';\nimport { resolveAppConfigPath, type ResolveAppConfigPathOptions } from './paths';\nimport { appConfigSchema, type AppConfig } from './schema';\n\nexport type LoadAppConfigOptions = ResolveAppConfigPathOptions & {\n /** 是否写入 process.env(默认 true) */\n applyToProcessEnv?: boolean;\n /** 是否打印 doctor 报告(默认 true) */\n logDoctor?: boolean;\n};\n\nlet cachedConfig: AppConfig | undefined;\nlet cachedPath: string | undefined;\n\nexport function readAppConfigFile(filePath: string): AppConfig {\n const raw = readFileSync(filePath, 'utf8');\n const parsed = parseYaml(raw);\n const result = appConfigSchema.safeParse(parsed);\n\n if (!result.success) {\n const details = result.error.issues\n .map((issue) => ` - ${issue.path.join('.')}: ${issue.message}`)\n .join('\\n');\n throw new Error(`AppConfig 校验失败 (${filePath}):\\n${details}`);\n }\n\n return result.data;\n}\n\nexport function loadAppConfig(options: LoadAppConfigOptions = {}): AppConfig {\n const filePath = resolveAppConfigPath(options);\n\n if (cachedConfig && cachedPath === filePath) {\n return cachedConfig;\n }\n\n const config = readAppConfigFile(filePath);\n cachedPath = filePath;\n cachedConfig = config;\n\n if (options.applyToProcessEnv !== false) {\n applyAppConfigToProcessEnv(config);\n }\n\n if (options.logDoctor !== false) {\n logConfigDoctorReport(diagnoseAppConfig(config));\n }\n\n return config;\n}\n\nexport function getAppConfig(): AppConfig {\n if (!cachedConfig) {\n return loadAppConfig();\n }\n return cachedConfig;\n}\n\nexport function resetAppConfigCache(): void {\n cachedConfig = undefined;\n cachedPath = undefined;\n}\n\nexport function checkAppConfigFromFile(\n filePath: string,\n): { config: AppConfig; report: ConfigDoctorReport } {\n const config = readAppConfigFile(filePath);\n return { config, report: diagnoseAppConfig(config) };\n}\n","import type { AliyunPnvsSmsConfig, Sa2kitSmsProvider } from '../types';\n\ntype PopCoreClient = {\n request(\n action: string,\n params: Record<string, string>,\n options?: { method?: string },\n ): Promise<{ Code?: string; Success?: boolean; Message?: string }>;\n};\n\nasync function loadPopCore(): Promise<new (config: Record<string, string>) => PopCoreClient> {\n try {\n const mod = await import('@alicloud/pop-core');\n return (mod.default ?? mod) as unknown as new (config: Record<string, string>) => PopCoreClient;\n } catch {\n throw new Error(\n '启用 SA2KIT_SMS_PROVIDER=aliyun-pnvs 需要安装 @alicloud/pop-core:pnpm add @alicloud/pop-core',\n );\n }\n}\n\nexport function createAliyunPnvsSmsProvider(config: AliyunPnvsSmsConfig): Sa2kitSmsProvider {\n return {\n async sendOTP(phoneNumber, code) {\n const Core = await loadPopCore();\n const client = new Core({\n accessKeyId: config.accessKeyId,\n accessKeySecret: config.accessKeySecret,\n endpoint: config.endpoint ?? 'https://dypnsapi.aliyuncs.com',\n apiVersion: '2017-05-25',\n });\n\n const minutes = String(config.codeValidMinutes ?? 5);\n const result = await client.request(\n 'SendSmsVerifyCode',\n {\n PhoneNumber: phoneNumber,\n CountryCode: config.countryCode ?? '86',\n SignName: config.signName,\n TemplateCode: config.templateCode,\n TemplateParam: JSON.stringify({ code, min: minutes }),\n },\n { method: 'POST' },\n );\n\n if (result.Code !== 'OK' && result.Success !== true) {\n throw new Error(\n `阿里云短信认证发送失败: ${result.Message ?? result.Code ?? 'unknown error'}`,\n );\n }\n },\n };\n}\n","import type { Sa2kitSmsProvider } from '../types';\n\nexport function createConsoleSmsProvider(): Sa2kitSmsProvider {\n return {\n async sendOTP(phoneNumber, code) {\n console.info(`[sa2kit/auth][sms][console] ${phoneNumber} => ${code}`);\n },\n };\n}\n","import type { Sa2kitAuthConfig } from '../../auth/server/types';\nimport type { AppConfig } from './schema';\nimport { createAliyunPnvsSmsProvider } from '../../auth/server/sms/providers/aliyun-pnvs';\nimport { createConsoleSmsProvider } from '../../auth/server/sms/providers/console';\n\nfunction parseTrustedOrigins(config: AppConfig): string[] {\n const baseURL = config.auth.url;\n const defaults = [baseURL, 'http://localhost:3000', 'http://127.0.0.1:3000'];\n const extra = config.auth.trustedOrigins ?? [];\n return [...defaults, ...extra].filter((origin, index, list) => list.indexOf(origin) === index);\n}\n\nexport function resolveAuthConfigFromAppConfig(\n config: AppConfig,\n overrides: Partial<Sa2kitAuthConfig> & Pick<Sa2kitAuthConfig, 'db'>,\n): Sa2kitAuthConfig {\n const smsProvider = config.auth.sms?.provider ?? 'console';\n let sms = overrides.sms;\n\n if (!sms && smsProvider === 'console') {\n const consoleProvider = createConsoleSmsProvider();\n sms = { sendOTP: consoleProvider.sendOTP.bind(consoleProvider) };\n }\n\n if (!sms && smsProvider === 'aliyun-pnvs') {\n const aliyun = config.auth.sms?.aliyun;\n if (\n aliyun?.accessKeyId &&\n aliyun.accessKeySecret &&\n aliyun.signName &&\n aliyun.templateCode\n ) {\n const provider = createAliyunPnvsSmsProvider({\n accessKeyId: aliyun.accessKeyId,\n accessKeySecret: aliyun.accessKeySecret,\n signName: aliyun.signName,\n templateCode: aliyun.templateCode,\n countryCode: aliyun.countryCode ?? '86',\n codeValidMinutes: aliyun.codeValidMinutes ?? 5,\n endpoint: aliyun.endpoint,\n });\n sms = { sendOTP: provider.sendOTP.bind(provider) };\n }\n }\n\n const isProd = (config.app.env ?? process.env.NODE_ENV) === 'production';\n\n return {\n db: overrides.db,\n baseURL: overrides.baseURL ?? config.auth.url,\n secret: overrides.secret ?? config.auth.secret,\n trustedOrigins: overrides.trustedOrigins ?? parseTrustedOrigins(config),\n basePath: overrides.basePath,\n sms: overrides.sms ?? sms,\n email: overrides.email,\n phoneNumberValidator: overrides.phoneNumberValidator,\n logOtpInDev:\n overrides.logOtpInDev ??\n config.auth.logOtpInDev ??\n (!isProd || process.env.SA2KIT_AUTH_LOG_OTP === '1'),\n };\n}\n"]}
|