dsh-agent-office 4.6.1 → 4.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/state.js CHANGED
@@ -337,6 +337,40 @@ export async function fetchWeather(options = {}) {
337
337
  }
338
338
  }
339
339
 
340
+ /** 城市名 → 坐标;用于定位不可用时的天气回退。 */
341
+ const geocodeCache = new Map()
342
+ export async function fetchGeocode(options = {}) {
343
+ const name = String(options.name ?? '').trim()
344
+ if (!name) return { ok: false, error: '请输入城市名' }
345
+ if (name.length > 80) return { ok: false, error: '城市名过长' }
346
+ const cached = geocodeCache.get(name)
347
+ if (cached && Date.now() - cached.at < 24 * 3600 * 1000) return cached.payload
348
+ const url = `https://geocoding-api.open-meteo.com/v1/search?name=${encodeURIComponent(name)}&count=1&language=zh&format=json`
349
+ try {
350
+ const response = await fetch(url, { signal: AbortSignal.timeout(10_000) })
351
+ if (!response.ok) throw new Error('geocode HTTP ' + response.status)
352
+ const body = await response.json()
353
+ const hit = body?.results?.[0]
354
+ if (!hit) {
355
+ const payload = { ok: false, error: '没有找到这个城市,换个写法试试' }
356
+ geocodeCache.set(name, { at: Date.now(), payload })
357
+ return payload
358
+ }
359
+ const payload = {
360
+ ok: true,
361
+ name: hit.name,
362
+ admin1: hit.admin1 ?? '',
363
+ country: hit.country ?? '',
364
+ lat: Number(hit.latitude),
365
+ lon: Number(hit.longitude),
366
+ }
367
+ geocodeCache.set(name, { at: Date.now(), payload })
368
+ return payload
369
+ } catch (error) {
370
+ return { ok: false, error: '城市查询失败:' + String(error?.message ?? error) }
371
+ }
372
+ }
373
+
340
374
  export function createNightShiftStore(options = {}) {
341
375
  const sessionsDir = options.sessionsDir ?? join(process.env.DSH_HOME || join(homedir(), '.dsh'), 'sessions')
342
376
  const maxAgents = Number(options.maxAgents ?? 8)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-agent-office",
3
- "version": "4.6.1",
3
+ "version": "4.6.2",
4
4
  "description": "实时 3D 办公室可视化 DSH 会话;Catora 发布后拓展笔记、思维导图、私人知识库与 RAG 检索。",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
Binary file
package/panel-src/main.js CHANGED
@@ -14,6 +14,7 @@ import faceSurprised from './assets/exp-surprised.png'
14
14
  import faceThinking from './assets/exp-thinking.png'
15
15
  import faceLoved from './assets/exp-loved.png'
16
16
  import faceSlits from './assets/exp-slits.png'
17
+ import faceUneven from './assets/exp-uneven.png'
17
18
 
18
19
  const API = '/agent-office/api/state'
19
20
  const FLOOR_GAP = 4.0
@@ -358,6 +359,7 @@ const FACE_SRC = {
358
359
  thinking: faceThinking,
359
360
  loved: faceLoved,
360
361
  slits: faceSlits,
362
+ uneven: faceUneven,
361
363
  }
362
364
  const faceTextures = {}
363
365
  const faceLoader = new THREE.TextureLoader()
@@ -371,7 +373,7 @@ const GLASS_KEY = 'agent-office-ui-opacity'
371
373
  let customFaceTexture = null
372
374
  let customFaceData = ''
373
375
  const FACE_FOR_STATUS = {
374
- working: 'happy',
376
+ working: 'uneven',
375
377
  need_me: 'surprised',
376
378
  stuck: 'dizzy',
377
379
  done: 'loved',