前言¶
做 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