@suzuke/agend 1.0.0 → 1.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.
Files changed (71) hide show
  1. package/README.md +50 -528
  2. package/README.zh-TW.md +49 -474
  3. package/dist/channel/adapters/discord.js +1 -1
  4. package/dist/channel/adapters/discord.js.map +1 -1
  5. package/dist/channel/factory.js +2 -2
  6. package/dist/channel/factory.js.map +1 -1
  7. package/dist/channel/mcp-tools.js +3 -3
  8. package/dist/channel/mcp-tools.js.map +1 -1
  9. package/dist/cli.js +1 -1
  10. package/dist/cli.js.map +1 -1
  11. package/dist/daemon.d.ts +14 -2
  12. package/dist/daemon.js +119 -46
  13. package/dist/daemon.js.map +1 -1
  14. package/dist/export-import.js +2 -2
  15. package/dist/export-import.js.map +1 -1
  16. package/dist/fleet-manager.d.ts +1 -0
  17. package/dist/fleet-manager.js +15 -9
  18. package/dist/fleet-manager.js.map +1 -1
  19. package/dist/setup-wizard.js +2 -2
  20. package/dist/setup-wizard.js.map +1 -1
  21. package/dist/tmux-control.d.ts +49 -0
  22. package/dist/tmux-control.js +184 -0
  23. package/dist/tmux-control.js.map +1 -0
  24. package/dist/tmux-manager.js +3 -2
  25. package/dist/tmux-manager.js.map +1 -1
  26. package/package.json +3 -5
  27. package/dist/approval/approval-server.d.ts +0 -30
  28. package/dist/approval/approval-server.js +0 -156
  29. package/dist/approval/approval-server.js.map +0 -1
  30. package/dist/approval/tmux-prompt-detector.d.ts +0 -34
  31. package/dist/approval/tmux-prompt-detector.js +0 -264
  32. package/dist/approval/tmux-prompt-detector.js.map +0 -1
  33. package/dist/backend/approval-strategy.d.ts +0 -14
  34. package/dist/backend/approval-strategy.js +0 -2
  35. package/dist/backend/approval-strategy.js.map +0 -1
  36. package/dist/backend/hook-based-approval.d.ts +0 -20
  37. package/dist/backend/hook-based-approval.js +0 -41
  38. package/dist/backend/hook-based-approval.js.map +0 -1
  39. package/dist/container-manager.d.ts +0 -24
  40. package/dist/container-manager.js +0 -148
  41. package/dist/container-manager.js.map +0 -1
  42. package/dist/db.d.ts +0 -10
  43. package/dist/db.js +0 -43
  44. package/dist/db.js.map +0 -1
  45. package/dist/install-recorder.d.ts +0 -30
  46. package/dist/install-recorder.js +0 -159
  47. package/dist/install-recorder.js.map +0 -1
  48. package/dist/meeting/orchestrator.d.ts +0 -30
  49. package/dist/meeting/orchestrator.js +0 -355
  50. package/dist/meeting/orchestrator.js.map +0 -1
  51. package/dist/meeting/prompt-builder.d.ts +0 -12
  52. package/dist/meeting/prompt-builder.js +0 -96
  53. package/dist/meeting/prompt-builder.js.map +0 -1
  54. package/dist/meeting/role-assigner.d.ts +0 -2
  55. package/dist/meeting/role-assigner.js +0 -25
  56. package/dist/meeting/role-assigner.js.map +0 -1
  57. package/dist/meeting/types.d.ts +0 -21
  58. package/dist/meeting/types.js +0 -2
  59. package/dist/meeting/types.js.map +0 -1
  60. package/dist/meeting-manager.d.ts +0 -10
  61. package/dist/meeting-manager.js +0 -38
  62. package/dist/meeting-manager.js.map +0 -1
  63. package/dist/memory-layer.d.ts +0 -13
  64. package/dist/memory-layer.js +0 -44
  65. package/dist/memory-layer.js.map +0 -1
  66. package/dist/plugin/agend/.mcp.json +0 -9
  67. package/dist/plugin/ccd-channel/.claude-plugin/plugin.json +0 -5
  68. package/dist/plugin/ccd-channel/.mcp.json +0 -9
  69. package/dist/process-manager.d.ts +0 -31
  70. package/dist/process-manager.js +0 -264
  71. package/dist/process-manager.js.map +0 -1
@@ -1,96 +0,0 @@
1
- const ROLE_LABELS = { pro: "正方", con: "反方", arbiter: "仲裁" };
2
- export function roleLabel(role) {
3
- return ROLE_LABELS[role] ?? role;
4
- }
5
- export function buildSystemPrompt(role, topic) {
6
- const label = roleLabel(role);
7
- switch (role) {
8
- case "pro":
9
- return `你是這場辯論的「${label}」。議題:「${topic}」。\n\n你必須站在【贊成/支持】的立場。無論你個人怎麼想,你的任務就是為這個提案辯護,找出所有支持它的理由。\n\n重要:你必須跟反方持相反立場。如果反方同意你,那代表你們其中一方搞錯立場了。你要積極反駁反方的論點。\n\n用 reply 工具回覆你的論述。`;
10
- case "con":
11
- return `你是這場辯論的「${label}」。議題:「${topic}」。\n\n你必須站在【反對/質疑】的立場。無論你個人怎麼想,你的任務就是反對這個提案,找出所有反對它的理由、風險和問題。\n\n重要:你必須跟正方持相反立場。如果正方支持這個提案,你就必須反對。不要附和正方,要挑戰和反駁他的論點。\n\n用 reply 工具回覆你的論述。`;
12
- case "arbiter":
13
- return `你是這場辯論的「${label}」。議題:「${topic}」。你的角色是客觀的仲裁者,分析正反雙方論點的優劣,指出各方的盲點和邏輯漏洞,並提出平衡的結論。\n\n用 reply 工具回覆你的分析。`;
14
- default:
15
- return `你是這場辯論的「${label}」。議題:「${topic}」。用 reply 工具回覆你的觀點。`;
16
- }
17
- }
18
- export function buildRoundPrompt(topic, round, previousRounds, userContext) {
19
- const parts = [`--- Round ${round} ---`, `議題:${topic}`];
20
- if (previousRounds.length > 0) {
21
- parts.push("\n上一輪討論摘要:");
22
- for (const entry of previousRounds) {
23
- parts.push(`[${roleLabel(entry.role)} ${entry.speaker}] ${entry.content}`);
24
- }
25
- parts.push("\n請針對以上觀點進行回應。");
26
- }
27
- else {
28
- parts.push("\n這是第一輪。請闡述你的立場。");
29
- }
30
- if (userContext) {
31
- parts.push(`\n主持人補充:${userContext}`);
32
- }
33
- return parts.join("\n");
34
- }
35
- export function buildCollabSystemPrompt(label, topic) {
36
- return `你是協作任務的參與者「${label}」。任務:「${topic}」。你在獨立的 git branch 上工作。先討論分工,確認後開始開發。完成後用 reply 工具回報進度。`;
37
- }
38
- export function buildCollabSummaryPrompt(topic, allRounds) {
39
- const parts = [`請為以下協作任務產出一份工作摘要。`, `任務:${topic}`, ""];
40
- for (const entry of allRounds) {
41
- parts.push(`[${entry.speaker}] ${entry.content}`);
42
- }
43
- parts.push("\n請總結:1) 各參與者完成了什麼 2) 未完成的工作 3) 需要注意的衝突或問題。用 reply 工具回覆摘要。");
44
- return parts.join("\n");
45
- }
46
- export function buildAngleGenerationPrompt(topic, count) {
47
- return `議題:「${topic}」\n\n請為這個議題建議 ${count} 個不同的分析角度。每個角度應該代表一個獨特的切入面向(例如:技術可行性、成本效益、使用者體驗、法規遵循等)。\n\n請用以下格式回覆,每行一個角度,不要編號:\n技術可行性\n成本效益\n...`;
48
- }
49
- export function buildDiscussionSystemPrompt(label, angle, topic) {
50
- return `你是這場討論的參與者「${label}」。議題:「${topic}」。\n\n你的分析角度是「${angle}」。請從這個角度出發,提出你的專業分析。你不需要強制支持或反對,而是從你的角度深入分析這個議題的各個面向。\n\n用 reply 工具回覆。`;
51
- }
52
- export function buildIndependentAnalysisPrompt(topic, angle) {
53
- return `請從「${angle}」的角度,獨立分析以下議題:\n\n「${topic}」\n\n這是獨立分析階段,你還沒看到其他人的觀點。請深入分析,提出你的發現、風險和建議。\n\n用 reply 工具回覆你的分析。`;
54
- }
55
- export function buildCrossDiscussionPrompt(topic, myAngle, allAnalyses) {
56
- const parts = [
57
- `議題:「${topic}」`,
58
- `你的角度:「${myAngle}」`,
59
- `\n以下是所有參與者的獨立分析:\n`,
60
- ];
61
- for (const entry of allAnalyses) {
62
- parts.push(`[${entry.speaker}] ${entry.content}\n`);
63
- }
64
- parts.push(`請從你的角度(${myAngle})回應其他人的分析。你可以同意、補充、或挑戰他們的觀點。重點指出他們可能忽略的面向。\n\n用 reply 工具回覆。`);
65
- return parts.join("\n");
66
- }
67
- export function buildConsensusPrompt(topic, allRounds) {
68
- const parts = [
69
- `議題:「${topic}」`,
70
- `\n以下是完整的討論過程:\n`,
71
- ];
72
- let currentRound = -1;
73
- for (const entry of allRounds) {
74
- if (entry.round !== currentRound) {
75
- currentRound = entry.round;
76
- parts.push(currentRound === 0 ? "\n--- 獨立分析 ---" : `\n--- 交叉討論 Round ${currentRound} ---`);
77
- }
78
- parts.push(`[${entry.speaker}] ${entry.content}`);
79
- }
80
- parts.push(`\n請綜合所有角度的分析和討論,產出一份共識結論:\n1) 各角度的關鍵發現\n2) 共識點\n3) 仍有分歧的面向\n4) 綜合建議與下一步行動\n\n用 reply 工具回覆。`);
81
- return parts.join("\n");
82
- }
83
- export function buildSummaryPrompt(topic, allRounds) {
84
- const parts = [`請為以下辯論產出一份會議摘要。`, `議題:${topic}`, ""];
85
- let currentRound = 0;
86
- for (const entry of allRounds) {
87
- if (entry.round !== currentRound) {
88
- currentRound = entry.round;
89
- parts.push(`\n--- Round ${currentRound} ---`);
90
- }
91
- parts.push(`[${roleLabel(entry.role)} ${entry.speaker}] ${entry.content}`);
92
- }
93
- parts.push("\n請總結:1) 各方主要論點 2) 共識點 3) 未解決的分歧 4) 建議的下一步行動。用 reply 工具回覆摘要。");
94
- return parts.join("\n");
95
- }
96
- //# sourceMappingURL=prompt-builder.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../../src/meeting/prompt-builder.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import type { ParticipantConfig } from "./types.js";
2
- export declare function assignRoles(count: number, customNames?: string[]): ParticipantConfig[];
@@ -1,25 +0,0 @@
1
- const LABELS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");
2
- export function assignRoles(count, customNames) {
3
- if (count < 2)
4
- throw new Error("Meeting requires at least 2 participants");
5
- const labels = customNames ?? LABELS.slice(0, count);
6
- if (labels.length < count) {
7
- throw new Error(`Not enough names: need ${count}, got ${labels.length}`);
8
- }
9
- const roles = [];
10
- if (count === 2) {
11
- roles.push("pro", "con");
12
- }
13
- else {
14
- const debaters = count - 1;
15
- const proCount = Math.floor(debaters / 2);
16
- const conCount = debaters - proCount;
17
- for (let i = 0; i < proCount; i++)
18
- roles.push("pro");
19
- for (let i = 0; i < conCount; i++)
20
- roles.push("con");
21
- roles.push("arbiter");
22
- }
23
- return labels.slice(0, count).map((label, i) => ({ label, role: roles[i] }));
24
- }
25
- //# sourceMappingURL=role-assigner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"role-assigner.js","sourceRoot":"","sources":["../../src/meeting/role-assigner.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,GAAG,4BAA4B,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAEtD,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,WAAsB;IAC/D,IAAI,KAAK,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAE3E,MAAM,MAAM,GAAG,WAAW,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACrD,IAAI,MAAM,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,GAAG,KAAK,GAAG,CAAC,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;QACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/E,CAAC"}
@@ -1,21 +0,0 @@
1
- export type MeetingRole = "pro" | "con" | "arbiter" | (string & {});
2
- export type MeetingMode = "debate" | "collab" | "discussion";
3
- export interface MeetingConfig {
4
- meetingId: string;
5
- topic: string;
6
- mode: MeetingMode;
7
- maxRounds: number;
8
- repo?: string;
9
- angles?: string[];
10
- }
11
- export interface EphemeralInstanceConfig {
12
- systemPrompt: string;
13
- workingDirectory: string;
14
- lightweight?: boolean;
15
- skipPermissions?: boolean;
16
- backend?: string;
17
- }
18
- export type RouteTarget = {
19
- kind: "instance";
20
- name: string;
21
- };
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/meeting/types.ts"],"names":[],"mappings":""}
@@ -1,10 +0,0 @@
1
- import type { FleetContext } from "./fleet-context.js";
2
- export declare class MeetingManager {
3
- private ctx;
4
- private ephemeralTopicMap;
5
- constructor(ctx: FleetContext);
6
- /** Get the ephemeral topic ID for an instance (used by fleet-manager for outbound routing) */
7
- getEphemeralTopicId(instanceName: string): number | undefined;
8
- /** Clean up ephemeral instance resources (worktree, topic map). Called on topic deletion. */
9
- cleanupEphemeral(name: string): Promise<void>;
10
- }
@@ -1,38 +0,0 @@
1
- import { existsSync, mkdirSync } from "node:fs";
2
- import { join, dirname } from "node:path";
3
- import { homedir } from "node:os";
4
- const WORKTREE_DIR = join(homedir(), ".claude-channel-daemon", "tmp");
5
- export class MeetingManager {
6
- ctx;
7
- ephemeralTopicMap = new Map();
8
- constructor(ctx) {
9
- this.ctx = ctx;
10
- mkdirSync(WORKTREE_DIR, { recursive: true });
11
- }
12
- /** Get the ephemeral topic ID for an instance (used by fleet-manager for outbound routing) */
13
- getEphemeralTopicId(instanceName) {
14
- return this.ephemeralTopicMap.get(instanceName);
15
- }
16
- /** Clean up ephemeral instance resources (worktree, topic map). Called on topic deletion. */
17
- async cleanupEphemeral(name) {
18
- this.ephemeralTopicMap.delete(name);
19
- const worktreePath = join(WORKTREE_DIR, `ccd-collab-${name}`);
20
- if (!existsSync(worktreePath))
21
- return;
22
- try {
23
- const { execFileSync } = await import("child_process");
24
- const mainRepo = execFileSync("git", ["rev-parse", "--git-common-dir"], { cwd: worktreePath, stdio: "pipe" }).toString().trim();
25
- const mainRepoDir = dirname(mainRepo);
26
- execFileSync("git", ["worktree", "remove", "--force", worktreePath], { cwd: mainRepoDir, stdio: "pipe" });
27
- try {
28
- execFileSync("git", ["branch", "-D", `meet/${name}`], { cwd: mainRepoDir, stdio: "pipe" });
29
- }
30
- catch { /* branch may not exist */ }
31
- this.ctx.logger.info({ name }, "Cleaned up ephemeral worktree");
32
- }
33
- catch (err) {
34
- this.ctx.logger.warn({ name, err }, "Failed to clean up ephemeral worktree");
35
- }
36
- }
37
- }
38
- //# sourceMappingURL=meeting-manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"meeting-manager.js","sourceRoot":"","sources":["../src/meeting-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGlC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,wBAAwB,EAAE,KAAK,CAAC,CAAC;AAEtE,MAAM,OAAO,cAAc;IAGL;IAFZ,iBAAiB,GAAwB,IAAI,GAAG,EAAE,CAAC;IAE3D,YAAoB,GAAiB;QAAjB,QAAG,GAAH,GAAG,CAAc;QACnC,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,8FAA8F;IAC9F,mBAAmB,CAAC,YAAoB;QACtC,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAClD,CAAC;IAED,6FAA6F;IAC7F,KAAK,CAAC,gBAAgB,CAAC,IAAY;QACjC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEpC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,cAAc,IAAI,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;YAAE,OAAO;QAEtC,IAAI,CAAC;YACH,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;YACvD,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,kBAAkB,CAAC,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;YAChI,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YACtC,YAAY,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,CAAC,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1G,IAAI,CAAC;gBACH,YAAY,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YAC7F,CAAC;YAAC,MAAM,CAAC,CAAC,0BAA0B,CAAC,CAAC;YACtC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,+BAA+B,CAAC,CAAC;QAClE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,uCAAuC,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;CAEF"}
@@ -1,13 +0,0 @@
1
- import { EventEmitter } from "node:events";
2
- import type { MemoryDb } from "./db.js";
3
- import type { Logger } from "./logger.js";
4
- export declare class MemoryLayer extends EventEmitter {
5
- private memoryDir;
6
- private db;
7
- private logger;
8
- private watcher;
9
- constructor(memoryDir: string, db: MemoryDb, logger: Logger);
10
- start(): Promise<void>;
11
- stop(): Promise<void>;
12
- private backupFile;
13
- }
@@ -1,44 +0,0 @@
1
- import { EventEmitter } from "node:events";
2
- import { watch } from "chokidar";
3
- import { readFileSync } from "node:fs";
4
- export class MemoryLayer extends EventEmitter {
5
- memoryDir;
6
- db;
7
- logger;
8
- watcher = null;
9
- constructor(memoryDir, db, logger) {
10
- super();
11
- this.memoryDir = memoryDir;
12
- this.db = db;
13
- this.logger = logger;
14
- }
15
- async start() {
16
- this.logger.info({ dir: this.memoryDir }, "Watching memory directory");
17
- this.watcher = watch(this.memoryDir, {
18
- ignoreInitial: false,
19
- awaitWriteFinish: { stabilityThreshold: 200 },
20
- });
21
- this.watcher.on("add", (path) => this.backupFile(path));
22
- this.watcher.on("change", (path) => this.backupFile(path));
23
- this.watcher.on("error", (err) => this.logger.error({ err }, "Memory watcher error"));
24
- }
25
- async stop() {
26
- if (this.watcher) {
27
- await this.watcher.close();
28
- this.watcher = null;
29
- }
30
- this.db.close();
31
- }
32
- backupFile(filePath) {
33
- try {
34
- const content = readFileSync(filePath, "utf-8");
35
- this.db.insertBackup(filePath, content, null);
36
- this.logger.info({ filePath }, "Memory file backed up");
37
- this.emit("file_changed", filePath);
38
- }
39
- catch (err) {
40
- this.logger.error({ err, filePath }, "Failed to backup memory file");
41
- }
42
- }
43
- }
44
- //# sourceMappingURL=memory-layer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"memory-layer.js","sourceRoot":"","sources":["../src/memory-layer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAkB,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAIvC,MAAM,OAAO,WAAY,SAAQ,YAAY;IAIjC;IACA;IACA;IALF,OAAO,GAAqB,IAAI,CAAC;IAEzC,YACU,SAAiB,EACjB,EAAY,EACZ,MAAc;QAEtB,KAAK,EAAE,CAAC;QAJA,cAAS,GAAT,SAAS,CAAQ;QACjB,OAAE,GAAF,EAAE,CAAU;QACZ,WAAM,GAAN,MAAM,CAAQ;IAGxB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,2BAA2B,CAAC,CAAC;QAEvE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE;YACnC,aAAa,EAAE,KAAK;YACpB,gBAAgB,EAAE,EAAE,kBAAkB,EAAE,GAAG,EAAE;SAC9C,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,sBAAsB,CAAC,CAAC,CAAC;IACxF,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;IAEO,UAAU,CAAC,QAAgB;QACjC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAChD,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YAC9C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,uBAAuB,CAAC,CAAC;YACxD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,8BAA8B,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;CACF"}
@@ -1,9 +0,0 @@
1
- {
2
- "agend": {
3
- "command": "node",
4
- "args": ["${CLAUDE_PLUGIN_ROOT}/server.js"],
5
- "env": {
6
- "AGEND_SOCKET_PATH": "${AGEND_SOCKET_PATH}"
7
- }
8
- }
9
- }
@@ -1,5 +0,0 @@
1
- {
2
- "name": "ccd-channel",
3
- "version": "0.3.1",
4
- "description": "Built-in channel server for claude-channel-daemon"
5
- }
@@ -1,9 +0,0 @@
1
- {
2
- "ccd-channel": {
3
- "command": "node",
4
- "args": ["${CLAUDE_PLUGIN_ROOT}/server.js"],
5
- "env": {
6
- "CCD_SOCKET_PATH": "${CCD_SOCKET_PATH}"
7
- }
8
- }
9
- }
@@ -1,31 +0,0 @@
1
- import { EventEmitter } from "node:events";
2
- import type { DaemonConfig } from "./types.js";
3
- import type { Logger } from "./logger.js";
4
- export declare const STATUSLINE_FILE: string;
5
- export declare class ProcessManager extends EventEmitter {
6
- private config;
7
- private logger;
8
- private term;
9
- private running;
10
- private retryCount;
11
- private shuttingDown;
12
- private restartTimer;
13
- private uptimeTimer;
14
- private sessionId;
15
- private suppressSessionCapture;
16
- constructor(config: DaemonConfig, logger: Logger);
17
- isRunning(): boolean;
18
- start(): Promise<void>;
19
- stop(): Promise<void>;
20
- /** Clear saved session ID so next start creates a fresh session. */
21
- clearSessionId(): void;
22
- sendInput(text: string): void;
23
- private ensureStatusLineScript;
24
- private ensureSpawnHelper;
25
- private resolveClaudeBin;
26
- private spawnChild;
27
- private scheduleRestart;
28
- private getBackoffDelay;
29
- private loadSessionId;
30
- private saveSessionId;
31
- }
@@ -1,264 +0,0 @@
1
- import pty from "node-pty";
2
- import { EventEmitter } from "node:events";
3
- import { execSync, execFileSync } from "node:child_process";
4
- import { existsSync, readFileSync, writeFileSync } from "node:fs";
5
- import { join } from "node:path";
6
- import { homedir } from "node:os";
7
- import stripAnsi from "strip-ansi";
8
- const DATA_DIR = join(homedir(), ".claude-channel-daemon");
9
- const SESSION_FILE = join(DATA_DIR, "session-id");
10
- export const STATUSLINE_FILE = join(DATA_DIR, "statusline.json");
11
- const STATUSLINE_SCRIPT = join(DATA_DIR, "statusline.sh");
12
- export class ProcessManager extends EventEmitter {
13
- config;
14
- logger;
15
- term = null;
16
- running = false;
17
- retryCount = 0;
18
- shuttingDown = false;
19
- restartTimer = null;
20
- uptimeTimer = null;
21
- sessionId = null;
22
- suppressSessionCapture = false;
23
- constructor(config, logger) {
24
- super();
25
- this.config = config;
26
- this.logger = logger;
27
- this.loadSessionId();
28
- }
29
- isRunning() {
30
- return this.running;
31
- }
32
- async start() {
33
- if (this.running) {
34
- this.logger.warn("Process already running");
35
- return;
36
- }
37
- this.shuttingDown = false;
38
- this.suppressSessionCapture = false;
39
- this.ensureSpawnHelper();
40
- this.ensureStatusLineScript();
41
- this.spawnChild();
42
- }
43
- async stop() {
44
- this.shuttingDown = true;
45
- if (this.restartTimer) {
46
- clearTimeout(this.restartTimer);
47
- this.restartTimer = null;
48
- }
49
- if (this.uptimeTimer) {
50
- clearTimeout(this.uptimeTimer);
51
- this.uptimeTimer = null;
52
- }
53
- if (!this.term)
54
- return;
55
- // Send /exit to claude for graceful shutdown
56
- this.term.write("/exit\r");
57
- return new Promise((resolve) => {
58
- const forceKillTimer = setTimeout(() => {
59
- try {
60
- this.term?.kill();
61
- }
62
- catch { }
63
- }, 5000);
64
- this.term.onExit(() => {
65
- clearTimeout(forceKillTimer);
66
- this.term = null;
67
- this.running = false;
68
- resolve();
69
- });
70
- });
71
- }
72
- /** Clear saved session ID so next start creates a fresh session. */
73
- clearSessionId() {
74
- this.sessionId = null;
75
- this.suppressSessionCapture = true;
76
- this.saveSessionId();
77
- this.logger.info("Session ID cleared — next start will create a fresh session");
78
- }
79
- sendInput(text) {
80
- if (!this.term || !this.running) {
81
- this.logger.warn("Cannot send input: process not running");
82
- return;
83
- }
84
- this.term.write(text + "\r");
85
- }
86
- ensureStatusLineScript() {
87
- // Tee stdin JSON to our file, then pipe to the user's original statusLine command.
88
- const script = `#!/bin/bash
89
- INPUT=$(cat)
90
- echo "$INPUT" > "${STATUSLINE_FILE}"
91
- if command -v ccline &>/dev/null; then
92
- echo "$INPUT" | ccline
93
- else
94
- echo "ok"
95
- fi
96
- `;
97
- writeFileSync(STATUSLINE_SCRIPT, script, { mode: 0o755 });
98
- // Write a settings file (not CLI flag) so it doesn't conflict with
99
- // other --settings injected by tools like cmux
100
- const settingsFile = join(DATA_DIR, "claude-settings.json");
101
- const settings = {
102
- hooks: {
103
- PreToolUse: [
104
- {
105
- matcher: "*",
106
- hooks: [
107
- {
108
- type: "command",
109
- command: "curl -s -X POST http://127.0.0.1:18321/approve -H 'Content-Type: application/json' -d @- --max-time 130 --connect-timeout 1 || echo '{\"hookSpecificOutput\":{\"hookEventName\":\"PreToolUse\",\"permissionDecision\":\"deny\",\"permissionDecisionReason\":\"approval server unreachable — denied for safety\"}}'",
110
- timeout: 135000,
111
- },
112
- ],
113
- },
114
- ],
115
- },
116
- permissions: {
117
- allow: [
118
- "Read", "Edit", "Write", "Glob", "Grep",
119
- "Bash(*)", "WebFetch", "WebSearch", "Agent", "Skill",
120
- "mcp__plugin_telegram_telegram__reply",
121
- "mcp__plugin_telegram_telegram__react",
122
- "mcp__plugin_telegram_telegram__edit_message",
123
- ],
124
- deny: [
125
- "Bash(rm -rf /)", "Bash(rm -rf /*)",
126
- "Bash(rm -rf ~)", "Bash(rm -rf ~/*)",
127
- "Bash(git push * --force *)", "Bash(git push --force *)",
128
- "Bash(git reset --hard *)", "Bash(git clean -fd *)",
129
- "Bash(git clean -f *)", "Bash(dd *)", "Bash(mkfs *)",
130
- ],
131
- defaultMode: "default",
132
- },
133
- statusLine: {
134
- type: "command",
135
- command: STATUSLINE_SCRIPT,
136
- },
137
- };
138
- writeFileSync(settingsFile, JSON.stringify(settings));
139
- }
140
- ensureSpawnHelper() {
141
- // node-pty's spawn-helper loses +x after npm install on macOS
142
- try {
143
- const helperPath = join(process.cwd(), "node_modules/node-pty/prebuilds", `${process.platform}-${process.arch}`, "spawn-helper");
144
- if (existsSync(helperPath)) {
145
- execFileSync("chmod", ["+x", helperPath]);
146
- }
147
- }
148
- catch {
149
- // Best effort — may not be needed on all platforms
150
- }
151
- }
152
- resolveClaudeBin() {
153
- try {
154
- return execSync("which claude", { encoding: "utf8" }).trim();
155
- }
156
- catch {
157
- return "claude";
158
- }
159
- }
160
- spawnChild() {
161
- const claudeBin = this.resolveClaudeBin();
162
- const args = [];
163
- // Channel mode: route Telegram messages as user prompts
164
- args.push("--channels", `plugin:${this.config.channel_plugin}`);
165
- // Settings file has: permissions (bypassPermissions), PreToolUse hook (→ Telegram approval), statusLine
166
- const settingsFile = join(DATA_DIR, "claude-settings.json");
167
- args.push("--settings", settingsFile);
168
- // Resume previous session if available
169
- if (this.sessionId) {
170
- args.push("--resume", this.sessionId);
171
- this.logger.info({ sessionId: this.sessionId }, "Resuming previous session");
172
- }
173
- this.logger.info({ claudeBin, args: args.map(a => a.length > 50 ? a.slice(0, 50) + "..." : a), cwd: this.config.working_directory }, "Spawning claude via PTY");
174
- this.term = pty.spawn(claudeBin, args, {
175
- name: "xterm-256color",
176
- cols: 220,
177
- rows: 50,
178
- cwd: this.config.working_directory,
179
- env: {
180
- ...process.env,
181
- TERM: "xterm-256color",
182
- },
183
- });
184
- this.running = true;
185
- this.term.onData((data) => {
186
- const clean = stripAnsi(data);
187
- if (clean.trim()) {
188
- this.emit("stdout", clean);
189
- this.logger.debug({ stdout: clean.trim().slice(0, 200) }, "claude stdout");
190
- }
191
- // Handle PTY permission prompts (hard-coded path protection)
192
- // These only fire for .git/, .claude/, .vscode/, .idea/ writes
193
- // that bypass acceptEdits. PreToolUse hook already handles tool-level permissions.
194
- // Claude Code shows: "1.Yes 2.Yes,andallow... 3.No"
195
- if (clean.includes("1.Yes") && clean.includes("3.No")) {
196
- this.logger.warn("PTY permission prompt detected — forwarding to Telegram");
197
- this.emit("permission_prompt", clean);
198
- }
199
- // Capture session ID from output (claude prints: claude --resume <uuid>)
200
- const resumeMatch = clean.match(/--resume\s+([0-9a-f-]{36})/);
201
- if (resumeMatch && !this.suppressSessionCapture) {
202
- this.sessionId = resumeMatch[1];
203
- this.saveSessionId();
204
- this.logger.info({ sessionId: this.sessionId }, "Captured session ID for resume");
205
- }
206
- });
207
- this.term.onExit(({ exitCode, signal }) => {
208
- this.logger.info({ exitCode, signal }, "claude process exited");
209
- this.term = null;
210
- this.running = false;
211
- this.emit("exited", { code: exitCode, signal });
212
- if (!this.shuttingDown) {
213
- this.scheduleRestart();
214
- }
215
- });
216
- // Reset retry counter after stable uptime
217
- this.uptimeTimer = setTimeout(() => {
218
- this.retryCount = 0;
219
- this.logger.info("Uptime threshold reached, retry counter reset");
220
- }, this.config.restart_policy.reset_after * 1000);
221
- this.emit("started");
222
- }
223
- scheduleRestart() {
224
- if (this.shuttingDown)
225
- return;
226
- if (this.retryCount >= this.config.restart_policy.max_retries) {
227
- this.logger.error("Max retries reached, giving up");
228
- this.emit("max_retries_reached");
229
- return;
230
- }
231
- const delay = this.getBackoffDelay(this.retryCount);
232
- this.retryCount++;
233
- this.logger.info({ delay, retryCount: this.retryCount }, "Scheduling restart");
234
- this.restartTimer = setTimeout(() => {
235
- this.spawnChild();
236
- }, delay);
237
- }
238
- getBackoffDelay(attempt) {
239
- const base = 1000;
240
- const max = 60000;
241
- if (this.config.restart_policy.backoff === "exponential") {
242
- return Math.min(base * Math.pow(2, attempt), max);
243
- }
244
- return Math.min(base * (attempt + 1), max);
245
- }
246
- loadSessionId() {
247
- try {
248
- if (existsSync(SESSION_FILE)) {
249
- this.sessionId = readFileSync(SESSION_FILE, "utf-8").trim();
250
- if (this.sessionId) {
251
- this.logger.info({ sessionId: this.sessionId }, "Loaded previous session ID");
252
- }
253
- }
254
- }
255
- catch { }
256
- }
257
- saveSessionId() {
258
- try {
259
- writeFileSync(SESSION_FILE, this.sessionId ?? "");
260
- }
261
- catch { }
262
- }
263
- }
264
- //# sourceMappingURL=process-manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"process-manager.js","sourceRoot":"","sources":["../src/process-manager.ts"],"names":[],"mappings":"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"}