@awiki/dsh-pap 0.0.0-stage → 0.1.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.
- package/LICENSE +202 -0
- package/README.md +197 -2
- package/cordis.patch.yml +15 -0
- package/docs/verification.md +217 -0
- package/lib/auth-challenge.d.ts +19 -0
- package/lib/auth-challenge.js +136 -0
- package/lib/browser-client.js +65 -0
- package/lib/browser-client.js.map +6 -0
- package/lib/callback-handoff.d.ts +55 -0
- package/lib/callback-handoff.js +33 -0
- package/lib/client/controller.d.ts +107 -0
- package/lib/client/controller.js +106 -0
- package/lib/client/index.d.ts +6 -0
- package/lib/client/index.js +28 -0
- package/lib/client/views.d.ts +5 -0
- package/lib/client/views.js +28 -0
- package/lib/client.d.ts +108 -0
- package/lib/client.js +833 -0
- package/lib/cooldown.d.ts +11 -0
- package/lib/cooldown.js +88 -0
- package/lib/credential-history.d.ts +33 -0
- package/lib/credential-history.js +109 -0
- package/lib/delegation.d.ts +16 -0
- package/lib/delegation.js +59 -0
- package/lib/discovery.d.ts +8 -0
- package/lib/discovery.js +227 -0
- package/lib/errors.d.ts +14 -0
- package/lib/errors.js +17 -0
- package/lib/file-secrets.d.ts +14 -0
- package/lib/file-secrets.js +148 -0
- package/lib/host-secrets.d.ts +16 -0
- package/lib/host-secrets.js +22 -0
- package/lib/host.d.ts +83 -0
- package/lib/host.js +1 -0
- package/lib/index.d.ts +21 -0
- package/lib/index.js +13 -0
- package/lib/keyring.d.ts +10 -0
- package/lib/keyring.js +64 -0
- package/lib/management-remote.d.ts +13 -0
- package/lib/management-remote.js +69 -0
- package/lib/network.d.ts +23 -0
- package/lib/network.js +91 -0
- package/lib/plugin.d.ts +75 -0
- package/lib/plugin.js +473 -0
- package/lib/product-api.d.ts +89 -0
- package/lib/product-api.js +25 -0
- package/lib/product-operations.d.ts +16 -0
- package/lib/product-operations.js +120 -0
- package/lib/protocol-adapter.d.ts +90 -0
- package/lib/protocol-adapter.js +75 -0
- package/lib/remote.d.ts +3 -0
- package/lib/remote.js +17 -0
- package/lib/store.d.ts +14 -0
- package/lib/store.js +128 -0
- package/lib/strict-json.d.ts +2 -0
- package/lib/strict-json.js +111 -0
- package/lib/tools.d.ts +5 -0
- package/lib/tools.js +29 -0
- package/lib/types.d.ts +202 -0
- package/lib/types.js +1 -0
- package/lib/util.d.ts +17 -0
- package/lib/util.js +66 -0
- package/package.json +155 -4
package/lib/types.d.ts
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
export type JsonObject = Record<string, unknown>;
|
|
2
|
+
export interface IdentityRef {
|
|
3
|
+
readonly storeId: string;
|
|
4
|
+
readonly identityId: string;
|
|
5
|
+
readonly did: string;
|
|
6
|
+
}
|
|
7
|
+
export interface Binding {
|
|
8
|
+
readonly identityRef: IdentityRef;
|
|
9
|
+
readonly ownerRef: string;
|
|
10
|
+
readonly clientId: string;
|
|
11
|
+
}
|
|
12
|
+
export interface PublicJwk {
|
|
13
|
+
kty: 'EC';
|
|
14
|
+
crv: 'P-256';
|
|
15
|
+
x: string;
|
|
16
|
+
y: string;
|
|
17
|
+
}
|
|
18
|
+
export interface KeyScope {
|
|
19
|
+
owner: string;
|
|
20
|
+
company_id: string;
|
|
21
|
+
user_id: string;
|
|
22
|
+
account_slot?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface KeyRef {
|
|
25
|
+
handle: string;
|
|
26
|
+
purpose: 'pap_session' | 'pap_dpop';
|
|
27
|
+
generation: number;
|
|
28
|
+
public_jwk: PublicJwk;
|
|
29
|
+
thumbprint: string;
|
|
30
|
+
}
|
|
31
|
+
export interface Route {
|
|
32
|
+
method: string;
|
|
33
|
+
template: string;
|
|
34
|
+
resource: string;
|
|
35
|
+
channel?: 'openapi' | 'mcp' | 'poppy';
|
|
36
|
+
parameters?: {
|
|
37
|
+
name: string;
|
|
38
|
+
in: 'path' | 'query';
|
|
39
|
+
required: boolean;
|
|
40
|
+
}[];
|
|
41
|
+
}
|
|
42
|
+
export interface ProductOperationApproval {
|
|
43
|
+
companyRef: string;
|
|
44
|
+
method: string;
|
|
45
|
+
template: string;
|
|
46
|
+
resource: string;
|
|
47
|
+
sessionRef: string;
|
|
48
|
+
scopes: string[];
|
|
49
|
+
generation: number;
|
|
50
|
+
}
|
|
51
|
+
export interface AsMetadata {
|
|
52
|
+
issuer: string;
|
|
53
|
+
authorization_endpoint?: string;
|
|
54
|
+
token_endpoint: string;
|
|
55
|
+
revocation_endpoint?: string;
|
|
56
|
+
grant_types_supported: string[];
|
|
57
|
+
token_endpoint_auth_methods_supported?: string[];
|
|
58
|
+
dpop_signing_alg_values_supported?: string[];
|
|
59
|
+
protected_resources: string[];
|
|
60
|
+
code_challenge_methods_supported?: string[];
|
|
61
|
+
}
|
|
62
|
+
export interface Company {
|
|
63
|
+
ref: string;
|
|
64
|
+
domain: string;
|
|
65
|
+
name: string;
|
|
66
|
+
companyId: string;
|
|
67
|
+
issuer?: string;
|
|
68
|
+
authDisabled: boolean;
|
|
69
|
+
authMode: 'no_as' | 'account' | 'disabled';
|
|
70
|
+
metadata?: AsMetadata;
|
|
71
|
+
routes: Route[];
|
|
72
|
+
scopes: string[];
|
|
73
|
+
metadataDigest: string;
|
|
74
|
+
expiresAt: number;
|
|
75
|
+
generation: number;
|
|
76
|
+
sources: {
|
|
77
|
+
url: string;
|
|
78
|
+
digest: string;
|
|
79
|
+
}[];
|
|
80
|
+
}
|
|
81
|
+
export interface Subject {
|
|
82
|
+
ref: string;
|
|
83
|
+
companyRef: string;
|
|
84
|
+
companyId: string;
|
|
85
|
+
binding: Binding;
|
|
86
|
+
mode: 'regular' | 'anonymous';
|
|
87
|
+
userId: string;
|
|
88
|
+
agentId?: string;
|
|
89
|
+
}
|
|
90
|
+
export interface Session {
|
|
91
|
+
ref: string;
|
|
92
|
+
subjectRef: string;
|
|
93
|
+
sid: string;
|
|
94
|
+
accountSlot?: string;
|
|
95
|
+
generation: number;
|
|
96
|
+
connected: boolean;
|
|
97
|
+
}
|
|
98
|
+
export interface Delegation {
|
|
99
|
+
subjectRef: string;
|
|
100
|
+
key: KeyRef;
|
|
101
|
+
compact: string;
|
|
102
|
+
expiresAt: number;
|
|
103
|
+
generation: number;
|
|
104
|
+
}
|
|
105
|
+
export interface Grant {
|
|
106
|
+
ref: string;
|
|
107
|
+
subjectRef: string;
|
|
108
|
+
accountSlot: string;
|
|
109
|
+
issuer: string;
|
|
110
|
+
clientId: string;
|
|
111
|
+
resource: string;
|
|
112
|
+
scope: string[];
|
|
113
|
+
accessToken: string;
|
|
114
|
+
refreshToken?: string;
|
|
115
|
+
tokenType: 'Bearer' | 'DPoP';
|
|
116
|
+
dpopKey?: KeyRef;
|
|
117
|
+
expiresAt?: number;
|
|
118
|
+
usableUntil: number;
|
|
119
|
+
generation: number;
|
|
120
|
+
accountEpoch: number;
|
|
121
|
+
status: 'active' | 'refreshing' | 'uncertain' | 'reauthorization_required' | 'revocation_pending' | 'signed_out';
|
|
122
|
+
}
|
|
123
|
+
export interface AuthTransaction {
|
|
124
|
+
ref: string;
|
|
125
|
+
subjectRef: string;
|
|
126
|
+
accountSlot: string;
|
|
127
|
+
issuer: string;
|
|
128
|
+
clientId: string;
|
|
129
|
+
redirectUri: string;
|
|
130
|
+
state: string;
|
|
131
|
+
verifier: string;
|
|
132
|
+
resource: string;
|
|
133
|
+
scope: string[];
|
|
134
|
+
expiresAt: number;
|
|
135
|
+
accountEpoch: number;
|
|
136
|
+
exchangeInFlight?: boolean;
|
|
137
|
+
status: 'pending' | 'exchanging' | 'consumed' | 'failed' | 'cancelled';
|
|
138
|
+
dpopKey?: KeyRef;
|
|
139
|
+
callbackRef?: string;
|
|
140
|
+
}
|
|
141
|
+
export interface PapState {
|
|
142
|
+
schemaVersion: 1;
|
|
143
|
+
generation: number;
|
|
144
|
+
companies: Record<string, Company>;
|
|
145
|
+
subjects: Record<string, Subject>;
|
|
146
|
+
sessions: Record<string, Session>;
|
|
147
|
+
delegations: Record<string, Delegation>;
|
|
148
|
+
grants: Record<string, Grant>;
|
|
149
|
+
transactions: Record<string, AuthTransaction>;
|
|
150
|
+
nonces: Record<string, string>;
|
|
151
|
+
cooldowns: Record<string, {
|
|
152
|
+
notBeforeMs: string;
|
|
153
|
+
generation: number;
|
|
154
|
+
}>;
|
|
155
|
+
accountSlots: Record<string, {
|
|
156
|
+
subjectRef: string;
|
|
157
|
+
epoch: number;
|
|
158
|
+
signedOut: boolean;
|
|
159
|
+
}>;
|
|
160
|
+
delegationAttempts: Record<string, {
|
|
161
|
+
sequence: number;
|
|
162
|
+
status: 'reserved' | 'issued' | 'failed';
|
|
163
|
+
}>;
|
|
164
|
+
retirements: Record<string, {
|
|
165
|
+
subjectRef: string;
|
|
166
|
+
key: KeyRef;
|
|
167
|
+
}>;
|
|
168
|
+
/** User-managed operation permissions; protected by the same encrypted store and lock. */
|
|
169
|
+
product?: {
|
|
170
|
+
operations: Record<string, ProductOperationApproval>;
|
|
171
|
+
};
|
|
172
|
+
/** Private response-redaction tombstones, stored only inside the AES-GCM state. Never a grant. */
|
|
173
|
+
credentialVault?: {
|
|
174
|
+
version: 1;
|
|
175
|
+
completeness: 'complete' | 'legacy_incomplete';
|
|
176
|
+
entries: Record<string, string>;
|
|
177
|
+
blocked: boolean;
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
export interface Operation {
|
|
181
|
+
url: string;
|
|
182
|
+
method?: string;
|
|
183
|
+
headers?: Record<string, string>;
|
|
184
|
+
body?: string;
|
|
185
|
+
resource?: string;
|
|
186
|
+
scopes?: string[];
|
|
187
|
+
idempotencyKey?: string;
|
|
188
|
+
}
|
|
189
|
+
export interface HttpResponse {
|
|
190
|
+
status: number;
|
|
191
|
+
headers: Record<string, string>;
|
|
192
|
+
body: Uint8Array;
|
|
193
|
+
url: string;
|
|
194
|
+
}
|
|
195
|
+
export interface HttpTransport {
|
|
196
|
+
request(url: string, options?: {
|
|
197
|
+
method?: string;
|
|
198
|
+
headers?: Record<string, string>;
|
|
199
|
+
body?: string;
|
|
200
|
+
signal?: AbortSignal;
|
|
201
|
+
}): Promise<HttpResponse>;
|
|
202
|
+
}
|
package/lib/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/lib/util.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { HttpResponse, JsonObject, KeyScope, Subject } from './types.js';
|
|
2
|
+
export declare const id: (prefix: string) => string;
|
|
3
|
+
export declare const sha256: (value: string | Uint8Array) => string;
|
|
4
|
+
export declare const sha256Hex: (value: string | Uint8Array) => string;
|
|
5
|
+
export declare const scopeFor: (subject: Subject, accountSlot?: string) => KeyScope;
|
|
6
|
+
export declare function object(value: unknown): JsonObject;
|
|
7
|
+
export declare function strings(value: unknown): string[];
|
|
8
|
+
export declare function httpsUrl(value: unknown): URL;
|
|
9
|
+
export declare function htu(value: string): string;
|
|
10
|
+
export declare function parseJson(response: HttpResponse): JsonObject;
|
|
11
|
+
export declare function jwtParts(compact: string): {
|
|
12
|
+
header: JsonObject;
|
|
13
|
+
payload: JsonObject;
|
|
14
|
+
};
|
|
15
|
+
export declare function matchedRoute(template: string, actual: string): boolean;
|
|
16
|
+
/** Explicit PAP account callback lane; this exception never applies to public or resource URLs. */
|
|
17
|
+
export declare function isPapLoopbackRedirect(value: string): boolean;
|
package/lib/util.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { createHash, randomBytes } from 'node:crypto';
|
|
2
|
+
import { strictJson } from './strict-json.js';
|
|
3
|
+
import { PapError, requirePap } from './errors.js';
|
|
4
|
+
export const id = (prefix) => `${prefix}_${randomBytes(24).toString('base64url')}`;
|
|
5
|
+
export const sha256 = (value) => createHash('sha256').update(value).digest('base64url');
|
|
6
|
+
export const sha256Hex = (value) => createHash('sha256').update(value).digest('hex');
|
|
7
|
+
export const scopeFor = (subject, accountSlot) => ({ owner: subject.binding.ownerRef, company_id: subject.companyId, user_id: subject.userId, ...(accountSlot ? { account_slot: accountSlot } : {}) });
|
|
8
|
+
export function object(value) {
|
|
9
|
+
requirePap(value && typeof value === 'object' && !Array.isArray(value), 'discovery_failed');
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
export function strings(value) {
|
|
13
|
+
requirePap(Array.isArray(value) && value.every(x => typeof x === 'string'), 'discovery_failed');
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
export function httpsUrl(value) {
|
|
17
|
+
requirePap(typeof value === 'string', 'unsafe_destination');
|
|
18
|
+
let url;
|
|
19
|
+
try {
|
|
20
|
+
url = new URL(value);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
throw new PapError('unsafe_destination');
|
|
24
|
+
}
|
|
25
|
+
requirePap(url.protocol === 'https:' && !url.username && !url.password && !url.hash, 'unsafe_destination');
|
|
26
|
+
return url;
|
|
27
|
+
}
|
|
28
|
+
export function htu(value) { const url = httpsUrl(value); url.search = ''; return url.href; }
|
|
29
|
+
export function parseJson(response) {
|
|
30
|
+
try {
|
|
31
|
+
const mediaType = response.headers['content-type']?.split(';')[0]?.trim().toLowerCase();
|
|
32
|
+
requirePap(mediaType && ['application/json', 'application/problem+json', 'application/vnd.oai.openapi+json', 'application/openapi+json'].includes(mediaType), 'discovery_failed');
|
|
33
|
+
return object(strictJson(response.body));
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
throw new PapError('discovery_failed');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export function jwtParts(compact) {
|
|
40
|
+
try {
|
|
41
|
+
const parts = compact.split('.');
|
|
42
|
+
requirePap(compact.length <= 131072 && parts.length === 3 && parts.every(part => /^[A-Za-z0-9_-]+$/.test(part) && Buffer.from(part, 'base64url').toString('base64url') === part), 'delegation_blocked');
|
|
43
|
+
return { header: object(strictJson(Buffer.from(parts[0], 'base64url'), 32768)), payload: object(strictJson(Buffer.from(parts[1], 'base64url'), 16384)) };
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
throw new PapError('delegation_blocked');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export function matchedRoute(template, actual) {
|
|
50
|
+
const expected = httpsUrl(template.replace(/\{[^{}]+\}/g, '__pap_parameter__'));
|
|
51
|
+
const url = httpsUrl(actual);
|
|
52
|
+
if (url.origin !== expected.origin || /%2f|%5c|\\/i.test(url.pathname))
|
|
53
|
+
return false;
|
|
54
|
+
const parts = expected.pathname.split('/');
|
|
55
|
+
const got = url.pathname.split('/');
|
|
56
|
+
return got.length === parts.length && parts.every((part, index) => part === '__pap_parameter__' ? Boolean(got[index]) && !['.', '..'].includes(got[index]) : part === got[index]);
|
|
57
|
+
}
|
|
58
|
+
/** Explicit PAP account callback lane; this exception never applies to public or resource URLs. */
|
|
59
|
+
export function isPapLoopbackRedirect(value) {
|
|
60
|
+
if (typeof value !== 'string' || value.length > 2048 || /[^\x21-\x7e]|\\/.test(value) || /%(?![0-9a-fA-F]{2})/.test(value))
|
|
61
|
+
return false;
|
|
62
|
+
const match = value.match(/^http:\/\/(?:127\.0\.0\.1|\[::1\]):([1-9][0-9]{0,4})(\/[^?#]*)$/);
|
|
63
|
+
if (!match || Number(match[1]) > 65535)
|
|
64
|
+
return false;
|
|
65
|
+
return match[2].split('/').every(segment => !['.', '..'].includes(segment.replace(/%2e/gi, '.')));
|
|
66
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,157 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@awiki/dsh-pap",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Local-custody PAP 0.3 client for DeepSeek Harness",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"main": "lib/index.js",
|
|
8
|
+
"types": "lib/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": "./lib/index.js",
|
|
11
|
+
"./host": "./lib/host.js",
|
|
12
|
+
"./plugin": "./lib/plugin.js",
|
|
13
|
+
"./host-secrets": "./lib/host-secrets.js",
|
|
14
|
+
"./file-secrets": "./lib/file-secrets.js",
|
|
15
|
+
"./management-remote": "./lib/management-remote.js",
|
|
16
|
+
"./remote": "./lib/remote.js",
|
|
17
|
+
"./tools": "./lib/tools.js",
|
|
18
|
+
"./product-api": "./lib/product-api.js",
|
|
19
|
+
"./client": {
|
|
20
|
+
"types": "./lib/client/index.d.ts",
|
|
21
|
+
"default": "./lib/browser-client.js"
|
|
22
|
+
},
|
|
23
|
+
"./package.json": "./package.json",
|
|
24
|
+
"./cordis.patch.yml": "./cordis.patch.yml"
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"lib",
|
|
28
|
+
"README.md",
|
|
29
|
+
"cordis.patch.yml",
|
|
30
|
+
"docs"
|
|
31
|
+
],
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build": "tsc -p tsconfig.json && node scripts/build-client.mjs",
|
|
34
|
+
"typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json --noEmit",
|
|
35
|
+
"test": "npm run build && tsx --test tests/*.test.ts",
|
|
36
|
+
"test:native-component": "tsx scripts/native-component.ts",
|
|
37
|
+
"test:frontvia-component": "tsx scripts/frontvia-component.ts",
|
|
38
|
+
"test:callback-component": "tsx scripts/callback-component.ts",
|
|
39
|
+
"test:native-account-component": "tsx scripts/native-frontvia-component.ts",
|
|
40
|
+
"test:keyring-container": "node scripts/keyring-container/run.mjs",
|
|
41
|
+
"test:p22": "npm run typecheck && tsx --test tests/cooldown-challenge.test.ts tests/client.test.ts tests/network-store.test.ts",
|
|
42
|
+
"test:relay-native-account-component": "tsx scripts/relay-native-frontvia-component.ts",
|
|
43
|
+
"test:product": "tsx --test tests/product.test.ts",
|
|
44
|
+
"test:client": "npm run build && tsx --test tests/client-ui.test.ts",
|
|
45
|
+
"test:product-native-component": "tsx scripts/product-native-component.ts",
|
|
46
|
+
"test:sidecar": "npm run build && tsx scripts/secret-service-sidecar-component.ts",
|
|
47
|
+
"test:product-account-component": "tsx scripts/product-account-component.ts",
|
|
48
|
+
"prepack": "npm run build"
|
|
49
|
+
},
|
|
50
|
+
"dependencies": {
|
|
51
|
+
"proper-lockfile": "4.1.2",
|
|
52
|
+
"zod": "4.6.2"
|
|
53
|
+
},
|
|
54
|
+
"peerDependencies": {
|
|
55
|
+
"@deepseek-ai/cordis": "4.1.0",
|
|
56
|
+
"@deepseek-ai/dsh-tools": "0.2.2-rc.1",
|
|
57
|
+
"@deepseek-ai/dsh-typert-protocol": "0.2.2-rc.1",
|
|
58
|
+
"@deepseek-ai/dsh-typert-registry": "0.2.2-rc.1",
|
|
59
|
+
"@deepseek-ai/dsh-api-remotes": "0.2.2-rc.1",
|
|
60
|
+
"@deepseek-ai/dsh-client-connection": "0.2.2-rc.1",
|
|
61
|
+
"@deepseek-ai/dsh-client-ui-renderer": "0.2.2-rc.1",
|
|
62
|
+
"@deepseek-ai/dsh-client-ui-layout": "0.2.2-rc.1",
|
|
63
|
+
"@deepseek-ai/dsh-client-ui-settings": "0.2.2-rc.1",
|
|
64
|
+
"@deepseek-ai/dsh-client-ui-slots": "0.2.2-rc.1",
|
|
65
|
+
"react": "18.3.1"
|
|
66
|
+
},
|
|
67
|
+
"devDependencies": {
|
|
68
|
+
"@deepseek-ai/cordis": "4.1.0",
|
|
69
|
+
"@deepseek-ai/cordis-plugin-loader": "1.1.0",
|
|
70
|
+
"@deepseek-ai/dsh-api-remotes": "0.2.2-rc.1",
|
|
71
|
+
"@deepseek-ai/dsh-client-connection": "0.2.2-rc.1",
|
|
72
|
+
"@deepseek-ai/dsh-client-store": "0.2.2-rc.1",
|
|
73
|
+
"@deepseek-ai/dsh-client-ui-layout": "0.2.2-rc.1",
|
|
74
|
+
"@deepseek-ai/dsh-client-ui-renderer": "0.2.2-rc.1",
|
|
75
|
+
"@deepseek-ai/dsh-client-ui-settings": "0.2.2-rc.1",
|
|
76
|
+
"@deepseek-ai/dsh-client-ui-slots": "0.2.2-rc.1",
|
|
77
|
+
"@deepseek-ai/dsh-typert-protocol": "0.2.2-rc.1",
|
|
78
|
+
"@deepseek-ai/dsh-typert-registry": "0.2.2-rc.1",
|
|
79
|
+
"@testing-library/dom": "10.4.1",
|
|
80
|
+
"@testing-library/react": "16.3.1",
|
|
81
|
+
"@types/jsdom": "21.1.7",
|
|
82
|
+
"@types/node": "24.3.0",
|
|
83
|
+
"@types/proper-lockfile": "4.1.4",
|
|
84
|
+
"@types/react": "18.3.31",
|
|
85
|
+
"@types/react-dom": "18.3.7",
|
|
86
|
+
"esbuild": "0.25.12",
|
|
87
|
+
"jsdom": "26.1.0",
|
|
88
|
+
"react": "18.3.1",
|
|
89
|
+
"react-dom": "18.3.1",
|
|
90
|
+
"tsx": "4.20.6",
|
|
91
|
+
"typescript": "6.0.3",
|
|
92
|
+
"zod": "4.6.2"
|
|
93
|
+
},
|
|
94
|
+
"engines": {
|
|
95
|
+
"node": "^22.19.0 || >=24.0.0"
|
|
96
|
+
},
|
|
97
|
+
"dsh": {
|
|
98
|
+
"bundle": {
|
|
99
|
+
"patch": "./cordis.patch.yml"
|
|
100
|
+
},
|
|
101
|
+
"client": {
|
|
102
|
+
"platform": "web",
|
|
103
|
+
"inject": [
|
|
104
|
+
"@deepseek-ai/dsh-client-ui-renderer",
|
|
105
|
+
"@deepseek-ai/dsh-api-remotes",
|
|
106
|
+
"@deepseek-ai/dsh-client-connection",
|
|
107
|
+
"@deepseek-ai/dsh-client-ui-layout",
|
|
108
|
+
"@deepseek-ai/dsh-client-ui-settings"
|
|
109
|
+
]
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
"peerDependenciesMeta": {
|
|
113
|
+
"@deepseek-ai/dsh-typert-protocol": {
|
|
114
|
+
"optional": true
|
|
115
|
+
},
|
|
116
|
+
"@deepseek-ai/dsh-typert-registry": {
|
|
117
|
+
"optional": true
|
|
118
|
+
},
|
|
119
|
+
"@deepseek-ai/dsh-tools": {
|
|
120
|
+
"optional": true
|
|
121
|
+
},
|
|
122
|
+
"@deepseek-ai/dsh-api-remotes": {
|
|
123
|
+
"optional": true
|
|
124
|
+
},
|
|
125
|
+
"@deepseek-ai/dsh-client-connection": {
|
|
126
|
+
"optional": true
|
|
127
|
+
},
|
|
128
|
+
"@deepseek-ai/dsh-client-ui-renderer": {
|
|
129
|
+
"optional": true
|
|
130
|
+
},
|
|
131
|
+
"@deepseek-ai/dsh-client-ui-layout": {
|
|
132
|
+
"optional": true
|
|
133
|
+
},
|
|
134
|
+
"@deepseek-ai/dsh-client-ui-settings": {
|
|
135
|
+
"optional": true
|
|
136
|
+
},
|
|
137
|
+
"@deepseek-ai/dsh-client-ui-slots": {
|
|
138
|
+
"optional": true
|
|
139
|
+
},
|
|
140
|
+
"react": {
|
|
141
|
+
"optional": true
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
"publishConfig": {
|
|
145
|
+
"access": "public",
|
|
146
|
+
"registry": "https://registry.npmjs.org"
|
|
147
|
+
},
|
|
148
|
+
"repository": {
|
|
149
|
+
"type": "git",
|
|
150
|
+
"url": "https://github.com/AgentConnect/dsh-pap.git"
|
|
151
|
+
},
|
|
152
|
+
"keywords": [
|
|
153
|
+
"pap",
|
|
154
|
+
"deepseek-harness",
|
|
155
|
+
"dsh-plugin"
|
|
156
|
+
]
|
|
157
|
+
}
|