skyloom 1.13.5 → 1.13.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.
Files changed (195) hide show
  1. package/.github/workflows/ci.yml +36 -36
  2. package/README.md +220 -159
  3. package/config/providers.yaml +39 -39
  4. package/config/skills/api_integrator/SKILL.md +15 -15
  5. package/config/skills/arch_designer/SKILL.md +13 -13
  6. package/config/skills/ci_cd_manager/SKILL.md +14 -14
  7. package/config/skills/code_analysis/SKILL.md +13 -13
  8. package/config/skills/code_generator/SKILL.md +12 -12
  9. package/config/skills/code_reviewer/SKILL.md +13 -13
  10. package/config/skills/content_writer/SKILL.md +14 -14
  11. package/config/skills/data_transformer/SKILL.md +15 -15
  12. package/config/skills/document_analysis/SKILL.md +13 -13
  13. package/config/skills/emotional_companion/SKILL.md +15 -15
  14. package/config/skills/performance_checker/SKILL.md +14 -14
  15. package/config/skills/security_auditor/SKILL.md +14 -14
  16. package/config/skills/self_evolve/SKILL.md +13 -13
  17. package/config/skills/sys_operator/SKILL.md +15 -15
  18. package/config/skills/task_planner/SKILL.md +14 -14
  19. package/config/skills/web_research/SKILL.md +14 -14
  20. package/config/skills/workflow_designer/SKILL.md +13 -13
  21. package/dist/agents/dew.js +52 -52
  22. package/dist/agents/fair.js +84 -84
  23. package/dist/agents/fog.js +30 -30
  24. package/dist/agents/frost.js +32 -32
  25. package/dist/agents/rain.js +32 -32
  26. package/dist/agents/snow.js +68 -68
  27. package/dist/cli/commands_md.d.ts +41 -0
  28. package/dist/cli/commands_md.d.ts.map +1 -0
  29. package/dist/cli/commands_md.js +140 -0
  30. package/dist/cli/commands_md.js.map +1 -0
  31. package/dist/cli/input_macros.d.ts +28 -0
  32. package/dist/cli/input_macros.d.ts.map +1 -0
  33. package/dist/cli/input_macros.js +120 -0
  34. package/dist/cli/input_macros.js.map +1 -0
  35. package/dist/cli/loom.d.ts +220 -0
  36. package/dist/cli/loom.d.ts.map +1 -0
  37. package/dist/cli/loom.js +1094 -0
  38. package/dist/cli/loom.js.map +1 -0
  39. package/dist/cli/loom_chat.d.ts +20 -0
  40. package/dist/cli/loom_chat.d.ts.map +1 -0
  41. package/dist/cli/loom_chat.js +685 -0
  42. package/dist/cli/loom_chat.js.map +1 -0
  43. package/dist/cli/main.js +310 -14
  44. package/dist/cli/main.js.map +1 -1
  45. package/dist/cli/tui.d.ts.map +1 -1
  46. package/dist/cli/tui.js +7 -1
  47. package/dist/cli/tui.js.map +1 -1
  48. package/dist/core/agent/guard.d.ts +45 -0
  49. package/dist/core/agent/guard.d.ts.map +1 -0
  50. package/dist/core/agent/guard.js +113 -0
  51. package/dist/core/agent/guard.js.map +1 -0
  52. package/dist/core/agent.d.ts +17 -0
  53. package/dist/core/agent.d.ts.map +1 -1
  54. package/dist/core/agent.js +182 -93
  55. package/dist/core/agent.js.map +1 -1
  56. package/dist/core/factory.d.ts.map +1 -1
  57. package/dist/core/factory.js +34 -2
  58. package/dist/core/factory.js.map +1 -1
  59. package/dist/core/file_checkpoint.d.ts +57 -0
  60. package/dist/core/file_checkpoint.d.ts.map +1 -0
  61. package/dist/core/file_checkpoint.js +162 -0
  62. package/dist/core/file_checkpoint.js.map +1 -0
  63. package/dist/core/hooks.d.ts +43 -0
  64. package/dist/core/hooks.d.ts.map +1 -0
  65. package/dist/core/hooks.js +110 -0
  66. package/dist/core/hooks.js.map +1 -0
  67. package/dist/core/llm.d.ts.map +1 -1
  68. package/dist/core/llm.js +15 -9
  69. package/dist/core/llm.js.map +1 -1
  70. package/dist/core/longdoc.js +5 -5
  71. package/dist/core/mcp.d.ts +16 -0
  72. package/dist/core/mcp.d.ts.map +1 -1
  73. package/dist/core/mcp.js +55 -0
  74. package/dist/core/mcp.js.map +1 -1
  75. package/dist/core/model_config.d.ts +40 -0
  76. package/dist/core/model_config.d.ts.map +1 -0
  77. package/dist/core/model_config.js +191 -0
  78. package/dist/core/model_config.js.map +1 -0
  79. package/dist/core/skill.d.ts +7 -0
  80. package/dist/core/skill.d.ts.map +1 -1
  81. package/dist/core/skill.js +47 -0
  82. package/dist/core/skill.js.map +1 -1
  83. package/dist/core/skymd.d.ts +39 -0
  84. package/dist/core/skymd.d.ts.map +1 -0
  85. package/dist/core/skymd.js +177 -0
  86. package/dist/core/skymd.js.map +1 -0
  87. package/dist/core/tool.d.ts +12 -0
  88. package/dist/core/tool.d.ts.map +1 -1
  89. package/dist/core/tool.js +30 -0
  90. package/dist/core/tool.js.map +1 -1
  91. package/dist/core/verify.d.ts +27 -0
  92. package/dist/core/verify.d.ts.map +1 -0
  93. package/dist/core/verify.js +62 -0
  94. package/dist/core/verify.js.map +1 -0
  95. package/dist/skills/loader.d.ts +22 -2
  96. package/dist/skills/loader.d.ts.map +1 -1
  97. package/dist/skills/loader.js +45 -15
  98. package/dist/skills/loader.js.map +1 -1
  99. package/dist/tools/builtin.d.ts.map +1 -1
  100. package/dist/tools/builtin.js +13 -3
  101. package/dist/tools/builtin.js.map +1 -1
  102. package/dist/tools/model_tool.d.ts +11 -0
  103. package/dist/tools/model_tool.d.ts.map +1 -0
  104. package/dist/tools/model_tool.js +71 -0
  105. package/dist/tools/model_tool.js.map +1 -0
  106. package/dist/tools/todo.d.ts +30 -0
  107. package/dist/tools/todo.d.ts.map +1 -0
  108. package/dist/tools/todo.js +78 -0
  109. package/dist/tools/todo.js.map +1 -0
  110. package/docs/AESTHETIC_DESIGN.md +152 -144
  111. package/docs/OPTIMIZATION_PLAN.md +178 -178
  112. package/package.json +1 -1
  113. package/scripts/install.js +48 -48
  114. package/scripts/link.js +10 -10
  115. package/setup.bat +79 -79
  116. package/skill-test-ty2fOA/test.md +10 -10
  117. package/src/agents/dew.ts +70 -70
  118. package/src/agents/fair.ts +102 -102
  119. package/src/agents/fog.ts +48 -48
  120. package/src/agents/frost.ts +50 -50
  121. package/src/agents/rain.ts +50 -50
  122. package/src/agents/snow.ts +239 -239
  123. package/src/cli/commands_md.ts +112 -0
  124. package/src/cli/input_macros.ts +83 -0
  125. package/src/cli/loom.ts +982 -0
  126. package/src/cli/loom_chat.ts +598 -0
  127. package/src/cli/main.ts +255 -9
  128. package/src/cli/mode.ts +58 -58
  129. package/src/cli/tui.ts +228 -222
  130. package/src/core/agent/guard.ts +134 -0
  131. package/src/core/agent/task.ts +100 -100
  132. package/src/core/agent.ts +177 -95
  133. package/src/core/arbitrate.ts +162 -162
  134. package/src/core/catalog.ts +178 -178
  135. package/src/core/checkpoint.ts +94 -94
  136. package/src/core/estimate.ts +104 -104
  137. package/src/core/evolve.ts +191 -191
  138. package/src/core/factory.ts +31 -2
  139. package/src/core/file_checkpoint.ts +136 -0
  140. package/src/core/filter.ts +103 -103
  141. package/src/core/graph.ts +156 -156
  142. package/src/core/hooks.ts +126 -0
  143. package/src/core/icons.ts +53 -53
  144. package/src/core/index.ts +37 -37
  145. package/src/core/learn.ts +146 -146
  146. package/src/core/llm.ts +15 -9
  147. package/src/core/longdoc.ts +155 -155
  148. package/src/core/mcp.ts +48 -0
  149. package/src/core/mcp_server.ts +176 -176
  150. package/src/core/model_config.ts +157 -0
  151. package/src/core/profile.ts +255 -255
  152. package/src/core/router.ts +124 -124
  153. package/src/core/sandbox.ts +142 -142
  154. package/src/core/security.ts +243 -243
  155. package/src/core/skill.ts +42 -0
  156. package/src/core/skymd.ts +143 -0
  157. package/src/core/theme.ts +65 -65
  158. package/src/core/tool.ts +30 -0
  159. package/src/core/tool_router.ts +193 -193
  160. package/src/core/vector.ts +152 -152
  161. package/src/core/verify.ts +71 -0
  162. package/src/core/workspace.ts +150 -150
  163. package/src/plugins/loader.ts +66 -66
  164. package/src/skills/loader.ts +45 -16
  165. package/src/sql.js.d.ts +29 -29
  166. package/src/tools/builtin.ts +13 -3
  167. package/src/tools/computer.ts +269 -269
  168. package/src/tools/delegate.ts +49 -49
  169. package/src/tools/model_tool.ts +74 -0
  170. package/src/tools/todo.ts +76 -0
  171. package/src/web/tts.ts +93 -93
  172. package/tests/agent.test.ts +159 -159
  173. package/tests/agent_helpers.test.ts +48 -48
  174. package/tests/bus.test.ts +121 -121
  175. package/tests/catalog.test.ts +86 -86
  176. package/tests/checkpoint_commands.test.ts +124 -0
  177. package/tests/claude_compat.test.ts +110 -0
  178. package/tests/config.test.ts +41 -41
  179. package/tests/guard.test.ts +75 -0
  180. package/tests/icons.test.ts +45 -45
  181. package/tests/loom.test.ts +248 -0
  182. package/tests/memory.test.ts +170 -170
  183. package/tests/model_config.test.ts +109 -0
  184. package/tests/router.test.ts +86 -86
  185. package/tests/schemas.test.ts +51 -51
  186. package/tests/semantic.test.ts +83 -83
  187. package/tests/setup.ts +10 -10
  188. package/tests/skill.test.ts +172 -172
  189. package/tests/skymd.test.ts +146 -0
  190. package/tests/task.test.ts +60 -60
  191. package/tests/todo_toolstats.test.ts +94 -0
  192. package/tests/tool.test.ts +108 -108
  193. package/tests/tool_router.test.ts +71 -71
  194. package/tests/tui.test.ts +67 -67
  195. package/vitest.config.ts +17 -17
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ /**
3
+ * 自定义斜杠命令 — markdown prompt templates promoted to commands.
4
+ *
5
+ * Drop a .md file into `.sky/commands/` (project) or `~/.skyloom/commands/`
6
+ * (user); the filename becomes the command. Subdirectories namespace:
7
+ * `.sky/commands/git/commit.md` → /git:commit.
8
+ *
9
+ * File format:
10
+ * ---
11
+ * description: 修复指定的 GitHub issue (optional, shown in palette)
12
+ * agent: rain (optional, runs as this agent)
13
+ * ---
14
+ * 请修复 issue #$ARGUMENTS:
15
+ * 1. 读取 issue 详情 …
16
+ *
17
+ * Placeholders: $ARGUMENTS = everything after the command; $1…$9 = positional.
18
+ */
19
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ var desc = Object.getOwnPropertyDescriptor(m, k);
22
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
23
+ desc = { enumerable: true, get: function() { return m[k]; } };
24
+ }
25
+ Object.defineProperty(o, k2, desc);
26
+ }) : (function(o, m, k, k2) {
27
+ if (k2 === undefined) k2 = k;
28
+ o[k2] = m[k];
29
+ }));
30
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
31
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
32
+ }) : function(o, v) {
33
+ o["default"] = v;
34
+ });
35
+ var __importStar = (this && this.__importStar) || (function () {
36
+ var ownKeys = function(o) {
37
+ ownKeys = Object.getOwnPropertyNames || function (o) {
38
+ var ar = [];
39
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
40
+ return ar;
41
+ };
42
+ return ownKeys(o);
43
+ };
44
+ return function (mod) {
45
+ if (mod && mod.__esModule) return mod;
46
+ var result = {};
47
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
48
+ __setModuleDefault(result, mod);
49
+ return result;
50
+ };
51
+ })();
52
+ Object.defineProperty(exports, "__esModule", { value: true });
53
+ exports.loadCustomCommands = loadCustomCommands;
54
+ exports.substituteArgs = substituteArgs;
55
+ exports.resolveCustomCommand = resolveCustomCommand;
56
+ const fs = __importStar(require("fs"));
57
+ const os = __importStar(require("os"));
58
+ const path = __importStar(require("path"));
59
+ const MAX_BODY_CHARS = 12000;
60
+ function parseFrontmatter(raw) {
61
+ const m = /^---\n([\s\S]*?)\n---\n?/.exec(raw);
62
+ if (!m)
63
+ return { meta: {}, body: raw };
64
+ const meta = {};
65
+ for (const line of m[1].split('\n')) {
66
+ const kv = /^([\w-]+)\s*:\s*(.+)$/.exec(line.trim());
67
+ if (kv)
68
+ meta[kv[1].toLowerCase()] = kv[2].trim();
69
+ }
70
+ return { meta, body: raw.slice(m[0].length) };
71
+ }
72
+ function scanDir(dir, prefix, out) {
73
+ let entries;
74
+ try {
75
+ entries = fs.readdirSync(dir, { withFileTypes: true });
76
+ }
77
+ catch {
78
+ return;
79
+ }
80
+ for (const e of entries) {
81
+ const full = path.join(dir, e.name);
82
+ if (e.isDirectory()) {
83
+ scanDir(full, prefix ? `${prefix}:${e.name}` : e.name, out);
84
+ continue;
85
+ }
86
+ if (!e.name.endsWith('.md'))
87
+ continue;
88
+ try {
89
+ const raw = fs.readFileSync(full, 'utf-8');
90
+ const { meta, body } = parseFrontmatter(raw);
91
+ const base = e.name.slice(0, -3);
92
+ const name = prefix ? `${prefix}:${base}` : base;
93
+ out.push({
94
+ name,
95
+ description: meta.description || body.trim().split('\n')[0].slice(0, 50),
96
+ agent: meta.agent,
97
+ body: body.trim().slice(0, MAX_BODY_CHARS),
98
+ file: full,
99
+ });
100
+ }
101
+ catch { /* unreadable file: skip */ }
102
+ }
103
+ }
104
+ /**
105
+ * Load custom commands. Project commands shadow user commands of the same
106
+ * name. Re-scans on every call so edits take effect without a restart.
107
+ */
108
+ function loadCustomCommands(cwd = process.cwd()) {
109
+ const user = [];
110
+ const project = [];
111
+ scanDir(path.join(os.homedir(), '.skyloom', 'commands'), '', user);
112
+ scanDir(path.join(cwd, '.sky', 'commands'), '', project);
113
+ const byName = new Map();
114
+ for (const c of [...user, ...project])
115
+ byName.set(c.name, c); // project wins
116
+ return [...byName.values()].sort((a, b) => a.name.localeCompare(b.name));
117
+ }
118
+ /** Substitute $ARGUMENTS and $1…$9 into a command body. */
119
+ function substituteArgs(body, argString) {
120
+ const args = argString.trim() ? argString.trim().split(/\s+/) : [];
121
+ return body
122
+ .replace(/\$ARGUMENTS/g, argString.trim())
123
+ .replace(/\$([1-9])/g, (_, n) => args[parseInt(n, 10) - 1] ?? '');
124
+ }
125
+ /**
126
+ * Match an input line like "/fix-issue 123" against the loaded commands.
127
+ * Returns the expanded prompt (and optional agent) or null.
128
+ */
129
+ function resolveCustomCommand(input, commands) {
130
+ if (!input.startsWith('/'))
131
+ return null;
132
+ const space = input.indexOf(' ');
133
+ const name = (space < 0 ? input.slice(1) : input.slice(1, space)).toLowerCase();
134
+ const argString = space < 0 ? '' : input.slice(space + 1);
135
+ const command = commands.find(c => c.name.toLowerCase() === name);
136
+ if (!command)
137
+ return null;
138
+ return { command, prompt: substituteArgs(command.body, argString) };
139
+ }
140
+ //# sourceMappingURL=commands_md.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands_md.js","sourceRoot":"","sources":["../../src/cli/commands_md.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Input macros — Claude Code-style line conveniences for both CLIs:
3
+ *
4
+ * @path/to/file pull a file's content into the message (Tab-free attach)
5
+ * !command run a shell command; output goes into context, no LLM turn
6
+ * #note append a quick memory line to SKY.md, no LLM turn
7
+ */
8
+ /** `#note` quick-memory line? (single `#` + content; `##` is markdown, skip) */
9
+ export declare function isHashMemory(text: string): boolean;
10
+ export declare function hashNote(text: string): string;
11
+ /** `!cmd` shell line? */
12
+ export declare function isBangCommand(text: string): boolean;
13
+ export declare function bangCommand(text: string): string;
14
+ /** Run a `!cmd` line; returns the (tail-clamped) combined output. */
15
+ export declare function runBang(cmd: string, cwd?: string): {
16
+ ok: boolean;
17
+ output: string;
18
+ };
19
+ /**
20
+ * Expand `@file` references: for each token that names an existing file,
21
+ * append its (clamped) content as a fenced attachment. The original message
22
+ * text is preserved so the model still sees what the user pointed at.
23
+ */
24
+ export declare function expandFileRefs(text: string, cwd?: string): {
25
+ text: string;
26
+ attached: string[];
27
+ };
28
+ //# sourceMappingURL=input_macros.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input_macros.d.ts","sourceRoot":"","sources":["../../src/cli/input_macros.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,yBAAyB;AACzB,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,qEAAqE;AACrE,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAejG;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,MAAsB,GAC1B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAqBtC"}
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ /**
3
+ * Input macros — Claude Code-style line conveniences for both CLIs:
4
+ *
5
+ * @path/to/file pull a file's content into the message (Tab-free attach)
6
+ * !command run a shell command; output goes into context, no LLM turn
7
+ * #note append a quick memory line to SKY.md, no LLM turn
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.isHashMemory = isHashMemory;
44
+ exports.hashNote = hashNote;
45
+ exports.isBangCommand = isBangCommand;
46
+ exports.bangCommand = bangCommand;
47
+ exports.runBang = runBang;
48
+ exports.expandFileRefs = expandFileRefs;
49
+ const child_process_1 = require("child_process");
50
+ const fs = __importStar(require("fs"));
51
+ const path = __importStar(require("path"));
52
+ const MAX_ATTACH_CHARS = 16000;
53
+ const MAX_ATTACH_FILES = 3;
54
+ const BANG_TIMEOUT_MS = 15000;
55
+ const BANG_TAIL = 8000;
56
+ /** `#note` quick-memory line? (single `#` + content; `##` is markdown, skip) */
57
+ function isHashMemory(text) {
58
+ return /^#(?!#)\s*\S/.test(text.trim());
59
+ }
60
+ function hashNote(text) {
61
+ return text.trim().replace(/^#\s*/, '');
62
+ }
63
+ /** `!cmd` shell line? */
64
+ function isBangCommand(text) {
65
+ return /^!\s*\S/.test(text.trim());
66
+ }
67
+ function bangCommand(text) {
68
+ return text.trim().replace(/^!\s*/, '');
69
+ }
70
+ /** Run a `!cmd` line; returns the (tail-clamped) combined output. */
71
+ function runBang(cmd, cwd = process.cwd()) {
72
+ try {
73
+ const out = (0, child_process_1.execSync)(cmd, {
74
+ cwd,
75
+ encoding: 'utf-8',
76
+ timeout: BANG_TIMEOUT_MS,
77
+ stdio: ['ignore', 'pipe', 'pipe'],
78
+ env: { ...process.env, FORCE_COLOR: '0' },
79
+ });
80
+ const text = out.trim() || '(无输出)';
81
+ return { ok: true, output: text.length > BANG_TAIL ? '…' + text.slice(-BANG_TAIL) : text };
82
+ }
83
+ catch (e) {
84
+ const text = `${e?.stdout || ''}${e?.stderr || ''}`.trim() || String(e?.message || e);
85
+ return { ok: false, output: text.length > BANG_TAIL ? '…' + text.slice(-BANG_TAIL) : text };
86
+ }
87
+ }
88
+ /**
89
+ * Expand `@file` references: for each token that names an existing file,
90
+ * append its (clamped) content as a fenced attachment. The original message
91
+ * text is preserved so the model still sees what the user pointed at.
92
+ */
93
+ function expandFileRefs(text, cwd = process.cwd()) {
94
+ const attached = [];
95
+ const refs = [...text.matchAll(/(?:^|\s)@([\w\-./\\]+)/g)].map(m => m[1]);
96
+ if (refs.length === 0)
97
+ return { text, attached };
98
+ const sections = [];
99
+ for (const ref of refs) {
100
+ if (attached.length >= MAX_ATTACH_FILES)
101
+ break;
102
+ const p = path.resolve(cwd, ref);
103
+ try {
104
+ if (!fs.existsSync(p) || !fs.statSync(p).isFile())
105
+ continue;
106
+ let content = fs.readFileSync(p, 'utf-8');
107
+ if (content.length > MAX_ATTACH_CHARS)
108
+ content = content.slice(0, MAX_ATTACH_CHARS) + '\n…[truncated]';
109
+ sections.push(`[附件 @${ref}]\n\`\`\`\n${content}\n\`\`\``);
110
+ attached.push(ref);
111
+ }
112
+ catch {
113
+ /* unreadable file: leave the reference as plain text */
114
+ }
115
+ }
116
+ if (sections.length === 0)
117
+ return { text, attached };
118
+ return { text: `${text}\n\n${sections.join('\n\n')}`, attached };
119
+ }
120
+ //# sourceMappingURL=input_macros.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input_macros.js","sourceRoot":"","sources":["../../src/cli/input_macros.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYH,oCAEC;AAED,4BAEC;AAGD,sCAEC;AAED,kCAEC;AAGD,0BAeC;AAOD,wCAwBC;AA1ED,iDAAyC;AACzC,uCAAyB;AACzB,2CAA6B;AAE7B,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAC/B,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAC3B,MAAM,eAAe,GAAG,KAAM,CAAC;AAC/B,MAAM,SAAS,GAAG,IAAI,CAAC;AAEvB,gFAAgF;AAChF,SAAgB,YAAY,CAAC,IAAY;IACvC,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,SAAgB,QAAQ,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,yBAAyB;AACzB,SAAgB,aAAa,CAAC,IAAY;IACxC,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,SAAgB,WAAW,CAAC,IAAY;IACtC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,qEAAqE;AACrE,SAAgB,OAAO,CAAC,GAAW,EAAE,MAAc,OAAO,CAAC,GAAG,EAAE;IAC9D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAA,wBAAQ,EAAC,GAAG,EAAE;YACxB,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,eAAe;YACxB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE;SAC1C,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,IAAI,OAAO,CAAC;QACnC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7F,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,MAAM,IAAI,GAAG,GAAG,CAAC,EAAE,MAAM,IAAI,EAAE,GAAG,CAAC,EAAE,MAAM,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC;QACtF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9F,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,cAAc,CAC5B,IAAY,EACZ,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAEjD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,QAAQ,CAAC,MAAM,IAAI,gBAAgB;YAAE,MAAM;QAC/C,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE;gBAAE,SAAS;YAC5D,IAAI,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC1C,IAAI,OAAO,CAAC,MAAM,GAAG,gBAAgB;gBAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;YACvG,QAAQ,CAAC,IAAI,CAAC,QAAQ,GAAG,cAAc,OAAO,UAAU,CAAC,CAAC;YAC1D,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,wDAAwD;QAC1D,CAAC;IACH,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACrD,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC;AACnE,CAAC"}
@@ -0,0 +1,220 @@
1
+ /**
2
+ * 天空织机 · 立轴 — the full-screen ink-wash weather-station TUI.
3
+ *
4
+ * Architecture notes (why this one works where the old full-screen attempt
5
+ * failed):
6
+ * 1. Streamed text never touches the terminal directly. It lands in a
7
+ * virtual block buffer; every frame is composed in memory and a diff
8
+ * renderer repaints only the rows that changed. Streaming and animation
9
+ * therefore cannot fight over the cursor.
10
+ * 2. All width math goes through the CJK-aware helpers in tui.ts, so the
11
+ * hand-rolled input editor cannot mangle fullwidth glyphs.
12
+ * 3. The animation clock is the single writer: key events and stream events
13
+ * only mutate state; the frame timer (and explicit repaint requests)
14
+ * flush it.
15
+ *
16
+ * Layout (画轴 / hanging scroll):
17
+ * ┌─ 天空织机 ───────────────────────────── ▣ 霧 ─┐ header + seal
18
+ * │ ≋ ❉ ⸽ particles / shuttles │ sky band (2 rows)
19
+ * │ ▁▂▃▅▃▂▁▁▂▄▂▁ mountain grows with the session │
20
+ * │ ● 霧 fog │ conversation viewport │ rail │ viewport
21
+ * │ · 雨 rain │ … │
22
+ * ├─ 思忖 ··· ──────────────── model · cost · ctx ─┤ status divider
23
+ * │ ≋ ❯ input │ input line
24
+ * └─ /help · Tab 补全 · PgUp 翻页 ─────────────────┘
25
+ *
26
+ * Design rationale: docs/AESTHETIC_DESIGN.md §2.2 (方案三 · 立轴).
27
+ */
28
+ /** Truncate a styled string to a visual width, keeping ANSI sequences intact. */
29
+ export declare function cutVisual(s: string, maxW: number): string;
30
+ /** Pad a styled string with spaces to an exact visual width (truncates if over). */
31
+ export declare function padAnsi(s: string, w: number): string;
32
+ /** CJK-aware plain-text word wrap (latin wraps on spaces, CJK per glyph). */
33
+ export declare function wrapPlain(text: string, width: number): string[];
34
+ export interface OutLike {
35
+ columns?: number;
36
+ rows?: number;
37
+ isTTY?: boolean;
38
+ write(s: string): boolean;
39
+ }
40
+ /** Repaints only rows whose content changed since the previous frame. */
41
+ export declare class Screen {
42
+ private out;
43
+ private prev;
44
+ constructor(out: OutLike);
45
+ /** Force the next flush to repaint everything (resize / resume). */
46
+ invalidate(): void;
47
+ flush(rows: string[], cursor: {
48
+ row: number;
49
+ col: number;
50
+ } | null): void;
51
+ }
52
+ interface Particle {
53
+ x: number;
54
+ y: number;
55
+ phase: number;
56
+ }
57
+ /** Per-agent weather motion over a w×2 field. drift/fall/glint/float/bead/rise. */
58
+ export declare class SkyField {
59
+ private readonly h;
60
+ particles: Particle[];
61
+ private w;
62
+ constructor(h?: number);
63
+ resize(w: number): void;
64
+ step(motion: string, tick: number): void;
65
+ /** Render the two sky rows. Shuttles (orchestration) overlay the weather. */
66
+ render(w: number, motion: string, symbol: string, hex: string, tick: number, shuttles: {
67
+ symbol: string;
68
+ hex: string;
69
+ x: number;
70
+ row: number;
71
+ }[]): string[];
72
+ }
73
+ /** Distant-mountain silhouette; grows slowly as the session lengthens. */
74
+ export declare function mountainRow(width: number, turns: number): string;
75
+ /**
76
+ * "text" blocks hold plain text, wrapped CJK-aware at render time, styled
77
+ * per line. "line" blocks are pre-styled single lines (tasks, tool events)
78
+ * that are truncated rather than wrapped, and may be updated in place by id.
79
+ */
80
+ export interface Block {
81
+ kind: "text" | "line" | "blank";
82
+ text: string;
83
+ /** style applied to each wrapped line of a "text" block */
84
+ style?: (s: string) => string;
85
+ /** left gutter prefix for "text" blocks (first line only) */
86
+ head?: string;
87
+ id?: string;
88
+ /** the open block receives stream writes + ink-bleed cursor */
89
+ open?: boolean;
90
+ version: number;
91
+ cache?: {
92
+ width: number;
93
+ version: number;
94
+ lines: string[];
95
+ };
96
+ }
97
+ export declare function circled(i: number): string;
98
+ export interface OrchTask {
99
+ id: string;
100
+ index: number;
101
+ agent: string;
102
+ desc: string;
103
+ deps: string[];
104
+ state: "wait" | "run" | "ok" | "fail";
105
+ startedAt?: number;
106
+ ms?: number;
107
+ }
108
+ export declare class OrchState {
109
+ tasks: Map<string, OrchTask>;
110
+ order: string[];
111
+ active: boolean;
112
+ /** moving shuttle x-position per running agent */
113
+ shuttleX: Map<string, number>;
114
+ plan(raw: any[]): void;
115
+ start(id: string): void;
116
+ done(id: string, ok: boolean): void;
117
+ finish(): void;
118
+ runningAgents(): string[];
119
+ /** Per-agent ✓/✗ tally for the rail. */
120
+ tally(agent: string): {
121
+ ok: number;
122
+ fail: number;
123
+ run: boolean;
124
+ };
125
+ progress(): {
126
+ done: number;
127
+ total: number;
128
+ };
129
+ }
130
+ export interface LoomOpts {
131
+ out?: OutLike;
132
+ inp?: NodeJS.ReadStream | null;
133
+ /** disable timers/raw-mode for tests */
134
+ headless?: boolean;
135
+ }
136
+ export declare class LoomUI {
137
+ private out;
138
+ private inp;
139
+ private screen;
140
+ private sky;
141
+ private blocks;
142
+ private byId;
143
+ private tick;
144
+ private timer;
145
+ private headless;
146
+ private destroyed;
147
+ agentName: string;
148
+ turns: number;
149
+ busy: boolean;
150
+ busyLabel: string;
151
+ orch: OrchState;
152
+ /** status providers (wired by the chat loop) */
153
+ statusRight: () => string;
154
+ private inputGlyphs;
155
+ private cursor;
156
+ private history;
157
+ private histIdx;
158
+ private histStash;
159
+ private scrollOff;
160
+ private paletteIdx;
161
+ private pendingResolve;
162
+ private modal;
163
+ private sigintAt;
164
+ onInterrupt: (() => void) | null;
165
+ /** Shift+Tab cycles interactive modes (default/plan/auto); wired by the chat loop. */
166
+ onModeCycle: (() => void) | null;
167
+ /** Styled mode badge shown in the status divider when idle ('' = default). */
168
+ modeBadge: string;
169
+ /** User-defined slash commands shown in the palette ([name, description]). */
170
+ extraCommands: [string, string][];
171
+ private keypressHandler;
172
+ private resizeHandler;
173
+ constructor(opts?: LoomOpts);
174
+ start(): void;
175
+ destroy(): void;
176
+ /** Temporarily leave the loom (setup wizard etc.), then restore. */
177
+ suspend<T>(fn: () => Promise<T>): Promise<T>;
178
+ private push;
179
+ blank(): void;
180
+ /** Pre-styled single line (truncated, never wrapped). */
181
+ line(text: string, id?: string): void;
182
+ update(id: string, text: string): void;
183
+ /** Wrapped plain-text block. With an id, later calls update it in place. */
184
+ text(text: string, style?: (s: string) => string, head?: string, id?: string): void;
185
+ private openBlock;
186
+ private bleedLen;
187
+ beginStream(agentName: string): void;
188
+ /** Re-open a fresh stream block (after a tool event), without the header. */
189
+ continueStream(): void;
190
+ streamWrite(s: string): void;
191
+ endStream(): void;
192
+ clearViewport(): void;
193
+ /** Transient hint in the status divider. */
194
+ flash(msg: string, ms?: number): void;
195
+ /** Read one submitted line (the editor stays live during streaming). */
196
+ readInput(): Promise<string>;
197
+ /** Modal y/N confirmation (tool approval). */
198
+ confirm(text: string): Promise<boolean>;
199
+ setHistory(h: string[]): void;
200
+ private onKey;
201
+ private handleSigint;
202
+ private flashHint;
203
+ private paletteMatches;
204
+ private cols;
205
+ private rows;
206
+ private bodyH;
207
+ private clampScroll;
208
+ private invalidateWraps;
209
+ private frame;
210
+ private viewportCache;
211
+ private viewportLines;
212
+ private viewW;
213
+ private railLines;
214
+ /** Compose and flush a frame. Returns the composed rows (used by tests). */
215
+ paint(): string[];
216
+ }
217
+ /** Overlay `top` onto `base` (top's non-space glyphs win), to a fixed width. */
218
+ export declare function overlay(base: string, top: string, width: number): string;
219
+ export {};
220
+ //# sourceMappingURL=loom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loom.d.ts","sourceRoot":"","sources":["../../src/cli/loom.ts"],"names":[],"mappings":"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"}