@kkelly-offical/kkcode 0.1.7 → 0.2.3-preview.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.
Files changed (166) hide show
  1. package/LICENSE +674 -674
  2. package/README.md +474 -387
  3. package/package.json +50 -46
  4. package/src/agent/agent.mjs +228 -220
  5. package/src/agent/custom-agent-loader.mjs +6 -3
  6. package/src/agent/generator.mjs +2 -2
  7. package/src/agent/prompt/assistant.txt +12 -0
  8. package/src/agent/prompt/bug-hunter.txt +89 -89
  9. package/src/agent/prompt/frontend-designer.txt +58 -58
  10. package/src/agent/prompt/guide.txt +1 -1
  11. package/src/agent/prompt/longagent-blueprint-agent.txt +83 -83
  12. package/src/agent/prompt/longagent-coding-agent.txt +37 -37
  13. package/src/agent/prompt/longagent-debugging-agent.txt +46 -46
  14. package/src/agent/prompt/longagent-preview-agent.txt +63 -63
  15. package/src/command/custom-commands.mjs +2 -2
  16. package/src/commands/agent.mjs +1 -1
  17. package/src/commands/background.mjs +145 -4
  18. package/src/commands/chat.mjs +117 -76
  19. package/src/commands/config.mjs +148 -1
  20. package/src/commands/doctor.mjs +30 -6
  21. package/src/commands/init.mjs +32 -6
  22. package/src/commands/longagent.mjs +117 -0
  23. package/src/commands/mcp.mjs +275 -43
  24. package/src/commands/permission.mjs +1 -1
  25. package/src/commands/session.mjs +195 -140
  26. package/src/commands/skill.mjs +63 -0
  27. package/src/commands/theme.mjs +1 -1
  28. package/src/commands/update.mjs +32 -0
  29. package/src/config/defaults.mjs +289 -260
  30. package/src/config/import-config.mjs +1 -1
  31. package/src/config/load-config.mjs +61 -4
  32. package/src/config/schema.mjs +604 -574
  33. package/src/context.mjs +4 -1
  34. package/src/core/constants.mjs +97 -91
  35. package/src/core/types.mjs +1 -1
  36. package/src/github/api.mjs +78 -78
  37. package/src/github/auth.mjs +294 -286
  38. package/src/github/flow.mjs +298 -298
  39. package/src/github/workspace.mjs +225 -212
  40. package/src/index.mjs +87 -82
  41. package/src/knowledge/frontend-aesthetics.txt +38 -38
  42. package/src/mcp/client-http.mjs +139 -141
  43. package/src/mcp/client-sse.mjs +297 -288
  44. package/src/mcp/client-stdio.mjs +534 -533
  45. package/src/mcp/constants.mjs +4 -2
  46. package/src/mcp/registry.mjs +498 -479
  47. package/src/mcp/stdio-framing.mjs +135 -133
  48. package/src/mcp/tool-result.mjs +24 -24
  49. package/src/observability/edit-diagnostics.mjs +449 -0
  50. package/src/observability/index.mjs +42 -42
  51. package/src/observability/metrics.mjs +165 -137
  52. package/src/observability/tracer.mjs +137 -137
  53. package/src/onboarding.mjs +209 -0
  54. package/src/orchestration/background-manager.mjs +567 -372
  55. package/src/orchestration/background-worker.mjs +419 -305
  56. package/src/orchestration/interruption-reason.mjs +21 -0
  57. package/src/orchestration/longagent-manager.mjs +197 -171
  58. package/src/orchestration/stage-scheduler.mjs +733 -728
  59. package/src/orchestration/subagent-router.mjs +7 -1
  60. package/src/orchestration/task-scheduler.mjs +219 -7
  61. package/src/permission/engine.mjs +1 -1
  62. package/src/permission/exec-policy.mjs +370 -370
  63. package/src/permission/file-edit-policy.mjs +108 -0
  64. package/src/permission/prompt.mjs +1 -1
  65. package/src/permission/rules.mjs +116 -7
  66. package/src/plugin/builtin-hooks/post-edit-format.mjs +2 -1
  67. package/src/plugin/builtin-hooks/post-edit-typecheck.mjs +104 -40
  68. package/src/plugin/hook-bus.mjs +19 -5
  69. package/src/plugin/manifest-loader.mjs +222 -0
  70. package/src/provider/anthropic.mjs +396 -390
  71. package/src/provider/ollama.mjs +7 -1
  72. package/src/provider/openai.mjs +382 -340
  73. package/src/provider/retry-policy.mjs +74 -68
  74. package/src/provider/router.mjs +242 -241
  75. package/src/provider/sse.mjs +104 -104
  76. package/src/provider/wizard.mjs +556 -0
  77. package/src/repl/capability-facade.mjs +30 -0
  78. package/src/repl/command-surface.mjs +23 -0
  79. package/src/repl/controller-entry.mjs +40 -0
  80. package/src/repl/core-shell.mjs +208 -0
  81. package/src/repl/dialog-router.mjs +87 -0
  82. package/src/repl/input-engine.mjs +76 -0
  83. package/src/repl/keymap.mjs +7 -0
  84. package/src/repl/operator-surface.mjs +15 -0
  85. package/src/repl/permission-flow.mjs +49 -0
  86. package/src/repl/runtime-facade.mjs +36 -0
  87. package/src/repl/slash-router.mjs +62 -0
  88. package/src/repl/state-store.mjs +29 -0
  89. package/src/repl/turn-controller.mjs +58 -0
  90. package/src/repl/verification.mjs +23 -0
  91. package/src/repl.mjs +3371 -2981
  92. package/src/rules/load-rules.mjs +3 -3
  93. package/src/runtime.mjs +1 -1
  94. package/src/session/agent-transaction.mjs +86 -0
  95. package/src/session/checkpoint.mjs +302 -302
  96. package/src/session/compaction.mjs +298 -298
  97. package/src/session/engine.mjs +417 -232
  98. package/src/session/longagent-4stage.mjs +467 -460
  99. package/src/session/longagent-hybrid.mjs +1344 -1097
  100. package/src/session/longagent-plan.mjs +376 -365
  101. package/src/session/longagent-project-memory.mjs +53 -53
  102. package/src/session/longagent-scaffold.mjs +291 -291
  103. package/src/session/longagent-task-bus.mjs +138 -54
  104. package/src/session/longagent-utils.mjs +828 -472
  105. package/src/session/longagent.mjs +911 -900
  106. package/src/session/loop.mjs +1005 -930
  107. package/src/session/prompt/agent.txt +25 -25
  108. package/src/session/prompt/anthropic.txt +150 -150
  109. package/src/session/prompt/beast.txt +1 -1
  110. package/src/session/prompt/plan.txt +31 -31
  111. package/src/session/prompt/qwen.txt +46 -46
  112. package/src/session/recovery.mjs +21 -0
  113. package/src/session/rollback.mjs +196 -195
  114. package/src/session/routing-observability.mjs +72 -0
  115. package/src/session/runtime-state.mjs +47 -0
  116. package/src/session/store.mjs +523 -519
  117. package/src/session/system-prompt.mjs +308 -273
  118. package/src/session/task-validator.mjs +267 -267
  119. package/src/session/usability-gates.mjs +2 -2
  120. package/src/skill/builtin/commit.mjs +64 -64
  121. package/src/skill/builtin/design.mjs +76 -76
  122. package/src/skill/generator.mjs +18 -2
  123. package/src/skill/registry.mjs +642 -390
  124. package/src/storage/audit-store.mjs +18 -11
  125. package/src/storage/event-log.mjs +7 -1
  126. package/src/storage/ghost-commit-store.mjs +243 -245
  127. package/src/storage/paths.mjs +17 -0
  128. package/src/theme/default-theme.mjs +1 -1
  129. package/src/theme/markdown.mjs +4 -0
  130. package/src/theme/schema.mjs +1 -1
  131. package/src/theme/status-bar.mjs +162 -158
  132. package/src/tool/audit-wrapper.mjs +18 -2
  133. package/src/tool/edit-transaction.mjs +23 -0
  134. package/src/tool/executor.mjs +26 -1
  135. package/src/tool/file-read-state.mjs +65 -0
  136. package/src/tool/git-auto.mjs +526 -526
  137. package/src/tool/git-full-auto.mjs +487 -478
  138. package/src/tool/mutation-guard.mjs +54 -0
  139. package/src/tool/prompt/edit.txt +3 -3
  140. package/src/tool/prompt/multiedit.txt +1 -0
  141. package/src/tool/prompt/notebookedit.txt +2 -1
  142. package/src/tool/prompt/patch.txt +25 -24
  143. package/src/tool/prompt/read.txt +3 -3
  144. package/src/tool/prompt/sysinfo.txt +29 -0
  145. package/src/tool/prompt/task.txt +66 -4
  146. package/src/tool/prompt/write.txt +2 -2
  147. package/src/tool/question-prompt.mjs +99 -93
  148. package/src/tool/registry.mjs +1701 -1343
  149. package/src/tool/task-tool.mjs +14 -6
  150. package/src/ui/activity-renderer.mjs +667 -664
  151. package/src/ui/repl-background-panel.mjs +7 -0
  152. package/src/ui/repl-capability-panel.mjs +9 -0
  153. package/src/ui/repl-dashboard.mjs +54 -4
  154. package/src/ui/repl-help.mjs +110 -0
  155. package/src/ui/repl-operator-panel.mjs +12 -0
  156. package/src/ui/repl-route-feedback.mjs +35 -0
  157. package/src/ui/repl-status-view.mjs +76 -0
  158. package/src/ui/repl-task-panel.mjs +5 -0
  159. package/src/ui/repl-transcript-panel.mjs +56 -0
  160. package/src/ui/repl-turn-summary.mjs +135 -0
  161. package/src/update/checker.mjs +184 -0
  162. package/src/usage/pricing.mjs +122 -121
  163. package/src/usage/usage-meter.mjs +1 -0
  164. package/src/util/git.mjs +562 -519
  165. package/src/util/template.mjs +6 -1
  166. package/src/version.mjs +3 -0
@@ -1,5 +1,6 @@
1
1
  import path from "node:path"
2
2
  import { access, readdir, readFile } from "node:fs/promises"
3
+ import { userRootDir } from "../storage/paths.mjs"
3
4
 
4
5
  async function exists(file) {
5
6
  try {
@@ -39,9 +40,8 @@ async function readSingleRuleFile(filePath, scope) {
39
40
  }
40
41
 
41
42
  export async function loadRuleBlocks(cwd = process.cwd()) {
42
- const userHome = process.env.USERPROFILE || process.env.HOME || cwd
43
- const userRuleFile = path.join(userHome, ".kkcode", "rule.md")
44
- const userRulesDir = path.join(userHome, ".kkcode", "rules")
43
+ const userRuleFile = path.join(userRootDir(), "rule.md")
44
+ const userRulesDir = path.join(userRootDir(), "rules")
45
45
  const projectRuleFile = path.join(cwd, ".kkcode", "rule.md")
46
46
  const projectRulesDir = path.join(cwd, ".kkcode", "rules")
47
47
  const [globalSingle, globalDir, projectSingle, projectDir] = await Promise.all([
package/src/runtime.mjs CHANGED
@@ -1 +1 @@
1
- export { resolveMode, newSessionId, executeTurn } from "./session/engine.mjs"
1
+ export { resolveMode, newSessionId, executeTurn } from "./session/engine.mjs"
@@ -0,0 +1,86 @@
1
+ const PATH_HINT_RE = /([./~][^\s"'`]+|\b[\w-]+\.(?:mjs|cjs|js|jsx|ts|tsx|json|md|yaml|yml|toml|txt|log|sh)\b)/gi
2
+ const INLINE_COMMAND_RE = /`([^`\n]+)`/g
3
+ const CONTINUATION_HINT_RE = /\b(continue|follow-?up|same task|same transaction|继续|补充|接着|顺便)\b/i
4
+
5
+ function uniqueLimited(values = [], limit = 4) {
6
+ const seen = new Set()
7
+ const out = []
8
+ for (const value of values) {
9
+ const normalized = String(value || "").trim().replace(/[),.;:]+$/g, "")
10
+ if (!normalized || seen.has(normalized)) continue
11
+ seen.add(normalized)
12
+ out.push(normalized)
13
+ if (out.length >= limit) break
14
+ }
15
+ return out
16
+ }
17
+
18
+ function normalizeObjective(prompt) {
19
+ return String(prompt || "")
20
+ .replace(/\s+/g, " ")
21
+ .trim()
22
+ .slice(0, 220)
23
+ }
24
+
25
+ function inferPendingNextStep({ paths = [], commands = [] }) {
26
+ if (commands.length) return `Continue the interrupted local command/verification step around \`${commands[0]}\`.`
27
+ if (paths.length) return `Continue the interrupted local task around ${paths[0]}.`
28
+ return "Continue the interrupted bounded local task and finish the next concrete step."
29
+ }
30
+
31
+ export function extractPromptPathHints(prompt) {
32
+ return uniqueLimited(Array.from(String(prompt || "").matchAll(PATH_HINT_RE), (match) => match[1]), 6)
33
+ }
34
+
35
+ export function detectAgentContinuationInput(prompt, summary = null) {
36
+ const text = String(prompt || "").trim()
37
+ if (!text) return false
38
+ if (CONTINUATION_HINT_RE.test(text)) return true
39
+ const objective = String(summary?.objective || summary?.prompt || "").trim()
40
+ if (objective && text.includes(objective.slice(0, Math.min(objective.length, 40)))) return true
41
+ return false
42
+ }
43
+
44
+ export function summarizeAgentTransaction({ prompt, route = null, mode = "agent" }) {
45
+ const text = String(prompt || "").trim()
46
+ const paths = extractPromptPathHints(text)
47
+ const commands = uniqueLimited(Array.from(text.matchAll(INLINE_COMMAND_RE), (match) => match[1]))
48
+ const evidence = Array.isArray(route?.evidence) ? route.evidence : []
49
+ const objective = normalizeObjective(text)
50
+
51
+ return {
52
+ mode,
53
+ prompt: text,
54
+ objective,
55
+ paths,
56
+ commands,
57
+ routeReason: route?.reason || null,
58
+ routeExplanation: route?.explanation || null,
59
+ evidence,
60
+ pendingNextStep: inferPendingNextStep({ paths, commands })
61
+ }
62
+ }
63
+
64
+ export function buildAgentContinuationPrompt(summary, continuation) {
65
+ const nextMessage = String(continuation || "").trim()
66
+ if (!summary?.prompt) return nextMessage
67
+
68
+ const lines = [
69
+ summary.prompt,
70
+ "",
71
+ "[Interrupted agent transaction]",
72
+ `Objective: ${summary.objective || summary.prompt}`,
73
+ summary.paths?.length ? `Paths: ${summary.paths.join(", ")}` : null,
74
+ summary.commands?.length ? `Commands: ${summary.commands.join(" | ")}` : null,
75
+ summary.routeReason ? `Last route reason: ${summary.routeReason}` : null,
76
+ summary.routeExplanation ? `Route explanation: ${summary.routeExplanation}` : null,
77
+ summary.evidence?.length ? `Evidence categories: ${summary.evidence.join(", ")}` : null,
78
+ summary.pendingNextStep ? `Pending next step: ${summary.pendingNextStep}` : null,
79
+ "Instruction: Treat the next user message as a continuation of the same bounded local agent transaction unless it clearly introduces a heavier multi-file or staged objective.",
80
+ "",
81
+ "[User continuation]",
82
+ nextMessage
83
+ ]
84
+
85
+ return lines.filter(Boolean).join("\n")
86
+ }