codebase-cli 2.0.0-pre.4 → 2.0.0-pre.41
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/dist/agent/agent.js +43 -15
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/config.js +61 -20
- package/dist/agent/config.js.map +1 -1
- package/dist/agent/events.bench.js +84 -0
- package/dist/agent/events.bench.js.map +1 -0
- package/dist/agent/prompt-suggestion.js +141 -0
- package/dist/agent/prompt-suggestion.js.map +1 -0
- package/dist/agent/system-prompt.js +15 -0
- package/dist/agent/system-prompt.js.map +1 -1
- package/dist/app-server/protocol.js +7 -0
- package/dist/app-server/protocol.js.map +1 -0
- package/dist/app-server/server.js +241 -0
- package/dist/app-server/server.js.map +1 -0
- package/dist/auth/cli.js +1 -1
- package/dist/auth/cli.js.map +1 -1
- package/dist/auth/credentials.js +33 -2
- package/dist/auth/credentials.js.map +1 -1
- package/dist/auth/flow.js +145 -24
- package/dist/auth/flow.js.map +1 -1
- package/dist/auth/token-manager.js +122 -0
- package/dist/auth/token-manager.js.map +1 -0
- package/dist/cli.js +56 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/builtins.js +160 -14
- package/dist/commands/builtins.js.map +1 -1
- package/dist/commands/registry.js +46 -1
- package/dist/commands/registry.js.map +1 -1
- package/dist/compaction/monitor.js +38 -0
- package/dist/compaction/monitor.js.map +1 -0
- package/dist/config/types.js.map +1 -1
- package/dist/glue/client.js +12 -2
- package/dist/glue/client.js.map +1 -1
- package/dist/hooks/manager.js +8 -2
- package/dist/hooks/manager.js.map +1 -1
- package/dist/memory/store.js +2 -3
- package/dist/memory/store.js.map +1 -1
- package/dist/plan/run-flow.js +89 -0
- package/dist/plan/run-flow.js.map +1 -0
- package/dist/projects/cli.js +92 -0
- package/dist/projects/cli.js.map +1 -0
- package/dist/projects/client.js +120 -0
- package/dist/projects/client.js.map +1 -0
- package/dist/projects/types.js +2 -0
- package/dist/projects/types.js.map +1 -0
- package/dist/skills/platform-loader.js +133 -38
- package/dist/skills/platform-loader.js.map +1 -1
- package/dist/tools/__test__/mock-tool-context.js +31 -0
- package/dist/tools/__test__/mock-tool-context.js.map +1 -0
- package/dist/tools/file-state-cache.js.map +1 -1
- package/dist/tools/read-file.js +7 -2
- package/dist/tools/read-file.js.map +1 -1
- package/dist/ui/App.js +109 -110
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/CompactionBanner.js +23 -0
- package/dist/ui/CompactionBanner.js.map +1 -0
- package/dist/ui/FirstRunSetup.js +66 -14
- package/dist/ui/FirstRunSetup.js.map +1 -1
- package/dist/ui/Input.js +370 -20
- package/dist/ui/Input.js.map +1 -1
- package/dist/ui/Markdown.js +286 -0
- package/dist/ui/Markdown.js.map +1 -0
- package/dist/ui/Message.js +110 -48
- package/dist/ui/Message.js.map +1 -1
- package/dist/ui/MessageList.js +100 -3
- package/dist/ui/MessageList.js.map +1 -1
- package/dist/ui/Permission.js +43 -20
- package/dist/ui/Permission.js.map +1 -1
- package/dist/ui/PixelC.js +25 -0
- package/dist/ui/PixelC.js.map +1 -0
- package/dist/ui/Status.js +267 -7
- package/dist/ui/Status.js.map +1 -1
- package/dist/ui/Throbber.js +11 -7
- package/dist/ui/Throbber.js.map +1 -1
- package/dist/ui/Welcome.js +59 -0
- package/dist/ui/Welcome.js.map +1 -0
- package/dist/ui/attachments.js +68 -0
- package/dist/ui/attachments.js.map +1 -0
- package/dist/ui/debug-input.js +44 -0
- package/dist/ui/debug-input.js.map +1 -0
- package/dist/ui/diff-summary.js +171 -0
- package/dist/ui/diff-summary.js.map +1 -0
- package/dist/ui/highlight.js +324 -0
- package/dist/ui/highlight.js.map +1 -0
- package/dist/ui/history-store.js +60 -0
- package/dist/ui/history-store.js.map +1 -0
- package/dist/ui/input-state.js +125 -1
- package/dist/ui/input-state.js.map +1 -1
- package/dist/ui/path-complete.js +102 -0
- package/dist/ui/path-complete.js.map +1 -0
- package/dist/ui/paths.js +41 -0
- package/dist/ui/paths.js.map +1 -0
- package/dist/ui/shell-escape.js +42 -0
- package/dist/ui/shell-escape.js.map +1 -0
- package/dist/ui/terminal-restore.js +83 -0
- package/dist/ui/terminal-restore.js.map +1 -0
- package/dist/ui/terminal-title.js +21 -0
- package/dist/ui/terminal-title.js.map +1 -0
- package/dist/ui/tool-call-line.js +83 -0
- package/dist/ui/tool-call-line.js.map +1 -0
- package/dist/ui/tool-labels.js +194 -0
- package/dist/ui/tool-labels.js.map +1 -0
- package/dist/ui/truncated-output.js +42 -0
- package/dist/ui/truncated-output.js.map +1 -0
- package/dist/ui/use-coalesced-agent-events.js +70 -0
- package/dist/ui/use-coalesced-agent-events.js.map +1 -0
- package/dist/ui/use-prompt-suggestion.js +52 -0
- package/dist/ui/use-prompt-suggestion.js.map +1 -0
- package/dist/ui/wrapped-lines.js +18 -0
- package/dist/ui/wrapped-lines.js.map +1 -0
- package/package.json +6 -1
package/dist/agent/agent.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
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
|
+
import { defaultOAuthConfig } from "../auth/cli.js";
|
|
5
|
+
import { CredentialsStore } from "../auth/credentials.js";
|
|
6
|
+
import { TokenManager } from "../auth/token-manager.js";
|
|
4
7
|
import { CompactionEngine } from "../compaction/engine.js";
|
|
8
|
+
import { CompactionMonitor } from "../compaction/monitor.js";
|
|
5
9
|
import { ConfigStore } from "../config/store.js";
|
|
6
10
|
import { DiagnosticsEngine, formatDiagnostics } from "../diagnostics/engine.js";
|
|
7
11
|
import { GlueClient, resolveGlueModels } from "../glue/client.js";
|
|
@@ -36,9 +40,16 @@ const PLAN_MODE_BLOCKED = new Set([
|
|
|
36
40
|
"exit_worktree",
|
|
37
41
|
]);
|
|
38
42
|
export function createAgent(opts = {}) {
|
|
39
|
-
const { model, apiKey, source } = resolveConfig();
|
|
43
|
+
const { model, apiKey, source } = opts.configOverride ?? resolveConfig();
|
|
40
44
|
const cwd = opts.cwd ?? process.cwd();
|
|
41
45
|
const systemPrompt = opts.systemPrompt ?? buildSystemPrompt(cwd);
|
|
46
|
+
// OAuth-sourced credentials rotate ~hourly; build a refresh-aware getter
|
|
47
|
+
// so the agent never sends a stale access token after the first refresh
|
|
48
|
+
// window. BYOK / explicit / auto sources use the static key passed in.
|
|
49
|
+
const tokenManager = source === "proxy"
|
|
50
|
+
? new TokenManager({ store: new CredentialsStore(), oauthConfig: defaultOAuthConfig() })
|
|
51
|
+
: null;
|
|
52
|
+
const getApiKey = tokenManager ? () => tokenManager.getAccessToken() : () => apiKey;
|
|
42
53
|
const config = new ConfigStore({ cwd });
|
|
43
54
|
const permissions = new PermissionStore({
|
|
44
55
|
allowPatterns: config.allowPatterns(),
|
|
@@ -55,9 +66,10 @@ export function createAgent(opts = {}) {
|
|
|
55
66
|
const glue = new GlueClient({
|
|
56
67
|
fastModel: glueModels.fast,
|
|
57
68
|
smartModel: glueModels.smart,
|
|
58
|
-
|
|
69
|
+
getApiKey,
|
|
59
70
|
});
|
|
60
71
|
const compaction = new CompactionEngine({ glue, modelId: model.id });
|
|
72
|
+
const compactionMonitor = new CompactionMonitor();
|
|
61
73
|
const sessions = new SessionStore({ cwd });
|
|
62
74
|
const resumed = opts.resume ? sessions.load(model.id) : null;
|
|
63
75
|
const toolContext = {
|
|
@@ -70,7 +82,7 @@ export function createAgent(opts = {}) {
|
|
|
70
82
|
hooks,
|
|
71
83
|
spawnSubagent: ({ systemPrompt: subPrompt, tools: subTools }) => new Agent({
|
|
72
84
|
initialState: { model, systemPrompt: subPrompt, tools: subTools },
|
|
73
|
-
getApiKey
|
|
85
|
+
getApiKey,
|
|
74
86
|
}),
|
|
75
87
|
};
|
|
76
88
|
// MEMORY.md gets concatenated onto the system prompt at agent creation.
|
|
@@ -87,16 +99,24 @@ export function createAgent(opts = {}) {
|
|
|
87
99
|
transformContext: async (messages, signal) => {
|
|
88
100
|
if (!compaction.needsCompaction(messages))
|
|
89
101
|
return messages;
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
102
|
+
compactionMonitor.start(messages.length);
|
|
103
|
+
try {
|
|
104
|
+
await hooks.dispatch("PreCompact", { event: "PreCompact", workingDir: cwd, messageCount: messages.length }, signal);
|
|
105
|
+
const result = await compaction.compact(messages, signal);
|
|
106
|
+
await hooks.dispatch("PostCompact", {
|
|
107
|
+
event: "PostCompact",
|
|
108
|
+
workingDir: cwd,
|
|
109
|
+
messageCount: result.messages.length,
|
|
110
|
+
collapsedMessageCount: result.details.collapsedMessageCount,
|
|
111
|
+
truncatedTokens: result.details.truncatedTokens,
|
|
112
|
+
}, signal);
|
|
113
|
+
return result.messages;
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
// Always clear — even if compact() threw, the user shouldn't
|
|
117
|
+
// see a stuck "Compacting…" banner forever.
|
|
118
|
+
compactionMonitor.end();
|
|
119
|
+
}
|
|
100
120
|
},
|
|
101
121
|
beforeToolCall: async (ctx, signal) => {
|
|
102
122
|
// 1. Plan mode gate: block destructive tools entirely while planning.
|
|
@@ -152,8 +172,14 @@ export function createAgent(opts = {}) {
|
|
|
152
172
|
timestamp: Date.now(),
|
|
153
173
|
});
|
|
154
174
|
})
|
|
155
|
-
.catch(() => {
|
|
156
|
-
// Diagnostics failures are non-fatal — surface
|
|
175
|
+
.catch((err) => {
|
|
176
|
+
// Diagnostics failures are non-fatal — surface only when the
|
|
177
|
+
// user opted into debug. Silent before; that buried a real
|
|
178
|
+
// bug where a checker hung and the user thought the tool
|
|
179
|
+
// itself was slow.
|
|
180
|
+
if (process.env.CODEBASE_DEBUG === "1") {
|
|
181
|
+
process.stderr.write(`[diagnostics] ${absPath}: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
182
|
+
}
|
|
157
183
|
});
|
|
158
184
|
}
|
|
159
185
|
return undefined;
|
|
@@ -204,10 +230,12 @@ export function createAgent(opts = {}) {
|
|
|
204
230
|
memory,
|
|
205
231
|
glue,
|
|
206
232
|
compaction,
|
|
233
|
+
compactionMonitor,
|
|
207
234
|
sessions,
|
|
208
235
|
hooks,
|
|
209
236
|
diagnostics,
|
|
210
237
|
subscribe,
|
|
238
|
+
resumedFrom: resumed ? { updatedAt: resumed.updatedAt, messageCount: resumed.messages.length } : undefined,
|
|
211
239
|
};
|
|
212
240
|
}
|
|
213
241
|
//# sourceMappingURL=agent.js.map
|
package/dist/agent/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/agent/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,KAAK,EAAmB,MAAM,+BAA+B,CAAC;AAEvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAuB,aAAa,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,gBAAgB,GAAwB,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC;AAElH;;;;;GAKG;AACH,MAAM,iBAAiB,GAAwB,IAAI,GAAG,CAAC;IACtD,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,eAAe;IACf,OAAO;IACP,YAAY;IACZ,YAAY;IACZ,gBAAgB;IAChB,eAAe;CACf,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/agent/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,KAAK,EAAmB,MAAM,+BAA+B,CAAC;AAEvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAuB,aAAa,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,gBAAgB,GAAwB,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC;AAElH;;;;;GAKG;AACH,MAAM,iBAAiB,GAAwB,IAAI,GAAG,CAAC;IACtD,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,eAAe;IACf,OAAO;IACP,YAAY;IACZ,YAAY;IACZ,gBAAgB;IAChB,eAAe;CACf,CAAC,CAAC;AAgDH,MAAM,UAAU,WAAW,CAAC,OAA2B,EAAE;IACxD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,IAAI,aAAa,EAAE,CAAC;IACzE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAEjE,yEAAyE;IACzE,wEAAwE;IACxE,uEAAuE;IACvE,MAAM,YAAY,GACjB,MAAM,KAAK,OAAO;QACjB,CAAC,CAAC,IAAI,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,gBAAgB,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,EAAE,CAAC;QACxF,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IAEpF,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC;QACvC,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE;QACrC,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE;QACnC,WAAW,EAAE,IAAI,CAAC,WAAW;KAC7B,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,IAAI,cAAc,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;IAChC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;IACjG,MAAM,WAAW,GAAG,IAAI,iBAAiB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAEnD,MAAM,UAAU,GAAG,iBAAiB,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC;IACnF,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC;QAC3B,SAAS,EAAE,UAAU,CAAC,IAAI;QAC1B,UAAU,EAAE,UAAU,CAAC,KAAK;QAC5B,SAAS;KACT,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACrE,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE7D,MAAM,WAAW,GAAgB;QAChC,GAAG;QACH,cAAc,EAAE,IAAI,cAAc,EAAE;QACpC,KAAK,EAAE,IAAI,SAAS,EAAE;QACtB,WAAW;QACX,QAAQ;QACR,MAAM;QACN,KAAK;QACL,aAAa,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAC/D,IAAI,KAAK,CAAC;YACT,YAAY,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE;YACjE,SAAS;SACT,CAAC;KACH,CAAC;IAEF,wEAAwE;IACxE,+CAA+C;IAC/C,MAAM,gBAAgB,GAAG,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAEpE,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;QACvB,YAAY,EAAE;YACb,KAAK;YACL,YAAY,EAAE,gBAAgB;YAC9B,KAAK,EAAE,UAAU,CAAC,WAAW,CAAC;YAC9B,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,EAAE;SACjC;QACD,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM;QACvB,gBAAgB,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE;YAC5C,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,QAAQ,CAAC;gBAAE,OAAO,QAAQ,CAAC;YAC3D,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACzC,IAAI,CAAC;gBACJ,MAAM,KAAK,CAAC,QAAQ,CACnB,YAAY,EACZ,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,EAAE,YAAY,EAAE,QAAQ,CAAC,MAAM,EAAE,EACvE,MAAM,CACN,CAAC;gBACF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAC1D,MAAM,KAAK,CAAC,QAAQ,CACnB,aAAa,EACb;oBACC,KAAK,EAAE,aAAa;oBACpB,UAAU,EAAE,GAAG;oBACf,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;oBACpC,qBAAqB,EAAE,MAAM,CAAC,OAAO,CAAC,qBAAqB;oBAC3D,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,eAAe;iBAC/C,EACD,MAAM,CACN,CAAC;gBACF,OAAO,MAAM,CAAC,QAAQ,CAAC;YACxB,CAAC;oBAAS,CAAC;gBACV,6DAA6D;gBAC7D,4CAA4C;gBAC5C,iBAAiB,CAAC,GAAG,EAAE,CAAC;YACzB,CAAC;QACF,CAAC;QACD,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;YACrC,sEAAsE;YACtE,IAAI,QAAQ,CAAC,QAAQ,EAAE,IAAI,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrE,OAAO;oBACN,KAAK,EAAE,IAAI;oBACX,MAAM,EACL,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,yCAAyC;wBAC7D,uEAAuE;iBACxE,CAAC;YACH,CAAC;YACD,gEAAgE;YAChE,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;YACzE,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;gBAC1B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC;YAC9D,CAAC;YACD,iEAAiE;YACjE,MAAM,QAAQ,GAAI,GAAG,CAAC,IAAsC,EAAE,IAAI,CAAC;YACnE,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,QAAQ,CACnC,YAAY,EACZ;gBACC,KAAK,EAAE,YAAY;gBACnB,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI;gBAC3B,QAAQ,EAAE,GAAG,CAAC,IAAI;gBAClB,QAAQ;gBACR,UAAU,EAAE,GAAG;aACf,EACD,MAAM,CACN,CAAC;YACF,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACrB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,kBAAkB,EAAE,CAAC;YACtE,CAAC;YACD,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,aAAa,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;YACpC,MAAM,QAAQ,GAAI,GAAG,CAAC,IAAsC,EAAE,IAAI,CAAC;YACnE,MAAM,KAAK,CAAC,QAAQ,CACnB,aAAa,EACb;gBACC,KAAK,EAAE,aAAa;gBACpB,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI;gBAC3B,QAAQ,EAAE,GAAG,CAAC,IAAI;gBAClB,QAAQ;gBACR,UAAU,EAAE,GAAG;aACf,EACD,MAAM,CACN,CAAC;YAEF,sEAAsE;YACtE,kEAAkE;YAClE,yDAAyD;YACzD,IAAI,QAAQ,IAAI,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzD,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;gBACzE,WAAW;qBACT,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;qBAC3B,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;oBACf,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;wBAAE,OAAO;oBAC/B,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;oBACtC,QAAQ,EAAE,KAAK,CAAC;wBACf,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE,sBAAsB,IAAI,sBAAsB;wBACzD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;qBACrB,CAAC,CAAC;gBACJ,CAAC,CAAC;qBACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;oBACd,6DAA6D;oBAC7D,2DAA2D;oBAC3D,yDAAyD;oBACzD,mBAAmB;oBACnB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,GAAG,EAAE,CAAC;wBACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB,iBAAiB,OAAO,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CACjF,CAAC;oBACH,CAAC;gBACF,CAAC,CAAC,CAAC;YACL,CAAC;YACD,OAAO,SAAS,CAAC;QAClB,CAAC;KACD,CAAC,CAAC;IAEH,sEAAsE;IACtE,sEAAsE;IACtE,yEAAyE;IACzE,MAAM,QAAQ,GAAU,KAAK,CAAC;IAE9B,MAAM,SAAS,GAAG,CAAC,QAAqC,EAAgB,EAAE,CACzE,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;QACzB,QAAQ,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;IAEJ,0EAA0E;IAC1E,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;QACzB,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO;QACvC,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;YACxF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAClC,QAAQ,CAAC,IAAI,CAAC;gBACb,OAAO,EAAE,KAAK,CAAC,EAAE;gBACjB,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI;gBAC7B,QAAQ;gBACR,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI;oBACxB,KAAK,EAAE,CAAC;oBACR,MAAM,EAAE,CAAC;oBACT,SAAS,EAAE,CAAC;oBACZ,UAAU,EAAE,CAAC;oBACb,WAAW,EAAE,CAAC;oBACd,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;iBACpE;aACD,CAAC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACR,2EAA2E;QAC5E,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,KAAK,QAAQ,CAAC;IACd,OAAO;QACN,KAAK;QACL,KAAK;QACL,MAAM;QACN,WAAW;QACX,WAAW;QACX,WAAW;QACX,QAAQ;QACR,MAAM;QACN,IAAI;QACJ,UAAU;QACV,iBAAiB;QACjB,QAAQ;QACR,KAAK;QACL,WAAW;QACX,SAAS;QACT,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS;KAC1G,CAAC;AACH,CAAC"}
|
package/dist/agent/config.js
CHANGED
|
@@ -95,17 +95,31 @@ export function resolveConfig(envOrOpts = process.env) {
|
|
|
95
95
|
}
|
|
96
96
|
return { model, apiKey, source: "explicit" };
|
|
97
97
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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
|
+
}
|
|
109
123
|
}
|
|
110
124
|
throw new ConfigError("No usable LLM provider found. Sign in with `codebase auth login`, paste an API key with " +
|
|
111
125
|
"`codebase auth <key>`, or set one of: ANTHROPIC_API_KEY, OPENAI_API_KEY, GROQ_API_KEY, " +
|
|
@@ -113,23 +127,50 @@ export function resolveConfig(envOrOpts = process.env) {
|
|
|
113
127
|
"Or set CODEBASE_PROVIDER + CODEBASE_MODEL explicitly.");
|
|
114
128
|
}
|
|
115
129
|
/**
|
|
116
|
-
* Build a model
|
|
117
|
-
*
|
|
118
|
-
*
|
|
119
|
-
*
|
|
120
|
-
*
|
|
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.
|
|
121
142
|
*/
|
|
122
143
|
function buildProxiedConfig(env, accessToken) {
|
|
123
144
|
const explicitProvider = env.CODEBASE_PROVIDER;
|
|
124
145
|
const explicitModel = env.CODEBASE_MODEL;
|
|
125
|
-
const
|
|
126
|
-
|
|
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];
|
|
127
169
|
if (!modelId)
|
|
128
170
|
return null;
|
|
129
|
-
const baseModel = getModel(
|
|
171
|
+
const baseModel = getModel(explicitProvider, modelId);
|
|
130
172
|
if (!baseModel)
|
|
131
173
|
return null;
|
|
132
|
-
const proxyBase = (env.CODEBASE_PROXY_BASE_URL ?? DEFAULT_PROXY_BASE).replace(/\/+$/, "");
|
|
133
174
|
const proxiedModel = { ...baseModel, baseUrl: proxyBase };
|
|
134
175
|
return { model: proxiedModel, apiKey: accessToken, source: "proxy" };
|
|
135
176
|
}
|
package/dist/agent/config.js.map
CHANGED
|
@@ -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,84 @@
|
|
|
1
|
+
import { bench, describe } from "vitest";
|
|
2
|
+
import { EMPTY_USAGE } from "../types.js";
|
|
3
|
+
import { initialState, reducer } from "./events.js";
|
|
4
|
+
const MODEL = { provider: "test", id: "test-model", name: "Test" };
|
|
5
|
+
/**
|
|
6
|
+
* Microbenchmarks for the reducer's hot paths. The streaming pipeline
|
|
7
|
+
* funnels every assistant token and every tool stdout chunk through
|
|
8
|
+
* this reducer — a 10ms regression here turns into perceptible
|
|
9
|
+
* scroll/render jank in the TUI. Baselines printed by `npm run bench:micro`
|
|
10
|
+
* are the contract; if these numbers degrade noticeably on a future PR,
|
|
11
|
+
* something in the reducer needs investigation.
|
|
12
|
+
*/
|
|
13
|
+
function streamingMessage(text) {
|
|
14
|
+
return {
|
|
15
|
+
type: "message_update",
|
|
16
|
+
message: {
|
|
17
|
+
role: "assistant",
|
|
18
|
+
content: [{ type: "text", text }],
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function toolStart(id) {
|
|
23
|
+
return {
|
|
24
|
+
type: "tool_execution_start",
|
|
25
|
+
toolCallId: id,
|
|
26
|
+
toolName: "read_file",
|
|
27
|
+
args: { path: "src/x.ts" },
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function toolUpdate(id, n) {
|
|
31
|
+
return {
|
|
32
|
+
type: "tool_execution_update",
|
|
33
|
+
toolCallId: id,
|
|
34
|
+
partialResult: `chunk ${n}`,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
describe("reducer hot paths", () => {
|
|
38
|
+
bench("apply 1000 message_update events (assistant token stream)", () => {
|
|
39
|
+
let s = initialState(MODEL);
|
|
40
|
+
// Seed a streaming message so message_update has something to overwrite.
|
|
41
|
+
s = reducer(s, {
|
|
42
|
+
type: "agent-event",
|
|
43
|
+
event: {
|
|
44
|
+
type: "message_start",
|
|
45
|
+
message: { role: "assistant", content: [] },
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
for (let i = 0; i < 1000; i++) {
|
|
49
|
+
s = reducer(s, { type: "agent-event", event: streamingMessage(`token-${i}`) });
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
bench("apply 1000 tool_execution_update events on a single tool (shell stdout)", () => {
|
|
53
|
+
let s = initialState(MODEL);
|
|
54
|
+
s = reducer(s, { type: "agent-event", event: toolStart("t1") });
|
|
55
|
+
for (let i = 0; i < 1000; i++) {
|
|
56
|
+
s = reducer(s, { type: "agent-event", event: toolUpdate("t1", i) });
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
bench("interleave 50 tools × 20 updates each (parallel tool burst)", () => {
|
|
60
|
+
let s = initialState(MODEL);
|
|
61
|
+
for (let i = 0; i < 50; i++) {
|
|
62
|
+
s = reducer(s, { type: "agent-event", event: toolStart(`t${i}`) });
|
|
63
|
+
}
|
|
64
|
+
for (let round = 0; round < 20; round++) {
|
|
65
|
+
for (let i = 0; i < 50; i++) {
|
|
66
|
+
s = reducer(s, { type: "agent-event", event: toolUpdate(`t${i}`, round) });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
bench("user-prompt → agent-event sequence × 100 (full turn replay)", () => {
|
|
71
|
+
let s = initialState(MODEL);
|
|
72
|
+
for (let turn = 0; turn < 100; turn++) {
|
|
73
|
+
s = reducer(s, { type: "user-prompt", text: `prompt ${turn}` });
|
|
74
|
+
s = reducer(s, {
|
|
75
|
+
type: "agent-event",
|
|
76
|
+
event: {
|
|
77
|
+
type: "message_end",
|
|
78
|
+
message: { role: "assistant", content: [], usage: EMPTY_USAGE },
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=events.bench.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.bench.js","sourceRoot":"","sources":["../../src/agent/events.bench.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,141 @@
|
|
|
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. Meta-prompts the model
|
|
19
|
+
* to predict the user's next input rather than respond as the assistant.
|
|
20
|
+
*/
|
|
21
|
+
const SUGGESTION_PROMPT = `Switching to autocomplete mode for one reply.
|
|
22
|
+
|
|
23
|
+
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.
|
|
24
|
+
|
|
25
|
+
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.
|
|
26
|
+
|
|
27
|
+
Guideline patterns:
|
|
28
|
+
- 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.
|
|
29
|
+
- When you (the assistant) listed options, prefer the one the user clearly wants given the thread above.
|
|
30
|
+
- When you asked a yes/no, pick the answer their tone implies.
|
|
31
|
+
- When the last assistant turn was a stack trace, a clarifying question, or anything where the user needs a beat to react: produce nothing.
|
|
32
|
+
|
|
33
|
+
Things that disqualify a suggestion:
|
|
34
|
+
- Anything in your own voice ("I'll handle it", "Let me check", "Here's a plan").
|
|
35
|
+
- Praise or filler the user would never type to drive forward ("nice", "looks great", "thanks").
|
|
36
|
+
- Open-ended questions thrown back at you ("what do you think?").
|
|
37
|
+
- A pivot to a new topic the user didn't ask about.
|
|
38
|
+
- More than one sentence; more than about a dozen words.
|
|
39
|
+
|
|
40
|
+
Output: just the predicted user message, no quotes, no preamble, no trailing punctuation flourish. If nothing fits, return an empty reply.`;
|
|
41
|
+
/** Don't suggest before this many assistant turns — needs context to predict from. */
|
|
42
|
+
const MIN_ASSISTANT_TURNS = 2;
|
|
43
|
+
/** Cap output so a runaway model can't burn tokens. 60 ≈ 12 words × 5 token/word, with slack. */
|
|
44
|
+
const MAX_SUGGESTION_TOKENS = 60;
|
|
45
|
+
/**
|
|
46
|
+
* Try to produce a suggestion for the current conversation. Returns null
|
|
47
|
+
* when we shouldn't suggest (early turn, last response was an error,
|
|
48
|
+
* abort fired, model returned empty or filtered text).
|
|
49
|
+
*/
|
|
50
|
+
export async function generateSuggestion(bundle, options = {}) {
|
|
51
|
+
const agentState = bundle.agent.state;
|
|
52
|
+
const messages = agentState.messages;
|
|
53
|
+
// Need at least a couple assistant turns to predict from — anything
|
|
54
|
+
// less and the suggestion is guessing into the void.
|
|
55
|
+
const assistantTurnCount = messages.reduce((n, m) => n + (m.role === "assistant" ? 1 : 0), 0);
|
|
56
|
+
if (assistantTurnCount < MIN_ASSISTANT_TURNS)
|
|
57
|
+
return null;
|
|
58
|
+
// If the latest assistant message errored, the user should read/react,
|
|
59
|
+
// not be nudged to type more.
|
|
60
|
+
const lastAssistant = [...messages].reverse().find((m) => m.role === "assistant");
|
|
61
|
+
if (lastAssistant && "errorMessage" in lastAssistant && lastAssistant.errorMessage)
|
|
62
|
+
return null;
|
|
63
|
+
const suggestionMessages = [
|
|
64
|
+
...messages,
|
|
65
|
+
{
|
|
66
|
+
role: "user",
|
|
67
|
+
content: SUGGESTION_PROMPT,
|
|
68
|
+
timestamp: Date.now(),
|
|
69
|
+
},
|
|
70
|
+
];
|
|
71
|
+
let assistantMessage;
|
|
72
|
+
try {
|
|
73
|
+
assistantMessage = await completeSimple(agentState.model, {
|
|
74
|
+
systemPrompt: agentState.systemPrompt,
|
|
75
|
+
messages: suggestionMessages,
|
|
76
|
+
}, {
|
|
77
|
+
signal: options.signal,
|
|
78
|
+
maxTokens: MAX_SUGGESTION_TOKENS,
|
|
79
|
+
temperature: 0.7,
|
|
80
|
+
// `cacheRetention: "short"` is pi-ai's default — keeps the
|
|
81
|
+
// suggestion fork from extending the parent's cache TTL,
|
|
82
|
+
// which the agent loop manages on its own.
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
const text = extractText(assistantMessage).trim();
|
|
89
|
+
if (!text)
|
|
90
|
+
return null;
|
|
91
|
+
if (shouldFilterSuggestion(text))
|
|
92
|
+
return null;
|
|
93
|
+
return text;
|
|
94
|
+
}
|
|
95
|
+
function extractText(message) {
|
|
96
|
+
if (typeof message.content === "string")
|
|
97
|
+
return message.content;
|
|
98
|
+
if (!Array.isArray(message.content))
|
|
99
|
+
return "";
|
|
100
|
+
const parts = [];
|
|
101
|
+
for (const block of message.content) {
|
|
102
|
+
if (block.type === "text" && typeof block.text === "string") {
|
|
103
|
+
parts.push(block.text);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return parts.join("");
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Filter out suggestions that don't look like real user input. Catches
|
|
110
|
+
* the things the model emits when it doesn't know what to suggest but
|
|
111
|
+
* isn't willing to stay silent.
|
|
112
|
+
*/
|
|
113
|
+
function shouldFilterSuggestion(text) {
|
|
114
|
+
const lower = text.toLowerCase();
|
|
115
|
+
if (lower === "done" || lower === "done.")
|
|
116
|
+
return true;
|
|
117
|
+
if (lower === "nothing found" || lower === "nothing found.")
|
|
118
|
+
return true;
|
|
119
|
+
if (lower.startsWith("nothing to suggest") || lower.startsWith("no suggestion"))
|
|
120
|
+
return true;
|
|
121
|
+
if (/\bstay(s|ing)? silent\b|\bsilence is\b/.test(lower))
|
|
122
|
+
return true;
|
|
123
|
+
if (/^\W*silence\W*$/.test(lower))
|
|
124
|
+
return true;
|
|
125
|
+
// Assistant-voice slippage — model addresses the user as if it were
|
|
126
|
+
// replying in-character instead of predicting their input.
|
|
127
|
+
if (/^(let me|i('|\s)ll|here('|\s)s|i can|i('|\s)d)\b/i.test(text))
|
|
128
|
+
return true;
|
|
129
|
+
// Evaluative one-liners — these aren't actions, they're chitchat the
|
|
130
|
+
// user wouldn't typically type to drive forward.
|
|
131
|
+
if (/^(looks good|thanks|nice|great|ok|okay|yes)\.?$/i.test(text.trim()))
|
|
132
|
+
return true;
|
|
133
|
+
// Too long — keep ghost-text legible in the input row.
|
|
134
|
+
if (text.split(/\s+/).length > 12)
|
|
135
|
+
return true;
|
|
136
|
+
// Multi-sentence — pick a single utterance.
|
|
137
|
+
if (/[.!?]\s+\S/.test(text))
|
|
138
|
+
return true;
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
//# 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"}
|