sa2kit 3.6.0 → 3.8.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.
Files changed (61) hide show
  1. package/dist/business/index.d.mts +2 -7
  2. package/dist/business/index.d.ts +2 -7
  3. package/dist/business/index.js +1761 -8045
  4. package/dist/business/index.js.map +1 -1
  5. package/dist/business/index.mjs +1169 -7452
  6. package/dist/business/index.mjs.map +1 -1
  7. package/dist/business/portfolio/index.d.mts +1 -2
  8. package/dist/business/portfolio/index.d.ts +1 -2
  9. package/dist/{chunk-ZJLS5JU5.mjs → chunk-6KD4CD7O.mjs} +7 -16
  10. package/dist/chunk-6KD4CD7O.mjs.map +1 -0
  11. package/dist/chunk-GJVEYCS4.js +12 -0
  12. package/dist/chunk-GJVEYCS4.js.map +1 -0
  13. package/dist/chunk-PPV4IEWR.mjs +8 -0
  14. package/dist/chunk-PPV4IEWR.mjs.map +1 -0
  15. package/dist/{chunk-XPY45Y75.js → chunk-VVHFMAE7.js} +9 -21
  16. package/dist/chunk-VVHFMAE7.js.map +1 -0
  17. package/dist/common/aiApi/client/index.d.mts +66 -4
  18. package/dist/common/aiApi/client/index.d.ts +66 -4
  19. package/dist/common/aiApi/client/index.js +360 -15
  20. package/dist/common/aiApi/client/index.js.map +1 -1
  21. package/dist/common/aiApi/client/index.mjs +345 -11
  22. package/dist/common/aiApi/client/index.mjs.map +1 -1
  23. package/dist/common/aiApi/index.d.mts +2 -2
  24. package/dist/common/aiApi/index.d.ts +2 -2
  25. package/dist/common/aiApi/index.js +63 -62
  26. package/dist/common/aiApi/index.mjs +2 -1
  27. package/dist/common/aiApi/server/index.d.mts +1 -1
  28. package/dist/common/aiApi/server/index.d.ts +1 -1
  29. package/dist/common/aiApi/server/index.js +63 -62
  30. package/dist/common/aiApi/server/index.mjs +2 -1
  31. package/dist/{index-BSmd4ikf.d.ts → index-B4wDXFL0.d.mts} +39 -2
  32. package/dist/{index-r2-zE3iC.d.mts → index-B4wDXFL0.d.ts} +39 -2
  33. package/dist/{index-DLLPTprx.d.mts → index-B9vXYzok.d.mts} +48 -13
  34. package/dist/{index-VFDbZxVM.d.ts → index-BZ0MhRau.d.ts} +48 -13
  35. package/dist/index.d.mts +398 -28
  36. package/dist/index.d.ts +398 -28
  37. package/dist/index.js +1831 -6859
  38. package/dist/index.js.map +1 -1
  39. package/dist/index.mjs +1121 -6149
  40. package/dist/index.mjs.map +1 -1
  41. package/dist/{types-CiqMQ-uu.d.mts → types-DgbG0Of-.d.mts} +9 -1
  42. package/dist/{types-CiqMQ-uu.d.ts → types-DgbG0Of-.d.ts} +9 -1
  43. package/package.json +1 -11
  44. package/dist/CollisionBalls-DgKtscU2.d.mts +0 -41
  45. package/dist/CollisionBalls-DgKtscU2.d.ts +0 -41
  46. package/dist/business/calendar/index.d.mts +0 -6
  47. package/dist/business/calendar/index.d.ts +0 -6
  48. package/dist/business/calendar/index.js +0 -7433
  49. package/dist/business/calendar/index.js.map +0 -1
  50. package/dist/business/calendar/index.mjs +0 -7257
  51. package/dist/business/calendar/index.mjs.map +0 -1
  52. package/dist/business/calendar/routes/index.d.mts +0 -191
  53. package/dist/business/calendar/routes/index.d.ts +0 -191
  54. package/dist/business/calendar/routes/index.js +0 -844
  55. package/dist/business/calendar/routes/index.js.map +0 -1
  56. package/dist/business/calendar/routes/index.mjs +0 -826
  57. package/dist/business/calendar/routes/index.mjs.map +0 -1
  58. package/dist/chunk-XPY45Y75.js.map +0 -1
  59. package/dist/chunk-ZJLS5JU5.mjs.map +0 -1
  60. package/dist/index-BMgdH5dL.d.mts +0 -1716
  61. package/dist/index-IXMAeTtN.d.ts +0 -1716
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/common/auth/schema/enums.ts","../../../../src/common/auth/schema/user.ts","../../../../src/common/auth/schema/session.ts","../../../../src/common/auth/schema/account.ts","../../../../src/common/auth/schema/verification.ts","../../../../src/common/auth/schema/relations.ts","../../../../src/business/calendar/db/schema.ts","../../../../src/business/calendar/db/calendarDbService.ts","../../../../src/common/auth/server/session.ts","../../../../src/business/calendar/api/auth-config.ts","../../../../src/business/calendar/api/_shared.ts","../../../../src/business/calendar/api/route-handlers.ts","../../../../src/business/calendar/routes/index.ts"],"names":["pgTable","text","timestamp","sql","boolean","relations","session","user","getSessionUserNumeric","reminders"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Auth Schema - Enums\n * 认证相关的枚举类型定义\n */\n\nimport { pgEnum } from 'drizzle-orm/pg-core';\n\n/**\n * 用户角色枚举\n */\nexport const userRole = pgEnum('UserRole', ['USER', 'ADMIN', 'SUPER_ADMIN']);\n\n/**\n * 类型定义\n */\nexport type UserRole = 'USER' | 'ADMIN' | 'SUPER_ADMIN';\n\n","/**\n * Better Auth — user 表(3.0 SSOT)\n */\nimport { boolean, pgTable, text, timestamp } from 'drizzle-orm/pg-core';\nimport { sql } from 'drizzle-orm';\nimport { userRole } from './enums';\n\nexport const user = pgTable('user', {\n id: text('id').primaryKey().notNull(),\n name: text('name').notNull(),\n email: text('email').notNull(),\n emailVerified: boolean('emailVerified').default(false).notNull(),\n image: text('image'),\n phoneNumber: text('phoneNumber'),\n phoneNumberVerified: boolean('phoneNumberVerified').default(false),\n role: userRole('role').default('USER').notNull(),\n createdAt: timestamp('createdAt', { precision: 3, mode: 'date' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n updatedAt: timestamp('updatedAt', { precision: 3, mode: 'date' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n});\n\nexport type User = typeof user.$inferSelect;\nexport type NewUser = typeof user.$inferInsert;\n","/**\n * Better Auth — session 表(3.0 SSOT)\n */\nimport { pgTable, text, timestamp } from 'drizzle-orm/pg-core';\nimport { sql } from 'drizzle-orm';\nimport { user } from './user';\n\nexport const session = pgTable('session', {\n id: text('id').primaryKey().notNull(),\n userId: text('userId')\n .notNull()\n .references(() => user.id, { onDelete: 'cascade' }),\n token: text('token').notNull(),\n expiresAt: timestamp('expiresAt', { precision: 3, mode: 'date' }).notNull(),\n ipAddress: text('ipAddress'),\n userAgent: text('userAgent'),\n createdAt: timestamp('createdAt', { precision: 3, mode: 'date' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n updatedAt: timestamp('updatedAt', { precision: 3, mode: 'date' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n});\n\nexport type Session = typeof session.$inferSelect;\nexport type NewSession = typeof session.$inferInsert;\n","/**\n * Better Auth — account 表(credential / OAuth,3.0 SSOT)\n */\nimport { pgTable, text, timestamp } from 'drizzle-orm/pg-core';\nimport { sql } from 'drizzle-orm';\nimport { user } from './user';\n\nexport const account = pgTable('account', {\n id: text('id').primaryKey().notNull(),\n accountId: text('accountId').notNull(),\n providerId: text('providerId').notNull(),\n userId: text('userId')\n .notNull()\n .references(() => user.id, { onDelete: 'cascade' }),\n accessToken: text('accessToken'),\n refreshToken: text('refreshToken'),\n idToken: text('idToken'),\n accessTokenExpiresAt: timestamp('accessTokenExpiresAt', { precision: 3, mode: 'date' }),\n refreshTokenExpiresAt: timestamp('refreshTokenExpiresAt', { precision: 3, mode: 'date' }),\n scope: text('scope'),\n password: text('password'),\n createdAt: timestamp('createdAt', { precision: 3, mode: 'date' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n updatedAt: timestamp('updatedAt', { precision: 3, mode: 'date' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n});\n\nexport type Account = typeof account.$inferSelect;\nexport type NewAccount = typeof account.$inferInsert;\n","/**\n * Better Auth — verification 表(OTP / magic link,3.0 SSOT)\n */\nimport { pgTable, text, timestamp } from 'drizzle-orm/pg-core';\nimport { sql } from 'drizzle-orm';\n\nexport const verification = pgTable('verification', {\n id: text('id').primaryKey().notNull(),\n identifier: text('identifier').notNull(),\n value: text('value').notNull(),\n expiresAt: timestamp('expiresAt', { precision: 3, mode: 'date' }).notNull(),\n createdAt: timestamp('createdAt', { precision: 3, mode: 'date' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n updatedAt: timestamp('updatedAt', { precision: 3, mode: 'date' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n});\n\nexport type Verification = typeof verification.$inferSelect;\nexport type NewVerification = typeof verification.$inferInsert;\n\n/** @deprecated 3.0 使用 `verification` */\nexport const verifications = verification;\n","/**\n * Auth Schema - Relations\n * 表关系定义\n */\n\nimport { relations } from 'drizzle-orm';\nimport { user } from './user';\nimport { session } from './session';\nimport { account } from './account';\n\n/**\n * User 表关系\n */\nexport const userRelations = relations(user, ({ many }) => ({\n sessions: many(session),\n accounts: many(account),\n}));\n\n/**\n * Session 表关系\n */\nexport const sessionRelations = relations(session, ({ one }) => ({\n user: one(user, {\n fields: [session.userId],\n references: [user.id],\n }),\n}));\n\n/**\n * Account 表关系\n */\nexport const accountRelations = relations(account, ({ one }) => ({\n user: one(user, {\n fields: [account.userId],\n references: [user.id],\n }),\n}));\n\n","import { pgTable, serial, text, timestamp, boolean, varchar, integer, json } from 'drizzle-orm/pg-core';\nimport { relations } from 'drizzle-orm';\nimport { user as users } from '../../../common/auth/schema';\n\n/**\n * 日历事件表\n */\nexport const calendarEvents = pgTable('calendar_events', {\n id: serial('id').primaryKey(),\n title: varchar('title', { length: 255 }).notNull(),\n description: text('description'),\n startTime: timestamp('start_time').notNull(),\n endTime: timestamp('end_time').notNull(),\n allDay: boolean('all_day').notNull().default(false),\n location: varchar('location', { length: 500 }),\n color: varchar('color', { length: 7 }).notNull().default('#3B82F6'), // 十六进制颜色值\n priority: varchar('priority', { length: 10 }).notNull().default('normal'), // low, normal, high, urgent\n userId: integer('user_id').notNull().references(() => users.id, { onDelete: 'cascade' }),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n updatedAt: timestamp('updated_at').defaultNow().notNull(),\n});\n\n/**\n * 重复规则表\n */\nexport const recurrenceRules = pgTable('recurrence_rules', {\n id: serial('id').primaryKey(),\n eventId: integer('event_id').notNull().references(() => calendarEvents.id, { onDelete: 'cascade' }),\n ruleType: varchar('rule_type', { length: 20 }).notNull(), // daily, weekly, monthly, yearly, custom\n interval: integer('interval').notNull().default(1), // 间隔\n endDate: timestamp('end_date'), // 结束日期\n count: integer('count'), // 重复次数\n byWeekday: json('by_weekday').$type<number[]>(), // 周几重复 [0,1,2,3,4,5,6],0=周日\n byMonthday: json('by_monthday').$type<number[]>(), // 月中的第几天 [1,2,...,31]\n byMonth: json('by_month').$type<number[]>(), // 第几月 [1,2,...,12]\n createdAt: timestamp('created_at').defaultNow().notNull(),\n});\n\n/**\n * 提醒表\n */\nexport const reminders = pgTable('reminders', {\n id: serial('id').primaryKey(),\n eventId: integer('event_id').notNull().references(() => calendarEvents.id, { onDelete: 'cascade' }),\n reminderTime: timestamp('reminder_time').notNull(), // 提醒时间\n reminderType: varchar('reminder_type', { length: 20 }).notNull(), // notification, email, sms\n status: varchar('status', { length: 20 }).notNull().default('pending'), // pending, sent, failed\n createdAt: timestamp('created_at').defaultNow().notNull(),\n updatedAt: timestamp('updated_at').defaultNow().notNull(),\n});\n\n/**\n * 日历配置表 - 用户个人日历设置\n */\nexport const calendarConfigs = pgTable('calendar_configs', {\n id: serial('id').primaryKey(),\n userId: integer('user_id').notNull().references(() => users.id, { onDelete: 'cascade' }).unique(),\n firstDayOfWeek: integer('first_day_of_week').notNull().default(1), // 0=周日, 1=周一\n workingHoursStart: varchar('working_hours_start', { length: 5 }).notNull().default('09:00'),\n workingHoursEnd: varchar('working_hours_end', { length: 5 }).notNull().default('18:00'),\n timeZone: varchar('time_zone', { length: 50 }).notNull().default('Asia/Shanghai'),\n dateFormat: varchar('date_format', { length: 20 }).notNull().default('YYYY-MM-DD'),\n timeFormat: varchar('time_format', { length: 20 }).notNull().default('HH:mm'),\n defaultView: varchar('default_view', { length: 20 }).notNull().default('month'), // month, week, day, agenda\n defaultEventColor: varchar('default_event_color', { length: 7 }).notNull().default('#3B82F6'),\n weekends: boolean('weekends').notNull().default(true),\n eventColors: json('event_colors').$type<Record<string, string>>().default({\n blue: '#3B82F6',\n green: '#10B981',\n purple: '#8B5CF6',\n red: '#EF4444',\n yellow: '#F59E0B',\n pink: '#EC4899',\n indigo: '#6366F1',\n gray: '#6B7280'\n }),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n updatedAt: timestamp('updated_at').defaultNow().notNull(),\n});\n\n/**\n * 事件分享表 - 用于共享日历功能\n */\nexport const eventShares = pgTable('event_shares', {\n id: serial('id').primaryKey(),\n eventId: integer('event_id').notNull().references(() => calendarEvents.id, { onDelete: 'cascade' }),\n sharedWithUserId: integer('shared_with_user_id').notNull().references(() => users.id, { onDelete: 'cascade' }),\n sharedByUserId: integer('shared_by_user_id').notNull().references(() => users.id, { onDelete: 'cascade' }),\n permission: varchar('permission', { length: 20 }).notNull().default('read'), // read, write\n createdAt: timestamp('created_at').defaultNow().notNull(),\n});\n\n// ===== 关系定义 =====\n\n/**\n * 日历事件关系\n */\nexport const calendarEventsRelations = relations(calendarEvents, ({ one, many }) => ({\n user: one(users, {\n fields: [calendarEvents.userId],\n references: [users.id],\n }),\n recurrenceRule: one(recurrenceRules, {\n fields: [calendarEvents.id],\n references: [recurrenceRules.eventId],\n }),\n reminders: many(reminders),\n shares: many(eventShares),\n}));\n\n/**\n * 重复规则关系\n */\nexport const recurrenceRulesRelations = relations(recurrenceRules, ({ one }) => ({\n event: one(calendarEvents, {\n fields: [recurrenceRules.eventId],\n references: [calendarEvents.id],\n }),\n}));\n\n/**\n * 提醒关系\n */\nexport const remindersRelations = relations(reminders, ({ one }) => ({\n event: one(calendarEvents, {\n fields: [reminders.eventId],\n references: [calendarEvents.id],\n }),\n}));\n\n/**\n * 日历配置关系\n */\nexport const calendarConfigsRelations = relations(calendarConfigs, ({ one }) => ({\n user: one(users, {\n fields: [calendarConfigs.userId],\n references: [users.id],\n }),\n}));\n\n/**\n * 事件分享关系\n */\nexport const eventSharesRelations = relations(eventShares, ({ one }) => ({\n event: one(calendarEvents, {\n fields: [eventShares.eventId],\n references: [calendarEvents.id],\n }),\n sharedWithUser: one(users, {\n fields: [eventShares.sharedWithUserId],\n references: [users.id],\n }),\n sharedByUser: one(users, {\n fields: [eventShares.sharedByUserId],\n references: [users.id],\n }),\n}));\n\n// 所有表和关系已在上面使用 export 关键字导出 ","import { and, eq, gte, lte, desc, asc } from 'drizzle-orm';\nimport {\n calendarEvents,\n recurrenceRules,\n reminders,\n calendarConfigs,\n eventShares\n} from './schema';\n\n/**\n * 简化版日历数据库服务\n * \n * 提供基础的数据库操作,避免复杂的类型转换\n * 后续可以根据需要逐步完善\n */\nclass CalendarDbService {\n private _db: any;\n\n /**\n * 设置数据库实例\n */\n setDb(db: any) {\n this._db = db;\n }\n\n /**\n * 数据库是否已初始化\n */\n isConfigured() {\n return Boolean(this._db);\n }\n\n /**\n * 获取数据库实例\n */\n get db() {\n if (!this._db) {\n throw new Error('CalendarDbService: Database instance not set. Call setDb() first.');\n }\n return this._db;\n }\n \n // ===== 事件基础操作 =====\n\n /**\n * 获取用户的所有事件(基础版本)\n */\n async getAllEvents(userId: number, startDate?: Date, endDate?: Date) {\n const conditions = [eq(calendarEvents.userId, userId)];\n \n if (startDate) {\n conditions.push(gte(calendarEvents.startTime, startDate));\n }\n \n if (endDate) {\n conditions.push(lte(calendarEvents.endTime, endDate));\n }\n\n const events = await this.db\n .select()\n .from(calendarEvents)\n .where(and(...conditions))\n .orderBy(asc(calendarEvents.startTime));\n\n return events;\n }\n\n /**\n * 根据ID获取事件\n */\n async getEventById(eventId: number) {\n const [event] = await this.db\n .select()\n .from(calendarEvents)\n .where(eq(calendarEvents.id, eventId))\n .limit(1);\n\n return event || null;\n }\n\n /**\n * 创建事件(基础版本)\n */\n async createEvent(eventData: {\n title: string;\n description?: string;\n startTime: Date;\n endTime: Date;\n allDay: boolean;\n location?: string;\n color: string;\n userId: number;\n }) {\n const [newEvent] = await this.db\n .insert(calendarEvents)\n .values(eventData)\n .returning();\n\n return newEvent;\n }\n\n /**\n * 更新事件\n */\n async updateEvent(eventId: number, eventData: {\n title?: string;\n description?: string;\n startTime?: Date;\n endTime?: Date;\n allDay?: boolean;\n location?: string;\n color?: string;\n }) {\n const updateData = {\n ...eventData,\n updatedAt: new Date()\n };\n\n const [updatedEvent] = await this.db\n .update(calendarEvents)\n .set(updateData)\n .where(eq(calendarEvents.id, eventId))\n .returning();\n\n return updatedEvent;\n }\n\n /**\n * 删除事件\n */\n async deleteEvent(eventId: number): Promise<void> {\n await this.db\n .delete(calendarEvents)\n .where(eq(calendarEvents.id, eventId));\n }\n\n // ===== 用户配置操作 =====\n\n /**\n * 获取用户的日历配置\n */\n async getUserConfig(userId: number) {\n const [config] = await this.db\n .select()\n .from(calendarConfigs)\n .where(eq(calendarConfigs.userId, userId))\n .limit(1);\n\n return config || null;\n }\n\n /**\n * 创建或更新用户配置\n */\n async upsertUserConfig(userId: number, configData: {\n firstDayOfWeek?: number;\n workingHoursStart?: string;\n workingHoursEnd?: string;\n timeZone?: string;\n dateFormat?: string;\n timeFormat?: string;\n defaultView?: string;\n defaultEventColor?: string;\n weekends?: boolean;\n eventColors?: Record<string, string>;\n }) {\n const existingConfig = await this.getUserConfig(userId);\n\n if (existingConfig) {\n // 更新现有配置\n const [updatedConfig] = await this.db\n .update(calendarConfigs)\n .set({\n ...configData,\n updatedAt: new Date()\n })\n .where(eq(calendarConfigs.userId, userId))\n .returning();\n\n return updatedConfig;\n } else {\n // 创建新配置\n const [newConfig] = await this.db\n .insert(calendarConfigs)\n .values({\n userId,\n ...configData\n })\n .returning();\n\n return newConfig;\n }\n }\n\n /**\n * 为事件创建重复规则\n */\n async createRecurrenceRule(ruleData: {\n eventId: number;\n ruleType: string;\n interval: number;\n endDate?: Date;\n count?: number;\n byWeekday?: number[];\n byMonthday?: number[];\n byMonth?: number[];\n }) {\n const [newRule] = await this.db\n .insert(recurrenceRules)\n .values(ruleData)\n .returning();\n\n return newRule;\n }\n\n /**\n * 获取事件的重复规则\n */\n async getRecurrenceRule(eventId: number) {\n const [rule] = await this.db\n .select()\n .from(recurrenceRules)\n .where(eq(recurrenceRules.eventId, eventId))\n .limit(1);\n\n return rule || null;\n }\n\n /**\n * 删除重复规则\n */\n async deleteRecurrenceRule(eventId: number): Promise<void> {\n await this.db\n .delete(recurrenceRules)\n .where(eq(recurrenceRules.eventId, eventId));\n }\n\n /**\n * 为事件创建提醒\n */\n async createReminder(reminderData: {\n eventId: number;\n reminderTime: Date;\n reminderType: string;\n status?: string;\n }) {\n const [newReminder] = await this.db\n .insert(reminders)\n .values({\n ...reminderData,\n status: reminderData.status || 'pending'\n })\n .returning();\n\n return newReminder;\n }\n\n /**\n * 获取事件的提醒列表\n */\n async getEventReminders(eventId: number) {\n const remindersList = await this.db\n .select()\n .from(reminders)\n .where(eq(reminders.eventId, eventId))\n .orderBy(asc(reminders.reminderTime));\n\n return remindersList;\n }\n\n /**\n * 删除事件的所有提醒\n */\n async deleteEventReminders(eventId: number): Promise<void> {\n await this.db\n .delete(reminders)\n .where(eq(reminders.eventId, eventId));\n }\n\n /**\n * 获取用户在指定时间范围内的事件数量\n */\n async getEventCount(userId: number, startDate?: Date, endDate?: Date): Promise<number> {\n const conditions = [eq(calendarEvents.userId, userId)];\n \n if (startDate) {\n conditions.push(gte(calendarEvents.startTime, startDate));\n }\n \n if (endDate) {\n conditions.push(lte(calendarEvents.endTime, endDate));\n }\n\n const result = await this.db\n .select({ count: calendarEvents.id })\n .from(calendarEvents)\n .where(and(...conditions));\n\n return result.length;\n }\n\n /**\n * 搜索事件\n */\n async searchEvents(userId: number, searchTerm: string) {\n const events = await this.db\n .select()\n .from(calendarEvents)\n .where(\n and(\n eq(calendarEvents.userId, userId),\n )\n )\n .orderBy(desc(calendarEvents.startTime));\n\n return events.filter((event: any) => \n event.title.toLowerCase().includes(searchTerm.toLowerCase()) ||\n (event.description && event.description.toLowerCase().includes(searchTerm.toLowerCase()))\n );\n }\n\n /**\n * 批量删除用户的所有事件\n */\n async deleteAllUserEvents(userId: number): Promise<void> {\n await this.db\n .delete(calendarEvents)\n .where(eq(calendarEvents.userId, userId));\n }\n}\n\n\n// 导出单例实例\nexport const calendarDbService = new CalendarDbService();\nexport default calendarDbService; ","/**\n * 从 Request 解析 Better Auth session(替代自研 JWT validateApiAuth)\n */\nimport type { Sa2kitAuthInstance } from './types';\n\nexport type SessionUser = {\n id: string;\n email: string;\n name: string;\n role?: string;\n phoneNumber?: string | null;\n};\n\nexport async function getSessionUser(\n auth: Sa2kitAuthInstance,\n request: Request,\n): Promise<SessionUser | null> {\n const session = await auth.api.getSession({ headers: request.headers });\n if (!session?.user) return null;\n\n const user = session.user as SessionUser & { role?: string };\n return {\n id: user.id,\n email: user.email,\n name: user.name,\n role: user.role,\n phoneNumber: (user as { phoneNumber?: string | null }).phoneNumber ?? null,\n };\n}\n\nexport type SessionUserNumeric = Omit<SessionUser, 'id'> & { id: number };\n\n/** 兼容 numeric id 消费方(legacy calendar 等) */\nexport async function getSessionUserNumeric(\n auth: Sa2kitAuthInstance,\n request: Request,\n): Promise<SessionUserNumeric | null> {\n const user = await getSessionUser(auth, request);\n if (!user) return null;\n const numericId = Number.parseInt(user.id, 10);\n if (Number.isNaN(numericId)) return null;\n const { id: _id, ...rest } = user;\n return { ...rest, id: numericId };\n}\n\nexport function createSessionValidator(auth: Sa2kitAuthInstance) {\n return {\n getSessionUser: (request: Request) => getSessionUser(auth, request),\n getSessionUserNumeric: (request: Request) => getSessionUserNumeric(auth, request),\n };\n}\n","import type { NextRequest } from 'next/server';\nimport { calendarDbService } from '../db/calendarDbService';\nimport type { Sa2kitAuthInstance } from '../../../common/auth/server/types';\nimport { createSessionValidator } from '../../../common/auth/server/session';\n\nexport type CalendarAuthValidator = (\n request: NextRequest,\n) => Promise<{ id: number } | null>;\n\nlet configuredValidator: CalendarAuthValidator | null = null;\n\n/**\n * 注入 calendar API 路由使用的 session 校验(应用启动时调用一次)\n */\nexport function configureCalendarApiAuth(validateAuth: CalendarAuthValidator): void {\n configuredValidator = validateAuth;\n}\n\n/** 重置(测试用) */\nexport function resetCalendarApiAuth(): void {\n configuredValidator = null;\n}\n\nexport function resolveCalendarAuthValidator(\n validateAuth?: CalendarAuthValidator,\n): CalendarAuthValidator {\n const validator = validateAuth ?? configuredValidator;\n if (!validator) {\n throw new Error(\n 'Calendar API 未配置 auth:请在应用启动时调用 configureCalendarApiAuth(validateAuth),' +\n '或 configureCalendarApiWithBetterAuth(auth),或在 createDefaultCalendarRouteConfig(validateAuth) 中显式传入。',\n );\n }\n return validator;\n}\n\n/**\n * 使用 Better Auth session 一键配置 calendar API\n */\nexport function configureCalendarApiWithBetterAuth(\n auth: Sa2kitAuthInstance,\n options?: { db?: unknown },\n): void {\n const { getSessionUserNumeric } = createSessionValidator(auth);\n configureCalendarApiAuth((request) => getSessionUserNumeric(request));\n if (options?.db) {\n calendarDbService.setDb(options.db);\n }\n}\n","import type { NextRequest } from 'next/server';\nimport { calendarDbService } from '../db/calendarDbService';\nimport type { CalendarRouteConfig } from '../routes';\nimport {\n resolveCalendarAuthValidator,\n type CalendarAuthValidator,\n} from './auth-config';\n\nexport {\n configureCalendarApiAuth,\n configureCalendarApiWithBetterAuth,\n resetCalendarApiAuth,\n type CalendarAuthValidator,\n} from './auth-config';\n\n/**\n * 创建 calendar 路由所需的 validateAuth(由 Better Auth session 注入)\n *\n * @example\n * ```ts\n * configureCalendarApiWithBetterAuth(auth, { db });\n * const routeConfig = createDefaultCalendarRouteConfig();\n * export const GET = createGetEventsHandler(routeConfig);\n * ```\n */\nexport function createCalendarAuthRequirement(\n validateAuth: CalendarAuthValidator,\n): CalendarAuthValidator {\n return validateAuth;\n}\n\nexport function ensureCalendarDbReady() {\n if (calendarDbService.isConfigured()) return null;\n\n return Response.json(\n {\n success: false,\n error:\n 'Calendar DB is not initialized. Please call calendarDbService.setDb(db) or use create*Handler from sa2kit/calendar/routes with db injection.',\n },\n { status: 500 },\n );\n}\n\nexport function createDefaultCalendarRouteConfig(\n validateAuth?: CalendarAuthValidator,\n): CalendarRouteConfig {\n return {\n validateAuth: resolveCalendarAuthValidator(validateAuth),\n };\n}\n\nexport function withCalendarDbGuard<T extends unknown[]>(\n handler: (...args: T) => Promise<Response>,\n) {\n return async (...args: T): Promise<Response> => {\n const dbError = ensureCalendarDbReady();\n if (dbError) return dbError;\n return handler(...args);\n };\n}\n","import type { NextRequest } from 'next/server';\nimport {\n createBatchDeleteEventsHandler,\n createConfigHandler,\n createCreateEventHandler,\n createDeleteEventHandler,\n createGetEventByIdHandler,\n createGetEventsHandler,\n createUpdateEventHandler,\n type CalendarRouteConfig,\n} from '../routes';\nimport { createDefaultCalendarRouteConfig, withCalendarDbGuard } from './_shared';\n\nfunction resolveConfig(config?: CalendarRouteConfig): CalendarRouteConfig {\n return config ?? createDefaultCalendarRouteConfig();\n}\n\n/** 懒加载:首次请求时再解析 auth / 创建 handler */\nfunction lazyHandler<T extends (...args: never[]) => Promise<Response>>(\n factory: (config: CalendarRouteConfig) => T,\n config?: CalendarRouteConfig,\n) {\n let handler: T | null = null;\n return (...args: Parameters<T>) => {\n if (!handler) {\n handler = factory(resolveConfig(config));\n }\n return handler(...args);\n };\n}\n\nexport function createCalendarEventsRouteHandlers(config?: CalendarRouteConfig) {\n return {\n GET: withCalendarDbGuard(lazyHandler(createGetEventsHandler, config)),\n POST: withCalendarDbGuard(lazyHandler(createCreateEventHandler, config)),\n };\n}\n\nexport function createCalendarEventByIdRouteHandlers(config?: CalendarRouteConfig) {\n return {\n GET: withCalendarDbGuard(\n lazyHandler(createGetEventByIdHandler, config) as (\n request: NextRequest,\n routeParams: { params: { id: string } },\n ) => Promise<Response>,\n ),\n PUT: withCalendarDbGuard(\n lazyHandler(createUpdateEventHandler, config) as (\n request: NextRequest,\n routeParams: { params: { id: string } },\n ) => Promise<Response>,\n ),\n DELETE: withCalendarDbGuard(\n lazyHandler(createDeleteEventHandler, config) as (\n request: NextRequest,\n routeParams: { params: { id: string } },\n ) => Promise<Response>,\n ),\n };\n}\n\nexport function createCalendarBatchDeleteRouteHandlers(config?: CalendarRouteConfig) {\n return {\n DELETE: withCalendarDbGuard(lazyHandler(createBatchDeleteEventsHandler, config)),\n };\n}\n\nexport function createCalendarConfigRouteHandlers(config?: CalendarRouteConfig) {\n let configHandlers: ReturnType<typeof createConfigHandler> | null = null;\n const ensureConfigHandlers = () => {\n if (!configHandlers) {\n configHandlers = createConfigHandler(resolveConfig(config));\n }\n return configHandlers;\n };\n\n return {\n GET: withCalendarDbGuard((request: NextRequest) => ensureConfigHandlers().GET(request)),\n PUT: withCalendarDbGuard((request: NextRequest) => ensureConfigHandlers().PUT(request)),\n };\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport { calendarDbService } from '../db/calendarDbService';\n\nexport interface CalendarRouteConfig {\n /**\n * Drizzle 数据库实例\n * 如果提供,将自动初始化 calendarDbService\n */\n db?: any;\n /**\n * 验证用户身份的函数\n * 应该返回用户信息或 null\n */\n validateAuth: (request: NextRequest) => Promise<{ id: number } | null>;\n}\n\n/**\n * 初始化数据库服务的辅助函数\n */\nfunction initDbService(db?: any) {\n if (db) {\n calendarDbService.setDb(db);\n }\n}\n\n/**\n * 创建获取日历事件列表的处理器\n */\nexport function createGetEventsHandler(config: CalendarRouteConfig) {\n initDbService(config.db);\n return async (request: NextRequest) => {\n try {\n const user = await config.validateAuth(request);\n if (!user) {\n return NextResponse.json({ success: false, error: '未授权访问' }, { status: 401 });\n }\n\n const { searchParams } = new URL(request.url);\n const startDateStr = searchParams.get('startDate');\n const endDateStr = searchParams.get('endDate');\n\n let startDate: Date | undefined;\n let endDate: Date | undefined;\n\n if (startDateStr) {\n startDate = new Date(startDateStr);\n if (isNaN(startDate.getTime())) {\n return NextResponse.json({ success: false, error: '开始日期格式无效' }, { status: 400 });\n }\n }\n\n if (endDateStr) {\n endDate = new Date(endDateStr);\n if (isNaN(endDate.getTime())) {\n return NextResponse.json({ success: false, error: '结束日期格式无效' }, { status: 400 });\n }\n }\n\n const events = await calendarDbService.getAllEvents(user.id, startDate, endDate);\n\n return NextResponse.json({\n success: true,\n data: events,\n message: '获取事件列表成功'\n });\n } catch (error) {\n console.error('获取事件失败:', error);\n return NextResponse.json({ success: false, error: '服务器内部错误' }, { status: 500 });\n }\n };\n}\n\n/**\n * 创建日历事件的处理器\n */\nexport function createCreateEventHandler(config: CalendarRouteConfig) {\n initDbService(config.db);\n return async (request: NextRequest) => {\n try {\n const user = await config.validateAuth(request);\n if (!user) {\n return NextResponse.json({ success: false, error: '未授权访问' }, { status: 401 });\n }\n\n const body = await request.json();\n \n if (!body.title || typeof body.title !== 'string' || body.title.trim() === '') {\n return NextResponse.json({ success: false, error: '事件标题不能为空' }, { status: 400 });\n }\n\n if (!body.startTime || !body.endTime) {\n return NextResponse.json({ success: false, error: '开始时间和结束时间不能为空' }, { status: 400 });\n }\n\n const startTime = new Date(body.startTime);\n const endTime = new Date(body.endTime);\n\n if (isNaN(startTime.getTime()) || isNaN(endTime.getTime())) {\n return NextResponse.json({ success: false, error: '日期格式无效' }, { status: 400 });\n }\n\n if (startTime.getTime() >= endTime.getTime()) {\n return NextResponse.json({ success: false, error: '结束时间必须晚于开始时间' }, { status: 400 });\n }\n\n const eventData = {\n title: body.title.trim(),\n description: body.description || null,\n startTime,\n endTime,\n allDay: Boolean(body.allDay),\n location: body.location || null,\n color: body.color || '#3B82F6',\n userId: user.id,\n };\n\n const newEvent = await calendarDbService.createEvent(eventData);\n\n if (body.recurrence) {\n await calendarDbService.createRecurrenceRule({\n eventId: newEvent.id,\n ...body.recurrence,\n endDate: body.recurrence.endDate ? new Date(body.recurrence.endDate) : undefined,\n });\n }\n\n if (body.reminders && Array.isArray(body.reminders)) {\n for (const reminder of body.reminders) {\n if (reminder.reminderTime) {\n await calendarDbService.createReminder({\n eventId: newEvent.id,\n reminderTime: new Date(reminder.reminderTime),\n reminderType: reminder.reminderType || 'notification',\n status: 'pending'\n });\n }\n }\n }\n\n return NextResponse.json({\n success: true,\n data: newEvent,\n message: '创建事件成功'\n });\n } catch (error) {\n console.error('创建事件失败:', error);\n return NextResponse.json({ success: false, error: '服务器内部错误' }, { status: 500 });\n }\n };\n}\n\n/**\n * 创建获取单个事件的处理器\n */\nexport function createGetEventByIdHandler(config: CalendarRouteConfig) {\n initDbService(config.db);\n return async (request: NextRequest, { params }: { params: { id: string } }) => {\n try {\n const user = await config.validateAuth(request);\n if (!user) {\n return NextResponse.json({ success: false, error: '未授权访问' }, { status: 401 });\n }\n\n const eventId = parseInt(params.id);\n if (isNaN(eventId)) {\n return NextResponse.json({ success: false, error: '事件ID无效' }, { status: 400 });\n }\n\n const event = await calendarDbService.getEventById(eventId);\n if (!event) {\n return NextResponse.json({ success: false, error: '事件不存在' }, { status: 404 });\n }\n\n if (event.userId !== user.id) {\n return NextResponse.json({ success: false, error: '无权访问此事件' }, { status: 403 });\n }\n\n const [recurrenceRule, reminders] = await Promise.all([\n calendarDbService.getRecurrenceRule(eventId),\n calendarDbService.getEventReminders(eventId)\n ]);\n\n return NextResponse.json({\n success: true,\n data: {\n ...event,\n recurrenceRule: recurrenceRule || undefined,\n reminders: reminders || []\n },\n message: '获取事件成功'\n });\n } catch (error) {\n console.error('获取事件失败:', error);\n return NextResponse.json({ success: false, error: '服务器内部错误' }, { status: 500 });\n }\n };\n}\n\n/**\n * 创建更新事件的处理器\n */\nexport function createUpdateEventHandler(config: CalendarRouteConfig) {\n initDbService(config.db);\n return async (request: NextRequest, { params }: { params: { id: string } }) => {\n try {\n const user = await config.validateAuth(request);\n if (!user) {\n return NextResponse.json({ success: false, error: '未授权访问' }, { status: 401 });\n }\n\n const eventId = parseInt(params.id);\n if (isNaN(eventId)) {\n return NextResponse.json({ success: false, error: '事件ID无效' }, { status: 400 });\n }\n\n const existingEvent = await calendarDbService.getEventById(eventId);\n if (!existingEvent || existingEvent.userId !== user.id) {\n return NextResponse.json({ success: false, error: '事件不存在或无权修改' }, { status: 404 });\n }\n\n const body = await request.json();\n const updateData: any = {};\n\n if (body.title !== undefined) updateData.title = body.title.trim();\n if (body.description !== undefined) updateData.description = body.description;\n if (body.startTime !== undefined) updateData.startTime = new Date(body.startTime);\n if (body.endTime !== undefined) updateData.endTime = new Date(body.endTime);\n if (body.allDay !== undefined) updateData.allDay = Boolean(body.allDay);\n if (body.location !== undefined) updateData.location = body.location;\n if (body.color !== undefined) updateData.color = body.color;\n\n const updatedEvent = await calendarDbService.updateEvent(eventId, updateData);\n\n if (body.recurrence !== undefined) {\n await calendarDbService.deleteRecurrenceRule(eventId);\n if (body.recurrence) {\n await calendarDbService.createRecurrenceRule({\n eventId,\n ...body.recurrence,\n endDate: body.recurrence.endDate ? new Date(body.recurrence.endDate) : undefined,\n });\n }\n }\n\n if (body.reminders !== undefined) {\n await calendarDbService.deleteEventReminders(eventId);\n if (Array.isArray(body.reminders)) {\n for (const reminder of body.reminders) {\n if (reminder.reminderTime) {\n await calendarDbService.createReminder({\n eventId,\n reminderTime: new Date(reminder.reminderTime),\n reminderType: reminder.reminderType || 'notification',\n status: 'pending'\n });\n }\n }\n }\n }\n\n return NextResponse.json({\n success: true,\n data: updatedEvent,\n message: '更新事件成功'\n });\n } catch (error) {\n console.error('更新事件失败:', error);\n return NextResponse.json({ success: false, error: '服务器内部错误' }, { status: 500 });\n }\n };\n}\n\n/**\n * 创建删除事件的处理器\n */\nexport function createDeleteEventHandler(config: CalendarRouteConfig) {\n initDbService(config.db);\n return async (request: NextRequest, { params }: { params: { id: string } }) => {\n try {\n const user = await config.validateAuth(request);\n if (!user) {\n return NextResponse.json({ success: false, error: '未授权访问' }, { status: 401 });\n }\n\n const eventId = parseInt(params.id);\n if (isNaN(eventId)) {\n return NextResponse.json({ success: false, error: '事件ID无效' }, { status: 400 });\n }\n\n const existingEvent = await calendarDbService.getEventById(eventId);\n if (!existingEvent || existingEvent.userId !== user.id) {\n return NextResponse.json({ success: false, error: '事件不存在或无权删除' }, { status: 404 });\n }\n\n await calendarDbService.deleteEvent(eventId);\n\n return NextResponse.json({\n success: true,\n message: '删除事件成功'\n });\n } catch (error) {\n console.error('删除事件失败:', error);\n return NextResponse.json({ success: false, error: '服务器内部错误' }, { status: 500 });\n }\n };\n}\n\n/**\n * 创建批量删除事件的处理器\n */\nexport function createBatchDeleteEventsHandler(config: CalendarRouteConfig) {\n initDbService(config.db);\n return async (request: NextRequest) => {\n try {\n const user = await config.validateAuth(request);\n if (!user) {\n return NextResponse.json({ success: false, error: '未授权访问' }, { status: 401 });\n }\n\n const body = await request.json();\n if (!body.eventIds || !Array.isArray(body.eventIds)) {\n return NextResponse.json({ success: false, error: '事件ID列表不能为空' }, { status: 400 });\n }\n\n const results = await Promise.all(\n body.eventIds.map(async (id: number) => {\n const event = await calendarDbService.getEventById(id);\n if (event && event.userId === user.id) {\n await calendarDbService.deleteEvent(id);\n return true;\n }\n return false;\n })\n );\n\n const deletedCount = results.filter(Boolean).length;\n\n return NextResponse.json({\n success: true,\n data: { deletedCount },\n message: '成功删除 ' + (deletedCount) + ' 个事件'\n });\n } catch (error) {\n console.error('批量删除事件失败:', error);\n return NextResponse.json({ success: false, error: '服务器内部错误' }, { status: 500 });\n }\n };\n}\n\n/**\n * 创建配置处理器的工厂\n */\nexport function createConfigHandler(config: CalendarRouteConfig) {\n initDbService(config.db);\n return {\n GET: async (request: NextRequest) => {\n try {\n const user = await config.validateAuth(request);\n if (!user) {\n return NextResponse.json({ success: false, error: '未授权访问' }, { status: 401 });\n }\n\n const dbConfig = await calendarDbService.getUserConfig(user.id);\n return NextResponse.json({\n success: true,\n data: dbConfig || {\n firstDayOfWeek: 1,\n workingHoursStart: '09:00',\n workingHoursEnd: '18:00',\n timeZone: 'Asia/Shanghai',\n dateFormat: 'YYYY-MM-DD',\n timeFormat: 'HH:mm',\n defaultView: 'month',\n defaultEventColor: '#3B82F6',\n weekends: true,\n eventColors: {}\n },\n message: '获取配置成功'\n });\n } catch (error) {\n console.error('获取配置失败:', error);\n return NextResponse.json({ success: false, error: '服务器内部错误' }, { status: 500 });\n }\n },\n PUT: async (request: NextRequest) => {\n try {\n const user = await config.validateAuth(request);\n if (!user) {\n return NextResponse.json({ success: false, error: '未授权访问' }, { status: 401 });\n }\n\n const body = await request.json();\n const updatedConfig = await calendarDbService.upsertUserConfig(user.id, body);\n\n return NextResponse.json({\n success: true,\n data: updatedConfig,\n message: '更新配置成功'\n });\n } catch (error) {\n console.error('更新配置失败:', error);\n return NextResponse.json({ success: false, error: '服务器内部错误' }, { status: 500 });\n }\n }\n };\n}\n\nexport {\n configureCalendarApiAuth,\n configureCalendarApiWithBetterAuth,\n resetCalendarApiAuth,\n createCalendarAuthRequirement,\n createDefaultCalendarRouteConfig,\n withCalendarDbGuard,\n type CalendarAuthValidator,\n} from '../api/_shared';\n\nexport {\n createCalendarEventsRouteHandlers,\n createCalendarEventByIdRouteHandlers,\n createCalendarBatchDeleteRouteHandlers,\n createCalendarConfigRouteHandlers,\n} from '../api/route-handlers';\n\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/common/aiApi/types.ts","../src/common/aiApi/resolveConfig.ts","../src/common/aiApi/requestJson.ts","../src/common/aiApi/callChat.ts","../src/common/aiApi/callCompletion.ts","../src/common/aiApi/modelHeuristics.ts","../src/common/aiApi/visionMessageFormats.ts","../src/common/aiApi/audioStrategy.ts","../src/common/aiApi/audioUtils.ts","../src/common/aiApi/multimodalMessageFormats.ts","../src/common/aiApi/imageUtils.ts","../src/common/aiApi/mediaUtils.ts","../src/common/aiApi/transcribeAudio.ts","../src/common/aiApi/callMultimodalChat.ts","../src/common/aiApi/jsonUtils.ts","../src/common/aiApi/listModels.ts","../src/common/aiApi/taskRegistry.ts","../src/common/aiApi/runTask.ts","../src/common/aiApi/tasks/coreLlmCompletion.ts","../src/common/aiApi/tasks/coreStructuredMultimodal.ts","../src/common/aiApi/tasks/coreConnectivityTest.ts","../src/common/aiApi/registerCoreTasks.ts"],"names":["DEFAULT_TEXT_MODEL","bytes","ALLOWED_MIME","estimateBase64ByteLength","joinUrl"],"mappings":"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","file":"chunk-XPY45Y75.js","sourcesContent":["/** 音频处理策略:native=chat 内嵌音频,stt=先转写再 chat,auto=按模型能力自动选择(失败时 STT 回退) */\nexport type AudioStrategy = 'native' | 'stt' | 'auto';\n\n/** 连接配置(调用方可显式传入,或与 env 合并) */\nexport interface AiConnectionSettings {\n apiKey: string;\n baseUrl: string;\n model?: string;\n textModel?: string;\n visionModel?: string;\n audioModel?: string;\n audioStrategy?: AudioStrategy;\n timeoutMs?: number;\n maxImageBytes?: number;\n maxAudioBytes?: number;\n}\n\n/** 客户端/请求可携带的 AI 连接配置(字段均可选,用于覆盖环境变量) */\nexport type AiClientSettings = Partial<AiConnectionSettings>;\n\n/** 解析后的完整连接配置 */\nexport interface AiConnectionConfig extends AiConnectionSettings {\n textModel: string;\n visionModel: string;\n audioModel: string;\n audioStrategy: AudioStrategy;\n timeoutMs: number;\n maxImageBytes: number;\n maxAudioBytes: number;\n}\n\n/** 统一 AI 任务请求 */\nexport interface AiApiRunRequest<TInput = unknown> {\n taskId: string;\n input: TInput;\n options?: AiTaskRunOptions;\n clientSettings?: AiClientSettings;\n}\n\nexport interface AiTaskRunOptions {\n model?: string;\n temperature?: number;\n maxTokens?: number;\n}\n\n/** 统一 AI 任务响应 */\nexport interface AiApiResponse<TData = unknown> {\n success: boolean;\n taskId: string;\n data?: TData;\n error?: AiApiErrorBody;\n meta?: AiApiResponseMeta;\n}\n\nexport interface AiApiErrorBody {\n code: AiApiErrorCode;\n message: string;\n details?: unknown;\n}\n\nexport type AiApiErrorCode =\n | 'UNAUTHORIZED'\n | 'INVALID_INPUT'\n | 'TASK_NOT_FOUND'\n | 'AI_CONFIG_MISSING'\n | 'AI_REQUEST_FAILED'\n | 'AI_PARSE_FAILED'\n | 'PAYLOAD_TOO_LARGE'\n | 'UNSUPPORTED_MEDIA';\n\nexport interface AiApiResponseMeta {\n model: string;\n latencyMs: number;\n provider?: string;\n confidence?: number;\n rawSummary?: string;\n}\n\n/** 多模态图片输入(base64) */\nexport interface AiImageInput {\n base64: string;\n mimeType: string;\n}\n\n/** 多模态音频输入(base64) */\nexport interface AiAudioInput {\n base64: string;\n mimeType: string;\n}\n\nexport type AiMediaKind = 'image' | 'audio';\n\nexport interface AiImageMediaInput extends AiImageInput {\n kind: 'image';\n}\n\nexport interface AiAudioMediaInput extends AiAudioInput {\n kind: 'audio';\n}\n\nexport type AiMediaInput = AiImageMediaInput | AiAudioMediaInput;\n\n/** 通用文本补全任务输入 */\nexport interface TextCompletionInput {\n systemPrompt?: string;\n userPrompt: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n /** 显式连接配置,优先级高于 clientSettings / 环境变量 */\n connection?: AiClientSettings;\n}\n\n/** 通用文本补全任务输出 */\nexport interface TextCompletionOutput {\n content: string;\n rawText: string;\n}\n\n/** 通用结构化多模态任务输入 */\nexport interface StructuredMultimodalInput {\n systemPrompt: string;\n userPrompt: string;\n media?: AiMediaInput[];\n jsonSchemaHint?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n audioStrategy?: AudioStrategy;\n connection?: AiClientSettings;\n}\n\n/** 通用结构化多模态任务输出 */\nexport interface StructuredMultimodalOutput {\n json: Record<string, unknown>;\n rawText: string;\n}\n\nexport const CORE_LLM_COMPLETION_TASK_ID = 'core.llmCompletion';\nexport const CORE_STRUCTURED_MULTIMODAL_TASK_ID = 'core.structuredMultimodal';\nexport const CORE_CONNECTIVITY_TEST_TASK_ID = 'core.connectivityTest';\n\nexport interface ConnectivityTestOutput {\n ok: boolean;\n reply: string;\n}\n\nexport interface AiModelsListRequest {\n clientSettings?: AiClientSettings;\n}\n\nexport interface AiModelsListResponse {\n success: boolean;\n models: string[];\n visionModels: string[];\n suggestedVisionModel?: string;\n error?: {\n code: string;\n message: string;\n };\n}\n\nexport interface AiTaskContext {\n requestId?: string;\n userId?: string | number;\n clientSettings?: AiClientSettings;\n}\n\nexport interface AiTaskDefinition<TInput = unknown, TOutput = unknown> {\n id: string;\n description?: string;\n validateInput: (input: unknown) => TInput;\n execute: (\n input: TInput,\n ctx: AiTaskContext\n ) => Promise<{\n data: TOutput;\n meta?: Partial<AiApiResponseMeta>;\n }>;\n}\n\nexport interface MultimodalChatParams {\n systemPrompt: string;\n userPrompt: string;\n media?: AiMediaInput[];\n model?: string;\n temperature?: number;\n maxTokens?: number;\n jsonMode?: boolean;\n audioStrategy?: AudioStrategy;\n connection?: AiClientSettings;\n}\n\nexport interface MultimodalChatResult {\n content: string;\n model: string;\n raw: unknown;\n /** auto/native/stt 实际采用的音频处理方式 */\n audioHandling?: 'none' | 'native' | 'stt';\n /** STT 或 native 失败回退时的转写文本 */\n transcriptions?: string[];\n}\n","import type { AiClientSettings, AiConnectionConfig, AudioStrategy } from './types';\n\nconst DEFAULT_BASE_URL = 'https://api.openai.com/v1';\nconst DEFAULT_TEXT_MODEL = 'gpt-4o-mini';\nconst DEFAULT_VISION_MODEL = 'gpt-4o-mini';\nconst DEFAULT_AUDIO_MODEL = 'whisper-1';\nconst DEFAULT_AUDIO_STRATEGY: AudioStrategy = 'auto';\nconst DEFAULT_TIMEOUT_MS = 60_000;\nconst DEFAULT_MAX_IMAGE_BYTES = 5 * 1024 * 1024;\nconst DEFAULT_MAX_AUDIO_BYTES = 25 * 1024 * 1024;\n\nfunction readEnv(name: string): string {\n if (typeof process === 'undefined' || !process.env) {\n return '';\n }\n return process.env[name]?.trim() ?? '';\n}\n\n/**\n * 合并连接配置:显式 connection > clientSettings > 环境变量。\n * 缺少 apiKey 时返回 null。\n */\nexport function resolveAiConnectionConfig(\n ...sources: Array<AiClientSettings | undefined>\n): AiConnectionConfig | null {\n const merged: AiClientSettings = {};\n for (const source of sources) {\n if (!source) continue;\n Object.assign(merged, source);\n }\n\n const envApiKey = readEnv('AI_API_KEY') || readEnv('OPENAI_API_KEY');\n const apiKey = merged.apiKey?.trim() || envApiKey;\n if (!apiKey) {\n return null;\n }\n\n const baseUrl =\n merged.baseUrl?.trim() || readEnv('AI_BASE_URL') || DEFAULT_BASE_URL;\n const visionModel =\n merged.visionModel?.trim() ||\n readEnv('AI_VISION_MODEL') ||\n merged.model?.trim() ||\n DEFAULT_VISION_MODEL;\n const textModel =\n merged.textModel?.trim() ||\n readEnv('AI_TEXT_MODEL') ||\n merged.model?.trim() ||\n visionModel ||\n DEFAULT_TEXT_MODEL;\n\n const audioModel =\n merged.audioModel?.trim() || readEnv('AI_AUDIO_MODEL') || DEFAULT_AUDIO_MODEL;\n const envAudioStrategy = readEnv('AI_AUDIO_STRATEGY') as AudioStrategy | '';\n const audioStrategy: AudioStrategy =\n merged.audioStrategy ?? (envAudioStrategy || DEFAULT_AUDIO_STRATEGY);\n\n return {\n apiKey,\n baseUrl,\n model: merged.model?.trim() || textModel,\n textModel,\n visionModel,\n audioModel,\n audioStrategy,\n timeoutMs: merged.timeoutMs ?? Number(readEnv('AI_TIMEOUT_MS') || DEFAULT_TIMEOUT_MS),\n maxImageBytes:\n merged.maxImageBytes ?? Number(readEnv('AI_MAX_IMAGE_BYTES') || DEFAULT_MAX_IMAGE_BYTES),\n maxAudioBytes:\n merged.maxAudioBytes ?? Number(readEnv('AI_MAX_AUDIO_BYTES') || DEFAULT_MAX_AUDIO_BYTES),\n };\n}\n\nexport function requireAiConnectionConfig(\n ...sources: Array<AiClientSettings | undefined>\n): AiConnectionConfig {\n const config = resolveAiConnectionConfig(...sources);\n if (!config) {\n throw new Error('未配置 AI API Key,请传入 connection / clientSettings 或设置环境变量 AI_API_KEY');\n }\n return config;\n}\n","import type { RequestAdapter } from '../request';\n\nexport type JsonRequestOptions = {\n url: string;\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n headers?: Record<string, string>;\n body?: unknown;\n timeoutMs?: number;\n requestAdapter?: RequestAdapter;\n};\n\nexport async function requestJson<T>(options: JsonRequestOptions): Promise<T> {\n const { url, method = 'POST', headers = {}, body, timeoutMs, requestAdapter } = options;\n\n if (requestAdapter) {\n return requestAdapter.request<T>({\n url,\n method,\n headers,\n body,\n });\n }\n\n const controller = timeoutMs ? new AbortController() : undefined;\n const timeoutId = timeoutMs\n ? setTimeout(() => {\n controller?.abort();\n }, timeoutMs)\n : undefined;\n\n try {\n const response = await fetch(url, {\n method,\n headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: controller?.signal,\n });\n\n const text = await response.text();\n let data: unknown = null;\n\n if (text) {\n try {\n data = JSON.parse(text);\n } catch {\n data = text;\n }\n }\n\n if (!response.ok) {\n const record = data as { error?: { message?: string } | string; message?: string } | null;\n const errorMessage =\n (typeof record?.error === 'object' ? record.error?.message : record?.error) ||\n record?.message ||\n `Request failed with status ${response.status}`;\n const error = new Error(String(errorMessage));\n (error as Error & { status?: number; data?: unknown }).status = response.status;\n (error as Error & { status?: number; data?: unknown }).data = data;\n throw error;\n }\n\n return data as T;\n } finally {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n}\n","import type { RequestAdapter } from '../request';\nimport { requestJson } from './requestJson';\n\nexport const DEFAULT_OPENAI_BASE_URL = 'https://api.openai.com/v1';\nexport const DEFAULT_TEXT_MODEL = 'gpt-4o-mini';\n\nexport type ChatRole = 'system' | 'user' | 'assistant';\n\nexport interface ChatMessage {\n role: ChatRole;\n content: string;\n}\n\nexport interface CallChatOptions {\n /** OpenAI 兼容 API Base URL */\n baseUrl: string;\n /** API Key */\n apiKey: string;\n model?: string;\n systemPrompt?: string;\n userPrompt?: string;\n messages?: ChatMessage[];\n temperature?: number;\n maxTokens?: number;\n topP?: number;\n stop?: string | string[];\n timeoutMs?: number;\n requestAdapter?: RequestAdapter;\n}\n\nexport interface ChatUsage {\n promptTokens?: number;\n completionTokens?: number;\n totalTokens?: number;\n}\n\nexport interface CallChatResult {\n content: string;\n model: string;\n usage?: ChatUsage;\n raw?: unknown;\n}\n\ntype OpenAIChatResponse = {\n id?: string;\n model?: string;\n choices?: Array<{ message?: { content?: string | null } }>;\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n };\n};\n\nfunction joinUrl(base: string, path: string): string {\n return `${base.replace(/\\/+$/, '')}/${path.replace(/^\\/+/, '')}`;\n}\n\nfunction resolveMessages(input: {\n systemPrompt?: string;\n userPrompt?: string;\n messages?: ChatMessage[];\n}): ChatMessage[] {\n if (input.messages?.length) {\n return input.messages;\n }\n\n const messages: ChatMessage[] = [];\n if (input.systemPrompt?.trim()) {\n messages.push({ role: 'system', content: input.systemPrompt.trim() });\n }\n if (input.userPrompt?.trim()) {\n messages.push({ role: 'user', content: input.userPrompt.trim() });\n }\n return messages;\n}\n\n/**\n * OpenAI 兼容文本对话:外部传入 URL、Key、提示词,返回模型生成内容。\n */\nexport async function callChat(options: CallChatOptions): Promise<CallChatResult> {\n const {\n baseUrl,\n apiKey,\n model,\n systemPrompt,\n userPrompt,\n messages,\n temperature,\n maxTokens,\n topP,\n stop,\n timeoutMs = 60_000,\n requestAdapter,\n } = options;\n\n if (!baseUrl?.trim()) {\n throw new Error('baseUrl 为必填');\n }\n if (!apiKey?.trim()) {\n throw new Error('apiKey 为必填');\n }\n\n const resolvedMessages = resolveMessages({ systemPrompt, userPrompt, messages });\n if (!resolvedMessages.length) {\n throw new Error('userPrompt 或 messages 至少提供一项');\n }\n\n const resolvedModel = model?.trim() || DEFAULT_TEXT_MODEL;\n const payload: Record<string, unknown> = {\n model: resolvedModel,\n messages: resolvedMessages,\n };\n\n if (temperature !== undefined) payload.temperature = temperature;\n if (maxTokens !== undefined) payload.max_tokens = maxTokens;\n if (topP !== undefined) payload.top_p = topP;\n if (stop !== undefined) payload.stop = stop;\n\n const raw = await requestJson<OpenAIChatResponse>({\n url: joinUrl(baseUrl.trim(), 'chat/completions'),\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey.trim()}`,\n },\n body: payload,\n timeoutMs,\n requestAdapter,\n });\n\n const content = raw.choices?.[0]?.message?.content ?? '';\n const usage = raw.usage\n ? {\n promptTokens: raw.usage.prompt_tokens,\n completionTokens: raw.usage.completion_tokens,\n totalTokens: raw.usage.total_tokens,\n }\n : undefined;\n\n return {\n content,\n model: raw.model ?? resolvedModel,\n usage,\n raw,\n };\n}\n","import { callChat } from './callChat';\nimport { requireAiConnectionConfig } from './resolveConfig';\nimport type { AiClientSettings } from './types';\n\nexport interface CallCompletionParams {\n systemPrompt?: string;\n userPrompt: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n connection?: AiClientSettings;\n}\n\nexport interface CallCompletionResult {\n content: string;\n model: string;\n raw?: unknown;\n}\n\n/**\n * 文本补全:连接信息与提示词均由调用方传入(或通过 connection 合并 env)。\n */\nexport async function callCompletion(\n params: CallCompletionParams,\n clientSettings?: AiClientSettings\n): Promise<CallCompletionResult> {\n const config = requireAiConnectionConfig(params.connection, clientSettings);\n const model = params.model || config.textModel;\n\n const result = await callChat({\n baseUrl: config.baseUrl,\n apiKey: config.apiKey,\n model,\n systemPrompt: params.systemPrompt,\n userPrompt: params.userPrompt,\n temperature: params.temperature,\n maxTokens: params.maxTokens,\n timeoutMs: config.timeoutMs,\n });\n\n return {\n content: result.content,\n model: result.model || model,\n raw: result.raw,\n };\n}\n","/** 非对话类模型 ID 片段(embedding、语音等) */\nconst NON_CHAT_PATTERNS = [\n /embed/i,\n /whisper/i,\n /tts/i,\n /dall-e/i,\n /moderation/i,\n /realtime/i,\n /audio/i,\n /transcrib/i,\n /sora/i,\n];\n\n/** 常见支持视觉输入的模型 ID 特征 */\nconst VISION_HINT_PATTERNS = [\n /^gpt-4o/i,\n /^gpt-4-turbo/i,\n /^gpt-4-vision/i,\n /^gpt-4\\.1/i,\n /claude-3/i,\n /gemini.*(pro|flash|vision)/i,\n /qwen.*vl/i,\n /vision/i,\n /-vl/i,\n /llava/i,\n /doubao.*vision/i,\n /glm-4v/i,\n /internvl/i,\n /pixtral/i,\n /deepseek-vl/i,\n];\n\n/** 自动选择视觉模型时的优先级(精确或前缀匹配) */\nconst PREFERRED_VISION_MODELS = [\n 'gpt-4o-mini',\n 'gpt-4o',\n 'gpt-4-turbo',\n 'gpt-4-vision-preview',\n 'gpt-4.1-mini',\n 'gpt-4.1',\n 'claude-3-5-sonnet-latest',\n 'claude-3-5-haiku-latest',\n 'gemini-2.0-flash',\n 'gemini-1.5-flash',\n 'gemini-1.5-pro',\n 'qwen-vl-max',\n 'qwen2-vl-72b-instruct',\n];\n\nfunction isChatModel(id: string): boolean {\n return !NON_CHAT_PATTERNS.some((pattern) => pattern.test(id));\n}\n\n/** 常见支持 chat 内嵌音频输入的模型 ID 特征(OpenAI 兼容) */\nconst NATIVE_AUDIO_CHAT_PATTERNS = [\n /^gpt-4o/i,\n /^gpt-4-turbo/i,\n /^gpt-4\\.1/i,\n /gemini-2\\.0/i,\n /gemini-1\\.5/i,\n];\n\n/** STT 模型 ID 特征 */\nconst STT_MODEL_PATTERNS = [/whisper/i, /transcrib/i, /sensevoice/i, /paraformer/i];\n\nexport function isLikelyNativeAudioChatModel(id: string): boolean {\n const trimmed = id.trim();\n if (!trimmed) return false;\n if (STT_MODEL_PATTERNS.some((pattern) => pattern.test(trimmed))) return false;\n return NATIVE_AUDIO_CHAT_PATTERNS.some((pattern) => pattern.test(trimmed));\n}\n\nexport function isLikelySttModel(id: string): boolean {\n return STT_MODEL_PATTERNS.some((pattern) => pattern.test(id.trim()));\n}\n\nexport function filterSttModels(modelIds: string[]): string[] {\n return modelIds.filter(isLikelySttModel).sort((a, b) => a.localeCompare(b));\n}\n\nconst PREFERRED_STT_MODELS = ['whisper-1', 'whisper-large-v3', 'whisper-large-v3-turbo'];\n\nexport function pickDefaultSttModel(modelIds: string[], current?: string): string | undefined {\n const sttModels = filterSttModels(modelIds);\n if (sttModels.length === 0) return undefined;\n\n const trimmedCurrent = current?.trim();\n if (trimmedCurrent && sttModels.includes(trimmedCurrent)) {\n return trimmedCurrent;\n }\n\n for (const preferred of PREFERRED_STT_MODELS) {\n const match = sttModels.find((id) => id === preferred || id.startsWith(`${preferred}-`));\n if (match) return match;\n }\n\n return sttModels[0];\n}\n\nexport function isLikelyVisionModel(id: string): boolean {\n return VISION_HINT_PATTERNS.some((pattern) => pattern.test(id));\n}\n\n/** 明确不支持图片的对话模型 */\nconst TEXT_ONLY_MODEL_PATTERNS = [\n /^deepseek-chat/i,\n /^deepseek-reasoner/i,\n /^deepseek-r1/i,\n /^deepseek-v[34](?!.*vl)/i,\n /^gpt-3\\.5/i,\n /^o1-mini/i,\n /^o3-mini/i,\n];\n\nexport function isKnownTextOnlyModel(id: string): boolean {\n const trimmed = id.trim();\n if (!trimmed) return false;\n return TEXT_ONLY_MODEL_PATTERNS.some((pattern) => pattern.test(trimmed));\n}\n\nexport function filterChatModels(modelIds: string[]): string[] {\n return modelIds.filter(isChatModel).sort((a, b) => a.localeCompare(b));\n}\n\nexport function filterVisionModels(modelIds: string[]): string[] {\n return filterChatModels(modelIds)\n .filter((id) => isLikelyVisionModel(id) && !isKnownTextOnlyModel(id))\n .sort((a, b) => a.localeCompare(b));\n}\n\nfunction matchesPreferred(modelId: string, preferred: string): boolean {\n return modelId === preferred || modelId.startsWith(`${preferred}-`);\n}\n\n/** 从可用模型中挑选默认视觉模型 */\nexport function pickDefaultVisionModel(\n modelIds: string[],\n current?: string\n): string | undefined {\n const visionModels = filterVisionModels(modelIds);\n if (visionModels.length === 0) return undefined;\n\n const trimmedCurrent = current?.trim();\n if (trimmedCurrent && visionModels.includes(trimmedCurrent)) {\n return trimmedCurrent;\n }\n\n for (const preferred of PREFERRED_VISION_MODELS) {\n const match = visionModels.find((id) => matchesPreferred(id, preferred));\n if (match) return match;\n }\n\n return visionModels[0];\n}\n","import { isKnownTextOnlyModel, isLikelyVisionModel } from './modelHeuristics';\n\nexport type VisionMessageFormat = 'openai' | 'ollama';\n\nexport function detectVisionMessageFormat(baseUrl: string): VisionMessageFormat {\n const normalized = baseUrl.toLowerCase();\n if (\n normalized.includes('ollama') ||\n normalized.includes(':11434') ||\n normalized.includes('11434/')\n ) {\n return 'ollama';\n }\n return 'openai';\n}\n\nexport function assertVisionCapableModel(\n modelId: string,\n options?: { baseUrl?: string; hasImages?: boolean }\n): void {\n if (!options?.hasImages) return;\n\n const model = modelId.trim();\n if (!model) {\n throw new Error('识图需要选择视觉模型,请在 AI 设置中配置');\n }\n\n const format = options.baseUrl ? detectVisionMessageFormat(options.baseUrl) : 'openai';\n\n if (format === 'ollama') return;\n\n if (isKnownTextOnlyModel(model)) {\n throw new Error(\n `当前模型「${model}」不支持图片输入。请改用视觉模型,例如 gpt-4o-mini、qwen-vl-max、gemini-1.5-flash、deepseek-vl 等(DeepSeek 文本模型无法识图)。`\n );\n }\n\n if (!isLikelyVisionModel(model)) {\n throw new Error(\n `模型「${model}」可能不支持图片识图。请在 AI 设置中选择名称含 vl、vision、gpt-4o、gemini 等标识的视觉模型。`\n );\n }\n}\n\nexport function isImageUrlVariantError(message: string): boolean {\n return (\n /unknown variant [`']?image_url[`']?/i.test(message) ||\n /expected [`']?text[`']?/i.test(message) ||\n /does not support.*image/i.test(message)\n );\n}\n\nexport function toVisionApiErrorMessage(rawMessage: string, modelId: string): string {\n if (isImageUrlVariantError(rawMessage)) {\n return `当前模型「${modelId}」不接受图片请求(${rawMessage})。请更换为支持识图的视觉模型。`;\n }\n return rawMessage;\n}\n\nexport { isKnownTextOnlyModel, isLikelyVisionModel } from './modelHeuristics';\n","import { detectVisionMessageFormat } from './visionMessageFormats';\nimport { isLikelyNativeAudioChatModel } from './modelHeuristics';\nimport type { AudioStrategy } from './types';\n\nexport type ResolvedAudioHandling = 'none' | 'native' | 'stt';\n\nexport function resolveAudioHandling(options: {\n hasAudio: boolean;\n strategy: AudioStrategy;\n model: string;\n baseUrl: string;\n}): ResolvedAudioHandling {\n if (!options.hasAudio) {\n return 'none';\n }\n\n if (options.strategy === 'stt') {\n return 'stt';\n }\n\n if (options.strategy === 'native') {\n return 'native';\n }\n\n // auto:Ollama 等本地栈通常无 chat 内嵌音频 → STT\n if (detectVisionMessageFormat(options.baseUrl) === 'ollama') {\n return 'stt';\n }\n\n if (isLikelyNativeAudioChatModel(options.model)) {\n return 'native';\n }\n\n return 'stt';\n}\n\nexport function isAudioInputError(message: string): boolean {\n return (\n /input_audio/i.test(message) ||\n /unknown variant [`']?input_audio[`']?/i.test(message) ||\n /does not support.*audio/i.test(message) ||\n /audio input/i.test(message) ||\n /invalid audio/i.test(message)\n );\n}\n\nexport function appendTranscriptionsToPrompt(\n userPrompt: string,\n transcriptions: string[]\n): string {\n if (transcriptions.length === 0) {\n return userPrompt;\n }\n\n const blocks = transcriptions.map((text, index) => {\n const label = transcriptions.length === 1 ? '[语音转写]' : `[语音转写 ${index + 1}]`;\n return `${label}\\n${text.trim()}`;\n });\n\n const joined = blocks.join('\\n\\n');\n const trimmedPrompt = userPrompt.trim();\n return trimmedPrompt ? `${trimmedPrompt}\\n\\n${joined}` : joined;\n}\n","import type { AiAudioInput } from './types';\n\nconst ALLOWED_MIME = new Set([\n 'audio/wav',\n 'audio/x-wav',\n 'audio/mpeg',\n 'audio/mp3',\n 'audio/mp4',\n 'audio/webm',\n 'audio/ogg',\n 'audio/flac',\n]);\n\nconst MIME_TO_FORMAT: Record<string, string> = {\n 'audio/wav': 'wav',\n 'audio/x-wav': 'wav',\n 'audio/mpeg': 'mp3',\n 'audio/mp3': 'mp3',\n 'audio/mp4': 'mp4',\n 'audio/webm': 'webm',\n 'audio/ogg': 'ogg',\n 'audio/flac': 'flac',\n};\n\nexport function mimeToAudioFormat(mimeType: string): string {\n return MIME_TO_FORMAT[mimeType] ?? mimeType.split('/').pop() ?? 'wav';\n}\n\nexport function assertValidAudioInput(\n audio: AiAudioInput,\n maxAudioBytes = 25 * 1024 * 1024\n): void {\n if (!audio.base64?.trim()) {\n throw new Error('音频数据不能为空');\n }\n if (!ALLOWED_MIME.has(audio.mimeType)) {\n throw new Error(`不支持的音频格式: ${audio.mimeType}`);\n }\n\n const byteLength = estimateBase64ByteLength(audio.base64);\n if (byteLength > maxAudioBytes) {\n throw new Error(`音频过大,最大 ${Math.round(maxAudioBytes / 1024 / 1024)}MB`);\n }\n}\n\nfunction estimateBase64ByteLength(base64: string): number {\n if (typeof Buffer !== 'undefined') {\n return Buffer.byteLength(base64, 'base64');\n }\n const padding = base64.endsWith('==') ? 2 : base64.endsWith('=') ? 1 : 0;\n return Math.floor((base64.length * 3) / 4) - padding;\n}\n\nexport async function fileToAiAudioInput(file: File): Promise<AiAudioInput> {\n const buffer = await file.arrayBuffer();\n if (typeof Buffer !== 'undefined') {\n return {\n base64: Buffer.from(buffer).toString('base64'),\n mimeType: file.type || 'audio/wav',\n };\n }\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let index = 0; index < bytes.length; index += 1) {\n binary += String.fromCharCode(bytes[index]!);\n }\n return { base64: btoa(binary), mimeType: file.type || 'audio/wav' };\n}\n\nexport function base64ToBlob(base64: string, mimeType: string): Blob {\n if (typeof Buffer !== 'undefined') {\n const bytes = Buffer.from(base64, 'base64');\n return new Blob([bytes], { type: mimeType });\n }\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n return new Blob([bytes], { type: mimeType });\n}\n","import { mimeToAudioFormat } from './audioUtils';\nimport type { AiMediaInput } from './types';\nimport {\n assertVisionCapableModel,\n detectVisionMessageFormat,\n type VisionMessageFormat,\n} from './visionMessageFormats';\n\nexport type { VisionMessageFormat };\n\nexport function buildMultimodalMessages(options: {\n systemPrompt: string;\n userPrompt: string;\n images: AiMediaInput[];\n nativeAudios: AiMediaInput[];\n format: VisionMessageFormat;\n}): Array<Record<string, unknown>> {\n const { systemPrompt, userPrompt, images, nativeAudios, format } = options;\n const hasImages = images.length > 0;\n const hasNativeAudio = nativeAudios.length > 0;\n\n if (format === 'ollama' && hasImages) {\n return [\n { role: 'system', content: systemPrompt },\n {\n role: 'user',\n content: userPrompt,\n images: images.map((image) => image.base64),\n },\n ];\n }\n\n const userContent: Array<Record<string, unknown>> = [{ type: 'text', text: userPrompt }];\n\n for (const image of images) {\n userContent.push({\n type: 'image_url',\n image_url: {\n url: `data:${image.mimeType};base64,${image.base64}`,\n },\n });\n }\n\n for (const audio of nativeAudios) {\n userContent.push({\n type: 'input_audio',\n input_audio: {\n data: audio.base64,\n format: mimeToAudioFormat(audio.mimeType),\n },\n });\n }\n\n const useStructuredContent = hasImages || hasNativeAudio;\n\n return [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: useStructuredContent ? userContent : userPrompt },\n ];\n}\n\nexport function assertMultimodalCapableModel(\n modelId: string,\n options: { baseUrl?: string; hasImages?: boolean; hasNativeAudio?: boolean }\n): void {\n assertVisionCapableModel(modelId, {\n baseUrl: options.baseUrl,\n hasImages: options.hasImages,\n });\n\n if (!options.hasNativeAudio) return;\n\n const format = options.baseUrl ? detectVisionMessageFormat(options.baseUrl) : 'openai';\n if (format === 'ollama') {\n throw new Error('当前 Ollama 连接不支持 chat 内嵌音频,请改用 audioStrategy: \"stt\" 或 \"auto\"');\n }\n}\n\nexport {\n detectVisionMessageFormat,\n assertVisionCapableModel,\n isImageUrlVariantError,\n toVisionApiErrorMessage,\n} from './visionMessageFormats';\n\nexport { isLikelyNativeAudioChatModel, isLikelyVisionModel } from './modelHeuristics';\n","import type { AiImageInput } from './types';\n\nconst ALLOWED_MIME = new Set(['image/jpeg', 'image/png', 'image/webp', 'image/gif']);\n\nexport function assertValidImageInput(image: AiImageInput, maxImageBytes = 5 * 1024 * 1024): void {\n if (!image.base64?.trim()) {\n throw new Error('图片数据不能为空');\n }\n if (!ALLOWED_MIME.has(image.mimeType)) {\n throw new Error(`不支持的图片格式: ${image.mimeType}`);\n }\n\n const byteLength = estimateBase64ByteLength(image.base64);\n if (byteLength > maxImageBytes) {\n throw new Error(`图片过大,最大 ${Math.round(maxImageBytes / 1024 / 1024)}MB`);\n }\n}\n\nfunction estimateBase64ByteLength(base64: string): number {\n if (typeof Buffer !== 'undefined') {\n return Buffer.byteLength(base64, 'base64');\n }\n const padding = base64.endsWith('==') ? 2 : base64.endsWith('=') ? 1 : 0;\n return Math.floor((base64.length * 3) / 4) - padding;\n}\n\nexport async function fileToAiImageInput(file: File): Promise<AiImageInput> {\n const buffer = await file.arrayBuffer();\n if (typeof Buffer !== 'undefined') {\n return {\n base64: Buffer.from(buffer).toString('base64'),\n mimeType: file.type || 'image/jpeg',\n };\n }\n const bytes = new Uint8Array(buffer);\n let binary = '';\n for (let index = 0; index < bytes.length; index += 1) {\n binary += String.fromCharCode(bytes[index]!);\n }\n const base64 = btoa(binary);\n return { base64, mimeType: file.type || 'image/jpeg' };\n}\n","import type { AiMediaInput } from './types';\nimport { assertValidAudioInput } from './audioUtils';\nimport { assertValidImageInput } from './imageUtils';\n\nexport function splitMediaByKind(media: AiMediaInput[]): {\n images: AiMediaInput[];\n audios: AiMediaInput[];\n} {\n const images: AiMediaInput[] = [];\n const audios: AiMediaInput[] = [];\n for (const item of media) {\n if (item.kind === 'image') {\n images.push(item);\n } else {\n audios.push(item);\n }\n }\n return { images, audios };\n}\n\nexport function assertValidMultimodalMedia(\n media: AiMediaInput[] | undefined,\n limits: { maxImageBytes: number; maxAudioBytes: number; maxImages?: number; maxAudios?: number }\n): AiMediaInput[] {\n const items = media ?? [];\n const { images, audios } = splitMediaByKind(items);\n\n const maxImages = limits.maxImages ?? 8;\n const maxAudios = limits.maxAudios ?? 4;\n\n if (images.length > maxImages) {\n throw new Error(`图片数量过多,最多 ${maxImages} 张`);\n }\n if (audios.length > maxAudios) {\n throw new Error(`音频数量过多,最多 ${maxAudios} 段`);\n }\n\n for (const image of images) {\n assertValidImageInput(\n { base64: image.base64, mimeType: image.mimeType },\n limits.maxImageBytes\n );\n }\n for (const audio of audios) {\n assertValidAudioInput(\n { base64: audio.base64, mimeType: audio.mimeType },\n limits.maxAudioBytes\n );\n }\n\n return items;\n}\n","import { base64ToBlob, mimeToAudioFormat } from './audioUtils';\nimport type { AiAudioInput, AiConnectionConfig } from './types';\n\nfunction joinUrl(baseUrl: string, path: string): string {\n return `${baseUrl.replace(/\\/+$/, '')}/${path.replace(/^\\/+/, '')}`;\n}\n\ntype TranscriptionResponse = {\n text?: string;\n error?: { message?: string };\n};\n\nexport interface TranscribeAudioOptions {\n audio: AiAudioInput;\n config: AiConnectionConfig;\n model?: string;\n language?: string;\n}\n\nexport async function transcribeAudio(options: TranscribeAudioOptions): Promise<string> {\n const { audio, config, model, language } = options;\n const sttModel = model?.trim() || config.audioModel;\n const blob = base64ToBlob(audio.base64, audio.mimeType);\n const extension = mimeToAudioFormat(audio.mimeType);\n const form = new FormData();\n\n form.append('file', blob, `audio.${extension}`);\n form.append('model', sttModel);\n if (language?.trim()) {\n form.append('language', language.trim());\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), config.timeoutMs);\n\n try {\n const response = await fetch(joinUrl(config.baseUrl, 'audio/transcriptions'), {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n },\n body: form,\n signal: controller.signal,\n });\n\n const text = await response.text();\n let data: unknown = null;\n if (text) {\n try {\n data = JSON.parse(text);\n } catch {\n data = text;\n }\n }\n\n if (!response.ok) {\n const record = data as { error?: { message?: string } | string; message?: string } | null;\n const errorMessage =\n (typeof record?.error === 'object' ? record.error?.message : record?.error) ||\n record?.message ||\n `STT 请求失败 (${response.status})`;\n throw new Error(String(errorMessage));\n }\n\n if (typeof data === 'string') {\n return data.trim();\n }\n\n const parsed = data as TranscriptionResponse;\n return (parsed.text ?? '').trim();\n } finally {\n clearTimeout(timeoutId);\n }\n}\n\nexport async function transcribeAudios(\n audios: AiAudioInput[],\n config: AiConnectionConfig,\n model?: string\n): Promise<string[]> {\n const results: string[] = [];\n for (const audio of audios) {\n results.push(await transcribeAudio({ audio, config, model }));\n }\n return results;\n}\n","import { appendTranscriptionsToPrompt, isAudioInputError, resolveAudioHandling } from './audioStrategy';\nimport {\n assertMultimodalCapableModel,\n buildMultimodalMessages,\n detectVisionMessageFormat,\n toVisionApiErrorMessage,\n} from './multimodalMessageFormats';\nimport { assertValidMultimodalMedia, splitMediaByKind } from './mediaUtils';\nimport { requireAiConnectionConfig } from './resolveConfig';\nimport { requestJson } from './requestJson';\nimport { transcribeAudios } from './transcribeAudio';\nimport type {\n AiAudioInput,\n AiClientSettings,\n AiMediaInput,\n MultimodalChatParams,\n MultimodalChatResult,\n} from './types';\n\nfunction joinUrl(baseUrl: string, path: string): string {\n return `${baseUrl.replace(/\\/+$/, '')}/${path.replace(/^\\/+/, '')}`;\n}\n\ntype OpenAiChatResponse = {\n model?: string;\n choices?: Array<{ message?: { content?: string } }>;\n error?: { message?: string };\n};\n\nasync function requestMultimodalChat(options: {\n config: ReturnType<typeof requireAiConnectionConfig>;\n model: string;\n messages: Array<Record<string, unknown>>;\n temperature?: number;\n maxTokens?: number;\n jsonMode?: boolean;\n}): Promise<{ content: string; model: string; raw: unknown }> {\n const payload: Record<string, unknown> = {\n model: options.model,\n messages: options.messages,\n temperature: options.temperature ?? 0.2,\n };\n\n if (options.maxTokens !== undefined) {\n payload.max_tokens = options.maxTokens;\n }\n if (options.jsonMode) {\n payload.response_format = { type: 'json_object' };\n }\n\n const raw = await requestJson<OpenAiChatResponse>({\n url: joinUrl(options.config.baseUrl, 'chat/completions'),\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${options.config.apiKey}`,\n },\n body: payload,\n timeoutMs: options.config.timeoutMs,\n });\n\n return {\n content: raw.choices?.[0]?.message?.content ?? '',\n model: raw.model ?? options.model,\n raw,\n };\n}\n\nfunction toAudioInputs(audios: AiMediaInput[]): AiAudioInput[] {\n return audios.map((audio) => ({ base64: audio.base64, mimeType: audio.mimeType }));\n}\n\n/**\n * OpenAI 兼容多模态对话:文本 + 可选图片/语音。\n * audioStrategy=auto 时:优先 chat 内嵌音频(native),失败或未支持则 STT 转写后走文本 chat。\n */\nexport async function callMultimodalChat(\n params: MultimodalChatParams,\n clientSettings?: AiClientSettings\n): Promise<MultimodalChatResult> {\n const config = requireAiConnectionConfig(params.connection, clientSettings);\n const media = assertValidMultimodalMedia(params.media, {\n maxImageBytes: config.maxImageBytes,\n maxAudioBytes: config.maxAudioBytes,\n });\n const { images, audios } = splitMediaByKind(media);\n const hasImages = images.length > 0;\n const hasAudio = audios.length > 0;\n\n const model =\n params.model ||\n (hasImages ? config.visionModel : hasAudio ? config.visionModel : config.textModel);\n const strategy = params.audioStrategy ?? config.audioStrategy;\n const format = detectVisionMessageFormat(config.baseUrl);\n let audioHandling = resolveAudioHandling({\n hasAudio,\n strategy,\n model,\n baseUrl: config.baseUrl,\n });\n\n let userPrompt = params.userPrompt;\n let transcriptions: string[] | undefined;\n let nativeAudios: AiMediaInput[] = [];\n\n if (audioHandling === 'stt' && hasAudio) {\n transcriptions = await transcribeAudios(toAudioInputs(audios), config);\n userPrompt = appendTranscriptionsToPrompt(userPrompt, transcriptions);\n } else if (audioHandling === 'native' && hasAudio) {\n nativeAudios = audios;\n }\n\n assertMultimodalCapableModel(model, {\n baseUrl: config.baseUrl,\n hasImages,\n hasNativeAudio: nativeAudios.length > 0,\n });\n\n const messages = buildMultimodalMessages({\n systemPrompt: params.systemPrompt,\n userPrompt,\n images,\n nativeAudios,\n format,\n });\n\n try {\n const result = await requestMultimodalChat({\n config,\n model,\n messages,\n temperature: params.temperature,\n maxTokens: params.maxTokens,\n jsonMode: params.jsonMode,\n });\n\n return {\n ...result,\n audioHandling,\n transcriptions,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'AI 请求失败';\n\n if (\n audioHandling === 'native' &&\n hasAudio &&\n strategy === 'auto' &&\n isAudioInputError(message)\n ) {\n transcriptions = await transcribeAudios(toAudioInputs(audios), config);\n userPrompt = appendTranscriptionsToPrompt(params.userPrompt, transcriptions);\n audioHandling = 'stt';\n\n const fallbackMessages = buildMultimodalMessages({\n systemPrompt: params.systemPrompt,\n userPrompt,\n images,\n nativeAudios: [],\n format,\n });\n\n const result = await requestMultimodalChat({\n config,\n model,\n messages: fallbackMessages,\n temperature: params.temperature,\n maxTokens: params.maxTokens,\n jsonMode: params.jsonMode,\n });\n\n return {\n ...result,\n audioHandling,\n transcriptions,\n };\n }\n\n throw new Error(toVisionApiErrorMessage(message, model));\n }\n}\n","export function extractJsonObject(text: string): Record<string, unknown> {\n const trimmed = text.trim();\n if (!trimmed) {\n throw new Error('模型返回为空');\n }\n\n try {\n const parsed = JSON.parse(trimmed);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n // fall through\n }\n\n const fenced = trimmed.match(/```(?:json)?\\s*([\\s\\S]*?)```/i);\n if (fenced?.[1]) {\n const parsed = JSON.parse(fenced[1].trim());\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n }\n\n const start = trimmed.indexOf('{');\n const end = trimmed.lastIndexOf('}');\n if (start >= 0 && end > start) {\n const parsed = JSON.parse(trimmed.slice(start, end + 1));\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n }\n\n throw new Error('无法解析模型 JSON 输出');\n}\n","import { requestJson } from './requestJson';\nimport { resolveAiConnectionConfig } from './resolveConfig';\nimport type { AiClientSettings } from './types';\nimport {\n filterChatModels,\n filterVisionModels,\n pickDefaultVisionModel,\n} from './modelHeuristics';\n\nfunction joinUrl(baseUrl: string, path: string): string {\n return `${baseUrl.replace(/\\/+$/, '')}/${path.replace(/^\\/+/, '')}`;\n}\n\ninterface OpenAiModelListResponse {\n data?: Array<{ id?: string }>;\n models?: Array<{ id?: string } | string>;\n error?: { message?: string };\n}\n\nfunction parseModelIds(raw: OpenAiModelListResponse): string[] {\n if (Array.isArray(raw.data)) {\n return raw.data.map((item) => item.id).filter((id): id is string => Boolean(id));\n }\n if (Array.isArray(raw.models)) {\n return raw.models\n .map((item) => (typeof item === 'string' ? item : item.id))\n .filter((id): id is string => Boolean(id));\n }\n return [];\n}\n\nexport interface ListModelsResult {\n models: string[];\n visionModels: string[];\n suggestedVisionModel?: string;\n}\n\nexport async function listOpenAiCompatibleModels(\n clientSettings?: AiClientSettings,\n currentVisionModel?: string\n): Promise<ListModelsResult> {\n const config = resolveAiConnectionConfig(clientSettings);\n if (!config) {\n throw new Error('未配置 AI API Key,请在设置中填写或配置服务端环境变量');\n }\n\n const raw = await requestJson<OpenAiModelListResponse>({\n url: joinUrl(config.baseUrl, 'models'),\n method: 'GET',\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n },\n timeoutMs: config.timeoutMs,\n });\n\n const modelIds = parseModelIds(raw);\n if (modelIds.length === 0) {\n throw new Error('接口未返回可用模型');\n }\n\n const models = filterChatModels(modelIds);\n const visionModels = filterVisionModels(modelIds);\n const suggestedVisionModel = pickDefaultVisionModel(modelIds, currentVisionModel);\n\n return { models, visionModels, suggestedVisionModel };\n}\n","import type { AiTaskDefinition } from './types';\n\nconst registry = new Map<string, AiTaskDefinition>();\n\nexport function registerAiTask<TInput, TOutput>(task: AiTaskDefinition<TInput, TOutput>): void {\n if (registry.has(task.id)) {\n console.warn(`[aiApi] task \"${task.id}\" already registered, skipping duplicate`);\n return;\n }\n registry.set(task.id, task as AiTaskDefinition);\n}\n\nexport function getAiTask(taskId: string): AiTaskDefinition | undefined {\n return registry.get(taskId);\n}\n\nexport function listAiTasks(): string[] {\n return Array.from(registry.keys());\n}\n\nexport function clearAiTasksForTest(): void {\n registry.clear();\n}\n","import { resolveAiConnectionConfig } from './resolveConfig';\nimport { getAiTask } from './taskRegistry';\nimport type { AiClientSettings, AiApiResponse, AiTaskContext } from './types';\n\nfunction extractInputConnection(input: unknown): AiClientSettings | undefined {\n if (!input || typeof input !== 'object') return undefined;\n const connection = (input as { connection?: AiClientSettings }).connection;\n return connection && typeof connection === 'object' ? connection : undefined;\n}\n\nexport async function runAiTask<TData = unknown>(\n taskId: string,\n input: unknown,\n ctx: AiTaskContext = {}\n): Promise<AiApiResponse<TData>> {\n const started = Date.now();\n\n if (!resolveAiConnectionConfig(extractInputConnection(input), ctx.clientSettings)) {\n return {\n success: false,\n taskId,\n error: {\n code: 'AI_CONFIG_MISSING',\n message: '未配置 AI API Key,请传入 clientSettings.connection 或设置环境变量 AI_API_KEY',\n },\n };\n }\n\n const task = getAiTask(taskId);\n if (!task) {\n return {\n success: false,\n taskId,\n error: {\n code: 'TASK_NOT_FOUND',\n message: `未注册的任务: ${taskId}`,\n },\n };\n }\n\n try {\n const validated = task.validateInput(input);\n const result = await task.execute(validated, ctx);\n\n return {\n success: true,\n taskId,\n data: result.data as TData,\n meta: {\n model: result.meta?.model ?? 'unknown',\n latencyMs: Date.now() - started,\n provider: result.meta?.provider ?? 'openai-compatible',\n confidence: result.meta?.confidence,\n rawSummary: result.meta?.rawSummary,\n },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : 'AI 任务执行失败';\n const code = classifyError(message);\n\n return {\n success: false,\n taskId,\n error: { code, message },\n meta: {\n model: 'unknown',\n latencyMs: Date.now() - started,\n },\n };\n }\n}\n\nfunction classifyError(message: string) {\n if (message.includes('未配置') || message.includes('AI_API_KEY') || message.includes('apiKey')) {\n return 'AI_CONFIG_MISSING' as const;\n }\n if (message.includes('图片') || message.includes('格式')) {\n return message.includes('过大') ? ('PAYLOAD_TOO_LARGE' as const) : ('UNSUPPORTED_MEDIA' as const);\n }\n if (message.includes('解析') || message.includes('JSON')) {\n return 'AI_PARSE_FAILED' as const;\n }\n if (message.includes('必填') || message.includes('无效')) {\n return 'INVALID_INPUT' as const;\n }\n return 'AI_REQUEST_FAILED' as const;\n}\n","import type { AiTaskDefinition, TextCompletionInput, TextCompletionOutput } from '../types';\nimport { callCompletion } from '../callCompletion';\nimport { CORE_LLM_COMPLETION_TASK_ID } from '../types';\n\nfunction isTextCompletionInput(input: unknown): input is TextCompletionInput {\n if (!input || typeof input !== 'object') return false;\n const value = input as TextCompletionInput;\n return typeof value.userPrompt === 'string' && value.userPrompt.trim().length > 0;\n}\n\nexport const coreLlmCompletionTask: AiTaskDefinition<TextCompletionInput, TextCompletionOutput> = {\n id: CORE_LLM_COMPLETION_TASK_ID,\n description: '通用文本补全:system/user 提示词 → 模型文本',\n validateInput(input) {\n if (!isTextCompletionInput(input)) {\n throw new Error('userPrompt 为必填');\n }\n return input;\n },\n async execute(input, ctx) {\n const result = await callCompletion(\n {\n systemPrompt: input.systemPrompt,\n userPrompt: input.userPrompt,\n model: input.model,\n temperature: input.temperature,\n maxTokens: input.maxTokens,\n connection: input.connection,\n },\n ctx.clientSettings\n );\n\n return {\n data: {\n content: result.content,\n rawText: result.content,\n },\n meta: {\n model: result.model,\n provider: 'openai-compatible',\n },\n };\n },\n};\n","import type {\n AiTaskDefinition,\n StructuredMultimodalInput,\n StructuredMultimodalOutput,\n} from '../types';\nimport { callMultimodalChat } from '../callMultimodalChat';\nimport { extractJsonObject } from '../jsonUtils';\nimport { assertValidMultimodalMedia } from '../mediaUtils';\nimport { resolveAiConnectionConfig } from '../resolveConfig';\nimport { CORE_STRUCTURED_MULTIMODAL_TASK_ID } from '../types';\n\nfunction isStructuredMultimodalInput(input: unknown): input is StructuredMultimodalInput {\n if (!input || typeof input !== 'object') return false;\n const value = input as StructuredMultimodalInput;\n return typeof value.systemPrompt === 'string' && typeof value.userPrompt === 'string';\n}\n\nexport const coreStructuredMultimodalTask: AiTaskDefinition<\n StructuredMultimodalInput,\n StructuredMultimodalOutput\n> = {\n id: CORE_STRUCTURED_MULTIMODAL_TASK_ID,\n description: '通用结构化多模态任务:文本 + 可选图片/语音 → JSON',\n validateInput(input) {\n if (!isStructuredMultimodalInput(input)) {\n throw new Error('systemPrompt 与 userPrompt 为必填');\n }\n const config = resolveAiConnectionConfig(input.connection);\n assertValidMultimodalMedia(input.media, {\n maxImageBytes: config?.maxImageBytes ?? 5 * 1024 * 1024,\n maxAudioBytes: config?.maxAudioBytes ?? 25 * 1024 * 1024,\n });\n return input;\n },\n async execute(input, ctx) {\n const schemaHint = input.jsonSchemaHint\n ? `\\n\\n请严格输出 JSON 对象,结构参考:\\n${input.jsonSchemaHint}`\n : '\\n\\n请严格输出 JSON 对象,不要包含 Markdown 代码块。';\n\n const result = await callMultimodalChat(\n {\n systemPrompt: input.systemPrompt,\n userPrompt: `${input.userPrompt}${schemaHint}`,\n media: input.media,\n model: input.model,\n temperature: input.temperature ?? 0.2,\n maxTokens: input.maxTokens,\n jsonMode: true,\n audioStrategy: input.audioStrategy,\n connection: input.connection,\n },\n ctx.clientSettings\n );\n\n const json = extractJsonObject(result.content);\n\n return {\n data: {\n json,\n rawText: result.content,\n },\n meta: {\n model: result.model,\n provider: 'openai-compatible',\n rawSummary: result.audioHandling\n ? `audio=${result.audioHandling}`\n : undefined,\n },\n };\n },\n};\n","import type { AiTaskDefinition, ConnectivityTestOutput } from '../types';\nimport { callChat } from '../callChat';\nimport { extractJsonObject } from '../jsonUtils';\nimport { resolveAiConnectionConfig } from '../resolveConfig';\nimport { CORE_CONNECTIVITY_TEST_TASK_ID } from '../types';\n\nexport const coreConnectivityTestTask: AiTaskDefinition<Record<string, never>, ConnectivityTestOutput> =\n {\n id: CORE_CONNECTIVITY_TEST_TASK_ID,\n description: '测试 AI API 连通性(轻量文本请求)',\n validateInput() {\n return {};\n },\n async execute(_input, ctx) {\n const config = resolveAiConnectionConfig(ctx.clientSettings);\n if (!config) {\n throw new Error('未配置 AI API Key');\n }\n\n const result = await callChat({\n baseUrl: config.baseUrl,\n apiKey: config.apiKey,\n model: config.textModel,\n systemPrompt: 'You are a connectivity probe. Reply with JSON only.',\n userPrompt: 'Return JSON: {\"ok\":true,\"reply\":\"OK\"}',\n temperature: 0,\n maxTokens: 32,\n timeoutMs: config.timeoutMs,\n });\n\n let ok = false;\n let reply = result.content.trim();\n\n try {\n const json = extractJsonObject(result.content);\n ok = json.ok === true || json.ok === 'true';\n reply = String(json.reply ?? result.content).trim();\n } catch {\n ok = /ok/i.test(result.content);\n }\n\n if (!ok && !reply) {\n throw new Error('模型未返回有效响应');\n }\n\n return {\n data: { ok: true, reply: reply || 'OK' },\n meta: {\n model: result.model,\n provider: 'openai-compatible',\n },\n };\n },\n };\n","import { registerAiTask } from './taskRegistry';\nimport { coreLlmCompletionTask } from './tasks/coreLlmCompletion';\nimport { coreStructuredMultimodalTask } from './tasks/coreStructuredMultimodal';\nimport { coreConnectivityTestTask } from './tasks/coreConnectivityTest';\n\nlet registered = false;\n\n/** 注册内置通用 AI 任务(幂等) */\nexport function registerCoreAiTasks(): void {\n if (registered) return;\n registerAiTask(coreLlmCompletionTask);\n registerAiTask(coreStructuredMultimodalTask);\n registerAiTask(coreConnectivityTestTask);\n registered = true;\n}\n\n/** 别名:确保 core 任务已注册 */\nexport const ensureCoreAiTasksRegistered = registerCoreAiTasks;\n\nexport function resetCoreAiTasksForTest(): void {\n registered = false;\n}\n"]}