pi-one-ui 0.1.1 → 0.2.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/README.md +66 -39
- package/extensions/{shell → app/commands}/settings-previews.ts +7 -7
- package/extensions/app/config/renderer.ts +13 -63
- package/extensions/app/config/shell.ts +24 -138
- package/extensions/app/config/store.ts +290 -0
- package/extensions/app/host/pi-extension-port.ts +25 -0
- package/extensions/app/host/pi-ui-port.ts +52 -0
- package/extensions/app/host/tui-capabilities.ts +27 -0
- package/extensions/app/overlay/input-router.ts +63 -0
- package/extensions/app/overlay/overlay-manager.ts +39 -0
- package/extensions/{shell → app/overlay}/selector-border.ts +3 -3
- package/extensions/app/overlay/selector-controller.ts +104 -0
- package/extensions/app/ownership/layout-registry.ts +65 -0
- package/extensions/app/ownership.ts +21 -7
- package/extensions/app/panel.ts +261 -140
- package/extensions/app/runtime/event-coordinator.ts +84 -0
- package/extensions/app/runtime/render-scheduler.ts +56 -0
- package/extensions/app/runtime/runtime-state.ts +83 -0
- package/extensions/app/runtime/tui-runtime.ts +546 -0
- package/extensions/features/{context.ts → context-inspector/index.ts} +30 -23
- package/extensions/features/{shell/flush-docked-bash.ts → flush-docked-bash.ts} +1 -4
- package/extensions/index.ts +2 -48
- package/extensions/layouts/context/index.ts +188 -0
- package/extensions/{shell → layouts/context/message}/user-message-styles.ts +2 -2
- package/extensions/{shell → layouts/context/message}/user-message.ts +2 -2
- package/extensions/{transcript → layouts/context}/renderer/compact-mode.ts +17 -13
- package/extensions/layouts/context/renderer/context-refresh.ts +79 -0
- package/extensions/{transcript → layouts/context}/renderer/default-mode.ts +3 -3
- package/extensions/{transcript → layouts/context}/renderer/index.ts +14 -14
- package/extensions/{transcript → layouts/context}/renderer/mouse/hover.ts +2 -2
- package/extensions/{transcript → layouts/context}/renderer/mouse/interaction.ts +26 -7
- package/extensions/{transcript → layouts/context}/renderer/mouse/layout.ts +1 -1
- package/extensions/{transcript → layouts/context}/renderer/mouse/packets.ts +3 -3
- package/extensions/{transcript → layouts/context}/renderer/mouse/scroll.ts +12 -7
- package/extensions/{transcript → layouts/context}/renderer/tool/diff/diff-component.ts +2 -2
- package/extensions/{transcript → layouts/context}/renderer/tool/diff/diff-edit-render.ts +1 -1
- package/extensions/{transcript → layouts/context}/renderer/tool/diff/diff-highlight.ts +1 -1
- package/extensions/{transcript → layouts/context}/renderer/tool/diff/diff-layout.ts +1 -1
- package/extensions/{transcript → layouts/context}/renderer/tool/diff/diff-limits.ts +1 -1
- package/extensions/{transcript → layouts/context}/renderer/tool/diff/diff-palette.ts +1 -1
- package/extensions/{transcript → layouts/context}/renderer/tool/diff/diff-presentation.ts +1 -1
- package/extensions/{transcript → layouts/context}/renderer/tool/diff/diff-renderer.ts +1 -1
- package/extensions/{transcript → layouts/context}/renderer/tool/diff/diff-write-render.ts +1 -1
- package/extensions/{transcript → layouts/context}/renderer/tool/diff/index.ts +2 -2
- package/extensions/{transcript → layouts/context}/renderer/tool/grouping.ts +4 -4
- package/extensions/{transcript → layouts/context}/renderer/tool/message-display.ts +6 -4
- package/extensions/{transcript → layouts/context}/renderer/tool/names.ts +2 -2
- package/extensions/{transcript → layouts/context}/renderer/tool/result.ts +3 -3
- package/extensions/{features/agent-summary → layouts/context/summary}/core.ts +1 -1
- package/extensions/{features → layouts/context/thinking}/compact-thinking.ts +7 -7
- package/extensions/{shell → layouts/editor}/accent-rail-editor.ts +8 -8
- package/extensions/{shell → layouts/editor}/completion-menu.ts +3 -6
- package/extensions/layouts/editor/controller.ts +613 -0
- package/extensions/{shell → layouts/editor}/editor-metadata-format.ts +6 -3
- package/extensions/layouts/editor/factory.ts +159 -0
- package/extensions/layouts/editor/index.ts +16 -0
- package/extensions/{shell → layouts/editor}/minimalist-editor.ts +4 -4
- package/extensions/layouts/editor/ownership.ts +103 -0
- package/extensions/{shell → layouts/editor}/ui.ts +2 -2
- package/extensions/layouts/footer/controller.ts +392 -0
- package/extensions/layouts/footer/data.ts +41 -0
- package/extensions/{shell → layouts/footer}/extension-status.ts +2 -2
- package/extensions/{shell → layouts/footer}/footer-layout.ts +1 -1
- package/extensions/{shell → layouts/footer}/footer.ts +11 -8
- package/extensions/layouts/footer/index.ts +24 -0
- package/extensions/layouts/header/index.ts +5 -0
- package/extensions/{features/shell → layouts/header}/startup-header.ts +105 -19
- package/extensions/layouts/working-line/controller.ts +291 -0
- package/extensions/{shell → layouts/working-line}/interaction-summary.ts +3 -3
- package/extensions/{shell → layouts/working-line}/working-line-spinners.ts +1 -1
- package/extensions/{shell → layouts/working-line}/working-line.ts +4 -4
- package/extensions/{shell → services}/live-context.ts +29 -1
- package/extensions/services/project-refresh.ts +374 -0
- package/extensions/{shell → services}/project-state.ts +5 -5
- package/extensions/{shell/state.ts → services/session-state.ts} +75 -5
- package/extensions/{shell → shared}/format.ts +4 -4
- package/extensions/tools/component-tree.ts +6 -6
- package/package.json +4 -4
- package/extensions/shell/index.ts +0 -1659
- package/extensions/shell/project-refresh.ts +0 -130
- package/extensions/shell/settings-command.ts +0 -2144
- package/extensions/transcript/index.ts +0 -65
- package/extensions/transcript/renderer/transcript-refresh.ts +0 -79
- /package/extensions/{shell → app/ownership}/prototype-patch-registry.ts +0 -0
- /package/extensions/{shell → app/runtime}/session-lifecycle.ts +0 -0
- /package/extensions/features/{shell/aliases.ts → aliases.ts} +0 -0
- /package/extensions/features/{shell → legacy}/working-message.ts +0 -0
- /package/extensions/features/{reference → session-reference}/index.ts +0 -0
- /package/extensions/features/{reference → session-reference}/session.ts +0 -0
- /package/extensions/features/{reference/subagent.ts → subagent-autocomplete.ts} +0 -0
- /package/extensions/{shell → layouts/context/message}/user-message-osc.ts +0 -0
- /package/extensions/{transcript → layouts/context}/renderer/markdown-enhance.ts +0 -0
- /package/extensions/{transcript → layouts/context}/renderer/tool/diff/ATTRIBUTION.md +0 -0
- /package/extensions/{transcript → layouts/context}/renderer/tool/diff/ansi-utils.ts +0 -0
- /package/extensions/{transcript → layouts/context}/renderer/tool/diff/diff-header.ts +0 -0
- /package/extensions/{transcript → layouts/context}/renderer/tool/diff/diff-inline.ts +0 -0
- /package/extensions/{transcript → layouts/context}/renderer/tool/diff/diff-parse.ts +0 -0
- /package/extensions/{transcript → layouts/context}/renderer/tool/diff/diff-text.ts +0 -0
- /package/extensions/{transcript → layouts/context}/renderer/tool/diff/line-width-safety.ts +0 -0
- /package/extensions/{transcript → layouts/context}/renderer/tool/diff/shiki-highlight.ts +0 -0
- /package/extensions/{transcript → layouts/context}/renderer/tool/diff/write-execution.ts +0 -0
- /package/extensions/{transcript → layouts/context}/renderer/tool/show-more-hint.ts +0 -0
- /package/extensions/{features/agent-summary → layouts/context/summary}/index.ts +0 -0
- /package/extensions/{shell → layouts/editor}/accent-rail-layout-patch.ts +0 -0
- /package/extensions/{shell → layouts/editor}/editor-transfer.ts +0 -0
- /package/extensions/{shell → layouts/footer}/footer-format.ts +0 -0
- /package/extensions/{shell → layouts/working-line}/working-line-messages.ts +0 -0
- /package/extensions/{shell/git.ts → services/git-data.ts} +0 -0
- /package/extensions/{shell/package-version.ts → services/package-data.ts} +0 -0
- /package/extensions/{shell/runtime.ts → services/runtime-data.ts} +0 -0
- /package/extensions/{shell → services}/telemetry.ts +0 -0
- /package/extensions/{shell → shared}/icons.ts +0 -0
- /package/extensions/{shell → shared}/style.ts +0 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
|
|
3
|
+
export const RUNTIME_EVENTS = [
|
|
4
|
+
"session_start",
|
|
5
|
+
"session_shutdown",
|
|
6
|
+
"agent_start",
|
|
7
|
+
"agent_end",
|
|
8
|
+
"agent_settled",
|
|
9
|
+
"turn_start",
|
|
10
|
+
"message_update",
|
|
11
|
+
"message_end",
|
|
12
|
+
"tool_execution_start",
|
|
13
|
+
"tool_execution_end",
|
|
14
|
+
"model_select",
|
|
15
|
+
"thinking_level_select",
|
|
16
|
+
"session_info_changed",
|
|
17
|
+
"session_compact",
|
|
18
|
+
"session_tree",
|
|
19
|
+
] as const;
|
|
20
|
+
|
|
21
|
+
export type RuntimeEventName = (typeof RUNTIME_EVENTS)[number];
|
|
22
|
+
export type RuntimeEventHandler = (
|
|
23
|
+
event: unknown,
|
|
24
|
+
ctx: ExtensionContext,
|
|
25
|
+
) => void | Promise<void>;
|
|
26
|
+
|
|
27
|
+
export type EventRegistrar = {
|
|
28
|
+
on(event: RuntimeEventName, handler: RuntimeEventHandler): void;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Provides the central host event seam used while legacy listeners migrate.
|
|
33
|
+
*/
|
|
34
|
+
export class EventCoordinator {
|
|
35
|
+
private readonly registrar: EventRegistrar;
|
|
36
|
+
private readonly handlers = new Map<
|
|
37
|
+
RuntimeEventName,
|
|
38
|
+
Set<RuntimeEventHandler>
|
|
39
|
+
>();
|
|
40
|
+
private installed = false;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Creates a coordinator backed by the host event registrar.
|
|
44
|
+
*
|
|
45
|
+
* @param registrar Host adapter used to install event listeners.
|
|
46
|
+
*/
|
|
47
|
+
constructor(registrar: EventRegistrar) {
|
|
48
|
+
this.registrar = registrar;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Registers a handler for one coordinated runtime event.
|
|
53
|
+
*
|
|
54
|
+
* @returns A function that removes the handler.
|
|
55
|
+
*/
|
|
56
|
+
on(event: RuntimeEventName, handler: RuntimeEventHandler): () => void {
|
|
57
|
+
const handlers = this.handlers.get(event) ?? new Set<RuntimeEventHandler>();
|
|
58
|
+
handlers.add(handler);
|
|
59
|
+
this.handlers.set(event, handlers);
|
|
60
|
+
return () => handlers.delete(handler);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Installs one host listener per coordinated event.
|
|
65
|
+
*/
|
|
66
|
+
install(): void {
|
|
67
|
+
if (this.installed) return;
|
|
68
|
+
this.installed = true;
|
|
69
|
+
for (const event of RUNTIME_EVENTS) {
|
|
70
|
+
this.registrar.on(event, (payload, ctx) => {
|
|
71
|
+
let pending: Promise<void> | undefined;
|
|
72
|
+
for (const handler of this.handlers.get(event) ?? []) {
|
|
73
|
+
if (pending) {
|
|
74
|
+
pending = pending.then(() => handler(payload, ctx)).then(() => {});
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
const result = handler(payload, ctx);
|
|
78
|
+
if (result instanceof Promise) pending = result.then(() => {});
|
|
79
|
+
}
|
|
80
|
+
return pending;
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export type RenderRequest = (force: boolean) => void;
|
|
2
|
+
export type RenderSchedule = (run: () => void) => void;
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Coalesces render requests emitted by multiple layouts in one turn.
|
|
6
|
+
*/
|
|
7
|
+
export class RenderScheduler {
|
|
8
|
+
private readonly requestRender: RenderRequest;
|
|
9
|
+
private readonly schedule: RenderSchedule;
|
|
10
|
+
private scheduled = false;
|
|
11
|
+
private forced = false;
|
|
12
|
+
private disposed = false;
|
|
13
|
+
|
|
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
|
+
constructor(
|
|
21
|
+
requestRender: RenderRequest,
|
|
22
|
+
schedule: RenderSchedule = queueMicrotask,
|
|
23
|
+
) {
|
|
24
|
+
this.requestRender = requestRender;
|
|
25
|
+
this.schedule = schedule;
|
|
26
|
+
}
|
|
27
|
+
|
|
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
|
+
request(force = false): void {
|
|
34
|
+
if (this.disposed) return;
|
|
35
|
+
this.forced ||= force;
|
|
36
|
+
if (this.scheduled) return;
|
|
37
|
+
|
|
38
|
+
this.scheduled = true;
|
|
39
|
+
this.schedule(() => {
|
|
40
|
+
this.scheduled = false;
|
|
41
|
+
if (this.disposed) return;
|
|
42
|
+
const forced = this.forced;
|
|
43
|
+
this.forced = false;
|
|
44
|
+
this.requestRender(forced);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Cancels future callbacks and makes later requests no-ops.
|
|
50
|
+
*/
|
|
51
|
+
dispose(): void {
|
|
52
|
+
this.disposed = true;
|
|
53
|
+
this.scheduled = false;
|
|
54
|
+
this.forced = false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
export type RuntimePhase = "idle" | "active";
|
|
2
|
+
|
|
3
|
+
export type RuntimeState = Readonly<{
|
|
4
|
+
phase: RuntimePhase;
|
|
5
|
+
generation: number;
|
|
6
|
+
mode?: string;
|
|
7
|
+
}>;
|
|
8
|
+
|
|
9
|
+
export type RuntimeStateListener = (state: RuntimeState) => void;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Stores session-level runtime state while Pi keeps ownership of context data.
|
|
13
|
+
*/
|
|
14
|
+
export class RuntimeStateStore {
|
|
15
|
+
private currentState: RuntimeState = { phase: "idle", generation: 0 };
|
|
16
|
+
private readonly listeners = new Set<RuntimeStateListener>();
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Returns the latest immutable runtime state snapshot.
|
|
20
|
+
*/
|
|
21
|
+
snapshot(): RuntimeState {
|
|
22
|
+
return this.currentState;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Starts a new runtime generation.
|
|
27
|
+
*
|
|
28
|
+
* @returns The generation token owned by the new session.
|
|
29
|
+
*/
|
|
30
|
+
start(mode?: string): number {
|
|
31
|
+
const generation = this.currentState.generation + 1;
|
|
32
|
+
this.currentState = { phase: "active", generation, mode };
|
|
33
|
+
this.notify();
|
|
34
|
+
return generation;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Stops the current generation unless a newer generation is active.
|
|
39
|
+
*
|
|
40
|
+
* @param generation Optional token used to reject stale shutdown callbacks.
|
|
41
|
+
*/
|
|
42
|
+
shutdown(generation?: number): void {
|
|
43
|
+
if (
|
|
44
|
+
generation !== undefined &&
|
|
45
|
+
generation !== this.currentState.generation
|
|
46
|
+
) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
this.currentState = {
|
|
50
|
+
phase: "idle",
|
|
51
|
+
generation: this.currentState.generation,
|
|
52
|
+
};
|
|
53
|
+
this.notify();
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Reports whether a generation token still owns the active runtime.
|
|
58
|
+
*/
|
|
59
|
+
isCurrent(generation: number): boolean {
|
|
60
|
+
return (
|
|
61
|
+
this.currentState.phase === "active" &&
|
|
62
|
+
this.currentState.generation === generation
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Subscribes to runtime state transitions.
|
|
68
|
+
*
|
|
69
|
+
* @returns A function that removes the listener.
|
|
70
|
+
*/
|
|
71
|
+
subscribe(listener: RuntimeStateListener): () => void {
|
|
72
|
+
this.listeners.add(listener);
|
|
73
|
+
return () => this.listeners.delete(listener);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Notifies listeners using the current state snapshot.
|
|
78
|
+
*/
|
|
79
|
+
private notify(): void {
|
|
80
|
+
const snapshot = this.snapshot();
|
|
81
|
+
for (const listener of this.listeners) listener(snapshot);
|
|
82
|
+
}
|
|
83
|
+
}
|