@timurproko/a1 0.1.8-dev.528 → 0.1.8-dev.544

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 (108) hide show
  1. package/bin/update-recovery.js +25 -3
  2. package/dist/app/session-shell/session-shell-root.d.ts +1 -0
  3. package/dist/app/session-shell/session-shell-root.js +3 -1
  4. package/dist/app/session-shell/session-shell.d.ts +1 -1
  5. package/dist/app/session-shell/session-shell.js +10 -4
  6. package/dist/composition/owned-ui.js +4 -3
  7. package/dist/composition/settings-route-host.d.ts +5 -9
  8. package/dist/composition/settings-route-host.js +2 -2
  9. package/dist/contracts/owned-ui/model.d.ts +4 -0
  10. package/dist/contracts/owned-ui/validation.js +25 -0
  11. package/dist/features/owned-ui/index.d.ts +1 -1
  12. package/dist/features/owned-ui/reference-screen-app.d.ts +9 -3
  13. package/dist/features/owned-ui/reference-screen-app.js +68 -20
  14. package/dist/features/owned-ui/settings-app.js +69 -24
  15. package/dist/foundation/release/index.d.ts +2 -2
  16. package/dist/foundation/release/index.js +1 -1
  17. package/dist/foundation/release/update-recovery.d.ts +7 -1
  18. package/dist/foundation/release/update-recovery.js +39 -9
  19. package/dist/foundation/release/update.d.ts +7 -0
  20. package/dist/foundation/release/update.js +115 -24
  21. package/dist/foundation/startup/startup-descriptor.js +2 -2
  22. package/dist/integrations/pi/components/index.d.ts +3 -1
  23. package/dist/integrations/pi/components/index.js +2 -1
  24. package/dist/integrations/pi/components/shell-editor-autocomplete.d.ts +9 -1
  25. package/dist/integrations/pi/components/shell-editor-autocomplete.js +10 -9
  26. package/dist/integrations/pi/components/shell-footer-status.d.ts +1 -1
  27. package/dist/integrations/pi/components/shell-footer-status.js +2 -2
  28. package/dist/integrations/pi/components/shell-hotkey-sections.d.ts +7 -0
  29. package/dist/integrations/pi/components/shell-hotkey-sections.js +29 -0
  30. package/dist/integrations/pi/components/shell-presenters-info.d.ts +1 -0
  31. package/dist/integrations/pi/components/shell-presenters-info.js +1 -1
  32. package/dist/integrations/pi/components/shell-selectors-dialogs.d.ts +0 -1
  33. package/dist/integrations/pi/components/shell-selectors-dialogs.js +1 -7
  34. package/dist/integrations/pi/components/thinking-selector-dialog.d.ts +8 -0
  35. package/dist/integrations/pi/components/thinking-selector-dialog.js +22 -0
  36. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.d.ts +1 -1
  37. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.js +1 -1
  38. package/dist/integrations/pi/components/upstream/assets/earendil-image.json +2 -2
  39. package/dist/integrations/pi/components/upstream/components/countdown-timer.d.ts +1 -1
  40. package/dist/integrations/pi/components/upstream/components/daxnuts.d.ts +1 -1
  41. package/dist/integrations/pi/components/upstream/components/daxnuts.js +1 -1
  42. package/dist/integrations/pi/components/upstream/components/earendil-announcement.js +1 -1
  43. package/dist/integrations/pi/components/upstream/components/extension-editor.d.ts +2 -1
  44. package/dist/integrations/pi/components/upstream/components/extension-editor.js +7 -2
  45. package/dist/integrations/pi/components/upstream/components/mermaid.js +1 -1
  46. package/dist/integrations/pi/components/upstream/components/owned-editor.d.ts +1 -1
  47. package/dist/integrations/pi/components/upstream/components/owned-editor.js +1 -1
  48. package/dist/integrations/pi/components/upstream/components/scoped-models-selector.d.ts +1 -1
  49. package/dist/integrations/pi/components/upstream/components/session-footer.d.ts +2 -1
  50. package/dist/integrations/pi/components/upstream/components/session-footer.js +22 -11
  51. package/dist/integrations/pi/components/upstream/components/session-selector-search.js +1 -1
  52. package/dist/integrations/pi/components/upstream/components/session-selector.js +1 -1
  53. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.d.ts +1 -1
  54. package/dist/integrations/pi/components/upstream/components/skill-invocation-message.js +1 -1
  55. package/dist/integrations/pi/components/upstream/components/status-indicator.d.ts +1 -1
  56. package/dist/integrations/pi/components/upstream/components/status-indicator.js +1 -1
  57. package/dist/integrations/pi/components/upstream/components/thinking-selector.d.ts +33 -0
  58. package/dist/integrations/pi/components/upstream/components/thinking-selector.js +140 -0
  59. package/dist/integrations/pi/components/upstream/components/tool-execution.js +1 -1
  60. package/dist/integrations/pi/components/upstream/components/tree-selector.d.ts +1 -1
  61. package/dist/integrations/pi/components/upstream/components/tree-selector.js +8 -1
  62. package/dist/integrations/pi/components/upstream/components/trust-selector.js +1 -1
  63. package/dist/integrations/pi/components/upstream/external-editor.js +1 -1
  64. package/dist/integrations/pi/components/upstream/history/editor-core.d.ts +1 -1
  65. package/dist/integrations/pi/components/upstream/history/editor-core.js +1 -1
  66. package/dist/integrations/pi/components/upstream/history/kill-ring.d.ts +1 -1
  67. package/dist/integrations/pi/components/upstream/history/kill-ring.js +1 -1
  68. package/dist/integrations/pi/components/upstream/history/printable-key.js +1 -1
  69. package/dist/integrations/pi/components/upstream/history/text-helpers.js +1 -1
  70. package/dist/integrations/pi/components/upstream/history/undo-stack.d.ts +1 -1
  71. package/dist/integrations/pi/components/upstream/history/undo-stack.js +1 -1
  72. package/dist/integrations/pi/components/upstream/history/word-navigation.js +1 -1
  73. package/dist/integrations/pi/components/upstream/model-search.d.ts +1 -1
  74. package/dist/integrations/pi/components/upstream/theme/theme-controller.d.ts +1 -1
  75. package/dist/integrations/pi/components/upstream/theme/theme.js +1 -1
  76. package/dist/integrations/pi/engine/adapter.js +1 -0
  77. package/dist/integrations/pi/engine/repository-pr.d.ts +8 -0
  78. package/dist/integrations/pi/engine/repository-pr.js +62 -0
  79. package/dist/integrations/pi/engine/resources/changelog.json +4 -4
  80. package/dist/integrations/pi/engine/session-runtime.d.ts +5 -0
  81. package/dist/integrations/pi/engine/session-runtime.js +60 -1
  82. package/dist/integrations/pi/engine/workflow-support.js +3 -1
  83. package/dist/integrations/pi/engine/workflows.d.ts +1 -1
  84. package/dist/integrations/pi/engine/workflows.js +4 -2
  85. package/dist/integrations/pi/startup-public.js +63 -56
  86. package/dist/integrations/pi/startup-public.manifest.json +200 -169
  87. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.d.ts +1 -1
  88. package/dist/integrations/pi/tui-runtime/damage-aware-terminal.js +1 -1
  89. package/dist/native/darwin-arm64/manifest.json +1 -1
  90. package/dist/native/linux-x64/manifest.json +1 -1
  91. package/dist/native/win32-x64/manifest.json +2 -2
  92. package/dist/native/win32-x64/process-guardian.exe +0 -0
  93. package/dist/product-identity.d.ts +1 -1
  94. package/dist/product-identity.js +1 -1
  95. package/dist/product-identity.json +1 -0
  96. package/dist/runtime-payload-inventory.json +2948 -2646
  97. package/dist/ui/components/index.d.ts +1 -1
  98. package/dist/ui/components/list-block.d.ts +10 -6
  99. package/dist/ui/components/list-block.js +28 -15
  100. package/dist/ui/components/list-view.d.ts +1 -1
  101. package/dist/ui/components/list-view.js +4 -2
  102. package/dist/ui/components/mouse.js +4 -2
  103. package/dist/ui/components/theme.d.ts +1 -5
  104. package/dist/ui/components/theme.js +0 -4
  105. package/dist/ui/components/value-menu.d.ts +3 -1
  106. package/dist/ui/components/value-menu.js +13 -5
  107. package/docs/local-worktree-cleanup.md +1 -1
  108. package/package.json +3 -3
@@ -0,0 +1,22 @@
1
+ import { ThinkingSelectorComponent } from "../startup-public.js";
2
+ import { OwnedThinkingSelectorComponent } from "./upstream/components/thinking-selector.js";
3
+ import { componentPort, ensureTheme } from "./shell-shared-facade.js";
4
+ function displayKeybinding(binding) {
5
+ const keys = typeof binding === "string" ? [binding] : binding;
6
+ return keys.map(key => key.split("+").map(part => {
7
+ const display = process.platform === "darwin" && part.toLowerCase() === "alt" ? "option" : part;
8
+ return display.charAt(0).toUpperCase() + display.slice(1);
9
+ }).join("+")).join("/");
10
+ }
11
+ /** Lazily loaded because thinking-selector code does not belong to the startup graph before `/thinking` opens. */
12
+ export function createPiShellThinkingSelector(currentLevel, availableLevels, onSelect, onCancel, onSelectAsDefault, defaultLevel, presentation) {
13
+ ensureTheme();
14
+ if (presentation?.profile === "bare") {
15
+ const cycleKey = displayKeybinding(presentation.cycleBinding);
16
+ const selector = new OwnedThinkingSelectorComponent(currentLevel, [...availableLevels], onSelect, onCancel, cycleKey || "Unbound", onSelectAsDefault, defaultLevel);
17
+ return componentPort(selector, data => selector.handleInput(data));
18
+ }
19
+ const selector = new ThinkingSelectorComponent(currentLevel, [...availableLevels], onSelect, onCancel, onSelectAsDefault, defaultLevel);
20
+ const list = selector.getSelectList();
21
+ return componentPort(selector, data => list.handleInput(data));
22
+ }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
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 and unbound model
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
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 and unbound model
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "sourcePackage": "@earendil-works/pi-coding-agent",
3
- "sourceVersion": "0.86.0",
3
+ "sourceVersion": "0.87.0",
4
4
  "upstreamRepository": "https://github.com/earendil-works/pi.git",
5
- "upstreamCommit": "ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc",
5
+ "upstreamCommit": "16787ad5b2dc748047f314ca1bfe7708f30f54f3",
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.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
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.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
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.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
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.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
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.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
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,
@@ -15,6 +15,7 @@ export declare class ExtensionEditorComponent extends Container {
15
15
  constructor(tui: TUI, keybindings: KeybindingsManager, title: string, prefill: string | undefined, onSubmit: (value: string) => void, onCancel: () => void, options?: {
16
16
  readonly paddingX?: number;
17
17
  readonly autocompleteMaxVisible?: number;
18
+ readonly description?: string;
18
19
  }, externalEditorCommand?: string);
19
20
  handleInput(data: string): void;
20
21
  }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
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,
@@ -36,14 +36,19 @@ export class ExtensionEditorComponent extends Container {
36
36
  || process.env.VISUAL
37
37
  || process.env.EDITOR
38
38
  || (process.platform === "win32" ? "notepad" : "nano");
39
+ const { description, ...editorOptions } = options ?? {};
39
40
  this.addChild(new DynamicBorder());
40
41
  this.addChild(new Spacer(1));
41
42
  this.addChild(new Text(piTheme().fg("accent", title), 1, 0));
43
+ if (description) {
44
+ this.addChild(new Spacer(1));
45
+ this.addChild(new Text(piTheme().fg("text", description), 1, 0));
46
+ }
42
47
  this.addChild(new Spacer(1));
43
48
  this.#editor = new Editor(tui, {
44
49
  borderColor: text => piTheme().fg("borderMuted", text),
45
50
  selectList: getSelectListTheme(),
46
- }, options);
51
+ }, editorOptions);
47
52
  if (prefill)
48
53
  this.#editor.setText(prefill);
49
54
  this.#editor.onSubmit = onSubmit;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
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.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
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.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
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.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
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,
@@ -4,7 +4,8 @@ export declare class SessionFooter implements Component {
4
4
  private readonly getView;
5
5
  private readonly cwd;
6
6
  private readonly profile;
7
- constructor(getView: () => OwnedUiSessionViewModel, cwd: string, profile?: "pi" | "a1");
7
+ private readonly show;
8
+ constructor(getView: () => OwnedUiSessionViewModel, cwd: string, profile?: "pi" | "a1", show?: () => boolean);
8
9
  invalidate(): void;
9
10
  dispose(): void;
10
11
  render(width: number): string[];
@@ -1,19 +1,26 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
3
3
  * packages/coding-agent/src/modes/interactive/components/footer.ts.
4
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 while preserving the remaining footer layout
6
- * and formatting.
7
- * Deviations: owned-status-level-color.
5
+ * explicit bare-A1 profile colors the thinking-level name and adds its linked pull-request badge while
6
+ * preserving the remaining footer layout and formatting, and replacement surfaces may suppress a
7
+ * thinking level they already present.
8
+ * Deviations: owned-status-level-color, owned-pull-request-badge.
8
9
  */
9
10
  import { isAbsolute, relative, resolve, sep } from "node:path";
10
- import { truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
11
+ import { hyperlink, truncateToWidth, visibleWidth } from "@earendil-works/pi-tui";
11
12
  import { piTheme } from "../../theme.js";
12
13
  export class SessionFooter {
13
14
  getView;
14
15
  cwd;
15
16
  profile;
16
- constructor(getView, cwd, profile = "pi") { this.getView = getView; this.cwd = cwd; this.profile = profile; }
17
+ show;
18
+ constructor(getView, cwd, profile = "pi", show = () => true) {
19
+ this.getView = getView;
20
+ this.cwd = cwd;
21
+ this.profile = profile;
22
+ this.show = show;
23
+ }
17
24
  invalidate() { }
18
25
  dispose() { }
19
26
  render(width) {
@@ -34,8 +41,12 @@ export class SessionFooter {
34
41
  if (branch)
35
42
  pwd = `${pwd} (${branch})`;
36
43
  const sessionName = view.status.footer?.sessionName;
37
- if (sessionName)
38
- pwd = `${pwd} • ${sessionName}`;
44
+ const pullRequest = this.profile === "a1" ? view.status.footer?.pullRequest : null;
45
+ const pathRow = pullRequest === undefined || pullRequest === null
46
+ ? theme.fg("dim", sessionName ? `${pwd} • ${sessionName}` : pwd)
47
+ : theme.fg("dim", `${pwd} PR `)
48
+ + hyperlink(theme.fg("mdLink", `#${pullRequest.number}`), pullRequest.url)
49
+ + (sessionName ? theme.fg("dim", ` • ${sessionName}`) : "");
39
50
  const parts = [];
40
51
  if (input)
41
52
  parts.push(`↑${formatTokens(input)}`);
@@ -62,9 +73,9 @@ export class SessionFooter {
62
73
  }
63
74
  const modelName = view.activeModel?.modelId ?? "no-model";
64
75
  const rightWithoutProvider = this.profile === "a1"
65
- ? view.activeModel === null ? theme.fg("dim", modelName)
76
+ ? view.activeModel === null || !this.show() ? theme.fg("dim", modelName)
66
77
  : theme.fg("dim", `${modelName} • `) + theme.getThinkingBorderColor(view.thinkingLevel)(view.thinkingLevel)
67
- : view.activeModel === null || view.thinkingLevel === "off" ? modelName : `${modelName} • ${view.thinkingLevel}`;
78
+ : view.activeModel === null || view.thinkingLevel === "off" || !this.show() ? modelName : `${modelName} • ${view.thinkingLevel}`;
68
79
  let right = rightWithoutProvider;
69
80
  if ((view.status.footer?.availableProviderCount ?? 1) > 1 && view.activeModel) {
70
81
  const provider = `(${view.activeModel.providerId}) `;
@@ -87,7 +98,7 @@ export class SessionFooter {
87
98
  line = left;
88
99
  }
89
100
  const lines = [
90
- truncateToWidth(theme.fg("dim", pwd), width, theme.fg("dim", "...")),
101
+ truncateToWidth(pathRow, width, theme.fg("dim", "...")),
91
102
  theme.fg("dim", left) + (this.profile === "a1" ? line.slice(left.length) : theme.fg("dim", line.slice(left.length))),
92
103
  ];
93
104
  const statuses = view.status.footer?.extensionStatuses ?? [];
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
3
3
  * packages/coding-agent/src/modes/interactive/components/session-selector-search.ts.
4
4
  * Modifications: Source-synchronized session search port with only the public SessionInfo type import
5
5
  * remapped.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
3
3
  * packages/coding-agent/src/modes/interactive/components/session-selector.ts.
4
4
  * Modifications: Source-synchronized session selector port: preserve threaded/current/all scope,
5
5
  * search, sort, named/path filters, rename, delete confirmation, active-session protection, loading
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
3
3
  * packages/coding-agent/src/modes/interactive/components/skill-invocation-message.ts.
4
4
  * Modifications: Mechanical port uses A1's public pi-tui instance, owned theme boundary, and
5
5
  * root-instance keybinding registry because the public coding-agent component closes over a second
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
3
3
  * packages/coding-agent/src/modes/interactive/components/skill-invocation-message.ts.
4
4
  * Modifications: Mechanical port uses A1's public pi-tui instance, owned theme boundary, and
5
5
  * root-instance keybinding registry because the public coding-agent component closes over a second
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
3
3
  * packages/coding-agent/src/modes/interactive/components/status-indicator.ts.
4
4
  * Modifications: Mechanical source port with public package-root keybinding, Loader, and owned
5
5
  * theme/countdown imports plus ECMAScript private fields.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
3
3
  * packages/coding-agent/src/modes/interactive/components/status-indicator.ts.
4
4
  * Modifications: Mechanical source port with public package-root keybinding, Loader, and owned
5
5
  * theme/countdown imports plus ECMAScript private fields.
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Provenance: @earendil-works/pi-coding-agent 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
3
+ * packages/coding-agent/src/modes/interactive/components/thinking-selector.ts.
4
+ * Modifications: Preserve the searchable thinking-level selector, current/default semantics,
5
+ * selection, save, cancellation, and focus while accepting the active bare-A1 cycle-key label from the
6
+ * shell, styling the title with the established bold semantic accent treatment, placing its muted hint
7
+ * directly below it, deduplicating levels, and rendering aligned muted descriptions after an adjacent
8
+ * success-colored active marker. All list and border colors use the owned theme and its explicit color
9
+ * mode. The comparison profile retains the public pinned component.
10
+ * Deviations: owned-level-cycle-shortcut, owned-thinking-selector-heading.
11
+ */
12
+ import { Container, type Focusable, SelectList } from "@earendil-works/pi-tui";
13
+ export type ThinkingSelectorLevel = "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max";
14
+ /** Bare-A1 thinking-level selector with profile-resolved shortcut presentation. */
15
+ export declare class OwnedThinkingSelectorComponent extends Container implements Focusable {
16
+ private searchInput;
17
+ private selectList;
18
+ private selectListChildIndex;
19
+ private allItems;
20
+ private onSelect;
21
+ private onCancel;
22
+ private onSelectAsDefault;
23
+ private currentLevel;
24
+ private _focused;
25
+ get focused(): boolean;
26
+ set focused(value: boolean);
27
+ constructor(currentLevel: ThinkingSelectorLevel, availableLevels: ThinkingSelectorLevel[], onSelect: (level: ThinkingSelectorLevel) => void, onCancel: () => void, cycleKeyDisplay: string, onSelectAsDefault?: (level: ThinkingSelectorLevel) => void, defaultThinkingLevel?: ThinkingSelectorLevel);
28
+ private keyDisplayText;
29
+ private buildSelectList;
30
+ private applyFilter;
31
+ handleInput(keyData: string): void;
32
+ getSelectList(): SelectList;
33
+ }
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Provenance: @earendil-works/pi-coding-agent 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
3
+ * packages/coding-agent/src/modes/interactive/components/thinking-selector.ts.
4
+ * Modifications: Preserve the searchable thinking-level selector, current/default semantics,
5
+ * selection, save, cancellation, and focus while accepting the active bare-A1 cycle-key label from the
6
+ * shell, styling the title with the established bold semantic accent treatment, placing its muted hint
7
+ * directly below it, deduplicating levels, and rendering aligned muted descriptions after an adjacent
8
+ * success-colored active marker. All list and border colors use the owned theme and its explicit color
9
+ * mode. The comparison profile retains the public pinned component.
10
+ * Deviations: owned-level-cycle-shortcut, owned-thinking-selector-heading.
11
+ */
12
+ import { Container, fuzzyFilter, getKeybindings, Input, SelectList, Spacer, Text, } from "@earendil-works/pi-tui";
13
+ import { DynamicBorder } from "../../../startup-public.js";
14
+ import { piTheme } from "../theme/theme.js";
15
+ const THINKING_SELECT_LIST_LAYOUT = {
16
+ minPrimaryColumnWidth: 12,
17
+ maxPrimaryColumnWidth: 32,
18
+ };
19
+ const LEVEL_DESCRIPTIONS = {
20
+ off: "No reasoning",
21
+ minimal: "Very brief reasoning (~1k tokens)",
22
+ low: "Light reasoning (~2k tokens)",
23
+ medium: "Moderate reasoning (~8k tokens)",
24
+ high: "Deep reasoning (~16k tokens)",
25
+ xhigh: "Extra-high reasoning (~32k tokens)",
26
+ max: "Maximum reasoning",
27
+ };
28
+ /** Bare-A1 thinking-level selector with profile-resolved shortcut presentation. */
29
+ export class OwnedThinkingSelectorComponent extends Container {
30
+ searchInput;
31
+ selectList;
32
+ selectListChildIndex;
33
+ allItems;
34
+ onSelect;
35
+ onCancel;
36
+ onSelectAsDefault;
37
+ currentLevel;
38
+ _focused = false;
39
+ get focused() {
40
+ return this._focused;
41
+ }
42
+ set focused(value) {
43
+ this._focused = value;
44
+ this.searchInput.focused = value;
45
+ }
46
+ constructor(currentLevel, availableLevels, onSelect, onCancel, cycleKeyDisplay, onSelectAsDefault, defaultThinkingLevel) {
47
+ super();
48
+ this.onSelect = onSelect;
49
+ this.onCancel = onCancel;
50
+ this.onSelectAsDefault = onSelectAsDefault;
51
+ this.currentLevel = currentLevel;
52
+ this.allItems = [...new Set(availableLevels)].map((level) => ({
53
+ value: level,
54
+ label: level,
55
+ description: level === defaultThinkingLevel ? `${LEVEL_DESCRIPTIONS[level]} · default` : LEVEL_DESCRIPTIONS[level],
56
+ }));
57
+ this.addChild(new DynamicBorder((text) => piTheme().fg("border", text)));
58
+ this.addChild(new Spacer(1));
59
+ this.addChild(new Text(piTheme().fg("accent", piTheme().bold("Thinking Level")), 0, 0));
60
+ this.addChild(new Text(piTheme().fg("muted", `${cycleKeyDisplay} cycles thinking levels in-session`), 0, 0));
61
+ this.addChild(new Spacer(1));
62
+ this.searchInput = new Input();
63
+ this.searchInput.onSubmit = () => this.selectList.handleInput("\r");
64
+ this.addChild(this.searchInput);
65
+ this.addChild(new Spacer(1));
66
+ this.selectList = this.buildSelectList(this.allItems, currentLevel);
67
+ this.selectListChildIndex = this.children.length;
68
+ this.addChild(this.selectList);
69
+ this.addChild(new Spacer(1));
70
+ this.addChild(new Text(piTheme().fg("dim", ` ${this.keyDisplayText("tui.select.confirm")} to select · ${this.keyDisplayText("app.thinking.save")} to set as default · ${this.keyDisplayText("tui.select.cancel")} to cancel`), 0, 0));
71
+ this.addChild(new DynamicBorder((text) => piTheme().fg("border", text)));
72
+ }
73
+ keyDisplayText(keybinding) {
74
+ return getKeybindings().getKeys(keybinding)
75
+ .map((key) => key.split("+").map((part) => {
76
+ const display = process.platform === "darwin" && part.toLowerCase() === "alt" ? "option" : part;
77
+ return display.charAt(0).toUpperCase() + display.slice(1);
78
+ }).join("+"))
79
+ .join("/");
80
+ }
81
+ buildSelectList(items, preselect) {
82
+ const primaryWidth = this.allItems.reduce((widest, item) => {
83
+ const level = item.label ?? item.value;
84
+ return Math.max(widest, level.length + (item.value === this.currentLevel ? 2 : 0));
85
+ }, 0);
86
+ const themedItems = items.map((item) => {
87
+ const level = item.label ?? item.value;
88
+ const current = item.value === this.currentLevel;
89
+ const currentMarker = current ? ` ${piTheme().fg("success", "✓")}` : "";
90
+ const separator = " ".repeat(Math.max(1, primaryWidth - level.length - (current ? 2 : 0) + 1));
91
+ const description = item.description ? piTheme().fg("muted", item.description) : "";
92
+ return { value: item.value, label: `${level}${currentMarker}${separator}${description}` };
93
+ });
94
+ // Invariant: the bare selector uses the owned theme's explicit color mode, not upstream's host detection.
95
+ const list = new SelectList(themedItems, Math.max(1, themedItems.length), {
96
+ selectedPrefix: text => piTheme().fg("accent", text),
97
+ selectedText: text => piTheme().fg("accent", text),
98
+ description: text => piTheme().fg("muted", text),
99
+ scrollInfo: text => piTheme().fg("muted", text),
100
+ noMatch: text => piTheme().fg("muted", text),
101
+ }, THINKING_SELECT_LIST_LAYOUT);
102
+ const currentIndex = themedItems.findIndex((item) => item.value === preselect);
103
+ if (currentIndex !== -1)
104
+ list.setSelectedIndex(currentIndex);
105
+ list.onSelect = (item) => this.onSelect(item.value);
106
+ list.onCancel = () => this.onCancel();
107
+ return list;
108
+ }
109
+ applyFilter(query) {
110
+ const filtered = query
111
+ ? fuzzyFilter(this.allItems, query, (item) => `${item.value} ${item.description ?? ""}`)
112
+ : this.allItems;
113
+ const selectedValue = this.selectList.getSelectedItem()?.value;
114
+ const newList = this.buildSelectList(filtered, selectedValue);
115
+ this.children[this.selectListChildIndex] = newList;
116
+ this.selectList = newList;
117
+ }
118
+ handleInput(keyData) {
119
+ const kb = getKeybindings();
120
+ if (kb.matches(keyData, "app.thinking.save") && this.onSelectAsDefault) {
121
+ const item = this.selectList.getSelectedItem();
122
+ if (item)
123
+ this.onSelectAsDefault(item.value);
124
+ return;
125
+ }
126
+ const isNav = kb.matches(keyData, "tui.select.up") ||
127
+ kb.matches(keyData, "tui.select.down") ||
128
+ kb.matches(keyData, "tui.select.confirm") ||
129
+ kb.matches(keyData, "tui.select.cancel");
130
+ if (isNav) {
131
+ this.selectList.handleInput(keyData);
132
+ return;
133
+ }
134
+ this.searchInput.handleInput(keyData);
135
+ this.applyFilter(this.searchInput.getValue());
136
+ }
137
+ getSelectList() {
138
+ return this.selectList;
139
+ }
140
+ }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
3
3
  * packages/coding-agent/src/modes/interactive/components/tool-execution.ts.
4
4
  * Modifications: Retain pinned shell and actual public tool-definition renderers. Replace private
5
5
  * index-keyed image conversion with current-source ownership, serial conversion, visible fallback, and
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
3
3
  * packages/coding-agent/src/modes/interactive/components/tree-selector.ts.
4
4
  * Modifications: Source-synchronized tree selector port: preserve filtering, folding, labels, copying,
5
5
  * tree navigation, key hints, focus, and viewport behavior while remapping public types/components
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
3
3
  * packages/coding-agent/src/modes/interactive/components/tree-selector.ts.
4
4
  * Modifications: Source-synchronized tree selector port: preserve filtering, folding, labels, copying,
5
5
  * tree navigation, key hints, focus, and viewport behavior while remapping public types/components
@@ -282,6 +282,7 @@ class TreeList {
282
282
  let passesFilter = true;
283
283
  // Entry types hidden in default view (settings/bookkeeping)
284
284
  const isSettingsEntry = entry.type === "label" ||
285
+ entry.type === "context_edit" ||
285
286
  entry.type === "custom" ||
286
287
  entry.type === "model_change" ||
287
288
  entry.type === "thinking_level_change" ||
@@ -507,6 +508,9 @@ class TreeList {
507
508
  case "custom":
508
509
  parts.push("custom", entry.customType);
509
510
  break;
511
+ case "context_edit":
512
+ parts.push("context edit", entry.replacement === null ? "omit" : "replace", entry.targetId);
513
+ break;
510
514
  case "label":
511
515
  parts.push("label", entry.label ?? "");
512
516
  break;
@@ -718,6 +722,9 @@ class TreeList {
718
722
  case "custom":
719
723
  result = theme.fg("dim", `[custom: ${entry.customType}]`);
720
724
  break;
725
+ case "context_edit":
726
+ result = theme.fg("dim", `[context ${entry.replacement === null ? "omit" : "replace"}: ${entry.targetId}]`);
727
+ break;
721
728
  case "label":
722
729
  result = theme.fg("dim", `[label: ${entry.label ?? "(cleared)"}]`);
723
730
  break;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
3
3
  * packages/coding-agent/src/modes/interactive/components/trust-selector.ts.
4
4
  * Modifications: Mechanical source-synchronized trust selector port with injected public
5
5
  * ProjectTrustStore-derived options and remapped owned theme imports.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-coding-agent 0.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-coding-agent 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
3
3
  * packages/coding-agent/src/modes/interactive/external-editor.ts.
4
4
  * Modifications: Mechanical port: retain temporary prompt file, asynchronous inherited-stdio editor
5
5
  * process, completion readback, and best-effort cleanup behind the owned extension-editor component.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-tui 0.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-tui 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
3
3
  * packages/tui/src/components/editor.ts.
4
4
  * Modifications: Owned editor core or minimal editor-local helper subset; public imports, strict
5
5
  * types, typed persistent-history hooks, and semantic border state with the user-approved numeric-only
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-tui 0.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-tui 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
3
3
  * packages/tui/src/components/editor.ts.
4
4
  * Modifications: Owned editor core or minimal editor-local helper subset; public imports, strict
5
5
  * types, typed persistent-history hooks, and semantic border state with the user-approved numeric-only
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-tui 0.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-tui 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
3
3
  * packages/tui/src/kill-ring.ts.
4
4
  * Modifications: Owned editor core or minimal editor-local helper subset; public imports, strict
5
5
  * types, typed persistent-history hooks, and semantic border state. Public terminal runtime/exports
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-tui 0.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-tui 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
3
3
  * packages/tui/src/kill-ring.ts.
4
4
  * Modifications: Owned editor core or minimal editor-local helper subset; public imports, strict
5
5
  * types, typed persistent-history hooks, and semantic border state. Public terminal runtime/exports
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-tui 0.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-tui 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
3
3
  * packages/tui/src/keys.ts.
4
4
  * Modifications: Owned editor core or minimal editor-local helper subset; public imports, strict
5
5
  * types, typed persistent-history hooks, and semantic border state. Public terminal runtime/exports
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-tui 0.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-tui 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
3
3
  * packages/tui/src/utils.ts.
4
4
  * Modifications: Owned editor core or minimal editor-local helper subset; public imports, strict
5
5
  * types, typed persistent-history hooks, and semantic border state. Public terminal runtime/exports
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-tui 0.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-tui 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
3
3
  * packages/tui/src/undo-stack.ts.
4
4
  * Modifications: Owned editor core or minimal editor-local helper subset; public imports, strict
5
5
  * types, typed persistent-history hooks, and semantic border state. Public terminal runtime/exports
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-tui 0.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-tui 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
3
3
  * packages/tui/src/undo-stack.ts.
4
4
  * Modifications: Owned editor core or minimal editor-local helper subset; public imports, strict
5
5
  * types, typed persistent-history hooks, and semantic border state. Public terminal runtime/exports
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Provenance: @earendil-works/pi-tui 0.86.0 (MIT), commit ecac0a9c4edad3dac5d9f8b40e0c7db7a56471fc,
2
+ * Provenance: @earendil-works/pi-tui 0.87.0 (MIT), commit 16787ad5b2dc748047f314ca1bfe7708f30f54f3,
3
3
  * packages/tui/src/word-navigation.ts.
4
4
  * Modifications: Owned editor core or minimal editor-local helper subset; public imports, strict
5
5
  * types, typed persistent-history hooks, and semantic border state. Public terminal runtime/exports