@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.
Files changed (164) hide show
  1. package/package.json +16 -3
  2. package/packages/cli/README.md +55 -0
  3. package/packages/cli/bin/crewloop.js +6 -0
  4. package/packages/cli/dist/agents.d.ts +7 -0
  5. package/packages/cli/dist/agents.d.ts.map +1 -0
  6. package/packages/cli/dist/agents.js +31 -0
  7. package/packages/cli/dist/agents.js.map +1 -0
  8. package/packages/cli/dist/cli.d.ts +14 -0
  9. package/packages/cli/dist/cli.d.ts.map +1 -0
  10. package/packages/cli/dist/cli.js +255 -0
  11. package/packages/cli/dist/cli.js.map +1 -0
  12. package/packages/cli/dist/installer.d.ts +19 -0
  13. package/packages/cli/dist/installer.d.ts.map +1 -0
  14. package/packages/cli/dist/installer.js +89 -0
  15. package/packages/cli/dist/installer.js.map +1 -0
  16. package/packages/cli/dist/mcp.d.ts +20 -0
  17. package/packages/cli/dist/mcp.d.ts.map +1 -0
  18. package/packages/cli/dist/mcp.js +130 -0
  19. package/packages/cli/dist/mcp.js.map +1 -0
  20. package/packages/cli/dist/resolver.d.ts +7 -0
  21. package/packages/cli/dist/resolver.d.ts.map +1 -0
  22. package/packages/cli/dist/resolver.js +57 -0
  23. package/packages/cli/dist/resolver.js.map +1 -0
  24. package/packages/cli/dist/tests/agents.test.d.ts +2 -0
  25. package/packages/cli/dist/tests/agents.test.d.ts.map +1 -0
  26. package/packages/cli/dist/tests/agents.test.js +27 -0
  27. package/packages/cli/dist/tests/agents.test.js.map +1 -0
  28. package/packages/cli/dist/tests/cli.test.d.ts +2 -0
  29. package/packages/cli/dist/tests/cli.test.d.ts.map +1 -0
  30. package/packages/cli/dist/tests/cli.test.js +103 -0
  31. package/packages/cli/dist/tests/cli.test.js.map +1 -0
  32. package/packages/cli/dist/tests/installer.test.d.ts +2 -0
  33. package/packages/cli/dist/tests/installer.test.d.ts.map +1 -0
  34. package/packages/cli/dist/tests/installer.test.js +129 -0
  35. package/packages/cli/dist/tests/installer.test.js.map +1 -0
  36. package/packages/cli/dist/tests/mcp.test.d.ts +2 -0
  37. package/packages/cli/dist/tests/mcp.test.d.ts.map +1 -0
  38. package/packages/cli/dist/tests/mcp.test.js +153 -0
  39. package/packages/cli/dist/tests/mcp.test.js.map +1 -0
  40. package/packages/cli/dist/tests/resolver.test.d.ts +2 -0
  41. package/packages/cli/dist/tests/resolver.test.d.ts.map +1 -0
  42. package/packages/cli/dist/tests/resolver.test.js +41 -0
  43. package/packages/cli/dist/tests/resolver.test.js.map +1 -0
  44. package/servers/dashboard/README.md +87 -0
  45. package/servers/dashboard/bin/crewloop-dashboard.js +5 -0
  46. package/servers/dashboard/config-examples/codex-hooks.json +14 -0
  47. package/servers/dashboard/config-examples/kimi-code-config.toml +6 -0
  48. package/servers/dashboard/config-examples/opencode-plugin/crewloop-dashboard.js +64 -0
  49. package/servers/dashboard/dist/adapters/codex.d.ts +23 -0
  50. package/servers/dashboard/dist/adapters/codex.d.ts.map +1 -0
  51. package/servers/dashboard/dist/adapters/codex.js +28 -0
  52. package/servers/dashboard/dist/adapters/codex.js.map +1 -0
  53. package/servers/dashboard/dist/adapters/kimi.d.ts +13 -0
  54. package/servers/dashboard/dist/adapters/kimi.d.ts.map +1 -0
  55. package/servers/dashboard/dist/adapters/kimi.js +28 -0
  56. package/servers/dashboard/dist/adapters/kimi.js.map +1 -0
  57. package/servers/dashboard/dist/adapters/opencode.d.ts +9 -0
  58. package/servers/dashboard/dist/adapters/opencode.d.ts.map +1 -0
  59. package/servers/dashboard/dist/adapters/opencode.js +26 -0
  60. package/servers/dashboard/dist/adapters/opencode.js.map +1 -0
  61. package/servers/dashboard/dist/adapters/shim.d.ts +7 -0
  62. package/servers/dashboard/dist/adapters/shim.d.ts.map +1 -0
  63. package/servers/dashboard/dist/adapters/shim.js +107 -0
  64. package/servers/dashboard/dist/adapters/shim.js.map +1 -0
  65. package/servers/dashboard/dist/adapters/shim.test.d.ts +2 -0
  66. package/servers/dashboard/dist/adapters/shim.test.d.ts.map +1 -0
  67. package/servers/dashboard/dist/adapters/shim.test.js +72 -0
  68. package/servers/dashboard/dist/adapters/shim.test.js.map +1 -0
  69. package/servers/dashboard/dist/api/event.d.ts +13 -0
  70. package/servers/dashboard/dist/api/event.d.ts.map +1 -0
  71. package/servers/dashboard/dist/api/event.js +52 -0
  72. package/servers/dashboard/dist/api/event.js.map +1 -0
  73. package/servers/dashboard/dist/api/skills.d.ts +4 -0
  74. package/servers/dashboard/dist/api/skills.d.ts.map +1 -0
  75. package/servers/dashboard/dist/api/skills.js +12 -0
  76. package/servers/dashboard/dist/api/skills.js.map +1 -0
  77. package/servers/dashboard/dist/config.d.ts +11 -0
  78. package/servers/dashboard/dist/config.d.ts.map +1 -0
  79. package/servers/dashboard/dist/config.js +65 -0
  80. package/servers/dashboard/dist/config.js.map +1 -0
  81. package/servers/dashboard/dist/filters/sanitize.d.ts +14 -0
  82. package/servers/dashboard/dist/filters/sanitize.d.ts.map +1 -0
  83. package/servers/dashboard/dist/filters/sanitize.js +64 -0
  84. package/servers/dashboard/dist/filters/sanitize.js.map +1 -0
  85. package/servers/dashboard/dist/filters/sanitize.test.d.ts +2 -0
  86. package/servers/dashboard/dist/filters/sanitize.test.d.ts.map +1 -0
  87. package/servers/dashboard/dist/filters/sanitize.test.js +71 -0
  88. package/servers/dashboard/dist/filters/sanitize.test.js.map +1 -0
  89. package/servers/dashboard/dist/index.d.ts +2 -0
  90. package/servers/dashboard/dist/index.d.ts.map +1 -0
  91. package/servers/dashboard/dist/index.js +22 -0
  92. package/servers/dashboard/dist/index.js.map +1 -0
  93. package/servers/dashboard/dist/presenter.d.ts +7 -0
  94. package/servers/dashboard/dist/presenter.d.ts.map +1 -0
  95. package/servers/dashboard/dist/presenter.js +54 -0
  96. package/servers/dashboard/dist/presenter.js.map +1 -0
  97. package/servers/dashboard/dist/presenter.test.d.ts +2 -0
  98. package/servers/dashboard/dist/presenter.test.d.ts.map +1 -0
  99. package/servers/dashboard/dist/presenter.test.js +66 -0
  100. package/servers/dashboard/dist/presenter.test.js.map +1 -0
  101. package/servers/dashboard/dist/server.d.ts +13 -0
  102. package/servers/dashboard/dist/server.d.ts.map +1 -0
  103. package/servers/dashboard/dist/server.js +162 -0
  104. package/servers/dashboard/dist/server.js.map +1 -0
  105. package/servers/dashboard/dist/server.test.d.ts +2 -0
  106. package/servers/dashboard/dist/server.test.d.ts.map +1 -0
  107. package/servers/dashboard/dist/server.test.js +113 -0
  108. package/servers/dashboard/dist/server.test.js.map +1 -0
  109. package/servers/dashboard/dist/skills/infer.d.ts +8 -0
  110. package/servers/dashboard/dist/skills/infer.d.ts.map +1 -0
  111. package/servers/dashboard/dist/skills/infer.js +48 -0
  112. package/servers/dashboard/dist/skills/infer.js.map +1 -0
  113. package/servers/dashboard/dist/skills/infer.test.d.ts +2 -0
  114. package/servers/dashboard/dist/skills/infer.test.d.ts.map +1 -0
  115. package/servers/dashboard/dist/skills/infer.test.js +82 -0
  116. package/servers/dashboard/dist/skills/infer.test.js.map +1 -0
  117. package/servers/dashboard/dist/skills/mapping.d.ts +5 -0
  118. package/servers/dashboard/dist/skills/mapping.d.ts.map +1 -0
  119. package/servers/dashboard/dist/skills/mapping.js +28 -0
  120. package/servers/dashboard/dist/skills/mapping.js.map +1 -0
  121. package/servers/dashboard/dist/skills/registry.d.ts +11 -0
  122. package/servers/dashboard/dist/skills/registry.d.ts.map +1 -0
  123. package/servers/dashboard/dist/skills/registry.js +59 -0
  124. package/servers/dashboard/dist/skills/registry.js.map +1 -0
  125. package/servers/dashboard/dist/state.d.ts +18 -0
  126. package/servers/dashboard/dist/state.d.ts.map +1 -0
  127. package/servers/dashboard/dist/state.js +91 -0
  128. package/servers/dashboard/dist/state.js.map +1 -0
  129. package/servers/dashboard/dist/state.test.d.ts +2 -0
  130. package/servers/dashboard/dist/state.test.d.ts.map +1 -0
  131. package/servers/dashboard/dist/state.test.js +83 -0
  132. package/servers/dashboard/dist/state.test.js.map +1 -0
  133. package/servers/dashboard/dist/types.d.ts +86 -0
  134. package/servers/dashboard/dist/types.d.ts.map +1 -0
  135. package/servers/dashboard/dist/types.js +3 -0
  136. package/servers/dashboard/dist/types.js.map +1 -0
  137. package/servers/dashboard/package.json +46 -0
  138. package/servers/dashboard/public/app.js +447 -0
  139. package/servers/dashboard/public/index.html +96 -0
  140. package/servers/dashboard/public/styles.css +664 -0
  141. package/servers/dashboard/src/adapters/codex.ts +50 -0
  142. package/servers/dashboard/src/adapters/kimi.ts +40 -0
  143. package/servers/dashboard/src/adapters/opencode.ts +36 -0
  144. package/servers/dashboard/src/adapters/shim.test.ts +74 -0
  145. package/servers/dashboard/src/adapters/shim.ts +120 -0
  146. package/servers/dashboard/src/api/event.ts +70 -0
  147. package/servers/dashboard/src/api/skills.ts +11 -0
  148. package/servers/dashboard/src/config.ts +66 -0
  149. package/servers/dashboard/src/filters/sanitize.test.ts +94 -0
  150. package/servers/dashboard/src/filters/sanitize.ts +78 -0
  151. package/servers/dashboard/src/index.ts +24 -0
  152. package/servers/dashboard/src/presenter.test.ts +69 -0
  153. package/servers/dashboard/src/presenter.ts +56 -0
  154. package/servers/dashboard/src/server.test.ts +123 -0
  155. package/servers/dashboard/src/server.ts +191 -0
  156. package/servers/dashboard/src/skills/infer.test.ts +86 -0
  157. package/servers/dashboard/src/skills/infer.ts +53 -0
  158. package/servers/dashboard/src/skills/mapping.ts +26 -0
  159. package/servers/dashboard/src/skills/registry.ts +60 -0
  160. package/servers/dashboard/src/state.test.ts +88 -0
  161. package/servers/dashboard/src/state.ts +115 -0
  162. package/servers/dashboard/src/types.ts +110 -0
  163. package/servers/dashboard/tsconfig.json +19 -0
  164. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=resolver.test.d.ts.map
@@ -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,5 @@
1
+ #!/usr/bin/env node
2
+ const path = require('node:path');
3
+
4
+ const distIndex = path.join(__dirname, '..', 'dist', 'index.js');
5
+ require(distIndex);
@@ -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,6 @@
1
+ # Kimi Code configuration snippet for CrewLoop dashboard integration.
2
+ # Place in your Kimi Code config file and ensure crewloop-shim is on PATH.
3
+
4
+ [hooks]
5
+ before_tool_use = "crewloop-shim kimi"
6
+ after_tool_use = "crewloop-shim kimi"
@@ -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"}