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.
- package/.npmignore +2 -0
- package/CHANGELOG.md +60 -0
- package/README.md +16 -4
- package/dist/cli/args.d.ts +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +9 -2
- package/dist/cli/args.js.map +1 -1
- package/dist/core/agent-session.d.ts +2 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +80 -1
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +17 -2
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/background-processes.d.ts +11 -0
- package/dist/core/background-processes.d.ts.map +1 -1
- package/dist/core/background-processes.js +115 -9
- package/dist/core/background-processes.js.map +1 -1
- package/dist/core/command-dispatcher.d.ts +16 -0
- package/dist/core/command-dispatcher.d.ts.map +1 -0
- package/dist/core/command-dispatcher.js +678 -0
- package/dist/core/command-dispatcher.js.map +1 -0
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +13 -1
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +2 -2
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +1 -2
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/openrouter-model-catalog.d.ts +9 -0
- package/dist/core/openrouter-model-catalog.d.ts.map +1 -0
- package/dist/core/openrouter-model-catalog.js +139 -0
- package/dist/core/openrouter-model-catalog.js.map +1 -0
- package/dist/core/provider-policy.d.ts +7 -0
- package/dist/core/provider-policy.d.ts.map +1 -0
- package/dist/core/provider-policy.js +19 -0
- package/dist/core/provider-policy.js.map +1 -0
- package/dist/core/settings-manager.d.ts +27 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +38 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +13 -2
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/subagent-background-runs.d.ts +56 -0
- package/dist/core/subagent-background-runs.d.ts.map +1 -0
- package/dist/core/subagent-background-runs.js +275 -0
- package/dist/core/subagent-background-runs.js.map +1 -0
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +3 -0
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/task.d.ts.map +1 -1
- package/dist/core/tools/task.js +39 -35
- package/dist/core/tools/task.js.map +1 -1
- package/dist/core/usage-cost.d.ts +4 -0
- package/dist/core/usage-cost.d.ts.map +1 -0
- package/dist/core/usage-cost.js +28 -0
- package/dist/core/usage-cost.js.map +1 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +16 -2
- package/dist/main.js.map +1 -1
- package/dist/modes/index.d.ts +1 -0
- package/dist/modes/index.d.ts.map +1 -1
- package/dist/modes/index.js +1 -0
- package/dist/modes/index.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +7 -5
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +1 -4
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +1 -2
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +26 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +899 -47
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +11 -1
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +54 -0
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +87 -3
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +69 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/modes/telegram/telegram-bridge-mode.d.ts +15 -0
- package/dist/modes/telegram/telegram-bridge-mode.d.ts.map +1 -0
- package/dist/modes/telegram/telegram-bridge-mode.js +2135 -0
- package/dist/modes/telegram/telegram-bridge-mode.js.map +1 -0
- package/docs/cli-reference.md +20 -3
- package/docs/configuration.md +27 -3
- package/docs/interactive-mode.md +15 -2
- package/docs/rpc-json-sdk.md +23 -0
- package/docs/sessions-traces-export.md +2 -2
- package/examples/extensions/README.md +1 -2
- package/package.json +4 -3
- 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"]}
|
package/dist/main.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
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> ...`);
|