@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,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_TOOL_TO_SKILL_MAP = void 0;
|
|
4
|
+
exports.inferFromTool = inferFromTool;
|
|
5
|
+
exports.inferFromGitCommand = inferFromGitCommand;
|
|
6
|
+
exports.DEFAULT_TOOL_TO_SKILL_MAP = {
|
|
7
|
+
Task: 'orchestrator',
|
|
8
|
+
Agent: 'orchestrator',
|
|
9
|
+
Read: 'researcher',
|
|
10
|
+
Grep: 'researcher',
|
|
11
|
+
Glob: 'researcher',
|
|
12
|
+
WebSearch: 'researcher',
|
|
13
|
+
FetchURL: 'researcher',
|
|
14
|
+
Edit: 'engineer',
|
|
15
|
+
Write: 'engineer',
|
|
16
|
+
Bash: 'engineer',
|
|
17
|
+
Skill: undefined,
|
|
18
|
+
};
|
|
19
|
+
function inferFromTool(toolName) {
|
|
20
|
+
return exports.DEFAULT_TOOL_TO_SKILL_MAP[toolName];
|
|
21
|
+
}
|
|
22
|
+
function inferFromGitCommand(command) {
|
|
23
|
+
if (/\b(git\s+(commit|push|branch|merge|tag|checkout))\b/.test(command)) {
|
|
24
|
+
return 'shipper';
|
|
25
|
+
}
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=mapping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapping.js","sourceRoot":"","sources":["../../src/skills/mapping.ts"],"names":[],"mappings":";;;AAgBA,sCAEC;AAED,kDAKC;AAvBY,QAAA,yBAAyB,GAAmB;IACvD,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE,cAAc;IACrB,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,YAAY;IAClB,SAAS,EAAE,YAAY;IACvB,QAAQ,EAAE,YAAY;IACtB,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,UAAU;IACjB,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,SAAS;CACjB,CAAC;AAEF,SAAgB,aAAa,CAAC,QAAgB;IAC5C,OAAO,iCAAyB,CAAC,QAAQ,CAAC,CAAC;AAC7C,CAAC;AAED,SAAgB,mBAAmB,CAAC,OAAe;IACjD,IAAI,qDAAqD,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACxE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SkillMeta } from '../types';
|
|
2
|
+
export declare class SkillRegistry {
|
|
3
|
+
private skills;
|
|
4
|
+
private packageRoot;
|
|
5
|
+
constructor(packageRoot: string);
|
|
6
|
+
load(): SkillMeta[];
|
|
7
|
+
getSkills(): SkillMeta[];
|
|
8
|
+
getIcon(skillName: string): string;
|
|
9
|
+
hasSkill(skillName: string): boolean;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/skills/registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAmB1C,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,EAAE,MAAM;IAI/B,IAAI,IAAI,SAAS,EAAE;IAgBnB,SAAS,IAAI,SAAS,EAAE;IAOxB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAIlC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;CAGrC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.SkillRegistry = void 0;
|
|
7
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const SKILL_ICONS = {
|
|
10
|
+
orchestrator: 'target',
|
|
11
|
+
architect: 'blueprint',
|
|
12
|
+
designer: 'palette',
|
|
13
|
+
engineer: 'wrench',
|
|
14
|
+
reviewer: 'magnifying-glass',
|
|
15
|
+
shipper: 'rocket-launch',
|
|
16
|
+
'docs-writer': 'article',
|
|
17
|
+
tester: 'flask',
|
|
18
|
+
'product-manager': 'chart-bar',
|
|
19
|
+
maintainer: 'toolbox',
|
|
20
|
+
researcher: 'microscope',
|
|
21
|
+
'security-guard': 'shield',
|
|
22
|
+
'accessibility-auditor': 'person',
|
|
23
|
+
'obsidian-second-brain': 'brain',
|
|
24
|
+
};
|
|
25
|
+
class SkillRegistry {
|
|
26
|
+
skills = [];
|
|
27
|
+
packageRoot;
|
|
28
|
+
constructor(packageRoot) {
|
|
29
|
+
this.packageRoot = packageRoot;
|
|
30
|
+
}
|
|
31
|
+
load() {
|
|
32
|
+
const skillsDir = node_path_1.default.join(this.packageRoot, 'skills');
|
|
33
|
+
if (node_fs_1.default.existsSync(skillsDir)) {
|
|
34
|
+
this.skills = node_fs_1.default
|
|
35
|
+
.readdirSync(skillsDir, { withFileTypes: true })
|
|
36
|
+
.filter((entry) => entry.isDirectory())
|
|
37
|
+
.map((entry) => ({
|
|
38
|
+
name: entry.name,
|
|
39
|
+
description: '',
|
|
40
|
+
icon: SKILL_ICONS[entry.name] || 'circle',
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
43
|
+
return this.skills;
|
|
44
|
+
}
|
|
45
|
+
getSkills() {
|
|
46
|
+
if (this.skills.length === 0) {
|
|
47
|
+
this.load();
|
|
48
|
+
}
|
|
49
|
+
return this.skills;
|
|
50
|
+
}
|
|
51
|
+
getIcon(skillName) {
|
|
52
|
+
return SKILL_ICONS[skillName] || 'circle';
|
|
53
|
+
}
|
|
54
|
+
hasSkill(skillName) {
|
|
55
|
+
return this.getSkills().some((skill) => skill.name === skillName);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.SkillRegistry = SkillRegistry;
|
|
59
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/skills/registry.ts"],"names":[],"mappings":";;;;;;AAAA,sDAAyB;AACzB,0DAA6B;AAG7B,MAAM,WAAW,GAA2B;IAC1C,YAAY,EAAE,QAAQ;IACtB,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE,SAAS;IACnB,QAAQ,EAAE,QAAQ;IAClB,QAAQ,EAAE,kBAAkB;IAC5B,OAAO,EAAE,eAAe;IACxB,aAAa,EAAE,SAAS;IACxB,MAAM,EAAE,OAAO;IACf,iBAAiB,EAAE,WAAW;IAC9B,UAAU,EAAE,SAAS;IACrB,UAAU,EAAE,YAAY;IACxB,gBAAgB,EAAE,QAAQ;IAC1B,uBAAuB,EAAE,QAAQ;IACjC,uBAAuB,EAAE,OAAO;CACjC,CAAC;AAEF,MAAa,aAAa;IAChB,MAAM,GAAgB,EAAE,CAAC;IACzB,WAAW,CAAS;IAE5B,YAAY,WAAmB;QAC7B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED,IAAI;QACF,MAAM,SAAS,GAAG,mBAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACxD,IAAI,iBAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,MAAM,GAAG,iBAAE;iBACb,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;iBAC/C,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;iBACtC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACf,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,WAAW,EAAE,EAAE;gBACf,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,QAAQ;aAC1C,CAAC,CAAC,CAAC;QACR,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,SAAS;QACP,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,OAAO,CAAC,SAAiB;QACvB,OAAO,WAAW,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC;IAC5C,CAAC;IAED,QAAQ,CAAC,SAAiB;QACxB,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IACpE,CAAC;CACF;AAtCD,sCAsCC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { DashboardEvent, Session, DashboardState } from './types';
|
|
2
|
+
export interface StateStoreOptions {
|
|
3
|
+
maxEventsPerSession: number;
|
|
4
|
+
sessionMaxAgeMs: number;
|
|
5
|
+
}
|
|
6
|
+
export declare class StateStore {
|
|
7
|
+
private sessions;
|
|
8
|
+
private options;
|
|
9
|
+
constructor(options: StateStoreOptions);
|
|
10
|
+
applyEvent(event: DashboardEvent): Session;
|
|
11
|
+
setActiveSkill(sessionId: string, skill: string | undefined, confidence: 'explicit' | 'heuristic' | 'unknown'): Session | undefined;
|
|
12
|
+
getSession(id: string): Session | undefined;
|
|
13
|
+
getAllSessions(): Session[];
|
|
14
|
+
getState(): DashboardState;
|
|
15
|
+
pruneInactive(now?: number): number;
|
|
16
|
+
private createSession;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,cAAc,EAA4B,MAAM,SAAS,CAAC;AAEjG,MAAM,WAAW,iBAAiB;IAChC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,OAAO,CAAoB;gBAEvB,OAAO,EAAE,iBAAiB;IAItC,UAAU,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO;IA8B1C,cAAc,CACZ,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,UAAU,EAAE,UAAU,GAAG,WAAW,GAAG,SAAS,GAC/C,OAAO,GAAG,SAAS;IAUtB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAI3C,cAAc,IAAI,OAAO,EAAE;IAM3B,QAAQ,IAAI,cAAc;IAM1B,aAAa,CAAC,GAAG,GAAE,MAAmB,GAAG,MAAM;IAW/C,OAAO,CAAC,aAAa;CAatB"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StateStore = void 0;
|
|
4
|
+
class StateStore {
|
|
5
|
+
sessions = new Map();
|
|
6
|
+
options;
|
|
7
|
+
constructor(options) {
|
|
8
|
+
this.options = options;
|
|
9
|
+
}
|
|
10
|
+
applyEvent(event) {
|
|
11
|
+
let session = this.sessions.get(event.session_id);
|
|
12
|
+
if (!session) {
|
|
13
|
+
session = this.createSession(event.session_id, event.source);
|
|
14
|
+
}
|
|
15
|
+
session.source = event.source;
|
|
16
|
+
session.last_event_at = event.timestamp;
|
|
17
|
+
session.events.unshift(event);
|
|
18
|
+
if (session.events.length > this.options.maxEventsPerSession) {
|
|
19
|
+
session.events.length = this.options.maxEventsPerSession;
|
|
20
|
+
}
|
|
21
|
+
if (event.tool) {
|
|
22
|
+
session.tool_counts[event.tool] = (session.tool_counts[event.tool] || 0) + 1;
|
|
23
|
+
}
|
|
24
|
+
if (event.skill) {
|
|
25
|
+
session.active_skill = event.skill;
|
|
26
|
+
session.active_confidence = event.event_type === 'skill_change' ? 'explicit' : 'heuristic';
|
|
27
|
+
}
|
|
28
|
+
session.status = deriveSessionStatus(event);
|
|
29
|
+
this.sessions.set(event.session_id, session);
|
|
30
|
+
return session;
|
|
31
|
+
}
|
|
32
|
+
setActiveSkill(sessionId, skill, confidence) {
|
|
33
|
+
const session = this.sessions.get(sessionId);
|
|
34
|
+
if (!session) {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
session.active_skill = skill;
|
|
38
|
+
session.active_confidence = confidence;
|
|
39
|
+
return session;
|
|
40
|
+
}
|
|
41
|
+
getSession(id) {
|
|
42
|
+
return this.sessions.get(id);
|
|
43
|
+
}
|
|
44
|
+
getAllSessions() {
|
|
45
|
+
return Array.from(this.sessions.values()).sort((a, b) => b.last_event_at - a.last_event_at);
|
|
46
|
+
}
|
|
47
|
+
getState() {
|
|
48
|
+
return {
|
|
49
|
+
sessions: Object.fromEntries(this.sessions),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
pruneInactive(now = Date.now()) {
|
|
53
|
+
let removed = 0;
|
|
54
|
+
for (const [id, session] of this.sessions) {
|
|
55
|
+
if (now - session.last_event_at > this.options.sessionMaxAgeMs) {
|
|
56
|
+
this.sessions.delete(id);
|
|
57
|
+
removed++;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return removed;
|
|
61
|
+
}
|
|
62
|
+
createSession(id, source) {
|
|
63
|
+
const now = Date.now();
|
|
64
|
+
const session = {
|
|
65
|
+
id,
|
|
66
|
+
source,
|
|
67
|
+
events: [],
|
|
68
|
+
tool_counts: {},
|
|
69
|
+
started_at: now,
|
|
70
|
+
last_event_at: now,
|
|
71
|
+
};
|
|
72
|
+
this.sessions.set(id, session);
|
|
73
|
+
return session;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
exports.StateStore = StateStore;
|
|
77
|
+
function deriveSessionStatus(event) {
|
|
78
|
+
switch (event.event_type) {
|
|
79
|
+
case 'session_start':
|
|
80
|
+
case 'tool_start':
|
|
81
|
+
case 'skill_change':
|
|
82
|
+
return 'running';
|
|
83
|
+
case 'tool_end':
|
|
84
|
+
return event.status || 'success';
|
|
85
|
+
case 'session_end':
|
|
86
|
+
return 'success';
|
|
87
|
+
default:
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.test.d.ts","sourceRoot":"","sources":["../src/state.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,83 @@
|
|
|
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 strict_1 = __importDefault(require("node:assert/strict"));
|
|
8
|
+
const state_1 = require("./state");
|
|
9
|
+
function makeEvent(overrides = {}) {
|
|
10
|
+
return {
|
|
11
|
+
id: 'ev-1',
|
|
12
|
+
timestamp: Date.now(),
|
|
13
|
+
source: 'kimi',
|
|
14
|
+
session_id: 'sess-1',
|
|
15
|
+
event_type: 'tool_start',
|
|
16
|
+
tool: 'Read',
|
|
17
|
+
...overrides,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
(0, node_test_1.describe)('StateStore', () => {
|
|
21
|
+
(0, node_test_1.it)('creates session on first event', () => {
|
|
22
|
+
const store = new state_1.StateStore({ maxEventsPerSession: 10, sessionMaxAgeMs: 60000 });
|
|
23
|
+
const session = store.applyEvent(makeEvent());
|
|
24
|
+
strict_1.default.equal(session.id, 'sess-1');
|
|
25
|
+
strict_1.default.equal(session.source, 'kimi');
|
|
26
|
+
strict_1.default.equal(session.events.length, 1);
|
|
27
|
+
});
|
|
28
|
+
(0, node_test_1.it)('caps events per session', () => {
|
|
29
|
+
const store = new state_1.StateStore({ maxEventsPerSession: 3, sessionMaxAgeMs: 60000 });
|
|
30
|
+
for (let i = 0; i < 5; i++) {
|
|
31
|
+
store.applyEvent(makeEvent({ id: `ev-${i}`, timestamp: Date.now() + i }));
|
|
32
|
+
}
|
|
33
|
+
const session = store.getSession('sess-1');
|
|
34
|
+
strict_1.default.equal(session.events.length, 3);
|
|
35
|
+
});
|
|
36
|
+
(0, node_test_1.it)('counts tool usage', () => {
|
|
37
|
+
const store = new state_1.StateStore({ maxEventsPerSession: 10, sessionMaxAgeMs: 60000 });
|
|
38
|
+
store.applyEvent(makeEvent({ tool: 'Read' }));
|
|
39
|
+
store.applyEvent(makeEvent({ tool: 'Read' }));
|
|
40
|
+
store.applyEvent(makeEvent({ tool: 'Edit' }));
|
|
41
|
+
const session = store.getSession('sess-1');
|
|
42
|
+
strict_1.default.equal(session.tool_counts['Read'], 2);
|
|
43
|
+
strict_1.default.equal(session.tool_counts['Edit'], 1);
|
|
44
|
+
});
|
|
45
|
+
(0, node_test_1.it)('sets active skill when event carries skill', () => {
|
|
46
|
+
const store = new state_1.StateStore({ maxEventsPerSession: 10, sessionMaxAgeMs: 60000 });
|
|
47
|
+
store.applyEvent(makeEvent({ skill: 'architect', event_type: 'skill_change' }));
|
|
48
|
+
const session = store.getSession('sess-1');
|
|
49
|
+
strict_1.default.equal(session.active_skill, 'architect');
|
|
50
|
+
strict_1.default.equal(session.active_confidence, 'explicit');
|
|
51
|
+
});
|
|
52
|
+
(0, node_test_1.it)('derives running status from tool_start', () => {
|
|
53
|
+
const store = new state_1.StateStore({ maxEventsPerSession: 10, sessionMaxAgeMs: 60000 });
|
|
54
|
+
store.applyEvent(makeEvent({ event_type: 'tool_start' }));
|
|
55
|
+
strict_1.default.equal(store.getSession('sess-1').status, 'running');
|
|
56
|
+
});
|
|
57
|
+
(0, node_test_1.it)('derives success status from tool_end', () => {
|
|
58
|
+
const store = new state_1.StateStore({ maxEventsPerSession: 10, sessionMaxAgeMs: 60000 });
|
|
59
|
+
store.applyEvent(makeEvent({ event_type: 'tool_end', status: 'success' }));
|
|
60
|
+
strict_1.default.equal(store.getSession('sess-1').status, 'success');
|
|
61
|
+
});
|
|
62
|
+
(0, node_test_1.it)('derives error status from failed tool_end', () => {
|
|
63
|
+
const store = new state_1.StateStore({ maxEventsPerSession: 10, sessionMaxAgeMs: 60000 });
|
|
64
|
+
store.applyEvent(makeEvent({ event_type: 'tool_end', status: 'error' }));
|
|
65
|
+
strict_1.default.equal(store.getSession('sess-1').status, 'error');
|
|
66
|
+
});
|
|
67
|
+
(0, node_test_1.it)('prunes inactive sessions', () => {
|
|
68
|
+
const store = new state_1.StateStore({ maxEventsPerSession: 10, sessionMaxAgeMs: 1000 });
|
|
69
|
+
store.applyEvent(makeEvent());
|
|
70
|
+
const removed = store.pruneInactive(Date.now() + 2000);
|
|
71
|
+
strict_1.default.equal(removed, 1);
|
|
72
|
+
strict_1.default.equal(store.getSession('sess-1'), undefined);
|
|
73
|
+
});
|
|
74
|
+
(0, node_test_1.it)('returns sessions sorted by last event', () => {
|
|
75
|
+
const store = new state_1.StateStore({ maxEventsPerSession: 10, sessionMaxAgeMs: 60000 });
|
|
76
|
+
store.applyEvent(makeEvent({ session_id: 'a', timestamp: 1000 }));
|
|
77
|
+
store.applyEvent(makeEvent({ session_id: 'b', timestamp: 2000 }));
|
|
78
|
+
const sessions = store.getAllSessions();
|
|
79
|
+
strict_1.default.equal(sessions[0].id, 'b');
|
|
80
|
+
strict_1.default.equal(sessions[1].id, 'a');
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=state.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.test.js","sourceRoot":"","sources":["../src/state.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
export type AgentSource = 'kimi' | 'codex' | 'opencode' | 'log-watcher';
|
|
2
|
+
export type EventType = 'session_start' | 'session_end' | 'tool_start' | 'tool_end' | 'skill_change';
|
|
3
|
+
export type EventStatus = 'running' | 'success' | 'error';
|
|
4
|
+
export interface DashboardEvent {
|
|
5
|
+
id: string;
|
|
6
|
+
timestamp: number;
|
|
7
|
+
source: AgentSource;
|
|
8
|
+
session_id: string;
|
|
9
|
+
event_type: EventType;
|
|
10
|
+
skill?: string;
|
|
11
|
+
tool?: string;
|
|
12
|
+
detail?: string;
|
|
13
|
+
status?: EventStatus;
|
|
14
|
+
duration_ms?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface Session {
|
|
17
|
+
id: string;
|
|
18
|
+
source: AgentSource;
|
|
19
|
+
active_skill?: string;
|
|
20
|
+
active_confidence?: 'explicit' | 'heuristic' | 'unknown';
|
|
21
|
+
status?: EventStatus;
|
|
22
|
+
events: DashboardEvent[];
|
|
23
|
+
tool_counts: Record<string, number>;
|
|
24
|
+
started_at: number;
|
|
25
|
+
last_event_at: number;
|
|
26
|
+
}
|
|
27
|
+
export interface DashboardState {
|
|
28
|
+
sessions: Record<string, Session>;
|
|
29
|
+
}
|
|
30
|
+
export interface ClientActiveSkill {
|
|
31
|
+
name: string;
|
|
32
|
+
confidence: 'explicit' | 'heuristic' | 'unknown';
|
|
33
|
+
}
|
|
34
|
+
export interface ClientEvent {
|
|
35
|
+
id: string;
|
|
36
|
+
timestamp: number;
|
|
37
|
+
event_type: EventType;
|
|
38
|
+
tool?: string;
|
|
39
|
+
detail?: string;
|
|
40
|
+
status?: EventStatus;
|
|
41
|
+
duration_ms?: number;
|
|
42
|
+
skill?: string;
|
|
43
|
+
}
|
|
44
|
+
export interface ClientSession {
|
|
45
|
+
id: string;
|
|
46
|
+
source: AgentSource;
|
|
47
|
+
skill?: string;
|
|
48
|
+
activeSkill?: ClientActiveSkill;
|
|
49
|
+
status?: EventStatus;
|
|
50
|
+
events: ClientEvent[];
|
|
51
|
+
startTime: number;
|
|
52
|
+
lastActivity: number;
|
|
53
|
+
toolCounts: Record<string, number>;
|
|
54
|
+
}
|
|
55
|
+
export interface ClientSnapshotMessage {
|
|
56
|
+
type: 'snapshot';
|
|
57
|
+
sessions: ClientSession[];
|
|
58
|
+
}
|
|
59
|
+
export interface ClientUpdateMessage {
|
|
60
|
+
type: 'update';
|
|
61
|
+
session: ClientSession;
|
|
62
|
+
isActive: boolean;
|
|
63
|
+
}
|
|
64
|
+
export interface ClientPongMessage {
|
|
65
|
+
type: 'pong';
|
|
66
|
+
}
|
|
67
|
+
export type ClientWebSocketMessage = ClientSnapshotMessage | ClientUpdateMessage | ClientPongMessage;
|
|
68
|
+
export interface SkillMeta {
|
|
69
|
+
name: string;
|
|
70
|
+
description: string;
|
|
71
|
+
icon: string;
|
|
72
|
+
}
|
|
73
|
+
export type ToolToSkillMap = Record<string, string | undefined>;
|
|
74
|
+
export interface SkillInferenceResult {
|
|
75
|
+
skill: string | undefined;
|
|
76
|
+
confidence: 'explicit' | 'heuristic' | 'unknown';
|
|
77
|
+
}
|
|
78
|
+
export interface ServerConfig {
|
|
79
|
+
port: number;
|
|
80
|
+
host: string;
|
|
81
|
+
packageRoot: string;
|
|
82
|
+
maxEventsPerSession: number;
|
|
83
|
+
sessionMaxAgeMs: number;
|
|
84
|
+
pruneIntervalMs: number;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,aAAa,CAAC;AAExE,MAAM,MAAM,SAAS,GACjB,eAAe,GACf,aAAa,GACb,YAAY,GACZ,UAAU,GACV,cAAc,CAAC;AAEnB,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAE1D,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,SAAS,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,WAAW,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;IACzD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;CAClD;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,SAAS,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,sBAAsB,GAC9B,qBAAqB,GACrB,mBAAmB,GACnB,iBAAiB,CAAC;AAEtB,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAEhE,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,UAAU,EAAE,UAAU,GAAG,WAAW,GAAG,SAAS,CAAC;CAClD;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@archznn/crewloop-dashboard",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Real-time CrewLoop skill dashboard server and UI",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "leorsousa05",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/leorsousa05/CrewLoop.git"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://leorsousa05.github.io/CrewLoop/",
|
|
12
|
+
"bin": {
|
|
13
|
+
"crewloop-dashboard": "bin/crewloop-dashboard.js"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"bin/",
|
|
17
|
+
"dist/",
|
|
18
|
+
"public/",
|
|
19
|
+
"config-examples/",
|
|
20
|
+
"README.md"
|
|
21
|
+
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"start": "node dist/index.js",
|
|
24
|
+
"build": "tsc",
|
|
25
|
+
"typecheck": "tsc --noEmit",
|
|
26
|
+
"test": "node --test dist/**/*.test.js",
|
|
27
|
+
"prepublishOnly": "npm run build"
|
|
28
|
+
},
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=18"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"ws": "^8.18.0"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@types/node": "^20.0.0",
|
|
37
|
+
"@types/ws": "^8.5.0",
|
|
38
|
+
"typescript": "^5.4.0"
|
|
39
|
+
},
|
|
40
|
+
"keywords": [
|
|
41
|
+
"ai-agent",
|
|
42
|
+
"crewloop",
|
|
43
|
+
"dashboard",
|
|
44
|
+
"observability"
|
|
45
|
+
]
|
|
46
|
+
}
|