@sidequest-007/dsh-atlas 1.0.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 (58) hide show
  1. package/CHANGELOG.md +269 -0
  2. package/CONTRIBUTING.md +50 -0
  3. package/LICENSE +21 -0
  4. package/LICENSE-ORIGINAL +21 -0
  5. package/NOTICE +29 -0
  6. package/README.md +297 -0
  7. package/README.zh.md +289 -0
  8. package/assets/diagrams/atlas-overview.svg +53 -0
  9. package/assets/diagrams/atlas-seam.svg +32 -0
  10. package/assets/screenshots/file-mention-composer.png +0 -0
  11. package/assets/screenshots/file-mention-settings.png +0 -0
  12. package/assets/screenshots/menu-mixed.png +0 -0
  13. package/cordis.patch.yml +14 -0
  14. package/dsh.plugin.json +12 -0
  15. package/lib/client.js +20615 -0
  16. package/lib/index.js +17458 -0
  17. package/lib/invariant.js +13 -0
  18. package/lib/types/abort.d.ts +22 -0
  19. package/lib/types/atlas.d.ts +181 -0
  20. package/lib/types/client/DraftLinks.d.ts +21 -0
  21. package/lib/types/client/FilesDock.d.ts +75 -0
  22. package/lib/types/client/FolderPicker.d.ts +66 -0
  23. package/lib/types/client/FolderTab.d.ts +50 -0
  24. package/lib/types/client/MentionNavigator.d.ts +96 -0
  25. package/lib/types/client/MenuIcons.d.ts +16 -0
  26. package/lib/types/client/ReferenceLinks.d.ts +85 -0
  27. package/lib/types/client/SettingsSection.d.ts +31 -0
  28. package/lib/types/client/draft-links.d.ts +205 -0
  29. package/lib/types/client/draft-scope.d.ts +22 -0
  30. package/lib/types/client/git-provider.d.ts +45 -0
  31. package/lib/types/client/icons.d.ts +48 -0
  32. package/lib/types/client/index.d.ts +8 -0
  33. package/lib/types/client/locales.d.ts +267 -0
  34. package/lib/types/client/model.d.ts +38 -0
  35. package/lib/types/client/reference-links.d.ts +100 -0
  36. package/lib/types/client/remote.d.ts +54 -0
  37. package/lib/types/client/search.d.ts +9 -0
  38. package/lib/types/client/source.d.ts +325 -0
  39. package/lib/types/client/styles.d.ts +15 -0
  40. package/lib/types/contract.d.ts +512 -0
  41. package/lib/types/defaults.d.ts +115 -0
  42. package/lib/types/external.d.ts +58 -0
  43. package/lib/types/files.d.ts +76 -0
  44. package/lib/types/git.d.ts +44 -0
  45. package/lib/types/index.d.ts +88 -0
  46. package/lib/types/invariant.d.ts +15 -0
  47. package/lib/types/mention.d.ts +80 -0
  48. package/lib/types/paste.d.ts +13 -0
  49. package/lib/types/reference.d.ts +16 -0
  50. package/lib/types/references.d.ts +126 -0
  51. package/lib/types/runtime-info.d.ts +30 -0
  52. package/lib/types/runtime.d.ts +180 -0
  53. package/lib/types/settings.d.ts +25 -0
  54. package/lib/types/tokens.d.ts +35 -0
  55. package/lib/types/tools.d.ts +94 -0
  56. package/lib/types/typert.d.ts +13 -0
  57. package/lib/types/types.d.ts +12 -0
  58. package/package.json +208 -0
@@ -0,0 +1,180 @@
1
+ /**
2
+ * The dsh-atlas host Remote service (`ctx.atFile`, wire namespace `atFile`).
3
+ * Registered as a TypertRemoteService so the Host Gateway's source-mode
4
+ * discovery exports its @Remote methods to the Web client under
5
+ * `/api/atFile/<method>` with zero generated artifacts: `search` takes the
6
+ * resolved live Agent (the `agent` Typert lookup) and indexes its workspace.
7
+ * File content never crosses this wire or the Host mention boundary; the
8
+ * plugin only indexes and marks user-selected paths.
9
+ */
10
+ import type { Context } from '@deepseek-ai/cordis';
11
+ import { TypertRemoteService } from '@deepseek-ai/dsh-typert-protocol';
12
+ import type { Agent } from '@deepseek-ai/dsh-agent';
13
+ import { type ExternalAccess } from './external.ts';
14
+ import type { DirectoryListing, ExternalAccessScope } from './contract.ts';
15
+ import type { AtFileSettings, AtFileSettingsUpdate, ChatCandidate, FileEntry, GitChange, PluginCandidate, ReferenceInfo, SkillCandidate } from './contract.ts';
16
+ import type { ResolvedConfig } from './types.ts';
17
+ import { type AtlasRegistration, type AtlasRuntimeInfo } from './atlas.ts';
18
+ /** At-file workspace service: search the cwd index for the browser picker. */
19
+ export declare class AtFileRuntime extends TypertRemoteService {
20
+ private readonly config;
21
+ private readonly readSettings;
22
+ private readonly writeSettings;
23
+ /** The session's out-of-workspace access (see src/external.ts). */
24
+ private readonly externalAccessFor;
25
+ /** Host-side workspace index cache: { at, value } per cwd+filter key. */
26
+ private readonly fileCache;
27
+ /** In-flight index walks (concurrent windows share ONE workspace scan). */
28
+ private readonly fileInFlight;
29
+ /**
30
+ * Register the service under the `atFile` key (the wire namespace).
31
+ * @param ctx - owning cordis context.
32
+ * @param config - resolved plugin configuration.
33
+ * @param isEnabled - live settings read; false refuses the endpoint.
34
+ */
35
+ constructor(ctx: Context, config: ResolvedConfig, readSettings: () => AtFileSettings, writeSettings: (update: AtFileSettingsUpdate) => Promise<AtFileSettings>,
36
+ /** The session's out-of-workspace access (see src/external.ts). */
37
+ externalAccessFor?: (agent: Agent) => ExternalAccess);
38
+ /** One TTL for the workspace index cache (matches the client cache). */
39
+ private static readonly FILE_CACHE_TTL_MS;
40
+ /** Read the resolved durable settings through the plugin-owned wire. */
41
+ getSettings(): AtFileSettings;
42
+ /** Persist one settings field and return the resolved section. */
43
+ updateSettings(update: AtFileSettingsUpdate): Promise<AtFileSettings>;
44
+ /**
45
+ * Index the addressed agent's workspace and return the bounded entry list.
46
+ * The client caches the list per session and filters per keystroke.
47
+ * @param agent - the live agent resolved from the `agentId` wire field; its
48
+ * session header owns the workspace cwd.
49
+ * @param signal - caller lifetime; the walk races it.
50
+ * @returns workspace-root-relative entries with their absolute paths.
51
+ */
52
+ search(agent: Agent, signal: AbortSignal): Promise<readonly FileEntry[]>;
53
+ /**
54
+ * Inspect referenced workspace paths: existence, kind, and byte size only.
55
+ * The dock uses this to price a reference and to flag one that no longer
56
+ * resolves. Entry metadata is the only thing read; file content stays unopened.
57
+ * @param agent - the live agent resolved from the `agentId` wire field; its
58
+ * session header owns the workspace cwd.
59
+ * @param targets - workspace-relative paths, already stripped of line ranges.
60
+ * @param signal - caller lifetime.
61
+ * @returns one row per requested path, in request order.
62
+ */
63
+ inspect(agent: Agent, targets: readonly string[], signal: AbortSignal): Promise<readonly ReferenceInfo[]>;
64
+ /**
65
+ * The out-of-workspace scope for one session, plus the folder rows `@folder:`
66
+ * may offer for it.
67
+ *
68
+ * Two sources, both bounded and neither a search: the directories the ledger
69
+ * already knows (usable in EVERY mode — they are paths the user referenced
70
+ * themselves), and, only where the session may discover external paths, the
71
+ * sibling directories of the workspace. That second list is one `opendir` of
72
+ * one directory: it is how a plugin author reaches the DSH source tree next to
73
+ * the workspace without any whole-disk walk.
74
+ * @param agent - the live agent; its session header owns the workspace cwd.
75
+ * @param signal - caller lifetime.
76
+ * @returns the scope verdict and the folder rows to offer.
77
+ */
78
+ external(agent: Agent, signal: AbortSignal): Promise<ExternalAccessScope>;
79
+ /**
80
+ * One bounded, one-level listing of one directory, for the folder browser and
81
+ * the folder tab.
82
+ *
83
+ * `''` means the session's workspace root, which is where a browser starts. A
84
+ * workspace path is always allowed; an out-of-workspace one goes through the
85
+ * SAME gate as a reference (`allowsExternal`), so browsing can never see a path
86
+ * the session may not reference — and the refusal comes back as a reason rather
87
+ * than a thrown error, because "this folder is outside the workspace" is a fact
88
+ * the browser has to say in its own words instead of an exception.
89
+ * @param agent - the live agent; its session header owns the workspace cwd.
90
+ * @param path - absolute path, workspace-relative path, or `''` for the root.
91
+ * @param signal - caller lifetime.
92
+ * @returns the listing, or the reason it could not be produced.
93
+ */
94
+ list(agent: Agent, path: string, signal: AbortSignal): Promise<DirectoryListing>;
95
+ }
96
+ /** Host-side capability faces the atMention service forwards to. */
97
+ export interface MentionRuntimeDeps {
98
+ /** List discoverable skills for the @skill picker (settings-gated). */
99
+ listSkills(agent: Agent, signal: AbortSignal): Promise<readonly SkillCandidate[]>;
100
+ /** List past-session candidates for the @chat picker (settings-gated). */
101
+ listChats(agent: Agent, query: string, limit: number, signal: AbortSignal): Promise<readonly ChatCandidate[]>;
102
+ /** List installed plugin entries for the @plugin picker (settings-gated). */
103
+ listPlugins(signal: AbortSignal): Promise<readonly PluginCandidate[]>;
104
+ }
105
+ /**
106
+ * The dsh-atlas host Remote service (`ctx.atMention`, wire namespace
107
+ * `atMention`). Registered as a TypertRemoteService so the Host Gateway
108
+ * exports its @Remote methods to the Web client under
109
+ * `/api/atMention/<method>`: skills and past chats resolve the live Agent
110
+ * (the `agent` Typert lookup); plugins need no agent. Every method is a
111
+ * thin pass-through to the wiring closures so the boundary stays unit-testable
112
+ * without an assembled Cordis scope.
113
+ */
114
+ export declare class AtMentionRuntime extends TypertRemoteService {
115
+ private readonly deps;
116
+ /**
117
+ * Register the service under the `atMention` key (the wire namespace).
118
+ * @param ctx - owning cordis context.
119
+ * @param deps - settings-gated capability closures wired in apply().
120
+ */
121
+ constructor(ctx: Context, deps: MentionRuntimeDeps);
122
+ /** List discoverable skills for the @skill picker. */
123
+ listSkills(agent: Agent, signal: AbortSignal): Promise<readonly SkillCandidate[]>;
124
+ /** List past-session candidates for the @chat picker. */
125
+ listChats(agent: Agent, query: string, limit: number, signal: AbortSignal): Promise<readonly ChatCandidate[]>;
126
+ /** List installed plugin entries for the @plugin picker. */
127
+ listPlugins(signal: AbortSignal): Promise<readonly PluginCandidate[]>;
128
+ }
129
+ /**
130
+ * The `@` seam's Host-half service (`ctx.atlas`, wire namespace `atlas`).
131
+ *
132
+ * The seam has two halves because DSH plugins do: the browser half answers
133
+ * `list` for the open menu, while this half answers `resolve` when a committed
134
+ * reference becomes model-visible text. This service reports the facts a
135
+ * provider's `testedOn` claim is judged against, and is where the Host-half
136
+ * provider registry lands as the seam grows.
137
+ */
138
+ export declare class AtlasRuntime extends TypertRemoteService {
139
+ private readonly readVersion;
140
+ /** The Host half of the seam: provides `resolve`, the injection-side callback. */
141
+ private readonly registry;
142
+ /**
143
+ * Register the service under the `atlas` key (the wire namespace).
144
+ * @param ctx - owning cordis context.
145
+ * @param readVersion - how to establish the running DSH version; injectable so
146
+ * an unresolvable install stays testable.
147
+ */
148
+ constructor(ctx: Context, readVersion?: () => string | undefined);
149
+ /**
150
+ * The running Harness facts for the version gate.
151
+ * @returns the version when established, otherwise an empty record.
152
+ */
153
+ private facts;
154
+ /**
155
+ * Register one provider's injection half. This is a plain local call (not a
156
+ * wire endpoint): the provider authorizes us by calling it, and the returned
157
+ * disposer withdraws it.
158
+ * @param candidate - the provider declaration, which must carry `resolve`.
159
+ * @returns the disposer that withdraws the registration.
160
+ */
161
+ register(candidate: unknown): () => void;
162
+ /** The live injection-side registrations, in registration order. */
163
+ registrations(): readonly AtlasRegistration[];
164
+ /**
165
+ * Report the running Harness facts.
166
+ * @param signal - caller lifetime.
167
+ * @returns the version when it could be established, otherwise an empty record
168
+ * (an unknown version must never read as a matching one).
169
+ */
170
+ runtime(signal: AbortSignal): AtlasRuntimeInfo;
171
+ /**
172
+ * The addressed workspace's changed paths — the built-in `@git` provider's
173
+ * candidate list. The browser half filters this per keystroke, so the answer
174
+ * is the whole bounded list rather than a server-side search.
175
+ * @param agent - the live agent resolved from the `agentId` wire field.
176
+ * @param signal - caller lifetime.
177
+ * @returns the changes, or an empty list outside a Git workspace.
178
+ */
179
+ gitChanges(agent: Agent, signal: AbortSignal): Promise<readonly GitChange[]>;
180
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * The `at-file` settings namespace: the durable enable switch, pasted-mention
3
+ * policy, and file-name filters managed from the Web settings page. Registered with the settings
4
+ * provider at plugin load; the runtime reads the owner scope's live value on
5
+ * every call, so changes take effect without a restart.
6
+ */
7
+ import type { Context } from '@deepseek-ai/cordis';
8
+ import z from '@deepseek-ai/schemastery';
9
+ import type { SettingsScope } from '@deepseek-ai/dsh-settings';
10
+ import type { AtFileSettings } from './contract.ts';
11
+ /** The branded namespace name (the Web allowlist must list the same string). */
12
+ export declare const AT_FILE_NAMESPACE = "at-file";
13
+ /**
14
+ * Schemastery schema of the `at-file` namespace section. The trailing cast only
15
+ * bridges schemastery's `ObjectT` inference — which carries an index signature
16
+ * and mutable arrays — to the readonly interface the wire codec shares; every
17
+ * field is still validated at runtime.
18
+ */
19
+ export declare const AtFileSettingsSchema: z<AtFileSettings>;
20
+ /**
21
+ * Register the namespace with the settings provider and return its owner scope.
22
+ * @param ctx - the plugin context carrying the settings provider.
23
+ * @returns the owner scope backing the runtime's live enable check.
24
+ */
25
+ export declare function registerAtFileSettings(ctx: Context): SettingsScope<AtFileSettings>;
@@ -0,0 +1,35 @@
1
+ /**
2
+ * The `@` token grammar shared by the Host reference marker and the browser
3
+ * dock. A token is `@` followed by a run of non-whitespace, non-`@` characters;
4
+ * a file reference may carry a `:start[-end]` line range. The Host bundle and
5
+ * the client bundle are built separately, so this module is the single
6
+ * implementation of the recognition rule they must agree on.
7
+ */
8
+ /** One inclusive 1-based line range on a referenced file. */
9
+ export interface LineRange {
10
+ readonly start: number;
11
+ readonly end: number;
12
+ }
13
+ /** One token split into its path portion and an optional line range. */
14
+ export interface TokenTarget {
15
+ readonly path: string;
16
+ readonly lines?: LineRange;
17
+ }
18
+ /**
19
+ * Split one token into its path and an optional `:start[-end]` line range.
20
+ *
21
+ * A colon introduces a range only when digits (optionally `-digits`) follow it,
22
+ * so Windows drive letters (`C:\src\a.ts`), `file:`-style category prefixes, and
23
+ * any other colon-bearing path keep working as plain paths. A reversed range
24
+ * (`40-12`) is normalized to `12-40`; line numbers start at 1, and a `0` keeps
25
+ * the whole token as a path.
26
+ * @param token - one scanned token without its leading `@`.
27
+ * @returns the path portion plus the parsed range when one was recognized.
28
+ */
29
+ export declare function splitLineRange(token: string): TokenTarget;
30
+ /**
31
+ * Render one line range as the `start-end` wire label.
32
+ * @param lines - the parsed inclusive range.
33
+ * @returns the `start-end` text used in the draft token and the injected attribute.
34
+ */
35
+ export declare function lineRangeLabel(lines: LineRange): string;
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Model-facing tools for the @ mention categories, so a chat that used a
3
+ * reference can query it on demand later:
4
+ *
5
+ * - `past_chats` lists history sessions by title/workspace (no FTS needed —
6
+ * it reads the session-reference candidate index).
7
+ * - `read_past_chat` reads one referenced session's current user/assistant
8
+ * surface (exact read through `ctx.sessionQuery`, workspace-authorized).
9
+ * - `plugin_info` lists installed plugins by module name.
10
+ *
11
+ * Skills need no tool here: every session already has the `skill` loader,
12
+ * and the session skill catalog carries the summaries.
13
+ */
14
+ import type { Context } from '@deepseek-ai/cordis';
15
+ import type { Agent } from '@deepseek-ai/dsh-agent';
16
+ import type { AtFileSettings } from './contract.ts';
17
+ /** Face of `ctx.sessionReferenceResolver` used by the listing tool. */
18
+ export interface SessionResolverFace {
19
+ listCandidates(agent: Agent, query: string, limit: number, signal?: AbortSignal): Promise<readonly {
20
+ sessionId: string;
21
+ label: string;
22
+ cwd?: string;
23
+ createdAt: number;
24
+ }[]>;
25
+ }
26
+ /** Face of `ctx.sessionQuery` used by the reader tool (structural). */
27
+ export interface SessionQueryFace {
28
+ readSurface(sessionId: string): Promise<{
29
+ session: {
30
+ header: {
31
+ cwd?: string;
32
+ };
33
+ };
34
+ events: readonly {
35
+ type: string;
36
+ content?: readonly {
37
+ type: string;
38
+ text?: string;
39
+ }[];
40
+ text?: string;
41
+ }[];
42
+ }>;
43
+ }
44
+ /**
45
+ * Face of `ctx.pluginInventory` used by the plugin tool. The Harness gateway
46
+ * declares `@Remote('list') async list()`, so the returned snapshot MUST be
47
+ * awaited; the sync arm stays accepted for structural stubs.
48
+ */
49
+ export interface PluginInventoryFace {
50
+ list(): {
51
+ entries: readonly {
52
+ moduleName: string;
53
+ enabled: boolean;
54
+ }[];
55
+ } | Promise<{
56
+ entries: readonly {
57
+ moduleName: string;
58
+ enabled: boolean;
59
+ }[];
60
+ }>;
61
+ }
62
+ /** One candidate row from the session reference resolver. */
63
+ export interface ChatCandidateRow {
64
+ readonly sessionId: string;
65
+ readonly label: string;
66
+ readonly cwd?: string;
67
+ readonly createdAt: number;
68
+ }
69
+ /** Format one past-chat candidate as a readable line. */
70
+ export declare function formatChatCandidate(candidate: ChatCandidateRow): string;
71
+ /**
72
+ * Project a session's current surface into readable user/assistant text,
73
+ * excluding tool results, reasoning, and injected context (same spirit as the
74
+ * official session-reference projection).
75
+ */
76
+ export declare function projectSurface(events: readonly {
77
+ type: string;
78
+ content?: readonly {
79
+ type: string;
80
+ text?: string;
81
+ }[];
82
+ text?: string;
83
+ }[]): string;
84
+ /** The tool-execution face used by the registered tools. */
85
+ export interface MentionToolExec {
86
+ readonly agent?: Agent;
87
+ readonly signal?: AbortSignal;
88
+ }
89
+ /**
90
+ * Register the three mention tools on `ctx.tools`. Returns the disposers, or
91
+ * undefined when the tools registry is not mounted yet (profiles without it
92
+ * simply skip the tools; the picker and reference injection stay intact).
93
+ */
94
+ export declare function registerMentionTools(ctx: Context, readSettings: () => AtFileSettings): (() => void)[] | undefined;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * The hand-written host Typert manifest for the atFile and atMention Remote
3
+ * namespaces. Registered through `ctx.typert.register` in the plugin body,
4
+ * it claims every wire endpoint through the strict registry — the same path
5
+ * generated `./typert` artifacts use — so the Host Gateway resolves search,
6
+ * settings, and category picks without consulting the `@Remote` marker
7
+ * table. That marker independence matters in the harness's source-launch
8
+ * development environment, where the tsx-loaded gateway and a profile-loaded
9
+ * plugin bundle can hold separate copies of the decorator module state.
10
+ */
11
+ import type { TypertContribution } from '@deepseek-ai/dsh-typert-registry/types';
12
+ /** The host manifest: one package, two service namespaces (strict codecs shared with the client). */
13
+ export declare const TYPERT_MANIFEST: TypertContribution;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * dsh-atlas host types: the plugin configuration face. The wire contract
3
+ * types live in `contract.ts` and are re-exported here for the host entry.
4
+ */
5
+ export type { AtFileSettings, FileEntry } from './contract.ts';
6
+ /** Resolved plugin configuration (schema defaults applied). */
7
+ export interface ResolvedConfig {
8
+ /** Hard cap on indexed entries per workspace; the walk stops and reports truncation. */
9
+ readonly maxIndexedFiles: number;
10
+ /** Directory basenames the index walk skips entirely. */
11
+ readonly ignoreDirs: readonly string[];
12
+ }
package/package.json ADDED
@@ -0,0 +1,208 @@
1
+ {
2
+ "name": "@sidequest-007/dsh-atlas",
3
+ "description": "@ Last, All Sources. One @ . Any plugin can register.",
4
+ "version": "1.0.0",
5
+ "license": "MIT",
6
+ "author": "Side Quest Labs",
7
+ "publishConfig": {
8
+ "access": "public"
9
+ },
10
+ "keywords": [
11
+ "dsh",
12
+ "deepseek-harness",
13
+ "plugin",
14
+ "dsh-plugin",
15
+ "mention",
16
+ "at-mention",
17
+ "composer",
18
+ "workspace",
19
+ "reference"
20
+ ],
21
+ "homepage": "https://github.com/jameswatt139240-crypto/dsh-ATLAS#readme",
22
+ "bugs": {
23
+ "url": "https://github.com/jameswatt139240-crypto/dsh-ATLAS/issues"
24
+ },
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "git+https://github.com/jameswatt139240-crypto/dsh-ATLAS.git"
28
+ },
29
+ "engines": {
30
+ "node": ">=22"
31
+ },
32
+ "type": "module",
33
+ "main": "lib/index.js",
34
+ "exports": {
35
+ ".": {
36
+ "types": "./lib/types/index.d.ts",
37
+ "default": "./lib/index.js"
38
+ },
39
+ "./client": {
40
+ "types": "./lib/types/client/index.d.ts",
41
+ "default": "./lib/client.js"
42
+ },
43
+ "./invariant": {
44
+ "types": "./lib/types/invariant.d.ts",
45
+ "default": "./lib/invariant.js"
46
+ },
47
+ "./package.json": "./package.json"
48
+ },
49
+ "dsh": {
50
+ "bundle": {
51
+ "patch": "./cordis.patch.yml"
52
+ },
53
+ "client": {
54
+ "platform": "web",
55
+ "inject": [
56
+ "@deepseek-ai/dsh-api-remotes",
57
+ "@deepseek-ai/dsh-api-session-controller",
58
+ "@deepseek-ai/dsh-client-connection",
59
+ "@deepseek-ai/dsh-client-locale",
60
+ "@deepseek-ai/dsh-client-ui-input-trigger",
61
+ "@deepseek-ai/dsh-client-ui-sidebar-right"
62
+ ]
63
+ }
64
+ },
65
+ "files": [
66
+ "lib/index.js",
67
+ "lib/invariant.js",
68
+ "lib/client.js",
69
+ "lib/types",
70
+ "assets/screenshots",
71
+ "assets/diagrams",
72
+ "cordis.patch.yml",
73
+ "dsh.plugin.json",
74
+ "README.md",
75
+ "README.zh.md",
76
+ "CHANGELOG.md",
77
+ "CONTRIBUTING.md",
78
+ "LICENSE",
79
+ "LICENSE-ORIGINAL",
80
+ "NOTICE"
81
+ ],
82
+ "scripts": {
83
+ "build": "node build.mjs",
84
+ "build:ads": "node build.mjs --ads",
85
+ "typecheck": "tsc --noEmit",
86
+ "test": "vitest run",
87
+ "verify:publish": "node scripts/verify-publish-surface.mjs",
88
+ "check": "pnpm run typecheck && pnpm run test && pnpm run build && pnpm run verify:publish",
89
+ "prepublishOnly": "pnpm run check"
90
+ },
91
+ "peerDependencies": {
92
+ "@deepseek-ai/cordis": "^4.0.1-rc.1",
93
+ "@deepseek-ai/dsh-agent": "*",
94
+ "@deepseek-ai/dsh-api-remotes": "*",
95
+ "@deepseek-ai/dsh-api-session-controller": "*",
96
+ "@deepseek-ai/dsh-client-connection": "*",
97
+ "@deepseek-ai/dsh-client-locale": "*",
98
+ "@deepseek-ai/dsh-client-store": "*",
99
+ "@deepseek-ai/dsh-client-ui-conversation": "*",
100
+ "@deepseek-ai/dsh-client-ui-input-trigger": "*",
101
+ "@deepseek-ai/dsh-client-ui-sidebar-right": "*",
102
+ "@deepseek-ai/dsh-client-ui-settings": "*",
103
+ "@deepseek-ai/dsh-client-ui-slots": "*",
104
+ "@deepseek-ai/dsh-llm": "*",
105
+ "@deepseek-ai/dsh-session-reference": "*",
106
+ "@deepseek-ai/dsh-settings": "*",
107
+ "@deepseek-ai/dsh-typert-protocol": "*",
108
+ "@deepseek-ai/dsh-typert-registry": "*",
109
+ "react": "^18.2.0"
110
+ },
111
+ "peerDependenciesMeta": {
112
+ "@deepseek-ai/dsh-api-session-controller": {
113
+ "optional": true
114
+ },
115
+ "@deepseek-ai/cordis": {
116
+ "optional": true
117
+ },
118
+ "@deepseek-ai/dsh-agent": {
119
+ "optional": true
120
+ },
121
+ "@deepseek-ai/dsh-typert-protocol": {
122
+ "optional": true
123
+ },
124
+ "@deepseek-ai/dsh-client-store": {
125
+ "optional": true
126
+ },
127
+ "@deepseek-ai/dsh-api-remotes": {
128
+ "optional": true
129
+ },
130
+ "@deepseek-ai/dsh-client-ui-input-trigger": {
131
+ "optional": true
132
+ },
133
+ "@deepseek-ai/dsh-client-ui-sidebar-right": {
134
+ "optional": true
135
+ },
136
+ "@deepseek-ai/dsh-client-ui-slots": {
137
+ "optional": true
138
+ },
139
+ "@deepseek-ai/dsh-client-ui-conversation": {
140
+ "optional": true
141
+ },
142
+ "@deepseek-ai/dsh-client-locale": {
143
+ "optional": true
144
+ },
145
+ "@deepseek-ai/dsh-client-connection": {
146
+ "optional": true
147
+ },
148
+ "react": {
149
+ "optional": true
150
+ },
151
+ "@deepseek-ai/dsh-typert-registry": {
152
+ "optional": true
153
+ },
154
+ "@deepseek-ai/dsh-settings": {
155
+ "optional": true
156
+ },
157
+ "@deepseek-ai/dsh-client-ui-settings": {
158
+ "optional": true
159
+ },
160
+ "@deepseek-ai/dsh-llm": {
161
+ "optional": true
162
+ },
163
+ "@deepseek-ai/dsh-session-reference": {
164
+ "optional": true
165
+ }
166
+ },
167
+ "dependencies": {
168
+ "zod": "^4.4.3"
169
+ },
170
+ "devDependencies": {
171
+ "@deepseek-ai/cordis": "link:../deepseek-harness/vendor/cordis",
172
+ "@deepseek-ai/dsh-agent": "link:../deepseek-harness/packages/core/agent",
173
+ "@deepseek-ai/dsh-api-remotes": "link:../deepseek-harness/packages/api/remotes",
174
+ "@deepseek-ai/dsh-api-session-controller": "link:../deepseek-harness/packages/api/session-controller",
175
+ "@deepseek-ai/dsh-client-connection": "link:../deepseek-harness/packages/client/connection",
176
+ "@deepseek-ai/dsh-client-locale": "link:../deepseek-harness/packages/client/locale",
177
+ "@deepseek-ai/dsh-client-store": "link:../deepseek-harness/packages/client/store",
178
+ "@deepseek-ai/dsh-client-ui-conversation": "link:../deepseek-harness/packages/client/ui-conversation",
179
+ "@deepseek-ai/dsh-client-ui-input-trigger": "link:../deepseek-harness/packages/client/ui-input-trigger",
180
+ "@deepseek-ai/dsh-client-ui-sidebar-right": "link:../deepseek-harness/packages/client/ui-sidebar-right",
181
+ "@deepseek-ai/dsh-client-ui-renderer": "link:../deepseek-harness/packages/client/ui-renderer",
182
+ "@deepseek-ai/dsh-client-ui-settings": "link:../deepseek-harness/packages/client/ui-settings",
183
+ "@deepseek-ai/dsh-client-ui-slots": "link:../deepseek-harness/packages/client/ui-slots",
184
+ "@deepseek-ai/dsh-invariants": "link:../deepseek-harness/packages/runtime-diagnostics/invariants",
185
+ "@deepseek-ai/dsh-llm": "link:../deepseek-harness/packages/llm/llm",
186
+ "@deepseek-ai/dsh-session": "link:../deepseek-harness/packages/core/session",
187
+ "@deepseek-ai/dsh-session-query": "link:../deepseek-harness/packages/session-query/session-query",
188
+ "@deepseek-ai/dsh-session-reference": "link:../deepseek-harness/packages/context/session-reference",
189
+ "@deepseek-ai/dsh-settings": "link:../deepseek-harness/packages/settings/settings",
190
+ "@deepseek-ai/dsh-skill": "link:../deepseek-harness/packages/skill/skill",
191
+ "@deepseek-ai/dsh-tools": "link:../deepseek-harness/packages/core/tools",
192
+ "@deepseek-ai/dsh-typert-protocol": "link:../deepseek-harness/packages/typert/protocol",
193
+ "@deepseek-ai/dsh-typert-registry": "link:../deepseek-harness/packages/typert/registry",
194
+ "@deepseek-ai/schemastery": "link:../deepseek-harness/vendor/schemastery",
195
+ "@tabler/icons-react": "^3.46.0",
196
+ "@types/node": "^24.0.0",
197
+ "@types/react": "^18.2.0",
198
+ "@types/react-dom": "^18.2.0",
199
+ "@vitest/coverage-v8": "^4.1.8",
200
+ "esbuild": "^0.25.0",
201
+ "jsdom": "29.1.1",
202
+ "react": "^18.2.0",
203
+ "react-dom": "^18.2.0",
204
+ "typescript": "^6.0.3",
205
+ "vitest": "^4.1.8"
206
+ },
207
+ "packageManager": "pnpm@10.30.3+sha512.c961d1e0a2d8e354ecaa5166b822516668b7f44cb5bd95122d590dd81922f606f5473b6d23ec4a5be05e7fcd18e8488d47d978bbe981872f1145d06e9a740017"
208
+ }