dsh-aw-viz:把 ActivityWatch 習慣數據變成模型能讀的指標

前言

做 DeepSeek Harness(DSH)智能體開發時,常見的一個場景是:會話裏掛着一個助手,但它並不知道你這一天在屏幕上花了什麼時間。你要它針對「開會太多、碎片太多」給點建議,它只能靠你自己複述。已有的屏幕使用時間工具大多隻給人類看圖表,或者口徑各不相同,模型拿不到可讀、有定義的指標。

dsh-aw-viz 解決的就是這一步:把你本機 ActivityWatch 的原始記錄聚合成一組有明確定義的指標,並通過一個只讀工具暴露給模型,讓同一會話裏的智能體能讀到數字,再給出針對你用屏方式的具體建議。插件是第三方維護者 woshijing1991-cloud 寫的,定位是隻讀、本地、不聯網。它只負責「讓數據可讀」,判斷和建議仍由模型做。

下面介紹它是什麼、怎麼裝、怎麼用。

這是什麼

一句話定位:一個面向 DSH 桌面版(Harness 0.2.x,Web frontend)的 ActivityWatch 習慣面板,自帶五個視角和模型工具。倉庫名是 woshijing1991-cloud/dsh-aw-viz,README 中的版本號是 0.1.0,許可證是 MIT,package.json 的 engines.node 要求 >=20。

它和「又一個看板」的區別在於:面板每打開一次都會向本地 aw-server 取事件並在內存裏聚合,插件自己不落盤、不存歷史,請求只發往 loopback。所以它讀的是你 ActivityWatch 已有的庫,而不是另起一套存儲。

需要先說清楚邊界:插件默認端點是 http://127.0.0.1:5600(aw-server / aw-server-rust 的 REST API)。ActivityWatch 必須先裝好並在運行,面板是它的只讀視圖,自己不採集任何數據。如果 ActivityWatch 沒跑,插件不會編數字:/api/health 會返回 200 且 body 爲 {"ok": false, "error": "fetch failed"},summary 路由返回 500,界面顯示空狀態。

核心功能

README 把指標分成六組,每組都標了外部參照,不是自造口徑。

時間分配:按類別的佔比、Top 應用、PC 與手機拆分。參照 RescueTime 的 productivity-pulse / category-share 慣例。

碎片化:分段時長中位數、每小時有效活動中的切換次數、小於 30 秒的分段佔比。參照 Mark et al. 2008 的《The Cost of Interrupted Work》和 Leroy 2009 的 attention residue。這裏特意用中位數而不是均值,因爲少數幾個長分段會把均值抬高,反而掩蓋「一段典型連續時間」的樣子。

專注:最長的同類別不間斷區間,以及時長大於等於 25 分鐘的區間數量。參照 Newport 的《Deep Work》和約 90 分鐘的 ultradian rhythm。具體算法是把同類別的分段合併,間隔不超過 2 分鐘算作一次連續塊——它衡量的是「你有多長沒有被打斷」,不是「你覺得多專注」。

節奏:工作日 × 小時的 7×24 熱力圖和逐日趨勢。參照 chronotype 框架和 Digital Wellbeing 的小時視圖。

雙設備:PC 分鐘數 / 手機分鐘數 / PC 佔比、手機解鎖次數。手機解鎖次數對應 Apple Screen Time 的 pickups 口徑。手機端粒度只到應用級(Android 限制),拿不到應用內的頁面。

完整性:斷電/離線時段的數量和時長。插件在本地寫一個 aw-offline 標記,避免把「沒有記錄」誤當成「沒有活動」。

幾個容易讀錯的定義:活躍時間等於窗口事件與「非 AFK 區間」的交集。PC 有 AFK watcher,手機沒有,所以手機時間直接按事件時長計。

數據來源方面,插件從不保存使用歷史。每次打開面板,它向本地 aw-server 要事件並在內存裏聚合;自身不寫磁盤,請求只到 loopback,沒有出站網絡行爲。ActivityWatch 自己保留原始數據庫,路徑取決於你的安裝方式,這個倉庫不假定也不要求任何特定路徑。

接口與模型工具

宿主側註冊了兩個只讀路由,掛在 basePath(默認 /dsh-aw-viz)下:

GET /dsh-aw-viz/api/summary?days=7   # 彙總所有指標
GET /dsh-aw-viz/api/health           # 探測 aw-server 是否在運行

模型側另有一個只讀工具 aw_habit_report,可以直接在對話裏問它要數字:

工具 參數 返回
aw_habit_report days(1–90,默認取配置)、format(text 或 json) 可讀摘要或原始指標

安裝與啓用

前置條件:DSH 桌面版(Harness 0.2.x,Web frontend)、Node 20+、以及一個正在運行且有數據的 ActivityWatch。因爲面板的 HTML/JS 是在宿主啓動時打進頁面的,所以所有安裝路徑最後都要重啓一次應用。

推薦的本地方式是把倉庫拉下來當 file: 插件裝,讓宿主自己寫 profile:

git clone https://github.com/woshijing1991-cloud/dsh-aw-viz.git
cd dsh-aw-viz

# 讓宿主替你寫好 profile(推薦)
dsh plugin --profile <your-profile> add "$(pwd)"

然後重啓 DSH。checkout 要放在穩定路徑:profile 以 file: 依賴引用它,移動或刪除目錄會導致 profile 加載失敗。

如果 DSH 構建帶插件市場且這個包在列表裏,也可以直接從市場界面裝,再重啓。

手動配置

如果你要手工搭 profile,README 提醒三處必須一致:依賴、bundles、以及 cordis.patch.yml 裏的 insert 條目。少了 insert 時依賴能加載但永遠不會掛載,現象和「裝了沒反應」一模一樣。

~/.dsh/profiles/<profile>/package.json:

{
  "dependencies": {
    "dsh-aw-viz": "file:/absolute/path/to/dsh-aw-viz"
  },
  "dsh": {
    "profile": {
      "bundles": ["dsh-aw-viz"]
    }
  }
}

~/.dsh/profiles/<profile>/cordis.patch.yml:

- insert:
    - id: dsh-aw-viz
      name: 'dsh-aw-viz'
      config:
        activityWatchBase: 'http://127.0.0.1:5600'
        basePath: '/dsh-aw-viz'
        defaultRangeDays: 7

然後:

cd ~/.dsh/profiles/<profile> && pnpm install

再重啓 DSH。卸載時刪掉 dependencies 條目、dsh.profile.bundles 條目和 insert 塊,重新跑 pnpm install,重啓。

配置項

profile 配置寫入 patch 層,README 給出三個鍵:

鍵 默認值 含義
activityWatchBase http://127.0.0.1:5600 本地 aw-server 的基礎 URL;ActivityWatch 監聽別處時改這個
basePath /dsh-aw-viz 兩個路由的 URL 前綴;與其他插件衝突時可改
defaultRangeDays 7 請求未指定 days 時的默認窗口

另外 tools/ 下的可選腳本會用到環境變量(插件運行時不用):AW_BASE 默認同上,AW_DATA_DIR 默認 <repo>/aw-data(腳本寫 CSV / JSON / 週報的位置,已 gitignore),AW_TZ_CONFIG 默認 $AW_DATA_DIR/user-tz.json。這些是給導出腳本用的,不是運行時依賴。

掛載方式

插件按宿主自己的 plugin / automation / context 面板同款模式做了兩處註冊:

部分 槽位 說明
側邊欄條目 sidebar.panellist { id: 'aw-viz', order: 20, label: () => '使用習慣' } 加圖標組件;行由宿主渲染,所以字號和 hover 狀態與相鄰項一致
面板主體 main { key: 'aw-viz' },點擊行時用 ctx.layout.selectPanel('aw-viz') 選中

order 的排序是:plugins = 0,automation = 10,本面板 = 20,skills = 31。README 還提到早期版本試過註冊進 sidebar.brand.mark(24px 品牌位),但那是圖標槽不是列表,已廢棄。

典型用法

面板裝好後,直接在對話裏讓模型自己取數即可,不用手工先看圖表。比如讓它看最近七天並給建議:

用 aw_habit_report 看我最近 7 天的屏幕使用,按時間分配和碎片化兩方面給一輪改進建議

如果要原始指標給程序用,可以讓 format 返回 json;想在本地腳本里拉彙總,也可以直接請求路由:

GET /dsh-aw-viz/api/summary?days=7

需要先確認 ActivityWatch 是否在線時,調 /api/health 或用 aw_habit_report 看它是否報錯即可。

適用場景與注意

適合這樣的人:本機已經在跑 ActivityWatch、希望同一會話裏的 DSH 助手能讀到自己真實用屏數據,而不是聽自己口述;並且接受「指標先聚合、建議後生成」這條分工。

有幾點要在裝之前想清楚。插件以當前 DSH 進程的權限運行,並且通過 file: 依賴引用本地 checkout,所以目錄會被宿主加載執行——裝之前應當自己通讀源碼、確認倉庫內容與許可證(MIT)符合預期,不要把目錄放在不受控的位置。它需要 ActivityWatch 已在運行時才能出數,沒跑就只顯示空狀態。手機端只有應用級粒度。

它也不是官方項目:README 明確寫着是 DeepSeek Harness 生態的第三方插件,非官方。

小結

dsh-aw-viz 做的事很窄也很清楚:把你本機 ActivityWatch 的記錄聚合成有定義、可讀的指標,再通過 aw_habit_report 交給同一會話裏的模型,判斷和建議仍然由模型做。它不判斷你的一天,只保證數字可讀、來源可查、行爲只讀。

目錄頁:https://www.skillhub.cn/plugins/woshijing1991-cloud/dsh-aw-viz
GitHub:https://github.com/woshijing1991-cloud/dsh-aw-viz

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜