@oh-my-pi/pi-coding-agent 13.14.2 → 13.15.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 (82) hide show
  1. package/CHANGELOG.md +140 -0
  2. package/package.json +10 -8
  3. package/src/autoresearch/command-initialize.md +34 -0
  4. package/src/autoresearch/command-resume.md +17 -0
  5. package/src/autoresearch/contract.ts +332 -0
  6. package/src/autoresearch/dashboard.ts +447 -0
  7. package/src/autoresearch/git.ts +243 -0
  8. package/src/autoresearch/helpers.ts +458 -0
  9. package/src/autoresearch/index.ts +693 -0
  10. package/src/autoresearch/prompt.md +227 -0
  11. package/src/autoresearch/resume-message.md +16 -0
  12. package/src/autoresearch/state.ts +386 -0
  13. package/src/autoresearch/tools/init-experiment.ts +310 -0
  14. package/src/autoresearch/tools/log-experiment.ts +833 -0
  15. package/src/autoresearch/tools/run-experiment.ts +640 -0
  16. package/src/autoresearch/types.ts +218 -0
  17. package/src/cli/args.ts +8 -2
  18. package/src/cli/initial-message.ts +58 -0
  19. package/src/config/keybindings.ts +417 -212
  20. package/src/config/model-registry.ts +1 -0
  21. package/src/config/model-resolver.ts +57 -9
  22. package/src/config/settings-schema.ts +38 -10
  23. package/src/config/settings.ts +1 -4
  24. package/src/export/html/template.css +43 -13
  25. package/src/export/html/template.generated.ts +1 -1
  26. package/src/export/html/template.html +1 -0
  27. package/src/export/html/template.js +107 -0
  28. package/src/extensibility/extensions/types.ts +31 -8
  29. package/src/internal-urls/docs-index.generated.ts +1 -1
  30. package/src/lsp/index.ts +1 -1
  31. package/src/main.ts +44 -44
  32. package/src/mcp/oauth-discovery.ts +1 -1
  33. package/src/modes/acp/acp-agent.ts +957 -0
  34. package/src/modes/acp/acp-event-mapper.ts +531 -0
  35. package/src/modes/acp/acp-mode.ts +13 -0
  36. package/src/modes/acp/index.ts +2 -0
  37. package/src/modes/components/agent-dashboard.ts +5 -4
  38. package/src/modes/components/custom-editor.ts +47 -47
  39. package/src/modes/components/extensions/extension-dashboard.ts +2 -1
  40. package/src/modes/components/history-search.ts +2 -1
  41. package/src/modes/components/hook-editor.ts +2 -1
  42. package/src/modes/components/hook-input.ts +8 -7
  43. package/src/modes/components/hook-selector.ts +15 -10
  44. package/src/modes/components/keybinding-hints.ts +9 -9
  45. package/src/modes/components/login-dialog.ts +3 -3
  46. package/src/modes/components/mcp-add-wizard.ts +2 -1
  47. package/src/modes/components/model-selector.ts +14 -3
  48. package/src/modes/components/oauth-selector.ts +2 -1
  49. package/src/modes/components/session-selector.ts +2 -1
  50. package/src/modes/components/settings-selector.ts +2 -1
  51. package/src/modes/components/status-line-segment-editor.ts +2 -1
  52. package/src/modes/components/tree-selector.ts +3 -2
  53. package/src/modes/components/user-message-selector.ts +3 -8
  54. package/src/modes/components/user-message.ts +16 -0
  55. package/src/modes/controllers/extension-ui-controller.ts +89 -4
  56. package/src/modes/controllers/input-controller.ts +29 -23
  57. package/src/modes/controllers/mcp-command-controller.ts +1 -1
  58. package/src/modes/index.ts +1 -0
  59. package/src/modes/interactive-mode.ts +17 -5
  60. package/src/modes/print-mode.ts +1 -1
  61. package/src/modes/prompt-action-autocomplete.ts +7 -7
  62. package/src/modes/rpc/rpc-mode.ts +7 -2
  63. package/src/modes/rpc/rpc-types.ts +1 -0
  64. package/src/modes/theme/theme.ts +53 -44
  65. package/src/modes/types.ts +9 -2
  66. package/src/modes/utils/hotkeys-markdown.ts +19 -19
  67. package/src/modes/utils/keybinding-matchers.ts +21 -0
  68. package/src/modes/utils/ui-helpers.ts +1 -1
  69. package/src/patch/hashline.ts +139 -127
  70. package/src/patch/index.ts +77 -59
  71. package/src/patch/shared.ts +19 -11
  72. package/src/prompts/tools/hashline.md +43 -116
  73. package/src/sdk.ts +34 -17
  74. package/src/session/agent-session.ts +123 -30
  75. package/src/session/session-manager.ts +32 -31
  76. package/src/tools/ask.ts +56 -30
  77. package/src/tools/bash-interceptor.ts +1 -39
  78. package/src/tools/bash-skill-urls.ts +1 -1
  79. package/src/tools/browser.ts +1 -1
  80. package/src/tools/gemini-image.ts +1 -1
  81. package/src/tools/resolve.ts +1 -1
  82. package/src/utils/child-process.ts +88 -0
@@ -287,7 +287,7 @@ async function loadImageFromUrl(imageUrl: string, signal?: AbortSignal): Promise
287
287
  throw new Error(`Image download failed (${response.status}): ${rawText}`);
288
288
  }
289
289
  const contentType = response.headers.get("content-type")?.split(";")[0];
290
- if (!contentType || !contentType.startsWith("image/")) {
290
+ if (!contentType?.startsWith("image/")) {
291
291
  throw new Error(`Unsupported image type from URL: ${imageUrl}`);
292
292
  }
293
293
  const buffer = await response.bytes();
@@ -54,7 +54,7 @@ export class ResolveTool implements AgentTool<typeof resolveSchema, ResolveToolD
54
54
  ): Promise<AgentToolResult<ResolveToolDetails>> {
55
55
  return untilAborted(signal, async () => {
56
56
  const store = this.session.pendingActionStore;
57
- if (!store || !store.hasPending) {
57
+ if (!store?.hasPending) {
58
58
  throw new ToolError("No pending action to resolve. Nothing to apply or discard.");
59
59
  }
60
60
 
@@ -0,0 +1,88 @@
1
+ import type { ChildProcess } from "node:child_process";
2
+
3
+ const EXIT_STDIO_GRACE_MS = 100;
4
+
5
+ /**
6
+ * Wait for a child process to terminate without hanging on inherited stdio handles.
7
+ *
8
+ * Daemonized descendants can inherit the child's stdout/stderr pipe handles. In that
9
+ * case the child emits `exit`, but `close` can hang forever even though the original
10
+ * process is already gone. We wait briefly for stdio to end, then forcibly stop
11
+ * tracking the inherited handles.
12
+ */
13
+ export function waitForChildProcess(child: ChildProcess): Promise<number | null> {
14
+ const { promise, resolve, reject } = Promise.withResolvers<number | null>();
15
+
16
+ let settled = false;
17
+ let exited = false;
18
+ let exitCode: number | null = null;
19
+ let postExitTimer: NodeJS.Timeout | undefined;
20
+ let stdoutEnded = child.stdout === null;
21
+ let stderrEnded = child.stderr === null;
22
+
23
+ const cleanup = () => {
24
+ if (postExitTimer) {
25
+ clearTimeout(postExitTimer);
26
+ postExitTimer = undefined;
27
+ }
28
+ child.removeListener("error", onError);
29
+ child.removeListener("exit", onExit);
30
+ child.removeListener("close", onClose);
31
+ child.stdout?.removeListener("end", onStdoutEnd);
32
+ child.stderr?.removeListener("end", onStderrEnd);
33
+ };
34
+
35
+ const finalize = (code: number | null) => {
36
+ if (settled) return;
37
+ settled = true;
38
+ cleanup();
39
+ child.stdout?.destroy();
40
+ child.stderr?.destroy();
41
+ resolve(code);
42
+ };
43
+
44
+ const maybeFinalizeAfterExit = () => {
45
+ if (!exited || settled) return;
46
+ if (stdoutEnded && stderrEnded) {
47
+ finalize(exitCode);
48
+ }
49
+ };
50
+
51
+ const onStdoutEnd = () => {
52
+ stdoutEnded = true;
53
+ maybeFinalizeAfterExit();
54
+ };
55
+
56
+ const onStderrEnd = () => {
57
+ stderrEnded = true;
58
+ maybeFinalizeAfterExit();
59
+ };
60
+
61
+ const onError = (err: Error) => {
62
+ if (settled) return;
63
+ settled = true;
64
+ cleanup();
65
+ reject(err);
66
+ };
67
+
68
+ const onExit = (code: number | null) => {
69
+ exited = true;
70
+ exitCode = code;
71
+ maybeFinalizeAfterExit();
72
+ if (!settled) {
73
+ postExitTimer = setTimeout(() => finalize(code), EXIT_STDIO_GRACE_MS);
74
+ }
75
+ };
76
+
77
+ const onClose = (code: number | null) => {
78
+ finalize(code);
79
+ };
80
+
81
+ child.stdout?.once("end", onStdoutEnd);
82
+ child.stderr?.once("end", onStderrEnd);
83
+ child.once("error", onError);
84
+ child.once("exit", onExit);
85
+ child.once("close", onClose);
86
+
87
+ return promise;
88
+ }