@timurproko/a1 0.2.3-dev.651 → 0.2.3-dev.655

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 (83) hide show
  1. package/dist/app/session-shell/session-shell.js +9 -2
  2. package/dist/contracts/owned-ui/model.d.ts +5 -0
  3. package/dist/foundation/startup/startup-descriptor.js +2 -2
  4. package/dist/integrations/pi/components/resources/builtin-themes.d.ts +114 -126
  5. package/dist/integrations/pi/components/resources/builtin-themes.js +145 -157
  6. package/dist/integrations/pi/components/shell-footer-status.js +12 -8
  7. package/dist/integrations/pi/components/shell-presenters-info.js +1 -1
  8. package/dist/integrations/pi/components/shell-selectors-dialogs.js +1 -0
  9. package/dist/integrations/pi/components/shell-shared-facade.js +1 -2
  10. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.d.ts +2 -2
  11. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.js +2 -2
  12. package/dist/integrations/pi/components/upstream/assets/earendil-image.json +2 -2
  13. package/dist/integrations/pi/components/upstream/components/countdown-timer.d.ts +1 -1
  14. package/dist/integrations/pi/components/upstream/components/daxnuts.d.ts +1 -1
  15. package/dist/integrations/pi/components/upstream/components/daxnuts.js +1 -1
  16. package/dist/integrations/pi/components/upstream/components/earendil-announcement.js +1 -1
  17. package/dist/integrations/pi/components/upstream/components/extension-editor.d.ts +1 -1
  18. package/dist/integrations/pi/components/upstream/components/extension-editor.js +1 -1
  19. package/dist/integrations/pi/components/upstream/components/extension-input.js +1 -1
  20. package/dist/integrations/pi/components/upstream/components/extension-selector.js +1 -1
  21. package/dist/integrations/pi/components/upstream/components/mermaid.js +1 -1
  22. package/dist/integrations/pi/components/upstream/components/owned-editor.d.ts +1 -1
  23. package/dist/integrations/pi/components/upstream/components/owned-editor.js +1 -1
  24. package/dist/integrations/pi/components/upstream/components/pi-logo.d.ts +2 -0
  25. package/dist/integrations/pi/components/upstream/components/pi-logo.js +21 -0
  26. package/dist/integrations/pi/components/upstream/components/scoped-models-selector.d.ts +1 -1
  27. package/dist/integrations/pi/components/upstream/components/session-footer.js +13 -6
  28. package/dist/integrations/pi/components/upstream/components/session-selector-search.js +1 -1
  29. package/dist/integrations/pi/components/upstream/components/session-selector.js +1 -1
  30. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.d.ts +1 -1
  31. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.js +1 -1
  32. package/dist/integrations/pi/components/upstream/components/status-indicator.d.ts +1 -1
  33. package/dist/integrations/pi/components/upstream/components/status-indicator.js +1 -1
  34. package/dist/integrations/pi/components/upstream/components/themed-text.d.ts +16 -0
  35. package/dist/integrations/pi/components/upstream/components/themed-text.js +28 -0
  36. package/dist/integrations/pi/components/upstream/components/thinking-selector.d.ts +1 -1
  37. package/dist/integrations/pi/components/upstream/components/thinking-selector.js +1 -1
  38. package/dist/integrations/pi/components/upstream/components/tool-execution.js +25 -3
  39. package/dist/integrations/pi/components/upstream/components/tree-selector.d.ts +1 -1
  40. package/dist/integrations/pi/components/upstream/components/tree-selector.js +1 -1
  41. package/dist/integrations/pi/components/upstream/components/trust-selector.js +1 -1
  42. package/dist/integrations/pi/components/upstream/external-editor.js +1 -1
  43. package/dist/integrations/pi/components/upstream/history/editor-core.d.ts +1 -1
  44. package/dist/integrations/pi/components/upstream/history/editor-core.js +5 -3
  45. package/dist/integrations/pi/components/upstream/history/kill-ring.d.ts +1 -1
  46. package/dist/integrations/pi/components/upstream/history/kill-ring.js +1 -1
  47. package/dist/integrations/pi/components/upstream/history/printable-key.js +1 -1
  48. package/dist/integrations/pi/components/upstream/history/text-helpers.js +1 -1
  49. package/dist/integrations/pi/components/upstream/history/undo-stack.d.ts +1 -1
  50. package/dist/integrations/pi/components/upstream/history/undo-stack.js +1 -1
  51. package/dist/integrations/pi/components/upstream/history/word-navigation.js +1 -1
  52. package/dist/integrations/pi/components/upstream/model-search.d.ts +1 -1
  53. package/dist/integrations/pi/components/upstream/theme/system-theme.d.ts +60 -0
  54. package/dist/integrations/pi/components/upstream/theme/system-theme.js +695 -0
  55. package/dist/integrations/pi/components/upstream/theme/theme-controller.d.ts +1 -1
  56. package/dist/integrations/pi/components/upstream/theme/theme.d.ts +6 -2
  57. package/dist/integrations/pi/components/upstream/theme/theme.js +22 -7
  58. package/dist/integrations/pi/engine/adapter.js +6 -0
  59. package/dist/integrations/pi/engine/pi-settings-metadata.json +10 -0
  60. package/dist/integrations/pi/engine/resources/changelog.json +4 -4
  61. package/dist/integrations/pi/engine/session-integration.d.ts +2 -2
  62. package/dist/integrations/pi/engine/session-integration.js +1 -1
  63. package/dist/integrations/pi/engine/settings-bridge.d.ts +1 -1
  64. package/dist/integrations/pi/engine/settings-bridge.js +9 -0
  65. package/dist/integrations/pi/engine/settings-port.js +4 -1
  66. package/dist/integrations/pi/engine/workflows.d.ts +2 -1
  67. package/dist/integrations/pi/engine/workflows.js +1 -0
  68. package/dist/integrations/pi/startup-public.js +1925 -1309
  69. package/dist/integrations/pi/startup-public.manifest.json +1611 -929
  70. package/dist/integrations/pi/tui-runtime/adapter.d.ts +2 -0
  71. package/dist/integrations/pi/tui-runtime/adapter.js +5 -0
  72. package/dist/integrations/pi/tui-runtime/contracts.d.ts +2 -1
  73. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +1 -1
  74. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +1 -1
  75. package/dist/native/darwin-arm64/manifest.json +3 -3
  76. package/dist/native/darwin-arm64/process-guardian +0 -0
  77. package/dist/native/linux-x64/manifest.json +3 -3
  78. package/dist/native/linux-x64/process-guardian +0 -0
  79. package/dist/native/win32-x64/manifest.json +3 -3
  80. package/dist/native/win32-x64/process-guardian.exe +0 -0
  81. package/dist/runtime-payload-inventory.json +40622 -27400
  82. package/docs/ci-release-runbook.md +10 -7
  83. package/package.json +3 -3
@@ -1,167 +1,155 @@
1
1
  /**
2
- * Attributed owned theme resources adapted from @earendil-works/pi-coding-agent 0.85.1 (MIT).
3
- * Upstream dark.json SHA-256: 103a5aecb74a2dab5cc903c9741845ee6158658ce2ff6e5445948784116eaef8
4
- * Upstream light.json SHA-256: 14c7172ba7e75eab6f509504de806af0f2d9ff817bfb45d9533bff15c7e6e657
2
+ * Attributed owned theme resources adapted from @earendil-works/pi-coding-agent 0.99.2 (MIT),
3
+ * commit 005af57d88ee23b33778f343a9595b32e67ff788.
4
+ * Upstream dark.json SHA-256: c11a588b714d35300293079b425fb09a3693d4b2d453585d211b08163c648b75
5
+ * Upstream light.json SHA-256: f590c51c2bc8b238891efd0e983473ed2e2a6487b6692cc1d4b2845165e703f7
5
6
  * Modifications: removed upstream schema/export metadata; runtime color data is unchanged.
6
7
  */
7
8
  export const BUILTIN_THEME_RESOURCES = Object.freeze({
8
- "dark": {
9
- "name": "dark",
10
- "vars": {
11
- "cyan": "#00d7ff",
12
- "blue": "#5f87ff",
13
- "green": "#b5bd68",
14
- "red": "#cc6666",
15
- "yellow": "#ffff00",
16
- "text": "#d4d4d4",
17
- "gray": "#808080",
18
- "dimGray": "#666666",
19
- "darkGray": "#505050",
20
- "accent": "#8abeb7",
21
- "selectedBg": "#3a3a4a",
22
- "userMsgBg": "#343541",
23
- "toolPendingBg": "#282832",
24
- "toolSuccessBg": "#283228",
25
- "toolErrorBg": "#3c2828",
26
- "customMsgBg": "#2d2838"
9
+ dark: {
10
+ name: "dark",
11
+ appearance: "dark",
12
+ vars: {
13
+ text: "okhsl(234 3% 89%)",
14
+ muted: "okhsl(229 6% 67%)",
15
+ violet: "okhsl(295 50% 67%)",
16
+ blue: "okhsl(232 54% 67%)",
17
+ green: "okhsl(159 59% 67%)",
18
+ red: "okhsl(20 72% 67%)",
19
+ yellow: "okhsl(83 88% 67%)",
20
+ blueBg: "okhsl(233 41% 24%)",
21
+ },
22
+ colors: {
23
+ accent: "violet",
24
+ border: "okhsl(231 57% 65%)",
25
+ borderAccent: "okhsl(295 53% 64%)",
26
+ borderMuted: "okhsl(229 8% 53%)",
27
+ success: "green",
28
+ error: "red",
29
+ warning: "yellow",
30
+ muted: "muted",
31
+ dim: "okhsl(229 8% 56%)",
32
+ text: "text",
33
+ thinkingText: "okhsl(226 7% 65%)",
34
+ selectedBg: "blueBg",
35
+ scrollbarTrack: "okhsl(237 7% 33%)",
36
+ scrollbarThumb: "okhsl(232 7% 65%)",
37
+ searchMatchBg: "okhsl(53 51% 24%)",
38
+ searchMatchText: "muted",
39
+ userMessageBg: "blueBg",
40
+ userMessageText: "text",
41
+ customMessageBg: "okhsl(295 42% 24%)",
42
+ customMessageText: "muted",
43
+ customMessageLabel: "violet",
44
+ toolPendingBg: "okhsl(229 5% 24%)",
45
+ toolSuccessBg: "okhsl(158 46% 25%)",
46
+ toolErrorBg: "okhsl(19 54% 25%)",
47
+ toolTitle: "text",
48
+ toolOutput: "muted",
49
+ mdHeading: "yellow",
50
+ mdLink: "blue",
51
+ mdLinkUrl: "muted",
52
+ mdCode: "violet",
53
+ mdCodeBlock: "green",
54
+ mdCodeBlockBorder: "muted",
55
+ mdQuote: "muted",
56
+ mdQuoteBorder: "muted",
57
+ mdHr: "muted",
58
+ mdListBullet: "violet",
59
+ toolDiffAdded: "green",
60
+ toolDiffRemoved: "red",
61
+ toolDiffContext: "muted",
62
+ syntaxComment: "muted",
63
+ syntaxKeyword: "blue",
64
+ syntaxFunction: "yellow",
65
+ syntaxVariable: "okhsl(202 58% 67%)",
66
+ syntaxString: "okhsl(52 67% 67%)",
67
+ syntaxNumber: "green",
68
+ syntaxType: "violet",
69
+ syntaxOperator: "muted",
70
+ syntaxPunctuation: "muted",
71
+ thinkingOff: "okhsl(229 8% 49%)",
72
+ thinkingMinimal: "okhsl(232 20% 52%)",
73
+ thinkingLow: "okhsl(232 45% 54%)",
74
+ thinkingMedium: "okhsl(263 59% 56%)",
75
+ thinkingHigh: "okhsl(295 73% 59%)",
76
+ thinkingXhigh: "okhsl(337 81% 61%)",
77
+ thinkingMax: "okhsl(20 99% 63%)",
78
+ bashMode: "okhsl(159 64% 65%)",
27
79
  },
28
- "colors": {
29
- "accent": "accent",
30
- "border": "blue",
31
- "borderAccent": "cyan",
32
- "borderMuted": "darkGray",
33
- "success": "green",
34
- "error": "red",
35
- "warning": "yellow",
36
- "muted": "gray",
37
- "dim": "dimGray",
38
- "text": "text",
39
- "thinkingText": "gray",
40
- "selectedBg": "selectedBg",
41
- "scrollbarTrack": "darkGray",
42
- "scrollbarThumb": "text",
43
- "searchMatchBg": "selectedBg",
44
- "searchMatchText": "text",
45
- "userMessageBg": "userMsgBg",
46
- "userMessageText": "text",
47
- "customMessageBg": "customMsgBg",
48
- "customMessageText": "text",
49
- "customMessageLabel": "#9575cd",
50
- "toolPendingBg": "toolPendingBg",
51
- "toolSuccessBg": "toolSuccessBg",
52
- "toolErrorBg": "toolErrorBg",
53
- "toolTitle": "text",
54
- "toolOutput": "gray",
55
- "mdHeading": "#f0c674",
56
- "mdLink": "#81a2be",
57
- "mdLinkUrl": "dimGray",
58
- "mdCode": "accent",
59
- "mdCodeBlock": "green",
60
- "mdCodeBlockBorder": "gray",
61
- "mdQuote": "gray",
62
- "mdQuoteBorder": "gray",
63
- "mdHr": "gray",
64
- "mdListBullet": "accent",
65
- "toolDiffAdded": "green",
66
- "toolDiffRemoved": "red",
67
- "toolDiffContext": "gray",
68
- "syntaxComment": "#6A9955",
69
- "syntaxKeyword": "#569CD6",
70
- "syntaxFunction": "#DCDCAA",
71
- "syntaxVariable": "#9CDCFE",
72
- "syntaxString": "#CE9178",
73
- "syntaxNumber": "#B5CEA8",
74
- "syntaxType": "#4EC9B0",
75
- "syntaxOperator": "#D4D4D4",
76
- "syntaxPunctuation": "#D4D4D4",
77
- "thinkingOff": "darkGray",
78
- "thinkingMinimal": "#6e6e6e",
79
- "thinkingLow": "#5f87af",
80
- "thinkingMedium": "#81a2be",
81
- "thinkingHigh": "#b294bb",
82
- "thinkingXhigh": "#d183e8",
83
- "thinkingMax": "#ff5fff",
84
- "bashMode": "green"
85
- }
86
80
  },
87
- "light": {
88
- "name": "light",
89
- "vars": {
90
- "teal": "#5a8080",
91
- "blue": "#547da7",
92
- "green": "#588458",
93
- "red": "#aa5555",
94
- "yellow": "#9a7326",
95
- "text": "#1f2328",
96
- "mediumGray": "#6c6c6c",
97
- "dimGray": "#767676",
98
- "lightGray": "#b0b0b0",
99
- "selectedBg": "#d0d0e0",
100
- "userMsgBg": "#e8e8e8",
101
- "toolPendingBg": "#e8e8f0",
102
- "toolSuccessBg": "#e8f0e8",
103
- "toolErrorBg": "#f0e8e8",
104
- "customMsgBg": "#ede7f6"
81
+ light: {
82
+ name: "light",
83
+ appearance: "light",
84
+ vars: {
85
+ text: "okhsl(225 5% 27%)",
86
+ muted: "okhsl(229 8% 47%)",
87
+ violet: "okhsl(295 60% 46%)",
88
+ blue: "okhsl(231 68% 47%)",
89
+ green: "okhsl(159 75% 46%)",
90
+ red: "okhsl(20 91% 47%)",
91
+ yellow: "okhsl(83 99% 47%)",
92
+ blueBg: "okhsl(235 19% 91%)",
93
+ },
94
+ colors: {
95
+ accent: "violet",
96
+ border: "okhsl(231 67% 55%)",
97
+ borderAccent: "okhsl(295 59% 55%)",
98
+ borderMuted: "okhsl(235 7% 66%)",
99
+ success: "green",
100
+ error: "red",
101
+ warning: "yellow",
102
+ muted: "muted",
103
+ dim: "okhsl(229 7% 59%)",
104
+ text: "text",
105
+ thinkingText: "okhsl(234 8% 55%)",
106
+ selectedBg: "blueBg",
107
+ scrollbarTrack: "okhsl(248 3% 90%)",
108
+ scrollbarThumb: "okhsl(226 7% 65%)",
109
+ searchMatchBg: "okhsl(56 22% 91%)",
110
+ searchMatchText: "muted",
111
+ userMessageBg: "blueBg",
112
+ userMessageText: "text",
113
+ customMessageBg: "okhsl(295 25% 91%)",
114
+ customMessageText: "muted",
115
+ customMessageLabel: "violet",
116
+ toolPendingBg: "okhsl(248 3% 91%)",
117
+ toolSuccessBg: "okhsl(156 21% 91%)",
118
+ toolErrorBg: "okhsl(24 23% 91%)",
119
+ toolTitle: "text",
120
+ toolOutput: "muted",
121
+ mdHeading: "yellow",
122
+ mdLink: "blue",
123
+ mdLinkUrl: "muted",
124
+ mdCode: "violet",
125
+ mdCodeBlock: "green",
126
+ mdCodeBlockBorder: "muted",
127
+ mdQuote: "muted",
128
+ mdQuoteBorder: "muted",
129
+ mdHr: "muted",
130
+ mdListBullet: "violet",
131
+ toolDiffAdded: "green",
132
+ toolDiffRemoved: "red",
133
+ toolDiffContext: "muted",
134
+ syntaxComment: "muted",
135
+ syntaxKeyword: "blue",
136
+ syntaxFunction: "yellow",
137
+ syntaxVariable: "okhsl(203 73% 46%)",
138
+ syntaxString: "okhsl(52 84% 46%)",
139
+ syntaxNumber: "green",
140
+ syntaxType: "violet",
141
+ syntaxOperator: "muted",
142
+ syntaxPunctuation: "muted",
143
+ thinkingOff: "okhsl(223 5% 80%)",
144
+ thinkingMinimal: "okhsl(229 14% 78%)",
145
+ thinkingLow: "okhsl(232 33% 76%)",
146
+ thinkingMedium: "okhsl(264 48% 74%)",
147
+ thinkingHigh: "okhsl(295 62% 72%)",
148
+ thinkingXhigh: "okhsl(337 74% 70%)",
149
+ thinkingMax: "okhsl(20 98% 68%)",
150
+ bashMode: "okhsl(159 74% 55%)",
105
151
  },
106
- "colors": {
107
- "accent": "teal",
108
- "border": "blue",
109
- "borderAccent": "teal",
110
- "borderMuted": "lightGray",
111
- "success": "green",
112
- "error": "red",
113
- "warning": "yellow",
114
- "muted": "mediumGray",
115
- "dim": "dimGray",
116
- "text": "text",
117
- "thinkingText": "mediumGray",
118
- "selectedBg": "selectedBg",
119
- "scrollbarTrack": "lightGray",
120
- "scrollbarThumb": "text",
121
- "searchMatchBg": "selectedBg",
122
- "searchMatchText": "text",
123
- "userMessageBg": "userMsgBg",
124
- "userMessageText": "text",
125
- "customMessageBg": "customMsgBg",
126
- "customMessageText": "text",
127
- "customMessageLabel": "#7e57c2",
128
- "toolPendingBg": "toolPendingBg",
129
- "toolSuccessBg": "toolSuccessBg",
130
- "toolErrorBg": "toolErrorBg",
131
- "toolTitle": "text",
132
- "toolOutput": "mediumGray",
133
- "mdHeading": "yellow",
134
- "mdLink": "blue",
135
- "mdLinkUrl": "dimGray",
136
- "mdCode": "teal",
137
- "mdCodeBlock": "green",
138
- "mdCodeBlockBorder": "mediumGray",
139
- "mdQuote": "mediumGray",
140
- "mdQuoteBorder": "mediumGray",
141
- "mdHr": "mediumGray",
142
- "mdListBullet": "green",
143
- "toolDiffAdded": "green",
144
- "toolDiffRemoved": "red",
145
- "toolDiffContext": "mediumGray",
146
- "syntaxComment": "#008000",
147
- "syntaxKeyword": "#0000FF",
148
- "syntaxFunction": "#795E26",
149
- "syntaxVariable": "#001080",
150
- "syntaxString": "#A31515",
151
- "syntaxNumber": "#098658",
152
- "syntaxType": "#267F99",
153
- "syntaxOperator": "#000000",
154
- "syntaxPunctuation": "#000000",
155
- "thinkingOff": "lightGray",
156
- "thinkingMinimal": "#767676",
157
- "thinkingLow": "blue",
158
- "thinkingMedium": "teal",
159
- "thinkingHigh": "#875f87",
160
- "thinkingXhigh": "#8b008b",
161
- "thinkingMax": "#af005f",
162
- "bashMode": "green"
163
- }
164
- }
152
+ },
165
153
  });
166
154
  export function isBuiltinThemeName(name) {
167
155
  return Object.hasOwn(BUILTIN_THEME_RESOURCES, name);
@@ -1,6 +1,8 @@
1
1
  import { rawKeyHint, VERSION } from "../startup-public.js";
2
2
  import { Spacer, Text, } from "@earendil-works/pi-tui";
3
3
  import { SessionFooter } from "./upstream/components/session-footer.js";
4
+ import { piLogoLines } from "./upstream/components/pi-logo.js";
5
+ import { ThemedText } from "./upstream/components/themed-text.js";
4
6
  import { KeybindingsManager } from "./upstream/adjacent/core/keybindings.js";
5
7
  import { StatusIndicator, WorkingStatusIndicator } from "./upstream/components/status-indicator.js";
6
8
  import { protectPiPromptChipPresentation } from "./prompt-chip-presentation.js";
@@ -9,9 +11,9 @@ import { createTuiFacade, ensureTheme, } from "./shell-shared-facade.js";
9
11
  export function createPiShellHeader(options = {}) {
10
12
  ensureTheme();
11
13
  let expanded = options.expanded ?? false;
12
- const compact = new Text(compactHeaderText(), 1, 0);
13
- const full = new Text(expandedHeaderText(), 1, 0);
14
- const notices = (options.notices ?? []).map(notice => new Text(noticeText(notice), 1, 0));
14
+ const compact = new ThemedText(compactHeaderText, 1, 0);
15
+ const full = new ThemedText(() => expandedHeaderText(options.getKeybindings?.()), 1, 0);
16
+ const notices = (options.notices ?? []).map(notice => new ThemedText(() => noticeText(notice), 1, 0));
15
17
  return {
16
18
  get expanded() { return expanded; },
17
19
  setExpanded(value) { expanded = value; },
@@ -19,7 +21,7 @@ export function createPiShellHeader(options = {}) {
19
21
  if (options.quiet)
20
22
  return [];
21
23
  if (expanded && options.getKeybindings !== undefined)
22
- full.setText(expandedHeaderText(options.getKeybindings()));
24
+ full.invalidate();
23
25
  return [
24
26
  ...new Spacer(1).render(width),
25
27
  ...(expanded ? full : compact).render(width),
@@ -265,10 +267,9 @@ function compactHeaderText() {
265
267
  rawKeyHint("!", "bash"),
266
268
  rawKeyHint("ctrl+o", "more"),
267
269
  ].join(theme.fg("muted", " · "));
268
- const logo = theme.bold(theme.fg("accent", "pi")) + theme.fg("dim", ` v${VERSION}`);
269
270
  const compactOnboarding = theme.fg("dim", "Press ctrl+o to show full startup help and loaded resources.");
270
271
  const onboarding = theme.fg("dim", "Pi can explain its own features and look up its docs. Ask it how to use or extend Pi.");
271
- return `${logo}\n${instructions}\n${compactOnboarding}\n\n${onboarding}`;
272
+ return `${headerWithLogo(instructions)}\n${compactOnboarding}\n\n${onboarding}`;
272
273
  }
273
274
  function expandedHeaderText(bindings) {
274
275
  const keys = bindings === undefined ? undefined : KeybindingsManager.fromOwnedBindings(bindings);
@@ -295,9 +296,12 @@ function expandedHeaderText(bindings) {
295
296
  rawKeyHint("drop files", "to attach"),
296
297
  ].join("\n");
297
298
  const theme = piTheme();
298
- const logo = theme.bold(theme.fg("accent", "pi")) + theme.fg("dim", ` v${VERSION}`);
299
299
  const onboarding = theme.fg("dim", "Pi can explain its own features and look up its docs. Ask it how to use or extend Pi.");
300
- return `${logo}\n${instructions}\n\n${onboarding}`;
300
+ return `${headerWithLogo(instructions)}\n\n${onboarding}`;
301
+ }
302
+ function headerWithLogo(hints) {
303
+ const [top, bottom] = piLogoLines();
304
+ return `${top} ${piTheme().fg("dim", `v${VERSION}`)}\n${bottom} ${hints}`;
301
305
  }
302
306
  function noticeText(notice) {
303
307
  const theme = piTheme();
@@ -179,7 +179,7 @@ export function hotkeysMarkdown(bindings, getShortcuts, profile) {
179
179
  ? action === "app.model.select" ? "Unbound (`/models`)" : "Unbound"
180
180
  : `\`${label}\``;
181
181
  }).join(" / ")} | ${description} |`;
182
- let markdown = ["**Navigation**", "| Key | Action |", "|-----|--------|", row(["tui.editor.cursorUp", "tui.editor.cursorDown", "tui.editor.cursorLeft", "tui.editor.cursorRight"], "Move cursor / browse history"), row(["tui.editor.cursorWordLeft", "tui.editor.cursorWordRight"], "Move by word"), row(["tui.editor.cursorLineStart"], profile === "a1" ? "Start of prompt line" : "Start of line"), row(["tui.editor.cursorLineEnd"], profile === "a1" ? "End of prompt line" : "End of line"), ...(profile === "a1" ? ["| `Ctrl+Home` | Start of content |", "| `Ctrl+End` | End of content / follow output |"] : []), row(["tui.editor.jumpForward"], "Jump forward to character"), row(["tui.editor.jumpBackward"], "Jump backward to character"), row(["tui.editor.pageUp", "tui.editor.pageDown"], "Scroll by page"), "", "**Editing**", "| Key | Action |", "|-----|--------|", row(["tui.input.submit"], "Send message"), row(["tui.input.newLine"], `New line${process.platform === "win32" ? " (Ctrl+Enter on Windows Terminal)" : ""}`), row(["tui.editor.deleteWordBackward"], "Delete word backwards"), row(["tui.editor.deleteWordForward"], "Delete word forwards"), row(["tui.editor.deleteToLineStart"], "Delete to start of line"), row(["tui.editor.deleteToLineEnd"], "Delete to end of line"), row(["tui.editor.yank"], "Paste the most-recently-deleted text"), row(["tui.editor.yankPop"], "Cycle through the deleted text after pasting"), row(["tui.editor.undo"], "Undo"), "", "**Other**", "| Key | Action |", "|-----|--------|", row(["tui.input.tab"], "Path completion / accept autocomplete"), row(["app.interrupt"], "Cancel autocomplete / abort streaming"), row(["app.clear"], "Clear editor (first) / exit (second)"), row(["app.exit"], "Exit (when editor is empty)"), row(["app.suspend"], "Suspend to background"), row(["app.thinking.cycle"], "Cycle thinking level"), row(["app.model.cycleForward", "app.model.cycleBackward"], "Cycle models"), row(["app.model.select"], profile === "a1" ? "Open the Models dialog" : "Open model selector"), row(["app.tools.expand"], "Toggle tool output expansion"), row(["app.thinking.toggle"], "Toggle thinking block visibility"), row(["app.editor.external"], "Edit message in external editor"), row(["app.message.copy"], "Copy selection or last assistant message"), row(["app.message.followUp"], "Queue follow-up message"), row(["app.message.dequeue"], "Restore queued messages"), row(["app.clipboard.pasteImage"], "Paste image or text from clipboard"), "| `/` | Slash commands |", "| `!` | Run bash command |", "| `!!` | Run bash command (excluded from context) |", ...(profile === "a1" ? ["", "**Models dialog**", "| Key | Action |", "|-----|--------|", "| `Space` | Toggle the selected model in the cycling scope |", "| `Tab` | Switch the all/scoped filter |", row(["app.models.save"], "Save the scope to settings"), row(["app.models.enableAll"], "Scope every listed model"), row(["app.models.clearAll"], "Clear the listed models from the scope"), row(["app.models.toggleProvider"], "Toggle the selected model's provider"), row(["app.models.reorderUp", "app.models.reorderDown"], "Reorder the cycling scope")] : [])].join("\n");
182
+ let markdown = ["**Navigation**", "| Key | Action |", "|-----|--------|", row(["tui.editor.cursorUp", "tui.editor.cursorDown", "tui.editor.cursorLeft", "tui.editor.cursorRight"], "Move cursor / browse history"), row(["tui.editor.cursorWordLeft", "tui.editor.cursorWordRight"], "Move by word"), row(["tui.editor.cursorLineStart"], profile === "a1" ? "Start of prompt line" : "Start of line"), row(["tui.editor.cursorLineEnd"], profile === "a1" ? "End of prompt line" : "End of line"), ...(profile === "a1" ? ["| `Ctrl+Home` | Start of content |", "| `Ctrl+End` | End of content / follow output |"] : []), row(["tui.editor.jumpForward"], "Jump forward to character"), row(["tui.editor.jumpBackward"], "Jump backward to character"), row(["tui.editor.pageUp", "tui.editor.pageDown"], "Scroll by page"), "", "**Editing**", "| Key | Action |", "|-----|--------|", row(["tui.input.submit"], "Send message"), row(["tui.input.newLine"], `New line${process.platform === "win32" ? " (Ctrl+Enter on Windows Terminal)" : ""}`), row(["tui.editor.deleteWordBackward"], "Delete word backwards"), row(["tui.editor.deleteWordForward"], "Delete word forwards"), row(["tui.editor.deleteToLineStart"], "Delete to start of line"), row(["tui.editor.deleteToLineEnd"], "Delete to end of line"), row(["tui.editor.yank"], "Paste the most-recently-deleted text"), row(["tui.editor.yankPop"], "Cycle through the deleted text after pasting"), row(["tui.editor.undo"], "Undo"), "", "**Other**", "| Key | Action |", "|-----|--------|", row(["tui.input.tab"], "Path completion / accept autocomplete"), row(["app.interrupt"], "Cancel autocomplete / abort streaming"), row(["app.clear"], "Clear editor (first) / exit (second)"), row(["app.exit"], "Exit (when editor is empty)"), row(["app.suspend"], "Suspend to background"), row(["app.thinking.cycle"], "Cycle thinking level"), row(["app.model.cycleForward", "app.model.cycleBackward"], "Cycle models"), row(["app.model.select"], profile === "a1" ? "Open the Models dialog" : "Open model selector"), row(["app.tools.expand"], "Toggle tool output expansion"), row(["app.thinking.toggle"], "Toggle thinking block visibility"), row(["app.editor.external"], "Edit message in external editor"), row(["app.message.copy"], "Copy selection or last assistant message"), row(["app.message.followUp"], "Queue follow-up message"), row(["app.message.dequeue"], "Restore queued messages"), row(["app.clipboard.pasteImage"], profile === "a1" ? "Paste image or text from clipboard" : "Paste files on macOS, images, or text from clipboard"), "| `/` | Slash commands |", "| `!` | Run bash command |", "| `!!` | Run bash command (excluded from context) |", ...(profile === "a1" ? ["", "**Models dialog**", "| Key | Action |", "|-----|--------|", "| `Space` | Toggle the selected model in the cycling scope |", "| `Tab` | Switch the all/scoped filter |", row(["app.models.save"], "Save the scope to settings"), row(["app.models.enableAll"], "Scope every listed model"), row(["app.models.clearAll"], "Clear the listed models from the scope"), row(["app.models.toggleProvider"], "Toggle the selected model's provider"), row(["app.models.reorderUp", "app.models.reorderDown"], "Reorder the cycling scope")] : [])].join("\n");
183
183
  const shortcuts = getShortcuts(bindings ?? keys.getEffectiveConfig());
184
184
  if (shortcuts.length > 0) {
185
185
  markdown += "\n\n**Extensions**\n| Key | Action |\n|-----|--------|\n";
@@ -63,6 +63,7 @@ export function createPiShellSettingsSelector(options) {
63
63
  onFullscreenExitOutputChange: change("onFullscreenExitOutputChange"),
64
64
  onFullscreenScrollbarChange: change("onFullscreenScrollbarChange"),
65
65
  onFullscreenCopyOnSelectChange: change("onFullscreenCopyOnSelectChange"),
66
+ onFullscreenWheelScrollLinesChange: change("onFullscreenWheelScrollLinesChange"),
66
67
  onWarningsChange: change("onWarningsChange"),
67
68
  onCancel: options.onCancel,
68
69
  };
@@ -46,8 +46,7 @@ export function createTuiFacade(options) {
46
46
  removeInputListener() { },
47
47
  onTerminalColorSchemeChange: () => () => { },
48
48
  setTerminalColorSchemeNotifications() { },
49
- queryTerminalBackgroundColor: async () => undefined,
50
- queryTerminalColorScheme: async () => undefined,
49
+ queryTerminalColors: async () => ({}),
51
50
  };
52
51
  }
53
52
  export function componentPort(component, handleInput) {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.87.1 (MIT), commit f07218c4d4bbc12bef056a7058c3dd49dfe41abe,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.99.2 (MIT), commit 005af57d88ee23b33778f343a9595b32e67ff788,
3
3
  * packages/coding-agent/src/core/keybindings.ts.
4
4
  * Modifications: Mechanical source port with Node import prefixes, public package-root agent-directory
5
5
  * resolution, and an opt-in bare-A1 input profile including Ctrl+L level cycling, unbound model
@@ -148,7 +148,7 @@ export declare const KEYBINDINGS: {
148
148
  };
149
149
  readonly "app.clipboard.pasteImage": {
150
150
  readonly defaultKeys: "alt+v" | "ctrl+v";
151
- readonly description: "Paste image from clipboard (text fallback)";
151
+ readonly description: "Paste files on macOS, images, or text from clipboard";
152
152
  };
153
153
  readonly "app.session.new": {
154
154
  readonly defaultKeys: [];
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.87.1 (MIT), commit f07218c4d4bbc12bef056a7058c3dd49dfe41abe,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.99.2 (MIT), commit 005af57d88ee23b33778f343a9595b32e67ff788,
3
3
  * packages/coding-agent/src/core/keybindings.ts.
4
4
  * Modifications: Mechanical source port with Node import prefixes, public package-root agent-directory
5
5
  * resolution, and an opt-in bare-A1 input profile including Ctrl+L level cycling, unbound model
@@ -84,7 +84,7 @@ export const KEYBINDINGS = {
84
84
  },
85
85
  "app.clipboard.pasteImage": {
86
86
  defaultKeys: windowsKeybindings ? "alt+v" : "ctrl+v",
87
- description: "Paste image from clipboard (text fallback)",
87
+ description: "Paste files on macOS, images, or text from clipboard",
88
88
  },
89
89
  "app.session.new": { defaultKeys: [], description: "Start a new session" },
90
90
  "app.session.tree": { defaultKeys: [], description: "Open session tree" },
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "sourcePackage": "@earendil-works/pi-coding-agent",
3
- "sourceVersion": "0.87.1",
3
+ "sourceVersion": "0.99.2",
4
4
  "upstreamRepository": "https://github.com/earendil-works/pi.git",
5
- "upstreamCommit": "f07218c4d4bbc12bef056a7058c3dd49dfe41abe",
5
+ "upstreamCommit": "005af57d88ee23b33778f343a9595b32e67ff788",
6
6
  "sourcePath": "dist/modes/interactive/assets/clankolas.png",
7
7
  "sourceSha256": "169acd0dfe6fbb8d8742ed24a3fc654fd0b2e2d4223c733249c5493723f1b72d",
8
8
  "license": "MIT",
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.87.1 (MIT), commit f07218c4d4bbc12bef056a7058c3dd49dfe41abe,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.99.2 (MIT), commit 005af57d88ee23b33778f343a9595b32e67ff788,
3
3
  * packages/coding-agent/src/modes/interactive/components/countdown-timer.ts.
4
4
  * Modifications: Mechanical source port with ECMAScript private fields; imports remain on the public
5
5
  * Pi TUI package root.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.87.1 (MIT), commit f07218c4d4bbc12bef056a7058c3dd49dfe41abe,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.99.2 (MIT), commit 005af57d88ee23b33778f343a9595b32e67ff788,
3
3
  * packages/coding-agent/src/modes/interactive/components/daxnuts.ts.
4
4
  * Modifications: Mechanical pinned source port with private imports remapped to public package-root
5
5
  * types/APIs and A1-owned theme boundaries; behavior remains acceptance-tested.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.87.1 (MIT), commit f07218c4d4bbc12bef056a7058c3dd49dfe41abe,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.99.2 (MIT), commit 005af57d88ee23b33778f343a9595b32e67ff788,
3
3
  * packages/coding-agent/src/modes/interactive/components/daxnuts.ts.
4
4
  * Modifications: Mechanical pinned source port with private imports remapped to public package-root
5
5
  * types/APIs and A1-owned theme boundaries; behavior remains acceptance-tested.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.87.1 (MIT), commit f07218c4d4bbc12bef056a7058c3dd49dfe41abe,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.99.2 (MIT), commit 005af57d88ee23b33778f343a9595b32e67ff788,
3
3
  * packages/coding-agent/src/modes/interactive/components/earendil-announcement.ts.
4
4
  * Modifications: Mechanical pinned source port with private imports remapped to public package-root
5
5
  * types/APIs and A1-owned theme boundaries. The unchanged image is loaded lazily from its attributed,
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.87.1 (MIT), commit f07218c4d4bbc12bef056a7058c3dd49dfe41abe,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.99.2 (MIT), commit 005af57d88ee23b33778f343a9595b32e67ff788,
3
3
  * packages/coding-agent/src/modes/interactive/components/extension-editor.ts.
4
4
  * Modifications: Mechanical port: remap pi-tui to the root public singleton, use owned
5
5
  * keybindings/theme and external-editor seams, preserve editor layout, hints, focus, submission,
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.87.1 (MIT), commit f07218c4d4bbc12bef056a7058c3dd49dfe41abe,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.99.2 (MIT), commit 005af57d88ee23b33778f343a9595b32e67ff788,
3
3
  * packages/coding-agent/src/modes/interactive/components/extension-editor.ts.
4
4
  * Modifications: Mechanical port: remap pi-tui to the root public singleton, use owned
5
5
  * keybindings/theme and external-editor seams, preserve editor layout, hints, focus, submission,
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.87.1 (MIT), commit f07218c4d4bbc12bef056a7058c3dd49dfe41abe,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.99.2 (MIT), commit 005af57d88ee23b33778f343a9595b32e67ff788,
3
3
  * packages/coding-agent/src/modes/interactive/components/extension-input.ts.
4
4
  * Modifications: Mechanical port: remap public imports, use ECMAScript private fields, and route the
5
5
  * bare-A1 instruction row and chrome through the shared semantic shortcut and compact padded
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.87.1 (MIT), commit f07218c4d4bbc12bef056a7058c3dd49dfe41abe,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.99.2 (MIT), commit 005af57d88ee23b33778f343a9595b32e67ff788,
3
3
  * packages/coding-agent/src/modes/interactive/components/extension-selector.ts.
4
4
  * Modifications: Mechanical port: remap public imports, use ECMAScript private fields, and route the
5
5
  * bare-A1 instruction row and chrome through the shared semantic shortcut and compact padded
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.87.1 (MIT), commit f07218c4d4bbc12bef056a7058c3dd49dfe41abe,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.99.2 (MIT), commit 005af57d88ee23b33778f343a9595b32e67ff788,
3
3
  * packages/coding-agent/src/modes/interactive/components/mermaid.ts.
4
4
  * Modifications: Mechanical pinned source port with private imports remapped to public package-root
5
5
  * types/APIs and A1-owned theme boundaries; behavior remains acceptance-tested.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.87.1 (MIT), commit f07218c4d4bbc12bef056a7058c3dd49dfe41abe,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.99.2 (MIT), commit 005af57d88ee23b33778f343a9595b32e67ff788,
3
3
  * packages/coding-agent/src/modes/interactive/components/custom-editor.ts.
4
4
  * Modifications: A1-owned class name and synchronized A1 keybinding contract replace the nominal
5
5
  * private upstream keybinding constructor dependency; bare A1 injects the shared Settings/agent input
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.87.1 (MIT), commit f07218c4d4bbc12bef056a7058c3dd49dfe41abe,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.99.2 (MIT), commit 005af57d88ee23b33778f343a9595b32e67ff788,
3
3
  * packages/coding-agent/src/modes/interactive/components/custom-editor.ts.
4
4
  * Modifications: A1-owned class name and synchronized A1 keybinding contract replace the nominal
5
5
  * private upstream keybinding constructor dependency; bare A1 injects the shared Settings/agent input
@@ -0,0 +1,2 @@
1
+ /** The fixed-color, four-cell by two-line pinned Pi logo. */
2
+ export declare function piLogoLines(): [string, string];
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Provenance: @earendil-works/pi-coding-agent 0.99.2 (MIT), commit 005af57d88ee23b33778f343a9595b32e67ff788,
3
+ * packages/coding-agent/src/modes/interactive/components/pi-logo.ts.
4
+ * Modifications: Remapped the private theme import to A1's public-backed adapter and composed the
5
+ * fixed-color logo into the owned startup header.
6
+ * Deviations: none.
7
+ */
8
+ import { backgroundAnsi, foregroundAnsi, rgbColor } from "@earendil-works/pi-tui";
9
+ import { piTheme } from "../../theme.js";
10
+ const CORAL = rgbColor(228, 138, 122);
11
+ const BLUE = rgbColor(79, 142, 179);
12
+ const YELLOW = rgbColor(234, 182, 93);
13
+ const RESET = "\x1b[0m";
14
+ /** The fixed-color, four-cell by two-line pinned Pi logo. */
15
+ export function piLogoLines() {
16
+ const mode = piTheme().getColorMode();
17
+ const fg = (color) => foregroundAnsi(color, mode);
18
+ const top = `${fg(CORAL)}${backgroundAnsi(BLUE, mode)}▀${RESET}${fg(CORAL)}▀█${RESET} `;
19
+ const bottom = `${fg(BLUE)}█▀${RESET} ${fg(YELLOW)}█${RESET}`;
20
+ return [top, bottom];
21
+ }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.87.1 (MIT), commit f07218c4d4bbc12bef056a7058c3dd49dfe41abe,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.99.2 (MIT), commit 005af57d88ee23b33778f343a9595b32e67ff788,
3
3
  * packages/coding-agent/src/modes/interactive/components/scoped-models-selector.ts.
4
4
  * Modifications: Source-synchronized scoped-model selector port: preserve session-only toggles,
5
5
  * search, bulk/provider/reorder actions, dirty state, Ctrl+S persistence, refresh status,
@@ -1,10 +1,11 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.87.1 (MIT), commit f07218c4d4bbc12bef056a7058c3dd49dfe41abe,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.99.2 (MIT), commit 005af57d88ee23b33778f343a9595b32e67ff788,
3
3
  * packages/coding-agent/src/modes/interactive/components/footer.ts.
4
- * Modifications: Consumes neutral owned-UI view data instead of a fabricated concrete AgentSession; an
5
- * explicit bare-A1 profile colors the thinking-level name, renders its repository-context path, and
6
- * reserves its linked pull-request badge before path truncation while preserving the remaining footer
7
- * layout and formatting; replacement surfaces may suppress a thinking level they already present.
4
+ * Modifications: Consumes neutral owned-UI view data instead of a fabricated concrete AgentSession;
5
+ * preserves the latest physical route for virtual models; an explicit bare-A1 profile colors the
6
+ * thinking-level name, renders its repository-context path, and reserves its linked pull-request badge
7
+ * before path truncation while preserving the remaining footer layout and formatting; replacement
8
+ * surfaces may suppress a thinking level they already present.
8
9
  * Deviations: owned-status-level-color, owned-pull-request-badge.
9
10
  */
10
11
  import { isAbsolute, relative, resolve, sep } from "node:path";
@@ -88,10 +89,16 @@ export class SessionFooter {
88
89
  leftWidth = visibleWidth(left);
89
90
  }
90
91
  const modelName = view.activeModel?.modelId ?? "no-model";
91
- const rightWithoutProvider = this.profile === "a1"
92
+ let rightWithoutProvider = this.profile === "a1"
92
93
  ? view.activeModel === null || !this.show() ? theme.fg("dim", modelName)
93
94
  : theme.fg("dim", `${modelName} • `) + theme.getThinkingBorderColor(view.thinkingLevel)(view.thinkingLevel)
94
95
  : view.activeModel === null || view.thinkingLevel === "off" || !this.show() ? modelName : `${modelName} • ${view.thinkingLevel}`;
96
+ const routed = view.routedModel;
97
+ if (routed) {
98
+ const level = routed.thinkingLevel === undefined ? "" : ` • ${routed.thinkingLevel}`;
99
+ const route = ` → ${routed.model.modelId}${level}`;
100
+ rightWithoutProvider += this.profile === "a1" ? theme.fg("dim", route) : route;
101
+ }
95
102
  let right = rightWithoutProvider;
96
103
  if ((view.status.footer?.availableProviderCount ?? 1) > 1 && view.activeModel) {
97
104
  const provider = `(${view.activeModel.providerId}) `;