@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.
- package/README.md +1 -1
- package/README.zh-TW.md +1 -1
- package/dist/channel/access-manager.d.ts +2 -2
- package/dist/channel/access-manager.js +2 -0
- package/dist/channel/access-manager.js.map +1 -1
- package/dist/cli.js +105 -32
- package/dist/cli.js.map +1 -1
- package/dist/fleet-manager.js +4 -1
- package/dist/fleet-manager.js.map +1 -1
- package/dist/general-knowledge/skills.md +120 -0
- package/dist/logger.d.ts +0 -2
- package/dist/logger.js +2 -16
- package/dist/logger.js.map +1 -1
- package/dist/outbound-schemas.d.ts +1 -1
- package/dist/types.d.ts +1 -1
- package/package.json +1 -1
|
@@ -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,
|
|
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
|
-
|
|
41
|
+
rotateLogIfNeeded(LOG_FILE);
|
|
56
42
|
return pino({
|
|
57
43
|
level,
|
|
58
44
|
transport: {
|
package/dist/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,
|
|
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