longer-agent 0.1.0

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 (289) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +227 -0
  3. package/README.zh-CN.md +227 -0
  4. package/agent_templates/executor/agent.yaml +22 -0
  5. package/agent_templates/executor/system_prompt.md +17 -0
  6. package/agent_templates/explorer/agent.yaml +13 -0
  7. package/agent_templates/explorer/system_prompt.md +19 -0
  8. package/agent_templates/main/agent.yaml +7 -0
  9. package/agent_templates/main/system_prompt.md +45 -0
  10. package/configExample.yaml +83 -0
  11. package/dist/agents/agent.d.ts +79 -0
  12. package/dist/agents/agent.d.ts.map +1 -0
  13. package/dist/agents/agent.js +156 -0
  14. package/dist/agents/agent.js.map +1 -0
  15. package/dist/agents/tool-loop.d.ts +140 -0
  16. package/dist/agents/tool-loop.d.ts.map +1 -0
  17. package/dist/agents/tool-loop.js +465 -0
  18. package/dist/agents/tool-loop.js.map +1 -0
  19. package/dist/ask.d.ts +81 -0
  20. package/dist/ask.d.ts.map +1 -0
  21. package/dist/ask.js +34 -0
  22. package/dist/ask.js.map +1 -0
  23. package/dist/auth/openai-oauth.d.ts +66 -0
  24. package/dist/auth/openai-oauth.d.ts.map +1 -0
  25. package/dist/auth/openai-oauth.js +640 -0
  26. package/dist/auth/openai-oauth.js.map +1 -0
  27. package/dist/cli.d.ts +14 -0
  28. package/dist/cli.d.ts.map +1 -0
  29. package/dist/cli.js +254 -0
  30. package/dist/cli.js.map +1 -0
  31. package/dist/commands.d.ts +118 -0
  32. package/dist/commands.d.ts.map +1 -0
  33. package/dist/commands.js +862 -0
  34. package/dist/commands.js.map +1 -0
  35. package/dist/config.d.ts +130 -0
  36. package/dist/config.d.ts.map +1 -0
  37. package/dist/config.js +648 -0
  38. package/dist/config.js.map +1 -0
  39. package/dist/context-rendering.d.ts +69 -0
  40. package/dist/context-rendering.d.ts.map +1 -0
  41. package/dist/context-rendering.js +250 -0
  42. package/dist/context-rendering.js.map +1 -0
  43. package/dist/document-projection.d.ts +12 -0
  44. package/dist/document-projection.d.ts.map +1 -0
  45. package/dist/document-projection.js +75 -0
  46. package/dist/document-projection.js.map +1 -0
  47. package/dist/ephemeral-log.d.ts +15 -0
  48. package/dist/ephemeral-log.d.ts.map +1 -0
  49. package/dist/ephemeral-log.js +173 -0
  50. package/dist/ephemeral-log.js.map +1 -0
  51. package/dist/file-attach.d.ts +89 -0
  52. package/dist/file-attach.d.ts.map +1 -0
  53. package/dist/file-attach.js +571 -0
  54. package/dist/file-attach.js.map +1 -0
  55. package/dist/index.d.ts +29 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +43 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/init-wizard.d.ts +13 -0
  60. package/dist/init-wizard.d.ts.map +1 -0
  61. package/dist/init-wizard.js +328 -0
  62. package/dist/init-wizard.js.map +1 -0
  63. package/dist/log-entry.d.ts +104 -0
  64. package/dist/log-entry.d.ts.map +1 -0
  65. package/dist/log-entry.js +292 -0
  66. package/dist/log-entry.js.map +1 -0
  67. package/dist/log-projection.d.ts +73 -0
  68. package/dist/log-projection.d.ts.map +1 -0
  69. package/dist/log-projection.js +651 -0
  70. package/dist/log-projection.js.map +1 -0
  71. package/dist/mcp-client.d.ts +55 -0
  72. package/dist/mcp-client.d.ts.map +1 -0
  73. package/dist/mcp-client.js +402 -0
  74. package/dist/mcp-client.js.map +1 -0
  75. package/dist/model-selection.d.ts +16 -0
  76. package/dist/model-selection.d.ts.map +1 -0
  77. package/dist/model-selection.js +181 -0
  78. package/dist/model-selection.js.map +1 -0
  79. package/dist/network-retry.d.ts +38 -0
  80. package/dist/network-retry.d.ts.map +1 -0
  81. package/dist/network-retry.js +140 -0
  82. package/dist/network-retry.js.map +1 -0
  83. package/dist/persistence.d.ts +104 -0
  84. package/dist/persistence.d.ts.map +1 -0
  85. package/dist/persistence.js +644 -0
  86. package/dist/persistence.js.map +1 -0
  87. package/dist/primitives/context.d.ts +29 -0
  88. package/dist/primitives/context.d.ts.map +1 -0
  89. package/dist/primitives/context.js +85 -0
  90. package/dist/primitives/context.js.map +1 -0
  91. package/dist/progress.d.ts +51 -0
  92. package/dist/progress.d.ts.map +1 -0
  93. package/dist/progress.js +229 -0
  94. package/dist/progress.js.map +1 -0
  95. package/dist/provider-presets.d.ts +34 -0
  96. package/dist/provider-presets.d.ts.map +1 -0
  97. package/dist/provider-presets.js +181 -0
  98. package/dist/provider-presets.js.map +1 -0
  99. package/dist/providers/anthropic.d.ts +32 -0
  100. package/dist/providers/anthropic.d.ts.map +1 -0
  101. package/dist/providers/anthropic.js +450 -0
  102. package/dist/providers/anthropic.js.map +1 -0
  103. package/dist/providers/base.d.ts +135 -0
  104. package/dist/providers/base.d.ts.map +1 -0
  105. package/dist/providers/base.js +104 -0
  106. package/dist/providers/base.js.map +1 -0
  107. package/dist/providers/glm.d.ts +18 -0
  108. package/dist/providers/glm.d.ts.map +1 -0
  109. package/dist/providers/glm.js +59 -0
  110. package/dist/providers/glm.js.map +1 -0
  111. package/dist/providers/kimi.d.ts +23 -0
  112. package/dist/providers/kimi.d.ts.map +1 -0
  113. package/dist/providers/kimi.js +89 -0
  114. package/dist/providers/kimi.js.map +1 -0
  115. package/dist/providers/minimax.d.ts +20 -0
  116. package/dist/providers/minimax.d.ts.map +1 -0
  117. package/dist/providers/minimax.js +192 -0
  118. package/dist/providers/minimax.js.map +1 -0
  119. package/dist/providers/openai-chat.d.ts +33 -0
  120. package/dist/providers/openai-chat.d.ts.map +1 -0
  121. package/dist/providers/openai-chat.js +543 -0
  122. package/dist/providers/openai-chat.js.map +1 -0
  123. package/dist/providers/openai-responses.d.ts +26 -0
  124. package/dist/providers/openai-responses.d.ts.map +1 -0
  125. package/dist/providers/openai-responses.js +443 -0
  126. package/dist/providers/openai-responses.js.map +1 -0
  127. package/dist/providers/openrouter.d.ts +24 -0
  128. package/dist/providers/openrouter.d.ts.map +1 -0
  129. package/dist/providers/openrouter.js +177 -0
  130. package/dist/providers/openrouter.js.map +1 -0
  131. package/dist/providers/registry.d.ts +7 -0
  132. package/dist/providers/registry.d.ts.map +1 -0
  133. package/dist/providers/registry.js +38 -0
  134. package/dist/providers/registry.js.map +1 -0
  135. package/dist/security/path.d.ts +51 -0
  136. package/dist/security/path.d.ts.map +1 -0
  137. package/dist/security/path.js +187 -0
  138. package/dist/security/path.js.map +1 -0
  139. package/dist/security/sensitive-files.d.ts +3 -0
  140. package/dist/security/sensitive-files.d.ts.map +1 -0
  141. package/dist/security/sensitive-files.js +41 -0
  142. package/dist/security/sensitive-files.js.map +1 -0
  143. package/dist/session.d.ts +446 -0
  144. package/dist/session.d.ts.map +1 -0
  145. package/dist/session.js +4595 -0
  146. package/dist/session.js.map +1 -0
  147. package/dist/settings.d.ts +46 -0
  148. package/dist/settings.d.ts.map +1 -0
  149. package/dist/settings.js +134 -0
  150. package/dist/settings.js.map +1 -0
  151. package/dist/show-context.d.ts +35 -0
  152. package/dist/show-context.d.ts.map +1 -0
  153. package/dist/show-context.js +320 -0
  154. package/dist/show-context.js.map +1 -0
  155. package/dist/skills/loader.d.ts +49 -0
  156. package/dist/skills/loader.d.ts.map +1 -0
  157. package/dist/skills/loader.js +166 -0
  158. package/dist/skills/loader.js.map +1 -0
  159. package/dist/summarize-context.d.ts +29 -0
  160. package/dist/summarize-context.d.ts.map +1 -0
  161. package/dist/summarize-context.js +247 -0
  162. package/dist/summarize-context.js.map +1 -0
  163. package/dist/templates/loader.d.ts +104 -0
  164. package/dist/templates/loader.d.ts.map +1 -0
  165. package/dist/templates/loader.js +514 -0
  166. package/dist/templates/loader.js.map +1 -0
  167. package/dist/tools/basic.d.ts +29 -0
  168. package/dist/tools/basic.d.ts.map +1 -0
  169. package/dist/tools/basic.js +2079 -0
  170. package/dist/tools/basic.js.map +1 -0
  171. package/dist/tools/comm.d.ts +17 -0
  172. package/dist/tools/comm.d.ts.map +1 -0
  173. package/dist/tools/comm.js +192 -0
  174. package/dist/tools/comm.js.map +1 -0
  175. package/dist/tools/web-fetch.d.ts +11 -0
  176. package/dist/tools/web-fetch.d.ts.map +1 -0
  177. package/dist/tools/web-fetch.js +237 -0
  178. package/dist/tools/web-fetch.js.map +1 -0
  179. package/dist/tools/web-search.d.ts +24 -0
  180. package/dist/tools/web-search.d.ts.map +1 -0
  181. package/dist/tools/web-search.js +51 -0
  182. package/dist/tools/web-search.js.map +1 -0
  183. package/dist/tui/app.d.ts +35 -0
  184. package/dist/tui/app.d.ts.map +1 -0
  185. package/dist/tui/app.js +1042 -0
  186. package/dist/tui/app.js.map +1 -0
  187. package/dist/tui/checkbox-picker.d.ts +35 -0
  188. package/dist/tui/checkbox-picker.d.ts.map +1 -0
  189. package/dist/tui/checkbox-picker.js +85 -0
  190. package/dist/tui/checkbox-picker.js.map +1 -0
  191. package/dist/tui/command-picker.d.ts +31 -0
  192. package/dist/tui/command-picker.d.ts.map +1 -0
  193. package/dist/tui/command-picker.js +113 -0
  194. package/dist/tui/command-picker.js.map +1 -0
  195. package/dist/tui/components/ask-panel.d.ts +21 -0
  196. package/dist/tui/components/ask-panel.d.ts.map +1 -0
  197. package/dist/tui/components/ask-panel.js +81 -0
  198. package/dist/tui/components/ask-panel.js.map +1 -0
  199. package/dist/tui/components/conversation-panel.d.ts +68 -0
  200. package/dist/tui/components/conversation-panel.d.ts.map +1 -0
  201. package/dist/tui/components/conversation-panel.js +611 -0
  202. package/dist/tui/components/conversation-panel.js.map +1 -0
  203. package/dist/tui/components/input-panel.d.ts +27 -0
  204. package/dist/tui/components/input-panel.d.ts.map +1 -0
  205. package/dist/tui/components/input-panel.js +725 -0
  206. package/dist/tui/components/input-panel.js.map +1 -0
  207. package/dist/tui/components/logo-panel.d.ts +14 -0
  208. package/dist/tui/components/logo-panel.d.ts.map +1 -0
  209. package/dist/tui/components/logo-panel.js +37 -0
  210. package/dist/tui/components/logo-panel.js.map +1 -0
  211. package/dist/tui/components/plan-panel.d.ts +10 -0
  212. package/dist/tui/components/plan-panel.d.ts.map +1 -0
  213. package/dist/tui/components/plan-panel.js +8 -0
  214. package/dist/tui/components/plan-panel.js.map +1 -0
  215. package/dist/tui/components/status-bar.d.ts +24 -0
  216. package/dist/tui/components/status-bar.d.ts.map +1 -0
  217. package/dist/tui/components/status-bar.js +80 -0
  218. package/dist/tui/components/status-bar.js.map +1 -0
  219. package/dist/tui/input/editor-state.d.ts +22 -0
  220. package/dist/tui/input/editor-state.d.ts.map +1 -0
  221. package/dist/tui/input/editor-state.js +157 -0
  222. package/dist/tui/input/editor-state.js.map +1 -0
  223. package/dist/tui/input/keymap.d.ts +3 -0
  224. package/dist/tui/input/keymap.d.ts.map +1 -0
  225. package/dist/tui/input/keymap.js +72 -0
  226. package/dist/tui/input/keymap.js.map +1 -0
  227. package/dist/tui/input/paste-slots.d.ts +17 -0
  228. package/dist/tui/input/paste-slots.d.ts.map +1 -0
  229. package/dist/tui/input/paste-slots.js +46 -0
  230. package/dist/tui/input/paste-slots.js.map +1 -0
  231. package/dist/tui/input/paste.d.ts +15 -0
  232. package/dist/tui/input/paste.d.ts.map +1 -0
  233. package/dist/tui/input/paste.js +35 -0
  234. package/dist/tui/input/paste.js.map +1 -0
  235. package/dist/tui/input/protocol.d.ts +9 -0
  236. package/dist/tui/input/protocol.d.ts.map +1 -0
  237. package/dist/tui/input/protocol.js +387 -0
  238. package/dist/tui/input/protocol.js.map +1 -0
  239. package/dist/tui/input/sanitize.d.ts +6 -0
  240. package/dist/tui/input/sanitize.d.ts.map +1 -0
  241. package/dist/tui/input/sanitize.js +20 -0
  242. package/dist/tui/input/sanitize.js.map +1 -0
  243. package/dist/tui/input/types.d.ts +18 -0
  244. package/dist/tui/input/types.d.ts.map +1 -0
  245. package/dist/tui/input/types.js +2 -0
  246. package/dist/tui/input/types.js.map +1 -0
  247. package/dist/tui/launch.d.ts +23 -0
  248. package/dist/tui/launch.d.ts.map +1 -0
  249. package/dist/tui/launch.js +104 -0
  250. package/dist/tui/launch.js.map +1 -0
  251. package/dist/tui/theme.d.ts +20 -0
  252. package/dist/tui/theme.d.ts.map +1 -0
  253. package/dist/tui/theme.js +29 -0
  254. package/dist/tui/theme.js.map +1 -0
  255. package/dist/tui/types.d.ts +136 -0
  256. package/dist/tui/types.d.ts.map +1 -0
  257. package/dist/tui/types.js +9 -0
  258. package/dist/tui/types.js.map +1 -0
  259. package/package.json +76 -0
  260. package/prompts/sections/agents_md.md +23 -0
  261. package/prompts/sections/important_log.md +16 -0
  262. package/prompts/sections/system_mechanisms.md +18 -0
  263. package/prompts/tools/apply_patch.md +31 -0
  264. package/prompts/tools/ask.md +18 -0
  265. package/prompts/tools/bash.md +13 -0
  266. package/prompts/tools/bash_background.md +9 -0
  267. package/prompts/tools/bash_output.md +9 -0
  268. package/prompts/tools/check_status.md +3 -0
  269. package/prompts/tools/diff.md +5 -0
  270. package/prompts/tools/edit_file.md +11 -0
  271. package/prompts/tools/glob.md +7 -0
  272. package/prompts/tools/grep.md +20 -0
  273. package/prompts/tools/kill_agent.md +3 -0
  274. package/prompts/tools/kill_shell.md +5 -0
  275. package/prompts/tools/list_dir.md +5 -0
  276. package/prompts/tools/plan.md +252 -0
  277. package/prompts/tools/read_file.md +9 -0
  278. package/prompts/tools/show_context.md +12 -0
  279. package/prompts/tools/skill.md +7 -0
  280. package/prompts/tools/spawn_agent.md +195 -0
  281. package/prompts/tools/summarize_context.md +122 -0
  282. package/prompts/tools/test.md +5 -0
  283. package/prompts/tools/wait.md +17 -0
  284. package/prompts/tools/web_fetch.md +9 -0
  285. package/prompts/tools/web_search.md +5 -0
  286. package/prompts/tools/write_file.md +11 -0
  287. package/skills/.staging/.gitkeep +0 -0
  288. package/skills/explain-code/SKILL.md +15 -0
  289. package/skills/skill-manager/SKILL.md +83 -0
@@ -0,0 +1,320 @@
1
+ /**
2
+ * show_context tool implementation.
3
+ *
4
+ * Generates two outputs:
5
+ * 1. Context Map — compact index for the tool_result (all groups, total tokens, types)
6
+ * 2. Injection annotations — detailed per-entry descriptions for each §{id}§ injection point
7
+ *
8
+ * Uses a shared GPT tokenizer estimator for relative size hints.
9
+ */
10
+ import { encode as gptEncode } from "gpt-tokenizer/model/gpt-5";
11
+ // ------------------------------------------------------------------
12
+ // Token display helpers
13
+ // ------------------------------------------------------------------
14
+ function formatTokens(tokens) {
15
+ if (tokens < 1000)
16
+ return "<1k";
17
+ return `${Math.round(tokens / 1000)}k`;
18
+ }
19
+ // ------------------------------------------------------------------
20
+ // Entry content serialization for token estimation
21
+ // ------------------------------------------------------------------
22
+ function estimateEntryTokens(entry) {
23
+ let text;
24
+ switch (entry.type) {
25
+ case "user_message":
26
+ case "assistant_text":
27
+ case "no_reply":
28
+ case "compact_context":
29
+ case "summary":
30
+ text = serializeContent(entry.content);
31
+ break;
32
+ case "reasoning":
33
+ text = serializeContent(entry.content);
34
+ break;
35
+ case "tool_call":
36
+ text = JSON.stringify(entry.content ?? {});
37
+ break;
38
+ case "tool_result": {
39
+ const rc = entry.content;
40
+ text = rc?.content ?? JSON.stringify(entry.content ?? {});
41
+ break;
42
+ }
43
+ default:
44
+ text = serializeContent(entry.content);
45
+ break;
46
+ }
47
+ return gptEncode(text).length;
48
+ }
49
+ function serializeContent(content) {
50
+ if (typeof content === "string")
51
+ return content;
52
+ if (Array.isArray(content)) {
53
+ return content
54
+ .map((block) => {
55
+ if (block?.type === "text")
56
+ return String(block.text ?? "");
57
+ if (block?.type === "image" || block?.type === "image_ref")
58
+ return "[image]";
59
+ return JSON.stringify(block);
60
+ })
61
+ .join("\n");
62
+ }
63
+ if (content === null || content === undefined)
64
+ return "";
65
+ return JSON.stringify(content);
66
+ }
67
+ // ------------------------------------------------------------------
68
+ // Entry description generation
69
+ // ------------------------------------------------------------------
70
+ function truncateText(text, maxLen = 50) {
71
+ const clean = text.replace(/\n/g, " ").trim();
72
+ if (clean.length <= maxLen)
73
+ return `"${clean}"`;
74
+ return `"${clean.slice(0, maxLen)}..."`;
75
+ }
76
+ function describeEntry(entry) {
77
+ switch (entry.type) {
78
+ case "user_message": {
79
+ const text = serializeContent(entry.content);
80
+ const hasImage = Array.isArray(entry.content) &&
81
+ entry.content.some((b) => b?.type === "image" || b?.type === "image_ref");
82
+ const prefix = hasImage ? "[image] " : "";
83
+ return { label: "user", description: `${prefix}${truncateText(text)}` };
84
+ }
85
+ case "assistant_text":
86
+ return { label: "assistant", description: truncateText(String(entry.content ?? "")) };
87
+ case "reasoning":
88
+ return { label: "thinking", description: "[internal reasoning]" };
89
+ case "tool_call": {
90
+ const tc = entry.content;
91
+ const name = tc?.name ?? entry.meta["toolName"] ?? "unknown";
92
+ const args = tc?.arguments ?? {};
93
+ const brief = formatToolCallArgs(String(name), args);
94
+ return { label: "call", description: `${name}(${brief})` };
95
+ }
96
+ case "tool_result": {
97
+ const toolName = String(entry.meta["toolName"] ?? "unknown");
98
+ const isError = entry.meta["isError"] === true;
99
+ const rc = entry.content;
100
+ const resultStr = rc?.content ?? "";
101
+ const brief = isError
102
+ ? `ERROR: ${resultStr.slice(0, 60).replace(/\n/g, " ")}`
103
+ : formatToolResultBrief(toolName, resultStr, entry.meta);
104
+ return { label: "result", description: `${toolName} → ${brief}` };
105
+ }
106
+ case "no_reply":
107
+ return { label: "no-reply", description: "" };
108
+ case "summary": {
109
+ const depth = entry.meta["summaryDepth"] ?? 1;
110
+ return { label: "summary", description: `(depth ${depth}) ${truncateText(String(entry.content ?? ""))}` };
111
+ }
112
+ case "compact_context":
113
+ return { label: "compact", description: "Auto-compact summary" };
114
+ default:
115
+ return { label: entry.type, description: truncateText(serializeContent(entry.content)) };
116
+ }
117
+ }
118
+ function formatToolCallArgs(toolName, args) {
119
+ // Known tools: show the most important arg
120
+ switch (toolName) {
121
+ case "read_file": {
122
+ const path = String(args["path"] ?? args["file"] ?? "");
123
+ const parts = [path ? `"${path}"` : ""];
124
+ if (args["start_line"] !== undefined)
125
+ parts.push(`${args["start_line"]}–${args["end_line"] ?? "end"}`);
126
+ return parts.filter(Boolean).join(", ");
127
+ }
128
+ case "edit_file":
129
+ case "write_file":
130
+ return `"${String(args["path"] ?? args["file"] ?? "")}", ...`;
131
+ case "bash":
132
+ case "bash_background":
133
+ return truncateText(String(args["command"] ?? ""), 40).slice(1, -1); // remove quotes from truncateText
134
+ case "grep":
135
+ return `"${String(args["pattern"] ?? "")}", path="${String(args["path"] ?? "")}"`;
136
+ case "glob":
137
+ return `"${String(args["pattern"] ?? "")}"`;
138
+ case "spawn_agent":
139
+ return `"${String(args["file"] ?? "")}"`;
140
+ case "ask": {
141
+ const qs = args["questions"];
142
+ if (qs?.length)
143
+ return truncateText(String(qs[0]?.question ?? ""), 30).slice(1, -1);
144
+ return "...";
145
+ }
146
+ case "summarize_context": {
147
+ const ops = args["operations"];
148
+ return `${ops?.length ?? 0} operations`;
149
+ }
150
+ default:
151
+ // Generic fallback
152
+ if (Object.keys(args).length === 0)
153
+ return "";
154
+ return "...";
155
+ }
156
+ }
157
+ function formatToolResultBrief(toolName, resultStr, meta) {
158
+ switch (toolName) {
159
+ case "read_file":
160
+ return `${resultStr.length} chars`;
161
+ case "edit_file":
162
+ return resultStr.includes("applied") || resultStr.includes("OK") ? "applied" : `${resultStr.length} chars`;
163
+ case "write_file":
164
+ return "created";
165
+ case "bash":
166
+ case "bash_background": {
167
+ // Try to extract exit code
168
+ const exitMatch = resultStr.match(/exit (?:code |status )?(\d+)/i);
169
+ const exitCode = exitMatch ? exitMatch[1] : null;
170
+ const size = formatTokens(gptEncode(resultStr).length);
171
+ return exitCode !== null ? `exit ${exitCode}, ${size} output` : `${size} output`;
172
+ }
173
+ case "grep": {
174
+ const lineCount = resultStr.split("\n").filter(Boolean).length;
175
+ return `${lineCount} matches`;
176
+ }
177
+ case "ask": {
178
+ const brief = resultStr.replace(/\n/g, " ").trim();
179
+ return brief.length > 40 ? `${brief.slice(0, 40)}...` : brief;
180
+ }
181
+ default:
182
+ // Generic fallback
183
+ return `${formatTokens(gptEncode(resultStr).length)} output`;
184
+ }
185
+ }
186
+ // ------------------------------------------------------------------
187
+ // Context group builder
188
+ // ------------------------------------------------------------------
189
+ function getLogContextId(entry) {
190
+ if (entry.discarded || entry.summarized)
191
+ return null;
192
+ if (entry.type === "compact_context") {
193
+ const ctxId = entry.meta["contextId"];
194
+ return ctxId ? String(ctxId) : null;
195
+ }
196
+ const ctxId = entry.meta["contextId"];
197
+ if (ctxId === undefined || ctxId === null)
198
+ return null;
199
+ return String(ctxId);
200
+ }
201
+ /**
202
+ * Build context groups from log entries in the active window.
203
+ * Returns groups in spatial (appearance) order.
204
+ */
205
+ export function buildContextGroups(entries) {
206
+ // Find active window start (after last compact_marker)
207
+ let windowStartIdx = 0;
208
+ for (let i = entries.length - 1; i >= 0; i--) {
209
+ if (entries[i].type === "compact_marker" && !entries[i].discarded) {
210
+ windowStartIdx = i + 1;
211
+ break;
212
+ }
213
+ }
214
+ // Build ordered groups
215
+ const groupMap = new Map();
216
+ const groupOrder = [];
217
+ for (let i = windowStartIdx; i < entries.length; i++) {
218
+ const entry = entries[i];
219
+ const ctxId = getLogContextId(entry);
220
+ if (!ctxId)
221
+ continue;
222
+ let group = groupMap.get(ctxId);
223
+ if (!group) {
224
+ group = { contextId: ctxId, entries: [], totalTokens: 0, entryTokens: [] };
225
+ groupMap.set(ctxId, group);
226
+ groupOrder.push(ctxId);
227
+ }
228
+ const tokens = estimateEntryTokens(entry);
229
+ group.entries.push({ entry, index: i });
230
+ group.entryTokens.push(tokens);
231
+ group.totalTokens += tokens;
232
+ }
233
+ return groupOrder.map((id) => groupMap.get(id));
234
+ }
235
+ // ------------------------------------------------------------------
236
+ // Context Map generation (compact, for tool_result)
237
+ // ------------------------------------------------------------------
238
+ function entryTypeLabel(entry) {
239
+ switch (entry.type) {
240
+ case "user_message": return "user";
241
+ case "assistant_text": return "assistant";
242
+ case "reasoning": return "thinking";
243
+ case "tool_call": return "call";
244
+ case "tool_result": return "result";
245
+ case "no_reply": return "no-reply";
246
+ case "summary": return "summary";
247
+ case "compact_context": return "compact";
248
+ default: return entry.type;
249
+ }
250
+ }
251
+ function buildTypeList(group) {
252
+ const counts = new Map();
253
+ for (const { entry } of group.entries) {
254
+ const label = entryTypeLabel(entry);
255
+ counts.set(label, (counts.get(label) ?? 0) + 1);
256
+ }
257
+ const parts = [];
258
+ for (const [label, count] of counts) {
259
+ parts.push(count > 1 ? `${count}× ${label}` : label);
260
+ }
261
+ return parts.join(", ");
262
+ }
263
+ function groupHeaderAnnotation(group) {
264
+ const isSummary = group.entries.some((e) => e.entry.type === "summary");
265
+ const isCompact = group.entries.some((e) => e.entry.type === "compact_context");
266
+ if (isSummary) {
267
+ const depth = group.entries
268
+ .filter((e) => e.entry.type === "summary")
269
+ .map((e) => e.entry.meta["summaryDepth"] ?? 1)[0];
270
+ return ` — summary, depth ${depth}`;
271
+ }
272
+ if (isCompact)
273
+ return " — auto-compact";
274
+ return "";
275
+ }
276
+ export function generateContextMap(groups, lastInputTokens, budget) {
277
+ const lines = [];
278
+ lines.push(`Context Map (${groups.length} groups)`);
279
+ lines.push(`Total: ${formatTokens(lastInputTokens)} | Budget: ${formatTokens(budget)}`);
280
+ lines.push("");
281
+ for (const group of groups) {
282
+ const tokStr = formatTokens(group.totalTokens).padStart(4);
283
+ const types = buildTypeList(group);
284
+ const annotation = groupHeaderAnnotation(group);
285
+ lines.push(`[${group.contextId}] ${tokStr} ${types}${annotation}`);
286
+ }
287
+ return lines.join("\n");
288
+ }
289
+ // ------------------------------------------------------------------
290
+ // Injection annotation generation (detailed, for §{id}§ locations)
291
+ // ------------------------------------------------------------------
292
+ export function generateAnnotations(groups) {
293
+ const annotations = new Map();
294
+ for (const group of groups) {
295
+ const lines = [];
296
+ const header = `§{${group.contextId}}§ ${formatTokens(group.totalTokens)}${groupHeaderAnnotation(group)}`;
297
+ lines.push(header);
298
+ for (let j = 0; j < group.entries.length; j++) {
299
+ const { entry } = group.entries[j];
300
+ const tokens = group.entryTokens[j];
301
+ const { label, description } = describeEntry(entry);
302
+ const tokStr = formatTokens(tokens).padStart(4);
303
+ const paddedLabel = label.padEnd(10);
304
+ lines.push(` ${paddedLabel} ${description.padEnd(50)} ${tokStr}`);
305
+ }
306
+ annotations.set(group.contextId, lines.join("\n"));
307
+ }
308
+ return annotations;
309
+ }
310
+ // ------------------------------------------------------------------
311
+ // Combined entry point
312
+ // ------------------------------------------------------------------
313
+ export function generateShowContext(entries, lastInputTokens, budget) {
314
+ const groups = buildContextGroups(entries);
315
+ return {
316
+ contextMap: generateContextMap(groups, lastInputTokens, budget),
317
+ annotations: generateAnnotations(groups),
318
+ };
319
+ }
320
+ //# sourceMappingURL=show-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show-context.js","sourceRoot":"","sources":["../src/show-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Skill discovery and loading.
3
+ *
4
+ * Skills are reusable prompt expansions defined as SKILL.md files
5
+ * with YAML frontmatter + markdown instructions. Aligned with the
6
+ * Agent Skills open standard (https://agentskills.io).
7
+ *
8
+ * Directory layout:
9
+ *
10
+ * skills/
11
+ * +-- explain-code/
12
+ * | +-- SKILL.md # required
13
+ * | +-- scripts/ # optional helper scripts
14
+ * | +-- references/ # optional docs
15
+ * +-- deploy/
16
+ * +-- SKILL.md
17
+ */
18
+ export interface SkillMeta {
19
+ /** Skill identifier — also becomes the /slash-command name. */
20
+ name: string;
21
+ /** Description of when to use this skill. */
22
+ description: string;
23
+ /** If true, only the user can invoke via /name (agent cannot call skill tool). */
24
+ disableModelInvocation: boolean;
25
+ /** If false, skill is hidden from the / menu (only agent can invoke). */
26
+ userInvocable: boolean;
27
+ /** Absolute path to the skill directory. */
28
+ dir: string;
29
+ /** SKILL.md body after frontmatter (raw markdown). */
30
+ contentRaw: string;
31
+ }
32
+ /**
33
+ * Discover and load all skills from a skills root directory.
34
+ *
35
+ * Each subdirectory containing a SKILL.md file is treated as a skill.
36
+ * Parse errors are warned and skipped.
37
+ */
38
+ export declare function loadSkills(skillsRoot: string): Map<string, SkillMeta>;
39
+ /**
40
+ * Resolve a skill's content by substituting `$ARGUMENTS`, `$ARGUMENTS[N]`,
41
+ * and `$N` placeholders with the provided arguments string.
42
+ */
43
+ export declare function resolveSkillContent(skill: SkillMeta, args: string): string;
44
+ /**
45
+ * Load skills from multiple root directories (e.g. bundled + user).
46
+ * Later roots override earlier ones by skill name.
47
+ */
48
+ export declare function loadSkillsMulti(roots: string[]): Map<string, SkillMeta>;
49
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAUH,MAAM,WAAW,SAAS;IACxB,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,kFAAkF;IAClF,sBAAsB,EAAE,OAAO,CAAC;IAChC,yEAAyE;IACzE,aAAa,EAAE,OAAO,CAAC;IACvB,4CAA4C;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;CACpB;AA0CD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAwErE;AAMD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAoB1E;AAMD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAUvE"}
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Skill discovery and loading.
3
+ *
4
+ * Skills are reusable prompt expansions defined as SKILL.md files
5
+ * with YAML frontmatter + markdown instructions. Aligned with the
6
+ * Agent Skills open standard (https://agentskills.io).
7
+ *
8
+ * Directory layout:
9
+ *
10
+ * skills/
11
+ * +-- explain-code/
12
+ * | +-- SKILL.md # required
13
+ * | +-- scripts/ # optional helper scripts
14
+ * | +-- references/ # optional docs
15
+ * +-- deploy/
16
+ * +-- SKILL.md
17
+ */
18
+ import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
19
+ import { join } from "node:path";
20
+ import * as yaml from "js-yaml";
21
+ /**
22
+ * Split a SKILL.md file into YAML frontmatter and markdown body.
23
+ * Returns null if no valid frontmatter is found.
24
+ */
25
+ function parseSkillMd(raw) {
26
+ const trimmed = raw.trimStart();
27
+ if (!trimmed.startsWith("---"))
28
+ return null;
29
+ // Find closing ---
30
+ const endIdx = trimmed.indexOf("\n---", 3);
31
+ if (endIdx === -1)
32
+ return null;
33
+ const yamlStr = trimmed.slice(3, endIdx).trim();
34
+ const body = trimmed.slice(endIdx + 4).trim(); // skip past \n---
35
+ let frontmatter;
36
+ try {
37
+ const parsed = yaml.load(yamlStr);
38
+ if (typeof parsed !== "object" || parsed === null)
39
+ return null;
40
+ frontmatter = parsed;
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ return { frontmatter, body };
46
+ }
47
+ // ------------------------------------------------------------------
48
+ // Skill loading
49
+ // ------------------------------------------------------------------
50
+ /**
51
+ * Discover and load all skills from a skills root directory.
52
+ *
53
+ * Each subdirectory containing a SKILL.md file is treated as a skill.
54
+ * Parse errors are warned and skipped.
55
+ */
56
+ export function loadSkills(skillsRoot) {
57
+ const skills = new Map();
58
+ if (!existsSync(skillsRoot) || !statSync(skillsRoot).isDirectory()) {
59
+ return skills;
60
+ }
61
+ for (const entry of readdirSync(skillsRoot)) {
62
+ if (entry === ".staging")
63
+ continue;
64
+ const dirPath = join(skillsRoot, entry);
65
+ if (!statSync(dirPath).isDirectory())
66
+ continue;
67
+ const skillMdPath = join(dirPath, "SKILL.md");
68
+ if (!existsSync(skillMdPath))
69
+ continue;
70
+ try {
71
+ const raw = readFileSync(skillMdPath, "utf-8");
72
+ const parsed = parseSkillMd(raw);
73
+ let name;
74
+ let description;
75
+ let disableModelInvocation = false;
76
+ let userInvocable = true;
77
+ let body;
78
+ if (parsed) {
79
+ const fm = parsed.frontmatter;
80
+ name = typeof fm["name"] === "string" ? fm["name"] : entry;
81
+ description = typeof fm["description"] === "string"
82
+ ? fm["description"]
83
+ : extractFirstParagraph(parsed.body);
84
+ disableModelInvocation = fm["disable-model-invocation"] === true;
85
+ userInvocable = fm["user-invocable"] !== false;
86
+ body = parsed.body;
87
+ }
88
+ else {
89
+ // No frontmatter — use directory name and full content
90
+ name = entry;
91
+ description = extractFirstParagraph(raw);
92
+ body = raw;
93
+ }
94
+ // Validate name: lowercase letters, numbers, hyphens only
95
+ if (!/^[a-z0-9][a-z0-9-]*$/.test(name)) {
96
+ console.warn(`Skill "${entry}": invalid name "${name}" (must be lowercase alphanumeric + hyphens). Skipping.`);
97
+ continue;
98
+ }
99
+ if (skills.has(name)) {
100
+ console.warn(`Skill "${entry}": duplicate name "${name}". Skipping.`);
101
+ continue;
102
+ }
103
+ skills.set(name, {
104
+ name,
105
+ description,
106
+ disableModelInvocation,
107
+ userInvocable,
108
+ dir: dirPath,
109
+ contentRaw: body,
110
+ });
111
+ }
112
+ catch (e) {
113
+ console.warn(`Skill "${entry}": failed to load SKILL.md: ${e instanceof Error ? e.message : e}`);
114
+ }
115
+ }
116
+ return skills;
117
+ }
118
+ // ------------------------------------------------------------------
119
+ // Argument substitution
120
+ // ------------------------------------------------------------------
121
+ /**
122
+ * Resolve a skill's content by substituting `$ARGUMENTS`, `$ARGUMENTS[N]`,
123
+ * and `$N` placeholders with the provided arguments string.
124
+ */
125
+ export function resolveSkillContent(skill, args) {
126
+ const parts = args.trim() ? args.trim().split(/\s+/) : [];
127
+ let content = skill.contentRaw;
128
+ // Replace positional: $ARGUMENTS[N] and $N (longest match first)
129
+ for (let i = parts.length - 1; i >= 0; i--) {
130
+ content = content.replace(new RegExp(`\\$ARGUMENTS\\[${i}\\]`, "g"), parts[i]);
131
+ content = content.replace(new RegExp(`\\$${i}(?![0-9])`, "g"), parts[i]);
132
+ }
133
+ // Replace $ARGUMENTS (full string)
134
+ content = content.replace(/\$ARGUMENTS/g, args.trim());
135
+ return content;
136
+ }
137
+ // ------------------------------------------------------------------
138
+ // Helpers
139
+ // ------------------------------------------------------------------
140
+ /**
141
+ * Load skills from multiple root directories (e.g. bundled + user).
142
+ * Later roots override earlier ones by skill name.
143
+ */
144
+ export function loadSkillsMulti(roots) {
145
+ const merged = new Map();
146
+ for (const root of roots) {
147
+ if (!existsSync(root) || !statSync(root).isDirectory())
148
+ continue;
149
+ const found = loadSkills(root);
150
+ for (const [name, skill] of found) {
151
+ merged.set(name, skill); // later roots override earlier (user > bundled)
152
+ }
153
+ }
154
+ return merged;
155
+ }
156
+ /** Extract the first non-empty paragraph from markdown text. */
157
+ function extractFirstParagraph(text) {
158
+ for (const line of text.split("\n")) {
159
+ const trimmed = line.trim();
160
+ if (trimmed && !trimmed.startsWith("#")) {
161
+ return trimmed.length > 120 ? trimmed.slice(0, 117) + "..." : trimmed;
162
+ }
163
+ }
164
+ return "(no description)";
165
+ }
166
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Log-native summarize_context implementation.
3
+ *
4
+ * The session log is the single source of truth. summarize_context works
5
+ * directly on LogEntry[] and inserts summary entries into the active window.
6
+ */
7
+ import { type LogEntry } from "./log-entry.js";
8
+ export interface SummarizeOperation {
9
+ context_ids: string[];
10
+ summary: string;
11
+ reason?: string;
12
+ }
13
+ export interface OperationResult {
14
+ success: boolean;
15
+ contextIds: string[];
16
+ newContextId?: string;
17
+ error?: string;
18
+ }
19
+ export interface LogSummarizeExecutionResult {
20
+ output: string;
21
+ results: OperationResult[];
22
+ }
23
+ /**
24
+ * Truncate long summary text in projected tool arguments.
25
+ * The tool result still keeps the full summary; this only shrinks provider input.
26
+ */
27
+ export declare function truncateSummaryText(summary: string, newContextId?: string | number): string;
28
+ export declare function execSummarizeContextOnLog(args: Record<string, unknown>, entries: LogEntry[], contextIdAllocator: () => string, logIdAllocator: () => string, turnIndex: number): LogSummarizeExecutionResult;
29
+ //# sourceMappingURL=summarize-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarize-context.d.ts","sourceRoot":"","sources":["../src/summarize-context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAiB,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE9D,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAYD,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AA4MD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAc3F;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,QAAQ,EAAE,EACnB,kBAAkB,EAAE,MAAM,MAAM,EAChC,cAAc,EAAE,MAAM,MAAM,EAC5B,SAAS,EAAE,MAAM,GAChB,2BAA2B,CAoE7B"}