@prestyj/cli 5.2.0 → 5.3.0
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/app-sidecar.js +288 -49
- package/dist/app-sidecar.js.map +1 -1
- package/dist/core/agent-session-queue.test.d.ts +2 -0
- package/dist/core/agent-session-queue.test.d.ts.map +1 -0
- package/dist/core/agent-session-queue.test.js +122 -0
- package/dist/core/agent-session-queue.test.js.map +1 -0
- package/dist/core/agent-session.d.ts +8 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +7 -0
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/autopilot-cycle.d.ts +67 -0
- package/dist/core/autopilot-cycle.d.ts.map +1 -0
- package/dist/core/autopilot-cycle.js +50 -0
- package/dist/core/autopilot-cycle.js.map +1 -0
- package/dist/core/autopilot-cycle.test.d.ts +2 -0
- package/dist/core/autopilot-cycle.test.d.ts.map +1 -0
- package/dist/core/autopilot-cycle.test.js +179 -0
- package/dist/core/autopilot-cycle.test.js.map +1 -0
- package/dist/core/autopilot-gate.d.ts +83 -0
- package/dist/core/autopilot-gate.d.ts.map +1 -0
- package/dist/core/autopilot-gate.js +96 -0
- package/dist/core/autopilot-gate.js.map +1 -0
- package/dist/core/autopilot-gate.test.d.ts +2 -0
- package/dist/core/autopilot-gate.test.d.ts.map +1 -0
- package/dist/core/autopilot-gate.test.js +159 -0
- package/dist/core/autopilot-gate.test.js.map +1 -0
- package/dist/core/autopilot-verdict.d.ts +14 -2
- package/dist/core/autopilot-verdict.d.ts.map +1 -1
- package/dist/core/autopilot-verdict.js +19 -2
- package/dist/core/autopilot-verdict.js.map +1 -1
- package/dist/core/autopilot-verdict.test.js +10 -0
- package/dist/core/autopilot-verdict.test.js.map +1 -1
- package/dist/core/json-mode-flag-parity.test.d.ts +2 -0
- package/dist/core/json-mode-flag-parity.test.d.ts.map +1 -0
- package/dist/core/json-mode-flag-parity.test.js +66 -0
- package/dist/core/json-mode-flag-parity.test.js.map +1 -0
- package/dist/core/nolan-context.d.ts +17 -0
- package/dist/core/nolan-context.d.ts.map +1 -1
- package/dist/core/nolan-context.js +47 -6
- package/dist/core/nolan-context.js.map +1 -1
- package/dist/core/nolan-context.test.js +122 -1
- package/dist/core/nolan-context.test.js.map +1 -1
- package/dist/core/nolan-model.d.ts +46 -0
- package/dist/core/nolan-model.d.ts.map +1 -0
- package/dist/core/nolan-model.js +30 -0
- package/dist/core/nolan-model.js.map +1 -0
- package/dist/core/nolan-model.test.d.ts +2 -0
- package/dist/core/nolan-model.test.d.ts.map +1 -0
- package/dist/core/nolan-model.test.js +51 -0
- package/dist/core/nolan-model.test.js.map +1 -0
- package/dist/core/nolan-prompt.d.ts +3 -3
- package/dist/core/nolan-prompt.js +19 -7
- package/dist/core/nolan-prompt.js.map +1 -1
- package/dist/core/nolan-prompt.test.d.ts +2 -0
- package/dist/core/nolan-prompt.test.d.ts.map +1 -0
- package/dist/core/nolan-prompt.test.js +43 -0
- package/dist/core/nolan-prompt.test.js.map +1 -0
- package/dist/core/speed-benchmark.test.js +2 -3
- package/dist/core/speed-benchmark.test.js.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nolan-context.d.ts","sourceRoot":"","sources":["../../src/core/nolan-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,OAAO,EAA2B,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"nolan-context.d.ts","sourceRoot":"","sources":["../../src/core/nolan-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,OAAO,EAA2B,MAAM,aAAa,CAAC;AACpE,OAAO,EAAwB,KAAK,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAErF,6EAA6E;AAC7E,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAa7C;;;8EAG8E;AAC9E,eAAO,MAAM,qBAAqB,oCAAoC,CAAC;AAEvE,MAAM,WAAW,gBAAgB;IAC/B,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,6DAA6D;IAC7D,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;4CAEwC;IACxC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;qFACiF;IACjF,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC;;4EAEwE;IACxE,gBAAgB,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACnD;AAiGD;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,QAOH,CAAC;AAEvC;;mCAEmC;AACnC,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;AAE5E;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,0BAA0B,GAAG,MAAM,CAEpF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAyEhE"}
|
|
@@ -1,9 +1,19 @@
|
|
|
1
|
+
import { matchExpandedCommand } from "./autopilot-gate.js";
|
|
1
2
|
/** How many of the most recent build-session messages to inline verbatim. */
|
|
2
3
|
export const NOLAN_RECENT_MESSAGE_LIMIT = 20;
|
|
3
4
|
/** Marker the compactor prepends to its summary user-message. */
|
|
4
5
|
const COMPACTION_SUMMARY_MARKER = "[Previous conversation summary]";
|
|
5
6
|
/** Max chars of any single message's rendered text in the digest. */
|
|
6
7
|
const MESSAGE_CHAR_CAP = 1500;
|
|
8
|
+
/** Softer cap for the pinned original-request section: the ask under review
|
|
9
|
+
* must never be judged against a mid-sentence truncation, so it gets far more
|
|
10
|
+
* room than a recent-activity line. */
|
|
11
|
+
const ORIGINAL_REQUEST_CAP = 4000;
|
|
12
|
+
/** Label for a user-role message that was actually injected by Autopilot Nolan.
|
|
13
|
+
* Without it, multi-round cycles render Nolan's own fix prompts as `**User:**`
|
|
14
|
+
* and he starts reviewing against his own last prompt instead of the user's
|
|
15
|
+
* original ask. Referenced by the autopilot system prompt — keep in sync. */
|
|
16
|
+
export const INJECTED_PROMPT_LABEL = "**Nolan autopilot (injected):**";
|
|
7
17
|
/** Truncate long text and note how much was dropped. */
|
|
8
18
|
function cap(text, max = MESSAGE_CHAR_CAP) {
|
|
9
19
|
if (text.length <= max)
|
|
@@ -22,10 +32,26 @@ function summarizeToolCall(name, args) {
|
|
|
22
32
|
const arg = typeof primary === "string" ? cap(primary, 80) : "";
|
|
23
33
|
return arg ? `${name}(${arg})` : `${name}()`;
|
|
24
34
|
}
|
|
35
|
+
/** Render one user-role message body with provenance-aware labeling:
|
|
36
|
+
* autopilot-injected prompts and workflow-command expansions are labeled as
|
|
37
|
+
* what they ARE, so Nolan never mistakes either for a user-authored ask. */
|
|
38
|
+
function renderUserText(text, opts) {
|
|
39
|
+
if (!text)
|
|
40
|
+
return null;
|
|
41
|
+
if (opts.injectedPrompts.some((p) => p.trim() === text.trim())) {
|
|
42
|
+
return `${INJECTED_PROMPT_LABEL} ${cap(text)}`;
|
|
43
|
+
}
|
|
44
|
+
const expanded = matchExpandedCommand(text, opts.workflowCommands);
|
|
45
|
+
if (expanded) {
|
|
46
|
+
const head = `**User:** [ran workflow command /${expanded.command.name}]`;
|
|
47
|
+
return expanded.args ? `${head} with instructions: ${cap(expanded.args, 400)}` : head;
|
|
48
|
+
}
|
|
49
|
+
return `**User:** ${cap(text)}`;
|
|
50
|
+
}
|
|
25
51
|
/** Render one message's role-tagged text, stripping image/blob payloads and
|
|
26
52
|
* summarizing tool calls/results to short lines. Returns null for empty/noise
|
|
27
53
|
* messages (e.g. a tool result that was only an image). */
|
|
28
|
-
function renderMessage(msg) {
|
|
54
|
+
function renderMessage(msg, opts) {
|
|
29
55
|
if (msg.role === "user") {
|
|
30
56
|
const text = typeof msg.content === "string"
|
|
31
57
|
? msg.content
|
|
@@ -33,7 +59,7 @@ function renderMessage(msg) {
|
|
|
33
59
|
.map((p) => (p.type === "text" ? p.text : `[${p.type}]`))
|
|
34
60
|
.join(" ")
|
|
35
61
|
.trim();
|
|
36
|
-
return text
|
|
62
|
+
return renderUserText(text, opts);
|
|
37
63
|
}
|
|
38
64
|
if (msg.role === "assistant") {
|
|
39
65
|
if (typeof msg.content === "string") {
|
|
@@ -86,9 +112,12 @@ function renderMessage(msg) {
|
|
|
86
112
|
* the transcript and demands the machine-parseable answer.
|
|
87
113
|
*/
|
|
88
114
|
export const AUTOPILOT_REVIEW_INSTRUCTION = "EZ Coder just finished a turn. Review its work against the user's original " +
|
|
89
|
-
"
|
|
90
|
-
"
|
|
91
|
-
"
|
|
115
|
+
"ask (the 'Original user request' section above; lines labeled 'Nolan " +
|
|
116
|
+
"autopilot (injected)' are your own earlier fix prompts, NOT user asks). " +
|
|
117
|
+
"Reply with your verdict ONLY — the first line must be exactly PROMPT, " +
|
|
118
|
+
"ALL_CLEAR, IGNORE, or HUMAN, with the payload after. If EZ Coder ended by " +
|
|
119
|
+
"asking the user a question or presenting options, the verdict is HUMAN. " +
|
|
120
|
+
"No greetings, no mentorship prose.";
|
|
92
121
|
/**
|
|
93
122
|
* Build the autopilot-review digest: identical to a normal Nolan digest but with
|
|
94
123
|
* the fixed {@link AUTOPILOT_REVIEW_INSTRUCTION} as the trailing question, so
|
|
@@ -120,9 +149,15 @@ export function buildNolanDigest(input) {
|
|
|
120
149
|
}
|
|
121
150
|
// Recent conversation = messages after the summary (or the tail), skipping
|
|
122
151
|
// the system message and the summary message itself.
|
|
152
|
+
const renderOpts = {
|
|
153
|
+
injectedPrompts: input.injectedPrompts ?? [],
|
|
154
|
+
workflowCommands: input.workflowCommands ?? [],
|
|
155
|
+
};
|
|
123
156
|
const afterSummary = input.messages.slice(summaryIndex + 1).filter((m) => m.role !== "system");
|
|
124
157
|
const recent = afterSummary.slice(-recentLimit);
|
|
125
|
-
const renderedRecent = recent
|
|
158
|
+
const renderedRecent = recent
|
|
159
|
+
.map((m) => renderMessage(m, renderOpts))
|
|
160
|
+
.filter((l) => l !== null);
|
|
126
161
|
const sections = [];
|
|
127
162
|
sections.push(`## Who you are\nYou are Nolan Grout, mentoring the user inside EZ Coder. Your persona is in your system prompt. Below is what EZ Coder and the user are working on.`);
|
|
128
163
|
const building = [];
|
|
@@ -133,6 +168,12 @@ export function buildNolanDigest(input) {
|
|
|
133
168
|
if (summaryText) {
|
|
134
169
|
sections.push(`## Story so far\n${cap(summaryText, 4000)}`);
|
|
135
170
|
}
|
|
171
|
+
// Pinned so multi-round autopilot cycles can never lose the ask under review
|
|
172
|
+
// to the rolling recent-activity window (the drift that made Nolan judge his
|
|
173
|
+
// own injected prompt as "the user's request").
|
|
174
|
+
if (input.originalRequest?.trim()) {
|
|
175
|
+
sections.push(`## Original user request (the turn under review)\n${cap(input.originalRequest.trim(), ORIGINAL_REQUEST_CAP)}`);
|
|
176
|
+
}
|
|
136
177
|
sections.push(`## Recent activity (EZ Coder and user)\n${renderedRecent.length > 0 ? renderedRecent.join("\n\n") : "(no conversation yet)"}`);
|
|
137
178
|
sections.push(`## They just asked you\n${input.question.trim()}`);
|
|
138
179
|
return sections.join("\n\n");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nolan-context.js","sourceRoot":"","sources":["../../src/core/nolan-context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"nolan-context.js","sourceRoot":"","sources":["../../src/core/nolan-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { describe, it, expect } from "vitest";
|
|
2
2
|
import os from "node:os";
|
|
3
|
-
import { buildNolanDigest, buildNolanAutopilotContext, AUTOPILOT_REVIEW_INSTRUCTION, NOLAN_RECENT_MESSAGE_LIMIT, } from "./nolan-context.js";
|
|
3
|
+
import { buildNolanDigest, buildNolanAutopilotContext, AUTOPILOT_REVIEW_INSTRUCTION, NOLAN_RECENT_MESSAGE_LIMIT, INJECTED_PROMPT_LABEL, } from "./nolan-context.js";
|
|
4
|
+
import { USER_INSTRUCTIONS_HEADER } from "./autopilot-gate.js";
|
|
5
|
+
import { PROMPT_COMMANDS } from "./prompt-commands.js";
|
|
4
6
|
import { createTools } from "../tools/index.js";
|
|
5
7
|
// Mirror the sidecar's Nolan allow-list so the filter test tracks the real set.
|
|
6
8
|
const NOLAN_ALLOWED_TOOLS = [
|
|
@@ -122,6 +124,14 @@ describe("buildNolanDigest", () => {
|
|
|
122
124
|
expect(digest).toContain("ALL_CLEAR");
|
|
123
125
|
expect(digest).toContain("HUMAN");
|
|
124
126
|
});
|
|
127
|
+
it("autopilot review instruction covers the ask-the-user and injected-prompt rules", () => {
|
|
128
|
+
// EZ Coder ending with a question/options must resolve to HUMAN, and Nolan
|
|
129
|
+
// must be told injected lines are his own — these are leak regressions.
|
|
130
|
+
expect(AUTOPILOT_REVIEW_INSTRUCTION).toContain("asking the user a question");
|
|
131
|
+
expect(AUTOPILOT_REVIEW_INSTRUCTION).toContain("HUMAN");
|
|
132
|
+
expect(AUTOPILOT_REVIEW_INSTRUCTION).toContain("Original user request");
|
|
133
|
+
expect(AUTOPILOT_REVIEW_INSTRUCTION).toContain("Nolan autopilot (injected)");
|
|
134
|
+
});
|
|
125
135
|
it("uses the latest compaction summary as the story-so-far base", () => {
|
|
126
136
|
const messages = [
|
|
127
137
|
{ role: "user", content: "old turn that should be summarized away" },
|
|
@@ -137,4 +147,115 @@ describe("buildNolanDigest", () => {
|
|
|
137
147
|
expect(digest).toContain("Added the header.");
|
|
138
148
|
});
|
|
139
149
|
});
|
|
150
|
+
describe("buildNolanDigest — original request pinning", () => {
|
|
151
|
+
const base = {
|
|
152
|
+
question: "review it",
|
|
153
|
+
projectContext: [],
|
|
154
|
+
cwd: "/tmp/proj",
|
|
155
|
+
gitBranch: "main",
|
|
156
|
+
platform: "darwin",
|
|
157
|
+
};
|
|
158
|
+
it("pins the original request in its own section", () => {
|
|
159
|
+
const digest = buildNolanDigest({
|
|
160
|
+
...base,
|
|
161
|
+
messages: [],
|
|
162
|
+
originalRequest: "build a login form with validation",
|
|
163
|
+
});
|
|
164
|
+
expect(digest).toContain("## Original user request (the turn under review)");
|
|
165
|
+
expect(digest).toContain("build a login form with validation");
|
|
166
|
+
});
|
|
167
|
+
it("keeps the original request even when it scrolled out of recent activity", () => {
|
|
168
|
+
// The drift bug: multi-round cycles push the real ask out of the rolling
|
|
169
|
+
// 20-message window. The pinned section must survive that.
|
|
170
|
+
const messages = [{ role: "user", content: "THE-REAL-ASK: add dark mode" }];
|
|
171
|
+
for (let i = 0; i < NOLAN_RECENT_MESSAGE_LIMIT + 5; i++) {
|
|
172
|
+
messages.push({ role: "assistant", content: `working… step ${i}` });
|
|
173
|
+
}
|
|
174
|
+
const digest = buildNolanDigest({
|
|
175
|
+
...base,
|
|
176
|
+
messages,
|
|
177
|
+
originalRequest: "THE-REAL-ASK: add dark mode",
|
|
178
|
+
});
|
|
179
|
+
// Scrolled out of recent activity…
|
|
180
|
+
expect(digest.split("## Original user request")[0]).not.toContain("THE-REAL-ASK");
|
|
181
|
+
// …but pinned in its own section.
|
|
182
|
+
expect(digest.split("## Original user request")[1]).toContain("THE-REAL-ASK: add dark mode");
|
|
183
|
+
});
|
|
184
|
+
it("gives the pinned request far more room than a recent-activity line", () => {
|
|
185
|
+
// Recent-activity lines truncate at 1500 chars; the ask under review must
|
|
186
|
+
// not be judged against a mid-sentence cut, so its cap is 4000.
|
|
187
|
+
const longAsk = "requirement " + "x".repeat(3000);
|
|
188
|
+
const digest = buildNolanDigest({ ...base, messages: [], originalRequest: longAsk });
|
|
189
|
+
const pinned = digest.split("## Original user request")[1];
|
|
190
|
+
expect(pinned).toContain("x".repeat(3000));
|
|
191
|
+
});
|
|
192
|
+
it("omits the section when there is no original request (chat Nolan)", () => {
|
|
193
|
+
const digest = buildNolanDigest({ ...base, messages: [] });
|
|
194
|
+
expect(digest).not.toContain("## Original user request");
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
describe("buildNolanDigest — injected-prompt labeling", () => {
|
|
198
|
+
const base = {
|
|
199
|
+
question: "review it",
|
|
200
|
+
projectContext: [],
|
|
201
|
+
cwd: "/tmp/proj",
|
|
202
|
+
gitBranch: null,
|
|
203
|
+
platform: "darwin",
|
|
204
|
+
};
|
|
205
|
+
it("labels autopilot-injected prompts as Nolan's, never **User:**", () => {
|
|
206
|
+
const injected = "Fix the failing auth test and prove it by running it.";
|
|
207
|
+
const messages = [
|
|
208
|
+
{ role: "user", content: "add auth" },
|
|
209
|
+
{ role: "assistant", content: "Added auth." },
|
|
210
|
+
{ role: "user", content: injected },
|
|
211
|
+
{ role: "assistant", content: "Fixed the test." },
|
|
212
|
+
];
|
|
213
|
+
const digest = buildNolanDigest({ ...base, messages, injectedPrompts: [injected] });
|
|
214
|
+
expect(digest).toContain(`${INJECTED_PROMPT_LABEL} ${injected}`);
|
|
215
|
+
expect(digest).not.toContain(`**User:** ${injected}`);
|
|
216
|
+
// Real user asks keep the normal label.
|
|
217
|
+
expect(digest).toContain("**User:** add auth");
|
|
218
|
+
});
|
|
219
|
+
it("matches injected prompts through whitespace drift", () => {
|
|
220
|
+
const injected = "Fix the failing test.";
|
|
221
|
+
const messages = [{ role: "user", content: ` ${injected} ` }];
|
|
222
|
+
const digest = buildNolanDigest({ ...base, messages, injectedPrompts: [injected] });
|
|
223
|
+
expect(digest).toContain(INJECTED_PROMPT_LABEL);
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
describe("buildNolanDigest — workflow-command labeling", () => {
|
|
227
|
+
const base = {
|
|
228
|
+
question: "review it",
|
|
229
|
+
projectContext: [],
|
|
230
|
+
cwd: "/tmp/proj",
|
|
231
|
+
gitBranch: null,
|
|
232
|
+
platform: "darwin",
|
|
233
|
+
};
|
|
234
|
+
const compare = PROMPT_COMMANDS.find((c) => c.name === "compare");
|
|
235
|
+
it("renders an expanded template as a short command note, not a user ask", () => {
|
|
236
|
+
// AgentSession.prompt() stores the EXPANDED template as a plain user
|
|
237
|
+
// message; the digest must not present 400 template lines as **User:**.
|
|
238
|
+
const messages = [
|
|
239
|
+
{ role: "user", content: compare.prompt },
|
|
240
|
+
{ role: "assistant", content: "Compared against 12 repos, all aligned." },
|
|
241
|
+
];
|
|
242
|
+
const digest = buildNolanDigest({ ...base, messages, workflowCommands: PROMPT_COMMANDS });
|
|
243
|
+
expect(digest).toContain("**User:** [ran workflow command /compare]");
|
|
244
|
+
// The template body itself never leaks into the digest.
|
|
245
|
+
expect(digest).not.toContain("Compare the code you just created or modified");
|
|
246
|
+
});
|
|
247
|
+
it("keeps the user's own args from an expanded command", () => {
|
|
248
|
+
const messages = [
|
|
249
|
+
{ role: "user", content: `${compare.prompt}${USER_INSTRUCTIONS_HEADER}only src/auth.ts` },
|
|
250
|
+
];
|
|
251
|
+
const digest = buildNolanDigest({ ...base, messages, workflowCommands: PROMPT_COMMANDS });
|
|
252
|
+
expect(digest).toContain("[ran workflow command /compare]");
|
|
253
|
+
expect(digest).toContain("only src/auth.ts");
|
|
254
|
+
});
|
|
255
|
+
it("leaves ordinary user text untouched when specs are provided", () => {
|
|
256
|
+
const messages = [{ role: "user", content: "please compare my two branches" }];
|
|
257
|
+
const digest = buildNolanDigest({ ...base, messages, workflowCommands: PROMPT_COMMANDS });
|
|
258
|
+
expect(digest).toContain("**User:** please compare my two branches");
|
|
259
|
+
});
|
|
260
|
+
});
|
|
140
261
|
//# sourceMappingURL=nolan-context.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nolan-context.test.js","sourceRoot":"","sources":["../../src/core/nolan-context.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"nolan-context.test.js","sourceRoot":"","sources":["../../src/core/nolan-context.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nolan's model selection — pure decision logic.
|
|
3
|
+
*
|
|
4
|
+
* Nolan (chat mentor + autopilot reviewer) historically always adopted GG
|
|
5
|
+
* Coder's model. Now each project can pin Nolan to his OWN model:
|
|
6
|
+
*
|
|
7
|
+
* - No override set → Nolan follows EZ Coder's model (including live switches).
|
|
8
|
+
* - Override set → Nolan uses it; EZ Coder model switches no longer touch him.
|
|
9
|
+
*
|
|
10
|
+
* The sidecar persists the override per project (ezcoder-app.json `nolanModels`) and
|
|
11
|
+
* wires the live sessions; this module owns validation + resolution so both
|
|
12
|
+
* are unit-testable without booting the sidecar.
|
|
13
|
+
*/
|
|
14
|
+
import type { Provider } from "@prestyj/ai";
|
|
15
|
+
/** A pinned Nolan model choice: provider + model id. */
|
|
16
|
+
export interface NolanModelPref {
|
|
17
|
+
provider: Provider;
|
|
18
|
+
model: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Validate a persisted (or requested) override before applying it. A stale
|
|
22
|
+
* entry — model gone from the registry, or its provider no longer connected —
|
|
23
|
+
* silently resolves to null so Nolan falls back to following EZ Coder instead
|
|
24
|
+
* of erroring on every turn.
|
|
25
|
+
*/
|
|
26
|
+
export declare function validateNolanModelPref(pref: NolanModelPref | null | undefined, opts: {
|
|
27
|
+
modelExists: (id: string) => boolean;
|
|
28
|
+
providerConnected: (p: Provider) => boolean;
|
|
29
|
+
}): NolanModelPref | null;
|
|
30
|
+
/** What the footer needs to render `Nolan <model>`: the model Nolan will actually
|
|
31
|
+
* use next turn, plus whether that's a pin or just following EZ Coder. */
|
|
32
|
+
export interface EffectiveNolanModel {
|
|
33
|
+
nolanProvider: Provider;
|
|
34
|
+
nolanModel: string;
|
|
35
|
+
/** True when a user-set override is active (not following EZ Coder). */
|
|
36
|
+
nolanModelOverride: boolean;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Resolve the model Nolan uses right now: the override when set, otherwise the
|
|
40
|
+
* build session's current model.
|
|
41
|
+
*/
|
|
42
|
+
export declare function effectiveNolanModel(override: NolanModelPref | null, build: {
|
|
43
|
+
provider: Provider;
|
|
44
|
+
model: string;
|
|
45
|
+
}): EffectiveNolanModel;
|
|
46
|
+
//# sourceMappingURL=nolan-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nolan-model.d.ts","sourceRoot":"","sources":["../../src/core/nolan-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,wDAAwD;AACxD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,EACvC,IAAI,EAAE;IAAE,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC;IAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,OAAO,CAAA;CAAE,GAC1F,cAAc,GAAG,IAAI,CAKvB;AAED;2EAC2E;AAC3E,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,QAAQ,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,cAAc,GAAG,IAAI,EAC/B,KAAK,EAAE;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC3C,mBAAmB,CASrB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate a persisted (or requested) override before applying it. A stale
|
|
3
|
+
* entry — model gone from the registry, or its provider no longer connected —
|
|
4
|
+
* silently resolves to null so Nolan falls back to following EZ Coder instead
|
|
5
|
+
* of erroring on every turn.
|
|
6
|
+
*/
|
|
7
|
+
export function validateNolanModelPref(pref, opts) {
|
|
8
|
+
if (!pref || !pref.model || !pref.provider)
|
|
9
|
+
return null;
|
|
10
|
+
if (!opts.modelExists(pref.model))
|
|
11
|
+
return null;
|
|
12
|
+
if (!opts.providerConnected(pref.provider))
|
|
13
|
+
return null;
|
|
14
|
+
return pref;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Resolve the model Nolan uses right now: the override when set, otherwise the
|
|
18
|
+
* build session's current model.
|
|
19
|
+
*/
|
|
20
|
+
export function effectiveNolanModel(override, build) {
|
|
21
|
+
if (override) {
|
|
22
|
+
return {
|
|
23
|
+
nolanProvider: override.provider,
|
|
24
|
+
nolanModel: override.model,
|
|
25
|
+
nolanModelOverride: true,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
return { nolanProvider: build.provider, nolanModel: build.model, nolanModelOverride: false };
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=nolan-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nolan-model.js","sourceRoot":"","sources":["../../src/core/nolan-model.ts"],"names":[],"mappings":"AAqBA;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAAuC,EACvC,IAA2F;IAE3F,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IACxD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACxD,OAAO,IAAI,CAAC;AACd,CAAC;AAWD;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAA+B,EAC/B,KAA4C;IAE5C,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO;YACL,aAAa,EAAE,QAAQ,CAAC,QAAQ;YAChC,UAAU,EAAE,QAAQ,CAAC,KAAK;YAC1B,kBAAkB,EAAE,IAAI;SACzB,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC;AAC/F,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nolan-model.test.d.ts","sourceRoot":"","sources":["../../src/core/nolan-model.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { validateNolanModelPref, effectiveNolanModel } from "./nolan-model.js";
|
|
3
|
+
const REGISTRY = new Set(["claude-opus-5", "gpt-5.5", "kimi-k2.7-code"]);
|
|
4
|
+
const CONNECTED = new Set(["anthropic", "openai"]);
|
|
5
|
+
const opts = {
|
|
6
|
+
modelExists: (id) => REGISTRY.has(id),
|
|
7
|
+
providerConnected: (p) => CONNECTED.has(p),
|
|
8
|
+
};
|
|
9
|
+
describe("validateNolanModelPref", () => {
|
|
10
|
+
it("passes a valid pref through", () => {
|
|
11
|
+
const pref = { provider: "openai", model: "gpt-5.5" };
|
|
12
|
+
expect(validateNolanModelPref(pref, opts)).toEqual(pref);
|
|
13
|
+
});
|
|
14
|
+
it("nulls when the model left the registry (stale persisted pin)", () => {
|
|
15
|
+
expect(validateNolanModelPref({ provider: "openai", model: "gpt-4-turbo" }, opts)).toBeNull();
|
|
16
|
+
});
|
|
17
|
+
it("nulls when the provider is no longer connected (logged out)", () => {
|
|
18
|
+
expect(validateNolanModelPref({ provider: "moonshot", model: "kimi-k2.7-code" }, opts)).toBeNull();
|
|
19
|
+
});
|
|
20
|
+
it("nulls absent / malformed prefs", () => {
|
|
21
|
+
expect(validateNolanModelPref(null, opts)).toBeNull();
|
|
22
|
+
expect(validateNolanModelPref(undefined, opts)).toBeNull();
|
|
23
|
+
expect(validateNolanModelPref({ provider: "openai", model: "" }, opts)).toBeNull();
|
|
24
|
+
expect(validateNolanModelPref({ provider: "", model: "gpt-5.5" }, opts)).toBeNull();
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
describe("effectiveNolanModel", () => {
|
|
28
|
+
const build = { provider: "anthropic", model: "claude-opus-5" };
|
|
29
|
+
it("follows the build session when no override is set", () => {
|
|
30
|
+
expect(effectiveNolanModel(null, build)).toEqual({
|
|
31
|
+
nolanProvider: "anthropic",
|
|
32
|
+
nolanModel: "claude-opus-5",
|
|
33
|
+
nolanModelOverride: false,
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
it("uses the pin when set, ignoring the build model", () => {
|
|
37
|
+
expect(effectiveNolanModel({ provider: "openai", model: "gpt-5.5" }, build)).toEqual({
|
|
38
|
+
nolanProvider: "openai",
|
|
39
|
+
nolanModel: "gpt-5.5",
|
|
40
|
+
nolanModelOverride: true,
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
it("pin identical to the build model still reports override=true (it survives GG switches)", () => {
|
|
44
|
+
expect(effectiveNolanModel({ provider: "anthropic", model: "claude-opus-5" }, build)).toEqual({
|
|
45
|
+
nolanProvider: "anthropic",
|
|
46
|
+
nolanModel: "claude-opus-5",
|
|
47
|
+
nolanModelOverride: true,
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=nolan-model.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nolan-model.test.js","sourceRoot":"","sources":["../../src/core/nolan-model.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,9 +25,9 @@ export declare function buildNolanSystemPrompt(): string;
|
|
|
25
25
|
/**
|
|
26
26
|
* Build Autopilot Nolan's system prompt — a separate, non-chatty mode of the same
|
|
27
27
|
* Nolan. He never talks to the user here; he auto-reviews EZ Coder's work and
|
|
28
|
-
* replies with one of
|
|
29
|
-
* HUMAN). Reuses the shared judgment bar (identity, skepticism, taste,
|
|
30
|
-
* discipline) so his standards are identical to chat Nolan, but swaps the
|
|
28
|
+
* replies with one of four machine-parseable verdicts (PROMPT / ALL_CLEAR /
|
|
29
|
+
* IGNORE / HUMAN). Reuses the shared judgment bar (identity, skepticism, taste,
|
|
30
|
+
* method, discipline) so his standards are identical to chat Nolan, but swaps the
|
|
31
31
|
* user-facing output contract for the verdict format and drops the chat-voice
|
|
32
32
|
* sections to save tokens.
|
|
33
33
|
*/
|
|
@@ -55,9 +55,9 @@ export function buildNolanSystemPrompt() {
|
|
|
55
55
|
/**
|
|
56
56
|
* Build Autopilot Nolan's system prompt — a separate, non-chatty mode of the same
|
|
57
57
|
* Nolan. He never talks to the user here; he auto-reviews EZ Coder's work and
|
|
58
|
-
* replies with one of
|
|
59
|
-
* HUMAN). Reuses the shared judgment bar (identity, skepticism, taste,
|
|
60
|
-
* discipline) so his standards are identical to chat Nolan, but swaps the
|
|
58
|
+
* replies with one of four machine-parseable verdicts (PROMPT / ALL_CLEAR /
|
|
59
|
+
* IGNORE / HUMAN). Reuses the shared judgment bar (identity, skepticism, taste,
|
|
60
|
+
* method, discipline) so his standards are identical to chat Nolan, but swaps the
|
|
61
61
|
* user-facing output contract for the verdict format and drops the chat-voice
|
|
62
62
|
* sections to save tokens.
|
|
63
63
|
*/
|
|
@@ -175,18 +175,30 @@ function renderAutopilotContract() {
|
|
|
175
175
|
`PROMPT\n<a runnable EZ Coder prompt, 1-3 lines, terminology-correct, says what ` +
|
|
176
176
|
`to do and why>\n\n` +
|
|
177
177
|
`ALL_CLEAR\n\n` +
|
|
178
|
+
`IGNORE\n\n` +
|
|
178
179
|
`HUMAN\n<one short line: why a human decision is needed>\n\n` +
|
|
179
180
|
`Rules:\n` +
|
|
180
|
-
`-
|
|
181
|
-
`
|
|
182
|
-
`
|
|
181
|
+
`- IGNORE first: was this turn even real work? Small talk ("hi", "thanks", ` +
|
|
182
|
+
`"nice"), a plain question that got answered with no code touched, an ack, or a ` +
|
|
183
|
+
`mechanical operation with no code changes to judge (git commit/push, a status ` +
|
|
184
|
+
`check, a read-only lookup, formatting-only/lint-fix output) — IGNORE. There is ` +
|
|
185
|
+
`nothing to review, so say nothing. Do not use ALL_CLEAR for this; ALL_CLEAR ` +
|
|
186
|
+
`implies you reviewed real work and it checks out.\n` +
|
|
187
|
+
`- Otherwise default hard to ALL_CLEAR. EZ Coder's work is done unless something ` +
|
|
188
|
+
`is genuinely broken or missing versus the user's ORIGINAL ask (the 'Original ` +
|
|
189
|
+
`user request' section of your context — never a later injected prompt). Taste ` +
|
|
190
|
+
`nitpicks and "could be nicer" improvements are NOT blockers — ship it.\n` +
|
|
183
191
|
`- PROMPT only when something real is wrong or unfinished: a failing/absent ` +
|
|
184
192
|
`test, a broken build, a requirement from the original ask left undone, an ` +
|
|
185
193
|
`obvious bug. The prompt body should tell EZ Coder to fix it AND prove it ` +
|
|
186
194
|
`(run the test, screenshot the UI) — you can't run anything yourself.\n` +
|
|
187
195
|
`- HUMAN only when a real decision needs the user: an ambiguous requirement, a ` +
|
|
188
196
|
`destructive tradeoff, or missing information you cannot verify with your ` +
|
|
189
|
-
`read-only tools
|
|
197
|
+
`read-only tools. HUMAN also whenever EZ Coder ended its turn by asking the ` +
|
|
198
|
+
`user a question, presenting options (A/B/C choices, "want me to…"), or ` +
|
|
199
|
+
`submitting a plan for approval — never answer on the user's behalf.\n` +
|
|
200
|
+
`- Transcript lines labeled "Nolan autopilot (injected)" are YOUR own earlier ` +
|
|
201
|
+
`fix prompts, not user asks. Judge only against the original user request.\n` +
|
|
190
202
|
`- You are read-only. Use read/grep/find/ls/web/kencode-search ONLY when a fact ` +
|
|
191
203
|
`is truly in doubt; otherwise judge from the transcript and answer. Every wasted ` +
|
|
192
204
|
`tool call costs tokens.\n` +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nolan-prompt.js","sourceRoot":"","sources":["../../src/core/nolan-prompt.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"nolan-prompt.js","sourceRoot":"","sources":["../../src/core/nolan-prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nolan-prompt.test.d.ts","sourceRoot":"","sources":["../../src/core/nolan-prompt.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { buildNolanSystemPrompt, buildNolanAutopilotSystemPrompt } from "./nolan-prompt.js";
|
|
3
|
+
import { INJECTED_PROMPT_LABEL } from "./nolan-context.js";
|
|
4
|
+
describe("buildNolanAutopilotSystemPrompt — verdict contract", () => {
|
|
5
|
+
const prompt = buildNolanAutopilotSystemPrompt();
|
|
6
|
+
it("teaches all four verdict keywords", () => {
|
|
7
|
+
for (const keyword of ["PROMPT", "ALL_CLEAR", "IGNORE", "HUMAN"]) {
|
|
8
|
+
expect(prompt).toContain(keyword);
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
it("routes end-of-turn questions/options/plans to HUMAN, never PROMPT", () => {
|
|
12
|
+
// Leak regression: without this rule, EZ Coder ending with "want me to…?"
|
|
13
|
+
// or an A/B/C menu reads as "unfinished" and Nolan answers for the user.
|
|
14
|
+
expect(prompt).toContain("asking the ");
|
|
15
|
+
expect(prompt).toContain("presenting options");
|
|
16
|
+
expect(prompt).toContain("never answer on the user's behalf");
|
|
17
|
+
expect(prompt).toContain("submitting a plan for approval");
|
|
18
|
+
});
|
|
19
|
+
it("tells Nolan injected transcript lines are his own, not user asks", () => {
|
|
20
|
+
expect(prompt).toContain("Nolan autopilot (injected)");
|
|
21
|
+
expect(prompt).toContain("Judge only against the original user request");
|
|
22
|
+
});
|
|
23
|
+
it("anchors ALL_CLEAR judgment to the pinned Original user request section", () => {
|
|
24
|
+
expect(prompt).toContain("Original ");
|
|
25
|
+
expect(prompt).toContain("user request' section");
|
|
26
|
+
expect(prompt).toContain("never a later injected prompt");
|
|
27
|
+
});
|
|
28
|
+
it("keeps the injected label byte-identical to the digest renderer's", () => {
|
|
29
|
+
// The system prompt names the label in prose; the digest emits it. If the
|
|
30
|
+
// label constant drifts, the prompt's rule points at nothing.
|
|
31
|
+
expect(INJECTED_PROMPT_LABEL).toContain("Nolan autopilot (injected)");
|
|
32
|
+
expect(prompt).toContain("Nolan autopilot (injected)");
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
describe("buildNolanSystemPrompt — chat mode unaffected", () => {
|
|
36
|
+
it("keeps the chat output contract (prompt fence) and no verdict keywords", () => {
|
|
37
|
+
const prompt = buildNolanSystemPrompt();
|
|
38
|
+
expect(prompt).toContain("Send to EZ Coder");
|
|
39
|
+
// The verdict contract is autopilot-only.
|
|
40
|
+
expect(prompt).not.toContain("ALL_CLEAR");
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=nolan-prompt.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nolan-prompt.test.js","sourceRoot":"","sources":["../../src/core/nolan-prompt.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,+BAA+B,EAAE,MAAM,mBAAmB,CAAC;AAC5F,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,QAAQ,CAAC,oDAAoD,EAAE,GAAG,EAAE;IAClE,MAAM,MAAM,GAAG,+BAA+B,EAAE,CAAC;IAEjD,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,KAAK,MAAM,OAAO,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;YACjE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,0EAA0E;QAC1E,yEAAyE;QACzE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,8CAA8C,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,0EAA0E;QAC1E,8DAA8D;QAC9D,MAAM,CAAC,qBAAqB,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACtE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,+CAA+C,EAAE,GAAG,EAAE;IAC7D,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,MAAM,MAAM,GAAG,sBAAsB,EAAE,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC7C,0CAA0C;QAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|