@sparkelf/dsh-plus 0.1.0-rc.9 → 0.2.0-rc.2

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.
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Process lifecycle for one standalone Plus server.
3
+ *
4
+ * A standalone user starts a server and later stops it, so the process outlives the
5
+ * command that started it. This module owns the state that makes that possible: a
6
+ * pid file beside the profile, an availability probe for the port, and the port
7
+ * search that keeps a second instance usable without asking the user to pick one.
8
+ */
9
+ /** Default port a standalone server binds when the user names none. */
10
+ export declare const DEFAULT_PORT = 3080;
11
+ /** How many consecutive ports to try before reporting that none is free. */
12
+ export declare const PORT_SEARCH_LIMIT = 10;
13
+ /** Milliseconds to wait for a stopped server to exit before forcing it. */
14
+ export declare const STOP_GRACE_MILLISECONDS = 10000;
15
+ /** Recorded state of the running server. */
16
+ export interface ServerState {
17
+ /** Process id of the running server. */
18
+ readonly pid: number;
19
+ /** Port the server bound. */
20
+ readonly port: number;
21
+ /** URL the browser opens. */
22
+ readonly url: string;
23
+ }
24
+ /** Where one installation keeps its runtime state. */
25
+ export declare function stateDirectory(home: string): string;
26
+ /** Whether a process with this id exists and is signalable. */
27
+ export declare function isRunning(pid: number): boolean;
28
+ /** Read the recorded server state, or undefined when absent or its process is gone. */
29
+ export declare function readState(home: string): ServerState | undefined;
30
+ /** Record the running server, replacing any previous record. */
31
+ export declare function writeState(home: string, state: ServerState): void;
32
+ /** Remove the recorded state, whether or not a process still matches it. */
33
+ export declare function clearState(home: string): void;
34
+ /** Whether a TCP port on the loopback interface can be bound. */
35
+ export declare function portAvailable(port: number, host?: string): Promise<boolean>;
36
+ /**
37
+ * The first free port at or after `preferred`, so one occupied port never blocks a
38
+ * start the way a bare bind failure would.
39
+ *
40
+ * @param preferred - port the user asked for, or the default.
41
+ * @returns the chosen port, or undefined when the whole search window is occupied.
42
+ */
43
+ export declare function choosePort(preferred: number, host?: string): Promise<number | undefined>;
44
+ /** Start a detached server process and return its id. */
45
+ export declare function spawnServer(options: {
46
+ readonly command: string;
47
+ readonly args: readonly string[];
48
+ readonly env: NodeJS.ProcessEnv;
49
+ readonly logPath: string;
50
+ }): number;
51
+ /**
52
+ * Wait until the server answers, so a start reports success only once the URL works.
53
+ *
54
+ * @param url - URL to poll.
55
+ * @param timeoutMilliseconds - how long to keep polling.
56
+ * @returns whether the server answered within the budget.
57
+ */
58
+ export declare function waitForServer(url: string, timeoutMilliseconds: number): Promise<boolean>;
59
+ /**
60
+ * Wait until the launcher's log carries the authenticated URL.
61
+ *
62
+ * Readiness and the printed line are separate events: the server answers before the
63
+ * launcher finishes its own startup, so the log is polled here rather than read once.
64
+ *
65
+ * @param logPath - the launcher's log file.
66
+ * @param timeoutMilliseconds - how long to keep polling.
67
+ * @returns the printed URL, or undefined when it never appeared.
68
+ */
69
+ export declare function waitForAuthenticatedUrl(logPath: string, timeoutMilliseconds: number): Promise<string | undefined>;
70
+ //# sourceMappingURL=standalone-server.d.ts.map
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Process lifecycle for one standalone Plus server.
3
+ *
4
+ * A standalone user starts a server and later stops it, so the process outlives the
5
+ * command that started it. This module owns the state that makes that possible: a
6
+ * pid file beside the profile, an availability probe for the port, and the port
7
+ * search that keeps a second instance usable without asking the user to pick one.
8
+ */
9
+ import { spawn } from 'node:child_process';
10
+ import { createWriteStream, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
11
+ import { createServer } from 'node:net';
12
+ import { dirname, join } from 'node:path';
13
+ /** Default port a standalone server binds when the user names none. */
14
+ export const DEFAULT_PORT = 3080;
15
+ /** How many consecutive ports to try before reporting that none is free. */
16
+ export const PORT_SEARCH_LIMIT = 10;
17
+ /** Milliseconds to wait for a stopped server to exit before forcing it. */
18
+ export const STOP_GRACE_MILLISECONDS = 10_000;
19
+ /** Where one installation keeps its runtime state. */
20
+ export function stateDirectory(home) {
21
+ return join(home, 'standalone');
22
+ }
23
+ function statePath(home) {
24
+ return join(stateDirectory(home), 'server.json');
25
+ }
26
+ /** Whether a process with this id exists and is signalable. */
27
+ export function isRunning(pid) {
28
+ try {
29
+ process.kill(pid, 0);
30
+ return true;
31
+ }
32
+ catch {
33
+ return false;
34
+ }
35
+ }
36
+ /** Read the recorded server state, or undefined when absent or its process is gone. */
37
+ export function readState(home) {
38
+ const path = statePath(home);
39
+ if (!existsSync(path))
40
+ return undefined;
41
+ let parsed;
42
+ try {
43
+ parsed = JSON.parse(readFileSync(path, 'utf8'));
44
+ }
45
+ catch {
46
+ return undefined;
47
+ }
48
+ if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed))
49
+ return undefined;
50
+ const record = parsed;
51
+ const pid = record.pid;
52
+ const port = record.port;
53
+ const url = record.url;
54
+ if (typeof pid !== 'number' || typeof port !== 'number' || typeof url !== 'string')
55
+ return undefined;
56
+ if (!isRunning(pid))
57
+ return undefined;
58
+ return { pid, port, url };
59
+ }
60
+ /** Record the running server, replacing any previous record. */
61
+ export function writeState(home, state) {
62
+ mkdirSync(stateDirectory(home), { recursive: true });
63
+ writeFileSync(statePath(home), JSON.stringify(state, null, 2) + '\n');
64
+ }
65
+ /** Remove the recorded state, whether or not a process still matches it. */
66
+ export function clearState(home) {
67
+ rmSync(statePath(home), { force: true });
68
+ }
69
+ /** Whether a TCP port on the loopback interface can be bound. */
70
+ export function portAvailable(port, host = '127.0.0.1') {
71
+ return new Promise((resolveAvailability) => {
72
+ const probe = createServer();
73
+ probe.once('error', () => { resolveAvailability(false); });
74
+ probe.once('listening', () => { probe.close(() => { resolveAvailability(true); }); });
75
+ probe.listen(port, host);
76
+ });
77
+ }
78
+ /**
79
+ * The first free port at or after `preferred`, so one occupied port never blocks a
80
+ * start the way a bare bind failure would.
81
+ *
82
+ * @param preferred - port the user asked for, or the default.
83
+ * @returns the chosen port, or undefined when the whole search window is occupied.
84
+ */
85
+ export async function choosePort(preferred, host = '127.0.0.1') {
86
+ for (let offset = 0; offset < PORT_SEARCH_LIMIT; offset += 1) {
87
+ const candidate = preferred + offset;
88
+ if (await portAvailable(candidate, host))
89
+ return candidate;
90
+ }
91
+ return undefined;
92
+ }
93
+ /** Start a detached server process and return its id. */
94
+ export function spawnServer(options) {
95
+ mkdirSync(dirname(options.logPath), { recursive: true });
96
+ const output = spawn(options.command, [...options.args], {
97
+ detached: true,
98
+ stdio: ['ignore', 'pipe', 'pipe'],
99
+ env: options.env,
100
+ });
101
+ const stream = createWriteStream(options.logPath);
102
+ output.stdout?.pipe(stream);
103
+ output.stderr?.pipe(stream);
104
+ output.unref();
105
+ if (output.pid === undefined)
106
+ throw new Error('the server process did not start');
107
+ return output.pid;
108
+ }
109
+ /**
110
+ * Wait until the server answers, so a start reports success only once the URL works.
111
+ *
112
+ * @param url - URL to poll.
113
+ * @param timeoutMilliseconds - how long to keep polling.
114
+ * @returns whether the server answered within the budget.
115
+ */
116
+ export async function waitForServer(url, timeoutMilliseconds) {
117
+ const deadline = Date.now() + timeoutMilliseconds;
118
+ while (Date.now() < deadline) {
119
+ try {
120
+ await fetch(url, { method: 'GET', redirect: 'manual' });
121
+ return true;
122
+ }
123
+ catch {
124
+ await new Promise((resolveDelay) => { setTimeout(resolveDelay, 250); });
125
+ }
126
+ }
127
+ return false;
128
+ }
129
+ /**
130
+ * Wait until the launcher's log carries the authenticated URL.
131
+ *
132
+ * Readiness and the printed line are separate events: the server answers before the
133
+ * launcher finishes its own startup, so the log is polled here rather than read once.
134
+ *
135
+ * @param logPath - the launcher's log file.
136
+ * @param timeoutMilliseconds - how long to keep polling.
137
+ * @returns the printed URL, or undefined when it never appeared.
138
+ */
139
+ export async function waitForAuthenticatedUrl(logPath, timeoutMilliseconds) {
140
+ const deadline = Date.now() + timeoutMilliseconds;
141
+ for (;;) {
142
+ let text = '';
143
+ try {
144
+ text = readFileSync(logPath, 'utf8');
145
+ }
146
+ catch {
147
+ // The launcher creates the log before it prints, so an absent file is a race
148
+ // with its first write rather than an error to report.
149
+ }
150
+ const found = /dsh web: (http:\/\/\S+)/u.exec(text);
151
+ if (found?.[1] !== undefined)
152
+ return found[1];
153
+ if (Date.now() >= deadline)
154
+ return undefined;
155
+ await new Promise((resolveDelay) => { setTimeout(resolveDelay, 250); });
156
+ }
157
+ }
158
+ //# sourceMappingURL=standalone-server.js.map
package/package.json CHANGED
@@ -1,111 +1,169 @@
1
1
  {
2
- "name": "@sparkelf/dsh-plus",
3
- "description": "DeepSeek Harness Plus official-base Web distribution profile and ranged compatibility patchset",
4
- "version": "0.1.0-rc.9",
5
- "publishConfig": {
6
- "access": "public"
2
+ "bin": {
3
+ "dsh-plus": "lib/bin.js"
7
4
  },
8
- "repository": {
9
- "type": "git",
10
- "url": "git+https://github.com/SparkElf/deepseek-harness-plus.git",
11
- "directory": "packages/bundle/plus"
5
+ "dependencies": {
6
+ "@sparkelf/dsh-mobile-bridge": ">=0.2.11",
7
+ "@sparkelf/dsh-patch-better-sidebar-media-path": ">=0.1.0-rc.26",
8
+ "@sparkelf/dsh-patch-browser-auth-mode": ">=0.1.0-rc.26",
9
+ "@sparkelf/dsh-patch-composer-popover-boundaries": ">=0.1.0-rc.26",
10
+ "@sparkelf/dsh-patch-legacy-code-preset": ">=0.1.0-rc.26",
11
+ "@sparkelf/dsh-patch-mobile-journal-generation": ">=0.1.0-rc.26",
12
+ "@sparkelf/dsh-patch-officecli-deliverables": ">=0.1.0-rc.26",
13
+ "@sparkelf/dsh-patch-ptc-mcp-schema-types": ">=0.1.0-rc.26",
14
+ "@sparkelf/dsh-patch-responses-reasoning-status": ">=0.1.0-rc.26",
15
+ "@sparkelf/dsh-patch-session-export-chinese": ">=0.1.0-rc.26",
16
+ "@sparkelf/dsh-patch-session-log-trajectory-toolbar": ">=0.1.0-rc.26",
17
+ "@sparkelf/dsh-patch-subagent-settings-presets": ">=0.1.0-rc.26",
18
+ "@sparkelf/dsh-patch-web-base-path": ">=0.1.0-rc.26",
19
+ "@sparkelf/dsh-patch-workspace-storage-restore": ">=0.1.0-rc.26",
20
+ "@sparkelf/dsh-plugin-backup": ">=0.1.0-rc.26",
21
+ "@sparkelf/dsh-plugin-dataops": ">=0.1.0-rc.26",
22
+ "@sparkelf/dsh-plugin-mcp-credentials": ">=0.1.0-rc.26",
23
+ "@sparkelf/dsh-plugin-subagent-settings": ">=0.1.0-rc.26",
24
+ "dshmarket": ">=1.45.1",
25
+ "semver": ">=7.7.3",
26
+ "yaml": ">=2.9.0"
12
27
  },
13
- "type": "module",
14
- "main": "lib/index.js",
15
- "types": "lib/types/index.d.ts",
16
- "exports": {
17
- ".": {
18
- "types": "./lib/types/index.d.ts",
19
- "default": "./lib/index.js"
20
- },
21
- "./invariant": {
22
- "types": "./lib/types/invariant.d.ts",
23
- "default": "./lib/invariant.js"
24
- },
25
- "./cordis.patch.yml": "./cordis.patch.yml",
26
- "./package.json": "./package.json",
27
- "./apply": {
28
- "types": "./lib/types/apply.d.ts",
29
- "default": "./lib/apply.js"
30
- }
28
+ "description": "DeepSeek Harness Plus official-base Web distribution profile and ranged compatibility patchset",
29
+ "devDependencies": {
30
+ "@changfenhuang/dsh-genui": "0.9.9",
31
+ "@deepseek-ai/cordis": "^4.0.2",
32
+ "@types/semver": ">=7.7.1"
31
33
  },
32
- "files": [
33
- "lib/index.js",
34
- "lib/invariant.js",
35
- "lib/bin.js",
36
- "cordis.patch.yml",
37
- "lib/apply.js",
38
- "lib/types/**/*.d.ts"
39
- ],
40
- "license": "MIT",
41
34
  "dsh": {
42
35
  "bundle": {
43
36
  "patch": "./cordis.patch.yml"
44
37
  }
45
38
  },
46
39
  "dshPlus": {
47
- "formatVersion": 1,
48
40
  "compatibility": {
49
- "dsh": ">=0.1.2-alpha.1"
41
+ "dsh": ">=0.1.6-alpha.1"
50
42
  },
43
+ "formatVersion": 1,
44
+ "patchPackages": [
45
+ "@sparkelf/dsh-patch-better-sidebar-media-path",
46
+ "@sparkelf/dsh-patch-officecli-deliverables",
47
+ "@sparkelf/dsh-patch-browser-auth-mode",
48
+ "@sparkelf/dsh-patch-workspace-storage-restore",
49
+ "@sparkelf/dsh-patch-subagent-settings-presets",
50
+ "@sparkelf/dsh-patch-legacy-code-preset",
51
+ "@sparkelf/dsh-patch-session-export-chinese",
52
+ "@sparkelf/dsh-patch-session-log-trajectory-toolbar",
53
+ "@sparkelf/dsh-patch-responses-reasoning-status",
54
+ "@sparkelf/dsh-patch-ptc-mcp-schema-types",
55
+ "@sparkelf/dsh-patch-web-base-path",
56
+ "@sparkelf/dsh-patch-composer-popover-boundaries",
57
+ "@sparkelf/dsh-patch-mobile-journal-generation"
58
+ ],
51
59
  "profile": {
60
+ "allowBuilds": {
61
+ "@deepseek-ai/dsh-subprocess-local": true,
62
+ "@google/genai": false,
63
+ "@officecli/officecli": true,
64
+ "cpu-features": false,
65
+ "koffi": true,
66
+ "node-pty": true,
67
+ "oracledb": true,
68
+ "protobufjs": false,
69
+ "ssh2": true
70
+ },
52
71
  "bundles": [
53
72
  "@deepseek-ai/dsh-base",
54
73
  "@deepseek-ai/dsh-web-app",
55
- "dsh-better-sidebar",
74
+ "@sparkelf/dsh-mineru",
75
+ "@sparkelf/dsh-officecli",
56
76
  "@sparkelf/dsh-mobile-bridge",
57
77
  "dshmarket",
78
+ "@huanlin/dsh-plugin-better-locale",
79
+ "dsh-better-sidebar",
80
+ "@sparkelf/dsh-plugin-better-sidebar-office",
81
+ "@sparkelf/dsh-office-viewer-fonts",
82
+ "dsh-video-preview",
58
83
  "@changfenhuang/dsh-genui",
59
- "@sparkelf/dsh-plus"
60
- ]
84
+ "@sparkelf/dsh-plugin-supervisor",
85
+ "@sparkelf/dsh-plus",
86
+ "dsh-sql-workbench",
87
+ "@sparkelf/dsh-ssh-manager",
88
+ "@sparkelf/dsh-api-client"
89
+ ],
90
+ "dependencies": {
91
+ "@changfenhuang/dsh-genui": "0.9.9",
92
+ "@huanlin/dsh-plugin-better-locale": "0.4.1",
93
+ "@sparkelf/dsh-api-client": "0.5.1",
94
+ "@sparkelf/dsh-mineru": "0.1.2",
95
+ "@sparkelf/dsh-office-viewer-fonts": "0.1.2",
96
+ "@sparkelf/dsh-officecli": "0.1.2",
97
+ "@sparkelf/dsh-plugin-better-sidebar-office": "0.2.1",
98
+ "@sparkelf/dsh-plugin-supervisor": "0.1.5",
99
+ "@sparkelf/dsh-ssh-manager": "0.7.2",
100
+ "@sparkelf/dsh-workbench-vault": "0.1.2",
101
+ "dsh-better-sidebar": "0.19.1",
102
+ "dsh-sql-workbench": "0.5.1",
103
+ "dsh-video-preview": "0.1.4"
104
+ },
105
+ "overrides": {
106
+ "@deepseek-ai/dsh-agent-presets": "npm:@sparkelf/dsh-agent-presets@0.1.6-alpha.2",
107
+ "@deepseek-ai/dsh-api-gateway": "npm:@sparkelf/dsh-api-gateway@0.1.6-alpha.2",
108
+ "@deepseek-ai/dsh-api-session-controller": "npm:@sparkelf/dsh-api-session-controller@0.1.6-alpha.2",
109
+ "@deepseek-ai/dsh-client-connection": "npm:@sparkelf/dsh-client-connection@0.1.6-alpha.2",
110
+ "@deepseek-ai/dsh-client-ui-agent-preset": "npm:@sparkelf/dsh-client-ui-agent-preset@0.1.6-alpha.2",
111
+ "@deepseek-ai/dsh-client-ui-conversation": "npm:@sparkelf/dsh-client-ui-conversation@0.1.6-alpha.2",
112
+ "@deepseek-ai/dsh-client-ui-deliverables": "npm:@sparkelf/dsh-client-ui-deliverables@0.1.6-alpha.2",
113
+ "@deepseek-ai/dsh-client-ui-layout": "npm:@sparkelf/dsh-client-ui-layout@0.1.6-alpha.2",
114
+ "@deepseek-ai/dsh-client-ui-model-selection": "npm:@sparkelf/dsh-client-ui-model-selection@0.1.6-alpha.2",
115
+ "@deepseek-ai/dsh-client-ui-primitives": "npm:@sparkelf/dsh-client-ui-primitives@0.1.6-alpha.2",
116
+ "@deepseek-ai/dsh-client-ui-settings-models": "npm:@sparkelf/dsh-client-ui-settings-models@0.1.6-alpha.2",
117
+ "@deepseek-ai/dsh-client-ui-trajectory": "npm:@sparkelf/dsh-client-ui-trajectory@0.1.6-alpha.2",
118
+ "@deepseek-ai/dsh-host-frontend-static": "npm:@sparkelf/dsh-host-frontend-static@0.1.6-alpha.2",
119
+ "@deepseek-ai/dsh-host-webserver": "npm:@sparkelf/dsh-host-webserver@0.1.6-alpha.2",
120
+ "@deepseek-ai/dsh-llm-pi-ai": "npm:@sparkelf/dsh-llm-pi-ai@0.1.6-alpha.2",
121
+ "@deepseek-ai/dsh-session-log-export": "npm:@sparkelf/dsh-session-log-export@0.1.6-alpha.2",
122
+ "@deepseek-ai/dsh-tools": "npm:@sparkelf/dsh-tools@0.1.6-alpha.2",
123
+ "@deepseek-ai/dsh-web-app": "npm:@sparkelf/dsh-web-app@0.1.6-alpha.2",
124
+ "@deepseek-ai/dsh-web-frontend": "npm:@sparkelf/dsh-web-frontend@0.1.6-alpha.2",
125
+ "@deepseek-ai/dsh-workspace": "npm:@sparkelf/dsh-workspace@0.1.6-alpha.2"
126
+ }
61
127
  },
62
- "patchPackages": [
63
- "@sparkelf/dsh-patch-better-sidebar-app-frame",
64
- "@sparkelf/dsh-patch-genui-streaming-echart",
65
- "@sparkelf/dsh-patch-mobile-bridge-serialized-actions",
66
- "@sparkelf/dsh-patch-workspace-storage-restore",
67
- "@sparkelf/dsh-patch-subagent-settings-presets",
68
- "@sparkelf/dsh-patch-document-attachments",
69
- "@sparkelf/dsh-patch-responses-reasoning-status",
70
- "@sparkelf/dsh-patch-mobile-web-layout",
71
- "@sparkelf/dsh-patch-web-base-path"
72
- ],
73
128
  "sourceBase": {
74
- "revision": "cd5ef8148158c3a752a658978873241fdf8e2bbc"
129
+ "revision": "0a15e36e7f82b6ed45af6fa9759f29b40dcd965d"
75
130
  }
76
131
  },
77
- "dependencies": {
78
- "@sparkelf/dsh-mobile-bridge": ">=0.2.8",
79
- "@sparkelf/dsh-patch-better-sidebar-app-frame": ">=0.1.0-rc.9",
80
- "@sparkelf/dsh-patch-genui-streaming-echart": ">=0.1.0-rc.9",
81
- "@sparkelf/dsh-patch-mobile-bridge-serialized-actions": ">=0.1.0-rc.9",
82
- "dsh-better-sidebar": ">=0.16.1",
83
- "dshmarket": ">=1.29.2",
84
- "@changfenhuang/dsh-genui": ">=0.9.6",
85
- "@sparkelf/dsh-plugin-backup": ">=0.1.0-rc.9",
86
- "@sparkelf/dsh-patch-workspace-storage-restore": ">=0.1.0-rc.9",
87
- "semver": ">=7.7.3",
88
- "yaml": ">=2.9.0",
89
- "@sparkelf/dsh-plugin-subagent-settings": ">=0.1.0-rc.9",
90
- "@sparkelf/dsh-patch-subagent-settings-presets": ">=0.1.0-rc.9",
91
- "@sparkelf/dsh-plugin-document-attachments": ">=0.1.0-rc.9",
92
- "@sparkelf/dsh-plugin-dataops": ">=0.1.0-rc.9",
93
- "@sparkelf/dsh-plugin-mcp-credentials": ">=0.1.0-rc.9",
94
- "@sparkelf/dsh-patch-mobile-web-layout": ">=0.1.0-rc.9",
95
- "@sparkelf/dsh-patch-web-base-path": ">=0.1.0-rc.9",
96
- "@sparkelf/dsh-patch-document-attachments": ">=0.1.0-rc.9",
97
- "@sparkelf/dsh-patch-responses-reasoning-status": ">=0.1.0-rc.9"
132
+ "exports": {
133
+ ".": {
134
+ "default": "./lib/index.js",
135
+ "types": "./lib/types/index.d.ts"
136
+ },
137
+ "./apply": {
138
+ "default": "./lib/apply.js",
139
+ "types": "./lib/types/apply.d.ts"
140
+ },
141
+ "./cordis.patch.yml": "./cordis.patch.yml",
142
+ "./package.json": "./package.json"
98
143
  },
144
+ "files": [
145
+ "lib/**/*.js",
146
+ "lib/**/*.d.ts",
147
+ "cordis.patch.yml",
148
+ "README.md",
149
+ "README.zh.md",
150
+ "README.i18n.yaml"
151
+ ],
152
+ "license": "MIT",
153
+ "main": "lib/index.js",
154
+ "name": "@sparkelf/dsh-plus",
99
155
  "peerDependencies": {
100
- "@deepseek-ai/cordis": ">=4.0.1",
101
- "@deepseek-ai/dsh-invariants": ">=0.1.2-alpha.1"
156
+ "@deepseek-ai/cordis": ">=4.0.1"
102
157
  },
103
- "devDependencies": {
104
- "@types/semver": ">=7.7.1",
105
- "@deepseek-ai/cordis": "^4.0.1",
106
- "@deepseek-ai/dsh-invariants": "^0.1.2-alpha.1"
158
+ "publishConfig": {
159
+ "access": "public"
107
160
  },
108
- "bin": {
109
- "dsh-plus": "lib/bin.js"
110
- }
111
- }
161
+ "repository": {
162
+ "directory": "packages/bundle/plus",
163
+ "type": "git",
164
+ "url": "git+https://github.com/deepseek-ai/deepseek-harness.git"
165
+ },
166
+ "type": "module",
167
+ "types": "lib/types/index.d.ts",
168
+ "version": "0.2.0-rc.2"
169
+ }
package/lib/invariant.js DELETED
@@ -1,19 +0,0 @@
1
- //#region lib/types/invariant.js
2
- /**
3
- * Package-owned invariant companion for `@sparkelf/dsh-plus`.
4
- * @module @sparkelf/dsh-plus/invariant
5
- */
6
- const PACKAGE_NAME = "@sparkelf/dsh-plus";
7
- /** Cordis companion plugin name. */
8
- const name = "plus-bundle-invariant";
9
- /** Service required before the companion can register. */
10
- const inject = ["invariants"];
11
- const install = () => {};
12
- /**
13
- * Register this package's invariant companion.
14
- * @param ctx - Cordis context carrying the invariant service.
15
- * @returns the installed registration's disposer after setup succeeds.
16
- */
17
- const apply = (ctx) => Promise.resolve(ctx.invariants.register(PACKAGE_NAME, install));
18
- //#endregion
19
- export { apply, inject, name };
@@ -1,16 +0,0 @@
1
- /**
2
- * Package-owned invariant companion for `@sparkelf/dsh-plus`.
3
- * @module @sparkelf/dsh-plus/invariant
4
- */
5
- import type { Context } from '@deepseek-ai/cordis';
6
- /** Cordis companion plugin name. */
7
- export declare const name = "plus-bundle-invariant";
8
- /** Service required before the companion can register. */
9
- export declare const inject: string[];
10
- /**
11
- * Register this package's invariant companion.
12
- * @param ctx - Cordis context carrying the invariant service.
13
- * @returns the installed registration's disposer after setup succeeds.
14
- */
15
- export declare const apply: (ctx: Context) => Promise<() => void>;
16
- //# sourceMappingURL=invariant.d.ts.map