pi-one-ui 0.7.0 → 0.7.1
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/CHANGELOG.md +25 -1
- package/README.en.md +19 -6
- package/README.md +19 -6
- package/extensions/app/config/context.ts +42 -0
- package/extensions/app/config/editor.ts +80 -0
- package/extensions/app/config/footer.ts +291 -0
- package/extensions/app/config/panel.ts +1 -5
- package/extensions/app/config/renderer.ts +1 -6
- package/extensions/app/config/shell.ts +358 -1435
- package/extensions/app/config/store.ts +22 -1
- package/extensions/app/config/values.ts +33 -0
- package/extensions/app/config/working-line.ts +100 -0
- package/extensions/app/overlay/input-router.ts +56 -32
- package/extensions/app/overlay/overlay-manager.ts +183 -21
- package/extensions/app/runtime/event-coordinator.ts +90 -42
- package/extensions/{features → app/runtime}/flush-docked-bash.ts +12 -2
- package/extensions/app/runtime/render-scheduler.ts +35 -31
- package/extensions/app/runtime/tui-runtime.ts +315 -312
- package/extensions/app/settings/controller.ts +202 -0
- package/extensions/app/settings/panel.ts +81 -0
- package/extensions/app/settings/presets.ts +43 -0
- package/extensions/features/context-inspector/index.ts +83 -662
- package/extensions/layouts/context/index.ts +58 -161
- package/extensions/layouts/context/message/user-message.ts +1 -1
- package/extensions/layouts/context/renderer/index.ts +31 -13
- package/extensions/layouts/context/renderer/mouse/interaction.ts +29 -14
- package/extensions/layouts/editor/controller.ts +9 -18
- package/extensions/layouts/editor/factory.ts +3 -3
- package/extensions/layouts/footer/controller.ts +30 -19
- package/extensions/layouts/footer/footer.ts +2 -2
- package/extensions/layouts/overlay/context-inspector.ts +497 -0
- package/extensions/{app → layouts}/overlay/selector-border.ts +5 -5
- package/extensions/{app → layouts}/overlay/selector-controller.ts +1 -1
- package/extensions/layouts/overlay/settings-panel.ts +359 -0
- package/extensions/{app/commands → layouts/overlay}/settings-previews.ts +4 -4
- package/extensions/layouts/working-line/controller.ts +3 -29
- package/extensions/layouts/working-line/working-line.ts +17 -114
- package/extensions/shared/working-line-text.ts +108 -0
- package/package.json +1 -1
- package/extensions/app/host/pi-extension-port.ts +0 -25
- package/extensions/app/host/pi-ui-port.ts +0 -52
- package/extensions/app/host/tui-capabilities.ts +0 -27
- package/extensions/app/ownership/layout-registry.ts +0 -65
- package/extensions/app/ownership.ts +0 -32
- package/extensions/app/panel.ts +0 -770
- package/extensions/app/presets.ts +0 -35
- package/extensions/app/runtime/runtime-state.ts +0 -83
- /package/extensions/{layouts/working-line → app/config}/working-line-messages.ts +0 -0
- /package/extensions/app/{ownership → runtime}/prototype-patch-registry.ts +0 -0
|
@@ -4,7 +4,10 @@
|
|
|
4
4
|
* 在 handleBashCommand 收尾补一次 flush。
|
|
5
5
|
*/
|
|
6
6
|
import { InteractiveMode } from "@earendil-works/pi-coding-agent";
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
FLUSH_DOCKED_BASH_PATCH,
|
|
9
|
+
patchRegistry,
|
|
10
|
+
} from "../../tools/patch-keys.ts";
|
|
8
11
|
|
|
9
12
|
type Patch = {
|
|
10
13
|
active: boolean;
|
|
@@ -13,7 +16,7 @@ type Patch = {
|
|
|
13
16
|
installed: (...args: any[]) => unknown;
|
|
14
17
|
};
|
|
15
18
|
|
|
16
|
-
export function installFlushDockedBash(): void {
|
|
19
|
+
export function installFlushDockedBash(): () => void {
|
|
17
20
|
const prototype = InteractiveMode.prototype as any;
|
|
18
21
|
const previous = patchRegistry.get<Patch>(FLUSH_DOCKED_BASH_PATCH);
|
|
19
22
|
if (previous) previous.active = false;
|
|
@@ -33,4 +36,11 @@ export function installFlushDockedBash(): void {
|
|
|
33
36
|
};
|
|
34
37
|
prototype.handleBashCommand = patch.installed;
|
|
35
38
|
patchRegistry.install(FLUSH_DOCKED_BASH_PATCH, patch);
|
|
39
|
+
return () => {
|
|
40
|
+
patch.active = false;
|
|
41
|
+
if (prototype.handleBashCommand === patch.installed) {
|
|
42
|
+
prototype.handleBashCommand = patch.original;
|
|
43
|
+
}
|
|
44
|
+
patchRegistry.dispose(FLUSH_DOCKED_BASH_PATCH, patch);
|
|
45
|
+
};
|
|
36
46
|
}
|
|
@@ -1,56 +1,60 @@
|
|
|
1
1
|
export type RenderRequest = (force: boolean) => void;
|
|
2
2
|
export type RenderSchedule = (run: () => void) => void;
|
|
3
3
|
|
|
4
|
-
/**
|
|
5
|
-
* Coalesces render requests emitted by multiple layouts in one turn.
|
|
6
|
-
*/
|
|
4
|
+
/** 一个运行时对应一个 Pi TUI;组件提供同一界面的刷新入口。 */
|
|
7
5
|
export class RenderScheduler {
|
|
8
|
-
private readonly
|
|
9
|
-
private
|
|
6
|
+
private readonly renderers = new Map<object, RenderRequest>();
|
|
7
|
+
private generation = 0;
|
|
10
8
|
private scheduled = false;
|
|
11
9
|
private forced = false;
|
|
12
10
|
private disposed = false;
|
|
13
11
|
|
|
14
|
-
/**
|
|
15
|
-
* Creates a scheduler for a concrete render callback.
|
|
16
|
-
*
|
|
17
|
-
* @param requestRender Callback that renders the active TUI.
|
|
18
|
-
* @param schedule Microtask scheduler used to coalesce requests.
|
|
19
|
-
*/
|
|
20
12
|
constructor(
|
|
21
|
-
requestRender
|
|
22
|
-
schedule: RenderSchedule = queueMicrotask,
|
|
23
|
-
) {
|
|
24
|
-
|
|
25
|
-
|
|
13
|
+
private readonly requestRender?: RenderRequest,
|
|
14
|
+
private readonly schedule: RenderSchedule = queueMicrotask,
|
|
15
|
+
) {}
|
|
16
|
+
|
|
17
|
+
register(owner: object, render: RenderRequest | undefined): void {
|
|
18
|
+
if (render) {
|
|
19
|
+
this.renderers.set(owner, render);
|
|
20
|
+
} else {
|
|
21
|
+
this.renderers.delete(owner);
|
|
22
|
+
}
|
|
26
23
|
}
|
|
27
24
|
|
|
28
|
-
/**
|
|
29
|
-
* Queues one render and preserves forced redraw priority.
|
|
30
|
-
*
|
|
31
|
-
* @param force Whether the pending render must be a full redraw.
|
|
32
|
-
*/
|
|
33
25
|
request(force = false): void {
|
|
34
|
-
if (this.disposed)
|
|
26
|
+
if (this.disposed) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
35
29
|
this.forced ||= force;
|
|
36
|
-
if (this.scheduled)
|
|
37
|
-
|
|
30
|
+
if (this.scheduled) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
38
33
|
this.scheduled = true;
|
|
34
|
+
const generation = this.generation;
|
|
39
35
|
this.schedule(() => {
|
|
36
|
+
if (this.disposed || generation !== this.generation) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
40
39
|
this.scheduled = false;
|
|
41
|
-
if (this.disposed) return;
|
|
42
40
|
const forced = this.forced;
|
|
43
41
|
this.forced = false;
|
|
44
|
-
this.requestRender(
|
|
42
|
+
const render = this.requestRender ?? this.renderers.values().next().value;
|
|
43
|
+
render?.(forced);
|
|
45
44
|
});
|
|
46
45
|
}
|
|
47
46
|
|
|
48
|
-
/**
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
dispose(): void {
|
|
52
|
-
this.disposed = true;
|
|
47
|
+
/** 清除当前 session 的入口与请求,旧回调不能消费新 session 的请求。 */
|
|
48
|
+
reset(): void {
|
|
49
|
+
this.generation += 1;
|
|
53
50
|
this.scheduled = false;
|
|
54
51
|
this.forced = false;
|
|
52
|
+
this.disposed = false;
|
|
53
|
+
this.renderers.clear();
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
dispose(): void {
|
|
57
|
+
this.reset();
|
|
58
|
+
this.disposed = true;
|
|
55
59
|
}
|
|
56
60
|
}
|