@telosmaylx/dsh-session-notify 0.1.13 → 0.1.17

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/README.ko.md CHANGED
@@ -13,7 +13,7 @@
13
13
  [![DSH](https://img.shields.io/badge/DSH-Web%20Profile-4D6BFE)](https://www.npmjs.com/package/@telosmaylx/dsh-session-notify)
14
14
  [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/TelosmaYLX/dsh-session-notify/pulls)
15
15
 
16
- 대화의 각 턴이 끝날 때 「완료 / 오류 / 차단 / 상한 도달」 상태를 소요 시간, token 소모량과 함께 세션 로그에 기록하고, 브라우저 시스템 알림과 페이지 내 toast를 푸시합니다. 5개 언어, 4가지 스타일 프리셋(카오모지 / 아이루 / 네코무스메 / DeepSeek짱), 시각적 문구 템플릿 편집기, 커스텀 프리셋 라이브러리가 내장되어 있으며, 캐시 적중률과 생성 속도는 공식 프로젝션에서 가져와 상태 표시줄과 동일한 기준을 사용합니다.
16
+ 대화의 각 턴이 끝날 때 「완료 / 오류 / 차단 / 상한 도달」 상태를 소요 시간, token 소모량과 함께 세션 로그에 기록하고, 브라우저 시스템 알림과 페이지 내 toast를 푸시합니다. **AI가 질문할 때도 즉시 팝업으로 알려드립니다** — 세션 페이지를 지켜볼 필요가 없습니다. 5개 언어, 4가지 스타일 프리셋(카오모지 / 아이루 / 네코무스메 / DeepSeek짱), 시각적 문구 템플릿 편집기, 커스텀 프리셋 라이브러리가 내장되어 있으며, 캐시 적중률과 생성 속도는 공식 프로젝션에서 가져와 상태 표시줄과 동일한 기준을 사용합니다.
17
17
 
18
18
  </div>
19
19
 
@@ -49,6 +49,16 @@
49
49
 
50
50
  ## 주요 기능
51
51
 
52
+ <div align="center">
53
+
54
+ <img src="screenshot/screenshot1.png" width="220" alt="제목 편집기">
55
+ <img src="screenshot/ScreenShot2png.png" width="220" alt="본문 편집기">
56
+ <img src="screenshot/ScreenShot3.png" width="220" alt="작업 완료 알림">
57
+ <img src="screenshot/ScreenShot4.png" width="220" alt="AI 질문 알림">
58
+ <img src="screenshot/ScreenShot5.png" width="220" alt="작업 오류 알림">
59
+
60
+ </div>
61
+
52
62
  ### 3채널 알림, 하나도 빠짐없이
53
63
 
54
64
  | 채널 | 형태 | 설명 |
@@ -62,12 +72,17 @@
62
72
  - 호스트는 모든 세션(백그라운드, 열려 있지 않은 창 포함)에 대해 「마지막 알림 본문」의 세션 프로젝션 유닛(key = `session-complete-notify`)을 유지합니다. 알림 본문은 세션 간에 일관되며, 사용자가 해당 창을 열어 두고 있지 않아도 됩니다.
63
73
  - 클라이언트는 세션 목록 스냅샷에서 모든 세션의 `running` 비트를 관찰하며, `true → false` 엣지가 곧 알림 트리거입니다. 공식 sidebar 알림과 동일한 전략입니다(최초 관찰 시에는 기준선만 기록하며, 이미 idle 상태인 세션은 추가 발송하지 않습니다).
64
74
 
75
+ ### 질문 즉시 알림
76
+
77
+ - AI가 `ask_user_question`을 호출해 질문하면, 호스트가 즉시 「질문 제목 + 본문」을 전용 프로젝션(key = `session-complete-notify-question`)에 기록하고, 클라이언트가 실시간 폴링 후 팝업으로 알립니다——**다른 페이지를 보고 있어도 질문을 놓치지 않습니다**.
78
+ - 질문 문구는 완전히 커스터마이징할 수 있습니다. 제목은 「사유별 제목 → 전역 제목 → 기본 제목」 순서로 결정되며, 본문은 `{question}` 플레이스홀더(AI의 실제 질문 주입)와 `{image}` / `{icon}` 미디어 스위치를 지원합니다.
79
+
65
80
  ### 문장 하나하나까지 커스터마이징
66
81
 
67
82
  - **5개 언어**: 간체 중국어, 번체 중국어, English, 일본어, 한국어 —— 알림 문구, 소요 시간·소모량 표현, 설정 패널 UI가 모두 언어에 따라 전환됩니다(전환 즉시 재렌더링).
68
83
  - **시각적 템플릿 편집기**(Chip 캡슐 편집기): 동적 정보를 인라인 캡슐로 렌더링합니다(플레이스홀더 코드가 노출되지 않음). 「+ 정보 삽입」은 커서 위치에 삽입되며(텍스트 중간에도 삽입 가능), 캡슐을 클릭하면 제거됩니다. 각 항목마다 실시간 미리보기가 제공됩니다(정보는 예시 값으로 본문에 흘러 들어감).
69
- - **프리셋 시스템**: 내장 「기본」 기준선 + 원클릭 스타일 프리셋 4종(카오모지 / 아이루 / 네코무스메 / DeepSeek짱 — 제목과 5개 사유 문구를 통째로 스타일화). 현재 설정은 커스텀 프리셋으로 별도 저장할 수 있으며(`localStorage` 영속화), 자동 번호가 매겨진 이름 없는 프리셋(`이름 없음`, `이름 없음 2`…)과 「출처: xxx · 수정됨」 출처 표시, 프리셋 삭제를 지원합니다.
70
- - **알림 제목 템플릿**: 비워 두면 각 사유에 대해 기본 제목을 사용합니다(완료=작업 완료 / 오류=작업 오류 / …). `{title}`은 세션 제목을 참조합니다.
84
+ - **프리셋 시스템**: 내장 「기본」 기준선 + 원클릭 스타일 프리셋 4종(카오모지 / 아이루 / 네코무스메 / DeepSeek짱 — 제목과 5개 종료 사유 + 질문 문구를 통째로 스타일화). 현재 설정은 커스텀 프리셋으로 별도 저장할 수 있으며(`localStorage` 영속화), 자동 번호가 매겨진 이름 없는 프리셋(`이름 없음`, `이름 없음 2`…)과 「출처: xxx · 수정됨」 출처 표시, 프리셋 삭제를 지원합니다.
85
+ - **알림 제목 템플릿**: 비워 두면 각 사유에 대해 기본 제목을 사용합니다(완료=작업 완료 / 오류=작업 오류 / … / 질문=AI가 질문했습니다). `{title}`은 세션 제목을 참조합니다.
71
86
 
72
87
  ### 공식 지표와 동일 기준
73
88
 
@@ -222,6 +237,8 @@ dsh plugin --profile web remove @telosmaylx/dsh-session-notify
222
237
 
223
238
  **하위 에이전트 세션은 기본적으로 건너뜁니다**(`header.origin === 'subagent'` 또는 `delegationDepth > 0`) —— 하위 에이전트는 상위 세션이 조율하므로 턴마다 알림을 보내면 노이즈가 됩니다. 호스트 설정에서 건너뛰기를 해제할 수 있습니다.
224
239
 
240
+ **질문 알림은 독립 채널이며 위 화이트리스트에 포함되지 않습니다**: AI가 `ask_user_question`을 호출해 답변을 기다리는 동안(`tool/call` 이벤트) 즉시 알림이 뜨고, `tool/result`가 반환되면 알림이 무효화됩니다. 질문은 세션 로그에 기록되지 않고 알림만 표시됩니다.
241
+
225
242
  ### 알림 본문은 어디서 오나
226
243
 
227
244
  클라이언트는 세션 목록에서 `running: true → false` 엣지를 관찰하면 알림을 보내며, 본문은 다음 우선순위로 가져옵니다(최대 6초 폴링, 400ms 간격):
@@ -230,20 +247,22 @@ dsh plugin --profile web remove @telosmaylx/dsh-session-notify
230
247
  2. **세션 이벤트 윈도우의 notice 노드**(`kind=context` + `form=notice`) —— 보고 있는 세션은 디스크 저장 직후 바로 사용할 수 있습니다.
231
248
  3. **폴백** —— 「상세는 세션 내 시스템 메시지 참조」+ 작업 영역 정보(`cwd` 마지막 세그먼트).
232
249
 
250
+ 질문 알림의 본문도 호스트 프로젝션(key = `session-complete-notify-question`, 호스트가 제목과 본문을 이미 렌더링)을 우선 사용하며, 해당 프로젝션이 없는 구버전 호스트에서는 클라이언트가 제목과 `{question}` 텍스트를 직접 조합해 폴백합니다.
251
+
233
252
  ### 알림 예시
234
253
 
235
- 아래는 모두 `lib/core.js`의 `buildNotice`가 실제로 생성한 것입니다. 기본 문구는 「세션「{title}」〇〇. 클릭하여 확인.」 형식으로 통일됩니다(종료 사유에 따라 단어가 다르며, **소요 시간·소모량은 포함하지 않음**):
236
-
237
- 한국어 기본 문구:
238
-
239
- ```text
240
- 세션「重构登录模块」 완료. 클릭하여 확인. ← 완료
241
- 세션「重构登录模块」 중단됨. 클릭하여 확인. ← 중단
242
- 세션「重构登录模块」 차단됨. 클릭하여 확인. ← 차단
243
- 세션「重构登录模块」 한도 도달. 클릭하여 확인. ← 한도 도달
244
- 세션「重构登录模块」 오류. 클릭하여 확인. ← 오류
245
- ```
246
-
254
+ 아래는 모두 `lib/core.js`의 `buildNotice`가 실제로 생성한 것입니다. 기본 문구는 「세션「{title}」〇〇. 클릭하여 확인.」 형식으로 통일됩니다(종료 사유에 따라 단어가 다르며, **소요 시간·소모량은 포함하지 않음**):
255
+
256
+ 한국어 기본 문구:
257
+
258
+ ```text
259
+ 세션「重构登录模块」 완료. 클릭하여 확인. ← 완료
260
+ 세션「重构登录模块」 중단됨. 클릭하여 확인. ← 중단
261
+ 세션「重构登录模块」 차단됨. 클릭하여 확인. ← 차단
262
+ 세션「重构登录模块」 한도 도달. 클릭하여 확인. ← 한도 도달
263
+ 세션「重构登录模块」 오류. 클릭하여 확인. ← 오류
264
+ ```
265
+
247
266
  > 세션에 제목이 없으면(`titleValue`가 비어 있음) 「세션 완료. 클릭하여 확인.」으로 폴백합니다. 소요 시간·소모량·캐시 적중률·속도는 커스텀 템플릿에서 `{duration}` `{usage}` `{cache}` `{tps}`를 삽입한 경우에만 표시됩니다.
248
267
 
249
268
  커스텀 템플릿(설정 패널에서 편집하며, 이 예시는 모든 정보 슬롯 사용):
@@ -281,7 +300,7 @@ Session "重构登录模块" completed (took 3m25s, used 1,240 in / 3,560 out).
281
300
 
282
301
  ## 설정
283
302
 
284
- 대부분의 설정은 **DSH Web UI → 설정 → 플러그인 → 세션 완료 알림** 패널에서 완료됩니다(저장 후 「클릭하여 새로고침」을 누르면 적용). 「트리거 사유 화이트리스트」와 「하위 에이전트 건너뛰기」 두 항목만 호스트 `cordis.patch.yml`의 `config`에서 설정합니다.
303
+ 대부분의 설정은 **DSH Web UI → 설정 → 플러그인 → 세션 완료 알림** 패널에서 완료됩니다(저장 후 「클릭하여 새로고침」을 누르면 적용). 「트리거 사유 화이트리스트」만 호스트 `cordis.patch.yml`의 `config`에서 설정합니다(하위 에이전트 건너뛰기는 패널의 체크박스로 제어).
285
304
 
286
305
  ### 설정 패널
287
306
 
@@ -293,12 +312,12 @@ Session "重构登录模块" completed (took 3m25s, used 1,240 in / 3,560 out).
293
312
  | 언어 | 5개 언어 중 단일 선택, 전환 시 패널 전체 즉시 재렌더링 |
294
313
  | 알림 방식 | 3택1: 이중 채널(시스템 알림 + 페이지 내 알림, 기본값) / 시스템 알림만 / 페이지 내 알림만 |
295
314
  | 알림 미디어 | 큰 이미지의 두 가지 소스: **사유별 업로드**——템플릿에서 「+ 정보 삽입 → 이미지」로 `{image}` 토큰을 삽입하고 로컬 이미지 선택(편집기에서 썸네일이 있는 칩으로 표시, **512px 너비·알림 표시 비율 16:9 중앙 크롭**으로 자동 압축, 사유별 저장). **전역 이미지/아이콘**——업로드 카드 2개를 한 줄에 나란히 배치(**아이콘이 먼저**. 빈 상태는 둥근 모서리 "+" 타일, 클릭하면 업로드. **이미지 512×288(16:9 중앙 크롭), 아이콘 128×128(1:1 정사각 중앙 크롭)**. 업로드 후 카드에 썸네일 표시, **클릭하면 전체 화면 미리보기(비율 유지·크롭 없는 원본 이미지)**, 오른쪽 위 ×로 삭제). 아이콘은 비우면 사이트 기본 아이콘, 또는 템플릿에 `{icon}` 토큰을 삽입해 **사유별 아이콘** 지정(전역보다 우선). 시스템 알림 채널에만 적용(페이지 내 토스트는 텍스트 카드). 「보내기」 테스트 버튼에도 동일 적용 |
296
- | 제목 | 접이식 섹션(**기본 접힘**, 클릭하면 펼침): **전역 푸시 제목**(모든 이유 공통. Chip 편집기——「+ 정보 삽입」으로 삽입한 정보는 **캡슐 태그**로 표시되고, 클릭으로 제거. **알림 전송 시 제목 안의 정보 토큰(소요 시간/소모/오류/캐시 히트/속도)이 실제 값으로 대체되어 코드가 노출되지 않음**. 비워 두면 각 사유별 기본 제목 사용——완료=작업 완료, 오류=작업 오류, 중단=작업 중단, 차단=작업 차단, 상한=출력 상한 도달) + **사유별 제목**(5개 사유 각각 입력. 비우면 전역 또는 언어 기본값 사용) |
297
- | 콘텐츠 | 접이식 섹션(**기본 접힘**, 클릭하면 펼침). 펼치면 각 종료 사유(완료, 오류, 중단, 차단, 출력 상한)마다 **한 줄 레이아웃**(사유 라벨 + Chip 편집기 + "+" 삽입 버튼——메뉴 펼침 중에는 "−"로 변경 + **종이비행기 보내기 버튼**. 버튼은 직사각형이며 세로 중앙 정렬): **템플릿이 비어 있으면(기본 프리셋) 편집기에 기본 문구 표시**. 텍스트 + 인라인 정보 캡슐, 커서 위치에 삽입; `{image}`/`{icon}` 칩은 **썸네일 클릭으로 큰 이미지 미리보기, × 클릭으로만 삭제**(실수 삭제 방지), 다른 칩은 클릭으로 제거; **편집 후 비우면 "비우면 기본 문구 사용" 플레이스홀더 표시(선택·삭제 불가)** |
315
+ | 제목 | 접이식 섹션(**기본 접힘**, 클릭하면 펼침): **전역 푸시 제목**(모든 이유 공통. Chip 편집기——「+ 정보 삽입」으로 삽입한 정보는 **캡슐 태그**로 표시되고, 클릭으로 제거. **알림 전송 시 제목 안의 정보 토큰(소요 시간/소모/오류/캐시 히트/속도)이 실제 값으로 대체되어 코드가 노출되지 않음**. 비워 두면 각 사유별 기본 제목 사용——완료=작업 완료, 오류=작업 오류, 중단=작업 중단, 차단=작업 차단, 상한=출력 상한 도달, 질문=AI가 질문했습니다) + **사유별 제목**(6개 사유 각각 입력. 각 행에 "+" 삽입 버튼——삽입 가능한 정보 토큰(「질문」포함, 이미지/아이콘 제외), 커서 위치에 삽입; **전역 제목보다 우선**. 비우면 전역 또는 언어 기본값 사용) |
316
+ | 콘텐츠 | 접이식 섹션(**기본 접힘**, 클릭하면 펼침). 펼치면 각 사유(완료, 오류, 중단, 차단, 출력 상한, 질문)마다 **한 줄 레이아웃**(사유 라벨 + Chip 편집기 + "+" 삽입 버튼——메뉴 펼침 중에는 "−"로 변경 + **종이비행기 보내기 버튼**. 버튼은 직사각형이며 세로 중앙 정렬): **템플릿이 비어 있으면(기본 프리셋) 편집기에 기본 문구 표시**. 텍스트 + 인라인 정보 캡슐, 커서 위치에 삽입; `{image}`/`{icon}` 칩은 **썸네일 클릭으로 큰 이미지 미리보기, × 클릭으로만 삭제**(실수 삭제 방지), 다른 칩은 클릭으로 제거; **편집 후 비우면 "비우면 기본 문구 사용" 플레이스홀더 표시(선택·삭제 불가)**. 질문 행의 기본 문구는 「AI가 질문합니다: {question}」이며, `{question}`은 보낼 때 AI의 실제 질문으로 대체됩니다(삽입 메뉴에도 「질문」 토큰이 있으며 다른 토큰과 동일한 조작입니다) |
298
317
  | 하위 에이전트 세션 건너뛰기 | 체크박스(저장 시 설정 문서에 함께 기록) |
299
318
  | 알림 권한 | 상태 실시간 표시: 승인됨(초록) / 미승인(「권한 요청」 버튼 포함) / 브라우저가 차단함(주소창 조작 안내 포함) / 환경 미지원 |
300
319
  | 사유별 제목 커스터마이징 | 접는 영역(기본 접힘): 각 종료 사유마다 독립 제목 입력 상자. 비워 두면 = 전역 템플릿 또는 언어 기본 제목 사용 |
301
- | 저장 | 호스트 설정 문서에 기록(`language` / `templates` / `titleTemplate` / `titleTemplates` / `pushMode`). 저장 후 「클릭하여 새로고침」 링크 표시 |
320
+ | 저장 | 호스트 설정 문서에 기록(`language` / `templates` / `titleTemplate` / `titleTemplates` / `pushMode` / `skipSubagents`). 저장 후 「클릭하여 새로고침」 링크 표시 |
302
321
  | 초기화 | 원클릭으로 기본값 복원(**언어는 현재 선택 유지**, 제목/템플릿/알림 방식은 기본값으로 복원) 후 즉시 저장 |
303
322
 
304
323
  > [!NOTE]
@@ -324,6 +343,7 @@ Session "重构登录模块" completed (took 3m25s, used 1,240 in / 3,560 out).
324
343
  | `{tps}` | 생성 속도(공식 프로젝션 기준, 데이터 없으면 비어 있음) | `92 tok/s` |
325
344
  | `{image}` | 사용자 지정 알림 이미지 스위치: 「+ 정보 삽입」에서 삽입하고 로컬 이미지 선택(512px로 자동 압축), 사유별로 독립. 본문 렌더링 시 제거되며 세션 로그에 기록되지 않음. 토큰을 삭제하면 해당 사유의 이미지 데이터도 함께 지워짐 | — |
326
345
  | `{icon}` | 사용자 지정 알림 아이콘 스위치: 「+ 정보 삽입」에서 삽입하고 로컬 이미지 선택(128×128 정사각형으로 자동 압축), 사유별로 독립. 본문 렌더링 시 제거되며 세션 로그에 기록되지 않음. 전역 「알림 아이콘」보다 우선. 토큰을 삭제하면 해당 사유의 아이콘 데이터도 함께 지워짐 | — |
346
+ | `{question}` | **질문 행 전용 플레이스홀더**: 보낼 때 AI의 실제 질문 텍스트로 대체됩니다. 「+ 정보 삽입」메뉴와 연동(「질문」토큰을 직접 선택 가능, 직접 입력한 `{question}`도 캡슐로 인식). 질문 채널에서만 사용 가능하며, 다른 사유 행에 넣으면 빈 문자열로 대체됩니다(리터럴 누출 방지) | `보고서 생성을 계속할까요?` |
327
347
  | `{label}` | 폐기됨 —— 렌더링 시 자동 제거, 기존 템플릿은 계속 호환(삽입 메뉴에서 해당 옵션 제거됨) | — |
328
348
 
329
349
  템플릿을 비워 두면 내장 기본 문구를 사용합니다(「세션「{title}」〇〇. 클릭하여 확인.」 형식으로 통일, 소요 시간·소모량 미포함). 접히는 행의 `summary`는 본문과 동일한 소스입니다(렌더링 결과 120자로 잘림) —— 접힌 행만 보는 사용자도 실제 제목과 소요 시간, 소모량을 확인할 수 있습니다.
@@ -365,6 +385,7 @@ Session "重构登录模块" completed (took 3m25s, used 1,240 in / 3,560 out).
365
385
  │ session/event 火线 │
366
386
  │ ├─ turn/start → tracker 起表(key: sessionId:turn) │
367
387
  │ ├─ assistant/message → 累加该轮 token 用量 │
388
+ │ ├─ tool/call → ask_user_question?写提问投影(标题+正文) │
368
389
  │ └─ turn/end → reason.kind ∈ reasons ? │
369
390
  │ ├─ 子代理会话?跳过 │
370
391
  │ ├─ 读官方投影:cache / tps / title │
@@ -374,6 +395,8 @@ Session "重构登录模块" completed (took 3m25s, used 1,240 in / 3,560 out).
374
395
  │ │
375
396
  │ settings.register → 官方「设置 → 插件」命名空间(失败退避重试) │
376
397
  │ sessionProjections → 注册投影单元(key=session-complete-notify) │
398
+ │ + 提问投影(key=session-complete-notify- │
399
+ │ question,等待回答期间持续推送) │
377
400
  └──────────────────────────────┬──────────────────────────────────────┘
378
401
  │ user/message (source: plugin, form: notice)
379
402
  ▼ JSONL 持久化 + 投影推送
@@ -383,6 +406,8 @@ Session "重构登录模块" completed (took 3m25s, used 1,240 in / 3,560 out).
383
406
  │ ├─ 取正文:投影 → 事件窗口 notice → 降级(轮询 ≤6s) │
384
407
  │ ├─ Web Notification(独立 tag,点击聚焦) │
385
408
  │ └─ 页内 toast(永远展示,≤3 条,10s 自动消失) │
409
+ │ 提问投影轮询(key=session-complete-notify-question): │
410
+ │ 有值 → 立即弹提醒(标题+正文),无值清空 │
386
411
  │ │
387
412
  │ slots.inject('settings.plugin.item') → 设置卡片(预设/语言/模板) │
388
413
  └─────────────────────────────────────────────────────────────────────┘
@@ -410,7 +435,8 @@ dsh-session-notify/
410
435
  │ │ # sessionProjections 投影单元(后台会话推送正文)
411
436
  │ ├── core.js # 纯逻辑层(零依赖,可独立测试):轮次计时与用量聚合、
412
437
  │ │ # 5 语言文案表、时长/用量/缓存/速度格式化、
413
- │ │ # 模板渲染({title}{duration}{usage}{error}{cache}{tps}
438
+ │ │ # 模板渲染({title}{duration}{usage}{error}{cache}{tps})、
439
+ │ │ # 提问正文构建(buildQuestionBody,{question} + 媒体剥除)
414
440
  │ └── client.js # 浏览器平面:完成推送(系统通知 + toast)、
415
441
  │ # 设置卡片(Chip 模板编辑器 + 预设系统 + 实时预览)
416
442
  ├── scripts/
@@ -471,6 +497,13 @@ node scripts/verify-notice.mjs <session.jsonl.zstd>
471
497
 
472
498
  </details>
473
499
 
500
+ <details>
501
+ <summary><b>AI가 질문해도 팝업 알림이 뜨나요?</b></summary>
502
+
503
+ 뜹니다. AI가 `ask_user_question`을 호출해 답변을 기다리면, 호스트가 즉시 「질문 제목 + 본문」을 전용 프로젝션(key = `session-complete-notify-question`)에 기록하고, 클라이언트가 폴링으로 값을 얻으면 즉시 알림을 띄웁니다——다른 페이지를 보고 있어도 놓치지 않습니다. 질문 문구는 완료 알림과 똑같이 완전히 커스터마이징할 수 있습니다. 설정 패널의 「제목 / 콘텐츠」 접이식 섹션에 각각 「질문」 행이 있으며, 본문은 `{question}` 플레이스홀더(AI의 실제 질문 주입)와 `{image}` / `{icon}` 미디어 스위치를 지원합니다. 답변 후(`tool/result`)에는 알림이 무효화되어 남지 않습니다.
504
+
505
+ </details>
506
+
474
507
  <details>
475
508
  <summary><b>왜 「중단」(interrupted)은 알림을 보내지 않나요?</b></summary>
476
509
 
@@ -533,27 +566,31 @@ node scripts/verify-notice.mjs <session.jsonl.zstd>
533
566
 
534
567
  ---
535
568
 
536
- ## 변경 로그
537
-
538
- | 버전 | 날짜 | 변경 |
539
- | --- | --- | --- |
540
- | **0.1.13** | 2026-08-29 | **원클릭 스타일 프리셋 4종** 추가(카오모지 / 아이루 / 네코무스메 / DeepSeek짱 제목 + 5개 사유 문구를 통째로 스타일화, **5개 언어 지원**·불러와도 UI 언어를 강제 변경하지 않음). 프리셋 드롭다운에서 폐기된 옛 템플릿 이름(playful/formal/detail) 정리. README 기본 문구 예시를 「세션「{title}」〇〇. 클릭하여 확인.」 형식으로 동기화(소요 시간·소모량 미포함) |
541
- | **0.1.12** | 2026-08-29 | 패키지 정리: scripts에 포함된 임시 감사 스크립트 제거 |
542
- | **0.1.11** | 2026-08-29 | **사용자 지정 알림 미디어** 추가: ① 템플릿의 「+ 정보 삽입」 메뉴에 **이미지** 토큰 추가——`{image}`를 삽입하고 로컬 이미지 선택(**512px 너비·알림 표시 비율 16:9 중앙 크롭**으로 자동 압축, 편집기에서는 썸네일이 있는 칩으로 표시), 사유별로 업로드하여 설정 문서에 저장(본문 렌더링 시 제거되어 세션 로그에 기록되지 않음). ② **알림 이미지/아이콘을 업로드 카드로 변경**(빈 상태는 둥근 모서리 "+" 타일, 클릭하면 업로드. **이미지 512×288(16:9 중앙 크롭), 아이콘 128×128(1:1 정사각 중앙 크롭)**. 업로드 후 카드에 썸네일 표시, 오른쪽 위 ×로 삭제)——크롭으로 업로드한 이미지가 알림 카드에 완전히 표시되어 시스템 표시 영역에 잘리지 않습니다. ③ **알림 제목의 「+ 정보 삽입」**으로 원하는 정보 토큰 삽입(세션 제목/소요 시간/소모/캐시 히트/속도). 설정 패널의 "알림 미디어" 영역에 **처리 방식 안내**(크롭 비율)와 **업로드 후 썸네일 미리보기** 표시. ④ **사유별 알림 아이콘**(템플릿에 `{icon}` 토큰 삽입 + 로컬 업로드, 128×128 정사각형, 전역보다 우선). ⑤ **`{image}`/`{icon}` 토큰을 삭제하면 해당 사유의 이미지/아이콘 데이터도 함께 삭제**. ⑥ **레이아웃 개선: "본문 템플릿 × 5"를 접이식 섹션으로 변경(기본 접힘, 패널을 컴팩트하게. 헤더에 사용자 지정된 개수 표시, 클릭하면 펼침)**. ⑦ **레이아웃 개선②: 알림 이미지/아이콘 업로드 카드를 한 줄에 나란히 배치(사이 여백); 푸시 제목과 사유별 제목을 "제목" 접이식 섹션으로 통합(기본 접힘); 접기 표시를 삼각형 아이콘으로 변경("펼치기/접기" 문구 제거, i18n 부담 감소)**. ⑧ **조작 개선: 푸시 제목을 Chip 편집기로 변경(삽입한 정보가 캡슐 태그로 표시되어 `{title}` 같은 코드가 노출되지 않음); 이미지/아이콘 카드 순서 변경(아이콘 먼저); "본문 템플릿 × 5"를 "콘텐츠"로 개명; 이미지/아이콘 썸네일 클릭 시 전체 화면 미리보기(라이트박스), 태그는 × 클릭으로만 삭제(실수 삭제 방지)**. ⑨ **미리보기를 원본 이미지로 통일: 업로드 시 크롭 버전(알림용)과 비율 유지 전체 버전(1024px, 라이트박스 원본 표시용)을 함께 저장하여 카드와 태그의 확대 미리보기가 모두 크롭 없는 원본을 표시. 접기 삼각형 아이콘 확대**. ⑩ **제목 정보 토큰 수정: 알림 제목 안의 `{duration}` `{usage}` `{error}` `{cache}` `{tps}`가 세션의 실제 값으로 대체되어 코드가 노출되지 않음(편집 시 캡슐, 전송 시 실데이터). "콘텐츠"를 한 줄 레이아웃으로 변경(사유 라벨 + 편집기 + "+/-" 삽입 버튼 + 종이비행기 보내기 버튼)**. ⑪ **세부: 콘텐츠 행 아래 실시간 미리보기 제거(더 컴팩트하게); 콘텐츠 편집기 내부 여백 축소(compact); "+/-"와 종이비행기 버튼을 직사각형 테두리·세로 중앙 정렬로 변경**. ⑫ **삭제 경험 수정: 콘텐츠를 비워도 기본 문구로 복원되지 않음(플레이스홀더 표시), 비운 후 커서가 끝으로 돌아가 Backspace 길게 눌러 연속 삭제 가능; "+/-"를 SVG 선 아이콘으로 변경(버튼 테두리에 정확히 중앙 정렬); 종이비행기 아이콘을 시계 반대 방향 30° 회전**. ⑬ **플레이스홀더와 기본 문구: 템플릿이 비어 있으면(기본 프리셋) 편집기에 기본 문구를 직접 표시(보이는 대로 알림이 전송됨). 편집 후 비우면 "비우면 기본 문구 사용" 플레이스홀더 표시——CSS 의사 요소로 구현(네이티브 input placeholder와 동일: 선택·삭제 불가), 기존 복사 가능한 플레이스홀더 문자열 대체**. ⑭ **세부②: 푸시 제목 플레이스홀더 문구를 "공통 푸시 제목. 비우면 기본 제목 사용(아래 사유별 제목이 우선)"으로 변경, 빈 편집기 클릭 시 커서가 맨 앞으로 이동(입력 문자가 왼쪽 끝에서 시작, 네이티브 placeholder와 동일); 종이비행기 아이콘을 시계 반대 방향으로 30° 더 회전(총 60°); "콘텐츠"의 사유 라벨을 자동 너비로 변경(편집기가 라벨 글자에 밀착); 편집기 높이 통일(box-sizing border-box + min-height 38px, 일반 입력 상자와 동일)**. ⑮ **세부③: 사유 라벨을 고정 70px 너비로 통일(콘텐츠와 사유별 제목 일치); Backspace/Delete로 칩 삭제 시 수동 처리로 변경해 커서를 삭제 위치에 복원(편집기 맨 앞으로 점프하지 않음); 보내기 버튼 아이콘을 벨(푸시 알림 의미)로 변경; 사용자 지정 프리셋이 알림 이미지/아이콘(전체 미리보기 버전 포함)도 저장하며, 기본 프리셋은 비워 둠**. ⑯ **세부④: 알림 이미지/아이콘 업로드 카드 높이 통일(64px 고정, 16:9 대형 이미지는 폭 114px); 사유 라벨 폭 70px → 60px; 보내기 버튼 아이콘을 벨에서 오른쪽 푸시 화살표로 변경; "제목" "콘텐츠" 접이식 헤더 텍스트를 굵게**. ⑰ **기본 문구와 라벨: max-tokens 표시를 "한도"로 통일(라벨/기본 제목/플레이스홀더, 5개 언어 동기화); 각 사유 기본 문구를 "세션 "{title}" 완료. 클릭하여 확인."으로 변경(5개 언어, 편집기 힌트와 호스트 렌더링 동기화); 사유별 제목 각 행에 "+" 삽입 버튼 추가(푸시 제목과 동일: 정보 토큰만, 이미지/아이콘 제외, 커서 위치에 삽입)**. ⑱ **태그화와 프리셋 관리: 사유별 제목을 Chip 편집기로 변경(삽입한 정보가 캡슐 태그로 표시되어 {title} 같은 코드가 노출되지 않음; {image}{icon} 금지——수동 입력 시 리터럴 텍스트 유지, 전송 시 제거); 사용자 지정 프리셋에 "이름 변경" 기능 추가(사용자 지정 프리셋 선택 시 표시, 이름 변경 후 드롭다운과 현재 프리셋 동기화)**. ⑲ **세부 ⑤: Chip 편집기 텍스트 세로 중앙 정렬(줄 높이와 캡슐 20px로 통일, 상하 패딩 9px, 38px 상자 안에서 단일 줄 텍스트 중앙 표시); "제목" "콘텐츠" 접이식 바에 배경색 채움으로 구분(헤더는 둥근 배경 바, 펼쳐진 영역은 왼쪽 보더 들여쓰기); 5개 언어 86개 문구 키 전체 점검(모두 번역 완료, zh-TW "이름 변경"과 ko "포기" 표현 수정)**. 「보내기」 테스트 버튼에도 동일 적용. 시스템 알림 채널에만 적용(페이지 내 토스트는 텍스트 카드); ⑳ **세부⑥: "제목" "콘텐츠" 접이식 헤더의 배경 채우기 제거; 플레이스홀더 글자색을 rgba(127,127,127,0.5)로 변경(더 옅어지고 테마 변수 영향 없음)**. 「보내기」 테스트 버튼에도 동일 적용. 시스템 알림 채널에만 적용(페이지 내 토스트는 텍스트 카드); ㉑ **수정: "콘텐츠"의 각 사유 행 사이 구분선 제거; "콘텐츠" 펼침 시 헤더 바로 아래 선을 "제목"과 동일(전체 너비)하게 보완; Backspace/Delete로 칩 삭제 시 커서가 맨 앞으로 점프하지 않음(요소 컨테이너 내에서는 자식 노드 인덱스로 칩 식별, 칩 바로 뒤/편집기 끝 케이스 포함); "이름 없음" 프리셋 이름 변경 시 자동으로 명명 프리셋으로 승격(새 id로 교체)되어 드롭다운에 새 이름 즉시 표시**. 「보내기」 테스트 버튼에도 동일 적용. 시스템 알림 채널에만 적용(페이지 내 토스트는 텍스트 카드); ㉒ **수정: 텍스트 입력 플레이스홀더가 남지 않음(플레이스홀더 CSS 선택자와 상태 속성을 정렬, 입력 즉시 사라지고 문자는 왼쪽 끝에서 시작); 이미지/아이콘 업로드·삭제 후 커서 위치 유지(DOM 재구축 전 커서 오프셋 저장, 재구축 후 복원); 프리셋 드롭다운 포커스 시 흰색 선택 상태 테두리 제거**. 「보내기」 테스트 버튼에도 동일 적용. 시스템 알림 채널에만 적용(페이지 내 토스트는 텍스트 카드); ㉓ **수정: 칩(이미지/아이콘 포함) 삭제 후 커서가 튀거나 사라지지 않고 연속 삭제 가능——이미지 데이터 변경으로 인한 재구축을 필요한 경우에만 실행(DOM에 해당 미디어 칩이 없고 템플릿에도 해당 태그가 없으면 재구축을 건너뛰어 커서를 삭제 위치에 유지. 업로드/교체로 썸네일 갱신이 필요한 경우에만 재구축), 커서 오프셋 계산도 수정(칩은 항상 1개 위치로 계산, 내부 텍스트로 들어가지 않음)**. 「보내기」 테스트 버튼에도 동일 적용. 시스템 알림 채널에만 적용(페이지 내 토스트는 텍스트 카드) |
543
- | **0.1.10** | 2026-08-29 | 「알림 제목」을 네이티브 입력 상자로 변경(네이티브 placeholder 안내: 복사 불가, 입력 사라짐, 비우면 복원. 「+ 세션 제목」으로 커서 위치에 `{title}` 삽입). 문서에 QQ 브라우저 내장 푸시 팝업 설명 추가(세 가지 알림 방식의 실제 동작 + 전송 버튼 테스트도 동일 규칙) |
544
- | **0.1.9** | 2026-08-29 | 알림 제목에 **사유별 커스터마이징** 지원(접는 영역 UI, 기본 접힘으로 비대하지 않음. 비워 두면 각 사유에 차별화된 기본 제목 사용: 작업 완료/작업 오류/작업 중단/작업 차단/작업 출력 상한 도달, 5개 언어). 프로젝션을 객체(kind/text/title)로 업그레이드해 host가 렌더링한 제목을 전달. 초기화 버튼이 **현재 언어를 유지**. 기본 문구에 「세션 제목」 라벨 내장(세션 「{title}」 완료, 제목 없으면 자동 폴백). 설정 패널 템플릿 미리보기 동기화. 「+ 정보 삽입」 후 라벨을 삽입해도 더 이상 자동으로 접히지 않음. 사용 중인 커스텀 프리셋을 삭제하면 기본으로 자동 전환. 템플릿 미리보기 수정(클릭해도 사라지지 않고, 입력 시에만 숨겨지며, 비우면 복원). 각 사유마다 「전송」 버튼 추가(원클릭으로 현재 템플릿이 렌더링한 테스트 알림 전송) |
545
- | **0.1.8** | 2026-08-29 | 기본 알림 제목을 「작업 완료」로 변경(`{title}`은 여전히 세션 제목을 참조 가능). 기본 문구를 종료 사유별로 차별화 표현(완료는 압축된 괄호식 / 중단·차단은 문장 분리 / 오류는 오류 상세 선행 / 상한은 제안 첨부, 5개 언어). 설정 패널에 「초기화」 버튼 추가, 원클릭으로 기본값 복원 |
546
- | **0.1.7** | 2026-08-29 | 0.1.6의 설정 카드 크래시 수정: `notificationPermissionRow`/`requestPermissionNow`가 Card 컴포넌트 내부 state(범위 ) 참조해 렌더링 ReferenceError가 발생하고 설정 카드 전체가 사라지던 문제를 수정. 자체 포함 + 콜백 전달 방식으로 변경 |
547
- | **0.1.6** | 2026-08-29 | 설정 패널에 「알림 권한」 상태 영역 추가(권한 상태 실시간 표시 + 원클릭 권한 요청 버튼 + 차단 시 주소창 조작 안내). 권한 요청을 **사용자 제스처 내에서 요청**으로 변경(Chromium이 제스처가 아닌 자동 요청을 무시하므로, Edge가 익숙하지 않은 사이트의 알림을 자동 차단하는 전형적인 상황 해결). FAQ에 브라우저 차이 설명 추가 |
548
- | **0.1.5** | 2026-08-29 | 「알림 방식」 설정 추가(이중 채널 / 시스템 알림만 / 페이지 알림만): QQ 브라우저 등 Chromium 셸이 `Notification`을 페이지 내 배너로 렌더링해 발생하는 이중 알림 문제 해결. `pushMode`를 설정 schema와 설정 패널에 추가 |
549
- | **0.1.4** | 2026-08-28 | 완전한 제거 지원 추가: `dispose` 생명주기 마무리(host는 언로드 플래그를 설정해 대기 중인 마이크로태스크 추가를 억제. client는 본문 폴링 타이머, `__dsch_notify_debug` 훅, toast 컨테이너 정리). 제거 문서와 FAQ 동기화 |
550
- | **0.1.3** | 2026-08-28 | 공식 `dsh.bundle` manifest 선언(`dsh plugin add` 줄 명령으로 자동 마운트). settings 재시도 타이머를 `ctx.effect()` 래핑으로 변경(Cordis effect 규율). 설치 문서 재정렬 |
551
- | 0.1.2 | 2026-08-27 | 패키지를 `@telosmaylx` scope로 이름 변경(npm 사용자 이름 스코프) |
552
- | 0.1.1 | 2026-08-27 | GitHub, npm 설치 방법 문서화 |
553
- | 0.1.0 | 2026-08-26 | 초기 버전: 세션 시스템 메시지 + 브라우저 알림 + 공식 설정 패널 |
554
-
555
- ---
556
-
569
+ ## 변경 로그
570
+
571
+ | 버전 | 날짜 | 변경 내용 |
572
+ | --- | --- | --- |
573
+ | **0.1.17** | 2026-08-30 | **질문 즉시 알림(커스터마이징)**:AI 질문 즉시 팝업. 질문 문구는 `{question}` 플레이스홀더와 미디어 스위치 지원. 프리셋 4종에 5개 언어 질문 문구 추가. 구버전 호스트 폴백 |
574
+ | **0.1.16** | 2026-08-30 | **조작 수정**:Backspace 연타 태그 오삭제 방지(커서와 태그 사이에 텍스트가 없을 때만 태그 삭제) |
575
+ | **0.1.15** | 2026-08-30 | **조작 개선**:「콘텐츠」 접이식 영역 기본 펼침. 태그 삭제 후 커서가 실제 내용으로 이동해 연속 삭제 가능 |
576
+ | **0.1.14** | 2026-08-30 | **코드 리뷰 수정**:프리셋 삭제 확인, 저장된 구성으로 복원, 미디어 「×」로 미리보기 제거, 프리셋 매칭에 이미지 포함, 동명 경고, 수정 시에만 초기화 가능, 디버그 로그 자동 절단 |
577
+ | **0.1.13** | 2026-08-29 | 원클릭 스타일 프리셋 4종 추가(카오모지/아이루/네코무스메/DeepSeek짱), 5개 언어 지원 |
578
+ | **0.1.12** | 2026-08-29 | 릴리스 패키지 정리 |
579
+ | **0.1.11** | 2026-08-29 | **사용자 지정 알림 미디어**:`{image}`/`{icon}` 토큰 삽입 이미지/아이콘 업로드(자동 크롭). 제목에 정보 플레이스홀더. 「본문 템플릿×5」를 접이식으로. 레이아웃·조작 전면 개선 |
580
+ | **0.1.10** | 2026-08-29 | 푸시 제목을 네이티브 입력으로. 다국어 README 추가(English/繁體/日本語/한국어) |
581
+ | **0.1.9** | 2026-08-29 | 사유별 푸시 제목. 프로젝션을 객체로 업그레이드. 초기화 언어 유지. 사유별 「전송」 테스트 버튼 |
582
+ | **0.1.8** | 2026-08-29 | 기본 제목 「작업 완료」. 사유별 기본 문구. 초기화 버튼 추가 |
583
+ | **0.1.7** | 2026-08-29 | 설정 카드 크래시 수정(알림 권한 스코프 문제) |
584
+ | **0.1.6** | 2026-08-29 | 알림 권한 상태 영역 추가. 사용자 제스처 권한 요청 |
585
+ | **0.1.5** | 2026-08-29 | 알림 채널 설정(이중/시스템만/페이지 내만)——QQ 브라우저 이중 알림 해결 |
586
+ | **0.1.4** | 2026-08-28 | 완전한 제거 지원(dispose 생명주기 정리) |
587
+ | **0.1.3** | 2026-08-28 | dsh.bundle manifest 선언. settings 재시도 타이머를 ctx.effect()로 |
588
+ | 0.1.2 | 2026-08-27 | `@telosmaylx` 스코프로 이름 변경 |
589
+ | 0.1.1 | 2026-08-27 | GitHub / npm 설치 방법 문서화 |
590
+ | 0.1.0 | 2026-08-26 | 초기 버전: 세션 내 시스템 메시지 + 브라우저 알림 + 공식 설정 패널 |
591
+
592
+ ---
593
+
557
594
  ## 기여
558
595
 
559
596
  Issue와 PR을 환영합니다:
package/README.md CHANGED
@@ -13,7 +13,7 @@
13
13
  [![DSH](https://img.shields.io/badge/DSH-Web%20Profile-4D6BFE)](https://www.npmjs.com/package/@telosmaylx/dsh-session-notify)
14
14
  [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/TelosmaYLX/dsh-session-notify/pulls)
15
15
 
16
- 每轮对话结束时,把「已完成 / 出错 / 被阻塞 / 达到上限」连同用时、token 消耗写入会话日志,并推送浏览器系统通知与页内 toast。内置 5 种语言、4 套风格预设(颜文字 / 艾露猫 / 猫娘 / DeepSeek 娘)、可视化文案模板编辑器、自定义预设库,缓存命中率与生成速度取自官方投影,与状态栏同口径。
16
+ 每轮对话结束时,把「已完成 / 出错 / 被阻塞 / 达到上限」连同用时、token 消耗写入会话日志,并推送浏览器系统通知与页内 toast;**AI 向你提问时同样立即弹窗提醒**,不必守着会话页面。内置 5 种语言、4 套风格预设(颜文字 / 艾露猫 / 猫娘 / DeepSeek 娘)、可视化文案模板编辑器、自定义预设库,缓存命中率与生成速度取自官方投影,与状态栏同口径。
17
17
 
18
18
  </div>
19
19
 
@@ -49,6 +49,16 @@
49
49
 
50
50
  ## 功能特性
51
51
 
52
+ <div align="center">
53
+
54
+ <img src="screenshot/screenshot1.png" width="220" alt="标题编辑器">
55
+ <img src="screenshot/ScreenShot2png.png" width="220" alt="内容编辑器">
56
+ <img src="screenshot/ScreenShot3.png" width="220" alt="任务完成通知">
57
+ <img src="screenshot/ScreenShot4.png" width="220" alt="AI 提问通知">
58
+ <img src="screenshot/ScreenShot5.png" width="220" alt="任务出错通知">
59
+
60
+ </div>
61
+
52
62
  ### 三通道提醒,一条不漏
53
63
 
54
64
  | 通道 | 形式 | 说明 |
@@ -62,12 +72,17 @@
62
72
  - 宿主为所有会话(含后台、未打开窗口的)维护「最近一条通知正文」的会话投影单元(key = `session-complete-notify`),推送正文跨会话一致,不依赖你恰好开着那个窗口。
63
73
  - 客户端从会话列表快照观测所有会话的 `running` 位,`true → false` 边沿即触发推送,与官方 sidebar 提醒同策略(首次观测只记录基线,已在 idle 的会话不补发)。
64
74
 
75
+ ### 提问即时提醒
76
+
77
+ - AI 调用 `ask_user_question` 向你提问时,宿主立刻把「提问标题 + 正文」写入独立投影单元(key = `session-complete-notify-question`),客户端实时轮询并弹窗提醒——**即使你正看着别的页面,也不会错过提问**。
78
+ - 提问文案完全可定制:标题走「按原因定制标题 → 全局标题 → 默认标题」链路,正文支持 `{question}` 占位符(注入 AI 的实际提问),媒体开关 `{image}` / `{icon}` 同样生效。
79
+
65
80
  ### 可定制到每一句话
66
81
 
67
82
  - **5 种语言**:简体中文、繁體中文、English、日本語、한국어 —— 通知文案、时长与用量措辞、设置面板界面全部随语言切换(切换即时重渲染)。
68
83
  - **可视化模板编辑器**(Chip 胶囊编辑器):动态信息渲染为内联胶囊(占位符代码不露出),「+ 插入信息」在光标处插入(可插到文字中间),点击胶囊移除,每栏带实时预览(信息以示例值流入正文)。
69
- - **预设系统**:内置「默认」基线 + 4 套一键风格预设(颜文字 / 艾露猫 / 猫娘 / DeepSeek 娘——标题与 5 原因正文整套风格化文案);当前配置可另存为自定义预设(`localStorage` 持久化),支持自动编号的未命名预设(`未命名`、`未命名 2`…)、「来自:xxx · 已修改」来源指示、删除预设。
70
- - **推送标题模板**:留空时各原因用默认标题(完成=任务已完成 / 出错=任务出错 / …);`{title}` 引用会话标题。
84
+ - **预设系统**:内置「默认」基线 + 4 套一键风格预设(颜文字 / 艾露猫 / 猫娘 / DeepSeek 娘——标题与 5 结束原因 + 提问正文整套风格化文案);当前配置可另存为自定义预设(`localStorage` 持久化),支持自动编号的未命名预设(`未命名`、`未命名 2`…)、「来自:xxx · 已修改」来源指示、删除预设。
85
+ - **推送标题模板**:留空时各原因用默认标题(完成=任务已完成 / 出错=任务出错 / … / 提问=AI 正在向你提问);`{title}` 引用会话标题。
71
86
 
72
87
  ### 与官方口径同源
73
88
 
@@ -222,6 +237,8 @@ dsh plugin --profile web remove @telosmaylx/dsh-session-notify
222
237
 
223
238
  **子代理会话默认跳过**(`header.origin === 'subagent'` 或 `delegationDepth > 0`)—— 子代理由父会话编排,逐轮提醒是噪音;可在宿主配置关闭跳过。
224
239
 
240
+ **提问是独立通道,不走上面的白名单**:AI 调用 `ask_user_question` 等待你回答时(`tool/call` 事件)立即提醒,`tool/result` 返回后提醒失效。提问不写会话日志,只弹通知。
241
+
225
242
  ### 推送正文从哪来
226
243
 
227
244
  客户端在会话列表观测到 `running: true → false` 边沿时推送,正文按以下优先级获取(最长轮询 6 秒,400ms 间隔):
@@ -230,20 +247,22 @@ dsh plugin --profile web remove @telosmaylx/dsh-session-notify
230
247
  2. **会话事件窗口里的 notice 节点**(`kind=context` + `form=notice`)—— 正在查看的会话,落盘后立即可用;
231
248
  3. **降级** —— 「详情见会话内系统消息」+ 工作区信息(`cwd` 最后一段)。
232
249
 
250
+ 提问提醒的正文同样优先取宿主投影(key = `session-complete-notify-question`,宿主已渲染好标题与正文),老宿主无该投影时客户端自行拼接标题与 `{question}` 文本兜底。
251
+
233
252
  ### 通知示例
234
253
 
235
- 以下均由 `lib/core.js` 的 `buildNotice` 实际生成。默认文案统一为「会话「{title}」已xx,请点击查看。」句式(按结束原因差异用词;**不含用时与消耗**):
236
-
237
- 简体中文默认文案:
238
-
239
- ```text
240
- 会话「重构登录模块」已完成,请点击查看。 ← 完成
241
- 会话「重构登录模块」已中止,请点击查看。 ← 中止
242
- 会话「重构登录模块」被阻塞,请点击查看。 ← 阻塞
243
- 会话「重构登录模块」达到上限,请点击查看。 ← 上限
244
- 会话「重构登录模块」出错,请点击查看。 ← 出错
245
- ```
246
-
254
+ 以下均由 `lib/core.js` 的 `buildNotice` 实际生成。默认文案统一为「会话「{title}」已xx,请点击查看。」句式(按结束原因差异用词;**不含用时与消耗**):
255
+
256
+ 简体中文默认文案:
257
+
258
+ ```text
259
+ 会话「重构登录模块」已完成,请点击查看。 ← 完成
260
+ 会话「重构登录模块」已中止,请点击查看。 ← 中止
261
+ 会话「重构登录模块」被阻塞,请点击查看。 ← 阻塞
262
+ 会话「重构登录模块」达到上限,请点击查看。 ← 上限
263
+ 会话「重构登录模块」出错,请点击查看。 ← 出错
264
+ ```
265
+
247
266
  > 会话无标题(`titleValue` 为空)时自动回退「会话已完成,请点击查看。」;用时/消耗/缓存命中/速度等数据只在自定义模板中通过 `{duration}` `{usage}` `{cache}` `{tps}` 占位符插入时显示。
248
267
 
249
268
  自定义模板(在设置面板编辑,本例用到全部信息位):
@@ -281,7 +300,7 @@ Session "重构登录模块" completed (took 3m25s, used 1,240 in / 3,560 out).
281
300
 
282
301
  ## 配置
283
302
 
284
- 绝大多数配置在 **DSH Web UI → 设置 → 插件 → 会话完成提醒** 面板完成(保存后点「点击刷新」生效)。仅「触发原因白名单」与「跳过子代理」两项在宿主 `cordis.patch.yml` 的 `config` 中配置。
303
+ 绝大多数配置在 **DSH Web UI → 设置 → 插件 → 会话完成提醒** 面板完成(保存后点「点击刷新」生效)。仅「触发原因白名单」在宿主 `cordis.patch.yml` 的 `config` 中配置(跳过子代理在面板中以复选框控制)。
285
304
 
286
305
  ### 设置面板
287
306
 
@@ -293,12 +312,12 @@ Session "重构登录模块" completed (took 3m25s, used 1,240 in / 3,560 out).
293
312
  | 语言 | 5 种语言单选,切换即时重渲染整个面板 |
294
313
  | 推送方式 | 三选一:双通道(系统通知 + 页内提示,默认)/ 仅系统通知 / 仅页内提示 |
295
314
  | 通知图片 | 大图两种来源:**按原因上传**——在模板中通过「+ 插入信息 → 图片」插入 `{image}` 标签并选择本地图片(编辑器内显示为带缩略图的标签,**自动压缩至 512px 宽、按通知显示比例 16:9 居中裁切**,随各原因独立保存);**全局大图/图标**——两张上传卡片并排一行(**图标在前**,空态 = 圆角矩形 + 号,点击上传;**大图 512×288(16:9 居中裁切)、图标 128×128(1:1 方形居中裁切)**;已上传则卡片显示缩略图,**点击缩略图可全屏查看完整原图(等比未裁切)**,右上角 × 删除)。图标留空用站点默认图标,也可在模板中插入 `{icon}` 标签**按原因指定图标**(优先于全局)。仅系统通知通道生效(页内 toast 为文字卡片),「发送」测试按钮同样生效 |
296
- | 标题 | 折叠区(**默认收起**,点击展开):**全局推送标题**(所有原因共用,Chip 编辑器——点「+ 插入信息」插入的信息以**胶囊标签**形式显示,点击胶囊移除;占位提示「通用推送标题,留空时则使用默认标题,优先级低于下方自定义标题」(不可选中/删除);**通知发送时标题里的信息位(用时/消耗/错误/缓存命中/速度)会替换为实际值,不再显示代码**;留空时各原因用默认标题——完成=任务已完成、出错=任务出错、中止=任务已中止、阻塞=任务被阻塞、上限=任务达到上限)+ **按原因定制标题**(5 条原因各自输入,每行带「+」插入按钮——可插入信息标签(不含图片/图标),插入到光标处;**优先于全局标题**,留空 = 用全局或语言默认标题) |
297
- | 内容 | 折叠区(**默认收起**,点击展开);展开后每条结束原因(完成、出错、中止、阻塞、上限)**一行式布局**(原因标签 + Chip 编辑器 + 「+」插入按钮——菜单展开时变「−」+ **发送箭头按钮**,按钮为矩形、垂直居中):**空模板(默认预设)时编辑器显示默认文案「会话「{title}」已xx,请点击查看。」**,文字 + 内联信息胶囊,光标处插入;`{image}`/`{icon}` 标签**点击缩略图可预览大图、点 × 才删除**(防误删),其他标签点击移除;**编辑后删空则显示「留空则使用默认文案」占位(不可选中/删除)** |
315
+ | 标题 | 折叠区(**默认收起**,点击展开):**全局推送标题**(所有原因共用,Chip 编辑器——点「+ 插入信息」插入的信息以**胶囊标签**形式显示,点击胶囊移除;占位提示「通用推送标题,留空时则使用默认标题,优先级低于下方自定义标题」(不可选中/删除);**通知发送时标题里的信息位(用时/消耗/错误/缓存命中/速度)会替换为实际值,不再显示代码**;留空时各原因用默认标题——完成=任务已完成、出错=任务出错、中止=任务已中止、阻塞=任务被阻塞、上限=任务达到上限、提问=AI 正在向你提问)+ **按原因定制标题**(6 条原因各自输入,每行带「+」插入按钮——可插入信息标签(含「提问」,不含图片/图标),插入到光标处;**优先于全局标题**,留空 = 用全局或语言默认标题) |
316
+ | 内容 | 折叠区(**默认收起**,点击展开);展开后每条结束原因(完成、出错、中止、阻塞、上限、提问)**一行式布局**(原因标签 + Chip 编辑器 + 「+」插入按钮——菜单展开时变「−」+ **发送箭头按钮**,按钮为矩形、垂直居中):**空模板(默认预设)时编辑器显示默认文案「会话「{title}」已xx,请点击查看。」**,文字 + 内联信息胶囊,光标处插入;`{image}`/`{icon}` 标签**点击缩略图可预览大图、点 × 才删除**(防误删),其他标签点击移除;**编辑后删空则显示「留空则使用默认文案」占位(不可选中/删除)**;提问行的默认文案为「AI 向你提问:{question}」,`{question}` 会在发送时替换为 AI 的实际提问(插入菜单同样提供「提问」标签,与其他标签同款交互) |
298
317
  | 跳过子代理会话 | 复选框(保存时一并写入设置文档) |
299
318
  | 通知权限 | 状态实时显示:已授权(绿)/ 尚未授权(附「请求授权」按钮)/ 已被浏览器屏蔽(附地址栏操作指引)/ 环境不支持 |
300
319
  | 按原因定制标题 | 折叠区(默认收起):每个结束原因一个独立标题输入框,留空 = 用全局模板或语言默认标题 |
301
- | 保存 | 写入宿主设置文档(`language` / `templates` / `titleTemplate` / `titleTemplates` / `pushMode`);保存后显示「点击刷新」链接 |
320
+ | 保存 | 写入宿主设置文档(`language` / `templates` / `titleTemplate` / `titleTemplates` / `pushMode` / `skipSubagents`);保存后显示「点击刷新」链接 |
302
321
  | 重置 | 一键还原默认值(**语言保留当前选择**,标题/模板/推送方式恢复默认)并立即保存 |
303
322
 
304
323
  > [!NOTE]
@@ -324,6 +343,7 @@ Session "重构登录模块" completed (took 3m25s, used 1,240 in / 3,560 out).
324
343
  | `{tps}` | 生成速度(官方投影口径,无数据为空) | `92 tok/s` |
325
344
  | `{image}` | 自定义通知大图开关:从「+ 插入信息」插入并选择本地图片(自动压缩至 512px),按原因独立;正文渲染时剥除,不进会话日志;删除标签时该原因图片数据一并清除 | — |
326
345
  | `{icon}` | 自定义通知图标开关:从「+ 插入信息」插入并选择本地图片(自动压缩至 128×128 方形),按原因独立;正文渲染时剥除,不进会话日志;优先于全局「通知图标」;删除标签时该原因图标数据一并清除 | — |
346
+ | `{question}` | **提问行的专属占位符**:发送时替换为 AI 的实际提问文本;与「+ 插入信息」菜单联动(可直接选「提问」标签,手输 `{question}` 同样识别为胶囊),仅提问通道可用,其他原因行插了也会被替换为空(防字面量泄漏) | `要继续生成报告吗?` |
327
347
  | `{label}` | 已废弃 —— 渲染时自动剥除,旧模板仍兼容(插入菜单已移除该选项) | — |
328
348
 
329
349
  模板留空即使用内置默认文案(「会话「{title}」已xx,请点击查看。」句式,不含用时与消耗)。折叠行 `summary` 与正文同源(渲染结果截断至 120 字符)—— 只看折叠行的用户也能看到真实标题与用时、消耗。
@@ -365,6 +385,7 @@ Session "重构登录模块" completed (took 3m25s, used 1,240 in / 3,560 out).
365
385
  │ session/event 火线 │
366
386
  │ ├─ turn/start → tracker 起表(key: sessionId:turn) │
367
387
  │ ├─ assistant/message → 累加该轮 token 用量 │
388
+ │ ├─ tool/call → ask_user_question?写提问投影(标题+正文) │
368
389
  │ └─ turn/end → reason.kind ∈ reasons ? │
369
390
  │ ├─ 子代理会话?跳过 │
370
391
  │ ├─ 读官方投影:cache / tps / title │
@@ -374,6 +395,8 @@ Session "重构登录模块" completed (took 3m25s, used 1,240 in / 3,560 out).
374
395
  │ │
375
396
  │ settings.register → 官方「设置 → 插件」命名空间(失败退避重试) │
376
397
  │ sessionProjections → 注册投影单元(key=session-complete-notify) │
398
+ │ + 提问投影(key=session-complete-notify- │
399
+ │ question,等待回答期间持续推送) │
377
400
  └──────────────────────────────┬──────────────────────────────────────┘
378
401
  │ user/message (source: plugin, form: notice)
379
402
  ▼ JSONL 持久化 + 投影推送
@@ -383,6 +406,8 @@ Session "重构登录模块" completed (took 3m25s, used 1,240 in / 3,560 out).
383
406
  │ ├─ 取正文:投影 → 事件窗口 notice → 降级(轮询 ≤6s) │
384
407
  │ ├─ Web Notification(独立 tag,点击聚焦) │
385
408
  │ └─ 页内 toast(永远展示,≤3 条,10s 自动消失) │
409
+ │ 提问投影轮询(key=session-complete-notify-question): │
410
+ │ 有值 → 立即弹提醒(标题+正文),无值清空 │
386
411
  │ │
387
412
  │ slots.inject('settings.plugin.item') → 设置卡片(预设/语言/模板) │
388
413
  └─────────────────────────────────────────────────────────────────────┘
@@ -410,7 +435,8 @@ dsh-session-notify/
410
435
  │ │ # sessionProjections 投影单元(后台会话推送正文)
411
436
  │ ├── core.js # 纯逻辑层(零依赖,可独立测试):轮次计时与用量聚合、
412
437
  │ │ # 5 语言文案表、时长/用量/缓存/速度格式化、
413
- │ │ # 模板渲染({title}{duration}{usage}{error}{cache}{tps}
438
+ │ │ # 模板渲染({title}{duration}{usage}{error}{cache}{tps})、
439
+ │ │ # 提问正文构建(buildQuestionBody,{question} + 媒体剥除)
414
440
  │ └── client.js # 浏览器平面:完成推送(系统通知 + toast)、
415
441
  │ # 设置卡片(Chip 模板编辑器 + 预设系统 + 实时预览)
416
442
  ├── scripts/
@@ -471,6 +497,13 @@ node scripts/verify-notice.mjs <session.jsonl.zstd>
471
497
 
472
498
  </details>
473
499
 
500
+ <details>
501
+ <summary><b>AI 向我提问时也会弹窗提醒吗?</b></summary>
502
+
503
+ 会。AI 调用 `ask_user_question` 等待你回答时,宿主立刻把「提问标题 + 正文」写入独立投影(key = `session-complete-notify-question`),客户端轮询到后立即弹提醒——即使你正看着别的页面也不会错过。提问文案与完成通知一样完全可定制:设置面板的「标题 / 内容」折叠区各有「提问」一行,正文支持 `{question}` 占位符(注入 AI 的实际提问),`{image}` / `{icon}` 媒体开关同样生效。回答后(`tool/result`)提醒失效,不会残留。
504
+
505
+ </details>
506
+
474
507
  <details>
475
508
  <summary><b>为什么「中断」(interrupted)不提醒?</b></summary>
476
509
 
@@ -533,27 +566,31 @@ node scripts/verify-notice.mjs <session.jsonl.zstd>
533
566
 
534
567
  ---
535
568
 
536
- ## 更新日志
537
-
538
- | 版本 | 日期 | 变更 |
539
- | --- | --- | --- |
540
- | **0.1.13** | 2026-08-29 | 新增 **4 套一键风格预设**(颜文字 / 艾露猫 / 猫娘 / DeepSeek 娘——标题 + 5 原因正文整套风格化文案,**支持 5 语言**、载入不强制切换界面语言);清理预设下拉中已废弃的旧模板名(playful/formal/detail);README 默认文案示例同步为「会话「{title}」已xx,请点击查看。」句式(不含用时与消耗) |
541
- | **0.1.12** | 2026-08-29 | 发布包清理:移除打包进 scripts 的临时审计脚本 |
542
- | **0.1.11** | 2026-08-29 | 新增**自定义通知图片**:① 模板「+ 插入信息」新增**图片**标签——插入 `{image}` 并选择本地图片(**自动压缩至 512px 宽、按通知显示比例 16:9 居中裁切**,编辑器内显示为带缩略图的小标签),按原因独立上传、保存于设置文档(正文渲染时剥除,不进会话日志);② **通知大图/通知图标改为上传卡片**(空态 = 圆角矩形 + 号,点击上传;**大图 512×288(16:9 居中裁切)、图标 128×128(1:1 方形居中裁切)**;已上传显示缩略图,右上角 × 删除)——裁切保证上传的图完整显示在通知卡片中,不被系统按显示区域硬裁;③ **推送标题的「+ 插入信息」**可插入任意信息位(会话标题/用时/消耗/缓存命中/速度),不再只有会话标题;设置面板「通知图片」区显示**处理方式说明**(裁切比例)与**上传后的缩略图预览**;④ **按原因指定通知图标**(模板插入 `{icon}` 标签 + 本地上传,128×128 方形,优先于全局图标);⑤ **删除 `{image}`/`{icon}` 标签即清除该原因的图片/图标数据**;⑥ **布局优化:「正文模板 × 5」改为折叠区(默认收起保持面板简洁,头部显示已自定义条数,点击展开)**;⑦ **布局优化②:通知大图/图标上传卡片并排一行(中间留白);推送标题与按原因定制标题合并为「标题」折叠区(默认收起);折叠指示改为三角形图标(移除「展开/收起」文案,减少 i18n 负担)**;⑧ **交互优化:推送标题改为 Chip 编辑器(插入的信息显示为胶囊标签,不再暴露 `{title}` 等代码);通知大图/图标顺序调换(图标在前);「正文模板 × 5」改名为「内容」;图片/图标缩略图点击可全屏预览大图(lightbox),标签只有点 × 才删除(防误删)**;⑨ **预览统一为完整原图:上传时同时保存裁切版(通知用)与等比完整版(1024px,lightbox 查看原图用),卡片与标签的放大预览都显示未裁切的原始图像;折叠三角形图标放大**;⑩ **标题信息位修复:通知标题里的 `{duration}` `{usage}` `{error}` `{cache}` `{tps}` 会替换为会话实际值,不再泄漏代码文本(编辑时胶囊、发送时真实数据);「内容」改为一行式布局(原因标签 + 编辑器 + 「+/-」插入按钮 + 纸飞机发送按钮)**;⑪ **细节:移除内容行下方的实时预览(更紧凑);内容编辑器内边距收窄(compact);「+/-」与纸飞机按钮改矩形边框、垂直居中**;⑫ **删除体验修复:内容删空后不再复原为默认文案(改显示占位提示),且删空后光标自动回到末尾——按住 Backspace 可连续删除;「+/-」改用 SVG 线条图标(相对按钮边框精确居中);纸飞机图标逆时针旋转 30°**;⑬ **占位与默认文案:默认预设(空模板)时编辑器直接显示默认文案(所见即所推);编辑后删空显示「留空则使用默认文案」占位——改用 CSS 伪元素实现(与原生 input placeholder 一致:不可选中、不可删除),替换原可复制的占位文本**;⑭ **细节②:推送标题占位描述改为「通用推送标题,留空时则使用默认标题,优先级低于下方自定义标题」,空编辑器点击时光标移到最前(输入文字从最左开始,与原生 placeholder 一致);纸飞机图标再逆时针转 30°(共 60°);「内容」原因标签改为自适应宽度(编辑器紧贴标签文字);编辑器高度统一(box-sizing border-box + min-height 38px,与普通输入框一致)**;⑮ **细节③:原因标签统一为固定 70px 宽(内容与按原因定制标题一致);Backspace/Delete 删除标签改为手动删除并恢复光标到删除位置(不再跳到编辑器开头);发送按钮图标更换为铃铛(推送语义);自定义预设现在同时保存通知大图/图标(含完整预览版),默认预设保持留空**;⑯ **细节④:通知大图/图标上传卡片等高(统一 64px 高,大图 16:9 宽 114px);原因标签宽 70px → 60px;发送按钮图标由铃铛改为向右推送箭头;「标题」「内容」折叠区标题文字加粗**;⑰ **默认文案与标签:max-tokens 的显示统一改为「上限」(标签/默认标题/占位,5 语言同步);各原因默认文案改为「会话「{title}」已xx,请点击查看。」(5 语言,编辑器的 hint 与宿主实际渲染同步);按原因定制标题每行新增「+」插入按钮(同推送标题:仅信息标签,不含图片/图标,插入到光标处)**;⑱ **标签化与预设管理:按原因定制标题改为 Chip 编辑器(插入的信息以胶囊标签显示,不再暴露 `{title}` 等代码;禁止 `{image}`/`{icon}`——手输保持字面文本、发送时剥除);自定义预设新增「重命名」功能(选中自定义预设时出现重命名按钮,改名后下拉与当前预设同步)**;⑲ **细节⑤:Chip 编辑器文字垂直居中(行高与胶囊统一 20px、上下内边距 9px,单行文字在 38px 框内正中);「标题」「内容」折叠栏加底色填充区分(折叠头为圆角底色栏,展开内容区带左侧竖线缩进);全面核对 5 语言 86 个文案键(全部翻译齐全,修订 zh-tw「重新命名」、ko「放弃」两处用词)**;各原因「发送」测试按钮同样生效;仅系统通知通道生效(页内 toast 为文字卡片);⑳ **细节⑥:移除「标题」「内容」折叠头的底色填充;占位符文字颜色改为 rgba(127,127,127,0.5)(更淡,不再受主题变量影响)**;各原因「发送」测试按钮同样生效;仅系统通知通道生效(页内 toast 为文字卡片);㉑ **修复:移除「内容」各原因行之间的分隔横线;「内容」折叠区展开后头下方的横线补齐,与「标题」一致(全宽);退格/删除键删除胶囊时光标不再跳到开头(元素容器内按子节点序号取胶囊,含光标在胶囊后/编辑器末尾的场景);重命名「未命名」预设时自动升级为具名预设(换用新 id),下拉立即显示新名字**;各原因「发送」测试按钮同样生效;仅系统通知通道生效(页内 toast 为文字卡片);㉒ **修复:输入文字后占位提示不再残留(占位 CSS 选择器与状态属性对齐,输入即消失,文字从最左开始);上传/删除图片、图标后光标保持原位,不再跳到最前(重建 DOM 前保存光标偏移、重建后恢复);预设下拉框聚焦时不再出现白色选中态描边**;各原因「发送」测试按钮同样生效;仅系统通知通道生效(页内 toast 为文字卡片);㉓ **修复:删除标签(含图片/图标胶囊)后光标不再跳走或消失,可连贯连续删除——图片数据变化触发的重建改为按需执行(DOM 中已无该媒体胶囊且模板无对应标签时跳过重建,光标保留在原删除位置;仅上传/替换图片需要刷新缩略图时才重建),并修正光标偏移计算(胶囊统一按 1 个位置计,不深入内部文字)**;各原因「发送」测试按钮同样生效;仅系统通知通道生效(页内 toast 为文字卡片) |
543
- | **0.1.10** | 2026-08-29 | 「推送标题」改为原生输入框(原生占位提示:不可复制、输入才消失、清空恢复;「+ 会话标题」在光标处插入 `{title}`);文档补充 QQ 浏览器内置推送弹窗说明(三种推送方式的实际表现 + 发送按钮测试同规则);**多语言 README**:中文设为主页,新增 English / 繁體中文 / 日本語 / 한국어 版本(顶部语言切换互链) |
544
- | **0.1.9** | 2026-08-29 | 推送标题支持**按原因定制**(折叠区 UI,默认收起不臃肿;留空时各原因用差异化默认标题:任务已完成/任务出错/任务已中止/任务被阻塞/任务达到输出上限,5 语言);投影升级为对象(kind/text/title)承载 host 渲染好的标题;重置按钮**保留当前语言**;默认文案内嵌「会话标题」标签(会话「{title}」已完成,无标题自动回退);设置面板模板预览同步;「+插入信息」插入标签后不再自动折叠;删除当前使用的自定义预设自动切回默认;模板预览修复(点击不消失、输入才隐藏、清空恢复);每个原因新增「发送」按钮(一键发当前模板渲染的测试通知) |
545
- | **0.1.8** | 2026-08-29 | 默认推送标题改为「任务已完成」(`{title}` 仍可引用会话标题);默认文案按结束原因差异化表达(完成紧凑括号式 / 中止·阻塞拆句 / 出错错误前置 / 上限附建议,5 语言);设置面板新增「重置」按钮一键还原默认 |
546
- | **0.1.7** | 2026-08-29 | 修复 0.1.6 的设置卡片崩溃:`notificationPermissionRow`/`requestPermissionNow` 曾引用 Card 组件内 state(作用域外)导致渲染 ReferenceError、整个设置卡片消失;改为自包含 + 回调传参 |
547
- | **0.1.6** | 2026-08-29 | 设置面板新增「通知权限」状态区(授权状态实时显示 + 一键请求授权按钮 + 被屏蔽时的地址栏操作指引);授权改为**用户手势内请求**(Chromium 忽略非手势自动请求,Edge 对不熟悉站点自动屏蔽通知的典型场景得以解决);FAQ 新增浏览器差异说明 |
548
- | **0.1.5** | 2026-08-29 | 新增「推送方式」设置(双通道 / 仅系统通知 / 仅页内提示):解决 QQ 浏览器等 Chromium 壳把 `Notification` 渲染成页内横幅导致的双提示;`pushMode` 加入设置 schema 与设置面板 |
549
- | **0.1.4** | 2026-08-28 | 补充完整卸载支持:`dispose` 生命周期收尾(host 置卸载标志抑制待追加微任务;client 清理正文轮询定时器、`__dsch_notify_debug` 钩子、toast 容器);卸载文档与 FAQ 同步 |
550
- | **0.1.3** | 2026-08-28 | 声明官方 `dsh.bundle` manifest(`dsh plugin add` 一条命令自动挂载);settings 重试定时器改为 `ctx.effect()` 包装(Cordis effect 纪律);安装文档重排 |
551
- | 0.1.2 | 2026-08-27 | 包更名至 `@telosmaylx` scope(npm 用户名作用域) |
552
- | 0.1.1 | 2026-08-27 | GitHub、npm 安装方式文档化 |
553
- | 0.1.0 | 2026-08-26 | 初始版本:会话内系统消息 + 浏览器推送 + 官方设置面板 |
554
-
555
- ---
556
-
569
+ ## 更新日志
570
+
571
+ | 版本 | 日期 | 变更 |
572
+ | --- | --- | --- |
573
+ | **0.1.17** | 2026-08-30 | **提问即时提醒(可定制)**:AI 提问立即弹窗;提问文案支持 `{question}` 占位符与媒体开关;4 套预设补齐 5 语言提问文案;旧宿主自动兜底 |
574
+ | **0.1.16** | 2026-08-30 | **交互修复**:连按 Backspace 不再误删标签(仅当光标与标签间无文字时才删标签) |
575
+ | **0.1.15** | 2026-08-30 | **交互优化**:「内容」折叠区默认展开;删除标签后光标直达真实内容,可连贯删除 |
576
+ | **0.1.14** | 2026-08-30 | **代码审查修复**:删除预设确认、预设恢复为已保存配置、媒体「×」清除预览、按原因图片参与预设匹配、同名预设提示、重置仅在有修改时可用、调试日志自动截断 |
577
+ | **0.1.13** | 2026-08-29 | 新增 4 套一键风格预设(颜文字/艾露猫/猫娘/DeepSeek 娘),支持 5 语言 |
578
+ | **0.1.12** | 2026-08-29 | 发布包清理 |
579
+ | **0.1.11** | 2026-08-29 | **自定义通知媒体**:模板可插 `{image}`/`{icon}` 并上传图片/图标(自动裁切);推送标题支持信息占位符;「正文模板 × 5」改折叠区,布局交互全面优化 |
580
+ | **0.1.10** | 2026-08-29 | 推送标题改原生输入框;新增多语言 README(English/繁體/日本語/한국어) |
581
+ | **0.1.9** | 2026-08-29 | 推送标题按原因定制;投影升级为对象;重置保留语言;每原因加「发送」测试按钮 |
582
+ | **0.1.8** | 2026-08-29 | 默认标题「任务已完成」;默认文案按结束原因差异化;新增重置按钮 |
583
+ | **0.1.7** | 2026-08-29 | 修复设置卡片崩溃(通知权限行作用域问题) |
584
+ | **0.1.6** | 2026-08-29 | 新增通知权限状态区;权限改为用户手势内请求 |
585
+ | **0.1.5** | 2026-08-29 | 新增推送方式(双通道/仅系统/仅页内),解决 QQ 浏览器双提示 |
586
+ | **0.1.4** | 2026-08-28 | 完整卸载支持(dispose 生命周期收尾) |
587
+ | **0.1.3** | 2026-08-28 | 声明 dsh.bundle manifest;settings 重试定时器改 ctx.effect() |
588
+ | 0.1.2 | 2026-08-27 | 包更名至 `@telosmaylx` scope |
589
+ | 0.1.1 | 2026-08-27 | GitHub、npm 安装方式文档化 |
590
+ | 0.1.0 | 2026-08-26 | 初始版本:会话内系统消息 + 浏览器推送 + 官方设置面板 |
591
+
592
+ ---
593
+
557
594
  ## 贡献
558
595
 
559
596
  欢迎 Issue 与 PR: