@phi-code-admin/phi-code 0.85.0 → 0.87.0

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 (86) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/README.md +92 -123
  3. package/config/routing.example.json +129 -0
  4. package/config/routing.schema.json +58 -0
  5. package/dist/cli/args.d.ts.map +1 -1
  6. package/dist/cli/args.js +1 -1
  7. package/dist/cli/args.js.map +1 -1
  8. package/dist/config.d.ts.map +1 -1
  9. package/dist/config.js +1 -1
  10. package/dist/config.js.map +1 -1
  11. package/dist/core/sdk.d.ts.map +1 -1
  12. package/dist/core/sdk.js +1 -1
  13. package/dist/core/sdk.js.map +1 -1
  14. package/dist/core/system-prompt.d.ts.map +1 -1
  15. package/dist/core/system-prompt.js +6 -6
  16. package/dist/core/system-prompt.js.map +1 -1
  17. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  18. package/dist/modes/interactive/components/config-selector.js +1 -1
  19. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  20. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  21. package/dist/modes/interactive/interactive-mode.js +2 -2
  22. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  23. package/dist/package-manager-cli.d.ts.map +1 -1
  24. package/dist/package-manager-cli.js +9 -8
  25. package/dist/package-manager-cli.js.map +1 -1
  26. package/dist/utils/pi-user-agent.d.ts.map +1 -1
  27. package/dist/utils/pi-user-agent.js +4 -1
  28. package/dist/utils/pi-user-agent.js.map +1 -1
  29. package/docs/compaction.md +11 -11
  30. package/docs/custom-provider.md +4 -4
  31. package/docs/development.md +2 -2
  32. package/docs/extensions.md +47 -47
  33. package/docs/fork-policy.md +81 -0
  34. package/docs/index.md +7 -7
  35. package/docs/json.md +3 -3
  36. package/docs/keybindings.md +5 -5
  37. package/docs/models.md +6 -6
  38. package/docs/packages.md +37 -37
  39. package/docs/prompt-templates.md +4 -4
  40. package/docs/providers.md +9 -9
  41. package/docs/quickstart.md +25 -25
  42. package/docs/rpc.md +3 -3
  43. package/docs/sdk.md +34 -34
  44. package/docs/session-format.md +4 -4
  45. package/docs/sessions.md +11 -11
  46. package/docs/settings.md +9 -9
  47. package/docs/shell-aliases.md +2 -2
  48. package/docs/skills.md +9 -9
  49. package/docs/terminal-setup.md +7 -7
  50. package/docs/termux.md +6 -6
  51. package/docs/themes.md +9 -9
  52. package/docs/tmux.md +3 -3
  53. package/docs/tui.md +8 -8
  54. package/docs/usage.md +39 -39
  55. package/docs/windows.md +2 -2
  56. package/extensions/phi/agents.ts +12 -117
  57. package/extensions/phi/benchmark.ts +129 -49
  58. package/extensions/phi/browser.ts +10 -37
  59. package/extensions/phi/btw/btw.ts +1 -7
  60. package/extensions/phi/chrome/index.ts +1283 -741
  61. package/extensions/phi/commit.ts +9 -14
  62. package/extensions/phi/goal/index.ts +10 -33
  63. package/extensions/phi/init.ts +37 -47
  64. package/extensions/phi/keys.ts +2 -7
  65. package/extensions/phi/mcp/callback-server.ts +162 -165
  66. package/extensions/phi/mcp/config.ts +122 -136
  67. package/extensions/phi/mcp/errors.ts +18 -23
  68. package/extensions/phi/mcp/index.ts +322 -355
  69. package/extensions/phi/mcp/oauth-provider.ts +289 -289
  70. package/extensions/phi/mcp/server-manager.ts +390 -413
  71. package/extensions/phi/mcp/tool-bridge.ts +381 -415
  72. package/extensions/phi/memory.ts +2 -2
  73. package/extensions/phi/models.ts +27 -26
  74. package/extensions/phi/orchestrator.ts +343 -266
  75. package/extensions/phi/productivity.ts +4 -2
  76. package/extensions/phi/providers/agent-def.ts +128 -0
  77. package/extensions/phi/providers/alibaba.ts +56 -7
  78. package/extensions/phi/providers/context-window.ts +4 -1
  79. package/extensions/phi/providers/live-models.ts +5 -20
  80. package/extensions/phi/providers/orchestrator-helpers.ts +19 -5
  81. package/extensions/phi/providers/phase-machine.ts +220 -0
  82. package/extensions/phi/setup.ts +196 -169
  83. package/extensions/phi/skill-loader.ts +18 -21
  84. package/extensions/phi/smart-router.ts +6 -6
  85. package/extensions/phi/web-search.ts +90 -50
  86. package/package.json +2 -1
@@ -23,7 +23,7 @@ import { readFileSync } from "node:fs";
23
23
  import { access } from "node:fs/promises";
24
24
  import { join } from "node:path";
25
25
  import { Type } from "@sinclair/typebox";
26
- import type { ExtensionAPI, ExtensionContext } from "phi-code";
26
+ import type { ExtensionAPI } from "phi-code";
27
27
  import { SigmaMemory } from "sigma-memory";
28
28
 
29
29
  /**
@@ -717,7 +717,7 @@ violates project rules.
717
717
  if (parts.length > 0) {
718
718
  ctx.ui.notify(`🧠 Memory: ${parts.join(", ")}`, "info");
719
719
  }
720
- } catch (error) {
720
+ } catch (_error) {
721
721
  // Non-critical, don't spam errors
722
722
  }
723
723
  });
@@ -15,15 +15,15 @@
15
15
  * it appear everywhere without restarting Phi Code.
16
16
  */
17
17
 
18
- import { ApiKeyStore, type ConfigWatcher, type ExtensionAPI, getApiKeyStore, getConfigWatcher } from "phi-code";
18
+ import { type ApiKeyStore, type ConfigWatcher, type ExtensionAPI, getApiKeyStore, getConfigWatcher } from "phi-code";
19
19
  import { getModels } from "phi-code-ai";
20
+ import { formatWindow, inferContextWindow, parseContextWindow } from "./providers/context-window.js";
21
+ import { fetchLiveModels, peekCache, resetLiveModelsCache, toPersistedModel } from "./providers/live-models.js";
20
22
  import {
21
23
  buildOpenCodeGoAnthropicProviderConfig,
22
24
  buildOpenCodeGoProviderConfig,
23
25
  getOpenCodeGoModels,
24
26
  } from "./providers/opencode-go.js";
25
- import { formatWindow, inferContextWindow, parseContextWindow } from "./providers/context-window.js";
26
- import { fetchLiveModels, peekCache, resetLiveModelsCache, toPersistedModel } from "./providers/live-models.js";
27
27
 
28
28
  const PROVIDER_DISPLAY: Record<string, string> = {
29
29
  opencode: "OpenCode Zen",
@@ -159,9 +159,8 @@ async function refreshOne(
159
159
  resolvedApiKey?: string,
160
160
  ): Promise<RefreshOutcome> {
161
161
  const stored = store.getProvider(providerId);
162
- const storedKey = stored?.apiKey && !stored.apiKey.startsWith("$") && stored.apiKey !== "local"
163
- ? stored.apiKey
164
- : undefined;
162
+ const storedKey =
163
+ stored?.apiKey && !stored.apiKey.startsWith("$") && stored.apiKey !== "local" ? stored.apiKey : undefined;
165
164
  // Prefer the key stored in models.json, else the one resolved from
166
165
  // auth.json/env by the model registry (providers set up via /auth only).
167
166
  const apiKey = storedKey ?? resolvedApiKey;
@@ -241,15 +240,9 @@ export default function modelsExtension(pi: ExtensionAPI) {
241
240
  await refreshCommand(target, ctx);
242
241
  return;
243
242
  }
244
- ctx.ui.notify(
245
- "Unknown subcommand. Use: `/models [list|refresh] [provider-id]`",
246
- "warning",
247
- );
243
+ ctx.ui.notify("Unknown subcommand. Use: `/models [list|refresh] [provider-id]`", "warning");
248
244
  } catch (err) {
249
- ctx.ui.notify(
250
- `/models error: ${err instanceof Error ? err.message : String(err)}`,
251
- "error",
252
- );
245
+ ctx.ui.notify(`/models error: ${err instanceof Error ? err.message : String(err)}`, "error");
253
246
  }
254
247
  },
255
248
  });
@@ -306,13 +299,17 @@ export default function modelsExtension(pi: ExtensionAPI) {
306
299
  writeOverrides(overrides);
307
300
 
308
301
  // Revert the active model to the persisted/inferred window.
309
- const persistedModels = (store.getProvider(provider)?.models as
310
- | Array<{ id?: string; contextWindow?: number }>
311
- | undefined) ?? [];
302
+ const persistedModels =
303
+ (store.getProvider(provider)?.models as Array<{ id?: string; contextWindow?: number }> | undefined) ??
304
+ [];
312
305
  const persisted = persistedModels.find((m) => m?.id === modelId)?.contextWindow;
313
- const reverted = persisted && persisted > 0 ? persisted : inferContextWindow(modelId, undefined, provider);
306
+ const reverted =
307
+ persisted && persisted > 0 ? persisted : inferContextWindow(modelId, undefined, provider);
314
308
  await pi.setModel({ ...model, contextWindow: reverted });
315
- ctx.ui.notify(`Cleared context override for **${modelId}**. Reverted to \`${formatWindow(reverted)}\`.`, "info");
309
+ ctx.ui.notify(
310
+ `Cleared context override for **${modelId}**. Reverted to \`${formatWindow(reverted)}\`.`,
311
+ "info",
312
+ );
316
313
  return;
317
314
  }
318
315
 
@@ -344,13 +341,13 @@ export default function modelsExtension(pi: ExtensionAPI) {
344
341
  },
345
342
  });
346
343
 
347
- async function listCommand(target: string | undefined, ctx: { ui: { notify: (m: string, t?: "info" | "warning" | "error") => void } }): Promise<void> {
344
+ async function listCommand(
345
+ target: string | undefined,
346
+ ctx: { ui: { notify: (m: string, t?: "info" | "warning" | "error") => void } },
347
+ ): Promise<void> {
348
348
  const providers = target ? [target] : store.listProviders();
349
349
  if (providers.length === 0) {
350
- ctx.ui.notify(
351
- "No providers configured. Run `/setup` or `/phi-init` to add one.",
352
- "info",
353
- );
350
+ ctx.ui.notify("No providers configured. Run `/setup` or `/phi-init` to add one.", "info");
354
351
  return;
355
352
  }
356
353
 
@@ -454,7 +451,10 @@ export default function modelsExtension(pi: ExtensionAPI) {
454
451
  async function refreshCommand(
455
452
  target: string | undefined,
456
453
  ctx: {
457
- ui: { notify: (m: string, t?: "info" | "warning" | "error") => void; setStatus?: (k: string, v?: string) => void };
454
+ ui: {
455
+ notify: (m: string, t?: "info" | "warning" | "error") => void;
456
+ setStatus?: (k: string, v?: string) => void;
457
+ };
458
458
  modelRegistry: {
459
459
  getAvailable(): Array<{ provider: string }>;
460
460
  getApiKeyForProvider(provider: string): Promise<string | undefined>;
@@ -490,7 +490,8 @@ export default function modelsExtension(pi: ExtensionAPI) {
490
490
 
491
491
  let out = "**Refresh report:**\n";
492
492
  for (const o of outcomes) {
493
- const icon = o.source === "live" ? "[ok]" : o.source === "fallback" ? "[fb]" : o.source === "cache" ? "[c]" : "[--]";
493
+ const icon =
494
+ o.source === "live" ? "[ok]" : o.source === "fallback" ? "[fb]" : o.source === "cache" ? "[c]" : "[--]";
494
495
  out += ` ${icon} ${displayName(o.provider)} \`${o.provider}\` — ${o.count} new model(s) (${o.source}${o.error ? `, ${o.error}` : ""})\n`;
495
496
  }
496
497
  out += `\nOnly models missing from the built-in catalog are persisted to \`${store.configPath}\`;\n`;