@kkelly-offical/kkcode 0.1.6 → 0.2.1
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 +674 -674
- package/README.md +452 -387
- package/package.json +50 -46
- package/src/agent/agent.mjs +19 -2
- package/src/agent/custom-agent-loader.mjs +6 -3
- package/src/agent/generator.mjs +2 -2
- package/src/agent/prompt/assistant.txt +12 -0
- package/src/agent/prompt/bug-hunter.txt +90 -0
- package/src/agent/prompt/frontend-designer.txt +58 -58
- package/src/agent/prompt/guide.txt +1 -1
- package/src/agent/prompt/longagent-blueprint-agent.txt +83 -83
- package/src/agent/prompt/longagent-coding-agent.txt +37 -37
- package/src/agent/prompt/longagent-debugging-agent.txt +46 -46
- package/src/agent/prompt/longagent-preview-agent.txt +63 -63
- package/src/command/custom-commands.mjs +2 -2
- package/src/commands/agent.mjs +1 -1
- package/src/commands/background.mjs +145 -4
- package/src/commands/chat.mjs +117 -76
- package/src/commands/config.mjs +148 -1
- package/src/commands/doctor.mjs +30 -6
- package/src/commands/init.mjs +32 -6
- package/src/commands/longagent.mjs +117 -0
- package/src/commands/mcp.mjs +275 -43
- package/src/commands/permission.mjs +1 -1
- package/src/commands/session.mjs +195 -140
- package/src/commands/skill.mjs +63 -0
- package/src/commands/theme.mjs +1 -1
- package/src/config/defaults.mjs +280 -260
- package/src/config/import-config.mjs +1 -1
- package/src/config/load-config.mjs +61 -4
- package/src/config/schema.mjs +591 -574
- package/src/context.mjs +4 -1
- package/src/core/constants.mjs +97 -91
- package/src/core/types.mjs +1 -1
- package/src/github/api.mjs +78 -78
- package/src/github/auth.mjs +294 -286
- package/src/github/flow.mjs +298 -298
- package/src/github/workspace.mjs +225 -212
- package/src/index.mjs +84 -82
- package/src/knowledge/frontend-aesthetics.txt +38 -38
- package/src/mcp/client-http.mjs +139 -141
- package/src/mcp/client-sse.mjs +297 -288
- package/src/mcp/client-stdio.mjs +534 -533
- package/src/mcp/constants.mjs +2 -2
- package/src/mcp/registry.mjs +498 -479
- package/src/mcp/stdio-framing.mjs +135 -133
- package/src/mcp/tool-result.mjs +24 -24
- package/src/observability/edit-diagnostics.mjs +449 -0
- package/src/observability/index.mjs +42 -42
- package/src/observability/metrics.mjs +165 -137
- package/src/observability/tracer.mjs +137 -137
- package/src/onboarding.mjs +209 -0
- package/src/orchestration/background-manager.mjs +567 -372
- package/src/orchestration/background-worker.mjs +419 -305
- package/src/orchestration/interruption-reason.mjs +21 -0
- package/src/orchestration/longagent-manager.mjs +197 -171
- package/src/orchestration/stage-scheduler.mjs +733 -728
- package/src/orchestration/subagent-router.mjs +7 -1
- package/src/orchestration/task-scheduler.mjs +219 -7
- package/src/permission/engine.mjs +1 -1
- package/src/permission/exec-policy.mjs +370 -370
- package/src/permission/file-edit-policy.mjs +108 -0
- package/src/permission/prompt.mjs +1 -1
- package/src/permission/rules.mjs +116 -7
- package/src/plugin/builtin-hooks/post-edit-format.mjs +2 -1
- package/src/plugin/builtin-hooks/post-edit-typecheck.mjs +104 -40
- package/src/plugin/hook-bus.mjs +19 -5
- package/src/plugin/manifest-loader.mjs +222 -0
- package/src/provider/anthropic.mjs +396 -390
- package/src/provider/ollama.mjs +7 -1
- package/src/provider/openai.mjs +382 -340
- package/src/provider/retry-policy.mjs +74 -68
- package/src/provider/router.mjs +242 -241
- package/src/provider/sse.mjs +104 -104
- package/src/provider/wizard.mjs +556 -0
- package/src/repl/capability-facade.mjs +30 -0
- package/src/repl/command-surface.mjs +23 -0
- package/src/repl/controller-entry.mjs +40 -0
- package/src/repl/core-shell.mjs +208 -0
- package/src/repl/dialog-router.mjs +87 -0
- package/src/repl/input-engine.mjs +76 -0
- package/src/repl/keymap.mjs +7 -0
- package/src/repl/operator-surface.mjs +15 -0
- package/src/repl/permission-flow.mjs +49 -0
- package/src/repl/runtime-facade.mjs +36 -0
- package/src/repl/slash-router.mjs +62 -0
- package/src/repl/state-store.mjs +29 -0
- package/src/repl/turn-controller.mjs +58 -0
- package/src/repl/verification.mjs +23 -0
- package/src/repl.mjs +3368 -2929
- package/src/rules/load-rules.mjs +3 -3
- package/src/runtime.mjs +1 -1
- package/src/session/agent-transaction.mjs +86 -0
- package/src/session/checkpoint.mjs +302 -302
- package/src/session/compaction.mjs +36 -14
- package/src/session/engine.mjs +417 -227
- package/src/session/longagent-4stage.mjs +467 -460
- package/src/session/longagent-hybrid.mjs +1344 -1081
- package/src/session/longagent-plan.mjs +376 -365
- package/src/session/longagent-project-memory.mjs +53 -53
- package/src/session/longagent-scaffold.mjs +291 -291
- package/src/session/longagent-task-bus.mjs +138 -54
- package/src/session/longagent-utils.mjs +828 -472
- package/src/session/longagent.mjs +911 -884
- package/src/session/loop.mjs +1005 -905
- package/src/session/prompt/agent.txt +25 -0
- package/src/session/prompt/anthropic.txt +150 -150
- package/src/session/prompt/beast.txt +1 -1
- package/src/session/prompt/plan.txt +28 -6
- package/src/session/prompt/qwen.txt +46 -46
- package/src/session/recovery.mjs +21 -0
- package/src/session/rollback.mjs +197 -0
- package/src/session/routing-observability.mjs +72 -0
- package/src/session/runtime-state.mjs +47 -0
- package/src/session/store.mjs +523 -510
- package/src/session/system-prompt.mjs +56 -8
- package/src/session/task-validator.mjs +267 -267
- package/src/session/usability-gates.mjs +2 -2
- package/src/skill/builtin/commit.mjs +64 -64
- package/src/skill/builtin/design.mjs +76 -76
- package/src/skill/generator.mjs +18 -2
- package/src/skill/registry.mjs +642 -390
- package/src/storage/audit-store.mjs +18 -11
- package/src/storage/event-log.mjs +7 -1
- package/src/storage/ghost-commit-store.mjs +243 -245
- package/src/storage/paths.mjs +13 -0
- package/src/theme/default-theme.mjs +1 -1
- package/src/theme/markdown.mjs +4 -0
- package/src/theme/schema.mjs +1 -1
- package/src/theme/status-bar.mjs +162 -158
- package/src/tool/audit-wrapper.mjs +18 -2
- package/src/tool/edit-transaction.mjs +23 -0
- package/src/tool/executor.mjs +26 -1
- package/src/tool/file-read-state.mjs +65 -0
- package/src/tool/git-auto.mjs +526 -526
- package/src/tool/git-full-auto.mjs +487 -478
- package/src/tool/mutation-guard.mjs +54 -0
- package/src/tool/prompt/edit.txt +3 -3
- package/src/tool/prompt/multiedit.txt +1 -0
- package/src/tool/prompt/notebookedit.txt +2 -1
- package/src/tool/prompt/patch.txt +25 -24
- package/src/tool/prompt/read.txt +3 -3
- package/src/tool/prompt/sysinfo.txt +29 -0
- package/src/tool/prompt/task.txt +66 -4
- package/src/tool/prompt/write.txt +2 -2
- package/src/tool/question-prompt.mjs +17 -4
- package/src/tool/registry.mjs +1701 -1343
- package/src/tool/task-tool.mjs +14 -6
- package/src/ui/activity-renderer.mjs +667 -664
- package/src/ui/repl-background-panel.mjs +7 -0
- package/src/ui/repl-capability-panel.mjs +9 -0
- package/src/ui/repl-dashboard.mjs +54 -4
- package/src/ui/repl-help.mjs +110 -0
- package/src/ui/repl-operator-panel.mjs +12 -0
- package/src/ui/repl-route-feedback.mjs +35 -0
- package/src/ui/repl-status-view.mjs +76 -0
- package/src/ui/repl-task-panel.mjs +5 -0
- package/src/ui/repl-transcript-panel.mjs +56 -0
- package/src/ui/repl-turn-summary.mjs +135 -0
- package/src/usage/pricing.mjs +122 -121
- package/src/usage/usage-meter.mjs +1 -0
- package/src/util/git.mjs +562 -519
- package/src/util/template.mjs +6 -1
|
@@ -40,6 +40,7 @@ Rules:
|
|
|
40
40
|
const DEFAULT_THRESHOLD_MESSAGES = 50
|
|
41
41
|
const DEFAULT_THRESHOLD_RATIO = 0.7
|
|
42
42
|
const DEFAULT_KEEP_RECENT = 6
|
|
43
|
+
const DEFAULT_KEEP_RECENT_TURNS = 3
|
|
43
44
|
const TOOL_RESULT_PREVIEW_LIMIT = 200
|
|
44
45
|
|
|
45
46
|
// Estimate tokens from a string, accounting for CJK characters (~1.5 chars/token vs ~4 for Latin)
|
|
@@ -84,21 +85,32 @@ export function estimateTokenCount(messages) {
|
|
|
84
85
|
|
|
85
86
|
/**
|
|
86
87
|
* Pre-prune messages before LLM summarization.
|
|
87
|
-
* -
|
|
88
|
+
* - Strip synthetic scaffolding messages (continuation noise)
|
|
89
|
+
* - Truncate large tool_result content with aging: older steps get shorter previews
|
|
88
90
|
* - Keep tool_use blocks intact (they show model intent)
|
|
89
91
|
* - Truncate very long plain-text assistant/user messages
|
|
90
92
|
*/
|
|
91
93
|
export function pruneForSummary(messages, previewLimit = TOOL_RESULT_PREVIEW_LIMIT) {
|
|
92
|
-
|
|
94
|
+
// Strip synthetic scaffolding messages (continuation prompts, fake tool_result errors)
|
|
95
|
+
const real = messages.filter(msg => !msg.synthetic)
|
|
96
|
+
|
|
97
|
+
// #2 工具结果老化: find max step to compute relative age per message
|
|
98
|
+
const maxStep = real.reduce((m, msg) => Math.max(m, msg.step || 0), 0)
|
|
99
|
+
|
|
100
|
+
return real.map((msg) => {
|
|
101
|
+
// Aging: older tool_results get more aggressive truncation
|
|
102
|
+
const age = maxStep - (msg.step || 0)
|
|
103
|
+
const effectiveLimit = Math.max(50, previewLimit - age * 15)
|
|
104
|
+
|
|
93
105
|
const content = msg.content
|
|
94
106
|
if (Array.isArray(content)) {
|
|
95
107
|
const pruned = content.map((block) => {
|
|
96
108
|
if (block.type === "tool_result") {
|
|
97
109
|
const raw = String(block.content || "")
|
|
98
|
-
if (raw.length >
|
|
110
|
+
if (raw.length > effectiveLimit) {
|
|
99
111
|
return {
|
|
100
112
|
...block,
|
|
101
|
-
content: `${raw.slice(0,
|
|
113
|
+
content: `${raw.slice(0, effectiveLimit)}... [truncated ${raw.length} chars, age=${age}]`
|
|
102
114
|
}
|
|
103
115
|
}
|
|
104
116
|
}
|
|
@@ -177,22 +189,32 @@ export async function compactSession({
|
|
|
177
189
|
providerType,
|
|
178
190
|
configState,
|
|
179
191
|
keepRecent = DEFAULT_KEEP_RECENT,
|
|
192
|
+
keepRecentTurns = DEFAULT_KEEP_RECENT_TURNS,
|
|
180
193
|
baseUrl = null,
|
|
181
194
|
apiKeyEnv = null
|
|
182
195
|
}) {
|
|
183
196
|
const history = await getConversationHistory(sessionId, 9999)
|
|
184
197
|
if (history.length <= keepRecent + 2) return { compacted: false, reason: "too few messages" }
|
|
185
198
|
|
|
186
|
-
//
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
199
|
+
// Turn-based split: keep last keepRecentTurns complete turns
|
|
200
|
+
// A "turn" = one user interaction cycle (user msg + model response + all tool calls)
|
|
201
|
+
// Falls back to message-count if no turnId metadata is present
|
|
202
|
+
let splitIdx
|
|
203
|
+
const turnIds = []
|
|
204
|
+
const seenTurns = new Set()
|
|
205
|
+
for (const msg of history) {
|
|
206
|
+
if (msg.turnId && !seenTurns.has(msg.turnId)) {
|
|
207
|
+
seenTurns.add(msg.turnId)
|
|
208
|
+
turnIds.push(msg.turnId)
|
|
194
209
|
}
|
|
195
|
-
|
|
210
|
+
}
|
|
211
|
+
if (turnIds.length > keepRecentTurns) {
|
|
212
|
+
const keepFromTurnId = turnIds[turnIds.length - keepRecentTurns]
|
|
213
|
+
splitIdx = history.findIndex(msg => msg.turnId === keepFromTurnId)
|
|
214
|
+
if (splitIdx < 0) splitIdx = history.length - keepRecent
|
|
215
|
+
} else {
|
|
216
|
+
// Fallback: not enough turns, use message count
|
|
217
|
+
splitIdx = history.length - keepRecent
|
|
196
218
|
}
|
|
197
219
|
const toSummarize = history.slice(0, splitIdx)
|
|
198
220
|
const kept = history.slice(splitIdx)
|
|
@@ -259,7 +281,7 @@ export async function compactSession({
|
|
|
259
281
|
|
|
260
282
|
await saveCheckpoint(sessionId, {
|
|
261
283
|
kind: "compaction",
|
|
262
|
-
iteration:
|
|
284
|
+
iteration: Date.now(),
|
|
263
285
|
compactedAt: Date.now(),
|
|
264
286
|
summarizeCount: toSummarize.length,
|
|
265
287
|
keepCount: kept.length,
|