@crewx/cli 0.8.3-rc.9 → 0.8.4-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -33
- package/bin/crewx +2 -2
- package/dist/ai-provider.service.d.ts +34 -0
- package/dist/ai-provider.service.js +311 -0
- package/dist/ai-provider.service.js.map +1 -0
- package/dist/ai.service.d.ts +17 -0
- package/dist/ai.service.js +51 -0
- package/dist/ai.service.js.map +1 -0
- package/dist/app.module.d.ts +5 -0
- package/dist/app.module.js +165 -0
- package/dist/app.module.js.map +1 -0
- package/dist/cli/agent.handler.d.ts +2 -0
- package/dist/cli/agent.handler.js +186 -0
- package/dist/cli/agent.handler.js.map +1 -0
- package/dist/cli/builtin.handler.d.ts +3 -0
- package/dist/cli/builtin.handler.js +110 -0
- package/dist/cli/builtin.handler.js.map +1 -0
- package/dist/cli/chat.handler.d.ts +20 -0
- package/dist/cli/chat.handler.js +446 -0
- package/dist/cli/chat.handler.js.map +1 -0
- package/dist/cli/cli.handler.d.ts +4 -0
- package/dist/cli/cli.handler.js +119 -0
- package/dist/cli/cli.handler.js.map +1 -0
- package/dist/cli/doctor.handler.d.ts +38 -0
- package/dist/cli/doctor.handler.js +495 -0
- package/dist/cli/doctor.handler.js.map +1 -0
- package/dist/cli/execute.handler.d.ts +2 -0
- package/dist/cli/execute.handler.js +321 -0
- package/dist/cli/execute.handler.js.map +1 -0
- package/dist/cli/help.handler.d.ts +2 -0
- package/dist/cli/help.handler.js +10 -0
- package/dist/cli/help.handler.js.map +1 -0
- package/dist/cli/init.handler.d.ts +26 -0
- package/dist/cli/init.handler.js +450 -0
- package/dist/cli/init.handler.js.map +1 -0
- package/dist/cli/log.handler.d.ts +2 -0
- package/dist/cli/log.handler.js +69 -0
- package/dist/cli/log.handler.js.map +1 -0
- package/dist/cli/mcp.handler.d.ts +3 -0
- package/dist/cli/mcp.handler.js +121 -0
- package/dist/cli/mcp.handler.js.map +1 -0
- package/dist/cli/query.handler.d.ts +2 -0
- package/dist/cli/query.handler.js +379 -0
- package/dist/cli/query.handler.js.map +1 -0
- package/dist/cli/skill.handler.d.ts +2 -0
- package/dist/cli/skill.handler.js +252 -0
- package/dist/cli/skill.handler.js.map +1 -0
- package/dist/cli/slack-files.handler.d.ts +2 -0
- package/dist/cli/slack-files.handler.js +291 -0
- package/dist/cli/slack-files.handler.js.map +1 -0
- package/dist/cli/template.handler.d.ts +2 -0
- package/dist/cli/template.handler.js +188 -0
- package/dist/cli/template.handler.js.map +1 -0
- package/dist/cli/templates.handler.d.ts +2 -0
- package/dist/cli/templates.handler.js +100 -0
- package/dist/cli/templates.handler.js.map +1 -0
- package/dist/cli-options.d.ts +39 -0
- package/dist/cli-options.js +355 -0
- package/dist/cli-options.js.map +1 -0
- package/dist/commands/agent.js +23 -23
- package/dist/commands/init.js +36 -28
- package/dist/commands/resolve-prompt.d.ts +4 -4
- package/dist/commands/resolve-prompt.js +5 -5
- package/dist/config/timeout.config.d.ts +14 -0
- package/dist/config/timeout.config.js +34 -0
- package/dist/config/timeout.config.js.map +1 -0
- package/dist/conversation/base-conversation-history.provider.d.ts +12 -0
- package/dist/conversation/base-conversation-history.provider.js +45 -0
- package/dist/conversation/base-conversation-history.provider.js.map +1 -0
- package/dist/conversation/cli-conversation-history.provider.d.ts +16 -0
- package/dist/conversation/cli-conversation-history.provider.js +111 -0
- package/dist/conversation/cli-conversation-history.provider.js.map +1 -0
- package/dist/conversation/conversation-provider.factory.d.ts +10 -0
- package/dist/conversation/conversation-provider.factory.js +50 -0
- package/dist/conversation/conversation-provider.factory.js.map +1 -0
- package/dist/conversation/index.d.ts +6 -0
- package/dist/conversation/index.js +27 -0
- package/dist/conversation/index.js.map +1 -0
- package/dist/conversation/slack-conversation-history.provider.d.ts +29 -0
- package/dist/conversation/slack-conversation-history.provider.js +302 -0
- package/dist/conversation/slack-conversation-history.provider.js.map +1 -0
- package/dist/crewx.tool.d.ts +359 -0
- package/dist/crewx.tool.js +2501 -0
- package/dist/crewx.tool.js.map +1 -0
- package/dist/crewx.tool.spec.d.ts +1 -0
- package/dist/crewx.tool.spec.js +158 -0
- package/dist/crewx.tool.spec.js.map +1 -0
- package/dist/guards/bearer-auth.guard.d.ts +7 -0
- package/dist/guards/bearer-auth.guard.js +44 -0
- package/dist/guards/bearer-auth.guard.js.map +1 -0
- package/dist/health.controller.d.ts +6 -0
- package/dist/health.controller.js +32 -0
- package/dist/health.controller.js.map +1 -0
- package/dist/main.js +72 -71
- package/dist/main.js.map +1 -0
- package/dist/mcp.controller.d.ts +8 -0
- package/dist/mcp.controller.js +62 -0
- package/dist/mcp.controller.js.map +1 -0
- package/dist/package.json +3 -0
- package/dist/providers/dynamic-provider.factory.d.ts +15 -0
- package/dist/providers/dynamic-provider.factory.js +133 -0
- package/dist/providers/dynamic-provider.factory.js.map +1 -0
- package/dist/providers/logger.adapter.d.ts +6 -0
- package/dist/providers/logger.adapter.js +102 -0
- package/dist/providers/logger.adapter.js.map +1 -0
- package/dist/services/agent-loader.service.d.ts +35 -0
- package/dist/services/agent-loader.service.js +622 -0
- package/dist/services/agent-loader.service.js.map +1 -0
- package/dist/services/auth.service.d.ts +9 -0
- package/dist/services/auth.service.js +47 -0
- package/dist/services/auth.service.js.map +1 -0
- package/dist/services/config-validator.service.d.ts +29 -0
- package/dist/services/config-validator.service.js +483 -0
- package/dist/services/config-validator.service.js.map +1 -0
- package/dist/services/config.service.d.ts +45 -0
- package/dist/services/config.service.js +352 -0
- package/dist/services/config.service.js.map +1 -0
- package/dist/services/document-loader.service.d.ts +21 -0
- package/dist/services/document-loader.service.js +156 -0
- package/dist/services/document-loader.service.js.map +1 -0
- package/dist/services/help.service.d.ts +5 -0
- package/dist/services/help.service.js +139 -0
- package/dist/services/help.service.js.map +1 -0
- package/dist/services/intelligent-compression.service.d.ts +20 -0
- package/dist/services/intelligent-compression.service.js +179 -0
- package/dist/services/intelligent-compression.service.js.map +1 -0
- package/dist/services/mcp-client.service.d.ts +26 -0
- package/dist/services/mcp-client.service.js +81 -0
- package/dist/services/mcp-client.service.js.map +1 -0
- package/dist/services/parallel-processing.service.d.ts +108 -0
- package/dist/services/parallel-processing.service.js +333 -0
- package/dist/services/parallel-processing.service.js.map +1 -0
- package/dist/services/provider-bridge.service.d.ts +35 -0
- package/dist/services/provider-bridge.service.js +224 -0
- package/dist/services/provider-bridge.service.js.map +1 -0
- package/dist/services/remote-agent.service.d.ts +50 -0
- package/dist/services/remote-agent.service.js +171 -0
- package/dist/services/remote-agent.service.js.map +1 -0
- package/dist/services/result-formatter.service.d.ts +27 -0
- package/dist/services/result-formatter.service.js +126 -0
- package/dist/services/result-formatter.service.js.map +1 -0
- package/dist/services/skill-loader.service.d.ts +15 -0
- package/dist/services/skill-loader.service.js +278 -0
- package/dist/services/skill-loader.service.js.map +1 -0
- package/dist/services/skill.service.d.ts +67 -0
- package/dist/services/skill.service.js +670 -0
- package/dist/services/skill.service.js.map +1 -0
- package/dist/services/skill.service.spec.d.ts +1 -0
- package/dist/services/skill.service.spec.js +35 -0
- package/dist/services/skill.service.spec.js.map +1 -0
- package/dist/services/task-management.service.d.ts +65 -0
- package/dist/services/task-management.service.js +288 -0
- package/dist/services/task-management.service.js.map +1 -0
- package/dist/services/template.service.d.ts +61 -0
- package/dist/services/template.service.js +416 -0
- package/dist/services/template.service.js.map +1 -0
- package/dist/services/tool-call.service.d.ts +19 -0
- package/dist/services/tool-call.service.js +1061 -0
- package/dist/services/tool-call.service.js.map +1 -0
- package/dist/services/tracing.service.d.ts +200 -0
- package/dist/services/tracing.service.js +1290 -0
- package/dist/services/tracing.service.js.map +1 -0
- package/dist/slack/formatters/message.formatter.d.ts +32 -0
- package/dist/slack/formatters/message.formatter.js +352 -0
- package/dist/slack/formatters/message.formatter.js.map +1 -0
- package/dist/slack/services/slack-file-download.service.d.ts +58 -0
- package/dist/slack/services/slack-file-download.service.js +558 -0
- package/dist/slack/services/slack-file-download.service.js.map +1 -0
- package/dist/slack/slack-bot.d.ts +33 -0
- package/dist/slack/slack-bot.js +567 -0
- package/dist/slack/slack-bot.js.map +1 -0
- package/dist/stderr.logger.d.ts +8 -0
- package/dist/stderr.logger.js +26 -0
- package/dist/stderr.logger.js.map +1 -0
- package/dist/types/usage.types.d.ts +107 -0
- package/dist/types/usage.types.js +3 -0
- package/dist/types/usage.types.js.map +1 -0
- package/dist/utils/config-utils.d.ts +15 -0
- package/dist/utils/config-utils.js +69 -0
- package/dist/utils/config-utils.js.map +1 -0
- package/dist/utils/extract-text.d.ts +1 -0
- package/dist/utils/extract-text.js +15 -0
- package/dist/utils/extract-text.js.map +1 -0
- package/dist/utils/mcp-installer.d.ts +20 -0
- package/dist/utils/mcp-installer.js +199 -0
- package/dist/utils/mcp-installer.js.map +1 -0
- package/dist/utils/project-hash.d.ts +6 -0
- package/dist/utils/project-hash.js +70 -0
- package/dist/utils/project-hash.js.map +1 -0
- package/dist/utils/simple-security.d.ts +3 -0
- package/dist/utils/simple-security.js +20 -0
- package/dist/utils/simple-security.js.map +1 -0
- package/dist/utils/stdin-utils.d.ts +6 -0
- package/dist/utils/stdin-utils.js +109 -0
- package/dist/utils/stdin-utils.js.map +1 -0
- package/dist/utils/template-processor.d.ts +4 -0
- package/dist/utils/template-processor.js +266 -0
- package/dist/utils/template-processor.js.map +1 -0
- package/dist/utils/terminal-message-formatter.d.ts +23 -0
- package/dist/utils/terminal-message-formatter.js +136 -0
- package/dist/utils/terminal-message-formatter.js.map +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +17 -0
- package/dist/version.js.map +1 -0
- package/dist/workspace.service.d.ts +44 -0
- package/dist/workspace.service.js +299 -0
- package/dist/workspace.service.js.map +1 -0
- package/package.json +18 -18
- package/dist/commands/task-db.d.ts +0 -33
- package/dist/commands/task-db.js +0 -107
- package/dist/examples/deny-secrets-plugin.d.ts +0 -22
- package/dist/examples/deny-secrets-plugin.js +0 -40
- package/dist/plugins/examples/echo-hook.d.ts +0 -24
- package/dist/plugins/examples/echo-hook.js +0 -60
- package/dist/plugins/examples/verify-echo-hook.d.ts +0 -8
- package/dist/plugins/examples/verify-echo-hook.js +0 -47
- package/dist/plugins/sqlite-tracing.d.ts +0 -11
- package/dist/plugins/sqlite-tracing.js +0 -19
- package/dist/repository/workspace.repository.d.ts +0 -26
- package/dist/repository/workspace.repository.js +0 -111
- package/dist/schema/tasks.d.ts +0 -7
- package/dist/schema/tasks.js +0 -48
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
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;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
42
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
43
|
+
};
|
|
44
|
+
var WorkspaceService_1;
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.WorkspaceService = void 0;
|
|
47
|
+
const common_1 = require("@nestjs/common");
|
|
48
|
+
const fs = __importStar(require("fs/promises"));
|
|
49
|
+
const path = __importStar(require("path"));
|
|
50
|
+
const fast_glob_1 = __importDefault(require("fast-glob"));
|
|
51
|
+
const ignore_1 = __importDefault(require("ignore"));
|
|
52
|
+
const crewx_sdk_1 = require("@sowonai/crewx-sdk");
|
|
53
|
+
let WorkspaceService = WorkspaceService_1 = class WorkspaceService {
|
|
54
|
+
constructor() {
|
|
55
|
+
this.logger = new common_1.Logger(WorkspaceService_1.name);
|
|
56
|
+
}
|
|
57
|
+
async analyzeWorkspace(workspacePath, maxDepth = 3) {
|
|
58
|
+
this.logger.log(`Starting workspace analysis for: ${workspacePath}`);
|
|
59
|
+
const structure = await this.getWorkspaceStructure(workspacePath, maxDepth);
|
|
60
|
+
const languages = await this.detectLanguages(workspacePath);
|
|
61
|
+
const frameworks = await this.detectFrameworks(workspacePath);
|
|
62
|
+
const packageInfo = await this.getPackageInfo(workspacePath);
|
|
63
|
+
const analysis = {
|
|
64
|
+
structure,
|
|
65
|
+
languages,
|
|
66
|
+
frameworks,
|
|
67
|
+
totalFiles: await this.countFiles(structure),
|
|
68
|
+
totalSize: await this.calculateTotalSize(structure),
|
|
69
|
+
packageInfo,
|
|
70
|
+
};
|
|
71
|
+
this.logger.log(`Workspace analysis completed. Found ${analysis.totalFiles} files, ${analysis.languages.length} languages`);
|
|
72
|
+
return analysis;
|
|
73
|
+
}
|
|
74
|
+
async getWorkspaceStructure(workspacePath, maxDepth = 3, currentDepth = 0) {
|
|
75
|
+
const stats = await fs.stat(workspacePath);
|
|
76
|
+
const name = path.basename(workspacePath);
|
|
77
|
+
if (stats.isFile()) {
|
|
78
|
+
return {
|
|
79
|
+
name,
|
|
80
|
+
path: workspacePath,
|
|
81
|
+
type: 'file',
|
|
82
|
+
size: stats.size,
|
|
83
|
+
extension: path.extname(name).slice(1),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
const structure = {
|
|
87
|
+
name,
|
|
88
|
+
path: workspacePath,
|
|
89
|
+
type: 'directory',
|
|
90
|
+
children: [],
|
|
91
|
+
};
|
|
92
|
+
if (currentDepth < maxDepth) {
|
|
93
|
+
try {
|
|
94
|
+
const entries = await fs.readdir(workspacePath);
|
|
95
|
+
const ig = await this.getIgnoreRules(workspacePath);
|
|
96
|
+
for (const entry of entries) {
|
|
97
|
+
const entryPath = path.join(workspacePath, entry);
|
|
98
|
+
const relativePath = path.relative(workspacePath, entryPath);
|
|
99
|
+
if (!ig.ignores(relativePath) && !this.shouldIgnore(entry)) {
|
|
100
|
+
try {
|
|
101
|
+
const childStructure = await this.getWorkspaceStructure(entryPath, maxDepth, currentDepth + 1);
|
|
102
|
+
structure.children.push(childStructure);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
this.logger.warn(`Failed to process ${entryPath}: ${(0, crewx_sdk_1.getErrorMessage)(error)}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
structure.children.sort((a, b) => {
|
|
110
|
+
if (a.type !== b.type) {
|
|
111
|
+
return a.type === 'directory' ? -1 : 1;
|
|
112
|
+
}
|
|
113
|
+
return a.name.localeCompare(b.name);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
this.logger.warn(`Failed to read directory ${workspacePath}: ${(0, crewx_sdk_1.getErrorMessage)(error)}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return structure;
|
|
121
|
+
}
|
|
122
|
+
async searchFiles(workspacePath, patterns, maxFiles = 100) {
|
|
123
|
+
try {
|
|
124
|
+
const ig = await this.getIgnoreRules(workspacePath);
|
|
125
|
+
const files = await (0, fast_glob_1.default)(patterns, {
|
|
126
|
+
cwd: workspacePath,
|
|
127
|
+
absolute: true,
|
|
128
|
+
ignore: this.getDefaultIgnorePatterns(),
|
|
129
|
+
});
|
|
130
|
+
const filteredFiles = files
|
|
131
|
+
.filter((file) => {
|
|
132
|
+
const relativePath = path.relative(workspacePath, file);
|
|
133
|
+
return !ig.ignores(relativePath);
|
|
134
|
+
})
|
|
135
|
+
.slice(0, maxFiles);
|
|
136
|
+
this.logger.log(`Found ${filteredFiles.length} files matching patterns: ${patterns.join(', ')}`);
|
|
137
|
+
return filteredFiles;
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
this.logger.error(`File search failed: ${(0, crewx_sdk_1.getErrorMessage)(error)}`, (0, crewx_sdk_1.getErrorStack)(error));
|
|
141
|
+
throw error;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
async readFileContent(filePath, maxSize = 1024 * 1024) {
|
|
145
|
+
try {
|
|
146
|
+
const stats = await fs.stat(filePath);
|
|
147
|
+
if (stats.size > maxSize) {
|
|
148
|
+
throw new Error(`File size (${stats.size} bytes) exceeds maximum allowed size (${maxSize} bytes)`);
|
|
149
|
+
}
|
|
150
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
151
|
+
const extension = path.extname(filePath).slice(1);
|
|
152
|
+
return {
|
|
153
|
+
path: filePath,
|
|
154
|
+
content,
|
|
155
|
+
size: stats.size,
|
|
156
|
+
encoding: 'utf-8',
|
|
157
|
+
language: this.getLanguageFromExtension(extension),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
this.logger.error(`Failed to read file ${filePath}: ${(0, crewx_sdk_1.getErrorMessage)(error)}`, (0, crewx_sdk_1.getErrorStack)(error));
|
|
162
|
+
throw error;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
async getIgnoreRules(workspacePath) {
|
|
166
|
+
const ig = (0, ignore_1.default)();
|
|
167
|
+
try {
|
|
168
|
+
const gitignorePath = path.join(workspacePath, '.gitignore');
|
|
169
|
+
const gitignoreContent = await fs.readFile(gitignorePath, 'utf-8');
|
|
170
|
+
ig.add(gitignoreContent);
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
}
|
|
174
|
+
ig.add(this.getDefaultIgnorePatterns());
|
|
175
|
+
return ig;
|
|
176
|
+
}
|
|
177
|
+
getDefaultIgnorePatterns() {
|
|
178
|
+
return [
|
|
179
|
+
'node_modules/**',
|
|
180
|
+
'.git/**',
|
|
181
|
+
'.DS_Store',
|
|
182
|
+
'*.log',
|
|
183
|
+
'dist/**',
|
|
184
|
+
'build/**',
|
|
185
|
+
'.next/**',
|
|
186
|
+
'coverage/**',
|
|
187
|
+
'.nyc_output/**',
|
|
188
|
+
'*.min.js',
|
|
189
|
+
'*.min.css',
|
|
190
|
+
];
|
|
191
|
+
}
|
|
192
|
+
shouldIgnore(name) {
|
|
193
|
+
const ignoreList = ['.DS_Store', 'Thumbs.db', '.git', 'node_modules'];
|
|
194
|
+
return ignoreList.includes(name) || name.startsWith('.');
|
|
195
|
+
}
|
|
196
|
+
async detectLanguages(workspacePath) {
|
|
197
|
+
const patterns = ['**/*.{js,ts,jsx,tsx,py,java,go,rs,cpp,c,cs,php,rb,swift,kt}'];
|
|
198
|
+
const files = await (0, fast_glob_1.default)(patterns, { cwd: workspacePath });
|
|
199
|
+
const languages = new Set();
|
|
200
|
+
files.forEach((file) => {
|
|
201
|
+
const ext = path.extname(file).slice(1);
|
|
202
|
+
const lang = this.getLanguageFromExtension(ext);
|
|
203
|
+
if (lang)
|
|
204
|
+
languages.add(lang);
|
|
205
|
+
});
|
|
206
|
+
return Array.from(languages);
|
|
207
|
+
}
|
|
208
|
+
async detectFrameworks(workspacePath) {
|
|
209
|
+
const frameworks = [];
|
|
210
|
+
try {
|
|
211
|
+
const packageJsonPath = path.join(workspacePath, 'package.json');
|
|
212
|
+
const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf-8'));
|
|
213
|
+
const deps = { ...packageJson.dependencies, ...packageJson.devDependencies };
|
|
214
|
+
if (deps.react || deps['@types/react'])
|
|
215
|
+
frameworks.push('React');
|
|
216
|
+
if (deps.vue || deps['@vue/cli'])
|
|
217
|
+
frameworks.push('Vue.js');
|
|
218
|
+
if (deps.angular || deps['@angular/core'])
|
|
219
|
+
frameworks.push('Angular');
|
|
220
|
+
if (deps.express)
|
|
221
|
+
frameworks.push('Express.js');
|
|
222
|
+
if (deps.fastify)
|
|
223
|
+
frameworks.push('Fastify');
|
|
224
|
+
if (deps['@nestjs/core'])
|
|
225
|
+
frameworks.push('NestJS');
|
|
226
|
+
if (deps.next)
|
|
227
|
+
frameworks.push('Next.js');
|
|
228
|
+
if (deps.nuxt)
|
|
229
|
+
frameworks.push('Nuxt.js');
|
|
230
|
+
if (deps.svelte)
|
|
231
|
+
frameworks.push('Svelte');
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
}
|
|
235
|
+
return frameworks;
|
|
236
|
+
}
|
|
237
|
+
async getPackageInfo(workspacePath) {
|
|
238
|
+
try {
|
|
239
|
+
const packageJsonPath = path.join(workspacePath, 'package.json');
|
|
240
|
+
const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf-8'));
|
|
241
|
+
return {
|
|
242
|
+
name: packageJson.name,
|
|
243
|
+
version: packageJson.version,
|
|
244
|
+
dependencies: packageJson.dependencies,
|
|
245
|
+
devDependencies: packageJson.devDependencies,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
return undefined;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
getLanguageFromExtension(extension) {
|
|
253
|
+
const languageMap = {
|
|
254
|
+
js: 'JavaScript',
|
|
255
|
+
jsx: 'JavaScript',
|
|
256
|
+
ts: 'TypeScript',
|
|
257
|
+
tsx: 'TypeScript',
|
|
258
|
+
py: 'Python',
|
|
259
|
+
java: 'Java',
|
|
260
|
+
go: 'Go',
|
|
261
|
+
rs: 'Rust',
|
|
262
|
+
cpp: 'C++',
|
|
263
|
+
c: 'C',
|
|
264
|
+
cs: 'C#',
|
|
265
|
+
php: 'PHP',
|
|
266
|
+
rb: 'Ruby',
|
|
267
|
+
swift: 'Swift',
|
|
268
|
+
kt: 'Kotlin',
|
|
269
|
+
};
|
|
270
|
+
return languageMap[extension.toLowerCase()];
|
|
271
|
+
}
|
|
272
|
+
async countFiles(structure) {
|
|
273
|
+
if (structure.type === 'file')
|
|
274
|
+
return 1;
|
|
275
|
+
if (!structure.children)
|
|
276
|
+
return 0;
|
|
277
|
+
let count = 0;
|
|
278
|
+
for (const child of structure.children) {
|
|
279
|
+
count += await this.countFiles(child);
|
|
280
|
+
}
|
|
281
|
+
return count;
|
|
282
|
+
}
|
|
283
|
+
async calculateTotalSize(structure) {
|
|
284
|
+
if (structure.type === 'file')
|
|
285
|
+
return structure.size || 0;
|
|
286
|
+
if (!structure.children)
|
|
287
|
+
return 0;
|
|
288
|
+
let totalSize = 0;
|
|
289
|
+
for (const child of structure.children) {
|
|
290
|
+
totalSize += await this.calculateTotalSize(child);
|
|
291
|
+
}
|
|
292
|
+
return totalSize;
|
|
293
|
+
}
|
|
294
|
+
};
|
|
295
|
+
exports.WorkspaceService = WorkspaceService;
|
|
296
|
+
exports.WorkspaceService = WorkspaceService = WorkspaceService_1 = __decorate([
|
|
297
|
+
(0, common_1.Injectable)()
|
|
298
|
+
], WorkspaceService);
|
|
299
|
+
//# sourceMappingURL=workspace.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.service.js","sourceRoot":"","sources":["../src/workspace.service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@crewx/cli",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.4-rc.0",
|
|
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
|
+
},
|
|
27
33
|
"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:*",
|
|
28
43
|
"@crewx/adapter-slack": "^0.1.4",
|
|
29
|
-
"better-sqlite3": "*"
|
|
30
|
-
"@crewx/sdk": "0.8.3-rc.6",
|
|
31
|
-
"@crewx/memory": "0.1.9",
|
|
32
|
-
"@crewx/search": "0.1.8",
|
|
33
|
-
"@crewx/wbs": "0.1.8",
|
|
34
|
-
"@crewx/doc": "0.1.7",
|
|
35
|
-
"@crewx/cron": "0.1.7",
|
|
36
|
-
"@crewx/workflow": "0.3.16",
|
|
37
|
-
"@crewx/skill": "0.1.7",
|
|
38
|
-
"@crewx/shared": "0.0.4"
|
|
44
|
+
"better-sqlite3": "*"
|
|
39
45
|
},
|
|
40
46
|
"devDependencies": {
|
|
41
47
|
"@types/better-sqlite3": "*",
|
|
42
48
|
"@types/node": "^22.0.0",
|
|
43
49
|
"typescript": "^5.4.0",
|
|
44
50
|
"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,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared SQLite helper for ps/kill/result CLI commands.
|
|
3
|
-
* Reads from (or writes to) the global ~/.crewx/crewx.db
|
|
4
|
-
* populated by SqliteTracingPlugin.
|
|
5
|
-
*/
|
|
6
|
-
import BetterSqlite3 from 'better-sqlite3';
|
|
7
|
-
export type TaskStatus = 'running' | 'success' | 'failed';
|
|
8
|
-
export interface TaskRow {
|
|
9
|
-
id: string;
|
|
10
|
-
agent_id: string;
|
|
11
|
-
prompt: string;
|
|
12
|
-
mode: string;
|
|
13
|
-
status: TaskStatus;
|
|
14
|
-
pid: number | null;
|
|
15
|
-
started_at: string;
|
|
16
|
-
completed_at: string | null;
|
|
17
|
-
result: string | null;
|
|
18
|
-
error: string | null;
|
|
19
|
-
duration_ms: number | null;
|
|
20
|
-
}
|
|
21
|
-
export declare function getDbPath(dbRoot?: string): string;
|
|
22
|
-
export declare function openDb(readonly?: boolean, dbRoot?: string): InstanceType<typeof BetterSqlite3> | null;
|
|
23
|
-
/** Return all tasks with status='running'. */
|
|
24
|
-
export declare function getRunningTasks(dbRoot?: string): TaskRow[];
|
|
25
|
-
/** Return all tasks ordered by started_at desc. */
|
|
26
|
-
export declare function getAllTasks(dbRoot?: string): TaskRow[];
|
|
27
|
-
/** Return a single task by id, or undefined if not found. */
|
|
28
|
-
export declare function getTask(id: string, dbRoot?: string): TaskRow | undefined;
|
|
29
|
-
/** Send SIGTERM to the task's pid and mark it failed. Returns ok/message. */
|
|
30
|
-
export declare function killTask(id: string, dbRoot?: string): {
|
|
31
|
-
ok: boolean;
|
|
32
|
-
message: string;
|
|
33
|
-
};
|
package/dist/commands/task-db.js
DELETED
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Shared SQLite helper for ps/kill/result CLI commands.
|
|
4
|
-
* Reads from (or writes to) the global ~/.crewx/crewx.db
|
|
5
|
-
* populated by SqliteTracingPlugin.
|
|
6
|
-
*/
|
|
7
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
8
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
9
|
-
};
|
|
10
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
-
exports.getDbPath = getDbPath;
|
|
12
|
-
exports.openDb = openDb;
|
|
13
|
-
exports.getRunningTasks = getRunningTasks;
|
|
14
|
-
exports.getAllTasks = getAllTasks;
|
|
15
|
-
exports.getTask = getTask;
|
|
16
|
-
exports.killTask = killTask;
|
|
17
|
-
const fs_1 = require("fs");
|
|
18
|
-
const path_1 = require("path");
|
|
19
|
-
const os_1 = require("os");
|
|
20
|
-
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
21
|
-
function getDbPath(dbRoot) {
|
|
22
|
-
return (0, path_1.join)(dbRoot ?? (0, os_1.homedir)(), '.crewx', 'crewx.db');
|
|
23
|
-
}
|
|
24
|
-
function openDb(readonly = true, dbRoot) {
|
|
25
|
-
const dbPath = getDbPath(dbRoot);
|
|
26
|
-
if (!(0, fs_1.existsSync)(dbPath))
|
|
27
|
-
return null;
|
|
28
|
-
return new better_sqlite3_1.default(dbPath, { readonly });
|
|
29
|
-
}
|
|
30
|
-
/** Return all tasks with status='running'. */
|
|
31
|
-
function getRunningTasks(dbRoot) {
|
|
32
|
-
const db = openDb(true, dbRoot);
|
|
33
|
-
if (!db)
|
|
34
|
-
return [];
|
|
35
|
-
try {
|
|
36
|
-
return db.prepare(`SELECT id, agent_id, prompt, mode, status, pid, started_at, completed_at,
|
|
37
|
-
result, error, duration_ms
|
|
38
|
-
FROM tasks WHERE status = 'running' ORDER BY started_at DESC`).all();
|
|
39
|
-
}
|
|
40
|
-
finally {
|
|
41
|
-
db.close();
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
/** Return all tasks ordered by started_at desc. */
|
|
45
|
-
function getAllTasks(dbRoot) {
|
|
46
|
-
const db = openDb(true, dbRoot);
|
|
47
|
-
if (!db)
|
|
48
|
-
return [];
|
|
49
|
-
try {
|
|
50
|
-
return db.prepare(`SELECT id, agent_id, prompt, mode, status, pid, started_at, completed_at,
|
|
51
|
-
result, error, duration_ms
|
|
52
|
-
FROM tasks ORDER BY started_at DESC`).all();
|
|
53
|
-
}
|
|
54
|
-
finally {
|
|
55
|
-
db.close();
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
/** Return a single task by id, or undefined if not found. */
|
|
59
|
-
function getTask(id, dbRoot) {
|
|
60
|
-
const db = openDb(true, dbRoot);
|
|
61
|
-
if (!db)
|
|
62
|
-
return undefined;
|
|
63
|
-
try {
|
|
64
|
-
return db.prepare(`SELECT id, agent_id, prompt, mode, status, pid, started_at, completed_at,
|
|
65
|
-
result, error, duration_ms
|
|
66
|
-
FROM tasks WHERE id = ?`).get(id);
|
|
67
|
-
}
|
|
68
|
-
finally {
|
|
69
|
-
db.close();
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
/** Send SIGTERM to the task's pid and mark it failed. Returns ok/message. */
|
|
73
|
-
function killTask(id, dbRoot) {
|
|
74
|
-
const db = openDb(false, dbRoot);
|
|
75
|
-
if (!db)
|
|
76
|
-
return { ok: false, message: `crewx.db not found — no running tasks.` };
|
|
77
|
-
try {
|
|
78
|
-
const task = db.prepare(`SELECT id, status, pid FROM tasks WHERE id = ?`).get(id);
|
|
79
|
-
if (!task) {
|
|
80
|
-
return { ok: false, message: `Task not found: ${id}` };
|
|
81
|
-
}
|
|
82
|
-
if (task.status !== 'running') {
|
|
83
|
-
return { ok: false, message: `Task ${id} is not running (status: ${task.status})` };
|
|
84
|
-
}
|
|
85
|
-
if (task.pid) {
|
|
86
|
-
try {
|
|
87
|
-
process.kill(task.pid, 'SIGTERM');
|
|
88
|
-
}
|
|
89
|
-
catch (err) {
|
|
90
|
-
const code = err.code;
|
|
91
|
-
if (code !== 'ESRCH') {
|
|
92
|
-
return {
|
|
93
|
-
ok: false,
|
|
94
|
-
message: `Failed to kill PID ${task.pid}: ${err instanceof Error ? err.message : String(err)}`,
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
// ESRCH = process already gone — still clean up the record
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
db.prepare(`UPDATE tasks SET status='failed', error='killed by user',
|
|
101
|
-
completed_at=?, pid=NULL WHERE id=?`).run(new Date().toISOString(), id);
|
|
102
|
-
return { ok: true, message: `Killed task ${id}${task.pid ? ` (PID: ${task.pid})` : ''}` };
|
|
103
|
-
}
|
|
104
|
-
finally {
|
|
105
|
-
db.close();
|
|
106
|
-
}
|
|
107
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DenyIfTouchesSecretsPlugin — Phase 0 demo HookPlugin.
|
|
3
|
-
*
|
|
4
|
-
* Denies Bash tool calls whose command string contains ".env".
|
|
5
|
-
* Pure string matching — trivially bypassable (see README).
|
|
6
|
-
*
|
|
7
|
-
* SECURITY NOTE:
|
|
8
|
-
* Do NOT include tool.input content in deny reasons.
|
|
9
|
-
* Use static messages only to prevent prompt injection.
|
|
10
|
-
* ✅ return ctx.deny('Secrets-related command');
|
|
11
|
-
* ❌ return ctx.deny(`Blocked: ${cmd}`);
|
|
12
|
-
*/
|
|
13
|
-
import { HookPlugin } from '@crewx/sdk/hooks';
|
|
14
|
-
import type { HookContext, HookResult } from '@crewx/sdk/hooks';
|
|
15
|
-
export declare class DenyIfTouchesSecretsPlugin extends HookPlugin {
|
|
16
|
-
readonly name = "deny-secrets";
|
|
17
|
-
readonly version = "0.1.0";
|
|
18
|
-
readonly capabilities: {
|
|
19
|
-
required: readonly ["deny"];
|
|
20
|
-
};
|
|
21
|
-
run(ctx: HookContext): Promise<HookResult>;
|
|
22
|
-
}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* DenyIfTouchesSecretsPlugin — Phase 0 demo HookPlugin.
|
|
4
|
-
*
|
|
5
|
-
* Denies Bash tool calls whose command string contains ".env".
|
|
6
|
-
* Pure string matching — trivially bypassable (see README).
|
|
7
|
-
*
|
|
8
|
-
* SECURITY NOTE:
|
|
9
|
-
* Do NOT include tool.input content in deny reasons.
|
|
10
|
-
* Use static messages only to prevent prompt injection.
|
|
11
|
-
* ✅ return ctx.deny('Secrets-related command');
|
|
12
|
-
* ❌ return ctx.deny(`Blocked: ${cmd}`);
|
|
13
|
-
*/
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.DenyIfTouchesSecretsPlugin = void 0;
|
|
16
|
-
const hooks_1 = require("@crewx/sdk/hooks");
|
|
17
|
-
const SECRET_PATTERNS = ['.env', 'credentials.json', 'service-account-key.json'];
|
|
18
|
-
const SHELL_TOOL_NAMES = new Set(['Bash', 'shell', 'local_shell']);
|
|
19
|
-
class DenyIfTouchesSecretsPlugin extends hooks_1.HookPlugin {
|
|
20
|
-
name = 'deny-secrets';
|
|
21
|
-
version = '0.1.0';
|
|
22
|
-
capabilities = { required: ['deny'] };
|
|
23
|
-
async run(ctx) {
|
|
24
|
-
if (!SHELL_TOOL_NAMES.has(ctx.tool.rawName) && ctx.tool.name !== 'shell') {
|
|
25
|
-
return ctx.pass();
|
|
26
|
-
}
|
|
27
|
-
const input = ctx.tool.input;
|
|
28
|
-
const command = input?.command;
|
|
29
|
-
if (typeof command !== 'string') {
|
|
30
|
-
return ctx.pass();
|
|
31
|
-
}
|
|
32
|
-
for (const pattern of SECRET_PATTERNS) {
|
|
33
|
-
if (command.includes(pattern)) {
|
|
34
|
-
return ctx.deny('Secrets-related command');
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
return ctx.pass();
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
exports.DenyIfTouchesSecretsPlugin = DenyIfTouchesSecretsPlugin;
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* EchoObserverPlugin — Tool observer that echoes events to a JSONL log.
|
|
3
|
-
*
|
|
4
|
-
* Observes tool:before / tool:after events from the Crewx event bus
|
|
5
|
-
* and appends them as JSONL to ~/.crewx/logs/echo-hook.log.
|
|
6
|
-
* Pure observer — no flow control (deny/inject/modify not applicable).
|
|
7
|
-
*/
|
|
8
|
-
import { ToolObserverPlugin } from '@crewx/sdk/hooks';
|
|
9
|
-
import type { ObserverContext, ObserverResult } from '@crewx/sdk/hooks';
|
|
10
|
-
export declare class EchoHookPlugin extends ToolObserverPlugin {
|
|
11
|
-
readonly name = "echo-hook";
|
|
12
|
-
readonly version = "0.0.1";
|
|
13
|
-
readonly on: {
|
|
14
|
-
beforeTool: true;
|
|
15
|
-
afterTool: true;
|
|
16
|
-
beforePrompt: true;
|
|
17
|
-
sessionStart: true;
|
|
18
|
-
};
|
|
19
|
-
private readonly logPath;
|
|
20
|
-
constructor(logDir?: string);
|
|
21
|
-
run(ctx: ObserverContext): Promise<ObserverResult>;
|
|
22
|
-
private ensureLogDir;
|
|
23
|
-
private echo;
|
|
24
|
-
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* EchoObserverPlugin — Tool observer that echoes events to a JSONL log.
|
|
4
|
-
*
|
|
5
|
-
* Observes tool:before / tool:after events from the Crewx event bus
|
|
6
|
-
* and appends them as JSONL to ~/.crewx/logs/echo-hook.log.
|
|
7
|
-
* Pure observer — no flow control (deny/inject/modify not applicable).
|
|
8
|
-
*/
|
|
9
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.EchoHookPlugin = void 0;
|
|
11
|
-
const fs_1 = require("fs");
|
|
12
|
-
const path_1 = require("path");
|
|
13
|
-
const os_1 = require("os");
|
|
14
|
-
const hooks_1 = require("@crewx/sdk/hooks");
|
|
15
|
-
class EchoHookPlugin extends hooks_1.ToolObserverPlugin {
|
|
16
|
-
name = 'echo-hook';
|
|
17
|
-
version = '0.0.1';
|
|
18
|
-
on = {
|
|
19
|
-
beforeTool: true,
|
|
20
|
-
afterTool: true,
|
|
21
|
-
beforePrompt: true,
|
|
22
|
-
sessionStart: true,
|
|
23
|
-
};
|
|
24
|
-
logPath;
|
|
25
|
-
constructor(logDir) {
|
|
26
|
-
super();
|
|
27
|
-
this.logPath = (0, path_1.join)(logDir ?? (0, os_1.homedir)(), '.crewx', 'logs', 'echo-hook.log');
|
|
28
|
-
this.ensureLogDir();
|
|
29
|
-
}
|
|
30
|
-
async run(ctx) {
|
|
31
|
-
this.echo(ctx);
|
|
32
|
-
return ctx.pass();
|
|
33
|
-
}
|
|
34
|
-
ensureLogDir() {
|
|
35
|
-
const dir = (0, path_1.dirname)(this.logPath);
|
|
36
|
-
if (!(0, fs_1.existsSync)(dir)) {
|
|
37
|
-
(0, fs_1.mkdirSync)(dir, { recursive: true, mode: 0o700 });
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
echo(ctx) {
|
|
41
|
-
try {
|
|
42
|
-
const line = JSON.stringify({
|
|
43
|
-
timestamp: new Date().toISOString(),
|
|
44
|
-
event: ctx.event,
|
|
45
|
-
traceId: ctx.traceId,
|
|
46
|
-
agent: ctx.agent,
|
|
47
|
-
provider: ctx.provider,
|
|
48
|
-
thread: ctx.thread,
|
|
49
|
-
tool: ctx.tool,
|
|
50
|
-
cwd: ctx.cwd,
|
|
51
|
-
sessionId: ctx.sessionId,
|
|
52
|
-
});
|
|
53
|
-
(0, fs_1.appendFileSync)(this.logPath, line + '\n', { encoding: 'utf8', mode: 0o600 });
|
|
54
|
-
}
|
|
55
|
-
catch {
|
|
56
|
-
// Non-fatal
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
exports.EchoHookPlugin = EchoHookPlugin;
|