@oh-my-pi/pi-coding-agent 15.13.1 → 15.13.3

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 (109) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/dist/cli.js +1057 -289
  3. package/dist/types/config/model-registry.d.ts +1 -0
  4. package/dist/types/config/models-config-schema.d.ts +3 -0
  5. package/dist/types/config/models-config.d.ts +3 -0
  6. package/dist/types/config/settings-schema.d.ts +97 -0
  7. package/dist/types/edit/hashline/block-resolver.d.ts +1 -1
  8. package/dist/types/edit/index.d.ts +2 -0
  9. package/dist/types/eval/js/context-manager.d.ts +15 -0
  10. package/dist/types/modes/components/welcome.d.ts +1 -0
  11. package/dist/types/modes/controllers/input-controller.d.ts +4 -4
  12. package/dist/types/modes/interactive-mode.d.ts +1 -0
  13. package/dist/types/modes/rpc/rpc-types.d.ts +2 -1
  14. package/dist/types/modes/types.d.ts +6 -0
  15. package/dist/types/sdk.d.ts +3 -0
  16. package/dist/types/session/session-dump-format.d.ts +2 -1
  17. package/dist/types/session/unexpected-stop-classifier.d.ts +13 -0
  18. package/dist/types/stt/asr-client.d.ts +1 -1
  19. package/dist/types/system-prompt.d.ts +11 -0
  20. package/dist/types/tiny/title-client.d.ts +1 -1
  21. package/dist/types/tools/ask.d.ts +2 -0
  22. package/dist/types/tools/ast-edit.d.ts +2 -0
  23. package/dist/types/tools/ast-grep.d.ts +2 -0
  24. package/dist/types/tools/browser.d.ts +2 -0
  25. package/dist/types/tools/debug.d.ts +2 -0
  26. package/dist/types/tools/eval.d.ts +2 -0
  27. package/dist/types/tools/find.d.ts +2 -0
  28. package/dist/types/tools/inspect-image.d.ts +2 -1
  29. package/dist/types/tools/irc.d.ts +2 -0
  30. package/dist/types/tools/job.d.ts +1 -0
  31. package/dist/types/tools/ssh.d.ts +2 -0
  32. package/dist/types/tools/todo.d.ts +2 -0
  33. package/dist/types/tts/tts-client.d.ts +1 -1
  34. package/dist/types/tui/tree-list.d.ts +1 -0
  35. package/dist/types/utils/thinking-display.d.ts +1 -17
  36. package/package.json +12 -12
  37. package/src/cli.ts +25 -12
  38. package/src/config/model-registry.ts +16 -2
  39. package/src/config/models-config-schema.ts +2 -0
  40. package/src/config/models-config.ts +1 -0
  41. package/src/config/settings-schema.ts +78 -0
  42. package/src/edit/hashline/block-resolver.ts +1 -1
  43. package/src/edit/hashline/execute.ts +1 -6
  44. package/src/edit/index.ts +48 -0
  45. package/src/eval/__tests__/agent-bridge.test.ts +106 -46
  46. package/src/eval/__tests__/js-context-manager.test.ts +53 -3
  47. package/src/eval/js/context-manager.ts +132 -29
  48. package/src/eval/js/worker-core.ts +1 -1
  49. package/src/eval/js/worker-entry.ts +7 -0
  50. package/src/export/html/template.js +18 -22
  51. package/src/internal-urls/docs-index.generated.ts +12 -3
  52. package/src/main.ts +15 -5
  53. package/src/modes/acp/acp-agent.ts +2 -2
  54. package/src/modes/acp/acp-event-mapper.ts +2 -2
  55. package/src/modes/components/agent-hub.ts +31 -7
  56. package/src/modes/components/assistant-message.ts +24 -15
  57. package/src/modes/components/snapcompact-shape-preview-doc.md +2 -2
  58. package/src/modes/components/snapcompact-shape-preview.ts +2 -2
  59. package/src/modes/components/tree-selector.ts +3 -2
  60. package/src/modes/components/welcome.ts +14 -4
  61. package/src/modes/controllers/event-controller.ts +3 -3
  62. package/src/modes/controllers/input-controller.ts +28 -39
  63. package/src/modes/controllers/streaming-reveal.ts +4 -4
  64. package/src/modes/interactive-mode.ts +2 -0
  65. package/src/modes/rpc/rpc-mode.ts +1 -0
  66. package/src/modes/rpc/rpc-types.ts +2 -2
  67. package/src/modes/types.ts +6 -0
  68. package/src/modes/utils/ui-helpers.ts +3 -3
  69. package/src/prompts/agents/oracle.md +0 -1
  70. package/src/prompts/agents/reviewer.md +0 -1
  71. package/src/prompts/system/system-prompt.md +17 -21
  72. package/src/prompts/system/unexpected-stop-classifier.md +17 -0
  73. package/src/prompts/system/unexpected-stop-retry.md +4 -0
  74. package/src/prompts/tools/ask.md +0 -8
  75. package/src/prompts/tools/ast-edit.md +0 -15
  76. package/src/prompts/tools/ast-grep.md +0 -13
  77. package/src/prompts/tools/browser.md +0 -21
  78. package/src/prompts/tools/debug.md +0 -13
  79. package/src/prompts/tools/eval.md +0 -9
  80. package/src/prompts/tools/find.md +0 -13
  81. package/src/prompts/tools/inspect-image.md +0 -9
  82. package/src/prompts/tools/irc.md +0 -15
  83. package/src/prompts/tools/patch.md +0 -13
  84. package/src/prompts/tools/ssh.md +0 -9
  85. package/src/prompts/tools/todo.md +1 -19
  86. package/src/sdk.ts +19 -0
  87. package/src/session/agent-session.ts +289 -29
  88. package/src/session/session-dump-format.ts +17 -49
  89. package/src/session/unexpected-stop-classifier.ts +129 -0
  90. package/src/stt/asr-client.ts +1 -1
  91. package/src/system-prompt.ts +31 -0
  92. package/src/tiny/title-client.ts +1 -1
  93. package/src/tools/ask.ts +41 -0
  94. package/src/tools/ast-edit.ts +46 -0
  95. package/src/tools/ast-grep.ts +24 -0
  96. package/src/tools/browser/tab-supervisor.ts +1 -1
  97. package/src/tools/browser/tab-worker-entry.ts +12 -4
  98. package/src/tools/browser.ts +52 -0
  99. package/src/tools/debug.ts +17 -0
  100. package/src/tools/eval.ts +20 -1
  101. package/src/tools/find.ts +24 -0
  102. package/src/tools/inspect-image.ts +27 -1
  103. package/src/tools/irc.ts +41 -0
  104. package/src/tools/job.ts +1 -0
  105. package/src/tools/ssh.ts +16 -0
  106. package/src/tools/todo.ts +82 -3
  107. package/src/tts/tts-client.ts +1 -1
  108. package/src/tui/tree-list.ts +68 -19
  109. package/src/utils/thinking-display.ts +8 -34
@@ -1,13 +1,20 @@
1
1
  import { parentPort } from "node:worker_threads";
2
+ import { consumeWorkerInbox } from "@oh-my-pi/pi-utils/worker-host";
2
3
  import { WorkerCore } from "./worker-core";
3
4
  import type { Transport, WorkerInbound, WorkerOutbound } from "./worker-protocol";
4
5
 
5
6
  if (!parentPort) throw new Error("js worker-entry: missing parentPort");
6
7
 
7
8
  const port = parentPort;
9
+ // When the CLI host pre-buffered messages (it imports this module dynamically),
10
+ // bind that inbox so the parent's already-delivered `init` is replayed. Loaded
11
+ // directly (test/SDK fallback), this module's top-level runs synchronously at
12
+ // worker start, so the direct `parentPort.on` below wins the flush on its own.
13
+ const inbox = consumeWorkerInbox();
8
14
  const transport: Transport = {
9
15
  send: (msg: WorkerOutbound) => port.postMessage(msg),
10
16
  onMessage: handler => {
17
+ if (inbox) return inbox.bind(data => handler(data as WorkerInbound));
11
18
  const wrap = (data: unknown): void => handler(data as WorkerInbound);
12
19
  port.on("message", wrap);
13
20
  return () => port.off("message", wrap);
@@ -278,10 +278,12 @@
278
278
  let searchQuery = '';
279
279
 
280
280
  function hasTextContent(content) {
281
- if (typeof content === 'string') return content.trim().length > 0;
281
+ if (typeof content === 'string') return Boolean(canonicalizeMessage(content));
282
282
  if (Array.isArray(content)) {
283
283
  for (const c of content) {
284
- if (c.type === 'text' && c.text && c.text.trim().length > 0) return true;
284
+ if (c.type === 'text' && c.text) {
285
+ if (canonicalizeMessage(c.text)) return true;
286
+ }
285
287
  }
286
288
  }
287
289
  return false;
@@ -450,24 +452,16 @@
450
452
  return div.innerHTML;
451
453
  }
452
454
 
453
- function isDotOnlyThinking(text) {
454
- let sawDot = false;
455
- for (let i = 0; i < text.length; i++) {
456
- const code = text.charCodeAt(i);
457
- if (code === 0x2e || code === 0x2026) {
458
- sawDot = true;
459
- continue;
455
+ function canonicalizeMessage(text) {
456
+ if (!text) return '';
457
+ const trimmed = text.trim();
458
+ for (let i = 0; i < trimmed.length; i++) {
459
+ const code = trimmed.charCodeAt(i);
460
+ if (code !== 0x2e && code !== 0x2026 && code !== 0x20 && code !== 0x09 && code !== 0x0a && code !== 0x0d) {
461
+ return trimmed;
460
462
  }
461
- if (code === 0x20 || code === 0x09 || code === 0x0a || code === 0x0d) continue;
462
- return false;
463
463
  }
464
- return sawDot;
465
- }
466
-
467
- function visibleThinkingText(block) {
468
- const text = block.thinking.trim();
469
- if (!text) return '';
470
- return isDotOnlyThinking(text) ? '' : text;
464
+ return '';
471
465
  }
472
466
 
473
467
  /**
@@ -1074,10 +1068,13 @@
1074
1068
  let html = `<div class="assistant-message" id="${entryId}">${copyBtnHtml}${tsHtml}`;
1075
1069
 
1076
1070
  for (const block of msg.content) {
1077
- if (block.type === 'text' && block.text.trim()) {
1078
- html += `<div class="assistant-text markdown-content">${safeMarkedParse(block.text)}</div>`;
1071
+ if (block.type === 'text') {
1072
+ const canon = canonicalizeMessage(block.text);
1073
+ if (canon) {
1074
+ html += `<div class="assistant-text markdown-content">${safeMarkedParse(block.text)}</div>`;
1075
+ }
1079
1076
  } else if (block.type === 'thinking') {
1080
- const thinking = visibleThinkingText(block);
1077
+ const thinking = canonicalizeMessage(block.thinking);
1081
1078
  if (!thinking) continue;
1082
1079
  html += `<div class="thinking-block">
1083
1080
  <div class="thinking-text">${escapeHtml(thinking)}</div>
@@ -1085,7 +1082,6 @@
1085
1082
  </div>`;
1086
1083
  }
1087
1084
  }
1088
-
1089
1085
  for (const block of msg.content) {
1090
1086
  if (block.type === 'toolCall') {
1091
1087
  html += renderToolCall(block, sctx);