comisai 1.0.30 → 1.0.31
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/node_modules/@comis/agent/package.json +1 -1
- package/node_modules/@comis/channels/package.json +1 -1
- package/node_modules/@comis/cli/dist/cli.js +2 -0
- package/node_modules/@comis/cli/dist/client/provider-list.d.ts +40 -0
- package/node_modules/@comis/cli/dist/client/provider-list.js +84 -0
- package/node_modules/@comis/cli/dist/commands/providers.d.ts +25 -0
- package/node_modules/@comis/cli/dist/commands/providers.js +122 -0
- package/node_modules/@comis/cli/dist/wizard/index.d.ts +2 -2
- package/node_modules/@comis/cli/dist/wizard/index.js +1 -1
- package/node_modules/@comis/cli/dist/wizard/non-interactive.js +29 -28
- package/node_modules/@comis/cli/dist/wizard/steps/03-provider.d.ts +11 -5
- package/node_modules/@comis/cli/dist/wizard/steps/03-provider.js +75 -13
- package/node_modules/@comis/cli/dist/wizard/steps/04-credentials.js +70 -12
- package/node_modules/@comis/cli/dist/wizard/steps/05-agent.js +6 -20
- package/node_modules/@comis/cli/dist/wizard/types.d.ts +0 -14
- package/node_modules/@comis/cli/dist/wizard/types.js +0 -24
- package/node_modules/@comis/cli/package.json +1 -1
- package/node_modules/@comis/core/package.json +1 -1
- package/node_modules/@comis/daemon/package.json +1 -1
- package/node_modules/@comis/gateway/package.json +1 -1
- package/node_modules/@comis/infra/package.json +1 -1
- package/node_modules/@comis/memory/package.json +1 -1
- package/node_modules/@comis/scheduler/package.json +1 -1
- package/node_modules/@comis/shared/package.json +1 -1
- package/node_modules/@comis/skills/package.json +1 -1
- package/node_modules/@comis/web/package.json +1 -1
- package/npm-shrinkwrap.json +26 -26
- package/package.json +13 -13
|
@@ -23,6 +23,7 @@ import { registerConfigureCommand } from "./commands/configure.js";
|
|
|
23
23
|
import { registerStatusCommand } from "./commands/status.js";
|
|
24
24
|
import { registerHealthCommand } from "./commands/health.js";
|
|
25
25
|
import { registerModelsCommand } from "./commands/models.js";
|
|
26
|
+
import { registerProvidersCommand } from "./commands/providers.js";
|
|
26
27
|
import { registerPm2Command } from "./commands/pm2.js";
|
|
27
28
|
import { registerSessionsCommand } from "./commands/sessions.js";
|
|
28
29
|
import { registerResetCommand } from "./commands/reset.js";
|
|
@@ -46,6 +47,7 @@ registerConfigureCommand(program);
|
|
|
46
47
|
registerStatusCommand(program);
|
|
47
48
|
registerHealthCommand(program);
|
|
48
49
|
registerModelsCommand(program);
|
|
50
|
+
registerProvidersCommand(program);
|
|
49
51
|
registerPm2Command(program);
|
|
50
52
|
registerSessionsCommand(program);
|
|
51
53
|
registerResetCommand(program);
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared provider-list utility (RPC-first, local catalog fallback).
|
|
3
|
+
*
|
|
4
|
+
* Used by BOTH the wizard's provider selection step
|
|
5
|
+
* (`wizard/steps/03-provider.ts`) AND the `comis providers list` command
|
|
6
|
+
* (`commands/providers.ts`). The single utility avoids duplicating the
|
|
7
|
+
* "try daemon, fall back to pi-ai locally" decision tree across two call
|
|
8
|
+
* sites.
|
|
9
|
+
*
|
|
10
|
+
* RPC-first because the daemon's catalog may be enriched with live scan
|
|
11
|
+
* results that the local pi-ai static registry doesn't know about.
|
|
12
|
+
*
|
|
13
|
+
* Local fallback handles the pre-init use case: the wizard runs *before*
|
|
14
|
+
* the daemon exists for first-time users, and `comis providers list`
|
|
15
|
+
* remains useful when the daemon is stopped.
|
|
16
|
+
*
|
|
17
|
+
* Logging: silent. The catch arms here represent the *normal* fallback
|
|
18
|
+
* flow (daemon not running, daemon returned an unexpected shape), not
|
|
19
|
+
* error conditions. Adding a logger would create noise on every wizard
|
|
20
|
+
* boot. Surfaces above this layer (the wizard prompter, the providers
|
|
21
|
+
* command's output) report the resulting state to the user.
|
|
22
|
+
*
|
|
23
|
+
* @module
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Load the catalog provider list, preferring the daemon RPC and falling
|
|
27
|
+
* back to the local pi-ai catalog when the daemon is unreachable.
|
|
28
|
+
*
|
|
29
|
+
* Contract:
|
|
30
|
+
* - Returns `string[]` (the provider IDs).
|
|
31
|
+
* - Never throws. All error paths are caught internally; the worst-case
|
|
32
|
+
* return is `[]`, which callers translate into a "no providers" UX.
|
|
33
|
+
* - When the RPC succeeds with a valid `{providers, count}` shape, the
|
|
34
|
+
* array is returned verbatim (the daemon already sorts; we trust it).
|
|
35
|
+
* - When the local fallback runs, the result is deduped and sorted.
|
|
36
|
+
*
|
|
37
|
+
* @returns A list of provider IDs from the catalog, or `[]` on total
|
|
38
|
+
* failure.
|
|
39
|
+
*/
|
|
40
|
+
export declare function loadProvidersWithFallback(): Promise<string[]>;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* Shared provider-list utility (RPC-first, local catalog fallback).
|
|
4
|
+
*
|
|
5
|
+
* Used by BOTH the wizard's provider selection step
|
|
6
|
+
* (`wizard/steps/03-provider.ts`) AND the `comis providers list` command
|
|
7
|
+
* (`commands/providers.ts`). The single utility avoids duplicating the
|
|
8
|
+
* "try daemon, fall back to pi-ai locally" decision tree across two call
|
|
9
|
+
* sites.
|
|
10
|
+
*
|
|
11
|
+
* RPC-first because the daemon's catalog may be enriched with live scan
|
|
12
|
+
* results that the local pi-ai static registry doesn't know about.
|
|
13
|
+
*
|
|
14
|
+
* Local fallback handles the pre-init use case: the wizard runs *before*
|
|
15
|
+
* the daemon exists for first-time users, and `comis providers list`
|
|
16
|
+
* remains useful when the daemon is stopped.
|
|
17
|
+
*
|
|
18
|
+
* Logging: silent. The catch arms here represent the *normal* fallback
|
|
19
|
+
* flow (daemon not running, daemon returned an unexpected shape), not
|
|
20
|
+
* error conditions. Adding a logger would create noise on every wizard
|
|
21
|
+
* boot. Surfaces above this layer (the wizard prompter, the providers
|
|
22
|
+
* command's output) report the resulting state to the user.
|
|
23
|
+
*
|
|
24
|
+
* @module
|
|
25
|
+
*/
|
|
26
|
+
import { withClient } from "./rpc-client.js";
|
|
27
|
+
import { createModelCatalog } from "@comis/agent";
|
|
28
|
+
/**
|
|
29
|
+
* Defensive shape narrowing for the daemon RPC response.
|
|
30
|
+
*
|
|
31
|
+
* The daemon's `models.list_providers` handler is expected to return
|
|
32
|
+
* `{ providers: string[]; count: number }` (verified in
|
|
33
|
+
* `packages/daemon/src/rpc/model-handlers.ts:99-106`). We narrow at the
|
|
34
|
+
* call site so a malformed response (e.g., daemon version skew, future
|
|
35
|
+
* shape change) cannot crash the wizard.
|
|
36
|
+
*/
|
|
37
|
+
function isValidProvidersResponse(value) {
|
|
38
|
+
if (value === null || typeof value !== "object")
|
|
39
|
+
return false;
|
|
40
|
+
const candidate = value;
|
|
41
|
+
if (!Array.isArray(candidate.providers))
|
|
42
|
+
return false;
|
|
43
|
+
return candidate.providers.every((p) => typeof p === "string");
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Load the catalog provider list, preferring the daemon RPC and falling
|
|
47
|
+
* back to the local pi-ai catalog when the daemon is unreachable.
|
|
48
|
+
*
|
|
49
|
+
* Contract:
|
|
50
|
+
* - Returns `string[]` (the provider IDs).
|
|
51
|
+
* - Never throws. All error paths are caught internally; the worst-case
|
|
52
|
+
* return is `[]`, which callers translate into a "no providers" UX.
|
|
53
|
+
* - When the RPC succeeds with a valid `{providers, count}` shape, the
|
|
54
|
+
* array is returned verbatim (the daemon already sorts; we trust it).
|
|
55
|
+
* - When the local fallback runs, the result is deduped and sorted.
|
|
56
|
+
*
|
|
57
|
+
* @returns A list of provider IDs from the catalog, or `[]` on total
|
|
58
|
+
* failure.
|
|
59
|
+
*/
|
|
60
|
+
export async function loadProvidersWithFallback() {
|
|
61
|
+
// RPC-first: daemon may have a richer/scanned catalog.
|
|
62
|
+
try {
|
|
63
|
+
const result = await withClient(async (client) => client.call("models.list_providers", {}));
|
|
64
|
+
if (isValidProvidersResponse(result)) {
|
|
65
|
+
return result.providers;
|
|
66
|
+
}
|
|
67
|
+
// Malformed shape -- fall through to local fallback (defensive).
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// Daemon not running, RPC error, or timeout -- fall through.
|
|
71
|
+
}
|
|
72
|
+
// Local fallback via pi-ai static catalog.
|
|
73
|
+
try {
|
|
74
|
+
const catalog = createModelCatalog();
|
|
75
|
+
catalog.loadStatic();
|
|
76
|
+
const providers = [...new Set(catalog.getAll().map((e) => e.provider))].sort();
|
|
77
|
+
return providers;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Catastrophic failure (rare): pi-ai SDK boot failure or similar.
|
|
81
|
+
// Caller's UX layer reports "no providers" on empty result.
|
|
82
|
+
return [];
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider listing CLI command.
|
|
3
|
+
*
|
|
4
|
+
* Provides `comis providers list` for browsing available providers from
|
|
5
|
+
* the live pi-ai catalog (with daemon RPC + local fallback). Status
|
|
6
|
+
* column indicates whether a provider's API key is resolvable from the
|
|
7
|
+
* env (mirrors credential-resolver.ts Source B semantics from
|
|
8
|
+
* 260501-2pz).
|
|
9
|
+
*
|
|
10
|
+
* Mirrors `commands/models.ts` shape -- RPC-first, local catalog
|
|
11
|
+
* fallback, `--format` flag, no `set` subcommand (provider switching
|
|
12
|
+
* goes through `comis agent configure --provider X`).
|
|
13
|
+
*
|
|
14
|
+
* @module
|
|
15
|
+
*/
|
|
16
|
+
import type { Command } from "commander";
|
|
17
|
+
/**
|
|
18
|
+
* Register the `providers` command group on the program.
|
|
19
|
+
*
|
|
20
|
+
* Provides:
|
|
21
|
+
* - `comis providers list` -- browse available providers
|
|
22
|
+
*
|
|
23
|
+
* @param program - The root Commander program
|
|
24
|
+
*/
|
|
25
|
+
export declare function registerProvidersCommand(program: Command): void;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* Provider listing CLI command.
|
|
4
|
+
*
|
|
5
|
+
* Provides `comis providers list` for browsing available providers from
|
|
6
|
+
* the live pi-ai catalog (with daemon RPC + local fallback). Status
|
|
7
|
+
* column indicates whether a provider's API key is resolvable from the
|
|
8
|
+
* env (mirrors credential-resolver.ts Source B semantics from
|
|
9
|
+
* 260501-2pz).
|
|
10
|
+
*
|
|
11
|
+
* Mirrors `commands/models.ts` shape -- RPC-first, local catalog
|
|
12
|
+
* fallback, `--format` flag, no `set` subcommand (provider switching
|
|
13
|
+
* goes through `comis agent configure --provider X`).
|
|
14
|
+
*
|
|
15
|
+
* @module
|
|
16
|
+
*/
|
|
17
|
+
import { getEnvApiKey } from "@mariozechner/pi-ai";
|
|
18
|
+
import { withClient } from "../client/rpc-client.js";
|
|
19
|
+
import { loadProvidersWithFallback } from "../client/provider-list.js";
|
|
20
|
+
import { createModelCatalog } from "@comis/agent";
|
|
21
|
+
import { error, info, json } from "../output/format.js";
|
|
22
|
+
import { withSpinner } from "../output/spinner.js";
|
|
23
|
+
import { renderTable } from "../output/table.js";
|
|
24
|
+
/**
|
|
25
|
+
* Provider IDs that don't need an API key.
|
|
26
|
+
*
|
|
27
|
+
* Mirrors `credential-resolver.ts:25 KEYLESS_PROVIDER_TYPES`. Kept as
|
|
28
|
+
* an independent set here because the CLI's status-column logic must
|
|
29
|
+
* answer "is this keyless?" without booting the full credential-
|
|
30
|
+
* resolver dep graph.
|
|
31
|
+
*/
|
|
32
|
+
const KEYLESS_PROVIDERS = new Set(["ollama", "lm-studio"]);
|
|
33
|
+
/**
|
|
34
|
+
* Load the model count for a single provider via RPC, falling back to
|
|
35
|
+
* the local catalog. Returns 0 if neither source resolves.
|
|
36
|
+
*
|
|
37
|
+
* Mirrors `commands/models.ts:62-83 loadModels()` shape -- same
|
|
38
|
+
* try/catch ladder, same defensive `Array.isArray` narrow.
|
|
39
|
+
*/
|
|
40
|
+
async function getModelCount(provider) {
|
|
41
|
+
try {
|
|
42
|
+
const result = await withClient(async (client) => {
|
|
43
|
+
return (await client.call("models.list", { provider }));
|
|
44
|
+
});
|
|
45
|
+
if (Array.isArray(result))
|
|
46
|
+
return result.length;
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// Daemon not running -- fall through to local catalog.
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
const catalog = createModelCatalog();
|
|
53
|
+
catalog.loadStatic();
|
|
54
|
+
return catalog.getByProvider(provider).length;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return 0;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Resolve the Status column value for a provider.
|
|
62
|
+
*
|
|
63
|
+
* - `keyless` : provider is in `KEYLESS_PROVIDERS` (ollama, lm-studio)
|
|
64
|
+
* - `configured` : pi-ai's `getEnvApiKey` resolves a non-empty key
|
|
65
|
+
* - `missing key` : no env key found
|
|
66
|
+
*
|
|
67
|
+
* Mirrors `credential-resolver.ts` Source B semantics from 260501-2pz.
|
|
68
|
+
* Status reflects only env-key presence; it does NOT include the key
|
|
69
|
+
* value itself (T-260501-kqq-02 information-disclosure threat).
|
|
70
|
+
*/
|
|
71
|
+
function getProviderStatus(provider) {
|
|
72
|
+
if (KEYLESS_PROVIDERS.has(provider))
|
|
73
|
+
return "keyless";
|
|
74
|
+
const key = getEnvApiKey(provider);
|
|
75
|
+
return key && key.length > 0 ? "configured" : "missing key";
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Register the `providers` command group on the program.
|
|
79
|
+
*
|
|
80
|
+
* Provides:
|
|
81
|
+
* - `comis providers list` -- browse available providers
|
|
82
|
+
*
|
|
83
|
+
* @param program - The root Commander program
|
|
84
|
+
*/
|
|
85
|
+
export function registerProvidersCommand(program) {
|
|
86
|
+
const providers = program
|
|
87
|
+
.command("providers")
|
|
88
|
+
.description("Provider management");
|
|
89
|
+
providers
|
|
90
|
+
.command("list")
|
|
91
|
+
.description("List available providers from the catalog")
|
|
92
|
+
.option("--format <format>", 'Output format: "table" or "json"', "table")
|
|
93
|
+
.action(async (options) => {
|
|
94
|
+
try {
|
|
95
|
+
const ids = await withSpinner("Loading providers...", () => loadProvidersWithFallback());
|
|
96
|
+
if (ids.length === 0) {
|
|
97
|
+
info("No providers found in catalog");
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
// Sequentially fetch model counts. With ~11-23 providers this
|
|
101
|
+
// is acceptable (single-digit RPC roundtrips). N+1 batching is
|
|
102
|
+
// a v1.5 enhancement (T-260501-kqq-03 DoS disposition: accept).
|
|
103
|
+
const rows = [];
|
|
104
|
+
for (const id of ids) {
|
|
105
|
+
const modelCount = await getModelCount(id);
|
|
106
|
+
const status = getProviderStatus(id);
|
|
107
|
+
rows.push({ provider: id, modelCount, status });
|
|
108
|
+
}
|
|
109
|
+
if (options.format === "json") {
|
|
110
|
+
json(rows);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
renderTable(["Provider", "Models", "Status"], rows.map((r) => [r.provider, String(r.modelCount), r.status]));
|
|
114
|
+
info(`${rows.length} provider${rows.length !== 1 ? "s" : ""} listed`);
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
118
|
+
error(`Failed to list providers: ${msg}`);
|
|
119
|
+
process.exit(1);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
}
|
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
*
|
|
12
12
|
* @module
|
|
13
13
|
*/
|
|
14
|
-
export type { FlowType, WizardStepId, WizardState, WizardStep, WizardResult, WizardError, ValidationResult, AuthMethod, ChannelConfig, GatewayConfig, ProviderConfig, ToolProviderConfig,
|
|
15
|
-
export { INITIAL_STATE,
|
|
14
|
+
export type { FlowType, WizardStepId, WizardState, WizardStep, WizardResult, WizardError, ValidationResult, AuthMethod, ChannelConfig, GatewayConfig, ProviderConfig, ToolProviderConfig, SupportedToolProvider, } from "./types.js";
|
|
15
|
+
export { INITIAL_STATE, SUPPORTED_CHANNELS, SUPPORTED_TOOL_PROVIDERS, PROVIDER_ENV_KEYS, CHANNEL_ENV_KEYS, TOOL_PROVIDER_ENV_KEYS, } from "./types.js";
|
|
16
16
|
export type { WizardPrompter, SelectOpts, MultiselectOpts, TextOpts, PasswordOpts, ConfirmOpts, Spinner, } from "./prompter.js";
|
|
17
17
|
export { CancelError } from "./prompter.js";
|
|
18
18
|
export { ClackAdapter, createClackAdapter } from "./clack-adapter.js";
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
*
|
|
13
13
|
* @module
|
|
14
14
|
*/
|
|
15
|
-
export { INITIAL_STATE,
|
|
15
|
+
export { INITIAL_STATE, SUPPORTED_CHANNELS, SUPPORTED_TOOL_PROVIDERS, PROVIDER_ENV_KEYS, CHANNEL_ENV_KEYS, TOOL_PROVIDER_ENV_KEYS, } from "./types.js";
|
|
16
16
|
export { CancelError } from "./prompter.js";
|
|
17
17
|
// ---------- Clack Adapter ----------
|
|
18
18
|
export { ClackAdapter, createClackAdapter } from "./clack-adapter.js";
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
import { randomBytes } from "node:crypto";
|
|
17
17
|
import { homedir } from "node:os";
|
|
18
18
|
import { safePath } from "@comis/core";
|
|
19
|
-
import {
|
|
19
|
+
import { createModelCatalog } from "@comis/agent";
|
|
20
20
|
import { validatePort } from "./validators/port.js";
|
|
21
21
|
import { validateAgentName } from "./validators/agent-name.js";
|
|
22
22
|
// ---------- Error ----------
|
|
@@ -36,26 +36,6 @@ export class NonInteractiveError extends Error {
|
|
|
36
36
|
this.field = field;
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
|
-
// ---------- Recommended Models ----------
|
|
40
|
-
/**
|
|
41
|
-
* Default model per provider, matching step 05-agent logic.
|
|
42
|
-
*
|
|
43
|
-
* When no --model flag is provided, the build function selects
|
|
44
|
-
* the recommended model for the given provider.
|
|
45
|
-
*/
|
|
46
|
-
const RECOMMENDED_MODELS = {
|
|
47
|
-
anthropic: "claude-sonnet-4-5-20250929",
|
|
48
|
-
openai: "gpt-4o",
|
|
49
|
-
google: "gemini-2.0-flash",
|
|
50
|
-
groq: "llama-3.3-70b-versatile",
|
|
51
|
-
mistral: "mistral-large-latest",
|
|
52
|
-
deepseek: "deepseek-chat",
|
|
53
|
-
xai: "grok-2",
|
|
54
|
-
together: "meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo",
|
|
55
|
-
cerebras: "llama-3.3-70b",
|
|
56
|
-
openrouter: "anthropic/claude-sonnet-4-5-20250929",
|
|
57
|
-
ollama: "llama3",
|
|
58
|
-
};
|
|
59
39
|
// ---------- Validation ----------
|
|
60
40
|
/**
|
|
61
41
|
* Validate non-interactive options before building state.
|
|
@@ -76,11 +56,28 @@ export function validateNonInteractiveOptions(opts) {
|
|
|
76
56
|
if (!opts.provider || opts.provider.trim().length === 0) {
|
|
77
57
|
throw new NonInteractiveError("--provider is required in non-interactive mode", "provider");
|
|
78
58
|
}
|
|
79
|
-
//
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
59
|
+
// Soft validation: warn for unknown providers but do not throw.
|
|
60
|
+
// Daemon-side guards (260501-2pz credential-resolver, 260501-gyy
|
|
61
|
+
// builtin-provider-guard) catch genuinely-invalid providers downstream
|
|
62
|
+
// when the agent attempts to use the config. This loosening enables
|
|
63
|
+
// forward compat when a new pi-ai version adds a provider before
|
|
64
|
+
// comis releases. The "custom" provider is always allowed (synthetic).
|
|
65
|
+
if (opts.provider !== "custom") {
|
|
66
|
+
try {
|
|
67
|
+
const catalog = createModelCatalog();
|
|
68
|
+
catalog.loadStatic();
|
|
69
|
+
const known = new Set(catalog.getAll().map((e) => e.provider));
|
|
70
|
+
if (!known.has(opts.provider)) {
|
|
71
|
+
// Soft WARN to stderr -- do not throw, do not log credentials.
|
|
72
|
+
// Note: this path runs in CLI bootstrap; we use console.warn
|
|
73
|
+
// because this function may run before any prompter is wired.
|
|
74
|
+
console.warn(` WARN: provider "${opts.provider}" is not in the pi-ai catalog. Continuing for forward compatibility -- daemon-side validation will catch invalid providers.`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Catalog load failed (rare) -- skip the check entirely; let
|
|
79
|
+
// downstream daemon-side guards catch invalid providers.
|
|
80
|
+
}
|
|
84
81
|
}
|
|
85
82
|
// Validate gateway port if specified
|
|
86
83
|
if (opts.gatewayPort !== undefined) {
|
|
@@ -161,8 +158,12 @@ export function buildNonInteractiveState(opts) {
|
|
|
161
158
|
...(opts.apiKey !== undefined && { apiKey: opts.apiKey }),
|
|
162
159
|
validated: !!opts.skipValidation,
|
|
163
160
|
};
|
|
164
|
-
// Model selection --
|
|
165
|
-
|
|
161
|
+
// Model selection -- delegate to daemon when not specified.
|
|
162
|
+
// The literal "default" is resolved at agent-execution time via the
|
|
163
|
+
// pi-ai catalog (builtin-provider-guard.ts:45 baseUrl pattern). Pre-
|
|
164
|
+
// 260501-kqq, this read a hardcoded provider->model map; that lookup
|
|
165
|
+
// was removed -- the daemon decides at runtime.
|
|
166
|
+
const model = opts.model ?? "default";
|
|
166
167
|
// Channel configs
|
|
167
168
|
const channels = [];
|
|
168
169
|
if (opts.channels && opts.channels.length > 0) {
|
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Provider selection step -- step 03 of the init wizard.
|
|
3
3
|
*
|
|
4
|
-
* Presents
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Presents the providers from the live pi-ai catalog (loaded via
|
|
5
|
+
* `loadProvidersWithFallback` -- daemon RPC first, local pi-ai catalog
|
|
6
|
+
* fallback for the pre-init use case) plus a synthetic "custom" option
|
|
7
|
+
* appended last for OpenAI-compatible endpoints. A category overview
|
|
8
|
+
* note is shown before selection to help the user orient. Anthropic is
|
|
7
9
|
* pre-selected as the recommended default.
|
|
8
10
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
+
* Provider IDs not in `PROVIDER_UI_HINTS` render with a capitalize-
|
|
12
|
+
* fallback label and no hint -- new providers added by future pi-ai
|
|
13
|
+
* upgrades flow through automatically with no comis code change.
|
|
14
|
+
*
|
|
15
|
+
* This step only captures the provider choice. API credentials are
|
|
16
|
+
* collected in step 04 (credentials).
|
|
11
17
|
*
|
|
12
18
|
* @module
|
|
13
19
|
*/
|
|
@@ -2,21 +2,77 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Provider selection step -- step 03 of the init wizard.
|
|
4
4
|
*
|
|
5
|
-
* Presents
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* Presents the providers from the live pi-ai catalog (loaded via
|
|
6
|
+
* `loadProvidersWithFallback` -- daemon RPC first, local pi-ai catalog
|
|
7
|
+
* fallback for the pre-init use case) plus a synthetic "custom" option
|
|
8
|
+
* appended last for OpenAI-compatible endpoints. A category overview
|
|
9
|
+
* note is shown before selection to help the user orient. Anthropic is
|
|
8
10
|
* pre-selected as the recommended default.
|
|
9
11
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
+
* Provider IDs not in `PROVIDER_UI_HINTS` render with a capitalize-
|
|
13
|
+
* fallback label and no hint -- new providers added by future pi-ai
|
|
14
|
+
* upgrades flow through automatically with no comis code change.
|
|
15
|
+
*
|
|
16
|
+
* This step only captures the provider choice. API credentials are
|
|
17
|
+
* collected in step 04 (credentials).
|
|
12
18
|
*
|
|
13
19
|
* @module
|
|
14
20
|
*/
|
|
15
|
-
import { updateState, sectionSeparator
|
|
21
|
+
import { updateState, sectionSeparator } from "../index.js";
|
|
22
|
+
import { loadProvidersWithFallback } from "../../client/provider-list.js";
|
|
23
|
+
/**
|
|
24
|
+
* UX-only labels and hints for known providers.
|
|
25
|
+
*
|
|
26
|
+
* Keys here are NOT a closed set of supported providers -- the actual
|
|
27
|
+
* supported set is whatever the pi-ai catalog exposes via
|
|
28
|
+
* `loadProvidersWithFallback()`. This map provides nicer labels for
|
|
29
|
+
* commonly-known providers; unknown providers use the capitalize-
|
|
30
|
+
* fallback path in `getProviderHint`.
|
|
31
|
+
*
|
|
32
|
+
* Excluded: `together` and `ollama`. Neither is in pi-ai 0.71.0's
|
|
33
|
+
* `getProviders()` catalog (`getModels(p)[0]?.baseUrl` is undefined for
|
|
34
|
+
* both), so an entry here would be dead code -- the live catalog
|
|
35
|
+
* never returns those IDs. The capitalize-fallback handles them if
|
|
36
|
+
* pi-ai adds them in a future release.
|
|
37
|
+
*/
|
|
38
|
+
const PROVIDER_UI_HINTS = {
|
|
39
|
+
anthropic: { label: "Anthropic (Claude)", hint: "Recommended for agents", category: "recommended" },
|
|
40
|
+
openai: { label: "OpenAI (GPT)", hint: "GPT-4o, o1, o3 models", category: "recommended" },
|
|
41
|
+
google: { label: "Google (Gemini)", hint: "Gemini models", category: "other" },
|
|
42
|
+
groq: { label: "Groq", hint: "Fast inference (Llama, Mixtral)", category: "other" },
|
|
43
|
+
mistral: { label: "Mistral", hint: "Mistral models", category: "other" },
|
|
44
|
+
deepseek: { label: "DeepSeek", hint: "DeepSeek models", category: "other" },
|
|
45
|
+
xai: { label: "xAI (Grok)", hint: "Grok models", category: "other" },
|
|
46
|
+
cerebras: { label: "Cerebras", hint: "Fast inference", category: "other" },
|
|
47
|
+
openrouter: { label: "OpenRouter", hint: "Multi-provider routing", category: "other" },
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Resolve the UX hint for a provider id. Returns the static hint when
|
|
51
|
+
* present, otherwise computes a capitalize-fallback (matches the web
|
|
52
|
+
* wizard's pattern at packages/web/src/views/setup-wizard.ts:180-193).
|
|
53
|
+
*/
|
|
54
|
+
function getProviderHint(id) {
|
|
55
|
+
// eslint-disable-next-line security/detect-object-injection -- gated by Object.hasOwn against literal record (mirrors web wizard pattern)
|
|
56
|
+
if (Object.hasOwn(PROVIDER_UI_HINTS, id))
|
|
57
|
+
return PROVIDER_UI_HINTS[id];
|
|
58
|
+
return {
|
|
59
|
+
label: id.charAt(0).toUpperCase() + id.slice(1),
|
|
60
|
+
hint: undefined,
|
|
61
|
+
category: "other",
|
|
62
|
+
};
|
|
63
|
+
}
|
|
16
64
|
// ---------- Category Overview ----------
|
|
65
|
+
/**
|
|
66
|
+
* Static overview note shown before the provider select.
|
|
67
|
+
*
|
|
68
|
+
* May drift from the live catalog (e.g., if pi-ai adds a new provider,
|
|
69
|
+
* users still see the same note). Computing this from
|
|
70
|
+
* PROVIDER_UI_HINTS + the loaded catalog is a future enhancement;
|
|
71
|
+
* static is acceptable for v1 since the categories rarely change.
|
|
72
|
+
*/
|
|
17
73
|
const CATEGORY_NOTE = [
|
|
18
74
|
"Recommended: Anthropic, OpenAI",
|
|
19
|
-
"Other: Google, Groq, Mistral, DeepSeek, xAI,
|
|
75
|
+
"Other: Google, Groq, Mistral, DeepSeek, xAI, Cerebras, OpenRouter",
|
|
20
76
|
"Local: Ollama (no API key)",
|
|
21
77
|
"Custom: Your own endpoint",
|
|
22
78
|
].join("\n");
|
|
@@ -28,12 +84,18 @@ export const providerStep = {
|
|
|
28
84
|
prompter.note(sectionSeparator("LLM Provider"));
|
|
29
85
|
// Show category grouping overview before selection
|
|
30
86
|
prompter.note(CATEGORY_NOTE, "Available Providers");
|
|
31
|
-
// Build
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
hint:
|
|
36
|
-
})
|
|
87
|
+
// Build option list from live catalog (RPC-first, local fallback)
|
|
88
|
+
const providerIds = await loadProvidersWithFallback();
|
|
89
|
+
const options = providerIds.map((id) => {
|
|
90
|
+
const hint = getProviderHint(id);
|
|
91
|
+
return { value: id, label: hint.label, hint: hint.hint };
|
|
92
|
+
});
|
|
93
|
+
// Synthetic Custom option (always last, never in catalog)
|
|
94
|
+
options.push({
|
|
95
|
+
value: "custom",
|
|
96
|
+
label: "Custom endpoint",
|
|
97
|
+
hint: "OpenAI-compatible API",
|
|
98
|
+
});
|
|
37
99
|
const selectedId = await prompter.select({
|
|
38
100
|
message: "Which LLM provider will you use?",
|
|
39
101
|
options,
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
* @module
|
|
17
17
|
*/
|
|
18
18
|
import { updateState, sectionSeparator, info, validateApiKey, getKeyPrefix, } from "../index.js";
|
|
19
|
+
import { getModels } from "@mariozechner/pi-ai";
|
|
19
20
|
// ---------- Provider Help URLs ----------
|
|
20
21
|
const PROVIDER_HELP_URLS = {
|
|
21
22
|
anthropic: "https://console.anthropic.com/settings/keys",
|
|
@@ -62,18 +63,75 @@ const AUTH_METHOD_PROVIDERS = {
|
|
|
62
63
|
},
|
|
63
64
|
};
|
|
64
65
|
// ---------- Provider Validation Endpoints ----------
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
66
|
+
/**
|
|
67
|
+
* Path suffixes per provider, RELATIVE to the pi-ai catalog baseUrl.
|
|
68
|
+
*
|
|
69
|
+
* Pi-ai's catalog baseUrl shape is NOT uniform across providers:
|
|
70
|
+
* - HOST-ONLY for anthropic ("https://api.anthropic.com"), mistral, deepseek
|
|
71
|
+
* -> path here must include the version prefix ("/v1/models").
|
|
72
|
+
* - PREFIXED with the version segment for openai ("https://api.openai.com/v1"),
|
|
73
|
+
* google ("/v1beta"), groq ("/openai/v1"), xai ("/v1"), cerebras ("/v1"),
|
|
74
|
+
* openrouter ("/api/v1") -> path here must NOT repeat the version segment;
|
|
75
|
+
* append "/models" only.
|
|
76
|
+
*
|
|
77
|
+
* Composing entry.baseUrl + entry.path therefore produces the canonical /models
|
|
78
|
+
* endpoint for each provider (e.g., https://api.openai.com/v1/models,
|
|
79
|
+
* https://generativelanguage.googleapis.com/v1beta/models,
|
|
80
|
+
* https://api.groq.com/openai/v1/models).
|
|
81
|
+
*
|
|
82
|
+
* Follow-up to 260501-kqq Sub-Fix C: that migration replaced the static
|
|
83
|
+
* PROVIDER_VALIDATION map (which had host-only baseUrls + correct /v1/models
|
|
84
|
+
* suffixes) with the catalog-driven `getValidationEndpoint` helper, but the
|
|
85
|
+
* path-table values were copied verbatim -- producing double-prefixed URLs
|
|
86
|
+
* (e.g., https://api.openai.com/v1/v1/models -> 404) for the 6 providers
|
|
87
|
+
* whose catalog baseUrl includes the version segment. 260501-mvw corrects
|
|
88
|
+
* the table; the helper itself is unchanged.
|
|
89
|
+
*
|
|
90
|
+
* Drift risk: if pi-ai upgrades a provider's baseUrl AND its path convention
|
|
91
|
+
* changes, this table must be updated. Acceptable trade-off -- explicit
|
|
92
|
+
* beats clever (auto-detection of duplicated path segments could mask
|
|
93
|
+
* legitimate future shape changes).
|
|
94
|
+
*
|
|
95
|
+
* Excluded: `together` and `ollama` are NOT in pi-ai 0.71.0's catalog
|
|
96
|
+
* (`getModels(p)[0]?.baseUrl` returns undefined for both). The line-130
|
|
97
|
+
* fallback (`if (!entry) return { valid: true };`) handles them by
|
|
98
|
+
* skipping live validation entirely. For `together` this is a deliberate
|
|
99
|
+
* behavior change vs the pre-260501-kqq state -- live validation against
|
|
100
|
+
* api.together.xyz is now skipped. Users can still target Together via
|
|
101
|
+
* the synthetic `custom` endpoint route.
|
|
102
|
+
*/
|
|
103
|
+
const PROVIDER_VALIDATION_PATHS = {
|
|
104
|
+
// Catalog baseUrl is HOST-ONLY for these providers -> path needs the /v1 prefix.
|
|
105
|
+
anthropic: "/v1/models",
|
|
106
|
+
mistral: "/v1/models",
|
|
107
|
+
deepseek: "/v1/models",
|
|
108
|
+
// Catalog baseUrl ALREADY INCLUDES the version prefix for these providers
|
|
109
|
+
// (e.g., openai's baseUrl is "https://api.openai.com/v1", openrouter's is
|
|
110
|
+
// "https://openrouter.ai/api/v1") -- append /models only.
|
|
111
|
+
openai: "/models",
|
|
112
|
+
google: "/models",
|
|
113
|
+
groq: "/models",
|
|
114
|
+
xai: "/models",
|
|
115
|
+
cerebras: "/models",
|
|
116
|
+
openrouter: "/models",
|
|
76
117
|
};
|
|
118
|
+
/**
|
|
119
|
+
* Resolve the validation endpoint for a provider by reading the catalog
|
|
120
|
+
* baseUrl from pi-ai (260501-gyy precedent: builtin-provider-guard.ts:45)
|
|
121
|
+
* and combining it with a known path from PROVIDER_VALIDATION_PATHS.
|
|
122
|
+
*
|
|
123
|
+
* Returns `undefined` for providers not in the catalog (or providers
|
|
124
|
+
* with no models, e.g., ollama with no remote endpoint) -- callers
|
|
125
|
+
* skip live validation in that case.
|
|
126
|
+
*/
|
|
127
|
+
function getValidationEndpoint(provider) {
|
|
128
|
+
const baseUrl = getModels(provider)[0]?.baseUrl;
|
|
129
|
+
if (!baseUrl)
|
|
130
|
+
return undefined;
|
|
131
|
+
// eslint-disable-next-line security/detect-object-injection -- read of static const map indexed by validated provider string
|
|
132
|
+
const path = PROVIDER_VALIDATION_PATHS[provider] ?? "/v1/models";
|
|
133
|
+
return { baseUrl, path };
|
|
134
|
+
}
|
|
77
135
|
// ---------- Live Validation ----------
|
|
78
136
|
/**
|
|
79
137
|
* Validate an API key against the provider's /models endpoint.
|
|
@@ -91,7 +149,7 @@ async function validateKeyLive(provider, apiKey, authMethod) {
|
|
|
91
149
|
if (authMethod === "oauth") {
|
|
92
150
|
return { valid: true };
|
|
93
151
|
}
|
|
94
|
-
const entry =
|
|
152
|
+
const entry = getValidationEndpoint(provider);
|
|
95
153
|
if (!entry) {
|
|
96
154
|
return { valid: true };
|
|
97
155
|
}
|
|
@@ -11,20 +11,6 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { updateState, sectionSeparator, validateAgentName, } from "../index.js";
|
|
13
13
|
import { createModelCatalog } from "@comis/agent";
|
|
14
|
-
// ---------- Recommended Models Per Provider ----------
|
|
15
|
-
const RECOMMENDED_MODELS = {
|
|
16
|
-
anthropic: "claude-sonnet-4-5-20250929",
|
|
17
|
-
openai: "gpt-4o",
|
|
18
|
-
google: "gemini-2.0-flash",
|
|
19
|
-
groq: "llama-3.3-70b-versatile",
|
|
20
|
-
mistral: "mistral-large-latest",
|
|
21
|
-
deepseek: "deepseek-chat",
|
|
22
|
-
xai: "grok-2",
|
|
23
|
-
together: "meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo",
|
|
24
|
-
cerebras: "llama-3.3-70b",
|
|
25
|
-
openrouter: "anthropic/claude-sonnet-4-5-20250929",
|
|
26
|
-
ollama: "llama3",
|
|
27
|
-
};
|
|
28
14
|
// ---------- Helpers ----------
|
|
29
15
|
function formatModelHint(m) {
|
|
30
16
|
const parts = [];
|
|
@@ -67,8 +53,6 @@ export const agentStep = {
|
|
|
67
53
|
catch {
|
|
68
54
|
// Fallback: empty catalog, will use recommended default only
|
|
69
55
|
}
|
|
70
|
-
const providerId = state.provider?.id ?? "";
|
|
71
|
-
const recommended = RECOMMENDED_MODELS[providerId];
|
|
72
56
|
// 4. QuickStart flow -- use "default" so the daemon picks the model at runtime
|
|
73
57
|
if (state.flow === "quickstart") {
|
|
74
58
|
prompter.log.info("Model: default");
|
|
@@ -87,11 +71,13 @@ export const agentStep = {
|
|
|
87
71
|
label: "Custom model ID...",
|
|
88
72
|
hint: "Enter a model ID manually",
|
|
89
73
|
});
|
|
74
|
+
// Initial value: state.model takes precedence; otherwise the
|
|
75
|
+
// first catalog entry. No hardcoded recommendation lookup --
|
|
76
|
+
// pi-ai's catalog ordering is the source of truth.
|
|
90
77
|
const chosen = await prompter.select({
|
|
91
78
|
message: "Select a model",
|
|
92
79
|
options,
|
|
93
|
-
initialValue: state.model
|
|
94
|
-
?? (recommended && catalogModels.some((m) => m.modelId === recommended) ? recommended : undefined),
|
|
80
|
+
initialValue: state.model ?? catalogModels[0]?.modelId,
|
|
95
81
|
});
|
|
96
82
|
if (chosen === "__custom__") {
|
|
97
83
|
selectedModel = await prompter.text({
|
|
@@ -107,8 +93,8 @@ export const agentStep = {
|
|
|
107
93
|
// Empty catalog -- go directly to custom text input
|
|
108
94
|
selectedModel = await prompter.text({
|
|
109
95
|
message: "Model ID",
|
|
110
|
-
placeholder:
|
|
111
|
-
defaultValue: state.model
|
|
96
|
+
placeholder: state.model ?? "model-name",
|
|
97
|
+
defaultValue: state.model,
|
|
112
98
|
});
|
|
113
99
|
}
|
|
114
100
|
return updateState(state, { agentName, model: selectedModel });
|
|
@@ -134,20 +134,6 @@ export type WizardResult = {
|
|
|
134
134
|
envPath?: string;
|
|
135
135
|
error?: WizardError;
|
|
136
136
|
};
|
|
137
|
-
/** Supported provider entry for selection prompts. */
|
|
138
|
-
export type SupportedProvider = {
|
|
139
|
-
id: string;
|
|
140
|
-
label: string;
|
|
141
|
-
hint?: string;
|
|
142
|
-
category: "recommended" | "other" | "local" | "custom";
|
|
143
|
-
};
|
|
144
|
-
/**
|
|
145
|
-
* All supported LLM providers, grouped by category.
|
|
146
|
-
*
|
|
147
|
-
* Categories: recommended (top picks), other (cloud APIs),
|
|
148
|
-
* local (self-hosted), custom (user-defined endpoints).
|
|
149
|
-
*/
|
|
150
|
-
export declare const SUPPORTED_PROVIDERS: readonly SupportedProvider[];
|
|
151
137
|
/** Supported channel entry for selection prompts. */
|
|
152
138
|
export type SupportedChannel = {
|
|
153
139
|
type: ChannelConfig["type"];
|
|
@@ -9,30 +9,6 @@
|
|
|
9
9
|
*/
|
|
10
10
|
/** Starting state for a new wizard run. */
|
|
11
11
|
export const INITIAL_STATE = { completedSteps: [] };
|
|
12
|
-
/**
|
|
13
|
-
* All supported LLM providers, grouped by category.
|
|
14
|
-
*
|
|
15
|
-
* Categories: recommended (top picks), other (cloud APIs),
|
|
16
|
-
* local (self-hosted), custom (user-defined endpoints).
|
|
17
|
-
*/
|
|
18
|
-
export const SUPPORTED_PROVIDERS = [
|
|
19
|
-
// Recommended
|
|
20
|
-
{ id: "anthropic", label: "Anthropic (Claude)", hint: "Recommended for agents", category: "recommended" },
|
|
21
|
-
{ id: "openai", label: "OpenAI (GPT)", hint: "GPT-4o, o1, o3 models", category: "recommended" },
|
|
22
|
-
// Other Providers
|
|
23
|
-
{ id: "google", label: "Google (Gemini)", hint: "Gemini models", category: "other" },
|
|
24
|
-
{ id: "groq", label: "Groq", hint: "Fast inference (Llama, Mixtral)", category: "other" },
|
|
25
|
-
{ id: "mistral", label: "Mistral", hint: "Mistral models", category: "other" },
|
|
26
|
-
{ id: "deepseek", label: "DeepSeek", hint: "DeepSeek models", category: "other" },
|
|
27
|
-
{ id: "xai", label: "xAI (Grok)", hint: "Grok models", category: "other" },
|
|
28
|
-
{ id: "together", label: "Together AI", hint: "Open-source model hosting", category: "other" },
|
|
29
|
-
{ id: "cerebras", label: "Cerebras", hint: "Fast inference", category: "other" },
|
|
30
|
-
{ id: "openrouter", label: "OpenRouter", hint: "Multi-provider routing", category: "other" },
|
|
31
|
-
// Local
|
|
32
|
-
{ id: "ollama", label: "Ollama (local)", hint: "No API key needed", category: "local" },
|
|
33
|
-
// Custom
|
|
34
|
-
{ id: "custom", label: "Custom endpoint", hint: "OpenAI-compatible API", category: "custom" },
|
|
35
|
-
];
|
|
36
12
|
/** All supported chat channels with credential guidance. */
|
|
37
13
|
export const SUPPORTED_CHANNELS = [
|
|
38
14
|
{ type: "telegram", label: "Telegram", credentialHint: "Bot token from @BotFather" },
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "comisai",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.31",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "comisai",
|
|
9
|
-
"version": "1.0.
|
|
9
|
+
"version": "1.0.31",
|
|
10
10
|
"bundleDependencies": [
|
|
11
11
|
"@comis/shared",
|
|
12
12
|
"@comis/core",
|
|
@@ -26,18 +26,18 @@
|
|
|
26
26
|
"@agentclientprotocol/sdk": "0.19.2",
|
|
27
27
|
"@clack/core": "1.2.0",
|
|
28
28
|
"@clack/prompts": "1.2.0",
|
|
29
|
-
"@comis/agent": "1.0.
|
|
30
|
-
"@comis/channels": "1.0.
|
|
31
|
-
"@comis/cli": "1.0.
|
|
32
|
-
"@comis/core": "1.0.
|
|
33
|
-
"@comis/daemon": "1.0.
|
|
34
|
-
"@comis/gateway": "1.0.
|
|
35
|
-
"@comis/infra": "1.0.
|
|
36
|
-
"@comis/memory": "1.0.
|
|
37
|
-
"@comis/scheduler": "1.0.
|
|
38
|
-
"@comis/shared": "1.0.
|
|
39
|
-
"@comis/skills": "1.0.
|
|
40
|
-
"@comis/web": "1.0.
|
|
29
|
+
"@comis/agent": "1.0.31",
|
|
30
|
+
"@comis/channels": "1.0.31",
|
|
31
|
+
"@comis/cli": "1.0.31",
|
|
32
|
+
"@comis/core": "1.0.31",
|
|
33
|
+
"@comis/daemon": "1.0.31",
|
|
34
|
+
"@comis/gateway": "1.0.31",
|
|
35
|
+
"@comis/infra": "1.0.31",
|
|
36
|
+
"@comis/memory": "1.0.31",
|
|
37
|
+
"@comis/scheduler": "1.0.31",
|
|
38
|
+
"@comis/shared": "1.0.31",
|
|
39
|
+
"@comis/skills": "1.0.31",
|
|
40
|
+
"@comis/web": "1.0.31",
|
|
41
41
|
"@elevenlabs/elevenlabs-js": "2.45.0",
|
|
42
42
|
"@fal-ai/client": "1.9.6",
|
|
43
43
|
"@google/genai": "1.50.1",
|
|
@@ -851,7 +851,7 @@
|
|
|
851
851
|
}
|
|
852
852
|
},
|
|
853
853
|
"node_modules/@comis/agent": {
|
|
854
|
-
"version": "1.0.
|
|
854
|
+
"version": "1.0.31",
|
|
855
855
|
"inBundle": true,
|
|
856
856
|
"license": "Apache-2.0",
|
|
857
857
|
"engines": {
|
|
@@ -859,7 +859,7 @@
|
|
|
859
859
|
}
|
|
860
860
|
},
|
|
861
861
|
"node_modules/@comis/channels": {
|
|
862
|
-
"version": "1.0.
|
|
862
|
+
"version": "1.0.31",
|
|
863
863
|
"inBundle": true,
|
|
864
864
|
"license": "Apache-2.0",
|
|
865
865
|
"engines": {
|
|
@@ -867,7 +867,7 @@
|
|
|
867
867
|
}
|
|
868
868
|
},
|
|
869
869
|
"node_modules/@comis/cli": {
|
|
870
|
-
"version": "1.0.
|
|
870
|
+
"version": "1.0.31",
|
|
871
871
|
"inBundle": true,
|
|
872
872
|
"license": "Apache-2.0",
|
|
873
873
|
"bin": {
|
|
@@ -878,7 +878,7 @@
|
|
|
878
878
|
}
|
|
879
879
|
},
|
|
880
880
|
"node_modules/@comis/core": {
|
|
881
|
-
"version": "1.0.
|
|
881
|
+
"version": "1.0.31",
|
|
882
882
|
"inBundle": true,
|
|
883
883
|
"license": "Apache-2.0",
|
|
884
884
|
"engines": {
|
|
@@ -886,7 +886,7 @@
|
|
|
886
886
|
}
|
|
887
887
|
},
|
|
888
888
|
"node_modules/@comis/daemon": {
|
|
889
|
-
"version": "1.0.
|
|
889
|
+
"version": "1.0.31",
|
|
890
890
|
"inBundle": true,
|
|
891
891
|
"license": "Apache-2.0",
|
|
892
892
|
"bin": {
|
|
@@ -900,7 +900,7 @@
|
|
|
900
900
|
}
|
|
901
901
|
},
|
|
902
902
|
"node_modules/@comis/gateway": {
|
|
903
|
-
"version": "1.0.
|
|
903
|
+
"version": "1.0.31",
|
|
904
904
|
"inBundle": true,
|
|
905
905
|
"license": "Apache-2.0",
|
|
906
906
|
"engines": {
|
|
@@ -908,7 +908,7 @@
|
|
|
908
908
|
}
|
|
909
909
|
},
|
|
910
910
|
"node_modules/@comis/infra": {
|
|
911
|
-
"version": "1.0.
|
|
911
|
+
"version": "1.0.31",
|
|
912
912
|
"inBundle": true,
|
|
913
913
|
"license": "Apache-2.0",
|
|
914
914
|
"engines": {
|
|
@@ -916,7 +916,7 @@
|
|
|
916
916
|
}
|
|
917
917
|
},
|
|
918
918
|
"node_modules/@comis/memory": {
|
|
919
|
-
"version": "1.0.
|
|
919
|
+
"version": "1.0.31",
|
|
920
920
|
"inBundle": true,
|
|
921
921
|
"license": "Apache-2.0",
|
|
922
922
|
"engines": {
|
|
@@ -924,7 +924,7 @@
|
|
|
924
924
|
}
|
|
925
925
|
},
|
|
926
926
|
"node_modules/@comis/scheduler": {
|
|
927
|
-
"version": "1.0.
|
|
927
|
+
"version": "1.0.31",
|
|
928
928
|
"inBundle": true,
|
|
929
929
|
"license": "Apache-2.0",
|
|
930
930
|
"engines": {
|
|
@@ -932,7 +932,7 @@
|
|
|
932
932
|
}
|
|
933
933
|
},
|
|
934
934
|
"node_modules/@comis/shared": {
|
|
935
|
-
"version": "1.0.
|
|
935
|
+
"version": "1.0.31",
|
|
936
936
|
"inBundle": true,
|
|
937
937
|
"license": "Apache-2.0",
|
|
938
938
|
"engines": {
|
|
@@ -940,7 +940,7 @@
|
|
|
940
940
|
}
|
|
941
941
|
},
|
|
942
942
|
"node_modules/@comis/skills": {
|
|
943
|
-
"version": "1.0.
|
|
943
|
+
"version": "1.0.31",
|
|
944
944
|
"inBundle": true,
|
|
945
945
|
"license": "Apache-2.0",
|
|
946
946
|
"engines": {
|
|
@@ -948,7 +948,7 @@
|
|
|
948
948
|
}
|
|
949
949
|
},
|
|
950
950
|
"node_modules/@comis/web": {
|
|
951
|
-
"version": "1.0.
|
|
951
|
+
"version": "1.0.31",
|
|
952
952
|
"inBundle": true,
|
|
953
953
|
"license": "Apache-2.0"
|
|
954
954
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "comisai",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.31",
|
|
4
4
|
"author": "Moshe Anconina",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"description": "Security-first AI agent platform — connects AI agents to Discord, Telegram, Slack, WhatsApp, and more",
|
|
@@ -111,18 +111,18 @@
|
|
|
111
111
|
"@comis/web"
|
|
112
112
|
],
|
|
113
113
|
"dependencies": {
|
|
114
|
-
"@comis/shared": "1.0.
|
|
115
|
-
"@comis/core": "1.0.
|
|
116
|
-
"@comis/infra": "1.0.
|
|
117
|
-
"@comis/memory": "1.0.
|
|
118
|
-
"@comis/gateway": "1.0.
|
|
119
|
-
"@comis/skills": "1.0.
|
|
120
|
-
"@comis/scheduler": "1.0.
|
|
121
|
-
"@comis/agent": "1.0.
|
|
122
|
-
"@comis/channels": "1.0.
|
|
123
|
-
"@comis/cli": "1.0.
|
|
124
|
-
"@comis/daemon": "1.0.
|
|
125
|
-
"@comis/web": "1.0.
|
|
114
|
+
"@comis/shared": "1.0.31",
|
|
115
|
+
"@comis/core": "1.0.31",
|
|
116
|
+
"@comis/infra": "1.0.31",
|
|
117
|
+
"@comis/memory": "1.0.31",
|
|
118
|
+
"@comis/gateway": "1.0.31",
|
|
119
|
+
"@comis/skills": "1.0.31",
|
|
120
|
+
"@comis/scheduler": "1.0.31",
|
|
121
|
+
"@comis/agent": "1.0.31",
|
|
122
|
+
"@comis/channels": "1.0.31",
|
|
123
|
+
"@comis/cli": "1.0.31",
|
|
124
|
+
"@comis/daemon": "1.0.31",
|
|
125
|
+
"@comis/web": "1.0.31",
|
|
126
126
|
"@agentclientprotocol/sdk": "0.19.2",
|
|
127
127
|
"@clack/core": "1.2.0",
|
|
128
128
|
"@clack/prompts": "1.2.0",
|