dsh-connect 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.
@@ -0,0 +1,32 @@
1
+ /** One historical conversation for a chat. */
2
+ export interface ChatSessionRecord {
3
+ sessionId: string;
4
+ /** Short human label (usually the first prompt). */
5
+ title: string;
6
+ createdAt: number;
7
+ lastActiveAt: number;
8
+ workDir: string;
9
+ }
10
+ export interface ChatBinding {
11
+ channel: string;
12
+ chatKey: string;
13
+ chatType: "p2p" | "group";
14
+ /** The active session id for this chat. */
15
+ sessionId: string;
16
+ ownerKey: string;
17
+ createdAt: number;
18
+ lastActiveAt: number;
19
+ /** Every conversation ever opened in this chat, oldest last. */
20
+ sessions: ChatSessionRecord[];
21
+ }
22
+ export declare class BindingStore {
23
+ private readonly map;
24
+ private readonly file;
25
+ constructor(stateDir?: string);
26
+ get(channel: string, chatKey: string): ChatBinding | undefined;
27
+ put(binding: ChatBinding): void;
28
+ delete(channel: string, chatKey: string): void;
29
+ private load;
30
+ private save;
31
+ }
32
+ //# sourceMappingURL=binding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binding.d.ts","sourceRoot":"","sources":["../src/binding.ts"],"names":[],"mappings":"AAUA,8CAA8C;AAC9C,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,KAAK,GAAG,OAAO,CAAC;IAC1B,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,gEAAgE;IAChE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AA0BD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkC;IACtD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;gBAElB,QAAQ,CAAC,EAAE,MAAM;IAM7B,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI9D,GAAG,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAK/B,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAK9C,OAAO,CAAC,IAAI;IAyBZ,OAAO,CAAC,IAAI;CAQb"}
package/lib/binding.js ADDED
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Durable chatKey → session routing, kept separately from DSH's own session
3
+ * persistence. DSH persists each session transcript; this file persists which
4
+ * sessions belong to which chat and which one is active, so a restarted process
5
+ * can list and resume the right agents.
6
+ * @module dsh-connect/binding
7
+ */
8
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
9
+ import { dirname, resolve } from "node:path";
10
+ function keyOf(channel, chatKey) {
11
+ return `${channel}\u0000${chatKey}`;
12
+ }
13
+ function isRecord(value) {
14
+ return typeof value === "object" && value !== null;
15
+ }
16
+ function normalizeSessions(value) {
17
+ if (!Array.isArray(value))
18
+ return [];
19
+ const out = [];
20
+ for (const item of value) {
21
+ if (!isRecord(item) || typeof item.sessionId !== "string")
22
+ continue;
23
+ out.push({
24
+ sessionId: item.sessionId,
25
+ title: typeof item.title === "string" ? item.title : item.sessionId,
26
+ createdAt: typeof item.createdAt === "number" ? item.createdAt : Date.now(),
27
+ lastActiveAt: typeof item.lastActiveAt === "number" ? item.lastActiveAt : Date.now(),
28
+ workDir: typeof item.workDir === "string" ? item.workDir : "",
29
+ });
30
+ }
31
+ return out;
32
+ }
33
+ export class BindingStore {
34
+ map = new Map();
35
+ file;
36
+ constructor(stateDir) {
37
+ const dir = stateDir ?? process.env.DSH_CONNECT_STATE_DIR ?? ".dsh-connect";
38
+ this.file = resolve(dir, "bindings.json");
39
+ this.load();
40
+ }
41
+ get(channel, chatKey) {
42
+ return this.map.get(keyOf(channel, chatKey));
43
+ }
44
+ put(binding) {
45
+ this.map.set(keyOf(binding.channel, binding.chatKey), binding);
46
+ this.save();
47
+ }
48
+ delete(channel, chatKey) {
49
+ this.map.delete(keyOf(channel, chatKey));
50
+ this.save();
51
+ }
52
+ load() {
53
+ try {
54
+ const raw = readFileSync(this.file, "utf8");
55
+ const parsed = JSON.parse(raw);
56
+ if (!Array.isArray(parsed))
57
+ return;
58
+ for (const item of parsed) {
59
+ if (!isRecord(item))
60
+ continue;
61
+ const b = item;
62
+ if (typeof b.channel !== "string" || typeof b.chatKey !== "string" || typeof b.sessionId !== "string")
63
+ continue;
64
+ this.map.set(keyOf(b.channel, b.chatKey), {
65
+ channel: b.channel,
66
+ chatKey: b.chatKey,
67
+ chatType: b.chatType === "group" ? "group" : "p2p",
68
+ sessionId: b.sessionId,
69
+ ownerKey: typeof b.ownerKey === "string" ? b.ownerKey : "",
70
+ createdAt: typeof b.createdAt === "number" ? b.createdAt : Date.now(),
71
+ lastActiveAt: typeof b.lastActiveAt === "number" ? b.lastActiveAt : Date.now(),
72
+ sessions: normalizeSessions(b.sessions),
73
+ });
74
+ }
75
+ }
76
+ catch {
77
+ // Missing or corrupt file: start empty.
78
+ }
79
+ }
80
+ save() {
81
+ try {
82
+ mkdirSync(dirname(this.file), { recursive: true });
83
+ writeFileSync(this.file, JSON.stringify([...this.map.values()], null, 2), "utf8");
84
+ }
85
+ catch {
86
+ // Persistence is best-effort; live bindings still work in-memory.
87
+ }
88
+ }
89
+ }
90
+ //# sourceMappingURL=binding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binding.js","sourceRoot":"","sources":["../src/binding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Slash-command parsing for chat control. Commands run without waking the
3
+ * agent, so they stay fast and side-effect-free for the model.
4
+ * @module dsh-connect/commands
5
+ */
6
+ export type Command = {
7
+ readonly kind: "new";
8
+ } | {
9
+ readonly kind: "clear";
10
+ } | {
11
+ readonly kind: "stop";
12
+ } | {
13
+ readonly kind: "status";
14
+ } | {
15
+ readonly kind: "task";
16
+ } | {
17
+ readonly kind: "dir";
18
+ readonly path?: string;
19
+ } | {
20
+ readonly kind: "chat";
21
+ } | {
22
+ readonly kind: "menu";
23
+ } | {
24
+ readonly kind: "settings";
25
+ } | {
26
+ readonly kind: "help";
27
+ } | {
28
+ readonly kind: "message";
29
+ readonly text: string;
30
+ };
31
+ export declare function parseCommand(raw: string): Command;
32
+ export declare const HELP_TEXT: string;
33
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,OAAO,GACf;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAA;CAAE,GACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GAC7B;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAExD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CA0CjD;AAED,eAAO,MAAM,SAAS,QAYV,CAAC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Slash-command parsing for chat control. Commands run without waking the
3
+ * agent, so they stay fast and side-effect-free for the model.
4
+ * @module dsh-connect/commands
5
+ */
6
+ export function parseCommand(raw) {
7
+ const text = raw.trim();
8
+ const space = text.indexOf(" ");
9
+ const head = space === -1 ? text : text.slice(0, space);
10
+ const arg = space === -1 ? undefined : text.slice(space + 1).trim();
11
+ switch (head) {
12
+ case "/new":
13
+ case "/reset":
14
+ return { kind: "new" };
15
+ case "/clear":
16
+ return { kind: "clear" };
17
+ case "/stop":
18
+ case "/cancel":
19
+ return { kind: "stop" };
20
+ case "/status":
21
+ return { kind: "status" };
22
+ case "/task":
23
+ case "/tasks":
24
+ case "/todo":
25
+ return { kind: "task" };
26
+ case "/dir":
27
+ case "/cd":
28
+ case "/pwd":
29
+ return arg === undefined || arg === "" ? { kind: "dir" } : { kind: "dir", path: arg };
30
+ case "/chat":
31
+ case "/session":
32
+ case "/sessions":
33
+ case "/conversations":
34
+ return { kind: "chat" };
35
+ case "/menu":
36
+ case "/m":
37
+ return { kind: "menu" };
38
+ case "/settings":
39
+ case "/set":
40
+ return { kind: "settings" };
41
+ case "/help":
42
+ case "/start":
43
+ return { kind: "help" };
44
+ default:
45
+ return { kind: "message", text };
46
+ }
47
+ }
48
+ export const HELP_TEXT = [
49
+ "可用命令(本地执行,不消耗模型):",
50
+ "- `/menu` 打开主菜单(层级点选,可返回)",
51
+ "- `/settings`(`/set`)打开设置:模型 / 推理强度 / 通知 / 配置总览",
52
+ "- `/status` 查看会话状态、模型、工作目录、排队数",
53
+ "- `/task` 查看当前任务清单(todo)",
54
+ "- `/chat`(`/session`)列出对话,点选切换或新建",
55
+ "- `/dir` 列出工作目录,点选切换(或 `/dir <绝对路径>` 手动指定)",
56
+ "- `/new` 开启新对话",
57
+ "- `/clear` 清空当前对话",
58
+ "- `/stop` 停止当前任务",
59
+ "- 其他文本将作为任务发送给 DSH Agent",
60
+ ].join("\n");
61
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAeH,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACxB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAEpE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ;YACX,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QACzB,KAAK,QAAQ;YACX,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC3B,KAAK,OAAO,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1B,KAAK,SAAS;YACZ,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC5B,KAAK,OAAO,CAAC;QACb,KAAK,QAAQ,CAAC;QACd,KAAK,OAAO;YACV,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1B,KAAK,MAAM,CAAC;QACZ,KAAK,KAAK,CAAC;QACX,KAAK,MAAM;YACT,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QACxF,KAAK,OAAO,CAAC;QACb,KAAK,UAAU,CAAC;QAChB,KAAK,WAAW,CAAC;QACjB,KAAK,gBAAgB;YACnB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1B,KAAK,OAAO,CAAC;QACb,KAAK,IAAI;YACP,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1B,KAAK,WAAW,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QAC9B,KAAK,OAAO,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC1B;YACE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACrC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,mBAAmB;IACnB,2BAA2B;IAC3B,iDAAiD;IACjD,gCAAgC;IAChC,0BAA0B;IAC1B,mCAAmC;IACnC,4CAA4C;IAC5C,gBAAgB;IAChB,mBAAmB;IACnB,kBAAkB;IAClB,0BAA0B;CAC3B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,60 @@
1
+ /**
2
+ * `dsh-connect` — channel-agnostic messaging bridge core for DeepSeek Harness.
3
+ * Provides the `connect` service; channel adapters register into it and route
4
+ * normalized messages to bound DSH agents, then stream replies back.
5
+ * @module dsh-connect
6
+ */
7
+ import type { Context } from "@deepseek-ai/cordis";
8
+ import z from "@deepseek-ai/schemastery";
9
+ import { ConnectService } from "./service.js";
10
+ import type { ConnectConfig } from "./runner.js";
11
+ export { ConnectService } from "./service.js";
12
+ export { AgentRunner, resolveConnectConfig, summarizeTurn } from "./runner.js";
13
+ export type { ConnectConfig, ResolvedConnectConfig } from "./runner.js";
14
+ export { BindingStore } from "./binding.js";
15
+ export type { ChatBinding, ChatSessionRecord } from "./binding.js";
16
+ export { createAsyncQueue } from "./stream.js";
17
+ export { parseCommand, HELP_TEXT } from "./commands.js";
18
+ export type { Command } from "./commands.js";
19
+ export type { ChatType, ChoiceOption, ChoicePrompt, InboundMessage, OutboundTarget, SummaryCard, TurnReason, TurnOutcome, AsyncQueue, ChannelAdapter, } from "./types.js";
20
+ /** Cordis plugin name used by loader diagnostics. */
21
+ export declare const name = "connect";
22
+ /** Host-plane services this plugin requires before it can route messages. */
23
+ export declare const inject: string[];
24
+ /** Plugin config; all fields optional — `apply` fills code defaults. */
25
+ export declare const Config: z<Schemastery.ObjectS<{
26
+ /** Agent preset id composed into each bound session; omit for the roster default. */
27
+ agentPreset: z<string, string>;
28
+ /** Absolute working directory per agent; defaults to the process cwd. */
29
+ workDir: z<string, string>;
30
+ /** Optional workspace directories offered by the `/dir` chooser. */
31
+ workspaces: z<string[], string[]>;
32
+ /** Sender allowlist; empty = all senders allowed. */
33
+ allowUsers: z<string[], string[]>;
34
+ /** Chat allowlist; empty = all chats allowed. */
35
+ allowChats: z<string[], string[]>;
36
+ /** Directory for the bindings.json routing store. */
37
+ stateDir: z<string, string>;
38
+ }>, Schemastery.ObjectT<{
39
+ /** Agent preset id composed into each bound session; omit for the roster default. */
40
+ agentPreset: z<string, string>;
41
+ /** Absolute working directory per agent; defaults to the process cwd. */
42
+ workDir: z<string, string>;
43
+ /** Optional workspace directories offered by the `/dir` chooser. */
44
+ workspaces: z<string[], string[]>;
45
+ /** Sender allowlist; empty = all senders allowed. */
46
+ allowUsers: z<string[], string[]>;
47
+ /** Chat allowlist; empty = all chats allowed. */
48
+ allowChats: z<string[], string[]>;
49
+ /** Directory for the bindings.json routing store. */
50
+ stateDir: z<string, string>;
51
+ }>>;
52
+ declare module "@deepseek-ai/cordis" {
53
+ interface Context {
54
+ connect: ConnectService;
55
+ }
56
+ }
57
+ /** Register the `connect` service; adapters resolve it via `inject: ["connect"]`. */
58
+ export declare function apply(ctx: Context, config?: ConnectConfig): void;
59
+ export default ConnectService;
60
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,CAAC,MAAM,0BAA0B,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC/E,YAAY,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACxD,YAAY,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,YAAY,EACV,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,cAAc,EACd,WAAW,EACX,UAAU,EACV,WAAW,EACX,UAAU,EACV,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,qDAAqD;AACrD,eAAO,MAAM,IAAI,YAAY,CAAC;AAE9B,6EAA6E;AAC7E,eAAO,MAAM,MAAM,UAA8C,CAAC;AAElE,wEAAwE;AACxE,eAAO,MAAM,MAAM;IACjB,qFAAqF;;IAErF,yEAAyE;;IAEzE,oEAAoE;;IAEpE,qDAAqD;;IAErD,iDAAiD;;IAEjD,qDAAqD;;;IAVrD,qFAAqF;;IAErF,yEAAyE;;IAEzE,oEAAoE;;IAEpE,qDAAqD;;IAErD,iDAAiD;;IAEjD,qDAAqD;;GAErD,CAAC;AAEH,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,OAAO;QACf,OAAO,EAAE,cAAc,CAAC;KACzB;CACF;AAED,qFAAqF;AACrF,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,GAAE,aAAkB,GAAG,IAAI,CAEpE;AAED,eAAe,cAAc,CAAC"}
package/lib/index.js ADDED
@@ -0,0 +1,32 @@
1
+ import z from "@deepseek-ai/schemastery";
2
+ import { ConnectService } from "./service.js";
3
+ export { ConnectService } from "./service.js";
4
+ export { AgentRunner, resolveConnectConfig, summarizeTurn } from "./runner.js";
5
+ export { BindingStore } from "./binding.js";
6
+ export { createAsyncQueue } from "./stream.js";
7
+ export { parseCommand, HELP_TEXT } from "./commands.js";
8
+ /** Cordis plugin name used by loader diagnostics. */
9
+ export const name = "connect";
10
+ /** Host-plane services this plugin requires before it can route messages. */
11
+ export const inject = ["agents", "sessions", "agentDefaultModel"];
12
+ /** Plugin config; all fields optional — `apply` fills code defaults. */
13
+ export const Config = z.object({
14
+ /** Agent preset id composed into each bound session; omit for the roster default. */
15
+ agentPreset: z.string(),
16
+ /** Absolute working directory per agent; defaults to the process cwd. */
17
+ workDir: z.string(),
18
+ /** Optional workspace directories offered by the `/dir` chooser. */
19
+ workspaces: z.array(z.string()),
20
+ /** Sender allowlist; empty = all senders allowed. */
21
+ allowUsers: z.array(z.string()),
22
+ /** Chat allowlist; empty = all chats allowed. */
23
+ allowChats: z.array(z.string()),
24
+ /** Directory for the bindings.json routing store. */
25
+ stateDir: z.string(),
26
+ });
27
+ /** Register the `connect` service; adapters resolve it via `inject: ["connect"]`. */
28
+ export function apply(ctx, config = {}) {
29
+ void new ConnectService(ctx, config);
30
+ }
31
+ export default ConnectService;
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,CAAC,MAAM,0BAA0B,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE/E,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAexD,qDAAqD;AACrD,MAAM,CAAC,MAAM,IAAI,GAAG,SAAS,CAAC;AAE9B,6EAA6E;AAC7E,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,mBAAmB,CAAC,CAAC;AAElE,wEAAwE;AACxE,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,qFAAqF;IACrF,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,yEAAyE;IACzE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,oEAAoE;IACpE,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC/B,qDAAqD;IACrD,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC/B,iDAAiD;IACjD,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC/B,qDAAqD;IACrD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;CACrB,CAAC,CAAC;AAQH,qFAAqF;AACrF,MAAM,UAAU,KAAK,CAAC,GAAY,EAAE,SAAwB,EAAE;IAC5D,KAAK,IAAI,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AACvC,CAAC;AAED,eAAe,cAAc,CAAC"}
@@ -0,0 +1,79 @@
1
+ import type { Context } from "@deepseek-ai/cordis";
2
+ import { type Session, type SessionEvent } from "@deepseek-ai/dsh-session";
3
+ import type { ChannelAdapter, InboundMessage, TurnOutcome } from "./types.js";
4
+ import type { BindingStore } from "./binding.js";
5
+ export interface ConnectConfig {
6
+ /** Agent preset id composed into each session; `undefined` = roster default. */
7
+ agentPreset?: string;
8
+ /** Absolute working directory for each bound agent; defaults to process cwd. */
9
+ workDir?: string;
10
+ /** Optional workspace directories offered by the `/dir` chooser. */
11
+ workspaces?: string[];
12
+ allowUsers?: string[];
13
+ allowChats?: string[];
14
+ stateDir?: string;
15
+ }
16
+ export interface ResolvedConnectConfig {
17
+ agentPreset?: string;
18
+ workDir?: string;
19
+ workspaces: string[];
20
+ allowUsers: string[];
21
+ allowChats: string[];
22
+ stateDir?: string;
23
+ }
24
+ export declare function resolveConnectConfig(config: ConnectConfig): ResolvedConnectConfig;
25
+ export declare function summarizeTurn(events: readonly SessionEvent[], firstSeq: number): TurnOutcome;
26
+ export declare class AgentRunner {
27
+ private readonly ctx;
28
+ private readonly config;
29
+ private readonly channel;
30
+ private readonly chatKey;
31
+ private readonly chatType;
32
+ private readonly adapter;
33
+ private readonly bindings;
34
+ private readonly queue;
35
+ private running;
36
+ private agent?;
37
+ private handle?;
38
+ private turn?;
39
+ private workDir;
40
+ private streamEnabled;
41
+ private summaryEnabled;
42
+ constructor(ctx: Context, config: ResolvedConnectConfig, channel: string, chatKey: string, chatType: "p2p" | "group", adapter: ChannelAdapter, bindings: BindingStore);
43
+ /** Prefer the user's first DSH workspace over the process cwd as default. */
44
+ private resolveDefaultWorkDir;
45
+ enqueue(msg: InboundMessage): void;
46
+ /** Route one live session event to the active turn's chunk queue. */
47
+ onSessionEvent(session: Session, event: SessionEvent): void;
48
+ private target;
49
+ private drain;
50
+ private runTurn;
51
+ private ensureAgent;
52
+ private get agents();
53
+ private get sessions();
54
+ private defaultSelection;
55
+ private composeSetup;
56
+ private watchAgent;
57
+ private driveAgent;
58
+ private readTodos;
59
+ private touchBinding;
60
+ private sendSummary;
61
+ private handleCommand;
62
+ private disposeAgent;
63
+ private recordSession;
64
+ private newChat;
65
+ private clearChat;
66
+ private switchTo;
67
+ private listWorkspaces;
68
+ private openMenu;
69
+ private menuItems;
70
+ private showStatus;
71
+ private showTasks;
72
+ private showSettings;
73
+ private modelMenuItems;
74
+ private listModelChoices;
75
+ private setModel;
76
+ private reasoningMenuItems;
77
+ private setReasoning;
78
+ }
79
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}