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.
Files changed (113) hide show
  1. package/README.md +66 -39
  2. package/extensions/{shell → app/commands}/settings-previews.ts +7 -7
  3. package/extensions/app/config/renderer.ts +13 -63
  4. package/extensions/app/config/shell.ts +24 -138
  5. package/extensions/app/config/store.ts +290 -0
  6. package/extensions/app/host/pi-extension-port.ts +25 -0
  7. package/extensions/app/host/pi-ui-port.ts +52 -0
  8. package/extensions/app/host/tui-capabilities.ts +27 -0
  9. package/extensions/app/overlay/input-router.ts +63 -0
  10. package/extensions/app/overlay/overlay-manager.ts +39 -0
  11. package/extensions/{shell → app/overlay}/selector-border.ts +3 -3
  12. package/extensions/app/overlay/selector-controller.ts +104 -0
  13. package/extensions/app/ownership/layout-registry.ts +65 -0
  14. package/extensions/app/ownership.ts +21 -7
  15. package/extensions/app/panel.ts +261 -140
  16. package/extensions/app/runtime/event-coordinator.ts +84 -0
  17. package/extensions/app/runtime/render-scheduler.ts +56 -0
  18. package/extensions/app/runtime/runtime-state.ts +83 -0
  19. package/extensions/app/runtime/tui-runtime.ts +546 -0
  20. package/extensions/features/{context.ts → context-inspector/index.ts} +30 -23
  21. package/extensions/features/{shell/flush-docked-bash.ts → flush-docked-bash.ts} +1 -4
  22. package/extensions/index.ts +2 -48
  23. package/extensions/layouts/context/index.ts +188 -0
  24. package/extensions/{shell → layouts/context/message}/user-message-styles.ts +2 -2
  25. package/extensions/{shell → layouts/context/message}/user-message.ts +2 -2
  26. package/extensions/{transcript → layouts/context}/renderer/compact-mode.ts +17 -13
  27. package/extensions/layouts/context/renderer/context-refresh.ts +79 -0
  28. package/extensions/{transcript → layouts/context}/renderer/default-mode.ts +3 -3
  29. package/extensions/{transcript → layouts/context}/renderer/index.ts +14 -14
  30. package/extensions/{transcript → layouts/context}/renderer/mouse/hover.ts +2 -2
  31. package/extensions/{transcript → layouts/context}/renderer/mouse/interaction.ts +26 -7
  32. package/extensions/{transcript → layouts/context}/renderer/mouse/layout.ts +1 -1
  33. package/extensions/{transcript → layouts/context}/renderer/mouse/packets.ts +3 -3
  34. package/extensions/{transcript → layouts/context}/renderer/mouse/scroll.ts +12 -7
  35. package/extensions/{transcript → layouts/context}/renderer/tool/diff/diff-component.ts +2 -2
  36. package/extensions/{transcript → layouts/context}/renderer/tool/diff/diff-edit-render.ts +1 -1
  37. package/extensions/{transcript → layouts/context}/renderer/tool/diff/diff-highlight.ts +1 -1
  38. package/extensions/{transcript → layouts/context}/renderer/tool/diff/diff-layout.ts +1 -1
  39. package/extensions/{transcript → layouts/context}/renderer/tool/diff/diff-limits.ts +1 -1
  40. package/extensions/{transcript → layouts/context}/renderer/tool/diff/diff-palette.ts +1 -1
  41. package/extensions/{transcript → layouts/context}/renderer/tool/diff/diff-presentation.ts +1 -1
  42. package/extensions/{transcript → layouts/context}/renderer/tool/diff/diff-renderer.ts +1 -1
  43. package/extensions/{transcript → layouts/context}/renderer/tool/diff/diff-write-render.ts +1 -1
  44. package/extensions/{transcript → layouts/context}/renderer/tool/diff/index.ts +2 -2
  45. package/extensions/{transcript → layouts/context}/renderer/tool/grouping.ts +4 -4
  46. package/extensions/{transcript → layouts/context}/renderer/tool/message-display.ts +6 -4
  47. package/extensions/{transcript → layouts/context}/renderer/tool/names.ts +2 -2
  48. package/extensions/{transcript → layouts/context}/renderer/tool/result.ts +3 -3
  49. package/extensions/{features/agent-summary → layouts/context/summary}/core.ts +1 -1
  50. package/extensions/{features → layouts/context/thinking}/compact-thinking.ts +7 -7
  51. package/extensions/{shell → layouts/editor}/accent-rail-editor.ts +8 -8
  52. package/extensions/{shell → layouts/editor}/completion-menu.ts +3 -6
  53. package/extensions/layouts/editor/controller.ts +613 -0
  54. package/extensions/{shell → layouts/editor}/editor-metadata-format.ts +6 -3
  55. package/extensions/layouts/editor/factory.ts +159 -0
  56. package/extensions/layouts/editor/index.ts +16 -0
  57. package/extensions/{shell → layouts/editor}/minimalist-editor.ts +4 -4
  58. package/extensions/layouts/editor/ownership.ts +103 -0
  59. package/extensions/{shell → layouts/editor}/ui.ts +2 -2
  60. package/extensions/layouts/footer/controller.ts +392 -0
  61. package/extensions/layouts/footer/data.ts +41 -0
  62. package/extensions/{shell → layouts/footer}/extension-status.ts +2 -2
  63. package/extensions/{shell → layouts/footer}/footer-layout.ts +1 -1
  64. package/extensions/{shell → layouts/footer}/footer.ts +11 -8
  65. package/extensions/layouts/footer/index.ts +24 -0
  66. package/extensions/layouts/header/index.ts +5 -0
  67. package/extensions/{features/shell → layouts/header}/startup-header.ts +105 -19
  68. package/extensions/layouts/working-line/controller.ts +291 -0
  69. package/extensions/{shell → layouts/working-line}/interaction-summary.ts +3 -3
  70. package/extensions/{shell → layouts/working-line}/working-line-spinners.ts +1 -1
  71. package/extensions/{shell → layouts/working-line}/working-line.ts +4 -4
  72. package/extensions/{shell → services}/live-context.ts +29 -1
  73. package/extensions/services/project-refresh.ts +374 -0
  74. package/extensions/{shell → services}/project-state.ts +5 -5
  75. package/extensions/{shell/state.ts → services/session-state.ts} +75 -5
  76. package/extensions/{shell → shared}/format.ts +4 -4
  77. package/extensions/tools/component-tree.ts +6 -6
  78. package/package.json +4 -4
  79. package/extensions/shell/index.ts +0 -1659
  80. package/extensions/shell/project-refresh.ts +0 -130
  81. package/extensions/shell/settings-command.ts +0 -2144
  82. package/extensions/transcript/index.ts +0 -65
  83. package/extensions/transcript/renderer/transcript-refresh.ts +0 -79
  84. /package/extensions/{shell → app/ownership}/prototype-patch-registry.ts +0 -0
  85. /package/extensions/{shell → app/runtime}/session-lifecycle.ts +0 -0
  86. /package/extensions/features/{shell/aliases.ts → aliases.ts} +0 -0
  87. /package/extensions/features/{shell → legacy}/working-message.ts +0 -0
  88. /package/extensions/features/{reference → session-reference}/index.ts +0 -0
  89. /package/extensions/features/{reference → session-reference}/session.ts +0 -0
  90. /package/extensions/features/{reference/subagent.ts → subagent-autocomplete.ts} +0 -0
  91. /package/extensions/{shell → layouts/context/message}/user-message-osc.ts +0 -0
  92. /package/extensions/{transcript → layouts/context}/renderer/markdown-enhance.ts +0 -0
  93. /package/extensions/{transcript → layouts/context}/renderer/tool/diff/ATTRIBUTION.md +0 -0
  94. /package/extensions/{transcript → layouts/context}/renderer/tool/diff/ansi-utils.ts +0 -0
  95. /package/extensions/{transcript → layouts/context}/renderer/tool/diff/diff-header.ts +0 -0
  96. /package/extensions/{transcript → layouts/context}/renderer/tool/diff/diff-inline.ts +0 -0
  97. /package/extensions/{transcript → layouts/context}/renderer/tool/diff/diff-parse.ts +0 -0
  98. /package/extensions/{transcript → layouts/context}/renderer/tool/diff/diff-text.ts +0 -0
  99. /package/extensions/{transcript → layouts/context}/renderer/tool/diff/line-width-safety.ts +0 -0
  100. /package/extensions/{transcript → layouts/context}/renderer/tool/diff/shiki-highlight.ts +0 -0
  101. /package/extensions/{transcript → layouts/context}/renderer/tool/diff/write-execution.ts +0 -0
  102. /package/extensions/{transcript → layouts/context}/renderer/tool/show-more-hint.ts +0 -0
  103. /package/extensions/{features/agent-summary → layouts/context/summary}/index.ts +0 -0
  104. /package/extensions/{shell → layouts/editor}/accent-rail-layout-patch.ts +0 -0
  105. /package/extensions/{shell → layouts/editor}/editor-transfer.ts +0 -0
  106. /package/extensions/{shell → layouts/footer}/footer-format.ts +0 -0
  107. /package/extensions/{shell → layouts/working-line}/working-line-messages.ts +0 -0
  108. /package/extensions/{shell/git.ts → services/git-data.ts} +0 -0
  109. /package/extensions/{shell/package-version.ts → services/package-data.ts} +0 -0
  110. /package/extensions/{shell/runtime.ts → services/runtime-data.ts} +0 -0
  111. /package/extensions/{shell → services}/telemetry.ts +0 -0
  112. /package/extensions/{shell → shared}/icons.ts +0 -0
  113. /package/extensions/{shell → shared}/style.ts +0 -0
@@ -0,0 +1,159 @@
1
+ import type {
2
+ ExtensionAPI,
3
+ ExtensionContext,
4
+ KeybindingsManager,
5
+ Theme,
6
+ } from "@earendil-works/pi-coding-agent";
7
+ import type { EditorTheme, TUI } from "@earendil-works/pi-tui";
8
+ import type { PolishedTuiConfig } from "../../app/config/shell.ts";
9
+ import { modelLabelFor, type FooterState } from "../footer/index.ts";
10
+ import { markAccentRailLayoutEditor } from "./accent-rail-layout-patch.ts";
11
+ import { PolishedEditor, WrappedPolishedEditor } from "./ui.ts";
12
+ import {
13
+ markEditorFactory,
14
+ markWrappedEditorFactory,
15
+ type EditorFactory,
16
+ type ZentuiEditorFactory,
17
+ } from "./ownership.ts";
18
+
19
+ export type EditorFactoryRuntime = {
20
+ readonly ownerToken: symbol;
21
+ readonly sessionTheme: Theme;
22
+ readonly getConfig: () => PolishedTuiConfig;
23
+ readonly getState: () => FooterState;
24
+ readonly getThinkingLevel: () => ReturnType<ExtensionAPI["getThinkingLevel"]>;
25
+ readonly getContextWindow: (ctx: ExtensionContext) => number | undefined;
26
+ readonly getContextPercent: (ctx: ExtensionContext) => number | undefined;
27
+ readonly getAgentDurationMs: () => number;
28
+ readonly isAgentActive: () => boolean;
29
+ readonly getProjectRoot: () => string | undefined;
30
+ readonly onRender: (requestRender: () => void) => void;
31
+ readonly onDecorationActive: (active: boolean) => void;
32
+ readonly isAccentRailActive: () => boolean;
33
+ };
34
+
35
+ /**
36
+ * Creates the native polished Editor factory for one Pi session.
37
+ *
38
+ * @param ctx Active Pi extension context.
39
+ * @param runtime Runtime selectors and lifecycle callbacks used by the Editor.
40
+ * @returns An owned Editor factory.
41
+ */
42
+ export function createEditorFactory(
43
+ ctx: ExtensionContext,
44
+ runtime: EditorFactoryRuntime,
45
+ ): ZentuiEditorFactory {
46
+ const factory = ((
47
+ tui: TUI,
48
+ theme: EditorTheme,
49
+ keybindings: KeybindingsManager,
50
+ ) => {
51
+ runtime.onRender(() => tui.requestRender());
52
+ const editor = new PolishedEditor(
53
+ tui,
54
+ theme,
55
+ keybindings,
56
+ runtime.sessionTheme,
57
+ runtime.getConfig,
58
+ () => editorMetadata(ctx, runtime),
59
+ runtime.getThinkingLevel,
60
+ () => editorDecoration(ctx, runtime),
61
+ runtime.onDecorationActive,
62
+ );
63
+ markAccentRailLayoutEditor(
64
+ editor,
65
+ runtime.ownerToken,
66
+ runtime.isAccentRailActive,
67
+ );
68
+ return editor;
69
+ }) as ZentuiEditorFactory;
70
+ return markEditorFactory(factory, runtime.ownerToken);
71
+ }
72
+
73
+ /**
74
+ * Creates an Editor factory that decorates a third-party editor.
75
+ *
76
+ * @param ctx Active Pi extension context.
77
+ * @param baseFactory Third-party factory retained for restoration.
78
+ * @param runtime Runtime selectors and lifecycle callbacks used by the Editor.
79
+ * @returns An owned wrapper factory.
80
+ */
81
+ export function createWrappedEditorFactory(
82
+ ctx: ExtensionContext,
83
+ baseFactory: EditorFactory,
84
+ runtime: EditorFactoryRuntime,
85
+ ): ZentuiEditorFactory {
86
+ const factory = ((
87
+ tui: TUI,
88
+ theme: EditorTheme,
89
+ keybindings: KeybindingsManager,
90
+ ) => {
91
+ runtime.onRender(() => tui.requestRender());
92
+ const editor = new WrappedPolishedEditor(
93
+ baseFactory(tui, theme, keybindings),
94
+ runtime.sessionTheme,
95
+ runtime.getConfig,
96
+ () => editorMetadata(ctx, runtime),
97
+ runtime.getThinkingLevel,
98
+ () => editorDecoration(ctx, runtime),
99
+ runtime.onDecorationActive,
100
+ );
101
+ markAccentRailLayoutEditor(
102
+ editor,
103
+ runtime.ownerToken,
104
+ runtime.isAccentRailActive,
105
+ );
106
+ return editor;
107
+ }) as ZentuiEditorFactory;
108
+ return markWrappedEditorFactory(factory, baseFactory, runtime.ownerToken);
109
+ }
110
+
111
+ /**
112
+ * Selects the model and session metadata shown by the Editor.
113
+ *
114
+ * @param ctx Active Pi extension context.
115
+ * @param runtime Runtime selectors for shared state.
116
+ * @returns Current Editor metadata.
117
+ */
118
+ function editorMetadata(ctx: ExtensionContext, runtime: EditorFactoryRuntime) {
119
+ const state = runtime.getState();
120
+ const config = runtime.getConfig();
121
+ return {
122
+ modelLabel: modelLabelFor(state, config.components.editor.modelLabel),
123
+ modelId: state.modelId,
124
+ modelName: state.modelName,
125
+ providerLabel: state.providerLabel,
126
+ sessionName: ctx.sessionManager.getSessionName() ?? "",
127
+ };
128
+ }
129
+
130
+ /**
131
+ * Selects the dynamic project and usage metadata shown by the Editor.
132
+ *
133
+ * @param ctx Active Pi extension context.
134
+ * @param runtime Runtime selectors for shared state and timers.
135
+ * @returns Current Editor decoration data.
136
+ */
137
+ function editorDecoration(
138
+ ctx: ExtensionContext,
139
+ runtime: EditorFactoryRuntime,
140
+ ) {
141
+ const state = runtime.getState();
142
+ const config = runtime.getConfig();
143
+ return {
144
+ cwd: ctx.cwd,
145
+ projectRoot: runtime.getProjectRoot(),
146
+ branch: state.branch,
147
+ dirty: state.dirty,
148
+ ahead: state.ahead,
149
+ behind: state.behind,
150
+ costLabel: state.costLabel,
151
+ modelLabel: modelLabelFor(state, config.components.editor.modelLabel),
152
+ thinkingLevel: runtime.getThinkingLevel(),
153
+ contextPercent: runtime.getContextPercent(ctx),
154
+ contextWindow: runtime.getContextWindow(ctx),
155
+ sessionName: ctx.sessionManager.getSessionName() ?? "",
156
+ agentDurationMs: runtime.getAgentDurationMs(),
157
+ agentActive: runtime.isAgentActive(),
158
+ };
159
+ }
@@ -0,0 +1,16 @@
1
+ export {
2
+ EditorLayoutController,
3
+ type EditorChangeResult,
4
+ type EditorLayoutControllerContext,
5
+ } from "./controller.ts";
6
+ export {
7
+ installHostAccentRailLayoutPatch,
8
+ markAccentRailLayoutEditor,
9
+ retainAccentRailLayoutPatchInstallation,
10
+ type AccentRailLayoutPatchDiagnostic,
11
+ } from "./accent-rail-layout-patch.ts";
12
+ export {
13
+ replaceEditorComponentWithExpandedText,
14
+ type EditorTransferFailureReason,
15
+ } from "./editor-transfer.ts";
16
+ export { PolishedEditor, WrappedPolishedEditor } from "./ui.ts";
@@ -1,7 +1,7 @@
1
1
  import { basename, isAbsolute, relative, sep } from "node:path";
2
2
  import type { Theme } from "@earendil-works/pi-coding-agent";
3
3
  import { truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
4
- import type { ZentuiConfig } from "../app/config/shell.ts";
4
+ import type { ZentuiConfig } from "../../app/config/shell.ts";
5
5
  import { sanitizeEditorMetadataText } from "./editor-metadata-format.ts";
6
6
  import {
7
7
  buildContextGauge,
@@ -9,9 +9,9 @@ import {
9
9
  formatCount,
10
10
  formatCwdLabel,
11
11
  formatElapsedDuration,
12
- } from "./format.ts";
12
+ } from "../../shared/format.ts";
13
13
 
14
- export { formatElapsedDuration } from "./format.ts";
14
+ export { formatElapsedDuration } from "../../shared/format.ts";
15
15
 
16
16
  import {
17
17
  EDITOR_ACCENT_FALLBACK,
@@ -19,7 +19,7 @@ import {
19
19
  renderStyleForSource,
20
20
  renderStyleForSourceOrFallback,
21
21
  safeThemeFg,
22
- } from "./style.ts";
22
+ } from "../../shared/style.ts";
23
23
 
24
24
  const MINIMALIST_MODEL_FALLBACK = {
25
25
  theme: "syntaxKeyword",
@@ -0,0 +1,103 @@
1
+ import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
2
+
3
+ /** Symbol used to identify factories created by the Editor layout. */
4
+ export const ZENTUI_EDITOR_FACTORY = Symbol.for("pi-zentui.editor-factory");
5
+
6
+ /** Symbol used to retain the wrapped third-party editor factory. */
7
+ export const ZENTUI_EDITOR_BASE_FACTORY = Symbol.for(
8
+ "pi-zentui.editor-base-factory",
9
+ );
10
+
11
+ /** Symbol used to identify the active Editor layout owner. */
12
+ export const ZENTUI_EDITOR_OWNER = Symbol.for("pi-zentui.editor-owner");
13
+
14
+ export type EditorFactory = NonNullable<
15
+ Parameters<ExtensionContext["ui"]["setEditorComponent"]>[0]
16
+ >;
17
+
18
+ export type ZentuiEditorFactory = EditorFactory & {
19
+ [ZENTUI_EDITOR_FACTORY]?: true;
20
+ [ZENTUI_EDITOR_BASE_FACTORY]?: EditorFactory;
21
+ [ZENTUI_EDITOR_OWNER]?: symbol;
22
+ };
23
+
24
+ /**
25
+ * Reports whether a factory was marked as an Editor layout factory.
26
+ *
27
+ * @param factory Candidate host editor factory.
28
+ * @returns Whether the factory carries the Editor layout marker.
29
+ */
30
+ export function isZentuiEditorFactory(
31
+ factory: EditorFactory | undefined,
32
+ ): boolean {
33
+ return Boolean(
34
+ (factory as ZentuiEditorFactory | undefined)?.[ZENTUI_EDITOR_FACTORY],
35
+ );
36
+ }
37
+
38
+ /**
39
+ * Returns the third-party factory wrapped by an Editor layout factory.
40
+ *
41
+ * @param factory Candidate host editor factory.
42
+ * @returns The retained base factory, when present.
43
+ */
44
+ export function getZentuiEditorBaseFactory(
45
+ factory: EditorFactory | undefined,
46
+ ): EditorFactory | undefined {
47
+ return (factory as ZentuiEditorFactory | undefined)?.[
48
+ ZENTUI_EDITOR_BASE_FACTORY
49
+ ];
50
+ }
51
+
52
+ /**
53
+ * Reports whether a factory belongs to the supplied Editor layout owner.
54
+ *
55
+ * @param factory Candidate host editor factory.
56
+ * @param ownerToken Owner token to compare.
57
+ * @returns Whether the owner marker matches.
58
+ */
59
+ export function isOwnedEditorFactory(
60
+ factory: EditorFactory | undefined,
61
+ ownerToken: symbol,
62
+ ): boolean {
63
+ return (
64
+ (factory as ZentuiEditorFactory | undefined)?.[ZENTUI_EDITOR_OWNER] ===
65
+ ownerToken
66
+ );
67
+ }
68
+
69
+ /**
70
+ * Marks a factory as owned by the Editor layout.
71
+ *
72
+ * @param factory Factory to mark.
73
+ * @param ownerToken Owner token written to the factory.
74
+ * @returns The marked factory.
75
+ */
76
+ export function markEditorFactory<T extends EditorFactory>(
77
+ factory: T,
78
+ ownerToken: symbol,
79
+ ): T {
80
+ const marked = factory as T & ZentuiEditorFactory;
81
+ marked[ZENTUI_EDITOR_FACTORY] = true;
82
+ marked[ZENTUI_EDITOR_OWNER] = ownerToken;
83
+ return factory;
84
+ }
85
+
86
+ /**
87
+ * Retains a base factory on an Editor wrapper for safe restoration.
88
+ *
89
+ * @param factory Wrapper factory to mark.
90
+ * @param baseFactory Third-party factory wrapped by the layout.
91
+ * @param ownerToken Owner token written to the wrapper.
92
+ * @returns The marked wrapper.
93
+ */
94
+ export function markWrappedEditorFactory<T extends EditorFactory>(
95
+ factory: T,
96
+ baseFactory: EditorFactory,
97
+ ownerToken: symbol,
98
+ ): T {
99
+ const marked = markEditorFactory(factory, ownerToken) as T &
100
+ ZentuiEditorFactory;
101
+ marked[ZENTUI_EDITOR_BASE_FACTORY] = baseFactory;
102
+ return factory;
103
+ }
@@ -17,7 +17,7 @@ import {
17
17
  renderAccentRailEditorFrame,
18
18
  } from "./accent-rail-editor.ts";
19
19
  import { renderCompletionPalette } from "./completion-menu.ts";
20
- import type { EditorStyle, ZentuiConfig } from "../app/config/shell.ts";
20
+ import type { EditorStyle, ZentuiConfig } from "../../app/config/shell.ts";
21
21
  import { renderEditorMetadataFormat } from "./editor-metadata-format.ts";
22
22
  import {
23
23
  type MinimalistEditorMetadata,
@@ -28,7 +28,7 @@ import {
28
28
  EDITOR_BORDER_FALLBACK,
29
29
  renderStyleForSourceOrFallback,
30
30
  safeThemeFg,
31
- } from "./style.ts";
31
+ } from "../../shared/style.ts";
32
32
 
33
33
  const LEGACY_SPLIT_POLISHED_FRAME = Symbol.for("pi-zentui.polished-frame");
34
34