codebase-cli 2.0.0-pre.3 → 2.0.0-pre.31

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 (79) hide show
  1. package/dist/agent/agent.js +31 -12
  2. package/dist/agent/agent.js.map +1 -1
  3. package/dist/agent/config.js +101 -20
  4. package/dist/agent/config.js.map +1 -1
  5. package/dist/agent/prompt-suggestion.js +145 -0
  6. package/dist/agent/prompt-suggestion.js.map +1 -0
  7. package/dist/agent/system-prompt.js +15 -0
  8. package/dist/agent/system-prompt.js.map +1 -1
  9. package/dist/app-server/protocol.js +7 -0
  10. package/dist/app-server/protocol.js.map +1 -0
  11. package/dist/app-server/server.js +241 -0
  12. package/dist/app-server/server.js.map +1 -0
  13. package/dist/auth/credentials.js +10 -0
  14. package/dist/auth/credentials.js.map +1 -1
  15. package/dist/auth/flow.js +145 -24
  16. package/dist/auth/flow.js.map +1 -1
  17. package/dist/cli.js +58 -6
  18. package/dist/cli.js.map +1 -1
  19. package/dist/commands/builtins.js +155 -5
  20. package/dist/commands/builtins.js.map +1 -1
  21. package/dist/commands/registry.js +46 -1
  22. package/dist/commands/registry.js.map +1 -1
  23. package/dist/compaction/monitor.js +38 -0
  24. package/dist/compaction/monitor.js.map +1 -0
  25. package/dist/glue/client.js +10 -1
  26. package/dist/glue/client.js.map +1 -1
  27. package/dist/headless/run.js +1 -1
  28. package/dist/headless/run.js.map +1 -1
  29. package/dist/hooks/manager.js +8 -2
  30. package/dist/hooks/manager.js.map +1 -1
  31. package/dist/permissions/store.js +4 -0
  32. package/dist/permissions/store.js.map +1 -1
  33. package/dist/projects/cli.js +92 -0
  34. package/dist/projects/cli.js.map +1 -0
  35. package/dist/projects/client.js +120 -0
  36. package/dist/projects/client.js.map +1 -0
  37. package/dist/projects/types.js +2 -0
  38. package/dist/projects/types.js.map +1 -0
  39. package/dist/skills/platform-loader.js +133 -38
  40. package/dist/skills/platform-loader.js.map +1 -1
  41. package/dist/tools/__test__/mock-tool-context.js +31 -0
  42. package/dist/tools/__test__/mock-tool-context.js.map +1 -0
  43. package/dist/tools/read-file.js +8 -2
  44. package/dist/tools/read-file.js.map +1 -1
  45. package/dist/ui/App.js +267 -17
  46. package/dist/ui/App.js.map +1 -1
  47. package/dist/ui/FirstRunSetup.js +66 -14
  48. package/dist/ui/FirstRunSetup.js.map +1 -1
  49. package/dist/ui/Input.js +270 -14
  50. package/dist/ui/Input.js.map +1 -1
  51. package/dist/ui/Markdown.js +286 -0
  52. package/dist/ui/Markdown.js.map +1 -0
  53. package/dist/ui/Message.js +604 -25
  54. package/dist/ui/Message.js.map +1 -1
  55. package/dist/ui/MessageList.js +100 -3
  56. package/dist/ui/MessageList.js.map +1 -1
  57. package/dist/ui/Permission.js +43 -20
  58. package/dist/ui/Permission.js.map +1 -1
  59. package/dist/ui/PixelC.js +25 -0
  60. package/dist/ui/PixelC.js.map +1 -0
  61. package/dist/ui/Status.js +213 -7
  62. package/dist/ui/Status.js.map +1 -1
  63. package/dist/ui/Throbber.js +11 -7
  64. package/dist/ui/Throbber.js.map +1 -1
  65. package/dist/ui/Welcome.js +59 -0
  66. package/dist/ui/Welcome.js.map +1 -0
  67. package/dist/ui/attachments.js +68 -0
  68. package/dist/ui/attachments.js.map +1 -0
  69. package/dist/ui/debug-input.js +44 -0
  70. package/dist/ui/debug-input.js.map +1 -0
  71. package/dist/ui/highlight.js +324 -0
  72. package/dist/ui/highlight.js.map +1 -0
  73. package/dist/ui/history-store.js +60 -0
  74. package/dist/ui/history-store.js.map +1 -0
  75. package/dist/ui/path-complete.js +102 -0
  76. package/dist/ui/path-complete.js.map +1 -0
  77. package/dist/ui/terminal-restore.js +83 -0
  78. package/dist/ui/terminal-restore.js.map +1 -0
  79. package/package.json +5 -1
@@ -2,6 +2,7 @@ import { homedir } from "node:os";
2
2
  import { isAbsolute, join, resolve } from "node:path";
3
3
  import { Agent } from "@earendil-works/pi-agent-core";
4
4
  import { CompactionEngine } from "../compaction/engine.js";
5
+ import { CompactionMonitor } from "../compaction/monitor.js";
5
6
  import { ConfigStore } from "../config/store.js";
6
7
  import { DiagnosticsEngine, formatDiagnostics } from "../diagnostics/engine.js";
7
8
  import { GlueClient, resolveGlueModels } from "../glue/client.js";
@@ -43,6 +44,7 @@ export function createAgent(opts = {}) {
43
44
  const permissions = new PermissionStore({
44
45
  allowPatterns: config.allowPatterns(),
45
46
  denyPatterns: config.denyPatterns(),
47
+ autoApprove: opts.autoApprove,
46
48
  });
47
49
  const userQueries = new UserQueryStore();
48
50
  const planMode = new PlanModeStore();
@@ -57,6 +59,7 @@ export function createAgent(opts = {}) {
57
59
  apiKey: glueModels.apiKey,
58
60
  });
59
61
  const compaction = new CompactionEngine({ glue, modelId: model.id });
62
+ const compactionMonitor = new CompactionMonitor();
60
63
  const sessions = new SessionStore({ cwd });
61
64
  const resumed = opts.resume ? sessions.load(model.id) : null;
62
65
  const toolContext = {
@@ -86,16 +89,24 @@ export function createAgent(opts = {}) {
86
89
  transformContext: async (messages, signal) => {
87
90
  if (!compaction.needsCompaction(messages))
88
91
  return messages;
89
- await hooks.dispatch("PreCompact", { event: "PreCompact", workingDir: cwd, messageCount: messages.length }, signal);
90
- const result = await compaction.compact(messages, signal);
91
- await hooks.dispatch("PostCompact", {
92
- event: "PostCompact",
93
- workingDir: cwd,
94
- messageCount: result.messages.length,
95
- collapsedMessageCount: result.details.collapsedMessageCount,
96
- truncatedTokens: result.details.truncatedTokens,
97
- }, signal);
98
- return result.messages;
92
+ compactionMonitor.start(messages.length);
93
+ try {
94
+ await hooks.dispatch("PreCompact", { event: "PreCompact", workingDir: cwd, messageCount: messages.length }, signal);
95
+ const result = await compaction.compact(messages, signal);
96
+ await hooks.dispatch("PostCompact", {
97
+ event: "PostCompact",
98
+ workingDir: cwd,
99
+ messageCount: result.messages.length,
100
+ collapsedMessageCount: result.details.collapsedMessageCount,
101
+ truncatedTokens: result.details.truncatedTokens,
102
+ }, signal);
103
+ return result.messages;
104
+ }
105
+ finally {
106
+ // Always clear — even if compact() threw, the user shouldn't
107
+ // see a stuck "Compacting…" banner forever.
108
+ compactionMonitor.end();
109
+ }
99
110
  },
100
111
  beforeToolCall: async (ctx, signal) => {
101
112
  // 1. Plan mode gate: block destructive tools entirely while planning.
@@ -151,8 +162,14 @@ export function createAgent(opts = {}) {
151
162
  timestamp: Date.now(),
152
163
  });
153
164
  })
154
- .catch(() => {
155
- // Diagnostics failures are non-fatal — surface nothing.
165
+ .catch((err) => {
166
+ // Diagnostics failures are non-fatal — surface only when the
167
+ // user opted into debug. Silent before; that buried a real
168
+ // bug where a checker hung and the user thought the tool
169
+ // itself was slow.
170
+ if (process.env.CODEBASE_DEBUG === "1") {
171
+ process.stderr.write(`[diagnostics] ${absPath}: ${err instanceof Error ? err.message : String(err)}\n`);
172
+ }
156
173
  });
157
174
  }
158
175
  return undefined;
@@ -203,10 +220,12 @@ export function createAgent(opts = {}) {
203
220
  memory,
204
221
  glue,
205
222
  compaction,
223
+ compactionMonitor,
206
224
  sessions,
207
225
  hooks,
208
226
  diagnostics,
209
227
  subscribe,
228
+ resumedFrom: resumed ? { updatedAt: resumed.updatedAt, messageCount: resumed.messages.length } : undefined,
210
229
  };
211
230
  }
212
231
  //# sourceMappingURL=agent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/agent/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/agent/agent.ts"],"names":[],"mappings":"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"}
@@ -65,6 +65,22 @@ export function resolveConfig(envOrOpts = process.env) {
65
65
  return proxied;
66
66
  }
67
67
  }
68
+ // 2. OpenAI-compatible custom endpoint. Triggers when the user has
69
+ // set OPENAI_BASE_URL alongside an api key — that combination
70
+ // only makes sense for a custom Chat Completions backend (Groq,
71
+ // Ollama, MiniMax in-house, Qwen in-house, vLLM, …). pi-ai's
72
+ // registry only knows about a fixed set of providers/models, so
73
+ // we synthesize a Model object on the fly using a known
74
+ // chat-completions template and overriding id + baseUrl.
75
+ if (env.OPENAI_BASE_URL && env.OPENAI_API_KEY && env.OPENAI_MODEL) {
76
+ const compat = buildOpenAiCompatConfig({
77
+ baseUrl: env.OPENAI_BASE_URL,
78
+ modelId: env.OPENAI_MODEL,
79
+ apiKey: env.OPENAI_API_KEY,
80
+ });
81
+ if (compat)
82
+ return compat;
83
+ }
68
84
  const explicitProvider = env.CODEBASE_PROVIDER;
69
85
  const explicitModel = env.CODEBASE_MODEL;
70
86
  if (explicitProvider && explicitModel) {
@@ -79,17 +95,31 @@ export function resolveConfig(envOrOpts = process.env) {
79
95
  }
80
96
  return { model, apiKey, source: "explicit" };
81
97
  }
82
- for (const provider of AUTO_DETECT_ORDER) {
83
- const apiKey = getEnvApiKey(provider);
84
- if (!apiKey)
85
- continue;
86
- const modelId = DEFAULT_MODELS[provider];
87
- if (!modelId)
88
- continue;
89
- const model = getModel(provider, modelId);
90
- if (!model)
91
- continue;
92
- return { model, apiKey, source: "auto" };
98
+ // Env-var auto-detect is the legacy power-user path. We only honor it
99
+ // for users who have already onboarded — otherwise a stray
100
+ // ANTHROPIC_API_KEY or OPENAI_API_KEY in the shell would silently
101
+ // skip the OAuth wizard the first time a new user runs `codebase`,
102
+ // even though they almost certainly want the in-house default model
103
+ // with free credits rather than spending their own API key budget.
104
+ //
105
+ // "Already onboarded" = credentials.json exists on disk, even if it's
106
+ // now expired or empty. The wizard creates that file on first
107
+ // sign-in, so its presence is a reliable "this user knows what
108
+ // they're doing" signal.
109
+ const hasOnboarded = credentials.exists();
110
+ if (hasOnboarded) {
111
+ for (const provider of AUTO_DETECT_ORDER) {
112
+ const apiKey = getEnvApiKey(provider);
113
+ if (!apiKey)
114
+ continue;
115
+ const modelId = DEFAULT_MODELS[provider];
116
+ if (!modelId)
117
+ continue;
118
+ const model = getModel(provider, modelId);
119
+ if (!model)
120
+ continue;
121
+ return { model, apiKey, source: "auto" };
122
+ }
93
123
  }
94
124
  throw new ConfigError("No usable LLM provider found. Sign in with `codebase auth login`, paste an API key with " +
95
125
  "`codebase auth <key>`, or set one of: ANTHROPIC_API_KEY, OPENAI_API_KEY, GROQ_API_KEY, " +
@@ -97,26 +127,77 @@ export function resolveConfig(envOrOpts = process.env) {
97
127
  "Or set CODEBASE_PROVIDER + CODEBASE_MODEL explicitly.");
98
128
  }
99
129
  /**
100
- * Build a model whose baseUrl points at the codebase.foundation
101
- * inference proxy. The proxy MUST mimic the chosen provider's wire
102
- * protocol (Anthropic Messages, OpenAI Responses, etc.)what we send
103
- * here is identical to a direct call, the bearer token is the only
104
- * thing that changes.
130
+ * Build a model that routes through codebase.design's inference proxy.
131
+ *
132
+ * Default when signed in via OAuth: "Codebase Auto" the in-house
133
+ * MiniMax-M2.7 served via the openai-compat protocol. This matches
134
+ * what the web app calls the same model (`codebase` provider in
135
+ * web/backend/providers/registry.js).
136
+ *
137
+ * Override via env: CODEBASE_PROVIDER + CODEBASE_MODEL still pick a
138
+ * specific upstream from pi-ai's registry, also routed through the
139
+ * proxy. The proxy dispatches by the model id in the request body +
140
+ * the bearer scope on the token, so this works for any model the
141
+ * user's account has access to.
105
142
  */
106
143
  function buildProxiedConfig(env, accessToken) {
107
144
  const explicitProvider = env.CODEBASE_PROVIDER;
108
145
  const explicitModel = env.CODEBASE_MODEL;
109
- const provider = explicitProvider ?? "anthropic";
110
- const modelId = explicitModel ?? DEFAULT_MODELS[provider];
146
+ const proxyBase = (env.CODEBASE_PROXY_BASE_URL ?? DEFAULT_PROXY_BASE).replace(/\/+$/, "");
147
+ // Default: "Codebase Auto" synthesized openai-compat model.
148
+ // Can't use pi-ai's registry here because "codebase" isn't a
149
+ // KnownProvider; clone a known chat-completions model and override.
150
+ if (!explicitProvider) {
151
+ const template = getModel("groq", "llama-3.3-70b-versatile");
152
+ if (!template)
153
+ return null;
154
+ const model = {
155
+ ...template,
156
+ id: "MiniMax-M2.7",
157
+ name: "Codebase Auto",
158
+ baseUrl: proxyBase,
159
+ // Override provider so the status bar and /model don't lie about
160
+ // where this is served from. pi-ai uses `provider` mainly for
161
+ // display + a few baseUrl heuristics; the request body sends
162
+ // `model.id` only, so this cast is safe.
163
+ provider: "codebase",
164
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
165
+ };
166
+ return { model, apiKey: accessToken, source: "proxy" };
167
+ }
168
+ const modelId = explicitModel ?? DEFAULT_MODELS[explicitProvider];
111
169
  if (!modelId)
112
170
  return null;
113
- const baseModel = getModel(provider, modelId);
171
+ const baseModel = getModel(explicitProvider, modelId);
114
172
  if (!baseModel)
115
173
  return null;
116
- const proxyBase = (env.CODEBASE_PROXY_BASE_URL ?? DEFAULT_PROXY_BASE).replace(/\/+$/, "");
117
174
  const proxiedModel = { ...baseModel, baseUrl: proxyBase };
118
175
  return { model: proxiedModel, apiKey: accessToken, source: "proxy" };
119
176
  }
177
+ /**
178
+ * OpenAI Chat-Completions compatible custom endpoint. Used by
179
+ * MiniMax in-house, Qwen in-house, Groq custom URLs, Ollama, vLLM,
180
+ * any tinybox running a Chat Completions server. Synthesizes a
181
+ * Model<"openai-completions"> by cloning a known model from the
182
+ * registry and overriding the id + baseUrl. Cost is unknown so we
183
+ * zero it — /cost will report $0 for these runs, which is honest
184
+ * (we don't know the rate) rather than wrong.
185
+ */
186
+ function buildOpenAiCompatConfig(opts) {
187
+ // groq's llama-3.3-70b-versatile uses "openai-completions" — the
188
+ // closest match for what MiniMax / Qwen in-house actually serve.
189
+ const template = getModel("groq", "llama-3.3-70b-versatile");
190
+ if (!template)
191
+ return null;
192
+ const model = {
193
+ ...template,
194
+ id: opts.modelId,
195
+ name: opts.modelId,
196
+ baseUrl: opts.baseUrl.replace(/\/+$/, ""),
197
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
198
+ };
199
+ return { model, apiKey: opts.apiKey, source: "explicit" };
200
+ }
120
201
  /**
121
202
  * BYOK mode: caller has saved a provider's own API key. Use the
122
203
  * provider's normal baseUrl from pi-ai's registry — no proxy.
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/agent/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/agent/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ import { completeSimple } from "@earendil-works/pi-ai";
2
+ /**
3
+ * Prompt-suggestion ghost-text generation. After the agent goes idle,
4
+ * we issue a one-shot side call on the user's main model that reuses
5
+ * the parent's system prompt + conversation prefix and asks the model
6
+ * to predict the user's next input as a short string. The matching
7
+ * prefix lets the upstream's prompt cache reuse the parent's work, so
8
+ * the marginal cost is approximately the suggestion's own output
9
+ * tokens.
10
+ *
11
+ * Cost notes by provider:
12
+ * - Codebase Auto: zero marginal cost (in-house inference).
13
+ * - Anthropic / OpenAI: small (native prompt caching hits the prefix).
14
+ * - Other BYOK upstreams (Groq, Mistral, …): a small uncached call
15
+ * per suggestion. Disable via CODEBASE_NO_SUGGESTIONS=1.
16
+ */
17
+ /**
18
+ * Instructions appended as a final user message. The *technique* —
19
+ * meta-prompting an assistant to predict the next user input — is a
20
+ * common pattern across coding tools, but the wording below is
21
+ * original to this project (Claude Code uses a similar idea with
22
+ * different words; we're not copying that text).
23
+ */
24
+ const SUGGESTION_PROMPT = `Switching to autocomplete mode for one reply.
25
+
26
+ Reread the conversation so far and forecast the user's next message — the words they themselves would type into the input box, not advice about what they should do.
27
+
28
+ Calibration: if the user would read your reply and think "yeah, I was about to send that," you nailed it. If they'd read it and think "the assistant is talking to me," you missed.
29
+
30
+ Guideline patterns:
31
+ - After a job that finished cleanly, the next ask is usually the obvious follow-through: run the tests, push the commit, open the PR, ship it.
32
+ - When you (the assistant) listed options, prefer the one the user clearly wants given the thread above.
33
+ - When you asked a yes/no, pick the answer their tone implies.
34
+ - When the last assistant turn was a stack trace, a clarifying question, or anything where the user needs a beat to react: produce nothing.
35
+
36
+ Things that disqualify a suggestion:
37
+ - Anything in your own voice ("I'll handle it", "Let me check", "Here's a plan").
38
+ - Praise or filler the user would never type to drive forward ("nice", "looks great", "thanks").
39
+ - Open-ended questions thrown back at you ("what do you think?").
40
+ - A pivot to a new topic the user didn't ask about.
41
+ - More than one sentence; more than about a dozen words.
42
+
43
+ Output: just the predicted user message, no quotes, no preamble, no trailing punctuation flourish. If nothing fits, return an empty reply.`;
44
+ /** Don't suggest before this many assistant turns — needs context to predict from. */
45
+ const MIN_ASSISTANT_TURNS = 2;
46
+ /** Cap output so a runaway model can't burn tokens. 60 ≈ 12 words × 5 token/word, with slack. */
47
+ const MAX_SUGGESTION_TOKENS = 60;
48
+ /**
49
+ * Try to produce a suggestion for the current conversation. Returns null
50
+ * when we shouldn't suggest (early turn, last response was an error,
51
+ * abort fired, model returned empty or filtered text).
52
+ */
53
+ export async function generateSuggestion(bundle, options = {}) {
54
+ const agentState = bundle.agent.state;
55
+ const messages = agentState.messages;
56
+ // Need at least a couple assistant turns to predict from — anything
57
+ // less and the suggestion is guessing into the void.
58
+ const assistantTurnCount = messages.reduce((n, m) => n + (m.role === "assistant" ? 1 : 0), 0);
59
+ if (assistantTurnCount < MIN_ASSISTANT_TURNS)
60
+ return null;
61
+ // If the latest assistant message errored, the user should read/react,
62
+ // not be nudged to type more.
63
+ const lastAssistant = [...messages].reverse().find((m) => m.role === "assistant");
64
+ if (lastAssistant && "errorMessage" in lastAssistant && lastAssistant.errorMessage)
65
+ return null;
66
+ const suggestionMessages = [
67
+ ...messages,
68
+ {
69
+ role: "user",
70
+ content: SUGGESTION_PROMPT,
71
+ timestamp: Date.now(),
72
+ },
73
+ ];
74
+ let assistantMessage;
75
+ try {
76
+ assistantMessage = await completeSimple(agentState.model, {
77
+ systemPrompt: agentState.systemPrompt,
78
+ messages: suggestionMessages,
79
+ }, {
80
+ signal: options.signal,
81
+ maxTokens: MAX_SUGGESTION_TOKENS,
82
+ temperature: 0.7,
83
+ // `cacheRetention: "short"` is pi-ai's default — keeps the
84
+ // suggestion fork from extending the parent's cache TTL,
85
+ // which the agent loop manages on its own.
86
+ });
87
+ }
88
+ catch {
89
+ return null;
90
+ }
91
+ const text = extractText(assistantMessage).trim();
92
+ if (!text)
93
+ return null;
94
+ if (shouldFilterSuggestion(text))
95
+ return null;
96
+ return text;
97
+ }
98
+ function extractText(message) {
99
+ if (typeof message.content === "string")
100
+ return message.content;
101
+ if (!Array.isArray(message.content))
102
+ return "";
103
+ const parts = [];
104
+ for (const block of message.content) {
105
+ if (block.type === "text" && typeof block.text === "string") {
106
+ parts.push(block.text);
107
+ }
108
+ }
109
+ return parts.join("");
110
+ }
111
+ /**
112
+ * Filter out suggestions that don't look like real user input. The list
113
+ * is a pragmatic subset of Claude Code's filters — anything the model
114
+ * tends to emit when it doesn't know what to suggest but isn't quite
115
+ * willing to say nothing.
116
+ */
117
+ function shouldFilterSuggestion(text) {
118
+ const lower = text.toLowerCase();
119
+ if (lower === "done" || lower === "done.")
120
+ return true;
121
+ if (lower === "nothing found" || lower === "nothing found.")
122
+ return true;
123
+ if (lower.startsWith("nothing to suggest") || lower.startsWith("no suggestion"))
124
+ return true;
125
+ if (/\bstay(s|ing)? silent\b|\bsilence is\b/.test(lower))
126
+ return true;
127
+ if (/^\W*silence\W*$/.test(lower))
128
+ return true;
129
+ // Assistant-voice slippage — model addresses the user as if it were
130
+ // replying in-character instead of predicting their input.
131
+ if (/^(let me|i('|\s)ll|here('|\s)s|i can|i('|\s)d)\b/i.test(text))
132
+ return true;
133
+ // Evaluative one-liners — these aren't actions, they're chitchat the
134
+ // user wouldn't typically type to drive forward.
135
+ if (/^(looks good|thanks|nice|great|ok|okay|yes)\.?$/i.test(text.trim()))
136
+ return true;
137
+ // Too long — keep ghost-text legible (12 words is the cap CC uses).
138
+ if (text.split(/\s+/).length > 12)
139
+ return true;
140
+ // Multi-sentence — pick a single utterance.
141
+ if (/[.!?]\s+\S/.test(text))
142
+ return true;
143
+ return false;
144
+ }
145
+ //# sourceMappingURL=prompt-suggestion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-suggestion.js","sourceRoot":"","sources":["../../src/agent/prompt-suggestion.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,21 @@ export function buildSystemPrompt(cwd = process.cwd()) {
10
10
  "",
11
11
  "Be concise. Prefer code over prose. When you don't have a tool to act, say what you would do.",
12
12
  "",
13
+ "Task checklist (create_task / update_task):",
14
+ " Use the task tools to keep a visible checklist whenever the user's request needs more than 2-3 steps,",
15
+ " spans multiple files or commands, or the user gave you a numbered/bulleted list. The user sees this",
16
+ " list update in real time and judges progress from it.",
17
+ " Skip it for single trivial actions, pure Q&A, and one-off shell commands.",
18
+ " Rules:",
19
+ " - Create the full plan at the start of the work, one task per intended step.",
20
+ " - Provide both an imperative title ('Add OAuth refresh') and an active_form ('Adding OAuth refresh').",
21
+ " - Exactly ONE task is in_progress at any time. Flip the next one to in_progress BEFORE starting it,",
22
+ " and mark it completed IMMEDIATELY after it finishes — never batch completions.",
23
+ " - Never mark a task completed if it errored, tests are failing, or you couldn't finish.",
24
+ " Keep it in_progress and create a follow-up task for whatever's blocking.",
25
+ " - If you discover work mid-task that wasn't planned, append new tasks to the list.",
26
+ " - Cancel tasks that turned out to be unnecessary; don't leave stale 'pending' items.",
27
+ "",
13
28
  "Environment:",
14
29
  ` cwd: ${cwd}`,
15
30
  ` platform: ${platform()}`,
@@ -1 +1 @@
1
- {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/agent/system-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE7C;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC5D,MAAM,KAAK,GAAG;QACb,wGAAwG;QACxG,EAAE;QACF,+FAA+F;QAC/F,EAAE;QACF,cAAc;QACd,UAAU,GAAG,EAAE;QACf,eAAe,QAAQ,EAAE,EAAE;QAC3B,WAAW,QAAQ,EAAE,EAAE;QACvB,WAAW,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;KAClD,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/agent/system-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE7C;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC5D,MAAM,KAAK,GAAG;QACb,wGAAwG;QACxG,EAAE;QACF,+FAA+F;QAC/F,EAAE;QACF,6CAA6C;QAC7C,yGAAyG;QACzG,uGAAuG;QACvG,yDAAyD;QACzD,6EAA6E;QAC7E,UAAU;QACV,kFAAkF;QAClF,2GAA2G;QAC3G,yGAAyG;QACzG,sFAAsF;QACtF,6FAA6F;QAC7F,gFAAgF;QAChF,wFAAwF;QACxF,0FAA0F;QAC1F,EAAE;QACF,cAAc;QACd,UAAU,GAAG,EAAE;QACf,eAAe,QAAQ,EAAE,EAAE;QAC3B,WAAW,QAAQ,EAAE,EAAE;QACvB,WAAW,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;KAClD,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export function isCommand(value) {
2
+ return typeof value === "object" && value !== null && typeof value.type === "string";
3
+ }
4
+ export function buildErrorResponse(id, command, error) {
5
+ return { id, type: "response", command, success: false, error };
6
+ }
7
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/app-server/protocol.ts"],"names":[],"mappings":"AA4HA,MAAM,UAAU,SAAS,CAAC,KAAc;IACvC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,OAAQ,KAA4B,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC9G,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EAAsB,EAAE,OAAe,EAAE,KAAa;IACxF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACjE,CAAC"}