@deepseek-ai/dsh-api-remotes 0.0.1-rc.1
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 +28 -0
- package/README.i18n.yaml +6 -0
- package/README.md +33 -0
- package/README.zh.md +33 -0
- package/lib/client.js +4416 -0
- package/lib/index.js +142 -0
- package/lib/invariant.js +17 -0
- package/lib/types/agent-lookup.d.ts +95 -0
- package/lib/types/client/index.d.ts +20 -0
- package/lib/types/index.d.ts +6 -0
- package/lib/types/invariant.d.ts +13 -0
- package/package.json +73 -0
package/lib/index.js
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { TypeRTLookupFailure } from "@deepseek-ai/dsh-type-meta";
|
|
2
|
+
//#region lib/types/agent-lookup.js
|
|
3
|
+
/** Host BFF policy for resolving Remote Agent and Session identities. */
|
|
4
|
+
/** Cold identity absent from the durable session store. */
|
|
5
|
+
var ApiRemoteSessionNotFound = class extends Error {};
|
|
6
|
+
/** Session identity whose lifecycle belongs to subagent routing. */
|
|
7
|
+
var ApiRemoteSubagentSessionOwnership = class extends Error {
|
|
8
|
+
sessionId;
|
|
9
|
+
/**
|
|
10
|
+
* Construct the ownership fence.
|
|
11
|
+
* @param sessionId - identity reserved to subagent routing.
|
|
12
|
+
*/
|
|
13
|
+
constructor(sessionId) {
|
|
14
|
+
super(`session "${sessionId}" is a subagent session; use subagent delivery`);
|
|
15
|
+
this.sessionId = sessionId;
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Test whether generic Host routing must leave an identity to subagent routing.
|
|
20
|
+
* @param ctx - Host Context carrying the live Agent registry.
|
|
21
|
+
* @param session - attached or live Session metadata.
|
|
22
|
+
* @param agent - live Agent when one is registered.
|
|
23
|
+
* @returns whether generic Remote and legacy API calls must reject the identity.
|
|
24
|
+
*/
|
|
25
|
+
function hasApiRemoteSubagentOwner(ctx, session, agent) {
|
|
26
|
+
if (session.header.origin === "subagent") return true;
|
|
27
|
+
const parentId = session.header.parentSession;
|
|
28
|
+
if (parentId === void 0 || agent === void 0) return false;
|
|
29
|
+
const parent = ctx.agents.get(parentId);
|
|
30
|
+
return parent !== void 0 && ctx.agents.isOwnedBy(agent.id, parent);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Build the stable caller-facing ownership rejection.
|
|
34
|
+
* @param sessionId - identity reserved to subagent routing.
|
|
35
|
+
* @returns the existing `agent-busy` RPC shape.
|
|
36
|
+
*/
|
|
37
|
+
function apiRemoteSubagentOwnershipError(sessionId) {
|
|
38
|
+
return {
|
|
39
|
+
code: "agent-busy",
|
|
40
|
+
message: `session "${sessionId}" is owned by subagent routing`,
|
|
41
|
+
details: { reason: "use subagent delivery for this child session" }
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Inspect one cold served session without repairing, resuming, or publishing it.
|
|
46
|
+
* @param ctx - Host Context carrying the optional persistence provider.
|
|
47
|
+
* @param sessionId - durable identity to inspect.
|
|
48
|
+
* @returns detached metadata and events for a servable session.
|
|
49
|
+
* @throws {@link ApiRemoteSessionNotFound} when the identity has no project-backed session.
|
|
50
|
+
*/
|
|
51
|
+
async function inspectApiRemoteSession(ctx, sessionId) {
|
|
52
|
+
const persistence = ctx.get("sessionPersistence");
|
|
53
|
+
if (persistence === void 0) throw new Error("session persistence is not configured (load a dsh-session-persistence backend)");
|
|
54
|
+
const meta = (await persistence.list()).find((candidate) => candidate.id === sessionId);
|
|
55
|
+
if (meta === void 0 || meta.cwd === void 0) throw new ApiRemoteSessionNotFound(`session "${sessionId}" not found`);
|
|
56
|
+
const inspected = await persistence.inspect(sessionId);
|
|
57
|
+
if (inspected.meta.cwd === void 0) throw new ApiRemoteSessionNotFound(`session "${sessionId}" not found`);
|
|
58
|
+
return {
|
|
59
|
+
meta: inspected.meta,
|
|
60
|
+
events: [...inspected.events]
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Create the Host's shared Agent resolver and configure Agent/Session TypeRT lookups.
|
|
65
|
+
* Live Agents are reused, ordinary cold sessions resume once per identity, and
|
|
66
|
+
* subagent-owned identities retain the legacy `agent-busy` fence.
|
|
67
|
+
* @param ctx - owning Host Context.
|
|
68
|
+
* @param options - defaults and Agent-scope setup used only for cold resume.
|
|
69
|
+
* @returns resolver shared by legacy API Proxy methods and TypeRT lookups.
|
|
70
|
+
*/
|
|
71
|
+
function createApiRemoteAgentResolver(ctx, options) {
|
|
72
|
+
const resumes = /* @__PURE__ */ new Map();
|
|
73
|
+
const fencedLiveAgent = (sessionId) => {
|
|
74
|
+
const live = ctx.agents.get(sessionId);
|
|
75
|
+
if (live === void 0) return void 0;
|
|
76
|
+
if (hasApiRemoteSubagentOwner(ctx, live.session, live)) return { error: apiRemoteSubagentOwnershipError(sessionId) };
|
|
77
|
+
return { agent: live };
|
|
78
|
+
};
|
|
79
|
+
const agentFor = async (sessionId) => {
|
|
80
|
+
const fenced = fencedLiveAgent(sessionId);
|
|
81
|
+
if (fenced !== void 0) return fenced;
|
|
82
|
+
const attached = ctx.sessions.get(sessionId);
|
|
83
|
+
if (attached !== void 0 && hasApiRemoteSubagentOwner(ctx, attached, void 0)) return { error: apiRemoteSubagentOwnershipError(sessionId) };
|
|
84
|
+
let resume = resumes.get(sessionId);
|
|
85
|
+
if (resume === void 0) {
|
|
86
|
+
resume = (async () => {
|
|
87
|
+
try {
|
|
88
|
+
const inspected = await inspectApiRemoteSession(ctx, sessionId);
|
|
89
|
+
if (hasApiRemoteSubagentOwner(ctx, { header: inspected.meta }, void 0)) throw new ApiRemoteSubagentSessionOwnership(sessionId);
|
|
90
|
+
const setup = options.setup === void 0 ? void 0 : await options.setup(inspected);
|
|
91
|
+
const publishedSession = ctx.sessions.get(sessionId);
|
|
92
|
+
const publishedAgent = ctx.agents.get(sessionId);
|
|
93
|
+
if (publishedSession !== void 0 && hasApiRemoteSubagentOwner(ctx, publishedSession, publishedAgent)) throw new ApiRemoteSubagentSessionOwnership(sessionId);
|
|
94
|
+
return (await ctx.agents.resume({
|
|
95
|
+
resumeSessionId: sessionId,
|
|
96
|
+
...options.agentOptions === void 0 ? {} : { agentOptions: options.agentOptions() },
|
|
97
|
+
...setup === void 0 ? {} : { setup }
|
|
98
|
+
})).agent;
|
|
99
|
+
} finally {
|
|
100
|
+
resumes.delete(sessionId);
|
|
101
|
+
}
|
|
102
|
+
})();
|
|
103
|
+
resumes.set(sessionId, resume);
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
return { agent: await resume };
|
|
107
|
+
} catch (error) {
|
|
108
|
+
if (error instanceof ApiRemoteSessionNotFound) return { error: {
|
|
109
|
+
code: "session-not-found",
|
|
110
|
+
message: error.message,
|
|
111
|
+
details: { sessionId }
|
|
112
|
+
} };
|
|
113
|
+
if (error instanceof ApiRemoteSubagentSessionOwnership) return { error: apiRemoteSubagentOwnershipError(error.sessionId) };
|
|
114
|
+
const fenced = fencedLiveAgent(sessionId);
|
|
115
|
+
if (fenced !== void 0) return fenced;
|
|
116
|
+
const attached = ctx.sessions.get(sessionId);
|
|
117
|
+
if (attached !== void 0 && hasApiRemoteSubagentOwner(ctx, attached, void 0)) return { error: apiRemoteSubagentOwnershipError(sessionId) };
|
|
118
|
+
return { error: {
|
|
119
|
+
code: "internal",
|
|
120
|
+
message: `resume failed for session "${sessionId}": ${String(error)}`,
|
|
121
|
+
details: {}
|
|
122
|
+
} };
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
ctx.inject(["typert"], (typeCtx) => {
|
|
126
|
+
const resolveAgent = async (sessionId) => {
|
|
127
|
+
const found = await agentFor(sessionId);
|
|
128
|
+
if ("error" in found) throw new TypeRTLookupFailure(found.error);
|
|
129
|
+
return found.agent;
|
|
130
|
+
};
|
|
131
|
+
typeCtx.typert.lookups.configure("agent", resolveAgent);
|
|
132
|
+
typeCtx.typert.lookups.configure("session", async (sessionId) => (await resolveAgent(sessionId)).session);
|
|
133
|
+
typeCtx.typert.contexts.configureHost("agent", async (sessionId) => (await resolveAgent(sessionId)).ctx);
|
|
134
|
+
});
|
|
135
|
+
return agentFor;
|
|
136
|
+
}
|
|
137
|
+
//#endregion
|
|
138
|
+
//#region lib/types/index.js
|
|
139
|
+
/** Host plugin body; the selected contributions mount only in Client environments. */
|
|
140
|
+
function apply() {}
|
|
141
|
+
//#endregion
|
|
142
|
+
export { ApiRemoteSessionNotFound, ApiRemoteSubagentSessionOwnership, apiRemoteSubagentOwnershipError, apply, createApiRemoteAgentResolver, hasApiRemoteSubagentOwner, inspectApiRemoteSession };
|
package/lib/invariant.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
//#region lib/types/invariant.js
|
|
2
|
+
/** Package-owned invariant companion for `@deepseek-ai/dsh-api-remotes`. */
|
|
3
|
+
const PACKAGE_NAME = "@deepseek-ai/dsh-api-remotes";
|
|
4
|
+
/** Cordis companion plugin name. */
|
|
5
|
+
const name = "api-remotes-invariant";
|
|
6
|
+
/** Service required before the companion can reserve package ownership. */
|
|
7
|
+
const inject = ["invariants"];
|
|
8
|
+
/** No runtime invariant: TypeRT and the Agent/Session registries own the observed relationships. */
|
|
9
|
+
const install = () => {};
|
|
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
|
+
const apply = (ctx) => Promise.resolve(ctx.invariants.register(PACKAGE_NAME, install));
|
|
16
|
+
//#endregion
|
|
17
|
+
export { apply, inject, name };
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/** Host BFF policy for resolving Remote Agent and Session identities. */
|
|
2
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
3
|
+
import type { Agent, AgentOptions, AgentSetup } from '@deepseek-ai/dsh-agent';
|
|
4
|
+
import type { Session, SessionEvent, SessionHeader, SessionId } from '@deepseek-ai/dsh-session';
|
|
5
|
+
/** Caller-facing failures preserved by the Gateway's RPC adapter. */
|
|
6
|
+
export type ApiRemoteLookupError = {
|
|
7
|
+
readonly code: 'agent-busy';
|
|
8
|
+
readonly message: string;
|
|
9
|
+
readonly details: {
|
|
10
|
+
readonly reason: string;
|
|
11
|
+
};
|
|
12
|
+
} | {
|
|
13
|
+
readonly code: 'session-not-found';
|
|
14
|
+
readonly message: string;
|
|
15
|
+
readonly details: {
|
|
16
|
+
readonly sessionId: SessionId;
|
|
17
|
+
};
|
|
18
|
+
} | {
|
|
19
|
+
readonly code: 'internal';
|
|
20
|
+
readonly message: string;
|
|
21
|
+
readonly details: Record<never, never>;
|
|
22
|
+
};
|
|
23
|
+
/** Result of resolving one session identity to its live Agent. */
|
|
24
|
+
export type ApiRemoteAgentResult = {
|
|
25
|
+
readonly agent: Agent;
|
|
26
|
+
} | {
|
|
27
|
+
readonly error: ApiRemoteLookupError;
|
|
28
|
+
};
|
|
29
|
+
/** Resume configuration supplied by the owning Host composition. */
|
|
30
|
+
export interface ApiRemoteAgentOptions {
|
|
31
|
+
/** Read the per-Agent defaults when a cold identity must resume. */
|
|
32
|
+
readonly agentOptions?: () => AgentOptions;
|
|
33
|
+
/**
|
|
34
|
+
* Build the Host-specific Agent-scope composition completed before
|
|
35
|
+
* publication. Keyed by the resumed session itself because what a Host
|
|
36
|
+
* installs may depend on what that session recorded: an agent preset fixes
|
|
37
|
+
* the tools its history was produced under, so rebuilding it under another
|
|
38
|
+
* composition would replay tool calls the agent can no longer make. The
|
|
39
|
+
* events come along because a session's own record of such a choice may be
|
|
40
|
+
* an event rather than a header field.
|
|
41
|
+
* @param session - the resumed session's persisted header and event log.
|
|
42
|
+
* @returns the Agent-scope setup to run before publication.
|
|
43
|
+
*/
|
|
44
|
+
readonly setup?: (session: {
|
|
45
|
+
meta: SessionHeader;
|
|
46
|
+
events: readonly SessionEvent[];
|
|
47
|
+
}) => AgentSetup | Promise<AgentSetup>;
|
|
48
|
+
}
|
|
49
|
+
/** Cold identity absent from the durable session store. */
|
|
50
|
+
export declare class ApiRemoteSessionNotFound extends Error {
|
|
51
|
+
}
|
|
52
|
+
/** Session identity whose lifecycle belongs to subagent routing. */
|
|
53
|
+
export declare class ApiRemoteSubagentSessionOwnership extends Error {
|
|
54
|
+
readonly sessionId: SessionId;
|
|
55
|
+
/**
|
|
56
|
+
* Construct the ownership fence.
|
|
57
|
+
* @param sessionId - identity reserved to subagent routing.
|
|
58
|
+
*/
|
|
59
|
+
constructor(sessionId: SessionId);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Test whether generic Host routing must leave an identity to subagent routing.
|
|
63
|
+
* @param ctx - Host Context carrying the live Agent registry.
|
|
64
|
+
* @param session - attached or live Session metadata.
|
|
65
|
+
* @param agent - live Agent when one is registered.
|
|
66
|
+
* @returns whether generic Remote and legacy API calls must reject the identity.
|
|
67
|
+
*/
|
|
68
|
+
export declare function hasApiRemoteSubagentOwner(ctx: Context, session: Pick<Session, 'header'>, agent: Agent | undefined): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Build the stable caller-facing ownership rejection.
|
|
71
|
+
* @param sessionId - identity reserved to subagent routing.
|
|
72
|
+
* @returns the existing `agent-busy` RPC shape.
|
|
73
|
+
*/
|
|
74
|
+
export declare function apiRemoteSubagentOwnershipError(sessionId: SessionId): ApiRemoteLookupError;
|
|
75
|
+
/**
|
|
76
|
+
* Inspect one cold served session without repairing, resuming, or publishing it.
|
|
77
|
+
* @param ctx - Host Context carrying the optional persistence provider.
|
|
78
|
+
* @param sessionId - durable identity to inspect.
|
|
79
|
+
* @returns detached metadata and events for a servable session.
|
|
80
|
+
* @throws {@link ApiRemoteSessionNotFound} when the identity has no project-backed session.
|
|
81
|
+
*/
|
|
82
|
+
export declare function inspectApiRemoteSession(ctx: Context, sessionId: SessionId): Promise<{
|
|
83
|
+
meta: SessionHeader;
|
|
84
|
+
events: SessionEvent[];
|
|
85
|
+
}>;
|
|
86
|
+
/**
|
|
87
|
+
* Create the Host's shared Agent resolver and configure Agent/Session TypeRT lookups.
|
|
88
|
+
* Live Agents are reused, ordinary cold sessions resume once per identity, and
|
|
89
|
+
* subagent-owned identities retain the legacy `agent-busy` fence.
|
|
90
|
+
* @param ctx - owning Host Context.
|
|
91
|
+
* @param options - defaults and Agent-scope setup used only for cold resume.
|
|
92
|
+
* @returns resolver shared by legacy API Proxy methods and TypeRT lookups.
|
|
93
|
+
*/
|
|
94
|
+
export declare function createApiRemoteAgentResolver(ctx: Context, options: ApiRemoteAgentOptions): (sessionId: SessionId) => Promise<ApiRemoteAgentResult>;
|
|
95
|
+
//# sourceMappingURL=agent-lookup.d.ts.map
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** Platform-neutral assembly of generated Host Remote contributions. */
|
|
2
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
3
|
+
import type { TypeRTClientRemote } from '@deepseek-ai/dsh-type-meta';
|
|
4
|
+
export type { TypeRTClientRemote as ClientRemote } from '@deepseek-ai/dsh-type-meta';
|
|
5
|
+
export type {} from '@deepseek-ai/dsh-goal/remote';
|
|
6
|
+
declare module '@deepseek-ai/cordis' {
|
|
7
|
+
interface Context {
|
|
8
|
+
/** Generated Remote namespaces selected by this Client assembly. */
|
|
9
|
+
remote: TypeRTClientRemote;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/** Required service: the typed Client Remote contribution mount. */
|
|
13
|
+
export declare const inject: string[];
|
|
14
|
+
/**
|
|
15
|
+
* Mount the Host capabilities explicitly selected for this Client assembly.
|
|
16
|
+
* @param ctx - Client Cordis root carrying the typed API service.
|
|
17
|
+
* @returns disposer after every selected Remote namespace is ready.
|
|
18
|
+
*/
|
|
19
|
+
export declare function apply(ctx: Context): Promise<() => Promise<void>>;
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Host BFF entry and Loader shell for the Remote contribution assembly. */
|
|
2
|
+
export { ApiRemoteSessionNotFound, ApiRemoteSubagentSessionOwnership, apiRemoteSubagentOwnershipError, createApiRemoteAgentResolver, hasApiRemoteSubagentOwner, inspectApiRemoteSession, } from './agent-lookup.ts';
|
|
3
|
+
export type { ApiRemoteAgentOptions, ApiRemoteAgentResult, ApiRemoteLookupError, } from './agent-lookup.ts';
|
|
4
|
+
/** Host plugin body; the selected contributions mount only in Client environments. */
|
|
5
|
+
export declare function apply(): void;
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Package-owned invariant companion for `@deepseek-ai/dsh-api-remotes`. */
|
|
2
|
+
import type { Context } from '@deepseek-ai/cordis';
|
|
3
|
+
/** Cordis companion plugin name. */
|
|
4
|
+
export declare const name = "api-remotes-invariant";
|
|
5
|
+
/** Service required before the companion can reserve package ownership. */
|
|
6
|
+
export declare const inject: string[];
|
|
7
|
+
/**
|
|
8
|
+
* Register this package's invariant companion.
|
|
9
|
+
* @param ctx - Cordis context carrying the invariant service.
|
|
10
|
+
* @returns the installed registration's disposer after setup succeeds.
|
|
11
|
+
*/
|
|
12
|
+
export declare const apply: (ctx: Context) => Promise<() => void>;
|
|
13
|
+
//# sourceMappingURL=invariant.d.ts.map
|
package/package.json
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@deepseek-ai/dsh-api-remotes",
|
|
3
|
+
"description": "Remote BFF assembly and Host Agent/Session lookup policy",
|
|
4
|
+
"version": "0.0.1-rc.1",
|
|
5
|
+
"publishConfig": {
|
|
6
|
+
"access": "restricted"
|
|
7
|
+
},
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/deepseek-ai/deepseek-harness.git",
|
|
11
|
+
"directory": "packages/api/remotes"
|
|
12
|
+
},
|
|
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
|
+
"./client": {
|
|
26
|
+
"types": "./lib/types/client/index.d.ts",
|
|
27
|
+
"default": "./lib/client.js"
|
|
28
|
+
},
|
|
29
|
+
"./src/*": "./src/*",
|
|
30
|
+
"./package.json": "./package.json"
|
|
31
|
+
},
|
|
32
|
+
"dsh": {
|
|
33
|
+
"client": {
|
|
34
|
+
"inject": [
|
|
35
|
+
"@deepseek-ai/dsh-api-gateway"
|
|
36
|
+
],
|
|
37
|
+
"platform": "web",
|
|
38
|
+
"immediately": true
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"license": "BSD-3-Clause",
|
|
42
|
+
"files": [
|
|
43
|
+
"lib/index.js",
|
|
44
|
+
"lib/invariant.js",
|
|
45
|
+
"lib/client.js",
|
|
46
|
+
"lib/types/**/*.d.ts"
|
|
47
|
+
],
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"@deepseek-ai/dsh-type-meta": "^0.0.1-rc.1"
|
|
50
|
+
},
|
|
51
|
+
"peerDependencies": {
|
|
52
|
+
"@deepseek-ai/dsh-agent": "^0.0.1-rc.1",
|
|
53
|
+
"@deepseek-ai/dsh-goal": "^0.0.1-rc.1",
|
|
54
|
+
"@deepseek-ai/dsh-invariants": "^0.0.1-rc.1",
|
|
55
|
+
"@deepseek-ai/dsh-session": "^0.0.1-rc.1",
|
|
56
|
+
"@deepseek-ai/dsh-session-persistence": "^0.0.1-rc.1",
|
|
57
|
+
"@deepseek-ai/dsh-typert-registry": "^0.0.1-rc.1",
|
|
58
|
+
"@deepseek-ai/cordis": "^4.0.1-rc.1"
|
|
59
|
+
},
|
|
60
|
+
"devDependencies": {
|
|
61
|
+
"@deepseek-ai/dsh-agent": "^0.0.1-rc.1",
|
|
62
|
+
"@deepseek-ai/dsh-goal": "^0.0.1-rc.1",
|
|
63
|
+
"@deepseek-ai/dsh-invariants": "^0.0.1-rc.1",
|
|
64
|
+
"@deepseek-ai/dsh-session": "^0.0.1-rc.1",
|
|
65
|
+
"@deepseek-ai/dsh-session-persistence": "^0.0.1-rc.1",
|
|
66
|
+
"@deepseek-ai/dsh-typert-registry": "^0.0.1-rc.1",
|
|
67
|
+
"@deepseek-ai/cordis": "^4.0.1-rc.1"
|
|
68
|
+
},
|
|
69
|
+
"scripts": {
|
|
70
|
+
"bundle": "tsdown",
|
|
71
|
+
"watch": "tsdown --watch"
|
|
72
|
+
}
|
|
73
|
+
}
|