Local branch had diverged from origin/master (sibling commits on the same base). Rewrote local history linearly on top of origin/master, folding in all local content: exa/hot-platform discovery hunters, leaks ledger, nightly sweep orchestrator, updated .gitignore and skill docs, plus the latest hunt output and vault state. Remote-only files (vault keys, channel scripts) were restored rather than dropped, so the resulting tree is a full union of both sides.
1 line
8.7 KiB
JSON
1 line
8.7 KiB
JSON
{"repo": "2928563262/yuntanfang", "files": {".env.example": {"8bf8c39a5f29c5d863219fa6fd1d74f773e5cc43": {"t": 1785745140.2516382, "n": 617, "h": "1f5e9c637d824e5f", "c": "APP_ENV=dev\nSERVER_PORT=8080\n\nMYSQL_HOST=localhost\nMYSQL_PORT=13307\nMYSQL_DATABASE=yun_tan_fang\nMYSQL_USERNAME=yuntanfang\nMYSQL_PASSWORD=change_me\n\nREDIS_HOST=localhost\nREDIS_PORT=6379\nREDIS_PASSWORD=\n\nJWT_SECRET=replace_with_local_dev_secret_at_least_32_chars\nJWT_EXPIRE_SECONDS=7200\n\nMAP_API_KEY=mock_key\nPAYMENT_MERCHANT_ID=mock_merchant\nPAYMENT_SECRET=mock_secret\nSMS_ACCESS_KEY=mock_access_key\nOSS_ENDPOINT=http://localhost:9000\nOSS_ACCESS_KEY=mock_access_key\nOSS_SECRET_KEY=mock_secret_key\nCONTENT_SAFETY_KEY=mock_key\n\nDEEPSEEK_BASE_URL=https://api.deepseek.com\nDEEPSEEK_API_KEY=\nDEEPSEEK_MODEL=deepseek-v4-pro\n"}, "02ec86d75942ea9651be5dbcbc74f76691acc235": {"t": 1785748079.1384158, "n": 617, "h": "1f5e9c637d824e5f", "c": "APP_ENV=dev\nSERVER_PORT=8080\n\nMYSQL_HOST=localhost\nMYSQL_PORT=13307\nMYSQL_DATABASE=yun_tan_fang\nMYSQL_USERNAME=yuntanfang\nMYSQL_PASSWORD=change_me\n\nREDIS_HOST=localhost\nREDIS_PORT=6379\nREDIS_PASSWORD=\n\nJWT_SECRET=replace_with_local_dev_secret_at_least_32_chars\nJWT_EXPIRE_SECONDS=7200\n\nMAP_API_KEY=mock_key\nPAYMENT_MERCHANT_ID=mock_merchant\nPAYMENT_SECRET=mock_secret\nSMS_ACCESS_KEY=mock_access_key\nOSS_ENDPOINT=http://localhost:9000\nOSS_ACCESS_KEY=mock_access_key\nOSS_SECRET_KEY=mock_secret_key\nCONTENT_SAFETY_KEY=mock_key\n\nDEEPSEEK_BASE_URL=https://api.deepseek.com\nDEEPSEEK_API_KEY=\nDEEPSEEK_MODEL=deepseek-v4-pro\n"}, "b522ef21bfc9e1c77659f5574d2fee2a1b630b83": {"t": 1785748082.4768336, "n": 524, "h": "1a2cda6ec02d4a1e", "c": "APP_ENV=dev\nSERVER_PORT=8080\n\nMYSQL_HOST=localhost\nMYSQL_PORT=13307\nMYSQL_DATABASE=yun_tan_fang\nMYSQL_USERNAME=yuntanfang\nMYSQL_PASSWORD=change_me\n\nREDIS_HOST=localhost\nREDIS_PORT=6379\nREDIS_PASSWORD=\n\nJWT_SECRET=replace_with_local_dev_secret_at_least_32_chars\nJWT_EXPIRE_SECONDS=7200\n\nMAP_API_KEY=mock_key\nPAYMENT_MERCHANT_ID=mock_merchant\nPAYMENT_SECRET=mock_secret\nSMS_ACCESS_KEY=mock_access_key\nOSS_ENDPOINT=http://localhost:9000\nOSS_ACCESS_KEY=mock_access_key\nOSS_SECRET_KEY=mock_secret_key\nCONTENT_SAFETY_KEY=mock_key\n"}, "4051d06de78c22dee525825419a7208d70d5bb22": {"t": 1785748083.8640113, "n": 523, "h": "cc86c70f1b658698", "c": "APP_ENV=dev\nSERVER_PORT=8080\n\nMYSQL_HOST=localhost\nMYSQL_PORT=3306\nMYSQL_DATABASE=yun_tan_fang\nMYSQL_USERNAME=yuntanfang\nMYSQL_PASSWORD=change_me\n\nREDIS_HOST=localhost\nREDIS_PORT=6379\nREDIS_PASSWORD=\n\nJWT_SECRET=replace_with_local_dev_secret_at_least_32_chars\nJWT_EXPIRE_SECONDS=7200\n\nMAP_API_KEY=mock_key\nPAYMENT_MERCHANT_ID=mock_merchant\nPAYMENT_SECRET=mock_secret\nSMS_ACCESS_KEY=mock_access_key\nOSS_ENDPOINT=http://localhost:9000\nOSS_ACCESS_KEY=mock_access_key\nOSS_SECRET_KEY=mock_secret_key\nCONTENT_SAFETY_KEY=mock_key\n"}}, "backend/src/main/java/com/yuntanfang/module/agent/service/AgentOrderService.java": {"8bf8c39a5f29c5d863219fa6fd1d74f773e5cc43": {"t": 1786067599.1405125, "n": 5001, "h": "77409b64ee9dde29", "c": "package com.yuntanfang.module.agent.service;\n\nimport com.yuntanfang.module.agent.dto.AgentOrderRequest;\nimport com.yuntanfang.module.agent.vo.AgentOrderResult;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.http.HttpHeaders;\nimport org.springframework.http.MediaType;\nimport org.springframework.stereotype.Service;\nimport org.springframework.web.client.RestClient;\n\nimport java.util.List;\nimport java.util.Map;\n\n@Service\npublic class AgentOrderService {\n\n private final RestClient restClient;\n private final String apiKey;\n private final String model;\n\n public AgentOrderService(\n @Value(\"${app.deepseek.base-url:https://api.deepseek.com}\") String baseUrl,\n @Value(\"${app.deepseek.api-key:}\") String apiKey,\n @Value(\"${app.deepseek.model:deepseek-v4-pro}\") String model\n ) {\n this.restClient = RestClient.builder().baseUrl(baseUrl).build();\n this.apiKey = apiKey;\n this.model = model;\n }\n\n public AgentOrderResult parse(AgentOrderRequest request) {\n if (apiKey == null || apiKey.isBlank()) {\n return fallback(request.message(), \"fallback_no_api_key\");\n }\n\n try {\n Map<String, Object> response = restClient.post()\n .uri(\"/v1/chat/completions\")\n .header(HttpHeaders.AUTHORIZATION, \"Bearer \" + apiKey)\n .contentType(MediaType.APPLICATION_JSON)\n .body(buildPayload(request))\n .retrieve()\n .body(Map.class);\n\n String content = extractContent(response);\n return toResult(request.message(), content, \"deepseek\");\n } catch (Exception ex) {\n return fallback(request.message(), \"fallback_deepseek_error\");\n }\n }\n\n private Map<String, Object> buildPayload(AgentOrderRequest request) {\n return Map.of(\n \"model\", model,\n \"temperature\", 0.2,\n \"messages\", List.of(\n Map.of(\n \"role\", \"system\",\n \"content\", \"\"\"\n 你是云摊坊智能点单助手。只处理摊位预约点单。\n 根据用户输入抽取:摊位名、商品、数量、口味备注、取餐时间。\n 若信息不足,先追问。若可下单,返回简短中文确认。\n 当前可用摊位:烟火小摊、乡野新农人鲜铺、非遗手作摊、老城豆花摊。\n 当前商品:招牌烤串(10串)、现炸薯条、鲜榨果汁、当季蔬果礼盒、农家土鸡蛋(10枚)、手工辣酱、生肖糖画、定制糖牌、糖画体验券、老城手作豆花、咸口豆腐脑、桂花冰豆浆。\n \"\"\"\n ),\n Map.of(\"role\", \"user\", \"content\", request.message() == null ? \"\" : request.message())\n )\n );\n }\n\n @SuppressWarnings(\"unchecked\")\n private String extractContent(Map<String, Object> response) {\n if (response == null) {\n return \"\";\n }\n List<Map<String, Object>> choices = (List<Map<String, Object>>) response.get(\"choices\");\n if (choices == null || choices.isEmpty()) {\n return \"\";\n }\n Map<String, Object> message = (Map<String, Object>) choices.get(0).get(\"message\");\n return message == null ? \"\" : String.valueOf(message.getOrDefault(\"content\", \"\"));\n }\n\n private AgentOrderResult toResult(String input, String reply, String status) {\n AgentOrderResult fallback = fallback(input, status);\n return new AgentOrderResult(\n reply == null || reply.isBlank() ? fallback.reply() : reply,\n fallback.stallName(),\n fallback.items(),\n fallback.pickupTime(),\n fallback.totalAmount(),\n fallback.confidence(),\n status,\n reply\n );\n }\n\n private AgentOrderResult fallback(String input, String status) {\n String text = input == null ? \"\" : input;\n String stallName = text.contains(\"豆花\") || text.contains(\"豆浆\") || text.contains(\"豆腐脑\")\n ? \"老城豆花摊\"\n : text.contains(\"糖画\") ? \"非遗手作摊\" : text.contains(\"鲜\") || text.contains(\"鸡蛋\") ? \"乡野新农人鲜铺\" : \"烟火小摊\";\n String product = text.contains(\"豆浆\") ? \"桂花冰豆浆\" : text.contains(\"豆腐脑\") ? \"咸口豆腐脑\" : text.contains(\"豆花\") ? \"老城手作豆花\"\n : text.contains(\"糖画\") ? \"生肖糖画\" : text.contains(\"鸡蛋\") ? \"农家土鸡蛋(10枚)\" : \"招牌烤串(10串)\";\n int quantity = text.contains(\"两\") || text.contains(\"2\") ? 2 : 1;\n String pickupTime = text.contains(\"18:30\") ? \"今天 18:30\" : \"今天 19:00\";\n String total = String.format(\"%.2f\", quantity * 16.0);\n return new AgentOrderResult(\n \"已识别:\" + stallName + \",\" + product + \" x\" + quantity + \"。\",\n stallName,\n List.of(new AgentOrderResult.OrderItem(product, quantity, \"\")),\n pickupTime,\n total,\n status.startsWith(\"fallback\") ? \"0.72\" : \"0.92\",\n status,\n \"\"\n );\n }\n}\n"}}}} |