dsh-claude-desktop-theme 0.2.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.
Files changed (76) hide show
  1. package/LICENSE +54 -0
  2. package/README.md +197 -0
  3. package/cordis.patch.yml +5 -0
  4. package/lib/client.js +5492 -0
  5. package/lib/index.js +666 -0
  6. package/lib/types/client/apply.d.ts +25 -0
  7. package/lib/types/client/compat/account-menu.d.ts +52 -0
  8. package/lib/types/client/compat/adapter.d.ts +17 -0
  9. package/lib/types/client/compat/blank-session-rows.d.ts +74 -0
  10. package/lib/types/client/compat/composer-menus.d.ts +11 -0
  11. package/lib/types/client/compat/composer-placeholder.d.ts +3 -0
  12. package/lib/types/client/compat/composer-status-order.d.ts +56 -0
  13. package/lib/types/client/compat/conversation-fade.d.ts +37 -0
  14. package/lib/types/client/compat/dom.d.ts +2 -0
  15. package/lib/types/client/compat/header-labels.d.ts +24 -0
  16. package/lib/types/client/compat/host-builds.d.ts +101 -0
  17. package/lib/types/client/compat/host-dom.d.ts +247 -0
  18. package/lib/types/client/compat/open-target.d.ts +9 -0
  19. package/lib/types/client/compat/pet-anchor.d.ts +30 -0
  20. package/lib/types/client/compat/plugin-manager.d.ts +32 -0
  21. package/lib/types/client/compat/session-menu.d.ts +47 -0
  22. package/lib/types/client/compat/slots.d.ts +21 -0
  23. package/lib/types/client/compat/stats-values.d.ts +20 -0
  24. package/lib/types/client/compat/view-switch.d.ts +14 -0
  25. package/lib/types/client/compat/workspace-menu.d.ts +15 -0
  26. package/lib/types/client/contracts/feature.d.ts +22 -0
  27. package/lib/types/client/contracts/ports.d.ts +169 -0
  28. package/lib/types/client/core/cleanup.d.ts +10 -0
  29. package/lib/types/client/core/mount-features.d.ts +3 -0
  30. package/lib/types/client/features/composer-pet/BlankPet.d.ts +17 -0
  31. package/lib/types/client/features/composer-pet/ComposerPet.d.ts +7 -0
  32. package/lib/types/client/features/composer-pet/Whale.d.ts +18 -0
  33. package/lib/types/client/features/composer-pet/mount.d.ts +9 -0
  34. package/lib/types/client/features/composer-pet/reactions.d.ts +15 -0
  35. package/lib/types/client/features/conversation/header-actions/HeaderActionButton.d.ts +25 -0
  36. package/lib/types/client/features/conversation/header-actions/entries.d.ts +101 -0
  37. package/lib/types/client/features/conversation/header-actions/mount.d.ts +28 -0
  38. package/lib/types/client/features/conversation/header-actions/sidebar-view.d.ts +21 -0
  39. package/lib/types/client/features/conversation/index.d.ts +16 -0
  40. package/lib/types/client/features/model-controls/EffortPanel.d.ts +14 -0
  41. package/lib/types/client/features/model-controls/ModelControls.d.ts +11 -0
  42. package/lib/types/client/features/model-controls/mount.d.ts +5 -0
  43. package/lib/types/client/features/model-controls/pixels.d.ts +4 -0
  44. package/lib/types/client/features/model-controls/popup.d.ts +10 -0
  45. package/lib/types/client/features/model-controls/selection.d.ts +66 -0
  46. package/lib/types/client/features/new-session/index.d.ts +8 -0
  47. package/lib/types/client/features/settings/ConfigPage.d.ts +28 -0
  48. package/lib/types/client/features/settings/FontMenu.d.ts +37 -0
  49. package/lib/types/client/features/settings/edits.d.ts +39 -0
  50. package/lib/types/client/features/settings/fields.d.ts +83 -0
  51. package/lib/types/client/features/settings/fonts.d.ts +40 -0
  52. package/lib/types/client/features/settings/locales.d.ts +61 -0
  53. package/lib/types/client/features/settings/mount.d.ts +17 -0
  54. package/lib/types/client/features/settings/register.d.ts +17 -0
  55. package/lib/types/client/features/shell/index.d.ts +8 -0
  56. package/lib/types/client/features/sidebar/index.d.ts +14 -0
  57. package/lib/types/client/features/statistics/books.d.ts +34 -0
  58. package/lib/types/client/features/statistics/card.d.ts +143 -0
  59. package/lib/types/client/features/statistics/format.d.ts +36 -0
  60. package/lib/types/client/features/statistics/index.d.ts +8 -0
  61. package/lib/types/client/features/statistics/mount.d.ts +12 -0
  62. package/lib/types/client/features/statistics/source.d.ts +35 -0
  63. package/lib/types/client/features/statistics/view.d.ts +95 -0
  64. package/lib/types/client/features/tool-calls/index.d.ts +2 -0
  65. package/lib/types/client/index.d.ts +1 -0
  66. package/lib/types/client/theme/mount.d.ts +15 -0
  67. package/lib/types/client/theme/palette.d.ts +80 -0
  68. package/lib/types/client/theme/tokens.d.ts +27 -0
  69. package/lib/types/host/index.d.ts +106 -0
  70. package/lib/types/host/stats/aggregate.d.ts +38 -0
  71. package/lib/types/host/stats/service.d.ts +18 -0
  72. package/lib/types/host/stats/unit.d.ts +115 -0
  73. package/lib/types/shared/config.d.ts +61 -0
  74. package/lib/types/shared/identity.d.ts +5 -0
  75. package/lib/types/shared/stats.d.ts +133 -0
  76. package/package.json +116 -0
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Pure `ccdUsage` fold over committed session events. The host owns watermarks
3
+ * and checkpoints. Skip the inherited prefix of forks, attribute messages to
4
+ * the latest request/header model, and use normalizeUsage token accounting:
5
+ * reasoning is part of output, while cache-inclusive totals and raw in/out
6
+ * counters are retained for the Models view.
7
+ */
8
+ import type { TokenUsage } from '@deepseek-ai/dsh-llm';
9
+ import type { SessionEvent, SessionHeader, SessionLogOffset } from '@deepseek-ai/dsh-session';
10
+ import type { ProjectionDefinition } from '@deepseek-ai/dsh-session-projection';
11
+ import type { StatsSessionUsage } from '../../shared/stats.ts';
12
+ declare module '@deepseek-ai/dsh-session-projection/types' {
13
+ interface SessionProjectionStateMap {
14
+ ccdUsage: UsageState;
15
+ }
16
+ interface SessionProjectionMap {
17
+ ccdUsage: StatsSessionUsage;
18
+ }
19
+ }
20
+ /** Projection key this plugin owns; it must not collide with a host key. */
21
+ export declare const USAGE_KEY = "ccdUsage";
22
+ /** Persisted-cache invalidation version for {@link UsageState}. */
23
+ export declare const USAGE_STATE_VERSION = 2;
24
+ /** Bucket for usage that arrived before the session logged its first header. */
25
+ export declare const UNKNOWN_MODEL = "unknown";
26
+ /** Hours in a local day. */
27
+ export declare const HOURS_PER_DAY = 24;
28
+ /** One model's counters: cache-inclusive tokens, raw input, raw output. */
29
+ export interface ModelUsage {
30
+ /** Tokens at the provider's scale, cache hits included. */
31
+ readonly t: number;
32
+ /** Raw `inputTokens` as the adapter reported them. */
33
+ readonly i: number;
34
+ /** Raw `outputTokens` as the adapter reported them. */
35
+ readonly o: number;
36
+ }
37
+ /** Fold state: plain JSON, one value per session. */
38
+ export interface UsageState {
39
+ /** Events below this seq belong to the fork-inherited prefix, never to this session. */
40
+ readonly seedSeq: number;
41
+ /** Human prompts (`user/message` with source kind `user`). */
42
+ readonly prompts: number;
43
+ /** Tokens at the provider's scale, cache hits included. */
44
+ readonly tokens: number;
45
+ /** Local day key → prompts. */
46
+ readonly days: Readonly<Record<string, number>>;
47
+ /** 24 local-hour buckets → prompts. */
48
+ readonly hours: readonly number[];
49
+ /** `provider/model` → counters. */
50
+ readonly models: Readonly<Record<string, ModelUsage>>;
51
+ /** Local day key → `provider/model` → tokens produced that day. */
52
+ readonly modelDays: Readonly<Record<string, Readonly<Record<string, number>>>>;
53
+ /** Model in effect for the next assembled message. */
54
+ readonly model: string | null;
55
+ }
56
+ /** Local `YYYY-MM-DD`, the day key the reference heatmap buckets by. */
57
+ export { localDayKey as dayKey } from '../../shared/stats.ts';
58
+ /**
59
+ * Tokens at the provider's scale for one assembled message.
60
+ *
61
+ * @param usage - the step's reported usage.
62
+ * @returns the message's token total, never negative.
63
+ */
64
+ export declare function rawTokens(usage: TokenUsage): number;
65
+ /**
66
+ * Empty state for one session.
67
+ *
68
+ * @param _header - immutable session metadata (unused: the fold is event-driven).
69
+ * @param inheritedEventCount - exact fork-inherited prefix length.
70
+ * @returns the initial state.
71
+ */
72
+ export declare function initUsageState(_header: SessionHeader, inheritedEventCount: SessionLogOffset): UsageState;
73
+ /**
74
+ * Advance the fold by one committed event.
75
+ *
76
+ * @param state - state covering every earlier event.
77
+ * @param event - the next committed session event.
78
+ * @returns the next state, or the same reference when the event is not counted.
79
+ */
80
+ export declare function applyUsageEvent(state: UsageState, event: SessionEvent): UsageState;
81
+ /**
82
+ * Project one state onto the client-visible value.
83
+ *
84
+ * @param state - current fold state.
85
+ * @returns the whole current value, identity-stable for a given state.
86
+ */
87
+ export declare function viewUsage(state: UsageState): StatsSessionUsage;
88
+ /**
89
+ * Read one persisted state row.
90
+ *
91
+ * Deliberately lenient: the registry's own `ver` check already discards rows
92
+ * from another state version, and a read must never throw into the host's
93
+ * session list or a cold-start fold.
94
+ *
95
+ * @param value - row value from the projection cache.
96
+ * @returns a usable state.
97
+ */
98
+ export declare function readUsageState(value: unknown): UsageState;
99
+ /**
100
+ * Read one persisted or wire view row.
101
+ *
102
+ * @param value - view value from the projection cache or the change feed.
103
+ * @returns a usable view.
104
+ */
105
+ export declare function readUsageView(value: unknown): StatsSessionUsage;
106
+ /**
107
+ * The registry's wire-unit shape: the definition with its optional `wire`
108
+ * field made required, which is the overload a client-visible key registers
109
+ * through. Declaring it here keeps `register` callable without a cast.
110
+ */
111
+ type WireUnit = Omit<ProjectionDefinition<typeof USAGE_KEY>, 'wire'> & {
112
+ wire: NonNullable<ProjectionDefinition<typeof USAGE_KEY>['wire']>;
113
+ };
114
+ /** The unit this plugin registers on `ctx.sessionProjections`. */
115
+ export declare const usageProjection: WireUnit;
@@ -0,0 +1,61 @@
1
+ export declare const FEATURE_IDS: readonly ['shell', 'sidebar', 'new-session', 'conversation', 'tool-calls', 'statistics', 'composer-pet'];
2
+ export type FeatureId = typeof FEATURE_IDS[number];
3
+ export type FeatureFlags = Readonly<Record<FeatureId, boolean>>;
4
+ /** Fields of the background-colour section; an empty string means "built-in palette". */
5
+ export declare const APPEARANCE_FIELDS: readonly ['canvas', 'sidebar'];
6
+ /** Fields of the typeface section; an empty string means "system stack". */
7
+ export declare const FONT_FIELDS: readonly ['uiLatin', 'uiCjk', 'code'];
8
+ export type AppearanceField = typeof APPEARANCE_FIELDS[number];
9
+ export type FontField = typeof FONT_FIELDS[number];
10
+ export type AppearanceConfig = Readonly<Record<AppearanceField, string>>;
11
+ export type FontsConfig = Readonly<Record<FontField, string>>;
12
+ export interface StyleConfig {
13
+ readonly enabled: boolean;
14
+ readonly debug: boolean;
15
+ readonly features: FeatureFlags;
16
+ readonly appearance: AppearanceConfig;
17
+ readonly fonts: FontsConfig;
18
+ }
19
+ export interface StyleOptions {
20
+ readonly enabled?: boolean;
21
+ readonly debug?: boolean;
22
+ readonly features?: Partial<FeatureFlags>;
23
+ readonly appearance?: Partial<Record<AppearanceField, unknown>>;
24
+ readonly fonts?: Partial<Record<FontField, unknown>>;
25
+ }
26
+ export declare const DEFAULT_FEATURES: FeatureFlags;
27
+ /** Empty strings keep the built-in palette and the system font stack in charge. */
28
+ export declare const DEFAULT_APPEARANCE: AppearanceConfig;
29
+ export declare const DEFAULT_FONTS: FontsConfig;
30
+ /** Font names longer than this are a pasted paragraph, not a family. */
31
+ export declare const FONT_NAME_MAX_LENGTH = 64;
32
+ /**
33
+ * Normalize one user-entered colour to lowercase `#rrggbb`.
34
+ *
35
+ * The settings boundary accepts the short form as well, so a hand-edited patch
36
+ * file and the colour input both land on one spelling.
37
+ * @param value - raw section value of any type.
38
+ * @returns the normalized colour, or an empty string when it is not a hex colour.
39
+ */
40
+ export declare function normalizeColour(value: unknown): string;
41
+ /**
42
+ * Normalize one user-entered font family name.
43
+ *
44
+ * A comma or a parenthesis would turn the value into a stack or a `url()`; the
45
+ * theme layer composes the stack itself, so a single family is all that is
46
+ * accepted. Quotes are dropped because the composer adds its own.
47
+ * @param value - raw section value of any type.
48
+ * @returns the collapsed family name, or an empty string when it is not one.
49
+ */
50
+ export declare function normalizeFontName(value: unknown): string;
51
+ export declare function resolveConfig(input?: StyleOptions): StyleConfig;
52
+ /**
53
+ * Fold the Host-served configuration section into a validated StyleConfig.
54
+ * The client half reads its configuration through the settings transport, so
55
+ * the value arrives as untyped JSON from a user-editable patch file: unknown
56
+ * keys, wrong types and an absent section all fall back to the declared
57
+ * defaults instead of failing the whole activation.
58
+ * @param value - the section value from the Host, or undefined before it loads.
59
+ * @returns the validated configuration; never throws.
60
+ */
61
+ export declare function adoptConfig(value: unknown): StyleConfig;
@@ -0,0 +1,5 @@
1
+ export declare const PLUGIN_ID = "dsh-claude-desktop-theme";
2
+ /** Loader entry id declared by this package's bundle patch (cordis.patch.yml). */
3
+ export declare const ENTRY_ID = "ui-skin-ccd-style";
4
+ export declare const TARGET_DSH_VERSION = "0.2.0-rc.2";
5
+ export declare const ROOT_ATTRIBUTE = "data-dsh-ccd-style";
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Statistics-card contract shared by the plugin's two halves.
3
+ *
4
+ * The host half folds every stored session log into one sparse summary per
5
+ * session (a project unit of the host's own projection seam, so incremental
6
+ * folding and durable checkpoints stay the host's business) and aggregates
7
+ * those summaries into a {@link StatsSnapshot}. The browser half reads that
8
+ * snapshot from the host's authenticated route and paints the card. Both
9
+ * halves import this file, so the wire vocabulary lives here rather than in
10
+ * either half.
11
+ *
12
+ * Since the card grew the reference's `Models` view and its `All`/`30d`/`7d`
13
+ * switch, a session's summary has to answer two more questions: which model
14
+ * produced which tokens on which day, and how many tokens arrived with each
15
+ * model in total (the legend prints lifetime in/out counters, exactly as the
16
+ * reference does). The per-session value therefore carries a model table plus
17
+ * a sparse `date → model index → tokens` list; the index keeps that list small
18
+ * enough to ride the session payloads it is published on.
19
+ */
20
+ /** Authenticated host route serving {@link StatsSnapshot}. */
21
+ export declare const STATS_PATH = "/api/ccd-stats";
22
+ /** Snapshot revision; a client that does not know the version ignores the body. */
23
+ export declare const STATS_VERSION = 2;
24
+ /** Days of history one snapshot ships; the card itself draws 26 weeks. */
25
+ export declare const STATS_DAY_LIMIT = 366;
26
+ /** The reference's three date ranges, in the order it draws them. */
27
+ export declare const STATS_RANGES: readonly ['all', '30d', '7d'];
28
+ /** One of the reference's range switches. */
29
+ export type StatsRangeId = (typeof STATS_RANGES)[number];
30
+ /** Days each range covers, counting back from today; `all` has no cutoff. */
31
+ export declare const STATS_RANGE_DAYS: Readonly<Record<StatsRangeId, number | null>>;
32
+ /** Local `YYYY-MM-DD` for one instant, the day key both halves bucket by. */
33
+ export declare function localDayKey(time: number): string;
34
+ /**
35
+ * The first local day a range covers.
36
+ *
37
+ * The reference counts back from today inclusive: `30d` starts 29 days ago.
38
+ * Both halves need the same bound — the host to total a range, the browser to
39
+ * cut the chart's days — so the rule lives here.
40
+ *
41
+ * @param range - the range switch.
42
+ * @param now - the instant "today" is read from, epoch ms.
43
+ * @returns the first day key, or null when the range has no cutoff.
44
+ */
45
+ export declare function rangeStart(range: StatsRangeId, now: number): string | null;
46
+ /** One local calendar day (`YYYY-MM-DD`) and its prompt count. */
47
+ export type StatsDay = readonly [string, number];
48
+ /** One local hour and its prompt count. */
49
+ export type StatsHour = readonly [number, number];
50
+ /** One `provider/model` with its tokens: total, input, output. */
51
+ export type StatsModelUsage = readonly [string, number, number, number];
52
+ /** One `provider/model` and the tokens attributed to it inside a range. */
53
+ export type StatsModelTokens = readonly [string, number];
54
+ /** One day of one session: local day, index into the value's model table, tokens. */
55
+ export type StatsModelDay = readonly [string, number, number];
56
+ /** One day of the whole library: local day, `provider/model`, tokens. */
57
+ export type StatsModelDayRow = readonly [string, string, number];
58
+ /** Lifetime input/output counters for one model, as the legend prints them. */
59
+ export type StatsModelIO = readonly [string, number, number];
60
+ /**
61
+ * One session's contribution to the aggregate.
62
+ *
63
+ * `models` doubles as the index table for {@link StatsModelDay}: the day rows
64
+ * point at their model's position in this list, which keeps the per-day data
65
+ * from repeating a `provider/model` string for every day it appears on.
66
+ */
67
+ export interface StatsSessionUsage {
68
+ /** Human prompts: `user/message` events whose source kind is `user`. */
69
+ readonly prompts: number;
70
+ /** Tokens at the provider's scale, cache hits included. */
71
+ readonly tokens: number;
72
+ /** Per local day, sparse; only days with prompts appear. */
73
+ readonly days: readonly StatsDay[];
74
+ /** Per local hour, sparse; only hours with prompts appear. */
75
+ readonly hours: readonly StatsHour[];
76
+ /** Per model, sparse and sorted by name; the day rows index into this list. */
77
+ readonly models: readonly StatsModelUsage[];
78
+ /** Per day and model, sparse, sorted by day then model index. */
79
+ readonly modelDays: readonly StatsModelDay[];
80
+ }
81
+ /** What one date range shows in the tiles, and the models the legend draws. */
82
+ export interface StatsRangeTotals {
83
+ /** Sessions that did work inside the range. */
84
+ readonly sessions: number;
85
+ /** Human prompts inside the range. */
86
+ readonly messages: number;
87
+ /** Tokens produced inside the range, cache hits included. */
88
+ readonly tokens: number;
89
+ /** Local days with any activity inside the range. */
90
+ readonly activeDays: number;
91
+ /** The range's busiest model by tokens, or null when it saw no tokens. */
92
+ readonly topModel: string | null;
93
+ /** Every model inside the range, busiest first. */
94
+ readonly models: readonly StatsModelTokens[];
95
+ }
96
+ /** The three ranges, keyed by {@link StatsRangeId}. */
97
+ export type StatsRanges = Readonly<Record<StatsRangeId, StatsRangeTotals>>;
98
+ /** Everything the card needs, aggregated over every visible stored session. */
99
+ export interface StatsSnapshot {
100
+ readonly version: number;
101
+ /** Totals for each range switch; `all` also feeds the heatmap's own scale. */
102
+ readonly ranges: StatsRanges;
103
+ /**
104
+ * Busiest local hour over all time. The reference's tiles read this from its
105
+ * unfiltered statistics while every other tile is range-filtered, so the card
106
+ * does the same: switching range must not move `Peak hour`.
107
+ */
108
+ readonly busyHour: number | null;
109
+ /** Local days and prompt counts, oldest first, capped at {@link STATS_DAY_LIMIT}. */
110
+ readonly days: readonly StatsDay[];
111
+ /** Tokens per day and model, oldest first, capped at {@link STATS_DAY_LIMIT} days. */
112
+ readonly modelDays: readonly StatsModelDayRow[];
113
+ /** Lifetime input/output counters per model, for the legend's middle column. */
114
+ readonly modelIO: readonly StatsModelIO[];
115
+ /** Sessions still being folded; the card polls faster while this is non-zero. */
116
+ readonly pending: number;
117
+ /** Sessions whose logs could not be read and are therefore missing from the totals. */
118
+ readonly missed: number;
119
+ /** When the host computed this snapshot (epoch ms). */
120
+ readonly computedAt: number;
121
+ }
122
+ /**
123
+ * Read one snapshot from untrusted JSON.
124
+ *
125
+ * The browser half treats the host route as the one data source it does not
126
+ * compile against, so the response is validated structurally before it can
127
+ * reach the card: a body that is not a snapshot at this version is refused and
128
+ * the card simply stays hidden.
129
+ *
130
+ * @param value - parsed response body.
131
+ * @returns the snapshot, or null when the body is not one.
132
+ */
133
+ export declare function readStatsSnapshot(value: unknown): StatsSnapshot | null;
package/package.json ADDED
@@ -0,0 +1,116 @@
1
+ {
2
+ "name": "dsh-claude-desktop-theme",
3
+ "version": "0.2.0",
4
+ "license": "MIT",
5
+ "description": "Claude Code Desktop-style theme for DeepSeek Harness (DSH) Desktop on macOS and Windows, with light/dark themes, model/effort pickers and an interactive pixel whale",
6
+ "author": "zkforge",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/zkforge/dsh-claude-desktop-theme.git"
10
+ },
11
+ "homepage": "https://github.com/zkforge/dsh-claude-desktop-theme#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/zkforge/dsh-claude-desktop-theme/issues"
14
+ },
15
+ "keywords": [
16
+ "dsh",
17
+ "dsh-plugin",
18
+ "dsh-desktop",
19
+ "deepseek",
20
+ "deepseek-harness",
21
+ "claude",
22
+ "claude-code",
23
+ "claude-desktop",
24
+ "claude-code-desktop",
25
+ "dsh-theme",
26
+ "desktop-theme",
27
+ "ui-theme",
28
+ "theme",
29
+ "skin",
30
+ "dark-mode",
31
+ "light-theme",
32
+ "macos",
33
+ "windows",
34
+ "cordis-plugin",
35
+ "ccd"
36
+ ],
37
+ "publishConfig": {
38
+ "access": "public",
39
+ "registry": "https://registry.npmjs.org/"
40
+ },
41
+ "type": "module",
42
+ "main": "./lib/index.js",
43
+ "types": "./lib/types/host/index.d.ts",
44
+ "exports": {
45
+ ".": {
46
+ "types": "./lib/types/host/index.d.ts",
47
+ "default": "./lib/index.js"
48
+ },
49
+ "./client": "./lib/client.js",
50
+ "./package.json": "./package.json"
51
+ },
52
+ "files": [
53
+ "lib",
54
+ "cordis.patch.yml",
55
+ "README.md"
56
+ ],
57
+ "engines": {
58
+ "node": ">=22.18.0"
59
+ },
60
+ "dsh": {
61
+ "engines": {
62
+ "dsh": "=0.2.0-rc.2"
63
+ },
64
+ "bundle": {
65
+ "patch": "./cordis.patch.yml"
66
+ },
67
+ "client": {
68
+ "platform": "web",
69
+ "inject": [
70
+ "@deepseek-ai/dsh-client-ui-renderer",
71
+ "@deepseek-ai/dsh-client-ui-theme",
72
+ "@deepseek-ai/dsh-client-ui-workspace",
73
+ "@deepseek-ai/dsh-client-ui-model-selection",
74
+ "@deepseek-ai/dsh-client-ui-sidebar-right"
75
+ ]
76
+ }
77
+ },
78
+ "scripts": {
79
+ "build": "node scripts/build.mjs",
80
+ "dev": "node scripts/build.mjs --watch",
81
+ "typecheck": "tsc --noEmit",
82
+ "check:architecture": "node scripts/check-architecture.mjs",
83
+ "check:package": "node scripts/check-package.mjs",
84
+ "test": "node --test tests/*.test.ts",
85
+ "check": "npm run typecheck && npm run check:architecture && npm test && npm run build && npm run check:package",
86
+ "prepack": "npm run check",
87
+ "pack:local": "npm pack --pack-destination artifacts"
88
+ },
89
+ "dependencies": {
90
+ "@deepseek-ai/schemastery": "3.18.4"
91
+ },
92
+ "peerDependencies": {
93
+ "@deepseek-ai/cordis": "~4.0.4"
94
+ },
95
+ "devDependencies": {
96
+ "@babel/parser": "7.29.9",
97
+ "@deepseek-ai/cordis": "4.0.4",
98
+ "@deepseek-ai/dsh-api-session-controller": "0.2.0-rc.2",
99
+ "@deepseek-ai/dsh-api-workspace-controller": "0.2.0-rc.2",
100
+ "@deepseek-ai/dsh-client-locale": "0.2.0-rc.2",
101
+ "@deepseek-ai/dsh-client-store": "0.2.0-rc.2",
102
+ "@deepseek-ai/dsh-client-ui-conversation": "0.2.0-rc.2",
103
+ "@deepseek-ai/dsh-client-ui-layout": "0.2.0-rc.2",
104
+ "@deepseek-ai/dsh-client-ui-model-selection": "0.2.0-rc.2",
105
+ "@deepseek-ai/dsh-client-ui-renderer": "0.2.0-rc.2",
106
+ "@deepseek-ai/dsh-client-ui-slots": "0.2.0-rc.2",
107
+ "@deepseek-ai/dsh-client-ui-theme": "0.2.0-rc.2",
108
+ "@deepseek-ai/dsh-client-ui-workspace": "0.2.0-rc.2",
109
+ "@types/node": "26.6.3",
110
+ "@types/react": "18.3.1",
111
+ "esbuild": "0.28.2",
112
+ "react": "18.3.1",
113
+ "typescript": "7.0.2",
114
+ "yaml": "2.9.1"
115
+ }
116
+ }