@rosetears/aili-pi 0.1.0 → 0.1.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.
Files changed (46) hide show
  1. package/README.md +7 -1
  2. package/THIRD_PARTY_NOTICES.md +11 -0
  3. package/extensions/header/index.ts +92 -0
  4. package/extensions/matrix/index.ts +375 -0
  5. package/extensions/zentui/config.ts +1014 -0
  6. package/extensions/zentui/extension-status.ts +96 -0
  7. package/extensions/zentui/fixed-editor/cluster.ts +98 -0
  8. package/extensions/zentui/fixed-editor/compositor.ts +719 -0
  9. package/extensions/zentui/fixed-editor/index.ts +223 -0
  10. package/extensions/zentui/fixed-editor/input.ts +85 -0
  11. package/extensions/zentui/fixed-editor/pi-compat.ts +296 -0
  12. package/extensions/zentui/fixed-editor/selection.ts +217 -0
  13. package/extensions/zentui/fixed-editor/terminal-modes.ts +75 -0
  14. package/extensions/zentui/fixed-editor/types.ts +37 -0
  15. package/extensions/zentui/footer-format.ts +279 -0
  16. package/extensions/zentui/footer.ts +595 -0
  17. package/extensions/zentui/format.ts +434 -0
  18. package/extensions/zentui/git.ts +384 -0
  19. package/extensions/zentui/gradient.ts +70 -0
  20. package/extensions/zentui/icons.ts +252 -0
  21. package/extensions/zentui/index.ts +577 -0
  22. package/extensions/zentui/live-context.ts +75 -0
  23. package/extensions/zentui/package-version.ts +650 -0
  24. package/extensions/zentui/project-refresh.ts +104 -0
  25. package/extensions/zentui/project-state.ts +59 -0
  26. package/extensions/zentui/prototype-patch-registry.ts +111 -0
  27. package/extensions/zentui/runtime.ts +841 -0
  28. package/extensions/zentui/selector-border.ts +77 -0
  29. package/extensions/zentui/session-lifecycle.ts +60 -0
  30. package/extensions/zentui/settings-command.ts +897 -0
  31. package/extensions/zentui/state.ts +55 -0
  32. package/extensions/zentui/style.ts +332 -0
  33. package/extensions/zentui/thinking-message.ts +159 -0
  34. package/extensions/zentui/tool-execution.ts +189 -0
  35. package/extensions/zentui/ui.ts +618 -0
  36. package/extensions/zentui/user-message.ts +252 -0
  37. package/licenses/pi-sakura-cyberdeck-MIT.txt +21 -0
  38. package/licenses/pi-zentui-MIT.txt +21 -0
  39. package/manifests/provenance.json +11 -0
  40. package/manifests/sbom.json +17 -1
  41. package/notices/pi-sakura-cyberdeck-NOTICE.txt +6 -0
  42. package/package.json +11 -2
  43. package/src/runtime/doctor.ts +1 -1
  44. package/src/runtime/registry.ts +1 -1
  45. package/src/runtime/rem-head.txt +38 -0
  46. package/themes/rem-cyberdeck.json +32 -0
@@ -0,0 +1,77 @@
1
+ import {
2
+ ModelSelectorComponent,
3
+ SettingsSelectorComponent,
4
+ type Theme,
5
+ } from "@earendil-works/pi-coding-agent";
6
+ import type { PolishedTuiConfig } from "./config.js";
7
+ import { installPrototypePatch } from "./prototype-patch-registry.js";
8
+ import { EDITOR_BORDER_STYLE, renderChromeBorder, renderEditorBorder } from "./style.js";
9
+
10
+ type PatchableSelectorPrototype = {
11
+ render: (width: number) => string[];
12
+ };
13
+
14
+ type Cleanup = () => void;
15
+
16
+ function stripAnsi(text: string): string {
17
+ return text.replaceAll(/\x1b\[[0-9;]*m/g, "");
18
+ }
19
+
20
+ function isHorizontalBorderLine(line: string): boolean {
21
+ return /^─+$/.test(stripAnsi(line));
22
+ }
23
+
24
+ function renderBorderLine(
25
+ width: number,
26
+ theme: Theme | undefined,
27
+ config: PolishedTuiConfig | undefined,
28
+ ): string {
29
+ const text = "─".repeat(Math.max(1, width));
30
+ if (theme && config) {
31
+ return renderChromeBorder(theme, config.colorSources.editor, EDITOR_BORDER_STYLE, text);
32
+ }
33
+ return renderEditorBorder(text);
34
+ }
35
+
36
+ export function patchSelectorBorderStyle(
37
+ prototype: PatchableSelectorPrototype,
38
+ getTheme?: () => Theme | undefined,
39
+ getConfig?: () => PolishedTuiConfig,
40
+ ): Cleanup {
41
+ return installPrototypePatch(
42
+ prototype,
43
+ "render",
44
+ "selector-border-render",
45
+ ({ predecessor, receiver, args }) => {
46
+ const lines = Reflect.apply(predecessor, receiver, args) as string[];
47
+ const width = args[0];
48
+ if (lines.length === 0 || typeof width !== "number" || width <= 0) return lines;
49
+
50
+ return lines.map((line, index) => {
51
+ if (index !== 0 && index !== lines.length - 1) return line;
52
+ if (!isHorizontalBorderLine(line)) return line;
53
+ return renderBorderLine(width, getTheme?.(), getConfig?.());
54
+ });
55
+ },
56
+ );
57
+ }
58
+
59
+ export function installSelectorBorderStyle(
60
+ getTheme?: () => Theme | undefined,
61
+ getConfig?: () => PolishedTuiConfig,
62
+ ): Cleanup {
63
+ const cleanupModel = patchSelectorBorderStyle(
64
+ ModelSelectorComponent.prototype as unknown as PatchableSelectorPrototype,
65
+ getTheme,
66
+ getConfig,
67
+ );
68
+ const cleanupSettings = patchSelectorBorderStyle(
69
+ SettingsSelectorComponent.prototype as unknown as PatchableSelectorPrototype,
70
+ getTheme,
71
+ getConfig,
72
+ );
73
+ return () => {
74
+ cleanupModel();
75
+ cleanupSettings();
76
+ };
77
+ }
@@ -0,0 +1,60 @@
1
+ export class SessionLifecycle {
2
+ private generation = 0;
3
+ private active = false;
4
+ private readonly timeouts = new Set<ReturnType<typeof setTimeout>>();
5
+
6
+ start(): number {
7
+ this.cancelTimeouts();
8
+ this.generation += 1;
9
+ this.active = true;
10
+ return this.generation;
11
+ }
12
+
13
+ currentGeneration(): number {
14
+ return this.generation;
15
+ }
16
+
17
+ isCurrent(generation = this.generation): boolean {
18
+ return this.active && generation === this.generation;
19
+ }
20
+
21
+ defer(callback: () => void, delayMs = 0): () => void {
22
+ if (!this.active) return () => {};
23
+ const generation = this.generation;
24
+ let canceled = false;
25
+ const timeout = setTimeout(() => {
26
+ this.timeouts.delete(timeout);
27
+ if (!canceled && this.isCurrent(generation)) callback();
28
+ }, delayMs);
29
+ this.timeouts.add(timeout);
30
+ return () => {
31
+ if (canceled) return;
32
+ canceled = true;
33
+ clearTimeout(timeout);
34
+ this.timeouts.delete(timeout);
35
+ };
36
+ }
37
+
38
+ queueMicrotask(callback: () => void): () => void {
39
+ let canceled = !this.active;
40
+ const generation = this.generation;
41
+ queueMicrotask(() => {
42
+ if (!canceled && this.isCurrent(generation)) callback();
43
+ });
44
+ return () => {
45
+ canceled = true;
46
+ };
47
+ }
48
+
49
+ shutdown(): void {
50
+ if (!this.active && this.timeouts.size === 0) return;
51
+ this.active = false;
52
+ this.generation += 1;
53
+ this.cancelTimeouts();
54
+ }
55
+
56
+ private cancelTimeouts(): void {
57
+ for (const timeout of this.timeouts) clearTimeout(timeout);
58
+ this.timeouts.clear();
59
+ }
60
+ }