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.
- package/LICENSE +21 -0
- package/README.md +227 -0
- package/README.zh-CN.md +227 -0
- package/agent_templates/executor/agent.yaml +22 -0
- package/agent_templates/executor/system_prompt.md +17 -0
- package/agent_templates/explorer/agent.yaml +13 -0
- package/agent_templates/explorer/system_prompt.md +19 -0
- package/agent_templates/main/agent.yaml +7 -0
- package/agent_templates/main/system_prompt.md +45 -0
- package/configExample.yaml +83 -0
- package/dist/agents/agent.d.ts +79 -0
- package/dist/agents/agent.d.ts.map +1 -0
- package/dist/agents/agent.js +156 -0
- package/dist/agents/agent.js.map +1 -0
- package/dist/agents/tool-loop.d.ts +140 -0
- package/dist/agents/tool-loop.d.ts.map +1 -0
- package/dist/agents/tool-loop.js +465 -0
- package/dist/agents/tool-loop.js.map +1 -0
- package/dist/ask.d.ts +81 -0
- package/dist/ask.d.ts.map +1 -0
- package/dist/ask.js +34 -0
- package/dist/ask.js.map +1 -0
- package/dist/auth/openai-oauth.d.ts +66 -0
- package/dist/auth/openai-oauth.d.ts.map +1 -0
- package/dist/auth/openai-oauth.js +640 -0
- package/dist/auth/openai-oauth.js.map +1 -0
- package/dist/cli.d.ts +14 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +254 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands.d.ts +118 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +862 -0
- package/dist/commands.js.map +1 -0
- package/dist/config.d.ts +130 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +648 -0
- package/dist/config.js.map +1 -0
- package/dist/context-rendering.d.ts +69 -0
- package/dist/context-rendering.d.ts.map +1 -0
- package/dist/context-rendering.js +250 -0
- package/dist/context-rendering.js.map +1 -0
- package/dist/document-projection.d.ts +12 -0
- package/dist/document-projection.d.ts.map +1 -0
- package/dist/document-projection.js +75 -0
- package/dist/document-projection.js.map +1 -0
- package/dist/ephemeral-log.d.ts +15 -0
- package/dist/ephemeral-log.d.ts.map +1 -0
- package/dist/ephemeral-log.js +173 -0
- package/dist/ephemeral-log.js.map +1 -0
- package/dist/file-attach.d.ts +89 -0
- package/dist/file-attach.d.ts.map +1 -0
- package/dist/file-attach.js +571 -0
- package/dist/file-attach.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/init-wizard.d.ts +13 -0
- package/dist/init-wizard.d.ts.map +1 -0
- package/dist/init-wizard.js +328 -0
- package/dist/init-wizard.js.map +1 -0
- package/dist/log-entry.d.ts +104 -0
- package/dist/log-entry.d.ts.map +1 -0
- package/dist/log-entry.js +292 -0
- package/dist/log-entry.js.map +1 -0
- package/dist/log-projection.d.ts +73 -0
- package/dist/log-projection.d.ts.map +1 -0
- package/dist/log-projection.js +651 -0
- package/dist/log-projection.js.map +1 -0
- package/dist/mcp-client.d.ts +55 -0
- package/dist/mcp-client.d.ts.map +1 -0
- package/dist/mcp-client.js +402 -0
- package/dist/mcp-client.js.map +1 -0
- package/dist/model-selection.d.ts +16 -0
- package/dist/model-selection.d.ts.map +1 -0
- package/dist/model-selection.js +181 -0
- package/dist/model-selection.js.map +1 -0
- package/dist/network-retry.d.ts +38 -0
- package/dist/network-retry.d.ts.map +1 -0
- package/dist/network-retry.js +140 -0
- package/dist/network-retry.js.map +1 -0
- package/dist/persistence.d.ts +104 -0
- package/dist/persistence.d.ts.map +1 -0
- package/dist/persistence.js +644 -0
- package/dist/persistence.js.map +1 -0
- package/dist/primitives/context.d.ts +29 -0
- package/dist/primitives/context.d.ts.map +1 -0
- package/dist/primitives/context.js +85 -0
- package/dist/primitives/context.js.map +1 -0
- package/dist/progress.d.ts +51 -0
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +229 -0
- package/dist/progress.js.map +1 -0
- package/dist/provider-presets.d.ts +34 -0
- package/dist/provider-presets.d.ts.map +1 -0
- package/dist/provider-presets.js +181 -0
- package/dist/provider-presets.js.map +1 -0
- package/dist/providers/anthropic.d.ts +32 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +450 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/base.d.ts +135 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +104 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/glm.d.ts +18 -0
- package/dist/providers/glm.d.ts.map +1 -0
- package/dist/providers/glm.js +59 -0
- package/dist/providers/glm.js.map +1 -0
- package/dist/providers/kimi.d.ts +23 -0
- package/dist/providers/kimi.d.ts.map +1 -0
- package/dist/providers/kimi.js +89 -0
- package/dist/providers/kimi.js.map +1 -0
- package/dist/providers/minimax.d.ts +20 -0
- package/dist/providers/minimax.d.ts.map +1 -0
- package/dist/providers/minimax.js +192 -0
- package/dist/providers/minimax.js.map +1 -0
- package/dist/providers/openai-chat.d.ts +33 -0
- package/dist/providers/openai-chat.d.ts.map +1 -0
- package/dist/providers/openai-chat.js +543 -0
- package/dist/providers/openai-chat.js.map +1 -0
- package/dist/providers/openai-responses.d.ts +26 -0
- package/dist/providers/openai-responses.d.ts.map +1 -0
- package/dist/providers/openai-responses.js +443 -0
- package/dist/providers/openai-responses.js.map +1 -0
- package/dist/providers/openrouter.d.ts +24 -0
- package/dist/providers/openrouter.d.ts.map +1 -0
- package/dist/providers/openrouter.js +177 -0
- package/dist/providers/openrouter.js.map +1 -0
- package/dist/providers/registry.d.ts +7 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +38 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/security/path.d.ts +51 -0
- package/dist/security/path.d.ts.map +1 -0
- package/dist/security/path.js +187 -0
- package/dist/security/path.js.map +1 -0
- package/dist/security/sensitive-files.d.ts +3 -0
- package/dist/security/sensitive-files.d.ts.map +1 -0
- package/dist/security/sensitive-files.js +41 -0
- package/dist/security/sensitive-files.js.map +1 -0
- package/dist/session.d.ts +446 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +4595 -0
- package/dist/session.js.map +1 -0
- package/dist/settings.d.ts +46 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +134 -0
- package/dist/settings.js.map +1 -0
- package/dist/show-context.d.ts +35 -0
- package/dist/show-context.d.ts.map +1 -0
- package/dist/show-context.js +320 -0
- package/dist/show-context.js.map +1 -0
- package/dist/skills/loader.d.ts +49 -0
- package/dist/skills/loader.d.ts.map +1 -0
- package/dist/skills/loader.js +166 -0
- package/dist/skills/loader.js.map +1 -0
- package/dist/summarize-context.d.ts +29 -0
- package/dist/summarize-context.d.ts.map +1 -0
- package/dist/summarize-context.js +247 -0
- package/dist/summarize-context.js.map +1 -0
- package/dist/templates/loader.d.ts +104 -0
- package/dist/templates/loader.d.ts.map +1 -0
- package/dist/templates/loader.js +514 -0
- package/dist/templates/loader.js.map +1 -0
- package/dist/tools/basic.d.ts +29 -0
- package/dist/tools/basic.d.ts.map +1 -0
- package/dist/tools/basic.js +2079 -0
- package/dist/tools/basic.js.map +1 -0
- package/dist/tools/comm.d.ts +17 -0
- package/dist/tools/comm.d.ts.map +1 -0
- package/dist/tools/comm.js +192 -0
- package/dist/tools/comm.js.map +1 -0
- package/dist/tools/web-fetch.d.ts +11 -0
- package/dist/tools/web-fetch.d.ts.map +1 -0
- package/dist/tools/web-fetch.js +237 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/tools/web-search.d.ts +24 -0
- package/dist/tools/web-search.d.ts.map +1 -0
- package/dist/tools/web-search.js +51 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/tui/app.d.ts +35 -0
- package/dist/tui/app.d.ts.map +1 -0
- package/dist/tui/app.js +1042 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/checkbox-picker.d.ts +35 -0
- package/dist/tui/checkbox-picker.d.ts.map +1 -0
- package/dist/tui/checkbox-picker.js +85 -0
- package/dist/tui/checkbox-picker.js.map +1 -0
- package/dist/tui/command-picker.d.ts +31 -0
- package/dist/tui/command-picker.d.ts.map +1 -0
- package/dist/tui/command-picker.js +113 -0
- package/dist/tui/command-picker.js.map +1 -0
- package/dist/tui/components/ask-panel.d.ts +21 -0
- package/dist/tui/components/ask-panel.d.ts.map +1 -0
- package/dist/tui/components/ask-panel.js +81 -0
- package/dist/tui/components/ask-panel.js.map +1 -0
- package/dist/tui/components/conversation-panel.d.ts +68 -0
- package/dist/tui/components/conversation-panel.d.ts.map +1 -0
- package/dist/tui/components/conversation-panel.js +611 -0
- package/dist/tui/components/conversation-panel.js.map +1 -0
- package/dist/tui/components/input-panel.d.ts +27 -0
- package/dist/tui/components/input-panel.d.ts.map +1 -0
- package/dist/tui/components/input-panel.js +725 -0
- package/dist/tui/components/input-panel.js.map +1 -0
- package/dist/tui/components/logo-panel.d.ts +14 -0
- package/dist/tui/components/logo-panel.d.ts.map +1 -0
- package/dist/tui/components/logo-panel.js +37 -0
- package/dist/tui/components/logo-panel.js.map +1 -0
- package/dist/tui/components/plan-panel.d.ts +10 -0
- package/dist/tui/components/plan-panel.d.ts.map +1 -0
- package/dist/tui/components/plan-panel.js +8 -0
- package/dist/tui/components/plan-panel.js.map +1 -0
- package/dist/tui/components/status-bar.d.ts +24 -0
- package/dist/tui/components/status-bar.d.ts.map +1 -0
- package/dist/tui/components/status-bar.js +80 -0
- package/dist/tui/components/status-bar.js.map +1 -0
- package/dist/tui/input/editor-state.d.ts +22 -0
- package/dist/tui/input/editor-state.d.ts.map +1 -0
- package/dist/tui/input/editor-state.js +157 -0
- package/dist/tui/input/editor-state.js.map +1 -0
- package/dist/tui/input/keymap.d.ts +3 -0
- package/dist/tui/input/keymap.d.ts.map +1 -0
- package/dist/tui/input/keymap.js +72 -0
- package/dist/tui/input/keymap.js.map +1 -0
- package/dist/tui/input/paste-slots.d.ts +17 -0
- package/dist/tui/input/paste-slots.d.ts.map +1 -0
- package/dist/tui/input/paste-slots.js +46 -0
- package/dist/tui/input/paste-slots.js.map +1 -0
- package/dist/tui/input/paste.d.ts +15 -0
- package/dist/tui/input/paste.d.ts.map +1 -0
- package/dist/tui/input/paste.js +35 -0
- package/dist/tui/input/paste.js.map +1 -0
- package/dist/tui/input/protocol.d.ts +9 -0
- package/dist/tui/input/protocol.d.ts.map +1 -0
- package/dist/tui/input/protocol.js +387 -0
- package/dist/tui/input/protocol.js.map +1 -0
- package/dist/tui/input/sanitize.d.ts +6 -0
- package/dist/tui/input/sanitize.d.ts.map +1 -0
- package/dist/tui/input/sanitize.js +20 -0
- package/dist/tui/input/sanitize.js.map +1 -0
- package/dist/tui/input/types.d.ts +18 -0
- package/dist/tui/input/types.d.ts.map +1 -0
- package/dist/tui/input/types.js +2 -0
- package/dist/tui/input/types.js.map +1 -0
- package/dist/tui/launch.d.ts +23 -0
- package/dist/tui/launch.d.ts.map +1 -0
- package/dist/tui/launch.js +104 -0
- package/dist/tui/launch.js.map +1 -0
- package/dist/tui/theme.d.ts +20 -0
- package/dist/tui/theme.d.ts.map +1 -0
- package/dist/tui/theme.js +29 -0
- package/dist/tui/theme.js.map +1 -0
- package/dist/tui/types.d.ts +136 -0
- package/dist/tui/types.d.ts.map +1 -0
- package/dist/tui/types.js +9 -0
- package/dist/tui/types.js.map +1 -0
- package/package.json +76 -0
- package/prompts/sections/agents_md.md +23 -0
- package/prompts/sections/important_log.md +16 -0
- package/prompts/sections/system_mechanisms.md +18 -0
- package/prompts/tools/apply_patch.md +31 -0
- package/prompts/tools/ask.md +18 -0
- package/prompts/tools/bash.md +13 -0
- package/prompts/tools/bash_background.md +9 -0
- package/prompts/tools/bash_output.md +9 -0
- package/prompts/tools/check_status.md +3 -0
- package/prompts/tools/diff.md +5 -0
- package/prompts/tools/edit_file.md +11 -0
- package/prompts/tools/glob.md +7 -0
- package/prompts/tools/grep.md +20 -0
- package/prompts/tools/kill_agent.md +3 -0
- package/prompts/tools/kill_shell.md +5 -0
- package/prompts/tools/list_dir.md +5 -0
- package/prompts/tools/plan.md +252 -0
- package/prompts/tools/read_file.md +9 -0
- package/prompts/tools/show_context.md +12 -0
- package/prompts/tools/skill.md +7 -0
- package/prompts/tools/spawn_agent.md +195 -0
- package/prompts/tools/summarize_context.md +122 -0
- package/prompts/tools/test.md +5 -0
- package/prompts/tools/wait.md +17 -0
- package/prompts/tools/web_fetch.md +9 -0
- package/prompts/tools/web_search.md +5 -0
- package/prompts/tools/write_file.md +11 -0
- package/skills/.staging/.gitkeep +0 -0
- package/skills/explain-code/SKILL.md +15 -0
- 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"}
|