@dyyz1993/pi-coding-agent 0.70.5 → 0.70.6

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 (41) hide show
  1. package/dist/core/agent-types.d.ts +58 -0
  2. package/dist/core/agent-types.d.ts.map +1 -0
  3. package/dist/core/agent-types.js +203 -0
  4. package/dist/core/agent-types.js.map +1 -0
  5. package/dist/core/extensions/channel-factory.d.ts +13 -0
  6. package/dist/core/extensions/channel-factory.d.ts.map +1 -0
  7. package/dist/core/extensions/channel-factory.js +19 -0
  8. package/dist/core/extensions/channel-factory.js.map +1 -0
  9. package/dist/core/extensions/channel-registry.d.ts +28 -0
  10. package/dist/core/extensions/channel-registry.d.ts.map +1 -0
  11. package/dist/core/extensions/channel-registry.js +12 -0
  12. package/dist/core/extensions/channel-registry.js.map +1 -0
  13. package/dist/core/extensions/index.d.ts +3 -0
  14. package/dist/core/extensions/index.d.ts.map +1 -1
  15. package/dist/core/extensions/index.js +1 -0
  16. package/dist/core/extensions/index.js.map +1 -1
  17. package/dist/core/extensions/server-channel.d.ts +8 -8
  18. package/dist/core/extensions/server-channel.d.ts.map +1 -1
  19. package/dist/core/extensions/server-channel.js.map +1 -1
  20. package/dist/core/tools/bash.d.ts.map +1 -1
  21. package/dist/core/tools/bash.js +30 -121
  22. package/dist/core/tools/bash.js.map +1 -1
  23. package/dist/core/tools/output-collector.d.ts +35 -0
  24. package/dist/core/tools/output-collector.d.ts.map +1 -0
  25. package/dist/core/tools/output-collector.js +79 -0
  26. package/dist/core/tools/output-collector.js.map +1 -0
  27. package/dist/core/tools/spawn-managed.d.ts +18 -0
  28. package/dist/core/tools/spawn-managed.d.ts.map +1 -0
  29. package/dist/core/tools/spawn-managed.js +52 -0
  30. package/dist/core/tools/spawn-managed.js.map +1 -0
  31. package/dist/index.d.ts +6 -3
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +6 -2
  34. package/dist/index.js.map +1 -1
  35. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  36. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  37. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  38. package/examples/extensions/custom-provider-qwen-cli/package.json +1 -1
  39. package/examples/extensions/with-deps/package-lock.json +2 -2
  40. package/examples/extensions/with-deps/package.json +1 -1
  41. package/package.json +5 -4
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Shared agent types and discovery logic.
3
+ *
4
+ * Used by multiple extensions (subagent, subagent-v2, agent-permissions)
5
+ * and exported from the public API so extensions don't need cross-plugin imports.
6
+ */
7
+ export type AgentScope = "user" | "project" | "both";
8
+ export type PermissionMode = "auto" | "acceptEdits" | "plan" | "dontAsk" | "always-allow" | "always-deny";
9
+ export type AgentColor = "red" | "blue" | "green" | "yellow" | "purple" | "orange";
10
+ export type MemoryScope = "user" | "project" | "local";
11
+ export type IsolationMode = "worktree" | "remote";
12
+ export interface AgentHookCommand {
13
+ type: "command";
14
+ command: string;
15
+ if?: string;
16
+ async?: boolean;
17
+ }
18
+ export interface AgentHookPrompt {
19
+ type: "prompt";
20
+ prompt: string;
21
+ if?: string;
22
+ }
23
+ export type AgentHook = AgentHookCommand | AgentHookPrompt;
24
+ export type AgentHooks = Partial<Record<string, AgentHook[]>>;
25
+ export interface AgentConfig {
26
+ name: string;
27
+ description: string;
28
+ tools?: string[];
29
+ disallowedTools?: string[];
30
+ model?: string;
31
+ systemPrompt: string;
32
+ source: AgentSource;
33
+ filePath: string;
34
+ permissionMode?: PermissionMode;
35
+ maxTurns?: number;
36
+ effort?: string;
37
+ color?: AgentColor;
38
+ background?: boolean;
39
+ memory?: MemoryScope;
40
+ isolation?: IsolationMode;
41
+ initialPrompt?: string;
42
+ skills?: string[];
43
+ hooks?: AgentHooks;
44
+ variables?: Record<string, string>;
45
+ }
46
+ export type AgentSource = "builtin" | "plugin" | "user" | "project" | "flag" | "policy";
47
+ export interface AgentDiscoveryResult {
48
+ agents: AgentConfig[];
49
+ projectAgentsDir: string | null;
50
+ }
51
+ export declare function loadAgentsFromDir(dir: string, source: AgentSource): AgentConfig[];
52
+ export declare function mergeAgentsByPriority(...groups: AgentConfig[][]): AgentConfig[];
53
+ export declare function discoverAgents(cwd: string, scope: AgentScope, overrideAgents?: AgentConfig[]): AgentDiscoveryResult;
54
+ export declare function formatAgentList(agents: AgentConfig[], maxItems: number): {
55
+ text: string;
56
+ remaining: number;
57
+ };
58
+ //# sourceMappingURL=agent-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-types.d.ts","sourceRoot":"","sources":["../../src/core/agent-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AAErD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,cAAc,GAAG,aAAa,CAAC;AAE1G,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEnF,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAEvD,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,QAAQ,CAAC;AAElD,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,MAAM,SAAS,GAAG,gBAAgB,GAAG,eAAe,CAAC;AAE3D,MAAM,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;AAE9D,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IAEjB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAExF,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAoFD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,WAAW,EAAE,CAiEjF;AAsBD,wBAAgB,qBAAqB,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,EAAE,GAAG,WAAW,EAAE,CAQ/E;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,CAAC,EAAE,WAAW,EAAE,GAAG,oBAAoB,CAqBnH;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAQ5G","sourcesContent":["/**\n * Shared agent types and discovery logic.\n *\n * Used by multiple extensions (subagent, subagent-v2, agent-permissions)\n * and exported from the public API so extensions don't need cross-plugin imports.\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"path\";\nimport { getAgentDir } from \"../config.js\";\nimport { parseFrontmatter } from \"../utils/frontmatter.js\";\n\nexport type AgentScope = \"user\" | \"project\" | \"both\";\n\nexport type PermissionMode = \"auto\" | \"acceptEdits\" | \"plan\" | \"dontAsk\" | \"always-allow\" | \"always-deny\";\n\nexport type AgentColor = \"red\" | \"blue\" | \"green\" | \"yellow\" | \"purple\" | \"orange\";\n\nexport type MemoryScope = \"user\" | \"project\" | \"local\";\n\nexport type IsolationMode = \"worktree\" | \"remote\";\n\nexport interface AgentHookCommand {\n\ttype: \"command\";\n\tcommand: string;\n\tif?: string;\n\tasync?: boolean;\n}\n\nexport interface AgentHookPrompt {\n\ttype: \"prompt\";\n\tprompt: string;\n\tif?: string;\n}\n\nexport type AgentHook = AgentHookCommand | AgentHookPrompt;\n\nexport type AgentHooks = Partial<Record<string, AgentHook[]>>;\n\nexport interface AgentConfig {\n\tname: string;\n\tdescription: string;\n\ttools?: string[];\n\tdisallowedTools?: string[];\n\tmodel?: string;\n\tsystemPrompt: string;\n\tsource: AgentSource;\n\tfilePath: string;\n\n\tpermissionMode?: PermissionMode;\n\tmaxTurns?: number;\n\teffort?: string;\n\tcolor?: AgentColor;\n\tbackground?: boolean;\n\tmemory?: MemoryScope;\n\tisolation?: IsolationMode;\n\tinitialPrompt?: string;\n\tskills?: string[];\n\thooks?: AgentHooks;\n\tvariables?: Record<string, string>;\n}\n\nexport type AgentSource = \"builtin\" | \"plugin\" | \"user\" | \"project\" | \"flag\" | \"policy\";\n\nexport interface AgentDiscoveryResult {\n\tagents: AgentConfig[];\n\tprojectAgentsDir: string | null;\n}\n\nconst STRING_FIELDS: ReadonlySet<string> = new Set([\n\t\"description\",\n\t\"model\",\n\t\"permissionMode\",\n\t\"effort\",\n\t\"color\",\n\t\"memory\",\n\t\"isolation\",\n\t\"initialPrompt\",\n]);\n\nconst STRING_ARRAY_FIELDS: ReadonlySet<string> = new Set([\"tools\", \"disallowedTools\", \"skills\"]);\n\nconst BOOLEAN_FIELDS: ReadonlySet<string> = new Set([\"background\"]);\n\nconst NUMBER_FIELDS: ReadonlySet<string> = new Set([\"maxTurns\"]);\n\nfunction coerceField(key: string, raw: unknown): unknown {\n\tif (raw === undefined || raw === null) return undefined;\n\n\tif (STRING_FIELDS.has(key)) {\n\t\treturn typeof raw === \"string\" ? raw : String(raw);\n\t}\n\n\tif (STRING_ARRAY_FIELDS.has(key)) {\n\t\tif (Array.isArray(raw)) return raw.map(String);\n\t\tif (typeof raw === \"string\") {\n\t\t\treturn raw\n\t\t\t\t.split(\",\")\n\t\t\t\t.map((s: string) => s.trim())\n\t\t\t\t.filter(Boolean);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tif (BOOLEAN_FIELDS.has(key)) {\n\t\tif (typeof raw === \"boolean\") return raw;\n\t\tif (typeof raw === \"string\") return raw === \"true\" || raw === \"yes\";\n\t\treturn undefined;\n\t}\n\n\tif (NUMBER_FIELDS.has(key)) {\n\t\tif (typeof raw === \"number\") return raw;\n\t\tif (typeof raw === \"string\") {\n\t\t\tconst n = Number.parseInt(raw, 10);\n\t\t\treturn Number.isFinite(n) ? n : undefined;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\treturn raw;\n}\n\nfunction parseHooks(raw: unknown): AgentHooks | undefined {\n\tif (!raw || typeof raw !== \"object\") return undefined;\n\tconst hooks: AgentHooks = {};\n\tfor (const [event, handlers] of Object.entries(raw as Record<string, unknown>)) {\n\t\tif (!Array.isArray(handlers)) continue;\n\t\tconst parsed: AgentHook[] = [];\n\t\tfor (const h of handlers) {\n\t\t\tif (!h || typeof h !== \"object\") continue;\n\t\t\tconst obj = h as Record<string, unknown>;\n\t\t\tif (obj.type === \"command\" && typeof obj.command === \"string\") {\n\t\t\t\tparsed.push({\n\t\t\t\t\ttype: \"command\",\n\t\t\t\t\tcommand: obj.command,\n\t\t\t\t\tif: typeof obj.if === \"string\" ? obj.if : undefined,\n\t\t\t\t\tasync: obj.async === true,\n\t\t\t\t});\n\t\t\t} else if (obj.type === \"prompt\" && typeof obj.prompt === \"string\") {\n\t\t\t\tparsed.push({\n\t\t\t\t\ttype: \"prompt\",\n\t\t\t\t\tprompt: obj.prompt,\n\t\t\t\t\tif: typeof obj.if === \"string\" ? obj.if : undefined,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tif (parsed.length > 0) hooks[event] = parsed;\n\t}\n\treturn Object.keys(hooks).length > 0 ? hooks : undefined;\n}\n\nexport function loadAgentsFromDir(dir: string, source: AgentSource): AgentConfig[] {\n\tconst agents: AgentConfig[] = [];\n\n\tif (!fs.existsSync(dir)) {\n\t\treturn agents;\n\t}\n\n\tlet entries: fs.Dirent[];\n\ttry {\n\t\tentries = fs.readdirSync(dir, { withFileTypes: true });\n\t} catch {\n\t\treturn agents;\n\t}\n\n\tfor (const entry of entries) {\n\t\tif (!entry.name.endsWith(\".md\")) continue;\n\t\tif (!entry.isFile() && !entry.isSymbolicLink()) continue;\n\n\t\tconst filePath = path.join(dir, entry.name);\n\t\tlet content: string;\n\t\ttry {\n\t\t\tcontent = fs.readFileSync(filePath, \"utf-8\");\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst { frontmatter, body } = parseFrontmatter<Record<string, unknown>>(content);\n\n\t\tif (!frontmatter.name || !frontmatter.description) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst tools = coerceField(\"tools\", frontmatter.tools) as string[] | undefined;\n\t\tconst disallowedTools = coerceField(\"disallowedTools\", frontmatter.disallowedTools) as string[] | undefined;\n\t\tconst skills = coerceField(\"skills\", frontmatter.skills) as string[] | undefined;\n\t\tconst hooks = parseHooks(frontmatter.hooks);\n\t\tconst variables =\n\t\t\tfrontmatter.variables && typeof frontmatter.variables === \"object\"\n\t\t\t\t? (frontmatter.variables as Record<string, string>)\n\t\t\t\t: undefined;\n\n\t\tagents.push({\n\t\t\tname: coerceField(\"name\", frontmatter.name) as string,\n\t\t\tdescription: coerceField(\"description\", frontmatter.description) as string,\n\t\t\ttools: tools && tools.length > 0 ? tools : undefined,\n\t\t\tdisallowedTools: disallowedTools && disallowedTools.length > 0 ? disallowedTools : undefined,\n\t\t\tmodel: coerceField(\"model\", frontmatter.model) as string | undefined,\n\t\t\tsystemPrompt: body,\n\t\t\tsource,\n\t\t\tfilePath,\n\t\t\tpermissionMode: coerceField(\"permissionMode\", frontmatter.permissionMode) as PermissionMode | undefined,\n\t\t\tmaxTurns: coerceField(\"maxTurns\", frontmatter.maxTurns) as number | undefined,\n\t\t\teffort: coerceField(\"effort\", frontmatter.effort) as string | undefined,\n\t\t\tcolor: coerceField(\"color\", frontmatter.color) as AgentColor | undefined,\n\t\t\tbackground: coerceField(\"background\", frontmatter.background) as boolean | undefined,\n\t\t\tmemory: coerceField(\"memory\", frontmatter.memory) as MemoryScope | undefined,\n\t\t\tisolation: coerceField(\"isolation\", frontmatter.isolation) as IsolationMode | undefined,\n\t\t\tinitialPrompt: coerceField(\"initialPrompt\", frontmatter.initialPrompt) as string | undefined,\n\t\t\tskills: skills && skills.length > 0 ? skills : undefined,\n\t\t\thooks,\n\t\t\tvariables,\n\t\t});\n\t}\n\n\treturn agents;\n}\n\nfunction isDirectory(p: string): boolean {\n\ttry {\n\t\treturn fs.statSync(p).isDirectory();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction findNearestProjectAgentsDir(cwd: string): string | null {\n\tlet currentDir = cwd;\n\twhile (true) {\n\t\tconst candidate = path.join(currentDir, \".pi\", \"agents\");\n\t\tif (isDirectory(candidate)) return candidate;\n\n\t\tconst parentDir = path.dirname(currentDir);\n\t\tif (parentDir === currentDir) return null;\n\t\tcurrentDir = parentDir;\n\t}\n}\n\nexport function mergeAgentsByPriority(...groups: AgentConfig[][]): AgentConfig[] {\n\tconst agentMap = new Map<string, AgentConfig>();\n\tfor (const group of groups) {\n\t\tfor (const agent of group) {\n\t\t\tagentMap.set(agent.name, agent);\n\t\t}\n\t}\n\treturn Array.from(agentMap.values());\n}\n\nexport function discoverAgents(cwd: string, scope: AgentScope, overrideAgents?: AgentConfig[]): AgentDiscoveryResult {\n\tconst userDir = path.join(getAgentDir(), \"agents\");\n\tconst projectAgentsDir = findNearestProjectAgentsDir(cwd);\n\n\tconst builtinAgents: AgentConfig[] = [];\n\tconst pluginAgents: AgentConfig[] = [];\n\tconst userAgents = scope === \"project\" ? [] : loadAgentsFromDir(userDir, \"user\");\n\tconst projectAgents = scope === \"user\" || !projectAgentsDir ? [] : loadAgentsFromDir(projectAgentsDir, \"project\");\n\tconst flagAgents = overrideAgents ?? [];\n\tconst policyAgents: AgentConfig[] = [];\n\n\tconst agents = mergeAgentsByPriority(\n\t\tbuiltinAgents,\n\t\tpluginAgents,\n\t\tuserAgents,\n\t\tprojectAgents,\n\t\tflagAgents,\n\t\tpolicyAgents,\n\t);\n\n\treturn { agents, projectAgentsDir };\n}\n\nexport function formatAgentList(agents: AgentConfig[], maxItems: number): { text: string; remaining: number } {\n\tif (agents.length === 0) return { text: \"none\", remaining: 0 };\n\tconst listed = agents.slice(0, maxItems);\n\tconst remaining = agents.length - listed.length;\n\treturn {\n\t\ttext: listed.map((a) => `${a.name} (${a.source}): ${a.description}`).join(\"; \"),\n\t\tremaining,\n\t};\n}\n"]}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * Shared agent types and discovery logic.
3
+ *
4
+ * Used by multiple extensions (subagent, subagent-v2, agent-permissions)
5
+ * and exported from the public API so extensions don't need cross-plugin imports.
6
+ */
7
+ import * as fs from "node:fs";
8
+ import * as path from "path";
9
+ import { getAgentDir } from "../config.js";
10
+ import { parseFrontmatter } from "../utils/frontmatter.js";
11
+ const STRING_FIELDS = new Set([
12
+ "description",
13
+ "model",
14
+ "permissionMode",
15
+ "effort",
16
+ "color",
17
+ "memory",
18
+ "isolation",
19
+ "initialPrompt",
20
+ ]);
21
+ const STRING_ARRAY_FIELDS = new Set(["tools", "disallowedTools", "skills"]);
22
+ const BOOLEAN_FIELDS = new Set(["background"]);
23
+ const NUMBER_FIELDS = new Set(["maxTurns"]);
24
+ function coerceField(key, raw) {
25
+ if (raw === undefined || raw === null)
26
+ return undefined;
27
+ if (STRING_FIELDS.has(key)) {
28
+ return typeof raw === "string" ? raw : String(raw);
29
+ }
30
+ if (STRING_ARRAY_FIELDS.has(key)) {
31
+ if (Array.isArray(raw))
32
+ return raw.map(String);
33
+ if (typeof raw === "string") {
34
+ return raw
35
+ .split(",")
36
+ .map((s) => s.trim())
37
+ .filter(Boolean);
38
+ }
39
+ return undefined;
40
+ }
41
+ if (BOOLEAN_FIELDS.has(key)) {
42
+ if (typeof raw === "boolean")
43
+ return raw;
44
+ if (typeof raw === "string")
45
+ return raw === "true" || raw === "yes";
46
+ return undefined;
47
+ }
48
+ if (NUMBER_FIELDS.has(key)) {
49
+ if (typeof raw === "number")
50
+ return raw;
51
+ if (typeof raw === "string") {
52
+ const n = Number.parseInt(raw, 10);
53
+ return Number.isFinite(n) ? n : undefined;
54
+ }
55
+ return undefined;
56
+ }
57
+ return raw;
58
+ }
59
+ function parseHooks(raw) {
60
+ if (!raw || typeof raw !== "object")
61
+ return undefined;
62
+ const hooks = {};
63
+ for (const [event, handlers] of Object.entries(raw)) {
64
+ if (!Array.isArray(handlers))
65
+ continue;
66
+ const parsed = [];
67
+ for (const h of handlers) {
68
+ if (!h || typeof h !== "object")
69
+ continue;
70
+ const obj = h;
71
+ if (obj.type === "command" && typeof obj.command === "string") {
72
+ parsed.push({
73
+ type: "command",
74
+ command: obj.command,
75
+ if: typeof obj.if === "string" ? obj.if : undefined,
76
+ async: obj.async === true,
77
+ });
78
+ }
79
+ else if (obj.type === "prompt" && typeof obj.prompt === "string") {
80
+ parsed.push({
81
+ type: "prompt",
82
+ prompt: obj.prompt,
83
+ if: typeof obj.if === "string" ? obj.if : undefined,
84
+ });
85
+ }
86
+ }
87
+ if (parsed.length > 0)
88
+ hooks[event] = parsed;
89
+ }
90
+ return Object.keys(hooks).length > 0 ? hooks : undefined;
91
+ }
92
+ export function loadAgentsFromDir(dir, source) {
93
+ const agents = [];
94
+ if (!fs.existsSync(dir)) {
95
+ return agents;
96
+ }
97
+ let entries;
98
+ try {
99
+ entries = fs.readdirSync(dir, { withFileTypes: true });
100
+ }
101
+ catch {
102
+ return agents;
103
+ }
104
+ for (const entry of entries) {
105
+ if (!entry.name.endsWith(".md"))
106
+ continue;
107
+ if (!entry.isFile() && !entry.isSymbolicLink())
108
+ continue;
109
+ const filePath = path.join(dir, entry.name);
110
+ let content;
111
+ try {
112
+ content = fs.readFileSync(filePath, "utf-8");
113
+ }
114
+ catch {
115
+ continue;
116
+ }
117
+ const { frontmatter, body } = parseFrontmatter(content);
118
+ if (!frontmatter.name || !frontmatter.description) {
119
+ continue;
120
+ }
121
+ const tools = coerceField("tools", frontmatter.tools);
122
+ const disallowedTools = coerceField("disallowedTools", frontmatter.disallowedTools);
123
+ const skills = coerceField("skills", frontmatter.skills);
124
+ const hooks = parseHooks(frontmatter.hooks);
125
+ const variables = frontmatter.variables && typeof frontmatter.variables === "object"
126
+ ? frontmatter.variables
127
+ : undefined;
128
+ agents.push({
129
+ name: coerceField("name", frontmatter.name),
130
+ description: coerceField("description", frontmatter.description),
131
+ tools: tools && tools.length > 0 ? tools : undefined,
132
+ disallowedTools: disallowedTools && disallowedTools.length > 0 ? disallowedTools : undefined,
133
+ model: coerceField("model", frontmatter.model),
134
+ systemPrompt: body,
135
+ source,
136
+ filePath,
137
+ permissionMode: coerceField("permissionMode", frontmatter.permissionMode),
138
+ maxTurns: coerceField("maxTurns", frontmatter.maxTurns),
139
+ effort: coerceField("effort", frontmatter.effort),
140
+ color: coerceField("color", frontmatter.color),
141
+ background: coerceField("background", frontmatter.background),
142
+ memory: coerceField("memory", frontmatter.memory),
143
+ isolation: coerceField("isolation", frontmatter.isolation),
144
+ initialPrompt: coerceField("initialPrompt", frontmatter.initialPrompt),
145
+ skills: skills && skills.length > 0 ? skills : undefined,
146
+ hooks,
147
+ variables,
148
+ });
149
+ }
150
+ return agents;
151
+ }
152
+ function isDirectory(p) {
153
+ try {
154
+ return fs.statSync(p).isDirectory();
155
+ }
156
+ catch {
157
+ return false;
158
+ }
159
+ }
160
+ function findNearestProjectAgentsDir(cwd) {
161
+ let currentDir = cwd;
162
+ while (true) {
163
+ const candidate = path.join(currentDir, ".pi", "agents");
164
+ if (isDirectory(candidate))
165
+ return candidate;
166
+ const parentDir = path.dirname(currentDir);
167
+ if (parentDir === currentDir)
168
+ return null;
169
+ currentDir = parentDir;
170
+ }
171
+ }
172
+ export function mergeAgentsByPriority(...groups) {
173
+ const agentMap = new Map();
174
+ for (const group of groups) {
175
+ for (const agent of group) {
176
+ agentMap.set(agent.name, agent);
177
+ }
178
+ }
179
+ return Array.from(agentMap.values());
180
+ }
181
+ export function discoverAgents(cwd, scope, overrideAgents) {
182
+ const userDir = path.join(getAgentDir(), "agents");
183
+ const projectAgentsDir = findNearestProjectAgentsDir(cwd);
184
+ const builtinAgents = [];
185
+ const pluginAgents = [];
186
+ const userAgents = scope === "project" ? [] : loadAgentsFromDir(userDir, "user");
187
+ const projectAgents = scope === "user" || !projectAgentsDir ? [] : loadAgentsFromDir(projectAgentsDir, "project");
188
+ const flagAgents = overrideAgents ?? [];
189
+ const policyAgents = [];
190
+ const agents = mergeAgentsByPriority(builtinAgents, pluginAgents, userAgents, projectAgents, flagAgents, policyAgents);
191
+ return { agents, projectAgentsDir };
192
+ }
193
+ export function formatAgentList(agents, maxItems) {
194
+ if (agents.length === 0)
195
+ return { text: "none", remaining: 0 };
196
+ const listed = agents.slice(0, maxItems);
197
+ const remaining = agents.length - listed.length;
198
+ return {
199
+ text: listed.map((a) => `${a.name} (${a.source}): ${a.description}`).join("; "),
200
+ remaining,
201
+ };
202
+ }
203
+ //# sourceMappingURL=agent-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-types.js","sourceRoot":"","sources":["../../src/core/agent-types.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared agent types and discovery logic.\n *\n * Used by multiple extensions (subagent, subagent-v2, agent-permissions)\n * and exported from the public API so extensions don't need cross-plugin imports.\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"path\";\nimport { getAgentDir } from \"../config.js\";\nimport { parseFrontmatter } from \"../utils/frontmatter.js\";\n\nexport type AgentScope = \"user\" | \"project\" | \"both\";\n\nexport type PermissionMode = \"auto\" | \"acceptEdits\" | \"plan\" | \"dontAsk\" | \"always-allow\" | \"always-deny\";\n\nexport type AgentColor = \"red\" | \"blue\" | \"green\" | \"yellow\" | \"purple\" | \"orange\";\n\nexport type MemoryScope = \"user\" | \"project\" | \"local\";\n\nexport type IsolationMode = \"worktree\" | \"remote\";\n\nexport interface AgentHookCommand {\n\ttype: \"command\";\n\tcommand: string;\n\tif?: string;\n\tasync?: boolean;\n}\n\nexport interface AgentHookPrompt {\n\ttype: \"prompt\";\n\tprompt: string;\n\tif?: string;\n}\n\nexport type AgentHook = AgentHookCommand | AgentHookPrompt;\n\nexport type AgentHooks = Partial<Record<string, AgentHook[]>>;\n\nexport interface AgentConfig {\n\tname: string;\n\tdescription: string;\n\ttools?: string[];\n\tdisallowedTools?: string[];\n\tmodel?: string;\n\tsystemPrompt: string;\n\tsource: AgentSource;\n\tfilePath: string;\n\n\tpermissionMode?: PermissionMode;\n\tmaxTurns?: number;\n\teffort?: string;\n\tcolor?: AgentColor;\n\tbackground?: boolean;\n\tmemory?: MemoryScope;\n\tisolation?: IsolationMode;\n\tinitialPrompt?: string;\n\tskills?: string[];\n\thooks?: AgentHooks;\n\tvariables?: Record<string, string>;\n}\n\nexport type AgentSource = \"builtin\" | \"plugin\" | \"user\" | \"project\" | \"flag\" | \"policy\";\n\nexport interface AgentDiscoveryResult {\n\tagents: AgentConfig[];\n\tprojectAgentsDir: string | null;\n}\n\nconst STRING_FIELDS: ReadonlySet<string> = new Set([\n\t\"description\",\n\t\"model\",\n\t\"permissionMode\",\n\t\"effort\",\n\t\"color\",\n\t\"memory\",\n\t\"isolation\",\n\t\"initialPrompt\",\n]);\n\nconst STRING_ARRAY_FIELDS: ReadonlySet<string> = new Set([\"tools\", \"disallowedTools\", \"skills\"]);\n\nconst BOOLEAN_FIELDS: ReadonlySet<string> = new Set([\"background\"]);\n\nconst NUMBER_FIELDS: ReadonlySet<string> = new Set([\"maxTurns\"]);\n\nfunction coerceField(key: string, raw: unknown): unknown {\n\tif (raw === undefined || raw === null) return undefined;\n\n\tif (STRING_FIELDS.has(key)) {\n\t\treturn typeof raw === \"string\" ? raw : String(raw);\n\t}\n\n\tif (STRING_ARRAY_FIELDS.has(key)) {\n\t\tif (Array.isArray(raw)) return raw.map(String);\n\t\tif (typeof raw === \"string\") {\n\t\t\treturn raw\n\t\t\t\t.split(\",\")\n\t\t\t\t.map((s: string) => s.trim())\n\t\t\t\t.filter(Boolean);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tif (BOOLEAN_FIELDS.has(key)) {\n\t\tif (typeof raw === \"boolean\") return raw;\n\t\tif (typeof raw === \"string\") return raw === \"true\" || raw === \"yes\";\n\t\treturn undefined;\n\t}\n\n\tif (NUMBER_FIELDS.has(key)) {\n\t\tif (typeof raw === \"number\") return raw;\n\t\tif (typeof raw === \"string\") {\n\t\t\tconst n = Number.parseInt(raw, 10);\n\t\t\treturn Number.isFinite(n) ? n : undefined;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\treturn raw;\n}\n\nfunction parseHooks(raw: unknown): AgentHooks | undefined {\n\tif (!raw || typeof raw !== \"object\") return undefined;\n\tconst hooks: AgentHooks = {};\n\tfor (const [event, handlers] of Object.entries(raw as Record<string, unknown>)) {\n\t\tif (!Array.isArray(handlers)) continue;\n\t\tconst parsed: AgentHook[] = [];\n\t\tfor (const h of handlers) {\n\t\t\tif (!h || typeof h !== \"object\") continue;\n\t\t\tconst obj = h as Record<string, unknown>;\n\t\t\tif (obj.type === \"command\" && typeof obj.command === \"string\") {\n\t\t\t\tparsed.push({\n\t\t\t\t\ttype: \"command\",\n\t\t\t\t\tcommand: obj.command,\n\t\t\t\t\tif: typeof obj.if === \"string\" ? obj.if : undefined,\n\t\t\t\t\tasync: obj.async === true,\n\t\t\t\t});\n\t\t\t} else if (obj.type === \"prompt\" && typeof obj.prompt === \"string\") {\n\t\t\t\tparsed.push({\n\t\t\t\t\ttype: \"prompt\",\n\t\t\t\t\tprompt: obj.prompt,\n\t\t\t\t\tif: typeof obj.if === \"string\" ? obj.if : undefined,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tif (parsed.length > 0) hooks[event] = parsed;\n\t}\n\treturn Object.keys(hooks).length > 0 ? hooks : undefined;\n}\n\nexport function loadAgentsFromDir(dir: string, source: AgentSource): AgentConfig[] {\n\tconst agents: AgentConfig[] = [];\n\n\tif (!fs.existsSync(dir)) {\n\t\treturn agents;\n\t}\n\n\tlet entries: fs.Dirent[];\n\ttry {\n\t\tentries = fs.readdirSync(dir, { withFileTypes: true });\n\t} catch {\n\t\treturn agents;\n\t}\n\n\tfor (const entry of entries) {\n\t\tif (!entry.name.endsWith(\".md\")) continue;\n\t\tif (!entry.isFile() && !entry.isSymbolicLink()) continue;\n\n\t\tconst filePath = path.join(dir, entry.name);\n\t\tlet content: string;\n\t\ttry {\n\t\t\tcontent = fs.readFileSync(filePath, \"utf-8\");\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst { frontmatter, body } = parseFrontmatter<Record<string, unknown>>(content);\n\n\t\tif (!frontmatter.name || !frontmatter.description) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst tools = coerceField(\"tools\", frontmatter.tools) as string[] | undefined;\n\t\tconst disallowedTools = coerceField(\"disallowedTools\", frontmatter.disallowedTools) as string[] | undefined;\n\t\tconst skills = coerceField(\"skills\", frontmatter.skills) as string[] | undefined;\n\t\tconst hooks = parseHooks(frontmatter.hooks);\n\t\tconst variables =\n\t\t\tfrontmatter.variables && typeof frontmatter.variables === \"object\"\n\t\t\t\t? (frontmatter.variables as Record<string, string>)\n\t\t\t\t: undefined;\n\n\t\tagents.push({\n\t\t\tname: coerceField(\"name\", frontmatter.name) as string,\n\t\t\tdescription: coerceField(\"description\", frontmatter.description) as string,\n\t\t\ttools: tools && tools.length > 0 ? tools : undefined,\n\t\t\tdisallowedTools: disallowedTools && disallowedTools.length > 0 ? disallowedTools : undefined,\n\t\t\tmodel: coerceField(\"model\", frontmatter.model) as string | undefined,\n\t\t\tsystemPrompt: body,\n\t\t\tsource,\n\t\t\tfilePath,\n\t\t\tpermissionMode: coerceField(\"permissionMode\", frontmatter.permissionMode) as PermissionMode | undefined,\n\t\t\tmaxTurns: coerceField(\"maxTurns\", frontmatter.maxTurns) as number | undefined,\n\t\t\teffort: coerceField(\"effort\", frontmatter.effort) as string | undefined,\n\t\t\tcolor: coerceField(\"color\", frontmatter.color) as AgentColor | undefined,\n\t\t\tbackground: coerceField(\"background\", frontmatter.background) as boolean | undefined,\n\t\t\tmemory: coerceField(\"memory\", frontmatter.memory) as MemoryScope | undefined,\n\t\t\tisolation: coerceField(\"isolation\", frontmatter.isolation) as IsolationMode | undefined,\n\t\t\tinitialPrompt: coerceField(\"initialPrompt\", frontmatter.initialPrompt) as string | undefined,\n\t\t\tskills: skills && skills.length > 0 ? skills : undefined,\n\t\t\thooks,\n\t\t\tvariables,\n\t\t});\n\t}\n\n\treturn agents;\n}\n\nfunction isDirectory(p: string): boolean {\n\ttry {\n\t\treturn fs.statSync(p).isDirectory();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction findNearestProjectAgentsDir(cwd: string): string | null {\n\tlet currentDir = cwd;\n\twhile (true) {\n\t\tconst candidate = path.join(currentDir, \".pi\", \"agents\");\n\t\tif (isDirectory(candidate)) return candidate;\n\n\t\tconst parentDir = path.dirname(currentDir);\n\t\tif (parentDir === currentDir) return null;\n\t\tcurrentDir = parentDir;\n\t}\n}\n\nexport function mergeAgentsByPriority(...groups: AgentConfig[][]): AgentConfig[] {\n\tconst agentMap = new Map<string, AgentConfig>();\n\tfor (const group of groups) {\n\t\tfor (const agent of group) {\n\t\t\tagentMap.set(agent.name, agent);\n\t\t}\n\t}\n\treturn Array.from(agentMap.values());\n}\n\nexport function discoverAgents(cwd: string, scope: AgentScope, overrideAgents?: AgentConfig[]): AgentDiscoveryResult {\n\tconst userDir = path.join(getAgentDir(), \"agents\");\n\tconst projectAgentsDir = findNearestProjectAgentsDir(cwd);\n\n\tconst builtinAgents: AgentConfig[] = [];\n\tconst pluginAgents: AgentConfig[] = [];\n\tconst userAgents = scope === \"project\" ? [] : loadAgentsFromDir(userDir, \"user\");\n\tconst projectAgents = scope === \"user\" || !projectAgentsDir ? [] : loadAgentsFromDir(projectAgentsDir, \"project\");\n\tconst flagAgents = overrideAgents ?? [];\n\tconst policyAgents: AgentConfig[] = [];\n\n\tconst agents = mergeAgentsByPriority(\n\t\tbuiltinAgents,\n\t\tpluginAgents,\n\t\tuserAgents,\n\t\tprojectAgents,\n\t\tflagAgents,\n\t\tpolicyAgents,\n\t);\n\n\treturn { agents, projectAgentsDir };\n}\n\nexport function formatAgentList(agents: AgentConfig[], maxItems: number): { text: string; remaining: number } {\n\tif (agents.length === 0) return { text: \"none\", remaining: 0 };\n\tconst listed = agents.slice(0, maxItems);\n\tconst remaining = agents.length - listed.length;\n\treturn {\n\t\ttext: listed.map((a) => `${a.name} (${a.source}): ${a.description}`).join(\"; \"),\n\t\tremaining,\n\t};\n}\n"]}
@@ -0,0 +1,13 @@
1
+ import type { Channel } from "./channel-types.js";
2
+ import { ClientChannel } from "./client-channel.js";
3
+ import type { ChannelContract } from "./server-channel.js";
4
+ import { ServerChannel } from "./server-channel.js";
5
+ export interface TypedChannel<T extends ChannelContract = ChannelContract> {
6
+ server: ServerChannel<T>;
7
+ client: ClientChannel<T>;
8
+ }
9
+ export declare function defineChannel<T extends ChannelContract>(): {
10
+ create(raw: Channel): TypedChannel<T>;
11
+ };
12
+ export declare function createTypedChannel<T extends ChannelContract>(raw: Channel): TypedChannel<T>;
13
+ //# sourceMappingURL=channel-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-factory.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/channel-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe;IACxE,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;CACzB;AAED,wBAAgB,aAAa,CAAC,CAAC,SAAS,eAAe,KAAK;IAC3D,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;CACtC,CASA;AAED,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,eAAe,EAAE,GAAG,EAAE,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAK3F","sourcesContent":["import type { Channel } from \"./channel-types.js\";\nimport { ClientChannel } from \"./client-channel.js\";\nimport type { ChannelContract } from \"./server-channel.js\";\nimport { ServerChannel } from \"./server-channel.js\";\n\nexport interface TypedChannel<T extends ChannelContract = ChannelContract> {\n\tserver: ServerChannel<T>;\n\tclient: ClientChannel<T>;\n}\n\nexport function defineChannel<T extends ChannelContract>(): {\n\tcreate(raw: Channel): TypedChannel<T>;\n} {\n\treturn {\n\t\tcreate(raw: Channel): TypedChannel<T> {\n\t\t\treturn {\n\t\t\t\tserver: new ServerChannel<T>(raw),\n\t\t\t\tclient: new ClientChannel<T>(raw),\n\t\t\t};\n\t\t},\n\t};\n}\n\nexport function createTypedChannel<T extends ChannelContract>(raw: Channel): TypedChannel<T> {\n\treturn {\n\t\tserver: new ServerChannel<T>(raw),\n\t\tclient: new ClientChannel<T>(raw),\n\t};\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import { ClientChannel } from "./client-channel.js";
2
+ import { ServerChannel } from "./server-channel.js";
3
+ export function defineChannel() {
4
+ return {
5
+ create(raw) {
6
+ return {
7
+ server: new ServerChannel(raw),
8
+ client: new ClientChannel(raw),
9
+ };
10
+ },
11
+ };
12
+ }
13
+ export function createTypedChannel(raw) {
14
+ return {
15
+ server: new ServerChannel(raw),
16
+ client: new ClientChannel(raw),
17
+ };
18
+ }
19
+ //# sourceMappingURL=channel-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-factory.js","sourceRoot":"","sources":["../../../src/core/extensions/channel-factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAOpD,MAAM,UAAU,aAAa,GAE3B;IACD,OAAO;QACN,MAAM,CAAC,GAAY,EAAmB;YACrC,OAAO;gBACN,MAAM,EAAE,IAAI,aAAa,CAAI,GAAG,CAAC;gBACjC,MAAM,EAAE,IAAI,aAAa,CAAI,GAAG,CAAC;aACjC,CAAC;QAAA,CACF;KACD,CAAC;AAAA,CACF;AAED,MAAM,UAAU,kBAAkB,CAA4B,GAAY,EAAmB;IAC5F,OAAO;QACN,MAAM,EAAE,IAAI,aAAa,CAAI,GAAG,CAAC;QACjC,MAAM,EAAE,IAAI,aAAa,CAAI,GAAG,CAAC;KACjC,CAAC;AAAA,CACF","sourcesContent":["import type { Channel } from \"./channel-types.js\";\nimport { ClientChannel } from \"./client-channel.js\";\nimport type { ChannelContract } from \"./server-channel.js\";\nimport { ServerChannel } from \"./server-channel.js\";\n\nexport interface TypedChannel<T extends ChannelContract = ChannelContract> {\n\tserver: ServerChannel<T>;\n\tclient: ClientChannel<T>;\n}\n\nexport function defineChannel<T extends ChannelContract>(): {\n\tcreate(raw: Channel): TypedChannel<T>;\n} {\n\treturn {\n\t\tcreate(raw: Channel): TypedChannel<T> {\n\t\t\treturn {\n\t\t\t\tserver: new ServerChannel<T>(raw),\n\t\t\t\tclient: new ClientChannel<T>(raw),\n\t\t\t};\n\t\t},\n\t};\n}\n\nexport function createTypedChannel<T extends ChannelContract>(raw: Channel): TypedChannel<T> {\n\treturn {\n\t\tserver: new ServerChannel<T>(raw),\n\t\tclient: new ClientChannel<T>(raw),\n\t};\n}\n"]}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Channel Type Registry
3
+ *
4
+ * Central registry mapping channel names to their typed contracts.
5
+ * Consumers (TUI, IDE extensions) can look up channel types by name:
6
+ *
7
+ * import type { ChannelTypeRegistry } from "@dyyz1993/pi-coding-agent";
8
+ * type BashMethods = ChannelTypeRegistry["bash"]["methods"];
9
+ * type BashEvents = ChannelTypeRegistry["bash"]["events"];
10
+ */
11
+ import type { MemoryChannelContract } from "../../../extensions/auto-memory/contract.js";
12
+ import type { BashChannelContract } from "../../../extensions/bash-ext/contract.js";
13
+ import type { CoordinatorChannelContract } from "../../../extensions/coordinator/types.js";
14
+ import type { LspChannelContract } from "../../../extensions/lsp/lsp/contract.js";
15
+ import type { RulesChannelContract } from "../../../extensions/rules-engine/types.js";
16
+ import type { SubagentExtChannelContract } from "../../../extensions/subagent-ext/contract.js";
17
+ import type { SubagentV2ChannelContract } from "../../../extensions/subagent-v2/contract.js";
18
+ import type { TodoChannelContract } from "../../../extensions/todo-ext/contract.js";
19
+ export interface ChannelTypeRegistry {
20
+ bash: BashChannelContract;
21
+ todo: TodoChannelContract;
22
+ lsp: LspChannelContract;
23
+ memory: MemoryChannelContract;
24
+ subagent: SubagentExtChannelContract & SubagentV2ChannelContract;
25
+ coordinator: CoordinatorChannelContract;
26
+ "rules-engine": RulesChannelContract;
27
+ }
28
+ //# sourceMappingURL=channel-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-registry.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/channel-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AACzF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,0CAA0C,CAAC;AAC3F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,8CAA8C,CAAC;AAC/F,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,6CAA6C,CAAC;AAC7F,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAEpF,MAAM,WAAW,mBAAmB;IACnC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,GAAG,EAAE,kBAAkB,CAAC;IACxB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,QAAQ,EAAE,0BAA0B,GAAG,yBAAyB,CAAC;IACjE,WAAW,EAAE,0BAA0B,CAAC;IACxC,cAAc,EAAE,oBAAoB,CAAC;CACrC","sourcesContent":["/**\n * Channel Type Registry\n *\n * Central registry mapping channel names to their typed contracts.\n * Consumers (TUI, IDE extensions) can look up channel types by name:\n *\n * import type { ChannelTypeRegistry } from \"@dyyz1993/pi-coding-agent\";\n * type BashMethods = ChannelTypeRegistry[\"bash\"][\"methods\"];\n * type BashEvents = ChannelTypeRegistry[\"bash\"][\"events\"];\n */\n\nimport type { MemoryChannelContract } from \"../../../extensions/auto-memory/contract.js\";\nimport type { BashChannelContract } from \"../../../extensions/bash-ext/contract.js\";\nimport type { CoordinatorChannelContract } from \"../../../extensions/coordinator/types.js\";\nimport type { LspChannelContract } from \"../../../extensions/lsp/lsp/contract.js\";\nimport type { RulesChannelContract } from \"../../../extensions/rules-engine/types.js\";\nimport type { SubagentExtChannelContract } from \"../../../extensions/subagent-ext/contract.js\";\nimport type { SubagentV2ChannelContract } from \"../../../extensions/subagent-v2/contract.js\";\nimport type { TodoChannelContract } from \"../../../extensions/todo-ext/contract.js\";\n\nexport interface ChannelTypeRegistry {\n\tbash: BashChannelContract;\n\ttodo: TodoChannelContract;\n\tlsp: LspChannelContract;\n\tmemory: MemoryChannelContract;\n\tsubagent: SubagentExtChannelContract & SubagentV2ChannelContract;\n\tcoordinator: CoordinatorChannelContract;\n\t\"rules-engine\": RulesChannelContract;\n}\n"]}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Channel Type Registry
3
+ *
4
+ * Central registry mapping channel names to their typed contracts.
5
+ * Consumers (TUI, IDE extensions) can look up channel types by name:
6
+ *
7
+ * import type { ChannelTypeRegistry } from "@dyyz1993/pi-coding-agent";
8
+ * type BashMethods = ChannelTypeRegistry["bash"]["methods"];
9
+ * type BashEvents = ChannelTypeRegistry["bash"]["events"];
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=channel-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-registry.js","sourceRoot":"","sources":["../../../src/core/extensions/channel-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG","sourcesContent":["/**\n * Channel Type Registry\n *\n * Central registry mapping channel names to their typed contracts.\n * Consumers (TUI, IDE extensions) can look up channel types by name:\n *\n * import type { ChannelTypeRegistry } from \"@dyyz1993/pi-coding-agent\";\n * type BashMethods = ChannelTypeRegistry[\"bash\"][\"methods\"];\n * type BashEvents = ChannelTypeRegistry[\"bash\"][\"events\"];\n */\n\nimport type { MemoryChannelContract } from \"../../../extensions/auto-memory/contract.js\";\nimport type { BashChannelContract } from \"../../../extensions/bash-ext/contract.js\";\nimport type { CoordinatorChannelContract } from \"../../../extensions/coordinator/types.js\";\nimport type { LspChannelContract } from \"../../../extensions/lsp/lsp/contract.js\";\nimport type { RulesChannelContract } from \"../../../extensions/rules-engine/types.js\";\nimport type { SubagentExtChannelContract } from \"../../../extensions/subagent-ext/contract.js\";\nimport type { SubagentV2ChannelContract } from \"../../../extensions/subagent-v2/contract.js\";\nimport type { TodoChannelContract } from \"../../../extensions/todo-ext/contract.js\";\n\nexport interface ChannelTypeRegistry {\n\tbash: BashChannelContract;\n\ttodo: TodoChannelContract;\n\tlsp: LspChannelContract;\n\tmemory: MemoryChannelContract;\n\tsubagent: SubagentExtChannelContract & SubagentV2ChannelContract;\n\tcoordinator: CoordinatorChannelContract;\n\t\"rules-engine\": RulesChannelContract;\n}\n"]}
@@ -3,7 +3,10 @@
3
3
  */
4
4
  export type { SlashCommandInfo, SlashCommandSource } from "../slash-commands.js";
5
5
  export type { SourceInfo } from "../source-info.js";
6
+ export type { TypedChannel } from "./channel-factory.js";
7
+ export { createTypedChannel, defineChannel } from "./channel-factory.js";
6
8
  export { ChannelManager } from "./channel-manager.js";
9
+ export type { ChannelTypeRegistry } from "./channel-registry.js";
7
10
  export type { Channel, ChannelDataMessage, ChannelEntry, ChannelOutputFn } from "./channel-types.js";
8
11
  export { ClientChannel } from "./client-channel.js";
9
12
  export { createExtensionRuntime, discoverAndLoadExtensions, loadExtensionFromFactory, loadExtensions, } from "./loader.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACjF,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrG,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACN,sBAAsB,EACtB,yBAAyB,EACzB,wBAAwB,EACxB,cAAc,GACd,MAAM,aAAa,CAAC;AACrB,YAAY,EACX,sBAAsB,EACtB,WAAW,EACX,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,oBAAoB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,YAAY,EACX,eAAe,EACf,SAAS,EACT,SAAS,EACT,UAAU,EACV,YAAY,EACZ,YAAY,GACZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EACX,0BAA0B,EAC1B,aAAa,EACb,eAAe,EAEf,eAAe,EACf,uBAAuB,EACvB,kBAAkB,EAElB,aAAa,EACb,2BAA2B,EAC3B,iBAAiB,EACjB,cAAc,EAEd,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,2BAA2B,EAC3B,0BAA0B,EAC1B,gCAAgC,EAChC,wBAAwB,EACxB,cAAc,EACd,cAAc,EACd,sBAAsB,EACtB,wBAAwB,EACxB,wBAAwB,EAExB,cAAc,EAEd,YAAY,EAEZ,kBAAkB,EAClB,YAAY,EACZ,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,WAAW,EACX,UAAU,EACV,SAAS,EACT,gBAAgB,EAEhB,YAAY,EACZ,uBAAuB,EACvB,8BAA8B,EAC9B,gBAAgB,EAChB,uBAAuB,EAEvB,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAEhB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,sBAAsB,EACtB,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,EAEnB,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EAEjB,eAAe,EAEf,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EAEjB,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EAEnB,iBAAiB,EACjB,cAAc,EACd,sBAAsB,EACtB,eAAe,EAEf,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,EACtB,yBAAyB,EACzB,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,EACvB,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EAEpB,iBAAiB,EACjB,gBAAgB,EAChB,wBAAwB,EACxB,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,uBAAuB,EACvB,oBAAoB,EAEpB,aAAa,EACb,mBAAmB,EAEnB,cAAc,EAEd,qBAAqB,EAErB,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,QAAQ,EACR,uBAAuB,EACvB,eAAe,EACf,qBAAqB,EACrB,eAAe,EACf,YAAY,EACZ,cAAc,EAEd,OAAO,EACP,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,eAAe,EACf,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,GACpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACN,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC","sourcesContent":["/**\n * Extension system for lifecycle events and custom tools.\n */\n\nexport type { SlashCommandInfo, SlashCommandSource } from \"../slash-commands.js\";\nexport type { SourceInfo } from \"../source-info.js\";\nexport { ChannelManager } from \"./channel-manager.js\";\nexport type { Channel, ChannelDataMessage, ChannelEntry, ChannelOutputFn } from \"./channel-types.js\";\nexport { ClientChannel } from \"./client-channel.js\";\nexport {\n\tcreateExtensionRuntime,\n\tdiscoverAndLoadExtensions,\n\tloadExtensionFromFactory,\n\tloadExtensions,\n} from \"./loader.js\";\nexport type {\n\tExtensionErrorListener,\n\tForkHandler,\n\tNavigateTreeHandler,\n\tNewSessionHandler,\n\tShutdownHandler,\n\tSwitchSessionHandler,\n} from \"./runner.js\";\nexport { ExtensionRunner } from \"./runner.js\";\nexport type {\n\tChannelContract,\n\tEventData,\n\tEventKeys,\n\tMethodKeys,\n\tMethodParams,\n\tMethodReturn,\n} from \"./server-channel.js\";\nexport { ServerChannel } from \"./server-channel.js\";\nexport type {\n\tAfterProviderResponseEvent,\n\tAgentEndEvent,\n\tAgentStartEvent,\n\t// Re-exports\n\tAgentToolResult,\n\tAgentToolUpdateCallback,\n\tAppendEntryHandler,\n\t// App keybindings (for custom editors)\n\tAppKeybinding,\n\tAutocompleteProviderFactory,\n\tBackgroundHandler,\n\tBackgroundTask,\n\t// Events - Tool (ToolCallEvent types)\n\tBashToolCallEvent,\n\tBashToolResultEvent,\n\tBeforeAgentStartEvent,\n\tBeforeAgentStartEventResult,\n\tBeforeProviderRequestEvent,\n\tBeforeProviderRequestEventResult,\n\tBuildSystemPromptOptions,\n\tCallLLMHandler,\n\tCallLLMOptions,\n\tCallLLMStructuredError,\n\tCallLLMStructuredHandler,\n\tCallLLMStructuredOptions,\n\t// Context\n\tCompactOptions,\n\t// Events - Agent\n\tContextEvent,\n\t// Event Results\n\tContextEventResult,\n\tContextUsage,\n\tCustomToolCallEvent,\n\tCustomToolResultEvent,\n\tEditToolCallEvent,\n\tEditToolResultEvent,\n\tExecOptions,\n\tExecResult,\n\tExtension,\n\tExtensionActions,\n\t// API\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionCommandContextActions,\n\tExtensionContext,\n\tExtensionContextActions,\n\t// Errors\n\tExtensionError,\n\tExtensionEvent,\n\tExtensionFactory,\n\tExtensionFlag,\n\tExtensionHandler,\n\t// Runtime\n\tExtensionRuntime,\n\tExtensionShortcut,\n\tExtensionUIContext,\n\tExtensionUIDialogOptions,\n\tExtensionWidgetOptions,\n\tFindToolCallEvent,\n\tFindToolResultEvent,\n\tForkAgentHandler,\n\tForkAgentOptions,\n\tForkAgentResult,\n\tGetActiveToolsHandler,\n\tGetAllToolsHandler,\n\tGetCommandsHandler,\n\tGetThinkingLevelHandler,\n\tGrepToolCallEvent,\n\tGrepToolResultEvent,\n\t// Events - Input\n\tInputEvent,\n\tInputEventResult,\n\tInputSource,\n\tKeybindingsManager,\n\tLoadExtensionsResult,\n\tLsToolCallEvent,\n\tLsToolResultEvent,\n\t// Events - Message\n\tMessageEndEvent,\n\t// Message Rendering\n\tMessageRenderer,\n\tMessageRenderOptions,\n\tMessageStartEvent,\n\tMessageUpdateEvent,\n\tModelSelectEvent,\n\tModelSelectSource,\n\t// Provider Registration\n\tProviderConfig,\n\tProviderModelConfig,\n\tReadToolCallEvent,\n\tReadToolResultEvent,\n\t// Commands\n\tRegisteredCommand,\n\tRegisteredTool,\n\tReplacedSessionContext,\n\tResolvedCommand,\n\t// Events - Resources\n\tResourcesDiscoverEvent,\n\tResourcesDiscoverResult,\n\tSendMessageHandler,\n\tSendUserMessageHandler,\n\tSessionBeforeCompactEvent,\n\tSessionBeforeCompactResult,\n\tSessionBeforeForkEvent,\n\tSessionBeforeForkResult,\n\tSessionBeforeSwitchEvent,\n\tSessionBeforeSwitchResult,\n\tSessionBeforeTreeEvent,\n\tSessionBeforeTreeResult,\n\tSessionCompactEvent,\n\tSessionEvent,\n\tSessionShutdownEvent,\n\t// Events - Session\n\tSessionStartEvent,\n\tSessionTreeEvent,\n\tSessionTreePreviewResult,\n\tSetActiveToolsHandler,\n\tSetLabelHandler,\n\tSetModelHandler,\n\tSetThinkingLevelHandler,\n\tTerminalInputHandler,\n\t// Events - Tool\n\tToolCallEvent,\n\tToolCallEventResult,\n\t// Tools\n\tToolDefinition,\n\t// Events - Tool Execution\n\tToolExecutionEndEvent,\n\t// Tool execution mode\n\tToolExecutionMode,\n\tToolExecutionStartEvent,\n\tToolExecutionUpdateEvent,\n\tToolInfo,\n\tToolRenderResultOptions,\n\tToolResultEvent,\n\tToolResultEventResult,\n\tTreePreparation,\n\tTurnEndEvent,\n\tTurnStartEvent,\n\t// Events - UI\n\tUIEvent,\n\tUIEventResult,\n\tUserBashEvent,\n\tUserBashEventResult,\n\tWidgetPlacement,\n\tWorkingIndicatorOptions,\n\tWriteToolCallEvent,\n\tWriteToolResultEvent,\n} from \"./types.js\";\n// Type guards\nexport {\n\tdefineTool,\n\tisBashToolResult,\n\tisEditToolResult,\n\tisFindToolResult,\n\tisGrepToolResult,\n\tisLsToolResult,\n\tisReadToolResult,\n\tisToolCallEventType,\n\tisWriteToolResult,\n} from \"./types.js\";\nexport { wrapRegisteredTool, wrapRegisteredTools } from \"./wrapper.js\";\n"]}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Extension system for lifecycle events and custom tools.\n */\n\nexport type { SlashCommandInfo, SlashCommandSource } from \"../slash-commands.js\";\nexport type { SourceInfo } from \"../source-info.js\";\nexport type { TypedChannel } from \"./channel-factory.js\";\nexport { createTypedChannel, defineChannel } from \"./channel-factory.js\";\nexport { ChannelManager } from \"./channel-manager.js\";\nexport type { ChannelTypeRegistry } from \"./channel-registry.js\";\nexport type { Channel, ChannelDataMessage, ChannelEntry, ChannelOutputFn } from \"./channel-types.js\";\nexport { ClientChannel } from \"./client-channel.js\";\nexport {\n\tcreateExtensionRuntime,\n\tdiscoverAndLoadExtensions,\n\tloadExtensionFromFactory,\n\tloadExtensions,\n} from \"./loader.js\";\nexport type {\n\tExtensionErrorListener,\n\tForkHandler,\n\tNavigateTreeHandler,\n\tNewSessionHandler,\n\tShutdownHandler,\n\tSwitchSessionHandler,\n} from \"./runner.js\";\nexport { ExtensionRunner } from \"./runner.js\";\nexport type {\n\tChannelContract,\n\tEventData,\n\tEventKeys,\n\tMethodKeys,\n\tMethodParams,\n\tMethodReturn,\n} from \"./server-channel.js\";\nexport { ServerChannel } from \"./server-channel.js\";\nexport type {\n\tAfterProviderResponseEvent,\n\tAgentEndEvent,\n\tAgentStartEvent,\n\t// Re-exports\n\tAgentToolResult,\n\tAgentToolUpdateCallback,\n\tAppendEntryHandler,\n\t// App keybindings (for custom editors)\n\tAppKeybinding,\n\tAutocompleteProviderFactory,\n\tBackgroundHandler,\n\tBackgroundTask,\n\t// Events - Tool (ToolCallEvent types)\n\tBashToolCallEvent,\n\tBashToolResultEvent,\n\tBeforeAgentStartEvent,\n\tBeforeAgentStartEventResult,\n\tBeforeProviderRequestEvent,\n\tBeforeProviderRequestEventResult,\n\tBuildSystemPromptOptions,\n\tCallLLMHandler,\n\tCallLLMOptions,\n\tCallLLMStructuredError,\n\tCallLLMStructuredHandler,\n\tCallLLMStructuredOptions,\n\t// Context\n\tCompactOptions,\n\t// Events - Agent\n\tContextEvent,\n\t// Event Results\n\tContextEventResult,\n\tContextUsage,\n\tCustomToolCallEvent,\n\tCustomToolResultEvent,\n\tEditToolCallEvent,\n\tEditToolResultEvent,\n\tExecOptions,\n\tExecResult,\n\tExtension,\n\tExtensionActions,\n\t// API\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionCommandContextActions,\n\tExtensionContext,\n\tExtensionContextActions,\n\t// Errors\n\tExtensionError,\n\tExtensionEvent,\n\tExtensionFactory,\n\tExtensionFlag,\n\tExtensionHandler,\n\t// Runtime\n\tExtensionRuntime,\n\tExtensionShortcut,\n\tExtensionUIContext,\n\tExtensionUIDialogOptions,\n\tExtensionWidgetOptions,\n\tFindToolCallEvent,\n\tFindToolResultEvent,\n\tForkAgentHandler,\n\tForkAgentOptions,\n\tForkAgentResult,\n\tGetActiveToolsHandler,\n\tGetAllToolsHandler,\n\tGetCommandsHandler,\n\tGetThinkingLevelHandler,\n\tGrepToolCallEvent,\n\tGrepToolResultEvent,\n\t// Events - Input\n\tInputEvent,\n\tInputEventResult,\n\tInputSource,\n\tKeybindingsManager,\n\tLoadExtensionsResult,\n\tLsToolCallEvent,\n\tLsToolResultEvent,\n\t// Events - Message\n\tMessageEndEvent,\n\t// Message Rendering\n\tMessageRenderer,\n\tMessageRenderOptions,\n\tMessageStartEvent,\n\tMessageUpdateEvent,\n\tModelSelectEvent,\n\tModelSelectSource,\n\t// Provider Registration\n\tProviderConfig,\n\tProviderModelConfig,\n\tReadToolCallEvent,\n\tReadToolResultEvent,\n\t// Commands\n\tRegisteredCommand,\n\tRegisteredTool,\n\tReplacedSessionContext,\n\tResolvedCommand,\n\t// Events - Resources\n\tResourcesDiscoverEvent,\n\tResourcesDiscoverResult,\n\tSendMessageHandler,\n\tSendUserMessageHandler,\n\tSessionBeforeCompactEvent,\n\tSessionBeforeCompactResult,\n\tSessionBeforeForkEvent,\n\tSessionBeforeForkResult,\n\tSessionBeforeSwitchEvent,\n\tSessionBeforeSwitchResult,\n\tSessionBeforeTreeEvent,\n\tSessionBeforeTreeResult,\n\tSessionCompactEvent,\n\tSessionEvent,\n\tSessionShutdownEvent,\n\t// Events - Session\n\tSessionStartEvent,\n\tSessionTreeEvent,\n\tSessionTreePreviewResult,\n\tSetActiveToolsHandler,\n\tSetLabelHandler,\n\tSetModelHandler,\n\tSetThinkingLevelHandler,\n\tTerminalInputHandler,\n\t// Events - Tool\n\tToolCallEvent,\n\tToolCallEventResult,\n\t// Tools\n\tToolDefinition,\n\t// Events - Tool Execution\n\tToolExecutionEndEvent,\n\t// Tool execution mode\n\tToolExecutionMode,\n\tToolExecutionStartEvent,\n\tToolExecutionUpdateEvent,\n\tToolInfo,\n\tToolRenderResultOptions,\n\tToolResultEvent,\n\tToolResultEventResult,\n\tTreePreparation,\n\tTurnEndEvent,\n\tTurnStartEvent,\n\t// Events - UI\n\tUIEvent,\n\tUIEventResult,\n\tUserBashEvent,\n\tUserBashEventResult,\n\tWidgetPlacement,\n\tWorkingIndicatorOptions,\n\tWriteToolCallEvent,\n\tWriteToolResultEvent,\n} from \"./types.js\";\n// Type guards\nexport {\n\tdefineTool,\n\tisBashToolResult,\n\tisEditToolResult,\n\tisFindToolResult,\n\tisGrepToolResult,\n\tisLsToolResult,\n\tisReadToolResult,\n\tisToolCallEventType,\n\tisWriteToolResult,\n} from \"./types.js\";\nexport { wrapRegisteredTool, wrapRegisteredTools } from \"./wrapper.js\";\n"]}
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Extension system for lifecycle events and custom tools.
3
3
  */
4
+ export { createTypedChannel, defineChannel } from "./channel-factory.js";
4
5
  export { ChannelManager } from "./channel-manager.js";
5
6
  export { ClientChannel } from "./client-channel.js";
6
7
  export { createExtensionRuntime, discoverAndLoadExtensions, loadExtensionFromFactory, loadExtensions, } from "./loader.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/extensions/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACN,sBAAsB,EACtB,yBAAyB,EACzB,wBAAwB,EACxB,cAAc,GACd,MAAM,aAAa,CAAC;AASrB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAS9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAuJpD,cAAc;AACd,OAAO,EACN,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC","sourcesContent":["/**\n * Extension system for lifecycle events and custom tools.\n */\n\nexport type { SlashCommandInfo, SlashCommandSource } from \"../slash-commands.js\";\nexport type { SourceInfo } from \"../source-info.js\";\nexport { ChannelManager } from \"./channel-manager.js\";\nexport type { Channel, ChannelDataMessage, ChannelEntry, ChannelOutputFn } from \"./channel-types.js\";\nexport { ClientChannel } from \"./client-channel.js\";\nexport {\n\tcreateExtensionRuntime,\n\tdiscoverAndLoadExtensions,\n\tloadExtensionFromFactory,\n\tloadExtensions,\n} from \"./loader.js\";\nexport type {\n\tExtensionErrorListener,\n\tForkHandler,\n\tNavigateTreeHandler,\n\tNewSessionHandler,\n\tShutdownHandler,\n\tSwitchSessionHandler,\n} from \"./runner.js\";\nexport { ExtensionRunner } from \"./runner.js\";\nexport type {\n\tChannelContract,\n\tEventData,\n\tEventKeys,\n\tMethodKeys,\n\tMethodParams,\n\tMethodReturn,\n} from \"./server-channel.js\";\nexport { ServerChannel } from \"./server-channel.js\";\nexport type {\n\tAfterProviderResponseEvent,\n\tAgentEndEvent,\n\tAgentStartEvent,\n\t// Re-exports\n\tAgentToolResult,\n\tAgentToolUpdateCallback,\n\tAppendEntryHandler,\n\t// App keybindings (for custom editors)\n\tAppKeybinding,\n\tAutocompleteProviderFactory,\n\tBackgroundHandler,\n\tBackgroundTask,\n\t// Events - Tool (ToolCallEvent types)\n\tBashToolCallEvent,\n\tBashToolResultEvent,\n\tBeforeAgentStartEvent,\n\tBeforeAgentStartEventResult,\n\tBeforeProviderRequestEvent,\n\tBeforeProviderRequestEventResult,\n\tBuildSystemPromptOptions,\n\tCallLLMHandler,\n\tCallLLMOptions,\n\tCallLLMStructuredError,\n\tCallLLMStructuredHandler,\n\tCallLLMStructuredOptions,\n\t// Context\n\tCompactOptions,\n\t// Events - Agent\n\tContextEvent,\n\t// Event Results\n\tContextEventResult,\n\tContextUsage,\n\tCustomToolCallEvent,\n\tCustomToolResultEvent,\n\tEditToolCallEvent,\n\tEditToolResultEvent,\n\tExecOptions,\n\tExecResult,\n\tExtension,\n\tExtensionActions,\n\t// API\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionCommandContextActions,\n\tExtensionContext,\n\tExtensionContextActions,\n\t// Errors\n\tExtensionError,\n\tExtensionEvent,\n\tExtensionFactory,\n\tExtensionFlag,\n\tExtensionHandler,\n\t// Runtime\n\tExtensionRuntime,\n\tExtensionShortcut,\n\tExtensionUIContext,\n\tExtensionUIDialogOptions,\n\tExtensionWidgetOptions,\n\tFindToolCallEvent,\n\tFindToolResultEvent,\n\tForkAgentHandler,\n\tForkAgentOptions,\n\tForkAgentResult,\n\tGetActiveToolsHandler,\n\tGetAllToolsHandler,\n\tGetCommandsHandler,\n\tGetThinkingLevelHandler,\n\tGrepToolCallEvent,\n\tGrepToolResultEvent,\n\t// Events - Input\n\tInputEvent,\n\tInputEventResult,\n\tInputSource,\n\tKeybindingsManager,\n\tLoadExtensionsResult,\n\tLsToolCallEvent,\n\tLsToolResultEvent,\n\t// Events - Message\n\tMessageEndEvent,\n\t// Message Rendering\n\tMessageRenderer,\n\tMessageRenderOptions,\n\tMessageStartEvent,\n\tMessageUpdateEvent,\n\tModelSelectEvent,\n\tModelSelectSource,\n\t// Provider Registration\n\tProviderConfig,\n\tProviderModelConfig,\n\tReadToolCallEvent,\n\tReadToolResultEvent,\n\t// Commands\n\tRegisteredCommand,\n\tRegisteredTool,\n\tReplacedSessionContext,\n\tResolvedCommand,\n\t// Events - Resources\n\tResourcesDiscoverEvent,\n\tResourcesDiscoverResult,\n\tSendMessageHandler,\n\tSendUserMessageHandler,\n\tSessionBeforeCompactEvent,\n\tSessionBeforeCompactResult,\n\tSessionBeforeForkEvent,\n\tSessionBeforeForkResult,\n\tSessionBeforeSwitchEvent,\n\tSessionBeforeSwitchResult,\n\tSessionBeforeTreeEvent,\n\tSessionBeforeTreeResult,\n\tSessionCompactEvent,\n\tSessionEvent,\n\tSessionShutdownEvent,\n\t// Events - Session\n\tSessionStartEvent,\n\tSessionTreeEvent,\n\tSessionTreePreviewResult,\n\tSetActiveToolsHandler,\n\tSetLabelHandler,\n\tSetModelHandler,\n\tSetThinkingLevelHandler,\n\tTerminalInputHandler,\n\t// Events - Tool\n\tToolCallEvent,\n\tToolCallEventResult,\n\t// Tools\n\tToolDefinition,\n\t// Events - Tool Execution\n\tToolExecutionEndEvent,\n\t// Tool execution mode\n\tToolExecutionMode,\n\tToolExecutionStartEvent,\n\tToolExecutionUpdateEvent,\n\tToolInfo,\n\tToolRenderResultOptions,\n\tToolResultEvent,\n\tToolResultEventResult,\n\tTreePreparation,\n\tTurnEndEvent,\n\tTurnStartEvent,\n\t// Events - UI\n\tUIEvent,\n\tUIEventResult,\n\tUserBashEvent,\n\tUserBashEventResult,\n\tWidgetPlacement,\n\tWorkingIndicatorOptions,\n\tWriteToolCallEvent,\n\tWriteToolResultEvent,\n} from \"./types.js\";\n// Type guards\nexport {\n\tdefineTool,\n\tisBashToolResult,\n\tisEditToolResult,\n\tisFindToolResult,\n\tisGrepToolResult,\n\tisLsToolResult,\n\tisReadToolResult,\n\tisToolCallEventType,\n\tisWriteToolResult,\n} from \"./types.js\";\nexport { wrapRegisteredTool, wrapRegisteredTools } from \"./wrapper.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/extensions/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACN,sBAAsB,EACtB,yBAAyB,EACzB,wBAAwB,EACxB,cAAc,GACd,MAAM,aAAa,CAAC;AASrB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAS9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAuJpD,cAAc;AACd,OAAO,EACN,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC","sourcesContent":["/**\n * Extension system for lifecycle events and custom tools.\n */\n\nexport type { SlashCommandInfo, SlashCommandSource } from \"../slash-commands.js\";\nexport type { SourceInfo } from \"../source-info.js\";\nexport type { TypedChannel } from \"./channel-factory.js\";\nexport { createTypedChannel, defineChannel } from \"./channel-factory.js\";\nexport { ChannelManager } from \"./channel-manager.js\";\nexport type { ChannelTypeRegistry } from \"./channel-registry.js\";\nexport type { Channel, ChannelDataMessage, ChannelEntry, ChannelOutputFn } from \"./channel-types.js\";\nexport { ClientChannel } from \"./client-channel.js\";\nexport {\n\tcreateExtensionRuntime,\n\tdiscoverAndLoadExtensions,\n\tloadExtensionFromFactory,\n\tloadExtensions,\n} from \"./loader.js\";\nexport type {\n\tExtensionErrorListener,\n\tForkHandler,\n\tNavigateTreeHandler,\n\tNewSessionHandler,\n\tShutdownHandler,\n\tSwitchSessionHandler,\n} from \"./runner.js\";\nexport { ExtensionRunner } from \"./runner.js\";\nexport type {\n\tChannelContract,\n\tEventData,\n\tEventKeys,\n\tMethodKeys,\n\tMethodParams,\n\tMethodReturn,\n} from \"./server-channel.js\";\nexport { ServerChannel } from \"./server-channel.js\";\nexport type {\n\tAfterProviderResponseEvent,\n\tAgentEndEvent,\n\tAgentStartEvent,\n\t// Re-exports\n\tAgentToolResult,\n\tAgentToolUpdateCallback,\n\tAppendEntryHandler,\n\t// App keybindings (for custom editors)\n\tAppKeybinding,\n\tAutocompleteProviderFactory,\n\tBackgroundHandler,\n\tBackgroundTask,\n\t// Events - Tool (ToolCallEvent types)\n\tBashToolCallEvent,\n\tBashToolResultEvent,\n\tBeforeAgentStartEvent,\n\tBeforeAgentStartEventResult,\n\tBeforeProviderRequestEvent,\n\tBeforeProviderRequestEventResult,\n\tBuildSystemPromptOptions,\n\tCallLLMHandler,\n\tCallLLMOptions,\n\tCallLLMStructuredError,\n\tCallLLMStructuredHandler,\n\tCallLLMStructuredOptions,\n\t// Context\n\tCompactOptions,\n\t// Events - Agent\n\tContextEvent,\n\t// Event Results\n\tContextEventResult,\n\tContextUsage,\n\tCustomToolCallEvent,\n\tCustomToolResultEvent,\n\tEditToolCallEvent,\n\tEditToolResultEvent,\n\tExecOptions,\n\tExecResult,\n\tExtension,\n\tExtensionActions,\n\t// API\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionCommandContextActions,\n\tExtensionContext,\n\tExtensionContextActions,\n\t// Errors\n\tExtensionError,\n\tExtensionEvent,\n\tExtensionFactory,\n\tExtensionFlag,\n\tExtensionHandler,\n\t// Runtime\n\tExtensionRuntime,\n\tExtensionShortcut,\n\tExtensionUIContext,\n\tExtensionUIDialogOptions,\n\tExtensionWidgetOptions,\n\tFindToolCallEvent,\n\tFindToolResultEvent,\n\tForkAgentHandler,\n\tForkAgentOptions,\n\tForkAgentResult,\n\tGetActiveToolsHandler,\n\tGetAllToolsHandler,\n\tGetCommandsHandler,\n\tGetThinkingLevelHandler,\n\tGrepToolCallEvent,\n\tGrepToolResultEvent,\n\t// Events - Input\n\tInputEvent,\n\tInputEventResult,\n\tInputSource,\n\tKeybindingsManager,\n\tLoadExtensionsResult,\n\tLsToolCallEvent,\n\tLsToolResultEvent,\n\t// Events - Message\n\tMessageEndEvent,\n\t// Message Rendering\n\tMessageRenderer,\n\tMessageRenderOptions,\n\tMessageStartEvent,\n\tMessageUpdateEvent,\n\tModelSelectEvent,\n\tModelSelectSource,\n\t// Provider Registration\n\tProviderConfig,\n\tProviderModelConfig,\n\tReadToolCallEvent,\n\tReadToolResultEvent,\n\t// Commands\n\tRegisteredCommand,\n\tRegisteredTool,\n\tReplacedSessionContext,\n\tResolvedCommand,\n\t// Events - Resources\n\tResourcesDiscoverEvent,\n\tResourcesDiscoverResult,\n\tSendMessageHandler,\n\tSendUserMessageHandler,\n\tSessionBeforeCompactEvent,\n\tSessionBeforeCompactResult,\n\tSessionBeforeForkEvent,\n\tSessionBeforeForkResult,\n\tSessionBeforeSwitchEvent,\n\tSessionBeforeSwitchResult,\n\tSessionBeforeTreeEvent,\n\tSessionBeforeTreeResult,\n\tSessionCompactEvent,\n\tSessionEvent,\n\tSessionShutdownEvent,\n\t// Events - Session\n\tSessionStartEvent,\n\tSessionTreeEvent,\n\tSessionTreePreviewResult,\n\tSetActiveToolsHandler,\n\tSetLabelHandler,\n\tSetModelHandler,\n\tSetThinkingLevelHandler,\n\tTerminalInputHandler,\n\t// Events - Tool\n\tToolCallEvent,\n\tToolCallEventResult,\n\t// Tools\n\tToolDefinition,\n\t// Events - Tool Execution\n\tToolExecutionEndEvent,\n\t// Tool execution mode\n\tToolExecutionMode,\n\tToolExecutionStartEvent,\n\tToolExecutionUpdateEvent,\n\tToolInfo,\n\tToolRenderResultOptions,\n\tToolResultEvent,\n\tToolResultEventResult,\n\tTreePreparation,\n\tTurnEndEvent,\n\tTurnStartEvent,\n\t// Events - UI\n\tUIEvent,\n\tUIEventResult,\n\tUserBashEvent,\n\tUserBashEventResult,\n\tWidgetPlacement,\n\tWorkingIndicatorOptions,\n\tWriteToolCallEvent,\n\tWriteToolResultEvent,\n} from \"./types.js\";\n// Type guards\nexport {\n\tdefineTool,\n\tisBashToolResult,\n\tisEditToolResult,\n\tisFindToolResult,\n\tisGrepToolResult,\n\tisLsToolResult,\n\tisReadToolResult,\n\tisToolCallEventType,\n\tisWriteToolResult,\n} from \"./types.js\";\nexport { wrapRegisteredTool, wrapRegisteredTools } from \"./wrapper.js\";\n"]}
@@ -6,20 +6,20 @@ export interface ChannelContract {
6
6
  }>;
7
7
  events?: Record<string, unknown>;
8
8
  }
9
- type MethodKeys<T extends ChannelContract> = T["methods"] extends Record<string, unknown> ? keyof T["methods"] & string : string;
10
- type MethodParams<T extends ChannelContract, K extends string> = T["methods"] extends Record<string, infer M> ? K extends keyof M ? M[K] extends {
9
+ type MethodKeys<T extends ChannelContract> = keyof NonNullable<T["methods"]> & string;
10
+ type MethodParams<T extends ChannelContract, K extends MethodKeys<T>> = NonNullable<T["methods"]>[K] extends {
11
11
  params: infer P;
12
- } ? P : unknown : unknown : unknown;
13
- type MethodReturn<T extends ChannelContract, K extends string> = T["methods"] extends Record<string, infer M> ? K extends keyof M ? M[K] extends {
12
+ } ? P : unknown;
13
+ type MethodReturn<T extends ChannelContract, K extends MethodKeys<T>> = NonNullable<T["methods"]>[K] extends {
14
14
  return: infer R;
15
- } ? R : unknown : unknown : unknown;
16
- type EventKeys<T extends ChannelContract> = T["events"] extends Record<string, unknown> ? keyof T["events"] & string : string;
17
- type EventData<T extends ChannelContract, K extends string> = T["events"] extends Record<string, infer E> ? K extends keyof E ? E[K] : unknown : unknown;
15
+ } ? R : unknown;
16
+ type EventKeys<T extends ChannelContract> = keyof NonNullable<T["events"]> & string;
17
+ type EventData<T extends ChannelContract, K extends EventKeys<T>> = NonNullable<T["events"]>[K];
18
18
  export declare class ServerChannel<T extends ChannelContract = ChannelContract> {
19
19
  private raw;
20
20
  private methodHandlers;
21
21
  constructor(raw: Channel);
22
- handle<K extends MethodKeys<T>>(method: K, fn: (params: MethodParams<T, K>) => MethodReturn<T, K>): void;
22
+ handle<K extends MethodKeys<T>>(method: K, fn: (params: MethodParams<T, K>) => MethodReturn<T, K> | Promise<MethodReturn<T, K>>): void;
23
23
  emit<K extends EventKeys<T>>(_event: K, data: EventData<T, K>): void;
24
24
  get raw_(): Channel;
25
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"server-channel.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/server-channel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,WAAW,eAAe;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,KAAK,UAAU,CAAC,CAAC,SAAS,eAAe,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACtF,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,MAAM,GAC3B,MAAM,CAAC;AAEV,KAAK,YAAY,CAAC,CAAC,SAAS,eAAe,EAAE,CAAC,SAAS,MAAM,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAC1G,CAAC,SAAS,MAAM,CAAC,GAChB,CAAC,CAAC,CAAC,CAAC,SAAS;IAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAC/B,CAAC,GACD,OAAO,GACR,OAAO,GACR,OAAO,CAAC;AAEX,KAAK,YAAY,CAAC,CAAC,SAAS,eAAe,EAAE,CAAC,SAAS,MAAM,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAC1G,CAAC,SAAS,MAAM,CAAC,GAChB,CAAC,CAAC,CAAC,CAAC,SAAS;IAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAC/B,CAAC,GACD,OAAO,GACR,OAAO,GACR,OAAO,CAAC;AAEX,KAAK,SAAS,CAAC,CAAC,SAAS,eAAe,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpF,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,MAAM,GAC1B,MAAM,CAAC;AAEV,KAAK,SAAS,CAAC,CAAC,SAAS,eAAe,EAAE,CAAC,SAAS,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACtG,CAAC,SAAS,MAAM,CAAC,GAChB,CAAC,CAAC,CAAC,CAAC,GACJ,OAAO,GACR,OAAO,CAAC;AAEX,qBAAa,aAAa,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe;IACrE,OAAO,CAAC,GAAG,CAAU;IACrB,OAAO,CAAC,cAAc,CAAmD;IAEzE,YAAY,GAAG,EAAE,OAAO,EA0BvB;IAED,MAAM,CAAC,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAEvG;IAED,IAAI,CAAC,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAEnE;IAED,IAAI,IAAI,IAAI,OAAO,CAElB;CACD;AAED,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC","sourcesContent":["import type { Channel } from \"./channel-types.js\";\n\nexport interface ChannelContract {\n\tmethods?: Record<string, { params: unknown; return: unknown }>;\n\tevents?: Record<string, unknown>;\n}\n\ntype MethodKeys<T extends ChannelContract> = T[\"methods\"] extends Record<string, unknown>\n\t? keyof T[\"methods\"] & string\n\t: string;\n\ntype MethodParams<T extends ChannelContract, K extends string> = T[\"methods\"] extends Record<string, infer M>\n\t? K extends keyof M\n\t\t? M[K] extends { params: infer P }\n\t\t\t? P\n\t\t\t: unknown\n\t\t: unknown\n\t: unknown;\n\ntype MethodReturn<T extends ChannelContract, K extends string> = T[\"methods\"] extends Record<string, infer M>\n\t? K extends keyof M\n\t\t? M[K] extends { return: infer R }\n\t\t\t? R\n\t\t\t: unknown\n\t\t: unknown\n\t: unknown;\n\ntype EventKeys<T extends ChannelContract> = T[\"events\"] extends Record<string, unknown>\n\t? keyof T[\"events\"] & string\n\t: string;\n\ntype EventData<T extends ChannelContract, K extends string> = T[\"events\"] extends Record<string, infer E>\n\t? K extends keyof E\n\t\t? E[K]\n\t\t: unknown\n\t: unknown;\n\nexport class ServerChannel<T extends ChannelContract = ChannelContract> {\n\tprivate raw: Channel;\n\tprivate methodHandlers = new Map<string, (params: unknown) => unknown>();\n\n\tconstructor(raw: Channel) {\n\t\tthis.raw = raw;\n\n\t\tthis.raw.onReceive((data: unknown) => {\n\t\t\tconst msg = data as Record<string, unknown>;\n\t\t\tif (!(\"__call\" in msg)) return;\n\n\t\t\tconst method = msg.__call as string;\n\t\t\tconst handler = this.methodHandlers.get(method);\n\t\t\tif (!handler) return;\n\n\t\t\tconst { __call: _, invokeId, ...params } = msg;\n\t\t\tconst result = handler(params);\n\n\t\t\tif (result instanceof Promise) {\n\t\t\t\tresult.then((res) => {\n\t\t\t\t\tif (invokeId) {\n\t\t\t\t\t\tthis.raw.send({ ...(res ?? {}), invokeId });\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tif (invokeId) {\n\t\t\t\t\tthis.raw.send({ ...(result ?? {}), invokeId });\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\thandle<K extends MethodKeys<T>>(method: K, fn: (params: MethodParams<T, K>) => MethodReturn<T, K>): void {\n\t\tthis.methodHandlers.set(method, fn as (params: unknown) => unknown);\n\t}\n\n\temit<K extends EventKeys<T>>(_event: K, data: EventData<T, K>): void {\n\t\tthis.raw.send(data);\n\t}\n\n\tget raw_(): Channel {\n\t\treturn this.raw;\n\t}\n}\n\nexport type { MethodKeys, MethodParams, MethodReturn, EventKeys, EventData };\n"]}
1
+ {"version":3,"file":"server-channel.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/server-channel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,WAAW,eAAe;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,KAAK,UAAU,CAAC,CAAC,SAAS,eAAe,IAAI,MAAM,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC;AAEtF,KAAK,YAAY,CAAC,CAAC,SAAS,eAAe,EAAE,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;IAC5G,MAAM,EAAE,MAAM,CAAC,CAAC;CAChB,GACE,CAAC,GACD,OAAO,CAAC;AAEX,KAAK,YAAY,CAAC,CAAC,SAAS,eAAe,EAAE,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;IAC5G,MAAM,EAAE,MAAM,CAAC,CAAC;CAChB,GACE,CAAC,GACD,OAAO,CAAC;AAEX,KAAK,SAAS,CAAC,CAAC,SAAS,eAAe,IAAI,MAAM,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,CAAC;AAEpF,KAAK,SAAS,CAAC,CAAC,SAAS,eAAe,EAAE,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEhG,qBAAa,aAAa,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe;IACrE,OAAO,CAAC,GAAG,CAAU;IACrB,OAAO,CAAC,cAAc,CAAmD;IAEzE,YAAY,GAAG,EAAE,OAAO,EA0BvB;IAED,MAAM,CAAC,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,EAC7B,MAAM,EAAE,CAAC,EACT,EAAE,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAClF,IAAI,CAEN;IAED,IAAI,CAAC,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAEnE;IAED,IAAI,IAAI,IAAI,OAAO,CAElB;CACD;AAED,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC","sourcesContent":["import type { Channel } from \"./channel-types.js\";\n\nexport interface ChannelContract {\n\tmethods?: Record<string, { params: unknown; return: unknown }>;\n\tevents?: Record<string, unknown>;\n}\n\ntype MethodKeys<T extends ChannelContract> = keyof NonNullable<T[\"methods\"]> & string;\n\ntype MethodParams<T extends ChannelContract, K extends MethodKeys<T>> = NonNullable<T[\"methods\"]>[K] extends {\n\tparams: infer P;\n}\n\t? P\n\t: unknown;\n\ntype MethodReturn<T extends ChannelContract, K extends MethodKeys<T>> = NonNullable<T[\"methods\"]>[K] extends {\n\treturn: infer R;\n}\n\t? R\n\t: unknown;\n\ntype EventKeys<T extends ChannelContract> = keyof NonNullable<T[\"events\"]> & string;\n\ntype EventData<T extends ChannelContract, K extends EventKeys<T>> = NonNullable<T[\"events\"]>[K];\n\nexport class ServerChannel<T extends ChannelContract = ChannelContract> {\n\tprivate raw: Channel;\n\tprivate methodHandlers = new Map<string, (params: unknown) => unknown>();\n\n\tconstructor(raw: Channel) {\n\t\tthis.raw = raw;\n\n\t\tthis.raw.onReceive((data: unknown) => {\n\t\t\tconst msg = data as Record<string, unknown>;\n\t\t\tif (!(\"__call\" in msg)) return;\n\n\t\t\tconst method = msg.__call as string;\n\t\t\tconst handler = this.methodHandlers.get(method);\n\t\t\tif (!handler) return;\n\n\t\t\tconst { __call: _, invokeId, ...params } = msg;\n\t\t\tconst result = handler(params);\n\n\t\t\tif (result instanceof Promise) {\n\t\t\t\tresult.then((res) => {\n\t\t\t\t\tif (invokeId) {\n\t\t\t\t\t\tthis.raw.send({ ...(res ?? {}), invokeId });\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tif (invokeId) {\n\t\t\t\t\tthis.raw.send({ ...(result ?? {}), invokeId });\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\thandle<K extends MethodKeys<T>>(\n\t\tmethod: K,\n\t\tfn: (params: MethodParams<T, K>) => MethodReturn<T, K> | Promise<MethodReturn<T, K>>,\n\t): void {\n\t\tthis.methodHandlers.set(method, fn as (params: unknown) => unknown);\n\t}\n\n\temit<K extends EventKeys<T>>(_event: K, data: EventData<T, K>): void {\n\t\tthis.raw.send(data);\n\t}\n\n\tget raw_(): Channel {\n\t\treturn this.raw;\n\t}\n}\n\nexport type { MethodKeys, MethodParams, MethodReturn, EventKeys, EventData };\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"server-channel.js","sourceRoot":"","sources":["../../../src/core/extensions/server-channel.ts"],"names":[],"mappings":"AAqCA,MAAM,OAAO,aAAa;IACjB,GAAG,CAAU;IACb,cAAc,GAAG,IAAI,GAAG,EAAwC,CAAC;IAEzE,YAAY,GAAY,EAAE;QACzB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QAEf,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAa,EAAE,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,IAA+B,CAAC;YAC5C,IAAI,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC;gBAAE,OAAO;YAE/B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAgB,CAAC;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAChD,IAAI,CAAC,OAAO;gBAAE,OAAO;YAErB,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,GAAG,GAAG,CAAC;YAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;YAE/B,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;oBACpB,IAAI,QAAQ,EAAE,CAAC;wBACd,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;oBAC7C,CAAC;gBAAA,CACD,CAAC,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACP,IAAI,QAAQ,EAAE,CAAC;oBACd,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAChD,CAAC;YACF,CAAC;QAAA,CACD,CAAC,CAAC;IAAA,CACH;IAED,MAAM,CAA0B,MAAS,EAAE,EAAsD,EAAQ;QACxG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,EAAkC,CAAC,CAAC;IAAA,CACpE;IAED,IAAI,CAAyB,MAAS,EAAE,IAAqB,EAAQ;QACpE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAAA,CACpB;IAED,IAAI,IAAI,GAAY;QACnB,OAAO,IAAI,CAAC,GAAG,CAAC;IAAA,CAChB;CACD","sourcesContent":["import type { Channel } from \"./channel-types.js\";\n\nexport interface ChannelContract {\n\tmethods?: Record<string, { params: unknown; return: unknown }>;\n\tevents?: Record<string, unknown>;\n}\n\ntype MethodKeys<T extends ChannelContract> = T[\"methods\"] extends Record<string, unknown>\n\t? keyof T[\"methods\"] & string\n\t: string;\n\ntype MethodParams<T extends ChannelContract, K extends string> = T[\"methods\"] extends Record<string, infer M>\n\t? K extends keyof M\n\t\t? M[K] extends { params: infer P }\n\t\t\t? P\n\t\t\t: unknown\n\t\t: unknown\n\t: unknown;\n\ntype MethodReturn<T extends ChannelContract, K extends string> = T[\"methods\"] extends Record<string, infer M>\n\t? K extends keyof M\n\t\t? M[K] extends { return: infer R }\n\t\t\t? R\n\t\t\t: unknown\n\t\t: unknown\n\t: unknown;\n\ntype EventKeys<T extends ChannelContract> = T[\"events\"] extends Record<string, unknown>\n\t? keyof T[\"events\"] & string\n\t: string;\n\ntype EventData<T extends ChannelContract, K extends string> = T[\"events\"] extends Record<string, infer E>\n\t? K extends keyof E\n\t\t? E[K]\n\t\t: unknown\n\t: unknown;\n\nexport class ServerChannel<T extends ChannelContract = ChannelContract> {\n\tprivate raw: Channel;\n\tprivate methodHandlers = new Map<string, (params: unknown) => unknown>();\n\n\tconstructor(raw: Channel) {\n\t\tthis.raw = raw;\n\n\t\tthis.raw.onReceive((data: unknown) => {\n\t\t\tconst msg = data as Record<string, unknown>;\n\t\t\tif (!(\"__call\" in msg)) return;\n\n\t\t\tconst method = msg.__call as string;\n\t\t\tconst handler = this.methodHandlers.get(method);\n\t\t\tif (!handler) return;\n\n\t\t\tconst { __call: _, invokeId, ...params } = msg;\n\t\t\tconst result = handler(params);\n\n\t\t\tif (result instanceof Promise) {\n\t\t\t\tresult.then((res) => {\n\t\t\t\t\tif (invokeId) {\n\t\t\t\t\t\tthis.raw.send({ ...(res ?? {}), invokeId });\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tif (invokeId) {\n\t\t\t\t\tthis.raw.send({ ...(result ?? {}), invokeId });\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\thandle<K extends MethodKeys<T>>(method: K, fn: (params: MethodParams<T, K>) => MethodReturn<T, K>): void {\n\t\tthis.methodHandlers.set(method, fn as (params: unknown) => unknown);\n\t}\n\n\temit<K extends EventKeys<T>>(_event: K, data: EventData<T, K>): void {\n\t\tthis.raw.send(data);\n\t}\n\n\tget raw_(): Channel {\n\t\treturn this.raw;\n\t}\n}\n\nexport type { MethodKeys, MethodParams, MethodReturn, EventKeys, EventData };\n"]}
1
+ {"version":3,"file":"server-channel.js","sourceRoot":"","sources":["../../../src/core/extensions/server-channel.ts"],"names":[],"mappings":"AAyBA,MAAM,OAAO,aAAa;IACjB,GAAG,CAAU;IACb,cAAc,GAAG,IAAI,GAAG,EAAwC,CAAC;IAEzE,YAAY,GAAY,EAAE;QACzB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QAEf,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAa,EAAE,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,IAA+B,CAAC;YAC5C,IAAI,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC;gBAAE,OAAO;YAE/B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAgB,CAAC;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAChD,IAAI,CAAC,OAAO;gBAAE,OAAO;YAErB,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,GAAG,GAAG,CAAC;YAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;YAE/B,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;oBACpB,IAAI,QAAQ,EAAE,CAAC;wBACd,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;oBAC7C,CAAC;gBAAA,CACD,CAAC,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACP,IAAI,QAAQ,EAAE,CAAC;oBACd,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAChD,CAAC;YACF,CAAC;QAAA,CACD,CAAC,CAAC;IAAA,CACH;IAED,MAAM,CACL,MAAS,EACT,EAAoF,EAC7E;QACP,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,EAAkC,CAAC,CAAC;IAAA,CACpE;IAED,IAAI,CAAyB,MAAS,EAAE,IAAqB,EAAQ;QACpE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAAA,CACpB;IAED,IAAI,IAAI,GAAY;QACnB,OAAO,IAAI,CAAC,GAAG,CAAC;IAAA,CAChB;CACD","sourcesContent":["import type { Channel } from \"./channel-types.js\";\n\nexport interface ChannelContract {\n\tmethods?: Record<string, { params: unknown; return: unknown }>;\n\tevents?: Record<string, unknown>;\n}\n\ntype MethodKeys<T extends ChannelContract> = keyof NonNullable<T[\"methods\"]> & string;\n\ntype MethodParams<T extends ChannelContract, K extends MethodKeys<T>> = NonNullable<T[\"methods\"]>[K] extends {\n\tparams: infer P;\n}\n\t? P\n\t: unknown;\n\ntype MethodReturn<T extends ChannelContract, K extends MethodKeys<T>> = NonNullable<T[\"methods\"]>[K] extends {\n\treturn: infer R;\n}\n\t? R\n\t: unknown;\n\ntype EventKeys<T extends ChannelContract> = keyof NonNullable<T[\"events\"]> & string;\n\ntype EventData<T extends ChannelContract, K extends EventKeys<T>> = NonNullable<T[\"events\"]>[K];\n\nexport class ServerChannel<T extends ChannelContract = ChannelContract> {\n\tprivate raw: Channel;\n\tprivate methodHandlers = new Map<string, (params: unknown) => unknown>();\n\n\tconstructor(raw: Channel) {\n\t\tthis.raw = raw;\n\n\t\tthis.raw.onReceive((data: unknown) => {\n\t\t\tconst msg = data as Record<string, unknown>;\n\t\t\tif (!(\"__call\" in msg)) return;\n\n\t\t\tconst method = msg.__call as string;\n\t\t\tconst handler = this.methodHandlers.get(method);\n\t\t\tif (!handler) return;\n\n\t\t\tconst { __call: _, invokeId, ...params } = msg;\n\t\t\tconst result = handler(params);\n\n\t\t\tif (result instanceof Promise) {\n\t\t\t\tresult.then((res) => {\n\t\t\t\t\tif (invokeId) {\n\t\t\t\t\t\tthis.raw.send({ ...(res ?? {}), invokeId });\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tif (invokeId) {\n\t\t\t\t\tthis.raw.send({ ...(result ?? {}), invokeId });\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\thandle<K extends MethodKeys<T>>(\n\t\tmethod: K,\n\t\tfn: (params: MethodParams<T, K>) => MethodReturn<T, K> | Promise<MethodReturn<T, K>>,\n\t): void {\n\t\tthis.methodHandlers.set(method, fn as (params: unknown) => unknown);\n\t}\n\n\temit<K extends EventKeys<T>>(_event: K, data: EventData<T, K>): void {\n\t\tthis.raw.send(data);\n\t}\n\n\tget raw_(): Channel {\n\t\treturn this.raw;\n\t}\n}\n\nexport type { MethodKeys, MethodParams, MethodReturn, EventKeys, EventData };\n"]}