@suzuke/agend 1.0.0 → 1.0.2

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 (66) 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.js +37 -36
  12. package/dist/daemon.js.map +1 -1
  13. package/dist/export-import.js +2 -2
  14. package/dist/export-import.js.map +1 -1
  15. package/dist/fleet-manager.js +5 -8
  16. package/dist/fleet-manager.js.map +1 -1
  17. package/dist/setup-wizard.js +2 -2
  18. package/dist/setup-wizard.js.map +1 -1
  19. package/dist/tmux-manager.js +3 -2
  20. package/dist/tmux-manager.js.map +1 -1
  21. package/package.json +3 -5
  22. package/dist/approval/approval-server.d.ts +0 -30
  23. package/dist/approval/approval-server.js +0 -156
  24. package/dist/approval/approval-server.js.map +0 -1
  25. package/dist/approval/tmux-prompt-detector.d.ts +0 -34
  26. package/dist/approval/tmux-prompt-detector.js +0 -264
  27. package/dist/approval/tmux-prompt-detector.js.map +0 -1
  28. package/dist/backend/approval-strategy.d.ts +0 -14
  29. package/dist/backend/approval-strategy.js +0 -2
  30. package/dist/backend/approval-strategy.js.map +0 -1
  31. package/dist/backend/hook-based-approval.d.ts +0 -20
  32. package/dist/backend/hook-based-approval.js +0 -41
  33. package/dist/backend/hook-based-approval.js.map +0 -1
  34. package/dist/container-manager.d.ts +0 -24
  35. package/dist/container-manager.js +0 -148
  36. package/dist/container-manager.js.map +0 -1
  37. package/dist/db.d.ts +0 -10
  38. package/dist/db.js +0 -43
  39. package/dist/db.js.map +0 -1
  40. package/dist/install-recorder.d.ts +0 -30
  41. package/dist/install-recorder.js +0 -159
  42. package/dist/install-recorder.js.map +0 -1
  43. package/dist/meeting/orchestrator.d.ts +0 -30
  44. package/dist/meeting/orchestrator.js +0 -355
  45. package/dist/meeting/orchestrator.js.map +0 -1
  46. package/dist/meeting/prompt-builder.d.ts +0 -12
  47. package/dist/meeting/prompt-builder.js +0 -96
  48. package/dist/meeting/prompt-builder.js.map +0 -1
  49. package/dist/meeting/role-assigner.d.ts +0 -2
  50. package/dist/meeting/role-assigner.js +0 -25
  51. package/dist/meeting/role-assigner.js.map +0 -1
  52. package/dist/meeting/types.d.ts +0 -21
  53. package/dist/meeting/types.js +0 -2
  54. package/dist/meeting/types.js.map +0 -1
  55. package/dist/meeting-manager.d.ts +0 -10
  56. package/dist/meeting-manager.js +0 -38
  57. package/dist/meeting-manager.js.map +0 -1
  58. package/dist/memory-layer.d.ts +0 -13
  59. package/dist/memory-layer.js +0 -44
  60. package/dist/memory-layer.js.map +0 -1
  61. package/dist/plugin/agend/.mcp.json +0 -9
  62. package/dist/plugin/ccd-channel/.claude-plugin/plugin.json +0 -5
  63. package/dist/plugin/ccd-channel/.mcp.json +0 -9
  64. package/dist/process-manager.d.ts +0 -31
  65. package/dist/process-manager.js +0 -264
  66. package/dist/process-manager.js.map +0 -1
@@ -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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"}