@songsid/agend 0.0.5 → 0.0.7

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.
@@ -175,3 +175,123 @@ templates: # Reusable fleet deployment templates
175
175
  - `describe_instance("<name>")` — shows status, last activity, description
176
176
  - `tmux capture-pane -t agend:<name> -p | tail -20` — see actual CLI screen
177
177
  - Look for `X% !>` prompt = idle, `Thinking...` = busy, `error` = needs attention
178
+
179
+ ## 10. Safe Update & Restart
180
+
181
+ **Update AgEnD to latest version:**
182
+ ```bash
183
+ agend update # update to latest
184
+ agend update --version 0.0.6 # pin specific version
185
+ ```
186
+
187
+ The `agend update` command automatically:
188
+ - Detects if sudo is needed (switches to nvm if so)
189
+ - Installs new version
190
+ - Verifies installation succeeded
191
+ - Updates service file (ExecStart path)
192
+ - Restarts fleet
193
+
194
+ **Manual restart (if update isn't needed):**
195
+ ```bash
196
+ agend fleet restart # graceful restart (SIGUSR2) — keeps sessions, reloads config
197
+ agend fleet stop && agend fleet start # full restart — new code takes effect
198
+ ```
199
+
200
+ **NEVER do:**
201
+ - `kill -9` on the fleet process (corrupts state)
202
+ - Edit fleet.yaml while fleet is restarting
203
+ - Run `agend update` while another update is in progress
204
+
205
+ ## 11. Model Names by Backend
206
+
207
+ Models are specified in fleet.yaml `defaults.model` or per-instance `model` field.
208
+
209
+ | Backend | Model Names | Default |
210
+ |---------|-------------|---------|
211
+ | **kiro-cli** | `claude-sonnet-4-20250514`, `claude-opus-4-20250514`, `claude-haiku-3-20250307` | auto (latest) |
212
+ | **claude-code** | `sonnet`, `opus`, `haiku`, `opusplan`, `best`, `sonnet[1m]`, `opus[1m]` | sonnet |
213
+ | **gemini-cli** | `gemini-2.5-pro`, `gemini-2.5-flash` | auto |
214
+ | **codex** | `gpt-4o`, `o3`, `o4-mini` | gpt-4o |
215
+ | **opencode** | depends on provider config | — |
216
+
217
+ **Important:** kiro-cli uses FULL model IDs (e.g. `claude-sonnet-4-20250514`), NOT short names like `sonnet`. Claude Code uses short names. Don't mix them up.
218
+
219
+ Example fleet.yaml:
220
+ ```yaml
221
+ defaults:
222
+ backend: kiro-cli
223
+ model: claude-sonnet-4-20250514
224
+
225
+ instances:
226
+ heavy-task:
227
+ model: claude-opus-4-20250514
228
+ ```
229
+
230
+ ## 12. Config Validation
231
+
232
+ **Before editing fleet.yaml or classicBot.yaml, always validate after:**
233
+
234
+ ```bash
235
+ # Validate fleet.yaml syntax
236
+ agend fleet start --dry-run 2>&1 | head -5
237
+ # Or simply:
238
+ node -e "const yaml = require('js-yaml'); const fs = require('fs'); yaml.load(fs.readFileSync('$HOME/.agend/fleet.yaml', 'utf-8')); console.log('✓ valid YAML')"
239
+ ```
240
+
241
+ **Common fleet.yaml mistakes:**
242
+ - Missing `channel.mode` field → error on start
243
+ - Wrong indentation (YAML is indent-sensitive)
244
+ - `topic_id` as string vs number (both work, but be consistent)
245
+ - `backend` typo (valid: `claude-code`, `gemini-cli`, `codex`, `opencode`, `kiro-cli`)
246
+ - `model` using wrong format for the backend
247
+
248
+ **classicBot.yaml validation:**
249
+ ```bash
250
+ node -e "const yaml = require('js-yaml'); const fs = require('fs'); yaml.load(fs.readFileSync('$HOME/.agend/classicBot.yaml', 'utf-8')); console.log('✓ valid YAML')"
251
+ ```
252
+
253
+ **Common classicBot.yaml mistakes:**
254
+ - `allowed_guilds` values must be strings (Discord IDs are too large for YAML integers)
255
+ - Channel IDs as keys must be quoted strings
256
+ - Missing `defaults` section (optional but recommended)
257
+
258
+ **After editing config:**
259
+ ```bash
260
+ agend reload # hot-reload (SIGHUP) — adds/removes instances without restart
261
+ agend fleet restart # if channel/defaults changed — needs full restart
262
+ ```
263
+
264
+ ## 13. What NOT to Do (Dangerous Operations)
265
+
266
+ - **Don't delete `~/.agend/fleet.yaml`** while fleet is running
267
+ - **Don't delete `~/.agend/fleet.pid`** manually — use `agend fleet stop`
268
+ - **Don't kill tmux server** (`tmux kill-server`) — kills all agent sessions
269
+ - **Don't edit instance output.log** — it's actively written by the daemon
270
+ - **Don't run two fleet processes** on the same AGEND_HOME — port/socket conflicts
271
+ - **Don't change `channel.group_id`** without re-creating all topics — routing breaks
272
+ - **Don't remove an instance from fleet.yaml** that has active work — stop it first
273
+
274
+ ## 14. Access Mode Reference
275
+
276
+ fleet.yaml `channel.access.mode` valid values:
277
+
278
+ | Mode | Behavior |
279
+ |------|----------|
280
+ | `locked` | Only `allowed_users` can interact (default) |
281
+ | `pairing` | Users can request access via `/pair` command |
282
+ | `open` | All users can interact, no restrictions |
283
+
284
+ Example:
285
+ ```yaml
286
+ channel:
287
+ access:
288
+ mode: open # everyone can use
289
+ # mode: locked # whitelist only (add allowed_users)
290
+ # mode: pairing # users self-register via /pair
291
+ allowed_users: [123456789] # only needed for locked/pairing
292
+ ```
293
+
294
+ **When to use each:**
295
+ - `locked` — production, private bot, security-sensitive
296
+ - `pairing` — semi-open, users request access with admin approval
297
+ - `open` — public demo, shared team bot, testing
package/dist/logger.d.ts CHANGED
@@ -1,6 +1,4 @@
1
1
  import pino from "pino";
2
- /** Truncate log to tail when it exceeds MAX_LOG_SIZE (no rotation/backup files) */
3
- export declare function truncateLogIfNeeded(logPath: string): void;
4
2
  /** Rotate a log file: foo.log → foo.log.1 → foo.log.2 → foo.log.3 (deleted) */
5
3
  export declare function rotateLogIfNeeded(logPath: string, maxSize?: number, maxFiles?: number): void;
6
4
  export declare function createLogger(level?: string): pino.Logger<never, boolean>;
package/dist/logger.js CHANGED
@@ -1,25 +1,11 @@
1
1
  import pino from "pino";
2
2
  import { join } from "node:path";
3
- import { mkdirSync, statSync, readFileSync, writeFileSync, renameSync, unlinkSync, existsSync } from "node:fs";
3
+ import { mkdirSync, statSync, existsSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
4
4
  import { getAgendHome } from "./paths.js";
5
5
  const DATA_DIR = getAgendHome();
6
6
  const LOG_FILE = join(DATA_DIR, "daemon.log");
7
7
  const MAX_LOG_SIZE = 10 * 1024 * 1024; // 10 MB
8
- const TRUNCATE_TO = 5 * 1024 * 1024; // keep last 5 MB
9
8
  const ROTATE_MAX_FILES = 3;
10
- /** Truncate log to tail when it exceeds MAX_LOG_SIZE (no rotation/backup files) */
11
- export function truncateLogIfNeeded(logPath) {
12
- try {
13
- const stat = statSync(logPath);
14
- if (stat.size < MAX_LOG_SIZE)
15
- return;
16
- const buf = readFileSync(logPath);
17
- const tail = buf.subarray(buf.length - TRUNCATE_TO);
18
- const nl = tail.indexOf(0x0a);
19
- writeFileSync(logPath, nl >= 0 ? tail.subarray(nl + 1) : tail);
20
- }
21
- catch { /* file may not exist yet */ }
22
- }
23
9
  /** Rotate a log file: foo.log → foo.log.1 → foo.log.2 → foo.log.3 (deleted) */
24
10
  export function rotateLogIfNeeded(logPath, maxSize = MAX_LOG_SIZE, maxFiles = ROTATE_MAX_FILES) {
25
11
  try {
@@ -52,7 +38,7 @@ export function rotateLogIfNeeded(logPath, maxSize = MAX_LOG_SIZE, maxFiles = RO
52
38
  }
53
39
  export function createLogger(level = "info") {
54
40
  mkdirSync(DATA_DIR, { recursive: true });
55
- truncateLogIfNeeded(LOG_FILE);
41
+ rotateLogIfNeeded(LOG_FILE);
56
42
  return pino({
57
43
  level,
58
44
  transport: {
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;AAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;AAC9C,MAAM,YAAY,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,QAAQ;AAC/C,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAE3B,+EAA+E;AAC/E,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,OAAO,GAAG,YAAY,EAAE,QAAQ,GAAG,gBAAgB;IACpG,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO;QACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,IAAI,GAAG,OAAO;YAAE,OAAO;QAEhC,+BAA+B;QAC/B,KAAK,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACtD,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAAC,IAAI,CAAC;oBAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;YAAC,CAAC;YACzD,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC;oBAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;YAAC,CAAC;QACjE,CAAC;QACD,uBAAuB;QACvB,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB,MAAM;IACjD,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC5B,OAAO,IAAI,CAAC;QACV,KAAK;QACL,SAAS,EAAE;YACT,OAAO,EAAE;gBACP;oBACE,MAAM,EAAE,aAAa;oBACrB,OAAO,EAAE;wBACP,WAAW,EAAE,CAAC;wBACd,QAAQ,EAAE,IAAI;wBACd,aAAa,EAAE,cAAc;wBAC7B,MAAM,EAAE,cAAc;qBACvB;oBACD,KAAK;iBACN;gBACD;oBACE,MAAM,EAAE,aAAa;oBACrB,OAAO,EAAE;wBACP,WAAW,EAAE,QAAQ;wBACrB,QAAQ,EAAE,KAAK;wBACf,aAAa,EAAE,cAAc;wBAC7B,MAAM,EAAE,cAAc;qBACvB;oBACD,KAAK;iBACN;aACF;SACF;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -72,8 +72,8 @@ export declare const TaskBoardArgs: z.ZodObject<{
72
72
  id: z.ZodOptional<z.ZodString>;
73
73
  result: z.ZodOptional<z.ZodString>;
74
74
  status: z.ZodOptional<z.ZodEnum<{
75
- done: "done";
76
75
  open: "open";
76
+ done: "done";
77
77
  claimed: "claimed";
78
78
  blocked: "blocked";
79
79
  cancelled: "cancelled";
package/dist/types.d.ts CHANGED
@@ -33,7 +33,7 @@ export interface StatusLineData {
33
33
  };
34
34
  }
35
35
  export interface AccessConfig {
36
- mode: "pairing" | "locked";
36
+ mode: "pairing" | "locked" | "open";
37
37
  allowed_users: (number | string)[];
38
38
  max_pending_codes: number;
39
39
  code_expiry_minutes: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@songsid/agend",
3
- "version": "0.0.5",
3
+ "version": "0.0.7",
4
4
  "description": "Multi-agent fleet daemon — run any coding CLI (Claude, Gemini, Codex, OpenCode) from Telegram",
5
5
  "type": "module",
6
6
  "workspaces": ["plugins/*"],