@crewx/cli 0.8.4-rc.0 → 0.8.4-rc.2
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/README.md +33 -33
- package/bin/crewx +2 -2
- package/dist/commands/agent.js +23 -23
- package/dist/commands/init.js +20 -20
- package/dist/commands/task-db.d.ts +33 -0
- package/dist/commands/task-db.js +107 -0
- package/dist/examples/deny-secrets-plugin.d.ts +22 -0
- package/dist/examples/deny-secrets-plugin.js +40 -0
- package/dist/main.js +72 -72
- package/dist/plugins/examples/echo-hook.d.ts +24 -0
- package/dist/plugins/examples/echo-hook.js +60 -0
- package/dist/plugins/examples/verify-echo-hook.d.ts +8 -0
- package/dist/plugins/examples/verify-echo-hook.js +47 -0
- package/dist/plugins/sqlite-tracing.d.ts +11 -0
- package/dist/plugins/sqlite-tracing.js +19 -0
- package/dist/repository/workspace.repository.d.ts +26 -0
- package/dist/repository/workspace.repository.js +111 -0
- package/dist/schema/tasks.d.ts +7 -0
- package/dist/schema/tasks.js +48 -0
- package/package.json +18 -18
- package/dist/ai-provider.service.d.ts +0 -34
- package/dist/ai-provider.service.js +0 -311
- package/dist/ai-provider.service.js.map +0 -1
- package/dist/ai.service.d.ts +0 -17
- package/dist/ai.service.js +0 -51
- package/dist/ai.service.js.map +0 -1
- package/dist/app.module.d.ts +0 -5
- package/dist/app.module.js +0 -165
- package/dist/app.module.js.map +0 -1
- package/dist/cli/agent.handler.d.ts +0 -2
- package/dist/cli/agent.handler.js +0 -186
- package/dist/cli/agent.handler.js.map +0 -1
- package/dist/cli/builtin.handler.d.ts +0 -3
- package/dist/cli/builtin.handler.js +0 -110
- package/dist/cli/builtin.handler.js.map +0 -1
- package/dist/cli/chat.handler.d.ts +0 -20
- package/dist/cli/chat.handler.js +0 -446
- package/dist/cli/chat.handler.js.map +0 -1
- package/dist/cli/cli.handler.d.ts +0 -4
- package/dist/cli/cli.handler.js +0 -119
- package/dist/cli/cli.handler.js.map +0 -1
- package/dist/cli/doctor.handler.d.ts +0 -38
- package/dist/cli/doctor.handler.js +0 -495
- package/dist/cli/doctor.handler.js.map +0 -1
- package/dist/cli/execute.handler.d.ts +0 -2
- package/dist/cli/execute.handler.js +0 -321
- package/dist/cli/execute.handler.js.map +0 -1
- package/dist/cli/help.handler.d.ts +0 -2
- package/dist/cli/help.handler.js +0 -10
- package/dist/cli/help.handler.js.map +0 -1
- package/dist/cli/init.handler.d.ts +0 -26
- package/dist/cli/init.handler.js +0 -450
- package/dist/cli/init.handler.js.map +0 -1
- package/dist/cli/log.handler.d.ts +0 -2
- package/dist/cli/log.handler.js +0 -69
- package/dist/cli/log.handler.js.map +0 -1
- package/dist/cli/mcp.handler.d.ts +0 -3
- package/dist/cli/mcp.handler.js +0 -121
- package/dist/cli/mcp.handler.js.map +0 -1
- package/dist/cli/query.handler.d.ts +0 -2
- package/dist/cli/query.handler.js +0 -379
- package/dist/cli/query.handler.js.map +0 -1
- package/dist/cli/skill.handler.d.ts +0 -2
- package/dist/cli/skill.handler.js +0 -252
- package/dist/cli/skill.handler.js.map +0 -1
- package/dist/cli/slack-files.handler.d.ts +0 -2
- package/dist/cli/slack-files.handler.js +0 -291
- package/dist/cli/slack-files.handler.js.map +0 -1
- package/dist/cli/template.handler.d.ts +0 -2
- package/dist/cli/template.handler.js +0 -188
- package/dist/cli/template.handler.js.map +0 -1
- package/dist/cli/templates.handler.d.ts +0 -2
- package/dist/cli/templates.handler.js +0 -100
- package/dist/cli/templates.handler.js.map +0 -1
- package/dist/cli-options.d.ts +0 -39
- package/dist/cli-options.js +0 -355
- package/dist/cli-options.js.map +0 -1
- package/dist/config/timeout.config.d.ts +0 -14
- package/dist/config/timeout.config.js +0 -34
- package/dist/config/timeout.config.js.map +0 -1
- package/dist/conversation/base-conversation-history.provider.d.ts +0 -12
- package/dist/conversation/base-conversation-history.provider.js +0 -45
- package/dist/conversation/base-conversation-history.provider.js.map +0 -1
- package/dist/conversation/cli-conversation-history.provider.d.ts +0 -16
- package/dist/conversation/cli-conversation-history.provider.js +0 -111
- package/dist/conversation/cli-conversation-history.provider.js.map +0 -1
- package/dist/conversation/conversation-provider.factory.d.ts +0 -10
- package/dist/conversation/conversation-provider.factory.js +0 -50
- package/dist/conversation/conversation-provider.factory.js.map +0 -1
- package/dist/conversation/index.d.ts +0 -6
- package/dist/conversation/index.js +0 -27
- package/dist/conversation/index.js.map +0 -1
- package/dist/conversation/slack-conversation-history.provider.d.ts +0 -29
- package/dist/conversation/slack-conversation-history.provider.js +0 -302
- package/dist/conversation/slack-conversation-history.provider.js.map +0 -1
- package/dist/crewx.tool.d.ts +0 -359
- package/dist/crewx.tool.js +0 -2501
- package/dist/crewx.tool.js.map +0 -1
- package/dist/crewx.tool.spec.d.ts +0 -1
- package/dist/crewx.tool.spec.js +0 -158
- package/dist/crewx.tool.spec.js.map +0 -1
- package/dist/guards/bearer-auth.guard.d.ts +0 -7
- package/dist/guards/bearer-auth.guard.js +0 -44
- package/dist/guards/bearer-auth.guard.js.map +0 -1
- package/dist/health.controller.d.ts +0 -6
- package/dist/health.controller.js +0 -32
- package/dist/health.controller.js.map +0 -1
- package/dist/main.js.map +0 -1
- package/dist/mcp.controller.d.ts +0 -8
- package/dist/mcp.controller.js +0 -62
- package/dist/mcp.controller.js.map +0 -1
- package/dist/package.json +0 -3
- package/dist/providers/dynamic-provider.factory.d.ts +0 -15
- package/dist/providers/dynamic-provider.factory.js +0 -133
- package/dist/providers/dynamic-provider.factory.js.map +0 -1
- package/dist/providers/logger.adapter.d.ts +0 -6
- package/dist/providers/logger.adapter.js +0 -102
- package/dist/providers/logger.adapter.js.map +0 -1
- package/dist/services/agent-loader.service.d.ts +0 -35
- package/dist/services/agent-loader.service.js +0 -622
- package/dist/services/agent-loader.service.js.map +0 -1
- package/dist/services/auth.service.d.ts +0 -9
- package/dist/services/auth.service.js +0 -47
- package/dist/services/auth.service.js.map +0 -1
- package/dist/services/config-validator.service.d.ts +0 -29
- package/dist/services/config-validator.service.js +0 -483
- package/dist/services/config-validator.service.js.map +0 -1
- package/dist/services/config.service.d.ts +0 -45
- package/dist/services/config.service.js +0 -352
- package/dist/services/config.service.js.map +0 -1
- package/dist/services/document-loader.service.d.ts +0 -21
- package/dist/services/document-loader.service.js +0 -156
- package/dist/services/document-loader.service.js.map +0 -1
- package/dist/services/help.service.d.ts +0 -5
- package/dist/services/help.service.js +0 -139
- package/dist/services/help.service.js.map +0 -1
- package/dist/services/intelligent-compression.service.d.ts +0 -20
- package/dist/services/intelligent-compression.service.js +0 -179
- package/dist/services/intelligent-compression.service.js.map +0 -1
- package/dist/services/mcp-client.service.d.ts +0 -26
- package/dist/services/mcp-client.service.js +0 -81
- package/dist/services/mcp-client.service.js.map +0 -1
- package/dist/services/parallel-processing.service.d.ts +0 -108
- package/dist/services/parallel-processing.service.js +0 -333
- package/dist/services/parallel-processing.service.js.map +0 -1
- package/dist/services/provider-bridge.service.d.ts +0 -35
- package/dist/services/provider-bridge.service.js +0 -224
- package/dist/services/provider-bridge.service.js.map +0 -1
- package/dist/services/remote-agent.service.d.ts +0 -50
- package/dist/services/remote-agent.service.js +0 -171
- package/dist/services/remote-agent.service.js.map +0 -1
- package/dist/services/result-formatter.service.d.ts +0 -27
- package/dist/services/result-formatter.service.js +0 -126
- package/dist/services/result-formatter.service.js.map +0 -1
- package/dist/services/skill-loader.service.d.ts +0 -15
- package/dist/services/skill-loader.service.js +0 -278
- package/dist/services/skill-loader.service.js.map +0 -1
- package/dist/services/skill.service.d.ts +0 -67
- package/dist/services/skill.service.js +0 -670
- package/dist/services/skill.service.js.map +0 -1
- package/dist/services/skill.service.spec.d.ts +0 -1
- package/dist/services/skill.service.spec.js +0 -35
- package/dist/services/skill.service.spec.js.map +0 -1
- package/dist/services/task-management.service.d.ts +0 -65
- package/dist/services/task-management.service.js +0 -288
- package/dist/services/task-management.service.js.map +0 -1
- package/dist/services/template.service.d.ts +0 -61
- package/dist/services/template.service.js +0 -416
- package/dist/services/template.service.js.map +0 -1
- package/dist/services/tool-call.service.d.ts +0 -19
- package/dist/services/tool-call.service.js +0 -1061
- package/dist/services/tool-call.service.js.map +0 -1
- package/dist/services/tracing.service.d.ts +0 -200
- package/dist/services/tracing.service.js +0 -1290
- package/dist/services/tracing.service.js.map +0 -1
- package/dist/slack/formatters/message.formatter.d.ts +0 -32
- package/dist/slack/formatters/message.formatter.js +0 -352
- package/dist/slack/formatters/message.formatter.js.map +0 -1
- package/dist/slack/services/slack-file-download.service.d.ts +0 -58
- package/dist/slack/services/slack-file-download.service.js +0 -558
- package/dist/slack/services/slack-file-download.service.js.map +0 -1
- package/dist/slack/slack-bot.d.ts +0 -33
- package/dist/slack/slack-bot.js +0 -567
- package/dist/slack/slack-bot.js.map +0 -1
- package/dist/stderr.logger.d.ts +0 -8
- package/dist/stderr.logger.js +0 -26
- package/dist/stderr.logger.js.map +0 -1
- package/dist/types/usage.types.d.ts +0 -107
- package/dist/types/usage.types.js +0 -3
- package/dist/types/usage.types.js.map +0 -1
- package/dist/utils/config-utils.d.ts +0 -15
- package/dist/utils/config-utils.js +0 -69
- package/dist/utils/config-utils.js.map +0 -1
- package/dist/utils/extract-text.d.ts +0 -1
- package/dist/utils/extract-text.js +0 -15
- package/dist/utils/extract-text.js.map +0 -1
- package/dist/utils/mcp-installer.d.ts +0 -20
- package/dist/utils/mcp-installer.js +0 -199
- package/dist/utils/mcp-installer.js.map +0 -1
- package/dist/utils/project-hash.d.ts +0 -6
- package/dist/utils/project-hash.js +0 -70
- package/dist/utils/project-hash.js.map +0 -1
- package/dist/utils/simple-security.d.ts +0 -3
- package/dist/utils/simple-security.js +0 -20
- package/dist/utils/simple-security.js.map +0 -1
- package/dist/utils/stdin-utils.d.ts +0 -6
- package/dist/utils/stdin-utils.js +0 -109
- package/dist/utils/stdin-utils.js.map +0 -1
- package/dist/utils/template-processor.d.ts +0 -4
- package/dist/utils/template-processor.js +0 -266
- package/dist/utils/template-processor.js.map +0 -1
- package/dist/utils/terminal-message-formatter.d.ts +0 -23
- package/dist/utils/terminal-message-formatter.js +0 -136
- package/dist/utils/terminal-message-formatter.js.map +0 -1
- package/dist/version.d.ts +0 -1
- package/dist/version.js +0 -17
- package/dist/version.js.map +0 -1
- package/dist/workspace.service.d.ts +0 -44
- package/dist/workspace.service.js +0 -299
- package/dist/workspace.service.js.map +0 -1
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#!/usr/bin/env npx tsx
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Phase 0 e2e verification — EchoHookPlugin logs Claude Code tool calls.
|
|
5
|
+
*
|
|
6
|
+
* Run: npx tsx packages/cli/src/plugins/examples/verify-echo-hook.ts
|
|
7
|
+
* Prereq: claude CLI installed, crewx.yaml with @claude agent
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
const sdk_1 = require("@crewx/sdk");
|
|
11
|
+
const echo_hook_1 = require("./echo-hook");
|
|
12
|
+
const fs_1 = require("fs");
|
|
13
|
+
const path_1 = require("path");
|
|
14
|
+
const os_1 = require("os");
|
|
15
|
+
const LOG_PATH = (0, path_1.join)((0, os_1.homedir)(), '.crewx', 'logs', 'echo-hook.log');
|
|
16
|
+
async function main() {
|
|
17
|
+
if ((0, fs_1.existsSync)(LOG_PATH))
|
|
18
|
+
(0, fs_1.unlinkSync)(LOG_PATH);
|
|
19
|
+
const crewx = await sdk_1.Crewx.loadYaml('crewx.yaml');
|
|
20
|
+
await crewx.use(new echo_hook_1.EchoHookPlugin());
|
|
21
|
+
console.log('[verify] querying @claude with "ls"...');
|
|
22
|
+
await crewx.query('@claude', 'Run ls in the current directory. Use the Bash tool.');
|
|
23
|
+
await crewx.close();
|
|
24
|
+
if (!(0, fs_1.existsSync)(LOG_PATH)) {
|
|
25
|
+
console.error('[FAIL] echo-hook.log not created');
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
const lines = (0, fs_1.readFileSync)(LOG_PATH, 'utf8').trim().split('\n');
|
|
29
|
+
const entries = lines.map((l) => JSON.parse(l));
|
|
30
|
+
const hasBeforeTool = entries.some((e) => e.event === 'beforeTool');
|
|
31
|
+
const hasTraceId = entries.every((e) => e.traceId?.startsWith('tsk_'));
|
|
32
|
+
const hasToolName = entries
|
|
33
|
+
.filter((e) => e.event === 'beforeTool')
|
|
34
|
+
.every((e) => typeof e.tool?.rawName === 'string' && e.tool.rawName.length > 0);
|
|
35
|
+
console.log(`[verify] entries: ${entries.length}`);
|
|
36
|
+
console.log(`[verify] beforeTool: ${hasBeforeTool}`);
|
|
37
|
+
console.log(`[verify] traceId: ${hasTraceId}`);
|
|
38
|
+
console.log(`[verify] toolName: ${hasToolName}`);
|
|
39
|
+
if (hasBeforeTool && hasTraceId && hasToolName) {
|
|
40
|
+
console.log('[PASS] Phase 0 e2e verification passed');
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
console.error('[FAIL] Some checks failed');
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
main().catch((err) => { console.error(err); process.exit(1); });
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Re-export of SqliteTracingPlugin with a CLI-friendly constructor that
|
|
3
|
+
* accepts a plain dbRoot string (in addition to the SDK's options-object form).
|
|
4
|
+
*/
|
|
5
|
+
import { SqliteTracingPlugin as SdkSqliteTracingPlugin } from '@crewx/sdk/plugins';
|
|
6
|
+
export declare class SqliteTracingPlugin extends SdkSqliteTracingPlugin {
|
|
7
|
+
constructor(dbRootOrOpts?: string | {
|
|
8
|
+
dbRoot?: string;
|
|
9
|
+
version?: string;
|
|
10
|
+
});
|
|
11
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SqliteTracingPlugin = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Re-export of SqliteTracingPlugin with a CLI-friendly constructor that
|
|
6
|
+
* accepts a plain dbRoot string (in addition to the SDK's options-object form).
|
|
7
|
+
*/
|
|
8
|
+
const plugins_1 = require("@crewx/sdk/plugins");
|
|
9
|
+
class SqliteTracingPlugin extends plugins_1.SqliteTracingPlugin {
|
|
10
|
+
constructor(dbRootOrOpts) {
|
|
11
|
+
if (typeof dbRootOrOpts === 'string') {
|
|
12
|
+
super({ dbRoot: dbRootOrOpts });
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
super(dbRootOrOpts);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.SqliteTracingPlugin = SqliteTracingPlugin;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import BetterSqlite3 from 'better-sqlite3';
|
|
2
|
+
export interface WorkspaceRepositoryOptions {
|
|
3
|
+
/** Root directory under which `.crewx/crewx.db` lives. Defaults to `os.homedir()`. */
|
|
4
|
+
dbRoot?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class WorkspaceRepository {
|
|
7
|
+
private readonly dbPath;
|
|
8
|
+
constructor(opts?: WorkspaceRepositoryOptions);
|
|
9
|
+
/**
|
|
10
|
+
* Register a CLI workspace in the global CrewX DB.
|
|
11
|
+
*
|
|
12
|
+
* This is intentionally CLI-owned, not SDK-owned: workspace registration is
|
|
13
|
+
* CrewX application metadata, while the SDK only needs pure workspace helpers.
|
|
14
|
+
* Registration is best-effort so `crewx init` remains usable even if tracing
|
|
15
|
+
* DB setup fails.
|
|
16
|
+
*/
|
|
17
|
+
registerWorkspace(workspacePath: string): void;
|
|
18
|
+
ensureSchema(db: InstanceType<typeof BetterSqlite3>): void;
|
|
19
|
+
resolveSlug(db: InstanceType<typeof BetterSqlite3>, workspaceId: string, workspacePath: string): string;
|
|
20
|
+
ensureRow(db: InstanceType<typeof BetterSqlite3>, opts: {
|
|
21
|
+
id: string;
|
|
22
|
+
slug: string;
|
|
23
|
+
name: string;
|
|
24
|
+
workspacePath: string;
|
|
25
|
+
}): void;
|
|
26
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.WorkspaceRepository = void 0;
|
|
7
|
+
const fs_1 = require("fs");
|
|
8
|
+
const path_1 = require("path");
|
|
9
|
+
const os_1 = require("os");
|
|
10
|
+
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
11
|
+
const sdk_1 = require("@crewx/sdk");
|
|
12
|
+
class WorkspaceRepository {
|
|
13
|
+
dbPath;
|
|
14
|
+
constructor(opts = {}) {
|
|
15
|
+
this.dbPath = (0, path_1.join)(opts.dbRoot ?? (0, os_1.homedir)(), '.crewx', 'crewx.db');
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Register a CLI workspace in the global CrewX DB.
|
|
19
|
+
*
|
|
20
|
+
* This is intentionally CLI-owned, not SDK-owned: workspace registration is
|
|
21
|
+
* CrewX application metadata, while the SDK only needs pure workspace helpers.
|
|
22
|
+
* Registration is best-effort so `crewx init` remains usable even if tracing
|
|
23
|
+
* DB setup fails.
|
|
24
|
+
*/
|
|
25
|
+
registerWorkspace(workspacePath) {
|
|
26
|
+
const normalizedPath = (0, sdk_1.normalizeWorkspacePath)(workspacePath);
|
|
27
|
+
try {
|
|
28
|
+
const dbDir = (0, path_1.dirname)(this.dbPath);
|
|
29
|
+
if (!(0, fs_1.existsSync)(dbDir)) {
|
|
30
|
+
(0, fs_1.mkdirSync)(dbDir, { recursive: true });
|
|
31
|
+
}
|
|
32
|
+
const db = new better_sqlite3_1.default(this.dbPath);
|
|
33
|
+
try {
|
|
34
|
+
this.ensureSchema(db);
|
|
35
|
+
const id = (0, sdk_1.hashWorkspaceId)(normalizedPath);
|
|
36
|
+
const name = (0, path_1.basename)(normalizedPath);
|
|
37
|
+
const slug = this.resolveSlug(db, id, normalizedPath);
|
|
38
|
+
this.ensureRow(db, { id, slug, name, workspacePath: normalizedPath });
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
db.close();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Non-fatal: workspace registration must never crash `crewx init`.
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
ensureSchema(db) {
|
|
49
|
+
db.exec(`
|
|
50
|
+
CREATE TABLE IF NOT EXISTS workspaces (
|
|
51
|
+
id TEXT PRIMARY KEY,
|
|
52
|
+
slug TEXT NOT NULL UNIQUE,
|
|
53
|
+
name TEXT NOT NULL,
|
|
54
|
+
workspace_path TEXT,
|
|
55
|
+
is_active INTEGER NOT NULL DEFAULT 1,
|
|
56
|
+
created_at TEXT NOT NULL,
|
|
57
|
+
updated_at TEXT NOT NULL
|
|
58
|
+
)
|
|
59
|
+
`);
|
|
60
|
+
db.exec(`
|
|
61
|
+
CREATE TABLE IF NOT EXISTS threads (
|
|
62
|
+
id TEXT PRIMARY KEY,
|
|
63
|
+
workspace_id TEXT,
|
|
64
|
+
platform TEXT NOT NULL DEFAULT 'cli',
|
|
65
|
+
title TEXT,
|
|
66
|
+
first_message TEXT,
|
|
67
|
+
last_message TEXT,
|
|
68
|
+
message_count INTEGER NOT NULL DEFAULT 0,
|
|
69
|
+
created_at TEXT NOT NULL,
|
|
70
|
+
updated_at TEXT NOT NULL,
|
|
71
|
+
metadata TEXT,
|
|
72
|
+
FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE SET NULL
|
|
73
|
+
)
|
|
74
|
+
`);
|
|
75
|
+
}
|
|
76
|
+
resolveSlug(db, workspaceId, workspacePath) {
|
|
77
|
+
const basenameSlug = (0, path_1.basename)(workspacePath);
|
|
78
|
+
const parentSlug = `${(0, path_1.basename)((0, path_1.dirname)(workspacePath))}/${basenameSlug}`;
|
|
79
|
+
const candidates = [basenameSlug, parentSlug];
|
|
80
|
+
try {
|
|
81
|
+
const slugExistsForOtherWorkspace = (slug) => !!db
|
|
82
|
+
.prepare('SELECT id FROM workspaces WHERE slug = ? AND id != ?')
|
|
83
|
+
.get(slug, workspaceId);
|
|
84
|
+
for (const slug of candidates) {
|
|
85
|
+
if (!slugExistsForOtherWorkspace(slug))
|
|
86
|
+
return slug;
|
|
87
|
+
}
|
|
88
|
+
for (let suffix = 2; suffix < 1000; suffix += 1) {
|
|
89
|
+
const slug = `${parentSlug}-${suffix}`;
|
|
90
|
+
if (!slugExistsForOtherWorkspace(slug))
|
|
91
|
+
return slug;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// workspaces table may not yet exist during early migration.
|
|
96
|
+
}
|
|
97
|
+
return basenameSlug;
|
|
98
|
+
}
|
|
99
|
+
ensureRow(db, opts) {
|
|
100
|
+
const { id, slug, name, workspacePath } = opts;
|
|
101
|
+
const now = new Date().toISOString();
|
|
102
|
+
db.prepare(`
|
|
103
|
+
INSERT OR IGNORE INTO workspaces (id, slug, name, workspace_path, is_active, created_at, updated_at)
|
|
104
|
+
VALUES (?, ?, ?, ?, 1, ?, ?)
|
|
105
|
+
`).run(id, slug, name, workspacePath, now, now);
|
|
106
|
+
db.prepare(`
|
|
107
|
+
UPDATE workspaces SET workspace_path = ?, updated_at = ? WHERE id = ? AND workspace_path IS NULL
|
|
108
|
+
`).run(workspacePath, now, id);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
exports.WorkspaceRepository = WorkspaceRepository;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type BetterSqlite3 from 'better-sqlite3';
|
|
2
|
+
/**
|
|
3
|
+
* Ensure the `tasks` table exists in the given database.
|
|
4
|
+
* Safe to call multiple times — CREATE TABLE IF NOT EXISTS is idempotent.
|
|
5
|
+
* Owns the canonical schema for the CLI-side tasks table.
|
|
6
|
+
*/
|
|
7
|
+
export declare function ensureTasksSchema(db: InstanceType<typeof BetterSqlite3>): void;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ensureTasksSchema = ensureTasksSchema;
|
|
4
|
+
/**
|
|
5
|
+
* Ensure the `tasks` table exists in the given database.
|
|
6
|
+
* Safe to call multiple times — CREATE TABLE IF NOT EXISTS is idempotent.
|
|
7
|
+
* Owns the canonical schema for the CLI-side tasks table.
|
|
8
|
+
*/
|
|
9
|
+
function ensureTasksSchema(db) {
|
|
10
|
+
db.exec(`
|
|
11
|
+
CREATE TABLE IF NOT EXISTS tasks (
|
|
12
|
+
id TEXT PRIMARY KEY,
|
|
13
|
+
agent_id TEXT,
|
|
14
|
+
user_id TEXT,
|
|
15
|
+
prompt TEXT,
|
|
16
|
+
mode TEXT,
|
|
17
|
+
status TEXT NOT NULL,
|
|
18
|
+
result TEXT,
|
|
19
|
+
error TEXT,
|
|
20
|
+
started_at TEXT NOT NULL,
|
|
21
|
+
completed_at TEXT,
|
|
22
|
+
duration_ms INTEGER,
|
|
23
|
+
metadata TEXT,
|
|
24
|
+
project_id TEXT,
|
|
25
|
+
project_name TEXT,
|
|
26
|
+
trace_id TEXT,
|
|
27
|
+
parent_task_id TEXT,
|
|
28
|
+
caller_agent_id TEXT,
|
|
29
|
+
model TEXT,
|
|
30
|
+
platform TEXT,
|
|
31
|
+
crewx_version TEXT,
|
|
32
|
+
input_tokens INTEGER DEFAULT 0,
|
|
33
|
+
output_tokens INTEGER DEFAULT 0,
|
|
34
|
+
cost_usd REAL,
|
|
35
|
+
pid INTEGER,
|
|
36
|
+
rendered_prompt TEXT,
|
|
37
|
+
command TEXT,
|
|
38
|
+
coding_agent_command TEXT,
|
|
39
|
+
exit_code INTEGER,
|
|
40
|
+
logs TEXT,
|
|
41
|
+
thread_id TEXT,
|
|
42
|
+
project_ref TEXT,
|
|
43
|
+
workspace_id TEXT,
|
|
44
|
+
workspace_name TEXT,
|
|
45
|
+
cached_input_tokens INTEGER DEFAULT 0
|
|
46
|
+
)
|
|
47
|
+
`);
|
|
48
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@crewx/cli",
|
|
3
|
-
"version": "0.8.4-rc.
|
|
3
|
+
"version": "0.8.4-rc.2",
|
|
4
4
|
"license": "UNLICENSED",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=20.19.0"
|
|
@@ -24,29 +24,29 @@
|
|
|
24
24
|
"bin",
|
|
25
25
|
"README.md"
|
|
26
26
|
],
|
|
27
|
-
"scripts": {
|
|
28
|
-
"build": "tsc -p tsconfig.json",
|
|
29
|
-
"test": "vitest run --config ./vitest.config.ts",
|
|
30
|
-
"test:watch": "vitest --config ./vitest.config.ts",
|
|
31
|
-
"lint": "echo 'CLI lint pending' && exit 0"
|
|
32
|
-
},
|
|
33
27
|
"dependencies": {
|
|
34
|
-
"@crewx/sdk": "workspace:*",
|
|
35
|
-
"@crewx/memory": "workspace:*",
|
|
36
|
-
"@crewx/search": "workspace:*",
|
|
37
|
-
"@crewx/doc": "workspace:*",
|
|
38
|
-
"@crewx/wbs": "workspace:*",
|
|
39
|
-
"@crewx/cron": "workspace:*",
|
|
40
|
-
"@crewx/workflow": "workspace:*",
|
|
41
|
-
"@crewx/skill": "workspace:*",
|
|
42
|
-
"@crewx/shared": "workspace:*",
|
|
43
28
|
"@crewx/adapter-slack": "^0.1.4",
|
|
44
|
-
"better-sqlite3": "*"
|
|
29
|
+
"better-sqlite3": "*",
|
|
30
|
+
"@crewx/sdk": "0.8.3-rc.12",
|
|
31
|
+
"@crewx/doc": "0.1.8",
|
|
32
|
+
"@crewx/search": "0.1.9",
|
|
33
|
+
"@crewx/memory": "0.1.10",
|
|
34
|
+
"@crewx/wbs": "0.1.9",
|
|
35
|
+
"@crewx/cron": "0.1.8",
|
|
36
|
+
"@crewx/shared": "0.0.5",
|
|
37
|
+
"@crewx/workflow": "0.3.17",
|
|
38
|
+
"@crewx/skill": "0.1.8"
|
|
45
39
|
},
|
|
46
40
|
"devDependencies": {
|
|
47
41
|
"@types/better-sqlite3": "*",
|
|
48
42
|
"@types/node": "^22.0.0",
|
|
49
43
|
"typescript": "^5.4.0",
|
|
50
44
|
"vitest": "^3.1.1"
|
|
45
|
+
},
|
|
46
|
+
"scripts": {
|
|
47
|
+
"build": "tsc -p tsconfig.json",
|
|
48
|
+
"test": "vitest run --config ./vitest.config.ts",
|
|
49
|
+
"test:watch": "vitest --config ./vitest.config.ts",
|
|
50
|
+
"lint": "echo 'CLI lint pending' && exit 0"
|
|
51
51
|
}
|
|
52
|
-
}
|
|
52
|
+
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { OnModuleInit } from '@nestjs/common';
|
|
2
|
-
import { AIProvider, AIQueryOptions, AIResponse, type PluginProviderConfig, type RemoteProviderConfig } from '@sowonai/crewx-sdk';
|
|
3
|
-
import { DynamicProviderFactory } from './providers/dynamic-provider.factory';
|
|
4
|
-
import { ConfigService } from './services/config.service';
|
|
5
|
-
import { ToolCallService } from './services/tool-call.service';
|
|
6
|
-
import { TracingService } from './services/tracing.service';
|
|
7
|
-
export declare class AIProviderService implements OnModuleInit {
|
|
8
|
-
private readonly toolCallService;
|
|
9
|
-
private readonly dynamicProviderFactory;
|
|
10
|
-
private readonly configService;
|
|
11
|
-
private readonly tracingService?;
|
|
12
|
-
private readonly logger;
|
|
13
|
-
private readonly providers;
|
|
14
|
-
private availableProviders;
|
|
15
|
-
private readonly builtInProviderNames;
|
|
16
|
-
constructor(toolCallService: ToolCallService, dynamicProviderFactory: DynamicProviderFactory, configService: ConfigService, tracingService?: TracingService | undefined);
|
|
17
|
-
onModuleInit(): Promise<void>;
|
|
18
|
-
private createBuiltInProviders;
|
|
19
|
-
private loadPluginProviders;
|
|
20
|
-
private loadAPIProviders;
|
|
21
|
-
reloadPluginProviders(): Promise<void>;
|
|
22
|
-
private registerProvider;
|
|
23
|
-
initializeProviders(): Promise<void>;
|
|
24
|
-
queryAI(prompt: string, providerName?: string, options?: AIQueryOptions): Promise<AIResponse>;
|
|
25
|
-
executeAI(prompt: string, providerName: string, options?: AIQueryOptions): Promise<AIResponse>;
|
|
26
|
-
getAvailableProviders(): string[];
|
|
27
|
-
checkAvailableProviders(): Promise<string[]>;
|
|
28
|
-
getProvider(name: string): AIProvider | undefined;
|
|
29
|
-
validateCLIInstallation(): Promise<{
|
|
30
|
-
[key: string]: boolean;
|
|
31
|
-
}>;
|
|
32
|
-
getPluginProviders(): PluginProviderConfig[];
|
|
33
|
-
getRemoteProviders(): RemoteProviderConfig[];
|
|
34
|
-
}
|
|
@@ -1,311 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
-
};
|
|
8
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
-
};
|
|
11
|
-
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
-
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
-
};
|
|
14
|
-
var AIProviderService_1;
|
|
15
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
-
exports.AIProviderService = void 0;
|
|
17
|
-
const common_1 = require("@nestjs/common");
|
|
18
|
-
const crewx_sdk_1 = require("@sowonai/crewx-sdk");
|
|
19
|
-
const dynamic_provider_factory_1 = require("./providers/dynamic-provider.factory");
|
|
20
|
-
const config_service_1 = require("./services/config.service");
|
|
21
|
-
const tool_call_service_1 = require("./services/tool-call.service");
|
|
22
|
-
const logger_adapter_1 = require("./providers/logger.adapter");
|
|
23
|
-
const version_1 = require("./version");
|
|
24
|
-
const tracing_service_1 = require("./services/tracing.service");
|
|
25
|
-
let AIProviderService = AIProviderService_1 = class AIProviderService {
|
|
26
|
-
constructor(toolCallService, dynamicProviderFactory, configService, tracingService) {
|
|
27
|
-
this.toolCallService = toolCallService;
|
|
28
|
-
this.dynamicProviderFactory = dynamicProviderFactory;
|
|
29
|
-
this.configService = configService;
|
|
30
|
-
this.tracingService = tracingService;
|
|
31
|
-
this.logger = new common_1.Logger(AIProviderService_1.name);
|
|
32
|
-
this.providers = new Map();
|
|
33
|
-
this.availableProviders = [];
|
|
34
|
-
this.builtInProviderNames = new Set([
|
|
35
|
-
crewx_sdk_1.BuiltInProviders.CLAUDE,
|
|
36
|
-
crewx_sdk_1.BuiltInProviders.GEMINI,
|
|
37
|
-
crewx_sdk_1.BuiltInProviders.COPILOT,
|
|
38
|
-
crewx_sdk_1.BuiltInProviders.CODEX,
|
|
39
|
-
]);
|
|
40
|
-
}
|
|
41
|
-
async onModuleInit() {
|
|
42
|
-
for (const provider of this.createBuiltInProviders()) {
|
|
43
|
-
this.registerProvider(provider);
|
|
44
|
-
}
|
|
45
|
-
await this.loadPluginProviders();
|
|
46
|
-
await this.loadAPIProviders();
|
|
47
|
-
}
|
|
48
|
-
createBuiltInProviders() {
|
|
49
|
-
const taskLogHandler = (0, logger_adapter_1.createTaskLogHandler)(this.tracingService);
|
|
50
|
-
return [
|
|
51
|
-
new crewx_sdk_1.ClaudeProvider({
|
|
52
|
-
logger: (0, logger_adapter_1.createLoggerAdapter)('ClaudeProvider'),
|
|
53
|
-
toolCallHandler: this.toolCallService,
|
|
54
|
-
crewxVersion: version_1.CREWX_VERSION,
|
|
55
|
-
taskLogHandler,
|
|
56
|
-
}),
|
|
57
|
-
new crewx_sdk_1.GeminiProvider({
|
|
58
|
-
logger: (0, logger_adapter_1.createLoggerAdapter)('GeminiProvider'),
|
|
59
|
-
toolCallHandler: this.toolCallService,
|
|
60
|
-
crewxVersion: version_1.CREWX_VERSION,
|
|
61
|
-
taskLogHandler,
|
|
62
|
-
}),
|
|
63
|
-
new crewx_sdk_1.CopilotProvider({
|
|
64
|
-
logger: (0, logger_adapter_1.createLoggerAdapter)('CopilotProvider'),
|
|
65
|
-
toolCallHandler: this.toolCallService,
|
|
66
|
-
crewxVersion: version_1.CREWX_VERSION,
|
|
67
|
-
taskLogHandler,
|
|
68
|
-
}),
|
|
69
|
-
new crewx_sdk_1.CodexProvider({
|
|
70
|
-
logger: (0, logger_adapter_1.createLoggerAdapter)('CodexProvider'),
|
|
71
|
-
toolCallHandler: this.toolCallService,
|
|
72
|
-
crewxVersion: version_1.CREWX_VERSION,
|
|
73
|
-
taskLogHandler,
|
|
74
|
-
}),
|
|
75
|
-
];
|
|
76
|
-
}
|
|
77
|
-
async loadPluginProviders() {
|
|
78
|
-
try {
|
|
79
|
-
const dynamicConfigs = this.configService.getDynamicProviders();
|
|
80
|
-
if (!dynamicConfigs || dynamicConfigs.length === 0) {
|
|
81
|
-
this.logger.log('No dynamic providers defined in config');
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
for (const providerConfig of dynamicConfigs) {
|
|
85
|
-
try {
|
|
86
|
-
if (!this.dynamicProviderFactory.validateConfig(providerConfig)) {
|
|
87
|
-
this.logger.warn(`Invalid dynamic provider config: ${providerConfig.id}`);
|
|
88
|
-
this.logger.debug(`Config dump: ${JSON.stringify(providerConfig, null, 2)}`);
|
|
89
|
-
continue;
|
|
90
|
-
}
|
|
91
|
-
const provider = this.dynamicProviderFactory.createProvider(providerConfig);
|
|
92
|
-
this.registerProvider(provider);
|
|
93
|
-
this.logger.log(`✅ Registered ${providerConfig.type} provider: ${providerConfig.id}`);
|
|
94
|
-
}
|
|
95
|
-
catch (error) {
|
|
96
|
-
this.logger.error(`Failed to load dynamic provider '${providerConfig.id || 'unknown'}': ${error.message}`, error.stack);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
catch (error) {
|
|
101
|
-
this.logger.error('Failed to load dynamic providers:', error);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
async loadAPIProviders() {
|
|
105
|
-
try {
|
|
106
|
-
const apiProviderConfigs = this.configService.getAllAPIProviderConfigs();
|
|
107
|
-
if (!apiProviderConfigs || apiProviderConfigs.size === 0) {
|
|
108
|
-
this.logger.log('No API providers defined in config');
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
for (const [agentId, apiConfig] of apiProviderConfigs) {
|
|
112
|
-
try {
|
|
113
|
-
const normalizedConfig = (0, crewx_sdk_1.normalizeAPIProviderConfig)(apiConfig);
|
|
114
|
-
const taskLogHandler = (0, logger_adapter_1.createTaskLogHandler)(this.tracingService);
|
|
115
|
-
const { MastraAPIProvider } = require('@sowonai/crewx-sdk/api');
|
|
116
|
-
const provider = new MastraAPIProvider(normalizedConfig.config);
|
|
117
|
-
if (taskLogHandler) {
|
|
118
|
-
provider.setTaskLogHandler(taskLogHandler);
|
|
119
|
-
}
|
|
120
|
-
const agentConfig = this.configService.getAgentConfig(agentId);
|
|
121
|
-
const allowedToolNames = new Set();
|
|
122
|
-
this.logger.debug(`[Tool Loading] normalizedConfig.permissionsByMode: ${JSON.stringify(normalizedConfig.permissionsByMode, null, 2)}`);
|
|
123
|
-
for (const permissions of Object.values(normalizedConfig.permissionsByMode)) {
|
|
124
|
-
for (const toolName of permissions.tools) {
|
|
125
|
-
allowedToolNames.add(toolName);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
this.logger.debug(`[Tool Loading] allowedToolNames: ${Array.from(allowedToolNames).join(', ')}`);
|
|
129
|
-
if (allowedToolNames.size > 0) {
|
|
130
|
-
const tools = [];
|
|
131
|
-
const { readFileTool, writeFileTool, replaceTool, lsTool, treeTool, grepTool, findTool, globTool, runShellCommandTool, } = require('@sowonai/crewx-sdk/tools');
|
|
132
|
-
const builtInTools = {
|
|
133
|
-
read_file: readFileTool,
|
|
134
|
-
write_file: writeFileTool,
|
|
135
|
-
replace: replaceTool,
|
|
136
|
-
ls: lsTool,
|
|
137
|
-
tree: treeTool,
|
|
138
|
-
grep: grepTool,
|
|
139
|
-
find: findTool,
|
|
140
|
-
glob: globTool,
|
|
141
|
-
run_shell_command: runShellCommandTool,
|
|
142
|
-
};
|
|
143
|
-
for (const toolName of allowedToolNames) {
|
|
144
|
-
const tool = builtInTools[toolName];
|
|
145
|
-
if (tool) {
|
|
146
|
-
tools.push(tool);
|
|
147
|
-
this.logger.log(`✅ Loaded tool: ${toolName} for agent ${agentId}`);
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
this.logger.warn(`⚠️ Unknown tool: ${toolName} for agent ${agentId}`);
|
|
151
|
-
this.logger.debug(`Available tools: ${Object.keys(builtInTools).join(', ')}`);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
const context = {
|
|
155
|
-
agent: {
|
|
156
|
-
id: agentId,
|
|
157
|
-
provider: apiConfig.provider,
|
|
158
|
-
model: apiConfig.model,
|
|
159
|
-
temperature: apiConfig.temperature,
|
|
160
|
-
maxTokens: apiConfig.maxTokens,
|
|
161
|
-
},
|
|
162
|
-
env: this.configService.getEnvironmentVariables(),
|
|
163
|
-
mode: 'query',
|
|
164
|
-
platform: 'cli',
|
|
165
|
-
};
|
|
166
|
-
provider.setTools(tools, context);
|
|
167
|
-
this.logger.log(`✅ Configured ${tools.length} tool(s) for agent ${agentId}`);
|
|
168
|
-
}
|
|
169
|
-
const wrappedProvider = {
|
|
170
|
-
name: agentId,
|
|
171
|
-
isAvailable: provider.isAvailable.bind(provider),
|
|
172
|
-
query: provider.query.bind(provider),
|
|
173
|
-
execute: provider.execute.bind(provider),
|
|
174
|
-
getToolPath: provider.getToolPath?.bind(provider),
|
|
175
|
-
};
|
|
176
|
-
this.registerProvider(wrappedProvider);
|
|
177
|
-
this.logger.log(`✅ Registered API provider for agent: ${agentId} (${apiConfig.provider}/${apiConfig.model})`);
|
|
178
|
-
}
|
|
179
|
-
catch (error) {
|
|
180
|
-
this.logger.error(`Failed to load API provider for agent '${agentId}': ${error.message}`, error.stack);
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
catch (error) {
|
|
185
|
-
this.logger.error('Failed to load API providers:', error);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
async reloadPluginProviders() {
|
|
189
|
-
for (const [name] of this.providers) {
|
|
190
|
-
if (!this.builtInProviderNames.has(name)) {
|
|
191
|
-
this.providers.delete(name);
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
await this.loadPluginProviders();
|
|
195
|
-
await this.loadAPIProviders();
|
|
196
|
-
}
|
|
197
|
-
registerProvider(provider) {
|
|
198
|
-
this.providers.set(provider.name, provider);
|
|
199
|
-
this.logger.log(`Registered AI provider: ${provider.name}`);
|
|
200
|
-
}
|
|
201
|
-
async initializeProviders() {
|
|
202
|
-
this.logger.log('Initializing AI providers...');
|
|
203
|
-
this.availableProviders = [];
|
|
204
|
-
const checks = Array.from(this.providers.entries()).map(async ([name, provider]) => {
|
|
205
|
-
try {
|
|
206
|
-
const isAvailable = await provider.isAvailable();
|
|
207
|
-
if (isAvailable) {
|
|
208
|
-
this.availableProviders.push(name);
|
|
209
|
-
this.logger.log(`✅ ${name} provider is available`);
|
|
210
|
-
}
|
|
211
|
-
else {
|
|
212
|
-
this.logger.warn(`❌ ${name} provider is not available`);
|
|
213
|
-
}
|
|
214
|
-
return { name, isAvailable };
|
|
215
|
-
}
|
|
216
|
-
catch (error) {
|
|
217
|
-
this.logger.error(`Error checking ${name} provider:`, error);
|
|
218
|
-
return { name, isAvailable: false };
|
|
219
|
-
}
|
|
220
|
-
});
|
|
221
|
-
await Promise.all(checks);
|
|
222
|
-
this.logger.log(`Available providers: ${this.availableProviders.join(', ')}`);
|
|
223
|
-
}
|
|
224
|
-
async queryAI(prompt, providerName = crewx_sdk_1.BuiltInProviders.CLAUDE, options = {}) {
|
|
225
|
-
const provider = this.providers.get(providerName);
|
|
226
|
-
if (!provider) {
|
|
227
|
-
throw new crewx_sdk_1.ProviderNotAvailableError(providerName);
|
|
228
|
-
}
|
|
229
|
-
const isAvailable = await provider.isAvailable();
|
|
230
|
-
if (!isAvailable) {
|
|
231
|
-
throw new crewx_sdk_1.ProviderNotAvailableError(providerName);
|
|
232
|
-
}
|
|
233
|
-
try {
|
|
234
|
-
if (typeof provider.queryWithTools === 'function') {
|
|
235
|
-
this.logger.log(`Using queryWithTools for ${providerName} in query mode`);
|
|
236
|
-
return await provider.queryWithTools(prompt, options);
|
|
237
|
-
}
|
|
238
|
-
return await provider.query(prompt, options);
|
|
239
|
-
}
|
|
240
|
-
catch (error) {
|
|
241
|
-
this.logger.error(`Error querying ${providerName}:`, error);
|
|
242
|
-
return {
|
|
243
|
-
content: '',
|
|
244
|
-
provider: providerName,
|
|
245
|
-
command: `${providerName} query`,
|
|
246
|
-
success: false,
|
|
247
|
-
error: error.message || 'Unknown error occurred',
|
|
248
|
-
};
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
async executeAI(prompt, providerName, options = {}) {
|
|
252
|
-
const provider = this.providers.get(providerName);
|
|
253
|
-
if (!provider) {
|
|
254
|
-
throw new crewx_sdk_1.ProviderNotAvailableError(providerName);
|
|
255
|
-
}
|
|
256
|
-
const isAvailable = await provider.isAvailable();
|
|
257
|
-
if (!isAvailable) {
|
|
258
|
-
throw new crewx_sdk_1.ProviderNotAvailableError(providerName);
|
|
259
|
-
}
|
|
260
|
-
try {
|
|
261
|
-
if (typeof provider.queryWithTools === 'function') {
|
|
262
|
-
this.logger.log(`Using queryWithTools for ${providerName} in execute mode`);
|
|
263
|
-
return await provider.queryWithTools(prompt, options);
|
|
264
|
-
}
|
|
265
|
-
return await provider.execute(prompt, options);
|
|
266
|
-
}
|
|
267
|
-
catch (error) {
|
|
268
|
-
this.logger.error(`Error executing ${providerName}:`, error);
|
|
269
|
-
return {
|
|
270
|
-
content: '',
|
|
271
|
-
provider: providerName,
|
|
272
|
-
command: `${providerName} execute`,
|
|
273
|
-
success: false,
|
|
274
|
-
error: error.message || 'Unknown error occurred',
|
|
275
|
-
};
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
getAvailableProviders() {
|
|
279
|
-
return Array.from(this.providers.keys());
|
|
280
|
-
}
|
|
281
|
-
async checkAvailableProviders() {
|
|
282
|
-
await this.initializeProviders();
|
|
283
|
-
return this.getAvailableProviders();
|
|
284
|
-
}
|
|
285
|
-
getProvider(name) {
|
|
286
|
-
return this.providers.get(name);
|
|
287
|
-
}
|
|
288
|
-
async validateCLIInstallation() {
|
|
289
|
-
const installation = {};
|
|
290
|
-
for (const [name, provider] of this.providers) {
|
|
291
|
-
installation[name] = await provider.isAvailable();
|
|
292
|
-
}
|
|
293
|
-
return installation;
|
|
294
|
-
}
|
|
295
|
-
getPluginProviders() {
|
|
296
|
-
return this.configService.getPluginProviders();
|
|
297
|
-
}
|
|
298
|
-
getRemoteProviders() {
|
|
299
|
-
return this.configService.getRemoteProviders();
|
|
300
|
-
}
|
|
301
|
-
};
|
|
302
|
-
exports.AIProviderService = AIProviderService;
|
|
303
|
-
exports.AIProviderService = AIProviderService = AIProviderService_1 = __decorate([
|
|
304
|
-
(0, common_1.Injectable)(),
|
|
305
|
-
__param(3, (0, common_1.Optional)()),
|
|
306
|
-
__metadata("design:paramtypes", [tool_call_service_1.ToolCallService,
|
|
307
|
-
dynamic_provider_factory_1.DynamicProviderFactory,
|
|
308
|
-
config_service_1.ConfigService,
|
|
309
|
-
tracing_service_1.TracingService])
|
|
310
|
-
], AIProviderService);
|
|
311
|
-
//# sourceMappingURL=ai-provider.service.js.map
|