@kenkaiiii/ggcoder 4.3.150 → 4.3.151

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/ui/render.js CHANGED
@@ -12,19 +12,59 @@ function ThemeProvider({ initial, children, }) {
12
12
  const setTheme = React.useCallback((name) => setThemeName(name), []);
13
13
  return React.createElement(SetThemeContext.Provider, { value: setTheme }, React.createElement(ThemeContext.Provider, { value: theme }, children));
14
14
  }
15
+ const INK_OPTIONS = {
16
+ // Enable kitty keyboard protocol so terminals that support it can
17
+ // distinguish Shift+Enter from Enter (needed for multiline input).
18
+ // Terminals without support gracefully ignore this.
19
+ kittyKeyboard: {
20
+ mode: "enabled",
21
+ flags: ["disambiguateEscapeCodes"],
22
+ },
23
+ // Ink's built-in exitOnCtrlC checks for the raw \x03 byte, but with
24
+ // kitty keyboard protocol Ctrl+C arrives as \x1b[99;5u so the check
25
+ // never matches. Worse, useInput skips calling our handler when
26
+ // exitOnCtrlC is true. Disable it so our InputArea handles Ctrl+C.
27
+ exitOnCtrlC: false,
28
+ };
15
29
  export async function renderApp(config) {
16
30
  const themeSetting = config.theme ?? "auto";
17
31
  const resolvedTheme = themeSetting === "auto" ? await detectTheme() : themeSetting;
18
32
  // Clear screen + scrollback so old commands don't appear above the TUI
19
33
  process.stdout.write("\x1b[2J\x1b[3J\x1b[H");
20
- const { waitUntilExit } = render(React.createElement(ThemeProvider, { initial: resolvedTheme }, React.createElement(TerminalSizeProvider, null, React.createElement(AnimationProvider, null, React.createElement(App, {
21
- provider: config.provider,
34
+ // Runtime state lives in this closure so unmount/remount doesn't lose
35
+ // the user's runtime model/provider/thinking choices.
36
+ const runtimeState = {
22
37
  model: config.model,
38
+ provider: config.provider,
39
+ thinking: config.thinking,
40
+ };
41
+ const onRuntimeStateChange = (updates) => {
42
+ Object.assign(runtimeState, updates);
43
+ };
44
+ // Session state — App mirrors its React state here via useEffects, so
45
+ // remounts (overlay close, plan reject) can re-seed from the snapshot
46
+ // without losing the conversation.
47
+ const sessionStore = {
48
+ messages: config.messages,
49
+ history: config.initialHistory ?? [{ kind: "banner", id: "banner" }],
50
+ approvedPlanPath: undefined,
51
+ planSteps: [],
52
+ sessionPath: config.sessionPath,
53
+ sessionTitle: undefined,
54
+ sessionTitleGenerated: false,
55
+ overlay: config.initialOverlay ?? null,
56
+ planAutoExpand: false,
57
+ pendingAction: undefined,
58
+ };
59
+ const ref = { instance: null };
60
+ const buildElement = () => React.createElement(ThemeProvider, { initial: resolvedTheme }, React.createElement(TerminalSizeProvider, null, React.createElement(AnimationProvider, null, React.createElement(App, {
61
+ provider: runtimeState.provider,
62
+ model: runtimeState.model,
23
63
  tools: config.tools,
24
64
  webSearch: config.webSearch,
25
- messages: config.messages,
65
+ messages: sessionStore.messages,
26
66
  maxTokens: config.maxTokens,
27
- thinking: config.thinking,
67
+ thinking: runtimeState.thinking,
28
68
  apiKey: config.apiKey,
29
69
  baseUrl: config.baseUrl,
30
70
  accountId: config.accountId,
@@ -35,9 +75,9 @@ export async function renderApp(config) {
35
75
  onSlashCommand: config.onSlashCommand,
36
76
  loggedInProviders: config.loggedInProviders,
37
77
  credentialsByProvider: config.credentialsByProvider,
38
- initialHistory: config.initialHistory,
78
+ initialHistory: sessionStore.history,
39
79
  sessionsDir: config.sessionsDir,
40
- sessionPath: config.sessionPath,
80
+ sessionPath: sessionStore.sessionPath,
41
81
  processManager: config.processManager,
42
82
  settingsFile: config.settingsFile,
43
83
  mcpManager: config.mcpManager,
@@ -48,24 +88,62 @@ export async function renderApp(config) {
48
88
  skills: config.skills,
49
89
  initialOverlay: config.initialOverlay,
50
90
  rebuildToolsForCwd: config.rebuildToolsForCwd,
51
- })))), {
52
- // Enable kitty keyboard protocol so terminals that support it can
53
- // distinguish Shift+Enter from Enter (needed for multiline input).
54
- // Terminals without support gracefully ignore this.
55
- kittyKeyboard: {
56
- mode: "enabled",
57
- flags: ["disambiguateEscapeCodes"],
58
- },
59
- // Ink's built-in exitOnCtrlC checks for the raw \x03 byte, but with
60
- // kitty keyboard protocol Ctrl+C arrives as \x1b[99;5u so the check
61
- // never matches. Worse, useInput skips calling our handler when
62
- // exitOnCtrlC is true. Disable it so our InputArea handles Ctrl+C.
63
- exitOnCtrlC: false,
64
- });
65
- // Resize handling lives entirely in useTerminalSize: it clears the screen,
66
- // bumps resizeKey to remount <Static>, and Ink's own internal resized()
67
- // handler (ink/build/ink.js) recalculates layout and re-renders. A second
68
- // debounced clear() here was racing with both, leaving partial output.
69
- await waitUntilExit();
91
+ resetUI,
92
+ onRuntimeStateChange,
93
+ sessionStore,
94
+ }))));
95
+ // Nuke-and-rebuild for every path that clears the screen. Patching Ink's
96
+ // internal frame tracking (log-update reset, lastOutput cleared,
97
+ // fullStaticOutput dropped) looks correct for one frame but the live area
98
+ // drifts on subsequent streaming responses — Ink's cursor math depends on
99
+ // terminal-state assumptions that ANSI clearing breaks. The only RELIABLE
100
+ // reset is to tear down the React tree entirely and render a fresh Ink
101
+ // instance. gg-boss arrived at the same conclusion (orchestrator-app.tsx).
102
+ function resetUI(options) {
103
+ const old = ref.instance;
104
+ if (!old)
105
+ return;
106
+ if (options?.wipeSession) {
107
+ // Wipe everything session-scoped FIRST. Other options below can then
108
+ // re-seed specific fields (e.g. plan accept wipes the chat then sets
109
+ // approvedPlanPath + planSteps for the implementation phase).
110
+ sessionStore.history = [{ kind: "banner", id: "banner" }];
111
+ sessionStore.approvedPlanPath = undefined;
112
+ sessionStore.planSteps = [];
113
+ sessionStore.sessionTitle = undefined;
114
+ sessionStore.sessionTitleGenerated = false;
115
+ }
116
+ if (options?.messages)
117
+ sessionStore.messages = options.messages;
118
+ if (options?.history)
119
+ sessionStore.history = options.history;
120
+ if (options?.approvedPlanPath !== undefined) {
121
+ sessionStore.approvedPlanPath = options.approvedPlanPath;
122
+ }
123
+ if (options?.planSteps !== undefined)
124
+ sessionStore.planSteps = options.planSteps;
125
+ if (options?.sessionPath !== undefined)
126
+ sessionStore.sessionPath = options.sessionPath;
127
+ if (options?.pendingAction)
128
+ sessionStore.pendingAction = options.pendingAction;
129
+ process.stdout.write("\x1b[2J\x1b[3J\x1b[H");
130
+ old.unmount();
131
+ ref.instance = render(buildElement(), INK_OPTIONS);
132
+ }
133
+ ref.instance = render(buildElement(), INK_OPTIONS);
134
+ // Loop: when /clear remounts, the OLD instance's waitUntilExit resolves
135
+ // (because unmount() resolves it). We then need to wait on the NEW
136
+ // instance. If exit was final (no replacement), ref.instance is nulled
137
+ // by unmount and the loop ends.
138
+ while (true) {
139
+ const current = ref.instance;
140
+ if (!current)
141
+ return;
142
+ await current.waitUntilExit();
143
+ if (ref.instance === current) {
144
+ ref.instance = null;
145
+ return;
146
+ }
147
+ }
70
148
  }
71
149
  //# sourceMappingURL=render.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/ui/render.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/ui/render.ts"],"names":[],"mappings":"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"}
@@ -30,6 +30,28 @@ export declare function extractPlanSteps(planContent: string): PlanStep[];
30
30
  * not meant to be shown to the user.
31
31
  */
32
32
  export declare function stripDoneMarkers(text: string): string;
33
+ /**
34
+ * Segment of an assistant turn's text after [DONE:N] markers are split
35
+ * out for inline rendering. Used by the chat to render "✓ Step N: <desc>"
36
+ * markers in the same temporal order the agent emitted them, instead of
37
+ * stripping markers to invisible whitespace.
38
+ */
39
+ export type DisplaySegment = {
40
+ kind: "text";
41
+ text: string;
42
+ } | {
43
+ kind: "done";
44
+ stepNum: number;
45
+ description: string;
46
+ };
47
+ /**
48
+ * Split text on [DONE:N] markers, returning an array of segments. Empty/
49
+ * whitespace-only text segments are dropped. Step description is looked
50
+ * up in `steps` (falls back to "" so the renderer can show just the step
51
+ * number when the plan is no longer in scope, e.g. after onComplete
52
+ * cleared planSteps).
53
+ */
54
+ export declare function segmentDisplayText(text: string, steps: PlanStep[]): DisplaySegment[];
33
55
  /**
34
56
  * Scan text for [DONE:n] markers and return the set of completed step numbers.
35
57
  */
@@ -1 +1 @@
1
- {"version":3,"file":"plan-steps.d.ts","sourceRoot":"","sources":["../../src/utils/plan-steps.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,QAAQ;IACvB,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,EAAE,CA0BhE;AAkBD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAO9D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,QAAQ,EAAE,CAUxF"}
1
+ {"version":3,"file":"plan-steps.d.ts","sourceRoot":"","sources":["../../src/utils/plan-steps.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,QAAQ;IACvB,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,EAAE,CA0BhE;AAkBD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,cAAc,EAAE,CAwBpF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAO9D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,QAAQ,EAAE,CAUxF"}
@@ -63,6 +63,38 @@ function extractStepsSection(planContent) {
63
63
  export function stripDoneMarkers(text) {
64
64
  return text.replace(/\s*\[DONE:\d+\]\s*/gi, " ").replace(/ +/g, " ");
65
65
  }
66
+ /**
67
+ * Split text on [DONE:N] markers, returning an array of segments. Empty/
68
+ * whitespace-only text segments are dropped. Step description is looked
69
+ * up in `steps` (falls back to "" so the renderer can show just the step
70
+ * number when the plan is no longer in scope, e.g. after onComplete
71
+ * cleared planSteps).
72
+ */
73
+ export function segmentDisplayText(text, steps) {
74
+ const segments = [];
75
+ const pattern = /\[DONE:(\d+)\]/gi;
76
+ let lastIdx = 0;
77
+ for (const match of text.matchAll(pattern)) {
78
+ const matchIdx = match.index ?? 0;
79
+ const before = text.slice(lastIdx, matchIdx);
80
+ if (before.trim()) {
81
+ segments.push({ kind: "text", text: before });
82
+ }
83
+ const stepNum = parseInt(match[1], 10);
84
+ const step = steps.find((s) => s.step === stepNum);
85
+ segments.push({
86
+ kind: "done",
87
+ stepNum,
88
+ description: step?.text ?? "",
89
+ });
90
+ lastIdx = matchIdx + match[0].length;
91
+ }
92
+ const after = text.slice(lastIdx);
93
+ if (after.trim()) {
94
+ segments.push({ kind: "text", text: after });
95
+ }
96
+ return segments;
97
+ }
66
98
  /**
67
99
  * Scan text for [DONE:n] markers and return the set of completed step numbers.
68
100
  */
@@ -1 +1 @@
1
- {"version":3,"file":"plan-steps.js","sourceRoot":"","sources":["../../src/utils/plan-steps.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,iDAAiD;IACjD,MAAM,YAAY,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,YAAY,IAAI,WAAW,CAAC;IAE3C,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,4EAA4E;IAC5E,MAAM,OAAO,GAAG,iCAAiC,CAAC;IAElD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;aAChB,IAAI,EAAE;aACN,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;aACvB,IAAI,EAAE,CAAC;QACV,qDAAqD;QACrD,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7F,SAAS;QACX,CAAC;QACD,kCAAkC;QAClC,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACrB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC;QACnC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAAC,WAAmB;IAC9C,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACpD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAE1D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5C,oDAAoD;IACpD,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC7C,MAAM,cAAc,GAAG,WAAW,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClG,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACxE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,MAAM,OAAO,GAAG,kBAAkB,CAAC;IACnC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3C,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAiB,EAAE,SAAsB;IAC1E,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC7B,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;YAC1C,OAAO,GAAG,IAAI,CAAC;YACf,OAAO,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACnC,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"plan-steps.js","sourceRoot":"","sources":["../../src/utils/plan-steps.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kenkaiiii/ggcoder",
3
- "version": "4.3.150",
3
+ "version": "4.3.151",
4
4
  "type": "module",
5
5
  "description": "CLI coding agent with OAuth authentication for Anthropic and OpenAI",
6
6
  "license": "MIT",
@@ -78,8 +78,8 @@
78
78
  "string-width": "^8.2.0",
79
79
  "wrap-ansi": "^10.0.0",
80
80
  "zod": "^4.4.3",
81
- "@kenkaiiii/gg-agent": "4.3.150",
82
- "@kenkaiiii/gg-ai": "4.3.150",
81
+ "@kenkaiiii/gg-agent": "4.3.151",
82
+ "@kenkaiiii/gg-ai": "4.3.151",
83
83
  "@kenkaiiii/ggcoder-eyes": "0.1.2",
84
84
  "@kenkaiiii/gg-pixel": "4.3.94"
85
85
  },