@oh-my-pi/pi-coding-agent 16.2.1 → 16.2.2

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 (59) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/cli.js +2648 -2662
  3. package/dist/types/advisor/runtime.d.ts +15 -1
  4. package/dist/types/config/model-roles.d.ts +1 -1
  5. package/dist/types/config/settings-schema.d.ts +32 -12
  6. package/dist/types/discovery/omp-extension-roots.d.ts +3 -3
  7. package/dist/types/edit/index.d.ts +18 -0
  8. package/dist/types/edit/streaming.d.ts +30 -0
  9. package/dist/types/extensibility/custom-tools/types.d.ts +1 -0
  10. package/dist/types/extensibility/shared-events.d.ts +1 -0
  11. package/dist/types/mcp/oauth-discovery.d.ts +0 -11
  12. package/dist/types/modes/components/status-line/component.d.ts +0 -2
  13. package/dist/types/sdk.d.ts +1 -1
  14. package/dist/types/session/agent-session.d.ts +26 -2
  15. package/dist/types/session/messages.d.ts +6 -7
  16. package/dist/types/session/settings-stream-fn.d.ts +21 -0
  17. package/dist/types/session/turn-persistence.d.ts +88 -0
  18. package/package.json +12 -12
  19. package/src/advisor/__tests__/advisor.test.ts +196 -0
  20. package/src/advisor/runtime.ts +65 -2
  21. package/src/auto-thinking/classifier.ts +2 -2
  22. package/src/config/model-resolver.ts +5 -1
  23. package/src/config/model-roles.ts +3 -3
  24. package/src/config/settings-schema.ts +30 -8
  25. package/src/discovery/omp-extension-roots.ts +38 -13
  26. package/src/edit/index.ts +21 -0
  27. package/src/edit/streaming.ts +170 -0
  28. package/src/extensibility/custom-tools/types.ts +1 -0
  29. package/src/extensibility/plugins/legacy-pi-bundled-keys.ts +18 -1
  30. package/src/extensibility/plugins/legacy-pi-bundled-registry.ts +59 -2
  31. package/src/extensibility/plugins/manager.ts +74 -4
  32. package/src/extensibility/shared-events.ts +1 -0
  33. package/src/internal-urls/docs-index.generated.txt +1 -1
  34. package/src/mcp/oauth-discovery.ts +5 -29
  35. package/src/mcp/transports/http.ts +3 -1
  36. package/src/mnemopi/backend.ts +2 -2
  37. package/src/modes/acp/acp-agent.ts +1 -1
  38. package/src/modes/components/assistant-message.ts +5 -5
  39. package/src/modes/components/status-line/component.ts +1 -9
  40. package/src/modes/components/status-line/segments.ts +1 -1
  41. package/src/modes/controllers/event-controller.ts +8 -11
  42. package/src/modes/interactive-mode.ts +0 -5
  43. package/src/modes/print-mode.ts +1 -1
  44. package/src/modes/utils/transcript-render-helpers.ts +2 -2
  45. package/src/modes/utils/ui-helpers.ts +5 -4
  46. package/src/sdk.ts +12 -26
  47. package/src/session/agent-session.ts +319 -219
  48. package/src/session/messages.ts +20 -12
  49. package/src/session/session-persistence.ts +1 -2
  50. package/src/session/settings-stream-fn.ts +49 -0
  51. package/src/session/turn-persistence.ts +142 -0
  52. package/src/session/unexpected-stop-classifier.ts +2 -2
  53. package/src/slash-commands/helpers/mcp.ts +2 -1
  54. package/src/tiny/models.ts +8 -6
  55. package/src/tiny/text.ts +14 -7
  56. package/src/tools/image-gen.ts +2 -1
  57. package/src/tools/tts.ts +2 -1
  58. package/src/utils/title-generator.ts +1 -1
  59. package/src/web/search/providers/tavily.ts +36 -19
@@ -52,6 +52,17 @@ export interface StreamingDiffContext {
52
52
  isStreaming?: boolean;
53
53
  }
54
54
 
55
+ /**
56
+ * Per-file projection of a streamed edit payload. Pairs one target file path
57
+ * with the digest of only the lines added to that file, so path-scoped stream
58
+ * matchers (TTSR) evaluate each file in isolation — a `tool:edit(*.ts)` rule
59
+ * never fires on text that actually belongs to a sibling `README.md` hunk.
60
+ */
61
+ export interface EditMatcherEntry {
62
+ readonly path: string;
63
+ readonly digest: string;
64
+ }
65
+
55
66
  export interface EditStreamingStrategy<Args = unknown> {
56
67
  /**
57
68
  * Return the args restricted to edits that are "complete enough" to
@@ -77,6 +88,26 @@ export interface EditStreamingStrategy<Args = unknown> {
77
88
  * args don't yet carry any content.
78
89
  */
79
90
  matcherDigest(args: Args): string | undefined;
91
+ /**
92
+ * Surface the target file paths a (potentially partial) call would touch,
93
+ * so path-scoped stream matchers (e.g. TTSR `tool:edit(*.ts)` globs) match
94
+ * even when the path is not a top-level argument but lives inside the wire
95
+ * payload — `hashline` section headers, `apply_patch` envelope markers.
96
+ * Returns `undefined` (or an empty list) when no paths are recoverable.
97
+ */
98
+ matcherPaths(args: Args): readonly string[] | undefined;
99
+ /**
100
+ * Per-file projection of the (potentially partial) args: one entry per
101
+ * touched file pairing the path with the digest of only the lines added to
102
+ * that file. Multi-file payloads (multi-section hashline / multi-hunk
103
+ * apply_patch) MUST split here so callers can evaluate each file under its
104
+ * own path scope instead of leaking added lines from one file into the
105
+ * other's match context. Same-path sections / hunks are merged into one
106
+ * entry. Returns `undefined` (or empty) when no per-file split is
107
+ * recoverable yet — the caller falls back to {@link matcherDigest} +
108
+ * {@link matcherPaths}.
109
+ */
110
+ matcherEntries(args: Args): readonly EditMatcherEntry[] | undefined;
80
111
  }
81
112
 
82
113
  // -----------------------------------------------------------------------------
@@ -191,6 +222,103 @@ function extractAddedLines(text: string, fallbackToWhole: boolean): string {
191
222
  return added;
192
223
  }
193
224
 
225
+ /**
226
+ * Extract hashline `[path#TAG]` (and untagged `[path]`) section-header paths
227
+ * from a (possibly partial) hashline buffer. Tolerant of streaming chunks
228
+ * where `Patch.parse` would still throw on the trailing op — only fully
229
+ * closed header lines are recognised.
230
+ */
231
+ function extractHashlineHeaderPaths(input: string): string[] {
232
+ const paths: string[] = [];
233
+ const re = /^\s*\[([^\]\r\n]+?)(?:#[0-9a-fA-F]{4})?\]\s*$/gm;
234
+ for (const match of input.matchAll(re)) {
235
+ const candidate = stripApplyPatchPathNoise(match[1]).trim();
236
+ if (candidate.length > 0) paths.push(candidate);
237
+ }
238
+ return paths;
239
+ }
240
+
241
+ /**
242
+ * Strip the `*** Add/Update/Delete File:` / `*** Move to:` noise that the
243
+ * model sometimes pastes into a hashline header (the hashline tokenizer does
244
+ * the same in its recovery path).
245
+ */
246
+ function stripApplyPatchPathNoise(value: string): string {
247
+ return value
248
+ .replace(/^\s*\*{3}\s*(?:Add|Update|Delete)\s+File\s*:\s*/i, "")
249
+ .replace(/^\s*\*{3}\s*Move\s+to\s*:\s*/i, "");
250
+ }
251
+
252
+ /** Extract `*** Add/Update/Delete File:` paths from a (possibly partial) apply_patch envelope. */
253
+ function extractApplyPatchEnvelopePaths(input: string): string[] {
254
+ const paths: string[] = [];
255
+ const re = /^\s*\*{3}\s+(?:Add|Update|Delete)\s+File\s*:\s*(\S.*?)\s*$/gm;
256
+ for (const match of input.matchAll(re)) {
257
+ const candidate = match[1].trim();
258
+ if (candidate.length > 0) paths.push(candidate);
259
+ }
260
+ return paths;
261
+ }
262
+
263
+ /**
264
+ * Split a (possibly partial) hashline buffer into one matcher entry per
265
+ * touched file: pair the section header path with the added lines from that
266
+ * section's body, merging sections that target the same file into one entry.
267
+ * Header-line regex (not `Patch.parse`) so a mid-typed trailing op still
268
+ * yields entries for completed sections.
269
+ */
270
+ function splitHashlinePerFile(input: string): EditMatcherEntry[] {
271
+ const headerRe = /^\s*\[([^\]\r\n]+?)(?:#[0-9a-fA-F]{4})?\]\s*$/gm;
272
+ const sections: { path: string; headerStart: number; bodyStart: number }[] = [];
273
+ let match: RegExpExecArray | null = headerRe.exec(input);
274
+ while (match !== null) {
275
+ const candidate = stripApplyPatchPathNoise(match[1]).trim();
276
+ if (candidate.length > 0) {
277
+ sections.push({ path: candidate, headerStart: match.index, bodyStart: headerRe.lastIndex });
278
+ }
279
+ match = headerRe.exec(input);
280
+ }
281
+ if (sections.length === 0) return [];
282
+
283
+ const byPath = new Map<string, string>();
284
+ for (let i = 0; i < sections.length; i++) {
285
+ const { path: sectionPath, bodyStart } = sections[i];
286
+ const bodyEnd = i + 1 < sections.length ? sections[i + 1].headerStart : input.length;
287
+ const added = extractAddedLines(input.slice(bodyStart, bodyEnd), false);
288
+ if (added.length === 0) continue;
289
+ const existing = byPath.get(sectionPath);
290
+ byPath.set(sectionPath, existing === undefined ? added : `${existing}\n${added}`);
291
+ }
292
+ return Array.from(byPath, ([path, digest]) => ({ path, digest }));
293
+ }
294
+
295
+ /**
296
+ * Split a (possibly partial) apply_patch envelope into one matcher entry per
297
+ * touched file. Same-path hunks are merged into one entry. Falls back to the
298
+ * streaming-tolerant parser when the envelope hasn't reached `*** End Patch`.
299
+ */
300
+ function splitApplyPatchPerFile(input: string): EditMatcherEntry[] {
301
+ let entries: ApplyPatchEntry[];
302
+ try {
303
+ entries = expandApplyPatchToEntries({ input });
304
+ } catch {
305
+ try {
306
+ entries = expandApplyPatchToPreviewEntries({ input });
307
+ } catch {
308
+ return [];
309
+ }
310
+ }
311
+ const byPath = new Map<string, string>();
312
+ for (const entry of entries) {
313
+ if (typeof entry.diff !== "string") continue;
314
+ const added = extractAddedLines(entry.diff, false);
315
+ if (added.length === 0) continue;
316
+ const existing = byPath.get(entry.path);
317
+ byPath.set(entry.path, existing === undefined ? added : `${existing}\n${added}`);
318
+ }
319
+ return Array.from(byPath, ([path, digest]) => ({ path, digest }));
320
+ }
321
+
194
322
  // -----------------------------------------------------------------------------
195
323
  // Strategies
196
324
  // -----------------------------------------------------------------------------
@@ -236,6 +364,15 @@ const replaceStrategy: EditStreamingStrategy<ReplaceArgs> = {
236
364
  }
237
365
  return digest;
238
366
  },
367
+ matcherPaths(args) {
368
+ return typeof args?.path === "string" && args.path.length > 0 ? [args.path] : undefined;
369
+ },
370
+ matcherEntries(args) {
371
+ const path = args?.path;
372
+ if (typeof path !== "string" || path.length === 0) return undefined;
373
+ const digest = replaceStrategy.matcherDigest(args);
374
+ return digest === undefined ? undefined : [{ path, digest }];
375
+ },
239
376
  };
240
377
 
241
378
  interface PatchArgs {
@@ -278,6 +415,15 @@ const patchStrategy: EditStreamingStrategy<PatchArgs> = {
278
415
  }
279
416
  return digest;
280
417
  },
418
+ matcherPaths(args) {
419
+ return typeof args?.path === "string" && args.path.length > 0 ? [args.path] : undefined;
420
+ },
421
+ matcherEntries(args) {
422
+ const path = args?.path;
423
+ if (typeof path !== "string" || path.length === 0) return undefined;
424
+ const digest = patchStrategy.matcherDigest(args);
425
+ return digest === undefined ? undefined : [{ path, digest }];
426
+ },
281
427
  };
282
428
 
283
429
  interface HashlineArgs {
@@ -437,6 +583,18 @@ const hashlineStrategy: EditStreamingStrategy<HashlineArgs> = {
437
583
  // Body rows are `+TEXT`; headers and op lines are grammar, never content.
438
584
  return extractAddedLines(input, false);
439
585
  },
586
+ matcherPaths(args) {
587
+ const input = args?.input;
588
+ if (typeof input !== "string" || input.length === 0) return undefined;
589
+ const paths = extractHashlineHeaderPaths(input);
590
+ return paths.length > 0 ? paths : undefined;
591
+ },
592
+ matcherEntries(args) {
593
+ const input = args?.input;
594
+ if (typeof input !== "string" || input.length === 0) return undefined;
595
+ const entries = splitHashlinePerFile(input);
596
+ return entries.length > 0 ? entries : undefined;
597
+ },
440
598
  };
441
599
 
442
600
  interface ApplyPatchArgs {
@@ -495,6 +653,18 @@ const applyPatchStrategy: EditStreamingStrategy<ApplyPatchArgs> = {
495
653
  // Envelope markers and `@@` hunk headers are grammar, never content.
496
654
  return extractAddedLines(input, false);
497
655
  },
656
+ matcherPaths(args) {
657
+ const input = args?.input;
658
+ if (typeof input !== "string" || input.length === 0) return undefined;
659
+ const paths = extractApplyPatchEnvelopePaths(input);
660
+ return paths.length > 0 ? paths : undefined;
661
+ },
662
+ matcherEntries(args) {
663
+ const input = args?.input;
664
+ if (typeof input !== "string" || input.length === 0) return undefined;
665
+ const entries = splitApplyPatchPerFile(input);
666
+ return entries.length > 0 ? entries : undefined;
667
+ },
498
668
  };
499
669
  export const EDIT_MODE_STRATEGIES: Record<EditMode, EditStreamingStrategy<unknown>> = {
500
670
  replace: replaceStrategy as EditStreamingStrategy<unknown>,
@@ -126,6 +126,7 @@ export type CustomToolSessionEvent =
126
126
  maxAttempts: number;
127
127
  delayMs: number;
128
128
  errorMessage: string;
129
+ errorId?: number;
129
130
  }
130
131
  | {
131
132
  reason: "auto_retry_end";
@@ -23,6 +23,7 @@ export const BUNDLED_PI_REGISTRY_KEYS: ReadonlySet<string> = new Set([
23
23
  "@oh-my-pi/pi-agent-core/compaction/tool-protection",
24
24
  "@oh-my-pi/pi-agent-core/compaction/utils",
25
25
  "@oh-my-pi/pi-ai",
26
+ "@oh-my-pi/pi-ai/error",
26
27
  "@oh-my-pi/pi-ai/auth-broker",
27
28
  "@oh-my-pi/pi-ai/auth-gateway",
28
29
  "@oh-my-pi/pi-ai/utils/harmony-leak",
@@ -56,6 +57,7 @@ export const BUNDLED_PI_REGISTRY_KEYS: ReadonlySet<string> = new Set([
56
57
  "@oh-my-pi/pi-ai/providers/devin",
57
58
  "@oh-my-pi/pi-ai/providers/error-message",
58
59
  "@oh-my-pi/pi-ai/providers/github-copilot-headers",
60
+ "@oh-my-pi/pi-ai/providers/gitlab-duo-workflow",
59
61
  "@oh-my-pi/pi-ai/providers/gitlab-duo",
60
62
  "@oh-my-pi/pi-ai/providers/google-auth",
61
63
  "@oh-my-pi/pi-ai/providers/google-gemini-cli",
@@ -94,6 +96,7 @@ export const BUNDLED_PI_REGISTRY_KEYS: ReadonlySet<string> = new Set([
94
96
  "@oh-my-pi/pi-ai/usage/kimi",
95
97
  "@oh-my-pi/pi-ai/usage/minimax-code",
96
98
  "@oh-my-pi/pi-ai/usage/ollama",
99
+ "@oh-my-pi/pi-ai/usage/openai-codex-base-url",
97
100
  "@oh-my-pi/pi-ai/usage/openai-codex-reset",
98
101
  "@oh-my-pi/pi-ai/usage/openai-codex",
99
102
  "@oh-my-pi/pi-ai/usage/opencode-go",
@@ -101,6 +104,7 @@ export const BUNDLED_PI_REGISTRY_KEYS: ReadonlySet<string> = new Set([
101
104
  "@oh-my-pi/pi-ai/usage/zai",
102
105
  "@oh-my-pi/pi-ai/utils/abort",
103
106
  "@oh-my-pi/pi-ai/utils/anthropic-auth",
107
+ "@oh-my-pi/pi-ai/utils/block-symbols",
104
108
  "@oh-my-pi/pi-ai/utils/deterministic-id",
105
109
  "@oh-my-pi/pi-ai/utils/empty-completion-retry",
106
110
  "@oh-my-pi/pi-ai/utils/event-stream",
@@ -110,7 +114,6 @@ export const BUNDLED_PI_REGISTRY_KEYS: ReadonlySet<string> = new Set([
110
114
  "@oh-my-pi/pi-ai/utils/idle-iterator",
111
115
  "@oh-my-pi/pi-ai/utils/openai-http",
112
116
  "@oh-my-pi/pi-ai/utils/openrouter-headers",
113
- "@oh-my-pi/pi-ai/utils/overflow",
114
117
  "@oh-my-pi/pi-ai/utils/parse-bind",
115
118
  "@oh-my-pi/pi-ai/utils/provider-response",
116
119
  "@oh-my-pi/pi-ai/utils/proxy",
@@ -128,6 +131,7 @@ export const BUNDLED_PI_REGISTRY_KEYS: ReadonlySet<string> = new Set([
128
131
  "@oh-my-pi/pi-ai/oauth/cursor",
129
132
  "@oh-my-pi/pi-ai/oauth/devin",
130
133
  "@oh-my-pi/pi-ai/oauth/github-copilot",
134
+ "@oh-my-pi/pi-ai/oauth/gitlab-duo-workflow",
131
135
  "@oh-my-pi/pi-ai/oauth/gitlab-duo",
132
136
  "@oh-my-pi/pi-ai/oauth/google-antigravity",
133
137
  "@oh-my-pi/pi-ai/oauth/google-gemini-cli",
@@ -187,6 +191,7 @@ export const BUNDLED_PI_REGISTRY_KEYS: ReadonlySet<string> = new Set([
187
191
  "@oh-my-pi/pi-coding-agent/eval",
188
192
  "@oh-my-pi/pi-coding-agent/lsp",
189
193
  "@oh-my-pi/pi-coding-agent/lsp/clients",
194
+ "@oh-my-pi/pi-coding-agent/markit",
190
195
  "@oh-my-pi/pi-coding-agent/mcp",
191
196
  "@oh-my-pi/pi-coding-agent/mcp/transports",
192
197
  "@oh-my-pi/pi-coding-agent/memories",
@@ -481,6 +486,7 @@ export const BUNDLED_PI_REGISTRY_KEYS: ReadonlySet<string> = new Set([
481
486
  "@oh-my-pi/pi-coding-agent/internal-urls/router",
482
487
  "@oh-my-pi/pi-coding-agent/internal-urls/rule-protocol",
483
488
  "@oh-my-pi/pi-coding-agent/internal-urls/skill-protocol",
489
+ "@oh-my-pi/pi-coding-agent/internal-urls/ssh-protocol",
484
490
  "@oh-my-pi/pi-coding-agent/internal-urls/types",
485
491
  "@oh-my-pi/pi-coding-agent/internal-urls/vault-protocol",
486
492
  "@oh-my-pi/pi-coding-agent/eval/js/context-manager",
@@ -508,6 +514,8 @@ export const BUNDLED_PI_REGISTRY_KEYS: ReadonlySet<string> = new Set([
508
514
  "@oh-my-pi/pi-coding-agent/lsp/clients/biome-client",
509
515
  "@oh-my-pi/pi-coding-agent/lsp/clients/lsp-linter-client",
510
516
  "@oh-my-pi/pi-coding-agent/lsp/clients/swiftlint-client",
517
+ "@oh-my-pi/pi-coding-agent/markit/registry",
518
+ "@oh-my-pi/pi-coding-agent/markit/types",
511
519
  "@oh-my-pi/pi-coding-agent/mcp/client",
512
520
  "@oh-my-pi/pi-coding-agent/mcp/config-writer",
513
521
  "@oh-my-pi/pi-coding-agent/mcp/config",
@@ -554,6 +562,7 @@ export const BUNDLED_PI_REGISTRY_KEYS: ReadonlySet<string> = new Set([
554
562
  "@oh-my-pi/pi-coding-agent/modes/orchestrate",
555
563
  "@oh-my-pi/pi-coding-agent/modes/print-mode",
556
564
  "@oh-my-pi/pi-coding-agent/modes/prompt-action-autocomplete",
565
+ "@oh-my-pi/pi-coding-agent/modes/running-subagent-badge",
557
566
  "@oh-my-pi/pi-coding-agent/modes/runtime-init",
558
567
  "@oh-my-pi/pi-coding-agent/modes/session-observer-registry",
559
568
  "@oh-my-pi/pi-coding-agent/modes/setup-version",
@@ -603,6 +612,7 @@ export const BUNDLED_PI_REGISTRY_KEYS: ReadonlySet<string> = new Set([
603
612
  "@oh-my-pi/pi-coding-agent/modes/components/mcp-add-wizard",
604
613
  "@oh-my-pi/pi-coding-agent/modes/components/message-frame",
605
614
  "@oh-my-pi/pi-coding-agent/modes/components/model-selector",
615
+ "@oh-my-pi/pi-coding-agent/modes/components/move-overlay",
606
616
  "@oh-my-pi/pi-coding-agent/modes/components/oauth-selector",
607
617
  "@oh-my-pi/pi-coding-agent/modes/components/omfg-panel",
608
618
  "@oh-my-pi/pi-coding-agent/modes/components/overlay-box",
@@ -614,6 +624,7 @@ export const BUNDLED_PI_REGISTRY_KEYS: ReadonlySet<string> = new Set([
614
624
  "@oh-my-pi/pi-coding-agent/modes/components/read-tool-group",
615
625
  "@oh-my-pi/pi-coding-agent/modes/components/reset-usage-selector",
616
626
  "@oh-my-pi/pi-coding-agent/modes/components/segment-track",
627
+ "@oh-my-pi/pi-coding-agent/modes/components/select-list-mouse-routing",
617
628
  "@oh-my-pi/pi-coding-agent/modes/components/selector-helpers",
618
629
  "@oh-my-pi/pi-coding-agent/modes/components/session-selector",
619
630
  "@oh-my-pi/pi-coding-agent/modes/components/settings-defs",
@@ -714,12 +725,14 @@ export const BUNDLED_PI_REGISTRY_KEYS: ReadonlySet<string> = new Set([
714
725
  "@oh-my-pi/pi-coding-agent/session/session-paths",
715
726
  "@oh-my-pi/pi-coding-agent/session/session-persistence",
716
727
  "@oh-my-pi/pi-coding-agent/session/session-storage",
728
+ "@oh-my-pi/pi-coding-agent/session/settings-stream-fn",
717
729
  "@oh-my-pi/pi-coding-agent/session/shake-types",
718
730
  "@oh-my-pi/pi-coding-agent/session/snapcompact-inline",
719
731
  "@oh-my-pi/pi-coding-agent/session/snapcompact-savings-journal",
720
732
  "@oh-my-pi/pi-coding-agent/session/sql-session-storage",
721
733
  "@oh-my-pi/pi-coding-agent/session/streaming-output",
722
734
  "@oh-my-pi/pi-coding-agent/session/tool-choice-queue",
735
+ "@oh-my-pi/pi-coding-agent/session/turn-persistence",
723
736
  "@oh-my-pi/pi-coding-agent/session/unexpected-stop-classifier",
724
737
  "@oh-my-pi/pi-coding-agent/session/yield-queue",
725
738
  "@oh-my-pi/pi-coding-agent/slash-commands/acp-builtins",
@@ -729,6 +742,7 @@ export const BUNDLED_PI_REGISTRY_KEYS: ReadonlySet<string> = new Set([
729
742
  "@oh-my-pi/pi-coding-agent/slash-commands/types",
730
743
  "@oh-my-pi/pi-coding-agent/ssh/config-writer",
731
744
  "@oh-my-pi/pi-coding-agent/ssh/connection-manager",
745
+ "@oh-my-pi/pi-coding-agent/ssh/file-transfer",
732
746
  "@oh-my-pi/pi-coding-agent/ssh/ssh-executor",
733
747
  "@oh-my-pi/pi-coding-agent/ssh/sshfs-mount",
734
748
  "@oh-my-pi/pi-coding-agent/ssh/utils",
@@ -838,6 +852,7 @@ export const BUNDLED_PI_REGISTRY_KEYS: ReadonlySet<string> = new Set([
838
852
  "@oh-my-pi/pi-coding-agent/tui/types",
839
853
  "@oh-my-pi/pi-coding-agent/tui/utils",
840
854
  "@oh-my-pi/pi-coding-agent/tui/width-aware-text",
855
+ "@oh-my-pi/pi-coding-agent/utils/active-repo-context",
841
856
  "@oh-my-pi/pi-coding-agent/utils/block-context",
842
857
  "@oh-my-pi/pi-coding-agent/utils/changelog",
843
858
  "@oh-my-pi/pi-coding-agent/utils/clipboard",
@@ -856,9 +871,11 @@ export const BUNDLED_PI_REGISTRY_KEYS: ReadonlySet<string> = new Set([
856
871
  "@oh-my-pi/pi-coding-agent/utils/ipc",
857
872
  "@oh-my-pi/pi-coding-agent/utils/jj",
858
873
  "@oh-my-pi/pi-coding-agent/utils/lang-from-path",
874
+ "@oh-my-pi/pi-coding-agent/utils/markit-cache",
859
875
  "@oh-my-pi/pi-coding-agent/utils/markit",
860
876
  "@oh-my-pi/pi-coding-agent/utils/mupdf-wasm-embed",
861
877
  "@oh-my-pi/pi-coding-agent/utils/open",
878
+ "@oh-my-pi/pi-coding-agent/utils/prompt-path",
862
879
  "@oh-my-pi/pi-coding-agent/utils/qrcode",
863
880
  "@oh-my-pi/pi-coding-agent/utils/session-color",
864
881
  "@oh-my-pi/pi-coding-agent/utils/shell-snapshot",