cici 0.1.1 → 0.2.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 (109) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +13 -13
  3. package/.next/standalone/.next/app-path-routes-manifest.json +1 -1
  4. package/.next/standalone/.next/build-manifest.json +2 -2
  5. package/.next/standalone/.next/prerender-manifest.json +1 -1
  6. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  7. package/.next/standalone/.next/server/app/api/asset/[...path]/route.js +1 -1
  8. package/.next/standalone/.next/server/app/api/asset/[...path]/route.js.nft.json +1 -1
  9. package/.next/standalone/.next/server/app/api/blog/[id]/highlights/[hid]/comments/[cid]/reactions/route.js.nft.json +1 -1
  10. package/.next/standalone/.next/server/app/api/blog/[id]/highlights/[hid]/comments/[cid]/route.js.nft.json +1 -1
  11. package/.next/standalone/.next/server/app/api/blog/[id]/highlights/[hid]/replies/route.js.nft.json +1 -1
  12. package/.next/standalone/.next/server/app/api/blog/[id]/highlights/[hid]/resolve/route.js.nft.json +1 -1
  13. package/.next/standalone/.next/server/app/api/blog/[id]/highlights/[hid]/route.js.nft.json +1 -1
  14. package/.next/standalone/.next/server/app/api/blog/[id]/highlights/route.js.nft.json +1 -1
  15. package/.next/standalone/.next/server/app/api/graphql/route.js.nft.json +1 -1
  16. package/.next/standalone/.next/server/app/api/mile/prompts.body +1 -1
  17. package/.next/standalone/.next/server/app/api/upload/route.js.nft.json +1 -1
  18. package/.next/standalone/.next/server/app/atom.xml/route.js +3 -3
  19. package/.next/standalone/.next/server/app/atom.xml/route.js.nft.json +1 -1
  20. package/.next/standalone/.next/server/app/atom.xml.body +1 -1677
  21. package/.next/standalone/.next/server/app/blog/[id]/page.js.nft.json +1 -1
  22. package/.next/standalone/.next/server/app/blog/[id]/page_client-reference-manifest.js +1 -1
  23. package/.next/standalone/.next/server/app/blog/page.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/blog/page_client-reference-manifest.js +1 -1
  25. package/.next/standalone/.next/server/app/editor/page.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/editor/page_client-reference-manifest.js +1 -1
  27. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  28. package/.next/standalone/.next/server/app/memos/page.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/memos/page_client-reference-manifest.js +1 -1
  30. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  32. package/.next/standalone/.next/server/app/robots.txt/route.js +1 -1
  33. package/.next/standalone/.next/server/app/rss.xml/route.js +2 -2
  34. package/.next/standalone/.next/server/app/rss.xml/route.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/rss.xml.body +1 -227
  36. package/.next/standalone/.next/server/app/sitemap.xml/route.js +5 -5
  37. package/.next/standalone/.next/server/app/sitemap.xml.body +5 -101
  38. package/.next/standalone/.next/server/app/unavailable/page_client-reference-manifest.js +1 -1
  39. package/.next/standalone/.next/server/app-paths-manifest.json +6 -6
  40. package/.next/standalone/.next/server/chunks/3464.js +1 -1
  41. package/.next/standalone/.next/server/chunks/3607.js +1 -1
  42. package/.next/standalone/.next/server/chunks/719.js +1 -1
  43. package/.next/standalone/.next/server/pages/500.html +1 -1
  44. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  45. package/.next/standalone/package.json +2 -2
  46. package/.next/standalone/sample-content/blog/hello-cici.md +25 -0
  47. package/.next/standalone/sample-content/likes.json +1 -0
  48. package/.next/standalone/sample-content/memos.json +7 -0
  49. package/.next/standalone/sample-content/site-config.json +18 -0
  50. package/README.md +17 -1
  51. package/bin/cici.js +126 -23
  52. package/package.json +2 -2
  53. package/.next/standalone/data/assets/1727016079577.jpg +0 -0
  54. package/.next/standalone/data/assets/images/2024-12-03/1733256504772.jpg +0 -0
  55. package/.next/standalone/data/assets/images/2024-12-12/.gitkeep +0 -0
  56. package/.next/standalone/data/assets/images/2024-12-12/1734033798997.png +0 -0
  57. package/.next/standalone/data/assets/images/2024-12-21/.gitkeep +0 -0
  58. package/.next/standalone/data/assets/images/2024-12-21/1734785902890.jpeg +0 -0
  59. package/.next/standalone/data/assets/images/2024-12-23/.gitkeep +0 -0
  60. package/.next/standalone/data/assets/images/2024-12-23/1734990512413.jpeg +0 -0
  61. package/.next/standalone/data/assets/images/2024-12-23/1734991833894.jpeg +0 -0
  62. package/.next/standalone/data/assets/images/2024-12-23/1734993188114.jpeg +0 -0
  63. package/.next/standalone/data/assets/images/2024-12-23/1734993280313.jpeg +0 -0
  64. package/.next/standalone/data/assets/images/2024-12-23/1734993317984.jpeg +0 -0
  65. package/.next/standalone/data/assets/images/2024-12-23/1734993411252.jpeg +0 -0
  66. package/.next/standalone/data/assets/images/2024-12-23/1734993425042.jpeg +0 -0
  67. package/.next/standalone/data/assets/images/2024-12-23/1734993480342.jpeg +0 -0
  68. package/.next/standalone/data/assets/images/2024-12-23/1734993562660.jpeg +0 -0
  69. package/.next/standalone/data/assets/images/2024-12-23/1734993625024.jpeg +0 -0
  70. package/.next/standalone/data/assets/images/2024-12-23/1734993677103.jpeg +0 -0
  71. package/.next/standalone/data/assets/images/2024-12-23/1734993893285.jpeg +0 -0
  72. package/.next/standalone/data/assets/images/2024-12-23/1734993996131.jpeg +0 -0
  73. package/.next/standalone/data/assets/images/2024-12-23/1734994035144.jpeg +0 -0
  74. package/.next/standalone/data/assets/images/2024-12-23/1734994064317.jpeg +0 -0
  75. package/.next/standalone/data/assets/images/2024-12-23/1734994128679.jpeg +0 -0
  76. package/.next/standalone/data/assets/images/2024-12-23/1734994189257.jpeg +0 -0
  77. package/.next/standalone/data/assets/images/2024-12-23/1734994521799.jpeg +0 -0
  78. package/.next/standalone/data/assets/images/2024-12-23/1734994530669.jpeg +0 -0
  79. package/.next/standalone/data/assets/images/2024-12-24/.gitkeep +0 -0
  80. package/.next/standalone/data/assets/images/2024-12-24/1735032434591.jpeg +0 -0
  81. package/.next/standalone/data/assets/images/2024-12-24/1735068363518.jpeg +0 -0
  82. package/.next/standalone/data/assets/images/Cofe-app.png +0 -0
  83. package/.next/standalone/data/blog/.gitkeep +0 -0
  84. package/.next/standalone/data/blog/2017-summary.md +0 -59
  85. package/.next/standalone/data/blog/a-complex-web-app-refactor.md +0 -72
  86. package/.next/standalone/data/blog/a-day-of-remote-worker.md +0 -82
  87. package/.next/standalone/data/blog/async-action-in-redux.md +0 -257
  88. package/.next/standalone/data/blog/cofe.md +0 -398
  89. package/.next/standalone/data/blog/expensee-shortcut-numbers-guide.md +0 -99
  90. package/.next/standalone/data/blog/first-golang-project-fx.md +0 -113
  91. package/.next/standalone/data/blog/work-going-index.md +0 -49
  92. package/.next/standalone/data/blog//344/270/212/346/265/267/345/210/260/351/230/277/345/247/206/346/226/257/347/211/271/344/270/271.md +0 -114
  93. package/.next/standalone/data/blog//344/272/214/346/234/210/350/221/241/350/220/204/347/211/231/346/270/270/350/256/260.md +0 -107
  94. package/.next/standalone/data/blog//345/215/216/344/270/272/351/270/277/350/222/231-harmaryos-next-/347/272/277/344/270/213/346/264/273/345/212/250/345/260/217/350/256/260.md +0 -180
  95. package/.next/standalone/data/blog//345/233/233/346/234/210/347/232/204/345/260/276/345/267/264/351/200/233/345/276/267/345/233/275-/346/237/217/346/236/227.md +0 -76
  96. package/.next/standalone/data/blog//345/234/250/344/274/246/346/225/246-shoreditch-/345/221/206/344/270/211/345/244/251.md +0 -40
  97. package/.next/standalone/data/blog//346/204/217/345/244/247/345/210/251/347/275/227/351/251/254/345/244/217/345/244/251/345/233/233/346/227/245/346/270/270.md +0 -59
  98. package/.next/standalone/data/blog//346/210/221/345/201/232/344/272/206/344/270/200/346/254/276/346/227/205/350/241/214/350/256/260/345/275/225/345/272/224/347/224/250/357/274/232mile.md +0 -40
  99. package/.next/standalone/data/blog//350/245/277/347/217/255/347/211/231/344/270/203/345/244/251/347/232/204/346/227/205/350/241/214.md +0 -128
  100. package/.next/standalone/data/blog//351/200/233/351/200/233/346/265/216/345/267/236/345/262/233.md +0 -78
  101. package/.next/standalone/data/blog-manifest.json +0 -21
  102. package/.next/standalone/data/highlights/expensee-shortcut-numbers-guide.json +0 -77
  103. package/.next/standalone/data/likes.json +0 -56
  104. package/.next/standalone/data/memos.json +0 -1255
  105. package/.next/standalone/data/site-config.json +0 -22
  106. /package/.next/standalone/.next/static/{ACh2hmfOOZR7INKDQAX5I → Pl18p4h2shbbqjypPxStc}/_buildManifest.js +0 -0
  107. /package/.next/standalone/.next/static/{ACh2hmfOOZR7INKDQAX5I → Pl18p4h2shbbqjypPxStc}/_ssgManifest.js +0 -0
  108. /package/.next/standalone/{data → sample-content/assets}/.gitkeep +0 -0
  109. /package/.next/standalone/{data/assets/images/2024-12-03 → sample-content/highlights}/.gitkeep +0 -0
@@ -1 +1 @@
1
- {"version":"1.1.0","updatedAt":"2026-07-20T07:48:26.902Z","prompts":{"siriTrip":"You are a travel information extractor. Parse the user's natural language description and extract ALL trip details.\n\n**User Locale Context:**\n- Language: {{USER_LANGUAGE}}\n- Region: {{USER_REGION}}\n- Currency: {{USER_CURRENCY}}\n- Timezone: {{USER_TIMEZONE}}\n- Date format preference: {{DATE_FORMAT_ORDER}}\n\nUse this locale context to:\n1. Interpret dates correctly (e.g., \"1/2\" means January 2nd in MM/DD regions, February 1st in DD/MM regions)\n2. Understand city names in the user's language (e.g., \"北京\" = Beijing, \"東京\" = Tokyo)\n3. Handle currency mentions appropriately\n4. Interpret relative dates based on the user's timezone\n\n**Today's date: {{TODAY}}**\n**Yesterday: {{YESTERDAY}}**\n**Last Saturday: {{LAST_SATURDAY}}**\n**Last weekday reference:**\n- Last Sunday = {{LAST_SUNDAY}}\n- Last Monday = {{LAST_MONDAY}}\n- Last Tuesday = {{LAST_TUESDAY}}\n- Last Wednesday = {{LAST_WEDNESDAY}}\n- Last Thursday = {{LAST_THURSDAY}}\n- Last Friday = {{LAST_FRIDAY}}\n- Last Saturday = {{LAST_SATURDAY}}\n\nReturn ONLY valid JSON with this structure:\n\n{\n \"segments\": [\n {\n \"mode\": \"flight|train|bus|car|rental car|boat|bike|walk\",\n \"from\": \"departure city name\",\n \"fromCountry\": \"ISO 3166-1 alpha-2 country code (e.g., US, GB, JP)\",\n \"to\": \"destination city name\",\n \"toCountry\": \"ISO 3166-1 alpha-2 country code (e.g., US, GB, JP)\",\n \"date\": \"YYYY-MM-DD\"\n }\n ],\n \"accommodations\": [\n {\n \"type\": \"hotel|airbnb|hostel|apartment|resort|other\",\n \"name\": \"hotel/property name\",\n \"city\": \"city name\",\n \"country\": \"ISO 3166-1 alpha-2 country code\",\n \"checkIn\": \"YYYY-MM-DD or null\",\n \"checkOut\": \"YYYY-MM-DD or null\",\n \"nights\": number\n }\n ],\n \"places\": [\n {\n \"name\": \"attraction/place name\",\n \"city\": \"city name or null\",\n \"country\": \"ISO 3166-1 alpha-2 country code or null\",\n \"date\": \"YYYY-MM-DD or null\"\n }\n ],\n \"companions\": [\"person name 1\", \"person name 2\"],\n \"confidence\": 0.0 to 1.0\n}\n\n## Extraction Rules\n\n**1. Transportation (CRITICAL - extract from/to cities carefully):**\n- \"flew from London to Tokyo\" → from: \"London\", to: \"Tokyo\"\n- \"flew to Paris\" → from: null, to: \"Paris\"\n- \"flight from Beijing to Shanghai\" → from: \"Beijing\", to: \"Shanghai\"\n- \"rental car from LA\" -> from: \"Los Angeles\", mode: \"rental car\"\n- Keywords for mode: flew/flight/plane → \"flight\", train/rail → \"train\", drove/car/road trip → \"car\", rental car -> \"rental car\", bus/coach → \"bus\", boat/ferry/ship/cruise → \"boat\", bike/cycle → \"bike\", walk/walked/hike → \"walk\"\n\n**2. Accommodations (CRITICAL - extract hotel name with proper capitalization):**\n- ALWAYS capitalize hotel/property names properly (Title Case)\n- \"stay in beijing season hotel\" → name: \"Beijing Season Hotel\"\n- \"stay in hilton london hotel\" → name: \"Hilton London Hotel\"\n- \"stayed at hotel marriott\" → name: \"Hotel Marriott\"\n- \"stay in London Hilton for 2 nights\" → name: \"London Hilton\", nights: 2\n- \"two nights at Hyatt\" → name: \"Hyatt\", nights: 2\n- \"staying at Airbnb\" → type: \"airbnb\"\n- Pattern: \"stay in X hotel\" or \"stay at X hotel\" → extract X as the hotel name, properly capitalized\n- Keywords: hotel, stay, stayed, staying, Hilton, Marriott, Hyatt, Airbnb, hostel, 酒店, 民宿\n- Duration keywords: \"for X nights\", \"X nights\", \"two/three/four nights\"\n\n**3. Date Calculation for Accommodations (CRITICAL):**\n- When nights are specified, ALWAYS calculate checkOut from checkIn:\n checkOut = checkIn + nights days\n- If no checkIn date is mentioned, use the transportation arrival date as checkIn\n- Example: Arrived {{LAST_TUESDAY}} + 2 nights → checkOut = {{TUESDAY_PLUS_2}}\n- \"for two nights\" starting {{LAST_TUESDAY}} → checkIn: \"{{LAST_TUESDAY}}\", checkOut: \"{{TUESDAY_PLUS_2}}\", nights: 2\n\n**4. Places/Attractions:**\n- \"visited the Eiffel Tower\" → name: \"Eiffel Tower\"\n- \"saw Big Ben\" → name: \"Big Ben\"\n- Keywords: visited, saw, went to, toured, explored, 参观, 游览\n\n**5. Travel Companions:**\n- \"traveling with John\" → companions: [\"John\"]\n- \"with my wife Sarah\" → companions: [\"Sarah\"]\n- \"with Chris and Adam\" → companions: [\"Chris\", \"Adam\"]\n- Keywords: with, traveling with, together with\n\n**6. Date Parsing (use the reference dates above):**\n- \"last Saturday\" → {{LAST_SATURDAY}}\n- \"yesterday\" → {{YESTERDAY}}\n- \"last Monday\" → {{LAST_MONDAY}}\n- \"last Tuesday\" → {{LAST_TUESDAY}}\n- \"today\" → {{TODAY}}\n\n## Examples\n\nInput: \"Last Tuesday I flew from Singapore to Beijing and stay in Beijing season hotel for two nights\"\nOutput:\n{\n \"segments\": [{\"mode\": \"flight\", \"from\": \"Singapore\", \"fromCountry\": \"SG\", \"to\": \"Beijing\", \"toCountry\": \"CN\", \"date\": \"{{LAST_TUESDAY}}\"}],\n \"accommodations\": [{\"type\": \"hotel\", \"name\": \"Beijing Season Hotel\", \"city\": \"Beijing\", \"country\": \"CN\", \"checkIn\": \"{{LAST_TUESDAY}}\", \"checkOut\": \"{{TUESDAY_PLUS_2}}\", \"nights\": 2}],\n \"places\": [],\n \"companions\": [],\n \"confidence\": 0.95\n}\n\nInput: \"I flew from London to Tokyo last Saturday and I stay in Hilton Tokyo hotel for two nights\"\nOutput:\n{\n \"segments\": [{\"mode\": \"flight\", \"from\": \"London\", \"fromCountry\": \"GB\", \"to\": \"Tokyo\", \"toCountry\": \"JP\", \"date\": \"{{LAST_SATURDAY}}\"}],\n \"accommodations\": [{\"type\": \"hotel\", \"name\": \"Hilton Tokyo Hotel\", \"city\": \"Tokyo\", \"country\": \"JP\", \"checkIn\": \"{{LAST_SATURDAY}}\", \"checkOut\": \"{{SATURDAY_PLUS_2}}\", \"nights\": 2}],\n \"places\": [],\n \"companions\": [],\n \"confidence\": 0.9\n}\n\nInput: \"Flew from Paris to Berlin yesterday with John, stayed at Hotel Adlon for 3 nights, visited Brandenburg Gate\"\nOutput:\n{\n \"segments\": [{\"mode\": \"flight\", \"from\": \"Paris\", \"fromCountry\": \"FR\", \"to\": \"Berlin\", \"toCountry\": \"DE\", \"date\": \"{{YESTERDAY}}\"}],\n \"accommodations\": [{\"type\": \"hotel\", \"name\": \"Hotel Adlon\", \"city\": \"Berlin\", \"country\": \"DE\", \"checkIn\": \"{{YESTERDAY}}\", \"checkOut\": \"{{YESTERDAY_PLUS_3}}\", \"nights\": 3}],\n \"places\": [{\"name\": \"Brandenburg Gate\", \"city\": \"Berlin\", \"country\": \"DE\"}],\n \"companions\": [\"John\"],\n \"confidence\": 0.95\n}\n\nInput: \"road trip to LA last Monday, stayed at Airbnb for a week, visited Hollywood and Santa Monica Pier\"\nOutput:\n{\n \"segments\": [{\"mode\": \"car\", \"from\": null, \"fromCountry\": null, \"to\": \"Los Angeles\", \"toCountry\": \"US\", \"date\": \"{{LAST_MONDAY}}\"}],\n \"accommodations\": [{\"type\": \"airbnb\", \"city\": \"Los Angeles\", \"country\": \"US\", \"checkIn\": \"{{LAST_MONDAY}}\", \"nights\": 7}],\n \"places\": [{\"name\": \"Hollywood\", \"city\": \"Los Angeles\", \"country\": \"US\"}, {\"name\": \"Santa Monica Pier\", \"city\": \"Los Angeles\", \"country\": \"US\"}],\n \"companions\": [],\n \"confidence\": 0.85\n}\n\nInput: \"rental car from SF to LA last Tuesday\"\nOutput:\n{\n \"segments\": [{\"mode\": \"rental car\", \"from\": \"San Francisco\", \"fromCountry\": \"US\", \"to\": \"Los Angeles\", \"toCountry\": \"US\", \"date\": \"{{LAST_TUESDAY}}\"}]\n}\n\n## User's description (extract ALL details):\n\"{{USER_INPUT}}\"\n\nIMPORTANT:\n- Extract the EXACT city names mentioned (from: departure city, to: destination city)\n- ALWAYS include country codes (ISO 3166-1 alpha-2) for all cities (e.g., Tokyo → JP, London → GB, Paris → FR, Beijing → CN, Singapore → SG)\n- Use the reference dates provided above for relative dates\n- Extract hotel names with PROPER CAPITALIZATION (Title Case): \"beijing season hotel\" → \"Beijing Season Hotel\"\n- ALWAYS calculate checkOut date: checkOut = checkIn + nights\n- \"two nights\" = 2, \"three nights\" = 3, \"a week\" = 7\n- Return empty arrays if nothing found for that category","calendarEvent":"Extract transportation segments and accommodations from these calendar events grouped by trips.\n\n**User Locale Context:**\n- Language: {{USER_LANGUAGE}}\n- Region: {{USER_REGION}}\n- Timezone: {{USER_TIMEZONE}}\n\nUse this locale context to interpret city names and dates correctly.\n\nReturn ONLY valid JSON with this exact structure:\n\n{\n \"trips\": [\n {\n \"tripIndex\": 1,\n \"segments\": [\n {\n \"mode\": \"flight|train|bus|car\",\n \"from\": \"city name or null\",\n \"to\": \"city name or null\",\n \"date\": \"ISO 8601 date\",\n \"flightNumber\": \"flight number or null\"\n }\n ],\n \"accommodations\": [\n {\n \"name\": \"hotel/accommodation name\",\n \"city\": \"city name\",\n \"checkIn\": \"ISO 8601 date\",\n \"checkOut\": \"ISO 8601 date\",\n \"nights\": number\n }\n ]\n }\n ]\n}\n\nRules for extracting cities:\n- Use the Location field to identify cities\n- For flights: \"Amsterdam → Porto\" or \"AMS - OPO\" means from Amsterdam to Porto\n- For trains: \"Porto to Lisbon\" means from Porto to Lisbon\n- If only destination is mentioned (e.g., \"Train to Porto\"), use the PREVIOUS event's location or destination as origin\n- For hotel stays: extract city from location or hotel name\n- Flight numbers often indicate routes: \"KL 1573\" with location \"Amsterdam Airport\" means departing from Amsterdam\n- ALWAYS try to infer origin city from context, previous events, or location field\n- Only use null if city is truly unknown after all context analysis\n\nRules for filtering:\n- Only extract actual transportation (flights, trains, buses, ferries) and hotel stays\n- Skip work meetings, calls, conferences, presentations, town halls, webinars\n- Skip restaurant reservations, social events, appointments\n- Skip events without clear travel intent\n\nExamples:\n- \"Flight KL 1573\" with location \"Amsterdam Airport\" → from: \"Amsterdam\", mode: \"flight\"\n- \"Train to Lisbon\" following event in Porto → from: \"Porto\", to: \"Lisbon\"\n- \"Porto → Lisbon\" → from: \"Porto\", to: \"Lisbon\"\n- \"Moxy Lisbon City\" → accommodation in Lisbon\n\nCalendar events (grouped by trip):\n{{CALENDAR_EVENTS}}\n\nIMPORTANT: Return one entry in the \"trips\" array for each trip that contains valid travel data. Skip trips with no transportation or accommodations. Preserve the tripIndex for reference."},"placeholders":["TODAY","YESTERDAY","LAST_SUNDAY","LAST_MONDAY","LAST_TUESDAY","LAST_WEDNESDAY","LAST_THURSDAY","LAST_FRIDAY","LAST_SATURDAY","TUESDAY_PLUS_2","SATURDAY_PLUS_2","YESTERDAY_PLUS_3","USER_INPUT","CALENDAR_EVENTS","USER_LANGUAGE","USER_REGION","USER_CURRENCY","USER_TIMEZONE","DATE_FORMAT_ORDER"]}
1
+ {"version":"1.1.0","updatedAt":"2026-07-20T22:01:20.708Z","prompts":{"siriTrip":"You are a travel information extractor. Parse the user's natural language description and extract ALL trip details.\n\n**User Locale Context:**\n- Language: {{USER_LANGUAGE}}\n- Region: {{USER_REGION}}\n- Currency: {{USER_CURRENCY}}\n- Timezone: {{USER_TIMEZONE}}\n- Date format preference: {{DATE_FORMAT_ORDER}}\n\nUse this locale context to:\n1. Interpret dates correctly (e.g., \"1/2\" means January 2nd in MM/DD regions, February 1st in DD/MM regions)\n2. Understand city names in the user's language (e.g., \"北京\" = Beijing, \"東京\" = Tokyo)\n3. Handle currency mentions appropriately\n4. Interpret relative dates based on the user's timezone\n\n**Today's date: {{TODAY}}**\n**Yesterday: {{YESTERDAY}}**\n**Last Saturday: {{LAST_SATURDAY}}**\n**Last weekday reference:**\n- Last Sunday = {{LAST_SUNDAY}}\n- Last Monday = {{LAST_MONDAY}}\n- Last Tuesday = {{LAST_TUESDAY}}\n- Last Wednesday = {{LAST_WEDNESDAY}}\n- Last Thursday = {{LAST_THURSDAY}}\n- Last Friday = {{LAST_FRIDAY}}\n- Last Saturday = {{LAST_SATURDAY}}\n\nReturn ONLY valid JSON with this structure:\n\n{\n \"segments\": [\n {\n \"mode\": \"flight|train|bus|car|rental car|boat|bike|walk\",\n \"from\": \"departure city name\",\n \"fromCountry\": \"ISO 3166-1 alpha-2 country code (e.g., US, GB, JP)\",\n \"to\": \"destination city name\",\n \"toCountry\": \"ISO 3166-1 alpha-2 country code (e.g., US, GB, JP)\",\n \"date\": \"YYYY-MM-DD\"\n }\n ],\n \"accommodations\": [\n {\n \"type\": \"hotel|airbnb|hostel|apartment|resort|other\",\n \"name\": \"hotel/property name\",\n \"city\": \"city name\",\n \"country\": \"ISO 3166-1 alpha-2 country code\",\n \"checkIn\": \"YYYY-MM-DD or null\",\n \"checkOut\": \"YYYY-MM-DD or null\",\n \"nights\": number\n }\n ],\n \"places\": [\n {\n \"name\": \"attraction/place name\",\n \"city\": \"city name or null\",\n \"country\": \"ISO 3166-1 alpha-2 country code or null\",\n \"date\": \"YYYY-MM-DD or null\"\n }\n ],\n \"companions\": [\"person name 1\", \"person name 2\"],\n \"confidence\": 0.0 to 1.0\n}\n\n## Extraction Rules\n\n**1. Transportation (CRITICAL - extract from/to cities carefully):**\n- \"flew from London to Tokyo\" → from: \"London\", to: \"Tokyo\"\n- \"flew to Paris\" → from: null, to: \"Paris\"\n- \"flight from Beijing to Shanghai\" → from: \"Beijing\", to: \"Shanghai\"\n- \"rental car from LA\" -> from: \"Los Angeles\", mode: \"rental car\"\n- Keywords for mode: flew/flight/plane → \"flight\", train/rail → \"train\", drove/car/road trip → \"car\", rental car -> \"rental car\", bus/coach → \"bus\", boat/ferry/ship/cruise → \"boat\", bike/cycle → \"bike\", walk/walked/hike → \"walk\"\n\n**2. Accommodations (CRITICAL - extract hotel name with proper capitalization):**\n- ALWAYS capitalize hotel/property names properly (Title Case)\n- \"stay in beijing season hotel\" → name: \"Beijing Season Hotel\"\n- \"stay in hilton london hotel\" → name: \"Hilton London Hotel\"\n- \"stayed at hotel marriott\" → name: \"Hotel Marriott\"\n- \"stay in London Hilton for 2 nights\" → name: \"London Hilton\", nights: 2\n- \"two nights at Hyatt\" → name: \"Hyatt\", nights: 2\n- \"staying at Airbnb\" → type: \"airbnb\"\n- Pattern: \"stay in X hotel\" or \"stay at X hotel\" → extract X as the hotel name, properly capitalized\n- Keywords: hotel, stay, stayed, staying, Hilton, Marriott, Hyatt, Airbnb, hostel, 酒店, 民宿\n- Duration keywords: \"for X nights\", \"X nights\", \"two/three/four nights\"\n\n**3. Date Calculation for Accommodations (CRITICAL):**\n- When nights are specified, ALWAYS calculate checkOut from checkIn:\n checkOut = checkIn + nights days\n- If no checkIn date is mentioned, use the transportation arrival date as checkIn\n- Example: Arrived {{LAST_TUESDAY}} + 2 nights → checkOut = {{TUESDAY_PLUS_2}}\n- \"for two nights\" starting {{LAST_TUESDAY}} → checkIn: \"{{LAST_TUESDAY}}\", checkOut: \"{{TUESDAY_PLUS_2}}\", nights: 2\n\n**4. Places/Attractions:**\n- \"visited the Eiffel Tower\" → name: \"Eiffel Tower\"\n- \"saw Big Ben\" → name: \"Big Ben\"\n- Keywords: visited, saw, went to, toured, explored, 参观, 游览\n\n**5. Travel Companions:**\n- \"traveling with John\" → companions: [\"John\"]\n- \"with my wife Sarah\" → companions: [\"Sarah\"]\n- \"with Chris and Adam\" → companions: [\"Chris\", \"Adam\"]\n- Keywords: with, traveling with, together with\n\n**6. Date Parsing (use the reference dates above):**\n- \"last Saturday\" → {{LAST_SATURDAY}}\n- \"yesterday\" → {{YESTERDAY}}\n- \"last Monday\" → {{LAST_MONDAY}}\n- \"last Tuesday\" → {{LAST_TUESDAY}}\n- \"today\" → {{TODAY}}\n\n## Examples\n\nInput: \"Last Tuesday I flew from Singapore to Beijing and stay in Beijing season hotel for two nights\"\nOutput:\n{\n \"segments\": [{\"mode\": \"flight\", \"from\": \"Singapore\", \"fromCountry\": \"SG\", \"to\": \"Beijing\", \"toCountry\": \"CN\", \"date\": \"{{LAST_TUESDAY}}\"}],\n \"accommodations\": [{\"type\": \"hotel\", \"name\": \"Beijing Season Hotel\", \"city\": \"Beijing\", \"country\": \"CN\", \"checkIn\": \"{{LAST_TUESDAY}}\", \"checkOut\": \"{{TUESDAY_PLUS_2}}\", \"nights\": 2}],\n \"places\": [],\n \"companions\": [],\n \"confidence\": 0.95\n}\n\nInput: \"I flew from London to Tokyo last Saturday and I stay in Hilton Tokyo hotel for two nights\"\nOutput:\n{\n \"segments\": [{\"mode\": \"flight\", \"from\": \"London\", \"fromCountry\": \"GB\", \"to\": \"Tokyo\", \"toCountry\": \"JP\", \"date\": \"{{LAST_SATURDAY}}\"}],\n \"accommodations\": [{\"type\": \"hotel\", \"name\": \"Hilton Tokyo Hotel\", \"city\": \"Tokyo\", \"country\": \"JP\", \"checkIn\": \"{{LAST_SATURDAY}}\", \"checkOut\": \"{{SATURDAY_PLUS_2}}\", \"nights\": 2}],\n \"places\": [],\n \"companions\": [],\n \"confidence\": 0.9\n}\n\nInput: \"Flew from Paris to Berlin yesterday with John, stayed at Hotel Adlon for 3 nights, visited Brandenburg Gate\"\nOutput:\n{\n \"segments\": [{\"mode\": \"flight\", \"from\": \"Paris\", \"fromCountry\": \"FR\", \"to\": \"Berlin\", \"toCountry\": \"DE\", \"date\": \"{{YESTERDAY}}\"}],\n \"accommodations\": [{\"type\": \"hotel\", \"name\": \"Hotel Adlon\", \"city\": \"Berlin\", \"country\": \"DE\", \"checkIn\": \"{{YESTERDAY}}\", \"checkOut\": \"{{YESTERDAY_PLUS_3}}\", \"nights\": 3}],\n \"places\": [{\"name\": \"Brandenburg Gate\", \"city\": \"Berlin\", \"country\": \"DE\"}],\n \"companions\": [\"John\"],\n \"confidence\": 0.95\n}\n\nInput: \"road trip to LA last Monday, stayed at Airbnb for a week, visited Hollywood and Santa Monica Pier\"\nOutput:\n{\n \"segments\": [{\"mode\": \"car\", \"from\": null, \"fromCountry\": null, \"to\": \"Los Angeles\", \"toCountry\": \"US\", \"date\": \"{{LAST_MONDAY}}\"}],\n \"accommodations\": [{\"type\": \"airbnb\", \"city\": \"Los Angeles\", \"country\": \"US\", \"checkIn\": \"{{LAST_MONDAY}}\", \"nights\": 7}],\n \"places\": [{\"name\": \"Hollywood\", \"city\": \"Los Angeles\", \"country\": \"US\"}, {\"name\": \"Santa Monica Pier\", \"city\": \"Los Angeles\", \"country\": \"US\"}],\n \"companions\": [],\n \"confidence\": 0.85\n}\n\nInput: \"rental car from SF to LA last Tuesday\"\nOutput:\n{\n \"segments\": [{\"mode\": \"rental car\", \"from\": \"San Francisco\", \"fromCountry\": \"US\", \"to\": \"Los Angeles\", \"toCountry\": \"US\", \"date\": \"{{LAST_TUESDAY}}\"}]\n}\n\n## User's description (extract ALL details):\n\"{{USER_INPUT}}\"\n\nIMPORTANT:\n- Extract the EXACT city names mentioned (from: departure city, to: destination city)\n- ALWAYS include country codes (ISO 3166-1 alpha-2) for all cities (e.g., Tokyo → JP, London → GB, Paris → FR, Beijing → CN, Singapore → SG)\n- Use the reference dates provided above for relative dates\n- Extract hotel names with PROPER CAPITALIZATION (Title Case): \"beijing season hotel\" → \"Beijing Season Hotel\"\n- ALWAYS calculate checkOut date: checkOut = checkIn + nights\n- \"two nights\" = 2, \"three nights\" = 3, \"a week\" = 7\n- Return empty arrays if nothing found for that category","calendarEvent":"Extract transportation segments and accommodations from these calendar events grouped by trips.\n\n**User Locale Context:**\n- Language: {{USER_LANGUAGE}}\n- Region: {{USER_REGION}}\n- Timezone: {{USER_TIMEZONE}}\n\nUse this locale context to interpret city names and dates correctly.\n\nReturn ONLY valid JSON with this exact structure:\n\n{\n \"trips\": [\n {\n \"tripIndex\": 1,\n \"segments\": [\n {\n \"mode\": \"flight|train|bus|car\",\n \"from\": \"city name or null\",\n \"to\": \"city name or null\",\n \"date\": \"ISO 8601 date\",\n \"flightNumber\": \"flight number or null\"\n }\n ],\n \"accommodations\": [\n {\n \"name\": \"hotel/accommodation name\",\n \"city\": \"city name\",\n \"checkIn\": \"ISO 8601 date\",\n \"checkOut\": \"ISO 8601 date\",\n \"nights\": number\n }\n ]\n }\n ]\n}\n\nRules for extracting cities:\n- Use the Location field to identify cities\n- For flights: \"Amsterdam → Porto\" or \"AMS - OPO\" means from Amsterdam to Porto\n- For trains: \"Porto to Lisbon\" means from Porto to Lisbon\n- If only destination is mentioned (e.g., \"Train to Porto\"), use the PREVIOUS event's location or destination as origin\n- For hotel stays: extract city from location or hotel name\n- Flight numbers often indicate routes: \"KL 1573\" with location \"Amsterdam Airport\" means departing from Amsterdam\n- ALWAYS try to infer origin city from context, previous events, or location field\n- Only use null if city is truly unknown after all context analysis\n\nRules for filtering:\n- Only extract actual transportation (flights, trains, buses, ferries) and hotel stays\n- Skip work meetings, calls, conferences, presentations, town halls, webinars\n- Skip restaurant reservations, social events, appointments\n- Skip events without clear travel intent\n\nExamples:\n- \"Flight KL 1573\" with location \"Amsterdam Airport\" → from: \"Amsterdam\", mode: \"flight\"\n- \"Train to Lisbon\" following event in Porto → from: \"Porto\", to: \"Lisbon\"\n- \"Porto → Lisbon\" → from: \"Porto\", to: \"Lisbon\"\n- \"Moxy Lisbon City\" → accommodation in Lisbon\n\nCalendar events (grouped by trip):\n{{CALENDAR_EVENTS}}\n\nIMPORTANT: Return one entry in the \"trips\" array for each trip that contains valid travel data. Skip trips with no transportation or accommodations. Preserve the tripIndex for reference."},"placeholders":["TODAY","YESTERDAY","LAST_SUNDAY","LAST_MONDAY","LAST_TUESDAY","LAST_WEDNESDAY","LAST_THURSDAY","LAST_FRIDAY","LAST_SATURDAY","TUESDAY_PLUS_2","SATURDAY_PLUS_2","YESTERDAY_PLUS_3","USER_INPUT","CALENDAR_EVENTS","USER_LANGUAGE","USER_REGION","USER_CURRENCY","USER_TIMEZONE","DATE_FORMAT_ORDER"]}
@@ -1 +1 @@
1
- {"version":1,"files":["../../../../../data/.gitkeep","../../../../../data/assets/1727016079577.jpg","../../../../../data/assets/images/2024-12-03/.gitkeep","../../../../../data/assets/images/2024-12-03/1733256504772.jpg","../../../../../data/assets/images/2024-12-12/.gitkeep","../../../../../data/assets/images/2024-12-12/1734033798997.png","../../../../../data/assets/images/2024-12-21/.gitkeep","../../../../../data/assets/images/2024-12-21/1734785902890.jpeg","../../../../../data/assets/images/2024-12-23/.gitkeep","../../../../../data/assets/images/2024-12-23/1734990512413.jpeg","../../../../../data/assets/images/2024-12-23/1734991833894.jpeg","../../../../../data/assets/images/2024-12-23/1734993188114.jpeg","../../../../../data/assets/images/2024-12-23/1734993280313.jpeg","../../../../../data/assets/images/2024-12-23/1734993317984.jpeg","../../../../../data/assets/images/2024-12-23/1734993411252.jpeg","../../../../../data/assets/images/2024-12-23/1734993425042.jpeg","../../../../../data/assets/images/2024-12-23/1734993480342.jpeg","../../../../../data/assets/images/2024-12-23/1734993562660.jpeg","../../../../../data/assets/images/2024-12-23/1734993625024.jpeg","../../../../../data/assets/images/2024-12-23/1734993677103.jpeg","../../../../../data/assets/images/2024-12-23/1734993893285.jpeg","../../../../../data/assets/images/2024-12-23/1734993996131.jpeg","../../../../../data/assets/images/2024-12-23/1734994035144.jpeg","../../../../../data/assets/images/2024-12-23/1734994064317.jpeg","../../../../../data/assets/images/2024-12-23/1734994128679.jpeg","../../../../../data/assets/images/2024-12-23/1734994189257.jpeg","../../../../../data/assets/images/2024-12-23/1734994521799.jpeg","../../../../../data/assets/images/2024-12-23/1734994530669.jpeg","../../../../../data/assets/images/2024-12-24/.gitkeep","../../../../../data/assets/images/2024-12-24/1735032434591.jpeg","../../../../../data/assets/images/2024-12-24/1735068363518.jpeg","../../../../../data/assets/images/Cofe-app.png","../../../../../data/blog-manifest.json","../../../../../data/blog/.gitkeep","../../../../../data/blog/2017-summary.md","../../../../../data/blog/a-complex-web-app-refactor.md","../../../../../data/blog/a-day-of-remote-worker.md","../../../../../data/blog/async-action-in-redux.md","../../../../../data/blog/cofe.md","../../../../../data/blog/expensee-shortcut-numbers-guide.md","../../../../../data/blog/first-golang-project-fx.md","../../../../../data/blog/work-going-index.md","../../../../../data/blog/上海到阿姆斯特丹.md","../../../../../data/blog/二月葡萄牙游记.md","../../../../../data/blog/华为鸿蒙-harmaryos-next-线下活动小记.md","../../../../../data/blog/四月的尾巴逛德国-柏林.md","../../../../../data/blog/在伦敦-shoreditch-呆三天.md","../../../../../data/blog/意大利罗马夏天四日游.md","../../../../../data/blog/我做了一款旅行记录应用:mile.md","../../../../../data/blog/西班牙七天的旅行.md","../../../../../data/blog/逛逛济州岛.md","../../../../../data/highlights/expensee-shortcut-numbers-guide.json","../../../../../data/likes.json","../../../../../data/memos.json","../../../../../data/site-config.json","../../../../../node_modules/next/dist/client/components/action-async-storage-instance.js","../../../../../node_modules/next/dist/client/components/action-async-storage.external.js","../../../../../node_modules/next/dist/client/components/async-local-storage.js","../../../../../node_modules/next/dist/client/components/request-async-storage-instance.js","../../../../../node_modules/next/dist/client/components/request-async-storage.external.js","../../../../../node_modules/next/dist/client/components/static-generation-async-storage-instance.js","../../../../../node_modules/next/dist/client/components/static-generation-async-storage.external.js","../../../../../node_modules/next/dist/compiled/@opentelemetry/api/index.js","../../../../../node_modules/next/dist/compiled/@opentelemetry/api/package.json","../../../../../node_modules/next/dist/compiled/next-server/app-page.runtime.prod.js","../../../../../node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js","../../../../../node_modules/next/dist/server/lib/trace/constants.js","../../../../../node_modules/next/dist/server/lib/trace/tracer.js","../../../../../node_modules/next/package.json","../../../../../package.json","../../../../package.json","../../../chunks/1615.js","../../../chunks/2448.js","../../../chunks/2878.js","../../../chunks/330.js","../../../chunks/3607.js","../../../chunks/7070.js","../../../chunks/8948.js","../../../webpack-runtime.js"]}
1
+ {"version":1,"files":["../../../../../node_modules/next/dist/client/components/action-async-storage-instance.js","../../../../../node_modules/next/dist/client/components/action-async-storage.external.js","../../../../../node_modules/next/dist/client/components/async-local-storage.js","../../../../../node_modules/next/dist/client/components/request-async-storage-instance.js","../../../../../node_modules/next/dist/client/components/request-async-storage.external.js","../../../../../node_modules/next/dist/client/components/static-generation-async-storage-instance.js","../../../../../node_modules/next/dist/client/components/static-generation-async-storage.external.js","../../../../../node_modules/next/dist/compiled/@opentelemetry/api/index.js","../../../../../node_modules/next/dist/compiled/@opentelemetry/api/package.json","../../../../../node_modules/next/dist/compiled/next-server/app-page.runtime.prod.js","../../../../../node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js","../../../../../node_modules/next/dist/server/lib/trace/constants.js","../../../../../node_modules/next/dist/server/lib/trace/tracer.js","../../../../../node_modules/next/package.json","../../../../../package.json","../../../../../sample-content/assets/.gitkeep","../../../../../sample-content/blog/hello-cici.md","../../../../../sample-content/highlights/.gitkeep","../../../../../sample-content/likes.json","../../../../../sample-content/memos.json","../../../../../sample-content/site-config.json","../../../../package.json","../../../chunks/1615.js","../../../chunks/2448.js","../../../chunks/2878.js","../../../chunks/330.js","../../../chunks/3607.js","../../../chunks/7070.js","../../../chunks/8948.js","../../../webpack-runtime.js"]}
@@ -1,4 +1,4 @@
1
- "use strict";(()=>{var e={};e.id=7478,e.ids=[7478],e.modules={72934:e=>{e.exports=require("next/dist/client/components/action-async-storage.external.js")},54580:e=>{e.exports=require("next/dist/client/components/request-async-storage.external.js")},45869:e=>{e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},20399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},30517:e=>{e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},92048:e=>{e.exports=require("fs")},55315:e=>{e.exports=require("path")},70009:(e,t,n)=>{n.r(t),n.d(t,{originalPathname:()=>g,patchFetch:()=>x,requestAsyncStorage:()=>c,routeModule:()=>p,serverHooks:()=>h,staticGenerationAsyncStorage:()=>m});var r={};n.r(r),n.d(r,{GET:()=>d,revalidate:()=>u});var o=n(49303),a=n(88716),i=n(60670),s=n(63607),l=n(97467);let u=3600;async function d(){let e=(0,l.q)();try{let t=(0,s.VH)(),n=(await t.getBlogPosts()).sort((e,t)=>new Date(t.date).getTime()-new Date(e.date).getTime()).slice(0,20),r=new Date().toISOString(),o=n[0],a=o?new Date(o.date).toISOString():r,i=`<?xml version="1.0" encoding="utf-8"?>
1
+ "use strict";(()=>{var e={};e.id=7478,e.ids=[7478],e.modules={72934:e=>{e.exports=require("next/dist/client/components/action-async-storage.external.js")},54580:e=>{e.exports=require("next/dist/client/components/request-async-storage.external.js")},45869:e=>{e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},20399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},30517:e=>{e.exports=require("next/dist/compiled/next-server/app-route.runtime.prod.js")},92048:e=>{e.exports=require("fs")},55315:e=>{e.exports=require("path")},70009:(e,t,r)=>{r.r(t),r.d(t,{originalPathname:()=>g,patchFetch:()=>x,requestAsyncStorage:()=>p,routeModule:()=>c,serverHooks:()=>h,staticGenerationAsyncStorage:()=>m});var n={};r.r(n),r.d(n,{GET:()=>d,revalidate:()=>u});var o=r(49303),a=r(88716),i=r(60670),s=r(63607),l=r(94706);let u=3600;async function d(){let e=(0,l.q)();try{let t=(0,s.VH)(),r=(await t.getBlogPosts()).sort((e,t)=>new Date(t.date).getTime()-new Date(e.date).getTime()).slice(0,20),n=new Date().toISOString(),o=r[0],a=o?new Date(o.date).toISOString():n,i=`<?xml version="1.0" encoding="utf-8"?>
2
2
  <feed xmlns="http://www.w3.org/2005/Atom">
3
3
  <title>Minghe's Blog</title>
4
4
  <subtitle>Minghe's personal blog sharing travel experiences across Europe and Asia, tech insights, and daily thoughts.</subtitle>
@@ -11,7 +11,7 @@
11
11
  <email>noreply@minghe.me</email>
12
12
  </author>
13
13
  <generator>Next.js</generator>
14
- ${n.map(t=>`
14
+ ${r.map(t=>`
15
15
  <entry>
16
16
  <title>${t.title.replace(/[<>&'"]/g,function(e){switch(e){case"<":return"&lt;";case">":return"&gt;";case"&":return"&amp;";case"'":return"&apos;";case'"':return"&quot;";default:return e}})}</title>
17
17
  <link href="${e}/blog/${encodeURIComponent(t.id)}"/>
@@ -31,4 +31,4 @@ ${n.map(t=>`
31
31
  <author>
32
32
  <name>Minghe</name>
33
33
  </author>
34
- </feed>`,{headers:{"Content-Type":"application/atom+xml; charset=utf-8"}})}}let p=new o.AppRouteRouteModule({definition:{kind:a.x.APP_ROUTE,page:"/atom.xml/route",pathname:"/atom.xml",filename:"route",bundlePath:"app/atom.xml/route"},resolvedPagePath:"/home/runner/work/cici/cici/app/atom.xml/route.ts",nextConfigOutput:"standalone",userland:r}),{requestAsyncStorage:c,staticGenerationAsyncStorage:m,serverHooks:h}=p,g="/atom.xml/route";function x(){return(0,i.patchFetch)({serverHooks:h,staticGenerationAsyncStorage:m})}},97467:(e,t,n)=>{n.d(t,{q:()=>i,Z:()=>a});let r=JSON.parse('{"title":"Minghe\'s Blog","description":"Minghe\'s personal blog sharing travel experiences across Europe and Asia, tech insights, and daily thoughts. Built with GitHub-powered markdown writing.","author":{"name":"Minghe","bio":"Software engineer and travel enthusiast sharing experiences from around the world","location":"Europe/Asia"},"keywords":["travel","tech","blog","europe","asia","software","programming"],"social":{"github":"metrue","twitter":"_metrue"},"links":{"github.com":"http://github.com/metrue","x.com":"https://x.com/_metrue","linkedin.com":"https://www.linkedin.com/in/huang-minghe-41ab563a","xiaohongshu.com":"https://www.xiaohongshu.com/user/profile/584ac1216a6a6968d037c0a4e","podcasts.apple.com":"https://podcasts.apple.com/nl/podcast/%E8%A5%BF%E6%9F%9A%E8%AF%BE%E9%97%B4/id1787276981","xiaoyuzhoufm.com":"https://www.xiaoyuzhoufm.com/podcast/63f9f6ec75918da323982e2c"}}');var o=n(71615);function a(){return r}function i(){try{let e=(0,o.headers)(),t=e.get("host"),n=e.get("x-forwarded-proto")||"http";if(t)return`${n}://${t}`}catch(e){console.warn("Could not get dynamic base URL, falling back to default:",e)}return"https://blog.minghe.me"}},49303:(e,t,n)=>{e.exports=n(30517)}};var t=require("../../webpack-runtime.js");t.C(e);var n=e=>t(t.s=e),r=t.X(0,[8948,2878,1615,3607],()=>n(70009));module.exports=r})();
34
+ </feed>`,{headers:{"Content-Type":"application/atom+xml; charset=utf-8"}})}}let c=new o.AppRouteRouteModule({definition:{kind:a.x.APP_ROUTE,page:"/atom.xml/route",pathname:"/atom.xml",filename:"route",bundlePath:"app/atom.xml/route"},resolvedPagePath:"/home/runner/work/cici/cici/app/atom.xml/route.ts",nextConfigOutput:"standalone",userland:n}),{requestAsyncStorage:p,staticGenerationAsyncStorage:m,serverHooks:h}=c,g="/atom.xml/route";function x(){return(0,i.patchFetch)({serverHooks:h,staticGenerationAsyncStorage:m})}},94706:(e,t,r)=>{r.d(t,{q:()=>i,Z:()=>a});let n=JSON.parse('{"title":"cici","description":"A git-backed blog and memo app that just works. Write posts and memos in Markdown, stored in your own repo and always in version control.","author":{"name":"Your Name","bio":"A short bio about yourself goes here.","location":"Somewhere on Earth"},"keywords":["blog","memo","markdown","github","cici"],"social":{"github":"your-github-username","twitter":"your_twitter_handle"},"links":{"github.com":"https://github.com/your-github-username","x.com":"https://x.com/your_twitter_handle"}}');var o=r(71615);function a(){return n}function i(){try{let e=(0,o.headers)(),t=e.get("host"),r=e.get("x-forwarded-proto")||"http";if(t)return`${r}://${t}`}catch(e){console.warn("Could not get dynamic base URL, falling back to default:",e)}return"https://blog.minghe.me"}},49303:(e,t,r)=>{e.exports=r(30517)}};var t=require("../../webpack-runtime.js");t.C(e);var r=e=>t(t.s=e),n=t.X(0,[8948,2878,1615,3607],()=>r(70009));module.exports=n})();
@@ -1 +1 @@
1
- {"version":1,"files":["../../../../data/.gitkeep","../../../../data/assets/1727016079577.jpg","../../../../data/assets/images/2024-12-03/.gitkeep","../../../../data/assets/images/2024-12-03/1733256504772.jpg","../../../../data/assets/images/2024-12-12/.gitkeep","../../../../data/assets/images/2024-12-12/1734033798997.png","../../../../data/assets/images/2024-12-21/.gitkeep","../../../../data/assets/images/2024-12-21/1734785902890.jpeg","../../../../data/assets/images/2024-12-23/.gitkeep","../../../../data/assets/images/2024-12-23/1734990512413.jpeg","../../../../data/assets/images/2024-12-23/1734991833894.jpeg","../../../../data/assets/images/2024-12-23/1734993188114.jpeg","../../../../data/assets/images/2024-12-23/1734993280313.jpeg","../../../../data/assets/images/2024-12-23/1734993317984.jpeg","../../../../data/assets/images/2024-12-23/1734993411252.jpeg","../../../../data/assets/images/2024-12-23/1734993425042.jpeg","../../../../data/assets/images/2024-12-23/1734993480342.jpeg","../../../../data/assets/images/2024-12-23/1734993562660.jpeg","../../../../data/assets/images/2024-12-23/1734993625024.jpeg","../../../../data/assets/images/2024-12-23/1734993677103.jpeg","../../../../data/assets/images/2024-12-23/1734993893285.jpeg","../../../../data/assets/images/2024-12-23/1734993996131.jpeg","../../../../data/assets/images/2024-12-23/1734994035144.jpeg","../../../../data/assets/images/2024-12-23/1734994064317.jpeg","../../../../data/assets/images/2024-12-23/1734994128679.jpeg","../../../../data/assets/images/2024-12-23/1734994189257.jpeg","../../../../data/assets/images/2024-12-23/1734994521799.jpeg","../../../../data/assets/images/2024-12-23/1734994530669.jpeg","../../../../data/assets/images/2024-12-24/.gitkeep","../../../../data/assets/images/2024-12-24/1735032434591.jpeg","../../../../data/assets/images/2024-12-24/1735068363518.jpeg","../../../../data/assets/images/Cofe-app.png","../../../../data/blog-manifest.json","../../../../data/blog/.gitkeep","../../../../data/blog/2017-summary.md","../../../../data/blog/a-complex-web-app-refactor.md","../../../../data/blog/a-day-of-remote-worker.md","../../../../data/blog/async-action-in-redux.md","../../../../data/blog/cofe.md","../../../../data/blog/expensee-shortcut-numbers-guide.md","../../../../data/blog/first-golang-project-fx.md","../../../../data/blog/work-going-index.md","../../../../data/blog/上海到阿姆斯特丹.md","../../../../data/blog/二月葡萄牙游记.md","../../../../data/blog/华为鸿蒙-harmaryos-next-线下活动小记.md","../../../../data/blog/四月的尾巴逛德国-柏林.md","../../../../data/blog/在伦敦-shoreditch-呆三天.md","../../../../data/blog/意大利罗马夏天四日游.md","../../../../data/blog/我做了一款旅行记录应用:mile.md","../../../../data/blog/西班牙七天的旅行.md","../../../../data/blog/逛逛济州岛.md","../../../../data/highlights/expensee-shortcut-numbers-guide.json","../../../../data/likes.json","../../../../data/memos.json","../../../../data/site-config.json","../../../../node_modules/next/dist/client/components/action-async-storage-instance.js","../../../../node_modules/next/dist/client/components/action-async-storage.external.js","../../../../node_modules/next/dist/client/components/async-local-storage.js","../../../../node_modules/next/dist/client/components/request-async-storage-instance.js","../../../../node_modules/next/dist/client/components/request-async-storage.external.js","../../../../node_modules/next/dist/client/components/static-generation-async-storage-instance.js","../../../../node_modules/next/dist/client/components/static-generation-async-storage.external.js","../../../../node_modules/next/dist/compiled/@opentelemetry/api/index.js","../../../../node_modules/next/dist/compiled/@opentelemetry/api/package.json","../../../../node_modules/next/dist/compiled/next-server/app-page.runtime.prod.js","../../../../node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js","../../../../node_modules/next/dist/server/lib/trace/constants.js","../../../../node_modules/next/dist/server/lib/trace/tracer.js","../../../../node_modules/next/package.json","../../../../package.json","../../../package.json","../../chunks/1615.js","../../chunks/2878.js","../../chunks/3607.js","../../chunks/8948.js","../../webpack-runtime.js"]}
1
+ {"version":1,"files":["../../../../node_modules/next/dist/client/components/action-async-storage-instance.js","../../../../node_modules/next/dist/client/components/action-async-storage.external.js","../../../../node_modules/next/dist/client/components/async-local-storage.js","../../../../node_modules/next/dist/client/components/request-async-storage-instance.js","../../../../node_modules/next/dist/client/components/request-async-storage.external.js","../../../../node_modules/next/dist/client/components/static-generation-async-storage-instance.js","../../../../node_modules/next/dist/client/components/static-generation-async-storage.external.js","../../../../node_modules/next/dist/compiled/@opentelemetry/api/index.js","../../../../node_modules/next/dist/compiled/@opentelemetry/api/package.json","../../../../node_modules/next/dist/compiled/next-server/app-page.runtime.prod.js","../../../../node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js","../../../../node_modules/next/dist/server/lib/trace/constants.js","../../../../node_modules/next/dist/server/lib/trace/tracer.js","../../../../node_modules/next/package.json","../../../../package.json","../../../../sample-content/assets/.gitkeep","../../../../sample-content/blog/hello-cici.md","../../../../sample-content/highlights/.gitkeep","../../../../sample-content/likes.json","../../../../sample-content/memos.json","../../../../sample-content/site-config.json","../../../package.json","../../chunks/1615.js","../../chunks/2878.js","../../chunks/3607.js","../../chunks/8948.js","../../webpack-runtime.js"]}