expxagents 0.13.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/core/solution-architect.agent.md +3 -0
- package/dist/core/squad-loader.js +2 -8
- package/dist/dashboard/assets/{BufferResource-D9aUIz5c.js → BufferResource-IVUoAbNS.js} +1 -1
- package/dist/dashboard/assets/{CanvasRenderer-DfAInYD0.js → CanvasRenderer-ZlhtzexK.js} +1 -1
- package/dist/dashboard/assets/{JarvisView-D78mY8i-.js → JarvisView-Bkn01kRk.js} +1 -1
- package/dist/dashboard/assets/{RenderTargetSystem-DZo6ujA0.js → RenderTargetSystem-ukD3tT30.js} +1 -1
- package/dist/dashboard/assets/{WebGLRenderer-BKreDG7Z.js → WebGLRenderer-B0gX63D6.js} +1 -1
- package/dist/dashboard/assets/{WebGPURenderer-DeKuexG2.js → WebGPURenderer-CU_7qyko.js} +1 -1
- package/dist/dashboard/assets/{browserAll-3U5O7dnB.js → browserAll-CHvE8-zd.js} +1 -1
- package/dist/dashboard/assets/index-CV6VSNbn.js +400 -0
- package/dist/dashboard/assets/{index-DHu3wE8e.css → index-ClyttaJh.css} +1 -1
- package/dist/dashboard/assets/{webworkerAll-CBlDUJVW.js → webworkerAll-D1p-kqY5.js} +1 -1
- package/dist/dashboard/index.html +2 -2
- package/dist/data/opensquad.db-shm +0 -0
- package/dist/data/opensquad.db-wal +0 -0
- package/dist/server/api/__tests__/files-routes.test.d.ts +2 -0
- package/dist/server/api/__tests__/files-routes.test.d.ts.map +1 -0
- package/dist/server/api/__tests__/files-routes.test.js +85 -0
- package/dist/server/api/__tests__/files-routes.test.js.map +1 -0
- package/dist/server/api/__tests__/graph-routes.test.d.ts +2 -0
- package/dist/server/api/__tests__/graph-routes.test.d.ts.map +1 -0
- package/dist/server/api/__tests__/graph-routes.test.js +105 -0
- package/dist/server/api/__tests__/graph-routes.test.js.map +1 -0
- package/dist/server/api/__tests__/kanban-routes.test.d.ts +2 -0
- package/dist/server/api/__tests__/kanban-routes.test.d.ts.map +1 -0
- package/dist/server/api/__tests__/kanban-routes.test.js +227 -0
- package/dist/server/api/__tests__/kanban-routes.test.js.map +1 -0
- package/dist/server/api/files-routes.d.ts +5 -0
- package/dist/server/api/files-routes.d.ts.map +1 -0
- package/dist/server/api/files-routes.js +92 -0
- package/dist/server/api/files-routes.js.map +1 -0
- package/dist/server/api/graph-routes.d.ts +24 -0
- package/dist/server/api/graph-routes.d.ts.map +1 -0
- package/dist/server/api/graph-routes.js +189 -0
- package/dist/server/api/graph-routes.js.map +1 -0
- package/dist/server/api/kanban-routes.d.ts +8 -0
- package/dist/server/api/kanban-routes.d.ts.map +1 -0
- package/dist/server/api/kanban-routes.js +104 -0
- package/dist/server/api/kanban-routes.js.map +1 -0
- package/dist/server/app.d.ts.map +1 -1
- package/dist/server/app.js +6 -0
- package/dist/server/app.js.map +1 -1
- package/dist/server/db/migrations.d.ts.map +1 -1
- package/dist/server/db/migrations.js +10 -0
- package/dist/server/db/migrations.js.map +1 -1
- package/dist/server/db/schema.d.ts +1 -1
- package/dist/server/db/schema.d.ts.map +1 -1
- package/dist/server/db/schema.js +17 -0
- package/dist/server/db/schema.js.map +1 -1
- package/dist/server/scheduler/__tests__/scheduler-routes.test.js +65 -0
- package/dist/server/scheduler/__tests__/scheduler-routes.test.js.map +1 -1
- package/dist/server/scheduler/__tests__/scheduler-service.test.js +33 -0
- package/dist/server/scheduler/__tests__/scheduler-service.test.js.map +1 -1
- package/dist/server/scheduler/scheduler-routes.d.ts.map +1 -1
- package/dist/server/scheduler/scheduler-routes.js +44 -0
- package/dist/server/scheduler/scheduler-routes.js.map +1 -1
- package/dist/server/scheduler/scheduler-service.d.ts +8 -0
- package/dist/server/scheduler/scheduler-service.d.ts.map +1 -1
- package/dist/server/scheduler/scheduler-service.js +49 -0
- package/dist/server/scheduler/scheduler-service.js.map +1 -1
- package/package.json +1 -1
- package/dist/dashboard/assets/index-CahtAeF7.js +0 -400
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
function discoverFiles(squadsDir) {
|
|
4
|
+
const entries = [];
|
|
5
|
+
if (!fs.existsSync(squadsDir))
|
|
6
|
+
return entries;
|
|
7
|
+
for (const dir of fs.readdirSync(squadsDir, { withFileTypes: true })) {
|
|
8
|
+
if (!dir.isDirectory() || dir.name.startsWith('.'))
|
|
9
|
+
continue;
|
|
10
|
+
const squadDir = path.join(squadsDir, dir.name);
|
|
11
|
+
// Read squad name from squad.yaml
|
|
12
|
+
let squadName = dir.name;
|
|
13
|
+
const yamlPath = path.join(squadDir, 'squad.yaml');
|
|
14
|
+
if (fs.existsSync(yamlPath)) {
|
|
15
|
+
const content = fs.readFileSync(yamlPath, 'utf-8');
|
|
16
|
+
const match = content.match(/^\s*name:\s*(.+)$/m);
|
|
17
|
+
if (match)
|
|
18
|
+
squadName = match[1].trim().replace(/^["']|["']$/g, '');
|
|
19
|
+
entries.push({
|
|
20
|
+
squad: dir.name,
|
|
21
|
+
squadName,
|
|
22
|
+
file: 'squad.yaml',
|
|
23
|
+
label: 'Squad Config',
|
|
24
|
+
path: 'squad.yaml',
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
// Memory files
|
|
28
|
+
const memDir = path.join(squadDir, '_memory');
|
|
29
|
+
if (fs.existsSync(memDir) && fs.statSync(memDir).isDirectory()) {
|
|
30
|
+
for (const memFile of fs.readdirSync(memDir)) {
|
|
31
|
+
if (!memFile.endsWith('.md'))
|
|
32
|
+
continue;
|
|
33
|
+
entries.push({
|
|
34
|
+
squad: dir.name,
|
|
35
|
+
squadName,
|
|
36
|
+
file: memFile,
|
|
37
|
+
label: memFile.replace('.md', '').replace(/-/g, ' '),
|
|
38
|
+
path: `_memory/${memFile}`,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return entries;
|
|
44
|
+
}
|
|
45
|
+
export async function filesRoutes(app, opts) {
|
|
46
|
+
const { squadsDir } = opts;
|
|
47
|
+
// List all editable files
|
|
48
|
+
app.get('/api/files', { preHandler: [app.requireAuth] }, async (_request, reply) => {
|
|
49
|
+
const files = discoverFiles(squadsDir);
|
|
50
|
+
return reply.send(files);
|
|
51
|
+
});
|
|
52
|
+
// Read a file
|
|
53
|
+
app.get('/api/files/:squad/*', { preHandler: [app.requireAuth] }, async (request, reply) => {
|
|
54
|
+
const { squad } = request.params;
|
|
55
|
+
const filePath = request.params['*'];
|
|
56
|
+
if (!filePath)
|
|
57
|
+
return reply.status(400).send({ error: 'Missing file path' });
|
|
58
|
+
// Prevent directory traversal
|
|
59
|
+
const resolved = path.resolve(squadsDir, squad, filePath);
|
|
60
|
+
if (!resolved.startsWith(path.resolve(squadsDir))) {
|
|
61
|
+
return reply.status(403).send({ error: 'Forbidden' });
|
|
62
|
+
}
|
|
63
|
+
if (!fs.existsSync(resolved)) {
|
|
64
|
+
return reply.status(404).send({ error: 'File not found' });
|
|
65
|
+
}
|
|
66
|
+
const content = fs.readFileSync(resolved, 'utf-8');
|
|
67
|
+
return reply.send({ content });
|
|
68
|
+
});
|
|
69
|
+
// Save a file
|
|
70
|
+
app.put('/api/files/:squad/*', { preHandler: [app.requireAuth] }, async (request, reply) => {
|
|
71
|
+
const { squad } = request.params;
|
|
72
|
+
const filePath = request.params['*'];
|
|
73
|
+
if (!filePath)
|
|
74
|
+
return reply.status(400).send({ error: 'Missing file path' });
|
|
75
|
+
const resolved = path.resolve(squadsDir, squad, filePath);
|
|
76
|
+
if (!resolved.startsWith(path.resolve(squadsDir))) {
|
|
77
|
+
return reply.status(403).send({ error: 'Forbidden' });
|
|
78
|
+
}
|
|
79
|
+
const { content } = request.body;
|
|
80
|
+
if (typeof content !== 'string') {
|
|
81
|
+
return reply.status(400).send({ error: 'Content must be a string' });
|
|
82
|
+
}
|
|
83
|
+
// Ensure parent directory exists
|
|
84
|
+
const dir = path.dirname(resolved);
|
|
85
|
+
if (!fs.existsSync(dir)) {
|
|
86
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
87
|
+
}
|
|
88
|
+
fs.writeFileSync(resolved, content, 'utf-8');
|
|
89
|
+
return reply.send({ ok: true });
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=files-routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files-routes.js","sourceRoot":"","sources":["../../src/api/files-routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { FastifyInstance, FastifyPluginOptions } from 'fastify';
|
|
2
|
+
interface GraphRoutesOptions extends FastifyPluginOptions {
|
|
3
|
+
squadsDir: string;
|
|
4
|
+
}
|
|
5
|
+
interface GraphNode {
|
|
6
|
+
id: string;
|
|
7
|
+
label: string;
|
|
8
|
+
type: 'squad' | 'agent' | 'memory' | 'skill';
|
|
9
|
+
squad?: string;
|
|
10
|
+
}
|
|
11
|
+
interface GraphEdge {
|
|
12
|
+
source: string;
|
|
13
|
+
target: string;
|
|
14
|
+
type: 'contains' | 'pipeline' | 'delivers' | 'uses_skill' | 'has_memory' | 'shared_skill' | 'shared_memory';
|
|
15
|
+
label?: string;
|
|
16
|
+
}
|
|
17
|
+
interface GraphData {
|
|
18
|
+
nodes: GraphNode[];
|
|
19
|
+
edges: GraphEdge[];
|
|
20
|
+
}
|
|
21
|
+
declare function buildGraph(squadsDir: string): GraphData;
|
|
22
|
+
export declare function graphRoutes(app: FastifyInstance, opts: GraphRoutesOptions): Promise<void>;
|
|
23
|
+
export { buildGraph };
|
|
24
|
+
//# sourceMappingURL=graph-routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-routes.d.ts","sourceRoot":"","sources":["../../src/api/graph-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAKrE,UAAU,kBAAmB,SAAQ,oBAAoB;IACvD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,SAAS;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,SAAS;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,YAAY,GAAG,cAAc,GAAG,eAAe,CAAC;IAC5G,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,SAAS;IACjB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAsBD,iBAAS,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAqKhD;AAED,wBAAsB,WAAW,CAC/B,GAAG,EAAE,eAAe,EACpB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { parse as parseYaml } from 'yaml';
|
|
4
|
+
function scanMarkdownLinks(filePath) {
|
|
5
|
+
try {
|
|
6
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
7
|
+
const links = [];
|
|
8
|
+
// Match markdown links [text](path) and wikilinks [[path]]
|
|
9
|
+
const mdLinkRegex = /\[([^\]]*)\]\(([^)]+\.md)\)/g;
|
|
10
|
+
const wikiLinkRegex = /\[\[([^\]]+\.md)\]\]/g;
|
|
11
|
+
let match;
|
|
12
|
+
while ((match = mdLinkRegex.exec(content)) !== null) {
|
|
13
|
+
links.push(match[2]);
|
|
14
|
+
}
|
|
15
|
+
while ((match = wikiLinkRegex.exec(content)) !== null) {
|
|
16
|
+
links.push(match[1]);
|
|
17
|
+
}
|
|
18
|
+
return links;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function buildGraph(squadsDir) {
|
|
25
|
+
const nodes = [];
|
|
26
|
+
const edges = [];
|
|
27
|
+
const nodeIds = new Set();
|
|
28
|
+
const skillUsers = new Map(); // skill -> node ids that use it
|
|
29
|
+
const memoryRefs = new Map(); // memory path -> node ids that ref it
|
|
30
|
+
if (!fs.existsSync(squadsDir))
|
|
31
|
+
return { nodes, edges };
|
|
32
|
+
const entries = fs.readdirSync(squadsDir, { withFileTypes: true });
|
|
33
|
+
for (const entry of entries) {
|
|
34
|
+
if (!entry.isDirectory() || entry.name.startsWith('.') || entry.name.startsWith('_'))
|
|
35
|
+
continue;
|
|
36
|
+
const squadDir = path.join(squadsDir, entry.name);
|
|
37
|
+
const yamlPath = path.join(squadDir, 'squad.yaml');
|
|
38
|
+
if (!fs.existsSync(yamlPath))
|
|
39
|
+
continue;
|
|
40
|
+
let parsed;
|
|
41
|
+
try {
|
|
42
|
+
parsed = parseYaml(fs.readFileSync(yamlPath, 'utf-8'));
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
const s = parsed?.squad;
|
|
48
|
+
if (!s)
|
|
49
|
+
continue;
|
|
50
|
+
const squadCode = s.code || entry.name;
|
|
51
|
+
const squadId = `squad:${squadCode}`;
|
|
52
|
+
// Squad node
|
|
53
|
+
nodes.push({ id: squadId, label: s.name || squadCode, type: 'squad' });
|
|
54
|
+
nodeIds.add(squadId);
|
|
55
|
+
// Skills
|
|
56
|
+
const skills = Array.isArray(s.skills) ? s.skills : [];
|
|
57
|
+
for (const skill of skills) {
|
|
58
|
+
const skillId = `skill:${skill}`;
|
|
59
|
+
if (!nodeIds.has(skillId)) {
|
|
60
|
+
nodes.push({ id: skillId, label: skill, type: 'skill' });
|
|
61
|
+
nodeIds.add(skillId);
|
|
62
|
+
}
|
|
63
|
+
edges.push({ source: squadId, target: skillId, type: 'uses_skill' });
|
|
64
|
+
if (!skillUsers.has(skill))
|
|
65
|
+
skillUsers.set(skill, []);
|
|
66
|
+
skillUsers.get(skill).push(squadId);
|
|
67
|
+
}
|
|
68
|
+
// Memory files
|
|
69
|
+
const memoryDir = path.join(squadDir, '_memory');
|
|
70
|
+
if (fs.existsSync(memoryDir)) {
|
|
71
|
+
const memFiles = fs.readdirSync(memoryDir).filter((f) => f.endsWith('.md'));
|
|
72
|
+
for (const mf of memFiles) {
|
|
73
|
+
const memId = `memory:${squadCode}/${mf}`;
|
|
74
|
+
nodes.push({ id: memId, label: mf.replace('.md', ''), type: 'memory', squad: squadCode });
|
|
75
|
+
nodeIds.add(memId);
|
|
76
|
+
edges.push({ source: squadId, target: memId, type: 'has_memory' });
|
|
77
|
+
const memPath = `_memory/${mf}`;
|
|
78
|
+
if (!memoryRefs.has(memPath))
|
|
79
|
+
memoryRefs.set(memPath, []);
|
|
80
|
+
memoryRefs.get(memPath).push(squadId);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Shared memory refs (company, preferences)
|
|
84
|
+
for (const ref of ['company', 'preferences', 'memory']) {
|
|
85
|
+
const refPath = s[ref];
|
|
86
|
+
if (typeof refPath === 'string' && refPath.includes('_expxagents/')) {
|
|
87
|
+
const sharedMemId = `memory:shared:${path.basename(refPath, '.md')}`;
|
|
88
|
+
if (!nodeIds.has(sharedMemId)) {
|
|
89
|
+
nodes.push({ id: sharedMemId, label: path.basename(refPath, '.md'), type: 'memory' });
|
|
90
|
+
nodeIds.add(sharedMemId);
|
|
91
|
+
}
|
|
92
|
+
edges.push({ source: squadId, target: sharedMemId, type: 'shared_memory' });
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Agents
|
|
96
|
+
const agents = Array.isArray(s.agents) ? s.agents : [];
|
|
97
|
+
const agentMap = new Map();
|
|
98
|
+
for (const agent of agents) {
|
|
99
|
+
const agentId = `agent:${squadCode}/${agent.id}`;
|
|
100
|
+
nodes.push({ id: agentId, label: agent.name || agent.id, type: 'agent', squad: squadCode });
|
|
101
|
+
nodeIds.add(agentId);
|
|
102
|
+
agentMap.set(agent.id, agentId);
|
|
103
|
+
edges.push({ source: squadId, target: agentId, type: 'contains' });
|
|
104
|
+
// Agent-level skills from frontmatter
|
|
105
|
+
if (agent.prompt) {
|
|
106
|
+
const promptPath = path.join(squadDir, agent.prompt);
|
|
107
|
+
if (fs.existsSync(promptPath)) {
|
|
108
|
+
try {
|
|
109
|
+
const content = fs.readFileSync(promptPath, 'utf-8');
|
|
110
|
+
const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
111
|
+
if (fmMatch) {
|
|
112
|
+
const fm = parseYaml(fmMatch[1]);
|
|
113
|
+
if (Array.isArray(fm?.skills)) {
|
|
114
|
+
for (const sk of fm.skills) {
|
|
115
|
+
const skId = `skill:${sk}`;
|
|
116
|
+
if (!nodeIds.has(skId)) {
|
|
117
|
+
nodes.push({ id: skId, label: sk, type: 'skill' });
|
|
118
|
+
nodeIds.add(skId);
|
|
119
|
+
}
|
|
120
|
+
edges.push({ source: agentId, target: skId, type: 'uses_skill' });
|
|
121
|
+
if (!skillUsers.has(sk))
|
|
122
|
+
skillUsers.set(sk, []);
|
|
123
|
+
skillUsers.get(sk).push(agentId);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// base_agent reference
|
|
127
|
+
if (fm?.base_agent) {
|
|
128
|
+
const baseId = `skill:base:${fm.base_agent}`;
|
|
129
|
+
if (!nodeIds.has(baseId)) {
|
|
130
|
+
nodes.push({ id: baseId, label: fm.base_agent, type: 'skill' });
|
|
131
|
+
nodeIds.add(baseId);
|
|
132
|
+
}
|
|
133
|
+
edges.push({ source: agentId, target: baseId, type: 'uses_skill', label: 'base_agent' });
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// skip
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// Pipeline connections
|
|
144
|
+
const steps = s.pipeline?.steps;
|
|
145
|
+
if (Array.isArray(steps)) {
|
|
146
|
+
let prevAgentNodeId = null;
|
|
147
|
+
for (const step of steps) {
|
|
148
|
+
if (!step.agent)
|
|
149
|
+
continue;
|
|
150
|
+
const agentNodeId = agentMap.get(step.agent);
|
|
151
|
+
if (!agentNodeId)
|
|
152
|
+
continue;
|
|
153
|
+
if (step.deliverFrom) {
|
|
154
|
+
const fromNodeId = agentMap.get(step.deliverFrom);
|
|
155
|
+
if (fromNodeId) {
|
|
156
|
+
edges.push({ source: fromNodeId, target: agentNodeId, type: 'delivers', label: step.label });
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
else if (prevAgentNodeId && prevAgentNodeId !== agentNodeId) {
|
|
160
|
+
edges.push({ source: prevAgentNodeId, target: agentNodeId, type: 'pipeline' });
|
|
161
|
+
}
|
|
162
|
+
prevAgentNodeId = agentNodeId;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// Add shared_skill edges between squads that use the same skills
|
|
167
|
+
for (const [, users] of skillUsers) {
|
|
168
|
+
if (users.length <= 1)
|
|
169
|
+
continue;
|
|
170
|
+
const squadUsers = users.filter((u) => u.startsWith('squad:'));
|
|
171
|
+
for (let i = 0; i < squadUsers.length; i++) {
|
|
172
|
+
for (let j = i + 1; j < squadUsers.length; j++) {
|
|
173
|
+
const exists = edges.some((e) => e.type === 'shared_skill' && ((e.source === squadUsers[i] && e.target === squadUsers[j]) || (e.source === squadUsers[j] && e.target === squadUsers[i])));
|
|
174
|
+
if (!exists) {
|
|
175
|
+
edges.push({ source: squadUsers[i], target: squadUsers[j], type: 'shared_skill' });
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return { nodes, edges };
|
|
181
|
+
}
|
|
182
|
+
export async function graphRoutes(app, opts) {
|
|
183
|
+
const { squadsDir } = opts;
|
|
184
|
+
app.get('/api/graph', { preHandler: [app.requireAuth] }, async () => {
|
|
185
|
+
return buildGraph(squadsDir);
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
export { buildGraph };
|
|
189
|
+
//# sourceMappingURL=graph-routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-routes.js","sourceRoot":"","sources":["../../src/api/graph-routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { FastifyInstance, FastifyPluginOptions } from 'fastify';
|
|
2
|
+
import type Database from 'better-sqlite3';
|
|
3
|
+
interface KanbanRoutesOptions extends FastifyPluginOptions {
|
|
4
|
+
db: Database.Database;
|
|
5
|
+
}
|
|
6
|
+
export declare function kanbanRoutes(app: FastifyInstance, opts: KanbanRoutesOptions): Promise<void>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=kanban-routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kanban-routes.d.ts","sourceRoot":"","sources":["../../src/api/kanban-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAG3C,UAAU,mBAAoB,SAAQ,oBAAoB;IACxD,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;CACvB;AAED,wBAAsB,YAAY,CAChC,GAAG,EAAE,eAAe,EACpB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,IAAI,CAAC,CAuJf"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
2
|
+
export async function kanbanRoutes(app, opts) {
|
|
3
|
+
const { db } = opts;
|
|
4
|
+
// GET /api/kanban/:squad/tasks
|
|
5
|
+
app.get('/api/kanban/:squad/tasks', {
|
|
6
|
+
preHandler: [app.requireAuth],
|
|
7
|
+
}, async (request, reply) => {
|
|
8
|
+
const { squad } = request.params;
|
|
9
|
+
const rows = db.prepare('SELECT * FROM kanban_tasks WHERE squad_code = ? ORDER BY status, position, created_at').all(squad);
|
|
10
|
+
return reply.send(rows);
|
|
11
|
+
});
|
|
12
|
+
// GET /api/kanban/:squad/tasks/:id — single task with full details
|
|
13
|
+
app.get('/api/kanban/:squad/tasks/:id', {
|
|
14
|
+
preHandler: [app.requireAuth],
|
|
15
|
+
}, async (request, reply) => {
|
|
16
|
+
const { squad, id } = request.params;
|
|
17
|
+
const task = db.prepare('SELECT * FROM kanban_tasks WHERE id = ? AND squad_code = ?').get(id, squad);
|
|
18
|
+
if (!task) {
|
|
19
|
+
return reply.code(404).send({ error: 'Task not found' });
|
|
20
|
+
}
|
|
21
|
+
return reply.send(task);
|
|
22
|
+
});
|
|
23
|
+
// POST /api/kanban/:squad/tasks
|
|
24
|
+
app.post('/api/kanban/:squad/tasks', {
|
|
25
|
+
preHandler: [app.requireAuth],
|
|
26
|
+
}, async (request, reply) => {
|
|
27
|
+
const { squad } = request.params;
|
|
28
|
+
const { title, description, status } = request.body;
|
|
29
|
+
if (!title || typeof title !== 'string' || !title.trim()) {
|
|
30
|
+
return reply.code(400).send({ error: 'title is required' });
|
|
31
|
+
}
|
|
32
|
+
const taskStatus = status || 'planned';
|
|
33
|
+
if (!['planned', 'executing', 'done'].includes(taskStatus)) {
|
|
34
|
+
return reply.code(400).send({ error: 'Invalid status' });
|
|
35
|
+
}
|
|
36
|
+
// Get next position for this status
|
|
37
|
+
const maxPos = db.prepare('SELECT COALESCE(MAX(position), -1) as maxPos FROM kanban_tasks WHERE squad_code = ? AND status = ?').get(squad, taskStatus);
|
|
38
|
+
const id = crypto.randomUUID();
|
|
39
|
+
const now = new Date().toISOString();
|
|
40
|
+
const startedAt = taskStatus === 'executing' ? now : null;
|
|
41
|
+
const finishedAt = taskStatus === 'done' ? now : null;
|
|
42
|
+
db.prepare(`INSERT INTO kanban_tasks (id, squad_code, title, description, status, position, result, started_at, finished_at, created_at, updated_at)
|
|
43
|
+
VALUES (?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?)`).run(id, squad, title.trim(), description?.trim() || null, taskStatus, maxPos.maxPos + 1, startedAt, finishedAt, now, now);
|
|
44
|
+
const task = db.prepare('SELECT * FROM kanban_tasks WHERE id = ?').get(id);
|
|
45
|
+
return reply.code(201).send(task);
|
|
46
|
+
});
|
|
47
|
+
// PATCH /api/kanban/:squad/tasks/:id
|
|
48
|
+
app.patch('/api/kanban/:squad/tasks/:id', {
|
|
49
|
+
preHandler: [app.requireAuth],
|
|
50
|
+
}, async (request, reply) => {
|
|
51
|
+
const { squad, id } = request.params;
|
|
52
|
+
const { title, description, status, position, result } = request.body;
|
|
53
|
+
const existing = db.prepare('SELECT * FROM kanban_tasks WHERE id = ? AND squad_code = ?').get(id, squad);
|
|
54
|
+
if (!existing) {
|
|
55
|
+
return reply.code(404).send({ error: 'Task not found' });
|
|
56
|
+
}
|
|
57
|
+
if (status && !['planned', 'executing', 'done'].includes(status)) {
|
|
58
|
+
return reply.code(400).send({ error: 'Invalid status' });
|
|
59
|
+
}
|
|
60
|
+
const newTitle = title?.trim() || existing.title;
|
|
61
|
+
const newDescription = description !== undefined ? (description?.trim() || null) : existing.description;
|
|
62
|
+
const newStatus = status || existing.status;
|
|
63
|
+
const newResult = result !== undefined ? result : existing.result;
|
|
64
|
+
let newPosition = position ?? existing.position;
|
|
65
|
+
// Auto-set timestamps on status transitions
|
|
66
|
+
let startedAt = existing.started_at;
|
|
67
|
+
let finishedAt = existing.finished_at;
|
|
68
|
+
if (status && status !== existing.status) {
|
|
69
|
+
if (status === 'executing' && !existing.started_at) {
|
|
70
|
+
startedAt = new Date().toISOString();
|
|
71
|
+
}
|
|
72
|
+
if (status === 'done') {
|
|
73
|
+
finishedAt = new Date().toISOString();
|
|
74
|
+
}
|
|
75
|
+
// If moved back to planned, clear timestamps
|
|
76
|
+
if (status === 'planned') {
|
|
77
|
+
startedAt = null;
|
|
78
|
+
finishedAt = null;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// If status changed, put at end of new column
|
|
82
|
+
if (status && status !== existing.status && position === undefined) {
|
|
83
|
+
const maxPos = db.prepare('SELECT COALESCE(MAX(position), -1) as maxPos FROM kanban_tasks WHERE squad_code = ? AND status = ?').get(squad, newStatus);
|
|
84
|
+
newPosition = maxPos.maxPos + 1;
|
|
85
|
+
}
|
|
86
|
+
const now = new Date().toISOString();
|
|
87
|
+
db.prepare(`UPDATE kanban_tasks SET title = ?, description = ?, status = ?, position = ?, result = ?, started_at = ?, finished_at = ?, updated_at = ? WHERE id = ?`).run(newTitle, newDescription, newStatus, newPosition, newResult, startedAt, finishedAt, now, id);
|
|
88
|
+
const updated = db.prepare('SELECT * FROM kanban_tasks WHERE id = ?').get(id);
|
|
89
|
+
return reply.send(updated);
|
|
90
|
+
});
|
|
91
|
+
// DELETE /api/kanban/:squad/tasks/:id
|
|
92
|
+
app.delete('/api/kanban/:squad/tasks/:id', {
|
|
93
|
+
preHandler: [app.requireAuth],
|
|
94
|
+
}, async (request, reply) => {
|
|
95
|
+
const { squad, id } = request.params;
|
|
96
|
+
const existing = db.prepare('SELECT id FROM kanban_tasks WHERE id = ? AND squad_code = ?').get(id, squad);
|
|
97
|
+
if (!existing) {
|
|
98
|
+
return reply.code(404).send({ error: 'Task not found' });
|
|
99
|
+
}
|
|
100
|
+
db.prepare('DELETE FROM kanban_tasks WHERE id = ?').run(id);
|
|
101
|
+
return reply.code(204).send();
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=kanban-routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kanban-routes.js","sourceRoot":"","sources":["../../src/api/kanban-routes.ts"],"names":[],"mappings":"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"}
|
package/dist/server/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAQ/C,OAAO,EAAc,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAQ/C,OAAO,EAAc,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAgCtD,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;CAC1B;AAED,wBAAsB,QAAQ,CAAC,IAAI,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CA+J/E"}
|
package/dist/server/app.js
CHANGED
|
@@ -31,6 +31,9 @@ import { settingsRoutes } from './api/settings-routes.js';
|
|
|
31
31
|
import { orgchartRoutes } from './api/orgchart-routes.js';
|
|
32
32
|
import { teamRoutes } from './api/team-routes.js';
|
|
33
33
|
import { integrationRoutes } from './api/integration-routes.js';
|
|
34
|
+
import { graphRoutes } from './api/graph-routes.js';
|
|
35
|
+
import { filesRoutes } from './api/files-routes.js';
|
|
36
|
+
import { kanbanRoutes } from './api/kanban-routes.js';
|
|
34
37
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
35
38
|
export async function buildApp(opts) {
|
|
36
39
|
const config = { ...loadConfig(), ...opts?.config };
|
|
@@ -63,6 +66,9 @@ export async function buildApp(opts) {
|
|
|
63
66
|
await app.register(orgchartRoutes, { squadsDir: config.squadsDir });
|
|
64
67
|
await app.register(teamRoutes, { db });
|
|
65
68
|
await app.register(integrationRoutes, { db });
|
|
69
|
+
await app.register(graphRoutes, { squadsDir: config.squadsDir });
|
|
70
|
+
await app.register(filesRoutes, { squadsDir: config.squadsDir });
|
|
71
|
+
await app.register(kanbanRoutes, { db });
|
|
66
72
|
// WebSocket
|
|
67
73
|
const wsContext = await registerWebSocket(app, config.jwtSecret, config.squadsDir);
|
|
68
74
|
// Chat Bridge
|
package/dist/server/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,IAAI,MAAM,eAAe,CAAC;AACjC,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,SAAS,MAAM,qBAAqB,CAAC;AAC5C,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAe,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAK3C,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAK3C,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAsBzD;AAED,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAS3E"}
|
|
@@ -11,6 +11,16 @@ export function runMigrations(db) {
|
|
|
11
11
|
if (!hasAttempt) {
|
|
12
12
|
db.exec('ALTER TABLE squad_activities ADD COLUMN attempt INTEGER DEFAULT 1');
|
|
13
13
|
}
|
|
14
|
+
// Add result, started_at, finished_at to kanban_tasks if missing
|
|
15
|
+
const kanbanCols = db.prepare('PRAGMA table_info(kanban_tasks)').all();
|
|
16
|
+
if (kanbanCols.length > 0) {
|
|
17
|
+
const hasResult = kanbanCols.some((c) => c.name === 'result');
|
|
18
|
+
if (!hasResult) {
|
|
19
|
+
db.exec('ALTER TABLE kanban_tasks ADD COLUMN result TEXT');
|
|
20
|
+
db.exec('ALTER TABLE kanban_tasks ADD COLUMN started_at TEXT');
|
|
21
|
+
db.exec('ALTER TABLE kanban_tasks ADD COLUMN finished_at TEXT');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
14
24
|
}
|
|
15
25
|
export async function seedDefaultAdmin(db) {
|
|
16
26
|
const existing = db.prepare('SELECT id FROM users WHERE username = ?').get('admin');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,aAAa,CAAC,EAAqB;IACjD,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEpB,6DAA6D;IAC7D,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,EAAW,CAAC;IACjF,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAClE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,EAAE,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EAAqB;IAC1D,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACpF,IAAI,QAAQ;QAAE,OAAO;IAErB,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC5C,EAAE,CAAC,OAAO,CACR,oGAAoG,CACrG,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AACpE,CAAC"}
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/db/migrations.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,aAAa,CAAC,EAAqB;IACjD,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEpB,6DAA6D;IAC7D,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,EAAW,CAAC;IACjF,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAClE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,EAAE,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;IAC/E,CAAC;IAED,iEAAiE;IACjE,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC,GAAG,EAAW,CAAC;IAChF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QACnE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,EAAE,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;YAC3D,EAAE,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;YAC/D,EAAE,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EAAqB;IAC1D,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACpF,IAAI,QAAQ;QAAE,OAAO;IAErB,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC5C,EAAE,CAAC,OAAO,CACR,oGAAoG,CACrG,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const SCHEMA_SQL = "\nCREATE TABLE IF NOT EXISTS users (\n id TEXT PRIMARY KEY,\n username TEXT UNIQUE NOT NULL,\n email TEXT,\n password_hash TEXT NOT NULL,\n role TEXT NOT NULL DEFAULT 'operator',\n created_at TEXT NOT NULL,\n last_login TEXT\n);\n\nCREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\n token_hash TEXT NOT NULL,\n expires_at TEXT NOT NULL,\n created_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS audit_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n user_id TEXT NOT NULL REFERENCES users(id),\n action TEXT NOT NULL,\n details TEXT,\n created_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS conversations (\n id TEXT PRIMARY KEY,\n squad_name TEXT NOT NULL,\n created_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS chat_messages (\n id TEXT PRIMARY KEY,\n conversation_id TEXT NOT NULL REFERENCES conversations(id),\n role TEXT NOT NULL,\n content TEXT NOT NULL,\n agent_id TEXT,\n agent_name TEXT,\n created_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS squad_activities (\n id TEXT PRIMARY KEY,\n squad_code TEXT NOT NULL,\n conversation_id TEXT,\n started_at TEXT NOT NULL,\n finished_at TEXT,\n duration_ms INTEGER,\n status TEXT NOT NULL DEFAULT 'running',\n user_message TEXT,\n result_summary TEXT,\n triggered_by TEXT DEFAULT 'dashboard',\n created_at TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_squad_activities_squad_date\n ON squad_activities(squad_code, started_at);\n\nCREATE INDEX IF NOT EXISTS idx_squad_activities_date\n ON squad_activities(started_at);\n\nCREATE TABLE IF NOT EXISTS scheduled_jobs (\n squad_name TEXT PRIMARY KEY,\n cron_expression TEXT NOT NULL,\n prompt TEXT NOT NULL,\n mode TEXT DEFAULT 'autonomous',\n timeout_minutes INTEGER DEFAULT 30,\n retry_on_failure INTEGER DEFAULT 0,\n timezone TEXT,\n status TEXT DEFAULT 'active',\n last_run_at TEXT,\n last_result TEXT,\n next_run_at TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_squad_activities_triggered_by\n ON squad_activities(triggered_by, squad_code);\n\nCREATE TABLE IF NOT EXISTS leads (\n id TEXT PRIMARY KEY,\n email TEXT UNIQUE NOT NULL,\n name TEXT,\n company TEXT,\n metadata TEXT,\n status TEXT DEFAULT 'active',\n source TEXT,\n source_detail TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n);\n\nCREATE TABLE IF NOT EXISTS lead_tags (\n lead_id TEXT NOT NULL REFERENCES leads(id) ON DELETE CASCADE,\n tag TEXT NOT NULL,\n PRIMARY KEY (lead_id, tag)\n);\n\nCREATE TABLE IF NOT EXISTS lead_lists (\n lead_id TEXT NOT NULL REFERENCES leads(id) ON DELETE CASCADE,\n list_name TEXT NOT NULL,\n PRIMARY KEY (lead_id, list_name)\n);\n\nCREATE TABLE IF NOT EXISTS email_campaigns (\n id TEXT PRIMARY KEY,\n name TEXT,\n squad_name TEXT,\n subject TEXT,\n body_html TEXT,\n body_text TEXT,\n from_email TEXT,\n from_name TEXT,\n status TEXT DEFAULT 'draft',\n total_recipients INTEGER DEFAULT 0,\n sent_count INTEGER DEFAULT 0,\n failed_count INTEGER DEFAULT 0,\n bounce_count INTEGER DEFAULT 0,\n complaint_count INTEGER DEFAULT 0,\n created_at TEXT DEFAULT (datetime('now')),\n started_at TEXT,\n completed_at TEXT\n);\n\nCREATE TABLE IF NOT EXISTS email_queue (\n id TEXT PRIMARY KEY,\n campaign_id TEXT REFERENCES email_campaigns(id) ON DELETE CASCADE,\n lead_id TEXT REFERENCES leads(id) ON DELETE SET NULL,\n to_email TEXT NOT NULL,\n status TEXT DEFAULT 'pending',\n ses_message_id TEXT,\n error TEXT,\n attempts INTEGER DEFAULT 0,\n scheduled_at TEXT,\n sent_at TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_email_queue_status_scheduled\n ON email_queue(status, scheduled_at);\nCREATE INDEX IF NOT EXISTS idx_email_queue_ses_message_id\n ON email_queue(ses_message_id);\nCREATE INDEX IF NOT EXISTS idx_email_queue_campaign_status\n ON email_queue(campaign_id, status);\nCREATE INDEX IF NOT EXISTS idx_lead_tags_tag\n ON lead_tags(tag);\nCREATE INDEX IF NOT EXISTS idx_lead_lists_list_name\n ON lead_lists(list_name);\n\nCREATE TABLE IF NOT EXISTS team_members (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n role TEXT NOT NULL,\n email TEXT,\n phone TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n);\n\nCREATE TABLE IF NOT EXISTS integrations (\n provider TEXT PRIMARY KEY,\n enabled INTEGER NOT NULL DEFAULT 0,\n config TEXT NOT NULL DEFAULT '{}',\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n);\n";
|
|
1
|
+
export declare const SCHEMA_SQL = "\nCREATE TABLE IF NOT EXISTS users (\n id TEXT PRIMARY KEY,\n username TEXT UNIQUE NOT NULL,\n email TEXT,\n password_hash TEXT NOT NULL,\n role TEXT NOT NULL DEFAULT 'operator',\n created_at TEXT NOT NULL,\n last_login TEXT\n);\n\nCREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\n token_hash TEXT NOT NULL,\n expires_at TEXT NOT NULL,\n created_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS audit_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n user_id TEXT NOT NULL REFERENCES users(id),\n action TEXT NOT NULL,\n details TEXT,\n created_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS conversations (\n id TEXT PRIMARY KEY,\n squad_name TEXT NOT NULL,\n created_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS chat_messages (\n id TEXT PRIMARY KEY,\n conversation_id TEXT NOT NULL REFERENCES conversations(id),\n role TEXT NOT NULL,\n content TEXT NOT NULL,\n agent_id TEXT,\n agent_name TEXT,\n created_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS squad_activities (\n id TEXT PRIMARY KEY,\n squad_code TEXT NOT NULL,\n conversation_id TEXT,\n started_at TEXT NOT NULL,\n finished_at TEXT,\n duration_ms INTEGER,\n status TEXT NOT NULL DEFAULT 'running',\n user_message TEXT,\n result_summary TEXT,\n triggered_by TEXT DEFAULT 'dashboard',\n created_at TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_squad_activities_squad_date\n ON squad_activities(squad_code, started_at);\n\nCREATE INDEX IF NOT EXISTS idx_squad_activities_date\n ON squad_activities(started_at);\n\nCREATE TABLE IF NOT EXISTS scheduled_jobs (\n squad_name TEXT PRIMARY KEY,\n cron_expression TEXT NOT NULL,\n prompt TEXT NOT NULL,\n mode TEXT DEFAULT 'autonomous',\n timeout_minutes INTEGER DEFAULT 30,\n retry_on_failure INTEGER DEFAULT 0,\n timezone TEXT,\n status TEXT DEFAULT 'active',\n last_run_at TEXT,\n last_result TEXT,\n next_run_at TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_squad_activities_triggered_by\n ON squad_activities(triggered_by, squad_code);\n\nCREATE TABLE IF NOT EXISTS leads (\n id TEXT PRIMARY KEY,\n email TEXT UNIQUE NOT NULL,\n name TEXT,\n company TEXT,\n metadata TEXT,\n status TEXT DEFAULT 'active',\n source TEXT,\n source_detail TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n);\n\nCREATE TABLE IF NOT EXISTS lead_tags (\n lead_id TEXT NOT NULL REFERENCES leads(id) ON DELETE CASCADE,\n tag TEXT NOT NULL,\n PRIMARY KEY (lead_id, tag)\n);\n\nCREATE TABLE IF NOT EXISTS lead_lists (\n lead_id TEXT NOT NULL REFERENCES leads(id) ON DELETE CASCADE,\n list_name TEXT NOT NULL,\n PRIMARY KEY (lead_id, list_name)\n);\n\nCREATE TABLE IF NOT EXISTS email_campaigns (\n id TEXT PRIMARY KEY,\n name TEXT,\n squad_name TEXT,\n subject TEXT,\n body_html TEXT,\n body_text TEXT,\n from_email TEXT,\n from_name TEXT,\n status TEXT DEFAULT 'draft',\n total_recipients INTEGER DEFAULT 0,\n sent_count INTEGER DEFAULT 0,\n failed_count INTEGER DEFAULT 0,\n bounce_count INTEGER DEFAULT 0,\n complaint_count INTEGER DEFAULT 0,\n created_at TEXT DEFAULT (datetime('now')),\n started_at TEXT,\n completed_at TEXT\n);\n\nCREATE TABLE IF NOT EXISTS email_queue (\n id TEXT PRIMARY KEY,\n campaign_id TEXT REFERENCES email_campaigns(id) ON DELETE CASCADE,\n lead_id TEXT REFERENCES leads(id) ON DELETE SET NULL,\n to_email TEXT NOT NULL,\n status TEXT DEFAULT 'pending',\n ses_message_id TEXT,\n error TEXT,\n attempts INTEGER DEFAULT 0,\n scheduled_at TEXT,\n sent_at TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_email_queue_status_scheduled\n ON email_queue(status, scheduled_at);\nCREATE INDEX IF NOT EXISTS idx_email_queue_ses_message_id\n ON email_queue(ses_message_id);\nCREATE INDEX IF NOT EXISTS idx_email_queue_campaign_status\n ON email_queue(campaign_id, status);\nCREATE INDEX IF NOT EXISTS idx_lead_tags_tag\n ON lead_tags(tag);\nCREATE INDEX IF NOT EXISTS idx_lead_lists_list_name\n ON lead_lists(list_name);\n\nCREATE TABLE IF NOT EXISTS team_members (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n role TEXT NOT NULL,\n email TEXT,\n phone TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n);\n\nCREATE TABLE IF NOT EXISTS integrations (\n provider TEXT PRIMARY KEY,\n enabled INTEGER NOT NULL DEFAULT 0,\n config TEXT NOT NULL DEFAULT '{}',\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n);\n\nCREATE TABLE IF NOT EXISTS kanban_tasks (\n id TEXT PRIMARY KEY,\n squad_code TEXT NOT NULL,\n title TEXT NOT NULL,\n description TEXT,\n status TEXT NOT NULL DEFAULT 'planned',\n position INTEGER NOT NULL DEFAULT 0,\n result TEXT,\n started_at TEXT,\n finished_at TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_kanban_tasks_squad_status\n ON kanban_tasks(squad_code, status);\n";
|
|
2
2
|
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,+iKA0LtB,CAAC"}
|
package/dist/server/db/schema.js
CHANGED
|
@@ -167,5 +167,22 @@ CREATE TABLE IF NOT EXISTS integrations (
|
|
|
167
167
|
created_at TEXT DEFAULT (datetime('now')),
|
|
168
168
|
updated_at TEXT DEFAULT (datetime('now'))
|
|
169
169
|
);
|
|
170
|
+
|
|
171
|
+
CREATE TABLE IF NOT EXISTS kanban_tasks (
|
|
172
|
+
id TEXT PRIMARY KEY,
|
|
173
|
+
squad_code TEXT NOT NULL,
|
|
174
|
+
title TEXT NOT NULL,
|
|
175
|
+
description TEXT,
|
|
176
|
+
status TEXT NOT NULL DEFAULT 'planned',
|
|
177
|
+
position INTEGER NOT NULL DEFAULT 0,
|
|
178
|
+
result TEXT,
|
|
179
|
+
started_at TEXT,
|
|
180
|
+
finished_at TEXT,
|
|
181
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
182
|
+
updated_at TEXT DEFAULT (datetime('now'))
|
|
183
|
+
);
|
|
184
|
+
|
|
185
|
+
CREATE INDEX IF NOT EXISTS idx_kanban_tasks_squad_status
|
|
186
|
+
ON kanban_tasks(squad_code, status);
|
|
170
187
|
`;
|
|
171
188
|
//# sourceMappingURL=schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0LzB,CAAC"}
|