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.
- package/CHANGELOG.md +62 -0
- package/LICENSE +3 -2
- package/README.en.md +1 -0
- package/README.md +6 -0
- package/THIRD_PARTY_NOTICES.md +2 -0
- package/docs/FEATURES.en.md +4 -3
- package/docs/FEATURES.md +4 -3
- package/docs/SETTINGS.en.md +12 -6
- package/docs/SETTINGS.md +12 -6
- package/docs/STYLE.md +40 -1
- package/lib/assets/0443f196403b.js.br +0 -0
- package/lib/assets/39f1a2e69bb7.js.br +0 -0
- package/lib/assets/4d55814bc60a.js.br +0 -0
- package/lib/assets/6c257991027d.js.br +0 -0
- package/lib/assets/9abad5da303e.js.br +0 -0
- package/lib/assets/b55a1acf34e0.js.br +0 -0
- package/lib/assets/d2064c247435.js.br +0 -0
- package/lib/assets/manifest.json +28 -28
- package/lib/client.js +37 -11
- package/lib/host/brand.js +70 -1
- package/lib/host/cache-file.js +63 -25
- package/lib/host/harness-home.js +7 -3
- package/lib/host/index.js +4 -1
- package/lib/host/package-root.js +15 -13
- package/lib/host/peakrate.js +7 -4
- package/lib/host/routes.js +164 -72
- package/lib/host/search.js +44 -2
- package/lib/host/settings.js +137 -43
- package/lib/host/usage-record.js +5 -2
- package/lib/host/usage.js +57 -5
- package/lib/model-descriptions.json +0 -1322
- package/package.json +1 -1
- package/lib/assets/1cefeb3d67c7.js.br +0 -0
- package/lib/assets/1da1959a3cb1.js.br +0 -0
- package/lib/assets/2c3bd0b6c22c.js.br +0 -0
- package/lib/assets/34d559377558.js.br +0 -0
- package/lib/assets/acf9cf79c43e.js.br +0 -0
- package/lib/assets/b7ec75cf39a7.js.br +0 -0
- package/lib/assets/dab5fb383802.js.br +0 -0
- package/lib/host/http.js +0 -74
- package/lib/host/session-events.js +0 -40
package/lib/host/settings.js
CHANGED
|
@@ -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
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
172
|
+
`${PACKAGE_NAME}: settings presentation`
|
|
79
173
|
);
|
|
80
174
|
});
|
|
81
175
|
}
|
package/lib/host/usage-record.js
CHANGED
|
@@ -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?.(
|
|
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?.(
|
|
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
|
-
|
|
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(
|
|
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) {
|