dsh-claude-style 0.16.0-dev.27 → 0.16.1-dev.31

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.
Files changed (41) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/LICENSE +3 -2
  3. package/README.en.md +1 -0
  4. package/README.md +6 -0
  5. package/THIRD_PARTY_NOTICES.md +2 -0
  6. package/docs/FEATURES.en.md +4 -3
  7. package/docs/FEATURES.md +4 -3
  8. package/docs/SETTINGS.en.md +12 -6
  9. package/docs/SETTINGS.md +12 -6
  10. package/docs/STYLE.md +40 -1
  11. package/lib/assets/0443f196403b.js.br +0 -0
  12. package/lib/assets/39f1a2e69bb7.js.br +0 -0
  13. package/lib/assets/4d55814bc60a.js.br +0 -0
  14. package/lib/assets/6c257991027d.js.br +0 -0
  15. package/lib/assets/9abad5da303e.js.br +0 -0
  16. package/lib/assets/b55a1acf34e0.js.br +0 -0
  17. package/lib/assets/d2064c247435.js.br +0 -0
  18. package/lib/assets/manifest.json +28 -28
  19. package/lib/client.js +37 -11
  20. package/lib/host/brand.js +70 -1
  21. package/lib/host/cache-file.js +63 -25
  22. package/lib/host/harness-home.js +7 -3
  23. package/lib/host/index.js +4 -1
  24. package/lib/host/package-root.js +15 -13
  25. package/lib/host/peakrate.js +7 -4
  26. package/lib/host/routes.js +164 -72
  27. package/lib/host/search.js +44 -2
  28. package/lib/host/settings.js +137 -43
  29. package/lib/host/usage-record.js +5 -2
  30. package/lib/host/usage.js +57 -5
  31. package/lib/model-descriptions.json +0 -1322
  32. package/package.json +1 -1
  33. package/lib/assets/1cefeb3d67c7.js.br +0 -0
  34. package/lib/assets/1da1959a3cb1.js.br +0 -0
  35. package/lib/assets/2c3bd0b6c22c.js.br +0 -0
  36. package/lib/assets/34d559377558.js.br +0 -0
  37. package/lib/assets/acf9cf79c43e.js.br +0 -0
  38. package/lib/assets/b7ec75cf39a7.js.br +0 -0
  39. package/lib/assets/dab5fb383802.js.br +0 -0
  40. package/lib/host/http.js +0 -74
  41. package/lib/host/session-events.js +0 -40
@@ -1,43 +1,138 @@
1
+ // packages/contracts/src/package.ts
2
+ var PACKAGE_NAME = "dsh-claude-style";
3
+
4
+ // packages/contracts/src/services.ts
5
+ var OFFICIAL_MODEL_GROUP = "deepseek-official";
6
+
1
7
  // packages/contracts/src/prefs.ts
2
- var PREFS_DEFAULT = Object.freeze({
3
- brand: "claude",
4
- brandName: "",
5
- brandInk: "original",
6
- brandAccent: "",
7
- motion: "system",
8
- statusMotion: "sweep",
9
- statusDetail: true,
10
- collapseFooter: true,
11
- autoPopover: "all",
12
- composerScope: "all",
13
- modelPicker: true,
14
- modelDescriptions: true,
15
- peakrate: true,
16
- quickProviders: [],
17
- username: "",
18
- banLocale: "en",
19
- homeLayout: "studio",
20
- palette: "claude",
21
- typeface: "claude",
22
- mascot: "brand",
23
- mascotScope: "all",
24
- permissionsControl: true,
25
- statsPosition: "context",
26
- workspaceView: true,
27
- dockCards: true,
28
- sidebarSearch: true,
29
- searchStyle: "overlay",
30
- sidebarLayout: "relaxed",
31
- turnNav: true,
32
- viewTabs: true,
33
- headerBand: true,
34
- chatAnimations: true,
35
- chatWait: true,
36
- chatSend: true,
37
- chatReveal: "off",
38
- caretMotion: "typing",
39
- messageEnter: "flight"
40
- });
8
+ var BRAND_CLAUDE = "claude";
9
+ var BRAND_DEEPSEEK = "deepseek";
10
+ var BRAND_DEEPSEEK_LEGACY = "off";
11
+ var BRANDS = [BRAND_CLAUDE, BRAND_DEEPSEEK];
12
+ var BRAND_INK_ORIGINAL = "original";
13
+ var BRAND_INK_TEXT = "text";
14
+ var BRAND_INKS = [BRAND_INK_ORIGINAL, BRAND_INK_TEXT];
15
+ var BRAND_NAME_MAX = 40;
16
+ var MOTION_SYSTEM = "system";
17
+ var MOTION_REDUCED = "reduced";
18
+ var MOTION_FULL = "full";
19
+ var MOTION_MODES = [MOTION_SYSTEM, MOTION_REDUCED, MOTION_FULL];
20
+ var STATUS_MOTION_SWEEP = "sweep";
21
+ var STATUS_MOTION_WASH = "wash";
22
+ var STATUS_MOTIONS = [STATUS_MOTION_SWEEP, STATUS_MOTION_WASH];
23
+ var CARET_MOTION_OFF = "off";
24
+ var CARET_MOTION_TYPING = "typing";
25
+ var CARET_MOTIONS = [CARET_MOTION_TYPING, CARET_MOTION_OFF];
26
+ var CHAT_REVEAL_OFF = "off";
27
+ var CHAT_REVEAL_ON = "on";
28
+ var CHAT_REVEAL_MODES = [CHAT_REVEAL_ON, CHAT_REVEAL_OFF];
29
+ var MESSAGE_ENTER_FLIGHT = "flight";
30
+ var MESSAGE_ENTER_GROW = "grow";
31
+ var MESSAGE_ENTER_MODES = [MESSAGE_ENTER_FLIGHT, MESSAGE_ENTER_GROW];
32
+ var PALETTE_CLAUDE = "claude";
33
+ var PALETTE_HOST = "host";
34
+ var PALETTES = [PALETTE_CLAUDE, PALETTE_HOST];
35
+ var TYPEFACE_CLAUDE = "claude";
36
+ var TYPEFACE_HOST = "host";
37
+ var TYPEFACES = [TYPEFACE_CLAUDE, TYPEFACE_HOST];
38
+ var MASCOT_BRAND = "brand";
39
+ var MASCOT_CRAB = "crab";
40
+ var MASCOT_DEEPY = "deepy";
41
+ var MASCOT_OFF = "off";
42
+ var MASCOTS = [MASCOT_BRAND, MASCOT_CRAB, MASCOT_DEEPY, MASCOT_OFF];
43
+ var MASCOT_SCOPE_HOME = "home";
44
+ var MASCOT_SCOPE_ALL = "all";
45
+ var MASCOT_SCOPES = [MASCOT_SCOPE_HOME, MASCOT_SCOPE_ALL];
46
+ var SEARCH_STYLE_ICON = "icon";
47
+ var SEARCH_STYLE_OVERLAY = "overlay";
48
+ var SEARCH_STYLE_STANDALONE = "standalone";
49
+ var SEARCH_STYLES = [SEARCH_STYLE_ICON, SEARCH_STYLE_OVERLAY, SEARCH_STYLE_STANDALONE];
50
+ var SIDEBAR_LAYOUT_RELAXED = "relaxed";
51
+ var SIDEBAR_LAYOUT_COMPACT = "compact";
52
+ var SIDEBAR_LAYOUTS = [SIDEBAR_LAYOUT_RELAXED, SIDEBAR_LAYOUT_COMPACT];
53
+ var CHAT_ANIMATIONS_OFF = "off";
54
+ var STATS_POSITION_INLINE = "inline";
55
+ var STATS_POSITION_CONTEXT = "context";
56
+ var STATS_POSITIONS = [STATS_POSITION_INLINE, STATS_POSITION_CONTEXT];
57
+ var BAN_LOCALE_EN = "en";
58
+ var BAN_LOCALE_ZH = "zh";
59
+ var BAN_LOCALE_OFF = "off";
60
+ var BAN_LOCALES = [BAN_LOCALE_EN, BAN_LOCALE_ZH, BAN_LOCALE_OFF];
61
+ var HOME_LAYOUT_CLASSIC = "classic";
62
+ var HOME_LAYOUT_STUDIO = "studio";
63
+ var HOME_LAYOUTS = [HOME_LAYOUT_CLASSIC, HOME_LAYOUT_STUDIO];
64
+ var COMPOSER_SCOPE_OFF = "off";
65
+ var COMPOSER_SCOPE_HERO = "hero";
66
+ var COMPOSER_SCOPE_CONVERSATION = "conversation";
67
+ var COMPOSER_SCOPE_ALL = "all";
68
+ var COMPOSER_SCOPES = [COMPOSER_SCOPE_OFF, COMPOSER_SCOPE_HERO, COMPOSER_SCOPE_CONVERSATION, COMPOSER_SCOPE_ALL];
69
+ var AUTO_POPOVER_OFF = "off";
70
+ var AUTO_POPOVER_ACCOUNT = "account";
71
+ var AUTO_POPOVER_ALL = "all";
72
+ var AUTO_POPOVER_SCOPES = [AUTO_POPOVER_OFF, AUTO_POPOVER_ACCOUNT, AUTO_POPOVER_ALL];
73
+ var PAGE_ZOOM_SYSTEM = "system";
74
+ var PAGE_ZOOM_08 = "0.8";
75
+ var PAGE_ZOOM_1 = "1";
76
+ var PAGE_ZOOM_125 = "1.25";
77
+ var PAGE_ZOOM_15 = "1.5";
78
+ var PAGE_ZOOMS = [PAGE_ZOOM_SYSTEM, PAGE_ZOOM_08, PAGE_ZOOM_1, PAGE_ZOOM_125, PAGE_ZOOM_15];
79
+ var USERNAME_MAX = 64;
80
+ var QUICK_PROVIDERS_MAX = 64;
81
+ var PROVIDER_ID_MAX = 128;
82
+ var PREFS = {
83
+ brand: { type: "choice", values: BRANDS, default: BRAND_CLAUDE, legacy: { [BRAND_DEEPSEEK_LEGACY]: BRAND_DEEPSEEK } },
84
+ brandName: { type: "text", default: "", max: BRAND_NAME_MAX },
85
+ brandInk: { type: "choice", values: BRAND_INKS, default: BRAND_INK_ORIGINAL },
86
+ brandAccent: { type: "color", default: "" },
87
+ motion: { type: "choice", values: MOTION_MODES, default: MOTION_SYSTEM },
88
+ statusMotion: { type: "choice", values: STATUS_MOTIONS, default: STATUS_MOTION_SWEEP },
89
+ /** An earlier build stored the two words; `precise` is what the switch being on means. */
90
+ statusDetail: { type: "boolean", default: true, legacy: { precise: true, simple: false } },
91
+ collapseFooter: { type: "boolean", default: true },
92
+ /** It was a boolean before it grew its choices. */
93
+ autoPopover: { type: "choice", values: AUTO_POPOVER_SCOPES, default: AUTO_POPOVER_ALL, legacy: { true: AUTO_POPOVER_ALL, false: AUTO_POPOVER_OFF } },
94
+ composerScope: { type: "choice", values: COMPOSER_SCOPES, default: COMPOSER_SCOPE_ALL },
95
+ modelPicker: { type: "boolean", default: true },
96
+ modelDescriptions: { type: "boolean", default: true },
97
+ peakrate: { type: "boolean", default: true },
98
+ /**
99
+ * The provider ids the picker's first level carries: ids rather than names,
100
+ * so a catalog rename does not lose the stored selection. The official
101
+ * service is the picker's default rather than a choice, so a stored id for it
102
+ * is dropped.
103
+ */
104
+ quickProviders: { type: "list", default: [], max: QUICK_PROVIDERS_MAX, entryMax: PROVIDER_ID_MAX, drop: [OFFICIAL_MODEL_GROUP] },
105
+ username: { type: "text", default: "", max: USERNAME_MAX },
106
+ pageZoom: { type: "choice", values: PAGE_ZOOMS, default: PAGE_ZOOM_SYSTEM },
107
+ banLocale: { type: "choice", values: BAN_LOCALES, default: BAN_LOCALE_EN },
108
+ homeLayout: { type: "choice", values: HOME_LAYOUTS, default: HOME_LAYOUT_STUDIO },
109
+ homeRipple: { type: "boolean", default: false },
110
+ palette: { type: "choice", values: PALETTES, default: PALETTE_CLAUDE },
111
+ typeface: { type: "choice", values: TYPEFACES, default: TYPEFACE_CLAUDE },
112
+ /** The mascot on the composer; the resolved one rides the document. */
113
+ mascot: { type: "choice", values: MASCOTS, default: MASCOT_BRAND },
114
+ mascotScope: { type: "choice", values: MASCOT_SCOPES, default: MASCOT_SCOPE_ALL },
115
+ permissionsControl: { type: "boolean", default: true },
116
+ statsPosition: { type: "choice", values: STATS_POSITIONS, default: STATS_POSITION_CONTEXT },
117
+ workspaceView: { type: "boolean", default: true },
118
+ dockCards: { type: "boolean", default: true },
119
+ sidebarSearch: { type: "boolean", default: true },
120
+ searchStyle: { type: "choice", values: SEARCH_STYLES, default: SEARCH_STYLE_OVERLAY },
121
+ sidebarLayout: { type: "choice", values: SIDEBAR_LAYOUTS, default: SIDEBAR_LAYOUT_RELAXED },
122
+ turnNav: { type: "boolean", default: true },
123
+ viewTabs: { type: "boolean", default: true },
124
+ headerBand: { type: "boolean", default: true },
125
+ /** It held a choice before it became a switch again; every retired choice meant on bar `off`. */
126
+ chatAnimations: { type: "boolean", default: true, legacy: { [CHAT_ANIMATIONS_OFF]: false, enhanced: true, redraw: true } },
127
+ chatWait: { type: "boolean", default: true },
128
+ chatSend: { type: "boolean", default: true },
129
+ chatReveal: { type: "choice", values: CHAT_REVEAL_MODES, default: CHAT_REVEAL_OFF },
130
+ caretMotion: { type: "choice", values: CARET_MOTIONS, default: CARET_MOTION_TYPING },
131
+ messageEnter: { type: "choice", values: MESSAGE_ENTER_MODES, default: MESSAGE_ENTER_FLIGHT }
132
+ };
133
+ var PREF_DEFAULTS = Object.freeze(Object.fromEntries(
134
+ Object.entries(PREFS).map(([key, spec]) => [key, spec.default])
135
+ ));
41
136
 
42
137
  // packages/host/src/settings.ts
43
138
  async function resolveSchemaFactory() {
@@ -62,11 +157,10 @@ function volatileField(field) {
62
157
  return typeof field?.volatile === "function" ? field.volatile() : field;
63
158
  }
64
159
  function prefsField(Schema, key) {
65
- const value = PREFS_DEFAULT[key];
66
- return Schema.union([Schema.string(), Schema.boolean(), Schema.array(Schema.string())]).default(value);
160
+ return Schema.union([Schema.string(), Schema.boolean(), Schema.array(Schema.string())]).default(PREFS[key].default);
67
161
  }
68
162
  var Config = SchemaFactory === null ? void 0 : SchemaFactory.object(Object.fromEntries(
69
- Object.keys(PREFS_DEFAULT).map((key) => [key, volatileField(prefsField(SchemaFactory, key))])
163
+ Object.keys(PREFS).map((key) => [key, volatileField(prefsField(SchemaFactory, key))])
70
164
  ));
71
165
  function registerSettings(ctx) {
72
166
  if (typeof ctx.inject !== "function") return;
@@ -75,7 +169,7 @@ function registerSettings(ctx) {
75
169
  if (typeof settings?.configure !== "function") return;
76
170
  scope.effect(
77
171
  () => settings.configure({ auto: false }, ctx.fiber),
78
- "dsh-claude-style: settings presentation"
172
+ `${PACKAGE_NAME}: settings presentation`
79
173
  );
80
174
  });
81
175
  }
@@ -1,3 +1,6 @@
1
+ // packages/contracts/src/package.ts
2
+ var PACKAGE_NAME = "dsh-claude-style";
3
+
1
4
  // packages/host/src/usage-record.ts
2
5
  import { existsSync, renameSync, unlinkSync } from "node:fs";
3
6
  import { cachePath, readJsonDocument, writeJsonDocument } from "./cache-file.js";
@@ -178,13 +181,13 @@ function readStored(ctx) {
178
181
  if (existsSync(path)) {
179
182
  const aside = `${path}.corrupt-${Date.now()}`;
180
183
  renameSync(path, aside);
181
- ctx.logger?.warn?.(`dsh-claude-style: usage record moved aside to ${aside}; it is rebuilt from the session logs`);
184
+ ctx.logger?.warn?.(`${PACKAGE_NAME}: usage record moved aside to ${aside}; it is rebuilt from the session logs`);
182
185
  }
183
186
  return { kind: "absent" };
184
187
  }
185
188
  const document = parsed;
186
189
  if (document.version !== RECORD_VERSION) {
187
- ctx.logger?.warn?.(`dsh-claude-style: usage record version ${String(document.version)} is not one this build reads; it is left as it stands`);
190
+ ctx.logger?.warn?.(`${PACKAGE_NAME}: usage record version ${String(document.version)} is not one this build reads; it is left as it stands`);
188
191
  return { kind: "foreign" };
189
192
  }
190
193
  const sessions = /* @__PURE__ */ new Map();
package/lib/host/usage.js CHANGED
@@ -1,8 +1,60 @@
1
+ // packages/contracts/src/package.ts
2
+ var PACKAGE_NAME = "dsh-claude-style";
3
+
4
+ // packages/host/src/usage.ts
5
+ import { join as join2, resolve } from "node:path";
6
+
7
+ // packages/engine/node/harness-home.ts
8
+ import { homedir } from "node:os";
9
+ import { join } from "node:path";
10
+ function harnessPath(ctx, ...segments) {
11
+ const resolvePath = ctx.get("dshHomePath");
12
+ if (typeof resolvePath === "function") return resolvePath(...segments);
13
+ return join(process.env.DSH_HOME ?? join(homedir(), ".dsh"), ...segments);
14
+ }
15
+
1
16
  // packages/host/src/usage.ts
2
- import { join, resolve } from "node:path";
3
- import { harnessPath } from "./harness-home.js";
4
17
  import { readRecord, writeRecord } from "./usage-record.js";
5
- import { readEvents } from "./session-events.js";
18
+
19
+ // packages/engine/node/session-events.ts
20
+ function eventsOf(events) {
21
+ return Array.isArray(events) ? events : null;
22
+ }
23
+ function unreadableLog(error) {
24
+ const failure = error;
25
+ return failure?.code === "SESSION_QUERY_CORRUPT_SESSION" || failure?.code === "SESSION_QUERY_SESSION_NOT_FOUND" ? failure : null;
26
+ }
27
+ function reportUnreadable(ctx, packageName, error, sessionId, label) {
28
+ ctx.logger?.warn?.(`${packageName}: session ${sessionId} left out of ${label}: ${unreadableLog(error)?.message}`);
29
+ }
30
+ function releaseObservation(observation) {
31
+ const named = observation.dispose;
32
+ if (typeof named === "function") named.call(observation);
33
+ else if (Symbol.dispose in observation) observation[Symbol.dispose]();
34
+ }
35
+ async function readEvents(ctx, packageName, sessionId, label) {
36
+ const query = ctx.get("sessionQuery");
37
+ if (query === null || query === void 0) return null;
38
+ try {
39
+ if (typeof query.observeSession === "function") {
40
+ const observation = await query.observeSession(sessionId, { projectionMode: "none" });
41
+ try {
42
+ return eventsOf(observation.events);
43
+ } finally {
44
+ releaseObservation(observation);
45
+ }
46
+ }
47
+ if (typeof query.readSession !== "function") return null;
48
+ const snapshot = await query.readSession(sessionId);
49
+ return eventsOf(snapshot?.events);
50
+ } catch (error) {
51
+ if (unreadableLog(error) === null) throw error;
52
+ reportUnreadable(ctx, packageName, error, sessionId, label);
53
+ return null;
54
+ }
55
+ }
56
+
57
+ // packages/host/src/usage.ts
6
58
  import { foldSession, listSessionLogs } from "./usage-fold.js";
7
59
  import { readLedger } from "./usage-ledger.js";
8
60
  import { mergeLedgerFold, summarize } from "./usage-summary.js";
@@ -42,7 +94,7 @@ function createUsage(ctx) {
42
94
  sessions.set(log.id, stored);
43
95
  continue;
44
96
  }
45
- const events = await readEvents(ctx, log.id, "the usage roll-up");
97
+ const events = await readEvents(ctx, PACKAGE_NAME, log.id, "the usage roll-up");
46
98
  if (events === null) {
47
99
  failed += 1;
48
100
  if (stored !== void 0) sessions.set(log.id, stored);
@@ -70,7 +122,7 @@ function createUsage(ctx) {
70
122
  return { ...summary, read, failed, sessions: logs.length };
71
123
  }
72
124
  async function compute(publish) {
73
- const root = resolve(join(home(), "sessions"));
125
+ const root = resolve(join2(home(), "sessions"));
74
126
  const logs = listSessionLogs(root);
75
127
  const ledgerDays = readLedger(home());
76
128
  if (ledgerDays !== null && ledgerDays.size > 0) {