iosm-cli 0.2.12 → 0.2.14

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 (102) hide show
  1. package/.npmignore +2 -0
  2. package/CHANGELOG.md +60 -0
  3. package/README.md +16 -4
  4. package/dist/cli/args.d.ts +1 -1
  5. package/dist/cli/args.d.ts.map +1 -1
  6. package/dist/cli/args.js +9 -2
  7. package/dist/cli/args.js.map +1 -1
  8. package/dist/core/agent-session.d.ts +2 -0
  9. package/dist/core/agent-session.d.ts.map +1 -1
  10. package/dist/core/agent-session.js +80 -1
  11. package/dist/core/agent-session.js.map +1 -1
  12. package/dist/core/auth-storage.d.ts.map +1 -1
  13. package/dist/core/auth-storage.js +17 -2
  14. package/dist/core/auth-storage.js.map +1 -1
  15. package/dist/core/background-processes.d.ts +11 -0
  16. package/dist/core/background-processes.d.ts.map +1 -1
  17. package/dist/core/background-processes.js +115 -9
  18. package/dist/core/background-processes.js.map +1 -1
  19. package/dist/core/command-dispatcher.d.ts +16 -0
  20. package/dist/core/command-dispatcher.d.ts.map +1 -0
  21. package/dist/core/command-dispatcher.js +678 -0
  22. package/dist/core/command-dispatcher.js.map +1 -0
  23. package/dist/core/model-registry.d.ts.map +1 -1
  24. package/dist/core/model-registry.js +13 -1
  25. package/dist/core/model-registry.js.map +1 -1
  26. package/dist/core/model-resolver.d.ts +2 -2
  27. package/dist/core/model-resolver.d.ts.map +1 -1
  28. package/dist/core/model-resolver.js +1 -2
  29. package/dist/core/model-resolver.js.map +1 -1
  30. package/dist/core/openrouter-model-catalog.d.ts +9 -0
  31. package/dist/core/openrouter-model-catalog.d.ts.map +1 -0
  32. package/dist/core/openrouter-model-catalog.js +139 -0
  33. package/dist/core/openrouter-model-catalog.js.map +1 -0
  34. package/dist/core/provider-policy.d.ts +7 -0
  35. package/dist/core/provider-policy.d.ts.map +1 -0
  36. package/dist/core/provider-policy.js +19 -0
  37. package/dist/core/provider-policy.js.map +1 -0
  38. package/dist/core/settings-manager.d.ts +27 -0
  39. package/dist/core/settings-manager.d.ts.map +1 -1
  40. package/dist/core/settings-manager.js +38 -0
  41. package/dist/core/settings-manager.js.map +1 -1
  42. package/dist/core/slash-commands.d.ts.map +1 -1
  43. package/dist/core/slash-commands.js +13 -2
  44. package/dist/core/slash-commands.js.map +1 -1
  45. package/dist/core/subagent-background-runs.d.ts +56 -0
  46. package/dist/core/subagent-background-runs.d.ts.map +1 -0
  47. package/dist/core/subagent-background-runs.js +275 -0
  48. package/dist/core/subagent-background-runs.js.map +1 -0
  49. package/dist/core/system-prompt.d.ts.map +1 -1
  50. package/dist/core/system-prompt.js +3 -0
  51. package/dist/core/system-prompt.js.map +1 -1
  52. package/dist/core/tools/task.d.ts.map +1 -1
  53. package/dist/core/tools/task.js +39 -35
  54. package/dist/core/tools/task.js.map +1 -1
  55. package/dist/core/usage-cost.d.ts +4 -0
  56. package/dist/core/usage-cost.d.ts.map +1 -0
  57. package/dist/core/usage-cost.js +28 -0
  58. package/dist/core/usage-cost.js.map +1 -0
  59. package/dist/main.d.ts.map +1 -1
  60. package/dist/main.js +16 -2
  61. package/dist/main.js.map +1 -1
  62. package/dist/modes/index.d.ts +1 -0
  63. package/dist/modes/index.d.ts.map +1 -1
  64. package/dist/modes/index.js +1 -0
  65. package/dist/modes/index.js.map +1 -1
  66. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  67. package/dist/modes/interactive/components/footer.js +7 -5
  68. package/dist/modes/interactive/components/footer.js.map +1 -1
  69. package/dist/modes/interactive/components/login-dialog.d.ts +1 -1
  70. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  71. package/dist/modes/interactive/components/login-dialog.js +1 -4
  72. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  73. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  74. package/dist/modes/interactive/components/oauth-selector.js +1 -2
  75. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  76. package/dist/modes/interactive/interactive-mode.d.ts +26 -0
  77. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  78. package/dist/modes/interactive/interactive-mode.js +899 -47
  79. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  80. package/dist/modes/rpc/rpc-client.d.ts +11 -1
  81. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  82. package/dist/modes/rpc/rpc-client.js +54 -0
  83. package/dist/modes/rpc/rpc-client.js.map +1 -1
  84. package/dist/modes/rpc/rpc-mode.d.ts +1 -1
  85. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  86. package/dist/modes/rpc/rpc-mode.js +87 -3
  87. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  88. package/dist/modes/rpc/rpc-types.d.ts +69 -0
  89. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  90. package/dist/modes/rpc/rpc-types.js.map +1 -1
  91. package/dist/modes/telegram/telegram-bridge-mode.d.ts +15 -0
  92. package/dist/modes/telegram/telegram-bridge-mode.d.ts.map +1 -0
  93. package/dist/modes/telegram/telegram-bridge-mode.js +2135 -0
  94. package/dist/modes/telegram/telegram-bridge-mode.js.map +1 -0
  95. package/docs/cli-reference.md +20 -3
  96. package/docs/configuration.md +27 -3
  97. package/docs/interactive-mode.md +15 -2
  98. package/docs/rpc-json-sdk.md +23 -0
  99. package/docs/sessions-traces-export.md +2 -2
  100. package/examples/extensions/README.md +1 -2
  101. package/package.json +4 -3
  102. package/examples/extensions/antigravity-image-gen.ts +0 -415
@@ -0,0 +1,4 @@
1
+ import type { Api, AssistantMessage, Model } from "@mariozechner/pi-ai";
2
+ export declare function estimateAssistantUsageCost(usage: AssistantMessage["usage"], model: Pick<Model<Api>, "cost"> | undefined): number;
3
+ export declare function resolveAssistantCostWithOpenRouterFallback(message: AssistantMessage, resolveModel?: (provider: string, modelId: string) => Model<Api> | undefined): number;
4
+ //# sourceMappingURL=usage-cost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-cost.d.ts","sourceRoot":"","sources":["../../src/core/usage-cost.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAQxE,wBAAgB,0BAA0B,CACzC,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAChC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,SAAS,GACzC,MAAM,CAcR;AAED,wBAAgB,0CAA0C,CACzD,OAAO,EAAE,gBAAgB,EACzB,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,GAC1E,MAAM,CAOR"}
@@ -0,0 +1,28 @@
1
+ const TOKENS_PER_MILLION = 1_000_000;
2
+ function safeNumber(value) {
3
+ return typeof value === "number" && Number.isFinite(value) ? value : 0;
4
+ }
5
+ export function estimateAssistantUsageCost(usage, model) {
6
+ if (!model)
7
+ return 0;
8
+ const input = safeNumber(usage.input);
9
+ const output = safeNumber(usage.output);
10
+ const cacheRead = safeNumber(usage.cacheRead);
11
+ const cacheWrite = safeNumber(usage.cacheWrite);
12
+ const estimated = (model.cost.input * input +
13
+ model.cost.output * output +
14
+ model.cost.cacheRead * cacheRead +
15
+ model.cost.cacheWrite * cacheWrite) /
16
+ TOKENS_PER_MILLION;
17
+ return estimated > 0 ? estimated : 0;
18
+ }
19
+ export function resolveAssistantCostWithOpenRouterFallback(message, resolveModel) {
20
+ const recorded = safeNumber(message.usage?.cost?.total);
21
+ if (recorded > 0)
22
+ return recorded;
23
+ if (message.provider !== "openrouter" || !resolveModel)
24
+ return recorded;
25
+ const model = resolveModel(message.provider, message.model);
26
+ return estimateAssistantUsageCost(message.usage, model);
27
+ }
28
+ //# sourceMappingURL=usage-cost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-cost.js","sourceRoot":"","sources":["../../src/core/usage-cost.ts"],"names":[],"mappings":"AAEA,MAAM,kBAAkB,GAAG,SAAS,CAAC;AAErC,SAAS,UAAU,CAAC,KAAc;IACjC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,0BAA0B,CACzC,KAAgC,EAChC,KAA2C;IAE3C,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC;IAErB,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,SAAS,GACd,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK;QACxB,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM;QAC1B,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS;QAChC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QACpC,kBAAkB,CAAC;IACpB,OAAO,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,0CAA0C,CACzD,OAAyB,EACzB,YAA4E;IAE5E,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACxD,IAAI,QAAQ,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IAClC,IAAI,OAAO,CAAC,QAAQ,KAAK,YAAY,IAAI,CAAC,YAAY;QAAE,OAAO,QAAQ,CAAC;IAExE,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5D,OAAO,0BAA0B,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACzD,CAAC","sourcesContent":["import type { Api, AssistantMessage, Model } from \"@mariozechner/pi-ai\";\n\nconst TOKENS_PER_MILLION = 1_000_000;\n\nfunction safeNumber(value: unknown): number {\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : 0;\n}\n\nexport function estimateAssistantUsageCost(\n\tusage: AssistantMessage[\"usage\"],\n\tmodel: Pick<Model<Api>, \"cost\"> | undefined,\n): number {\n\tif (!model) return 0;\n\n\tconst input = safeNumber(usage.input);\n\tconst output = safeNumber(usage.output);\n\tconst cacheRead = safeNumber(usage.cacheRead);\n\tconst cacheWrite = safeNumber(usage.cacheWrite);\n\tconst estimated =\n\t\t(model.cost.input * input +\n\t\t\tmodel.cost.output * output +\n\t\t\tmodel.cost.cacheRead * cacheRead +\n\t\t\tmodel.cost.cacheWrite * cacheWrite) /\n\t\tTOKENS_PER_MILLION;\n\treturn estimated > 0 ? estimated : 0;\n}\n\nexport function resolveAssistantCostWithOpenRouterFallback(\n\tmessage: AssistantMessage,\n\tresolveModel?: (provider: string, modelId: string) => Model<Api> | undefined,\n): number {\n\tconst recorded = safeNumber(message.usage?.cost?.total);\n\tif (recorded > 0) return recorded;\n\tif (message.provider !== \"openrouter\" || !resolveModel) return recorded;\n\n\tconst model = resolveModel(message.provider, message.model);\n\treturn estimateAssistantUsageCost(message.usage, model);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyqDH,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,iBA6RxC"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyqDH,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,iBA6SxC"}
package/dist/main.js CHANGED
@@ -32,7 +32,7 @@ import { SettingsManager } from "./core/settings-manager.js";
32
32
  import { printTimings, time } from "./core/timings.js";
33
33
  import { allTools } from "./core/tools/index.js";
34
34
  import { runMigrations, showDeprecationWarnings } from "./migrations.js";
35
- import { InteractiveMode, runPrintMode, runRpcMode } from "./modes/index.js";
35
+ import { InteractiveMode, runPrintMode, runRpcMode, runTelegramBridgeMode } from "./modes/index.js";
36
36
  import { initTheme, stopThemeWatcher } from "./modes/interactive/theme/theme.js";
37
37
  import { buildIosmAgentVerificationPrompt, buildIosmGuideAuthoringPrompt, buildIosmPriorityChecklist, createMetricSnapshot, extractAssistantText, formatMetricSnapshot, getIosmGuidePath, initIosmWorkspace, inspectIosmCycle, listIosmCycles, planIosmCycle, readIosmCycleReport, recordIosmCycleHistory, normalizeIosmGuideMarkdown, writeIosmGuideDocument, } from "./iosm/index.js";
38
38
  /**
@@ -1447,6 +1447,9 @@ async function handleSemanticCommand(args) {
1447
1447
  }
1448
1448
  }
1449
1449
  export async function main(args) {
1450
+ if (args[0] === "telegram") {
1451
+ args = ["--mode", "telegram", ...args.slice(1)];
1452
+ }
1450
1453
  applySessionTraceCliOverrides(args);
1451
1454
  const offlineMode = args.includes("--offline") || isTruthyEnvFlag(process.env[ENV_OFFLINE]) || isTruthyEnvFlag(process.env.PI_OFFLINE);
1452
1455
  if (offlineMode) {
@@ -1540,6 +1543,15 @@ export async function main(args) {
1540
1543
  await listModels(modelRegistry, searchPattern);
1541
1544
  process.exit(0);
1542
1545
  }
1546
+ if (parsed.mode === "telegram") {
1547
+ await runTelegramBridgeMode({
1548
+ rawArgs: args,
1549
+ settingsManager,
1550
+ cliPath: process.argv[1],
1551
+ cwd,
1552
+ });
1553
+ return;
1554
+ }
1543
1555
  // Read piped stdin content (if any) - skip for RPC mode which uses stdin for JSON-RPC
1544
1556
  if (parsed.mode !== "rpc") {
1545
1557
  const stdinContent = await readPipedStdin();
@@ -1623,7 +1635,9 @@ export async function main(args) {
1623
1635
  sessionOptions.customTools = [...(sessionOptions.customTools ?? []), ...mcpTools];
1624
1636
  }
1625
1637
  const { session, modelFallbackMessage } = await createAgentSession(sessionOptions);
1626
- if (!isInteractive && !session.model) {
1638
+ // RPC mode must start even without a preselected model so remote clients
1639
+ // (for example Telegram bridge) can choose one later via /model.
1640
+ if (!isInteractive && mode !== "rpc" && !session.model) {
1627
1641
  console.error(chalk.red("No model selected."));
1628
1642
  console.error(chalk.yellow("\nSelect one explicitly:"));
1629
1643
  console.error(` ${APP_NAME} --provider <provider> --model <model-id> ...`);