@stardustlc/dsh-dream 0.9.0 → 0.10.0

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/CHANGELOG.md CHANGED
@@ -4,6 +4,15 @@
4
4
 
5
5
  [历史英文记录](docs/CHANGELOG.en.md)
6
6
 
7
+ ## 0.10.0(2026-10-17)
8
+
9
+ - 设置面板顶部新增「首次使用」分步引导:一次只讲一步,支持上一步/下一步/跳过,看完记在本机不再出现。
10
+ - 引导内容与该插件的实际用法一致;可在开发者工具里清掉 `dsh-first-run:dsh-dream:v1` 重新查看。
11
+ ## 0.9.1(2026-10-17)
12
+
13
+ - **优化:派生索引改为紧凑序列化**。`index.json` 是机器读取的派生数据,去掉缩进后 1000 条经验从 1359KB 降到 926KB(−32%),每次写入少序列化/落盘约三分之一的数据(1000 条实测单次写入 18.2ms → 16.6ms)。
14
+ - 读路径不变:checkpoint 的 `snapshot+tail` 校验仍通过(1000 条读回 `replayMode=snapshot+tail`、无截断、无坏行);`rebuildIndex()` 仍可从事件完整重建。
15
+ - **已知限制(未变)**:知识库写入仍是 O(历史)——每次写入都会重写整份派生索引。本版只是降低常数,不改变量级;增量 checkpoint 留待后续版本。
7
16
  ## 0.9.0 (2026-10-05)
8
17
 
9
18
  - 安静 60 秒后整理,同项目/模型最多合并 4 轮;冷却与每日预算延后轮次,32 轮/24 小时的持久化队列支持重启恢复、取消保留和跨进程租约。
package/README.en.md CHANGED
@@ -8,6 +8,8 @@ Collect candidate lessons from completed tasks, review them and reuse relevant m
8
8
 
9
9
  [![npm](https://img.shields.io/npm/v/@stardustlc/dsh-dream)](https://www.npmjs.com/package/@stardustlc/dsh-dream) [![downloads](https://raw.githubusercontent.com/STARDUSTLC666/dsh-suite/npm-downloads/assets/dsh-dream-downloads.svg)](https://www.npmjs.com/package/@stardustlc/dsh-dream)
10
10
 
11
+ Feedback and contributions are welcome: report [issues](https://github.com/STARDUSTLC666/dsh-dream/issues) or submit [pull requests](https://github.com/STARDUSTLC666/dsh-dream/pulls).
12
+
11
13
  ## What it does
12
14
 
13
15
  - Browse journals, retrieve lessons and inspect their sources.
package/README.md CHANGED
@@ -8,6 +8,8 @@
8
8
 
9
9
  [![npm](https://img.shields.io/npm/v/@stardustlc/dsh-dream)](https://www.npmjs.com/package/@stardustlc/dsh-dream) [![downloads](https://raw.githubusercontent.com/STARDUSTLC666/dsh-suite/npm-downloads/assets/dsh-dream-downloads.svg)](https://www.npmjs.com/package/@stardustlc/dsh-dream)
10
10
 
11
+ 欢迎使用,遇到问题或有改进建议,请提交 [issues](https://github.com/STARDUSTLC666/dsh-dream/issues) 和 [PR](https://github.com/STARDUSTLC666/dsh-dream/pulls)。
12
+
11
13
  ## 功能
12
14
 
13
15
  - 浏览梦境日记、检索经验并查看关联来源。
package/lib/client.js CHANGED
@@ -10,6 +10,57 @@ var module = { exports: {} }; var exports = module.exports;
10
10
  "use strict";
11
11
 
12
12
  const React = require("react");
13
+ var __FR_KEY = "dsh-first-run:dsh-dream:v1";
14
+ var __FR_TITLE = "梦境日记 · 首次使用(4 步)";
15
+ var __FR_STEPS = [{"title":"这里记的是经验,不是聊天记录","body":"每次任务收尾助手会复盘写一条梦;可复用、带证据的结论进入「经验」页等你审阅。"},{"title":"先看候选","body":"「经验」页默认只显示候选与待复核项;采纳、驳回、标冲突都在这一页完成。"},{"title":"之后它会自动取回","body":"每次任务开始,助手会自动取回适用于当前项目的经验。","tryIt":"复盘一下这次发布,把可复用的经验记下来"},{"title":"不满意就驳回","body":"驳回的经验不再被注入;范围写错的可以标冲突,等后续修正。"}];
16
+ // ---- first-run guide (shared snippet) ----
17
+ var __FR_STYLE_ID = 'dsh-first-run-css';
18
+ var __FR_CSS = [
19
+ '.fr-card{border:1px solid var(--dsw-border,rgba(0,0,0,.10));border-radius:12px;padding:14px 16px;margin:0 0 14px;background:linear-gradient(180deg,rgba(59,130,246,.06),rgba(59,130,246,.02))}',
20
+ '.fr-head{display:flex;align-items:center;gap:8px;margin-bottom:6px}',
21
+ '.fr-dot{width:6px;height:6px;border-radius:50%;background:var(--dsw-accent,#3b82f6)}',
22
+ '.fr-title{font-weight:650;font-size:13.5px}',
23
+ '.fr-count{margin-left:auto;font-size:11px;color:var(--dsw-text-weak,#6b7280);font-variant-numeric:tabular-nums}',
24
+ '.fr-step{font-weight:600;font-size:13px;margin:2px 0 4px}',
25
+ '.fr-body{color:var(--dsw-text-weak,#4b5563);font-size:12.5px;line-height:1.65}',
26
+ '.fr-try{margin-top:8px;padding:7px 9px;border-radius:8px;background:rgba(59,130,246,.09);font-size:12px;display:flex;gap:8px}',
27
+ '.fr-try code{font-family:ui-monospace,monospace;white-space:pre-wrap;word-break:break-word}',
28
+ '.fr-bar{display:flex;gap:8px;align-items:center;margin-top:12px}',
29
+ '.fr-progress{display:flex;gap:4px;margin-right:auto}',
30
+ '.fr-seg{width:16px;height:3px;border-radius:2px;background:var(--dsw-border,rgba(0,0,0,.12))}',
31
+ '.fr-seg.on{background:var(--dsw-accent,#3b82f6)}',
32
+ '.fr-btn{border:1px solid var(--dsw-border,rgba(0,0,0,.14));background:transparent;color:inherit;border-radius:8px;padding:4px 10px;font-size:12px;cursor:pointer}',
33
+ '.fr-btn:hover{background:rgba(0,0,0,.04)}',
34
+ '.fr-btn.primary{background:var(--dsw-accent,#3b82f6);border-color:transparent;color:#fff}',
35
+ '.fr-btn.ghost{border-color:transparent;color:var(--dsw-text-weak,#6b7280)}'
36
+ ].join('\n');
37
+ function __frEnsureCss(){ if (typeof document === 'undefined' || document.getElementById(__FR_STYLE_ID)) return; var el = document.createElement('style'); el.id = __FR_STYLE_ID; el.textContent = __FR_CSS; document.head.appendChild(el); }
38
+ function __frRead(){ try { return localStorage.getItem(__FR_KEY) === 'done'; } catch (e) { return false; } }
39
+ function __frWrite(){ try { localStorage.setItem(__FR_KEY, 'done'); } catch (e) {} }
40
+ function __FirstRunCard(){
41
+ var ds = React.useState(__frRead), done = ds[0], setDone = ds[1];
42
+ var is = React.useState(0), index = is[0], setIndex = is[1];
43
+ React.useEffect(function(){ __frEnsureCss(); }, []);
44
+ if (done) return null;
45
+ var step = __FR_STEPS[index];
46
+ var last = index >= __FR_STEPS.length - 1;
47
+ var close = function(){ __frWrite(); setDone(true); };
48
+ var kids = [
49
+ React.createElement('div', { className: 'fr-head', key: 'h' }, React.createElement('span', { className: 'fr-dot' }), React.createElement('span', { className: 'fr-title' }, __FR_TITLE), React.createElement('span', { className: 'fr-count' }, (index + 1) + ' / ' + __FR_STEPS.length)),
50
+ React.createElement('div', { className: 'fr-step', key: 't' }, step.title),
51
+ React.createElement('div', { className: 'fr-body', key: 'b' }, step.body)
52
+ ];
53
+ if (step.tryIt) kids.push(React.createElement('div', { className: 'fr-try', key: 'y' }, React.createElement('span', null, '可以直接说'), React.createElement('code', null, '「' + step.tryIt + '」')));
54
+ var buttons = [React.createElement('div', { className: 'fr-progress', key: 'p' }, __FR_STEPS.map(function(_, i){ return React.createElement('span', { key: i, className: 'fr-seg' + (i <= index ? ' on' : '') }); }))];
55
+ buttons.push(React.createElement('button', { className: 'fr-btn ghost', type: 'button', onClick: close, key: 's' }, '跳过'));
56
+ if (index > 0) buttons.push(React.createElement('button', { className: 'fr-btn', type: 'button', key: 'prev', onClick: function(){ setIndex(index - 1); } }, '上一步'));
57
+ buttons.push(React.createElement('button', { className: 'fr-btn primary', type: 'button', key: 'next', onClick: function(){ if (last) close(); else setIndex(index + 1); } }, last ? '开始使用' : '下一步'));
58
+ kids.push(React.createElement('div', { className: 'fr-bar', key: 'bar' }, buttons));
59
+ return React.createElement('div', { className: 'fr-card' }, kids);
60
+ }
61
+ function __withFirstRun(Component){ return function FirstRunWrapped(props){ return React.createElement(React.Fragment, null, React.createElement(__FirstRunCard, null), React.createElement(Component, props)); }; }
62
+ // ---- end first-run guide ----
63
+
13
64
  const { useState, useEffect } = React;
14
65
  const h = React.createElement;
15
66
 
@@ -2220,7 +2271,7 @@ function apply(ctx) {
2220
2271
  order: 55,
2221
2272
  label: function () { return t("梦境日记"); },
2222
2273
  inject: function () { return { locale: localeService }; },
2223
- }, DreamSection);
2274
+ }, __withFirstRun(DreamSection));
2224
2275
  });
2225
2276
  } catch (error) { /* 没有 slots 服务:仍是合法插件,只是没有设置页 */ }
2226
2277
  }
@@ -1774,7 +1774,8 @@ export class KnowledgeStore {
1774
1774
  const target = this.indexPath;
1775
1775
  const tmp = target + '.tmp-' + process.pid + '-' + randomUUID();
1776
1776
  try {
1777
- writeFileSync(tmp, JSON.stringify(payload, null, 2) + '\n', 'utf8');
1777
+ // 索引是机器读取的派生数据:紧凑序列化可省 ~32% 体积并显著降低大库写放大。
1778
+ writeFileSync(tmp, JSON.stringify(payload) + '\n', 'utf8');
1778
1779
  renameSync(tmp, target);
1779
1780
  }
1780
1781
  catch (error) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stardustlc/dsh-dream",
3
- "version": "0.9.0",
3
+ "version": "0.10.0",
4
4
  "description": "回顾会话、保存反思,并把经过核验和审阅的经验用于后续任务。",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",