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,275 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QA Engineer 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
|
+
import { runFlow, FLOW_NAMES } from "../../flows/index.js";
|
|
8
|
+
function ok(text) {
|
|
9
|
+
return { content: [{ type: "text", text }], details: {} };
|
|
10
|
+
}
|
|
11
|
+
export const qaTools = [
|
|
12
|
+
{
|
|
13
|
+
name: "create_test_plan",
|
|
14
|
+
label: "Create Test Plan",
|
|
15
|
+
description: "Create a comprehensive test plan for a feature or system.",
|
|
16
|
+
parameters: Type.Object({
|
|
17
|
+
feature_description: Type.String({ description: "Feature or system to test" }),
|
|
18
|
+
task_id: Type.Optional(Type.String({ description: "Optional ATP task ID for tracking" })),
|
|
19
|
+
}),
|
|
20
|
+
execute: async (_, params) => {
|
|
21
|
+
EventLog.log(EventType.AGENT_TOOL_CALL, "qa", params.task_id ?? "", "QA creating test plan");
|
|
22
|
+
return ok(`## TEST PLAN
|
|
23
|
+
|
|
24
|
+
**Feature:** ${params.feature_description}
|
|
25
|
+
|
|
26
|
+
### 1. SCOPE
|
|
27
|
+
- **In Scope:** [Features/modules to be tested]
|
|
28
|
+
- **Out of Scope:** [Explicitly excluded areas]
|
|
29
|
+
|
|
30
|
+
### 2. TEST STRATEGY
|
|
31
|
+
- **Unit Tests:** Individual component testing
|
|
32
|
+
- **Integration Tests:** Component interaction testing
|
|
33
|
+
- **E2E Tests:** Full user flow testing
|
|
34
|
+
- **Regression Tests:** Prevent existing functionality breakage
|
|
35
|
+
|
|
36
|
+
### 3. TEST ENVIRONMENTS
|
|
37
|
+
- Development (dev)
|
|
38
|
+
- Staging (pre-prod)
|
|
39
|
+
- Production (smoke only)
|
|
40
|
+
|
|
41
|
+
### 4. TEST TYPES
|
|
42
|
+
| Type | Coverage Goal | Priority |
|
|
43
|
+
|------|--------------|----------|
|
|
44
|
+
| Functional | 90%+ | High |
|
|
45
|
+
| Boundary | Key inputs | High |
|
|
46
|
+
| Negative | Invalid inputs | Medium |
|
|
47
|
+
| Performance | Load scenarios | Medium |
|
|
48
|
+
| Security | Auth/OWASP | High |
|
|
49
|
+
|
|
50
|
+
### 5. ENTRY/EXIT CRITERIA
|
|
51
|
+
- **Entry:** Feature code complete, dev unit tests passing
|
|
52
|
+
- **Exit:** All critical/high test cases pass, no P1/P2 open bugs
|
|
53
|
+
|
|
54
|
+
### 6. RISKS
|
|
55
|
+
- [Risk 1 and mitigation]
|
|
56
|
+
- [Risk 2 and mitigation]
|
|
57
|
+
|
|
58
|
+
### 7. TIMELINE
|
|
59
|
+
- Test case creation: [estimate]
|
|
60
|
+
- Test execution: [estimate]
|
|
61
|
+
- Bug fix cycle: [estimate]`);
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
name: "write_test_cases",
|
|
66
|
+
label: "Write Test Cases",
|
|
67
|
+
description: "Write detailed test cases for a feature.",
|
|
68
|
+
parameters: Type.Object({
|
|
69
|
+
feature_description: Type.String({ description: "Feature to write test cases for" }),
|
|
70
|
+
test_type: Type.Optional(Type.String({ description: "Type: functional, boundary, negative, performance (default: functional)" })),
|
|
71
|
+
task_id: Type.Optional(Type.String({ description: "Optional ATP task ID for tracking" })),
|
|
72
|
+
}),
|
|
73
|
+
execute: async (_, params) => {
|
|
74
|
+
const testType = params.test_type ?? "functional";
|
|
75
|
+
EventLog.log(EventType.AGENT_TOOL_CALL, "qa", params.task_id ?? "", `QA writing ${testType} test cases`);
|
|
76
|
+
return ok(`## TEST CASES — ${testType.toUpperCase()}
|
|
77
|
+
|
|
78
|
+
**Feature:** ${params.feature_description}
|
|
79
|
+
|
|
80
|
+
### TC-001: Happy Path
|
|
81
|
+
- **Preconditions:** System in valid state, user authenticated
|
|
82
|
+
- **Steps:**
|
|
83
|
+
1. [Step 1]
|
|
84
|
+
2. [Step 2]
|
|
85
|
+
3. [Step 3]
|
|
86
|
+
- **Expected Result:** [Expected outcome]
|
|
87
|
+
- **Priority:** High
|
|
88
|
+
|
|
89
|
+
### TC-002: Boundary Values
|
|
90
|
+
- **Preconditions:** [Setup]
|
|
91
|
+
- **Steps:**
|
|
92
|
+
1. Test minimum valid input
|
|
93
|
+
2. Test maximum valid input
|
|
94
|
+
3. Test just beyond boundaries
|
|
95
|
+
- **Expected Result:** [Correct handling at boundaries]
|
|
96
|
+
- **Priority:** High
|
|
97
|
+
|
|
98
|
+
### TC-003: Negative — Invalid Input
|
|
99
|
+
- **Preconditions:** [Setup]
|
|
100
|
+
- **Steps:**
|
|
101
|
+
1. Provide empty/null input
|
|
102
|
+
2. Provide wrong data type
|
|
103
|
+
3. Provide malformed data
|
|
104
|
+
- **Expected Result:** [Graceful error handling, no crash]
|
|
105
|
+
- **Priority:** Medium
|
|
106
|
+
|
|
107
|
+
### TC-004: Error Recovery
|
|
108
|
+
- **Preconditions:** System in error state
|
|
109
|
+
- **Steps:**
|
|
110
|
+
1. Trigger error condition
|
|
111
|
+
2. Verify error message shown
|
|
112
|
+
3. Verify system recovers/retries correctly
|
|
113
|
+
- **Expected Result:** [Graceful recovery]
|
|
114
|
+
- **Priority:** High
|
|
115
|
+
|
|
116
|
+
### AUTOMATION NOTES
|
|
117
|
+
- Automatable: [Yes/No]
|
|
118
|
+
- Framework: [pytest / Jest / Playwright]
|
|
119
|
+
- Priority for automation: [High/Medium/Low]`);
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
name: "report_bug",
|
|
124
|
+
label: "Report Bug",
|
|
125
|
+
description: "Create a structured bug report for a discovered defect.",
|
|
126
|
+
parameters: Type.Object({
|
|
127
|
+
bug_description: Type.String({ description: "Description of the bug found" }),
|
|
128
|
+
severity: Type.Optional(Type.Union([Type.Literal("critical"), Type.Literal("high"), Type.Literal("medium"), Type.Literal("low")], {
|
|
129
|
+
description: "Bug severity (default: medium)",
|
|
130
|
+
})),
|
|
131
|
+
task_id: Type.Optional(Type.String({ description: "Optional ATP task ID for tracking" })),
|
|
132
|
+
}),
|
|
133
|
+
execute: async (_, params) => {
|
|
134
|
+
const severity = params.severity ?? "medium";
|
|
135
|
+
EventLog.log(EventType.AGENT_TOOL_CALL, "qa", params.task_id ?? "", `QA reporting ${severity} bug`);
|
|
136
|
+
return ok(`## BUG REPORT
|
|
137
|
+
|
|
138
|
+
**Summary:** ${params.bug_description}
|
|
139
|
+
**Severity:** ${severity.toUpperCase()}
|
|
140
|
+
**Priority:** [P1/P2/P3/P4]
|
|
141
|
+
**Status:** Open
|
|
142
|
+
|
|
143
|
+
### ENVIRONMENT
|
|
144
|
+
- OS: [Operating system]
|
|
145
|
+
- Browser/Runtime: [Version]
|
|
146
|
+
- Build/Version: [App version]
|
|
147
|
+
|
|
148
|
+
### REPRODUCTION STEPS
|
|
149
|
+
1. [Precondition: initial state]
|
|
150
|
+
2. [Action taken]
|
|
151
|
+
3. [Observed result]
|
|
152
|
+
|
|
153
|
+
### EXPECTED vs ACTUAL
|
|
154
|
+
- **Expected:** [What should happen]
|
|
155
|
+
- **Actual:** [What actually happens]
|
|
156
|
+
|
|
157
|
+
### EVIDENCE
|
|
158
|
+
- Screenshot/Log: [Attach or describe]
|
|
159
|
+
- Error message: [Exact error text]
|
|
160
|
+
|
|
161
|
+
### IMPACT
|
|
162
|
+
- **Users affected:** [All / Subset / Edge case]
|
|
163
|
+
- **Workaround:** [Yes: describe / No]
|
|
164
|
+
- **Blocker:** [Yes / No]
|
|
165
|
+
|
|
166
|
+
### SUGGESTED FIX
|
|
167
|
+
[If known, describe the likely cause and fix approach]`);
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
name: "analyze_test_coverage",
|
|
172
|
+
label: "Analyze Test Coverage",
|
|
173
|
+
description: "Analyze and report on test coverage for a codebase or feature.",
|
|
174
|
+
parameters: Type.Object({
|
|
175
|
+
codebase_description: Type.String({ description: "Description of the codebase or feature to analyze coverage for" }),
|
|
176
|
+
task_id: Type.Optional(Type.String({ description: "Optional ATP task ID for tracking" })),
|
|
177
|
+
}),
|
|
178
|
+
execute: async (_, params) => {
|
|
179
|
+
EventLog.log(EventType.AGENT_TOOL_CALL, "qa", params.task_id ?? "", "QA analyzing test coverage");
|
|
180
|
+
return ok(`## TEST COVERAGE ANALYSIS
|
|
181
|
+
|
|
182
|
+
**Scope:** ${params.codebase_description}
|
|
183
|
+
|
|
184
|
+
### COVERAGE SUMMARY
|
|
185
|
+
| Area | Line Coverage | Branch Coverage | Status |
|
|
186
|
+
|------|--------------|-----------------|--------|
|
|
187
|
+
| [Module 1] | [%] | [%] | ✅/⚠️/❌ |
|
|
188
|
+
| [Module 2] | [%] | [%] | ✅/⚠️/❌ |
|
|
189
|
+
|
|
190
|
+
### CRITICAL GAPS (Untested paths)
|
|
191
|
+
1. **[Gap 1]** — Risk: High — Recommended test: [TC description]
|
|
192
|
+
2. **[Gap 2]** — Risk: Medium — Recommended test: [TC description]
|
|
193
|
+
|
|
194
|
+
### COVERAGE TARGETS
|
|
195
|
+
- Current: [X%] line, [Y%] branch
|
|
196
|
+
- Target: 80% line, 70% branch
|
|
197
|
+
- Gap to close: [Delta]
|
|
198
|
+
|
|
199
|
+
### RECOMMENDATIONS
|
|
200
|
+
1. [Priority 1 action to improve coverage]
|
|
201
|
+
2. [Priority 2 action]
|
|
202
|
+
|
|
203
|
+
### TOOLS RECOMMENDED
|
|
204
|
+
- Coverage: [pytest-cov / nyc / Istanbul]
|
|
205
|
+
- Reporting: [Codecov / Coveralls]`);
|
|
206
|
+
},
|
|
207
|
+
},
|
|
208
|
+
// ── OCTO-FLOWS tools ─────────────────────────────────────────────────────
|
|
209
|
+
{
|
|
210
|
+
name: "run_code_scan",
|
|
211
|
+
label: "Run Code Scan",
|
|
212
|
+
description: "Run a SonarQube code scan against a workspace project directory. " +
|
|
213
|
+
"Generates a markdown report in shared/reports/ with bugs, vulnerabilities, code smells, and metrics. " +
|
|
214
|
+
"Requires SonarQube server to be running (docker compose up -d).",
|
|
215
|
+
parameters: Type.Object({
|
|
216
|
+
target_path: Type.String({
|
|
217
|
+
description: "Path to the project to scan, relative to the workspace root. " +
|
|
218
|
+
"Examples: 'projects/my-app', 'shared/my-module'. " +
|
|
219
|
+
"Use ls or find to confirm the path before calling this tool.",
|
|
220
|
+
}),
|
|
221
|
+
task_id: Type.Optional(Type.String({ description: "ATP task ID for tracking (e.g. TASK-042)" })),
|
|
222
|
+
}),
|
|
223
|
+
execute: async (_, params) => {
|
|
224
|
+
const taskId = params.task_id ?? "TASK-UNKNOWN";
|
|
225
|
+
EventLog.log(EventType.AGENT_TOOL_CALL, "qa", taskId, `QA triggering Code Scan on ${params.target_path}`);
|
|
226
|
+
const result = await runFlow("code-scan", {
|
|
227
|
+
taskId,
|
|
228
|
+
agentId: "qa",
|
|
229
|
+
targetPath: params.target_path,
|
|
230
|
+
});
|
|
231
|
+
const statusLine = result.success
|
|
232
|
+
? "Code scan completed successfully."
|
|
233
|
+
: "Code scan encountered errors (partial results may be available).";
|
|
234
|
+
return ok(`${statusLine}\n\n` +
|
|
235
|
+
`Summary: ${result.summary}\n` +
|
|
236
|
+
(result.reportPath ? `Report: ${result.reportPath}\n` : "") +
|
|
237
|
+
(result.details ? `\nDetails:\n${result.details}` : "") +
|
|
238
|
+
`\n\nNext step: read the report with the read tool, then message Rohan (dev) about any bugs or vulnerabilities found.`);
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
name: "run_flow",
|
|
243
|
+
label: "Run OCTO-Flow",
|
|
244
|
+
description: `Trigger any named OCTO-FLOW pipeline. Available flows: ${FLOW_NAMES.join(", ")}. ` +
|
|
245
|
+
"Use run_code_scan for the SonarQube flow (it has better defaults). " +
|
|
246
|
+
"Use run_flow for future flows or custom options.",
|
|
247
|
+
parameters: Type.Object({
|
|
248
|
+
flow_name: Type.String({
|
|
249
|
+
description: `Flow to run. One of: ${FLOW_NAMES.join(", ")}`,
|
|
250
|
+
}),
|
|
251
|
+
target_path: Type.String({
|
|
252
|
+
description: "Workspace-relative path to operate on",
|
|
253
|
+
}),
|
|
254
|
+
task_id: Type.Optional(Type.String({ description: "ATP task ID for tracking" })),
|
|
255
|
+
options: Type.Optional(Type.Record(Type.String(), Type.String(), {
|
|
256
|
+
description: "Flow-specific key/value options",
|
|
257
|
+
})),
|
|
258
|
+
}),
|
|
259
|
+
execute: async (_, params) => {
|
|
260
|
+
const taskId = params.task_id ?? "TASK-UNKNOWN";
|
|
261
|
+
EventLog.log(EventType.AGENT_TOOL_CALL, "qa", taskId, `QA triggering flow '${params.flow_name}' on ${params.target_path}`);
|
|
262
|
+
const result = await runFlow(params.flow_name, {
|
|
263
|
+
taskId,
|
|
264
|
+
agentId: "qa",
|
|
265
|
+
targetPath: params.target_path,
|
|
266
|
+
options: params.options,
|
|
267
|
+
});
|
|
268
|
+
return ok(`Flow '${params.flow_name}': ${result.success ? "SUCCESS" : "FAILED"}\n\n` +
|
|
269
|
+
`${result.summary}\n` +
|
|
270
|
+
(result.reportPath ? `Report: ${result.reportPath}\n` : "") +
|
|
271
|
+
(result.details ? `\nDetails:\n${result.details}` : ""));
|
|
272
|
+
},
|
|
273
|
+
},
|
|
274
|
+
];
|
|
275
|
+
//# sourceMappingURL=qaTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qaTools.js","sourceRoot":"","sources":["../../../src/tools/domain/qaTools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"securityFlowTools.d.ts","sourceRoot":"","sources":["../../../src/tools/domain/securityFlowTools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAS7D,eAAO,MAAM,iBAAiB,EAAE,SAAS,EAyMxC,CAAC"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Engineer OCTO-FLOW tools — triggers security scanning pipelines.
|
|
3
|
+
*/
|
|
4
|
+
import { Type } from "@mariozechner/pi-ai";
|
|
5
|
+
import { EventLog } from "../../atp/eventLog.js";
|
|
6
|
+
import { EventType } from "../../atp/models.js";
|
|
7
|
+
import { runFlow, FLOW_NAMES } from "../../flows/index.js";
|
|
8
|
+
function ok(text) {
|
|
9
|
+
return { content: [{ type: "text", text }], details: {} };
|
|
10
|
+
}
|
|
11
|
+
export const securityFlowTools = [
|
|
12
|
+
{
|
|
13
|
+
name: "run_sast_scan",
|
|
14
|
+
label: "Run SAST Scan",
|
|
15
|
+
description: "Run a Semgrep SAST (Static Application Security Testing) scan against a workspace project directory. " +
|
|
16
|
+
"Detects OWASP Top 10 vulnerabilities, injection flaws, insecure crypto, hardcoded secrets, and more. " +
|
|
17
|
+
"Generates a markdown report in shared/reports/ with findings grouped by severity. " +
|
|
18
|
+
"Requires Docker to be running.",
|
|
19
|
+
parameters: Type.Object({
|
|
20
|
+
target_path: Type.String({
|
|
21
|
+
description: "Path to the project to scan, relative to the workspace root. " +
|
|
22
|
+
"Examples: 'projects/my-app', 'shared/my-module'. " +
|
|
23
|
+
"Use ls or find to confirm the path before calling this tool.",
|
|
24
|
+
}),
|
|
25
|
+
task_id: Type.Optional(Type.String({ description: "ATP task ID for tracking (e.g. TASK-042)" })),
|
|
26
|
+
fail_severity: Type.Optional(Type.String({
|
|
27
|
+
description: "Minimum severity to trigger a FAIL verdict. " +
|
|
28
|
+
"One of: ERROR (critical/high), WARNING (medium), INFO (low). Default: ERROR.",
|
|
29
|
+
})),
|
|
30
|
+
}),
|
|
31
|
+
execute: async (_, params) => {
|
|
32
|
+
const taskId = params.task_id ?? "TASK-UNKNOWN";
|
|
33
|
+
EventLog.log(EventType.AGENT_TOOL_CALL, "security", taskId, `Security triggering SAST Scan on ${params.target_path}`);
|
|
34
|
+
const result = await runFlow("sast-scan", {
|
|
35
|
+
taskId,
|
|
36
|
+
agentId: "security",
|
|
37
|
+
targetPath: params.target_path,
|
|
38
|
+
options: params.fail_severity ? { fail_severity: params.fail_severity } : undefined,
|
|
39
|
+
});
|
|
40
|
+
const statusLine = result.success
|
|
41
|
+
? "SAST scan PASSED — no critical/high findings."
|
|
42
|
+
: "SAST scan FAILED — critical/high findings detected.";
|
|
43
|
+
return ok(`${statusLine}\n\n` +
|
|
44
|
+
`Summary: ${result.summary}\n` +
|
|
45
|
+
(result.reportPath ? `Report: ${result.reportPath}\n` : "") +
|
|
46
|
+
(result.details ? `\nDetails:\n${result.details}` : "") +
|
|
47
|
+
`\n\nNext step: read the report with the read tool. Review each finding. ` +
|
|
48
|
+
`Message Rohan (dev) about critical vulnerabilities that need immediate fixes.`);
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
name: "run_secret_scan",
|
|
53
|
+
label: "Run Secret Scan",
|
|
54
|
+
description: "Run a Gitleaks secret scan against a workspace project directory. " +
|
|
55
|
+
"Detects leaked API keys, tokens, passwords, private keys, and other credentials. " +
|
|
56
|
+
"Generates a markdown report in shared/reports/ with all findings (redacted). " +
|
|
57
|
+
"Any leaked secret = automatic FAIL. Requires Docker to be running.",
|
|
58
|
+
parameters: Type.Object({
|
|
59
|
+
target_path: Type.String({
|
|
60
|
+
description: "Path to the project to scan, relative to the workspace root. " +
|
|
61
|
+
"Examples: 'projects/my-app', 'shared/my-module'.",
|
|
62
|
+
}),
|
|
63
|
+
task_id: Type.Optional(Type.String({ description: "ATP task ID for tracking (e.g. TASK-042)" })),
|
|
64
|
+
}),
|
|
65
|
+
execute: async (_, params) => {
|
|
66
|
+
const taskId = params.task_id ?? "TASK-UNKNOWN";
|
|
67
|
+
EventLog.log(EventType.AGENT_TOOL_CALL, "security", taskId, `Security triggering Secret Scan on ${params.target_path}`);
|
|
68
|
+
const result = await runFlow("secret-scan", {
|
|
69
|
+
taskId,
|
|
70
|
+
agentId: "security",
|
|
71
|
+
targetPath: params.target_path,
|
|
72
|
+
});
|
|
73
|
+
const statusLine = result.success
|
|
74
|
+
? "Secret scan PASSED — no leaked secrets found."
|
|
75
|
+
: "Secret scan FAILED — leaked secrets detected!";
|
|
76
|
+
return ok(`${statusLine}\n\n` +
|
|
77
|
+
`Summary: ${result.summary}\n` +
|
|
78
|
+
(result.reportPath ? `Report: ${result.reportPath}\n` : "") +
|
|
79
|
+
(result.details ? `\nDetails:\n${result.details}` : "") +
|
|
80
|
+
`\n\nNext step: read the report with the read tool. ` +
|
|
81
|
+
`If secrets are found: message Rohan (dev) to rotate credentials immediately and remove from source code.`);
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
name: "run_sca_scan",
|
|
86
|
+
label: "Run SCA Scan",
|
|
87
|
+
description: "Run a Trivy SCA (Software Composition Analysis) scan against a workspace project directory. " +
|
|
88
|
+
"Detects known CVEs in dependencies by scanning lockfiles (package-lock.json, yarn.lock, etc.). " +
|
|
89
|
+
"Generates a markdown report in shared/reports/ with vulnerable packages, versions, and fixes. " +
|
|
90
|
+
"Requires Docker to be running.",
|
|
91
|
+
parameters: Type.Object({
|
|
92
|
+
target_path: Type.String({
|
|
93
|
+
description: "Path to the project to scan, relative to the workspace root. " +
|
|
94
|
+
"Examples: 'projects/my-app', 'shared/my-module'.",
|
|
95
|
+
}),
|
|
96
|
+
task_id: Type.Optional(Type.String({ description: "ATP task ID for tracking (e.g. TASK-042)" })),
|
|
97
|
+
fail_severity: Type.Optional(Type.String({
|
|
98
|
+
description: "Minimum severity to trigger a FAIL verdict. " +
|
|
99
|
+
"One of: CRITICAL, HIGH, MEDIUM, LOW. Default: HIGH.",
|
|
100
|
+
})),
|
|
101
|
+
}),
|
|
102
|
+
execute: async (_, params) => {
|
|
103
|
+
const taskId = params.task_id ?? "TASK-UNKNOWN";
|
|
104
|
+
EventLog.log(EventType.AGENT_TOOL_CALL, "security", taskId, `Security triggering SCA Scan on ${params.target_path}`);
|
|
105
|
+
const result = await runFlow("sca-scan", {
|
|
106
|
+
taskId,
|
|
107
|
+
agentId: "security",
|
|
108
|
+
targetPath: params.target_path,
|
|
109
|
+
options: params.fail_severity ? { fail_severity: params.fail_severity } : undefined,
|
|
110
|
+
});
|
|
111
|
+
const statusLine = result.success
|
|
112
|
+
? "SCA scan PASSED — no critical/high dependency vulnerabilities."
|
|
113
|
+
: "SCA scan FAILED — vulnerable dependencies found!";
|
|
114
|
+
return ok(`${statusLine}\n\n` +
|
|
115
|
+
`Summary: ${result.summary}\n` +
|
|
116
|
+
(result.reportPath ? `Report: ${result.reportPath}\n` : "") +
|
|
117
|
+
(result.details ? `\nDetails:\n${result.details}` : "") +
|
|
118
|
+
`\n\nNext step: read the report with the read tool. ` +
|
|
119
|
+
`For fixable vulnerabilities, message Rohan (dev) to update the affected packages.`);
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
name: "run_flow",
|
|
124
|
+
label: "Run OCTO-Flow",
|
|
125
|
+
description: `Trigger any named OCTO-FLOW pipeline. Available flows: ${FLOW_NAMES.join(", ")}. ` +
|
|
126
|
+
"Use run_sast_scan for Semgrep SAST (it has better defaults). " +
|
|
127
|
+
"Use run_flow for other flows or custom options.",
|
|
128
|
+
parameters: Type.Object({
|
|
129
|
+
flow_name: Type.String({
|
|
130
|
+
description: `Flow to run. One of: ${FLOW_NAMES.join(", ")}`,
|
|
131
|
+
}),
|
|
132
|
+
target_path: Type.String({
|
|
133
|
+
description: "Workspace-relative path to operate on",
|
|
134
|
+
}),
|
|
135
|
+
task_id: Type.Optional(Type.String({ description: "ATP task ID for tracking" })),
|
|
136
|
+
options: Type.Optional(Type.Record(Type.String(), Type.String(), {
|
|
137
|
+
description: "Flow-specific key/value options",
|
|
138
|
+
})),
|
|
139
|
+
}),
|
|
140
|
+
execute: async (_, params) => {
|
|
141
|
+
const taskId = params.task_id ?? "TASK-UNKNOWN";
|
|
142
|
+
EventLog.log(EventType.AGENT_TOOL_CALL, "security", taskId, `Security triggering flow '${params.flow_name}' on ${params.target_path}`);
|
|
143
|
+
const result = await runFlow(params.flow_name, {
|
|
144
|
+
taskId,
|
|
145
|
+
agentId: "security",
|
|
146
|
+
targetPath: params.target_path,
|
|
147
|
+
options: params.options,
|
|
148
|
+
});
|
|
149
|
+
return ok(`Flow '${params.flow_name}': ${result.success ? "SUCCESS" : "FAILED"}\n\n` +
|
|
150
|
+
`${result.summary}\n` +
|
|
151
|
+
(result.reportPath ? `Report: ${result.reportPath}\n` : "") +
|
|
152
|
+
(result.details ? `\nDetails:\n${result.details}` : ""));
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
];
|
|
156
|
+
//# sourceMappingURL=securityFlowTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"securityFlowTools.js","sourceRoot":"","sources":["../../../src/tools/domain/securityFlowTools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PM employee registry tools for VEC-ATP.
|
|
3
|
+
*
|
|
4
|
+
* Tools:
|
|
5
|
+
* view_employee_directory, view_org_chart,
|
|
6
|
+
* lookup_employee, set_employee_status
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* import { getPMEmployeeTools } from "./employeeTools.js";
|
|
10
|
+
* tools: [...getPMEmployeeTools(db), ...]
|
|
11
|
+
*/
|
|
12
|
+
import type { AgentTool } from "@mariozechner/pi-agent-core";
|
|
13
|
+
import { ATPDatabase } from "../../atp/database.js";
|
|
14
|
+
export declare function getPMEmployeeTools(db: typeof ATPDatabase): AgentTool[];
|
|
15
|
+
//# sourceMappingURL=employeeTools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"employeeTools.d.ts","sourceRoot":"","sources":["../../../src/tools/pm/employeeTools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAQpD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,OAAO,WAAW,GAAG,SAAS,EAAE,CAmHtE"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PM employee registry tools for VEC-ATP.
|
|
3
|
+
*
|
|
4
|
+
* Tools:
|
|
5
|
+
* view_employee_directory, view_org_chart,
|
|
6
|
+
* lookup_employee, set_employee_status
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* import { getPMEmployeeTools } from "./employeeTools.js";
|
|
10
|
+
* tools: [...getPMEmployeeTools(db), ...]
|
|
11
|
+
*/
|
|
12
|
+
import { Type } from "@mariozechner/pi-ai";
|
|
13
|
+
import { EventLog } from "../../atp/eventLog.js";
|
|
14
|
+
import { EventType } from "../../atp/models.js";
|
|
15
|
+
function ok(text) {
|
|
16
|
+
return { content: [{ type: "text", text }], details: {} };
|
|
17
|
+
}
|
|
18
|
+
export function getPMEmployeeTools(db) {
|
|
19
|
+
const view_employee_directory = {
|
|
20
|
+
name: "view_employee_directory",
|
|
21
|
+
label: "View Employee Directory",
|
|
22
|
+
description: "View the VEC employee directory — all virtual employees, their designations, " +
|
|
23
|
+
"departments, hierarchy level, and current availability status.",
|
|
24
|
+
parameters: Type.Object({
|
|
25
|
+
status_filter: Type.Optional(Type.String({
|
|
26
|
+
description: "Filter by status: 'available', 'busy', or 'offline'. Empty = show all.",
|
|
27
|
+
})),
|
|
28
|
+
department_filter: Type.Optional(Type.String({ description: "Filter by department name (e.g. 'Engineering'). Empty = show all." })),
|
|
29
|
+
}),
|
|
30
|
+
execute: async (_, params) => {
|
|
31
|
+
const status = (params.status_filter ?? "").trim().toLowerCase() || undefined;
|
|
32
|
+
const dept = (params.department_filter ?? "").trim() || undefined;
|
|
33
|
+
if (status && !["available", "busy", "offline"].includes(status)) {
|
|
34
|
+
return ok("ERROR: status_filter must be 'available', 'busy', or 'offline'.");
|
|
35
|
+
}
|
|
36
|
+
const result = db.employeeDirectory({ status, department: dept });
|
|
37
|
+
EventLog.log(EventType.AGENT_TOOL_CALL, "pm", "", `PM viewed employee directory (status=${status ?? "all"}, dept=${dept ?? "all"})`);
|
|
38
|
+
return ok(result);
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
const view_org_chart = {
|
|
42
|
+
name: "view_org_chart",
|
|
43
|
+
label: "View Org Chart",
|
|
44
|
+
description: "View the VEC org chart showing the full reporting hierarchy — " +
|
|
45
|
+
"who reports to whom, each employee's designation and current status.",
|
|
46
|
+
parameters: Type.Object({}),
|
|
47
|
+
execute: async () => {
|
|
48
|
+
const result = db.orgChart();
|
|
49
|
+
EventLog.log(EventType.AGENT_TOOL_CALL, "pm", "", "PM viewed org chart");
|
|
50
|
+
return ok(result);
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
const lookup_employee = {
|
|
54
|
+
name: "lookup_employee",
|
|
55
|
+
label: "Lookup Employee",
|
|
56
|
+
description: "Look up a specific employee by their employee ID (EMP-001) or agent key (e.g. 'ba', 'dev').",
|
|
57
|
+
parameters: Type.Object({
|
|
58
|
+
identifier: Type.String({
|
|
59
|
+
description: "Employee ID like 'EMP-003' or agent key like 'ba'.",
|
|
60
|
+
}),
|
|
61
|
+
}),
|
|
62
|
+
execute: async (_, params) => {
|
|
63
|
+
const id = params.identifier.trim();
|
|
64
|
+
const emp = id.toUpperCase().startsWith("EMP-")
|
|
65
|
+
? db.getEmployee(id.toUpperCase())
|
|
66
|
+
: db.getEmployeeByAgentId(id.toLowerCase());
|
|
67
|
+
if (!emp)
|
|
68
|
+
return ok(`No employee found for '${id}'.`);
|
|
69
|
+
let reportsToStr = "nobody (top of hierarchy)";
|
|
70
|
+
if (emp.reports_to) {
|
|
71
|
+
const manager = db.getEmployee(emp.reports_to);
|
|
72
|
+
reportsToStr = manager
|
|
73
|
+
? `${manager.name} (${manager.designation}) [${emp.reports_to}]`
|
|
74
|
+
: emp.reports_to;
|
|
75
|
+
}
|
|
76
|
+
const directReports = db.getDirectReports(emp.employee_id);
|
|
77
|
+
const reportsStr = directReports.length
|
|
78
|
+
? directReports.map((r) => `${r.name} [${r.employee_id}]`).join(", ")
|
|
79
|
+
: "none";
|
|
80
|
+
EventLog.log(EventType.AGENT_TOOL_CALL, "pm", "", `PM looked up employee ${emp.employee_id} (${emp.agent_id})`);
|
|
81
|
+
const joinedAt = emp.joined_at.slice(0, 10); // YYYY-MM-DD from ISO string
|
|
82
|
+
const text = `Employee: ${emp.name}\n` +
|
|
83
|
+
` ID: ${emp.employee_id} | Agent key: ${emp.agent_id}\n` +
|
|
84
|
+
` Designation: ${emp.designation}\n` +
|
|
85
|
+
` Department: ${emp.department}\n` +
|
|
86
|
+
` Hierarchy level: ${emp.hierarchy_level}\n` +
|
|
87
|
+
` Reports to: ${reportsToStr}\n` +
|
|
88
|
+
` Direct reports: ${reportsStr}\n` +
|
|
89
|
+
` Status: ${emp.status}\n` +
|
|
90
|
+
` Skills: ${emp.skills || "N/A"}\n` +
|
|
91
|
+
` Joined: ${joinedAt}`;
|
|
92
|
+
return ok(text);
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
const set_employee_status = {
|
|
96
|
+
name: "set_employee_status",
|
|
97
|
+
label: "Set Employee Status",
|
|
98
|
+
description: "Update a virtual employee's availability status. " +
|
|
99
|
+
"Use 'busy' when dispatching tasks and 'available' when the task completes.",
|
|
100
|
+
parameters: Type.Object({
|
|
101
|
+
agent_id: Type.String({ description: "The agent's short key (e.g. 'ba', 'dev', 'qa')" }),
|
|
102
|
+
status: Type.Union([Type.Literal("available"), Type.Literal("busy"), Type.Literal("offline")], {
|
|
103
|
+
description: "'available', 'busy', or 'offline'",
|
|
104
|
+
}),
|
|
105
|
+
}),
|
|
106
|
+
execute: async (_, params) => {
|
|
107
|
+
const emp = db.updateEmployeeStatus(params.agent_id.trim().toLowerCase(), params.status);
|
|
108
|
+
if (!emp) {
|
|
109
|
+
return ok(`ERROR: No employee found with agent_id '${params.agent_id}'.`);
|
|
110
|
+
}
|
|
111
|
+
EventLog.log(EventType.AGENT_TOOL_CALL, "pm", "", `PM set ${emp.name} (${emp.agent_id}) status to ${params.status}`);
|
|
112
|
+
return ok(`Employee ${emp.name} (${emp.agent_id}) status updated to '${params.status}'.`);
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
return [view_employee_directory, view_org_chart, lookup_employee, set_employee_status];
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=employeeTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"employeeTools.js","sourceRoot":"","sources":["../../../src/tools/pm/employeeTools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PM task-management tools for VEC-ATP.
|
|
3
|
+
* Factory that injects database, message queue, agent queue, and agent registry.
|
|
4
|
+
*
|
|
5
|
+
* Tools:
|
|
6
|
+
* create_and_assign_task, start_task, start_tasks,
|
|
7
|
+
* send_task_message, send_priority_message,
|
|
8
|
+
* check_task_status, list_all_tasks, read_messages
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* import { getPMTaskTools } from "./taskTools.js";
|
|
12
|
+
* tools: [...getPMTaskTools({ db, pmQueue, agentQueue, agents }), ...]
|
|
13
|
+
*/
|
|
14
|
+
import type { AgentTool } from "@mariozechner/pi-agent-core";
|
|
15
|
+
import { ATPDatabase } from "../../atp/database.js";
|
|
16
|
+
import { MessageQueue } from "../../atp/messageQueue.js";
|
|
17
|
+
import { AgentMessageQueue } from "../../atp/agentMessageQueue.js";
|
|
18
|
+
import type { VECAgent } from "../../atp/inboxLoop.js";
|
|
19
|
+
export interface PMTaskToolDeps {
|
|
20
|
+
db: typeof ATPDatabase;
|
|
21
|
+
pmQueue: typeof MessageQueue;
|
|
22
|
+
agentQueue: typeof AgentMessageQueue;
|
|
23
|
+
agents: Map<string, VECAgent>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Dispatch all pending tasks whose scheduled_date is today or earlier.
|
|
27
|
+
* Called at startup and hourly from tower.ts so tasks auto-release on their date.
|
|
28
|
+
*/
|
|
29
|
+
export declare function releaseDueTasks(deps: PMTaskToolDeps): void;
|
|
30
|
+
export declare function getPMTaskTools(deps: PMTaskToolDeps): AgentTool[];
|
|
31
|
+
//# sourceMappingURL=taskTools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskTools.d.ts","sourceRoot":"","sources":["../../../src/tools/pm/taskTools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;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;AAGnE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAiBvD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,WAAW,CAAC;IACvB,OAAO,EAAE,OAAO,YAAY,CAAC;IAC7B,UAAU,EAAE,OAAO,iBAAiB,CAAC;IACrC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CAC/B;AA8KD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAS1D;AAID,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,SAAS,EAAE,CAsZhE"}
|