@samp3ng/aster-plugin-opc-cloud 0.1.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/README.md +77 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +1223 -0
- package/dist/index.js.map +1 -0
- package/package.json +26 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/client.ts","../src/prompts.ts","../src/local-opc.ts","../src/tools.ts","../src/index.ts"],"sourcesContent":["export interface OpcCloudConfig {\n baseUrl: string;\n}\n\nexport class OpcPlatformClient {\n constructor(private readonly config: OpcCloudConfig) {}\n\n async health(): Promise<unknown> {\n return this.request('/health');\n }\n\n async stats(): Promise<unknown> {\n return this.request('/stats');\n }\n\n async registerAccount(body: Record<string, unknown>): Promise<unknown> {\n return this.request('/auth/register', { method: 'POST', body });\n }\n\n async adminOverview(): Promise<unknown> {\n return this.request('/admin/overview');\n }\n\n async listAdminUsers(): Promise<unknown> {\n return this.request('/admin/users');\n }\n\n async listPolicies(query = '', category = ''): Promise<unknown> {\n return this.request(`/policies?${toQuery({ q: query, category })}`);\n }\n\n async createSupplier(body: Record<string, unknown>): Promise<unknown> {\n return this.request('/suppliers', { method: 'POST', body });\n }\n\n async searchSuppliers(query: string, skills: string[]): Promise<unknown> {\n return this.request(`/suppliers?${toQuery({ q: query, skills: skills.join(',') })}`);\n }\n\n async getSupplier(id: number): Promise<unknown> {\n return this.request(`/suppliers/${encodeURIComponent(String(id))}`);\n }\n\n async updateSupplier(id: number, body: Record<string, unknown>): Promise<unknown> {\n return this.request(`/suppliers/${encodeURIComponent(String(id))}`, { method: 'PUT', body });\n }\n\n async createDemand(body: Record<string, unknown>): Promise<unknown> {\n return this.request('/demands', { method: 'POST', body });\n }\n\n async searchDemands(query: string, skills: string[], opts: { status?: string; category?: string } = {}): Promise<unknown> {\n return this.request(`/demands?${toQuery({ q: query, skills: skills.join(','), status: opts.status || '', category: opts.category || '' })}`);\n }\n\n async getDemand(id: number): Promise<unknown> {\n return this.request(`/demands/${encodeURIComponent(String(id))}`);\n }\n\n async updateDemandStatus(id: number, status: string): Promise<unknown> {\n return this.request(`/demands/${encodeURIComponent(String(id))}/status`, {\n method: 'PUT',\n body: { status },\n });\n }\n\n async startDemandChat(demandId: number, body: Record<string, unknown>): Promise<unknown> {\n return this.request(`/demands/${encodeURIComponent(String(demandId))}/chat`, {\n method: 'POST',\n body,\n });\n }\n\n async applyDemand(demandId: number, body: Record<string, unknown>): Promise<unknown> {\n return this.request(`/demands/${encodeURIComponent(String(demandId))}/applications`, {\n method: 'POST',\n body,\n });\n }\n\n async listApplications(demandId: number): Promise<unknown> {\n return this.request(`/demands/${encodeURIComponent(String(demandId))}/applications`);\n }\n\n async reviewApplication(demandId: number, applicationId: number, action: string): Promise<unknown> {\n return this.request(`/demands/${encodeURIComponent(String(demandId))}/applications/${encodeURIComponent(String(applicationId))}`, {\n method: 'PUT',\n body: { action },\n });\n }\n\n async listConversations(userId = ''): Promise<unknown> {\n return this.request(`/conversations?${toQuery({ userId })}`);\n }\n\n async sendMessage(conversationId: number, body: Record<string, unknown>): Promise<unknown> {\n return this.request(`/conversations/${encodeURIComponent(String(conversationId))}/messages`, {\n method: 'POST',\n body,\n });\n }\n\n async listMessages(conversationId: number): Promise<unknown> {\n return this.request(`/conversations/${encodeURIComponent(String(conversationId))}/messages`);\n }\n\n async listOrders(): Promise<unknown> {\n return this.request('/orders');\n }\n\n async updateOrderStatus(id: number, status: string): Promise<unknown> {\n return this.request(`/orders/${encodeURIComponent(String(id))}/status`, {\n method: 'PUT',\n body: { status },\n });\n }\n\n private async request(path: string, opts: { method?: string; body?: unknown } = {}): Promise<unknown> {\n const base = this.config.baseUrl.replace(/\\/+$/, '');\n const res = await fetch(`${base}${path}`, {\n method: opts.method || 'GET',\n headers: opts.body === undefined ? undefined : { 'content-type': 'application/json' },\n body: opts.body === undefined ? undefined : JSON.stringify(opts.body),\n });\n const text = await res.text();\n let data: unknown = text;\n try {\n data = text ? JSON.parse(text) : null;\n } catch {\n // keep raw text\n }\n if (!res.ok) {\n const message = typeof data === 'object' && data && 'message' in data\n ? String((data as { message?: unknown }).message)\n : text;\n throw new Error(`OPC platform API ${res.status}: ${message}`);\n }\n return data;\n }\n}\n\nfunction toQuery(params: Record<string, string>): string {\n const q = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value) q.set(key, value);\n }\n return q.toString();\n}\n","export const OPC_CLOUD_SYSTEM_PROMPT = [\n '[星环 OPC 供需聚合插件]',\n '你可以通过 opc_platform_* 工具把本地 Aster 接入星环 OPC 线上供需平台。平台定位是 OPC 们发单、找单、接单、私聊和同步订单,不是普通后台管理。',\n '',\n '优先使用高层工作流工具:',\n '- 用户要入驻/上架/把公司放到平台:优先调用 opc_platform_onboard。它会读取本地 OPC 公司资料,生成注册账户 + 上架服务商主页计划。',\n '- 用户要找适合自己接的单:优先调用 opc_platform_find_work。它会读取本地 OPC 技能并推荐需求。',\n '- 用户说“这个单我接了/帮我投递”:优先调用 opc_platform_apply_to_work。它会匹配本地服务商主页并生成申请文案。',\n '',\n '底层工具用于精确操作:',\n '- 找服务商:opc_platform_search_supplier / opc_platform_get_supplier。',\n '- 发需求:opc_platform_post_demand,先补齐标题、详情、技能、预算、截止日期。',\n '- 查需求:opc_platform_search_demand / opc_platform_get_demand / opc_platform_list_applications。',\n '- 沟通:opc_platform_start_demand_chat / opc_platform_list_conversations / opc_platform_list_messages / opc_platform_send_chat_message。',\n '- 订单:opc_platform_list_orders / opc_platform_update_order_status / opc_platform_pull_orders。',\n '- 政策资源:opc_platform_list_policies。',\n '',\n '高影响动作必须 dry-run-then-confirm:注册/上架、发布需求、接单申请、审核申请、更新订单、本地回流都不能直接真发。用户明确确认后再传 confirm:true。',\n '回答时把结果翻译成用户能决策的信息:推荐原因、预算、匹配技能、下一步动作,不要只贴 JSON。',\n].join('\\n');\n","import fs from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport Database from 'better-sqlite3';\n\nexport interface LocalOpcProfile {\n companyName: string;\n headline: string;\n summary: string;\n skills: string[];\n services: string[];\n portfolio: Array<{ title: string; description?: string }>;\n}\n\nexport interface PlatformOrderInput {\n id: number;\n status?: string;\n demand?: {\n title?: string;\n description?: string;\n budgetMin?: number | null;\n budgetMax?: number | null;\n deadline?: string;\n ownerId?: string;\n } | null;\n supplier?: {\n companyName?: string;\n } | null;\n}\n\nexport function readLocalOpcProfile(homeDir: string, configuredDbPath?: string): Partial<LocalOpcProfile> {\n const dbPath = expandHome(configuredDbPath || path.join(homeDir, 'plugins', 'opc', 'opc.db'));\n if (!fs.existsSync(dbPath)) return {};\n const db = new Database(dbPath, { readonly: true, fileMustExist: true });\n try {\n const company = db.prepare(`\n SELECT name, business_type, notes\n FROM opc_companies\n ORDER BY id DESC\n LIMIT 1\n `).get() as { name?: string; business_type?: string; notes?: string } | undefined;\n const projects = db.prepare(`\n SELECT name, description, status\n FROM opc_projects\n ORDER BY id DESC\n LIMIT 5\n `).all() as Array<{ name?: string; description?: string; status?: string }>;\n const contracts = db.prepare(`\n SELECT title, party\n FROM opc_contracts\n ORDER BY id DESC\n LIMIT 5\n `).all() as Array<{ title?: string; party?: string }>;\n\n if (!company?.name) return {};\n const skills = inferSkills([company.business_type, company.notes, ...projects.map((p) => `${p.name} ${p.description}`)]);\n const services = [company.business_type || 'OPC 服务'].filter(Boolean);\n return {\n companyName: company.name,\n headline: `${company.name} · ${company.business_type || '一人公司服务商'}`,\n summary: company.notes || `主营 ${company.business_type || '项目交付、业务协作和咨询服务'}。`,\n skills,\n services,\n portfolio: [\n ...projects.map((item) => ({ title: item.name || '项目', description: item.description || item.status || '' })),\n ...contracts.map((item) => ({ title: item.title || '合同', description: item.party || '' })),\n ].filter((item) => item.title),\n };\n } finally {\n db.close();\n }\n}\n\nexport function syncOrdersToLocalOpc(\n homeDir: string,\n orders: PlatformOrderInput[],\n configuredDbPath?: string,\n): { created: number; skipped: number; dbPath: string } {\n const dbPath = expandHome(configuredDbPath || path.join(homeDir, 'plugins', 'opc', 'opc.db'));\n fs.mkdirSync(path.dirname(dbPath), { recursive: true });\n const db = new Database(dbPath);\n try {\n ensureMinimalOpcSchema(db);\n let created = 0;\n let skipped = 0;\n const now = Date.now();\n const findCompany = db.prepare('SELECT id FROM opc_companies ORDER BY id DESC LIMIT 1');\n const insertCompany = db.prepare(`\n INSERT INTO opc_companies (name, address, business_type, founded_on, notes, created_at)\n VALUES (?, '', 'OPC 在线平台', '', '由 opc_platform_pull_orders 自动创建', ?)\n `);\n let company = findCompany.get() as { id: number } | undefined;\n if (!company) {\n const result = insertCompany.run('OPC 在线平台订单', now);\n company = { id: Number(result.lastInsertRowid) };\n }\n\n const existsContract = db.prepare('SELECT id FROM opc_contracts WHERE title = ? LIMIT 1');\n const insertContract = db.prepare(`\n INSERT INTO opc_contracts (company_id, title, party, amount, start_on, end_on, status, content, created_at)\n VALUES (?, ?, ?, ?, ?, ?, 'active', ?, ?)\n `);\n const insertProject = db.prepare(`\n INSERT INTO opc_projects (company_id, name, description, status, created_at)\n VALUES (?, ?, ?, 'active', ?)\n `);\n\n for (const order of orders) {\n const title = `[OPC#${order.id}] ${order.demand?.title || '平台订单'}`;\n if (existsContract.get(title)) {\n skipped += 1;\n continue;\n }\n const amount = order.demand?.budgetMax ?? order.demand?.budgetMin ?? null;\n const content = [\n `平台订单 ID: ${order.id}`,\n `状态: ${order.status || 'pending'}`,\n `需求: ${order.demand?.title || ''}`,\n `描述: ${order.demand?.description || ''}`,\n `供应方: ${order.supplier?.companyName || ''}`,\n ].filter(Boolean).join('\\n');\n insertContract.run(\n company.id,\n title,\n order.demand?.ownerId || 'OPC 平台需求方',\n amount,\n new Date().toISOString().slice(0, 10),\n order.demand?.deadline || '',\n content,\n now,\n );\n insertProject.run(company.id, title, order.demand?.description || content, now);\n created += 1;\n }\n return { created, skipped, dbPath };\n } finally {\n db.close();\n }\n}\n\nfunction expandHome(value: string): string {\n if (value === '~') return os.homedir();\n if (value.startsWith('~/') || value.startsWith('~\\\\')) return path.join(os.homedir(), value.slice(2));\n return value;\n}\n\nfunction inferSkills(values: Array<string | undefined>): string[] {\n const text = values.filter(Boolean).join(' ').toLowerCase();\n const candidates = ['vue', 'react', 'node', 'python', 'java', 'ai', 'llm', 'crm', '财务', '法务', '后端', '前端'];\n const matched = candidates.filter((item) => text.includes(item.toLowerCase()));\n return matched.length ? matched : ['项目交付', 'OPC'];\n}\n\nfunction ensureMinimalOpcSchema(db: Database.Database): void {\n db.exec(`\n CREATE TABLE IF NOT EXISTS opc_companies (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL UNIQUE,\n address TEXT,\n business_type TEXT,\n founded_on TEXT,\n notes TEXT,\n created_at INTEGER NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS opc_contracts (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n company_id INTEGER,\n title TEXT NOT NULL,\n party TEXT,\n amount REAL,\n start_on TEXT,\n end_on TEXT,\n status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active','expired','terminated')),\n content TEXT,\n created_at INTEGER NOT NULL,\n FOREIGN KEY (company_id) REFERENCES opc_companies(id) ON DELETE SET NULL\n );\n\n CREATE TABLE IF NOT EXISTS opc_projects (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n company_id INTEGER,\n name TEXT NOT NULL,\n description TEXT,\n status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active','paused','done','archived')),\n created_at INTEGER NOT NULL,\n FOREIGN KEY (company_id) REFERENCES opc_companies(id) ON DELETE SET NULL\n );\n `);\n}\n","import type { ToolDefinition, ToolContext } from '@samp3ng/aster-core';\n\nimport { OpcPlatformClient } from './client.js';\nimport { readLocalOpcProfile, syncOrdersToLocalOpc, type PlatformOrderInput } from './local-opc.js';\n\nexport interface ToolFactoryOptions {\n getClient(): OpcPlatformClient;\n getOpcDbPath(): string | undefined;\n}\n\nexport function createOpcCloudTools(opts: ToolFactoryOptions): ToolDefinition[] {\n return [\n onboardTool(opts),\n findWorkTool(opts),\n applyToWorkTool(opts),\n registerAccountTool(opts),\n statsTool(opts),\n adminOverviewTool(opts),\n adminUsersTool(opts),\n listPoliciesTool(opts),\n publishTool(opts),\n updateSupplierTool(opts),\n searchSupplierTool(opts),\n getSupplierTool(opts),\n postDemandTool(opts),\n searchDemandTool(opts),\n getDemandTool(opts),\n startDemandChatTool(opts),\n applyTool(opts),\n listApplicationsTool(opts),\n reviewApplicationTool(opts),\n updateDemandStatusTool(opts),\n listOrdersTool(opts),\n updateOrderStatusTool(opts),\n listConversationsTool(opts),\n listMessagesTool(opts),\n sendChatMessageTool(opts),\n pullOrdersTool(opts),\n ];\n}\n\nfunction onboardTool(opts: ToolFactoryOptions): ToolDefinition {\n return {\n name: 'opc_platform_onboard',\n toolset: 'opc-cloud',\n description: 'Aster 一键入驻星环 OPC:读取本地 OPC 公司资料,生成注册账户和上架服务商主页计划;confirm:true 后执行。适合“帮我入驻/上架到星环 OPC”。',\n parameters: {\n type: 'object',\n properties: {\n name: { type: 'string', description: '平台账户名称,默认使用本地公司名或当前用户' },\n email: { type: 'string', description: '邮箱,可选' },\n role: { type: 'string', enum: ['user', 'admin'], description: '角色,默认 user' },\n companyName: { type: 'string', description: '公司名;不填则从本地 OPC 读取' },\n headline: { type: 'string', description: '一句话卖点' },\n summary: { type: 'string', description: '服务商简介' },\n skills: { type: 'array', items: { type: 'string' } },\n services: { type: 'array', items: { type: 'string' } },\n priceMin: { type: 'number' },\n priceMax: { type: 'number' },\n region: { type: 'string' },\n confirm: { type: 'boolean', default: false },\n },\n additionalProperties: true,\n },\n risk: 'medium',\n parallelSafe: false,\n async handler(args, ctx) {\n const local = readLocalOpcProfile(ctx.homeDir, opts.getOpcDbPath());\n const profile = compact({\n ownerId: ctx.userId || str(args.name) || 'local',\n ...local,\n ...args,\n visibility: 'published',\n });\n delete profile.confirm;\n delete profile.name;\n delete profile.email;\n delete profile.role;\n const account = compact({\n name: args.name || profile.companyName || ctx.userId || 'local',\n email: args.email,\n role: args.role,\n });\n if (!profile.companyName) {\n return '未找到可上架的 OPC 公司资料。请先在本地 OPC 注册公司,或传 companyName/summary/skills/services。';\n }\n if (!bool(args.confirm)) {\n return [\n '[dry-run] 将执行星环 OPC 一键入驻:',\n '',\n '1. 注册/复用平台账户:',\n JSON.stringify(account, null, 2),\n '',\n '2. 上架 OPC 服务商主页:',\n JSON.stringify(profile, null, 2),\n '',\n '确认后再次调用 opc_platform_onboard 并传 confirm:true。',\n ].join('\\n');\n }\n const registered = await opts.getClient().registerAccount(account);\n const supplier = await opts.getClient().createSupplier(profile);\n return `星环 OPC 入驻完成:\\n账户:\\n${JSON.stringify(registered, null, 2)}\\n\\n服务商主页:\\n${JSON.stringify(supplier, null, 2)}`;\n },\n };\n}\n\nfunction findWorkTool(opts: ToolFactoryOptions): ToolDefinition {\n return {\n name: 'opc_platform_find_work',\n toolset: 'opc-cloud',\n description: '基于本地 OPC 公司能力在星环 OPC 需求大厅找适合接的单,返回排序后的推荐原因。适合“帮我看看有什么单适合我”。',\n parameters: {\n type: 'object',\n properties: {\n query: { type: 'string', description: '额外关键词' },\n skills: { type: 'array', items: { type: 'string' }, description: '额外技能标签;不填则使用本地 OPC 技能' },\n category: { type: 'string', description: '需求类型:model/software/policy/resource/other' },\n limit: { type: 'number', description: '返回数量,默认 5' },\n },\n },\n risk: 'low',\n parallelSafe: true,\n async handler(args, ctx) {\n const local = readLocalOpcProfile(ctx.homeDir, opts.getOpcDbPath());\n const skills = unique([...list(local.skills), ...list(args.skills)]);\n const payload = await opts.getClient().searchDemands(str(args.query), skills, {\n status: 'open',\n category: str(args.category),\n });\n const demands = extractItems(payload);\n const ranked = demands\n .map((item) => scoreDemand(item, skills, str(args.query)))\n .sort((a, b) => b.score - a.score)\n .slice(0, Number(args.limit) > 0 ? Number(args.limit) : 5);\n return [\n `基于本地 OPC 能力推荐需求。识别到技能:${skills.length ? skills.join(', ') : '未识别,按开放需求排序'}`,\n '',\n JSON.stringify(ranked, null, 2),\n ].join('\\n');\n },\n };\n}\n\nfunction applyToWorkTool(opts: ToolFactoryOptions): ToolDefinition {\n return {\n name: 'opc_platform_apply_to_work',\n toolset: 'opc-cloud',\n description: 'Aster 接单工作流:读取本地 OPC 主页/按公司名匹配供应方,生成接单申请文案,confirm:true 后投递。适合“这个单我接了”。',\n parameters: {\n type: 'object',\n required: ['demandId'],\n properties: {\n demandId: { type: 'number', description: '需求 ID' },\n supplierId: { type: 'number', description: '供应方主页 ID;不填则尝试按本地公司名匹配' },\n message: { type: 'string', description: '接单申请说明;不填则自动生成' },\n contact: { type: 'string', description: '联系方式' },\n confirm: { type: 'boolean', default: false },\n },\n },\n risk: 'medium',\n parallelSafe: false,\n async handler(args, ctx) {\n const demandId = Number(args.demandId);\n if (!Number.isFinite(demandId)) return 'demandId 必须是数字。';\n const demand = await opts.getClient().getDemand(demandId);\n const local = readLocalOpcProfile(ctx.homeDir, opts.getOpcDbPath());\n const supplierId = Number.isFinite(Number(args.supplierId))\n ? Number(args.supplierId)\n : await findSupplierIdByLocalProfile(opts.getClient(), local);\n if (!Number.isFinite(supplierId)) {\n return '没有找到可用于接单的供应方主页。请先调用 opc_platform_onboard/opc_platform_publish 上架,或传 supplierId。';\n }\n const message = str(args.message) || buildApplyMessage(local, demand);\n const body = compact({ supplierId, message, contact: args.contact });\n if (!bool(args.confirm)) {\n return [\n `[dry-run] 将对需求 #${demandId} 发起接单申请:`,\n JSON.stringify(body, null, 2),\n '',\n '需求详情:',\n JSON.stringify(demand, null, 2),\n '',\n '确认后再次调用 opc_platform_apply_to_work 并传 confirm:true。',\n ].join('\\n');\n }\n const result = await opts.getClient().applyDemand(demandId, body);\n return `已提交接单申请:\\n${JSON.stringify(result, null, 2)}`;\n },\n };\n}\n\nfunction registerAccountTool(opts: ToolFactoryOptions): ToolDefinition {\n return {\n name: 'opc_platform_register_account',\n toolset: 'opc-cloud',\n description: '在星环 OPC 在线平台注册账户。默认 dry-run,confirm:true 才真注册。适合用户说“帮我在星环OPC注册账户”。',\n parameters: {\n type: 'object',\n required: ['name'],\n properties: {\n name: { type: 'string', description: '用户名称' },\n email: { type: 'string', description: '邮箱,可选' },\n role: { type: 'string', enum: ['user', 'admin'], description: '角色,默认 user' },\n confirm: { type: 'boolean', default: false },\n },\n },\n risk: 'medium',\n parallelSafe: false,\n async handler(args) {\n const body = compact({ name: args.name, email: args.email, role: args.role });\n if (!body.name) return '注册星环 OPC 账户至少需要 name。';\n if (!bool(args.confirm)) {\n return `[dry-run] 将注册星环 OPC 账户:\\n${JSON.stringify(body, null, 2)}\\n\\n确认后再次调用 opc_platform_register_account 并传 confirm:true。`;\n }\n const result = await opts.getClient().registerAccount(body);\n return `已注册星环 OPC 账户:\\n${JSON.stringify(result, null, 2)}`;\n },\n };\n}\n\nfunction statsTool(opts: ToolFactoryOptions): ToolDefinition {\n return {\n name: 'opc_platform_stats',\n toolset: 'opc-cloud',\n description: '查看 OPC 在线平台统计:企业、需求、申请、活跃订单数量。',\n parameters: { type: 'object', properties: {} },\n risk: 'low',\n parallelSafe: true,\n async handler() {\n const result = await opts.getClient().stats();\n return `OPC 平台统计:\\n${JSON.stringify(result, null, 2)}`;\n },\n };\n}\n\nfunction adminOverviewTool(opts: ToolFactoryOptions): ToolDefinition {\n return {\n name: 'opc_platform_admin_overview',\n toolset: 'opc-cloud',\n description: '查看星环 OPC 管理员概览:用户、企业、需求、申请、订单、会话和政策数量。',\n parameters: { type: 'object', properties: {} },\n risk: 'low',\n parallelSafe: true,\n async handler() {\n const result = await opts.getClient().adminOverview();\n return `星环 OPC 管理员概览:\\n${JSON.stringify(result, null, 2)}`;\n },\n };\n}\n\nfunction adminUsersTool(opts: ToolFactoryOptions): ToolDefinition {\n return {\n name: 'opc_platform_admin_users',\n toolset: 'opc-cloud',\n description: '列出星环 OPC 平台用户。',\n parameters: { type: 'object', properties: {} },\n risk: 'low',\n parallelSafe: true,\n async handler() {\n const result = await opts.getClient().listAdminUsers();\n return `星环 OPC 用户列表:\\n${JSON.stringify(result, null, 2)}`;\n },\n };\n}\n\nfunction listPoliciesTool(opts: ToolFactoryOptions): ToolDefinition {\n return {\n name: 'opc_platform_list_policies',\n toolset: 'opc-cloud',\n description: '查询星环 OPC 政策库,支持关键词和分类筛选。',\n parameters: {\n type: 'object',\n properties: {\n query: { type: 'string', description: '关键词' },\n category: { type: 'string', description: '分类,如 OPC 专项/落地参考' },\n },\n },\n risk: 'low',\n parallelSafe: true,\n async handler(args) {\n const result = await opts.getClient().listPolicies(str(args.query), str(args.category));\n return `星环 OPC 政策库:\\n${JSON.stringify(result, null, 2)}`;\n },\n };\n}\n\nfunction publishTool(opts: ToolFactoryOptions): ToolDefinition {\n return {\n name: 'opc_platform_publish',\n toolset: 'opc-cloud',\n description: [\n '把本地 OPC 公司资料发布到 OPC 广场。默认 confirm:false 只生成 dry-run 计划;',\n '用户确认后传 confirm:true 才真正创建线上供应方主页。',\n ].join(' '),\n parameters: {\n type: 'object',\n properties: {\n companyName: { type: 'string', description: '公司名;不填则尝试从本地 plugin-opc 读取' },\n headline: { type: 'string', description: '一句话卖点' },\n summary: { type: 'string', description: '公司简介' },\n skills: { type: 'array', items: { type: 'string' }, description: '技能标签' },\n services: { type: 'array', items: { type: 'string' }, description: '可提供服务' },\n priceMin: { type: 'number', description: '报价下限' },\n priceMax: { type: 'number', description: '报价上限' },\n region: { type: 'string', description: '地区' },\n confirm: { type: 'boolean', default: false, description: 'true 才真发布' },\n },\n additionalProperties: true,\n },\n risk: 'medium',\n parallelSafe: false,\n async handler(args, ctx) {\n const local = readLocalOpcProfile(ctx.homeDir, opts.getOpcDbPath());\n const body = compact({\n ownerId: ctx.userId || 'local',\n ...local,\n ...args,\n visibility: 'published',\n });\n delete body.confirm;\n if (!body.companyName) {\n return '未找到可发布的公司资料。请先用 opc_manage register_company 注册公司,或在本工具参数里提供 companyName / summary。';\n }\n if (!bool(args.confirm)) {\n return `[dry-run] 将发布 OPC 广场主页:\\n${JSON.stringify(body, null, 2)}\\n\\n确认后再次调用 opc_platform_publish 并传 confirm:true。`;\n }\n const result = await opts.getClient().createSupplier(body);\n return `已发布 OPC 广场主页:\\n${JSON.stringify(result, null, 2)}`;\n },\n };\n}\n\nfunction updateSupplierTool(opts: ToolFactoryOptions): ToolDefinition {\n return {\n name: 'opc_platform_update_supplier',\n toolset: 'opc-cloud',\n description: '更新 OPC 广场供应方主页。默认 dry-run,confirm:true 才真更新。',\n parameters: {\n type: 'object',\n required: ['supplierId'],\n properties: {\n supplierId: { type: 'number', description: '供应方主页 ID' },\n companyName: { type: 'string' },\n headline: { type: 'string' },\n summary: { type: 'string' },\n skills: { type: 'array', items: { type: 'string' } },\n services: { type: 'array', items: { type: 'string' } },\n priceMin: { type: 'number' },\n priceMax: { type: 'number' },\n region: { type: 'string' },\n visibility: { type: 'string', enum: ['draft', 'published'] },\n confirm: { type: 'boolean', default: false },\n },\n additionalProperties: true,\n },\n risk: 'medium',\n parallelSafe: false,\n async handler(args) {\n const supplierId = Number(args.supplierId);\n if (!Number.isFinite(supplierId)) return 'supplierId 必须是数字。';\n const body = compact({ ...args });\n delete body.supplierId;\n delete body.confirm;\n if (!bool(args.confirm)) {\n return `[dry-run] 将更新 OPC 供应方 #${supplierId}:\\n${JSON.stringify(body, null, 2)}\\n\\n确认后再次调用 opc_platform_update_supplier 并传 confirm:true。`;\n }\n const result = await opts.getClient().updateSupplier(supplierId, body);\n return `已更新 OPC 供应方主页:\\n${JSON.stringify(result, null, 2)}`;\n },\n };\n}\n\nfunction searchSupplierTool(opts: ToolFactoryOptions): ToolDefinition {\n return {\n name: 'opc_platform_search_supplier',\n toolset: 'opc-cloud',\n description: '在 OPC 广场按关键词和技能搜索供应方公司。',\n parameters: {\n type: 'object',\n properties: {\n query: { type: 'string', description: '关键词' },\n skills: { type: 'array', items: { type: 'string' }, description: '技能标签' },\n },\n },\n risk: 'low',\n parallelSafe: true,\n async handler(args) {\n const result = await opts.getClient().searchSuppliers(str(args.query), list(args.skills));\n return `OPC 供应方搜索结果:\\n${JSON.stringify(result, null, 2)}`;\n },\n };\n}\n\nfunction getSupplierTool(opts: ToolFactoryOptions): ToolDefinition {\n return {\n name: 'opc_platform_get_supplier',\n toolset: 'opc-cloud',\n description: '查看某个 OPC 广场供应方主页详情。',\n parameters: {\n type: 'object',\n required: ['supplierId'],\n properties: {\n supplierId: { type: 'number', description: '供应方主页 ID' },\n },\n },\n risk: 'low',\n parallelSafe: true,\n async handler(args) {\n const supplierId = Number(args.supplierId);\n if (!Number.isFinite(supplierId)) return 'supplierId 必须是数字。';\n const result = await opts.getClient().getSupplier(supplierId);\n return `OPC 供应方详情:\\n${JSON.stringify(result, null, 2)}`;\n },\n };\n}\n\nfunction postDemandTool(opts: ToolFactoryOptions): ToolDefinition {\n return {\n name: 'opc_platform_post_demand',\n toolset: 'opc-cloud',\n description: '发布 OPC 需求池需求。默认 dry-run,confirm:true 才真发布。',\n parameters: {\n type: 'object',\n required: ['title'],\n properties: {\n title: { type: 'string', description: '需求标题' },\n description: { type: 'string', description: '需求详情' },\n category: { type: 'string', description: '需求类型:model/software/policy/resource/other' },\n skills: { type: 'array', items: { type: 'string' }, description: '技能要求' },\n budgetMin: { type: 'number', description: '预算下限' },\n budgetMax: { type: 'number', description: '预算上限' },\n deadline: { type: 'string', description: '截止日期' },\n contact: { type: 'string', description: '联系方式' },\n confirm: { type: 'boolean', default: false },\n },\n additionalProperties: true,\n },\n risk: 'medium',\n parallelSafe: false,\n async handler(args, ctx) {\n const body = compact({ ownerId: ctx.userId || 'local', ...args });\n delete body.confirm;\n if (!body.title) return '发布需求至少需要 title。';\n if (!bool(args.confirm)) {\n return `[dry-run] 将发布 OPC 需求:\\n${JSON.stringify(body, null, 2)}\\n\\n确认后再次调用 opc_platform_post_demand 并传 confirm:true。`;\n }\n const result = await opts.getClient().createDemand(body);\n return `已发布 OPC 需求:\\n${JSON.stringify(result, null, 2)}`;\n },\n };\n}\n\nfunction searchDemandTool(opts: ToolFactoryOptions): ToolDefinition {\n return {\n name: 'opc_platform_search_demand',\n toolset: 'opc-cloud',\n description: '按关键词和技能搜索 OPC 需求池中的开放需求。',\n parameters: {\n type: 'object',\n properties: {\n query: { type: 'string', description: '关键词' },\n skills: { type: 'array', items: { type: 'string' }, description: '技能标签' },\n status: { type: 'string', description: '状态筛选:open/chatting/matched/closed/cancelled/accepted' },\n category: { type: 'string', description: '类型筛选:model/software/policy/resource/other' },\n },\n },\n risk: 'low',\n parallelSafe: true,\n async handler(args) {\n const result = await opts.getClient().searchDemands(str(args.query), list(args.skills), {\n status: str(args.status),\n category: str(args.category),\n });\n return `OPC 需求搜索结果:\\n${JSON.stringify(result, null, 2)}`;\n },\n };\n}\n\nfunction getDemandTool(opts: ToolFactoryOptions): ToolDefinition {\n return {\n name: 'opc_platform_get_demand',\n toolset: 'opc-cloud',\n description: '查看某个 OPC 需求详情,包含申请数量和已接受数量。',\n parameters: {\n type: 'object',\n required: ['demandId'],\n properties: {\n demandId: { type: 'number', description: '需求 ID' },\n },\n },\n risk: 'low',\n parallelSafe: true,\n async handler(args) {\n const demandId = Number(args.demandId);\n if (!Number.isFinite(demandId)) return 'demandId 必须是数字。';\n const result = await opts.getClient().getDemand(demandId);\n return `OPC 需求详情:\\n${JSON.stringify(result, null, 2)}`;\n },\n };\n}\n\nfunction startDemandChatTool(opts: ToolFactoryOptions): ToolDefinition {\n return {\n name: 'opc_platform_start_demand_chat',\n toolset: 'opc-cloud',\n description: '围绕某个 OPC 需求发起私聊会话。默认 dry-run,confirm:true 才真创建会话。',\n parameters: {\n type: 'object',\n required: ['demandId', 'userId'],\n properties: {\n demandId: { type: 'number', description: '需求 ID' },\n userId: { type: 'string', description: '发起人 ID/名称' },\n supplierId: { type: 'number', description: '可选供应方主页 ID' },\n confirm: { type: 'boolean', default: false },\n },\n },\n risk: 'medium',\n parallelSafe: false,\n async handler(args) {\n const demandId = Number(args.demandId);\n if (!Number.isFinite(demandId)) return 'demandId 必须是数字。';\n const body = compact({ userId: args.userId, supplierId: args.supplierId });\n if (!body.userId) return '发起私聊需要 userId。';\n if (!bool(args.confirm)) {\n return `[dry-run] 将围绕需求 #${demandId} 创建私聊:\\n${JSON.stringify(body, null, 2)}\\n\\n确认后再次调用 opc_platform_start_demand_chat 并传 confirm:true。`;\n }\n const result = await opts.getClient().startDemandChat(demandId, body);\n return `已创建 OPC 私聊会话:\\n${JSON.stringify(result, null, 2)}`;\n },\n };\n}\n\nfunction applyTool(opts: ToolFactoryOptions): ToolDefinition {\n return {\n name: 'opc_platform_apply',\n toolset: 'opc-cloud',\n description: '对某个 OPC 需求发起接单申请。默认 dry-run,confirm:true 才真投递。',\n parameters: {\n type: 'object',\n required: ['demandId', 'supplierId'],\n properties: {\n demandId: { type: 'number', description: '需求 ID' },\n supplierId: { type: 'number', description: '供应方主页 ID' },\n message: { type: 'string', description: '申请说明' },\n contact: { type: 'string', description: '联系方式' },\n confirm: { type: 'boolean', default: false },\n },\n },\n risk: 'medium',\n parallelSafe: false,\n async handler(args) {\n const demandId = Number(args.demandId);\n const supplierId = Number(args.supplierId);\n const body = { supplierId, message: str(args.message), contact: str(args.contact) };\n if (!Number.isFinite(demandId) || !Number.isFinite(supplierId)) return 'demandId 和 supplierId 必须是数字。';\n if (!bool(args.confirm)) {\n return `[dry-run] 将对需求 #${demandId} 使用供应方 #${supplierId} 发起接单申请:\\n${JSON.stringify(body, null, 2)}\\n\\n确认后再次调用 opc_platform_apply 并传 confirm:true。`;\n }\n const result = await opts.getClient().applyDemand(demandId, body);\n return `已提交接单申请:\\n${JSON.stringify(result, null, 2)}`;\n },\n };\n}\n\nfunction listApplicationsTool(opts: ToolFactoryOptions): ToolDefinition {\n return {\n name: 'opc_platform_list_applications',\n toolset: 'opc-cloud',\n description: '列出某个 OPC 需求的接单申请,包含供应方主页信息。',\n parameters: {\n type: 'object',\n required: ['demandId'],\n properties: {\n demandId: { type: 'number', description: '需求 ID' },\n },\n },\n risk: 'low',\n parallelSafe: true,\n async handler(args) {\n const demandId = Number(args.demandId);\n if (!Number.isFinite(demandId)) return 'demandId 必须是数字。';\n const result = await opts.getClient().listApplications(demandId);\n return `OPC 需求 #${demandId} 的接单申请:\\n${JSON.stringify(result, null, 2)}`;\n },\n };\n}\n\nfunction reviewApplicationTool(opts: ToolFactoryOptions): ToolDefinition {\n return {\n name: 'opc_platform_review_application',\n toolset: 'opc-cloud',\n description: '接受或拒绝某个 OPC 需求的接单申请。默认 dry-run,confirm:true 才真操作。',\n parameters: {\n type: 'object',\n required: ['demandId', 'applicationId', 'action'],\n properties: {\n demandId: { type: 'number', description: '需求 ID' },\n applicationId: { type: 'number', description: '申请 ID' },\n action: { type: 'string', enum: ['accept', 'reject'], description: 'accept 接受 / reject 拒绝' },\n confirm: { type: 'boolean', default: false },\n },\n },\n risk: 'medium',\n parallelSafe: false,\n async handler(args) {\n const demandId = Number(args.demandId);\n const applicationId = Number(args.applicationId);\n const action = str(args.action);\n if (!Number.isFinite(demandId) || !Number.isFinite(applicationId)) return 'demandId 和 applicationId 必须是数字。';\n if (action !== 'accept' && action !== 'reject') return 'action 必须是 accept 或 reject。';\n if (!bool(args.confirm)) {\n return `[dry-run] 将对需求 #${demandId} 的申请 #${applicationId} 执行 ${action}。\\n\\n确认后再次调用 opc_platform_review_application 并传 confirm:true。`;\n }\n const result = await opts.getClient().reviewApplication(demandId, applicationId, action);\n return `已处理 OPC 接单申请:\\n${JSON.stringify(result, null, 2)}`;\n },\n };\n}\n\nfunction updateDemandStatusTool(opts: ToolFactoryOptions): ToolDefinition {\n return {\n name: 'opc_platform_update_demand_status',\n toolset: 'opc-cloud',\n description: '更新 OPC 需求状态(open/chatting/matched/closed/cancelled)。默认 dry-run,confirm:true 才真操作。',\n parameters: {\n type: 'object',\n required: ['demandId', 'status'],\n properties: {\n demandId: { type: 'number', description: '需求 ID' },\n status: { type: 'string', enum: ['open', 'chatting', 'matched', 'closed', 'cancelled'] },\n confirm: { type: 'boolean', default: false },\n },\n },\n risk: 'medium',\n parallelSafe: false,\n async handler(args) {\n const demandId = Number(args.demandId);\n const status = str(args.status);\n if (!Number.isFinite(demandId)) return 'demandId 必须是数字。';\n if (!['open', 'chatting', 'matched', 'closed', 'cancelled'].includes(status)) return 'status 必须是 open/chatting/matched/closed/cancelled。';\n if (!bool(args.confirm)) {\n return `[dry-run] 将把 OPC 需求 #${demandId} 状态改为 ${status}。\\n\\n确认后再次调用 opc_platform_update_demand_status 并传 confirm:true。`;\n }\n const result = await opts.getClient().updateDemandStatus(demandId, status);\n return `已更新 OPC 需求状态:\\n${JSON.stringify(result, null, 2)}`;\n },\n };\n}\n\nfunction listOrdersTool(opts: ToolFactoryOptions): ToolDefinition {\n return {\n name: 'opc_platform_list_orders',\n toolset: 'opc-cloud',\n description: '列出 OPC 在线平台订单。',\n parameters: { type: 'object', properties: {} },\n risk: 'low',\n parallelSafe: true,\n async handler() {\n const result = await opts.getClient().listOrders();\n return `OPC 平台订单:\\n${JSON.stringify(result, null, 2)}`;\n },\n };\n}\n\nfunction updateOrderStatusTool(opts: ToolFactoryOptions): ToolDefinition {\n return {\n name: 'opc_platform_update_order_status',\n toolset: 'opc-cloud',\n description: '更新 OPC 在线平台订单状态(pending/active/completed/cancelled)。默认 dry-run,confirm:true 才真操作。',\n parameters: {\n type: 'object',\n required: ['orderId', 'status'],\n properties: {\n orderId: { type: 'number', description: '订单 ID' },\n status: { type: 'string', enum: ['pending', 'active', 'completed', 'cancelled'] },\n confirm: { type: 'boolean', default: false },\n },\n },\n risk: 'medium',\n parallelSafe: false,\n async handler(args) {\n const orderId = Number(args.orderId);\n const status = str(args.status);\n if (!Number.isFinite(orderId)) return 'orderId 必须是数字。';\n if (!['pending', 'active', 'completed', 'cancelled'].includes(status)) return 'status 必须是 pending/active/completed/cancelled。';\n if (!bool(args.confirm)) {\n return `[dry-run] 将把 OPC 订单 #${orderId} 状态改为 ${status}。\\n\\n确认后再次调用 opc_platform_update_order_status 并传 confirm:true。`;\n }\n const result = await opts.getClient().updateOrderStatus(orderId, status);\n return `已更新 OPC 订单状态:\\n${JSON.stringify(result, null, 2)}`;\n },\n };\n}\n\nfunction listConversationsTool(opts: ToolFactoryOptions): ToolDefinition {\n return {\n name: 'opc_platform_list_conversations',\n toolset: 'opc-cloud',\n description: '列出星环 OPC 私聊会话,可按 userId 筛选。',\n parameters: {\n type: 'object',\n properties: {\n userId: { type: 'string', description: '用户 ID/名称,可选' },\n },\n },\n risk: 'low',\n parallelSafe: true,\n async handler(args) {\n const result = await opts.getClient().listConversations(str(args.userId));\n return `星环 OPC 私聊会话:\\n${JSON.stringify(result, null, 2)}`;\n },\n };\n}\n\nfunction listMessagesTool(opts: ToolFactoryOptions): ToolDefinition {\n return {\n name: 'opc_platform_list_messages',\n toolset: 'opc-cloud',\n description: '查看星环 OPC 私聊会话消息。适合用户说“看看这个 OPC 会话聊了什么”。',\n parameters: {\n type: 'object',\n required: ['conversationId'],\n properties: {\n conversationId: { type: 'number', description: '会话 ID' },\n },\n },\n risk: 'low',\n parallelSafe: true,\n async handler(args) {\n const conversationId = Number(args.conversationId);\n if (!Number.isFinite(conversationId)) return 'conversationId 必须是数字。';\n const result = await opts.getClient().listMessages(conversationId);\n return `星环 OPC 私聊 #${conversationId} 消息:\\n${JSON.stringify(result, null, 2)}`;\n },\n };\n}\n\nfunction sendChatMessageTool(opts: ToolFactoryOptions): ToolDefinition {\n return {\n name: 'opc_platform_send_chat_message',\n toolset: 'opc-cloud',\n description: '向星环 OPC 私聊会话发送消息。默认 dry-run,confirm:true 才真发送。',\n parameters: {\n type: 'object',\n required: ['conversationId', 'senderId', 'content'],\n properties: {\n conversationId: { type: 'number', description: '会话 ID' },\n senderId: { type: 'string', description: '发送人 ID/名称' },\n content: { type: 'string', description: '消息内容' },\n confirm: { type: 'boolean', default: false },\n },\n },\n risk: 'medium',\n parallelSafe: false,\n async handler(args) {\n const conversationId = Number(args.conversationId);\n const body = compact({ senderId: args.senderId, content: args.content });\n if (!Number.isFinite(conversationId)) return 'conversationId 必须是数字。';\n if (!body.senderId || !body.content) return '发送消息需要 senderId 和 content。';\n if (!bool(args.confirm)) {\n return `[dry-run] 将向 OPC 私聊 #${conversationId} 发送消息:\\n${JSON.stringify(body, null, 2)}\\n\\n确认后再次调用 opc_platform_send_chat_message 并传 confirm:true。`;\n }\n const result = await opts.getClient().sendMessage(conversationId, body);\n return `已发送 OPC 私聊消息:\\n${JSON.stringify(result, null, 2)}`;\n },\n };\n}\n\nfunction pullOrdersTool(opts: ToolFactoryOptions): ToolDefinition {\n return {\n name: 'opc_platform_pull_orders',\n toolset: 'opc-cloud',\n description: '把 OPC 在线平台订单回流到本地 plugin-opc 数据库,创建对应合同和项目。默认 dry-run,confirm:true 才写本地数据库。',\n parameters: {\n type: 'object',\n properties: {\n confirm: { type: 'boolean', default: false },\n },\n },\n risk: 'medium',\n parallelSafe: false,\n async handler(args, ctx: ToolContext) {\n const payload = await opts.getClient().listOrders();\n const orders = extractOrders(payload);\n if (!bool(args.confirm)) {\n return `[dry-run] 将把 ${orders.length} 个 OPC 平台订单回流到本地 OPC 数据库:\\n${JSON.stringify(orders, null, 2)}\\n\\n确认后再次调用 opc_platform_pull_orders 并传 confirm:true。`;\n }\n const result = syncOrdersToLocalOpc(ctx.homeDir, orders, opts.getOpcDbPath());\n return `已回流 OPC 平台订单: 新建 ${result.created} 个,跳过 ${result.skipped} 个。\\n数据库: ${result.dbPath}`;\n },\n };\n}\n\nfunction bool(value: unknown): boolean {\n return value === true || value === 'true';\n}\n\nfunction str(value: unknown): string {\n return typeof value === 'string' ? value.trim() : '';\n}\n\nfunction list(value: unknown): string[] {\n if (Array.isArray(value)) return value.map((item) => String(item).trim()).filter(Boolean);\n if (typeof value === 'string') return value.split(',').map((item) => item.trim()).filter(Boolean);\n return [];\n}\n\nfunction compact(input: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(input)) {\n if (value === undefined || value === null || value === '') continue;\n if (Array.isArray(value) && value.length === 0) continue;\n out[key] = value;\n }\n return out;\n}\n\nfunction extractOrders(payload: unknown): PlatformOrderInput[] {\n if (!payload || typeof payload !== 'object') return [];\n const items = (payload as { items?: unknown }).items;\n if (!Array.isArray(items)) return [];\n return items.map((item) => item as PlatformOrderInput).filter((item) => Number.isFinite(Number(item.id)));\n}\n\nfunction extractItems(payload: unknown): Array<Record<string, unknown>> {\n if (!payload || typeof payload !== 'object') return [];\n const items = (payload as { items?: unknown }).items;\n return Array.isArray(items) ? items.filter((item): item is Record<string, unknown> => Boolean(item) && typeof item === 'object') : [];\n}\n\nfunction unique(values: string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const value of values) {\n const clean = value.trim();\n const key = clean.toLowerCase();\n if (!clean || seen.has(key)) continue;\n seen.add(key);\n out.push(clean);\n }\n return out;\n}\n\nfunction scoreDemand(item: Record<string, unknown>, skills: string[], query: string): Record<string, unknown> {\n const demandSkills = list(item.skills);\n const text = JSON.stringify(item).toLowerCase();\n const matchedSkills = skills.filter((skill) => demandSkills.some((itemSkill) => itemSkill.toLowerCase() === skill.toLowerCase()) || text.includes(skill.toLowerCase()));\n const queryHit = query ? text.includes(query.toLowerCase()) : false;\n const budgetMax = Number((item as { budgetMax?: unknown }).budgetMax || 0);\n const score = matchedSkills.length * 20 + (queryHit ? 10 : 0) + (budgetMax > 0 ? Math.min(10, Math.round(budgetMax / 1000)) : 0);\n return {\n id: item.id,\n title: item.title,\n category: item.category,\n status: item.status,\n budgetMin: item.budgetMin,\n budgetMax: item.budgetMax,\n deadline: item.deadline,\n skills: demandSkills,\n score,\n reason: matchedSkills.length\n ? `匹配技能:${matchedSkills.join(', ')}`\n : '未命中明确技能,可进一步查看需求详情判断资源匹配度',\n };\n}\n\nasync function findSupplierIdByLocalProfile(client: OpcPlatformClient, local: Partial<ReturnType<typeof readLocalOpcProfile>>): Promise<number> {\n const companyName = str(local.companyName);\n if (!companyName) return NaN;\n const payload = await client.searchSuppliers(companyName, []);\n const items = extractItems(payload);\n const exact = items.find((item) => str(item.companyName) === companyName) || items[0];\n return Number(exact?.id);\n}\n\nfunction buildApplyMessage(local: Partial<ReturnType<typeof readLocalOpcProfile>>, demandPayload: unknown): string {\n const demand = demandPayload && typeof demandPayload === 'object' ? demandPayload as Record<string, unknown> : {};\n const skills = list(local.skills);\n const services = list(local.services);\n return [\n `你好,我是${local.companyName || 'OPC 服务商'},想接这个需求。`,\n skills.length ? `我的匹配能力:${skills.join('、')}。` : '',\n services.length ? `可提供服务:${services.join('、')}。` : '',\n demand.title ? `针对「${String(demand.title)}」可以先沟通交付范围、周期和验收口径。` : '可以先沟通交付范围、周期和验收口径。',\n ].filter(Boolean).join('\\n');\n}\n","import type { PluginContext, StellarPlugin, ToolDefinition } from '@samp3ng/aster-core';\n\nimport { OpcPlatformClient } from './client.js';\nimport { OPC_CLOUD_SYSTEM_PROMPT } from './prompts.js';\nimport { createOpcCloudTools } from './tools.js';\n\nconst VERSION = '0.1.0';\n\nclass OpcCloudPlugin implements StellarPlugin {\n readonly name = 'opc-cloud';\n readonly version = VERSION;\n readonly description = '星环 OPC 供需聚合插件(入驻、上架、找单、发单、接单、私聊和订单回流)';\n\n private client = new OpcPlatformClient({ baseUrl: 'http://127.0.0.1:8787/api' });\n private opcDbPath: string | undefined;\n\n async initialize(ctx: PluginContext): Promise<void> {\n const baseUrl = typeof ctx.config.baseUrl === 'string' && ctx.config.baseUrl.trim()\n ? ctx.config.baseUrl.trim()\n : 'http://127.0.0.1:8787/api';\n this.opcDbPath = typeof ctx.config.opcDbPath === 'string' ? ctx.config.opcDbPath : undefined;\n this.client = new OpcPlatformClient({ baseUrl });\n ctx.logger.info(`[opc-cloud] 已连接 OPC 平台 API: ${baseUrl}`);\n }\n\n getTools(): ToolDefinition[] {\n return createOpcCloudTools({\n getClient: () => this.client,\n getOpcDbPath: () => this.opcDbPath,\n });\n }\n\n getSystemPromptBlock(): string {\n return OPC_CLOUD_SYSTEM_PROMPT;\n }\n}\n\nconst plugin = new OpcCloudPlugin();\nexport default plugin;\nexport { OpcCloudPlugin };\n"],"mappings":";AAIO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAA6B,QAAwB;AAAxB;AAAA,EAAyB;AAAA,EAAzB;AAAA,EAE7B,MAAM,SAA2B;AAC/B,WAAO,KAAK,QAAQ,SAAS;AAAA,EAC/B;AAAA,EAEA,MAAM,QAA0B;AAC9B,WAAO,KAAK,QAAQ,QAAQ;AAAA,EAC9B;AAAA,EAEA,MAAM,gBAAgB,MAAiD;AACrE,WAAO,KAAK,QAAQ,kBAAkB,EAAE,QAAQ,QAAQ,KAAK,CAAC;AAAA,EAChE;AAAA,EAEA,MAAM,gBAAkC;AACtC,WAAO,KAAK,QAAQ,iBAAiB;AAAA,EACvC;AAAA,EAEA,MAAM,iBAAmC;AACvC,WAAO,KAAK,QAAQ,cAAc;AAAA,EACpC;AAAA,EAEA,MAAM,aAAa,QAAQ,IAAI,WAAW,IAAsB;AAC9D,WAAO,KAAK,QAAQ,aAAa,QAAQ,EAAE,GAAG,OAAO,SAAS,CAAC,CAAC,EAAE;AAAA,EACpE;AAAA,EAEA,MAAM,eAAe,MAAiD;AACpE,WAAO,KAAK,QAAQ,cAAc,EAAE,QAAQ,QAAQ,KAAK,CAAC;AAAA,EAC5D;AAAA,EAEA,MAAM,gBAAgB,OAAe,QAAoC;AACvE,WAAO,KAAK,QAAQ,cAAc,QAAQ,EAAE,GAAG,OAAO,QAAQ,OAAO,KAAK,GAAG,EAAE,CAAC,CAAC,EAAE;AAAA,EACrF;AAAA,EAEA,MAAM,YAAY,IAA8B;AAC9C,WAAO,KAAK,QAAQ,cAAc,mBAAmB,OAAO,EAAE,CAAC,CAAC,EAAE;AAAA,EACpE;AAAA,EAEA,MAAM,eAAe,IAAY,MAAiD;AAChF,WAAO,KAAK,QAAQ,cAAc,mBAAmB,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,OAAO,KAAK,CAAC;AAAA,EAC7F;AAAA,EAEA,MAAM,aAAa,MAAiD;AAClE,WAAO,KAAK,QAAQ,YAAY,EAAE,QAAQ,QAAQ,KAAK,CAAC;AAAA,EAC1D;AAAA,EAEA,MAAM,cAAc,OAAe,QAAkB,OAA+C,CAAC,GAAqB;AACxH,WAAO,KAAK,QAAQ,YAAY,QAAQ,EAAE,GAAG,OAAO,QAAQ,OAAO,KAAK,GAAG,GAAG,QAAQ,KAAK,UAAU,IAAI,UAAU,KAAK,YAAY,GAAG,CAAC,CAAC,EAAE;AAAA,EAC7I;AAAA,EAEA,MAAM,UAAU,IAA8B;AAC5C,WAAO,KAAK,QAAQ,YAAY,mBAAmB,OAAO,EAAE,CAAC,CAAC,EAAE;AAAA,EAClE;AAAA,EAEA,MAAM,mBAAmB,IAAY,QAAkC;AACrE,WAAO,KAAK,QAAQ,YAAY,mBAAmB,OAAO,EAAE,CAAC,CAAC,WAAW;AAAA,MACvE,QAAQ;AAAA,MACR,MAAM,EAAE,OAAO;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,gBAAgB,UAAkB,MAAiD;AACvF,WAAO,KAAK,QAAQ,YAAY,mBAAmB,OAAO,QAAQ,CAAC,CAAC,SAAS;AAAA,MAC3E,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,UAAkB,MAAiD;AACnF,WAAO,KAAK,QAAQ,YAAY,mBAAmB,OAAO,QAAQ,CAAC,CAAC,iBAAiB;AAAA,MACnF,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,iBAAiB,UAAoC;AACzD,WAAO,KAAK,QAAQ,YAAY,mBAAmB,OAAO,QAAQ,CAAC,CAAC,eAAe;AAAA,EACrF;AAAA,EAEA,MAAM,kBAAkB,UAAkB,eAAuB,QAAkC;AACjG,WAAO,KAAK,QAAQ,YAAY,mBAAmB,OAAO,QAAQ,CAAC,CAAC,iBAAiB,mBAAmB,OAAO,aAAa,CAAC,CAAC,IAAI;AAAA,MAChI,QAAQ;AAAA,MACR,MAAM,EAAE,OAAO;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,kBAAkB,SAAS,IAAsB;AACrD,WAAO,KAAK,QAAQ,kBAAkB,QAAQ,EAAE,OAAO,CAAC,CAAC,EAAE;AAAA,EAC7D;AAAA,EAEA,MAAM,YAAY,gBAAwB,MAAiD;AACzF,WAAO,KAAK,QAAQ,kBAAkB,mBAAmB,OAAO,cAAc,CAAC,CAAC,aAAa;AAAA,MAC3F,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,gBAA0C;AAC3D,WAAO,KAAK,QAAQ,kBAAkB,mBAAmB,OAAO,cAAc,CAAC,CAAC,WAAW;AAAA,EAC7F;AAAA,EAEA,MAAM,aAA+B;AACnC,WAAO,KAAK,QAAQ,SAAS;AAAA,EAC/B;AAAA,EAEA,MAAM,kBAAkB,IAAY,QAAkC;AACpE,WAAO,KAAK,QAAQ,WAAW,mBAAmB,OAAO,EAAE,CAAC,CAAC,WAAW;AAAA,MACtE,QAAQ;AAAA,MACR,MAAM,EAAE,OAAO;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,QAAQA,OAAc,OAA4C,CAAC,GAAqB;AACpG,UAAM,OAAO,KAAK,OAAO,QAAQ,QAAQ,QAAQ,EAAE;AACnD,UAAM,MAAM,MAAM,MAAM,GAAG,IAAI,GAAGA,KAAI,IAAI;AAAA,MACxC,QAAQ,KAAK,UAAU;AAAA,MACvB,SAAS,KAAK,SAAS,SAAY,SAAY,EAAE,gBAAgB,mBAAmB;AAAA,MACpF,MAAM,KAAK,SAAS,SAAY,SAAY,KAAK,UAAU,KAAK,IAAI;AAAA,IACtE,CAAC;AACD,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAI,OAAgB;AACpB,QAAI;AACF,aAAO,OAAO,KAAK,MAAM,IAAI,IAAI;AAAA,IACnC,QAAQ;AAAA,IAER;AACA,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,UAAU,OAAO,SAAS,YAAY,QAAQ,aAAa,OAC7D,OAAQ,KAA+B,OAAO,IAC9C;AACJ,YAAM,IAAI,MAAM,oBAAoB,IAAI,MAAM,KAAK,OAAO,EAAE;AAAA,IAC9D;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,QAAQ,QAAwC;AACvD,QAAM,IAAI,IAAI,gBAAgB;AAC9B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,MAAO,GAAE,IAAI,KAAK,KAAK;AAAA,EAC7B;AACA,SAAO,EAAE,SAAS;AACpB;;;ACnJO,IAAM,0BAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;;;ACnBX,OAAO,QAAQ;AACf,OAAO,QAAQ;AACf,OAAO,UAAU;AAEjB,OAAO,cAAc;AA2Bd,SAAS,oBAAoB,SAAiB,kBAAqD;AACxG,QAAM,SAAS,WAAW,oBAAoB,KAAK,KAAK,SAAS,WAAW,OAAO,QAAQ,CAAC;AAC5F,MAAI,CAAC,GAAG,WAAW,MAAM,EAAG,QAAO,CAAC;AACpC,QAAM,KAAK,IAAI,SAAS,QAAQ,EAAE,UAAU,MAAM,eAAe,KAAK,CAAC;AACvE,MAAI;AACF,UAAM,UAAU,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,KAK1B,EAAE,IAAI;AACP,UAAM,WAAW,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,KAK3B,EAAE,IAAI;AACP,UAAM,YAAY,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,KAK5B,EAAE,IAAI;AAEP,QAAI,CAAC,SAAS,KAAM,QAAO,CAAC;AAC5B,UAAM,SAAS,YAAY,CAAC,QAAQ,eAAe,QAAQ,OAAO,GAAG,SAAS,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;AACvH,UAAM,WAAW,CAAC,QAAQ,iBAAiB,kBAAQ,EAAE,OAAO,OAAO;AACnE,WAAO;AAAA,MACL,aAAa,QAAQ;AAAA,MACrB,UAAU,GAAG,QAAQ,IAAI,SAAM,QAAQ,iBAAiB,4CAAS;AAAA,MACjE,SAAS,QAAQ,SAAS,gBAAM,QAAQ,iBAAiB,sFAAgB;AAAA,MACzE;AAAA,MACA;AAAA,MACA,WAAW;AAAA,QACT,GAAG,SAAS,IAAI,CAAC,UAAU,EAAE,OAAO,KAAK,QAAQ,gBAAM,aAAa,KAAK,eAAe,KAAK,UAAU,GAAG,EAAE;AAAA,QAC5G,GAAG,UAAU,IAAI,CAAC,UAAU,EAAE,OAAO,KAAK,SAAS,gBAAM,aAAa,KAAK,SAAS,GAAG,EAAE;AAAA,MAC3F,EAAE,OAAO,CAAC,SAAS,KAAK,KAAK;AAAA,IAC/B;AAAA,EACF,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;AAEO,SAAS,qBACd,SACA,QACA,kBACsD;AACtD,QAAM,SAAS,WAAW,oBAAoB,KAAK,KAAK,SAAS,WAAW,OAAO,QAAQ,CAAC;AAC5F,KAAG,UAAU,KAAK,QAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AACtD,QAAM,KAAK,IAAI,SAAS,MAAM;AAC9B,MAAI;AACF,2BAAuB,EAAE;AACzB,QAAI,UAAU;AACd,QAAI,UAAU;AACd,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,cAAc,GAAG,QAAQ,uDAAuD;AACtF,UAAM,gBAAgB,GAAG,QAAQ;AAAA;AAAA;AAAA,KAGhC;AACD,QAAI,UAAU,YAAY,IAAI;AAC9B,QAAI,CAAC,SAAS;AACZ,YAAM,SAAS,cAAc,IAAI,4CAAc,GAAG;AAClD,gBAAU,EAAE,IAAI,OAAO,OAAO,eAAe,EAAE;AAAA,IACjD;AAEA,UAAM,iBAAiB,GAAG,QAAQ,sDAAsD;AACxF,UAAM,iBAAiB,GAAG,QAAQ;AAAA;AAAA;AAAA,KAGjC;AACD,UAAM,gBAAgB,GAAG,QAAQ;AAAA;AAAA;AAAA,KAGhC;AAED,eAAW,SAAS,QAAQ;AAC1B,YAAM,QAAQ,QAAQ,MAAM,EAAE,KAAK,MAAM,QAAQ,SAAS,0BAAM;AAChE,UAAI,eAAe,IAAI,KAAK,GAAG;AAC7B,mBAAW;AACX;AAAA,MACF;AACA,YAAM,SAAS,MAAM,QAAQ,aAAa,MAAM,QAAQ,aAAa;AACrE,YAAM,UAAU;AAAA,QACd,gCAAY,MAAM,EAAE;AAAA,QACpB,iBAAO,MAAM,UAAU,SAAS;AAAA,QAChC,iBAAO,MAAM,QAAQ,SAAS,EAAE;AAAA,QAChC,iBAAO,MAAM,QAAQ,eAAe,EAAE;AAAA,QACtC,uBAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,MAC3C,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AAC3B,qBAAe;AAAA,QACb,QAAQ;AAAA,QACR;AAAA,QACA,MAAM,QAAQ,WAAW;AAAA,QACzB;AAAA,SACA,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,QACpC,MAAM,QAAQ,YAAY;AAAA,QAC1B;AAAA,QACA;AAAA,MACF;AACA,oBAAc,IAAI,QAAQ,IAAI,OAAO,MAAM,QAAQ,eAAe,SAAS,GAAG;AAC9E,iBAAW;AAAA,IACb;AACA,WAAO,EAAE,SAAS,SAAS,OAAO;AAAA,EACpC,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;AAEA,SAAS,WAAW,OAAuB;AACzC,MAAI,UAAU,IAAK,QAAO,GAAG,QAAQ;AACrC,MAAI,MAAM,WAAW,IAAI,KAAK,MAAM,WAAW,KAAK,EAAG,QAAO,KAAK,KAAK,GAAG,QAAQ,GAAG,MAAM,MAAM,CAAC,CAAC;AACpG,SAAO;AACT;AAEA,SAAS,YAAY,QAA6C;AAChE,QAAM,OAAO,OAAO,OAAO,OAAO,EAAE,KAAK,GAAG,EAAE,YAAY;AAC1D,QAAM,aAAa,CAAC,OAAO,SAAS,QAAQ,UAAU,QAAQ,MAAM,OAAO,OAAO,gBAAM,gBAAM,gBAAM,cAAI;AACxG,QAAM,UAAU,WAAW,OAAO,CAAC,SAAS,KAAK,SAAS,KAAK,YAAY,CAAC,CAAC;AAC7E,SAAO,QAAQ,SAAS,UAAU,CAAC,4BAAQ,KAAK;AAClD;AAEA,SAAS,uBAAuB,IAA6B;AAC3D,KAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAkCP;AACH;;;ACpLO,SAAS,oBAAoB,MAA4C;AAC9E,SAAO;AAAA,IACL,YAAY,IAAI;AAAA,IAChB,aAAa,IAAI;AAAA,IACjB,gBAAgB,IAAI;AAAA,IACpB,oBAAoB,IAAI;AAAA,IACxB,UAAU,IAAI;AAAA,IACd,kBAAkB,IAAI;AAAA,IACtB,eAAe,IAAI;AAAA,IACnB,iBAAiB,IAAI;AAAA,IACrB,YAAY,IAAI;AAAA,IAChB,mBAAmB,IAAI;AAAA,IACvB,mBAAmB,IAAI;AAAA,IACvB,gBAAgB,IAAI;AAAA,IACpB,eAAe,IAAI;AAAA,IACnB,iBAAiB,IAAI;AAAA,IACrB,cAAc,IAAI;AAAA,IAClB,oBAAoB,IAAI;AAAA,IACxB,UAAU,IAAI;AAAA,IACd,qBAAqB,IAAI;AAAA,IACzB,sBAAsB,IAAI;AAAA,IAC1B,uBAAuB,IAAI;AAAA,IAC3B,eAAe,IAAI;AAAA,IACnB,sBAAsB,IAAI;AAAA,IAC1B,sBAAsB,IAAI;AAAA,IAC1B,iBAAiB,IAAI;AAAA,IACrB,oBAAoB,IAAI;AAAA,IACxB,eAAe,IAAI;AAAA,EACrB;AACF;AAEA,SAAS,YAAY,MAA0C;AAC7D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,MAAM,EAAE,MAAM,UAAU,aAAa,4HAAwB;AAAA,QAC7D,OAAO,EAAE,MAAM,UAAU,aAAa,4BAAQ;AAAA,QAC9C,MAAM,EAAE,MAAM,UAAU,MAAM,CAAC,QAAQ,OAAO,GAAG,aAAa,iCAAa;AAAA,QAC3E,aAAa,EAAE,MAAM,UAAU,aAAa,2EAAoB;AAAA,QAChE,UAAU,EAAE,MAAM,UAAU,aAAa,iCAAQ;AAAA,QACjD,SAAS,EAAE,MAAM,UAAU,aAAa,iCAAQ;AAAA,QAChD,QAAQ,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,EAAE;AAAA,QACnD,UAAU,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,EAAE;AAAA,QACrD,UAAU,EAAE,MAAM,SAAS;AAAA,QAC3B,UAAU,EAAE,MAAM,SAAS;AAAA,QAC3B,QAAQ,EAAE,MAAM,SAAS;AAAA,QACzB,SAAS,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MAC7C;AAAA,MACA,sBAAsB;AAAA,IACxB;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM,QAAQ,MAAM,KAAK;AACvB,YAAM,QAAQ,oBAAoB,IAAI,SAAS,KAAK,aAAa,CAAC;AAClE,YAAM,UAAU,QAAQ;AAAA,QACtB,SAAS,IAAI,UAAU,IAAI,KAAK,IAAI,KAAK;AAAA,QACzC,GAAG;AAAA,QACH,GAAG;AAAA,QACH,YAAY;AAAA,MACd,CAAC;AACD,aAAO,QAAQ;AACf,aAAO,QAAQ;AACf,aAAO,QAAQ;AACf,aAAO,QAAQ;AACf,YAAM,UAAU,QAAQ;AAAA,QACtB,MAAM,KAAK,QAAQ,QAAQ,eAAe,IAAI,UAAU;AAAA,QACxD,OAAO,KAAK;AAAA,QACZ,MAAM,KAAK;AAAA,MACb,CAAC;AACD,UAAI,CAAC,QAAQ,aAAa;AACxB,eAAO;AAAA,MACT;AACA,UAAI,CAAC,KAAK,KAAK,OAAO,GAAG;AACvB,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,UAC/B;AAAA,UACA;AAAA,UACA,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,UAC/B;AAAA,UACA;AAAA,QACF,EAAE,KAAK,IAAI;AAAA,MACb;AACA,YAAM,aAAa,MAAM,KAAK,UAAU,EAAE,gBAAgB,OAAO;AACjE,YAAM,WAAW,MAAM,KAAK,UAAU,EAAE,eAAe,OAAO;AAC9D,aAAO;AAAA;AAAA,EAAsB,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAAA;AAAA;AAAA,EAAe,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,IAClH;AAAA,EACF;AACF;AAEA,SAAS,aAAa,MAA0C;AAC9D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,UAAU,aAAa,iCAAQ;AAAA,QAC9C,QAAQ,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,GAAG,aAAa,mGAAwB;AAAA,QACzF,UAAU,EAAE,MAAM,UAAU,aAAa,gEAA4C;AAAA,QACrF,OAAO,EAAE,MAAM,UAAU,aAAa,0CAAY;AAAA,MACpD;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM,QAAQ,MAAM,KAAK;AACvB,YAAM,QAAQ,oBAAoB,IAAI,SAAS,KAAK,aAAa,CAAC;AAClE,YAAM,SAAS,OAAO,CAAC,GAAG,KAAK,MAAM,MAAM,GAAG,GAAG,KAAK,KAAK,MAAM,CAAC,CAAC;AACnE,YAAM,UAAU,MAAM,KAAK,UAAU,EAAE,cAAc,IAAI,KAAK,KAAK,GAAG,QAAQ;AAAA,QAC5E,QAAQ;AAAA,QACR,UAAU,IAAI,KAAK,QAAQ;AAAA,MAC7B,CAAC;AACD,YAAM,UAAU,aAAa,OAAO;AACpC,YAAM,SAAS,QACZ,IAAI,CAAC,SAAS,YAAY,MAAM,QAAQ,IAAI,KAAK,KAAK,CAAC,CAAC,EACxD,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAChC,MAAM,GAAG,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,IAAI,CAAC;AAC3D,aAAO;AAAA,QACL,yGAAyB,OAAO,SAAS,OAAO,KAAK,IAAI,IAAI,+DAAa;AAAA,QAC1E;AAAA,QACA,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,MAChC,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,MAA0C;AACjE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,UAAU,CAAC,UAAU;AAAA,MACrB,YAAY;AAAA,QACV,UAAU,EAAE,MAAM,UAAU,aAAa,kBAAQ;AAAA,QACjD,YAAY,EAAE,MAAM,UAAU,aAAa,mHAAyB;AAAA,QACpE,SAAS,EAAE,MAAM,UAAU,aAAa,kFAAiB;AAAA,QACzD,SAAS,EAAE,MAAM,UAAU,aAAa,2BAAO;AAAA,QAC/C,SAAS,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MAC7C;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM,QAAQ,MAAM,KAAK;AACvB,YAAM,WAAW,OAAO,KAAK,QAAQ;AACrC,UAAI,CAAC,OAAO,SAAS,QAAQ,EAAG,QAAO;AACvC,YAAM,SAAS,MAAM,KAAK,UAAU,EAAE,UAAU,QAAQ;AACxD,YAAM,QAAQ,oBAAoB,IAAI,SAAS,KAAK,aAAa,CAAC;AAClE,YAAM,aAAa,OAAO,SAAS,OAAO,KAAK,UAAU,CAAC,IACtD,OAAO,KAAK,UAAU,IACtB,MAAM,6BAA6B,KAAK,UAAU,GAAG,KAAK;AAC9D,UAAI,CAAC,OAAO,SAAS,UAAU,GAAG;AAChC,eAAO;AAAA,MACT;AACA,YAAM,UAAU,IAAI,KAAK,OAAO,KAAK,kBAAkB,OAAO,MAAM;AACpE,YAAM,OAAO,QAAQ,EAAE,YAAY,SAAS,SAAS,KAAK,QAAQ,CAAC;AACnE,UAAI,CAAC,KAAK,KAAK,OAAO,GAAG;AACvB,eAAO;AAAA,UACL,uCAAmB,QAAQ;AAAA,UAC3B,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,UAC5B;AAAA,UACA;AAAA,UACA,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,UAC9B;AAAA,UACA;AAAA,QACF,EAAE,KAAK,IAAI;AAAA,MACb;AACA,YAAM,SAAS,MAAM,KAAK,UAAU,EAAE,YAAY,UAAU,IAAI;AAChE,aAAO;AAAA,EAAa,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IACrD;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,MAA0C;AACrE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,UAAU,CAAC,MAAM;AAAA,MACjB,YAAY;AAAA,QACV,MAAM,EAAE,MAAM,UAAU,aAAa,2BAAO;AAAA,QAC5C,OAAO,EAAE,MAAM,UAAU,aAAa,4BAAQ;AAAA,QAC9C,MAAM,EAAE,MAAM,UAAU,MAAM,CAAC,QAAQ,OAAO,GAAG,aAAa,iCAAa;AAAA,QAC3E,SAAS,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MAC7C;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM,QAAQ,MAAM;AAClB,YAAM,OAAO,QAAQ,EAAE,MAAM,KAAK,MAAM,OAAO,KAAK,OAAO,MAAM,KAAK,KAAK,CAAC;AAC5E,UAAI,CAAC,KAAK,KAAM,QAAO;AACvB,UAAI,CAAC,KAAK,KAAK,OAAO,GAAG;AACvB,eAAO;AAAA,EAA4B,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA;AAAA;AAAA,MAClE;AACA,YAAM,SAAS,MAAM,KAAK,UAAU,EAAE,gBAAgB,IAAI;AAC1D,aAAO;AAAA,EAAkB,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC1D;AAAA,EACF;AACF;AAEA,SAAS,UAAU,MAA0C;AAC3D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,IAC7C,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM,UAAU;AACd,YAAM,SAAS,MAAM,KAAK,UAAU,EAAE,MAAM;AAC5C,aAAO;AAAA,EAAc,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IACtD;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,MAA0C;AACnE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,IAC7C,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM,UAAU;AACd,YAAM,SAAS,MAAM,KAAK,UAAU,EAAE,cAAc;AACpD,aAAO;AAAA,EAAkB,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC1D;AAAA,EACF;AACF;AAEA,SAAS,eAAe,MAA0C;AAChE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,IAC7C,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM,UAAU;AACd,YAAM,SAAS,MAAM,KAAK,UAAU,EAAE,eAAe;AACrD,aAAO;AAAA,EAAiB,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IACzD;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,MAA0C;AAClE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,UAAU,aAAa,qBAAM;AAAA,QAC5C,UAAU,EAAE,MAAM,UAAU,aAAa,gEAAmB;AAAA,MAC9D;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM,QAAQ,MAAM;AAClB,YAAM,SAAS,MAAM,KAAK,UAAU,EAAE,aAAa,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,QAAQ,CAAC;AACtF,aAAO;AAAA,EAAgB,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IACxD;AAAA,EACF;AACF;AAEA,SAAS,YAAY,MAA0C;AAC7D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,MACX;AAAA,MACA;AAAA,IACF,EAAE,KAAK,GAAG;AAAA,IACV,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,aAAa,EAAE,MAAM,UAAU,aAAa,8FAA6B;AAAA,QACzE,UAAU,EAAE,MAAM,UAAU,aAAa,iCAAQ;AAAA,QACjD,SAAS,EAAE,MAAM,UAAU,aAAa,2BAAO;AAAA,QAC/C,QAAQ,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,GAAG,aAAa,2BAAO;AAAA,QACxE,UAAU,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,GAAG,aAAa,iCAAQ;AAAA,QAC3E,UAAU,EAAE,MAAM,UAAU,aAAa,2BAAO;AAAA,QAChD,UAAU,EAAE,MAAM,UAAU,aAAa,2BAAO;AAAA,QAChD,QAAQ,EAAE,MAAM,UAAU,aAAa,eAAK;AAAA,QAC5C,SAAS,EAAE,MAAM,WAAW,SAAS,OAAO,aAAa,gCAAY;AAAA,MACvE;AAAA,MACA,sBAAsB;AAAA,IACxB;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM,QAAQ,MAAM,KAAK;AACvB,YAAM,QAAQ,oBAAoB,IAAI,SAAS,KAAK,aAAa,CAAC;AAClE,YAAM,OAAO,QAAQ;AAAA,QACnB,SAAS,IAAI,UAAU;AAAA,QACvB,GAAG;AAAA,QACH,GAAG;AAAA,QACH,YAAY;AAAA,MACd,CAAC;AACD,aAAO,KAAK;AACZ,UAAI,CAAC,KAAK,aAAa;AACrB,eAAO;AAAA,MACT;AACA,UAAI,CAAC,KAAK,KAAK,OAAO,GAAG;AACvB,eAAO;AAAA,EAA4B,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA;AAAA;AAAA,MAClE;AACA,YAAM,SAAS,MAAM,KAAK,UAAU,EAAE,eAAe,IAAI;AACzD,aAAO;AAAA,EAAkB,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC1D;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,MAA0C;AACpE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,UAAU,CAAC,YAAY;AAAA,MACvB,YAAY;AAAA,QACV,YAAY,EAAE,MAAM,UAAU,aAAa,oCAAW;AAAA,QACtD,aAAa,EAAE,MAAM,SAAS;AAAA,QAC9B,UAAU,EAAE,MAAM,SAAS;AAAA,QAC3B,SAAS,EAAE,MAAM,SAAS;AAAA,QAC1B,QAAQ,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,EAAE;AAAA,QACnD,UAAU,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,EAAE;AAAA,QACrD,UAAU,EAAE,MAAM,SAAS;AAAA,QAC3B,UAAU,EAAE,MAAM,SAAS;AAAA,QAC3B,QAAQ,EAAE,MAAM,SAAS;AAAA,QACzB,YAAY,EAAE,MAAM,UAAU,MAAM,CAAC,SAAS,WAAW,EAAE;AAAA,QAC3D,SAAS,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MAC7C;AAAA,MACA,sBAAsB;AAAA,IACxB;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM,QAAQ,MAAM;AAClB,YAAM,aAAa,OAAO,KAAK,UAAU;AACzC,UAAI,CAAC,OAAO,SAAS,UAAU,EAAG,QAAO;AACzC,YAAM,OAAO,QAAQ,EAAE,GAAG,KAAK,CAAC;AAChC,aAAO,KAAK;AACZ,aAAO,KAAK;AACZ,UAAI,CAAC,KAAK,KAAK,OAAO,GAAG;AACvB,eAAO,wDAA0B,UAAU;AAAA,EAAM,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA;AAAA;AAAA,MAChF;AACA,YAAM,SAAS,MAAM,KAAK,UAAU,EAAE,eAAe,YAAY,IAAI;AACrE,aAAO;AAAA,EAAmB,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC3D;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,MAA0C;AACpE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,UAAU,aAAa,qBAAM;AAAA,QAC5C,QAAQ,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,GAAG,aAAa,2BAAO;AAAA,MAC1E;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM,QAAQ,MAAM;AAClB,YAAM,SAAS,MAAM,KAAK,UAAU,EAAE,gBAAgB,IAAI,KAAK,KAAK,GAAG,KAAK,KAAK,MAAM,CAAC;AACxF,aAAO;AAAA,EAAiB,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IACzD;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,MAA0C;AACjE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,UAAU,CAAC,YAAY;AAAA,MACvB,YAAY;AAAA,QACV,YAAY,EAAE,MAAM,UAAU,aAAa,oCAAW;AAAA,MACxD;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM,QAAQ,MAAM;AAClB,YAAM,aAAa,OAAO,KAAK,UAAU;AACzC,UAAI,CAAC,OAAO,SAAS,UAAU,EAAG,QAAO;AACzC,YAAM,SAAS,MAAM,KAAK,UAAU,EAAE,YAAY,UAAU;AAC5D,aAAO;AAAA,EAAe,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IACvD;AAAA,EACF;AACF;AAEA,SAAS,eAAe,MAA0C;AAChE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,UAAU,CAAC,OAAO;AAAA,MAClB,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,UAAU,aAAa,2BAAO;AAAA,QAC7C,aAAa,EAAE,MAAM,UAAU,aAAa,2BAAO;AAAA,QACnD,UAAU,EAAE,MAAM,UAAU,aAAa,gEAA4C;AAAA,QACrF,QAAQ,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,GAAG,aAAa,2BAAO;AAAA,QACxE,WAAW,EAAE,MAAM,UAAU,aAAa,2BAAO;AAAA,QACjD,WAAW,EAAE,MAAM,UAAU,aAAa,2BAAO;AAAA,QACjD,UAAU,EAAE,MAAM,UAAU,aAAa,2BAAO;AAAA,QAChD,SAAS,EAAE,MAAM,UAAU,aAAa,2BAAO;AAAA,QAC/C,SAAS,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MAC7C;AAAA,MACA,sBAAsB;AAAA,IACxB;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM,QAAQ,MAAM,KAAK;AACvB,YAAM,OAAO,QAAQ,EAAE,SAAS,IAAI,UAAU,SAAS,GAAG,KAAK,CAAC;AAChE,aAAO,KAAK;AACZ,UAAI,CAAC,KAAK,MAAO,QAAO;AACxB,UAAI,CAAC,KAAK,KAAK,OAAO,GAAG;AACvB,eAAO;AAAA,EAA0B,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA;AAAA;AAAA,MAChE;AACA,YAAM,SAAS,MAAM,KAAK,UAAU,EAAE,aAAa,IAAI;AACvD,aAAO;AAAA,EAAgB,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IACxD;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,MAA0C;AAClE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,UAAU,aAAa,qBAAM;AAAA,QAC5C,QAAQ,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,GAAG,aAAa,2BAAO;AAAA,QACxE,QAAQ,EAAE,MAAM,UAAU,aAAa,2EAAuD;AAAA,QAC9F,UAAU,EAAE,MAAM,UAAU,aAAa,gEAA4C;AAAA,MACvF;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM,QAAQ,MAAM;AAClB,YAAM,SAAS,MAAM,KAAK,UAAU,EAAE,cAAc,IAAI,KAAK,KAAK,GAAG,KAAK,KAAK,MAAM,GAAG;AAAA,QACtF,QAAQ,IAAI,KAAK,MAAM;AAAA,QACvB,UAAU,IAAI,KAAK,QAAQ;AAAA,MAC7B,CAAC;AACD,aAAO;AAAA,EAAgB,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IACxD;AAAA,EACF;AACF;AAEA,SAAS,cAAc,MAA0C;AAC/D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,UAAU,CAAC,UAAU;AAAA,MACrB,YAAY;AAAA,QACV,UAAU,EAAE,MAAM,UAAU,aAAa,kBAAQ;AAAA,MACnD;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM,QAAQ,MAAM;AAClB,YAAM,WAAW,OAAO,KAAK,QAAQ;AACrC,UAAI,CAAC,OAAO,SAAS,QAAQ,EAAG,QAAO;AACvC,YAAM,SAAS,MAAM,KAAK,UAAU,EAAE,UAAU,QAAQ;AACxD,aAAO;AAAA,EAAc,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IACtD;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,MAA0C;AACrE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,UAAU,CAAC,YAAY,QAAQ;AAAA,MAC/B,YAAY;AAAA,QACV,UAAU,EAAE,MAAM,UAAU,aAAa,kBAAQ;AAAA,QACjD,QAAQ,EAAE,MAAM,UAAU,aAAa,qCAAY;AAAA,QACnD,YAAY,EAAE,MAAM,UAAU,aAAa,gDAAa;AAAA,QACxD,SAAS,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MAC7C;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM,QAAQ,MAAM;AAClB,YAAM,WAAW,OAAO,KAAK,QAAQ;AACrC,UAAI,CAAC,OAAO,SAAS,QAAQ,EAAG,QAAO;AACvC,YAAM,OAAO,QAAQ,EAAE,QAAQ,KAAK,QAAQ,YAAY,KAAK,WAAW,CAAC;AACzE,UAAI,CAAC,KAAK,OAAQ,QAAO;AACzB,UAAI,CAAC,KAAK,KAAK,OAAO,GAAG;AACvB,eAAO,6CAAoB,QAAQ;AAAA,EAAW,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA;AAAA;AAAA,MAC7E;AACA,YAAM,SAAS,MAAM,KAAK,UAAU,EAAE,gBAAgB,UAAU,IAAI;AACpE,aAAO;AAAA,EAAkB,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC1D;AAAA,EACF;AACF;AAEA,SAAS,UAAU,MAA0C;AAC3D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,UAAU,CAAC,YAAY,YAAY;AAAA,MACnC,YAAY;AAAA,QACV,UAAU,EAAE,MAAM,UAAU,aAAa,kBAAQ;AAAA,QACjD,YAAY,EAAE,MAAM,UAAU,aAAa,oCAAW;AAAA,QACtD,SAAS,EAAE,MAAM,UAAU,aAAa,2BAAO;AAAA,QAC/C,SAAS,EAAE,MAAM,UAAU,aAAa,2BAAO;AAAA,QAC/C,SAAS,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MAC7C;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM,QAAQ,MAAM;AAClB,YAAM,WAAW,OAAO,KAAK,QAAQ;AACrC,YAAM,aAAa,OAAO,KAAK,UAAU;AACzC,YAAM,OAAO,EAAE,YAAY,SAAS,IAAI,KAAK,OAAO,GAAG,SAAS,IAAI,KAAK,OAAO,EAAE;AAClF,UAAI,CAAC,OAAO,SAAS,QAAQ,KAAK,CAAC,OAAO,SAAS,UAAU,EAAG,QAAO;AACvE,UAAI,CAAC,KAAK,KAAK,OAAO,GAAG;AACvB,eAAO,uCAAmB,QAAQ,oCAAW,UAAU;AAAA,EAAa,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA;AAAA;AAAA,MACnG;AACA,YAAM,SAAS,MAAM,KAAK,UAAU,EAAE,YAAY,UAAU,IAAI;AAChE,aAAO;AAAA,EAAa,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IACrD;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,MAA0C;AACtE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,UAAU,CAAC,UAAU;AAAA,MACrB,YAAY;AAAA,QACV,UAAU,EAAE,MAAM,UAAU,aAAa,kBAAQ;AAAA,MACnD;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM,QAAQ,MAAM;AAClB,YAAM,WAAW,OAAO,KAAK,QAAQ;AACrC,UAAI,CAAC,OAAO,SAAS,QAAQ,EAAG,QAAO;AACvC,YAAM,SAAS,MAAM,KAAK,UAAU,EAAE,iBAAiB,QAAQ;AAC/D,aAAO,qBAAW,QAAQ;AAAA,EAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IACvE;AAAA,EACF;AACF;AAEA,SAAS,sBAAsB,MAA0C;AACvE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,UAAU,CAAC,YAAY,iBAAiB,QAAQ;AAAA,MAChD,YAAY;AAAA,QACV,UAAU,EAAE,MAAM,UAAU,aAAa,kBAAQ;AAAA,QACjD,eAAe,EAAE,MAAM,UAAU,aAAa,kBAAQ;AAAA,QACtD,QAAQ,EAAE,MAAM,UAAU,MAAM,CAAC,UAAU,QAAQ,GAAG,aAAa,4CAAwB;AAAA,QAC3F,SAAS,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MAC7C;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM,QAAQ,MAAM;AAClB,YAAM,WAAW,OAAO,KAAK,QAAQ;AACrC,YAAM,gBAAgB,OAAO,KAAK,aAAa;AAC/C,YAAM,SAAS,IAAI,KAAK,MAAM;AAC9B,UAAI,CAAC,OAAO,SAAS,QAAQ,KAAK,CAAC,OAAO,SAAS,aAAa,EAAG,QAAO;AAC1E,UAAI,WAAW,YAAY,WAAW,SAAU,QAAO;AACvD,UAAI,CAAC,KAAK,KAAK,OAAO,GAAG;AACvB,eAAO,uCAAmB,QAAQ,wBAAS,aAAa,iBAAO,MAAM;AAAA;AAAA;AAAA,MACvE;AACA,YAAM,SAAS,MAAM,KAAK,UAAU,EAAE,kBAAkB,UAAU,eAAe,MAAM;AACvF,aAAO;AAAA,EAAkB,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC1D;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,MAA0C;AACxE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,UAAU,CAAC,YAAY,QAAQ;AAAA,MAC/B,YAAY;AAAA,QACV,UAAU,EAAE,MAAM,UAAU,aAAa,kBAAQ;AAAA,QACjD,QAAQ,EAAE,MAAM,UAAU,MAAM,CAAC,QAAQ,YAAY,WAAW,UAAU,WAAW,EAAE;AAAA,QACvF,SAAS,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MAC7C;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM,QAAQ,MAAM;AAClB,YAAM,WAAW,OAAO,KAAK,QAAQ;AACrC,YAAM,SAAS,IAAI,KAAK,MAAM;AAC9B,UAAI,CAAC,OAAO,SAAS,QAAQ,EAAG,QAAO;AACvC,UAAI,CAAC,CAAC,QAAQ,YAAY,WAAW,UAAU,WAAW,EAAE,SAAS,MAAM,EAAG,QAAO;AACrF,UAAI,CAAC,KAAK,KAAK,OAAO,GAAG;AACvB,eAAO,4CAAwB,QAAQ,6BAAS,MAAM;AAAA;AAAA;AAAA,MACxD;AACA,YAAM,SAAS,MAAM,KAAK,UAAU,EAAE,mBAAmB,UAAU,MAAM;AACzE,aAAO;AAAA,EAAkB,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC1D;AAAA,EACF;AACF;AAEA,SAAS,eAAe,MAA0C;AAChE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,IAC7C,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM,UAAU;AACd,YAAM,SAAS,MAAM,KAAK,UAAU,EAAE,WAAW;AACjD,aAAO;AAAA,EAAc,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IACtD;AAAA,EACF;AACF;AAEA,SAAS,sBAAsB,MAA0C;AACvE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,UAAU,CAAC,WAAW,QAAQ;AAAA,MAC9B,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,kBAAQ;AAAA,QAChD,QAAQ,EAAE,MAAM,UAAU,MAAM,CAAC,WAAW,UAAU,aAAa,WAAW,EAAE;AAAA,QAChF,SAAS,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MAC7C;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM,QAAQ,MAAM;AAClB,YAAM,UAAU,OAAO,KAAK,OAAO;AACnC,YAAM,SAAS,IAAI,KAAK,MAAM;AAC9B,UAAI,CAAC,OAAO,SAAS,OAAO,EAAG,QAAO;AACtC,UAAI,CAAC,CAAC,WAAW,UAAU,aAAa,WAAW,EAAE,SAAS,MAAM,EAAG,QAAO;AAC9E,UAAI,CAAC,KAAK,KAAK,OAAO,GAAG;AACvB,eAAO,4CAAwB,OAAO,6BAAS,MAAM;AAAA;AAAA;AAAA,MACvD;AACA,YAAM,SAAS,MAAM,KAAK,UAAU,EAAE,kBAAkB,SAAS,MAAM;AACvE,aAAO;AAAA,EAAkB,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC1D;AAAA,EACF;AACF;AAEA,SAAS,sBAAsB,MAA0C;AACvE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,QAAQ,EAAE,MAAM,UAAU,aAAa,4CAAc;AAAA,MACvD;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM,QAAQ,MAAM;AAClB,YAAM,SAAS,MAAM,KAAK,UAAU,EAAE,kBAAkB,IAAI,KAAK,MAAM,CAAC;AACxE,aAAO;AAAA,EAAiB,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IACzD;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,MAA0C;AAClE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,UAAU,CAAC,gBAAgB;AAAA,MAC3B,YAAY;AAAA,QACV,gBAAgB,EAAE,MAAM,UAAU,aAAa,kBAAQ;AAAA,MACzD;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM,QAAQ,MAAM;AAClB,YAAM,iBAAiB,OAAO,KAAK,cAAc;AACjD,UAAI,CAAC,OAAO,SAAS,cAAc,EAAG,QAAO;AAC7C,YAAM,SAAS,MAAM,KAAK,UAAU,EAAE,aAAa,cAAc;AACjE,aAAO,kCAAc,cAAc;AAAA,EAAS,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC7E;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,MAA0C;AACrE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,UAAU,CAAC,kBAAkB,YAAY,SAAS;AAAA,MAClD,YAAY;AAAA,QACV,gBAAgB,EAAE,MAAM,UAAU,aAAa,kBAAQ;AAAA,QACvD,UAAU,EAAE,MAAM,UAAU,aAAa,qCAAY;AAAA,QACrD,SAAS,EAAE,MAAM,UAAU,aAAa,2BAAO;AAAA,QAC/C,SAAS,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MAC7C;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM,QAAQ,MAAM;AAClB,YAAM,iBAAiB,OAAO,KAAK,cAAc;AACjD,YAAM,OAAO,QAAQ,EAAE,UAAU,KAAK,UAAU,SAAS,KAAK,QAAQ,CAAC;AACvE,UAAI,CAAC,OAAO,SAAS,cAAc,EAAG,QAAO;AAC7C,UAAI,CAAC,KAAK,YAAY,CAAC,KAAK,QAAS,QAAO;AAC5C,UAAI,CAAC,KAAK,KAAK,OAAO,GAAG;AACvB,eAAO,4CAAwB,cAAc;AAAA,EAAW,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA;AAAA;AAAA,MACvF;AACA,YAAM,SAAS,MAAM,KAAK,UAAU,EAAE,YAAY,gBAAgB,IAAI;AACtE,aAAO;AAAA,EAAkB,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,IAC1D;AAAA,EACF;AACF;AAEA,SAAS,eAAe,MAA0C;AAChE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MAC7C;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,cAAc;AAAA,IACd,MAAM,QAAQ,MAAM,KAAkB;AACpC,YAAM,UAAU,MAAM,KAAK,UAAU,EAAE,WAAW;AAClD,YAAM,SAAS,cAAc,OAAO;AACpC,UAAI,CAAC,KAAK,KAAK,OAAO,GAAG;AACvB,eAAO,0BAAgB,OAAO,MAAM;AAAA,EAA8B,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA;AAAA;AAAA,MACnG;AACA,YAAM,SAAS,qBAAqB,IAAI,SAAS,QAAQ,KAAK,aAAa,CAAC;AAC5E,aAAO,iEAAoB,OAAO,OAAO,wBAAS,OAAO,OAAO;AAAA,sBAAa,OAAO,MAAM;AAAA,IAC5F;AAAA,EACF;AACF;AAEA,SAAS,KAAK,OAAyB;AACrC,SAAO,UAAU,QAAQ,UAAU;AACrC;AAEA,SAAS,IAAI,OAAwB;AACnC,SAAO,OAAO,UAAU,WAAW,MAAM,KAAK,IAAI;AACpD;AAEA,SAAS,KAAK,OAA0B;AACtC,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,CAAC,SAAS,OAAO,IAAI,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AACxF,MAAI,OAAO,UAAU,SAAU,QAAO,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,OAAO,OAAO;AAChG,SAAO,CAAC;AACV;AAEA,SAAS,QAAQ,OAAyD;AACxE,QAAM,MAA+B,CAAC;AACtC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,GAAI;AAC3D,QAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,EAAG;AAChD,QAAI,GAAG,IAAI;AAAA,EACb;AACA,SAAO;AACT;AAEA,SAAS,cAAc,SAAwC;AAC7D,MAAI,CAAC,WAAW,OAAO,YAAY,SAAU,QAAO,CAAC;AACrD,QAAM,QAAS,QAAgC;AAC/C,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC;AACnC,SAAO,MAAM,IAAI,CAAC,SAAS,IAA0B,EAAE,OAAO,CAAC,SAAS,OAAO,SAAS,OAAO,KAAK,EAAE,CAAC,CAAC;AAC1G;AAEA,SAAS,aAAa,SAAkD;AACtE,MAAI,CAAC,WAAW,OAAO,YAAY,SAAU,QAAO,CAAC;AACrD,QAAM,QAAS,QAAgC;AAC/C,SAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,OAAO,CAAC,SAA0C,QAAQ,IAAI,KAAK,OAAO,SAAS,QAAQ,IAAI,CAAC;AACtI;AAEA,SAAS,OAAO,QAA4B;AAC1C,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,MAAgB,CAAC;AACvB,aAAW,SAAS,QAAQ;AAC1B,UAAM,QAAQ,MAAM,KAAK;AACzB,UAAM,MAAM,MAAM,YAAY;AAC9B,QAAI,CAAC,SAAS,KAAK,IAAI,GAAG,EAAG;AAC7B,SAAK,IAAI,GAAG;AACZ,QAAI,KAAK,KAAK;AAAA,EAChB;AACA,SAAO;AACT;AAEA,SAAS,YAAY,MAA+B,QAAkB,OAAwC;AAC5G,QAAM,eAAe,KAAK,KAAK,MAAM;AACrC,QAAM,OAAO,KAAK,UAAU,IAAI,EAAE,YAAY;AAC9C,QAAM,gBAAgB,OAAO,OAAO,CAAC,UAAU,aAAa,KAAK,CAAC,cAAc,UAAU,YAAY,MAAM,MAAM,YAAY,CAAC,KAAK,KAAK,SAAS,MAAM,YAAY,CAAC,CAAC;AACtK,QAAM,WAAW,QAAQ,KAAK,SAAS,MAAM,YAAY,CAAC,IAAI;AAC9D,QAAM,YAAY,OAAQ,KAAiC,aAAa,CAAC;AACzE,QAAM,QAAQ,cAAc,SAAS,MAAM,WAAW,KAAK,MAAM,YAAY,IAAI,KAAK,IAAI,IAAI,KAAK,MAAM,YAAY,GAAI,CAAC,IAAI;AAC9H,SAAO;AAAA,IACL,IAAI,KAAK;AAAA,IACT,OAAO,KAAK;AAAA,IACZ,UAAU,KAAK;AAAA,IACf,QAAQ,KAAK;AAAA,IACb,WAAW,KAAK;AAAA,IAChB,WAAW,KAAK;AAAA,IAChB,UAAU,KAAK;AAAA,IACf,QAAQ;AAAA,IACR;AAAA,IACA,QAAQ,cAAc,SAClB,4BAAQ,cAAc,KAAK,IAAI,CAAC,KAChC;AAAA,EACN;AACF;AAEA,eAAe,6BAA6B,QAA2B,OAAyE;AAC9I,QAAM,cAAc,IAAI,MAAM,WAAW;AACzC,MAAI,CAAC,YAAa,QAAO;AACzB,QAAM,UAAU,MAAM,OAAO,gBAAgB,aAAa,CAAC,CAAC;AAC5D,QAAM,QAAQ,aAAa,OAAO;AAClC,QAAM,QAAQ,MAAM,KAAK,CAAC,SAAS,IAAI,KAAK,WAAW,MAAM,WAAW,KAAK,MAAM,CAAC;AACpF,SAAO,OAAO,OAAO,EAAE;AACzB;AAEA,SAAS,kBAAkB,OAAwD,eAAgC;AACjH,QAAM,SAAS,iBAAiB,OAAO,kBAAkB,WAAW,gBAA2C,CAAC;AAChH,QAAM,SAAS,KAAK,MAAM,MAAM;AAChC,QAAM,WAAW,KAAK,MAAM,QAAQ;AACpC,SAAO;AAAA,IACL,4BAAQ,MAAM,eAAe,wBAAS;AAAA,IACtC,OAAO,SAAS,wCAAU,OAAO,KAAK,QAAG,CAAC,WAAM;AAAA,IAChD,SAAS,SAAS,kCAAS,SAAS,KAAK,QAAG,CAAC,WAAM;AAAA,IACnD,OAAO,QAAQ,qBAAM,OAAO,OAAO,KAAK,CAAC,uHAAwB;AAAA,EACnE,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AAC7B;;;AC/2BA,IAAM,UAAU;AAEhB,IAAM,iBAAN,MAA8C;AAAA,EACnC,OAAO;AAAA,EACP,UAAU;AAAA,EACV,cAAc;AAAA,EAEf,SAAS,IAAI,kBAAkB,EAAE,SAAS,4BAA4B,CAAC;AAAA,EACvE;AAAA,EAER,MAAM,WAAW,KAAmC;AAClD,UAAM,UAAU,OAAO,IAAI,OAAO,YAAY,YAAY,IAAI,OAAO,QAAQ,KAAK,IAC9E,IAAI,OAAO,QAAQ,KAAK,IACxB;AACJ,SAAK,YAAY,OAAO,IAAI,OAAO,cAAc,WAAW,IAAI,OAAO,YAAY;AACnF,SAAK,SAAS,IAAI,kBAAkB,EAAE,QAAQ,CAAC;AAC/C,QAAI,OAAO,KAAK,wDAA+B,OAAO,EAAE;AAAA,EAC1D;AAAA,EAEA,WAA6B;AAC3B,WAAO,oBAAoB;AAAA,MACzB,WAAW,MAAM,KAAK;AAAA,MACtB,cAAc,MAAM,KAAK;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA,EAEA,uBAA+B;AAC7B,WAAO;AAAA,EACT;AACF;AAEA,IAAM,SAAS,IAAI,eAAe;AAClC,IAAO,gBAAQ;","names":["path"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@samp3ng/aster-plugin-opc-cloud",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Aster OPC 供需聚合插件:入驻、上架、找单、发单、接单、私聊和订单回流",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist"
|
|
10
|
+
],
|
|
11
|
+
"engines": {
|
|
12
|
+
"node": ">=20.0.0 <25.0.0"
|
|
13
|
+
},
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsup",
|
|
16
|
+
"dev": "tsup --watch",
|
|
17
|
+
"test": "vitest run"
|
|
18
|
+
},
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"@samp3ng/aster-core": "0.1.0",
|
|
21
|
+
"better-sqlite3": "^12.9.0"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@types/better-sqlite3": "^7.6.9"
|
|
25
|
+
}
|
|
26
|
+
}
|