archbyte 0.1.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 +282 -0
- package/bin/archbyte.js +213 -0
- package/dist/agents/core/component-detector.d.ts +2 -0
- package/dist/agents/core/component-detector.js +57 -0
- package/dist/agents/core/connection-mapper.d.ts +2 -0
- package/dist/agents/core/connection-mapper.js +77 -0
- package/dist/agents/core/doc-parser.d.ts +2 -0
- package/dist/agents/core/doc-parser.js +64 -0
- package/dist/agents/core/env-detector.d.ts +2 -0
- package/dist/agents/core/env-detector.js +51 -0
- package/dist/agents/core/event-detector.d.ts +2 -0
- package/dist/agents/core/event-detector.js +59 -0
- package/dist/agents/core/infra-analyzer.d.ts +2 -0
- package/dist/agents/core/infra-analyzer.js +72 -0
- package/dist/agents/core/structure-scanner.d.ts +2 -0
- package/dist/agents/core/structure-scanner.js +55 -0
- package/dist/agents/core/validator.d.ts +2 -0
- package/dist/agents/core/validator.js +74 -0
- package/dist/agents/index.d.ts +24 -0
- package/dist/agents/index.js +73 -0
- package/dist/agents/llm/index.d.ts +8 -0
- package/dist/agents/llm/index.js +185 -0
- package/dist/agents/llm/prompt-builder.d.ts +3 -0
- package/dist/agents/llm/prompt-builder.js +251 -0
- package/dist/agents/llm/response-parser.d.ts +6 -0
- package/dist/agents/llm/response-parser.js +174 -0
- package/dist/agents/llm/types.d.ts +31 -0
- package/dist/agents/llm/types.js +2 -0
- package/dist/agents/pipeline/agents/component-identifier.d.ts +3 -0
- package/dist/agents/pipeline/agents/component-identifier.js +102 -0
- package/dist/agents/pipeline/agents/connection-mapper.d.ts +3 -0
- package/dist/agents/pipeline/agents/connection-mapper.js +126 -0
- package/dist/agents/pipeline/agents/flow-detector.d.ts +3 -0
- package/dist/agents/pipeline/agents/flow-detector.js +101 -0
- package/dist/agents/pipeline/agents/service-describer.d.ts +3 -0
- package/dist/agents/pipeline/agents/service-describer.js +100 -0
- package/dist/agents/pipeline/agents/validator.d.ts +3 -0
- package/dist/agents/pipeline/agents/validator.js +102 -0
- package/dist/agents/pipeline/index.d.ts +13 -0
- package/dist/agents/pipeline/index.js +128 -0
- package/dist/agents/pipeline/merger.d.ts +7 -0
- package/dist/agents/pipeline/merger.js +212 -0
- package/dist/agents/pipeline/response-parser.d.ts +5 -0
- package/dist/agents/pipeline/response-parser.js +43 -0
- package/dist/agents/pipeline/types.d.ts +92 -0
- package/dist/agents/pipeline/types.js +3 -0
- package/dist/agents/prompt-data.d.ts +1 -0
- package/dist/agents/prompt-data.js +15 -0
- package/dist/agents/prompts-encode.d.ts +9 -0
- package/dist/agents/prompts-encode.js +26 -0
- package/dist/agents/prompts.d.ts +12 -0
- package/dist/agents/prompts.js +30 -0
- package/dist/agents/providers/anthropic.d.ts +10 -0
- package/dist/agents/providers/anthropic.js +117 -0
- package/dist/agents/providers/google.d.ts +10 -0
- package/dist/agents/providers/google.js +136 -0
- package/dist/agents/providers/ollama.d.ts +9 -0
- package/dist/agents/providers/ollama.js +162 -0
- package/dist/agents/providers/openai.d.ts +9 -0
- package/dist/agents/providers/openai.js +142 -0
- package/dist/agents/providers/router.d.ts +7 -0
- package/dist/agents/providers/router.js +55 -0
- package/dist/agents/runtime/orchestrator.d.ts +34 -0
- package/dist/agents/runtime/orchestrator.js +193 -0
- package/dist/agents/runtime/registry.d.ts +23 -0
- package/dist/agents/runtime/registry.js +56 -0
- package/dist/agents/runtime/types.d.ts +117 -0
- package/dist/agents/runtime/types.js +29 -0
- package/dist/agents/static/code-sampler.d.ts +3 -0
- package/dist/agents/static/code-sampler.js +153 -0
- package/dist/agents/static/component-detector.d.ts +3 -0
- package/dist/agents/static/component-detector.js +404 -0
- package/dist/agents/static/connection-mapper.d.ts +3 -0
- package/dist/agents/static/connection-mapper.js +280 -0
- package/dist/agents/static/doc-parser.d.ts +3 -0
- package/dist/agents/static/doc-parser.js +358 -0
- package/dist/agents/static/env-detector.d.ts +3 -0
- package/dist/agents/static/env-detector.js +73 -0
- package/dist/agents/static/event-detector.d.ts +3 -0
- package/dist/agents/static/event-detector.js +70 -0
- package/dist/agents/static/file-tree-collector.d.ts +3 -0
- package/dist/agents/static/file-tree-collector.js +51 -0
- package/dist/agents/static/index.d.ts +19 -0
- package/dist/agents/static/index.js +307 -0
- package/dist/agents/static/infra-analyzer.d.ts +3 -0
- package/dist/agents/static/infra-analyzer.js +208 -0
- package/dist/agents/static/structure-scanner.d.ts +3 -0
- package/dist/agents/static/structure-scanner.js +195 -0
- package/dist/agents/static/types.d.ts +165 -0
- package/dist/agents/static/types.js +2 -0
- package/dist/agents/static/utils.d.ts +21 -0
- package/dist/agents/static/utils.js +146 -0
- package/dist/agents/static/validator.d.ts +2 -0
- package/dist/agents/static/validator.js +75 -0
- package/dist/agents/tools/claude-code.d.ts +38 -0
- package/dist/agents/tools/claude-code.js +129 -0
- package/dist/agents/tools/local-fs.d.ts +12 -0
- package/dist/agents/tools/local-fs.js +112 -0
- package/dist/agents/tools/tool-definitions.d.ts +6 -0
- package/dist/agents/tools/tool-definitions.js +66 -0
- package/dist/cli/analyze.d.ts +27 -0
- package/dist/cli/analyze.js +586 -0
- package/dist/cli/auth.d.ts +46 -0
- package/dist/cli/auth.js +397 -0
- package/dist/cli/config.d.ts +11 -0
- package/dist/cli/config.js +177 -0
- package/dist/cli/diff.d.ts +10 -0
- package/dist/cli/diff.js +144 -0
- package/dist/cli/export.d.ts +10 -0
- package/dist/cli/export.js +321 -0
- package/dist/cli/gate.d.ts +13 -0
- package/dist/cli/gate.js +131 -0
- package/dist/cli/generate.d.ts +10 -0
- package/dist/cli/generate.js +213 -0
- package/dist/cli/license-gate.d.ts +27 -0
- package/dist/cli/license-gate.js +121 -0
- package/dist/cli/patrol.d.ts +15 -0
- package/dist/cli/patrol.js +212 -0
- package/dist/cli/run.d.ts +11 -0
- package/dist/cli/run.js +24 -0
- package/dist/cli/serve.d.ts +9 -0
- package/dist/cli/serve.js +65 -0
- package/dist/cli/setup.d.ts +1 -0
- package/dist/cli/setup.js +233 -0
- package/dist/cli/shared.d.ts +68 -0
- package/dist/cli/shared.js +275 -0
- package/dist/cli/stats.d.ts +9 -0
- package/dist/cli/stats.js +158 -0
- package/dist/cli/ui.d.ts +18 -0
- package/dist/cli/ui.js +144 -0
- package/dist/cli/validate.d.ts +54 -0
- package/dist/cli/validate.js +315 -0
- package/dist/cli/workflow.d.ts +10 -0
- package/dist/cli/workflow.js +594 -0
- package/dist/server/src/generator/index.d.ts +123 -0
- package/dist/server/src/generator/index.js +254 -0
- package/dist/server/src/index.d.ts +8 -0
- package/dist/server/src/index.js +1311 -0
- package/package.json +62 -0
- package/ui/dist/assets/index-B66Til39.js +70 -0
- package/ui/dist/assets/index-BE2OWbzu.css +1 -0
- package/ui/dist/index.html +14 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
// Pipeline — Orchestrator
|
|
2
|
+
// Runs static context collection → parallel LLM agents → sequential LLM agents
|
|
3
|
+
import { resolveModel } from "../runtime/types.js";
|
|
4
|
+
import { validateAnalysis } from "../static/validator.js";
|
|
5
|
+
import { componentIdentifier } from "./agents/component-identifier.js";
|
|
6
|
+
import { serviceDescriber } from "./agents/service-describer.js";
|
|
7
|
+
import { flowDetector } from "./agents/flow-detector.js";
|
|
8
|
+
import { connectionMapper } from "./agents/connection-mapper.js";
|
|
9
|
+
import { validator } from "./agents/validator.js";
|
|
10
|
+
import { mergeAgentOutputs } from "./merger.js";
|
|
11
|
+
const PARALLEL_AGENTS = [componentIdentifier, serviceDescriber, flowDetector];
|
|
12
|
+
const SEQUENTIAL_AGENTS = [connectionMapper, validator];
|
|
13
|
+
/** Check if an error is an authentication/API key issue */
|
|
14
|
+
function isAuthError(err) {
|
|
15
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
16
|
+
return /401|authentication_error|invalid.*api.?key|unauthorized|invalid.*key/i.test(msg);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Run the multi-agent pipeline: 3 parallel fast agents → 2 sequential agents.
|
|
20
|
+
* Each agent gets a single chat() call with pre-collected static context.
|
|
21
|
+
*/
|
|
22
|
+
export async function runPipeline(ctx, provider, config, onProgress) {
|
|
23
|
+
const agentResults = {};
|
|
24
|
+
const agentMeta = [];
|
|
25
|
+
// === Phase 1: Parallel agents ===
|
|
26
|
+
onProgress?.(`Phase 1: Running ${PARALLEL_AGENTS.length} agents in parallel...`);
|
|
27
|
+
const parallelResults = await Promise.allSettled(PARALLEL_AGENTS.map((agent) => runAgent(agent, ctx, provider, config, undefined, onProgress)));
|
|
28
|
+
let authFailed = false;
|
|
29
|
+
for (let i = 0; i < PARALLEL_AGENTS.length; i++) {
|
|
30
|
+
const agent = PARALLEL_AGENTS[i];
|
|
31
|
+
const result = parallelResults[i];
|
|
32
|
+
if (result.status === "fulfilled" && result.value) {
|
|
33
|
+
agentResults[agent.id] = result.value.data;
|
|
34
|
+
agentMeta.push(result.value);
|
|
35
|
+
onProgress?.(` ${agent.name}: done (${(result.value.duration / 1000).toFixed(1)}s)`);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
const reason = result.status === "rejected" ? result.reason : "null response";
|
|
39
|
+
onProgress?.(` ${agent.name}: failed (${reason})`);
|
|
40
|
+
if (result.status === "rejected" && isAuthError(result.reason)) {
|
|
41
|
+
authFailed = true;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (authFailed) {
|
|
46
|
+
throw new Error(`API key authentication failed. Check your API key with: archbyte config set api-key <your-key>\n` +
|
|
47
|
+
` Current provider: ${config.provider}. Get a valid key from your provider's dashboard.`);
|
|
48
|
+
}
|
|
49
|
+
// === Phase 2: Sequential agents ===
|
|
50
|
+
onProgress?.(`Phase 2: Running ${SEQUENTIAL_AGENTS.length} agents sequentially...`);
|
|
51
|
+
for (const agent of SEQUENTIAL_AGENTS) {
|
|
52
|
+
try {
|
|
53
|
+
const result = await runAgent(agent, ctx, provider, config, agentResults, onProgress);
|
|
54
|
+
if (result) {
|
|
55
|
+
agentResults[agent.id] = result.data;
|
|
56
|
+
agentMeta.push(result);
|
|
57
|
+
onProgress?.(` ${agent.name}: done (${(result.duration / 1000).toFixed(1)}s)`);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
onProgress?.(` ${agent.name}: returned null`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
onProgress?.(` ${agent.name}: failed (${err instanceof Error ? err.message : String(err)})`);
|
|
65
|
+
if (isAuthError(err)) {
|
|
66
|
+
throw new Error(`API key authentication failed. Check your API key with: archbyte config set api-key <your-key>\n` +
|
|
67
|
+
` Current provider: ${config.provider}. Get a valid key from your provider's dashboard.`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// === Merge results ===
|
|
72
|
+
onProgress?.("Merging agent outputs...");
|
|
73
|
+
const merged = mergeAgentOutputs(ctx, agentResults["component-identifier"] ?? null, agentResults["service-describer"] ?? null, agentResults["flow-detector"] ?? null, agentResults["connection-mapper"] ?? null, agentResults["validator"] ?? null);
|
|
74
|
+
// === Deterministic validation ===
|
|
75
|
+
merged.validation = validateAnalysis(merged);
|
|
76
|
+
if (merged.validation.repairs.length > 0) {
|
|
77
|
+
onProgress?.(`Applied ${merged.validation.repairs.length} deterministic repair(s)`);
|
|
78
|
+
}
|
|
79
|
+
// Log token usage
|
|
80
|
+
const totalInput = agentMeta.reduce((s, a) => s + (a.tokenUsage?.input ?? 0), 0);
|
|
81
|
+
const totalOutput = agentMeta.reduce((s, a) => s + (a.tokenUsage?.output ?? 0), 0);
|
|
82
|
+
if (totalInput > 0) {
|
|
83
|
+
onProgress?.(`Token usage: ${totalInput} in / ${totalOutput} out`);
|
|
84
|
+
}
|
|
85
|
+
return { ...merged, tokenUsage: { input: totalInput, output: totalOutput } };
|
|
86
|
+
}
|
|
87
|
+
// Agents that produce large structured output (lists of components/connections) need more tokens
|
|
88
|
+
const MAX_TOKENS = {
|
|
89
|
+
"component-identifier": 8192,
|
|
90
|
+
"connection-mapper": 8192,
|
|
91
|
+
"service-describer": 4096,
|
|
92
|
+
"flow-detector": 4096,
|
|
93
|
+
"validator": 4096,
|
|
94
|
+
};
|
|
95
|
+
async function runAgent(agent, ctx, provider, config, priorResults, onProgress) {
|
|
96
|
+
const start = Date.now();
|
|
97
|
+
const model = resolveModel(config.provider, agent.modelTier, config.modelOverrides);
|
|
98
|
+
const { system, user } = agent.buildPrompt(ctx, priorResults);
|
|
99
|
+
onProgress?.(` ${agent.name}: calling ${model}...`);
|
|
100
|
+
const maxTokens = MAX_TOKENS[agent.id] ?? 4096;
|
|
101
|
+
const response = await provider.chat({
|
|
102
|
+
model,
|
|
103
|
+
system,
|
|
104
|
+
messages: [{ role: "user", content: user }],
|
|
105
|
+
maxTokens,
|
|
106
|
+
});
|
|
107
|
+
// Detect truncation
|
|
108
|
+
if (response.stopReason === "max_tokens") {
|
|
109
|
+
onProgress?.(` ${agent.name}: response truncated at ${maxTokens} tokens — output may be incomplete`);
|
|
110
|
+
}
|
|
111
|
+
const text = response.content
|
|
112
|
+
.filter((b) => b.type === "text")
|
|
113
|
+
.map((b) => b.text ?? "")
|
|
114
|
+
.join("");
|
|
115
|
+
if (!text)
|
|
116
|
+
return null;
|
|
117
|
+
const data = agent.parseResponse(text);
|
|
118
|
+
if (!data) {
|
|
119
|
+
onProgress?.(` ${agent.name}: could not parse response (${text.length} chars, stop=${response.stopReason})`);
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
agentId: agent.id,
|
|
124
|
+
data,
|
|
125
|
+
duration: Date.now() - start,
|
|
126
|
+
tokenUsage: { input: response.usage.inputTokens, output: response.usage.outputTokens },
|
|
127
|
+
};
|
|
128
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { StaticAnalysisResult, StaticContext } from "../static/types.js";
|
|
2
|
+
import type { ComponentIdentifierOutput, ServiceDescriberOutput, FlowDetectorOutput, ConnectionMapperOutput, ValidatorOutput } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Merge all pipeline agent outputs into a StaticAnalysisResult
|
|
5
|
+
* compatible with the existing buildAnalysisFromStatic() in cli/analyze.ts.
|
|
6
|
+
*/
|
|
7
|
+
export declare function mergeAgentOutputs(ctx: StaticContext, componentId: ComponentIdentifierOutput | null, serviceDesc: ServiceDescriberOutput | null, flowDet: FlowDetectorOutput | null, connMap: ConnectionMapperOutput | null, validatorOut: ValidatorOutput | null): StaticAnalysisResult;
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
// Pipeline — Merger
|
|
2
|
+
// Assembles all agent outputs into a StaticAnalysisResult
|
|
3
|
+
/**
|
|
4
|
+
* Merge all pipeline agent outputs into a StaticAnalysisResult
|
|
5
|
+
* compatible with the existing buildAnalysisFromStatic() in cli/analyze.ts.
|
|
6
|
+
*/
|
|
7
|
+
export function mergeAgentOutputs(ctx, componentId, serviceDesc, flowDet, connMap, validatorOut) {
|
|
8
|
+
// Start with components from component-identifier
|
|
9
|
+
const components = [];
|
|
10
|
+
if (componentId?.components) {
|
|
11
|
+
for (const c of componentId.components) {
|
|
12
|
+
components.push({
|
|
13
|
+
id: c.id,
|
|
14
|
+
name: c.name,
|
|
15
|
+
type: c.type,
|
|
16
|
+
layer: c.layer,
|
|
17
|
+
path: c.path,
|
|
18
|
+
description: c.description,
|
|
19
|
+
technologies: c.technologies,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const componentIds = new Set(components.map((c) => c.id));
|
|
24
|
+
// Add databases from service-describer as components
|
|
25
|
+
if (serviceDesc?.databases) {
|
|
26
|
+
for (const db of serviceDesc.databases) {
|
|
27
|
+
if (!componentIds.has(db.id)) {
|
|
28
|
+
components.push({
|
|
29
|
+
id: db.id,
|
|
30
|
+
name: db.name,
|
|
31
|
+
type: "database",
|
|
32
|
+
layer: "data",
|
|
33
|
+
path: "",
|
|
34
|
+
description: db.description,
|
|
35
|
+
technologies: [db.type],
|
|
36
|
+
});
|
|
37
|
+
componentIds.add(db.id);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Add external services from service-describer as components
|
|
42
|
+
if (serviceDesc?.externalServices) {
|
|
43
|
+
for (const svc of serviceDesc.externalServices) {
|
|
44
|
+
if (!componentIds.has(svc.id)) {
|
|
45
|
+
components.push({
|
|
46
|
+
id: svc.id,
|
|
47
|
+
name: svc.name,
|
|
48
|
+
type: "service",
|
|
49
|
+
layer: "external",
|
|
50
|
+
path: "",
|
|
51
|
+
description: svc.description,
|
|
52
|
+
technologies: [svc.type],
|
|
53
|
+
});
|
|
54
|
+
componentIds.add(svc.id);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Apply validator type corrections
|
|
59
|
+
if (validatorOut?.componentTypeCorrections) {
|
|
60
|
+
for (const comp of components) {
|
|
61
|
+
const corrected = validatorOut.componentTypeCorrections[comp.id];
|
|
62
|
+
if (corrected)
|
|
63
|
+
comp.type = corrected;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Apply validator description improvements
|
|
67
|
+
if (validatorOut?.componentDescriptions) {
|
|
68
|
+
for (const comp of components) {
|
|
69
|
+
const better = validatorOut.componentDescriptions[comp.id];
|
|
70
|
+
if (better && better.length > (comp.description?.length ?? 0)) {
|
|
71
|
+
comp.description = better;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Build connections
|
|
76
|
+
const connections = [];
|
|
77
|
+
const connKeys = new Set();
|
|
78
|
+
// Connections from connection-mapper
|
|
79
|
+
if (connMap?.connections) {
|
|
80
|
+
for (const c of connMap.connections) {
|
|
81
|
+
if (!componentIds.has(c.from) || !componentIds.has(c.to))
|
|
82
|
+
continue;
|
|
83
|
+
const key = `${c.from}::${c.to}::${c.type}`;
|
|
84
|
+
if (connKeys.has(key))
|
|
85
|
+
continue;
|
|
86
|
+
connKeys.add(key);
|
|
87
|
+
connections.push({
|
|
88
|
+
from: c.from,
|
|
89
|
+
to: c.to,
|
|
90
|
+
type: c.type,
|
|
91
|
+
description: c.description,
|
|
92
|
+
confidence: 80,
|
|
93
|
+
async: c.async,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Add database connections from service-describer usedBy
|
|
98
|
+
if (serviceDesc?.databases) {
|
|
99
|
+
for (const db of serviceDesc.databases) {
|
|
100
|
+
for (const userId of db.usedBy) {
|
|
101
|
+
if (!componentIds.has(userId))
|
|
102
|
+
continue;
|
|
103
|
+
const key = `${userId}::${db.id}::database`;
|
|
104
|
+
if (connKeys.has(key))
|
|
105
|
+
continue;
|
|
106
|
+
connKeys.add(key);
|
|
107
|
+
connections.push({
|
|
108
|
+
from: userId,
|
|
109
|
+
to: db.id,
|
|
110
|
+
type: "database",
|
|
111
|
+
description: `${userId} uses ${db.name}`,
|
|
112
|
+
confidence: 75,
|
|
113
|
+
async: false,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Add external service connections from service-describer usedBy
|
|
119
|
+
if (serviceDesc?.externalServices) {
|
|
120
|
+
for (const svc of serviceDesc.externalServices) {
|
|
121
|
+
for (const userId of svc.usedBy) {
|
|
122
|
+
if (!componentIds.has(userId))
|
|
123
|
+
continue;
|
|
124
|
+
const key = `${userId}::${svc.id}::http`;
|
|
125
|
+
if (connKeys.has(key))
|
|
126
|
+
continue;
|
|
127
|
+
connKeys.add(key);
|
|
128
|
+
connections.push({
|
|
129
|
+
from: userId,
|
|
130
|
+
to: svc.id,
|
|
131
|
+
type: "http",
|
|
132
|
+
description: `${userId} uses ${svc.name}`,
|
|
133
|
+
confidence: 75,
|
|
134
|
+
async: false,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Add event connections from flow-detector
|
|
140
|
+
if (flowDet?.eventConnections) {
|
|
141
|
+
for (const ec of flowDet.eventConnections) {
|
|
142
|
+
if (!componentIds.has(ec.publisher) || !componentIds.has(ec.subscriber))
|
|
143
|
+
continue;
|
|
144
|
+
const key = `${ec.publisher}::${ec.subscriber}::event`;
|
|
145
|
+
if (connKeys.has(key))
|
|
146
|
+
continue;
|
|
147
|
+
connKeys.add(key);
|
|
148
|
+
connections.push({
|
|
149
|
+
from: ec.publisher,
|
|
150
|
+
to: ec.subscriber,
|
|
151
|
+
type: "event",
|
|
152
|
+
description: `${ec.channel} via ${ec.technology}`,
|
|
153
|
+
confidence: 70,
|
|
154
|
+
async: true,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Add validator corrections
|
|
159
|
+
if (validatorOut?.addedConnections) {
|
|
160
|
+
for (const c of validatorOut.addedConnections) {
|
|
161
|
+
if (!componentIds.has(c.from) || !componentIds.has(c.to))
|
|
162
|
+
continue;
|
|
163
|
+
const key = `${c.from}::${c.to}::${c.type}`;
|
|
164
|
+
if (connKeys.has(key))
|
|
165
|
+
continue;
|
|
166
|
+
connKeys.add(key);
|
|
167
|
+
connections.push({
|
|
168
|
+
from: c.from,
|
|
169
|
+
to: c.to,
|
|
170
|
+
type: c.type,
|
|
171
|
+
description: c.description,
|
|
172
|
+
confidence: 65,
|
|
173
|
+
async: c.async,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// Remove connections flagged by validator
|
|
178
|
+
const removedKeys = new Set(validatorOut?.removedConnectionKeys ?? []);
|
|
179
|
+
const filteredConnections = removedKeys.size > 0
|
|
180
|
+
? connections.filter((c) => !removedKeys.has(`${c.from}::${c.to}::${c.type}`))
|
|
181
|
+
: connections;
|
|
182
|
+
// Build flows
|
|
183
|
+
const flows = connMap?.flows ?? [];
|
|
184
|
+
// Override structure fields from service-describer
|
|
185
|
+
const structure = { ...ctx.structure };
|
|
186
|
+
if (serviceDesc?.primaryLanguage && structure.language === "unknown") {
|
|
187
|
+
structure.language = serviceDesc.primaryLanguage;
|
|
188
|
+
}
|
|
189
|
+
// Override docs from service-describer
|
|
190
|
+
const docs = { ...ctx.docs };
|
|
191
|
+
if (serviceDesc?.projectDescription && serviceDesc.projectDescription.length > (docs.projectDescription?.length ?? 0)) {
|
|
192
|
+
docs.projectDescription = serviceDesc.projectDescription;
|
|
193
|
+
}
|
|
194
|
+
return {
|
|
195
|
+
structure,
|
|
196
|
+
docs,
|
|
197
|
+
components: { components },
|
|
198
|
+
infra: ctx.infra,
|
|
199
|
+
events: ctx.events,
|
|
200
|
+
envs: ctx.envs,
|
|
201
|
+
connections: {
|
|
202
|
+
connections: filteredConnections,
|
|
203
|
+
flows: flows.map((f) => ({
|
|
204
|
+
name: f.name,
|
|
205
|
+
description: f.description,
|
|
206
|
+
steps: f.steps,
|
|
207
|
+
})),
|
|
208
|
+
},
|
|
209
|
+
validation: { valid: true, repairs: [], errors: [] },
|
|
210
|
+
gaps: [],
|
|
211
|
+
};
|
|
212
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// Pipeline — Response Parser
|
|
2
|
+
// 4-strategy JSON extraction (reused from agents/llm/response-parser.ts)
|
|
3
|
+
/**
|
|
4
|
+
* Extract JSON from LLM response text using 4 fallback strategies.
|
|
5
|
+
* Returns null if all fail.
|
|
6
|
+
*/
|
|
7
|
+
export function extractJSON(raw) {
|
|
8
|
+
// Strategy 1: Direct parse
|
|
9
|
+
try {
|
|
10
|
+
const obj = JSON.parse(raw);
|
|
11
|
+
if (typeof obj === "object" && obj !== null)
|
|
12
|
+
return obj;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
// Continue
|
|
16
|
+
}
|
|
17
|
+
// Strategy 2: Extract from markdown code block
|
|
18
|
+
const codeBlockMatch = raw.match(/```(?:json)?\s*\n?([\s\S]*?)\n?```/);
|
|
19
|
+
if (codeBlockMatch) {
|
|
20
|
+
try {
|
|
21
|
+
const obj = JSON.parse(codeBlockMatch[1]);
|
|
22
|
+
if (typeof obj === "object" && obj !== null)
|
|
23
|
+
return obj;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// Continue
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// Strategy 3: Extract first {...} block
|
|
30
|
+
const braceMatch = raw.match(/\{[\s\S]*\}/);
|
|
31
|
+
if (braceMatch) {
|
|
32
|
+
try {
|
|
33
|
+
const obj = JSON.parse(braceMatch[0]);
|
|
34
|
+
if (typeof obj === "object" && obj !== null)
|
|
35
|
+
return obj;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Continue
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Strategy 4: Return null
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type { ModelTier } from "../runtime/types.js";
|
|
2
|
+
import type { StaticContext } from "../static/types.js";
|
|
3
|
+
export interface PipelineAgent {
|
|
4
|
+
id: string;
|
|
5
|
+
name: string;
|
|
6
|
+
modelTier: ModelTier;
|
|
7
|
+
phase: "parallel" | "sequential";
|
|
8
|
+
buildPrompt(ctx: StaticContext, priorResults?: Record<string, unknown>): {
|
|
9
|
+
system: string;
|
|
10
|
+
user: string;
|
|
11
|
+
};
|
|
12
|
+
parseResponse(raw: string): unknown | null;
|
|
13
|
+
}
|
|
14
|
+
export interface ComponentIdentifierOutput {
|
|
15
|
+
components: Array<{
|
|
16
|
+
id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
type: string;
|
|
19
|
+
layer: string;
|
|
20
|
+
path: string;
|
|
21
|
+
description: string;
|
|
22
|
+
technologies: string[];
|
|
23
|
+
}>;
|
|
24
|
+
}
|
|
25
|
+
export interface ServiceDescriberOutput {
|
|
26
|
+
projectDescription: string;
|
|
27
|
+
primaryLanguage: string;
|
|
28
|
+
databases: Array<{
|
|
29
|
+
id: string;
|
|
30
|
+
name: string;
|
|
31
|
+
type: string;
|
|
32
|
+
description: string;
|
|
33
|
+
usedBy: string[];
|
|
34
|
+
}>;
|
|
35
|
+
externalServices: Array<{
|
|
36
|
+
id: string;
|
|
37
|
+
name: string;
|
|
38
|
+
type: string;
|
|
39
|
+
description: string;
|
|
40
|
+
usedBy: string[];
|
|
41
|
+
}>;
|
|
42
|
+
}
|
|
43
|
+
export interface FlowDetectorOutput {
|
|
44
|
+
eventConnections: Array<{
|
|
45
|
+
publisher: string;
|
|
46
|
+
subscriber: string;
|
|
47
|
+
channel: string;
|
|
48
|
+
technology: string;
|
|
49
|
+
}>;
|
|
50
|
+
apiRoutes: Array<{
|
|
51
|
+
path: string;
|
|
52
|
+
method: string;
|
|
53
|
+
handlerFile: string;
|
|
54
|
+
}>;
|
|
55
|
+
}
|
|
56
|
+
export interface ConnectionMapperOutput {
|
|
57
|
+
connections: Array<{
|
|
58
|
+
from: string;
|
|
59
|
+
to: string;
|
|
60
|
+
type: string;
|
|
61
|
+
description: string;
|
|
62
|
+
async: boolean;
|
|
63
|
+
}>;
|
|
64
|
+
flows: Array<{
|
|
65
|
+
name: string;
|
|
66
|
+
description: string;
|
|
67
|
+
steps: string[];
|
|
68
|
+
}>;
|
|
69
|
+
}
|
|
70
|
+
export interface ValidatorOutput {
|
|
71
|
+
componentTypeCorrections: Record<string, string>;
|
|
72
|
+
componentDescriptions: Record<string, string>;
|
|
73
|
+
addedConnections: Array<{
|
|
74
|
+
from: string;
|
|
75
|
+
to: string;
|
|
76
|
+
type: string;
|
|
77
|
+
description: string;
|
|
78
|
+
async: boolean;
|
|
79
|
+
}>;
|
|
80
|
+
removedConnectionKeys: string[];
|
|
81
|
+
confidence: number;
|
|
82
|
+
issues: string[];
|
|
83
|
+
}
|
|
84
|
+
export interface PipelineAgentResult {
|
|
85
|
+
agentId: string;
|
|
86
|
+
data: unknown;
|
|
87
|
+
duration: number;
|
|
88
|
+
tokenUsage?: {
|
|
89
|
+
input: number;
|
|
90
|
+
output: number;
|
|
91
|
+
};
|
|
92
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// Auto-generated by prompts-encode.ts — DO NOT EDIT
|
|
2
|
+
// Run: node agents/prompts-encode.ts
|
|
3
|
+
import { registerPrompt } from "./prompts.js";
|
|
4
|
+
registerPrompt("premium/api-contract-verifier", "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");
|
|
5
|
+
registerPrompt("premium/compliance-checker", "GB0WSCMLEUUgUgAHLwkYDCAcAA1iGBoELQsQATFZFQIkHBdGYiAbEDNSCQcgWR0WYQYMSCcPFQk0ExcNYhhUFi4UFx8jCxFFIAAAACsNEQY1BxENYhgTBCgcEBxiGhsILB0NSCEWGRUtGwIGIRxUAzMTDg01FgYOMlJLOw06RklhOio4AzhYRQY2MzpuWSQmCF8nOxFQVAQvFkMBJhwaESgUGkglGAQWb3hpKSwYGBw7F0McKhxUFTMdCQ0hDVQELxZDGicNARcvUgJICCo7K2EdAQInGgBFNhsXAGINHAwyUhAcMAwXETQABlJIAn5FYVAQHS8UFRc4UFlIYBsGDCQUQwstFAQJKBMNCydZBAoyBhYaJ1kVFjIXEBsvHBoRY15pSGJbFRUxHgoLIxsYAAcAAgUnDhsXKgFBUmIiVjYOMVFKbllWIgUiMUpuWRERIlw+REhZVEcuBAYaIxUYNiIdEQ1gQ1QLNB8BDTBZXFVsQ1NYa1V+RWFQBRojFBESLgAIG2BDVB5LUkNIYlsnKgJAQVJiAn5FYVJDSGJbBwYuAAZKeFkaECwQBhpuc1RFYVJDSGAKAAQ1BxBKeFlWBi4fEwQrGBoRYQ5DGCMLAAwgHg8RHRobCDEeCgksDVQZYRwMBh0aGwgxHgoJLA1UGWEcDBwdGAQVLRsACSAVEUdteENIYllURWMUCgYmEBoCMlBZSBlzVEVhUkNIYlkPb2FSQ0hiWVRFYVJBCy0XABcuHkFSYls3JndcUkhvWTgKJhsACS5ZFQslUjMAOwodBiAeQykhGhEWMlIgBywNBgotAUFESFlURWFSQ0hiWVRHMgYCHDcKVl9hUA4NNlkIRTETERwrGBhFPVIECTJZCEUvHRc3IwkECSgRAgouHFZJS1JDSGJZVEVhUkNKJw8dASQcAA1gQ1RHNhoCHGIOFRZhFAwdLB1WSUtSQ0hiWVRFYVJDSiUYBEd7UkEfKhgAQjJSDgExCh0LJlJLASRZFQs4W0FESFlURWFSQ0hiWVRHMxcABy8UEQslExcBLRdWX2FQCwc1WQAKYQAGBScdHQQ1F0FiYllURWFSQ0g/c1RFYVJDSB9zVEVhUh5ESFlURWFQJCwSK1ZfYQlDRmxXVBhteENIYllWLQgiIilgQ1QeYVxNRmIEWG9hUkNIYCk3LB42MDtgQ1QeYVxNRmIEfkVhD09iYllWASAGAiAjFxAJKBwESnhZD29hUkNIYAkdDAUXFw0hDREBY0hDCi0WGAAgHE9iYllURWMCCwEGHAAAIgYGDGBDVAcuHQ8NIxdYb2FSQ0hgCRUcLBcNHAYYAAQFFxcNIQ0RAWNIQwotFhgAIBxPYmJZVEVjFgIcIz8YCjYBQVJiIlYJKAEXSC0fVAEgBgJIJBUbEmEWBhshCx0VNRsMBjFbKUlLUkNIYlsHES4AAg8nNRsGIAYKBywKVl9hKUEfKhwGAGEBBgYxEAAMNxdDDCMNFUUoAUMbNhYGACVQPkRIWVRFYVAGBiELDRU1GwwGAw0mADIGQVJiGxsKLRcCBm5zVEVhUkENLBoGHDEGCgcsMBoxMxMNGysNVl9hEAwHLhwVC0tSQxVuc1RFYwAGCy0UGQAvFgIcKxYaFmNIQzNgCQYMLgAKHCsDEQFhEQwFMhUdBC8RBkgrFAQXLgQGBScXABZjL2kVSHM9CzIGER0hDR0KLwFZYnNXVCkuHQhIJBYGRRE7KkcSMT1FKRMNDC4QGgJhWhYbJwtUASAGAkRiEREELQYLSDAcFwozFhBEYgkRFzIdDQkuWR0LJx1KYnBXVCYpFwADYh8bF2EWAhwjWRELIgAaGDYQGwthWgIcYgsRFjVSAgYmWR0LYQYRCSwKHRFoeFBGYjUbCipSBQcwWRUQJRsXSC4WEwIoHARIIxcQRSARAA0xClQGLhwXGi0VB291XEMrKhwXDmEUDBpiHRURIFIRDTYcGhEoHQ1HJhwYADUbDAZiCRsJKBEKDTFZHQthEQwMJ1kbF2ERDAYkEBNvdFxDOicPHQA2UgIdNhERCzUbAAk2EBsLYRMNDGIYAREpHREBOBgADC4cQwUnGhwELxsQBTFzQkthMQsNIRJUAy4AQy8GKSZIMgIGCysfHQZhAgIcNhwGCzJSSwstFwcALwZPSCYYAARhAgwaNhgWDC0bFxFuWQYMJhoXSDYWVAAzExAdMBxdb3ZcQyQtFh9FJx0RSDIYDQgkHBdIMgsbBiQBEAEsHlRNETEqRQYqJ0UzFw8NNBgaBiRbaVBsWT0BJBwXASQAVAEgBgJIMQ0bFyAVBkguFhcENRsMBjFZXAEgBgIKIwoRFm1SAAkhEREWbVIFAS4cVBY1HRENMVB+XG9SLAYuAFQEMgEGGzFZEhcgHwYfLQsfFmEGCwk2WRUXJFIRDS4cAgQvBkMcLVkADSRSBw02HBcRJBZDDCMNFUU1CxMNMXNFVW9SMQ02DAYLYT0tJBtZAA0kUik7DTdUCiMYBgs2VVQLLlIMHCocBkU1Fxsc");
|
|
6
|
+
registerPrompt("premium/dependency-risk-scorer", "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");
|
|
7
|
+
registerPrompt("premium/drift-detector", "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");
|
|
8
|
+
registerPrompt("premium/migration-planner", "GB0WSCMLEUUgHEMJMBocDDUXABw3CxFFLBsEGiMNHQovUhMEIxcaDC8VQwklHBoRb1I6BzcLVA8uEEMBMVkACmETDQkuAA4AYQYLDWIaARczFw0cYhgGBikbFw0hDQEXJFICBiZZBBcuFhYLJ1kVBjUbDAYjGxgAYR8KDzAYAAwuHEMYLhgaFmEUDBpiEBkVMx0VDS8cGhEyXGliAxcVCTgIBkg2ERFFMQAMAicaAEUgHAdIMBwAEDMcQwliMycqD1IMCigcFxFhBQocKlkADSgBQxs2CwEGNQcRDXhzD29hUkEbNxQZBDMLQVJiWxYXKBcFSCMKBwAyAQ4NLA1UCidSAB0wCxELNVICGiERHREkERcdMBxUBC8WQwUrHgYENRsMBmIWBBUuABcdLBAADCQBQURIWVRHIgcRGicXADY1ExcNYENUHktSQ0hiWxkENQcRATYAOAA3Fw9KeFlWFTMdFwc2AAQAYQ5DJRQpVBlhFREHNQ0cRT1SDgk2DAYAYQ5DBCceFQY4UE9iYllURWMGBgsqPREHNVBZSGAaBgw1GwAJLlkIRSkbBABiBVQIJBYKHS9ZCEUtHRRKbnNURWFSQQstDAQJKBwEJCcPEQljSENKNhATDTVSH0gvFhAAMxMXDWIFVAkuHRANYFV+RWFSQ0o2HAcRAh0VDTAYEwBjSENKLBYaAGEOQwQtDlQZYR8MDCcLFREkUh9IKhATDWN4Q0g/VX5FYVAOASULFREoHQ0bYENUPktSQ0hiAn5FYVJDSGJbHQFjSENKDzAzSHFCUkpuc1RFYVJDSGANHREtF0FSYlsZDCYAAhwrFhpFNRsXBCdbWG9hUkNIYllWFTMbDBorDQ1He1JBCzAQAAwiEw9IPlkcDCYaQxRiFBEBKAcOSD5ZGAo2UE9iYllURWFSQQ0kHxsXNVBZSGAKGQQtHkNAKhYBFzJbQxRiFBEBKAcOSGodFRwyW0MUYhUVFyYXQ0A1HBEOMltDFGIcBAwiUksFLRcADTJbQURIWVRFYVJDSiEYAAAmHRERYENURyUXAAcvCRsWKAYKByxZCEU0AgQaIx0RRT1SEQ0kGBcRLgBDFGIaGwsyHQ8BJhgADC4cQxRiFBsBJAANATgYAAwuHEMUYhAaAzMTEBwwDBcRNAAGSm5zVEVhUkNIYB0RFiIAChg2EBsLY0hDSjURFRFhHAYNJgpUES5SAAAjFxMAYRMNDGIOHBxjXmlIYllURWFQAB0wCxELNSEXCTYcVl9hUAsHNVkdEWEFDBopClQLLgVBREhZVEVhUkNKNhgGAiQGMBwjDRFHe1JBAC0OVAw1UhAALQwYAWEFDBopWRUDNRcRSC8QExcgBgoHLFtYb2FSQ0hiWVYWNRcTG2BDVD5LUkNIYllURWEJaUhiWVRFYVJDSGJbGxclFxFKeFlFSUtSQ0hiWVRFYVJDSjYQAAkkUFlIYAoAADFSFwE2FRFHbXhDSGJZVEVhUkNIYB0RFiIAChg2EBsLY0hDSjURFRFhBgxIJhZWSUtSQ0hiWVRFYVJDSiQQGAAyUFlIGVsVAycXABwnHVQDKB4GG2IWBkUlGxENIQ0bFygXEEofVX5FYVJDSGJZVEVhUAEaJxgfDC8VIAAjFxMAY0hDCi0WGAAgHGlIYllURWFSQxVIWVRFYVJDNW5zVEVhUkNIYAsdFioBQVJiIlYVLgYGBjYQFQlhAAobKQpUATQACgYlWRkMJgACHCsWGkccXmlIYllURWFQEQcuFRYEIhkzBCMXVl9hUAsHNVkACmEADAQuWRYEIhlDASRZBwosFxcAKxcTRSYdBhtiDgYKLxVBYmJZVEU8eENIH1V+RWFQBw0yHBoBJBwAEQULFRUpUFlIGXNURWFSGGJiWVRFYVJBBSseBgQ1GwwGYENURww7JEVySUVHbXhDSGJZVEVjFgYYJxcQFg4cQVJiIlYoCDVOWHJLVjhteENIYllURWMABgkxFhpHe1JBHyoAVBEpGxBIJhwEAC8WBgYhAFQAORsQHDFbfkVhUkMVSFlUOG14Q0hgCxEGLh8ODSwdFREoHQ0bYENUPmMdFQ0wGBgJYR8KDzAYAAwuHEMbNgsVESQVGkgjHQIMIhdBNUgEfm8IHBAcMAwXESgdDRt4c0VLYScNDCcLBxEgHAdINhERRSIHERonFwBFIAAAACsNEQY1BxENYh8GCixSBwEwHBcRLgAaSDENBhAiBhYaJ1kVCyVSAAcmHH5Xb1IqDCcXAAwnC0MJMBwVFmEdBUg2HBcNYRYGCjZZXAotFkMYIw0AADMcEERiHREVMxcACTYcEEUAIiobblkZDDkXB0gyGAYEJRsEBTFQflZvUi8HLRJUAy4AQxwrHhwRLQtDCy0MBAkkFkMLLRQECi8XDRwxWQANIAZDGyoWAQklUgENYh0RBi4fEwcxHBBvdVxDKyocFw5hFAwaYhYBESUTFw0mWRIXIB8GHy0LHxZhHRFIMhgAESQADRtiDRwENVINDScdVAguFgYaLBAOBDUbDAZITFpFCBYGBjYQEhxhHwobMRAaAmEbDQ4wGAcRMwcAHDcLEUVpHwwGKw0bFygcBERiFRsCJhsND25ZNyxuMSdBSE9aRQYXDQ0wGAAAYREMBiELEREkXkMbNhwESCMLThs2HARFLBsEGiMNHQovUhMEIxcHRTYbFwBiCQYMLgAKHCscB292XEMrLRcHDCUXEUgvEBMXIAYKByxZEAAxFw0MJxcXDCQBQ0A1ERURYR8WGzZZHAQxAgYGYh8dFzIGSmJ6V1QsLxEPHSYcVBcuHg8KIxofRTIGEQk2HBMMJAFDDi0LVAAgEQtILxATFyAGCgcsc01LYScQDWIJBgwuAEMJJRwaEWEABhs3FQAWYRsFSCMPFQwtEwEEJ1kACmEHDQwnCwcRIBwHSDYREUUnBw8EYhgGBikbFw0hDQEXJHhSWGxZJgA1BxEGYjY6KRhSFwAnWT42DjxDByATEQY1XkMGLVkbESkXEUg2HAwR");
|
|
9
|
+
registerPrompt("premium/performance-analyzer", "GB0WSCMLEUUgUhMNMB8bFywTDQsnWRULIB4aGysKVAQmFw0cbFktCjQAQwItG1QMMlIXB2IQEAAvBgoOO1kVFyIaChwnGgAQMxMPSCAWABEtFw0NIRIHSWEBAAkuEBoCYRsQGzccB0lhEw0MYgkRFycdEQUjFxcAYRMNHCtUBAQ1BgYaLApab0szDQkuAA4AYQYLDWIJBgorFwAcYhgaAWEABhw3CxpFIFIpOw03VAojGAYLNlkDDDUaQxwqEAdFMgYRHSENARckSGkTSFlURzIHDgUjCw1He1JBCjAQEQNhAgYaJBYGCCAcAA1iGAcWJAEQBScXAEdteENIYBYCADMTDwQQGAAMLxVBUmJbER0iFw8EJxcART1SBActHVQZYRQCATBZCEUxHQwaYgVUBjMbFwEhGBhHbXhDSGAbGxE1HgYGJxofFmNIQzNIWVRFYQlpSGJZVEVhUAoMYENURxE3MS5vSURUY15pSGJZVEVhUBANNBwGDDULQVJiWxcXKAYKCyMVVBlhGgoPKlkIRSwXBwE3FFQZYR4MH2BVfkVhUkNIYlsXCiwCDAYnFwBHe1JBCy0UBAovFw0cYhcVCCRQT2JiWVRFYVJBHDsJEUd7UkEMIw0VByABBkg+WRoANQUMGilZCEUiHQ4YNw0RRT1SDg0vFgYcYQ5DAS1ZCEUiHQ0LNwsGAC8RGkpuc1RFYVJDSGAdERYiAAoYNhAbC2NIQ0o1ERURYQYLDWIbGxE1HgYGJxofRSgBQURIWVRFYVJDSisUBAQiBkFSYlsDDSAGQwAjCQQALwFDHSwdERdhHgwJJltYb2FSQ0hiWVYXJBEMBS8cGgEgBgoHLFtORWMaDB9iDRtFJxsbSCsNVm9hUkNIP3NURRxeaUhiWwcGIB4KBiU4GgQtCxABMVtORTp4Q0hiWVYNLgAKEi0XAAQtIQAJLhgWDC0bFxFgQ1RHMxcCDDtZCEUxExEcKxgYRT1SAQQtGh8AJVBPYmJZVEVjBAYaNhAXBC0+CgUrDRURKB0NG2BDVD5jHgobNlkbA2EEBho2EBcELVIQCyMVHQsmUgAHLBoRFy8BQTVuc1RFYVJBGzYYAAAnBw8GJwoHR3tSOEouEAcRYR0FSDENFREkFBYEYhobCDEdDQ0sDQdFNRoCHGIbGAoiGUMALQsdHy4cFwkuWQcGIB4KBiVbKUlLUkNIYlsHDSAABgwQHAcKNAAADTFbTkUaUAcJNhgWBDIXEERiGhUGKRcQRGIWBkUuBgsNMFkHDSAABgxiGxsRNR4GBicaHxZjL2lIYgRYb2FSQQksDR01IAYXDTAXB0d7UjhiYllURTp4Q0hiWVRFYwICHDYcBgtjSENKDFJFRTAHBhorHAdFPVIQESwaHBcuHAwdMVkXDSAbDRtiBVQLLlIACSERHQsmUh9INxcWCjQcBw0mWQUQJAcGG2IFVAA1EU1KbnNURWFSQ0hgFRsGIAYKByxbTkVjFAoEJ1kbF2ERDAUyFhoALwZBREhZVEVhUkNKJhwHBjMbExwrFhpHe1JBDCcNFQwtAUFESFlURWFSQ0okEAxHe1JBGicaGwgsFw0MIw0dCi9QaUhiWVQYS1JDNW5zVEVjEQILKhAaAmNIQxNIWVRFYVAQHDAYAAAmC0FSYlsaCi8XQxRiFRsGIB5DFGIdHRY1AAoKNw0RAWEOQysGN1QZYR8WBDYQWQkgCwYaYFV+RWFSQ0ohGBcNJD4CEScLB0d7UjhKLhAHEWEdBUghGBcNKBwESC8cFw0gHAobLwpUAy4HDQxgJFhvYVJDSGAeFRUyUFlIGVsDDSQABkghGBcNKBwESDERGxAtFkMKJ1kVASUXB0ofc1RFPF5pSGJbEAQ1EwEJMRwkADMUDBovGBoGJFBZSDlzVEVhUkEBLB0RHSgcBEp4WVYEJRcSHSMNEUU9UgoGMQwSAygRCg0sDVQZYQcNAywWAwtjXmlIYllURzAHBho7KRURNRcRBjFbTkUaUA0HNhgWCSRSEh0nCw1FMRMXHCcLGhZjL09iYllURWMRDAYsHBcRKB0NOC0WGAwvFUFSYhsbCi0XAgZuc1RFYVJBGicYEDckAg8BIRgHR3tSAQctFREEL3hDSD9VfkVhUBENIRYZCCQcBwk2EBsLMlBZSBlbBBcoHREBNhAOACVSEw0wHxsXLBMNCydZHQgxAAweJxQRCzUBQTVIBH5vCBwQHDAMFxEoHQ0beHNFS2E+DAcpWRIKM1IHCTYYFgQyF0MZNxwGHGECAhw2HAYLMlJLJmlIWEUsGxAbKxcTRSgcBw06HAdJYRQWBC5ZAAQjHgZIMRoVCzJbaVpsWTcNJBEISCQWBkUiEwAAKxcTRTIGEQk2HBMMJAFDQBAcEAwyXkMlJxQXBCIaBgxuWR0LbB8GBS0LDUxLQU1ICx0RCzUbBRFiCg0LIhoRBywWARZhEAwcNhURCyQRCBtiURYJLhEIASweVCxuPU9IMRwFECQcFwEjFVQkETtDCyMVGBZoeFdGYjUbCipSBQcwWRcKLxwGCzYQGwthAgwHLhAaAmERDAYkEBMQMxMXAS0XflBvUiAAJxofRScdEUgjCg0LIl0SHScMEUgjExANJlkEFy4RBhsxEBoCYQICHDYcBgsyeFVGYisREygXFEgwHAcKNAAADWIVHQgoBhBIahobCzUTCgYnC1QXJAEMHTAaERZtUhEJNhxUCSgfChwrFxNMS0VNSA4WGw5hFAwaYgkVAigcAhwrFhpFKBxDBCsKAEUkHAcYLRAaETJ4W0ZiOhwAIhlDDi0LVAc0HghILQkRFyAGCgcsClQTMlxDASwdHRMoFhYJLlkXBC0eEGJ7V1QsJRcNHCsfDUUyBgIcJx8BCWERDAUyFhoALwYQSDYRFRFhEA8HIRJUDS4AChItFwAELVIQCyMVHQsmeFJYbFkmADUHEQZiNjopGFIXACdZPjYOPEMHIBMRBjVeQwYtWRsRKRcRSDYcDBE=");
|
|
10
|
+
registerPrompt("premium/security-auditor", "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");
|
|
11
|
+
registerPrompt("pipeline/component-identifier", "GB0WSCMLEUUgHEMNOgkRFzVSEAckDQMEMxdDCTAaHAw1FwAcbFktCjQAQwItG1QMMlIXB2IQEAAvBgoOO1kREyQAGkgjCxcNKAYGCzYMBgQtHhpIMRATCygUCgsjFwBFIh0OGC0XEQs1UgoGYhhUFi4UFx8jCxFFMQAMAicaAEtLeCJIYBobCDEdDQ0sDVZFKAFDCWIdHRY1Gw0LNlkQADEeDBEjGxgAYQcNATZVVBYkABUBIRxYRSACEwQrGhURKB0NRGIVHQczExERblkbF2EBCg8sEBIMIhMNHGIUGwE0HgZGYjAaBi0HBw14c1lFAxMAAycXEEUyFxEeKxoRFm1SIjgLClhFNh0RAycLB29sUiUaLRcAAC8WQwkyCRgMIhMXAS0XB0VpBQYKblkZCiMbDw1rc1lFDRsBGiMLHQAyXRMJIRIVAiQBQ0ArF1QILhwMGicJGxZoeE5IATU9RTUdDAQxc1lFBRMXCSAYBwAyUksBJFkRHTEeCgsrDRgcYREMBiQQExAzFwdEYhxaAm9SCgZiHRsGKhcRRSEWGRUuAQZBSFRUIDkGBhosGBhFMhcRHisaERZhWgZGJVdUNyQWChtuWSYEIxAKHA8oWEUEHgIbNhAXFiQTEQsqUH5vBx0RSCcYFw1hEQwFMhYaAC8GT0gyCxsTKBYGUkhUVAwlSEMDJxsVB2wRAhsnWQcJNBVDQCdXE0ttUkEJMhBZFiQAFQ0wW1hFYwUGCm8fBgovBgYGJltdb2xSDQkvHE5FKQcOCSxUBgAgFgIKLhxUCyAfBmJvWQAcMRdZSC0XEUUuFENKJAsbCzUXDQxgVVRHIAIKSm5ZVhYkABUBIRxWSWFQFAcwEhEXY15DSi4QFhcgABpKbllWBi0bQURiWxAENRMBCTEcVklhUAQJNhwDBDhQT0hgGhUGKRdBRGJbBRAkBwZKSFRUCSALBhp4WRsLJFIMDmJbBBckAQYGNhgADC4cQURiWxUVMR4KCyMNHQovUE9IYB0VESBQT0hgHAwRJAANCS5bfkhhAgIcKkNUFyQeAhwrDxFFJRsRDSENGxc4UhMJNhFUTSRcBEZuWVYWJAAVDTBbWEVjExMYMVYDACNQSmJvWRAAMhERATINHQovSENZb0tUFiQcFw0sGhFFJRcQCzAQBBEoHQ1ILR9UFTQAEwcxHH5IYQYGCyoXGwkuFQoNMUNUBDMAAhFiFhJFKhcaSDYcFw0vHQ8HJRARFmFaBkYlV1hFGlA3ETIcJwYzGxMcYFVURwQKExonCgdHbVJBOC0KAAIzFzA5DlspTEt4MQ0xCRsLJVIUATYRVCoPPjpII1k+Ng48QwcgExEGNUhDE2JbFwosAgwGJxcAFmNIQzNsV1o4YQ8=");
|
|
12
|
+
registerPrompt("pipeline/connection-mapper", "GB0WSCMLEUUgHEMNOgkRFzVSEAckDQMEMxdDCTAaHAw1FwAcbFktCjQAQwItG1QMMlIXB2IUFRVhMy8kYhobCy8XABwrFhoWYRAGHDUcEQthEQwFMhYaAC8GEEgrF1QEYQEMDjYOFRckUhARMQ0RCG94aSstFxoAIgYKByxZABwxFxBSSFRURygfEwcwDVZfYRYKGicaAEUiHQcNYhAZFS4AF0cmHAQALxYGBiEAfkhhUAscNglWX2EgJjsWVhM3ETFMIBYtJEUiEw8EMXNZRWMWAhwjGxUWJFBZSCEWGRUuHAYGNlkGACAWEEc1Cx0RJAFDHC1ZFUUlExcJIBgHAEtfQ0onDxELNVBZSCMKDQsiUgYeJxcASiwXEBsjHhFFaQIWCm0KAQdtUhIdJwwRFmh4TkhgHgYVIlBZSCUrJCZhEQIELgp+SGFQFA0gChsGKhcXSnhZIwAjIQwLKRwARSIdDQYnGgAMLhwQYm9ZVgMoHgZKeFkHDSAABgxiHx0JJAEaGzYcGUUgEQANMQp+bwcdEUgnGBcNYREMBiwcFxEoHQ1SSFRUAzMdDlJiChsQMxEGSCEWGRUuHAYGNlk9IWFaDh0xDVQIIAYAAGIYGkUkCgobNhAaAmERDAUyFhoALwZDIQZZER0gERcEO1B+SGEGDFJiDRUXJhcXSCEWGRUuHAYGNlk9IWFaDh0xDVQIIAYAAGIYGkUkCgobNhAaAmERDAUyFhoALwZDIQZZER0gERcEO1B+SGEGGhgnQ1QKLxdDByRZAA0kUhcRMhwHRSAQDB4nc1lFJRcQCzAQBBEoHQ1SYhsGDCQUQwwnChcXKAIXAS0XVAonUhcAJ1kGAC0TFwEtFwcNKAJpRWIYBxwvEVlINgsBAGEbBUgjCg0LIhoRBywWARZhWgYeJxcAFm1SEh0nDBEWaHhpKS4KG0UoFgYGNhASHGFYSQ4uFgMWa1hDisLtVAAvFk4cLVQRCyVSEQ0zDBEWNVITCTYRB0U1GhEHNx4cRTUaBkgxAAcRJB9ZYm9ZGgQsF1lIJBUbEmEcAgUnWVwAbxVNRGJbIRYkAEM6Jx4dFjUAAhwrFhpHaHhOSCYcBwYzGxMcKxYaX2EFCwk2WRwEMQIGBjFzWUUyBgYYMUNUBDMAAhFiFhJFMgYRASweB0lhFwILKlkxPQAxNyQbWR0LYQYLDWIfGxcsExdIYBobCDEdDQ0sDT0BYZDl+mIaGwgxHQ0NLA09AWNSSw1sHlpJYVAUDSBUEhcuHBcNLB1Uh8fgQwkyEFkWJAAVDTBbWEVjExMBbwoRFzcXEUig/+ZFMR0QHCULERYwHkFBbFkxBCIaQxs2HARFLAcQHGIaGws1EwoGYhwMBCIGDxFiFhoAYZDl+mIYBhcuBUMfKw0cRSBSFQkuEBBFIh0OGC0XEQs1UiosYhYaRSQTAABiCh0BJFxDLC1ZOioVUhYbJ1kSFyQXThwnAQBFJRcQCzAQBBEoHQ0bYhgHRTIGBhgxV35vCD8zJxAtNSsVSEM9MRxUESkXQy0aODcxYREMBTIWGgAvBkMhBgpUAzMdDkg2ERFFIh0OGC0XEQs1AUMEKwoAS2E3FQ0wAFQDMx0ORzYWVAwvUgAHLBcRBjUbDAYxWTUrBVIGHicLDUUiHQ4YLRcRCzVSKixiEBpFJx4MH2IKAAAxAUMFNwoARTMXBQ0wHBoGJFICSDQYGAwlUgAHLwkbCyQcF0gLPVQDMx0OSDYREUUtGxAcYhgWCjcXTUgGFlQrDiZDASwPEQs1UgAHLwkbCyQcF0gLPQdFLgBDHTEcVAMzFwZFNhwMEWEWBhshCx0VNRsMBjFXfm8TFxAYLRcQRTYbFwBiNjopGFICSAgqOythHQECJxoAX0sJaUhiWxcKLxwGCzYQGwsyUFlIGVdaSxxeaUhiWxIJLgUQSnhZL0tvXD5iPw==");
|
|
13
|
+
registerPrompt("pipeline/flow-detector", "GB0WSCMLEUUgHEMNOgkRFzVSEAckDQMEMxdDCTAaHAw1FwAcbFk1CyAeGhInWQANJFITGi0TEQY1UgAHLA0RHTVSAgYmWR0BJBwXASQATm9LQ01IaFMREyQcFystFxoAIgYKBywKXk97UiYeJxcASCUACh4nF1QGLh8OHSwQFwQ1GwwGYgkVETUXEQYxWVwIJAEQCSUcVBQ0FxYNMVVUFTQQTBs3G1hFNhcBAC0WHxZtUgYeJxcARSQfChw2HAYWaFxpSGJZMgozUgYJIRFORTpSEx0gFR0WKRcRRGIKAQcyEREBIBwGSWERCwksFxEJbVIXDSERGgotHQQRYgR+RWFSTkgyDBYJKAELDTBWBxAjAQAaKxsRF3tSAAcvCRsLJBwXSAs9B0VpGQYKIxtZBiABBkgxFQECMltpSGJZWUUiGgIGLBwYX2EXFQ0sDVsRLgIKC20IAQA0F0MGIxQRb2FSQ0ViDREGKRwMBC0eDV9hBgsNYgoEACIbBQEhWQAAIhoNBy4WExxhBxANJllcAG8VTURiWxETJBwXRScUHRE1FxFKbllWEiQQCwctElZMS3hRRmJTXgQxGzEHNw0RFmtYWUgDKT1FMx0WHCcKWwAvFhMHKxcAFmEWBhwnGgAAJVIFGi0UVAYuFgZIMhgAESQADRtsc1RFYTQMGmIcFQYpSEMTYgkVESleQwUnDRwKJV5DACMXEAkkACUBLhxUGEt4IDoLLT0mAD5ZSA0XGBxhAAYYLQsARSQEBgY2WRcKLxwGCzYQGwsyUgIGJlkGCjQGBhtiDRwENVILCTQcVCYOPCA6By0xRQQkKiwHNzcgYRsNSDYREUUxAAweKx0RAWERDAwnWQcELAIPDTFVVBY1ExcBIVkHBiAcDQ0wWQYAMgcPHDFVVAozUicHIRIRF2EBBho0EBcAMlxDISRZAA0kUhAcIw0dBmEBAAksFxEXYQECETFZVisuUgYeJxcASCUACh4nF1QVIAYXDTAXB0UlFxcNIQ0RAWNeQxonDQEXL1IGBTINDUUkBAYGNjobCy8XABwrFhoWb1InB2I3OzFhGw0eJxcARTETFxwnCxoWYQYLCTZZFRckUg0HNlkREygWBgYhHBBFKBxDHCocVAwvAhYcbHN+NyQBEwcsHVQSKAYLSA03ODxhE0MiETY6RS4QCQ0hDU5vOnhDSGAcAgAvBiAHLBcRBjUbDAYxW05FGlxNRh9VfkVhUAIYKysbEDUXEEp4WS9Lb1w+Yj9zfiwnUg0HYgkVETUXEQYxWRIKNBwHRGILERE0AA1IJxQEEThSAhowGA0Wbw==");
|
|
14
|
+
registerPrompt("pipeline/service-describer", "GB0WSCMLEUUgHEMNOgkRFzVSEAckDQMEMxdDCTAaHAw1FwAcbFk1CyAeGhInWQANJFITGi0TEQY1UgAHLA0RHTVSAgYmWR0BJBwXASQATm9LQ01IaFMEFy4YBgs2PREWIgAKGDYQGwtrWFlIA1kXCSQTEUhwVEdFMhcNHCcXFwBhFgYbIQsdFTUbDAZiFhJFNhoCHGINHAwyUhMaLRMRBjVSBwcnClpvc1xDQmgJBgwsExERDhgaAjQTBA1oU05FFRoGSC8YHQthAhEHJQsVCCwbDQ9iFRULJgcCDydZXABvFU1EYlsgHDEXMAswEAQRY15DShIAAA0uHEFEYlszCmNeQ0oQDAcRY1tNYnFXVE9rFgIcIxsVFiQBSUJ4WTAENRMBCTEcB0U0AQYMYhAaRTUaChtiCQYKKxcAHGxzQEthWEkNOg0RFy8TDzsnCwIMIhcQQmhDVCA5BgYaLBgYRTIXER4rGhEWbjMzITFZFwovARYFJx1UBzhSFwArClQVMx0JDSENWm9LNAwaYh0VESAQAhsnClQELxZDDToNERcvEw87JwsCDCIXEERiCQYKNxsHDXhzWUUoFllIKRwWBCNfAAkxHFQWLQcEYm9ZGgQsF1lIKgwZBC9fEQ0jHRUHLRdDBiMUEW9sUhcRMhxORTUXAAAsFhgKJgtDHDsJEUVpF00PbFVURzEdEBwlCxEWMB5BRGJbBgAlGxBKbllWFjUAChgnW11vbFIHDTEaBgwxBgoHLENUEikTF0grDVMWYQcQDSZZEgozeE5INwoRAQMLWUgjCwYEOFIMDmIaGwgxHQ0NLA1ULAUBQxwqGABFNAEGSDYRHRZhWhYbJ1kfACMTAUUhGAcAYQEPHSUKVAggBgAAKxcTRTUaBkghFhkVLhwGBjZZGgQsFxBBSHM3NwgmKisDNU5FDhwPEWIQGgYtBwcNYh0VESAQAhsnClQELxZDDToNERcvEw9IMRwGEygRBhtiDRwENVILCTQcVCYOPCA6By0xRQQkKiwHNzcgYRsNSDYREUUiHQcNIBgHAHt4TkgSGBcOIBUGRyYcBAAvFgYGIQBUDCwCDBo2ClRNJFwERm5ZVhUmUE9IYAsRASgBQURiWwcRMxsTDWBVVEcBExQbbwoQDm4RDwEnFwBIMkFBQUhUVCAvBAoaLRcZAC8GQx4jCx0EIx4GG2ILEQMkAAYGIRAaAmEGCw0vWVwAbxVNRGI9NTEAMCI7ByYhNw1eQzoHPT02HicxJG5ZJzETOzMtHSoxJhM3NzcJPC1MS19DLC0aHwAzUiAHLwkbFiRSEA0wDx0GJAFDHysNHEUsExcLKhAaAmEbDgklHAdvbFIgBywfHQI0AAIcKxYaRScbDw0xWQYAJxcRDSwaHQsmUhcAJxR+SGE2ChonGgBFNAECDydZHQthEQwMJ1kHBCwCDw0xWQQXLgQKDCcdfm8FHUMmDS1UAjQXEBtiFgZFKBwFDTBZBwAzBAoLJwpUESkTF0gvEBMNNVIBDWIMBwAnBw9GYj0bRQ89N0grFxcJNBYGSDEcBhMoEQYbYhMBFjVSAQ0hGAEWJFIXACdZBBcuGAYLNllWBi4HDwxgWQEWJFIXACcUWkUIFEMcKhwGAGEbEEgsFlQGLhwAGicNEUUkBAoMJxcXAG1SBwdiFxsRYRsNCy4MEABhGxdGSHMmADICDAYmWQMMNRpDJww1LUUgUik7DTdUCiMYBgs2WRkENRELASweVBEpGxBIMRocACwTWWI5c1RFYwIRBygcFxEFFxALMBAEESgdDUp4WVZLb1xBREhZVEcxAAoFIwsNKSAcBB0jHhFHe1JBRmxXVklLUkNKJhgABCMTEA0xW05FGlxNRh9VfkVhUAYQNhwGCyAeMA0wDx0GJAFBUmIiWktvL2kV");
|
|
15
|
+
registerPrompt("pipeline/validator", "GB0WSCMLEUUgUhAHJA0DBDMXQwkwGhwMNRcAHDcLEUUzFxUBJw4RF29SNQkuEBAENRdDHCocVAQvEw8RMRAHRTMXEB0uDQdFIBwHSDEMEwIkARdIIRYGFyQRFwEtFwdLS3ggACcaH0UnHRFSSEhaRWtYLBoyERULYREMBTIWGgAvBhBCaENUJi4fEwcsHBoRMlIUATYRVB8kAAxIIRYaCyQRFwEtFwdFNRoCHGIKHAo0HgdIIBxUBi4cDQ0hDREBS0BNSGhTIxcuHARIIRYZFS4cBgY2WQAcMRcQQmhDVABvFU1EYhhUNyQTABxiGAQVYQYaGCcdVAQyUkEbJwsCDCIXQUgxERsQLRZDCidZVgMzHQ0cJxcQR0tBTUhoUzkMMgEKBiVZFwovHAYLNhAbCzJYSVJiNhYTKB0WG2ILEQkgBgoHLAocDDEBQwYtDVQGIAIXHTAcEG91XENCaC4RBCpSBw0xGgYMMQYKBywKXk97UiAHLwkbCyQcFxtiDh0RKVIGBTINDUUuAEMdLBoYACAAQwwnChcXKAIXAS0XB0Wj8vdIMgsbEygWBkggHAARJABDBywcB290XENCaD0BFS0bAAk2HFsXJBYWBiYYGhFhEQwFMhYaAC8GEEJoQ1QmLh8TBywcGhEyUhcAIw1UFikdFgQmWRYAYR8GGiUcEG9LIAYbMhYaAWEFChwqWTsrDStDCWIzJyoPUgwKKBwXEXt4GGJiWVYGLh8TBywcGhEVCxMNARYGFyQRFwEtFwdHe1IYSGAaGwgxHQ0NLA1ZDCVQWUhgGhsXMxcAHG8NDRUkUEMVbnNURWMRDAUyFhoALwYnDTEaBgwxBgoHLApWX2EJQ0ohFhkVLhwGBjZUHQFjSENKIBwAESQAQwwnChcXKAIXAS0XVkU8XmlIYlsVASUXBystFxoAIgYKBywKVl9hKRhIYB8GCixQWUhgEBBHbVJBHC1bTkVjGwdKbllWETgCBkp4WVYROAIGSm5ZVgEkAQAaKwkADC4cQVJiWxAAMhFBRGJbFRY4HABKeFkSBC0BBkg/JFhvYVJBGicUGxMkFiAHLBcRBjUbDAYJHA0WY0hDM2AfBgosSFkcLUNOETgCBkofVX5FYVAABywfHQEkHAANYENUVW9KVkRIWVRHKAEQHScKVl9hKUEMJwoXFygCFwEtF1QKJ1ICBjtZBgAsEwoGKxcTRSgBEB0nClY4Sw9pYhcKEUUkHxMcO1kbBysXABwxVhUXMxMaG2IQEkUvHUMLLQsGACIGCgcsClQLJBcHDSZXVDEpF0MLLRcSDCUXDQsnWQcGLgAGSGpJWVRoUhENJBURBjUBQxEtDAZFLgQGGiMVGEUiHQ0OKx0RCyIXQwEsWQANJFICBiMVDRYoAUMZNxgYDDULTQ==");
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env npx tsx
|
|
2
|
+
/**
|
|
3
|
+
* Build-time utility: Encodes agent system prompts with XOR obfuscation.
|
|
4
|
+
* Run: npx tsx agents/prompts-encode.ts
|
|
5
|
+
*
|
|
6
|
+
* Reads plain-text prompt from stdin or argument and outputs the encoded base64 string.
|
|
7
|
+
* Usage: echo "Your prompt text" | npx tsx agents/prompts-encode.ts
|
|
8
|
+
*/
|
|
9
|
+
export declare function encode(text: string): string;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#!/usr/bin/env npx tsx
|
|
2
|
+
/**
|
|
3
|
+
* Build-time utility: Encodes agent system prompts with XOR obfuscation.
|
|
4
|
+
* Run: npx tsx agents/prompts-encode.ts
|
|
5
|
+
*
|
|
6
|
+
* Reads plain-text prompt from stdin or argument and outputs the encoded base64 string.
|
|
7
|
+
* Usage: echo "Your prompt text" | npx tsx agents/prompts-encode.ts
|
|
8
|
+
*/
|
|
9
|
+
const K = [0x41, 0x72, 0x63, 0x68, 0x42, 0x79, 0x74, 0x65]; // "ArchByte"
|
|
10
|
+
export function encode(text) {
|
|
11
|
+
const buf = Buffer.from(text, "utf-8");
|
|
12
|
+
const out = Buffer.alloc(buf.length);
|
|
13
|
+
for (let i = 0; i < buf.length; i++) {
|
|
14
|
+
out[i] = buf[i] ^ K[i % K.length];
|
|
15
|
+
}
|
|
16
|
+
return out.toString("base64");
|
|
17
|
+
}
|
|
18
|
+
// If run directly, encode stdin
|
|
19
|
+
if (process.argv[1]?.endsWith("prompts-encode.ts")) {
|
|
20
|
+
let input = "";
|
|
21
|
+
process.stdin.setEncoding("utf-8");
|
|
22
|
+
process.stdin.on("data", (chunk) => { input += chunk; });
|
|
23
|
+
process.stdin.on("end", () => {
|
|
24
|
+
console.log(encode(input));
|
|
25
|
+
});
|
|
26
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Prompt Store — Obfuscated
|
|
3
|
+
*
|
|
4
|
+
* System prompts are XOR-encoded so they don't appear as plaintext strings
|
|
5
|
+
* in compiled JavaScript. This prevents casual extraction via grep, strings,
|
|
6
|
+
* or code browsing. Not cryptographically secure — a determined reverse
|
|
7
|
+
* engineer can still extract them — but raises the bar significantly.
|
|
8
|
+
*
|
|
9
|
+
* To add/update a prompt: run `npx tsx agents/prompts-encode.ts`
|
|
10
|
+
*/
|
|
11
|
+
export declare function getPrompt(id: string): string;
|
|
12
|
+
export declare function registerPrompt(id: string, encoded: string): void;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Prompt Store — Obfuscated
|
|
3
|
+
*
|
|
4
|
+
* System prompts are XOR-encoded so they don't appear as plaintext strings
|
|
5
|
+
* in compiled JavaScript. This prevents casual extraction via grep, strings,
|
|
6
|
+
* or code browsing. Not cryptographically secure — a determined reverse
|
|
7
|
+
* engineer can still extract them — but raises the bar significantly.
|
|
8
|
+
*
|
|
9
|
+
* To add/update a prompt: run `npx tsx agents/prompts-encode.ts`
|
|
10
|
+
*/
|
|
11
|
+
const K = [0x41, 0x72, 0x63, 0x68, 0x42, 0x79, 0x74, 0x65]; // "ArchByte"
|
|
12
|
+
function d(encoded) {
|
|
13
|
+
const buf = Buffer.from(encoded, "base64");
|
|
14
|
+
const out = Buffer.alloc(buf.length);
|
|
15
|
+
for (let i = 0; i < buf.length; i++) {
|
|
16
|
+
out[i] = buf[i] ^ K[i % K.length];
|
|
17
|
+
}
|
|
18
|
+
return out.toString("utf-8");
|
|
19
|
+
}
|
|
20
|
+
// Prompt registry — populated by prompts-encode.ts
|
|
21
|
+
const store = new Map();
|
|
22
|
+
export function getPrompt(id) {
|
|
23
|
+
const encoded = store.get(id);
|
|
24
|
+
if (!encoded)
|
|
25
|
+
throw new Error(`Unknown prompt: ${id}`);
|
|
26
|
+
return d(encoded);
|
|
27
|
+
}
|
|
28
|
+
export function registerPrompt(id, encoded) {
|
|
29
|
+
store.set(id, encoded);
|
|
30
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { LLMProvider, ChatParams, LLMResponse, LLMChunk } from "../runtime/types.js";
|
|
2
|
+
export declare class AnthropicProvider implements LLMProvider {
|
|
3
|
+
name: "anthropic";
|
|
4
|
+
private client;
|
|
5
|
+
constructor(apiKey: string);
|
|
6
|
+
chat(params: ChatParams): Promise<LLMResponse>;
|
|
7
|
+
stream(params: ChatParams): AsyncIterable<LLMChunk>;
|
|
8
|
+
private toAnthropicBlock;
|
|
9
|
+
private fromAnthropicBlock;
|
|
10
|
+
}
|