skyloom 1.14.5 → 1.14.8

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 (57) hide show
  1. package/.github/workflows/publish.yml +27 -0
  2. package/README.md +523 -220
  3. package/dist/cli/loom.d.ts +2 -0
  4. package/dist/cli/loom.d.ts.map +1 -1
  5. package/dist/cli/loom.js +76 -7
  6. package/dist/cli/loom.js.map +1 -1
  7. package/dist/cli/main.js +12 -3
  8. package/dist/cli/main.js.map +1 -1
  9. package/dist/core/agent/guard.js +4 -4
  10. package/dist/core/agent/guard.js.map +1 -1
  11. package/dist/core/agent.d.ts.map +1 -1
  12. package/dist/core/agent.js +12 -9
  13. package/dist/core/agent.js.map +1 -1
  14. package/dist/core/agent_helpers.d.ts +2 -2
  15. package/dist/core/agent_helpers.d.ts.map +1 -1
  16. package/dist/core/agent_helpers.js +7 -4
  17. package/dist/core/agent_helpers.js.map +1 -1
  18. package/dist/core/config.d.ts.map +1 -1
  19. package/dist/core/config.js +8 -2
  20. package/dist/core/config.js.map +1 -1
  21. package/dist/core/memory.d.ts.map +1 -1
  22. package/dist/core/memory.js +12 -2
  23. package/dist/core/memory.js.map +1 -1
  24. package/dist/core/model_config.d.ts.map +1 -1
  25. package/dist/core/model_config.js +7 -2
  26. package/dist/core/model_config.js.map +1 -1
  27. package/dist/plugins/loader.d.ts +7 -0
  28. package/dist/plugins/loader.d.ts.map +1 -1
  29. package/dist/plugins/loader.js +27 -0
  30. package/dist/plugins/loader.js.map +1 -1
  31. package/dist/tools/builtin.d.ts +6 -0
  32. package/dist/tools/builtin.d.ts.map +1 -1
  33. package/dist/tools/builtin.js +332 -41
  34. package/dist/tools/builtin.js.map +1 -1
  35. package/dist/tools/computer.d.ts.map +1 -1
  36. package/dist/tools/computer.js +18 -7
  37. package/dist/tools/computer.js.map +1 -1
  38. package/dist/web/server.d.ts.map +1 -1
  39. package/dist/web/server.js +35 -2
  40. package/dist/web/server.js.map +1 -1
  41. package/package.json +68 -68
  42. package/src/cli/loom.ts +66 -7
  43. package/src/cli/main.ts +6 -3
  44. package/src/core/agent/guard.ts +4 -4
  45. package/src/core/agent.ts +12 -8
  46. package/src/core/agent_helpers.ts +7 -4
  47. package/src/core/config.ts +5 -2
  48. package/src/core/memory.ts +9 -2
  49. package/src/core/model_config.ts +4 -2
  50. package/src/plugins/loader.ts +91 -66
  51. package/src/tools/builtin.ts +288 -36
  52. package/src/tools/computer.ts +279 -269
  53. package/src/web/server.ts +35 -2
  54. package/tests/fence_plugin.test.ts +52 -0
  55. package/tests/loom.test.ts +89 -0
  56. package/tests/ssrf.test.ts +38 -0
  57. package/tsconfig.json +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"computer.js","sourceRoot":"","sources":["../../src/tools/computer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"computer.js","sourceRoot":"","sources":["../../src/tools/computer.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqEH,wBAAsB,cAAc,CAAC,IAAI,GAAE,MAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBvE"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"AAAA;;GAEG;AAqEH,wBAAsB,cAAc,CAAC,IAAI,GAAE,MAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDvE"}
@@ -64,8 +64,35 @@ const PIGMENTS = {
64
64
  ────────────────────────────────────────────── */
65
65
  async function startWebServer(port = 3000) {
66
66
  const ctx = (0, factory_1.createSystemContext)();
67
+ // Bind to loopback by default: the chat API drives the agent (and its tools)
68
+ // with no authentication, so it must not be exposed to the network unless the
69
+ // operator explicitly opts in via SKYLOOM_WEB_HOST=0.0.0.0.
70
+ const host = process.env.SKYLOOM_WEB_HOST || "127.0.0.1";
71
+ const loopbackOnly = host === "127.0.0.1" || host === "localhost" || host === "::1";
72
+ // Reject cross-origin / rebound Host headers when bound to loopback. Without
73
+ // this, a malicious web page could POST to http://localhost:<port>/api/chat
74
+ // from the victim's browser and execute agent tools (CORS does not block the
75
+ // side effect, only the response read).
76
+ const hostAllowed = (h) => {
77
+ if (!loopbackOnly)
78
+ return true;
79
+ const name = (h || "").split(":")[0].toLowerCase();
80
+ return name === "localhost" || name === "127.0.0.1" || name === "[::1]" || name === "::1" || name === "";
81
+ };
67
82
  const server = (0, http_1.createServer)(async (req, res) => {
68
- res.setHeader("Access-Control-Allow-Origin", "*");
83
+ if (!hostAllowed(req.headers.host)) {
84
+ res.writeHead(403, { "Content-Type": "application/json" }).end(JSON.stringify({ error: "Forbidden host" }));
85
+ return;
86
+ }
87
+ // Same-origin only when loopback-bound (no wildcard CORS that would invite
88
+ // cross-site requests to a credential-less, tool-executing endpoint).
89
+ if (loopbackOnly) {
90
+ res.setHeader("Access-Control-Allow-Origin", `http://${req.headers.host || `localhost:${port}`}`);
91
+ res.setHeader("Vary", "Origin");
92
+ }
93
+ else {
94
+ res.setHeader("Access-Control-Allow-Origin", "*");
95
+ }
69
96
  res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
70
97
  res.setHeader("Access-Control-Allow-Headers", "Content-Type");
71
98
  if (req.method === "OPTIONS") {
@@ -90,7 +117,13 @@ async function startWebServer(port = 3000) {
90
117
  res.writeHead(500, { "Content-Type": "application/json" }).end(JSON.stringify({ error: String(e) }));
91
118
  }
92
119
  });
93
- return new Promise((resolve) => { server.listen(port, () => { console.log(`\n 水墨气象台 · Skyloom\n http://localhost:${port}\n`); resolve(); }); });
120
+ return new Promise((resolve) => {
121
+ server.listen(port, host, () => {
122
+ const shown = loopbackOnly ? "localhost" : host;
123
+ console.log(`\n 水墨气象台 · Skyloom\n http://${shown}:${port}${loopbackOnly ? " (仅本机 · 设 SKYLOOM_WEB_HOST=0.0.0.0 可对外开放)" : " ⚠ 已对外开放 · 无鉴权"}\n`);
124
+ resolve();
125
+ });
126
+ });
94
127
  }
95
128
  async function handleChat(req, res, ctx) {
96
129
  const buffers = [];
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,68 +1,68 @@
1
- {
2
- "name": "skyloom",
3
- "version": "1.14.5",
4
- "description": "天空织机 Skyloom — 6 weather-themed AI agents: Fog, Rain, Frost, Snow, Dew, Fair",
5
- "preferGlobal": true,
6
- "type": "commonjs",
7
- "main": "./dist/index.js",
8
- "bin": {
9
- "sky": "dist/cli/main.js"
10
- },
11
- "scripts": {
12
- "build": "tsc",
13
- "dev": "tsc --watch",
14
- "start": "node ./dist/cli/main.js",
15
- "chat": "node ./dist/cli/main.js chat",
16
- "task": "node ./dist/cli/main.js task",
17
- "web": "node ./dist/cli/main.js web",
18
- "test": "vitest",
19
- "test:coverage": "vitest --coverage",
20
- "lint": "eslint src --ext .ts",
21
- "type-check": "tsc --noEmit",
22
- "format": "prettier --write \"src/**/*.ts\"",
23
- "pretest": "npm run type-check",
24
- "setup": "node scripts/install.js",
25
- "postinstall": "node scripts/link.js"
26
- },
27
- "keywords": [
28
- "multi-agent",
29
- "llm",
30
- "orchestration",
31
- "ai",
32
- "tool-use"
33
- ],
34
- "author": "Skyloom Team",
35
- "license": "MIT",
36
- "repository": {
37
- "type": "git",
38
- "url": "git+https://github.com/susurrune/skyloom-ts.git"
39
- },
40
- "homepage": "https://github.com/susurrune/skyloom-ts#readme",
41
- "bugs": {
42
- "url": "https://github.com/susurrune/skyloom-ts/issues"
43
- },
44
- "dependencies": {
45
- "axios": "^1.7.7",
46
- "chalk": "^5.3.0",
47
- "commander": "^12.1.0",
48
- "glob": "^11.0.0",
49
- "sql.js": "^1.14.1",
50
- "yaml": "^2.4.1"
51
- },
52
- "devDependencies": {
53
- "@types/glob": "^8.1.0",
54
- "@types/node": "^22.0.0",
55
- "@typescript-eslint/eslint-plugin": "^8.0.0",
56
- "@typescript-eslint/parser": "^8.0.0",
57
- "@vitest/coverage-v8": "^2.0.0",
58
- "@vitest/ui": "^2.0.0",
59
- "eslint": "^9.0.0",
60
- "prettier": "^3.2.0",
61
- "tsx": "^4.7.0",
62
- "typescript": "^5.4.0",
63
- "vitest": "^2.0.0"
64
- },
65
- "engines": {
66
- "node": ">=18.0.0"
67
- }
68
- }
1
+ {
2
+ "name": "skyloom",
3
+ "version": "1.14.8",
4
+ "description": "天空织机 Skyloom — 6 weather-themed AI agents: Fog, Rain, Frost, Snow, Dew, Fair",
5
+ "preferGlobal": true,
6
+ "type": "commonjs",
7
+ "main": "./dist/index.js",
8
+ "bin": {
9
+ "sky": "dist/cli/main.js"
10
+ },
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "dev": "tsc --watch",
14
+ "start": "node ./dist/cli/main.js",
15
+ "chat": "node ./dist/cli/main.js chat",
16
+ "task": "node ./dist/cli/main.js task",
17
+ "web": "node ./dist/cli/main.js web",
18
+ "test": "vitest",
19
+ "test:coverage": "vitest --coverage",
20
+ "lint": "eslint src --ext .ts",
21
+ "type-check": "tsc --noEmit",
22
+ "format": "prettier --write \"src/**/*.ts\"",
23
+ "pretest": "npm run type-check",
24
+ "setup": "node scripts/install.js",
25
+ "postinstall": "node scripts/link.js"
26
+ },
27
+ "keywords": [
28
+ "multi-agent",
29
+ "llm",
30
+ "orchestration",
31
+ "ai",
32
+ "tool-use"
33
+ ],
34
+ "author": "Skyloom Team",
35
+ "license": "MIT",
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "git+https://github.com/susurrune/skyloom-ts.git"
39
+ },
40
+ "homepage": "https://github.com/susurrune/skyloom-ts#readme",
41
+ "bugs": {
42
+ "url": "https://github.com/susurrune/skyloom-ts/issues"
43
+ },
44
+ "dependencies": {
45
+ "axios": "^1.7.7",
46
+ "chalk": "^5.3.0",
47
+ "commander": "^12.1.0",
48
+ "glob": "^11.0.0",
49
+ "sql.js": "^1.14.1",
50
+ "yaml": "^2.4.1"
51
+ },
52
+ "devDependencies": {
53
+ "@types/glob": "^8.1.0",
54
+ "@types/node": "^22.0.0",
55
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
56
+ "@typescript-eslint/parser": "^8.0.0",
57
+ "@vitest/coverage-v8": "^2.0.0",
58
+ "@vitest/ui": "^2.0.0",
59
+ "eslint": "^9.0.0",
60
+ "prettier": "^3.2.0",
61
+ "tsx": "^4.7.0",
62
+ "typescript": "^5.4.0",
63
+ "vitest": "^2.0.0"
64
+ },
65
+ "engines": {
66
+ "node": ">=18.0.0"
67
+ }
68
+ }
package/src/cli/loom.ts CHANGED
@@ -362,6 +362,14 @@ export interface LoomOpts {
362
362
  const RAIL_W = 15; // visual columns of the left rail (inside borders)
363
363
  const SKY_H = 2;
364
364
 
365
+ /* Mouse: SGR extended tracking (1006) + button tracking (1000). We only ever
366
+ *act* on wheel events; clicks/drags are parsed-and-swallowed so they can
367
+ never leak into the input line. Shift+drag still selects text in most
368
+ terminals (they bypass app tracking), so copy/paste keeps working. */
369
+ const MOUSE_ON = "\x1b[?1000h\x1b[?1006h";
370
+ const MOUSE_OFF = "\x1b[?1000l\x1b[?1006l";
371
+ const WHEEL_STEP = 3; // viewport lines per wheel notch
372
+
365
373
  export class LoomUI {
366
374
  private out: OutLike;
367
375
  private inp: NodeJS.ReadStream | null;
@@ -415,7 +423,7 @@ export class LoomUI {
415
423
 
416
424
  start() {
417
425
  if (!this.headless) {
418
- this.out.write("\x1b[?1049h\x1b[2J"); // alternate screen
426
+ this.out.write("\x1b[?1049h\x1b[2J" + MOUSE_ON); // alternate screen + mouse wheel
419
427
  if (this.inp && this.inp.isTTY) {
420
428
  readline.emitKeypressEvents(this.inp);
421
429
  this.inp.setRawMode(true);
@@ -438,7 +446,7 @@ export class LoomUI {
438
446
  if (this.resizeHandler) (process.stdout as any).removeListener?.("resize", this.resizeHandler);
439
447
  if (!this.headless) {
440
448
  if (this.inp && this.inp.isTTY) this.inp.setRawMode(false);
441
- this.out.write("\x1b[?1049l\x1b[?25h");
449
+ this.out.write(MOUSE_OFF + "\x1b[?1049l\x1b[?25h");
442
450
  }
443
451
  }
444
452
 
@@ -447,11 +455,11 @@ export class LoomUI {
447
455
  if (this.inp && this.inp.isTTY) this.inp.setRawMode(false);
448
456
  if (this.inp && this.keypressHandler) this.inp.removeListener("keypress", this.keypressHandler);
449
457
  if (this.timer) { clearInterval(this.timer); this.timer = null; }
450
- this.out.write("\x1b[?1049l\x1b[?25h");
458
+ this.out.write(MOUSE_OFF + "\x1b[?1049l\x1b[?25h");
451
459
  try {
452
460
  return await fn();
453
461
  } finally {
454
- this.out.write("\x1b[?1049h\x1b[2J");
462
+ this.out.write("\x1b[?1049h\x1b[2J" + MOUSE_ON);
455
463
  if (this.inp && this.inp.isTTY) {
456
464
  this.inp.setRawMode(true);
457
465
  this.inp.resume();
@@ -473,7 +481,10 @@ export class LoomUI {
473
481
  const drop = this.blocks.splice(0, 500);
474
482
  for (const d of drop) if (d.id) this.byId.delete(d.id);
475
483
  }
476
- this.scrollOff = 0; // new content snaps to tail
484
+ // Note: we intentionally do NOT reset scrollOff here. When the user is at
485
+ // the tail (scrollOff === 0) the view keeps following new content; when
486
+ // they have scrolled up to read, their position is preserved instead of
487
+ // being yanked to the bottom on every tool event or blank line.
477
488
  return blk;
478
489
  }
479
490
 
@@ -553,8 +564,51 @@ export class LoomUI {
553
564
 
554
565
  setHistory(h: string[]) { this.history = h.slice(); }
555
566
 
567
+ // Mouse-sequence reassembly. Node's readline keypress parser does NOT emit an
568
+ // SGR mouse sequence (ESC[<btn;col;rowM) as one event — it yields ESC[< then
569
+ // each remaining char separately. We accumulate from the ESC[< marker until
570
+ // the terminating M/m, then act, swallowing every fragment so none of it can
571
+ // ever land in the input line (the bug that sank the previous attempt).
572
+ private mouseBuf: string | null = null;
573
+
574
+ private handleMouse(seq: string) {
575
+ const m = /^(\d+);(\d+);(\d+)[Mm]$/.exec(seq);
576
+ if (!m) return;
577
+ const code = parseInt(m[1], 10);
578
+ if ((code & 64) === 0) return; // not a wheel event (clicks/drags ignored)
579
+ const down = (code & 1) !== 0; // odd button code = wheel down
580
+ // When the slash palette is open, the wheel moves the selection; otherwise
581
+ // it scrolls the conversation viewport.
582
+ if (this.paletteMatches().length > 0 && this.inputGlyphs[0] === "/") {
583
+ const n = this.paletteMatches().length;
584
+ this.paletteIdx = down
585
+ ? Math.min(n - 1, this.paletteIdx + 1)
586
+ : Math.max(0, this.paletteIdx - 1);
587
+ this.paint();
588
+ return;
589
+ }
590
+ if (down) this.scrollOff -= WHEEL_STEP; // wheel down → toward tail
591
+ else this.scrollOff += WHEEL_STEP; // wheel up → into history
592
+ this.clampScroll();
593
+ this.viewportCache = null;
594
+ this.paint();
595
+ }
596
+
556
597
  private onKey(str: string, key: any) {
557
598
  if (this.destroyed) return;
599
+
600
+ // ── mouse sequence reassembly (see mouseBuf) ──
601
+ if (this.mouseBuf !== null) {
602
+ this.mouseBuf += str ?? "";
603
+ if (str === "M" || str === "m" || this.mouseBuf.length > 24) {
604
+ const seq = this.mouseBuf;
605
+ this.mouseBuf = null;
606
+ this.handleMouse(seq);
607
+ }
608
+ return; // swallow every byte of the sequence
609
+ }
610
+ if (key?.sequence === "\x1b[<" || str === "\x1b[<") { this.mouseBuf = ""; return; }
611
+
558
612
  if (this.modal) {
559
613
  const k = (str || "").toLowerCase();
560
614
  if (k === "y") { const m = this.modal; this.modal = null; m.resolve(true); }
@@ -595,6 +649,7 @@ export class LoomUI {
595
649
  }
596
650
 
597
651
  this.inputGlyphs = []; this.cursor = 0; this.histIdx = -1; this.paletteIdx = 0;
652
+ this.scrollOff = 0; // submitting a turn snaps back to the tail to watch the reply
598
653
  if (text) { this.history.unshift(text); if (this.history.length > 200) this.history.pop(); }
599
654
  const r = this.pendingResolve;
600
655
  this.pendingResolve = null;
@@ -646,6 +701,8 @@ export class LoomUI {
646
701
  if (name === "delete") { if (this.cursor < this.inputGlyphs.length) this.inputGlyphs.splice(this.cursor, 1); this.paint(); return; }
647
702
  if (name === "left") { if (this.cursor > 0) this.cursor--; this.paint(); return; }
648
703
  if (name === "right") { if (this.cursor < this.inputGlyphs.length) this.cursor++; this.paint(); return; }
704
+ if (name === "home") { this.cursor = 0; this.paint(); return; }
705
+ if (name === "end") { this.cursor = this.inputGlyphs.length; this.paint(); return; }
649
706
  if (key?.ctrl && name === "a") { this.cursor = 0; this.paint(); return; }
650
707
  if (key?.ctrl && name === "e") { this.cursor = this.inputGlyphs.length; this.paint(); return; }
651
708
  if (key?.ctrl && name === "u") { this.inputGlyphs.splice(0, this.cursor); this.cursor = 0; this.paint(); return; }
@@ -911,7 +968,7 @@ export class LoomUI {
911
968
  ? " Ctrl-C 中断本轮 "
912
969
  : paletteUp
913
970
  ? " ↑↓ 选命令 · Enter 执行 · Tab 补全 · Esc 收起 "
914
- : " / 命令 · PgUp 回看 · Shift+Tab 切模式 · Ctrl-C 退出 ";
971
+ : " / 命令 · 滚轮/PgUp 回看 · Shift+Tab 切模式 · Ctrl-C 退出 ";
915
972
  // └─ hint ───…┘ → 2 + w(hint) + fill + 1 = cols
916
973
  const fill = innerW - visualWidth(hint) - 1;
917
974
  frame.push(B("└─") + chalk.dim(hint) + B("─".repeat(Math.max(0, fill)) + "┘"));
@@ -934,7 +991,9 @@ export class LoomUI {
934
991
  const counter = sel && matches.length > maxShow ? chalk.dim(` ${this.paletteIdx + 1}/${matches.length}`) : "";
935
992
  const lineStr = mark + (sel ? chalk.bold(color(cmd.padEnd(11))) : color(cmd.padEnd(11))) + chalk.dim(cutVisual(desc, this.viewW() - 22)) + counter;
936
993
  const row = baseRow + i;
937
- frame[row] = B("│") + padAnsi(this.railLines(bodyH)[row - 1 - SKY_H] ?? "", RAIL_W) + B("│") + " " + padAnsi(lineStr, this.viewW()) + B("│");
994
+ // Reuse the rail already composed for the body rather than rebuilding it
995
+ // per overlay row (railLines runs wrapPlain etc. — wasteful at frame rate).
996
+ frame[row] = B("│") + padAnsi(rail[row - 1 - SKY_H] ?? "", RAIL_W) + B("│") + " " + padAnsi(lineStr, this.viewW()) + B("│");
938
997
  });
939
998
  }
940
999
 
package/src/cli/main.ts CHANGED
@@ -251,12 +251,14 @@ function saveApiKey(provider: string, key: string): void {
251
251
  const path = require("path"); const fs = require("fs"); const yaml = require("yaml");
252
252
  const cfgPath = path.join(require("os").homedir(), ".skyloom", "config.yaml");
253
253
  const dir = path.dirname(cfgPath);
254
- if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
254
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
255
255
  let cfg: any = {};
256
256
  if (fs.existsSync(cfgPath)) { try { cfg = yaml.parse(fs.readFileSync(cfgPath, "utf-8")) || {}; } catch { } }
257
257
  if (!cfg.api_keys) cfg.api_keys = {};
258
258
  cfg.api_keys[provider] = key;
259
- fs.writeFileSync(cfgPath, yaml.stringify(cfg), "utf-8");
259
+ // config.yaml holds plaintext API keys — keep it owner-only (0600).
260
+ fs.writeFileSync(cfgPath, yaml.stringify(cfg), { encoding: "utf-8", mode: 0o600 });
261
+ try { fs.chmodSync(cfgPath, 0o600); } catch { /* best-effort (e.g. Windows) */ }
260
262
  }
261
263
 
262
264
  /* ═══════════════════════════════════════
@@ -304,7 +306,8 @@ async function setupWizard(): Promise<{ provider: string; key: string; model: st
304
306
  const cfgPath = path.join(require("os").homedir(), ".skyloom", "config.yaml");
305
307
  let cfg: any = {}; if (fs.existsSync(cfgPath)) { try { cfg = yaml.parse(fs.readFileSync(cfgPath, "utf-8")) || {}; } catch { } }
306
308
  cfg.default_model = model; cfg.default_provider = prov.id;
307
- fs.writeFileSync(cfgPath, yaml.stringify(cfg), "utf-8");
309
+ fs.writeFileSync(cfgPath, yaml.stringify(cfg), { encoding: "utf-8", mode: 0o600 });
310
+ try { fs.chmodSync(cfgPath, 0o600); } catch { /* best-effort (e.g. Windows) */ }
308
311
 
309
312
  rl.close();
310
313
  process.stdout.write(chalk.green(`\n ✓ ${prov.name} · ${model} · 就绪!\n\n`));
@@ -109,22 +109,22 @@ export class LoopGuard {
109
109
  this.recentToolOutcomes.push(!failed);
110
110
  if (this.recentToolOutcomes.length > 20) this.recentToolOutcomes.shift();
111
111
  }
112
- if (!this.stuckHintInjected && this.recentToolOutcomes.length >= 8 &&
112
+ if (!this.stuckHintInjected && this.recentToolOutcomes.length >= 5 &&
113
113
  this.recentToolOutcomes.filter(Boolean).length <= 1) {
114
114
  hints.push('[Recovery hint] Your last several tool calls have mostly failed. Synthesize a partial answer from what worked or ask the user for guidance.');
115
115
  this.stuckHintInjected = true;
116
116
  }
117
- if (this.recentToolOutcomes.length >= 15 && this.recentToolOutcomes.every(x => !x)) {
117
+ if (this.recentToolOutcomes.length >= 8 && this.recentToolOutcomes.every(x => !x)) {
118
118
  return { hints, stop: { note: 'Every recent tool call failed. Please give me more context.', contentLine: '\n\n[stuck] every recent tool call failed — stopping.\n' } };
119
119
  }
120
120
 
121
121
  // 4. Search-storm: cumulative search/fetch calls this turn (not bounded by
122
122
  // SIG_WINDOW, so the >=12 hard-stop is actually reachable).
123
- if (this.searchCount >= 15 && !this.toolLoopHintInjected) {
123
+ if (this.searchCount >= 8 && !this.toolLoopHintInjected) {
124
124
  hints.push(`[Search storm] ${this.searchCount} search calls. STOP searching and synthesize.`);
125
125
  this.toolLoopHintInjected = true;
126
126
  }
127
- if (this.searchCount >= 30) {
127
+ if (this.searchCount >= 12) {
128
128
  return { hints, stop: { note: 'Too many search requests. Synthesizing best answer.', contentLine: `\n\n[stuck] excessive web searching (${this.searchCount} calls) — stopping.\n` } };
129
129
  }
130
130
 
package/src/core/agent.ts CHANGED
@@ -24,6 +24,7 @@ import {
24
24
  } from './agent_helpers';
25
25
  import { selectRelevantTools } from './tool_router';
26
26
  import { getModelInfo } from './catalog';
27
+ import { estimateTokens } from './estimate';
27
28
  import { LoopGuard } from './agent/guard';
28
29
 
29
30
  const log = getLogger('agent');
@@ -705,12 +706,13 @@ export class BaseAgent {
705
706
  }
706
707
 
707
708
  async close(): Promise<void> {
708
- // Drain in-flight background work BEFORE closing memory
709
- const pending = [...this._pendingExtracts];
709
+ // Drain ALL in-flight background work BEFORE closing memory — both fact
710
+ // extraction and background request handlers (delegate_to / agent requests).
711
+ // Missing _bgTasks meant a request handler could still be writing to memory
712
+ // as the DB closed, losing work or erroring on a closed database.
713
+ const pending = [...this._pendingExtracts, ...this._bgTasks];
710
714
  if (pending.length > 0) {
711
- try {
712
- await Promise.all(pending);
713
- } catch { /* ignore */ }
715
+ await Promise.allSettled(pending);
714
716
  }
715
717
  await this.memory.close();
716
718
  this.bus.unsubscribe(this.name);
@@ -1156,8 +1158,10 @@ export class BaseAgent {
1156
1158
  contextDetail(): Record<string, any> {
1157
1159
  const byRole: Record<string, { tokens: number; count: number }> = {};
1158
1160
  for (const m of this.memory.shortTerm) {
1159
- const extra = (m as any).toolCalls ? JSON.stringify((m as any).toolCalls).length : 0;
1160
- const tokens = Math.ceil(((m.content || '').length + extra) / 4);
1161
+ const extra = (m as any).toolCalls ? JSON.stringify((m as any).toolCalls) : '';
1162
+ // CJK-aware estimate so the per-role breakdown matches the header total
1163
+ // (getContextWindowUsage weights Chinese characters ~2 tokens each).
1164
+ const tokens = estimateTokens((m.content || '') + extra);
1161
1165
  const slot = byRole[m.role] || (byRole[m.role] = { tokens: 0, count: 0 });
1162
1166
  slot.tokens += tokens;
1163
1167
  slot.count += 1;
@@ -1165,7 +1169,7 @@ export class BaseAgent {
1165
1169
  return {
1166
1170
  ...this.contextUsage(),
1167
1171
  byRole,
1168
- systemPromptTokens: Math.ceil(this._baseSystemPrompt.length / 4),
1172
+ systemPromptTokens: estimateTokens(this._baseSystemPrompt),
1169
1173
  toolCount: this.activeToolNames().length,
1170
1174
  activeSkills: [...this._activeSkills],
1171
1175
  };
@@ -72,10 +72,13 @@ const RE_TRAILING_COMMA = /,\s*([}\]])/g;
72
72
  const RE_UNQUOTED_STRING = /(:\s*)([a-zA-Z_.][a-zA-Z0-9_ ./\\@.\-+#~$]*?)(\s*[,}\]])/g;
73
73
 
74
74
  // ── Tool-signature loop detector tuning ──
75
- // Raised from 8/4/6 editing workflows need more room
76
- export const SIG_WINDOW = 16;
77
- export const SIG_LOOP_HINT = 10;
78
- export const SIG_LOOP_HARDSTOP = 24;
75
+ // These count *identical* tool-call signatures (same name + same args). Real
76
+ // editing workflows produce distinct signatures (different file/old_text), so
77
+ // a moderate window/threshold gives them room without disarming the loop guard:
78
+ // an identical call repeated 10x is always a stuck loop, never legitimate work.
79
+ export const SIG_WINDOW = 16; // observation window for repeated signatures
80
+ export const SIG_LOOP_HINT = 6; // warn once after this many identical repeats
81
+ export const SIG_LOOP_HARDSTOP = 10; // force-stop after this many identical repeats
79
82
 
80
83
  // ── Tool-failure markers ──
81
84
  const TOOL_FAILURE_MARKERS = [
@@ -313,13 +313,16 @@ export function loadConfig(): SkyloomConfig {
313
313
  export function saveUserConfig(config: SkyloomConfig): void {
314
314
  // Ensure user config directory exists
315
315
  if (!fs.existsSync(USER_CONFIG_DIR)) {
316
- fs.mkdirSync(USER_CONFIG_DIR, { recursive: true });
316
+ fs.mkdirSync(USER_CONFIG_DIR, { recursive: true, mode: 0o700 });
317
317
  }
318
318
 
319
319
  const userPath = path.join(USER_CONFIG_DIR, "config.yaml");
320
320
  const content = yaml.stringify(config);
321
321
 
322
- fs.writeFileSync(userPath, content, "utf-8");
322
+ fs.writeFileSync(userPath, content, { encoding: "utf-8", mode: 0o600 });
323
+ // mode in writeFileSync only applies on creation; enforce on existing files
324
+ // too, since this config holds plaintext API keys.
325
+ try { fs.chmodSync(userPath, 0o600); } catch { /* best-effort (e.g. Windows) */ }
323
326
  log.info("Saved user configuration", { path: userPath });
324
327
  }
325
328
 
@@ -654,8 +654,15 @@ export class Memory {
654
654
  let cjk = 0;
655
655
 
656
656
  for (const m of this.shortTerm) {
657
- totalChars += m.content.length;
658
- for (const c of m.content) {
657
+ // Count the tool-call payload too: a single tool call with large JSON args
658
+ // occupies real context, and ignoring it made tool-heavy turns under-count
659
+ // and auto-compaction fire too late.
660
+ let text = m.content || '';
661
+ if (m.toolCalls) {
662
+ try { text += JSON.stringify(m.toolCalls); } catch { /* unserializable — skip */ }
663
+ }
664
+ totalChars += text.length;
665
+ for (const c of text) {
659
666
  const code = c.charCodeAt(0);
660
667
  if ((code >= 0x4e00 && code <= 0x9fff) || (code >= 0x3000 && code <= 0x303f)) {
661
668
  cjk++;
@@ -44,8 +44,10 @@ function patchUserConfig(mutate: (cfg: any) => void, dir: string = USER_CONFIG_D
44
44
  try { cfg = yaml.parse(fs.readFileSync(file, 'utf-8')) || {}; } catch { cfg = {}; }
45
45
  }
46
46
  mutate(cfg);
47
- fs.mkdirSync(dir, { recursive: true });
48
- fs.writeFileSync(file, yaml.stringify(cfg), 'utf-8');
47
+ fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
48
+ // config.yaml may hold plaintext API keys — keep it owner-only.
49
+ fs.writeFileSync(file, yaml.stringify(cfg), { encoding: 'utf-8', mode: 0o600 });
50
+ try { fs.chmodSync(file, 0o600); } catch { /* best-effort (e.g. Windows) */ }
49
51
  }
50
52
 
51
53
  /** Apply the same mutation to the in-memory runtime config (hot effect). */