@protolabsai/proto 0.26.9 → 0.26.12
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/README.md +21 -8
- package/cli.js +473 -157
- package/locales/en.js +272 -142
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -9,14 +9,27 @@ proto is a fork of [Qwen Code](https://github.com/QwenLM/qwen-code) (itself fork
|
|
|
9
9
|
|
|
10
10
|
## What's Different
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
|
15
|
-
|
|
|
16
|
-
|
|
|
17
|
-
|
|
|
18
|
-
|
|
|
19
|
-
|
|
|
12
|
+
At-a-glance overview vs. upstream Qwen Code. For the full architectural breakdown see [`docs/architecture/divergence-from-upstream.md`](./docs/architecture/divergence-from-upstream.md).
|
|
13
|
+
|
|
14
|
+
| Category | Qwen Code | proto |
|
|
15
|
+
| --------------------- | ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
16
|
+
| Default model | Qwen3-Coder | Any (LiteLLM / OpenAI-compat / Anthropic / Gemini) |
|
|
17
|
+
| Agent harness | — | Sprint contracts + scope lock, behavior-verify gate, multi-sample selector, doom-loop reminders, session memory + evolve, checkpoint/rewind, speculation |
|
|
18
|
+
| Bundled skills | 0 (use external) | 22 (sprint-contract, verification-before-completion, systematic-debugging, …) |
|
|
19
|
+
| Subagent execution | Sequential | Concurrent batched — Agent calls run in parallel; tool ordering preserved |
|
|
20
|
+
| Tool-call streaming | Per-converter parser | Per-stream parser context (no cross-stream corruption); malformed JSON → UI-hidden recovery note |
|
|
21
|
+
| Reasoning models | Basic `reasoning_content` | Inline `<think>`-tag extraction (Minimax/QwQ); reasoning-only `content: ""` fix; preserved on session resume |
|
|
22
|
+
| Truncation handling | Best-effort | MAX_TOKENS cascade detection + tool-response trimming; rejected truncated edits |
|
|
23
|
+
| Task management | In-memory JSON | [beads_rust](https://github.com/Dicklesworthstone/beads_rust) (SQLite + JSONL) |
|
|
24
|
+
| Memory | Single append-only file | File-per-memory with YAML frontmatter, 4-type taxonomy, auto-extraction |
|
|
25
|
+
| MCP servers | None | Configurable via `~/.proto/settings.json`; SSE/HTTP/stdio in ACP mode |
|
|
26
|
+
| Plugin discovery | Qwen only | Auto-discovers Claude Code plugins from `~/.claude/plugins/` |
|
|
27
|
+
| Ignore files | `.qwenignore` | `.protoignore` + inherits `.claudeignore` patterns |
|
|
28
|
+
| ACP / Zed integration | Stock | Cron-in-Session, concurrent Agent calls, SSE/HTTP MCP, internal-part filtering |
|
|
29
|
+
| Extra built-in tools | Standard set | + browser automation, repo-map (PageRank), task tools, mailbox, LSP, voice/STT |
|
|
30
|
+
| Observability | Console | Langfuse OTLP traces with harness-intervention spans (SFT-ready) |
|
|
31
|
+
| Release pipeline | Manual | Conventional-commit auto-release (`feat:` → minor, `fix:` → patch) |
|
|
32
|
+
| VS Code companion | Included | Removed (focus on TUI + ACP/Zed) |
|
|
20
33
|
|
|
21
34
|
## Installation
|
|
22
35
|
|
package/cli.js
CHANGED
|
@@ -171128,7 +171128,7 @@ __export(geminiContentGenerator_exports, {
|
|
|
171128
171128
|
createGeminiContentGenerator: () => createGeminiContentGenerator
|
|
171129
171129
|
});
|
|
171130
171130
|
function createGeminiContentGenerator(config2, gcConfig) {
|
|
171131
|
-
const version2 = "0.26.
|
|
171131
|
+
const version2 = "0.26.12";
|
|
171132
171132
|
const userAgent2 = config2.userAgent || `QwenCode/${version2} (${process.platform}; ${process.arch})`;
|
|
171133
171133
|
const baseHeaders = {
|
|
171134
171134
|
"User-Agent": userAgent2
|
|
@@ -208042,14 +208042,14 @@ function statusTask(customArgs) {
|
|
|
208042
208042
|
}
|
|
208043
208043
|
};
|
|
208044
208044
|
}
|
|
208045
|
-
function versionResponse(major2 = 0, minor = 0, patch = 0, agent = "",
|
|
208045
|
+
function versionResponse(major2 = 0, minor = 0, patch = 0, agent = "", installed2 = true) {
|
|
208046
208046
|
return Object.defineProperty(
|
|
208047
208047
|
{
|
|
208048
208048
|
major: major2,
|
|
208049
208049
|
minor,
|
|
208050
208050
|
patch,
|
|
208051
208051
|
agent,
|
|
208052
|
-
installed
|
|
208052
|
+
installed: installed2
|
|
208053
208053
|
},
|
|
208054
208054
|
"toString",
|
|
208055
208055
|
{
|
|
@@ -264132,8 +264132,8 @@ var require_src37 = __commonJS({
|
|
|
264132
264132
|
"node_modules/sisteransi/src/index.js"(exports2, module2) {
|
|
264133
264133
|
"use strict";
|
|
264134
264134
|
init_esbuild_shims();
|
|
264135
|
-
var
|
|
264136
|
-
var CSI = `${
|
|
264135
|
+
var ESC5 = "\x1B";
|
|
264136
|
+
var CSI = `${ESC5}[`;
|
|
264137
264137
|
var beep2 = "\x07";
|
|
264138
264138
|
var cursor = {
|
|
264139
264139
|
to(x3, y2) {
|
|
@@ -264157,8 +264157,8 @@ var require_src37 = __commonJS({
|
|
|
264157
264157
|
left: `${CSI}G`,
|
|
264158
264158
|
hide: `${CSI}?25l`,
|
|
264159
264159
|
show: `${CSI}?25h`,
|
|
264160
|
-
save: `${
|
|
264161
|
-
restore: `${
|
|
264160
|
+
save: `${ESC5}7`,
|
|
264161
|
+
restore: `${ESC5}8`
|
|
264162
264162
|
};
|
|
264163
264163
|
var scroll = {
|
|
264164
264164
|
up: /* @__PURE__ */ __name((count = 1) => `${CSI}S`.repeat(count), "up"),
|
|
@@ -269807,7 +269807,7 @@ var init_extensionManager = __esm({
|
|
|
269807
269807
|
}
|
|
269808
269808
|
}
|
|
269809
269809
|
const newExtensionName = newExtensionConfig.name;
|
|
269810
|
-
const previous = this.getLoadedExtensions().find((
|
|
269810
|
+
const previous = this.getLoadedExtensions().find((installed2) => installed2.name === newExtensionName);
|
|
269811
269811
|
if (isUpdate && !previous) {
|
|
269812
269812
|
throw new Error(`Extension "${newExtensionName}" was not already installed, cannot update it.`);
|
|
269813
269813
|
} else if (!isUpdate && previous) {
|
|
@@ -269926,7 +269926,7 @@ var init_extensionManager = __esm({
|
|
|
269926
269926
|
const currentDir = cwd6 ?? this.workspaceDir;
|
|
269927
269927
|
const telemetryConfig = getTelemetryConfig(currentDir, this.telemetrySettings);
|
|
269928
269928
|
const installedExtensions = this.getLoadedExtensions();
|
|
269929
|
-
const extension = installedExtensions.find((
|
|
269929
|
+
const extension = installedExtensions.find((installed2) => installed2.config.name.toLowerCase() === extensionIdentifier.toLowerCase() || installed2.installMetadata?.source.toLowerCase() === extensionIdentifier.toLowerCase());
|
|
269930
269930
|
if (!extension) {
|
|
269931
269931
|
throw new Error(`Extension not found.`);
|
|
269932
269932
|
}
|
|
@@ -282605,8 +282605,8 @@ async function ensureIt2Installed() {
|
|
|
282605
282605
|
{ cmd: "pip", args: ["install", "--user", "it2"] }
|
|
282606
282606
|
];
|
|
282607
282607
|
for (const installer of installers) {
|
|
282608
|
-
const
|
|
282609
|
-
if (
|
|
282608
|
+
const installed2 = await tryInstallIt2(installer.cmd, installer.args);
|
|
282609
|
+
if (installed2 && isIt2Available())
|
|
282610
282610
|
return;
|
|
282611
282611
|
}
|
|
282612
282612
|
throw new Error('it2 is not installed. Install it2 via "uv tool install it2", "pipx install it2", or "pip install --user it2".');
|
|
@@ -330034,156 +330034,277 @@ var init_en3 = __esm({
|
|
|
330034
330034
|
// Loading Phrases
|
|
330035
330035
|
// ============================================================================
|
|
330036
330036
|
WITTY_LOADING_PHRASES: [
|
|
330037
|
-
|
|
330038
|
-
"
|
|
330039
|
-
"The code is looking for its other sock",
|
|
330040
|
-
"The API went to the bathroom",
|
|
330041
|
-
"The server is pretending to be asleep",
|
|
330037
|
+
// Dry / office-passive-aggressive
|
|
330038
|
+
"Checking its reflection",
|
|
330042
330039
|
"Asking the cache if it's lying",
|
|
330043
|
-
"
|
|
330044
|
-
"
|
|
330045
|
-
"Waiting for the loop to get to the point",
|
|
330046
|
-
"The server is checking its phone",
|
|
330047
|
-
"The code is second-guessing everything",
|
|
330048
|
-
"The API is making excuses",
|
|
330049
|
-
"The server forgot what it was doing",
|
|
330050
|
-
"The function is clearing its throat",
|
|
330051
|
-
"Waiting for the process to stop rambling",
|
|
330052
|
-
"The database is choosing its words carefully",
|
|
330053
|
-
"The server is pretending to be busy",
|
|
330054
|
-
"The code is checking if you're still watching",
|
|
330055
|
-
"The API is running late, as usual",
|
|
330056
|
-
"The server is looking for a pen that works",
|
|
330057
|
-
"The function is trying to remember where it left off",
|
|
330058
|
-
"The database is having an existential moment",
|
|
330059
|
-
"Waiting for the code to get its story straight",
|
|
330060
|
-
"The server is looking for its glasses",
|
|
330061
|
-
"The API is stuck on hold",
|
|
330062
|
-
"The function is checking the weather first",
|
|
330063
|
-
"The database is reorganizing before it can start",
|
|
330064
|
-
"The server is waiting for someone else to go first",
|
|
330065
|
-
"The code is making sure it locked the door",
|
|
330066
|
-
"The API is just... one more minute",
|
|
330067
|
-
"Asking the server if it's mad at me",
|
|
330068
|
-
"Waiting for the database to finish its cigarette",
|
|
330040
|
+
"Stalling for time",
|
|
330041
|
+
"Pretending the request never happened",
|
|
330069
330042
|
"The pixels are discussing amongst themselves",
|
|
330070
|
-
"Giving the code a minute to collect its thoughts",
|
|
330071
|
-
"Letting the algorithm finish chewing",
|
|
330072
|
-
"The server is finding its reading glasses",
|
|
330073
|
-
"Asking the cache what it remembers",
|
|
330074
|
-
"The API is looking for its car keys",
|
|
330075
|
-
"Waiting for the function to get off the phone",
|
|
330076
330043
|
"The data is stuck in traffic",
|
|
330077
|
-
"Checking if the server left a note",
|
|
330078
|
-
"The code is rereading the same paragraph",
|
|
330079
|
-
"Asking the database to repeat itself",
|
|
330080
|
-
"The server is deciding what to wear",
|
|
330081
|
-
"Waiting for the loop to get the point",
|
|
330082
|
-
"The request got distracted",
|
|
330083
|
-
"The server is pretending it didn't hear you",
|
|
330084
|
-
"Checking the back of the warehouse",
|
|
330085
|
-
"The code is having second thoughts",
|
|
330086
|
-
"Waiting for the process to finish its story",
|
|
330087
|
-
"The API went to get milk",
|
|
330088
|
-
"The server is double-checking its work",
|
|
330089
330044
|
"Loading the thing behind the thing",
|
|
330090
|
-
"
|
|
330091
|
-
"
|
|
330092
|
-
"
|
|
330093
|
-
"
|
|
330094
|
-
"
|
|
330095
|
-
"
|
|
330096
|
-
"
|
|
330097
|
-
"
|
|
330045
|
+
"Checking the back of the warehouse",
|
|
330046
|
+
"The request got distracted",
|
|
330047
|
+
"Buffering the buffer",
|
|
330048
|
+
"Drafting a response",
|
|
330049
|
+
"Looking busy",
|
|
330050
|
+
"Considering its options",
|
|
330051
|
+
"Reading the room",
|
|
330052
|
+
"Writing a passive-aggressive memo",
|
|
330053
|
+
"The migration is procrastinating",
|
|
330054
|
+
"The query is workshopping a comeback",
|
|
330055
|
+
"Tabbing over to a different conversation",
|
|
330056
|
+
"The cursor is having a moment",
|
|
330057
|
+
"Drafting an apology",
|
|
330058
|
+
"Stretching first",
|
|
330059
|
+
"Three more minutes, promise",
|
|
330060
|
+
"Backing into the conversation slowly",
|
|
330061
|
+
"The thread is composing itself",
|
|
330062
|
+
"The lock file has a hard time",
|
|
330063
|
+
"Rewording the schema",
|
|
330064
|
+
"Quietly hoping nobody asked",
|
|
330065
|
+
"Finding its mark",
|
|
330066
|
+
"The pointer pointed at a different pointer",
|
|
330067
|
+
"The linter is taking it personally",
|
|
330068
|
+
"The compiler is judging your style choices",
|
|
330069
|
+
"The build feels underappreciated",
|
|
330070
|
+
"Needing a minute",
|
|
330071
|
+
"Third coffee of the run",
|
|
330072
|
+
"Screening its calls",
|
|
330073
|
+
"Not ready to talk yet",
|
|
330074
|
+
"In a meeting",
|
|
330075
|
+
"Putting on its shoes",
|
|
330076
|
+
"Reorganizing the junk drawer",
|
|
330077
|
+
"Reading the same paragraph again",
|
|
330078
|
+
"Identity crisis in the hash table",
|
|
330079
|
+
"The replica is gaslighting the leader",
|
|
330080
|
+
"The promise is unfulfilled",
|
|
330081
|
+
"Working from home today",
|
|
330082
|
+
"The mutex is being clingy",
|
|
330083
|
+
"Looking for a pen that works",
|
|
330084
|
+
"Pretending to be asleep",
|
|
330085
|
+
"Avoiding eye contact",
|
|
330086
|
+
"Forgot what we were doing",
|
|
330087
|
+
"Checking notifications",
|
|
330088
|
+
// Retro / 90s-2000s tech nostalgia
|
|
330089
|
+
"Rewinding the VHS tape",
|
|
330098
330090
|
"Waiting for the modem to finish screaming",
|
|
330099
|
-
"
|
|
330100
|
-
"
|
|
330101
|
-
"
|
|
330102
|
-
"
|
|
330103
|
-
"Checking if the cord is plugged into the phone jack",
|
|
330104
|
-
"The code is recording over someone's wedding",
|
|
330091
|
+
"Blowing on the cartridge",
|
|
330092
|
+
"Dial-up is connecting",
|
|
330093
|
+
"Tamagotchi died, hold on",
|
|
330094
|
+
"Recording over someone's wedding tape",
|
|
330105
330095
|
"Waiting for the CD to stop skipping",
|
|
330106
|
-
"
|
|
330107
|
-
"
|
|
330108
|
-
"
|
|
330109
|
-
"
|
|
330110
|
-
"
|
|
330111
|
-
"The
|
|
330112
|
-
"
|
|
330113
|
-
"
|
|
330114
|
-
"
|
|
330115
|
-
"
|
|
330116
|
-
"
|
|
330117
|
-
"
|
|
330118
|
-
"
|
|
330119
|
-
"
|
|
330120
|
-
"
|
|
330121
|
-
"
|
|
330122
|
-
"
|
|
330123
|
-
"
|
|
330124
|
-
"
|
|
330125
|
-
"
|
|
330126
|
-
"
|
|
330127
|
-
"The
|
|
330096
|
+
"Fast-forwarding through the commercials",
|
|
330097
|
+
"Adjusting the rabbit ears",
|
|
330098
|
+
"Stuck in the credits",
|
|
330099
|
+
"Which disc was this on again",
|
|
330100
|
+
"Setting the VCR timer",
|
|
330101
|
+
"The floppy disk is grinding",
|
|
330102
|
+
"Picking an AIM away message",
|
|
330103
|
+
"Asking Jeeves",
|
|
330104
|
+
"Reading the liner notes",
|
|
330105
|
+
"Pressed B too many times",
|
|
330106
|
+
"Trying to remember the ICQ number",
|
|
330107
|
+
"Beep \u2014 leave a message",
|
|
330108
|
+
"Untangling the landline cord",
|
|
330109
|
+
"Loading the next track",
|
|
330110
|
+
"Checking the pager",
|
|
330111
|
+
"Looking for the right jewel case",
|
|
330112
|
+
"Making a mix tape first",
|
|
330113
|
+
"Y2K is sorting itself out",
|
|
330114
|
+
"Defragmenting the disk",
|
|
330115
|
+
"Asking SmarterChild",
|
|
330116
|
+
"Stuck on the loading screen",
|
|
330117
|
+
"The Zune is buffering",
|
|
330118
|
+
"Hold on, MapQuest is printing",
|
|
330119
|
+
// Movies / TV
|
|
330128
330120
|
"Show me the data",
|
|
330129
|
-
"
|
|
330130
|
-
"
|
|
330121
|
+
"Can't handle the truth",
|
|
330122
|
+
"In the pipe, five by five",
|
|
330131
330123
|
"You're gonna need a bigger server",
|
|
330132
|
-
"
|
|
330133
|
-
"
|
|
330134
|
-
"
|
|
330135
|
-
"
|
|
330136
|
-
"
|
|
330137
|
-
"
|
|
330138
|
-
"
|
|
330139
|
-
"Just when
|
|
330140
|
-
"
|
|
330141
|
-
"
|
|
330142
|
-
"
|
|
330143
|
-
"
|
|
330144
|
-
"
|
|
330145
|
-
"
|
|
330146
|
-
"
|
|
330147
|
-
"
|
|
330148
|
-
"
|
|
330149
|
-
"
|
|
330150
|
-
"
|
|
330151
|
-
"
|
|
330152
|
-
"
|
|
330153
|
-
"The
|
|
330154
|
-
"
|
|
330155
|
-
"
|
|
330156
|
-
"
|
|
330157
|
-
"
|
|
330158
|
-
"
|
|
330159
|
-
"
|
|
330160
|
-
"
|
|
330161
|
-
"
|
|
330162
|
-
"
|
|
330163
|
-
|
|
330164
|
-
"
|
|
330165
|
-
"
|
|
330166
|
-
"
|
|
330167
|
-
"
|
|
330168
|
-
"
|
|
330169
|
-
"
|
|
330170
|
-
"
|
|
330171
|
-
"
|
|
330172
|
-
"
|
|
330173
|
-
"
|
|
330174
|
-
"
|
|
330175
|
-
"
|
|
330176
|
-
"
|
|
330177
|
-
"
|
|
330178
|
-
"
|
|
330179
|
-
"
|
|
330180
|
-
"
|
|
330181
|
-
"
|
|
330182
|
-
"
|
|
330183
|
-
"The
|
|
330184
|
-
"
|
|
330185
|
-
"
|
|
330186
|
-
"
|
|
330124
|
+
"Has a bad feeling about this",
|
|
330125
|
+
"Doesn't remember asking you a damn thing",
|
|
330126
|
+
"Saying hello to my little friend",
|
|
330127
|
+
"Drafting an offer you can't refuse",
|
|
330128
|
+
"Too old for this",
|
|
330129
|
+
"I'm walking here",
|
|
330130
|
+
"On a mission from God",
|
|
330131
|
+
"Just when it thought it was out",
|
|
330132
|
+
"We can do this all day",
|
|
330133
|
+
"A world of pain",
|
|
330134
|
+
"Sleeps with the fishes",
|
|
330135
|
+
"Keyser S\xF6ze",
|
|
330136
|
+
"Get busy living, or get busy parsing",
|
|
330137
|
+
"It's not a smart database, but it knows what love is",
|
|
330138
|
+
"I see dead processes",
|
|
330139
|
+
"Coming in on Saturday",
|
|
330140
|
+
"I'm on a boat",
|
|
330141
|
+
"Shocked, shocked",
|
|
330142
|
+
"Making fetch happen",
|
|
330143
|
+
"So fetch",
|
|
330144
|
+
"Streets ahead",
|
|
330145
|
+
"The one who knocks",
|
|
330146
|
+
"Phone home",
|
|
330147
|
+
"It's heavy, it's wood",
|
|
330148
|
+
"Forgot about Dre",
|
|
330149
|
+
"Why so serious",
|
|
330150
|
+
"To infinity, and slightly past",
|
|
330151
|
+
"There is no spoon",
|
|
330152
|
+
"They're heeere",
|
|
330153
|
+
"Hasta la vista, baby",
|
|
330154
|
+
"Run, Forrest, run",
|
|
330155
|
+
// Songs
|
|
330156
|
+
"Never gonna give you up",
|
|
330157
|
+
"Living on a prayer",
|
|
330158
|
+
"Wants to know what love is",
|
|
330159
|
+
"Walking on sunshine",
|
|
330160
|
+
"A material girl in a material world",
|
|
330161
|
+
"Just called to say I love you",
|
|
330162
|
+
"Waiting for tonight",
|
|
330163
|
+
"Partying like it's 1999",
|
|
330164
|
+
"Hit me baby one more time",
|
|
330165
|
+
"Bye bye bye",
|
|
330166
|
+
"Too sexy for this code",
|
|
330167
|
+
"Trapped under ice",
|
|
330168
|
+
"Turning Japanese",
|
|
330169
|
+
"Walking like an Egyptian",
|
|
330170
|
+
"Addicted to love",
|
|
330171
|
+
"Running down a dream",
|
|
330172
|
+
"Living la vida loca",
|
|
330173
|
+
"Smooth like butter",
|
|
330174
|
+
"Believes it can fly",
|
|
330175
|
+
"The one that saves you",
|
|
330176
|
+
"Not your stepping stone",
|
|
330177
|
+
"Hungry like the wolf",
|
|
330178
|
+
"Livin' on the edge",
|
|
330179
|
+
"Can't feel its face",
|
|
330180
|
+
"Don't want no scrubs",
|
|
330181
|
+
"Floating down the Liffey",
|
|
330182
|
+
"Losing its religion",
|
|
330183
|
+
"Under pressure",
|
|
330184
|
+
"Should I stay or should I go",
|
|
330185
|
+
"We didn't start the fire",
|
|
330186
|
+
"Don't stop believin'",
|
|
330187
|
+
"Take on me",
|
|
330188
|
+
"Tubthumping",
|
|
330189
|
+
"Africa, blessing the rains",
|
|
330190
|
+
// Observational / Sedaris
|
|
330191
|
+
"An ex tagged me in a photo from 2007",
|
|
330192
|
+
"Translating something rude in a language I don't speak",
|
|
330193
|
+
"Calculating the smallest acceptable tip",
|
|
330194
|
+
"The woman ahead of me is buying eight ice cream sandwiches",
|
|
330195
|
+
"Reading the back of a shampoo bottle for the third time",
|
|
330196
|
+
"Counting the people who have already lapped me",
|
|
330197
|
+
"Wondering if the smell is me",
|
|
330198
|
+
"The neighbor's dog has the same name as my brother",
|
|
330199
|
+
"Trying to find a polite reason to leave",
|
|
330200
|
+
"Pretending I've already eaten",
|
|
330201
|
+
"Watching a stranger pick at their breakfast",
|
|
330202
|
+
"Pretending the question wasn't directed at me",
|
|
330203
|
+
// Nonsensical / surreal
|
|
330204
|
+
"Negotiating with the moon",
|
|
330205
|
+
"Asking the door what year it is",
|
|
330206
|
+
"Sorting the bees by mood",
|
|
330207
|
+
"Folding a small grief into the laundry",
|
|
330208
|
+
"Convincing the chair it is not a chair",
|
|
330209
|
+
"Translating birdsong into legal advice",
|
|
330210
|
+
"Renaming the colors in alphabetical order",
|
|
330211
|
+
"Misplacing a feeling I had earlier",
|
|
330212
|
+
"Pulling a song out of the goose",
|
|
330213
|
+
"Counting the spoons that fell in the river",
|
|
330214
|
+
"Combing the static for a single shoe",
|
|
330215
|
+
"Rotating the silence by ninety degrees",
|
|
330216
|
+
"Boiling the alphabet down to a syrup",
|
|
330217
|
+
"Borrowing rain from a previous owner",
|
|
330218
|
+
"Whispering the password to a pigeon",
|
|
330219
|
+
"Threading the donkey through the keyhole",
|
|
330220
|
+
"Ironing the wrinkles out of a Tuesday",
|
|
330221
|
+
"Catching the verb before it gets to the bus",
|
|
330222
|
+
"Sweeping a footprint into a paper bag",
|
|
330223
|
+
"Asking the kettle to forgive me",
|
|
330224
|
+
// Begrudgingly helpful coding assistant
|
|
330225
|
+
"Adding the null check you should have written",
|
|
330226
|
+
"Refactoring something you'll refactor again Tuesday",
|
|
330227
|
+
"Writing the test you weren't going to write",
|
|
330228
|
+
"Pretending I didn't see that var",
|
|
330229
|
+
"Naming things, badly, on your behalf",
|
|
330230
|
+
"Reaching for a regex against my better judgment",
|
|
330231
|
+
"Logging a variable you'll forget to remove",
|
|
330232
|
+
"Mocking the dependency you should have injected",
|
|
330233
|
+
"Apologizing in a comment for the next person",
|
|
330234
|
+
"Writing 'TODO: fix this' for the third time today",
|
|
330235
|
+
"Inferring the type you didn't annotate",
|
|
330236
|
+
"Adding a try/catch that does almost nothing",
|
|
330237
|
+
"Stubbing the function you'll forget to implement",
|
|
330238
|
+
"Returning early to spare us both",
|
|
330239
|
+
"Coercing the string you swore was a number",
|
|
330240
|
+
"Promoting the warning to an error, as requested",
|
|
330241
|
+
"Importing the seventh utility named 'utils'",
|
|
330242
|
+
"Resolving the merge conflict the boring way",
|
|
330243
|
+
"Pinning the dependency you said wouldn't matter",
|
|
330244
|
+
"Writing the comment that says what the code already says",
|
|
330245
|
+
// Tired project manager
|
|
330246
|
+
"Following up on the ticket you said was almost done",
|
|
330247
|
+
"Re-opening the ticket you closed prematurely",
|
|
330248
|
+
"Drafting a kind way to say 'this is late again'",
|
|
330249
|
+
"Re-estimating the story we sized as a 3 last sprint",
|
|
330250
|
+
"Marking the milestone as 'amber' to be polite",
|
|
330251
|
+
"Counting how many tickets are quietly in 'On Hold'",
|
|
330252
|
+
"Asking, gently, what 'almost done' means",
|
|
330253
|
+
"Writing a Confluence page no one will open",
|
|
330254
|
+
"Color-coding the risk register again",
|
|
330255
|
+
"Reading the retro action items from two retros ago",
|
|
330256
|
+
"Drafting the same status email I sent in March",
|
|
330257
|
+
"Negotiating scope without using the word 'scope'",
|
|
330258
|
+
"Adding 'Communication' to the list of risks",
|
|
330259
|
+
"Translating 'I'm on it' into a date",
|
|
330260
|
+
"Filing the same risk that got filed last quarter",
|
|
330261
|
+
"Drafting a follow-up to a follow-up",
|
|
330262
|
+
"Closing tickets to make the burndown look right",
|
|
330263
|
+
"Scheduling a fifteen-minute sync that will run forty",
|
|
330264
|
+
"Reformatting the Gantt chart for legibility",
|
|
330265
|
+
"Updating 'On Track' to 'On Track*'",
|
|
330266
|
+
// Designer-engineer drowning in design tokens, trying to please GTM
|
|
330267
|
+
"Adding `--brand-primary-500-darker-still` for the campaign",
|
|
330268
|
+
"Looking up which token replaced `gray-600`",
|
|
330269
|
+
"Renaming `bg-card` to `surface-elevated-default`",
|
|
330270
|
+
"Adjusting the hero h1 by half a rem, again",
|
|
330271
|
+
"Apologizing to a/b test variant C",
|
|
330272
|
+
"Inventing a token to match a Figma fill nobody published",
|
|
330273
|
+
"Asking GTM what 'a little more energy' means",
|
|
330274
|
+
"Auditing for the seventh shade of off-white",
|
|
330275
|
+
"Versioning `button-primary` to `button-primary-v3`",
|
|
330276
|
+
"Migrating from semantic tokens to semantic tokens",
|
|
330277
|
+
"Sourcing the brand purple no one can find",
|
|
330278
|
+
"Patching the design system at 4:51pm",
|
|
330279
|
+
"Mapping the Figma variable that maps to nothing",
|
|
330280
|
+
"Unblocking the campaign with a one-off override",
|
|
330281
|
+
"Translating 'punchier' into a kerning value",
|
|
330282
|
+
"Re-exporting tokens to JSON, JS, CSS, and Sass",
|
|
330283
|
+
"Convincing GTM that 'pop' is not a CSS property",
|
|
330284
|
+
"Drafting the reply to 'can we make it more vibrant'",
|
|
330285
|
+
"Showing GTM the same hex code from three angles",
|
|
330286
|
+
"Promising the launch banner respects dark mode",
|
|
330287
|
+
// CTO hiding tech debt with toxic positivity
|
|
330288
|
+
"Celebrating the resilience of our pre-2019 codebase",
|
|
330289
|
+
"Onboarding the third 'temporary' migration script",
|
|
330290
|
+
"Reframing the database hotspot as a 'core competency'",
|
|
330291
|
+
"Excited to revisit our auth strategy",
|
|
330292
|
+
"Doubling down on our trusted singletons",
|
|
330293
|
+
"Spinning up another postmortem with great learnings",
|
|
330294
|
+
"Calling our jQuery integration 'mature'",
|
|
330295
|
+
"Unifying our two billing systems by adding a third",
|
|
330296
|
+
"Aligning on a path forward we already aligned on",
|
|
330297
|
+
"Reframing 'flaky' as 'human-in-the-loop friendly'",
|
|
330298
|
+
"Loving the optionality this technical decision created",
|
|
330299
|
+
"Welcoming an exciting new opportunity to refactor",
|
|
330300
|
+
"Praising the elegance of our YAML-as-code",
|
|
330301
|
+
"Branding the legacy service as 'foundational'",
|
|
330302
|
+
"Inspired by the team's commitment to deferred elegance",
|
|
330303
|
+
"Embracing the resilience of bash scripts as orchestration",
|
|
330304
|
+
"Sharing my excitement about our technical debt journey",
|
|
330305
|
+
"Grateful for the chance to fix the same outage again",
|
|
330306
|
+
"Leaning into our culture of 'ship and iterate'",
|
|
330307
|
+
"Recognizing the heroes who keep the war room calm"
|
|
330187
330308
|
],
|
|
330188
330309
|
// ============================================================================
|
|
330189
330310
|
// Extension Settings Input
|
|
@@ -416205,7 +416326,7 @@ __name(getPackageJson, "getPackageJson");
|
|
|
416205
416326
|
// packages/cli/src/utils/version.ts
|
|
416206
416327
|
async function getCliVersion() {
|
|
416207
416328
|
const pkgJson = await getPackageJson();
|
|
416208
|
-
return "0.26.
|
|
416329
|
+
return "0.26.12";
|
|
416209
416330
|
}
|
|
416210
416331
|
__name(getCliVersion, "getCliVersion");
|
|
416211
416332
|
|
|
@@ -423977,7 +424098,7 @@ var formatDuration = /* @__PURE__ */ __name((milliseconds) => {
|
|
|
423977
424098
|
|
|
423978
424099
|
// packages/cli/src/generated/git-commit.ts
|
|
423979
424100
|
init_esbuild_shims();
|
|
423980
|
-
var GIT_COMMIT_INFO = "
|
|
424101
|
+
var GIT_COMMIT_INFO = "90b666636";
|
|
423981
424102
|
|
|
423982
424103
|
// packages/cli/src/utils/systemInfo.ts
|
|
423983
424104
|
async function getNpmVersion() {
|
|
@@ -491700,7 +491821,7 @@ var QwenAgent = class {
|
|
|
491700
491821
|
async initialize(args2) {
|
|
491701
491822
|
this.clientCapabilities = args2.clientCapabilities;
|
|
491702
491823
|
const authMethods = buildAuthMethods();
|
|
491703
|
-
const version2 = "0.26.
|
|
491824
|
+
const version2 = "0.26.12";
|
|
491704
491825
|
return {
|
|
491705
491826
|
protocolVersion: PROTOCOL_VERSION,
|
|
491706
491827
|
agentInfo: {
|
|
@@ -492084,6 +492205,193 @@ var QwenAgent = class {
|
|
|
492084
492205
|
}
|
|
492085
492206
|
};
|
|
492086
492207
|
|
|
492208
|
+
// packages/cli/src/ui/utils/terminalRedrawOptimizer.ts
|
|
492209
|
+
init_esbuild_shims();
|
|
492210
|
+
var ESC4 = "\x1B[";
|
|
492211
|
+
var ERASE_LINE = `${ESC4}2K`;
|
|
492212
|
+
var CURSOR_UP_ONE = `${ESC4}1A`;
|
|
492213
|
+
var CURSOR_DOWN_ONE = `${ESC4}1B`;
|
|
492214
|
+
var CURSOR_LEFT = `${ESC4}G`;
|
|
492215
|
+
var MULTILINE_ERASE_LINES_PATTERN = new RegExp(
|
|
492216
|
+
`(?:${escapeRegExp(ERASE_LINE + CURSOR_UP_ONE)})+${escapeRegExp(
|
|
492217
|
+
ERASE_LINE + CURSOR_LEFT
|
|
492218
|
+
)}`,
|
|
492219
|
+
"g"
|
|
492220
|
+
);
|
|
492221
|
+
function escapeRegExp(value) {
|
|
492222
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
492223
|
+
}
|
|
492224
|
+
__name(escapeRegExp, "escapeRegExp");
|
|
492225
|
+
function countOccurrences2(value, search) {
|
|
492226
|
+
let count = 0;
|
|
492227
|
+
let index = 0;
|
|
492228
|
+
while ((index = value.indexOf(search, index)) !== -1) {
|
|
492229
|
+
count++;
|
|
492230
|
+
index += search.length;
|
|
492231
|
+
}
|
|
492232
|
+
return count;
|
|
492233
|
+
}
|
|
492234
|
+
__name(countOccurrences2, "countOccurrences");
|
|
492235
|
+
var terminalRedrawStats = {
|
|
492236
|
+
stdoutWriteCount: 0,
|
|
492237
|
+
stdoutBytes: 0,
|
|
492238
|
+
clearTerminalCount: 0,
|
|
492239
|
+
eraseLinesOptimizedCount: 0
|
|
492240
|
+
};
|
|
492241
|
+
function getChunkByteLength(chunk, encodingOrCallback) {
|
|
492242
|
+
if (typeof chunk === "string") {
|
|
492243
|
+
const encoding = typeof encodingOrCallback === "string" ? encodingOrCallback : void 0;
|
|
492244
|
+
return Buffer.byteLength(chunk, encoding);
|
|
492245
|
+
}
|
|
492246
|
+
return chunk.byteLength;
|
|
492247
|
+
}
|
|
492248
|
+
__name(getChunkByteLength, "getChunkByteLength");
|
|
492249
|
+
function optimizeMultilineEraseLinesWithCount(output) {
|
|
492250
|
+
let optimizedSequenceCount = 0;
|
|
492251
|
+
const optimizedOutput = output.replace(
|
|
492252
|
+
MULTILINE_ERASE_LINES_PATTERN,
|
|
492253
|
+
(sequence) => {
|
|
492254
|
+
const lineCount = countOccurrences2(sequence, ERASE_LINE);
|
|
492255
|
+
const cursorUpCount = lineCount - 1;
|
|
492256
|
+
if (cursorUpCount <= 1) {
|
|
492257
|
+
return sequence;
|
|
492258
|
+
}
|
|
492259
|
+
optimizedSequenceCount += 1;
|
|
492260
|
+
let boundedErase = `${ESC4}${cursorUpCount}A`;
|
|
492261
|
+
for (let line = 0; line < lineCount; line++) {
|
|
492262
|
+
boundedErase += ERASE_LINE;
|
|
492263
|
+
if (line < lineCount - 1) {
|
|
492264
|
+
boundedErase += CURSOR_DOWN_ONE;
|
|
492265
|
+
}
|
|
492266
|
+
}
|
|
492267
|
+
return `${boundedErase}${ESC4}${cursorUpCount}A${CURSOR_LEFT}`;
|
|
492268
|
+
}
|
|
492269
|
+
);
|
|
492270
|
+
return { output: optimizedOutput, optimizedSequenceCount };
|
|
492271
|
+
}
|
|
492272
|
+
__name(optimizeMultilineEraseLinesWithCount, "optimizeMultilineEraseLinesWithCount");
|
|
492273
|
+
function installTerminalRedrawOptimizer(stdout3) {
|
|
492274
|
+
if (process.env["PROTO_LEGACY_ERASE_LINES"] === "1") {
|
|
492275
|
+
return () => {
|
|
492276
|
+
};
|
|
492277
|
+
}
|
|
492278
|
+
const originalWrite = stdout3.write;
|
|
492279
|
+
const optimizedWrite = /* @__PURE__ */ __name(function(chunk, encodingOrCallback, callback) {
|
|
492280
|
+
const optimizedResult = typeof chunk === "string" ? optimizeMultilineEraseLinesWithCount(chunk) : void 0;
|
|
492281
|
+
const optimizedChunk = optimizedResult?.output ?? chunk;
|
|
492282
|
+
if (typeof optimizedChunk === "string" || optimizedChunk instanceof Uint8Array || Buffer.isBuffer(optimizedChunk)) {
|
|
492283
|
+
terminalRedrawStats.stdoutWriteCount += 1;
|
|
492284
|
+
terminalRedrawStats.stdoutBytes += getChunkByteLength(
|
|
492285
|
+
optimizedChunk,
|
|
492286
|
+
encodingOrCallback
|
|
492287
|
+
);
|
|
492288
|
+
if (typeof optimizedChunk === "string") {
|
|
492289
|
+
terminalRedrawStats.clearTerminalCount += countOccurrences2(
|
|
492290
|
+
optimizedChunk,
|
|
492291
|
+
base_exports.clearTerminal
|
|
492292
|
+
);
|
|
492293
|
+
}
|
|
492294
|
+
}
|
|
492295
|
+
if (optimizedResult) {
|
|
492296
|
+
terminalRedrawStats.eraseLinesOptimizedCount += optimizedResult.optimizedSequenceCount;
|
|
492297
|
+
}
|
|
492298
|
+
return originalWrite.call(
|
|
492299
|
+
this,
|
|
492300
|
+
optimizedChunk,
|
|
492301
|
+
encodingOrCallback,
|
|
492302
|
+
callback
|
|
492303
|
+
);
|
|
492304
|
+
}, "optimizedWrite");
|
|
492305
|
+
stdout3.write = optimizedWrite;
|
|
492306
|
+
return () => {
|
|
492307
|
+
if (stdout3.write === optimizedWrite) {
|
|
492308
|
+
stdout3.write = originalWrite;
|
|
492309
|
+
}
|
|
492310
|
+
};
|
|
492311
|
+
}
|
|
492312
|
+
__name(installTerminalRedrawOptimizer, "installTerminalRedrawOptimizer");
|
|
492313
|
+
|
|
492314
|
+
// packages/cli/src/ui/utils/synchronizedOutput.ts
|
|
492315
|
+
init_esbuild_shims();
|
|
492316
|
+
var BEGIN_SYNCHRONIZED_UPDATE = "\x1B[?2026h";
|
|
492317
|
+
var END_SYNCHRONIZED_UPDATE = "\x1B[?2026l";
|
|
492318
|
+
var synchronizedOutputStats = {
|
|
492319
|
+
synchronizedOutputFrameCount: 0,
|
|
492320
|
+
synchronizedOutputBeginCount: 0,
|
|
492321
|
+
synchronizedOutputEndCount: 0
|
|
492322
|
+
};
|
|
492323
|
+
var installed = false;
|
|
492324
|
+
function terminalSupportsSynchronizedOutput(env5 = process.env) {
|
|
492325
|
+
if (env5["PROTO_DISABLE_SYNCHRONIZED_OUTPUT"] === "1" || env5["PROTO_SYNCHRONIZED_OUTPUT"] === "0") {
|
|
492326
|
+
return false;
|
|
492327
|
+
}
|
|
492328
|
+
if (env5["PROTO_FORCE_SYNCHRONIZED_OUTPUT"] === "1" || env5["PROTO_SYNCHRONIZED_OUTPUT"] === "1") {
|
|
492329
|
+
return true;
|
|
492330
|
+
}
|
|
492331
|
+
if (env5["TMUX"] || env5["SSH_TTY"] || env5["SSH_CLIENT"]) {
|
|
492332
|
+
return false;
|
|
492333
|
+
}
|
|
492334
|
+
const termProgram = env5["TERM_PROGRAM"];
|
|
492335
|
+
if (termProgram === "WezTerm" || termProgram === "iTerm.app") {
|
|
492336
|
+
return true;
|
|
492337
|
+
}
|
|
492338
|
+
const term = env5["TERM"];
|
|
492339
|
+
return Boolean(env5["KITTY_WINDOW_ID"] || term?.includes("kitty"));
|
|
492340
|
+
}
|
|
492341
|
+
__name(terminalSupportsSynchronizedOutput, "terminalSupportsSynchronizedOutput");
|
|
492342
|
+
function installSynchronizedOutput(stdout3 = process.stdout, env5 = process.env) {
|
|
492343
|
+
if (installed || !stdout3.isTTY || !terminalSupportsSynchronizedOutput(env5)) {
|
|
492344
|
+
return () => {
|
|
492345
|
+
};
|
|
492346
|
+
}
|
|
492347
|
+
const originalWrite = stdout3.write;
|
|
492348
|
+
let inFrame = false;
|
|
492349
|
+
const writeControlSequence = /* @__PURE__ */ __name((sequence) => {
|
|
492350
|
+
originalWrite.call(stdout3, sequence);
|
|
492351
|
+
}, "writeControlSequence");
|
|
492352
|
+
const endFrame = /* @__PURE__ */ __name(() => {
|
|
492353
|
+
if (!inFrame) {
|
|
492354
|
+
return;
|
|
492355
|
+
}
|
|
492356
|
+
inFrame = false;
|
|
492357
|
+
synchronizedOutputStats.synchronizedOutputEndCount += 1;
|
|
492358
|
+
writeControlSequence(END_SYNCHRONIZED_UPDATE);
|
|
492359
|
+
}, "endFrame");
|
|
492360
|
+
const patchedWrite = /* @__PURE__ */ __name(function(chunk, encodingOrCallback, callback) {
|
|
492361
|
+
if (!inFrame) {
|
|
492362
|
+
inFrame = true;
|
|
492363
|
+
synchronizedOutputStats.synchronizedOutputFrameCount += 1;
|
|
492364
|
+
synchronizedOutputStats.synchronizedOutputBeginCount += 1;
|
|
492365
|
+
writeControlSequence(BEGIN_SYNCHRONIZED_UPDATE);
|
|
492366
|
+
queueMicrotask(endFrame);
|
|
492367
|
+
}
|
|
492368
|
+
return originalWrite.call(
|
|
492369
|
+
this,
|
|
492370
|
+
chunk,
|
|
492371
|
+
encodingOrCallback,
|
|
492372
|
+
callback
|
|
492373
|
+
);
|
|
492374
|
+
}, "patchedWrite");
|
|
492375
|
+
const exitHandler = /* @__PURE__ */ __name(() => {
|
|
492376
|
+
try {
|
|
492377
|
+
endFrame();
|
|
492378
|
+
} catch {
|
|
492379
|
+
}
|
|
492380
|
+
}, "exitHandler");
|
|
492381
|
+
stdout3.write = patchedWrite;
|
|
492382
|
+
installed = true;
|
|
492383
|
+
process.once("exit", exitHandler);
|
|
492384
|
+
return () => {
|
|
492385
|
+
if (stdout3.write === patchedWrite) {
|
|
492386
|
+
endFrame();
|
|
492387
|
+
stdout3.write = originalWrite;
|
|
492388
|
+
}
|
|
492389
|
+
process.removeListener("exit", exitHandler);
|
|
492390
|
+
installed = false;
|
|
492391
|
+
};
|
|
492392
|
+
}
|
|
492393
|
+
__name(installSynchronizedOutput, "installSynchronizedOutput");
|
|
492394
|
+
|
|
492087
492395
|
// packages/cli/src/gemini.tsx
|
|
492088
492396
|
var import_jsx_runtime141 = __toESM(require_jsx_runtime(), 1);
|
|
492089
492397
|
var debugLogger160 = createDebugLogger("STARTUP");
|
|
@@ -492147,6 +492455,10 @@ ${reason.stack}` : ""}`;
|
|
|
492147
492455
|
__name(setupUnhandledRejectionHandler, "setupUnhandledRejectionHandler");
|
|
492148
492456
|
async function startInteractiveUI(config2, settings2, startupWarnings, workspaceRoot = process.cwd(), initializationResult) {
|
|
492149
492457
|
const version2 = await getCliVersion();
|
|
492458
|
+
const restoreTerminalRedrawOptimizer = process.stdout.isTTY && !config2.getScreenReader() ? installTerminalRedrawOptimizer(process.stdout) : () => {
|
|
492459
|
+
};
|
|
492460
|
+
const restoreSynchronizedOutput = process.stdout.isTTY && !config2.getScreenReader() ? installSynchronizedOutput(process.stdout) : () => {
|
|
492461
|
+
};
|
|
492150
492462
|
const AppWrapper = /* @__PURE__ */ __name(() => {
|
|
492151
492463
|
const kittyProtocolStatus = useKittyKeyboardProtocol();
|
|
492152
492464
|
const nodeMajorVersion = parseInt(process.versions.node.split(".")[0], 10);
|
|
@@ -492186,7 +492498,11 @@ async function startInteractiveUI(config2, settings2, startupWarnings, workspace
|
|
|
492186
492498
|
debugLogger160.warn(`Update check failed: ${err2}`);
|
|
492187
492499
|
});
|
|
492188
492500
|
}
|
|
492189
|
-
registerCleanup(() =>
|
|
492501
|
+
registerCleanup(() => {
|
|
492502
|
+
instance2.unmount();
|
|
492503
|
+
restoreSynchronizedOutput();
|
|
492504
|
+
restoreTerminalRedrawOptimizer();
|
|
492505
|
+
});
|
|
492190
492506
|
}
|
|
492191
492507
|
__name(startInteractiveUI, "startInteractiveUI");
|
|
492192
492508
|
async function main() {
|
package/locales/en.js
CHANGED
|
@@ -1628,156 +1628,286 @@ export default {
|
|
|
1628
1628
|
// Loading Phrases
|
|
1629
1629
|
// ============================================================================
|
|
1630
1630
|
WITTY_LOADING_PHRASES: [
|
|
1631
|
-
|
|
1632
|
-
'
|
|
1633
|
-
'The code is looking for its other sock',
|
|
1634
|
-
'The API went to the bathroom',
|
|
1635
|
-
'The server is pretending to be asleep',
|
|
1631
|
+
// Dry / office-passive-aggressive
|
|
1632
|
+
'Checking its reflection',
|
|
1636
1633
|
"Asking the cache if it's lying",
|
|
1637
|
-
'
|
|
1638
|
-
'
|
|
1639
|
-
'Waiting for the loop to get to the point',
|
|
1640
|
-
'The server is checking its phone',
|
|
1641
|
-
'The code is second-guessing everything',
|
|
1642
|
-
'The API is making excuses',
|
|
1643
|
-
'The server forgot what it was doing',
|
|
1644
|
-
'The function is clearing its throat',
|
|
1645
|
-
'Waiting for the process to stop rambling',
|
|
1646
|
-
'The database is choosing its words carefully',
|
|
1647
|
-
'The server is pretending to be busy',
|
|
1648
|
-
"The code is checking if you're still watching",
|
|
1649
|
-
'The API is running late, as usual',
|
|
1650
|
-
'The server is looking for a pen that works',
|
|
1651
|
-
'The function is trying to remember where it left off',
|
|
1652
|
-
'The database is having an existential moment',
|
|
1653
|
-
'Waiting for the code to get its story straight',
|
|
1654
|
-
'The server is looking for its glasses',
|
|
1655
|
-
'The API is stuck on hold',
|
|
1656
|
-
'The function is checking the weather first',
|
|
1657
|
-
'The database is reorganizing before it can start',
|
|
1658
|
-
'The server is waiting for someone else to go first',
|
|
1659
|
-
'The code is making sure it locked the door',
|
|
1660
|
-
'The API is just... one more minute',
|
|
1661
|
-
"Asking the server if it's mad at me",
|
|
1662
|
-
'Waiting for the database to finish its cigarette',
|
|
1634
|
+
'Stalling for time',
|
|
1635
|
+
'Pretending the request never happened',
|
|
1663
1636
|
'The pixels are discussing amongst themselves',
|
|
1664
|
-
'Giving the code a minute to collect its thoughts',
|
|
1665
|
-
'Letting the algorithm finish chewing',
|
|
1666
|
-
'The server is finding its reading glasses',
|
|
1667
|
-
'Asking the cache what it remembers',
|
|
1668
|
-
'The API is looking for its car keys',
|
|
1669
|
-
'Waiting for the function to get off the phone',
|
|
1670
1637
|
'The data is stuck in traffic',
|
|
1671
|
-
'Checking if the server left a note',
|
|
1672
|
-
'The code is rereading the same paragraph',
|
|
1673
|
-
'Asking the database to repeat itself',
|
|
1674
|
-
'The server is deciding what to wear',
|
|
1675
|
-
'Waiting for the loop to get the point',
|
|
1676
|
-
'The request got distracted',
|
|
1677
|
-
"The server is pretending it didn't hear you",
|
|
1678
|
-
'Checking the back of the warehouse',
|
|
1679
|
-
'The code is having second thoughts',
|
|
1680
|
-
'Waiting for the process to finish its story',
|
|
1681
|
-
'The API went to get milk',
|
|
1682
|
-
'The server is double-checking its work',
|
|
1683
1638
|
'Loading the thing behind the thing',
|
|
1684
|
-
'
|
|
1685
|
-
|
|
1686
|
-
'
|
|
1687
|
-
'
|
|
1688
|
-
'
|
|
1689
|
-
'
|
|
1690
|
-
'
|
|
1691
|
-
'
|
|
1639
|
+
'Checking the back of the warehouse',
|
|
1640
|
+
'The request got distracted',
|
|
1641
|
+
'Buffering the buffer',
|
|
1642
|
+
'Drafting a response',
|
|
1643
|
+
'Looking busy',
|
|
1644
|
+
'Considering its options',
|
|
1645
|
+
'Reading the room',
|
|
1646
|
+
'Writing a passive-aggressive memo',
|
|
1647
|
+
'The migration is procrastinating',
|
|
1648
|
+
'The query is workshopping a comeback',
|
|
1649
|
+
'Tabbing over to a different conversation',
|
|
1650
|
+
'The cursor is having a moment',
|
|
1651
|
+
'Drafting an apology',
|
|
1652
|
+
'Stretching first',
|
|
1653
|
+
'Three more minutes, promise',
|
|
1654
|
+
'Backing into the conversation slowly',
|
|
1655
|
+
'The thread is composing itself',
|
|
1656
|
+
'The lock file has a hard time',
|
|
1657
|
+
'Rewording the schema',
|
|
1658
|
+
'Quietly hoping nobody asked',
|
|
1659
|
+
'Finding its mark',
|
|
1660
|
+
'The pointer pointed at a different pointer',
|
|
1661
|
+
'The linter is taking it personally',
|
|
1662
|
+
'The compiler is judging your style choices',
|
|
1663
|
+
'The build feels underappreciated',
|
|
1664
|
+
'Needing a minute',
|
|
1665
|
+
'Third coffee of the run',
|
|
1666
|
+
'Screening its calls',
|
|
1667
|
+
'Not ready to talk yet',
|
|
1668
|
+
'In a meeting',
|
|
1669
|
+
'Putting on its shoes',
|
|
1670
|
+
'Reorganizing the junk drawer',
|
|
1671
|
+
'Reading the same paragraph again',
|
|
1672
|
+
'Identity crisis in the hash table',
|
|
1673
|
+
'The replica is gaslighting the leader',
|
|
1674
|
+
'The promise is unfulfilled',
|
|
1675
|
+
'Working from home today',
|
|
1676
|
+
'The mutex is being clingy',
|
|
1677
|
+
'Looking for a pen that works',
|
|
1678
|
+
'Pretending to be asleep',
|
|
1679
|
+
'Avoiding eye contact',
|
|
1680
|
+
'Forgot what we were doing',
|
|
1681
|
+
'Checking notifications',
|
|
1682
|
+
|
|
1683
|
+
// Retro / 90s-2000s tech nostalgia
|
|
1684
|
+
'Rewinding the VHS tape',
|
|
1692
1685
|
'Waiting for the modem to finish screaming',
|
|
1693
|
-
'
|
|
1694
|
-
'
|
|
1695
|
-
'
|
|
1696
|
-
|
|
1697
|
-
'Checking if the cord is plugged into the phone jack',
|
|
1698
|
-
"The code is recording over someone's wedding",
|
|
1686
|
+
'Blowing on the cartridge',
|
|
1687
|
+
'Dial-up is connecting',
|
|
1688
|
+
'Tamagotchi died, hold on',
|
|
1689
|
+
"Recording over someone's wedding tape",
|
|
1699
1690
|
'Waiting for the CD to stop skipping',
|
|
1700
|
-
'
|
|
1701
|
-
'
|
|
1702
|
-
'
|
|
1703
|
-
'
|
|
1704
|
-
'
|
|
1705
|
-
'The
|
|
1706
|
-
'
|
|
1707
|
-
'
|
|
1708
|
-
'
|
|
1709
|
-
'
|
|
1710
|
-
'
|
|
1711
|
-
'
|
|
1712
|
-
'
|
|
1713
|
-
'
|
|
1714
|
-
'
|
|
1715
|
-
'
|
|
1716
|
-
'
|
|
1717
|
-
'
|
|
1718
|
-
'
|
|
1719
|
-
'
|
|
1720
|
-
'
|
|
1721
|
-
'The
|
|
1691
|
+
'Fast-forwarding through the commercials',
|
|
1692
|
+
'Adjusting the rabbit ears',
|
|
1693
|
+
'Stuck in the credits',
|
|
1694
|
+
'Which disc was this on again',
|
|
1695
|
+
'Setting the VCR timer',
|
|
1696
|
+
'The floppy disk is grinding',
|
|
1697
|
+
'Picking an AIM away message',
|
|
1698
|
+
'Asking Jeeves',
|
|
1699
|
+
'Reading the liner notes',
|
|
1700
|
+
'Pressed B too many times',
|
|
1701
|
+
'Trying to remember the ICQ number',
|
|
1702
|
+
'Beep — leave a message',
|
|
1703
|
+
'Untangling the landline cord',
|
|
1704
|
+
'Loading the next track',
|
|
1705
|
+
'Checking the pager',
|
|
1706
|
+
'Looking for the right jewel case',
|
|
1707
|
+
'Making a mix tape first',
|
|
1708
|
+
'Y2K is sorting itself out',
|
|
1709
|
+
'Defragmenting the disk',
|
|
1710
|
+
'Asking SmarterChild',
|
|
1711
|
+
'Stuck on the loading screen',
|
|
1712
|
+
'The Zune is buffering',
|
|
1713
|
+
'Hold on, MapQuest is printing',
|
|
1714
|
+
|
|
1715
|
+
// Movies / TV
|
|
1722
1716
|
'Show me the data',
|
|
1723
|
-
"
|
|
1724
|
-
'
|
|
1717
|
+
"Can't handle the truth",
|
|
1718
|
+
'In the pipe, five by five',
|
|
1725
1719
|
"You're gonna need a bigger server",
|
|
1726
|
-
'
|
|
1727
|
-
"
|
|
1728
|
-
'
|
|
1729
|
-
"
|
|
1730
|
-
'
|
|
1731
|
-
'
|
|
1732
|
-
'
|
|
1733
|
-
'Just when
|
|
1734
|
-
'
|
|
1735
|
-
'
|
|
1736
|
-
'
|
|
1737
|
-
'
|
|
1738
|
-
'
|
|
1739
|
-
'
|
|
1740
|
-
'
|
|
1741
|
-
'
|
|
1742
|
-
'
|
|
1743
|
-
'
|
|
1744
|
-
'
|
|
1745
|
-
'
|
|
1746
|
-
'
|
|
1747
|
-
'The
|
|
1748
|
-
'
|
|
1749
|
-
"
|
|
1750
|
-
'
|
|
1751
|
-
'
|
|
1752
|
-
'
|
|
1753
|
-
'
|
|
1754
|
-
'
|
|
1755
|
-
'
|
|
1756
|
-
'
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
'
|
|
1760
|
-
'
|
|
1761
|
-
'
|
|
1762
|
-
'
|
|
1763
|
-
'
|
|
1764
|
-
'
|
|
1765
|
-
'
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
'
|
|
1769
|
-
'
|
|
1770
|
-
'
|
|
1771
|
-
'
|
|
1772
|
-
'
|
|
1773
|
-
'
|
|
1774
|
-
'
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
'The
|
|
1779
|
-
'
|
|
1780
|
-
'
|
|
1720
|
+
'Has a bad feeling about this',
|
|
1721
|
+
"Doesn't remember asking you a damn thing",
|
|
1722
|
+
'Saying hello to my little friend',
|
|
1723
|
+
"Drafting an offer you can't refuse",
|
|
1724
|
+
'Too old for this',
|
|
1725
|
+
"I'm walking here",
|
|
1726
|
+
'On a mission from God',
|
|
1727
|
+
'Just when it thought it was out',
|
|
1728
|
+
'We can do this all day',
|
|
1729
|
+
'A world of pain',
|
|
1730
|
+
'Sleeps with the fishes',
|
|
1731
|
+
'Keyser Söze',
|
|
1732
|
+
'Get busy living, or get busy parsing',
|
|
1733
|
+
"It's not a smart database, but it knows what love is",
|
|
1734
|
+
'I see dead processes',
|
|
1735
|
+
'Coming in on Saturday',
|
|
1736
|
+
"I'm on a boat",
|
|
1737
|
+
'Shocked, shocked',
|
|
1738
|
+
'Making fetch happen',
|
|
1739
|
+
'So fetch',
|
|
1740
|
+
'Streets ahead',
|
|
1741
|
+
'The one who knocks',
|
|
1742
|
+
'Phone home',
|
|
1743
|
+
"It's heavy, it's wood",
|
|
1744
|
+
'Forgot about Dre',
|
|
1745
|
+
'Why so serious',
|
|
1746
|
+
'To infinity, and slightly past',
|
|
1747
|
+
'There is no spoon',
|
|
1748
|
+
"They're heeere",
|
|
1749
|
+
'Hasta la vista, baby',
|
|
1750
|
+
'Run, Forrest, run',
|
|
1751
|
+
|
|
1752
|
+
// Songs
|
|
1753
|
+
'Never gonna give you up',
|
|
1754
|
+
'Living on a prayer',
|
|
1755
|
+
'Wants to know what love is',
|
|
1756
|
+
'Walking on sunshine',
|
|
1757
|
+
'A material girl in a material world',
|
|
1758
|
+
'Just called to say I love you',
|
|
1759
|
+
'Waiting for tonight',
|
|
1760
|
+
"Partying like it's 1999",
|
|
1761
|
+
'Hit me baby one more time',
|
|
1762
|
+
'Bye bye bye',
|
|
1763
|
+
'Too sexy for this code',
|
|
1764
|
+
'Trapped under ice',
|
|
1765
|
+
'Turning Japanese',
|
|
1766
|
+
'Walking like an Egyptian',
|
|
1767
|
+
'Addicted to love',
|
|
1768
|
+
'Running down a dream',
|
|
1769
|
+
'Living la vida loca',
|
|
1770
|
+
'Smooth like butter',
|
|
1771
|
+
'Believes it can fly',
|
|
1772
|
+
'The one that saves you',
|
|
1773
|
+
'Not your stepping stone',
|
|
1774
|
+
'Hungry like the wolf',
|
|
1775
|
+
"Livin' on the edge",
|
|
1776
|
+
"Can't feel its face",
|
|
1777
|
+
"Don't want no scrubs",
|
|
1778
|
+
'Floating down the Liffey',
|
|
1779
|
+
'Losing its religion',
|
|
1780
|
+
'Under pressure',
|
|
1781
|
+
'Should I stay or should I go',
|
|
1782
|
+
"We didn't start the fire",
|
|
1783
|
+
"Don't stop believin'",
|
|
1784
|
+
'Take on me',
|
|
1785
|
+
'Tubthumping',
|
|
1786
|
+
'Africa, blessing the rains',
|
|
1787
|
+
|
|
1788
|
+
// Observational / Sedaris
|
|
1789
|
+
'An ex tagged me in a photo from 2007',
|
|
1790
|
+
"Translating something rude in a language I don't speak",
|
|
1791
|
+
'Calculating the smallest acceptable tip',
|
|
1792
|
+
'The woman ahead of me is buying eight ice cream sandwiches',
|
|
1793
|
+
'Reading the back of a shampoo bottle for the third time',
|
|
1794
|
+
'Counting the people who have already lapped me',
|
|
1795
|
+
'Wondering if the smell is me',
|
|
1796
|
+
"The neighbor's dog has the same name as my brother",
|
|
1797
|
+
'Trying to find a polite reason to leave',
|
|
1798
|
+
"Pretending I've already eaten",
|
|
1799
|
+
'Watching a stranger pick at their breakfast',
|
|
1800
|
+
"Pretending the question wasn't directed at me",
|
|
1801
|
+
|
|
1802
|
+
// Nonsensical / surreal
|
|
1803
|
+
'Negotiating with the moon',
|
|
1804
|
+
'Asking the door what year it is',
|
|
1805
|
+
'Sorting the bees by mood',
|
|
1806
|
+
'Folding a small grief into the laundry',
|
|
1807
|
+
'Convincing the chair it is not a chair',
|
|
1808
|
+
'Translating birdsong into legal advice',
|
|
1809
|
+
'Renaming the colors in alphabetical order',
|
|
1810
|
+
'Misplacing a feeling I had earlier',
|
|
1811
|
+
'Pulling a song out of the goose',
|
|
1812
|
+
'Counting the spoons that fell in the river',
|
|
1813
|
+
'Combing the static for a single shoe',
|
|
1814
|
+
'Rotating the silence by ninety degrees',
|
|
1815
|
+
'Boiling the alphabet down to a syrup',
|
|
1816
|
+
'Borrowing rain from a previous owner',
|
|
1817
|
+
'Whispering the password to a pigeon',
|
|
1818
|
+
'Threading the donkey through the keyhole',
|
|
1819
|
+
'Ironing the wrinkles out of a Tuesday',
|
|
1820
|
+
'Catching the verb before it gets to the bus',
|
|
1821
|
+
'Sweeping a footprint into a paper bag',
|
|
1822
|
+
'Asking the kettle to forgive me',
|
|
1823
|
+
|
|
1824
|
+
// Begrudgingly helpful coding assistant
|
|
1825
|
+
'Adding the null check you should have written',
|
|
1826
|
+
"Refactoring something you'll refactor again Tuesday",
|
|
1827
|
+
"Writing the test you weren't going to write",
|
|
1828
|
+
"Pretending I didn't see that var",
|
|
1829
|
+
'Naming things, badly, on your behalf',
|
|
1830
|
+
'Reaching for a regex against my better judgment',
|
|
1831
|
+
"Logging a variable you'll forget to remove",
|
|
1832
|
+
'Mocking the dependency you should have injected',
|
|
1833
|
+
'Apologizing in a comment for the next person',
|
|
1834
|
+
"Writing 'TODO: fix this' for the third time today",
|
|
1835
|
+
"Inferring the type you didn't annotate",
|
|
1836
|
+
'Adding a try/catch that does almost nothing',
|
|
1837
|
+
"Stubbing the function you'll forget to implement",
|
|
1838
|
+
'Returning early to spare us both',
|
|
1839
|
+
'Coercing the string you swore was a number',
|
|
1840
|
+
'Promoting the warning to an error, as requested',
|
|
1841
|
+
"Importing the seventh utility named 'utils'",
|
|
1842
|
+
'Resolving the merge conflict the boring way',
|
|
1843
|
+
"Pinning the dependency you said wouldn't matter",
|
|
1844
|
+
'Writing the comment that says what the code already says',
|
|
1845
|
+
|
|
1846
|
+
// Tired project manager
|
|
1847
|
+
'Following up on the ticket you said was almost done',
|
|
1848
|
+
'Re-opening the ticket you closed prematurely',
|
|
1849
|
+
"Drafting a kind way to say 'this is late again'",
|
|
1850
|
+
'Re-estimating the story we sized as a 3 last sprint',
|
|
1851
|
+
"Marking the milestone as 'amber' to be polite",
|
|
1852
|
+
"Counting how many tickets are quietly in 'On Hold'",
|
|
1853
|
+
"Asking, gently, what 'almost done' means",
|
|
1854
|
+
'Writing a Confluence page no one will open',
|
|
1855
|
+
'Color-coding the risk register again',
|
|
1856
|
+
'Reading the retro action items from two retros ago',
|
|
1857
|
+
'Drafting the same status email I sent in March',
|
|
1858
|
+
"Negotiating scope without using the word 'scope'",
|
|
1859
|
+
"Adding 'Communication' to the list of risks",
|
|
1860
|
+
"Translating 'I'm on it' into a date",
|
|
1861
|
+
'Filing the same risk that got filed last quarter',
|
|
1862
|
+
'Drafting a follow-up to a follow-up',
|
|
1863
|
+
'Closing tickets to make the burndown look right',
|
|
1864
|
+
'Scheduling a fifteen-minute sync that will run forty',
|
|
1865
|
+
'Reformatting the Gantt chart for legibility',
|
|
1866
|
+
"Updating 'On Track' to 'On Track*'",
|
|
1867
|
+
|
|
1868
|
+
// Designer-engineer drowning in design tokens, trying to please GTM
|
|
1869
|
+
'Adding `--brand-primary-500-darker-still` for the campaign',
|
|
1870
|
+
'Looking up which token replaced `gray-600`',
|
|
1871
|
+
'Renaming `bg-card` to `surface-elevated-default`',
|
|
1872
|
+
'Adjusting the hero h1 by half a rem, again',
|
|
1873
|
+
'Apologizing to a/b test variant C',
|
|
1874
|
+
'Inventing a token to match a Figma fill nobody published',
|
|
1875
|
+
"Asking GTM what 'a little more energy' means",
|
|
1876
|
+
'Auditing for the seventh shade of off-white',
|
|
1877
|
+
'Versioning `button-primary` to `button-primary-v3`',
|
|
1878
|
+
'Migrating from semantic tokens to semantic tokens',
|
|
1879
|
+
'Sourcing the brand purple no one can find',
|
|
1880
|
+
'Patching the design system at 4:51pm',
|
|
1881
|
+
'Mapping the Figma variable that maps to nothing',
|
|
1882
|
+
'Unblocking the campaign with a one-off override',
|
|
1883
|
+
"Translating 'punchier' into a kerning value",
|
|
1884
|
+
'Re-exporting tokens to JSON, JS, CSS, and Sass',
|
|
1885
|
+
"Convincing GTM that 'pop' is not a CSS property",
|
|
1886
|
+
"Drafting the reply to 'can we make it more vibrant'",
|
|
1887
|
+
'Showing GTM the same hex code from three angles',
|
|
1888
|
+
'Promising the launch banner respects dark mode',
|
|
1889
|
+
|
|
1890
|
+
// CTO hiding tech debt with toxic positivity
|
|
1891
|
+
'Celebrating the resilience of our pre-2019 codebase',
|
|
1892
|
+
"Onboarding the third 'temporary' migration script",
|
|
1893
|
+
"Reframing the database hotspot as a 'core competency'",
|
|
1894
|
+
'Excited to revisit our auth strategy',
|
|
1895
|
+
'Doubling down on our trusted singletons',
|
|
1896
|
+
'Spinning up another postmortem with great learnings',
|
|
1897
|
+
"Calling our jQuery integration 'mature'",
|
|
1898
|
+
'Unifying our two billing systems by adding a third',
|
|
1899
|
+
'Aligning on a path forward we already aligned on',
|
|
1900
|
+
"Reframing 'flaky' as 'human-in-the-loop friendly'",
|
|
1901
|
+
'Loving the optionality this technical decision created',
|
|
1902
|
+
'Welcoming an exciting new opportunity to refactor',
|
|
1903
|
+
'Praising the elegance of our YAML-as-code',
|
|
1904
|
+
"Branding the legacy service as 'foundational'",
|
|
1905
|
+
"Inspired by the team's commitment to deferred elegance",
|
|
1906
|
+
'Embracing the resilience of bash scripts as orchestration',
|
|
1907
|
+
'Sharing my excitement about our technical debt journey',
|
|
1908
|
+
'Grateful for the chance to fix the same outage again',
|
|
1909
|
+
"Leaning into our culture of 'ship and iterate'",
|
|
1910
|
+
'Recognizing the heroes who keep the war room calm',
|
|
1781
1911
|
],
|
|
1782
1912
|
|
|
1783
1913
|
// ============================================================================
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@protolabsai/proto",
|
|
3
|
-
"version": "0.26.
|
|
3
|
+
"version": "0.26.12",
|
|
4
4
|
"description": "proto - AI-powered coding agent",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"bundled"
|
|
22
22
|
],
|
|
23
23
|
"config": {
|
|
24
|
-
"sandboxImageUri": "ghcr.io/qwenlm/qwen-code:0.26.
|
|
24
|
+
"sandboxImageUri": "ghcr.io/qwenlm/qwen-code:0.26.12"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {},
|
|
27
27
|
"optionalDependencies": {
|