codebase-cli 2.0.0-pre.3 → 2.0.0-pre.30
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 +10 -2
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/config.js +101 -20
- package/dist/agent/config.js.map +1 -1
- package/dist/agent/prompt-suggestion.js +145 -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/credentials.js +10 -0
- 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/cli.js +58 -6
- package/dist/cli.js.map +1 -1
- package/dist/commands/builtins.js +155 -5
- 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/glue/client.js +10 -1
- package/dist/glue/client.js.map +1 -1
- package/dist/headless/run.js +1 -1
- package/dist/headless/run.js.map +1 -1
- package/dist/hooks/manager.js +8 -2
- package/dist/hooks/manager.js.map +1 -1
- package/dist/permissions/store.js +4 -0
- package/dist/permissions/store.js.map +1 -1
- 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/read-file.js +8 -2
- package/dist/tools/read-file.js.map +1 -1
- package/dist/ui/App.js +244 -17
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/FirstRunSetup.js +66 -14
- package/dist/ui/FirstRunSetup.js.map +1 -1
- package/dist/ui/Input.js +270 -14
- 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 +604 -25
- 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 +213 -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/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/path-complete.js +102 -0
- package/dist/ui/path-complete.js.map +1 -0
- package/dist/ui/terminal-restore.js +83 -0
- package/dist/ui/terminal-restore.js.map +1 -0
- package/package.json +5 -1
package/dist/agent/agent.js
CHANGED
|
@@ -43,6 +43,7 @@ export function createAgent(opts = {}) {
|
|
|
43
43
|
const permissions = new PermissionStore({
|
|
44
44
|
allowPatterns: config.allowPatterns(),
|
|
45
45
|
denyPatterns: config.denyPatterns(),
|
|
46
|
+
autoApprove: opts.autoApprove,
|
|
46
47
|
});
|
|
47
48
|
const userQueries = new UserQueryStore();
|
|
48
49
|
const planMode = new PlanModeStore();
|
|
@@ -151,8 +152,14 @@ export function createAgent(opts = {}) {
|
|
|
151
152
|
timestamp: Date.now(),
|
|
152
153
|
});
|
|
153
154
|
})
|
|
154
|
-
.catch(() => {
|
|
155
|
-
// Diagnostics failures are non-fatal — surface
|
|
155
|
+
.catch((err) => {
|
|
156
|
+
// Diagnostics failures are non-fatal — surface only when the
|
|
157
|
+
// user opted into debug. Silent before; that buried a real
|
|
158
|
+
// bug where a checker hung and the user thought the tool
|
|
159
|
+
// itself was slow.
|
|
160
|
+
if (process.env.CODEBASE_DEBUG === "1") {
|
|
161
|
+
process.stderr.write(`[diagnostics] ${absPath}: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
162
|
+
}
|
|
156
163
|
});
|
|
157
164
|
}
|
|
158
165
|
return undefined;
|
|
@@ -207,6 +214,7 @@ export function createAgent(opts = {}) {
|
|
|
207
214
|
hooks,
|
|
208
215
|
diagnostics,
|
|
209
216
|
subscribe,
|
|
217
|
+
resumedFrom: resumed ? { updatedAt: resumed.updatedAt, messageCount: resumed.messages.length } : undefined,
|
|
210
218
|
};
|
|
211
219
|
}
|
|
212
220
|
//# 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":"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"}
|
package/dist/agent/config.js
CHANGED
|
@@ -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
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
*
|
|
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
|
|
110
|
-
|
|
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(
|
|
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.
|
package/dist/agent/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/agent/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAkC,MAAM,uBAAuB,CAAC;AAC/F,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;;;;;;;;;;;GAaG;AAEH,+DAA+D;AAC/D,oEAAoE;AACpE,4DAA4D;AAC5D,kEAAkE;AAClE,eAAe;AACf,MAAM,kBAAkB,GAAG,uCAAuC,CAAC;AAEnE,MAAM,iBAAiB,GAA6B;IACnD,WAAW;IACX,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,SAAS;IACT,UAAU;IACV,UAAU;IACV,KAAK;IACL,YAAY;CACH,CAAC;AAEX,MAAM,cAAc,GAA2C;IAC9D,SAAS,EAAE,mBAAmB;IAC9B,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,yBAAyB;IAC/B,MAAM,EAAE,gBAAgB;IACxB,OAAO,EAAE,sBAAsB;IAC/B,QAAQ,EAAE,eAAe;IACzB,QAAQ,EAAE,eAAe;IACzB,GAAG,EAAE,QAAQ;IACb,UAAU,EAAE,2BAA2B;CACvC,CAAC;AAQF,MAAM,OAAO,WAAY,SAAQ,KAAK;CAAG;AAOzC,MAAM,UAAU,aAAa,CAAC,YAAsD,OAAO,CAAC,GAAG;IAC9F,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACpC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,gBAAgB,EAAE,CAAC;IAE/D,uDAAuD;IACvD,yDAAyD;IACzD,uEAAuE;IACvE,MAAM,QAAQ,GAAG,GAAG,CAAC,sBAAsB,KAAK,GAAG,CAAC;IACpD,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,KAAK,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC/C,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,QAAyB,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;YACjF,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAC;QACvB,CAAC;aAAM,IAAI,QAAQ,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;YAC3D,IAAI,OAAO;gBAAE,OAAO,OAAO,CAAC;QAC7B,CAAC;IACF,CAAC;IAED,MAAM,gBAAgB,GAAG,GAAG,CAAC,iBAA8C,CAAC;IAC5E,MAAM,aAAa,GAAG,GAAG,CAAC,cAAc,CAAC;IAEzC,IAAI,gBAAgB,IAAI,aAAa,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,gBAAgB,EAAE,aAAsB,CAAC,CAAC;QACjE,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,MAAM,IAAI,WAAW,CACpB,qBAAqB,gBAAgB,mBAAmB,aAAa,kCAAkC;gBACtG,mDAAmD,CACpD,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,IAAI,WAAW,CACpB,qBAAqB,gBAAgB,4DAA4D,CACjG,CAAC;QACH,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAC9C,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,iBAAiB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/agent/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAkC,MAAM,uBAAuB,CAAC;AAC/F,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;;;;;;;;;;;GAaG;AAEH,+DAA+D;AAC/D,oEAAoE;AACpE,4DAA4D;AAC5D,kEAAkE;AAClE,eAAe;AACf,MAAM,kBAAkB,GAAG,uCAAuC,CAAC;AAEnE,MAAM,iBAAiB,GAA6B;IACnD,WAAW;IACX,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,SAAS;IACT,UAAU;IACV,UAAU;IACV,KAAK;IACL,YAAY;CACH,CAAC;AAEX,MAAM,cAAc,GAA2C;IAC9D,SAAS,EAAE,mBAAmB;IAC9B,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,yBAAyB;IAC/B,MAAM,EAAE,gBAAgB;IACxB,OAAO,EAAE,sBAAsB;IAC/B,QAAQ,EAAE,eAAe;IACzB,QAAQ,EAAE,eAAe;IACzB,GAAG,EAAE,QAAQ;IACb,UAAU,EAAE,2BAA2B;CACvC,CAAC;AAQF,MAAM,OAAO,WAAY,SAAQ,KAAK;CAAG;AAOzC,MAAM,UAAU,aAAa,CAAC,YAAsD,OAAO,CAAC,GAAG;IAC9F,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACpC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,gBAAgB,EAAE,CAAC;IAE/D,uDAAuD;IACvD,yDAAyD;IACzD,uEAAuE;IACvE,MAAM,QAAQ,GAAG,GAAG,CAAC,sBAAsB,KAAK,GAAG,CAAC;IACpD,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,KAAK,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC/C,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,CAAC,QAAyB,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;YACjF,IAAI,IAAI;gBAAE,OAAO,IAAI,CAAC;QACvB,CAAC;aAAM,IAAI,QAAQ,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;YAC3D,IAAI,OAAO;gBAAE,OAAO,OAAO,CAAC;QAC7B,CAAC;IACF,CAAC;IAED,mEAAmE;IACnE,iEAAiE;IACjE,mEAAmE;IACnE,gEAAgE;IAChE,mEAAmE;IACnE,2DAA2D;IAC3D,4DAA4D;IAC5D,IAAI,GAAG,CAAC,eAAe,IAAI,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;QACnE,MAAM,MAAM,GAAG,uBAAuB,CAAC;YACtC,OAAO,EAAE,GAAG,CAAC,eAAe;YAC5B,OAAO,EAAE,GAAG,CAAC,YAAY;YACzB,MAAM,EAAE,GAAG,CAAC,cAAc;SAC1B,CAAC,CAAC;QACH,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;IAC3B,CAAC;IAED,MAAM,gBAAgB,GAAG,GAAG,CAAC,iBAA8C,CAAC;IAC5E,MAAM,aAAa,GAAG,GAAG,CAAC,cAAc,CAAC;IAEzC,IAAI,gBAAgB,IAAI,aAAa,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,QAAQ,CAAC,gBAAgB,EAAE,aAAsB,CAAC,CAAC;QACjE,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,MAAM,IAAI,WAAW,CACpB,qBAAqB,gBAAgB,mBAAmB,aAAa,kCAAkC;gBACtG,mDAAmD,CACpD,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,IAAI,WAAW,CACpB,qBAAqB,gBAAgB,4DAA4D,CACjG,CAAC;QACH,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAC9C,CAAC;IAED,sEAAsE;IACtE,2DAA2D;IAC3D,kEAAkE;IAClE,mEAAmE;IACnE,oEAAoE;IACpE,mEAAmE;IACnE,EAAE;IACF,sEAAsE;IACtE,8DAA8D;IAC9D,+DAA+D;IAC/D,yBAAyB;IACzB,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;IAC1C,IAAI,YAAY,EAAE,CAAC;QAClB,KAAK,MAAM,QAAQ,IAAI,iBAAiB,EAAE,CAAC;YAC1C,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,CAAC,MAAM;gBAAE,SAAS;YAEtB,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;YACzC,IAAI,CAAC,OAAO;gBAAE,SAAS;YAEvB,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,OAAgB,CAAC,CAAC;YACnD,IAAI,CAAC,KAAK;gBAAE,SAAS;YAErB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC1C,CAAC;IACF,CAAC;IAED,MAAM,IAAI,WAAW,CACpB,0FAA0F;QACzF,yFAAyF;QACzF,wGAAwG;QACxG,uDAAuD,CACxD,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAS,kBAAkB,CAAC,GAAsB,EAAE,WAAmB;IACtE,MAAM,gBAAgB,GAAG,GAAG,CAAC,iBAA8C,CAAC;IAC5E,MAAM,aAAa,GAAG,GAAG,CAAC,cAAc,CAAC;IACzC,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,uBAAuB,IAAI,kBAAkB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAE1F,8DAA8D;IAC9D,6DAA6D;IAC7D,oEAAoE;IACpE,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE,yBAAyB,CAA8B,CAAC;QAC1F,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC3B,MAAM,KAAK,GAAkB;YAC5B,GAAG,QAAQ;YACX,EAAE,EAAE,cAAc;YAClB,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,SAAS;YAClB,iEAAiE;YACjE,8DAA8D;YAC9D,6DAA6D;YAC7D,yCAAyC;YACzC,QAAQ,EAAE,UAAuC;YACjD,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;SAC1D,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACxD,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,IAAI,cAAc,CAAC,gBAAgB,CAAC,CAAC;IAClE,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,SAAS,GAAG,QAAQ,CAAC,gBAAgB,EAAE,OAAgB,CAA8B,CAAC;IAC5F,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,YAAY,GAAkB,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IACzE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AACtE,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,uBAAuB,CAAC,IAA0D;IAC1F,iEAAiE;IACjE,iEAAiE;IACjE,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE,yBAAyB,CAA8B,CAAC;IAC1F,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,KAAK,GAAkB;QAC5B,GAAG,QAAQ;QACX,EAAE,EAAE,IAAI,CAAC,OAAO;QAChB,IAAI,EAAE,IAAI,CAAC,OAAO;QAClB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACzC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;KAC1D,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAC3D,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,QAAuB,EAAE,MAAc;IAC/D,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,OAAgB,CAA8B,CAAC;IAChF,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC1C,CAAC;AAED,SAAS,YAAY,CAAC,KAA+C;IACpE,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,oFAAoF;IACpF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,aAAa,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -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"}
|