@archznn/crewloop-skills 0.3.0 → 0.4.1
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/package.json +16 -3
- package/packages/cli/README.md +55 -0
- package/packages/cli/bin/crewloop.js +6 -0
- package/packages/cli/dist/agents.d.ts +7 -0
- package/packages/cli/dist/agents.d.ts.map +1 -0
- package/packages/cli/dist/agents.js +31 -0
- package/packages/cli/dist/agents.js.map +1 -0
- package/packages/cli/dist/cli.d.ts +14 -0
- package/packages/cli/dist/cli.d.ts.map +1 -0
- package/packages/cli/dist/cli.js +255 -0
- package/packages/cli/dist/cli.js.map +1 -0
- package/packages/cli/dist/installer.d.ts +19 -0
- package/packages/cli/dist/installer.d.ts.map +1 -0
- package/packages/cli/dist/installer.js +89 -0
- package/packages/cli/dist/installer.js.map +1 -0
- package/packages/cli/dist/mcp.d.ts +20 -0
- package/packages/cli/dist/mcp.d.ts.map +1 -0
- package/packages/cli/dist/mcp.js +130 -0
- package/packages/cli/dist/mcp.js.map +1 -0
- package/packages/cli/dist/resolver.d.ts +7 -0
- package/packages/cli/dist/resolver.d.ts.map +1 -0
- package/packages/cli/dist/resolver.js +57 -0
- package/packages/cli/dist/resolver.js.map +1 -0
- package/packages/cli/dist/tests/agents.test.d.ts +2 -0
- package/packages/cli/dist/tests/agents.test.d.ts.map +1 -0
- package/packages/cli/dist/tests/agents.test.js +27 -0
- package/packages/cli/dist/tests/agents.test.js.map +1 -0
- package/packages/cli/dist/tests/cli.test.d.ts +2 -0
- package/packages/cli/dist/tests/cli.test.d.ts.map +1 -0
- package/packages/cli/dist/tests/cli.test.js +103 -0
- package/packages/cli/dist/tests/cli.test.js.map +1 -0
- package/packages/cli/dist/tests/installer.test.d.ts +2 -0
- package/packages/cli/dist/tests/installer.test.d.ts.map +1 -0
- package/packages/cli/dist/tests/installer.test.js +129 -0
- package/packages/cli/dist/tests/installer.test.js.map +1 -0
- package/packages/cli/dist/tests/mcp.test.d.ts +2 -0
- package/packages/cli/dist/tests/mcp.test.d.ts.map +1 -0
- package/packages/cli/dist/tests/mcp.test.js +153 -0
- package/packages/cli/dist/tests/mcp.test.js.map +1 -0
- package/packages/cli/dist/tests/resolver.test.d.ts +2 -0
- package/packages/cli/dist/tests/resolver.test.d.ts.map +1 -0
- package/packages/cli/dist/tests/resolver.test.js +41 -0
- package/packages/cli/dist/tests/resolver.test.js.map +1 -0
- package/servers/dashboard/README.md +87 -0
- package/servers/dashboard/bin/crewloop-dashboard.js +5 -0
- package/servers/dashboard/config-examples/codex-hooks.json +14 -0
- package/servers/dashboard/config-examples/kimi-code-config.toml +6 -0
- package/servers/dashboard/config-examples/opencode-plugin/crewloop-dashboard.js +64 -0
- package/servers/dashboard/dist/adapters/codex.d.ts +23 -0
- package/servers/dashboard/dist/adapters/codex.d.ts.map +1 -0
- package/servers/dashboard/dist/adapters/codex.js +28 -0
- package/servers/dashboard/dist/adapters/codex.js.map +1 -0
- package/servers/dashboard/dist/adapters/kimi.d.ts +13 -0
- package/servers/dashboard/dist/adapters/kimi.d.ts.map +1 -0
- package/servers/dashboard/dist/adapters/kimi.js +28 -0
- package/servers/dashboard/dist/adapters/kimi.js.map +1 -0
- package/servers/dashboard/dist/adapters/opencode.d.ts +9 -0
- package/servers/dashboard/dist/adapters/opencode.d.ts.map +1 -0
- package/servers/dashboard/dist/adapters/opencode.js +26 -0
- package/servers/dashboard/dist/adapters/opencode.js.map +1 -0
- package/servers/dashboard/dist/adapters/shim.d.ts +7 -0
- package/servers/dashboard/dist/adapters/shim.d.ts.map +1 -0
- package/servers/dashboard/dist/adapters/shim.js +107 -0
- package/servers/dashboard/dist/adapters/shim.js.map +1 -0
- package/servers/dashboard/dist/adapters/shim.test.d.ts +2 -0
- package/servers/dashboard/dist/adapters/shim.test.d.ts.map +1 -0
- package/servers/dashboard/dist/adapters/shim.test.js +72 -0
- package/servers/dashboard/dist/adapters/shim.test.js.map +1 -0
- package/servers/dashboard/dist/api/event.d.ts +13 -0
- package/servers/dashboard/dist/api/event.d.ts.map +1 -0
- package/servers/dashboard/dist/api/event.js +52 -0
- package/servers/dashboard/dist/api/event.js.map +1 -0
- package/servers/dashboard/dist/api/skills.d.ts +4 -0
- package/servers/dashboard/dist/api/skills.d.ts.map +1 -0
- package/servers/dashboard/dist/api/skills.js +12 -0
- package/servers/dashboard/dist/api/skills.js.map +1 -0
- package/servers/dashboard/dist/config.d.ts +11 -0
- package/servers/dashboard/dist/config.d.ts.map +1 -0
- package/servers/dashboard/dist/config.js +65 -0
- package/servers/dashboard/dist/config.js.map +1 -0
- package/servers/dashboard/dist/filters/sanitize.d.ts +14 -0
- package/servers/dashboard/dist/filters/sanitize.d.ts.map +1 -0
- package/servers/dashboard/dist/filters/sanitize.js +64 -0
- package/servers/dashboard/dist/filters/sanitize.js.map +1 -0
- package/servers/dashboard/dist/filters/sanitize.test.d.ts +2 -0
- package/servers/dashboard/dist/filters/sanitize.test.d.ts.map +1 -0
- package/servers/dashboard/dist/filters/sanitize.test.js +71 -0
- package/servers/dashboard/dist/filters/sanitize.test.js.map +1 -0
- package/servers/dashboard/dist/index.d.ts +2 -0
- package/servers/dashboard/dist/index.d.ts.map +1 -0
- package/servers/dashboard/dist/index.js +22 -0
- package/servers/dashboard/dist/index.js.map +1 -0
- package/servers/dashboard/dist/presenter.d.ts +7 -0
- package/servers/dashboard/dist/presenter.d.ts.map +1 -0
- package/servers/dashboard/dist/presenter.js +54 -0
- package/servers/dashboard/dist/presenter.js.map +1 -0
- package/servers/dashboard/dist/presenter.test.d.ts +2 -0
- package/servers/dashboard/dist/presenter.test.d.ts.map +1 -0
- package/servers/dashboard/dist/presenter.test.js +66 -0
- package/servers/dashboard/dist/presenter.test.js.map +1 -0
- package/servers/dashboard/dist/server.d.ts +13 -0
- package/servers/dashboard/dist/server.d.ts.map +1 -0
- package/servers/dashboard/dist/server.js +162 -0
- package/servers/dashboard/dist/server.js.map +1 -0
- package/servers/dashboard/dist/server.test.d.ts +2 -0
- package/servers/dashboard/dist/server.test.d.ts.map +1 -0
- package/servers/dashboard/dist/server.test.js +113 -0
- package/servers/dashboard/dist/server.test.js.map +1 -0
- package/servers/dashboard/dist/skills/infer.d.ts +8 -0
- package/servers/dashboard/dist/skills/infer.d.ts.map +1 -0
- package/servers/dashboard/dist/skills/infer.js +48 -0
- package/servers/dashboard/dist/skills/infer.js.map +1 -0
- package/servers/dashboard/dist/skills/infer.test.d.ts +2 -0
- package/servers/dashboard/dist/skills/infer.test.d.ts.map +1 -0
- package/servers/dashboard/dist/skills/infer.test.js +82 -0
- package/servers/dashboard/dist/skills/infer.test.js.map +1 -0
- package/servers/dashboard/dist/skills/mapping.d.ts +5 -0
- package/servers/dashboard/dist/skills/mapping.d.ts.map +1 -0
- package/servers/dashboard/dist/skills/mapping.js +28 -0
- package/servers/dashboard/dist/skills/mapping.js.map +1 -0
- package/servers/dashboard/dist/skills/registry.d.ts +11 -0
- package/servers/dashboard/dist/skills/registry.d.ts.map +1 -0
- package/servers/dashboard/dist/skills/registry.js +59 -0
- package/servers/dashboard/dist/skills/registry.js.map +1 -0
- package/servers/dashboard/dist/state.d.ts +18 -0
- package/servers/dashboard/dist/state.d.ts.map +1 -0
- package/servers/dashboard/dist/state.js +91 -0
- package/servers/dashboard/dist/state.js.map +1 -0
- package/servers/dashboard/dist/state.test.d.ts +2 -0
- package/servers/dashboard/dist/state.test.d.ts.map +1 -0
- package/servers/dashboard/dist/state.test.js +83 -0
- package/servers/dashboard/dist/state.test.js.map +1 -0
- package/servers/dashboard/dist/types.d.ts +86 -0
- package/servers/dashboard/dist/types.d.ts.map +1 -0
- package/servers/dashboard/dist/types.js +3 -0
- package/servers/dashboard/dist/types.js.map +1 -0
- package/servers/dashboard/package.json +46 -0
- package/servers/dashboard/public/app.js +447 -0
- package/servers/dashboard/public/index.html +96 -0
- package/servers/dashboard/public/styles.css +664 -0
- package/servers/dashboard/src/adapters/codex.ts +50 -0
- package/servers/dashboard/src/adapters/kimi.ts +40 -0
- package/servers/dashboard/src/adapters/opencode.ts +36 -0
- package/servers/dashboard/src/adapters/shim.test.ts +74 -0
- package/servers/dashboard/src/adapters/shim.ts +120 -0
- package/servers/dashboard/src/api/event.ts +70 -0
- package/servers/dashboard/src/api/skills.ts +11 -0
- package/servers/dashboard/src/config.ts +66 -0
- package/servers/dashboard/src/filters/sanitize.test.ts +94 -0
- package/servers/dashboard/src/filters/sanitize.ts +78 -0
- package/servers/dashboard/src/index.ts +24 -0
- package/servers/dashboard/src/presenter.test.ts +69 -0
- package/servers/dashboard/src/presenter.ts +56 -0
- package/servers/dashboard/src/server.test.ts +123 -0
- package/servers/dashboard/src/server.ts +191 -0
- package/servers/dashboard/src/skills/infer.test.ts +86 -0
- package/servers/dashboard/src/skills/infer.ts +53 -0
- package/servers/dashboard/src/skills/mapping.ts +26 -0
- package/servers/dashboard/src/skills/registry.ts +60 -0
- package/servers/dashboard/src/state.test.ts +88 -0
- package/servers/dashboard/src/state.ts +115 -0
- package/servers/dashboard/src/types.ts +110 -0
- package/servers/dashboard/tsconfig.json +19 -0
- package/skills/orchestrator/SKILL.md +1 -1
|
@@ -0,0 +1,153 @@
|
|
|
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
|
+
const node_test_1 = require("node:test");
|
|
7
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
8
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
9
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
10
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
11
|
+
const mcp_1 = require("../mcp");
|
|
12
|
+
function createFakePython(baseDir) {
|
|
13
|
+
const isWindows = node_os_1.default.platform() === 'win32';
|
|
14
|
+
const binDir = node_path_1.default.join(baseDir, 'bin');
|
|
15
|
+
node_fs_1.default.mkdirSync(binDir, { recursive: true });
|
|
16
|
+
const pythonCmd = node_path_1.default.join(binDir, isWindows ? 'python.cmd' : 'python');
|
|
17
|
+
const unixScript = `#!/bin/sh
|
|
18
|
+
if [ "$1" = "--version" ]; then exit 0; fi
|
|
19
|
+
if [ "$1" = "-m" ] && [ "$2" = "venv" ]; then
|
|
20
|
+
VENV="$3"
|
|
21
|
+
mkdir -p "$VENV/bin"
|
|
22
|
+
mkdir -p "$VENV/Scripts"
|
|
23
|
+
if [ -n "$CREWLOOP_PIP_FAIL" ]; then
|
|
24
|
+
cat > "$VENV/bin/pip" <<'PIP_EOF'
|
|
25
|
+
#!/bin/sh
|
|
26
|
+
exit 1
|
|
27
|
+
PIP_EOF
|
|
28
|
+
else
|
|
29
|
+
cat > "$VENV/bin/pip" <<'PIP_EOF'
|
|
30
|
+
#!/bin/sh
|
|
31
|
+
if [ "$1" = "install" ]; then
|
|
32
|
+
touch "$(dirname "$0")/obsidian-mcp"
|
|
33
|
+
exit 0
|
|
34
|
+
fi
|
|
35
|
+
exit 1
|
|
36
|
+
PIP_EOF
|
|
37
|
+
fi
|
|
38
|
+
chmod +x "$VENV/bin/pip"
|
|
39
|
+
exit 0
|
|
40
|
+
fi
|
|
41
|
+
exit 1
|
|
42
|
+
`;
|
|
43
|
+
const windowsScript = `@echo off
|
|
44
|
+
if "%1"=="--version" exit /b 0
|
|
45
|
+
if "%1"=="-m" if "%2"=="venv" (
|
|
46
|
+
mkdir "%3/Scripts"
|
|
47
|
+
mkdir "%3/bin"
|
|
48
|
+
if defined CREWLOOP_PIP_FAIL (
|
|
49
|
+
(
|
|
50
|
+
echo @echo off
|
|
51
|
+
echo exit /b 1
|
|
52
|
+
) > "%3/Scripts/pip.cmd"
|
|
53
|
+
) else (
|
|
54
|
+
(
|
|
55
|
+
echo @echo off
|
|
56
|
+
echo if "%%1"=="install" ^(
|
|
57
|
+
echo type nul ^> "%%~dp0obsidian-mcp.exe"
|
|
58
|
+
echo exit /b 0
|
|
59
|
+
echo ^)
|
|
60
|
+
echo exit /b 1
|
|
61
|
+
) > "%3/Scripts/pip.cmd"
|
|
62
|
+
)
|
|
63
|
+
exit /b 0
|
|
64
|
+
)
|
|
65
|
+
exit /b 1
|
|
66
|
+
`;
|
|
67
|
+
node_fs_1.default.writeFileSync(pythonCmd, isWindows ? windowsScript : unixScript);
|
|
68
|
+
if (!isWindows) {
|
|
69
|
+
node_fs_1.default.chmodSync(pythonCmd, 0o755);
|
|
70
|
+
}
|
|
71
|
+
return { pythonCmd };
|
|
72
|
+
}
|
|
73
|
+
(0, node_test_1.describe)('mcp', () => {
|
|
74
|
+
let mcpSourceDir;
|
|
75
|
+
let localBinDir;
|
|
76
|
+
let fakePythonDir;
|
|
77
|
+
(0, node_test_1.before)(() => {
|
|
78
|
+
mcpSourceDir = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'crewloop-mcp-'));
|
|
79
|
+
localBinDir = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'crewloop-bin-'));
|
|
80
|
+
fakePythonDir = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'crewloop-fakepy-'));
|
|
81
|
+
node_fs_1.default.writeFileSync(node_path_1.default.join(mcpSourceDir, 'pyproject.toml'), '[project]\nname = "obsidian-mcp"\n');
|
|
82
|
+
});
|
|
83
|
+
(0, node_test_1.after)(() => {
|
|
84
|
+
node_fs_1.default.rmSync(mcpSourceDir, { recursive: true, force: true });
|
|
85
|
+
node_fs_1.default.rmSync(localBinDir, { recursive: true, force: true });
|
|
86
|
+
node_fs_1.default.rmSync(fakePythonDir, { recursive: true, force: true });
|
|
87
|
+
delete process.env.CREWLOOP_PIP_FAIL;
|
|
88
|
+
});
|
|
89
|
+
(0, node_test_1.it)('dry-run reports would-install without creating venv', () => {
|
|
90
|
+
const { pythonCmd } = createFakePython(fakePythonDir);
|
|
91
|
+
const result = (0, mcp_1.installMcpServer)(mcpSourceDir, {
|
|
92
|
+
dryRun: true,
|
|
93
|
+
pythonCmd,
|
|
94
|
+
localBinDir,
|
|
95
|
+
});
|
|
96
|
+
node_assert_1.default.strictEqual(result.installed, true);
|
|
97
|
+
node_assert_1.default.strictEqual(result.skipped, false);
|
|
98
|
+
node_assert_1.default.strictEqual(result.error, undefined);
|
|
99
|
+
node_assert_1.default.ok(result.binaryPath);
|
|
100
|
+
node_assert_1.default.ok(!node_fs_1.default.existsSync(node_path_1.default.join(mcpSourceDir, '.venv')));
|
|
101
|
+
});
|
|
102
|
+
(0, node_test_1.it)('missing python is reported as an error but not thrown', () => {
|
|
103
|
+
const result = (0, mcp_1.installMcpServer)(mcpSourceDir, {
|
|
104
|
+
pythonCmd: node_path_1.default.join(fakePythonDir, 'missing-python'),
|
|
105
|
+
localBinDir,
|
|
106
|
+
});
|
|
107
|
+
node_assert_1.default.strictEqual(result.installed, false);
|
|
108
|
+
node_assert_1.default.strictEqual(result.skipped, false);
|
|
109
|
+
node_assert_1.default.ok(result.error);
|
|
110
|
+
node_assert_1.default.ok(result.error.message.includes('Python not found'));
|
|
111
|
+
});
|
|
112
|
+
(0, node_test_1.it)('pip failure is reported as an error', () => {
|
|
113
|
+
const { pythonCmd } = createFakePython(fakePythonDir);
|
|
114
|
+
process.env.CREWLOOP_PIP_FAIL = '1';
|
|
115
|
+
try {
|
|
116
|
+
const result = (0, mcp_1.installMcpServer)(mcpSourceDir, {
|
|
117
|
+
pythonCmd,
|
|
118
|
+
localBinDir,
|
|
119
|
+
force: true,
|
|
120
|
+
});
|
|
121
|
+
node_assert_1.default.strictEqual(result.installed, false);
|
|
122
|
+
node_assert_1.default.strictEqual(result.skipped, false);
|
|
123
|
+
node_assert_1.default.ok(result.error);
|
|
124
|
+
}
|
|
125
|
+
finally {
|
|
126
|
+
delete process.env.CREWLOOP_PIP_FAIL;
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
(0, node_test_1.it)('successful install creates venv, runs pip, and exposes binary', () => {
|
|
130
|
+
const { pythonCmd } = createFakePython(fakePythonDir);
|
|
131
|
+
const result = (0, mcp_1.installMcpServer)(mcpSourceDir, {
|
|
132
|
+
pythonCmd,
|
|
133
|
+
localBinDir,
|
|
134
|
+
force: true,
|
|
135
|
+
});
|
|
136
|
+
node_assert_1.default.strictEqual(result.installed, true);
|
|
137
|
+
node_assert_1.default.strictEqual(result.skipped, false);
|
|
138
|
+
node_assert_1.default.strictEqual(result.error, undefined);
|
|
139
|
+
node_assert_1.default.ok(result.binaryPath);
|
|
140
|
+
node_assert_1.default.ok(node_fs_1.default.existsSync(result.binaryPath));
|
|
141
|
+
});
|
|
142
|
+
(0, node_test_1.it)('skips install when binary already exists and force is false', () => {
|
|
143
|
+
const { pythonCmd } = createFakePython(fakePythonDir);
|
|
144
|
+
const result = (0, mcp_1.installMcpServer)(mcpSourceDir, {
|
|
145
|
+
pythonCmd,
|
|
146
|
+
localBinDir,
|
|
147
|
+
});
|
|
148
|
+
node_assert_1.default.strictEqual(result.installed, false);
|
|
149
|
+
node_assert_1.default.strictEqual(result.skipped, true);
|
|
150
|
+
node_assert_1.default.ok(result.binaryPath);
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
//# sourceMappingURL=mcp.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.test.js","sourceRoot":"","sources":["../../src/tests/mcp.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.test.d.ts","sourceRoot":"","sources":["../../src/tests/resolver.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,41 @@
|
|
|
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
|
+
const node_test_1 = require("node:test");
|
|
7
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
8
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
9
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
10
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
11
|
+
const resolver_1 = require("../resolver");
|
|
12
|
+
(0, node_test_1.describe)('resolver', () => {
|
|
13
|
+
let tmpDir;
|
|
14
|
+
(0, node_test_1.before)(() => {
|
|
15
|
+
tmpDir = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'crewloop-resolver-'));
|
|
16
|
+
const skillsDir = node_path_1.default.join(tmpDir, 'skills');
|
|
17
|
+
node_fs_1.default.mkdirSync(node_path_1.default.join(skillsDir, 'architect'), { recursive: true });
|
|
18
|
+
node_fs_1.default.mkdirSync(node_path_1.default.join(skillsDir, 'engineer'), { recursive: true });
|
|
19
|
+
node_fs_1.default.writeFileSync(node_path_1.default.join(skillsDir, 'architect', 'SKILL.md'), '---\nname: architect\ndescription: Creates specs\n---\n# Architect\n');
|
|
20
|
+
node_fs_1.default.writeFileSync(node_path_1.default.join(skillsDir, 'engineer', 'SKILL.md'), '---\nname: engineer\ndescription: Builds code\n---\n# Engineer\n');
|
|
21
|
+
});
|
|
22
|
+
(0, node_test_1.after)(() => {
|
|
23
|
+
node_fs_1.default.rmSync(tmpDir, { recursive: true, force: true });
|
|
24
|
+
});
|
|
25
|
+
(0, node_test_1.it)('discovers all skills', () => {
|
|
26
|
+
const skills = (0, resolver_1.resolveSkills)(tmpDir);
|
|
27
|
+
node_assert_1.default.strictEqual(skills.length, 2);
|
|
28
|
+
node_assert_1.default.ok(skills.some((s) => s.name === 'architect'));
|
|
29
|
+
node_assert_1.default.ok(skills.some((s) => s.name === 'engineer'));
|
|
30
|
+
});
|
|
31
|
+
(0, node_test_1.it)('filters skills by name', () => {
|
|
32
|
+
const skills = (0, resolver_1.resolveSkills)(tmpDir, ['architect']);
|
|
33
|
+
node_assert_1.default.strictEqual(skills.length, 1);
|
|
34
|
+
node_assert_1.default.strictEqual(skills[0].name, 'architect');
|
|
35
|
+
node_assert_1.default.strictEqual(skills[0].description, 'Creates specs');
|
|
36
|
+
});
|
|
37
|
+
(0, node_test_1.it)('throws when skills directory is missing', () => {
|
|
38
|
+
node_assert_1.default.throws(() => (0, resolver_1.resolveSkills)(node_path_1.default.join(tmpDir, 'missing')), /Skills directory not found/);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=resolver.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.test.js","sourceRoot":"","sources":["../../src/tests/resolver.test.ts"],"names":[],"mappings":";;;;;AAAA,yCAAwD;AACxD,8DAAiC;AACjC,sDAAyB;AACzB,0DAA6B;AAC7B,sDAAyB;AACzB,0CAA4C;AAE5C,IAAA,oBAAQ,EAAC,UAAU,EAAE,GAAG,EAAE;IACxB,IAAI,MAAc,CAAC;IAEnB,IAAA,kBAAM,EAAC,GAAG,EAAE;QACV,MAAM,GAAG,iBAAE,CAAC,WAAW,CAAC,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,MAAM,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC;QACtE,MAAM,SAAS,GAAG,mBAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC9C,iBAAE,CAAC,SAAS,CAAC,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,iBAAE,CAAC,SAAS,CAAC,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,iBAAE,CAAC,aAAa,CACd,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,EAC7C,sEAAsE,CACvE,CAAC;QACF,iBAAE,CAAC,aAAa,CACd,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC,EAC5C,kEAAkE,CACnE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAK,EAAC,GAAG,EAAE;QACT,iBAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,MAAM,GAAG,IAAA,wBAAa,EAAC,MAAM,CAAC,CAAC;QACrC,qBAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACrC,qBAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC;QACxE,qBAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,MAAM,GAAG,IAAA,wBAAa,EAAC,MAAM,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;QACpD,qBAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACrC,qBAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAChD,qBAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,IAAA,cAAE,EAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,qBAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAA,wBAAa,EAAC,mBAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,EAAE,4BAA4B,CAAC,CAAC;IACjG,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# CrewLoop Dashboard
|
|
2
|
+
|
|
3
|
+
Real-time skill dashboard for CrewLoop agents. It shows which skill an agent is currently running, the tools it invokes, and a live event timeline — all in a browser.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- Live skill inference from agent tool usage.
|
|
8
|
+
- WebSocket updates with in-memory session state.
|
|
9
|
+
- Sanitized event stream: no commands, secrets, or file contents reach the UI.
|
|
10
|
+
- Dark/light mode and reduced-motion support.
|
|
11
|
+
- Session selector for multi-agent monitoring.
|
|
12
|
+
- `crewloop dashboard` CLI command.
|
|
13
|
+
|
|
14
|
+
## Quick start
|
|
15
|
+
|
|
16
|
+
### From the CrewLoop repository
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
cd servers/dashboard
|
|
20
|
+
npm install
|
|
21
|
+
npm run build
|
|
22
|
+
npm start
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Open `http://127.0.0.1:7890`.
|
|
26
|
+
|
|
27
|
+
### From the CrewLoop CLI
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
crewloop dashboard
|
|
31
|
+
# or
|
|
32
|
+
crewloop dashboard --port 8080 --host 0.0.0.0
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
The CLI looks for the dashboard server inside the `@archznn/crewloop-skills` package under `servers/dashboard`. Build it first if it is not present.
|
|
36
|
+
|
|
37
|
+
## Environment variables
|
|
38
|
+
|
|
39
|
+
| Variable | Default | Description |
|
|
40
|
+
|----------|---------|-------------|
|
|
41
|
+
| `CREWLOOP_DASHBOARD_PORT` | `7890` | HTTP/WebSocket port |
|
|
42
|
+
| `CREWLOOP_DASHBOARD_HOST` | `127.0.0.1` | Bind address |
|
|
43
|
+
|
|
44
|
+
## Agent integration
|
|
45
|
+
|
|
46
|
+
Agents send JSON events to `POST http://127.0.0.1:7890/event`. The included shim (`dist/adapters/shim.js`) normalizes Kimi and Codex hook payloads and forwards them.
|
|
47
|
+
|
|
48
|
+
See `config-examples/` for:
|
|
49
|
+
- `kimi-code-config.toml` — Kimi Code hook configuration.
|
|
50
|
+
- `codex-hooks.json` — Codex CLI hook configuration.
|
|
51
|
+
- `opencode-plugin/crewloop-dashboard.js` — OpenCode plugin example.
|
|
52
|
+
|
|
53
|
+
### Event schema
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
interface DashboardEvent {
|
|
57
|
+
id: string;
|
|
58
|
+
timestamp: number;
|
|
59
|
+
source: 'kimi' | 'codex' | 'opencode' | 'log-watcher';
|
|
60
|
+
session_id: string;
|
|
61
|
+
event_type: 'session_start' | 'session_end' | 'tool_start' | 'tool_end' | 'skill_change';
|
|
62
|
+
skill?: string;
|
|
63
|
+
tool?: string;
|
|
64
|
+
detail?: string;
|
|
65
|
+
status?: 'running' | 'success' | 'error';
|
|
66
|
+
duration_ms?: number;
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Security
|
|
71
|
+
|
|
72
|
+
- The server binds to `127.0.0.1` by default.
|
|
73
|
+
- Dangerous keys (`command`, `content`, `token`, `api_key`, etc.) are stripped before storage and broadcast.
|
|
74
|
+
- Events containing dangerous top-level keys are rejected.
|
|
75
|
+
|
|
76
|
+
## Development
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
npm run typecheck
|
|
80
|
+
npm run build
|
|
81
|
+
npm test
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Known limitations
|
|
85
|
+
|
|
86
|
+
- Codex file-edit hooks do not always expose the tool name; in those cases skill inference falls back to the session's previous active skill.
|
|
87
|
+
- The log watcher adapter is a deferred fallback and not yet implemented.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://example.com/codex-hooks-schema.json",
|
|
3
|
+
"description": "Codex CLI hook configuration for CrewLoop dashboard.",
|
|
4
|
+
"hooks": {
|
|
5
|
+
"before_tool_use": {
|
|
6
|
+
"command": "crewloop-shim",
|
|
7
|
+
"args": ["codex"]
|
|
8
|
+
},
|
|
9
|
+
"after_tool_use": {
|
|
10
|
+
"command": "crewloop-shim",
|
|
11
|
+
"args": ["codex"]
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// OpenCode plugin example for CrewLoop dashboard.
|
|
2
|
+
// Loads agent context and posts tool events to the local dashboard server.
|
|
3
|
+
|
|
4
|
+
const http = require('node:http');
|
|
5
|
+
const { env } = require('node:process');
|
|
6
|
+
|
|
7
|
+
const DEFAULT_URL = 'http://127.0.0.1:7890';
|
|
8
|
+
|
|
9
|
+
function postEvent(event) {
|
|
10
|
+
const serverUrl = env.CREWLOOP_DASHBOARD_URL || DEFAULT_URL;
|
|
11
|
+
const body = JSON.stringify(event);
|
|
12
|
+
const url = new URL('/event', serverUrl);
|
|
13
|
+
|
|
14
|
+
const req = http.request(
|
|
15
|
+
{
|
|
16
|
+
hostname: url.hostname,
|
|
17
|
+
port: url.port,
|
|
18
|
+
path: url.pathname,
|
|
19
|
+
method: 'POST',
|
|
20
|
+
headers: {
|
|
21
|
+
'Content-Type': 'application/json',
|
|
22
|
+
'Content-Length': Buffer.byteLength(body),
|
|
23
|
+
},
|
|
24
|
+
timeout: 300,
|
|
25
|
+
},
|
|
26
|
+
() => {}
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
req.on('error', () => {});
|
|
30
|
+
req.on('timeout', () => req.destroy());
|
|
31
|
+
req.write(body);
|
|
32
|
+
req.end();
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
module.exports = function crewloopDashboardPlugin(context) {
|
|
36
|
+
const sessionId = context.sessionId || `opencode-${Date.now()}`;
|
|
37
|
+
|
|
38
|
+
return {
|
|
39
|
+
name: 'crewloop-dashboard',
|
|
40
|
+
beforeToolUse(tool) {
|
|
41
|
+
postEvent({
|
|
42
|
+
id: `${sessionId}-${Date.now()}`,
|
|
43
|
+
timestamp: Date.now(),
|
|
44
|
+
source: 'opencode',
|
|
45
|
+
session_id: sessionId,
|
|
46
|
+
event_type: 'tool_start',
|
|
47
|
+
tool: tool.name,
|
|
48
|
+
detail: tool.args?.path || tool.args?.skill,
|
|
49
|
+
});
|
|
50
|
+
},
|
|
51
|
+
afterToolUse(tool, result) {
|
|
52
|
+
postEvent({
|
|
53
|
+
id: `${sessionId}-${Date.now()}`,
|
|
54
|
+
timestamp: Date.now(),
|
|
55
|
+
source: 'opencode',
|
|
56
|
+
session_id: sessionId,
|
|
57
|
+
event_type: 'tool_end',
|
|
58
|
+
tool: tool.name,
|
|
59
|
+
status: result?.error ? 'error' : 'success',
|
|
60
|
+
duration_ms: result?.duration_ms,
|
|
61
|
+
});
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { DashboardEvent } from '../types';
|
|
2
|
+
export interface CodexHookPayload {
|
|
3
|
+
sessionId?: string;
|
|
4
|
+
session_id?: string;
|
|
5
|
+
turnId?: string;
|
|
6
|
+
cwd?: string;
|
|
7
|
+
transcriptPath?: string;
|
|
8
|
+
model?: string;
|
|
9
|
+
permissionMode?: string;
|
|
10
|
+
callId?: string;
|
|
11
|
+
toolName?: string;
|
|
12
|
+
toolKind?: string;
|
|
13
|
+
toolInput?: Record<string, unknown>;
|
|
14
|
+
toolResponse?: Record<string, unknown>;
|
|
15
|
+
hook_event_name?: string;
|
|
16
|
+
stop_reason?: string;
|
|
17
|
+
usage?: unknown;
|
|
18
|
+
executed?: boolean;
|
|
19
|
+
success?: boolean;
|
|
20
|
+
durationMs?: number;
|
|
21
|
+
}
|
|
22
|
+
export declare function normalizeCodex(payload: CodexHookPayload): DashboardEvent | undefined;
|
|
23
|
+
//# sourceMappingURL=codex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,cAAc,EAAa,MAAM,UAAU,CAAC;AAEvE,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AASD,wBAAgB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,cAAc,GAAG,SAAS,CAepF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizeCodex = normalizeCodex;
|
|
4
|
+
const EVENT_MAP = {
|
|
5
|
+
PreToolUse: 'tool_start',
|
|
6
|
+
PostToolUse: 'tool_end',
|
|
7
|
+
SessionStart: 'session_start',
|
|
8
|
+
Stop: 'session_end',
|
|
9
|
+
};
|
|
10
|
+
function normalizeCodex(payload) {
|
|
11
|
+
const eventName = payload.hook_event_name || 'PostToolUse';
|
|
12
|
+
const event_type = EVENT_MAP[eventName];
|
|
13
|
+
if (!event_type) {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
id: generateId(),
|
|
18
|
+
timestamp: Date.now(),
|
|
19
|
+
source: 'codex',
|
|
20
|
+
session_id: payload.sessionId || payload.session_id || 'unknown',
|
|
21
|
+
event_type,
|
|
22
|
+
tool: payload.toolName,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function generateId() {
|
|
26
|
+
return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":";;AA8BA,wCAeC;AAtBD,MAAM,SAAS,GAA8B;IAC3C,UAAU,EAAE,YAAY;IACxB,WAAW,EAAE,UAAU;IACvB,YAAY,EAAE,eAAe;IAC7B,IAAI,EAAE,aAAa;CACpB,CAAC;AAEF,SAAgB,cAAc,CAAC,OAAyB;IACtD,MAAM,SAAS,GAAG,OAAO,CAAC,eAAe,IAAI,aAAa,CAAC;IAC3D,MAAM,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,EAAE,EAAE,UAAU,EAAE;QAChB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,MAAM,EAAE,OAAsB;QAC9B,UAAU,EAAE,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,UAAU,IAAI,SAAS;QAChE,UAAU;QACV,IAAI,EAAE,OAAO,CAAC,QAAQ;KACvB,CAAC;AACJ,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { DashboardEvent } from '../types';
|
|
2
|
+
export interface KimiHookPayload {
|
|
3
|
+
hook_event_name: string;
|
|
4
|
+
session_id: string;
|
|
5
|
+
cwd: string;
|
|
6
|
+
tool_name?: string;
|
|
7
|
+
tool_input?: Record<string, unknown>;
|
|
8
|
+
tool_response?: Record<string, unknown>;
|
|
9
|
+
stop_reason?: string;
|
|
10
|
+
usage?: unknown;
|
|
11
|
+
}
|
|
12
|
+
export declare function normalizeKimi(payload: KimiHookPayload): DashboardEvent | undefined;
|
|
13
|
+
//# sourceMappingURL=kimi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kimi.d.ts","sourceRoot":"","sources":["../../src/adapters/kimi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,cAAc,EAAa,MAAM,UAAU,CAAC;AAEvE,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAUD,wBAAgB,aAAa,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,GAAG,SAAS,CAclF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizeKimi = normalizeKimi;
|
|
4
|
+
const EVENT_MAP = {
|
|
5
|
+
PreToolUse: 'tool_start',
|
|
6
|
+
PostToolUse: 'tool_end',
|
|
7
|
+
SessionStart: 'session_start',
|
|
8
|
+
SessionEnd: 'session_end',
|
|
9
|
+
Stop: 'session_end',
|
|
10
|
+
};
|
|
11
|
+
function normalizeKimi(payload) {
|
|
12
|
+
const event_type = EVENT_MAP[payload.hook_event_name];
|
|
13
|
+
if (!event_type) {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
id: generateId(),
|
|
18
|
+
timestamp: Date.now(),
|
|
19
|
+
source: 'kimi',
|
|
20
|
+
session_id: payload.session_id || 'unknown',
|
|
21
|
+
event_type,
|
|
22
|
+
tool: payload.tool_name,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function generateId() {
|
|
26
|
+
return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=kimi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kimi.js","sourceRoot":"","sources":["../../src/adapters/kimi.ts"],"names":[],"mappings":";;AAqBA,sCAcC;AAtBD,MAAM,SAAS,GAA8B;IAC3C,UAAU,EAAE,YAAY;IACxB,WAAW,EAAE,UAAU;IACvB,YAAY,EAAE,eAAe;IAC7B,UAAU,EAAE,aAAa;IACzB,IAAI,EAAE,aAAa;CACpB,CAAC;AAEF,SAAgB,aAAa,CAAC,OAAwB;IACpD,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACtD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,EAAE,EAAE,UAAU,EAAE;QAChB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,MAAM,EAAE,MAAqB;QAC7B,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,SAAS;QAC3C,UAAU;QACV,IAAI,EAAE,OAAO,CAAC,SAAS;KACxB,CAAC;AACJ,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { DashboardEvent, EventType } from '../types';
|
|
2
|
+
export interface OpenCodeToolEvent {
|
|
3
|
+
tool: string;
|
|
4
|
+
args?: Record<string, unknown>;
|
|
5
|
+
duration?: number;
|
|
6
|
+
success?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function createOpenCodeEvent(sessionId: string, eventType: EventType, data: OpenCodeToolEvent): DashboardEvent;
|
|
9
|
+
//# sourceMappingURL=opencode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../src/adapters/opencode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,cAAc,EAAE,SAAS,EAAe,MAAM,UAAU,CAAC;AAEpF,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,iBAAiB,GACtB,cAAc,CAkBhB"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createOpenCodeEvent = createOpenCodeEvent;
|
|
4
|
+
function createOpenCodeEvent(sessionId, eventType, data) {
|
|
5
|
+
let status;
|
|
6
|
+
if (eventType === 'tool_end') {
|
|
7
|
+
status = data.success === false ? 'error' : 'success';
|
|
8
|
+
}
|
|
9
|
+
else if (eventType === 'tool_start') {
|
|
10
|
+
status = 'running';
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
id: generateId(),
|
|
14
|
+
timestamp: Date.now(),
|
|
15
|
+
source: 'opencode',
|
|
16
|
+
session_id: sessionId,
|
|
17
|
+
event_type: eventType,
|
|
18
|
+
tool: data.tool,
|
|
19
|
+
status,
|
|
20
|
+
duration_ms: data.duration,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function generateId() {
|
|
24
|
+
return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=opencode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/adapters/opencode.ts"],"names":[],"mappings":";;AASA,kDAsBC;AAtBD,SAAgB,mBAAmB,CACjC,SAAiB,EACjB,SAAoB,EACpB,IAAuB;IAEvB,IAAI,MAA+B,CAAC;IACpC,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;QAC7B,MAAM,GAAG,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IACxD,CAAC;SAAM,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;QACtC,MAAM,GAAG,SAAS,CAAC;IACrB,CAAC;IAED,OAAO;QACL,EAAE,EAAE,UAAU,EAAE;QAChB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,MAAM,EAAE,UAAyB;QACjC,UAAU,EAAE,SAAS;QACrB,UAAU,EAAE,SAAS;QACrB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM;QACN,WAAW,EAAE,IAAI,CAAC,QAAQ;KAC3B,CAAC;AACJ,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AgentSource, DashboardEvent } from '../types';
|
|
2
|
+
export declare function detectSource(argv: string[]): AgentSource | undefined;
|
|
3
|
+
export declare function normalizePayload(source: AgentSource, raw: unknown): DashboardEvent | undefined;
|
|
4
|
+
export declare function buildEvent(source: AgentSource, raw: Record<string, unknown>): DashboardEvent | undefined;
|
|
5
|
+
export declare function postEvent(event: DashboardEvent): void;
|
|
6
|
+
export declare function runShim(): void;
|
|
7
|
+
//# sourceMappingURL=shim.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shim.d.ts","sourceRoot":"","sources":["../../src/adapters/shim.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAO5D,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,GAAG,SAAS,CAepE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,OAAO,GAAG,cAAc,GAAG,SAAS,CAe9F;AAED,wBAAgB,UAAU,CACxB,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,cAAc,GAAG,SAAS,CAsB5B;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAwBrD;AAED,wBAAgB,OAAO,IAAI,IAAI,CAwB9B"}
|