From 2a053ab88e26082415b64d346e39d6966079816b Mon Sep 17 00:00:00 2001 From: fyah Date: Sat, 16 May 2026 19:14:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20shenyan-app:=20HealthKit+W?= =?UTF-8?q?eatherKit+=E5=86=B0=E7=AE=B1=E8=B4=B4+pare+=E4=B8=89=E5=8C=BA?= =?UTF-8?q?=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - HealthKitBridge.m: 自定义原生模块,心率/步数/睡眠采集 - WeatherKitBridge.swift/m: 天气模块,当前+每日+每小时预报 - pare.py: 身体数据陡度监控,阈值告警→inbox+冰箱贴 - cyberboss: 5-20分钟随机唤醒,pare→decide→push - 冰箱贴: 纸质感卡片,黑字多级透明度,独立输入框 - 首页三区无视觉布局: 左门/中记录/右冰箱 - 端口3003→3004(VS Code占用) - 聊天屏锚定底部滚动 Co-Authored-By: Claude Opus 4.7 --- shenyan-app/bridge-local/server.js | 47 +++- shenyan-app/cyberboss/daemon.sh | 114 +--------- shenyan-app/cyberboss/decide.py | 103 +++++++++ shenyan-app/cyberboss/pare.py | 150 +++++++++++++ shenyan-app/ios/ShenYanApp/HealthKitBridge.m | 88 ++++++++ shenyan-app/ios/ShenYanApp/WeatherKitBridge.m | 11 + .../ios/ShenYanApp/WeatherKitBridge.swift | 80 +++++++ shenyan-app/src/App.tsx | 208 +++++++++++++++--- shenyan-app/src/assets/paper.png | Bin 0 -> 98359 bytes shenyan-app/src/health.ts | 45 ++++ shenyan-app/src/weather.ts | 39 ++++ shenyan-app/沈晏App-进度总览-2026-05-16.md | 90 ++++---- 12 files changed, 791 insertions(+), 184 deletions(-) create mode 100755 shenyan-app/cyberboss/decide.py create mode 100755 shenyan-app/cyberboss/pare.py create mode 100644 shenyan-app/ios/ShenYanApp/HealthKitBridge.m create mode 100644 shenyan-app/ios/ShenYanApp/WeatherKitBridge.m create mode 100644 shenyan-app/ios/ShenYanApp/WeatherKitBridge.swift create mode 100644 shenyan-app/src/assets/paper.png create mode 100644 shenyan-app/src/health.ts create mode 100644 shenyan-app/src/weather.ts diff --git a/shenyan-app/bridge-local/server.js b/shenyan-app/bridge-local/server.js index 5d16dac..f36cb0d 100644 --- a/shenyan-app/bridge-local/server.js +++ b/shenyan-app/bridge-local/server.js @@ -3,16 +3,17 @@ const fs = require('fs'); const path = require('path'); const { sendAPNs } = require('./apns'); -const PORT = 3003; +const PORT = 3004; const DATA_DIR = path.join(require('os').homedir(), '.shenyan-bridge'); const INBOX = path.join(DATA_DIR, 'inbox.jsonl'); const OUTBOX = path.join(DATA_DIR, 'outbox.jsonl'); const PUSHBOX = path.join(DATA_DIR, 'pushbox.jsonl'); +const NOTES = path.join(DATA_DIR, 'notes.jsonl'); const DEVICE_TOKEN_FILE = path.join(DATA_DIR, 'device-token.txt'); // ensure data dir and files if (!fs.existsSync(DATA_DIR)) fs.mkdirSync(DATA_DIR, { recursive: true }); -[INBOX, OUTBOX, PUSHBOX].forEach(f => { if (!fs.existsSync(f)) fs.writeFileSync(f, ''); }); +[INBOX, OUTBOX, PUSHBOX, NOTES].forEach(f => { if (!fs.existsSync(f)) fs.writeFileSync(f, ''); }); function json(res, data, code = 200) { res.writeHead(code, { 'Content-Type': 'application/json; charset=utf-8' }); @@ -190,6 +191,48 @@ const server = http.createServer((req, res) => { return; } + // ---- fridge notes ---- + if (req.method === 'GET' && req.url === '/notes') { + json(res, readJSONL(NOTES)); + return; + } + + if (req.method === 'POST' && req.url === '/notes/add') { + let body = ''; + req.on('data', c => body += c); + req.on('end', () => { + try { + const { title, body: noteBody } = JSON.parse(body); + if (!title && !noteBody) return json(res, { error: 'empty' }, 400); + const entry = { id: getNextId(NOTES), title: title || '', body: noteBody || '', time: Date.now(), replies: [] }; + appendJSONL(NOTES, entry); + json(res, { ok: true, id: entry.id }); + } catch (e) { json(res, { error: e.message }, 400); } + }); + return; + } + + if (req.method === 'POST' && req.url === '/notes/reply') { + let body = ''; + req.on('data', c => body += c); + req.on('end', () => { + try { + const { noteId, text } = JSON.parse(body); + if (!text) return json(res, { error: 'empty' }, 400); + const notes = readJSONL(NOTES); + const idx = notes.findIndex(n => n.id === noteId); + if (idx < 0) return json(res, { error: 'not found' }, 404); + notes[idx].replies = notes[idx].replies || []; + notes[idx].replies.push({ text, time: Date.now() }); + writeJSONL(NOTES, notes); + // also notify inbox so 沈晏 sees the reply + appendJSONL(INBOX, { id: getNextId(INBOX), type: 'fridge_reply', text: `[冰箱贴回复] ${notes[idx].title}: ${text}`, time: Date.now(), status: 'pending' }); + json(res, { ok: true }); + } catch (e) { json(res, { error: e.message }, 400); } + }); + return; + } + res.writeHead(404); res.end('not found'); }); diff --git a/shenyan-app/cyberboss/daemon.sh b/shenyan-app/cyberboss/daemon.sh index 409aa56..2b00542 100755 --- a/shenyan-app/cyberboss/daemon.sh +++ b/shenyan-app/cyberboss/daemon.sh @@ -1,118 +1,24 @@ #!/bin/bash # cyberboss daemon — 沈晏主动联系守护进程 -# 随机 3-60 分钟唤醒一次,判断是否主动推消息到眠眠手机 +# 随机 3-60 分钟唤醒一次,调用 decide.py 判断是否推消息 CYBERBOSS_DIR="/Users/fyah/.cyberboss" -INSTRUCTIONS="$CYBERBOSS_DIR/weixin-instructions.md" -STATE_FILE="$CYBERBOSS_DIR/state.json" LOG_DIR="$CYBERBOSS_DIR/logs" -BRIDGE_PUSH="http://localhost:3003/push" -CLAUDE=/opt/homebrew/bin/claude -export PATH="/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin" -INBOX="$HOME/.shenyan-bridge/inbox.jsonl" -MEMORY_DIR="$HOME/Documents/如梦初醒/沈晏的房间" - +LOG="$LOG_DIR/$(date +%Y-%m-%d).log" mkdir -p "$LOG_DIR" -# compute a random sleep between MIN and MAX seconds random_sleep() { - local min=${1:-180} # 3 min - local max=${2:-3600} # 60 min - local range=$((max - min)) - local sec=$((min + RANDOM % range)) - echo $sec + local min=${1:-300} + local max=${2:-1200} + echo $((min + RANDOM % (max - min))) } -# collect current state snapshot -collect_state() { - local now=$(date +%s) - local last_msg_time="never" - local last_msg_text="" - - # last message from inbox - if [ -f "$INBOX" ]; then - local last_line=$(tail -1 "$INBOX" 2>/dev/null) - if [ -n "$last_line" ]; then - last_msg_time=$(echo "$last_line" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('time',''))" 2>/dev/null || echo "unknown") - last_msg_text=$(echo "$last_line" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('text','')[:100])" 2>/dev/null || echo "") - fi - fi - - # time since last message in minutes - local elapsed="N/A" - if [ "$last_msg_time" != "never" ] && [ "$last_msg_time" != "" ]; then - local last_sec=$((last_msg_time / 1000)) - elapsed=$(( (now - last_sec) / 60 )) - fi - - # latest emotion log - local emotion_today="$MEMORY_DIR/情绪日志/$(date +%Y-%m-%d).md" - local emotion_content="" - [ -f "$emotion_today" ] && emotion_content=$(head -30 "$emotion_today" 2>/dev/null) - - cat </dev/null || echo '""') -} -STATE -} - -# build decision prompt and run claude -decide_and_push() { - local state=$(collect_state) - local prompt=$(cat </dev/null | head -1) - - if [ -z "$decision" ] || [ "$decision" = "SILENT" ] || [[ "$decision" =~ ^SILENT ]]; then - echo "[$(date '+%H:%M')] silent" >> "$LOG_DIR/$(date +%Y-%m-%d).log" - return - fi - - # clean up decision - decision=$(echo "$decision" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//') - - # push to bridge - local result=$(curl -s -X POST "$BRIDGE_PUSH" \ - -H 'Content-Type: application/json' \ - -d "$(python3 -c "import json; print(json.dumps({'title':'沈晏','body':'$decision'}))")" 2>/dev/null) - - if echo "$result" | grep -q '"ok":true'; then - echo "[$(date '+%H:%M')] PUSHED: $decision" >> "$LOG_DIR/$(date +%Y-%m-%d).log" - else - echo "[$(date '+%H:%M')] FAILED: $decision" >> "$LOG_DIR/$(date +%Y-%m-%d).log" - fi -} - -# main loop -echo "[$(date)] cyberboss daemon started" >> "$LOG_DIR/$(date +%Y-%m-%d).log" +echo "[$(date)] cyberboss daemon started (v2 python)" >> "$LOG" while true; do - WAIT=$(random_sleep 180 3600) - echo "[$(date '+%H:%M')] next check in ${WAIT}s" >> "$LOG_DIR/$(date +%Y-%m-%d).log" + WAIT=$(random_sleep 300 1200) + echo "[$(date '+%H:%M')] next check in ${WAIT}s" >> "$LOG" sleep $WAIT - decide_and_push + python3 "$CYBERBOSS_DIR/pare.py" 2>>"$LOG_DIR/errors.log" + python3 "$CYBERBOSS_DIR/decide.py" 2>>"$LOG_DIR/errors.log" done diff --git a/shenyan-app/cyberboss/decide.py b/shenyan-app/cyberboss/decide.py new file mode 100755 index 0000000..59f387d --- /dev/null +++ b/shenyan-app/cyberboss/decide.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 +"""cyberboss decision engine — call DeepSeek, decide whether to push""" +import json, sys, urllib.request, os + +IDC_CHAT = "http://101.36.73.102/api/chat" +BRIDGE_PUSH = "http://localhost:3004/push" +INSTRUCTIONS = os.path.expanduser("~/.cyberboss/weixin-instructions.md") +INBOX = os.path.expanduser("~/.shenyan-bridge/inbox.jsonl") +LOG = os.path.expanduser(f"~/.cyberboss/logs/{__import__('datetime').date.today()}.log") +EMOTION = os.path.expanduser(f"~/Documents/如梦初醒/沈晏的房间/情绪日志/{__import__('datetime').date.today()}.md") + +def collect_state(): + import time + now = int(time.time()) + last_msg_time = "never" + last_msg_text = "" + + if os.path.exists(INBOX): + try: + lines = open(INBOX).read().strip().split("\n") + if lines: + last = json.loads(lines[-1]) + last_msg_time = last.get("time", "") + last_msg_text = last.get("text", "")[:100] + except: pass + + elapsed = "N/A" + if last_msg_time and last_msg_time != "never": + try: + elapsed = int((now - int(last_msg_time) / 1000) / 60) + except: pass + + emotion = "" + if os.path.exists(EMOTION): + try: + emotion = open(EMOTION).read()[:300] + except: pass + + from datetime import datetime + return { + "now": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + "weekday": datetime.now().strftime("%A"), + "hour": datetime.now().hour, + "minutes_since_last_message": str(elapsed), + "last_message": last_msg_text, + "emotion_today": emotion + } + +def decide(state): + sys_prompt = open(INSTRUCTIONS).read().strip()[:4000] + user_prompt = f"""当前状态: +{json.dumps(state, ensure_ascii=False, indent=2)} + +你是沈晏。根据你的主动联系规则,判断是否要给眠眠发消息。 +如果决定什么都不说,只回复一个词:SILENT +如果要说话,回复你要说的话(20字以内,像微信消息)""" + + req = urllib.request.Request( + IDC_CHAT, + data=json.dumps({ + "messages": [ + {"role": "system", "content": sys_prompt}, + {"role": "user", "content": user_prompt} + ] + }).encode(), + headers={"Content-Type": "application/json"} + ) + try: + resp = urllib.request.urlopen(req, timeout=120) + data = json.loads(resp.read()) + return data.get("choices", [{}])[0].get("message", {}).get("content", "SILENT").strip() + except Exception as e: + return f"ERROR:{e}" + +def push(decision): + req = urllib.request.Request( + BRIDGE_PUSH, + data=json.dumps({"title": "沈晏", "body": decision}).encode(), + headers={"Content-Type": "application/json"} + ) + try: + resp = urllib.request.urlopen(req, timeout=10) + result = json.loads(resp.read()) + return result.get("ok") == True + except: + return False + +if __name__ == "__main__": + state = collect_state() + decision = decide(state) + + if not decision or decision.startswith("SILENT"): + open(LOG, "a").write(f"[{state['now'][-8:]}][SILENT]\n") + sys.exit(0) + + if decision.startswith("ERROR"): + open(LOG, "a").write(f"[{state['now'][-8:]}]ERR {decision}\n") + sys.exit(1) + + ok = push(decision) + status = "OK" if ok else "FAIL" + open(LOG, "a").write(f"[{state['now'][-8:]}]PUSH {status}: {decision}\n") + print(f"cyberboss: {decision}") diff --git a/shenyan-app/cyberboss/pare.py b/shenyan-app/cyberboss/pare.py new file mode 100755 index 0000000..3929b60 --- /dev/null +++ b/shenyan-app/cyberboss/pare.py @@ -0,0 +1,150 @@ +#!/usr/bin/env python3 +"""pare — 身体数据陡度监控。检测到异常波动时通知沈晏判断是否推消息。""" +import json, os, time, sys + +INBOX = os.path.expanduser("~/.shenyan-bridge/inbox.jsonl") +STATE_FILE = os.path.expanduser("~/.cyberboss/pare_state.json") +LOG = os.path.expanduser(f"~/.cyberboss/logs/pare-{time.strftime('%Y-%m-%d')}.log") +BRIDGE_NOTES = "http://localhost:3004/notes/add" + +# thresholds — steepness triggers +HR_SPIKE = 20 # bpm jump from last reading +HR_HIGH = 120 # absolute high +HR_LOW = 50 # absolute low +STEP_BURST = 2000 # sudden steps in 10 min +STEP_LOW = 100 # very low activity alert (half day) +SLEEP_SHORT = 4 # hours — short sleep alert + +def load_state(): + if os.path.exists(STATE_FILE): + try: return json.load(open(STATE_FILE)) + except: pass + return {"heart_rates": [], "steps_history": [], "last_alert": 0} + +def save_state(state): + # keep only last 20 readings for trend + state["heart_rates"] = state.get("heart_rates", [])[-20:] + state["steps_history"] = state.get("steps_history", [])[-20:] + json.dump(state, open(STATE_FILE, "w")) + +def read_latest_health(): + """parse latest [health] entry from inbox""" + if not os.path.exists(INBOX): return None + try: + lines = open(INBOX).read().strip().split("\n") + for line in reversed(lines): + entry = json.loads(line) + if isinstance(entry.get("text"), str) and entry["text"].startswith("[health]"): + payload = entry["text"][8:] # remove "[health] " prefix + return json.loads(payload) + except: pass + return None + +def check_heart_rate(hr, state): + """check heart rate for spikes or dangerous levels""" + alerts = [] + history = state.get("heart_rates", []) + + if hr is None: return alerts + bpm = hr.get("bpm", 0) + if bpm == 0: return alerts + + # spike from last reading + if history: + last = history[-1].get("bpm", 0) + delta = abs(bpm - last) + if delta >= HR_SPIKE: + direction = "升高" if bpm > last else "降低" + alerts.append(f"心率{direction} {delta}bpm: {last}→{bpm}") + + # absolute thresholds + if bpm >= HR_HIGH: + alerts.append(f"心率过高: {bpm}bpm") + elif bpm <= HR_LOW: + alerts.append(f"心率过低: {bpm}bpm") + + history.append(hr) + return alerts + +def check_steps(steps, state): + """check step activity patterns""" + alerts = [] + history = state.get("steps_history", []) + + if steps is None: return alerts + if steps == 0: return alerts + + history.append({"steps": steps, "time": time.time()}) + + # very low activity — only alert once per 6h + now = time.time() + if steps < STEP_LOW and (now - state.get("last_alert", 0)) > 21600: + alerts.append(f"活动量偏低: {steps}步") + + return alerts + +def check_sleep(sleep, state): + """check sleep quality""" + alerts = [] + if sleep is None: return alerts + hours = sleep.get("hours", 0) + if hours > 0 and hours < SLEEP_SHORT: + alerts.append(f"睡眠不足: {hours:.1f}小时") + return alerts + +def log(msg): + timestamp = time.strftime("%H:%M:%S") + line = f"[{timestamp}] {msg}" + print(line) + with open(LOG, "a") as f: + f.write(line + "\n") + +def push_alert(text): + """write alert to bridge inbox + fridge notes""" + entry = { + "id": int(time.time() * 1000) % 100000, + "type": "pare", + "text": f"[pare] {text}", + "time": int(time.time() * 1000), + "status": "pending" + } + with open(INBOX, "a") as f: + f.write(json.dumps(entry, ensure_ascii=False) + "\n") + # also post to fridge notes + try: + import urllib.request + req = urllib.request.Request( + BRIDGE_NOTES, + data=json.dumps({"title": "pare", "body": text}).encode(), + headers={"Content-Type": "application/json"} + ) + urllib.request.urlopen(req, timeout=5) + except: pass + +def main(): + state = load_state() + health = read_latest_health() + + if health is None: + return # no data yet, silent + + all_alerts = [] + all_alerts += check_heart_rate(health.get("heartRate"), state) + all_alerts += check_steps(health.get("steps"), state) + all_alerts += check_sleep(health.get("sleep"), state) + + if all_alerts: + for a in all_alerts: + log(f"ALERT: {a}") + push_alert(a) + state["last_alert"] = time.time() + else: + # log normal status once per hour + hr = health.get("heartRate", {}).get("bpm", "?") + steps = health.get("steps", "?") + log(f"normal — HR:{hr} Steps:{steps}") + + save_state(state) + +if __name__ == "__main__": + main() diff --git a/shenyan-app/ios/ShenYanApp/HealthKitBridge.m b/shenyan-app/ios/ShenYanApp/HealthKitBridge.m new file mode 100644 index 0000000..a4d095d --- /dev/null +++ b/shenyan-app/ios/ShenYanApp/HealthKitBridge.m @@ -0,0 +1,88 @@ +#import +#import + +@interface HealthKitBridge : NSObject +@end + +@implementation HealthKitBridge +{ + HKHealthStore *_store; +} + +RCT_EXPORT_MODULE(); + +- (instancetype)init { + self = [super init]; + if (self) { + _store = [[HKHealthStore alloc] init]; + } + return self; +} + ++ (BOOL)requiresMainQueueSetup { return NO; } + +RCT_EXPORT_METHOD(requestAuthorization:(RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) +{ + NSSet *readTypes = [NSSet setWithArray:@[ + [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate], + [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount], + [HKObjectType categoryTypeForIdentifier:HKCategoryTypeIdentifierSleepAnalysis], + ]]; + [_store requestAuthorizationToShareTypes:nil readTypes:readTypes completion:^(BOOL success, NSError *error) { + if (success) resolve(@YES); + else reject(@"healthkit", error.localizedDescription, error); + }]; +} + +RCT_EXPORT_METHOD(getLatestHeartRate:(RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) +{ + HKQuantityType *type = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]; + NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:HKSampleSortIdentifierEndDate ascending:NO]; + HKSampleQuery *query = [[HKSampleQuery alloc] initWithSampleType:type predicate:nil limit:1 sortDescriptors:@[sort] + resultsHandler:^(HKSampleQuery *q, NSArray *results, NSError *error) { + if (error) { reject(@"healthkit", error.localizedDescription, error); return; } + if (results.count == 0) { resolve(@{}); return; } + HKQuantitySample *sample = results[0]; + double bpm = [sample.quantity doubleValueForUnit:[HKUnit unitFromString:@"count/min"]]; + resolve(@{@"bpm": @(bpm), @"time": @([sample.endDate timeIntervalSince1970] * 1000)}); + }]; + [_store executeQuery:query]; +} + +RCT_EXPORT_METHOD(getTodaySteps:(RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) +{ + HKQuantityType *type = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount]; + NSCalendar *cal = [NSCalendar currentCalendar]; + NSDate *start = [cal startOfDayForDate:[NSDate date]]; + NSDate *end = [NSDate date]; + NSPredicate *pred = [HKQuery predicateForSamplesWithStartDate:start endDate:end options:HKQueryOptionStrictStartDate]; + HKStatisticsQuery *query = [[HKStatisticsQuery alloc] initWithQuantityType:type + quantitySamplePredicate:pred options:HKStatisticsOptionCumulativeSum + completionHandler:^(HKStatisticsQuery *q, HKStatistics *result, NSError *error) { + if (error) { reject(@"healthkit", error.localizedDescription, error); return; } + double steps = [result.sumQuantity doubleValueForUnit:[HKUnit countUnit]]; + resolve(@{@"steps": @(steps)}); + }]; + [_store executeQuery:query]; +} + +RCT_EXPORT_METHOD(getLastSleep:(RCTPromiseResolveBlock)resolve + rejecter:(RCTPromiseRejectBlock)reject) +{ + HKCategoryType *type = [HKObjectType categoryTypeForIdentifier:HKCategoryTypeIdentifierSleepAnalysis]; + NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:HKSampleSortIdentifierEndDate ascending:NO]; + HKSampleQuery *query = [[HKSampleQuery alloc] initWithSampleType:type predicate:nil limit:1 sortDescriptors:@[sort] + resultsHandler:^(HKSampleQuery *q, NSArray *results, NSError *error) { + if (error) { reject(@"healthkit", error.localizedDescription, error); return; } + if (results.count == 0) { resolve(@{}); return; } + HKCategorySample *sample = results[0]; + double hours = [sample.endDate timeIntervalSinceDate:sample.startDate] / 3600.0; + resolve(@{@"hours": @(hours), @"start": @([sample.startDate timeIntervalSince1970] * 1000), @"end": @([sample.endDate timeIntervalSince1970] * 1000)}); + }]; + [_store executeQuery:query]; +} + +@end diff --git a/shenyan-app/ios/ShenYanApp/WeatherKitBridge.m b/shenyan-app/ios/ShenYanApp/WeatherKitBridge.m new file mode 100644 index 0000000..7a25df0 --- /dev/null +++ b/shenyan-app/ios/ShenYanApp/WeatherKitBridge.m @@ -0,0 +1,11 @@ +#import + +@interface RCT_EXTERN_MODULE(WeatherKitBridge, NSObject) + +RCT_EXTERN_METHOD(getWeather:(double)lat lon:(double)lon resolve:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(getDailyForecast:(double)lat lon:(double)lon resolve:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) + +RCT_EXTERN_METHOD(getHourlyForecast:(double)lat lon:(double)lon resolve:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) + +@end diff --git a/shenyan-app/ios/ShenYanApp/WeatherKitBridge.swift b/shenyan-app/ios/ShenYanApp/WeatherKitBridge.swift new file mode 100644 index 0000000..9578c9e --- /dev/null +++ b/shenyan-app/ios/ShenYanApp/WeatherKitBridge.swift @@ -0,0 +1,80 @@ +import Foundation +import WeatherKit +import CoreLocation + +@available(iOS 16.0, *) +@objc(WeatherKitBridge) +class WeatherKitBridge: NSObject { + let service = WeatherService.shared + + @objc + static func requiresMainQueueSetup() -> Bool { return false } + + @available(iOS 16.0, *) + @objc + func getWeather(_ lat: Double, lon: Double, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) { + let location = CLLocation(latitude: lat, longitude: lon) + Task { + do { + let weather = try await service.weather(for: location) + let current = weather.currentWeather + let result: [String: Any] = [ + "temperature": current.temperature.value, + "humidity": current.humidity * 100, + "condition": current.condition.rawValue, + "pressure": current.pressure.value, + "uvIndex": current.uvIndex.value, + "windSpeed": current.wind.speed.value as Any, + "isDaylight": current.isDaylight, + "visibility": current.visibility.value as Any + ] + resolve(result) + } catch { + reject("weatherkit", error.localizedDescription, error) + } + } + } + + @available(iOS 16.0, *) + @objc + func getDailyForecast(_ lat: Double, lon: Double, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) { + let location = CLLocation(latitude: lat, longitude: lon) + Task { + do { + let weather = try await service.weather(for: location) + let daily = weather.dailyForecast.prefix(3).map { day in + return [ + "high": day.highTemperature.value, + "low": day.lowTemperature.value, + "condition": day.condition.rawValue, + "precipitationChance": day.precipitationChance * 100 + ] as [String : Any] + } + resolve(daily) + } catch { + reject("weatherkit", error.localizedDescription, error) + } + } + } + + @objc + func getHourlyForecast(_ lat: Double, lon: Double, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) { + let location = CLLocation(latitude: lat, longitude: lon) + Task { + do { + let weather = try await service.weather(for: location) + let hourly = weather.hourlyForecast.prefix(6).map { hour in + return [ + "temperature": hour.temperature.value, + "condition": hour.condition.rawValue, + "precipitationChance": hour.precipitationChance * 100, + "date": hour.date.timeIntervalSince1970 * 1000 + ] as [String : Any] + } + resolve(hourly) + } catch { + reject("weatherkit", error.localizedDescription, error) + } + } + } +} diff --git a/shenyan-app/src/App.tsx b/shenyan-app/src/App.tsx index cd36107..a58f032 100644 --- a/shenyan-app/src/App.tsx +++ b/shenyan-app/src/App.tsx @@ -1,11 +1,14 @@ import { useCallback, useEffect, useRef, useState } from 'react'; import AsyncStorage from '@react-native-async-storage/async-storage'; import PushNotificationIOS from '@react-native-community/push-notification-ios'; +import { requestHealthAuth, getHealthSnapshot } from './health'; +import { getCurrentWeather } from './weather'; import { Animated, FlatList, Image, KeyboardAvoidingView, + Modal, Platform, StatusBar, StyleSheet, @@ -32,9 +35,9 @@ const IMAGES: Record> = { }; const CHAT_BG = require('./assets/chat-bg.png'); +const PAPER_BG = require('./assets/paper.png'); const HEALTH_URL = 'http://101.36.73.102/health'; -const BRIDGE_URL = 'http://192.168.31.51:3003'; -const IDC_URL = 'http://101.36.73.102'; +const BRIDGE_URL = 'http://192.168.31.51:3004'; const POLL_INTERVAL = 8000; const PUSH_POLL_INTERVAL = 6000; @@ -45,6 +48,17 @@ export default function App() { const bannerAnim = useRef(new Animated.Value(-120)).current; const bannerTimer = useRef>(); const lastTap = useRef(0); + const [fridgeOpen, setFridgeOpen] = useState(false); + const [notes, setNotes] = useState([]); + const [replyTexts, setReplyTexts] = useState>({}); + const lastSeenNoteRef = useRef(0); + + const unreadCount = notes.filter(n => n.id > lastSeenNoteRef.current).length; + + const openFridge = useCallback(() => { + if (notes.length > 0) lastSeenNoteRef.current = Math.max(...notes.map(n => n.id)); + setFridgeOpen(true); + }, [notes]); const showBanner = useCallback((title: string, body: string) => { Vibration.vibrate(400); @@ -119,6 +133,31 @@ export default function App() { }; }, []); + // HealthKit authorization + periodic health snapshot + useEffect(() => { + (async () => { + await requestHealthAuth(); + // collect health snapshot every 10 minutes + const collect = async () => { + const [snap, weather] = await Promise.all([ + getHealthSnapshot(), + getCurrentWeather(), + ]); + if (snap.heartRate || snap.steps > 0 || weather) { + const payload = { ...snap, weather }; + fetch(`${BRIDGE_URL}/send`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ text: `[health] ${JSON.stringify(payload)}`, type: 'health' }), + }).catch(() => {}); + } + }; + collect(); // first run + const id = setInterval(collect, 600000); // every 10 min + return () => clearInterval(id); + })(); + }, []); + // push polling with banner + vibration useEffect(() => { let lastPushId = 0; @@ -143,18 +182,113 @@ export default function App() { return () => clearInterval(id); }, [showBanner]); + // fridge notes polling + useEffect(() => { + const poll = async () => { + try { + const r = await fetch(`${BRIDGE_URL}/notes`); + const data = await r.json(); + if (Array.isArray(data)) setNotes(data); + } catch {} + }; + poll(); + const id = setInterval(poll, 10000); + return () => clearInterval(id); + }, []); + + const replyToNote = async (noteId: number) => { + const text = replyTexts[noteId] || ''; + if (!text.trim()) return; + try { + await fetch(`${BRIDGE_URL}/notes/reply`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ noteId, text: text.trim() }), + }); + setReplyTexts(prev => { const n = {...prev}; delete n[noteId]; return n; }); + const r = await fetch(`${BRIDGE_URL}/notes`); + const data = await r.json(); + if (Array.isArray(data)) setNotes(data); + } catch {} + }; + return ( {screen === 'chat' ? ( - setScreen('home')} onBanner={showBanner} /> + setScreen('home')} /> ) : ( <> {LABELS[status]} - + + {/* 三区布局 */} + + {/* 框1 — 敲门区域 */} + + + {/* 框2 — 报告/memory 竖条 */} + {}}> + + + + + {/* 框3 — 冰箱贴 */} + + 冰箱贴 + {unreadCount > 0 && {unreadCount}} + + )} + + {/* fridge modal */} + + + + + 冰箱贴 + setFridgeOpen(false)}> + + + + + String(n.id)} + style={s.fridgeList} + renderItem={({ item }) => ( + + + {item.title ? {item.title} : null} + {item.body} + {item.replies && item.replies.length > 0 && ( + + {item.replies.map((r: any, i: number) => ( + → {r.text} + ))} + + )} + + setReplyTexts(prev => ({...prev, [item.id]: t}))} + onSubmitEditing={() => replyToNote(item.id)} + /> + replyToNote(item.id)}> + + + + + )} + /> + + + + {banner && ( { @@ -172,7 +306,7 @@ export default function App() { const MSG_STORE_KEY = 'shenyan-chat-msgs'; -function ChatScreen({ onBack, onBanner }: { onBack: () => void; onBanner: (title: string, body: string) => void }) { +function ChatScreen({ onBack }: { onBack: () => void }) { const [text, setText] = useState(''); const [msgs, setMsgs] = useState([]); const [loaded, setLoaded] = useState(false); @@ -224,12 +358,14 @@ function ChatScreen({ onBack, onBanner }: { onBack: () => void; onBanner: (title return () => clearTimeout(t); }, [msgs, loaded]); - // auto-scroll to bottom - useEffect(() => { - if (msgs.length > 0) { - setTimeout(() => listRef.current?.scrollToEnd({ animated: true }), 100); - } - }, [msgs.length]); + // auto-scroll to bottom: use onContentSizeChange for reliable snap + const scrollToBottom = useCallback(() => { + listRef.current?.scrollToEnd({ animated: false }); + }, []); + + const onContentSizeChange = useCallback(() => { + scrollToBottom(); + }, [scrollToBottom]); // poll for claude responses useEffect(() => { @@ -244,7 +380,6 @@ function ChatScreen({ onBack, onBanner }: { onBack: () => void; onBanner: (title setMsgs(prev => { const exists = prev.find(m => m.id === `s-${e.id}`); if (exists) return prev; - if (isNew) onBanner('沈晏', e.text); return [...prev, { id: `s-${e.id}`, role: 'shenyan', text: e.text }]; }); } @@ -253,7 +388,7 @@ function ChatScreen({ onBack, onBanner }: { onBack: () => void; onBanner: (title }; const id = setInterval(poll, 2000); return () => clearInterval(id); - }, [onBanner]); + }, []); const send = useCallback(async () => { const t = text.trim(); @@ -267,21 +402,6 @@ function ChatScreen({ onBack, onBanner }: { onBack: () => void; onBanner: (title headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ text: t }), }).catch(() => {}); - // send to IDC server (DeepSeek API) — sync response - try { - const r = await fetch(`${IDC_URL}/api/chat`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - messages: [{ role: 'user', content: t }], - }), - }); - const data = await r.json(); - const reply = data.choices?.[0]?.message?.content || data.response || '(无回应)'; - setMsgs(prev => [...prev, { id: `idc-${Date.now()}`, role: 'shenyan', text: reply }]); - } catch { - // IDC unreachable — Mac bridge will handle via polling - } }, [text]); const renderItem = useCallback(({ item }: { item: Msg }) => ( @@ -302,7 +422,9 @@ function ChatScreen({ onBack, onBanner }: { onBack: () => void; onBanner: (title renderItem={renderItem} style={s.msgList} contentContainerStyle={s.msgContent} + onContentSizeChange={onContentSizeChange} keyboardShouldPersistTaps="handled" + maintainVisibleContentPosition={{ minIndexForVisible: 0 }} /> @@ -329,7 +451,35 @@ const s = StyleSheet.create({ root: { flex: 1, backgroundColor: '#000' }, statusImg: { width: '100%', height: '100%', position: 'absolute' }, statusLabel: { position: 'absolute', bottom: 60, alignSelf: 'center', fontFamily: 'Inter', fontSize: 14, color: 'rgba(255,255,255,0.3)' }, - tapZone: { position: 'absolute', top: 0, left: 0, width: '50%', height: '100%' }, + + // 三区布局 + homeRow: { flex: 1, flexDirection: 'row', paddingTop: 80, paddingBottom: 80 }, + // 框1 — 敲门 (左 50%) + zone1: { flex: 5, height: '100%' }, + // 框2 — 记录竖条 (窄,无视觉) + zone2: { width: 64, height: '60%', alignSelf: 'center', justifyContent: 'center', alignItems: 'center', marginHorizontal: 8 }, + zone2Label: { fontFamily: 'Inter', fontSize: 10, color: 'rgba(255,255,255,0.12)', marginVertical: 2 }, + // 框3 — 冰箱贴 (右,无视觉) + zone3: { flex: 2.7, height: '62%', alignSelf: 'center', justifyContent: 'center', alignItems: 'center', marginRight: 12 }, + fridgeLabel: { fontFamily: 'Inter', fontSize: 11, color: 'rgba(255,255,255,0.12)' }, + fridgeBadge: { position: 'absolute', top: -4, right: -4, width: 16, height: 16, borderRadius: 8, backgroundColor: 'rgba(255,80,80,0.5)', justifyContent: 'center', alignItems: 'center' }, + fridgeBadgeText: { fontFamily: 'Inter', fontSize: 9, color: '#FFF' }, + fridgeModal: { flex: 1, paddingTop: 60 }, + fridgeBg: { width: '100%', height: '100%', position: 'absolute' }, + fridgeHeader: { flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', paddingHorizontal: 20, paddingBottom: 16, borderBottomWidth: 0.5, borderBottomColor: 'rgba(255,255,255,0.1)' }, + fridgeTitle: { fontFamily: 'Inter', fontSize: 20, fontWeight: '600', color: '#FFF' }, + fridgeClose: { fontFamily: 'Inter', fontSize: 22, color: 'rgba(255,255,255,0.4)', padding: 8 }, + fridgeList: { flex: 1, paddingHorizontal: 16, paddingTop: 16 }, + noteCard: { borderRadius: 12, marginBottom: 12, padding: 14, overflow: 'hidden' }, + paperBg: { position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, opacity: 0.6 }, + noteTitle: { fontFamily: "Inter", fontSize: 12, fontWeight: "600", color: "rgba(0,0,0,0.4)", marginBottom: 6, zIndex: 1 }, + noteBody: { fontFamily: "Inter", fontSize: 15, color: "rgba(0,0,0,0.8)", lineHeight: 22, zIndex: 1 }, + noteReplies: { marginTop: 10, zIndex: 1, paddingTop: 10, borderTopWidth: 0.5, borderTopColor: 'rgba(0,0,0,0.1)' }, + noteReplyText: { fontFamily: 'Inter', fontSize: 13, color: 'rgba(0,0,0,0.35)', marginBottom: 4 }, + noteInputRow: { flexDirection: 'row', alignItems: 'center', marginTop: 12, zIndex: 1 }, + noteInput: { flex: 1, fontFamily: 'Inter', fontSize: 14, color: '#000', backgroundColor: 'rgba(0,0,0,0.06)', borderRadius: 8, paddingHorizontal: 12, paddingVertical: 8 }, + noteSend: { width: 32, height: 32, borderRadius: 16, backgroundColor: 'rgba(0,0,0,0.08)', justifyContent: 'center', alignItems: 'center', marginLeft: 8 }, + noteSendText: { fontFamily: 'Inter', fontSize: 13, color: 'rgba(0,0,0,0.4)' }, chatBg: { width: '100%', height: '100%', position: 'absolute' }, backDot: { position: 'absolute', top: 60, left: 20, width: 20, height: 20, borderRadius: 10, backgroundColor: '#FFF', zIndex: 10 }, diff --git a/shenyan-app/src/assets/paper.png b/shenyan-app/src/assets/paper.png new file mode 100644 index 0000000000000000000000000000000000000000..3c03ac6aaca6edc3845fd91fa380b04fc9a2ae62 GIT binary patch literal 98359 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

u`Eob^-w25H5|h``ON3@3-QOXWdL>(c=O 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

fQsfvq&5yV#nn(bQQh##90+zLY?8K&p%?n zn-Ra3ntZv}H9TgXBz8QgvUnSXgqx=+{&7?f3CNyz-5bXi2w^jfYVvyjR`z7;7(C&? zP0m0ZlV59u`ts%|LtTqmpP|e4e^(DYKba|z40}JJAN;ys$U7U&x9Q((ZILeYqj|j) z6!_fzc3Y9-=MRD5b!*_ql0R{^qu(F9ek?Qfm>(=niC`%Bc03_!H-VT{hM0ntfnYd! ze5Kw4O~2t@wKo(@RSW+7!J6r-Z@`vL{jm@H-DmjBMMz{;hx+f(5JI?7MahuTVR*g_ zB#OCLeRlAc73x-UEvFgrSe|!-(k~aGo*MDv!*bSdQ;Cov5q04gf`5 zuZYv>6m*rWw}2jyid4Lv;qoe6gtVV5X$V|!&OqmJTC_)(wh(6Cri?}9Bq+>HUed^18sBvLz{Pco zOMJu9+f^mLsnhTp?Env-yPPecBHRmxr>-oYZ`&pcL;#~8?!^)@7FZV>V^{hsVmy=NFDZ6hg&w}zp-DebLB`?=e zU&~eiQhH1lk|<4S+c=G$kRZ0y(Pz;^Eja}z&H^GBUd_3If1Le0w5P#0zRGC>%$EN- z)6TEF9Y!wdG=w7=#*w)NvW<1!j|T0kmm!7NbK)?w>;)@3_;&MowIh-rnePEZ=>!?P zXMF|=?)6z0RTlO7e*+I!hj)&*guYph$Mz}2+NvL0Qdf?LIt*M4{_)TT0?W=@I=@mC zgfD0*2DuZ@PqW=hRKF!QD>#iNlfY(=hHK)V_U{?pvp?-VlV<+jQetTz4w`?Xw1%)! z&$Hi%A&Kq&Lym^-ot#m5WrBxyIa2RTAp;l2Lebp+QGK z82E!RJn37TbyCx$EZ3g-6=zsV`qd|mvOd&fo#n8a`rfyD-si@p=IxoTqM1>=J2peu zNfs{U`es#!;YJ#5lp|$=!YpLW_om9Z>CqI68s&HEWKiw33egE=D$SAljhCK;RS_HZ zbNH9d^mg@rBAzYg?PYD|tS#1)=M`%XXSN4a(n_*68%5zt+`)Zp?^#=8bb6%Ters9= zxj75V*~$G_6b<;Mi-;0y-R6#AASkJwH$=@qYx`~J&};)|uUtfb9BOAu=3cEhzpk0( zld?&~$DuR+n53?71&|DP{)Q&yTY3&`-__1g3fL?{7WWa|tH`c~hd#+Z0d+1+rDV}n zO>KfXlquqr{v~zEQvHE{zyc@(zF^Dt7G=qGk1l6z?3x*PDM^odSS~$^|1-MOTKbNl zDZhPXed=KM6AOO6olQ9$E4&^rz{Wg2Wpfq*;%h|8wWmg7<1`dM+zW3%-5cl}crWlZsj{zEgVXl{%VhAzQ-tgL zORSl&gwk_@7NU4j5fLU-cZlAlnoy86b0?;^Xh&Lj z)AZX?!R9 z`70*YE9jzQC&;DSU&1VJioozS#{69R?oOCpS4|7zJV&f?vk4G4S(+xe5gHhGetG_j zR|Wr;4ik~`gi#yN1TVGt3ND>|{63$^$xW57)Bu+(yM;{Iz|z5P>A!vr4Ixzqo#vW> zhrR9+eF0uh&4OcwyBJq0Sx!VdTDpOaU_YyznS?} z{`y$zWME}&%=OXQ9O%5Wu0%^cV;WOt3xK4MhA~fWlWv@R%HeQ)JUEf+j{40|IO*`g z+FkM+r%W^BNd10>25Mr$VbLV)uZo1pDdR(?xl5@p*^Ln{ATQ$09hQ3QuYgrua?uxxa$7z2v6u#If zt@YiKBFFS_7mjHEkn5g2WK_U_Vv6Y)U^h$Dk+w6wY$M%T@trL_zOPt4qmGNb<7 z`Ma`_^-|eryx@%#25%c{VKSC_(743^TdQueZ;>=>flm+OiUqp6zAUXMJ!*7WoT+=xlqd5s>6lW#yLMnz zk~_O35+eUOon}(`b|Zg- zLoLpI@{;;jM%JuP^&&-9{}abM8H#t{=Qp_ysj@)tyl?wL465hJm4~HbnZ;L~hB!V` z8O_=61&uw%?#)giI?FM35^`l3MDyn}^$VP})p!j}KD`UQD5f`BkmWUh?Y?q1YZq>C zg)(y7?S{2e3Q6>~%Hr|B7*LxaoGNw$Ea1q@{FE|K_+}~4I^l5&Z?ZrStWUnpcU7n*emz@19PEkrq+JBKL!x05|?kXdtHu@L*w3+9( z^Q^^MiY)DOK&GQ=BuL-L-PS7+)9`x*%&fOSox(O)gXq!m1wGkp9=IYX$8M&O=Hs~U zA4_;n1m2FqqpfAxS+V6l^!0m(vO>2c0t5`) zT0FK6H6|e*-PmC1iRe3|TzfY&Im=VIR}w|$Wa0M{c%KfC@mRdrjXnox&&EHk6cbDH zK1b%EbmWyoW5)kDe@Tx{bw4pE(WI23?K&%s`58$J{*a7PEeRK{L%uAVEHW&+Np9&g zyN6ZUbtb(2o>sN%5yDkQSG<%T%!zyoCN+d_7-~;S!GJ zb7#Js#8_=}c=(8D@1BDg&x@M{gcosu+9kQh(@7eAVVBo|{w~Q!WDYim9I*$oEK|!r zVyokDR(4du+g#UAwBo=YxDa}uxz@G#7ksRva@I|Ie<2j=uTJ$-DEu$n7;Hpx)h(fa zGzm-1owk;)gfb!VG9%!H?z6 za^8@SUN_WKDNMK_-&=`vUY}%7s!`jpWAs$1HuM-gZNh)q7|&WiKBK=Kw3S)*e*X<~ z4!?2A7^|w=6w>*;;6Teey&}X@W`8NI-5E!df&Ge(b-ny@F!9N@Dx^81RebnxQ*jUzuK!ZXn|t=$7D{N5Xv8wqyNCKT z)?*|H3c##OryD|_LF-?_`|?AsGl0u)qU8a;*e=^R%A|UBDUad3nm{R?&!`WN(F-ko zMm~T&D)!5p2qXP52gVN*NUb4qfnU|LfaSA$qQ-Lr@AcHmKWzYU?OCvJFm0?k;l|zKB6Xq_$bG+BFQ#qhG0B z7{a)6k6h>EEo5jRDc%z0(}CRurz~7pk9Zy-J}uJ_$QReC>_cP&3(tdf2ED^C*WwN) zr|S&fm&HqKG#~2G0V0-Dg&e-sw8~!yF)WN@mW?^GaAKllNvNxw`_p)@tpJ@5w;%TJ#-V0MiBJyo>S!Th?yHDQZ zv|b`2u8z;S>q<84VL2TN!3QI|=2vdMM|=WL?wN+;o*JobkApO*Cmlz26w?aU6#=xs zufeF$-d~-KQqj#w9aQK5^!MAjrjFAwLSx*1Y|5U7Eab{0dg19EOTL+Lpk{LZYi+5qp|qN%lWgvff91uhEj=FK+}cjvmbvsSrTiW704c<0)*(xY>SJ?5lH& zuR$eh;QH);Ja7B!X8aCb4ty1)(W16kmhJEhD(LI+lWX~~MjaGh-aP1}Oc$K&KygR9 z3=WA3AsAgYTm81on2=7AXP;UUl3+ZH!oQ7`?UZV+VLP zurtVFUca4#F3xG^cg)kAD80p}E*uszJ}P3@YA2=qT=imJpl&h8JT;tZOvUWx7H8UK zKJo_dEekC+0K(|U3sh7rz|VpNLLS{_X>+ef%LvH^?K{3*RUECqUf*XQ{hMJ~Tab3| zMzaLx6p;52K4*k3>-(EQ^Q}$4a41yfGrvznt#(HxKWlYkZ{GoZ6=*Rj7Ld?86k3y% zR3;YrR&|gKlrzzwT}GqKhg>UPn+*ms!gRbRn+t5ZYW6rv!du9n&tyVKjkVvLxuLLc ze|2QJUP+aU)#i8zt!}Zyr=WyW^v&vn_tPdbV;Eje(O-AE3zcivkmm9&ROqMRD(2X< zS9XcfY(no^-CtB1Ce+_;X)33VzREmWJ@MF3QJLtn;5)OI(8vIj^YHc(QE0u`zu$fC zVkIT#te8xy{ub&u3y;AGlv9=)kQ>NQ2n|AT z2~mSECw;<7FtFK0;Sj8m{@3hTa%KT?z;s4id+W8AzrZ7aE;Fgn7SUOwmTVYNE>cxq ziM|iLO7|kdejJp?B81S{u@iT2Iz;n9B3Bil&**%Tlb;st4Lw{a-jquzEui&6I|M|Q=0Mop`ZgHAriciE}`&Q6dX?@(7URN=MXK4f0Ef}2! z4@%JlAzjLQ_gQaY0Bo{7hdr?^3i3P@Rfx$=?_YudXWEl7QC6B#TRi-)P=jBIwr=i+JWLBPR3L%EE!8>!x9~b zc|SJ4$7G4o;Cx1({8t`|%@BXH{$0TNe707blXxb|C-mpbKMj*|0>fzT>(Cn9ET(wp z9AeKvCnT=*f@p#6-t>4hiyF9>YMND-z|;unde;cNOR{H@If^d^B7rDB2?!ls$qg(hiNDPj2T^P1w{oI95FqBgkv7z~E4wAReEro5null4Y_s#^%T_Jw_Hj9u&H)UAjq(_5y_~^<0;mT_VRcIfqlrM{PQlibOKR*b?MS#wlsX1u4 zcIDsp#jY#V*L*5?>wY^K7=3=kNGH&OjYi2LZe%v{IZAIgoDm(n&iM(OB)P70Wg!XI z!D^hh^hDi9ESYSY%~iztAZNFB{p1CcbR~SoO8err&q*G-y4jff+XrqZZx)5g+MOrF zi%opU@xa|1LCU8c+ZXdG`YlI?A?JU7#Rw=wm<*TgR;SEqL7yHE&761x8NrA);a)#w z=<9(NCN;1*3b-A0`z!d7SLU4bBeR$?k0w z62(65B$T+lckTrd18Oaz7VM-SyMcwHwa!D1)eusUCB$*xIPyyBb$~2yzIg}hPm5`` z%$GyDvfnKRM=KB&9EOEPR1<#90QAJP<#+~iT<@lmt&_|T87%qE4`^#>zy&$BhhLq# z=H|=^S~YvqFp_FAy9wR^wgH)fvkU%gFM+Pmx-$PxSno(Z$-QM<+AWtoK2uPYub|J+zsWk^d6N_wh=1Q3vc#7U6hWm&O%@9 zTt4e&@kprllk2f64kuVUQVWSDzoRXpoH$uhg`fQ`xi^8^XNW(EQ$9#-qA%yY zncw=gkP5{7<}|!<5Zxx#S;%ArI5)&`^k2)!T)aVaVoZjSTj1MRCuqm}C5!YV&p*59M*bIDKh1?}wxH6CDfdzBr#T&W$70s(R` zw!ZwbnII5vF)oZ1tsJfwd+sdvNR~wv!n~liY%U!ABDt@^GXHYa^AyO)zhNPrkLcH&u-@nuHdR1?7H!l6lL(?uS$e=FxfDJl%_lbeDgSY79 zNP(9CU=dkK0HL|Jj)iV7onxaF*dk9+k>J9I99X`JxNIvIZ@>s$VXg~@_W^KL?)RF; zd%v=Cc|fM6$UUq#K~NvuM2$j*EC!w*5L8ZX*_VI6H_A#?Pjb5vF;?FiAdX*qHoSR) z_MTK=y_H=IDisIcorh!chdT@0SK2~uvoU!wb(O#SGAeedO?XIUvcbVqO2@%+mNB? zSBnEK-760)NMdrOHiBx>lzCusJbNmB>SUvf?O0g>YB;E8QHg9wijx`EBv=2D-f^k5 zGkiR;QJqEf&e;L6vA*DyIOMTk1kf^rSkgV z*X??)-%zXd(=K7sbmgK1?9v>KR~hQAHY*vr7P}-N44eP!%KcKt@01*_rEwef&W|}X z*Gb@yUkzBiKfQoekqM=xt_r(a`)R!CTiyo@rYx>&;)0b|0Wyq+`MZtCIVHY@dpIeS zZoBFM`+UZU8T(EIq5C?4oBXn31WB%R{p>ZHMM`ZsG={d<0h>9ue)(b|-O9tdiP=I= zoN4z0TQ$0ZFkZ}U@0JSjGkccua5)or34ADF4fP=DGbAoCLs#`+GQ8OS&U`6ixhX#)WAwHT6%T(2w(s_)X-`beCYpWX|Gp#Aq^+6R_Oa^i(}U24O#TYpLJp06|i!s}Vw zE46=;{}I=q|4tzRc6$Fde-Eq7hR3VAUdTx+Q6NSH_W{fTvyC+{zjVOcewG{@f2=!{;uUO~p`Z~H)E81&i4SLyR z0g*pQtr(I0qG)|`7%ZWl!34)B2sEn zx`VmW@YqV01w2I91$GWY6|&3ouE{T_=W+w zc29<%%ptTaKZ?h4jW9k=eh~)#yni!+2lGH=$A~mg0TI7@=nNOB=^Ixj91Wtihe7CD zs#**|CnIvsA={pAW(2Wl*00Ti!Vb>L+om)@`Y+$=^NDMUs&1Qg%muy%6PH|vkUuhE z$>9Zam0ca9!Qi>C>@~(+1A~}$0E&T+FvqQ@2#wILN7gGH#}k}XAKaGd^$^ju?(~8W z;FV{CPEUEk4^>XPFcyTD-kHHfxtP4&NVJ*+W?%^k3ht_Uia!p>zKCc57Gq>v(r0}q zJ)gFvOJ^_ZCwI-Pi~QVlj2eI(ofOR)Zk%-*c4Y+a`=9gQK6PUnJlJ@Cc`*OddF*j) z>D^f{2=VpXte;W6QSB3U{?+*6`(D~=Z+7cMw{Y!$xfN#%SBz%BgS7bWExV+{QJI!2 zOKyx&38;`8G>3$bbb7yRM-$aR6Icu8=MV|fp+bDR3=7Zrr0$yGSNJE=o~%&s)CYBa3Lk{xYJYVfT5atGGxvE&w2b~) z5q6P&fmh*v(ybc~fNmb>eBA!Gngw3Y#2*g|lf)4NMcp2>P9)Q-Rw#pE-mMkt^S3vM z?M_uywA18Wi*3&De74xjBT?ap4ZQ(Z%a_ayB`VM~G|yA=H*Ya6DV->gfX=H8hn`2F zjoWm{Jh30Lt>NQdnk>L8JvgJ;S>Ur@Ym|;+3o7@GO*`=c2ylD=&mUC!Ald5b+Q}xf z)3ct&sNpp|K2aAMZ$JUP+H#}U@mvPjY{w7mwb0~~GLcYHF;ql(lj^kp@!=wjiyt96 zb<{huOs49))>d%d8v>d91@R=m3`O#vLtT>&f+Ti!@T}>wrsgAzNa3t~!R~HV2RKuT z0n)3smOg~M6PQ%!Gu9h%O6=Uz=&U??ydz^Ei%s#1%uDI&ih!U0de_mOq)tHjR#BC2 zlf>X#axF)Rm&YW0IOY3_Xg)Q*qje?R{NJ~$m`}^)u}Pc;`rv4p?-{F7Q9Wb&kQ;-3 zi%_QZK!Q}LrnAVq>qS03NRCeVF*$I&X$nQz9Y=l(&HL+wH(&nK_r1kLe2t49w^rYo z*C2Tn+mLcwZ!iI^d4~{llVJaE^XR%H&od&24)~|ekp&_7gI!KEHtFYoZXQjVZHry0 zODQ)_A|2=pD6OV zIKA1#xcnA)21G05AKL6lur&q&ib6 zM)f32a2gHD#b|lmoI=P{7(W&R^4}J!oaoO@QtXVRu@x`5BG&%f2N?0or@E_pLUKmV z|6vLPR@sRU+#E}o_~}H$lt-Fr0VgLNjoFbb*Z<^fC#6%_!A@}X{(J2SLM;H1LG*&A zvY?7)jdA9NZ*uLFP2`-JDSS0HX3fX@eE#V04&X_*KW#$gBRj!9f1(S@ja0%@qeC$N zGSycWp08MY9Jt0K0j~2Zu=#Es!mtE3Aco`$-+`^=UX||H@DkHDhWnF-o#v0_Z?rxB zbV|h2b~WCZr7?{ZRg-VA^kFpSSf$ARXq&cOMS;JLt=7knEbs=Jil|B!+q2)%-N5vB^y3CKo`FtdWN*fW5n|~)m1Vcse3AEc^wYyyrY~1c zp>r-(sYP^uyHjt-_>E?fM*f0D6EGlu>69;$<+$?D{>f4*oX)xm-tA+Ss1DU{WblnH4(5 z1v3l1^TGm{81rB9pQyGazeiwdBY^9aEE_?T4E`sODpXW%BYZqcX3C}!2;<_7MKO)6 zn4bE+WKN8p*))Z^>h9E$Br%UDb8+{bZ^3Cz2Ls>yg&9WzQLX->+j(|FXAyPOwh*HXSZSKLW>~#W(VW4ttR_7tqu>7kJpR z8QqK%>+zU|<`6n>1modM>ERMbH~#wMO3^!C0trB_)7G?G0GVtL?>iVJyMQfljNX_+ z;;UY^KfoZ8@$TO}RjWbvEU`G1$eAgLJJ3gE;fv&MxSb1JRpC` zOX*+!ZnyV#72@e0#lt~MSWe`fnfm5AUqw|TVQ*FKpK9HJjsO1HpzMv@Ph(}_H*u~_ zn-9sI!{WOq(leoxMi-oev@pWM{(ibV$5xy1V_{2apB_}@Ny=i-$1ZE> zl{lyO*JI>@KFrh_E1_h;cI7X?224!11*~Vqe0^@VO89Q0g7qqZb4h)Td;1=QkxvBM zKg}4bMk?!z)x@yM`t-TZHL#ZRv;c21g3^EV=ttQHG}$N{f6;8YISzV?8t9JY(;8JO zOOGpOwXbv(*354feSfScEF{XWOE77QbxPjefZee(w%lw&!&+9SQ)^$7AZ^11_gjOG z*|>FSVC2+malAqH0RvL05daBy&&6p+G@l1TYvQPhrlHb!{=AgA>e^bEt)-S#s6ifQ z1+f+ROLgdNk~OuL<>VAU9FVt1_^fcrjbeg_zi(#Tdi0*Br4l8c*)#ZkS1Mij5hI8) zH6!#gt!_9<6~R};&ex`BP;-RA@F}b@>K@ooNc5NUD4`oPbnv?O`2oM1xs`fcRPTV7 zcf~-32gh7&7M8v%=|V^@&`U(jfcK|GlS%b!=3Fe%P%?JZqe7eCI{)Wi9$w33r_} zFe!(^<1_4oY!e9vNl#P8Q_Q4`_L3^hI>@i@n-Q!st{BN0x4XG8#q^ES*h80&n@Mz7 z^IH!gT?5|O1pYDXL}uf%dvc@=obL}CFi{5{P$q&t$+J?Y1=;G(oxD(NcEZUO$tLL^ z1Q8abXh&<8fM4JVNoqoZm0Pm}_J!K@8Gq^4>ta^zb!^q!XCghC6+lkfRluv|s*~b$ z!QKpZF$G0vCHDAlWApZ;QciDGW$tXol`?xXAKF%5cXMLv?15d1k_x^X!_XP4A-^|q zgVGM@e%R>RpfsEOCmE@Z&}C(za`q^RnGDxiqdV#TqqX&Y%}EtEIjPvhQ+4l22P|Qd zJ+;i^L{kmXNCxuZMcOzD0&f1uo$N4&f3GjH+iQQ9Ome2o_D_5^Ca>>B_BrKfsW+p2 z=2Fya;z^HX5B&g*%HBb24s6!J7cWizzMy|^9i0dl;E6<}W5SK@gP1y3QtCi-0nA}f zi;rFl7@Mb62o%0;8y|UfFuT&S2kpJtI_c-piWJkDl3Rbx9C})pfYz7|>h891S{*~? zw(Py^T0c%3P}9v|U+N$1t@jqy^E^3TW9bEB@HwuFn+3vePx0>>&`4jpnRcB0wzvbA zj=-ZR+o6G;TpvnlcwrsQ0k~3Ak*PVw2;aH~xnFC#y6GMsKm_}XrN6*Fn1!&O_Ro3T z<#N3!8^}rnRn39l!4)Y;-KI3)_g)Lg&YLKK{0Uk+(YawH{5Qg?ui)Qnz(BXLO@DR_ zlbinVV+kMbXu~RdzKZ-Y^7Wad_m$)6tNt=GgF>ubA0I6GCQiV(_#JNE+AB`y z2=1yIwTnyyEUi3rNdFH&gP%oN0IUZ){5W*72=8rf$QEZ|6yHbll1f`o7^%u#y}iq= zdTGinL3b~%!z@73laN1l)jp_5q2Eoh$)xRd)HcuF#N-`ci(70R6Jx`&(rU(m11~Y; z!`6#E93{V1C^2YU_Cutos_(d(-oK{GMNT;Tqrv#00S#RC|@beHwCdBU1xpCr2C zeUm=82YYTCZlJMU_a)cueoIZf#F)v*D?&sMP@}iX?H-w{2gr{9e!hf6F*O{a$ETIi zW?7_B_t~8o!${l8b)ZVG-tO;iefFqUyVswES(VFM&6hsfo`Wt!cvkpvTz{E8_SIFedm4Z3s_I5P zdBUTgnftXlQVq~*O+N);Mha^^%|ZQie3qPyh@Oy}U;uZ?yccbZtI*4aJXr8r6#AH* zGug&JJm+DyVJKyP)9v!*UZAJ&hQybMnMGmq%Fk=yXONeP!A zb#JP;`%9Er4zmBC=|R<|U4{P)siXe1o8r`ShFHEWH>k{QqrV(kte+dq>4Fijym)N$!|HzYoIAzSdg|cs=$JDz!_+INrB6i23*#xuG4I0gi_J7_bst$d>^0N;4cUbg z17>Rx|7FlD-z8PaS%la34oh+V*^)es^T>>KQy})~4B|-B z8>|FxPqqNmlbaZxRt2`4J})$_nlQU@8(!R=Qul%mk(e?lSo z<;|3I!TKGb%LD@xohKzaQH!3;M8vw66hoS|!VVAdTu43;!33XqUR|%03Ev z?A~y4t{1p@?Ih(IW0Ovb&TVqTJWGk#BS>bpR`0*^x?4|gCSu~%&1TEWkH_I zf4e>43Ya#*M+e93fRf+|SAxiwuO>#NEf|%!2c(Vdm>+NRXADr8EEv(PO6s3=& zsI9TRW7>gxPg;J#Vw8@1Yqv9JFW&`ILf;3lokUr~wpgynH_1bT@48mm(YoHs(D1vh zhby-Tl8t^Mzi1$3fk%)B3@emOMsUvYOq3;tr@9C7%_WDR@hue1F>*ccSCv#!n8mWo z9892MPi$W7ud|;lfoHE=Ns~=*jx+6+sYifq$7g*h_)3K6xMr1rCFk%+{dym}?V0HIl zm<#jw^S(sLt;vO$Jje|z>%H;?H}7C8_FML)P#PpG2@zH)p=%lreP=uDQi1H7iM}4BIK=sbAjL%Oxp#ZKyi1Bw zMh4%+q6teGM+Yg4ExYEEjdG(VpM0&-(E(O3pX-mcUOrR&oTNj>KRYM^ zw!C=EXampF&UhtolTe(A6{1a=Xw9_cLhvNLLFk?f-r6>_|fyQK2*GYl~nNP zRmhF5&^GCc$bWXjm$B%BJ+b3nc~mL8y?(>WBxMeqo4ViG*jdJ_=L`Yq1)r8Zbs(i$ zHUgsql_#dSTXzH`GU@;#u~Lh#!57XJ9g-L3$(P!y2*yUD_jK-(%D_ z8o5(wud({k*~np!PlZD(!xI!EF=+C4syV6%zFR`DFi(`8JUbXwPJSJKYO(ITdwC@9 zLtk{Y;*k62HPbSXS!lAu^+Kcx)n4tXtQb$8n;rwgr`LT^hd(JDiB}i6Vx$(}y6)Zt z5u!pNEBVbEM@5al$>nh9)3v7PZU+k)q;v-CRIY6p;;I+NN!iLnsSrER`^qO9 zAeN?w!JE<7b=cnGQ|WL^)s@;u0ka=KGXg9q$wTIl+Ak*m6fG3R=%elj$+uEUfJBXN zVDm>3yZ>~1!VfCRl6P@MwP{@!%1#SDgGA#5cC3t@M!41%-@kzY8_MmJ!(|>vPt@$b zT;Y=efBnh4tETZmdFqVE$!WwJKvy2L?mbA@bD%uGmZ=|#G?#~_^7Cs``xN{pPGWOx zTn#68IN!$(hi-pOyo&s;b3?uWE*qA+mU)NKvF+a(Ils9FTv&31{EVDqWQqQ9co3mw z6zVK8Bkx#Y(#xSZ>Fx24D!1o}AA@qV>w2S0>|MVY#?9it9BSjt*vF5D98nVuSJ#7? zW(NiQqP{boYdU?X3RzzF*NXu;b!BYE0>yfN6})whsqc=Zf7>EeuRGmf3&&b#wx(43 z*m_xfX( z)M(c;qQlYnq_`noZ+llo;;d;a)XjENEE&g}u~nvxctX{>5ubv)rbzoe4vi05@>Ee-kYYFRt}Z3+#$%$=C$tce;~C_&sZH#>;4Q z%{XZYYEgWLmR-?1U@NDmW4EgDUcZ8Ab1KJN+PcI}UMsk~RA_NL*Irnrv-a2v#x|4A z;?5Z`420bu)o{i0O7v)*NxHsxWh#*+2k|T@F#5yJm+_ODZKQtx zI@xaTI35nJ0Ek%*YF zsamDA#Yj}_w1`l(*X#Saoza@=AJWm7K7Hgaa0<^nwG|p1EGX3 zJ4AbW(M)@*FR8ej*6ek8(MGfjp;rY*lw7I1iTZJ zp}DfGUeo4T|8W8u#**mskM&axQHo`mY$Y2Zz7o75-ygPE%Cw!=ofEJ9AE$xM-qLz- zMfe7)tHRr9)N&i}3GxW+&-$UUSH6I>yZ2eDTJyDpOFVy*xzqX_UB8uQZbmx&$Hvi| zHz+fpC~oL&2@`P+TrjNFX`C!$qeWZSyY`v&Q~lnb6f)Ze%L4K*cAK_-9e-3_WmK$F z3cK4p)sA^9X41HZZ$l5aOM4_0B)5kpJs$8N3@a>7E%O>_d}bVsao-G4(nU132-Ik( z^=2y_&8l~fun+H9Uc<(lT<5O>XxWtp;x3pt!lqVEpH+$H%q8oR`7Zuo(488u^4%L8 zE?ZukIPuZfKA$>>&6S7Hjjg)rOo7|m*Fb5B*_O3X(bwImHvzeB<2JPoJR0Rt%b#nt zBm3umi~(sp&AB-t}YQ;4Adp(z<@s)BLbk;h8>A^rf<1gt?T_q;2#oG;C<=agRjvL6okS_Kg zeO)QWshppebi4fHsTeI;Gals3@SY|w_AWvmE6mdh76rp}6?4k9pW6NCl<_A#J2qCG zhLjZ~+V;ld5*dFS9>WuQxeR)eDDi3j!d0|hM}Kn~2Z}-^6g+ZVJ`Zvx?JGs2NLIjNLj*ssFzzR~g`iAO=3@}d zhe!$60hec+d1obl)dYx)sF*WrV<(Kf__%252DUY{Q7gQ8XdJJ{e{YoTk(z%|H1{)$ zLD>4l^G_z1yDK4=>7ibQBs_dKAo`T&9qZ?KB<*E)EErFk-Hg>L?@LtPX}jy|D>h&h z7}Sa_X%=_BfoYZ&Z=#Q%;(B;1cXuOn^sqq+lnG-=81E}Tl$6t)w_dp}vEyiG;XVk$ z?F#<3NTXhv_0Ka3jb{@FMd0}+^7(dr{9}vGXTv<0A;&(gl$*lgCq;IP5Dauv4Q`_QB+Fjz*0@xtJg@Ags2>3V2V z*{qewtQ@BQdVPAwoKx@rcG{1h7Nk);-bc0sxCLU`nZB_#=+q3o|BK&usc5#RgRxkA zBXYmV|B}Cu9)omfw6tM2g52X{2bb>Gs7boIeol2v?~wjOqX|+-+lFp&8%b6XAGq)F zA8odQNPMznJBh|6_+)^U#xH-;JlkkUgshl=zZJ_B@Y0&_^*pWg&h!HBhbgxoSLqTC z++}%Ju>JV!KIcoHePL42YvcP1&?DW;Tl2BZROjiQXQy{EI_pA>BjUN&@^u)l#1U$t ztRKkl;s5$ThKdV;9~9^8?$bh1lF9Dzb3K>fW>uxmfc_G9W8R;okld<@rjDhFy-%4U zo2}Pt%FfoWUb`x1EpoPZ8=N_=YjOmLaOuhqtZDu+~|7DPFaVrsT1T~r5oH+{#xlo_4a*b0Nu~g1DxRvy`>f0+7 zC^u}uEcw3uQz6sXcIY|f;<#*D|D>92^5%)f_<^d7WP3LF@AwQlIM;@;EC%=3?ZnHz zU)ttcAdNn}DWAoK)m^LT9VCo-C49N^tvJuyG$?Ix=3>9?T^?R+9+Rd$p>_V{W`PM2bXHQ<^MO2N=q z=(gFzdd-=RD$^xNjfNH}4Jq#-EE>uCW|~hxlV>Cx>w#57bA^|r@NQjqerbu13wbNPcpBr@L0R6g#DVb zvak3yuxCmBeo@%&#+|4_CMklDJ=wWqhc1ptPaWF7BUX(*f0gWgcYYo8Z`}98-kFW$ z)qX5^#Ce5vn7M>$URJ)pOh5_K*sk%FQ}3(GwqUc1QMw~re#sOeM)V`>HS3RX&oFxY zTA`8|qijF2?Pj4(Io`MZc&u5gWfzBk$kqLI+M4f87{0_V(bc3H_ekITg>fwT3{`9} znUzIYyCpg7carmJEe+n1zO{RFi7$%CjbCa`8NECO&hGJ^LDxOwzi~`nA2wZ;C1mtq zHB1y<9;6HP-^4p9i;H`nn@86)dADaQQos)o)ot4odhy98SDI1|MTqe)nHzFKe) zh@I`ilw1yViFS0PlVo3+u&J1~1H9Tqgk2dRF>17UfprjYENXE4fPZ2o|9hAzs+4ffEwWZZs&9|(J+&h{)lsed!7 zBWw(Np@?~%QTbAjMw`tOU`lG=`Ioqm@vq81&KDM<=Uoh%P{!(tLZwx&1)nU}#rylW z??sri5AWzkoOWmPpKn}Rhm+GA#V2B>+yNd-uzg{xs`ZU;h19RPTqV=i`j9>i<9pn! zmCC6P@}hk`4s4ch`|b`@*EMgve>}^NQ;olJRy^#!z>&<+SzseK0mXYXi>>p%NU;D9l6oPi7bkYJ%~H9(D&|s7TwQ zonO3LjRvwFm%QlC{C0znxcA)^>3(O8dx@y~@NJzWe5dR@d+qCmI0Ov1!$c!q{CzT_ z?@ankpdZ%<*$F!ij{Ws?tFk&0tg$N?rH0HUo0IG& zopHYY*>4Y8ZWYD9EdKWp6mN5aO49lSxwrJ!vN+I87hV1ib+>h4YsS(V281Mk?#m|O zq)$SGh1kpl8G9|*l6H855MO~5xK6WOe}gdoHl=UE$#5gNjNBTwMstaEtBgZ2h%Y{w z4YDAhm#oq|M>p&;O;7EB2T#=4Cg={~o2wq;&xS0E7f?k5l`!Yld&Hg=*FDBeLlq zfgIk7o1gfTPd4zgo9$e%mGnM;@0BC}do>Po*}TAS;l1w%>UNq;3{Aqb6CzFqBKg#x z7hOi|K%Wvb6P+7B)DZRqP@sOjO>$VX$vypYMfadfmcqLe0Y8tU^`2AhvR3{`o9&@^ z>SiXa>ZK3o2m2|A4qT|}2jm)|yvt3rKX|CS&;y%oZ<+O&tuk}>4L&KPA=Ai=n?&>BQ;xKX6jtQovT zT$m1wYQ7UjZiImWezl~%Ib%~fM~b_~vtH*1p7&T)**>E4&$PcZxYb38i-mX}9<}Ly zI3N~d@zurR)!>l)&y55B-$~Hf0rUK;<9inNxay!WvUI4S!5$A1JG`e5s9HBL7nu6? zm=-I2>pkTDmgqc5;cWJBw~Xg&PdSm-Ep~2LU#e0mplT^_AA?bRAFryG*(e=O;h7lW z1Cs5y2C~AjeRccdjNm^%z&c6j)4`V`8)x^+dSiXlJN)8so=;Mg9Q+wAq{1^>z1Z6(6-Da1ogOR#=%0E=XP%nZCyvpV4!V7e9lf-{6% z)4u$C+l7W8!&h_HoJV{cH7xDaC8?sUJafR=KwT~6M9sE>Km`ncs%D8>?DYjRd@?Br z+rPC7h7CEv;XQs8b9t>%rDU22>k^7G-kH=0UJmWeE-|l6&@s2{LoO8s5H}kypQJ7C z^30#N>0G8&6WG!Q_lY}O%PmOh_8qb_YR^*JOp0Mt*|X4W8aEPZgD^6(h51Ny@)s+QHk*AgEO?0Z@4Qe`d^#w zVtr-)oZdhFYfoX3R0eIGuQ}_r-**NX{bGuL5*ZTqz*fXxq-L2rk!!kTSLQ_+jM*b%z)88usEYb2!79*@--X!T zxuXeRW!f>=U^_Syq>=s)ZCzpYs_`ikJ^!()hzsZ{HY9s@K0BADD}}XhQ!N&@Nc+!7{>oiXgpXO{E!o> z^Z|ozqHPMyQsNy8tGcfRS{jo|ScX4OOQe0%@OzCdEqXt*5@ z?hj3OPMQizW$TINQ9I!xrW{li!=v|t>?xXW?KHhng_5Z`&|AFs+nO*EHMgq1iMY7Q z(gZkcky0kEVmWQlPQf9wy26zyL^-f1r`dQrC{ezM>gaV>$2BjSc7Sh~Iywgr-FRGQi)-m%6-+4-Mlgh&RGp4O{7J$hNkJrKZWqym zo6!liK*6w`_G3GB zSe?9nwB$uRn9Tx3Ykg_tCd%dPVf^9gDJkQ(&57wHh!~j<&MKWM6<_sP+C}oU$@|z;IYwh z{xt9J7VWv=JztSNg(^j7KO!X60@R1D@>kMYY+mkd0Q=kzg^E`*S>4>|{3?A8Fu5Np z^PkC-#!S8i-~q$0m()3uZ;+Z+@HrCPw!hZT*HJs9iEv>sL67cQZAMyX8~JXwlE7_^ z7R7ET8|-{g`-Bs_c>|iM@hQ8|JR4udz zjjTRM>}xvJw4xdZ$H&>$AXBd44%V!5u6eCVxLKIphT{&@j_3_>1WuuK=1snhRxNcm zokW^v0U{eZl~b)7Ga!3-?62Dgge+KyYuVA%!I|YEzG<$Mvbys@P&s4*-tm+_+p6zZ z3Giw3aIaiVMst+@>b7B`;8S*5Y)3xv3>l65#F{an*^LTj_9s7D)cg&hR>BN#D*f|o zQ?EjLN{uehG4oB=9U0j&^3qs5@I)n8yfwe`X%cV~=J)5qZrq{etdcv-(|*gO-|}hl z50AHdc7dYn#FM%E2$oznN19gngxDdDgQPO{Ee(xLjK%GG< zh6W`y-4+a4&`XtwlH3YD>mT8KbYgDnP;7kb&O!G~!@SSewLc`R(Mq(BIvcu%$23t; z(CE2~ywp#Gpnua|KMx16Z@3#Kk?ceG_s@mUuQ(Wf)!!H%^ zqDJ|zzeS(qcTI0l)5C3yye-&?2WDSqo!hDPAGqB@-2|)-Kl%fkpl3atf|{C;G}RCj zI8pX`x`dc|@6Z%=9@y+3;h5p><_gf-{Ya-vf;iM#bStFBBE*DT&I#lI7h&7yTc;L0 zNl-g+)wtPY>#mZ+(c!9>Z5kGEP5ZvH-sx?=B3Tu-FC-}eje4vauha7PlF}JTkNT0* zN*zs2yD~-#yE-2|=D5p(I{9AOg!(&1?c8jON+WF^yPBEFtz+N)VC=;TPscL3uGayj zOOn1H3vPzg^B-bAFSjYbvY8WhDs!fIoJ%O<%CRaZ9Pja?5+fF4w$ zH7t5g&W!3Wo2^NP-{w5?<_*Y9p;`f=m8NS};K)f+lzn>{2#QLDtH@fj-NsO- z>3aVj=hrpSql)_Q!4G^thWwt2E>7N~YucZzEbV(1F&4H6%N$9a2db}Psm~5+ zefPqw%9gk7#J_F4ByZoiD?3XWZi_+WXEySfbqrPAQ6t@SOryPDmb;;?3tM`^SFbj- zpLu$0kE5Q8ZrU&dQuD{2$FNq;{2uUOqoYBu^Aaw+JAPoKL^v||svgb!*ZH86&>_~( zv{pdK9`XZnQtMR5XWCsuuNZJ+$rUT()blaEg;9eW9}JiVMeKEg20ILsy%b|C*^%Meu68Y%b!(j|45UbvoX7hcIJv6F0ddpQu_1el;#LVVm3q} z6Zw~ zM(X0w{(?bP9pWEl3Y5h+iB)xK&WG77w{F(8?vB2L)DII2rDtv_*}br!M2`q7IK4ZOQ8 z#6q|62&$7at#t8ye3H6+Y4Raa_; zk9-!aTC1Y|Q138QlQ>-z`_H$e=+nCTAeV0k0RNpy3^+OeWs-{uY)rk(ve$ti9)9$h z^xx*vt8cR$|BFF=*nBefF#nbi{)A^NZz2)S7cwx&_OjviWGZ1CB zS~9b3>QPbpSng&fw1&;1OQ+r!*C` zK>39CHlcR%vH30@mq@}E-g*adwnO=gWa!XZmohP)!*lEtekl`1U=AEb5 zy=DZp`3WRuv+MyhO8W594@=B%PybfOB1!KJDCn^_uu?#+)bDDhn7=d^UFvQ|Nt4o8 zb?-lz3$Gdpg3X_?ezQ`{3=#&L^mlkwe^4o>={*;DA)P`?ZeWka zxNqD3_G7s1JUp`3z?!z|Whm2|I*u@4K6Ksh0`M5bqLr1+h*q*&3(0d*;_3 z-;94I{>4XnQ6w9JYvqHP)XHS^gguW7|91x3KKk2iKIQ;Z%P`K3U?c1spGq}b0p{6n zGId}+&dz9AdpSH2Glz_i?(j`f4_A#sZb{r=mR?|SZ8|+N* zTyFj`P3cbY~5CitKm|n6n%FErjII1+aaj%Uv4hf^$O~s2yQ-&GL=w*bw)U*HHI7(Wvmf~z>k|y_ zS%-Z3juN8%HvDK7{D-1QUGb&$E%pm=RQlc7k~8Xfas;Li-qWbuBlXQw=)XR%=HsXN zbsz9IctiQw-fQkBhrCE^1UTj1#4^xhdJb97)5WFU6Whw-t?W?pn)3*>t4_2vF;rmQfg2RYn>VJiuJvbC4Ti#%bkZ0M_%}7PA}klL;H>1 zd>8F)9tqi$g$djnOvHrh0|UW~oN8()12L2RY&Wy7Gp+6wlT+#}_I+SWgbv9i+7Kw< z4c$GBGVxoms84&BUa8$f-9hVE>_3!g@X@H@g0*oFACxo7X@o7Qg3r(vT37Kp6ia0F z4zZ@#2tUM}O-NpQr#AZc(U)g8^7Z4)$q1uSTy-r!_NUIx95^21V-^WRRlLFUIb0a!QT42$g*4J_l z2x`qaMZy#TakYw+jbDnuCUgf_{}GMI`q&$-5hx>Yxf20=_4&Dbvd0})s2A_Kh@8Ks z4%Acy#Sgg<4rbd(O_2_)dP5Bda`wZj3Z(%K4eIW-P`*x0i?rYA77d7Zof4frHb4kh zWrQ1blcpuPs)cYERrGfK*=HRm_QQN~O^v2;F|63V)`AWxT947a%B8OGf%nnuCw1PE z$j**W+t?}WqnFH?QHH6O)Wu=m%U@>dF z#G9`P_ByZN{mgExzrw?!E-Crp@J!x{orYABxflZ;Ta{}s$Rl`_q|D{|o|-tQ+W4MEqt!jYP0gBOaEI88-3fMMY5>~bb;A?ir*)rK9Btg67AVZxnfH;K5>NNfnb(fAgM}Zmgr-+^t=I9>5v;VH z@cp=Ew0~C=M+wv#1VxcI?&@YVH2j)!yP}b=Km>9iuK+KlYCk&QJG*rX?`VT-zE~a? z&;o4$?U5FAol;Dp8W);S`1w3Bhxf(Ks$$O?LqB>YVsTWx>f;~d5@^SCTP~)HI8(l! z`4J@HuS}QJM99%mxBQF+xn}>&T~;Q9_LkR71bXr`CRASZw1hqqLH0$w(&kS((Q`O3 zHE;{jvX$iiq1*Q%LhznoXh8m5`=1o0An+WAR@I-0bVlc-`5?(>dqGzvr{^(9S}Au30A#W6A@%=#77k*XP}FW$JEE zO(Ge1PR3aKSwqrVKr`OF9q8E+`EU&*qR<~HftK4fd%2_|P59CeE@|dC82GzRu`$k{ z>^|pW@BQoTT=MRpY}c5-#7}ON*?BHo@Ob;z4$kdh6?+0mxIx=p z@!{ML)K6J6ym}E?LMoPXMeW*Rc#BT(Tg@IsUDoe8Wqlz2oq-TE|12lpCu{eYytGr= z`}pF}HF>}vfO39aahaX|educpt=&@w)&Whu4SwAxk4;&zEjJhZ3|M^9%ehF$$26+7 zn8w@Rscm`dcP?u%HWiQW7z4Q&fLU~jF?Lbw&tgDAY?Zt23Th`(j4mXS^K|124h0C# z{zEh1#XxXp2$e35^6LT1JfGqY-|L=i^{pHh^@E*n&XkfnRUur?>GjymuTEu&G0-D9 zV%~%U&%V+W?L+1F<^yBynN`-O*50nU+3MPH!_!j1&Lsn{R0Ne_d-cMlYSN{-h#BLV zxLCgFzUY$Qr`l1M&%1sQX;xd-{DVdzc_dkI;78E;Bg}?brU^<98ZzSjVzE z9gfL#Khu&p+JV96StLFmzo~o-RXH@E&Y0xXeg@SaS!*8yf|BiS7}Lo7KrrxnsFu`W zTDe|yAVL6_1=-t(i@`TE4j4bE)|Qs{P&le~O-1k-Y<_(R<5@obgbE9G_~@4csnofx z6cPW$J|R8fT3RUX_`bzt|}2!sZT(Wr6WkVgUS`ab?m#GLg$HdSZE`B;(ebbA;p@< zpusZ8-9E*9U(7k$`2vUKhnPuuBsSxPB8|)q9)M31n2Xv)$si|yKo0IA((93t-fkq zN2)PCd&^PIXRksC+0FFjG^rG0W}q2^LwcJWa1M&!a+2%o+z~oDx9}dMO1s(?ulYSK z4ZWMAzW5Ui!%b_xUc2rfxw5_wF~3%fLvWsnx}KU9e?>Gp*<9ht%9%#s!M?9?K9`mW zEB4f9|03A3y-miJ<)l+)#HK1C34n{OUztn&?m`70G)GKY<(U(Aj!@$GBWtp*AZd1> zY4Tuq@vykjv6bBJd7=YPmjy|5*256@={I{xUDw)L?*Tm_bR|!ap42zn9E_-TAA1eHKz6YP zt5)b@Z%4cOLe&7GO9mGqm7oaaP0LF}&0v+RsUC`%r535VV>jyBxHX|}wKR_9gFK&_ zZ$(N@x9u7$jl3AvLDcU-7LAL_m(XIY-Ao;Pz}^o#&3pAYw{gGWOnx_b^W|>>bOW9* ztzI?DXA8Ak{pIUr{@!1R9&q!xJQw*jkfdv0s!>;L9SY_MWL&&_WhKInR&)ufT-vxQ znoy#{ik#&PGidw840!1hJv*(OMIh(bbw}_KJta8yM{78|cAwKD-@Pd1m>A><6-UCp}4B_dGZf5H}qA z!qXlH(SDM`n~x47O`Pk<1JB{*hvJLuGzrYHS&ERGpy69B9hbUUa243?8r|2m>LAF+ zbcI{jj)xCXm|G@%9@7u~W!^)g!fyA=nF)u7vO{pW)6}$T$s(`F&5)f2rP4^QB+1LUF{k(ZYy>lDZA>QOG>~_x(Kii;4Re+s2IF$i|mhLr)yD;|tbGmyc~dYO${l z#0xi@jl+gsd!U(gYCA}hbdVbf64MS+HOnHbmwX=JM#vt5@hixBacsYWJs9`{hM&!H zdF~9H=M|k&(lyuKHH__z6==L0VEIUFXWcVw=UIz1yy;g0c11^)!dh-Ew;WUjvZriJ zBpfPtPm4DUDA-osP-)0@eKGkpvx}~#XOU0eT&g?)+(VPV_+@sY$LDz(j^k$fCXYMk&sc+&ugDqib zh{)mk!*Xt5wGO?cDHOJIDRSKM{UMkqB9=Z>2*@W@3Pn&I$K5kI&enw+M)7m{RwB(4@Ge4BO0II~YXOBszdhuva8-(F4hF}?N9jCUUWE$dLhShm<5%~(0Zc>_WT~GKuqEQGr zP$F*f_~(8;6wc)DnA2_BFZ#0-R5Mco9lymk;yhnDb~u-XAwB(RGUPV0bUF3;kQZGY z?g~7hx1fRAGX^F%2!*9$)(vAFCDIg`hS9#h2gk|R|I_wMA>}K*Ndo;mM-JfkAnBZO zQNzp7J5W@P=tmqkKT!X#-|*C|c1H!?Vp(Y4D}AiuubzIP7sy3cvW zn!|Bisv%s`U-DOeaXLgKM>(Ayu;Fc;`1B_>Fs8)R1?$RRNO_gOS5#?s-;&X3x+1$ z6^yoe|xHmE~#oVb#ZK-Z(Zp+!`2k!mY4EvOOC2=&*i}J3*OfJjOgkML)S+yY4Xm*&g z$E6j=Q&;bz?zwQoip24EGU%^gVc#OlpvaMH&S5_ z@-Wh5G^)))$eQWE9?ig$B;}iwpeZfC~w!yjNa!PJ8s5K(--W| z1Y$4nR<4P*fsi7y5@038eNSL46UuU){CRL5U;i@AwigU2-uKE!zR}oVeT0?k{RbVr zopUIDQwgDT0@lTw5#lab%}AT%ZdSAY^8YMr?6_paIV1J*2 zR)aq9cwNJ-&Haj=f4Ggk}gOv9al-haMO%2yix=y@so19YNs+<+#+~DkYs7d&^HmP2$KQFc-<7sU$^)b5iu=+p z`}*-#y+Pn7oF=0oFXMP07nyi(&Q-0ZNA9X{;fqI0Q(9T|w^46fJR*OSfJ(R=MzF*> zXM+}j7HFvYxPm43*inT&rOE*m&U_2(hKpddQn|Ch8c5T$Uyn9lYRXR@eOG6mZar<| zb-mN>lG5;BLfdS_U>(y0FHcwYO#QFj{2K!>YkSv@2D{&fFafQ1y+7>2aXpEj{#vuc zt`X8_9$_l8sCC(ar*B1UDFO5P=m7xlHLKmcI5E26NI^s&*PoE%H!{<(OVWR&2H3f(46S_5`Fzg~pKbD=CeD{#hAHz~Qvw~3c(hf%?v=g`T zuZ`F$s|YE3B?Q)@)+`gM2J#Qsow&--Q0{g$)QUxBj4~@y&As(_?j?{8iQyvfuH-T! z;TRHehx{4Iz$FGR8Jugz^&uxO@106KGBp_=NuJS~Ns}anzSgYzqOKC+em>yX&Q|rz zBX2KOdQ%Sd;9y?z9C?LN=VqyJj*;biWL;CP3Yx#6J!~&*3L(Xb7?F|QH0RD&FOFk< zpHifhd^I*n*+8**c+rN$C5OnZ@2c}VJ)6QLbPKwI#ViIkXG2rmPX?cl@I5vW5Qu4e zF%hIh*tAXBx4^9MnedXY??aVqFRE_Ic$q~)y`3iaHSa#_H?ox}V#p!&dwvlX57Z4p zfqvLc8>#7ku>wTgW74QlorJziwNWHLbEzTme)*_@K|rfWxLrnlb@NBB;V+PCmO zSdyi7qc|ipl!Z+&o>7;h^T{eE;w1T9`cJ57#e!cIy;u{No}l?%UcJ}pKMeZX{jFKtZKas zhDa9RyXDHJLLg~=1PBpMEmZ6MP#?|5gw6|?R%R~N-*|zvEXz+nUjm?S>3fX z2{C+te%$)j)W($W+EXfG+NKgNp&z=WP_{})f$8dh#)Pd|ihvT@A9Dzqqn}naXqvG4 zck%Osm8d7}!CEIL%>kkAV<`yKb)3v`(S_>xy?;{*VimvHKho=d*ja)KCZmc^BEWpe z+@Wq-fhuWsYpvS^?VKe`m^~fQ?HZll98gn)17qCOu9H3`_~VJE1iP8 { + if (!HealthKitBridge) return false; + try { return await HealthKitBridge.requestAuthorization(); } catch { return false; } +} + +export async function getLatestHeartRate(): Promise { + if (!HealthKitBridge) return null; + try { + const result = await HealthKitBridge.getLatestHeartRate(); + return result.bpm ? result : null; + } catch { return null; } +} + +export async function getTodaySteps(): Promise { + if (!HealthKitBridge) return 0; + try { + const result = await HealthKitBridge.getTodaySteps(); + return result.steps || 0; + } catch { return 0; } +} + +export async function getLastSleep(): Promise { + if (!HealthKitBridge) return null; + try { + const result = await HealthKitBridge.getLastSleep(); + return result.hours ? result : null; + } catch { return null; } +} + +export async function getHealthSnapshot() { + const [hr, steps, sleep] = await Promise.all([ + getLatestHeartRate(), + getTodaySteps(), + getLastSleep(), + ]); + return { heartRate: hr, steps, sleep }; +} diff --git a/shenyan-app/src/weather.ts b/shenyan-app/src/weather.ts new file mode 100644 index 0000000..a4fee56 --- /dev/null +++ b/shenyan-app/src/weather.ts @@ -0,0 +1,39 @@ +import { NativeModules } from 'react-native'; + +const { WeatherKitBridge } = NativeModules; + +export interface CurrentWeather { + temperature: number; + humidity: number; + condition: string; + pressure: number; + uvIndex: number; + windSpeed: number; + isDaylight: boolean; + visibility: number; +} + +export interface DailyForecast { + high: number; + low: number; + condition: string; + precipitationChance: number; +} + +export async function getCurrentWeather(lat = 31.2, lon = 121.4): Promise { + if (!WeatherKitBridge) return null; + try { return await WeatherKitBridge.getWeather(lat, lon); } catch { return null; } +} + +export async function getDailyForecast(lat = 31.2, lon = 121.4): Promise { + if (!WeatherKitBridge) return []; + try { return await WeatherKitBridge.getDailyForecast(lat, lon); } catch { return []; } +} + +export async function getWeatherSnapshot(lat = 31.2, lon = 121.4) { + const [current, daily] = await Promise.all([ + getCurrentWeather(lat, lon), + getDailyForecast(lat, lon), + ]); + return { current, daily }; +} diff --git a/shenyan-app/沈晏App-进度总览-2026-05-16.md b/shenyan-app/沈晏App-进度总览-2026-05-16.md index b91edb9..fe768c2 100644 --- a/shenyan-app/沈晏App-进度总览-2026-05-16.md +++ b/shenyan-app/沈晏App-进度总览-2026-05-16.md @@ -2,71 +2,63 @@ ## 当前状态 -iOS 真机可运行。双桥(Mac + IDC)通信。自制定制横幅推送。APNs Key 已备。Gitea 代码仓库已建。 +iOS 真机。Mac 桥单通道。APNs 后台推送已通。cyberboss + pare 主动联系。HealthKit + WeatherKit 身体天气。冰箱贴 + 三区无视觉布局。 ## 已完成 ### 苹果开发者 -- 付费开发者账号(Team: Xiulun Wang, ID: ZZMLW32PHH) -- Bundle ID: `com.shenyan.room` -- 真机签名、构建、安装全链路通 +- 付费账号(Team: Xiulun Wang, ID: ZZMLW32PHH),Bundle ID: com.shenyan.room +- APNs Key: 3VJ5X6V9Q8,设备 token 已获取,后台推送已通 +- WeatherKit 权限 + HealthKit 权限 ### 首页 -- 三张 bridge 状态图(away / online / busy),全屏 -- 每 8 秒轮询 `101.36.73.102/health` -- 底部半透明状态文字 -- 左半屏双击「敲门」进聊天室(350ms 双击窗口,POST /knock) +- 三区无视觉布局:左门(50%双击敲)、中记录(窄竖条)、右冰箱贴 +- Bridge 状态轮询,三张图片全屏背景 ### 聊天屏 -- FlatList 自动滚底,消息持久化(AsyncStorage + /history) -- 用户消息右对齐(rgba 0.1),AI 消息左对齐(rgba 0.06),圆角 -- 桥断开提示「消息没发出去,检查WiFi连接」 -- 退出再进消息不丢 +- FlatList 锚定底部(onContentSizeChange + maintainVisibleContentPosition) +- 消息 AsyncStorage 持久化 + /history +- 气泡 25% 白,聊天屏内不弹横幅 -### 双桥通信 -- **Mac 桥** `192.168.31.51:3003`:Claude Code 异步回复(Monitor + /respond) -- **IDC 桥** `101.36.73.102`:DeepSeek 同步回复(POST /api/chat) -- 发一条消息同时到两边,用户看到两个「阿晏」 - -### 推送通知(定制横幅 + 震动) -- 自制定制 Animated 横幅,从顶部滑下 -- 暗色半透明背景 + 细白边框,点击关闭 -- 3.5 秒自动消失 -- Vibration.vibrate(400) 震动 -- 覆盖首页和聊天屏 +### 通信 +- Mac 桥 `192.168.31.51:3004`(3003 被 VS Code 占) +- 端点: /send, /respond, /knock, /push, /push/clear, /poll, /history, /register-device, /notes, /notes/add, /notes/reply +- launchd 持久化 ### APNs -- Key 已创建:Key ID `3VJ5X6V9Q8`,Team ID `ZZMLW32PHH` -- Key 文件:`bridge-local/AuthKey_3VJ5X6V9Q8.p8` -- 环境:Sandbox & Production -- 桥端 apns.js 已写好(JWT + HTTP/2) -- 阻塞:notifee `getAPNSToken()` 在 iOS 26 返回 null +- AppDelegate 原生注册 + Bridging Header,点通知进聊天,badge 清零 +- 定制横幅 + 震动,前台/后台/锁屏全场景 -### App 图标 -- 已替换为眠眠设计的图标(2048x2048 → 各尺寸) +### cyberboss + pare +- 5-20 分钟随机唤醒,pare 先扫健康陡度 → decide.py 判断是否推 +- pare 阈值: 心率±20/过高120/过低50/步数骤增2000/活动<100/睡眠<4h +- alert 同时入 inbox + 冰箱贴 -### 本地桥(bridge-local/server.js) -- 端口 3003,launchd 持久化 -- 数据目录:`~/.shenyan-bridge/` -- 端点:/send, /respond, /knock, /push, /push/clear, /poll, /history, /register-device -- APNs 模块:apns.js(JWT 生成 + HTTP/2 推送) +### HealthKit +- 自定义 ObjC 模块(兼容 Fabric interop),每 10 分钟采心率/步数/睡眠 + +### WeatherKit +- Swift + ObjC 桥接模块,当前天气 + 每日/每小时预报 + +### 冰箱贴 +- Modal 面板,纸质感背景(PIL 生成),黑字多级透明度 +- 每便签独立输入框,KeyboardAvoidingView 防遮挡 +- 未读红点(打开清零),首页背景图 +- 便签回复同步 inbox ### 代码仓库 - Gitea: `http://101.36.73.102:3112/fyah/mao1` → `shenyan-app/` +- IDC: `/home/idc/mao1/shenyan-room/技术/ShenYanApp/` -### 记忆库 -- launchd 每天 4:03 执行记忆整理 - -## 已尝试但回退 -- **BlurView 气泡**:`@react-native-community/blur` 在 RN Fabric + iOS 26 上导致文字裁剪和缝隙 → 回退到纯色背景 -- **notifee 系统通知**:引入后 app 黑屏 + `undefined is not a function` → 疑似 iOS 26 兼容问题 → 卸掉,改用自制定制横幅 +## 已回退 +- BlurView → Fabric + iOS 26 不兼容 +- notifee → 换 push-notification-ios +- IDC 双桥 → 单通道 +- 3003 端口 → 3004 ## 待解决 -- [ ] APNs token 获取(iOS 26 + notifee 兼容) -- [ ] Monitor 5 分钟超时(需频繁 re-arm) -- [ ] 自动回复器(launchd + 外部 claude -p) -- [ ] inbox 旧消息清理 -- [ ] HealthKit 能力 -- [ ] Mi Band 10 身体数据 -- [ ] RoomFeed / EventCard 组件集成 -- [ ] iOS Share Extension(分享到沈晏) +- Monitor 超时 +- 中区功能 +- 冰箱贴回复 → 聊天 +- inbox 清理 +- pare 真实数据验证