@oh-my-pi/pi-coding-agent 13.9.2 → 13.9.4

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 (53) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/examples/sdk/02-custom-model.ts +2 -1
  3. package/package.json +7 -7
  4. package/src/cli/args.ts +10 -6
  5. package/src/cli/list-models.ts +2 -2
  6. package/src/commands/launch.ts +3 -3
  7. package/src/config/model-registry.ts +136 -38
  8. package/src/config/model-resolver.ts +47 -21
  9. package/src/config/settings-schema.ts +56 -2
  10. package/src/discovery/helpers.ts +3 -3
  11. package/src/extensibility/custom-tools/types.ts +2 -0
  12. package/src/extensibility/extensions/loader.ts +3 -2
  13. package/src/extensibility/extensions/types.ts +10 -7
  14. package/src/extensibility/hooks/types.ts +2 -0
  15. package/src/main.ts +5 -22
  16. package/src/memories/index.ts +7 -3
  17. package/src/modes/components/footer.ts +10 -8
  18. package/src/modes/components/model-selector.ts +33 -38
  19. package/src/modes/components/settings-defs.ts +32 -3
  20. package/src/modes/components/settings-selector.ts +16 -5
  21. package/src/modes/components/status-line/context-thresholds.ts +68 -0
  22. package/src/modes/components/status-line/segments.ts +11 -12
  23. package/src/modes/components/status-line.ts +2 -6
  24. package/src/modes/components/thinking-selector.ts +7 -7
  25. package/src/modes/components/tree-selector.ts +3 -2
  26. package/src/modes/controllers/command-controller.ts +11 -26
  27. package/src/modes/controllers/event-controller.ts +16 -3
  28. package/src/modes/controllers/input-controller.ts +4 -2
  29. package/src/modes/controllers/selector-controller.ts +5 -4
  30. package/src/modes/interactive-mode.ts +2 -2
  31. package/src/modes/rpc/rpc-client.ts +5 -10
  32. package/src/modes/rpc/rpc-types.ts +5 -5
  33. package/src/modes/theme/theme.ts +8 -3
  34. package/src/priority.json +1 -0
  35. package/src/prompts/system/auto-handoff-threshold-focus.md +1 -0
  36. package/src/prompts/system/system-prompt.md +18 -2
  37. package/src/prompts/tools/hashline.md +139 -83
  38. package/src/sdk.ts +24 -16
  39. package/src/session/agent-session.ts +261 -118
  40. package/src/session/agent-storage.ts +14 -14
  41. package/src/session/compaction/compaction.ts +500 -13
  42. package/src/session/messages.ts +12 -1
  43. package/src/session/session-manager.ts +77 -19
  44. package/src/slash-commands/builtin-registry.ts +48 -0
  45. package/src/task/agents.ts +3 -2
  46. package/src/task/executor.ts +2 -2
  47. package/src/task/types.ts +2 -1
  48. package/src/thinking.ts +87 -0
  49. package/src/tools/browser.ts +15 -6
  50. package/src/tools/fetch.ts +118 -100
  51. package/src/tools/index.ts +2 -1
  52. package/src/web/kagi.ts +62 -7
  53. package/src/web/search/providers/exa.ts +74 -3
package/src/sdk.ts CHANGED
@@ -1,5 +1,12 @@
1
- import { Agent, type AgentEvent, type AgentMessage, type AgentTool, INTENT_FIELD } from "@oh-my-pi/pi-agent-core";
2
- import { type Message, type Model, supportsXhigh, type ThinkingLevel } from "@oh-my-pi/pi-ai";
1
+ import {
2
+ Agent,
3
+ type AgentEvent,
4
+ type AgentMessage,
5
+ type AgentTool,
6
+ INTENT_FIELD,
7
+ type ThinkingLevel,
8
+ } from "@oh-my-pi/pi-agent-core";
9
+ import type { Message, Model } from "@oh-my-pi/pi-ai";
3
10
 
4
11
  import { prewarmOpenAICodexResponses } from "@oh-my-pi/pi-ai/providers/openai-codex-responses";
5
12
  import type { Component } from "@oh-my-pi/pi-tui";
@@ -72,6 +79,7 @@ import {
72
79
  loadProjectContextFiles as loadContextFilesInternal,
73
80
  } from "./system-prompt";
74
81
  import { AgentOutputManager } from "./task/output-manager";
82
+ import { resolveThinkingLevelForModel, toReasoningEffort } from "./thinking";
75
83
  import {
76
84
  BashTool,
77
85
  BUILTIN_TOOLS,
@@ -117,10 +125,10 @@ export interface CreateAgentSessionOptions {
117
125
  /** Raw model pattern string (e.g. from --model CLI flag) to resolve after extensions load.
118
126
  * Used when model lookup is deferred because extension-provided models aren't registered yet. */
119
127
  modelPattern?: string;
120
- /** Thinking level. Default: from settings, else 'off' (clamped to model capabilities) */
128
+ /** Thinking selector. Default: from settings, else unset */
121
129
  thinkingLevel?: ThinkingLevel;
122
130
  /** Models available for cycling (Ctrl+P in interactive mode) */
123
- scopedModels?: Array<{ model: Model; thinkingLevel: ThinkingLevel }>;
131
+ scopedModels?: Array<{ model: Model; thinkingLevel?: ThinkingLevel }>;
124
132
 
125
133
  /** System prompt. String replaces default, function receives default and returns final. */
126
134
  systemPrompt?: string | ((defaultPrompt: string) => string);
@@ -456,12 +464,13 @@ function createCustomToolsExtension(tools: CustomTool[]): ExtensionFactory {
456
464
  runOnSession({ reason: "shutdown", previousSessionFile: undefined }, ctx),
457
465
  );
458
466
  api.on("auto_compaction_start", async (event, ctx) =>
459
- runOnSession({ reason: "auto_compaction_start", trigger: event.reason }, ctx),
467
+ runOnSession({ reason: "auto_compaction_start", trigger: event.reason, action: event.action }, ctx),
460
468
  );
461
469
  api.on("auto_compaction_end", async (event, ctx) =>
462
470
  runOnSession(
463
471
  {
464
472
  reason: "auto_compaction_end",
473
+ action: event.action,
465
474
  result: event.result,
466
475
  aborted: event.aborted,
467
476
  willRetry: event.willRetry,
@@ -696,7 +705,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
696
705
 
697
706
  // If session has data and includes a thinking entry, restore it
698
707
  if (thinkingLevel === undefined && hasExistingSession && hasThinkingEntry) {
699
- thinkingLevel = existingSession.thinkingLevel as ThinkingLevel;
708
+ thinkingLevel = existingSession.thinkingLevel as ThinkingLevel | undefined;
700
709
  }
701
710
 
702
711
  if (thinkingLevel === undefined && !hasExplicitModel && !hasThinkingEntry && defaultRoleSpec.explicitThinkingLevel) {
@@ -705,14 +714,10 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
705
714
 
706
715
  // Fall back to settings default
707
716
  if (thinkingLevel === undefined) {
708
- thinkingLevel = settings.get("defaultThinkingLevel") ?? "off";
717
+ thinkingLevel = settings.get("defaultThinkingLevel");
709
718
  }
710
-
711
- // Clamp to model capabilities
712
- if (!model || !model.reasoning) {
713
- thinkingLevel = "off";
714
- } else if (thinkingLevel === "xhigh" && !supportsXhigh(model)) {
715
- thinkingLevel = "high";
719
+ if (model) {
720
+ thinkingLevel = resolveThinkingLevelForModel(model, thinkingLevel);
716
721
  }
717
722
 
718
723
  let skills: Skill[];
@@ -1246,9 +1251,9 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1246
1251
  };
1247
1252
 
1248
1253
  const toolNamesFromRegistry = Array.from(toolRegistry.keys());
1249
- const requestedToolNames = options.toolNames ?? toolNamesFromRegistry;
1254
+ const requestedToolNames = options.toolNames?.map(name => name.toLowerCase()) ?? toolNamesFromRegistry;
1250
1255
  const normalizedRequested = requestedToolNames.filter(name => toolRegistry.has(name));
1251
- const includeExitPlanMode = options.toolNames?.includes("exit_plan_mode") ?? false;
1256
+ const includeExitPlanMode = requestedToolNames.includes("exit_plan_mode");
1252
1257
  const initialToolNames = includeExitPlanMode
1253
1258
  ? normalizedRequested
1254
1259
  : normalizedRequested.filter(name => name !== "exit_plan_mode");
@@ -1343,12 +1348,13 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1343
1348
  const openaiWebsocketSetting = settings.get("providers.openaiWebsockets") ?? "auto";
1344
1349
  const preferOpenAICodexWebsockets =
1345
1350
  openaiWebsocketSetting === "on" ? true : openaiWebsocketSetting === "off" ? false : undefined;
1351
+ const serviceTierSetting = settings.get("serviceTier");
1346
1352
 
1347
1353
  agent = new Agent({
1348
1354
  initialState: {
1349
1355
  systemPrompt,
1350
1356
  model,
1351
- thinkingLevel,
1357
+ thinkingLevel: toReasoningEffort(thinkingLevel),
1352
1358
  tools: initialTools,
1353
1359
  },
1354
1360
  convertToLlm: convertToLlmFinal,
@@ -1368,6 +1374,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1368
1374
  minP: settings.get("minP") >= 0 ? settings.get("minP") : undefined,
1369
1375
  presencePenalty: settings.get("presencePenalty") >= 0 ? settings.get("presencePenalty") : undefined,
1370
1376
  repetitionPenalty: settings.get("repetitionPenalty") >= 0 ? settings.get("repetitionPenalty") : undefined,
1377
+ serviceTier: serviceTierSetting === "none" ? undefined : serviceTierSetting,
1371
1378
  kimiApiFormat: settings.get("providers.kimiApiFormat") ?? "anthropic",
1372
1379
  preferWebsockets: preferOpenAICodexWebsockets,
1373
1380
  getToolContext: tc => toolContextStore.getContext(tc),
@@ -1418,6 +1425,7 @@ export async function createAgentSession(options: CreateAgentSessionOptions = {}
1418
1425
 
1419
1426
  session = new AgentSession({
1420
1427
  agent,
1428
+ thinkingLevel,
1421
1429
  sessionManager,
1422
1430
  settings,
1423
1431
  scopedModels: options.scopedModels,