@oh-my-pi/pi-coding-agent 17.0.7 → 17.0.9

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 (153) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/dist/cli.js +5025 -4930
  3. package/dist/types/config/__tests__/model-registry.test.d.ts +1 -0
  4. package/dist/types/config/model-registry.d.ts +28 -1
  5. package/dist/types/config/model-resolver.d.ts +5 -1
  6. package/dist/types/config/settings-schema.d.ts +50 -3
  7. package/dist/types/dap/client.d.ts +19 -0
  8. package/dist/types/extensibility/extensions/runner.d.ts +4 -2
  9. package/dist/types/extensibility/extensions/types.d.ts +3 -0
  10. package/dist/types/extensibility/legacy-pi-coding-agent-shim.d.ts +1 -0
  11. package/dist/types/extensibility/legacy-pi-tui-shim.d.ts +10 -0
  12. package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +1 -1
  13. package/dist/types/extensibility/typebox.d.ts +4 -0
  14. package/dist/types/hindsight/client.d.ts +10 -0
  15. package/dist/types/hindsight/config.d.ts +8 -0
  16. package/dist/types/internal-urls/registry-helpers.d.ts +11 -0
  17. package/dist/types/lsp/client.d.ts +2 -0
  18. package/dist/types/mcp/manager.d.ts +6 -2
  19. package/dist/types/mcp/render.d.ts +2 -2
  20. package/dist/types/mcp/tool-bridge.d.ts +16 -3
  21. package/dist/types/mcp/types.d.ts +6 -0
  22. package/dist/types/mnemopi/state.d.ts +2 -0
  23. package/dist/types/modes/components/oauth-selector.d.ts +8 -0
  24. package/dist/types/modes/components/settings-defs.d.ts +1 -0
  25. package/dist/types/modes/components/user-message.d.ts +25 -1
  26. package/dist/types/modes/controllers/extension-ui-controller.d.ts +8 -0
  27. package/dist/types/modes/controllers/mcp-command-controller.d.ts +3 -0
  28. package/dist/types/modes/interactive-mode.d.ts +7 -1
  29. package/dist/types/modes/rpc/rpc-client.d.ts +10 -1
  30. package/dist/types/modes/rpc/rpc-frame.d.ts +16 -0
  31. package/dist/types/modes/rpc/rpc-messages.d.ts +26 -0
  32. package/dist/types/modes/rpc/rpc-types.d.ts +40 -0
  33. package/dist/types/modes/setup-wizard/scenes/sign-in.d.ts +1 -1
  34. package/dist/types/modes/setup-wizard/scenes/types.d.ts +9 -1
  35. package/dist/types/modes/setup-wizard/scenes/web-search.d.ts +1 -1
  36. package/dist/types/modes/types.d.ts +14 -1
  37. package/dist/types/modes/utils/ui-helpers.d.ts +12 -8
  38. package/dist/types/sdk.d.ts +1 -0
  39. package/dist/types/session/agent-session-error-log.test.d.ts +1 -0
  40. package/dist/types/session/agent-session.d.ts +86 -3
  41. package/dist/types/session/session-loader.d.ts +6 -4
  42. package/dist/types/task/executor.d.ts +10 -0
  43. package/dist/types/task/index.d.ts +1 -0
  44. package/dist/types/task/prewalk.d.ts +3 -0
  45. package/dist/types/task/types.d.ts +14 -0
  46. package/dist/types/tools/ask.d.ts +10 -0
  47. package/dist/types/tools/hub/jobs.d.ts +1 -1
  48. package/dist/types/tools/index.d.ts +3 -0
  49. package/dist/types/tools/report-tool-issue.d.ts +24 -9
  50. package/dist/types/tools/tool-timeouts.d.ts +8 -2
  51. package/dist/types/utils/changelog.d.ts +4 -6
  52. package/dist/types/web/search/providers/firecrawl.d.ts +9 -0
  53. package/dist/types/web/search/types.d.ts +1 -1
  54. package/package.json +13 -13
  55. package/scripts/legacy-pi-virtual-module.ts +1 -1
  56. package/src/cli/grievances-cli.ts +2 -2
  57. package/src/cli/models-cli.ts +37 -17
  58. package/src/cli/update-cli.ts +14 -1
  59. package/src/cli/usage-cli.ts +1 -1
  60. package/src/config/__tests__/model-registry.test.ts +147 -0
  61. package/src/config/model-registry.ts +87 -24
  62. package/src/config/model-resolver.ts +56 -32
  63. package/src/config/settings-schema.ts +46 -3
  64. package/src/config/settings.ts +68 -5
  65. package/src/dap/client.ts +86 -7
  66. package/src/edit/diff.ts +4 -4
  67. package/src/eval/py/prelude.py +5 -5
  68. package/src/export/html/template.js +23 -9
  69. package/src/extensibility/extensions/runner.ts +9 -4
  70. package/src/extensibility/extensions/types.ts +3 -0
  71. package/src/extensibility/legacy-pi-coding-agent-shim.ts +1 -0
  72. package/src/extensibility/legacy-pi-tui-shim.ts +10 -0
  73. package/src/extensibility/plugins/legacy-pi-compat.ts +851 -310
  74. package/src/extensibility/typebox.ts +22 -9
  75. package/src/hindsight/client.test.ts +42 -0
  76. package/src/hindsight/client.ts +40 -3
  77. package/src/hindsight/config.ts +18 -0
  78. package/src/internal-urls/registry-helpers.ts +40 -0
  79. package/src/launch/broker.ts +31 -5
  80. package/src/lsp/client.ts +23 -0
  81. package/src/lsp/clients/biome-client.ts +3 -4
  82. package/src/lsp/index.ts +26 -8
  83. package/src/main.ts +16 -5
  84. package/src/mcp/manager.ts +39 -8
  85. package/src/mcp/render.ts +94 -35
  86. package/src/mcp/tool-bridge.ts +116 -11
  87. package/src/mcp/types.ts +7 -0
  88. package/src/mnemopi/state.ts +70 -3
  89. package/src/modes/components/agent-dashboard.ts +6 -2
  90. package/src/modes/components/agent-hub.ts +26 -9
  91. package/src/modes/components/chat-transcript-builder.ts +13 -2
  92. package/src/modes/components/diff.ts +2 -2
  93. package/src/modes/components/oauth-selector.ts +24 -7
  94. package/src/modes/components/plan-review-overlay.ts +20 -4
  95. package/src/modes/components/settings-defs.ts +5 -2
  96. package/src/modes/components/settings-selector.ts +9 -5
  97. package/src/modes/components/tool-execution.test.ts +63 -2
  98. package/src/modes/components/user-message.ts +100 -1
  99. package/src/modes/controllers/command-controller.ts +36 -12
  100. package/src/modes/controllers/event-controller.ts +4 -1
  101. package/src/modes/controllers/extension-ui-controller.ts +18 -0
  102. package/src/modes/controllers/input-controller.ts +47 -12
  103. package/src/modes/controllers/mcp-command-controller.ts +70 -40
  104. package/src/modes/controllers/selector-controller.ts +82 -6
  105. package/src/modes/interactive-mode.ts +39 -4
  106. package/src/modes/rpc/rpc-client.ts +94 -3
  107. package/src/modes/rpc/rpc-frame.ts +164 -4
  108. package/src/modes/rpc/rpc-messages.ts +127 -0
  109. package/src/modes/rpc/rpc-mode.ts +79 -7
  110. package/src/modes/rpc/rpc-types.ts +34 -2
  111. package/src/modes/setup-wizard/scenes/model.ts +5 -7
  112. package/src/modes/setup-wizard/scenes/providers.ts +3 -2
  113. package/src/modes/setup-wizard/scenes/sign-in.ts +8 -2
  114. package/src/modes/setup-wizard/scenes/theme.ts +13 -3
  115. package/src/modes/setup-wizard/scenes/types.ts +9 -1
  116. package/src/modes/setup-wizard/scenes/web-search.ts +6 -1
  117. package/src/modes/setup-wizard/wizard-overlay.ts +1 -1
  118. package/src/modes/types.ts +16 -3
  119. package/src/modes/utils/ui-helpers.ts +40 -20
  120. package/src/prompts/goals/guided-goal-system.md +24 -3
  121. package/src/prompts/system/workflow-notice.md +1 -1
  122. package/src/prompts/tools/task.md +12 -2
  123. package/src/sdk.ts +179 -51
  124. package/src/session/agent-session-error-log.test.ts +59 -0
  125. package/src/session/agent-session.ts +351 -46
  126. package/src/session/session-context.test.ts +224 -1
  127. package/src/session/session-context.ts +41 -2
  128. package/src/session/session-loader.ts +10 -5
  129. package/src/slash-commands/helpers/usage-report.ts +3 -1
  130. package/src/system-prompt.ts +1 -2
  131. package/src/task/executor.ts +44 -27
  132. package/src/task/index.ts +63 -8
  133. package/src/task/prewalk.ts +6 -0
  134. package/src/task/structured-subagent.ts +3 -1
  135. package/src/task/types.ts +16 -0
  136. package/src/task/worktree.ts +25 -11
  137. package/src/tools/ask.ts +15 -0
  138. package/src/tools/bash.ts +14 -6
  139. package/src/tools/browser.ts +1 -1
  140. package/src/tools/debug.ts +1 -1
  141. package/src/tools/eval.ts +4 -5
  142. package/src/tools/fetch.ts +1 -1
  143. package/src/tools/hub/index.ts +1 -1
  144. package/src/tools/hub/jobs.ts +67 -8
  145. package/src/tools/hub/launch.ts +7 -0
  146. package/src/tools/index.ts +3 -0
  147. package/src/tools/report-tool-issue.ts +79 -28
  148. package/src/tools/tool-timeouts.ts +10 -3
  149. package/src/tools/write.ts +31 -0
  150. package/src/utils/changelog.ts +54 -58
  151. package/src/utils/git.ts +57 -49
  152. package/src/web/search/providers/firecrawl.ts +46 -13
  153. package/src/web/search/types.ts +5 -1
@@ -102,14 +102,18 @@
102
102
  }
103
103
  }
104
104
 
105
- // Sort children by timestamp
106
- function sortChildren(node) {
105
+ // Sort children by timestamp. Use an explicit stack so valid, deep
106
+ // conversation chains do not exhaust the browser call stack.
107
+ const sortStack = [...roots];
108
+ while (sortStack.length > 0) {
109
+ const node = sortStack.pop();
107
110
  node.children.sort((a, b) =>
108
111
  new Date(a.entry.timestamp).getTime() - new Date(b.entry.timestamp).getTime()
109
112
  );
110
- node.children.forEach(sortChildren);
113
+ for (let i = node.children.length - 1; i >= 0; i--) {
114
+ sortStack.push(node.children[i]);
115
+ }
111
116
  }
112
- roots.forEach(sortChildren);
113
117
 
114
118
  return roots;
115
119
  }
@@ -157,17 +161,27 @@
157
161
  const result = [];
158
162
  const multipleRoots = roots.length > 1;
159
163
 
160
- // Mark which subtrees contain the active leaf
164
+ // Mark which subtrees contain the active leaf. Use iterative post-order
165
+ // traversal so valid, deep conversation chains do not exhaust the
166
+ // browser call stack.
161
167
  const containsActive = new Map();
162
- function markActive(node) {
168
+ const allNodes = [];
169
+ const activeStack = [...roots];
170
+ while (activeStack.length > 0) {
171
+ const node = activeStack.pop();
172
+ allNodes.push(node);
173
+ for (let i = node.children.length - 1; i >= 0; i--) {
174
+ activeStack.push(node.children[i]);
175
+ }
176
+ }
177
+ for (let i = allNodes.length - 1; i >= 0; i--) {
178
+ const node = allNodes[i];
163
179
  let has = activePathIds.has(node.entry.id);
164
180
  for (const child of node.children) {
165
- if (markActive(child)) has = true;
181
+ if (containsActive.get(child)) has = true;
166
182
  }
167
183
  containsActive.set(node, has);
168
- return has;
169
184
  }
170
- roots.forEach(markActive);
171
185
 
172
186
  // Stack: [node, indent, justBranched, showConnector, isLast, gutters, isVirtualRootChild]
173
187
  const stack = [];
@@ -179,17 +179,22 @@ export type SwitchSessionHandler = (sessionPath: string) => Promise<{ cancelled:
179
179
  export type ShutdownHandler = () => void;
180
180
 
181
181
  /**
182
- * Helper function to emit session_shutdown event to extensions.
183
- * Returns true if the event was emitted, false if there were no handlers.
182
+ * Emit `session_shutdown` and clear timers owned by an extension runner.
183
+ *
184
+ * Returns whether any shutdown handlers were present. Timer cleanup runs even
185
+ * when a handler fails so extension background work cannot outlive its host.
184
186
  */
185
187
  export async function emitSessionShutdownEvent(extensionRunner: ExtensionRunner | undefined): Promise<boolean> {
186
- if (extensionRunner?.hasHandlers("session_shutdown")) {
188
+ if (!extensionRunner) return false;
189
+ try {
190
+ if (!extensionRunner.hasHandlers("session_shutdown")) return false;
187
191
  await extensionRunner.emit({
188
192
  type: "session_shutdown",
189
193
  });
190
194
  return true;
195
+ } finally {
196
+ extensionRunner.clearManagedTimers();
191
197
  }
192
- return false;
193
198
  }
194
199
 
195
200
  const noOpUIContext: ExtensionUIContext = {
@@ -543,6 +543,9 @@ export interface ToolDefinition<TParams extends TSchema = TSchema, TDetails = un
543
543
  /** Tool approval tier. Defaults to `"exec"` when omitted.
544
544
  * `"read"`: read-only operations. `"write"`: mutations. `"exec"`: code execution. */
545
545
  approval?: ToolApproval;
546
+ /** Structured-output strict grammar opt-in/out. `false` is meaningful: OpenAI-family
547
+ * serializers preserve an explicit `strict: false` on the wire (#4336/#4340). */
548
+ strict?: boolean;
546
549
  /** MCP server name for discovery/search metadata when this tool fronts an MCP server. */
547
550
  mcpServerName?: string;
548
551
  /** Original MCP tool name for discovery/search metadata. */
@@ -1362,4 +1362,5 @@ export function getPackageDir(): string {
1362
1362
 
1363
1363
  export * from "../index";
1364
1364
  export { formatBytes as formatSize } from "../tools/render-utils";
1365
+ export { copyToClipboard } from "../utils/clipboard";
1365
1366
  export { Type } from "./typebox";
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Compatibility shim for legacy extensions importing the package root of
3
+ * `@earendil-works/pi-tui` or `@mariozechner/pi-tui`.
4
+ *
5
+ * The historical root exported `decodeKittyPrintable`; the canonical TUI now
6
+ * exposes the equivalent, broader `decodePrintableKey` helper. Keep the legacy
7
+ * name available without reintroducing it into the canonical package surface.
8
+ */
9
+ export * from "@oh-my-pi/pi-tui";
10
+ export { decodePrintableKey as decodeKittyPrintable } from "@oh-my-pi/pi-tui";