@timurproko/a1 0.1.8-dev.407 → 0.1.8-dev.436

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 (102) hide show
  1. package/bin/cli.js +14 -9
  2. package/bin/guardian.js +3 -3
  3. package/bin/module-identity.js +21 -3
  4. package/bin/pinned-pi-public.d.ts +3 -0
  5. package/bin/pinned-pi-public.js +74 -0
  6. package/bin/ui.js +17 -18
  7. package/bin/warmup.js +8 -10
  8. package/dist/composition/owned-ui.d.ts +5 -3
  9. package/dist/composition/owned-ui.js +17 -10
  10. package/dist/composition/settings-route-host.d.ts +4 -5
  11. package/dist/composition/settings-route-host.js +90 -55
  12. package/dist/features/launch/intent.d.ts +5 -3
  13. package/dist/features/launch/intent.js +2 -2
  14. package/dist/features/launch/profile-paths.js +1 -1
  15. package/dist/features/launch/runtime-selection.d.ts +1 -1
  16. package/dist/features/launch/runtime-selection.js +1 -1
  17. package/dist/features/owned-ui/run.d.ts +6 -0
  18. package/dist/features/owned-ui/run.js +34 -2
  19. package/dist/features/owned-ui/settings-app.d.ts +1 -3
  20. package/dist/features/owned-ui/settings-app.js +2 -2
  21. package/dist/features/owned-ui/settings-route.d.ts +2 -0
  22. package/dist/features/owned-ui/settings-route.js +2 -0
  23. package/dist/foundation/release/update.js +5 -3
  24. package/dist/foundation/startup/startup-descriptor.js +34 -0
  25. package/dist/foundation/startup/startup-runtime.d.ts +10 -0
  26. package/dist/foundation/startup/startup-runtime.js +11 -3
  27. package/dist/foundation/terminal-cleanup/fatal-exit.js +4 -2
  28. package/dist/integrations/pi/components/components.js +1 -1
  29. package/dist/integrations/pi/components/owned-editor-ux.d.ts +1 -1
  30. package/dist/integrations/pi/components/owned-editor-ux.js +6 -2
  31. package/dist/integrations/pi/components/shell-editor-autocomplete.js +2 -2
  32. package/dist/integrations/pi/components/shell-extension-ui.d.ts +1 -1
  33. package/dist/integrations/pi/components/shell-extension-ui.js +1 -1
  34. package/dist/integrations/pi/components/shell-footer-status.js +1 -1
  35. package/dist/integrations/pi/components/shell-presenters-info.js +1 -1
  36. package/dist/integrations/pi/components/shell-presenters-transcript.d.ts +2 -2
  37. package/dist/integrations/pi/components/shell-presenters-transcript.js +2 -2
  38. package/dist/integrations/pi/components/shell-selectors-dialogs.d.ts +1 -1
  39. package/dist/integrations/pi/components/shell-selectors-dialogs.js +1 -1
  40. package/dist/integrations/pi/components/shell-shared-facade.d.ts +1 -1
  41. package/dist/integrations/pi/components/submitted-prompt-adapter.d.ts +2 -0
  42. package/dist/integrations/pi/components/submitted-prompt-adapter.js +8 -2
  43. package/dist/integrations/pi/components/tool-image-presentation.d.ts +1 -1
  44. package/dist/integrations/pi/components/tool-image-presentation.js +1 -1
  45. package/dist/integrations/pi/components/upstream/adjacent/core/keybindings.js +1 -1
  46. package/dist/integrations/pi/components/upstream/components/earendil-announcement.js +1 -1
  47. package/dist/integrations/pi/components/upstream/components/extension-editor.js +1 -1
  48. package/dist/integrations/pi/components/upstream/components/first-time-setup.js +1 -1
  49. package/dist/integrations/pi/components/upstream/components/scoped-models-selector.js +1 -1
  50. package/dist/integrations/pi/components/upstream/components/session-selector.js +1 -1
  51. package/dist/integrations/pi/components/upstream/components/status-indicator.js +1 -1
  52. package/dist/integrations/pi/components/upstream/components/tool-execution.js +1 -1
  53. package/dist/integrations/pi/components/upstream/components/tree-selector.js +1 -1
  54. package/dist/integrations/pi/components/upstream/components/trust-selector.js +1 -1
  55. package/dist/integrations/pi/components/upstream/theme/theme.js +1 -1
  56. package/dist/integrations/pi/engine/adapter.d.ts +1 -1
  57. package/dist/integrations/pi/engine/adapter.js +1 -1
  58. package/dist/integrations/pi/engine/model-auth-integration.d.ts +1 -1
  59. package/dist/integrations/pi/engine/package-integration.js +1 -1
  60. package/dist/integrations/pi/engine/project-trust-preflight.js +1 -1
  61. package/dist/integrations/pi/engine/resource-extension-integration.d.ts +1 -1
  62. package/dist/integrations/pi/engine/runtime-integration.d.ts +1 -1
  63. package/dist/integrations/pi/engine/runtime-integration.js +2 -2
  64. package/dist/integrations/pi/engine/session-integration.d.ts +1 -1
  65. package/dist/integrations/pi/engine/session-selection.d.ts +1 -1
  66. package/dist/integrations/pi/engine/session-selection.js +1 -1
  67. package/dist/integrations/pi/engine/settings-integration.d.ts +1 -1
  68. package/dist/integrations/pi/engine/windows-filesystem-hygiene.d.ts +1 -1
  69. package/dist/integrations/pi/engine/windows-filesystem-hygiene.js +1 -1
  70. package/dist/integrations/pi/session-ui/clipboard-diagnostics.d.ts +1 -1
  71. package/dist/integrations/pi/session-ui/clipboard-diagnostics.js +1 -1
  72. package/dist/integrations/pi/session-ui/paste-executor.d.ts +1 -1
  73. package/dist/integrations/pi/session-ui/paste-executor.js +1 -1
  74. package/dist/integrations/pi/session-ui/paste-protocol.d.ts +1 -1
  75. package/dist/integrations/pi/session-ui/prompt-chips.d.ts +1 -1
  76. package/dist/integrations/pi/session-ui/prompt-chips.js +1 -1
  77. package/dist/integrations/pi/session-ui/response-copy-coordinator.d.ts +1 -1
  78. package/dist/integrations/pi/session-ui/response-copy-coordinator.js +1 -1
  79. package/dist/integrations/pi/session-ui/response-copy-transport.d.ts +1 -1
  80. package/dist/integrations/pi/session-ui/session-shell-root.d.ts +8 -6
  81. package/dist/integrations/pi/session-ui/session-shell-root.js +31 -10
  82. package/dist/integrations/pi/session-ui/session-shell.d.ts +6 -3
  83. package/dist/integrations/pi/session-ui/session-shell.js +54 -11
  84. package/dist/integrations/pi/session-ui/session-viewport-controller.d.ts +8 -3
  85. package/dist/integrations/pi/session-ui/session-viewport-controller.js +33 -5
  86. package/dist/integrations/pi/session-ui/system-clipboard.d.ts +1 -1
  87. package/dist/integrations/pi/session-ui/system-clipboard.js +7 -4
  88. package/dist/integrations/pi/startup-public.d.ts +2 -0
  89. package/dist/integrations/pi/startup-public.js +2128 -0
  90. package/dist/integrations/pi/startup-public.manifest.json +11696 -0
  91. package/dist/integrations/pi/tui-runtime/adapter.js +1 -1
  92. package/dist/native/darwin-arm64/manifest.json +1 -1
  93. package/dist/native/linux-x64/manifest.json +1 -1
  94. package/dist/native/win32-x64/manifest.json +2 -2
  95. package/dist/native/win32-x64/process-guardian.exe +0 -0
  96. package/dist/runtime-payload-inventory.json +4 -1
  97. package/docs/architecture/response-copy-delivery.md +3 -1
  98. package/docs/ci-release-runbook.md +20 -7
  99. package/docs/local-worktree-cleanup.md +30 -12
  100. package/docs/openspec-archive-automation.md +191 -73
  101. package/docs/validation.md +62 -0
  102. package/package.json +4 -2
@@ -1,8 +1,7 @@
1
1
  import type { AppHostServices, UiApp } from "../../ui/apps/index.js";
2
2
  import { ShortcutRegistry, type PaneInputResult, type PaneMouseEvent, type PaneRect } from "../../ui/components/index.js";
3
3
  import type { OwnedUiSettingsSession } from "../../ui/settings/index.js";
4
- export declare const SETTINGS_APP_ID = "settings";
5
- export declare const SETTINGS_ROUTE = "settings";
4
+ export { SETTINGS_APP_ID, SETTINGS_ROUTE } from "./settings-route.js";
6
5
  type Action = "move-up" | "move-down" | "block-up" | "block-down" | "first" | "last" | "page-up" | "page-down" | "previous-value" | "next-value" | "activate" | "open-filter" | "close" | "part-previous" | "part-next" | "part-change";
7
6
  export declare const SETTINGS_SHORTCUTS: ShortcutRegistry<Action>;
8
7
  /**
@@ -19,4 +18,3 @@ export declare class SettingsApp implements UiApp {
19
18
  onInput(data: string, host: AppHostServices): PaneInputResult;
20
19
  onMouse(event: PaneMouseEvent, _host: AppHostServices): PaneInputResult;
21
20
  }
22
- export {};
@@ -1,6 +1,6 @@
1
1
  import { GLOBAL_SCOPE, LineInput, PLAIN_THEME, ShortcutRegistry, assertNoShortcutConflicts, blockJumpTarget, dialogValueColumn, numericValues, RAIL_COLUMNS, renderDialogPanel, renderEmptyState, renderGroupHeader, renderInputRow, renderListRow, renderNote, renderStatusLine, dialogRowAt, menuRowAt, regionAt, renderValueMenu, withScrollbarRail, stepperEnds, steppedValue, valueColumnFor, valueMenuFrame, blockRowSpan, displayWidth, handleLineInputKey, humanizeLabel, humanizeTitle, indexOfKey, isThumbRow, layoutList, moveSelection, rowKey, scrollForSelection, scrollbarGeometry, scrollbarWheelRows, selectableIndexes, } from "../../ui/components/index.js";
2
- export const SETTINGS_APP_ID = "settings";
3
- export const SETTINGS_ROUTE = "settings";
2
+ import { SETTINGS_APP_ID, SETTINGS_ROUTE } from "./settings-route.js";
3
+ export { SETTINGS_APP_ID, SETTINGS_ROUTE } from "./settings-route.js";
4
4
  const SCOPE = SETTINGS_APP_ID;
5
5
  /** The panel a setting with parts opens: its own keys, its own hint. */
6
6
  const DIALOG_SCOPE = `${SETTINGS_APP_ID}-parts`;
@@ -0,0 +1,2 @@
1
+ export declare const SETTINGS_APP_ID = "settings";
2
+ export declare const SETTINGS_ROUTE = "settings";
@@ -0,0 +1,2 @@
1
+ export const SETTINGS_APP_ID = "settings";
2
+ export const SETTINGS_ROUTE = "settings";
@@ -190,11 +190,13 @@ const ACTIVATION_PROGRESS = {
190
190
  export function renderUpdateProgressBar(percent) {
191
191
  const bounded = Math.min(100, Math.max(0, Math.round(percent)));
192
192
  const filled = Math.round((bounded / 100) * PROGRESS_BAR_WIDTH);
193
- // Rationale: a gray line, a darker gray track, and one space before the percentage.
194
- // Explicit RGB keeps both grays neutral even when the terminal remaps its ANSI palette.
193
+ // Rationale: the completed run uses A1's scrollbar-aligned teal, followed by a
194
+ // darker gray track and one gray space before the percentage. Explicit RGB
195
+ // keeps each color stable even when the terminal remaps its ANSI palette.
196
+ const completed = "\u001b[38;2;138;190;183m";
195
197
  const gray = "\u001b[38;2;128;128;128m";
196
198
  const track = "\u001b[38;2;102;102;102m";
197
- return `${gray}${"━".repeat(filled)}${track}${"─".repeat(PROGRESS_BAR_WIDTH - filled)}${gray} ${bounded}%\u001b[39m`;
199
+ return `${completed}${"━".repeat(filled)}${track}${"─".repeat(PROGRESS_BAR_WIDTH - filled)}${gray} ${bounded}%\u001b[39m`;
198
200
  }
199
201
  function createUpdateProgress(output, enabled) {
200
202
  let visible = false;
@@ -0,0 +1,34 @@
1
+ export const STARTUP_DESCRIPTOR = Object.freeze({
2
+ "schema": "a1-startup-descriptor-v1",
3
+ "entries": [
4
+ "dist/features/launch/runtime-selection.js",
5
+ "dist/foundation/lifecycle/session-selection.js",
6
+ "dist/features/owned-ui/project-trust-prompt.js",
7
+ "dist/features/owned-ui/session-fork-prompt.js",
8
+ "dist/features/owned-ui/run.js",
9
+ "dist/composition/owned-ui.js"
10
+ ],
11
+ "generatedArtifact": {
12
+ "path": "dist/integrations/pi/startup-public.js",
13
+ "sha256": "bb67e0c4d0448ee596fc34a13c834416ec865c79a3d47c9d949d56e44be2ad57"
14
+ },
15
+ "dependencyLayerIdentity": {
16
+ "source": "A1_RELEASE_LAYERS",
17
+ "encoding": "ordered-comma-separated-layer-ids-v1"
18
+ },
19
+ "compileCacheNamespace": {
20
+ "strategy": "node-abi-version-and-ordered-layer-sha256-v1"
21
+ },
22
+ "identity": "fb00d3c36b3bcb0aa2f5402fa06ac758cac7585961cc483118f430e617632a48"
23
+ });
24
+
25
+ export function loadDeclaredStartupGraph() {
26
+ return Promise.all([
27
+ import("../../features/launch/runtime-selection.js"),
28
+ import("../../foundation/lifecycle/session-selection.js"),
29
+ import("../../features/owned-ui/project-trust-prompt.js"),
30
+ import("../../features/owned-ui/session-fork-prompt.js"),
31
+ import("../../features/owned-ui/run.js"),
32
+ import("../../composition/owned-ui.js"),
33
+ ]);
34
+ }
@@ -4,6 +4,15 @@ export interface StartupPerformanceEvidence {
4
4
  readonly profileId: "a1" | "pi";
5
5
  readonly launchKind: "post-update" | "no-live-supervisor" | "warm";
6
6
  readonly events: readonly StartupTraceEvent[];
7
+ readonly moduleGraph?: {
8
+ readonly loadedFiles: number;
9
+ readonly evaluatedBytes: number;
10
+ readonly groups: readonly {
11
+ readonly group: string;
12
+ readonly files: number;
13
+ readonly evaluatedBytes: number;
14
+ }[];
15
+ };
7
16
  }
8
17
  export interface StartupTraceEvent {
9
18
  readonly schema: typeof PRODUCT_IDENTITY.evidence.startupTraceSchema;
@@ -31,6 +40,7 @@ export declare function startupCompileCachePath(dataDir: string, releaseId: stri
31
40
  export declare function collectCompileCaches(dataDir: string, protectedPaths: readonly string[], keepRecent?: number): Promise<void>;
32
41
  export declare function assertStartupPerformanceBudget(evidence: StartupPerformanceEvidence, budgets?: {
33
42
  readonly postUpdateMs: number;
43
+ readonly noSupervisorMs: number;
34
44
  readonly warmMs: number;
35
45
  }): void;
36
46
  export declare function parseStartupTrace(source: string): readonly StartupTraceEvent[];
@@ -97,19 +97,27 @@ export async function collectCompileCaches(dataDir, protectedPaths, keepRecent =
97
97
  await rm(candidate.path, { recursive: true, force: true });
98
98
  }
99
99
  }
100
- export function assertStartupPerformanceBudget(evidence, budgets = { postUpdateMs: 5_000, warmMs: 3_000 }) {
100
+ export function assertStartupPerformanceBudget(evidence, budgets = {
101
+ postUpdateMs: 2_000,
102
+ noSupervisorMs: 2_500,
103
+ warmMs: 2_000,
104
+ }) {
101
105
  const events = [...evidence.events].sort((left, right) => left.elapsedMs - right.elapsedMs);
102
106
  const ready = events.findLast(event => event.phase === "first-input-ready-render");
103
107
  if (!ready)
104
108
  throw new Error(`startup budget failed for ${evidence.profileId}: first input-ready render was not recorded`);
105
- const budget = evidence.launchKind === "warm" ? budgets.warmMs : budgets.postUpdateMs;
109
+ const budget = evidence.launchKind === "warm"
110
+ ? budgets.warmMs
111
+ : evidence.launchKind === "no-live-supervisor" ? budgets.noSupervisorMs : budgets.postUpdateMs;
106
112
  if (ready.elapsedMs <= budget)
107
113
  return;
108
114
  const intervals = events.map((event, index) => ({
109
115
  phase: event.phase,
110
116
  durationMs: event.elapsedMs - (events[index - 1]?.elapsedMs ?? 0),
111
117
  })).sort((left, right) => right.durationMs - left.durationMs);
112
- throw new Error(`startup budget failed for ${evidence.profileId} ${evidence.launchKind}: ${Math.round(ready.elapsedMs)}ms exceeds ${budget}ms; dominant phases: ${intervals.slice(0, 3).map(item => `${item.phase} ${Math.round(item.durationMs)}ms`).join(", ")}`);
118
+ const graph = evidence.moduleGraph === undefined ? ""
119
+ : `; module graph: ${evidence.moduleGraph.loadedFiles} files, ${evidence.moduleGraph.evaluatedBytes} evaluated bytes (${evidence.moduleGraph.groups.map(group => `${group.group} ${group.files}/${group.evaluatedBytes}`).join(", ")})`;
120
+ throw new Error(`startup budget failed for ${evidence.profileId} ${evidence.launchKind}: ${Math.round(ready.elapsedMs)}ms exceeds ${budget}ms; dominant phases: ${intervals.slice(0, 3).map(item => `${item.phase} ${Math.round(item.durationMs)}ms`).join(", ")}${graph}`);
113
121
  }
114
122
  export function parseStartupTrace(source) {
115
123
  const events = source.split(/\r?\n/).filter(Boolean).map(line => JSON.parse(line));
@@ -68,10 +68,12 @@ export function installFatalExit(options) {
68
68
  catch { }
69
69
  process.exit(1);
70
70
  };
71
- const deadline = setTimeout(finish, options.timeoutMs ?? 1000);
71
+ const cleanupTimeoutMs = options.timeoutMs ?? 1000;
72
+ // Rationale: a short cleanup budget must not terminate the process while its bounded diagnostic write is still in flight.
73
+ const deadline = setTimeout(finish, Math.max(1000, cleanupTimeoutMs));
72
74
  void Promise.all([
73
75
  writeFatalDiagnostic(options.directory, origin, error, options.releaseId).then(path => { record = path; }),
74
- boundedCleanup(() => options.dispose?.(), options.timeoutMs ?? 1000).catch(() => undefined),
76
+ boundedCleanup(() => options.dispose?.(), cleanupTimeoutMs).catch(() => undefined),
75
77
  ]).then(() => { clearTimeout(deadline); finish(); }, finish);
76
78
  };
77
79
  const exception = (error) => terminate("uncaughtException", error);
@@ -1,4 +1,4 @@
1
- import { AssistantMessageComponent, ToolExecutionComponent, UserMessageComponent, } from "@earendil-works/pi-coding-agent";
1
+ import { AssistantMessageComponent, ToolExecutionComponent, UserMessageComponent, } from "../startup-public.js";
2
2
  import { createTuiFacade, validatedAssistantMessage } from "./shell-components.js";
3
3
  import { ensurePiTheme } from "./theme.js";
4
4
  export function adaptPiUserMessage(block, width) {
@@ -50,7 +50,7 @@ export interface PromptSelectionUxOptions {
50
50
  readonly beginTextPaste?: (text: string) => PiShellPasteReservation;
51
51
  readonly deferTextPaste?: (text: string) => boolean;
52
52
  readonly onPasteRejected?: (error: unknown) => void;
53
- readonly onPasteInput?: (bytes: number) => void;
53
+ readonly onPasteInput?: (bytes: number, phase: "framing" | "inserting" | "settled") => void;
54
54
  readonly transformPastedContent: (content: PiShellClipboardContent) => string;
55
55
  readonly atomicRanges: (line: string) => readonly PiShellEditorTextRange[];
56
56
  readonly hiddenRanges?: (line: string) => readonly PiShellEditorTextRange[];
@@ -485,21 +485,24 @@ class PromptSelectionInterceptor {
485
485
  append(fragment.slice(0, end));
486
486
  const remaining = fragment.slice(end + 6);
487
487
  this.#terminalPaste = undefined;
488
- this.options.onPasteInput?.(pending.bytes);
489
488
  if (pending.oversized) {
489
+ this.options.onPasteInput?.(pending.bytes, "framing");
490
490
  this.options.onPasteRejected?.(new ImageAttachmentError("paste-size"));
491
491
  if (remaining.length > 0)
492
492
  this.handleInput(remaining, (replacement = remaining) => next(replacement));
493
493
  return true;
494
494
  }
495
495
  const text = pending.parts.join("") + pending.piece;
496
+ const deferred = text.length > 0 && this.options.beginTextPaste !== undefined && (this.options.deferTextPaste?.(text) ?? true);
497
+ this.options.onPasteInput?.(pending.bytes, "framing");
496
498
  if (text.length > 0)
497
499
  this.#redoStack = [];
498
500
  if (text.length === 0)
499
501
  this.pasteClipboard();
500
- else if (this.options.beginTextPaste !== undefined && (this.options.deferTextPaste?.(text) ?? true))
502
+ else if (deferred)
501
503
  this.#pasteFromClipboard(text);
502
504
  else {
505
+ this.options.onPasteInput?.(pending.bytes, "inserting");
503
506
  const transformed = this.options.transformPastedContent({ kind: "text", text });
504
507
  if (transformed === text && this.#orderedSelection() === undefined)
505
508
  next(`\x1b[200~${text}\x1b[201~`);
@@ -511,6 +514,7 @@ class PromptSelectionInterceptor {
511
514
  this.#redoStack = [];
512
515
  this.#requestRender();
513
516
  }
517
+ this.options.onPasteInput?.(pending.bytes, "settled");
514
518
  }
515
519
  if (remaining.length > 0)
516
520
  this.handleInput(remaining, (replacement = remaining) => next(replacement));
@@ -1,4 +1,4 @@
1
- import { getSelectListTheme } from "@earendil-works/pi-coding-agent";
1
+ import { getSelectListTheme } from "../startup-public.js";
2
2
  import { CombinedAutocompleteProvider, matchesKey, setKeybindings, visibleWidth, } from "#pi-tui";
3
3
  import { PROMPT_HISTORY_EDITOR_REPLACEMENT } from "../../../contracts/owned-ui/index.js";
4
4
  import { KeybindingsManager } from "./upstream/adjacent/core/keybindings.js";
@@ -28,7 +28,7 @@ export const PINNED_PI_BUILTIN_SLASH_COMMANDS = [
28
28
  { name: "compact", description: "Manually compact the session context" },
29
29
  { name: "resume", description: "Resume a different session" },
30
30
  { name: "reload", description: "Reload keybindings, extensions, skills, prompts, themes, and context files" },
31
- { name: "quit", description: "Quit pi" },
31
+ { name: "quit", description: "Quit" },
32
32
  ];
33
33
  export function createPiShellEditor(options) {
34
34
  ensureTheme();
@@ -1,4 +1,4 @@
1
- import { type ExtensionUIContext } from "@earendil-works/pi-coding-agent";
1
+ import { type ExtensionUIContext } from "../startup-public.js";
2
2
  import type { OwnedUiExtensionOverlayHandle, OwnedUiExtensionOverlayOptions } from "../../../contracts/owned-ui/index.js";
3
3
  import { type PiShellComponentPort, type PiShellEditorOptions } from "./shell-shared-facade.js";
4
4
  export interface PiExtensionUiBridgeHost {
@@ -1,4 +1,4 @@
1
- import { ExtensionInputComponent, ExtensionSelectorComponent, getSelectListTheme, } from "@earendil-works/pi-coding-agent";
1
+ import { ExtensionInputComponent, ExtensionSelectorComponent, getSelectListTheme, } from "../startup-public.js";
2
2
  import { ExtensionEditorComponent, } from "./upstream/components/extension-editor.js";
3
3
  import { setKeybindings, Text, } from "#pi-tui";
4
4
  import { KeybindingsManager, } from "./upstream/adjacent/core/keybindings.js";
@@ -1,4 +1,4 @@
1
- import { rawKeyHint, VERSION } from "@earendil-works/pi-coding-agent";
1
+ import { rawKeyHint, VERSION } from "../startup-public.js";
2
2
  import { Spacer, Text, } from "#pi-tui";
3
3
  import { SessionFooter } from "./upstream/components/session-footer.js";
4
4
  import { KeybindingsManager } from "./upstream/adjacent/core/keybindings.js";
@@ -1,4 +1,4 @@
1
- import { DynamicBorder, getMarkdownTheme } from "@earendil-works/pi-coding-agent";
1
+ import { DynamicBorder, getMarkdownTheme } from "../startup-public.js";
2
2
  import { Container, Markdown, Spacer, Text } from "#pi-tui";
3
3
  import { KeybindingsManager } from "./upstream/adjacent/core/keybindings.js";
4
4
  import { PINNED_PI_LAYOUT, piTheme } from "./theme.js";
@@ -1,8 +1,8 @@
1
- import { AssistantMessageComponent } from "@earendil-works/pi-coding-agent";
1
+ import { AssistantMessageComponent } from "../startup-public.js";
2
2
  import { type MermaidRenderingMode } from "./upstream/components/mermaid.js";
3
3
  import type { OwnedUiTranscriptBlock } from "../../../contracts/owned-ui/index.js";
4
4
  import { type PiShellSubmittedPromptComposer } from "./submitted-prompt-adapter.js";
5
- export { isPiPromptStyleCompaction, type PiShellSubmittedPromptComposer } from "./submitted-prompt-adapter.js";
5
+ export { isPiPromptStyleCompaction, paintPiSubmittedPromptTimestamp, type PiShellSubmittedPromptComposer } from "./submitted-prompt-adapter.js";
6
6
  import { type PiShellExtensionRendererResolver, type PiShellImageAssetResolver, type PiShellTranscriptComponentPort } from "./shell-shared-facade.js";
7
7
  export declare function createPiShellTranscriptComponent(initial: OwnedUiTranscriptBlock, cwd: string, extensions?: PiShellExtensionRendererResolver, submittedPrompt?: PiShellSubmittedPromptComposer, initialOutputPad?: 0 | 1, initialHideThinkingBlock?: boolean, initialMermaidRenderingMode?: MermaidRenderingMode, initialShowImages?: boolean, initialImageWidthCells?: number, imageAssets?: PiShellImageAssetResolver, presentation?: {
8
8
  readonly getColumns: () => number;
@@ -1,4 +1,4 @@
1
- import { AssistantMessageComponent, BashExecutionComponent, CompactionSummaryMessageComponent, CustomMessageComponent, DynamicBorder, getMarkdownTheme, parseSkillBlock, UserMessageComponent, } from "@earendil-works/pi-coding-agent";
1
+ import { AssistantMessageComponent, BashExecutionComponent, CompactionSummaryMessageComponent, CustomMessageComponent, DynamicBorder, getMarkdownTheme, parseSkillBlock, UserMessageComponent, } from "../startup-public.js";
2
2
  import { ToolExecutionComponent } from "./upstream/components/tool-execution.js";
3
3
  import { SkillInvocationMessageComponent } from "./upstream/components/skill-invocation-message.js";
4
4
  import { piToolArguments as toolArguments, updatePiToolResult as updateToolResult } from "./tool-result-adapter.js";
@@ -7,7 +7,7 @@ import { createMermaidMarkdownTransformer } from "./upstream/components/mermaid.
7
7
  import { Container, Image, Spacer, Text, } from "#pi-tui";
8
8
  import { PRODUCT_TEXT } from "../../../product-identity.js";
9
9
  import { createPiSubmittedPromptComponent, isPiPromptStyleCompaction, } from "./submitted-prompt-adapter.js";
10
- export { isPiPromptStyleCompaction } from "./submitted-prompt-adapter.js";
10
+ export { isPiPromptStyleCompaction, paintPiSubmittedPromptTimestamp } from "./submitted-prompt-adapter.js";
11
11
  import { PINNED_PI_LAYOUT, piTheme, } from "./theme.js";
12
12
  import { componentPort, createTuiFacade, ensureTheme, isRecord, } from "./shell-shared-facade.js";
13
13
  export function createPiShellTranscriptComponent(initial, cwd, extensions, submittedPrompt, initialOutputPad = PINNED_PI_LAYOUT.outputPad, initialHideThinkingBlock = false, initialMermaidRenderingMode = "off", initialShowImages = true, initialImageWidthCells = 80, imageAssets, presentation) {
@@ -1,4 +1,4 @@
1
- import { ModelSelectorComponent, type SessionInfo, type SettingsCallbacks, type SettingsConfig } from "@earendil-works/pi-coding-agent";
1
+ import { ModelSelectorComponent, type SessionInfo, type SettingsCallbacks, type SettingsConfig } from "../startup-public.js";
2
2
  import type { OwnedUiDialog } from "../../../contracts/owned-ui/index.js";
3
3
  import { type TrustDecision, type TrustOption, type TrustUpdate } from "./upstream/components/trust-selector.js";
4
4
  import { type PiShellComponentPort, type PiShellEditorOptions, type PiShellSelectorOption, type PiShellSelectorOptions } from "./shell-shared-facade.js";
@@ -1,4 +1,4 @@
1
- import { ArminComponent, BorderedLoader, DynamicBorder, ExtensionSelectorComponent, getSelectListTheme, LoginDialogComponent, ModelSelectorComponent, OAuthSelectorComponent, SettingsSelectorComponent, ShowImagesSelectorComponent, ThemeSelectorComponent, ThinkingSelectorComponent, UserMessageSelectorComponent, } from "@earendil-works/pi-coding-agent";
1
+ import { ArminComponent, BorderedLoader, DynamicBorder, ExtensionSelectorComponent, getSelectListTheme, LoginDialogComponent, ModelSelectorComponent, OAuthSelectorComponent, SettingsSelectorComponent, ShowImagesSelectorComponent, ThemeSelectorComponent, ThinkingSelectorComponent, UserMessageSelectorComponent, } from "../startup-public.js";
2
2
  import { DaxnutsComponent, } from "./upstream/components/daxnuts.js";
3
3
  import { EarendilAnnouncementComponent, } from "./upstream/components/earendil-announcement.js";
4
4
  import { SessionSelectorComponent, } from "./upstream/components/session-selector.js";
@@ -173,7 +173,7 @@ export interface PiShellEditorOptions {
173
173
  readonly beginTextPaste?: (text: string) => PiShellPasteReservation;
174
174
  readonly deferTextPaste?: (text: string) => boolean;
175
175
  readonly onPasteRejected?: (error: unknown) => void;
176
- readonly onPasteInput?: (bytes: number) => void;
176
+ readonly onPasteInput?: (bytes: number, phase: "framing" | "inserting" | "settled") => void;
177
177
  readonly editorHiddenRanges?: (line: string) => readonly PiShellEditorTextRange[];
178
178
  readonly transformPastedContent?: (content: PiShellClipboardContent) => string;
179
179
  readonly editorAtomicRanges?: (line: string) => readonly PiShellEditorTextRange[];
@@ -11,5 +11,7 @@ export interface PiShellSubmittedPromptComposer {
11
11
  }
12
12
  /** Branch summaries share the block kind but do not participate in prompt navigation. */
13
13
  export declare function isPiPromptStyleCompaction(block: OwnedUiTranscriptBlock): boolean;
14
+ /** Keep prompt timestamps metadata-grey even inside hover and quiet whole-row wrappers. */
15
+ export declare function paintPiSubmittedPromptTimestamp(text: string): string;
14
16
  /** Pi owns Markdown and theme adaptation; the injected composer owns neutral row geometry. */
15
17
  export declare function createPiSubmittedPromptComponent(block: OwnedUiTranscriptBlock, composer: PiShellSubmittedPromptComposer, heading?: string): Component;
@@ -1,4 +1,4 @@
1
- import { getMarkdownTheme } from "@earendil-works/pi-coding-agent";
1
+ import { getMarkdownTheme } from "../startup-public.js";
2
2
  import { Box, Markdown, Text } from "#pi-tui";
3
3
  import { piTheme } from "./theme.js";
4
4
  /** Branch summaries share the block kind but do not participate in prompt navigation. */
@@ -7,6 +7,12 @@ export function isPiPromptStyleCompaction(block) {
7
7
  && typeof block.payload === "object" && block.payload !== null
8
8
  && block.payload.role === "compactionSummary";
9
9
  }
10
+ /** Keep prompt timestamps metadata-grey even inside hover and quiet whole-row wrappers. */
11
+ export function paintPiSubmittedPromptTimestamp(text) {
12
+ // Protocol: combine the intensity/foreground reset so quietSticky does not immediately
13
+ // reapply faint; the semantic foreground that follows remains theme-controlled.
14
+ return `\u001b[22;39m${piTheme().fg("dim", text)}`;
15
+ }
10
16
  /** Pi owns Markdown and theme adaptation; the injected composer owns neutral row geometry. */
11
17
  export function createPiSubmittedPromptComponent(block, composer, heading) {
12
18
  const timestamp = numericTimestamp(block);
@@ -23,7 +29,7 @@ export function createPiSubmittedPromptComponent(block, composer, heading) {
23
29
  ];
24
30
  return [...composer.compose(rows, width, timestamp, {
25
31
  prefix: text => piTheme().fg("muted", text),
26
- timestamp: text => piTheme().fg("dim", text),
32
+ timestamp: paintPiSubmittedPromptTimestamp,
27
33
  })];
28
34
  },
29
35
  invalidate() {
@@ -1,4 +1,4 @@
1
- import { convertToPng } from "@earendil-works/pi-coding-agent";
1
+ import { convertToPng } from "../startup-public.js";
2
2
  import { type Component } from "#pi-tui";
3
3
  /**
4
4
  * Own only current attachment presentation; tool renderers still receive original result content.
@@ -1,4 +1,4 @@
1
- import { convertToPng } from "@earendil-works/pi-coding-agent";
1
+ import { convertToPng } from "../startup-public.js";
2
2
  import { getCapabilities, Image, Text } from "#pi-tui";
3
3
  import { piTheme } from "./theme.js";
4
4
  const MAX_BYTES = 20 * 1024 * 1024;
@@ -2,7 +2,7 @@
2
2
  import { TUI_KEYBINDINGS, KeybindingsManager as TuiKeybindingsManager, } from "#pi-tui";
3
3
  import { existsSync, readFileSync } from "node:fs";
4
4
  import { join } from "node:path";
5
- import { getAgentDir } from "@earendil-works/pi-coding-agent";
5
+ import { getAgentDir } from "../../../../startup-public.js";
6
6
  export const KEYBINDINGS = {
7
7
  ...TUI_KEYBINDINGS,
8
8
  "app.interrupt": { defaultKeys: "escape", description: "Cancel or abort" },
@@ -3,7 +3,7 @@
3
3
  // Local modifications: remap private imports to public package-root/owned theme boundaries; load the verified owned copy of the image lazily.
4
4
  import { readFileSync } from "node:fs";
5
5
  import { Container, Image, Spacer, Text } from "#pi-tui";
6
- import { DynamicBorder } from "@earendil-works/pi-coding-agent";
6
+ import { DynamicBorder } from "../../../startup-public.js";
7
7
  import { piTheme } from "../theme/theme.js";
8
8
  const BLOG_URL = "https://mariozechner.at/posts/2026-04-08-ive-sold-out/";
9
9
  const IMAGE_FILENAME = "clankolas.png";
@@ -4,7 +4,7 @@
4
4
  * Modifications: root public pi-tui singleton, owned keybindings/theme seam, owned external-editor import.
5
5
  */
6
6
  import { Container, Editor, Spacer, Text, } from "#pi-tui";
7
- import { DynamicBorder, getSelectListTheme } from "@earendil-works/pi-coding-agent";
7
+ import { DynamicBorder, getSelectListTheme } from "../../../startup-public.js";
8
8
  import { editInExternalEditor } from "../external-editor.js";
9
9
  import { piTheme } from "../../theme.js";
10
10
  function keyHint(keybindings, keybinding, description) {
@@ -2,7 +2,7 @@
2
2
  // packages/coding-agent/src/modes/interactive/components/first-time-setup.ts (MIT).
3
3
  // Local modifications: remap private imports to public package-root or owned theme boundaries.
4
4
  import { Container, getKeybindings, Spacer, Text } from "#pi-tui";
5
- import { DynamicBorder, keyHint, rawKeyHint } from "@earendil-works/pi-coding-agent";
5
+ import { DynamicBorder, keyHint, rawKeyHint } from "../../../startup-public.js";
6
6
  import { piTheme } from "../theme/theme.js";
7
7
  const APP_NAME = "pi";
8
8
  const THEME_OPTIONS = [
@@ -1,5 +1,5 @@
1
1
  import { Container, fuzzyFilter, getKeybindings, Input, Key, matchesKey, Spacer, Text, } from "#pi-tui";
2
- import { DynamicBorder } from "@earendil-works/pi-coding-agent";
2
+ import { DynamicBorder } from "../../../startup-public.js";
3
3
  import { getModelSearchText } from "../model-search.js";
4
4
  import { piTheme } from "../theme/theme.js";
5
5
  function keyText(keybinding) {
@@ -9,7 +9,7 @@ import { unlink } from "node:fs/promises";
9
9
  import * as os from "node:os";
10
10
  import { Container, getKeybindings, Input, Spacer, Text, truncateToWidth, visibleWidth, } from "#pi-tui";
11
11
  import { KeybindingsManager } from "../adjacent/core/keybindings.js";
12
- import { DynamicBorder } from "@earendil-works/pi-coding-agent";
12
+ import { DynamicBorder } from "../../../startup-public.js";
13
13
  import { piTheme } from "../theme/theme.js";
14
14
  const theme = new Proxy({}, {
15
15
  get(_target, property) {
@@ -3,7 +3,7 @@
3
3
  * packages/coding-agent/src/modes/interactive/components/status-indicator.ts
4
4
  */
5
5
  import { Loader } from "#pi-tui";
6
- import { keyText } from "@earendil-works/pi-coding-agent";
6
+ import { keyText } from "../../../startup-public.js";
7
7
  import { piTheme } from "../theme/theme.js";
8
8
  import { CountdownTimer } from "./countdown-timer.js";
9
9
  export class StatusIndicator extends Loader {
@@ -9,7 +9,7 @@
9
9
  */
10
10
  import { stripVTControlCharacters } from "node:util";
11
11
  import { Box, Container, getCapabilities, getImageDimensions, imageFallback, Spacer, Text } from "#pi-tui";
12
- import { createReadToolDefinition, createBashToolDefinition, createEditToolDefinition, createWriteToolDefinition, createGrepToolDefinition, createFindToolDefinition, createLsToolDefinition, keyHint, } from "@earendil-works/pi-coding-agent";
12
+ import { createReadToolDefinition, createBashToolDefinition, createEditToolDefinition, createWriteToolDefinition, createGrepToolDefinition, createFindToolDefinition, createLsToolDefinition, keyHint, } from "../../../startup-public.js";
13
13
  import { piTheme } from "../theme/theme.js";
14
14
  import { ToolImagePresentation } from "../../tool-image-presentation.js";
15
15
  const definitions = { read: createReadToolDefinition, bash: createBashToolDefinition, edit: createEditToolDefinition,
@@ -4,7 +4,7 @@
4
4
  * Mechanical changes: public component/type imports and owned keybindings/theme helpers.
5
5
  */
6
6
  import { Container, Input, Spacer, sliceByColumn, Text, truncateToWidth, visibleWidth, wrapTextWithAnsi, } from "#pi-tui";
7
- import { DynamicBorder } from "@earendil-works/pi-coding-agent";
7
+ import { DynamicBorder } from "../../../startup-public.js";
8
8
  import { KeybindingsManager } from "../adjacent/core/keybindings.js";
9
9
  import { piTheme } from "../theme/theme.js";
10
10
  const theme = new Proxy({}, {
@@ -1,7 +1,7 @@
1
1
  // Mechanically adapted from Pi commit 914cf14
2
2
  // packages/coding-agent/src/modes/interactive/components/trust-selector.ts (MIT).
3
3
  // Local modifications: inject trust options and remap theme/import boundaries.
4
- import { DynamicBorder, keyHint, rawKeyHint } from "@earendil-works/pi-coding-agent";
4
+ import { DynamicBorder, keyHint, rawKeyHint } from "../../../startup-public.js";
5
5
  import { Container, getKeybindings, Spacer, Text } from "#pi-tui";
6
6
  import { piTheme } from "../theme/theme.js";
7
7
  function formatDecision(trustPath, decision) {
@@ -1,6 +1,6 @@
1
1
  import { existsSync, readFileSync, readdirSync, watch } from "node:fs";
2
2
  import { join } from "node:path";
3
- import { getAgentDir, initTheme, Theme, } from "@earendil-works/pi-coding-agent";
3
+ import { getAgentDir, initTheme, Theme, } from "../../../startup-public.js";
4
4
  import { getCapabilities } from "#pi-tui";
5
5
  import { BUILTIN_THEME_RESOURCES, isBuiltinThemeName } from "../../resources/builtin-themes.js";
6
6
  export const PINNED_PI_LAYOUT = Object.freeze({
@@ -1,5 +1,5 @@
1
1
  import type { PiSessionForkPrompt, PiSessionSelection } from "./session-selection.js";
2
- import { type AgentSession, type AgentSessionRuntime, type AgentSessionServices, type SessionInfo } from "@earendil-works/pi-coding-agent";
2
+ import { type AgentSession, type AgentSessionRuntime, type AgentSessionServices, type SessionInfo } from "../startup-public.js";
3
3
  import { OWNED_UI_EXTENSION_CONTRACT_VERSION, OWNED_UI_EXTENSION_RENDER_CALLBACKS, OWNED_UI_EXTENSION_UI_CALLBACKS, OWNED_UI_EXTENSION_UI_PROPERTIES, type OwnedUiCommand, type OwnedUiCommandOutcome, type OwnedUiImageAttachment, type OwnedUiPromptSuggestionGeneratorPort, type OwnedUiPromptSuggestionReasoning, type OwnedUiPromptSuggestionRequest, type OwnedUiPromptSuggestionResult, type OwnedUiEvent, type OwnedUiSessionViewModel, type OwnedUiSnapshot } from "../../../contracts/owned-ui/index.js";
4
4
  import { type PiAuthenticationProviderOption, type PiBashWorkflowResult, type PiPinnedSettingsCallback, type PiPinnedSettingsSnapshot, type PiWorkflowAutocompleteCommand, type PiWorkflowHost, type PiWorkflowInteractionHost, type PiWorkflowOption, type PiWorkflowRequest, type PiWorkflowResult } from "./workflows.js";
5
5
  import { PiSettingsIntegration } from "./settings-integration.js";
@@ -9,7 +9,7 @@ import { configureOwnedHttpDispatcher } from "./http-dispatcher.js";
9
9
  import { readPinnedCommandChangelog } from "./changelog.js";
10
10
  import { toolRenderingInput } from "./tool-rendering.js";
11
11
  import { TranscriptImageAssets } from "./transcript-image-assets.js";
12
- import { copyToClipboard, CredentialSynchronizationError, DefaultPackageManager, getAgentDir, ProjectTrustStore, SessionManager, VERSION, } from "@earendil-works/pi-coding-agent";
12
+ import { copyToClipboard, CredentialSynchronizationError, DefaultPackageManager, getAgentDir, ProjectTrustStore, SessionManager, VERSION, } from "../startup-public.js";
13
13
  import { OWNED_UI_EXTENSION_CONTRACT_VERSION, OWNED_UI_EXTENSION_RENDER_CALLBACKS, OWNED_UI_EXTENSION_UI_CALLBACKS, OWNED_UI_EXTENSION_UI_PROPERTIES, CONTEXTUAL_PROMPT_SUGGESTION_INSTRUCTION, acceptsTranscriptUpdate, transcriptToolState, assertOwnedUiCommand, assertOwnedUiExtensionUiPort, assertOwnedUiPromptSuggestionRequest, assertOwnedUiPromptSuggestionResult, assertOwnedUiSnapshot, normalizePromptSuggestionCandidate, } from "../../../contracts/owned-ui/index.js";
14
14
  import { PINNED_PI_SETTINGS_CALLBACKS, PINNED_PI_WORKFLOW_COMMAND_NAMES, } from "./workflows.js";
15
15
  import { createPiRuntimeIntegration } from "./runtime-integration.js";
@@ -1,4 +1,4 @@
1
- import type { ModelRuntime } from "@earendil-works/pi-coding-agent";
1
+ import type { ModelRuntime } from "../startup-public.js";
2
2
  import type { AgentAuthenticationPort, AgentModelDescriptor, AgentModelPort } from "../../../contracts/agent-engine/index.js";
3
3
  export type PiDocumentedModelRuntime = Pick<ModelRuntime, "getAvailableSnapshot" | "getModel" | "getProvider" | "hasConfiguredAuth" | "refresh" | "logout">;
4
4
  export interface PiModelAuthenticationOptions {
@@ -1,5 +1,5 @@
1
1
  import { join } from "node:path";
2
- import { DefaultPackageManager, ModelRuntime, SettingsManager } from "@earendil-works/pi-coding-agent";
2
+ import { DefaultPackageManager, ModelRuntime, SettingsManager } from "../startup-public.js";
3
3
  import { agentPackageOutcome, } from "../../../contracts/agent-engine/index.js";
4
4
  const MODEL_REFRESH_TIMEOUT_MS = 15_000;
5
5
  /**
@@ -1,4 +1,4 @@
1
- import { hasTrustRequiringProjectResources, ProjectTrustStore, SettingsManager, } from "@earendil-works/pi-coding-agent";
1
+ import { hasTrustRequiringProjectResources, ProjectTrustStore, SettingsManager, } from "../startup-public.js";
2
2
  /**
3
3
  * Resolves trust from global state only. It never constructs a project-trusted
4
4
  * settings manager or resource loader; callers may do that only after this
@@ -1,4 +1,4 @@
1
- import type { AgentSession } from "@earendil-works/pi-coding-agent";
1
+ import type { AgentSession } from "../startup-public.js";
2
2
  import type { AgentExtensionBinding, AgentExtensionFailure, AgentExtensionPort, AgentResourceDescriptor, AgentResourcesPort, AgentSessionMetadata } from "../../../contracts/agent-engine/index.js";
3
3
  export interface PiResourceExtensionOptions {
4
4
  readonly session: AgentSession;
@@ -1,4 +1,4 @@
1
- import { createAgentSessionServices, SettingsManager, type AgentSession, type AgentSessionRuntime, type AgentSessionServices, type ScopedModel } from "@earendil-works/pi-coding-agent";
1
+ import { createAgentSessionServices, SettingsManager, type AgentSession, type AgentSessionRuntime, type AgentSessionServices, type ScopedModel } from "../startup-public.js";
2
2
  import { resolvePiProjectTrustPreflight, type PiProjectTrustPreflightPrompt } from "./project-trust-preflight.js";
3
3
  import { type PiSessionForkPrompt, type PiSessionSelection } from "./session-selection.js";
4
4
  export interface PiRuntimeIntegrationOptions {
@@ -1,7 +1,7 @@
1
- import { createAgentSessionFromServices, createAgentSessionRuntime, createAgentSessionServices, resolveModelScopeWithDiagnostics, SessionManager, SettingsManager, } from "@earendil-works/pi-coding-agent";
1
+ import { createAgentSessionFromServices, createAgentSessionRuntime, createAgentSessionServices, resolveModelScopeWithDiagnostics, SessionManager, SettingsManager, } from "../startup-public.js";
2
2
  import { resolvePiProjectTrustPreflight, } from "./project-trust-preflight.js";
3
3
  import { openSelectedPiSession, resolveSessionArgumentPath } from "./session-selection.js";
4
- import { markStartupPhase } from "../../../foundation/startup/index.js";
4
+ import { markStartupPhase } from "../../../foundation/startup/startup-runtime.js";
5
5
  import { createWindowsNulCleanupExtension } from "./windows-filesystem-hygiene.js";
6
6
  /**
7
7
  * Mirrors pinned Pi's CLI startup: resolve the `models` patterns from settings
@@ -1,4 +1,4 @@
1
- import type { AgentSession, AgentSessionEvent, PromptOptions } from "@earendil-works/pi-coding-agent";
1
+ import type { AgentSession, AgentSessionEvent, PromptOptions } from "../startup-public.js";
2
2
  import { type AgentCommandOutcome, type AgentEvent } from "../../../contracts/agent-engine/index.js";
3
3
  export interface PiDocumentedSessionCommands {
4
4
  readonly isStreaming: AgentSession["isStreaming"];
@@ -1,4 +1,4 @@
1
- import { SessionManager, type SessionInfo } from "@earendil-works/pi-coding-agent";
1
+ import { SessionManager, type SessionInfo } from "../startup-public.js";
2
2
  export interface PiSessionSelection {
3
3
  readonly target: string;
4
4
  readonly sessionDir?: string;
@@ -1,7 +1,7 @@
1
1
  import { accessSync, constants, existsSync, realpathSync, statSync } from "node:fs";
2
2
  import { homedir } from "node:os";
3
3
  import { resolve } from "node:path";
4
- import { SessionManager } from "@earendil-works/pi-coding-agent";
4
+ import { SessionManager } from "../startup-public.js";
5
5
  /** Expected resume outcomes are concise CLI diagnostics, not engine crashes. */
6
6
  export class PiSessionSelectionError extends Error {
7
7
  exitCode;
@@ -1,4 +1,4 @@
1
- import type { SettingsManager } from "@earendil-works/pi-coding-agent";
1
+ import type { SettingsManager } from "../startup-public.js";
2
2
  import type { AgentJsonValue, AgentSettingChangeOutcome, AgentSettingDescriptor, AgentSettingOwner, AgentSettingsPort } from "../../../contracts/agent-engine/index.js";
3
3
  import { type PiSettingOwnerHandlers } from "./settings-effects.js";
4
4
  /** Values only the running engine knows. */
@@ -1,4 +1,4 @@
1
- import { type InlineExtension } from "@earendil-works/pi-coding-agent";
1
+ import { type InlineExtension } from "../startup-public.js";
2
2
  interface FileMetadata {
3
3
  isFile(): boolean;
4
4
  isSymbolicLink(): boolean;