octo-vec 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +646 -0
- package/core/prompts/architect.md +124 -0
- package/core/prompts/ba.md +117 -0
- package/core/prompts/backend.md +154 -0
- package/core/prompts/compliance.md +127 -0
- package/core/prompts/dataanalyst.md +126 -0
- package/core/prompts/dataengineer.md +155 -0
- package/core/prompts/dba.md +155 -0
- package/core/prompts/designer.md +145 -0
- package/core/prompts/dev.md +148 -0
- package/core/prompts/devops.md +127 -0
- package/core/prompts/frontend.md +151 -0
- package/core/prompts/mlengineer.md +156 -0
- package/core/prompts/mobile.md +155 -0
- package/core/prompts/pm.md +182 -0
- package/core/prompts/productowner.md +122 -0
- package/core/prompts/qa.md +135 -0
- package/core/prompts/releasemanager.md +138 -0
- package/core/prompts/researcher.md +122 -0
- package/core/prompts/scrummaster.md +125 -0
- package/core/prompts/security.md +127 -0
- package/core/prompts/sre.md +141 -0
- package/core/prompts/support.md +138 -0
- package/core/prompts/techwriter.md +123 -0
- package/core/roster.json +1161 -0
- package/dashboard/dist/assets/index--L-aFRgh.css +1 -0
- package/dashboard/dist/assets/index-BoOVmAFf.js +523 -0
- package/dashboard/dist/icons/integrations/gitleaks.svg +6 -0
- package/dashboard/dist/icons/integrations/searxng.svg +5 -0
- package/dashboard/dist/icons/integrations/semgrep.svg +4 -0
- package/dashboard/dist/icons/integrations/slack.svg +6 -0
- package/dashboard/dist/icons/integrations/sonarqube.svg +5 -0
- package/dashboard/dist/icons/integrations/telegram.svg +4 -0
- package/dashboard/dist/icons/integrations/trivy.svg +5 -0
- package/dashboard/dist/icons/providers/anthropic.svg +1 -0
- package/dashboard/dist/icons/providers/antigravity.svg +1 -0
- package/dashboard/dist/icons/providers/azure.svg +1 -0
- package/dashboard/dist/icons/providers/bedrock.svg +1 -0
- package/dashboard/dist/icons/providers/cerebras.svg +1 -0
- package/dashboard/dist/icons/providers/chatglm.svg +1 -0
- package/dashboard/dist/icons/providers/codex.svg +1 -0
- package/dashboard/dist/icons/providers/gemini.svg +1 -0
- package/dashboard/dist/icons/providers/githubcopilot.svg +1 -0
- package/dashboard/dist/icons/providers/googlecloud.svg +1 -0
- package/dashboard/dist/icons/providers/groq.svg +1 -0
- package/dashboard/dist/icons/providers/huggingface.svg +1 -0
- package/dashboard/dist/icons/providers/kimi.svg +1 -0
- package/dashboard/dist/icons/providers/minimax.svg +1 -0
- package/dashboard/dist/icons/providers/mistral.svg +1 -0
- package/dashboard/dist/icons/providers/openai.svg +1 -0
- package/dashboard/dist/icons/providers/openrouter.svg +1 -0
- package/dashboard/dist/icons/providers/vercel.svg +1 -0
- package/dashboard/dist/icons/providers/xai.svg +1 -0
- package/dashboard/dist/index.html +17 -0
- package/dist/agents/pmAgent.d.ts +40 -0
- package/dist/agents/pmAgent.d.ts.map +1 -0
- package/dist/agents/pmAgent.js +181 -0
- package/dist/agents/pmAgent.js.map +1 -0
- package/dist/ar/baseSpecialist.d.ts +36 -0
- package/dist/ar/baseSpecialist.d.ts.map +1 -0
- package/dist/ar/baseSpecialist.js +292 -0
- package/dist/ar/baseSpecialist.js.map +1 -0
- package/dist/ar/promptLoader.d.ts +10 -0
- package/dist/ar/promptLoader.d.ts.map +1 -0
- package/dist/ar/promptLoader.js +22 -0
- package/dist/ar/promptLoader.js.map +1 -0
- package/dist/ar/registry.d.ts +12 -0
- package/dist/ar/registry.d.ts.map +1 -0
- package/dist/ar/registry.js +22 -0
- package/dist/ar/registry.js.map +1 -0
- package/dist/ar/roster.d.ts +104 -0
- package/dist/ar/roster.d.ts.map +1 -0
- package/dist/ar/roster.js +245 -0
- package/dist/ar/roster.js.map +1 -0
- package/dist/ar/toolProfiles.d.ts +18 -0
- package/dist/ar/toolProfiles.d.ts.map +1 -0
- package/dist/ar/toolProfiles.js +89 -0
- package/dist/ar/toolProfiles.js.map +1 -0
- package/dist/atp/agentGroups.d.ts +39 -0
- package/dist/atp/agentGroups.d.ts.map +1 -0
- package/dist/atp/agentGroups.js +109 -0
- package/dist/atp/agentGroups.js.map +1 -0
- package/dist/atp/agentInterrupt.d.ts +31 -0
- package/dist/atp/agentInterrupt.d.ts.map +1 -0
- package/dist/atp/agentInterrupt.js +51 -0
- package/dist/atp/agentInterrupt.js.map +1 -0
- package/dist/atp/agentMessageQueue.d.ts +74 -0
- package/dist/atp/agentMessageQueue.d.ts.map +1 -0
- package/dist/atp/agentMessageQueue.js +218 -0
- package/dist/atp/agentMessageQueue.js.map +1 -0
- package/dist/atp/agentRuntime.d.ts +67 -0
- package/dist/atp/agentRuntime.d.ts.map +1 -0
- package/dist/atp/agentRuntime.js +279 -0
- package/dist/atp/agentRuntime.js.map +1 -0
- package/dist/atp/agentStreamBus.d.ts +35 -0
- package/dist/atp/agentStreamBus.d.ts.map +1 -0
- package/dist/atp/agentStreamBus.js +159 -0
- package/dist/atp/agentStreamBus.js.map +1 -0
- package/dist/atp/agentToolConfig.d.ts +38 -0
- package/dist/atp/agentToolConfig.d.ts.map +1 -0
- package/dist/atp/agentToolConfig.js +225 -0
- package/dist/atp/agentToolConfig.js.map +1 -0
- package/dist/atp/chatLog.d.ts +34 -0
- package/dist/atp/chatLog.d.ts.map +1 -0
- package/dist/atp/chatLog.js +59 -0
- package/dist/atp/chatLog.js.map +1 -0
- package/dist/atp/codexAuth.d.ts +6 -0
- package/dist/atp/codexAuth.d.ts.map +1 -0
- package/dist/atp/codexAuth.js +44 -0
- package/dist/atp/codexAuth.js.map +1 -0
- package/dist/atp/database.d.ts +54 -0
- package/dist/atp/database.d.ts.map +1 -0
- package/dist/atp/database.js +323 -0
- package/dist/atp/database.js.map +1 -0
- package/dist/atp/eventLog.d.ts +12 -0
- package/dist/atp/eventLog.d.ts.map +1 -0
- package/dist/atp/eventLog.js +60 -0
- package/dist/atp/eventLog.js.map +1 -0
- package/dist/atp/inboxLoop.d.ts +72 -0
- package/dist/atp/inboxLoop.d.ts.map +1 -0
- package/dist/atp/inboxLoop.js +482 -0
- package/dist/atp/inboxLoop.js.map +1 -0
- package/dist/atp/llmDebug.d.ts +18 -0
- package/dist/atp/llmDebug.d.ts.map +1 -0
- package/dist/atp/llmDebug.js +97 -0
- package/dist/atp/llmDebug.js.map +1 -0
- package/dist/atp/messageDebouncer.d.ts +34 -0
- package/dist/atp/messageDebouncer.d.ts.map +1 -0
- package/dist/atp/messageDebouncer.js +60 -0
- package/dist/atp/messageDebouncer.js.map +1 -0
- package/dist/atp/messageQueue.d.ts +17 -0
- package/dist/atp/messageQueue.d.ts.map +1 -0
- package/dist/atp/messageQueue.js +69 -0
- package/dist/atp/messageQueue.js.map +1 -0
- package/dist/atp/modelConfig.d.ts +46 -0
- package/dist/atp/modelConfig.d.ts.map +1 -0
- package/dist/atp/modelConfig.js +232 -0
- package/dist/atp/modelConfig.js.map +1 -0
- package/dist/atp/models.d.ts +87 -0
- package/dist/atp/models.d.ts.map +1 -0
- package/dist/atp/models.js +45 -0
- package/dist/atp/models.js.map +1 -0
- package/dist/atp/postTaskHooks.d.ts +21 -0
- package/dist/atp/postTaskHooks.d.ts.map +1 -0
- package/dist/atp/postTaskHooks.js +89 -0
- package/dist/atp/postTaskHooks.js.map +1 -0
- package/dist/atp/tokenTracker.d.ts +46 -0
- package/dist/atp/tokenTracker.d.ts.map +1 -0
- package/dist/atp/tokenTracker.js +120 -0
- package/dist/atp/tokenTracker.js.map +1 -0
- package/dist/channels/activeChannel.d.ts +14 -0
- package/dist/channels/activeChannel.d.ts.map +1 -0
- package/dist/channels/activeChannel.js +18 -0
- package/dist/channels/activeChannel.js.map +1 -0
- package/dist/channels/channelConfig.d.ts +61 -0
- package/dist/channels/channelConfig.d.ts.map +1 -0
- package/dist/channels/channelConfig.js +130 -0
- package/dist/channels/channelConfig.js.map +1 -0
- package/dist/channels/channelManager.d.ts +22 -0
- package/dist/channels/channelManager.d.ts.map +1 -0
- package/dist/channels/channelManager.js +77 -0
- package/dist/channels/channelManager.js.map +1 -0
- package/dist/channels/discord.d.ts +24 -0
- package/dist/channels/discord.d.ts.map +1 -0
- package/dist/channels/discord.js +276 -0
- package/dist/channels/discord.js.map +1 -0
- package/dist/channels/slack.d.ts +25 -0
- package/dist/channels/slack.d.ts.map +1 -0
- package/dist/channels/slack.js +313 -0
- package/dist/channels/slack.js.map +1 -0
- package/dist/channels/telegram.d.ts +20 -0
- package/dist/channels/telegram.d.ts.map +1 -0
- package/dist/channels/telegram.js +273 -0
- package/dist/channels/telegram.js.map +1 -0
- package/dist/channels/types.d.ts +12 -0
- package/dist/channels/types.d.ts.map +1 -0
- package/dist/channels/types.js +5 -0
- package/dist/channels/types.js.map +1 -0
- package/dist/config.d.ts +82 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +144 -0
- package/dist/config.js.map +1 -0
- package/dist/dashboard/security.d.ts +68 -0
- package/dist/dashboard/security.d.ts.map +1 -0
- package/dist/dashboard/security.js +178 -0
- package/dist/dashboard/security.js.map +1 -0
- package/dist/dashboard/securityHelpers.d.ts +10 -0
- package/dist/dashboard/securityHelpers.d.ts.map +1 -0
- package/dist/dashboard/securityHelpers.js +22 -0
- package/dist/dashboard/securityHelpers.js.map +1 -0
- package/dist/dashboard/server.d.ts +18 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +3207 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/flows/codeScanFlow.d.ts +14 -0
- package/dist/flows/codeScanFlow.d.ts.map +1 -0
- package/dist/flows/codeScanFlow.js +204 -0
- package/dist/flows/codeScanFlow.js.map +1 -0
- package/dist/flows/gitleaksScanFlow.d.ts +12 -0
- package/dist/flows/gitleaksScanFlow.d.ts.map +1 -0
- package/dist/flows/gitleaksScanFlow.js +205 -0
- package/dist/flows/gitleaksScanFlow.js.map +1 -0
- package/dist/flows/index.d.ts +30 -0
- package/dist/flows/index.d.ts.map +1 -0
- package/dist/flows/index.js +43 -0
- package/dist/flows/index.js.map +1 -0
- package/dist/flows/semgrepScanFlow.d.ts +13 -0
- package/dist/flows/semgrepScanFlow.d.ts.map +1 -0
- package/dist/flows/semgrepScanFlow.js +211 -0
- package/dist/flows/semgrepScanFlow.js.map +1 -0
- package/dist/flows/trivyScanFlow.d.ts +13 -0
- package/dist/flows/trivyScanFlow.d.ts.map +1 -0
- package/dist/flows/trivyScanFlow.js +198 -0
- package/dist/flows/trivyScanFlow.js.map +1 -0
- package/dist/identity.d.ts +22 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +34 -0
- package/dist/identity.js.map +1 -0
- package/dist/init.d.ts +8 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +27 -0
- package/dist/init.js.map +1 -0
- package/dist/integrations/integrationConfig.d.ts +80 -0
- package/dist/integrations/integrationConfig.d.ts.map +1 -0
- package/dist/integrations/integrationConfig.js +146 -0
- package/dist/integrations/integrationConfig.js.map +1 -0
- package/dist/mcp/mcpBridge.d.ts +36 -0
- package/dist/mcp/mcpBridge.d.ts.map +1 -0
- package/dist/mcp/mcpBridge.js +157 -0
- package/dist/mcp/mcpBridge.js.map +1 -0
- package/dist/memory/agentMemory.d.ts +32 -0
- package/dist/memory/agentMemory.d.ts.map +1 -0
- package/dist/memory/agentMemory.js +116 -0
- package/dist/memory/agentMemory.js.map +1 -0
- package/dist/memory/autoCompaction.d.ts +46 -0
- package/dist/memory/autoCompaction.d.ts.map +1 -0
- package/dist/memory/autoCompaction.js +220 -0
- package/dist/memory/autoCompaction.js.map +1 -0
- package/dist/memory/compaction.d.ts +17 -0
- package/dist/memory/compaction.d.ts.map +1 -0
- package/dist/memory/compaction.js +27 -0
- package/dist/memory/compaction.js.map +1 -0
- package/dist/memory/messageHistory.d.ts +28 -0
- package/dist/memory/messageHistory.d.ts.map +1 -0
- package/dist/memory/messageHistory.js +60 -0
- package/dist/memory/messageHistory.js.map +1 -0
- package/dist/memory/sessionLifecycle.d.ts +30 -0
- package/dist/memory/sessionLifecycle.d.ts.map +1 -0
- package/dist/memory/sessionLifecycle.js +63 -0
- package/dist/memory/sessionLifecycle.js.map +1 -0
- package/dist/migrate.d.ts +8 -0
- package/dist/migrate.d.ts.map +1 -0
- package/dist/migrate.js +83 -0
- package/dist/migrate.js.map +1 -0
- package/dist/onboarding.d.ts +8 -0
- package/dist/onboarding.d.ts.map +1 -0
- package/dist/onboarding.js +188 -0
- package/dist/onboarding.js.map +1 -0
- package/dist/tools/domain/baFileTools.d.ts +7 -0
- package/dist/tools/domain/baFileTools.d.ts.map +1 -0
- package/dist/tools/domain/baFileTools.js +46 -0
- package/dist/tools/domain/baFileTools.js.map +1 -0
- package/dist/tools/domain/baTools.d.ts +6 -0
- package/dist/tools/domain/baTools.d.ts.map +1 -0
- package/dist/tools/domain/baTools.js +160 -0
- package/dist/tools/domain/baTools.js.map +1 -0
- package/dist/tools/domain/baseSpecialistTools.d.ts +22 -0
- package/dist/tools/domain/baseSpecialistTools.d.ts.map +1 -0
- package/dist/tools/domain/baseSpecialistTools.js +183 -0
- package/dist/tools/domain/baseSpecialistTools.js.map +1 -0
- package/dist/tools/domain/devTools.d.ts +6 -0
- package/dist/tools/domain/devTools.d.ts.map +1 -0
- package/dist/tools/domain/devTools.js +191 -0
- package/dist/tools/domain/devTools.js.map +1 -0
- package/dist/tools/domain/gitTools.d.ts +36 -0
- package/dist/tools/domain/gitTools.d.ts.map +1 -0
- package/dist/tools/domain/gitTools.js +279 -0
- package/dist/tools/domain/gitTools.js.map +1 -0
- package/dist/tools/domain/qaTools.d.ts +6 -0
- package/dist/tools/domain/qaTools.d.ts.map +1 -0
- package/dist/tools/domain/qaTools.js +275 -0
- package/dist/tools/domain/qaTools.js.map +1 -0
- package/dist/tools/domain/securityFlowTools.d.ts +6 -0
- package/dist/tools/domain/securityFlowTools.d.ts.map +1 -0
- package/dist/tools/domain/securityFlowTools.js +156 -0
- package/dist/tools/domain/securityFlowTools.js.map +1 -0
- package/dist/tools/pm/employeeTools.d.ts +15 -0
- package/dist/tools/pm/employeeTools.d.ts.map +1 -0
- package/dist/tools/pm/employeeTools.js +117 -0
- package/dist/tools/pm/employeeTools.js.map +1 -0
- package/dist/tools/pm/taskTools.d.ts +31 -0
- package/dist/tools/pm/taskTools.d.ts.map +1 -0
- package/dist/tools/pm/taskTools.js +534 -0
- package/dist/tools/pm/taskTools.js.map +1 -0
- package/dist/tools/shared/dateTools.d.ts +7 -0
- package/dist/tools/shared/dateTools.d.ts.map +1 -0
- package/dist/tools/shared/dateTools.js +35 -0
- package/dist/tools/shared/dateTools.js.map +1 -0
- package/dist/tools/shared/fileTools.d.ts +33 -0
- package/dist/tools/shared/fileTools.d.ts.map +1 -0
- package/dist/tools/shared/fileTools.js +312 -0
- package/dist/tools/shared/fileTools.js.map +1 -0
- package/dist/tools/shared/memoryTools.d.ts +18 -0
- package/dist/tools/shared/memoryTools.d.ts.map +1 -0
- package/dist/tools/shared/memoryTools.js +275 -0
- package/dist/tools/shared/memoryTools.js.map +1 -0
- package/dist/tools/shared/messagingTools.d.ts +14 -0
- package/dist/tools/shared/messagingTools.d.ts.map +1 -0
- package/dist/tools/shared/messagingTools.js +95 -0
- package/dist/tools/shared/messagingTools.js.map +1 -0
- package/dist/tools/shared/webTools.d.ts +12 -0
- package/dist/tools/shared/webTools.d.ts.map +1 -0
- package/dist/tools/shared/webTools.js +140 -0
- package/dist/tools/shared/webTools.js.map +1 -0
- package/dist/tower.d.ts +8 -0
- package/dist/tower.d.ts.map +1 -0
- package/dist/tower.js +774 -0
- package/dist/tower.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* First-run onboarding — creates ITS_ME.md if it doesn't exist.
|
|
3
|
+
* Prompts the user for their name, role, and optionally configures
|
|
4
|
+
* communication channels (Telegram, Slack, Discord).
|
|
5
|
+
* Also checks for Docker and offers to install it + pull scanner images.
|
|
6
|
+
*/
|
|
7
|
+
import { existsSync, writeFileSync } from "fs";
|
|
8
|
+
import { join } from "path";
|
|
9
|
+
import { execSync } from "child_process";
|
|
10
|
+
import { platform } from "os";
|
|
11
|
+
import readline from "readline";
|
|
12
|
+
import { USER_DATA_DIR } from "./config.js";
|
|
13
|
+
import { saveChannelCredentials, loadChannelConfig } from "./channels/channelConfig.js";
|
|
14
|
+
const ITS_ME_PATH = join(USER_DATA_DIR, "ITS_ME.md");
|
|
15
|
+
// ── Docker helpers ──────────────────────────────────────────────────────────
|
|
16
|
+
function isDockerInstalled() {
|
|
17
|
+
try {
|
|
18
|
+
execSync("docker --version", { stdio: "pipe", timeout: 5000 });
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function isDockerRunning() {
|
|
26
|
+
try {
|
|
27
|
+
execSync("docker info", { stdio: "pipe", timeout: 10000 });
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function getDockerInstallCmd() {
|
|
35
|
+
const os = platform();
|
|
36
|
+
if (os === "win32") {
|
|
37
|
+
return { cmd: "winget install -e --id Docker.DockerDesktop", label: "winget (Docker Desktop)" };
|
|
38
|
+
}
|
|
39
|
+
if (os === "darwin") {
|
|
40
|
+
return { cmd: "brew install --cask docker", label: "Homebrew (Docker Desktop)" };
|
|
41
|
+
}
|
|
42
|
+
if (os === "linux") {
|
|
43
|
+
return { cmd: "curl -fsSL https://get.docker.com | sh", label: "get.docker.com (Docker Engine)" };
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
async function checkAndInstallDocker(ask) {
|
|
48
|
+
console.log(" ── Dependencies: Docker ──\n");
|
|
49
|
+
if (isDockerInstalled()) {
|
|
50
|
+
console.log(" ✓ Docker is installed.");
|
|
51
|
+
if (isDockerRunning()) {
|
|
52
|
+
console.log(" ✓ Docker daemon is running.\n");
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
console.log(" ⚠ Docker daemon is NOT running.");
|
|
56
|
+
console.log(" Start Docker to use security scanners and integrations.\n");
|
|
57
|
+
}
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
console.log(" ✗ Docker not found on this system.\n");
|
|
61
|
+
console.log(" Docker is needed for security scanning integrations");
|
|
62
|
+
console.log(" (Gitleaks, Semgrep, Trivy, SonarQube).\n");
|
|
63
|
+
console.log(" You can enable/disable individual tools later from the Dashboard.\n");
|
|
64
|
+
const installInfo = getDockerInstallCmd();
|
|
65
|
+
if (installInfo) {
|
|
66
|
+
const doInstall = await ask(` Install Docker via ${installInfo.label}? (y/N): `);
|
|
67
|
+
if (doInstall.toLowerCase() === "y" || doInstall.toLowerCase() === "yes") {
|
|
68
|
+
console.log(`\n Running: ${installInfo.cmd}\n`);
|
|
69
|
+
try {
|
|
70
|
+
execSync(installInfo.cmd, { stdio: "inherit", timeout: 300000 });
|
|
71
|
+
console.log("\n ✓ Docker installed successfully!");
|
|
72
|
+
if (platform() !== "linux") {
|
|
73
|
+
console.log(" Note: Start Docker Desktop and restart your terminal before using scanners.\n");
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
console.log("");
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
console.log(`\n ✗ Installation failed. You may need admin/sudo privileges.`);
|
|
81
|
+
console.log(` Try running manually: ${installInfo.cmd}\n`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
console.log(" Skipped. Install Docker anytime — scanners are optional.\n");
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
console.log(" Install Docker manually: https://docs.docker.com/get-docker/\n");
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// ── Main onboarding ─────────────────────────────────────────────────────────
|
|
93
|
+
export async function runOnboardingIfNeeded() {
|
|
94
|
+
if (existsSync(ITS_ME_PATH))
|
|
95
|
+
return;
|
|
96
|
+
console.log("");
|
|
97
|
+
console.log(" ╔══════════════════════════════════════════════╗");
|
|
98
|
+
console.log(" ║ Welcome to OCTO VEC! ║");
|
|
99
|
+
console.log(" ║ Let's get you set up. ║");
|
|
100
|
+
console.log(" ╚══════════════════════════════════════════════╝");
|
|
101
|
+
console.log("");
|
|
102
|
+
console.log(` Your data will be stored at: ${USER_DATA_DIR}`);
|
|
103
|
+
console.log("");
|
|
104
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
105
|
+
const ask = (q) => new Promise((resolve) => rl.question(q, (ans) => resolve(ans.trim())));
|
|
106
|
+
// ── Pre-step: Docker check ─────────────────────────────────────────────
|
|
107
|
+
await checkAndInstallDocker(ask);
|
|
108
|
+
// ── Step 1: Profile ─────────────────────────────────────────────────────
|
|
109
|
+
console.log(" ── Step 1: Your Profile ──\n");
|
|
110
|
+
const name = (await ask(" Your name (press Enter for 'User'): ")) || "User";
|
|
111
|
+
const role = (await ask(" Your role (press Enter for 'Founder & CEO'): ")) || "Founder & CEO";
|
|
112
|
+
const content = `**Name:** ${name}\n**Role:** ${role}\n`;
|
|
113
|
+
writeFileSync(ITS_ME_PATH, content, "utf-8");
|
|
114
|
+
console.log(`\n Profile saved. Your agents will call you "${name}".\n`);
|
|
115
|
+
// ── Step 2: Integrations (optional) ─────────────────────────────────────
|
|
116
|
+
console.log(" ── Step 2: Communication Channels (optional) ──\n");
|
|
117
|
+
console.log(" OCTO VEC can connect to messaging platforms so you can");
|
|
118
|
+
console.log(" talk to your agents from Telegram, Slack, or Discord.\n");
|
|
119
|
+
console.log(" You can skip this now and configure later from the Dashboard.\n");
|
|
120
|
+
const setupChannels = await ask(" Configure channels now? (y/N): ");
|
|
121
|
+
if (setupChannels.toLowerCase() === "y" || setupChannels.toLowerCase() === "yes") {
|
|
122
|
+
// ── Telegram ──
|
|
123
|
+
console.log("\n ── Telegram ──");
|
|
124
|
+
console.log(" Needs: Bot Token (from @BotFather) + Chat ID\n");
|
|
125
|
+
const setupTg = await ask(" Set up Telegram? (y/N): ");
|
|
126
|
+
if (setupTg.toLowerCase() === "y" || setupTg.toLowerCase() === "yes") {
|
|
127
|
+
const tgToken = await ask(" Bot Token: ");
|
|
128
|
+
const tgChatId = await ask(" Chat ID: ");
|
|
129
|
+
if (tgToken && tgChatId) {
|
|
130
|
+
saveChannelCredentials("telegram", { botToken: tgToken, chatId: tgChatId });
|
|
131
|
+
console.log(" Telegram configured.\n");
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
console.log(" Skipped (missing values).\n");
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// ── Slack ──
|
|
138
|
+
console.log(" ── Slack ──");
|
|
139
|
+
console.log(" Needs: Bot Token (xoxb-...), App Token (xapp-...), Channel ID\n");
|
|
140
|
+
const setupSlack = await ask(" Set up Slack? (y/N): ");
|
|
141
|
+
if (setupSlack.toLowerCase() === "y" || setupSlack.toLowerCase() === "yes") {
|
|
142
|
+
const slackBot = await ask(" Bot Token (xoxb-...): ");
|
|
143
|
+
const slackApp = await ask(" App Token (xapp-...): ");
|
|
144
|
+
const slackCh = await ask(" Channel ID: ");
|
|
145
|
+
if (slackBot && slackApp && slackCh) {
|
|
146
|
+
saveChannelCredentials("slack", { botToken: slackBot, appToken: slackApp, channelId: slackCh });
|
|
147
|
+
console.log(" Slack configured.\n");
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
console.log(" Skipped (missing values).\n");
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// ── Discord ──
|
|
154
|
+
console.log(" ── Discord ──");
|
|
155
|
+
console.log(" Needs: Bot Token (from Developer Portal) + Channel ID\n");
|
|
156
|
+
const setupDiscord = await ask(" Set up Discord? (y/N): ");
|
|
157
|
+
if (setupDiscord.toLowerCase() === "y" || setupDiscord.toLowerCase() === "yes") {
|
|
158
|
+
const dcToken = await ask(" Bot Token: ");
|
|
159
|
+
const dcChannel = await ask(" Channel ID: ");
|
|
160
|
+
if (dcToken && dcChannel) {
|
|
161
|
+
saveChannelCredentials("discord", { botToken: dcToken, channelId: dcChannel });
|
|
162
|
+
console.log(" Discord configured.\n");
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
console.log(" Skipped (missing values).\n");
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
console.log(" Skipped. You can configure channels anytime from the Dashboard Settings.\n");
|
|
171
|
+
}
|
|
172
|
+
// ── Done ────────────────────────────────────────────────────────────────
|
|
173
|
+
const cfg = loadChannelConfig();
|
|
174
|
+
const activeChannels = [
|
|
175
|
+
cfg.telegram ? "Telegram" : null,
|
|
176
|
+
cfg.slack ? "Slack" : null,
|
|
177
|
+
cfg.discord ? "Discord" : null,
|
|
178
|
+
].filter(Boolean);
|
|
179
|
+
console.log(" ── Setup Complete ──\n");
|
|
180
|
+
console.log(` Profile : ${name} (${role})`);
|
|
181
|
+
console.log(` Data Dir : ${USER_DATA_DIR}`);
|
|
182
|
+
console.log(` Channels : ${activeChannels.length ? activeChannels.join(", ") : "None (CLI + Dashboard only)"}`);
|
|
183
|
+
console.log("");
|
|
184
|
+
console.log(" Tip: Open the Dashboard at http://localhost:3000 to manage everything visually.");
|
|
185
|
+
console.log("");
|
|
186
|
+
rl.close();
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=onboarding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../src/onboarding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BA file tools — read, write, edit restricted to .md and .mmd (documentation) files only.
|
|
3
|
+
* BA's role is writing documentation, not reading or modifying code files.
|
|
4
|
+
*/
|
|
5
|
+
import type { AgentTool } from "@mariozechner/pi-agent-core";
|
|
6
|
+
export declare function getBAFileTools(): AgentTool[];
|
|
7
|
+
//# sourceMappingURL=baFileTools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baFileTools.d.ts","sourceRoot":"","sources":["../../../src/tools/domain/baFileTools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAsC7D,wBAAgB,cAAc,IAAI,SAAS,EAAE,CAsB5C"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BA file tools — read, write, edit restricted to .md and .mmd (documentation) files only.
|
|
3
|
+
* BA's role is writing documentation, not reading or modifying code files.
|
|
4
|
+
*/
|
|
5
|
+
import { getCodingTools } from "../shared/fileTools.js";
|
|
6
|
+
const ALLOWED_EXTENSIONS = [".md", ".mmd"];
|
|
7
|
+
function isAllowed(filePath) {
|
|
8
|
+
const lower = (filePath ?? "").toLowerCase();
|
|
9
|
+
return ALLOWED_EXTENSIONS.some((ext) => lower.endsWith(ext));
|
|
10
|
+
}
|
|
11
|
+
function blocked(toolName, filePath) {
|
|
12
|
+
return {
|
|
13
|
+
content: [{
|
|
14
|
+
type: "text",
|
|
15
|
+
text: `BLOCKED: '${toolName}' is restricted to .md and .mmd files only.\n` +
|
|
16
|
+
`'${filePath}' is not a documentation file.\n` +
|
|
17
|
+
`BA role: write and edit documentation files (.md, .mmd). Reading or modifying code files is not your responsibility.\n` +
|
|
18
|
+
`Save deliverables as .md files in shared/ or agents/ba/.`,
|
|
19
|
+
}],
|
|
20
|
+
details: {},
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function wrap(tool, toolName, descriptionOverride) {
|
|
24
|
+
return {
|
|
25
|
+
...tool,
|
|
26
|
+
description: descriptionOverride,
|
|
27
|
+
execute: async (ctx, params) => {
|
|
28
|
+
const filePath = params?.path ?? params?.file_path ?? "";
|
|
29
|
+
if (filePath && !isAllowed(filePath)) {
|
|
30
|
+
return blocked(toolName, filePath);
|
|
31
|
+
}
|
|
32
|
+
return tool.execute(ctx, params);
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export function getBAFileTools() {
|
|
37
|
+
const base = getCodingTools();
|
|
38
|
+
const byName = new Map(base.map((t) => [t.name, t]));
|
|
39
|
+
return [
|
|
40
|
+
wrap(byName.get("read"), "read", "Read a .md or .mmd documentation file from disk. Only .md and .mmd files are permitted."),
|
|
41
|
+
wrap(byName.get("write"), "write", "Write a .md or .mmd documentation file. Only .md and .mmd extensions are allowed — BA writes documentation, not code."),
|
|
42
|
+
wrap(byName.get("edit"), "edit", "Make targeted edits to a .md or .mmd documentation file. Only .md and .mmd files are allowed."),
|
|
43
|
+
// bash intentionally excluded — BA does not run shell commands
|
|
44
|
+
];
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=baFileTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baFileTools.js","sourceRoot":"","sources":["../../../src/tools/domain/baFileTools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,kBAAkB,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAE3C,SAAS,SAAS,CAAC,QAAgB;IACjC,MAAM,KAAK,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7C,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,OAAO,CAAC,QAAgB,EAAE,QAAgB;IACjD,OAAO;QACL,OAAO,EAAE,CAAC;gBACR,IAAI,EAAE,MAAe;gBACrB,IAAI,EACF,aAAa,QAAQ,+CAA+C;oBACpE,IAAI,QAAQ,kCAAkC;oBAC9C,wHAAwH;oBACxH,0DAA0D;aAC7D,CAAC;QACF,OAAO,EAAE,EAAE;KACZ,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CAAC,IAAe,EAAE,QAAgB,EAAE,mBAA2B;IAC1E,OAAO;QACL,GAAG,IAAI;QACP,WAAW,EAAE,mBAAmB;QAChC,OAAO,EAAE,KAAK,EAAE,GAAQ,EAAE,MAAW,EAAE,EAAE;YACvC,MAAM,QAAQ,GAAW,MAAM,EAAE,IAAI,IAAI,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC;YACjE,IAAI,QAAQ,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACrC,OAAO,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACrC,CAAC;YACD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAErD,OAAO;QACL,IAAI,CACF,MAAM,CAAC,GAAG,CAAC,MAAM,CAAE,EACnB,MAAM,EACN,yFAAyF,CAC1F;QACD,IAAI,CACF,MAAM,CAAC,GAAG,CAAC,OAAO,CAAE,EACpB,OAAO,EACP,uHAAuH,CACxH;QACD,IAAI,CACF,MAAM,CAAC,GAAG,CAAC,MAAM,CAAE,EACnB,MAAM,EACN,+FAA+F,CAChG;QACD,+DAA+D;KAChE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baTools.d.ts","sourceRoot":"","sources":["../../../src/tools/domain/baTools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAQ7D,eAAO,MAAM,OAAO,EAAE,SAAS,EAwJ9B,CAAC"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Business Analyst domain tools — template scaffolds for the LLM to populate.
|
|
3
|
+
*/
|
|
4
|
+
import { Type } from "@mariozechner/pi-ai";
|
|
5
|
+
import { EventLog } from "../../atp/eventLog.js";
|
|
6
|
+
import { EventType } from "../../atp/models.js";
|
|
7
|
+
function ok(text) {
|
|
8
|
+
return { content: [{ type: "text", text }], details: {} };
|
|
9
|
+
}
|
|
10
|
+
export const baTools = [
|
|
11
|
+
{
|
|
12
|
+
name: "analyze_requirements",
|
|
13
|
+
label: "Analyze Requirements",
|
|
14
|
+
description: "Analyze business requirements and break them down into a structured format.",
|
|
15
|
+
parameters: Type.Object({
|
|
16
|
+
requirement_text: Type.String({ description: "The business requirement to analyze" }),
|
|
17
|
+
task_id: Type.Optional(Type.String({ description: "Optional ATP task ID for tracking" })),
|
|
18
|
+
}),
|
|
19
|
+
execute: async (_, params) => {
|
|
20
|
+
EventLog.log(EventType.AGENT_TOOL_CALL, "ba", params.task_id ?? "", "BA analyzing requirements");
|
|
21
|
+
return ok(`## REQUIREMENT ANALYSIS
|
|
22
|
+
|
|
23
|
+
**Original Requirement:** ${params.requirement_text}
|
|
24
|
+
|
|
25
|
+
### 1. OBJECTIVE
|
|
26
|
+
- **What**: [Core goal to be achieved]
|
|
27
|
+
- **Why**: [Business value/justification]
|
|
28
|
+
|
|
29
|
+
### 2. STAKEHOLDERS
|
|
30
|
+
- **Primary**: [Direct beneficiaries]
|
|
31
|
+
- **Secondary**: [Indirect stakeholders]
|
|
32
|
+
|
|
33
|
+
### 3. ACCEPTANCE CRITERIA
|
|
34
|
+
- Given [initial context/state]
|
|
35
|
+
- When [action/trigger]
|
|
36
|
+
- Then [expected outcome]
|
|
37
|
+
|
|
38
|
+
### 4. DEPENDENCIES
|
|
39
|
+
- Technical: [Systems/APIs/Infrastructure]
|
|
40
|
+
- Business: [Processes/Teams/Data]
|
|
41
|
+
|
|
42
|
+
### 5. RISKS & ASSUMPTIONS
|
|
43
|
+
- Risks: [Potential blockers]
|
|
44
|
+
- Assumptions: [What we're assuming is true]
|
|
45
|
+
|
|
46
|
+
### 6. SUCCESS METRICS
|
|
47
|
+
- KPIs: [How we'll measure success]`);
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: "create_user_story",
|
|
52
|
+
label: "Create User Story",
|
|
53
|
+
description: "Convert a feature description into proper user stories with acceptance criteria.",
|
|
54
|
+
parameters: Type.Object({
|
|
55
|
+
feature_description: Type.String({ description: "Description of the feature" }),
|
|
56
|
+
task_id: Type.Optional(Type.String({ description: "Optional ATP task ID for tracking" })),
|
|
57
|
+
}),
|
|
58
|
+
execute: async (_, params) => {
|
|
59
|
+
EventLog.log(EventType.AGENT_TOOL_CALL, "ba", params.task_id ?? "", "BA creating user story");
|
|
60
|
+
return ok(`## USER STORY
|
|
61
|
+
|
|
62
|
+
**Based on:** ${params.feature_description}
|
|
63
|
+
|
|
64
|
+
**As a** [user type],
|
|
65
|
+
**I want to** [action/feature],
|
|
66
|
+
**So that** [benefit/value].
|
|
67
|
+
|
|
68
|
+
### Acceptance Criteria:
|
|
69
|
+
|
|
70
|
+
**Scenario 1: Happy Path**
|
|
71
|
+
- Given [initial state]
|
|
72
|
+
- When [user action]
|
|
73
|
+
- Then [expected result]
|
|
74
|
+
|
|
75
|
+
**Scenario 2: Edge Case**
|
|
76
|
+
- Given [different state]
|
|
77
|
+
- When [user action]
|
|
78
|
+
- Then [expected handling]
|
|
79
|
+
|
|
80
|
+
### Definition of Done:
|
|
81
|
+
- [ ] Functionality implemented and tested
|
|
82
|
+
- [ ] Code reviewed and merged
|
|
83
|
+
- [ ] Documentation updated
|
|
84
|
+
- [ ] QA sign-off received
|
|
85
|
+
|
|
86
|
+
**Story Points:** [To be estimated]
|
|
87
|
+
**Priority:** [To be defined]`);
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
name: "perform_gap_analysis",
|
|
92
|
+
label: "Perform Gap Analysis",
|
|
93
|
+
description: "Identify gaps between current state and desired future state.",
|
|
94
|
+
parameters: Type.Object({
|
|
95
|
+
current_state: Type.String({ description: "Description of the current state/situation" }),
|
|
96
|
+
desired_state: Type.String({ description: "Description of the desired future state" }),
|
|
97
|
+
task_id: Type.Optional(Type.String({ description: "Optional ATP task ID for tracking" })),
|
|
98
|
+
}),
|
|
99
|
+
execute: async (_, params) => {
|
|
100
|
+
EventLog.log(EventType.AGENT_TOOL_CALL, "ba", params.task_id ?? "", "BA performing gap analysis");
|
|
101
|
+
return ok(`## GAP ANALYSIS
|
|
102
|
+
|
|
103
|
+
**Current State:** ${params.current_state}
|
|
104
|
+
**Desired State:** ${params.desired_state}
|
|
105
|
+
|
|
106
|
+
### GAPS IDENTIFIED
|
|
107
|
+
|
|
108
|
+
| Gap | Impact | Effort | Priority |
|
|
109
|
+
|-----|--------|--------|----------|
|
|
110
|
+
| [Gap 1] | High/Med/Low | High/Med/Low | P1/P2/P3 |
|
|
111
|
+
| [Gap 2] | High/Med/Low | High/Med/Low | P1/P2/P3 |
|
|
112
|
+
|
|
113
|
+
### RECOMMENDED ACTIONS
|
|
114
|
+
1. **[Action 1]** — Owner: [Team/Agent], Timeline: [Estimate]
|
|
115
|
+
2. **[Action 2]** — Owner: [Team/Agent], Timeline: [Estimate]
|
|
116
|
+
|
|
117
|
+
### RISKS OF NOT CLOSING GAPS
|
|
118
|
+
- [Risk if gap remains]
|
|
119
|
+
|
|
120
|
+
### SUCCESS METRICS
|
|
121
|
+
- [KPI 1]: [Target value]
|
|
122
|
+
- [KPI 2]: [Target value]`);
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
name: "define_kpis",
|
|
127
|
+
label: "Define KPIs",
|
|
128
|
+
description: "Define measurable KPIs and success metrics for a project or feature.",
|
|
129
|
+
parameters: Type.Object({
|
|
130
|
+
project_description: Type.String({ description: "Project or feature to define KPIs for" }),
|
|
131
|
+
task_id: Type.Optional(Type.String({ description: "Optional ATP task ID for tracking" })),
|
|
132
|
+
}),
|
|
133
|
+
execute: async (_, params) => {
|
|
134
|
+
EventLog.log(EventType.AGENT_TOOL_CALL, "ba", params.task_id ?? "", "BA defining KPIs");
|
|
135
|
+
return ok(`## KPI DEFINITION
|
|
136
|
+
|
|
137
|
+
**Project:** ${params.project_description}
|
|
138
|
+
|
|
139
|
+
### KEY PERFORMANCE INDICATORS
|
|
140
|
+
|
|
141
|
+
| KPI | Description | Measurement Method | Target | Baseline | Frequency |
|
|
142
|
+
|-----|-------------|-------------------|--------|----------|-----------|
|
|
143
|
+
| [KPI 1] | [What it measures] | [How measured] | [Target] | [Current] | [Daily/Weekly] |
|
|
144
|
+
| [KPI 2] | [What it measures] | [How measured] | [Target] | [Current] | [Daily/Weekly] |
|
|
145
|
+
|
|
146
|
+
### LEADING INDICATORS (Predictive)
|
|
147
|
+
- [Indicator 1]: Predicts [outcome]
|
|
148
|
+
- [Indicator 2]: Predicts [outcome]
|
|
149
|
+
|
|
150
|
+
### LAGGING INDICATORS (Outcome)
|
|
151
|
+
- [Indicator 1]: Measures [result]
|
|
152
|
+
|
|
153
|
+
### REPORTING DASHBOARD
|
|
154
|
+
- Tool: [Analytics platform]
|
|
155
|
+
- Refresh: [Frequency]
|
|
156
|
+
- Stakeholders: [Who receives reports]`);
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
];
|
|
160
|
+
//# sourceMappingURL=baTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baTools.js","sourceRoot":"","sources":["../../../src/tools/domain/baTools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Common task-management tools shared by all 8 specialist agents.
|
|
3
|
+
* Factory that injects the agent's ID and required dependencies.
|
|
4
|
+
*
|
|
5
|
+
* Tools:
|
|
6
|
+
* read_my_tasks, read_task_details, update_my_task, read_task_messages
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* import { getSpecialistTaskTools } from "./baseSpecialistTools.js";
|
|
10
|
+
* tools: [...getSpecialistTaskTools("ba", { db, pmQueue, agentQueue }), ...]
|
|
11
|
+
*/
|
|
12
|
+
import type { AgentTool } from "@mariozechner/pi-agent-core";
|
|
13
|
+
import { ATPDatabase } from "../../atp/database.js";
|
|
14
|
+
import { MessageQueue } from "../../atp/messageQueue.js";
|
|
15
|
+
import { AgentMessageQueue } from "../../atp/agentMessageQueue.js";
|
|
16
|
+
export interface SpecialistTaskDeps {
|
|
17
|
+
db: typeof ATPDatabase;
|
|
18
|
+
pmQueue: typeof MessageQueue;
|
|
19
|
+
agentQueue: typeof AgentMessageQueue;
|
|
20
|
+
}
|
|
21
|
+
export declare function getSpecialistTaskTools(agentId: string, deps: SpecialistTaskDeps): AgentTool[];
|
|
22
|
+
//# sourceMappingURL=baseSpecialistTools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseSpecialistTools.d.ts","sourceRoot":"","sources":["../../../src/tools/domain/baseSpecialistTools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAKnE,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,OAAO,WAAW,CAAC;IACvB,OAAO,EAAE,OAAO,YAAY,CAAC;IAC7B,UAAU,EAAE,OAAO,iBAAiB,CAAC;CACtC;AAgBD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,GAAG,SAAS,EAAE,CAuN7F"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Common task-management tools shared by all 8 specialist agents.
|
|
3
|
+
* Factory that injects the agent's ID and required dependencies.
|
|
4
|
+
*
|
|
5
|
+
* Tools:
|
|
6
|
+
* read_my_tasks, read_task_details, update_my_task, read_task_messages
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* import { getSpecialistTaskTools } from "./baseSpecialistTools.js";
|
|
10
|
+
* tools: [...getSpecialistTaskTools("ba", { db, pmQueue, agentQueue }), ...]
|
|
11
|
+
*/
|
|
12
|
+
import { Type } from "@mariozechner/pi-ai";
|
|
13
|
+
import { EventLog } from "../../atp/eventLog.js";
|
|
14
|
+
import { EventType } from "../../atp/models.js";
|
|
15
|
+
import { AgentInterrupt } from "../../atp/agentInterrupt.js";
|
|
16
|
+
const TASK_ID_RE = /^TASK-\d+$/;
|
|
17
|
+
function normalizeTaskId(taskId) {
|
|
18
|
+
return taskId.trim().toUpperCase();
|
|
19
|
+
}
|
|
20
|
+
function isValidTaskId(taskId) {
|
|
21
|
+
return TASK_ID_RE.test(taskId);
|
|
22
|
+
}
|
|
23
|
+
function ok(text) {
|
|
24
|
+
return { content: [{ type: "text", text }], details: {} };
|
|
25
|
+
}
|
|
26
|
+
export function getSpecialistTaskTools(agentId, deps) {
|
|
27
|
+
const read_my_tasks = {
|
|
28
|
+
name: "read_my_tasks",
|
|
29
|
+
label: "Read My Tasks",
|
|
30
|
+
description: "Read tasks assigned to you from ATP, optionally filtered by status. " +
|
|
31
|
+
"Use this to see what work you have pending or in progress.",
|
|
32
|
+
parameters: Type.Object({
|
|
33
|
+
status: Type.Optional(Type.String({
|
|
34
|
+
description: "Filter by status: 'pending', 'in_progress', 'completed', 'failed', or empty for all",
|
|
35
|
+
})),
|
|
36
|
+
}),
|
|
37
|
+
execute: async (_, params) => {
|
|
38
|
+
AgentInterrupt.check(agentId);
|
|
39
|
+
const statusFilter = (params.status ?? "").trim().toLowerCase();
|
|
40
|
+
const allowed = new Set(["", "pending", "in_progress", "completed", "failed"]);
|
|
41
|
+
if (!allowed.has(statusFilter)) {
|
|
42
|
+
return ok("ERROR: Invalid status. Use pending, in_progress, completed, failed, or empty.");
|
|
43
|
+
}
|
|
44
|
+
const tasks = deps.db.getTasksForAgent(agentId, statusFilter || undefined);
|
|
45
|
+
if (!tasks.length) {
|
|
46
|
+
return ok(`No tasks found for ${agentId}${statusFilter ? ` with status '${statusFilter}'` : ""}.`);
|
|
47
|
+
}
|
|
48
|
+
const priorityRank = { high: 0, medium: 1, low: 2 };
|
|
49
|
+
const statusRank = { in_progress: 0, pending: 1, failed: 2, completed: 3 };
|
|
50
|
+
const sorted = [...tasks].sort((a, b) => (statusRank[a.status] ?? 99) - (statusRank[b.status] ?? 99) ||
|
|
51
|
+
(priorityRank[a.priority] ?? 99) - (priorityRank[b.priority] ?? 99) ||
|
|
52
|
+
a.created_at.localeCompare(b.created_at));
|
|
53
|
+
EventLog.log(EventType.AGENT_TOOL_CALL, agentId, "", `${agentId.toUpperCase()} reading own task queue (filter=${statusFilter || "all"})`);
|
|
54
|
+
const lines = [`${agentId.toUpperCase()} task queue (${sorted.length} task(s)):`];
|
|
55
|
+
for (const t of sorted) {
|
|
56
|
+
lines.push(`- ${t.task_id} | ${t.priority.toUpperCase()} | ${t.status} | ${t.description}`);
|
|
57
|
+
}
|
|
58
|
+
return ok(lines.join("\n"));
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
const read_task_details = {
|
|
62
|
+
name: "read_task_details",
|
|
63
|
+
label: "Read Task Details",
|
|
64
|
+
description: "Read full details for a specific ATP task ID assigned to you.",
|
|
65
|
+
parameters: Type.Object({
|
|
66
|
+
task_id: Type.String({ description: "ATP task ID (e.g. 'TASK-001')" }),
|
|
67
|
+
}),
|
|
68
|
+
execute: async (_, params) => {
|
|
69
|
+
AgentInterrupt.check(agentId);
|
|
70
|
+
const normalizedId = normalizeTaskId(params.task_id);
|
|
71
|
+
if (!isValidTaskId(normalizedId)) {
|
|
72
|
+
return ok(`ERROR: Invalid task ID '${params.task_id}'. Expected format TASK-XXX.`);
|
|
73
|
+
}
|
|
74
|
+
const task = deps.db.getTask(normalizedId);
|
|
75
|
+
if (!task)
|
|
76
|
+
return ok(`ERROR: Task ${normalizedId} not found.`);
|
|
77
|
+
if (task.agent_id !== agentId) {
|
|
78
|
+
return ok(`ERROR: Task ${normalizedId} is assigned to '${task.agent_id}', not ${agentId}.`);
|
|
79
|
+
}
|
|
80
|
+
EventLog.log(EventType.AGENT_TOOL_CALL, agentId, normalizedId, `${agentId.toUpperCase()} reading details for ${normalizedId}`);
|
|
81
|
+
return ok(`Task: ${task.task_id}\n` +
|
|
82
|
+
` Description: ${task.description}\n` +
|
|
83
|
+
` Assigned to: ${task.agent_id}\n` +
|
|
84
|
+
` Priority: ${task.priority}\n` +
|
|
85
|
+
` Status: ${task.status}\n` +
|
|
86
|
+
` Folder Access: ${task.folder_access || "N/A"}\n` +
|
|
87
|
+
` Result: ${task.result || "N/A"}\n` +
|
|
88
|
+
` Created: ${task.created_at}\n` +
|
|
89
|
+
` Updated: ${task.updated_at}`);
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
const update_my_task = {
|
|
93
|
+
name: "update_my_task",
|
|
94
|
+
label: "Update My Task",
|
|
95
|
+
description: "Update a task's status in ATP and notify PM. " +
|
|
96
|
+
"Call this when you start, complete, or fail a task.",
|
|
97
|
+
parameters: Type.Object({
|
|
98
|
+
task_id: Type.String({ description: "ATP task ID (e.g. 'TASK-001')" }),
|
|
99
|
+
status: Type.Union([Type.Literal("in_progress"), Type.Literal("completed"), Type.Literal("failed")], { description: "'in_progress', 'completed', or 'failed'" }),
|
|
100
|
+
result: Type.Optional(Type.String({ description: "Deliverable summary or status message (max 4000 chars)" })),
|
|
101
|
+
}),
|
|
102
|
+
execute: async (_, params) => {
|
|
103
|
+
AgentInterrupt.check(agentId);
|
|
104
|
+
const normalizedId = normalizeTaskId(params.task_id);
|
|
105
|
+
if (!isValidTaskId(normalizedId)) {
|
|
106
|
+
return ok(`ERROR: Invalid task ID '${params.task_id}'.`);
|
|
107
|
+
}
|
|
108
|
+
const task = deps.db.getTask(normalizedId);
|
|
109
|
+
if (!task)
|
|
110
|
+
return ok(`ERROR: Task ${normalizedId} not found.`);
|
|
111
|
+
if (task.agent_id !== agentId) {
|
|
112
|
+
return ok(`ERROR: Task ${normalizedId} is not assigned to ${agentId}.`);
|
|
113
|
+
}
|
|
114
|
+
const result = (params.result ?? "").slice(0, 4000);
|
|
115
|
+
deps.db.updateTaskStatus(normalizedId, params.status, result);
|
|
116
|
+
deps.pmQueue.pushSimple(agentId, normalizedId, `Task ${normalizedId} status -> ${params.status}: ${result.slice(0, 200)}`, "status_update");
|
|
117
|
+
const eventType = params.status === "completed"
|
|
118
|
+
? EventType.TASK_COMPLETED
|
|
119
|
+
: params.status === "failed"
|
|
120
|
+
? EventType.TASK_FAILED
|
|
121
|
+
: EventType.TASK_IN_PROGRESS;
|
|
122
|
+
EventLog.log(eventType, agentId, normalizedId, `${agentId.toUpperCase()} updated ${normalizedId} -> ${params.status}`);
|
|
123
|
+
EventLog.log(EventType.MESSAGE_SENT, agentId, normalizedId, `${agentId.toUpperCase()} notified PM about ${normalizedId}`);
|
|
124
|
+
return ok(`Task ${normalizedId} updated to '${params.status}'. PM has been notified.`);
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
const read_task_messages = {
|
|
128
|
+
name: "read_task_messages",
|
|
129
|
+
label: "Read Task Messages",
|
|
130
|
+
description: "Read PM messages for a specific task. Use at checkpoints to check for priority instructions.",
|
|
131
|
+
parameters: Type.Object({
|
|
132
|
+
task_id: Type.String({ description: "ATP task ID (e.g. 'TASK-001')" }),
|
|
133
|
+
priority: Type.Optional(Type.Union([Type.Literal("normal"), Type.Literal("priority")], {
|
|
134
|
+
description: "'normal' or 'priority' (default: normal)",
|
|
135
|
+
})),
|
|
136
|
+
}),
|
|
137
|
+
execute: async (_, params) => {
|
|
138
|
+
AgentInterrupt.check(agentId);
|
|
139
|
+
const normalizedId = normalizeTaskId(params.task_id);
|
|
140
|
+
if (!isValidTaskId(normalizedId)) {
|
|
141
|
+
return ok(`ERROR: Invalid task ID '${params.task_id}'. Expected format TASK-XXX.`);
|
|
142
|
+
}
|
|
143
|
+
const priority = (params.priority ?? "normal");
|
|
144
|
+
const messages = deps.agentQueue.popForAgent(agentId, {
|
|
145
|
+
task_id: normalizedId,
|
|
146
|
+
priority,
|
|
147
|
+
});
|
|
148
|
+
if (!messages.length) {
|
|
149
|
+
return ok(`No ${priority} messages for ${normalizedId}.`);
|
|
150
|
+
}
|
|
151
|
+
EventLog.log(EventType.AGENT_TOOL_CALL, agentId, normalizedId, `${agentId.toUpperCase()} read ${messages.length} ${priority} message(s)`);
|
|
152
|
+
const lines = [`${messages.length} ${priority} message(s) for ${normalizedId}:`];
|
|
153
|
+
for (let i = 0; i < messages.length; i++) {
|
|
154
|
+
lines.push(`${i + 1}. [${messages[i].from_agent}] ${messages[i].message}`);
|
|
155
|
+
}
|
|
156
|
+
return ok(lines.join("\n"));
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
const self_assign_task = {
|
|
160
|
+
name: "self_assign_task",
|
|
161
|
+
label: "Self-Assign Task",
|
|
162
|
+
description: "Create a new task for yourself and mark it in_progress immediately. " +
|
|
163
|
+
"Use this when the founder gives you a direct work request and there is no existing task for it. " +
|
|
164
|
+
"After calling this, the system will automatically route you into full task execution mode.",
|
|
165
|
+
parameters: Type.Object({
|
|
166
|
+
description: Type.String({ description: "Clear description of what needs to be built or done" }),
|
|
167
|
+
priority: Type.Optional(Type.Union([Type.Literal("high"), Type.Literal("medium"), Type.Literal("low")], { description: "Task priority (default: high for direct founder requests)" })),
|
|
168
|
+
}),
|
|
169
|
+
execute: async (_, params) => {
|
|
170
|
+
AgentInterrupt.check(agentId);
|
|
171
|
+
const priority = (params.priority ?? "high");
|
|
172
|
+
const task = deps.db.createTask(params.description, agentId, priority);
|
|
173
|
+
deps.db.updateTaskStatus(task.task_id, "in_progress");
|
|
174
|
+
EventLog.log(EventType.TASK_IN_PROGRESS, agentId, task.task_id, `${agentId.toUpperCase()} self-assigned ${task.task_id}: ${params.description}`);
|
|
175
|
+
deps.pmQueue.pushSimple(agentId, task.task_id, `${agentId.toUpperCase()} self-assigned task ${task.task_id} from direct founder request: ${params.description}`, "info");
|
|
176
|
+
return ok(`Task ${task.task_id} created and marked in_progress.\n` +
|
|
177
|
+
`Description: ${params.description}\n` +
|
|
178
|
+
`The system will now route you into full task execution. Stand by.`);
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
return [read_my_tasks, read_task_details, update_my_task, read_task_messages, self_assign_task];
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=baseSpecialistTools.js.map
|