@hachej/boring-agent 0.1.66 → 0.1.68

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.
@@ -1121,7 +1121,7 @@ function readApiKeyEnv(candidates) {
1121
1121
  function buildOpenAICompatibleProviderConfig(opts) {
1122
1122
  return {
1123
1123
  baseUrl: opts.baseUrl,
1124
- apiKey: opts.apiKeyEnv,
1124
+ apiKey: `$${opts.apiKeyEnv}`,
1125
1125
  api: "openai-completions",
1126
1126
  models: opts.models.map((model) => ({
1127
1127
  id: model.id,
@@ -1387,7 +1387,10 @@ function resolveDefaultModel(modelRegistry) {
1387
1387
  const configured = readConfiguredDefaultModel();
1388
1388
  if (configured) {
1389
1389
  const model = modelRegistry.find(configured.provider, configured.id);
1390
- if (model) return model;
1390
+ const getAvailable = modelRegistry.getAvailable;
1391
+ if (!model || typeof getAvailable !== "function") return model;
1392
+ const available = getAvailable.call(modelRegistry);
1393
+ if (available.some((m) => m.provider === model.provider && m.id === model.id)) return model;
1391
1394
  }
1392
1395
  return void 0;
1393
1396
  }
@@ -1441,10 +1444,11 @@ function createResourceSettingsManager(cwd, agentDir, piPackages) {
1441
1444
  }
1442
1445
  async function applyRequestedSessionOptions(handle, input, options = {}) {
1443
1446
  const requestedModel = resolveRequestedModel(handle.modelRegistry, input, { strict: options.strictModelResolution });
1444
- if (requestedModel) {
1447
+ const nextModel = requestedModel ?? resolveDefaultModel(handle.modelRegistry);
1448
+ if (nextModel) {
1445
1449
  const current = handle.piSession.model;
1446
- if (!current || current.provider !== requestedModel.provider || current.id !== requestedModel.id) {
1447
- await handle.piSession.setModel(requestedModel);
1450
+ if (!current || current.provider !== nextModel.provider || current.id !== nextModel.id) {
1451
+ await handle.piSession.setModel(nextModel);
1448
1452
  }
1449
1453
  }
1450
1454
  if (input.thinkingLevel) {
@@ -2453,7 +2453,7 @@ function createRuntimeLoader(config, options) {
2453
2453
  };
2454
2454
  }
2455
2455
  async function createRuntime(config, options) {
2456
- const harnessFactory = config.harnessFactory ?? (await import("./createHarness-LA2OO2DL.js")).createPiCodingAgentHarness;
2456
+ const harnessFactory = config.harnessFactory ?? (await import("./createHarness-AKNHI4JZ.js")).createPiCodingAgentHarness;
2457
2457
  const harnessInput = {
2458
2458
  tools: config.tools ?? [],
2459
2459
  cwd: config.workdir ?? DEFAULT_WORKDIR,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createAgent
3
- } from "../chunk-NKP5AR4C.js";
3
+ } from "../chunk-GP426ZQ3.js";
4
4
  import {
5
5
  AGENT_NOT_IMPLEMENTED_UNTIL_T1,
6
6
  AgentNotImplementedError
@@ -4,7 +4,7 @@ import {
4
4
  deriveSourcePlugin,
5
5
  mergePiPackageSources,
6
6
  withPiHarnessDefaults
7
- } from "./chunk-HHW2UNBK.js";
7
+ } from "./chunk-7Z4K2MMT.js";
8
8
  import "./chunk-AQBXNPMD.js";
9
9
  import "./chunk-AJZHR626.js";
10
10
  import "./chunk-XZKU7FBV.js";
@@ -690,6 +690,39 @@ interface ArtifactOpenProviderProps {
690
690
  declare function ArtifactOpenProvider({ onOpenArtifact, children }: ArtifactOpenProviderProps): react.JSX.Element;
691
691
  declare function useOpenArtifact(): OpenArtifactHandler | null;
692
692
 
693
+ type SelectorTrigger = 'button' | 'slash';
694
+ declare const ModelSelectTrigger: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<react.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref">, "value"> & {
695
+ value: ModelSelection | null;
696
+ options: AvailableModel[];
697
+ disabled?: boolean;
698
+ trigger?: SelectorTrigger;
699
+ open?: boolean;
700
+ } & react.RefAttributes<HTMLButtonElement>>;
701
+ declare function ModelPickerMenu({ value, onChange, options, disabled, hideDefaultOption, onClose, className, }: {
702
+ value: ModelSelection | null;
703
+ onChange: (next: ModelSelection | null) => void;
704
+ options: AvailableModel[];
705
+ disabled?: boolean;
706
+ hideDefaultOption?: boolean;
707
+ onClose?: () => void;
708
+ className?: string;
709
+ }): react.JSX.Element;
710
+ /**
711
+ * Model picker whose options are pi-coding-agent's actual available
712
+ * models (fetched from /api/v1/agent/models). Groups by provider and
713
+ * shows a concise human-friendly label with the raw pi id as the
714
+ * option's stored value, encoded as "{provider}:{id}" to keep
715
+ * ids stable across providers.
716
+ */
717
+ declare function ModelSelect({ value, onChange, options, disabled, trigger, openSignal, }: {
718
+ value: ModelSelection | null;
719
+ onChange: (next: ModelSelection | null) => void;
720
+ options: AvailableModel[];
721
+ disabled?: boolean;
722
+ trigger?: SelectorTrigger;
723
+ openSignal?: unknown;
724
+ }): react.JSX.Element;
725
+
693
726
  interface AgentCommandContribution {
694
727
  id: string;
695
728
  title: string;
@@ -771,4 +804,4 @@ declare const CodeBlock: ({ code, language, showLineNumbers, className, children
771
804
 
772
805
  declare function cn(...inputs: ClassValue[]): string;
773
806
 
774
- export { type AgentCommandContribution, type AgentCommandOptions, ArtifactOpenProvider, ChatEmptyState, type ChatEmptyStateProps, PiChatPanel as ChatPanel, type PiChatPanelProps as ChatPanelProps, type ChatSuggestion, CodeBlock, type CommandRegistry, type ComposerBlocker, type ComposerBlockerAction, Conversation, ConversationContent, ConversationScrollButton, DebugDrawer, type GroupedToolEntry, Message, MessageAction, MessageActions, MessageContent, MessageResponse, type OpenArtifactHandler, type ParsedCommand, PiChatPanel, type PiChatPanelProps, SessionBrowser as PiSessionBrowser, type PiSessionCreateInit, SessionList as PiSessionList, type PiSessionSearchItem, type PiSessionSearchOptions, type PiSessionSearchSortMode, PromptInput, PromptInputFooter, PromptInputSubmit, PromptInputTextarea, Reasoning, ReasoningContent, ReasoningTrigger, type SessionListProps, type SlashCommand, type SlashCommandContext, ToolCallGroup, type ToolPart, type ToolRenderer, type ToolRendererOverrides, type UploadFileOptions, type UploadFileResult, type UsePiSessionsOptions, type UsePiSessionsResult, activeSessionStorageKey, builtinCommands, clearActiveSessionId, cn, createCommandRegistry, defaultChatSuggestions, defaultToolRenderers, getAgentCommands, matchPiSessionSearch, mergeShadcnToolRenderers, mergeToolRenderers, parsePiSessionSearchQuery, parseSlashCommand, readActiveSessionId, resolveToolRenderer, searchPiSessions, uploadFile, useOpenArtifact, usePiSessions, writeActiveSessionId };
807
+ export { type AgentCommandContribution, type AgentCommandOptions, ArtifactOpenProvider, type AvailableModel, ChatEmptyState, type ChatEmptyStateProps, PiChatPanel as ChatPanel, type PiChatPanelProps as ChatPanelProps, type ChatSuggestion, CodeBlock, type CommandRegistry, type ComposerBlocker, type ComposerBlockerAction, Conversation, ConversationContent, ConversationScrollButton, DebugDrawer, type GroupedToolEntry, Message, MessageAction, MessageActions, MessageContent, MessageResponse, ModelPickerMenu, ModelSelect, ModelSelectTrigger, type ModelSelection, type OpenArtifactHandler, type ParsedCommand, PiChatPanel, type PiChatPanelProps, SessionBrowser as PiSessionBrowser, type PiSessionCreateInit, SessionList as PiSessionList, type PiSessionSearchItem, type PiSessionSearchOptions, type PiSessionSearchSortMode, PromptInput, PromptInputFooter, PromptInputSubmit, PromptInputTextarea, Reasoning, ReasoningContent, ReasoningTrigger, type SessionListProps, type SlashCommand, type SlashCommandContext, ToolCallGroup, type ToolPart, type ToolRenderer, type ToolRendererOverrides, type UploadFileOptions, type UploadFileResult, type UsePiSessionsOptions, type UsePiSessionsResult, activeSessionStorageKey, builtinCommands, clearActiveSessionId, cn, createCommandRegistry, defaultChatSuggestions, defaultToolRenderers, getAgentCommands, matchPiSessionSearch, mergeShadcnToolRenderers, mergeToolRenderers, parsePiSessionSearchQuery, parseSlashCommand, readActiveSessionId, resolveToolRenderer, searchPiSessions, uploadFile, useOpenArtifact, usePiSessions, writeActiveSessionId };
@@ -8192,6 +8192,62 @@ function ModelPickerMenu({
8192
8192
  ] })
8193
8193
  ] }) });
8194
8194
  }
8195
+ function ModelSelect({
8196
+ value,
8197
+ onChange,
8198
+ options,
8199
+ disabled,
8200
+ trigger = "button",
8201
+ openSignal
8202
+ }) {
8203
+ const [open, setOpen] = useState16(false);
8204
+ const previousOpenSignalRef = useRef13(openSignal);
8205
+ useEffect17(() => {
8206
+ if (disabled) setOpen(false);
8207
+ }, [disabled]);
8208
+ useEffect17(() => {
8209
+ if (disabled || openSignal === void 0) {
8210
+ previousOpenSignalRef.current = openSignal;
8211
+ return;
8212
+ }
8213
+ if (previousOpenSignalRef.current !== openSignal) setOpen(true);
8214
+ previousOpenSignalRef.current = openSignal;
8215
+ }, [disabled, openSignal]);
8216
+ return /* @__PURE__ */ jsxs25(Popover, { open, onOpenChange: disabled ? void 0 : setOpen, children: [
8217
+ /* @__PURE__ */ jsx27(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx27(
8218
+ ModelSelectTrigger,
8219
+ {
8220
+ value,
8221
+ options,
8222
+ disabled,
8223
+ trigger,
8224
+ open
8225
+ }
8226
+ ) }),
8227
+ /* @__PURE__ */ jsx27(
8228
+ PopoverContent,
8229
+ {
8230
+ align: trigger === "slash" ? "center" : "start",
8231
+ side: "top",
8232
+ sideOffset: trigger === "slash" ? 54 : 6,
8233
+ collisionPadding: 12,
8234
+ "data-boring-agent": "",
8235
+ className: cn("w-[min(92vw,340px)]", selectorContentClass),
8236
+ children: /* @__PURE__ */ jsx27(
8237
+ ModelPickerMenu,
8238
+ {
8239
+ value,
8240
+ onChange,
8241
+ options,
8242
+ disabled,
8243
+ onClose: () => setOpen(false),
8244
+ className: "mb-0 rounded-none border-0 bg-transparent shadow-none"
8245
+ }
8246
+ )
8247
+ }
8248
+ )
8249
+ ] });
8250
+ }
8195
8251
  var ThinkingSelectTrigger = forwardRef(function ThinkingSelectTrigger2({
8196
8252
  value,
8197
8253
  disabled,
@@ -10577,6 +10633,9 @@ export {
10577
10633
  MessageActions,
10578
10634
  MessageContent,
10579
10635
  MessageResponse,
10636
+ ModelPickerMenu,
10637
+ ModelSelect,
10638
+ ModelSelectTrigger,
10580
10639
  PiChatPanel,
10581
10640
  SessionBrowser as PiSessionBrowser,
10582
10641
  SessionList as PiSessionList,
@@ -7,7 +7,7 @@ import {
7
7
  createAgent,
8
8
  createAgentRuntimeBridge,
9
9
  normalizeMeteringUsage
10
- } from "../chunk-NKP5AR4C.js";
10
+ } from "../chunk-GP426ZQ3.js";
11
11
  import "../chunk-WSQ5QNIY.js";
12
12
  import {
13
13
  FollowUpPayloadSchema,
@@ -31,7 +31,7 @@ import {
31
31
  registerConfiguredModelProviders,
32
32
  setEnvDefault,
33
33
  withPiHarnessDefaults
34
- } from "../chunk-HHW2UNBK.js";
34
+ } from "../chunk-7Z4K2MMT.js";
35
35
  import {
36
36
  safeCapture
37
37
  } from "../chunk-AQBXNPMD.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hachej/boring-agent",
3
- "version": "0.1.66",
3
+ "version": "0.1.68",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "description": "Pane-embeddable coding agent. Ships direct/local/vercel-sandbox execution modes behind one interface.",
@@ -79,7 +79,7 @@
79
79
  "use-stick-to-bottom": "^1.1.6",
80
80
  "yaml": "^2.9.0",
81
81
  "zod": "^3.25.76",
82
- "@hachej/boring-ui-kit": "0.1.66"
82
+ "@hachej/boring-ui-kit": "0.1.68"
83
83
  },
84
84
  "devDependencies": {
85
85
  "@antithesishq/bombadil": "0.6.1",