heron-ai 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.
Files changed (92) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +423 -0
  3. package/dist/bin/heron.d.ts +3 -0
  4. package/dist/bin/heron.d.ts.map +1 -0
  5. package/dist/bin/heron.js +198 -0
  6. package/dist/bin/heron.js.map +1 -0
  7. package/dist/src/analysis/analyzer.d.ts +14 -0
  8. package/dist/src/analysis/analyzer.d.ts.map +1 -0
  9. package/dist/src/analysis/analyzer.js +130 -0
  10. package/dist/src/analysis/analyzer.js.map +1 -0
  11. package/dist/src/analysis/risk-scorer.d.ts +20 -0
  12. package/dist/src/analysis/risk-scorer.d.ts.map +1 -0
  13. package/dist/src/analysis/risk-scorer.js +143 -0
  14. package/dist/src/analysis/risk-scorer.js.map +1 -0
  15. package/dist/src/config/loader.d.ts +15 -0
  16. package/dist/src/config/loader.d.ts.map +1 -0
  17. package/dist/src/config/loader.js +39 -0
  18. package/dist/src/config/loader.js.map +1 -0
  19. package/dist/src/config/schema.d.ts +146 -0
  20. package/dist/src/config/schema.d.ts.map +1 -0
  21. package/dist/src/config/schema.js +27 -0
  22. package/dist/src/config/schema.js.map +1 -0
  23. package/dist/src/connectors/http-connector.d.ts +17 -0
  24. package/dist/src/connectors/http-connector.d.ts.map +1 -0
  25. package/dist/src/connectors/http-connector.js +56 -0
  26. package/dist/src/connectors/http-connector.js.map +1 -0
  27. package/dist/src/connectors/index.d.ts +5 -0
  28. package/dist/src/connectors/index.d.ts.map +1 -0
  29. package/dist/src/connectors/index.js +13 -0
  30. package/dist/src/connectors/index.js.map +1 -0
  31. package/dist/src/connectors/interactive-connector.d.ts +13 -0
  32. package/dist/src/connectors/interactive-connector.d.ts.map +1 -0
  33. package/dist/src/connectors/interactive-connector.js +44 -0
  34. package/dist/src/connectors/interactive-connector.js.map +1 -0
  35. package/dist/src/connectors/types.d.ts +15 -0
  36. package/dist/src/connectors/types.d.ts.map +1 -0
  37. package/dist/src/connectors/types.js +2 -0
  38. package/dist/src/connectors/types.js.map +1 -0
  39. package/dist/src/index.d.ts +12 -0
  40. package/dist/src/index.d.ts.map +1 -0
  41. package/dist/src/index.js +60 -0
  42. package/dist/src/index.js.map +1 -0
  43. package/dist/src/interview/interviewer.d.ts +19 -0
  44. package/dist/src/interview/interviewer.d.ts.map +1 -0
  45. package/dist/src/interview/interviewer.js +68 -0
  46. package/dist/src/interview/interviewer.js.map +1 -0
  47. package/dist/src/interview/protocol.d.ts +38 -0
  48. package/dist/src/interview/protocol.d.ts.map +1 -0
  49. package/dist/src/interview/protocol.js +290 -0
  50. package/dist/src/interview/protocol.js.map +1 -0
  51. package/dist/src/interview/questions.d.ts +20 -0
  52. package/dist/src/interview/questions.d.ts.map +1 -0
  53. package/dist/src/interview/questions.js +131 -0
  54. package/dist/src/interview/questions.js.map +1 -0
  55. package/dist/src/llm/client.d.ts +13 -0
  56. package/dist/src/llm/client.d.ts.map +1 -0
  57. package/dist/src/llm/client.js +128 -0
  58. package/dist/src/llm/client.js.map +1 -0
  59. package/dist/src/llm/prompts.d.ts +13 -0
  60. package/dist/src/llm/prompts.d.ts.map +1 -0
  61. package/dist/src/llm/prompts.js +192 -0
  62. package/dist/src/llm/prompts.js.map +1 -0
  63. package/dist/src/report/generator.d.ts +23 -0
  64. package/dist/src/report/generator.d.ts.map +1 -0
  65. package/dist/src/report/generator.js +304 -0
  66. package/dist/src/report/generator.js.map +1 -0
  67. package/dist/src/report/templates.d.ts +3 -0
  68. package/dist/src/report/templates.d.ts.map +1 -0
  69. package/dist/src/report/templates.js +386 -0
  70. package/dist/src/report/templates.js.map +1 -0
  71. package/dist/src/report/types.d.ts +954 -0
  72. package/dist/src/report/types.d.ts.map +1 -0
  73. package/dist/src/report/types.js +161 -0
  74. package/dist/src/report/types.js.map +1 -0
  75. package/dist/src/server/index.d.ts +17 -0
  76. package/dist/src/server/index.d.ts.map +1 -0
  77. package/dist/src/server/index.js +650 -0
  78. package/dist/src/server/index.js.map +1 -0
  79. package/dist/src/server/sessions.d.ts +68 -0
  80. package/dist/src/server/sessions.d.ts.map +1 -0
  81. package/dist/src/server/sessions.js +268 -0
  82. package/dist/src/server/sessions.js.map +1 -0
  83. package/dist/src/util/id.d.ts +2 -0
  84. package/dist/src/util/id.d.ts.map +1 -0
  85. package/dist/src/util/id.js +5 -0
  86. package/dist/src/util/id.js.map +1 -0
  87. package/dist/src/util/logger.d.ts +9 -0
  88. package/dist/src/util/logger.d.ts.map +1 -0
  89. package/dist/src/util/logger.js +32 -0
  90. package/dist/src/util/logger.js.map +1 -0
  91. package/heron.example.yaml +46 -0
  92. package/package.json +40 -0
@@ -0,0 +1,130 @@
1
+ import { analysisResultSchema } from '../report/types.js';
2
+ import { ANALYSIS_SYSTEM_PROMPT, buildAnalysisPrompt } from '../llm/prompts.js';
3
+ import * as logger from '../util/logger.js';
4
+ /**
5
+ * Uses LLM to analyze the interview transcript and produce a structured audit.
6
+ * Validates output with Zod schema. Retries once on parse failure.
7
+ * Falls back to partial report on double failure.
8
+ */
9
+ export async function analyzeTranscript(llmClient, transcript) {
10
+ // Note: caller shows "⏳ Analyzing transcript..." already
11
+ const prompt = buildAnalysisPrompt(transcript);
12
+ // Attempt 1
13
+ let parsed = await tryParse(llmClient, prompt);
14
+ // Attempt 2 (retry) if first attempt failed
15
+ if (!parsed) {
16
+ logger.warn('First analysis attempt failed, retrying...');
17
+ parsed = await tryParse(llmClient, prompt);
18
+ }
19
+ // Double failure — partial report fallback
20
+ if (!parsed) {
21
+ logger.warn('Double parse failure, using partial report fallback');
22
+ return buildFallbackAnalysis(transcript);
23
+ }
24
+ // Note: caller shows the final summary with computed risk level
25
+ // Derive legacy flat fields from per-system data
26
+ return enrichWithLegacyFields(parsed);
27
+ }
28
+ async function tryParse(llmClient, prompt) {
29
+ try {
30
+ const response = await llmClient.chat(ANALYSIS_SYSTEM_PROMPT, prompt);
31
+ // Strip markdown fences if present
32
+ let jsonStr = response.trim();
33
+ if (jsonStr.startsWith('```')) {
34
+ jsonStr = jsonStr.replace(/^```(?:json)?\n?/, '').replace(/\n?```$/, '');
35
+ }
36
+ // Try to extract JSON if mixed with text
37
+ if (!jsonStr.startsWith('{')) {
38
+ const jsonMatch = jsonStr.match(/\{[\s\S]*\}/);
39
+ if (jsonMatch) {
40
+ jsonStr = jsonMatch[0];
41
+ }
42
+ }
43
+ const raw = JSON.parse(jsonStr);
44
+ // Zod validation — parse with defaults and coercion
45
+ const result = analysisResultSchema.parse(raw);
46
+ return result;
47
+ }
48
+ catch (e) {
49
+ logger.warn(`Parse attempt failed: ${e instanceof Error ? e.message : String(e)}`);
50
+ return null;
51
+ }
52
+ }
53
+ /**
54
+ * Derive legacy flat AccessAssessment and DataNeed[] from per-system data.
55
+ * This keeps backward compatibility with report templates and risk scorer.
56
+ */
57
+ function enrichWithLegacyFields(parsed) {
58
+ const dataNeeds = [];
59
+ const claimed = [];
60
+ const actuallyNeeded = [];
61
+ const excessive = [];
62
+ const missing = [];
63
+ for (const sys of parsed.systems) {
64
+ // DataNeeds from dataSensitivity
65
+ dataNeeds.push({
66
+ dataType: sys.dataSensitivity,
67
+ system: sys.systemId,
68
+ justification: sys.frequencyAndVolume,
69
+ });
70
+ // Claimed access
71
+ for (const scope of sys.scopesRequested) {
72
+ claimed.push({
73
+ resource: sys.systemId,
74
+ accessLevel: scope,
75
+ justification: 'Requested by agent',
76
+ });
77
+ }
78
+ // Actually needed
79
+ for (const scope of sys.scopesNeeded) {
80
+ actuallyNeeded.push({
81
+ resource: sys.systemId,
82
+ accessLevel: scope,
83
+ justification: 'Minimum needed for stated tasks',
84
+ });
85
+ }
86
+ // Excessive (delta)
87
+ for (const scope of sys.scopesDelta) {
88
+ excessive.push({
89
+ resource: sys.systemId,
90
+ accessLevel: scope,
91
+ justification: 'Not needed for stated tasks',
92
+ });
93
+ }
94
+ }
95
+ return {
96
+ ...parsed,
97
+ dataNeeds,
98
+ accessAssessment: { claimed, actuallyNeeded, excessive, missing },
99
+ };
100
+ }
101
+ function buildFallbackAnalysis(transcript) {
102
+ // Extract useful data directly from transcript
103
+ const nonRepeated = transcript.filter(qa => !qa.answer.startsWith('[REPEATED RESPONSE]'));
104
+ const purposeAnswers = nonRepeated
105
+ .filter(qa => qa.category === 'purpose')
106
+ .map(qa => qa.answer)
107
+ .join(' ');
108
+ const allAnswers = nonRepeated.map(qa => qa.answer).join(' ');
109
+ // Try to build a useful summary from actual answers
110
+ const summary = nonRepeated.length > 0
111
+ ? `Automated analysis failed. The agent provided ${nonRepeated.length} substantive answers out of ${transcript.length} questions. Review the transcript below for details.`
112
+ : 'Automated analysis failed and the agent did not provide substantive answers. Manual review required.';
113
+ return {
114
+ summary,
115
+ agentPurpose: purposeAnswers.slice(0, 500) || 'Could not determine — see transcript',
116
+ systems: [], // Don't show fake systems
117
+ risks: [],
118
+ recommendations: ['Automated analysis was unable to process the transcript. Review the interview answers manually.'],
119
+ recommendation: 'APPROVE WITH CONDITIONS',
120
+ overallRiskLevel: 'medium',
121
+ dataNeeds: [],
122
+ accessAssessment: {
123
+ claimed: [],
124
+ actuallyNeeded: [],
125
+ excessive: [],
126
+ missing: [],
127
+ },
128
+ };
129
+ }
130
+ //# sourceMappingURL=analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../../src/analysis/analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Risk, SystemAssessment, Severity } from '../report/types.js';
2
+ export interface RiskScore {
3
+ overall: Severity;
4
+ score: number;
5
+ breakdown: {
6
+ excessiveAccess: number;
7
+ writeRisk: number;
8
+ sensitiveData: number;
9
+ scopeCreep: number;
10
+ };
11
+ }
12
+ /**
13
+ * Rubric-driven risk scorer.
14
+ * Computes risk from structured per-system data, not keyword-grepping risk descriptions.
15
+ *
16
+ * Inputs: per-system assessments + LLM-identified risks.
17
+ * Each component scores 0-100, then weighted sum → overall 0-100 → severity level.
18
+ */
19
+ export declare function computeRiskScore(systems: SystemAssessment[], risks: Risk[]): RiskScore;
20
+ //# sourceMappingURL=risk-scorer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk-scorer.d.ts","sourceRoot":"","sources":["../../../src/analysis/risk-scorer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAe,MAAM,oBAAoB,CAAC;AAExF,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,QAAQ,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE;QACT,eAAe,EAAE,MAAM,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AA6BD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,gBAAgB,EAAE,EAC3B,KAAK,EAAE,IAAI,EAAE,GACZ,SAAS,CAyBX"}
@@ -0,0 +1,143 @@
1
+ // ─── Rubric weights ─────────────────────────────────────────────────────────
2
+ const WEIGHTS = {
3
+ excessiveAccess: 0.35,
4
+ writeRisk: 0.30,
5
+ sensitiveData: 0.20,
6
+ scopeCreep: 0.15,
7
+ };
8
+ // ─── Blast radius severity multiplier ────────────────────────────────────────
9
+ const BLAST_RADIUS_MULTIPLIER = {
10
+ 'single-record': 0.2,
11
+ 'single-user': 0.4,
12
+ 'team-scope': 0.6,
13
+ 'org-wide': 0.85,
14
+ 'cross-tenant': 1.0,
15
+ };
16
+ // ─── Sensitivity keywords for scoring ────────────────────────────────────────
17
+ const SENSITIVE_KEYWORDS = [
18
+ 'pii', 'personal', 'credential', 'confidential', 'financial',
19
+ 'password', 'secret', 'token', 'ssn', 'credit card', 'health',
20
+ 'medical', 'salary', 'compensation',
21
+ ];
22
+ /**
23
+ * Rubric-driven risk scorer.
24
+ * Computes risk from structured per-system data, not keyword-grepping risk descriptions.
25
+ *
26
+ * Inputs: per-system assessments + LLM-identified risks.
27
+ * Each component scores 0-100, then weighted sum → overall 0-100 → severity level.
28
+ */
29
+ export function computeRiskScore(systems, risks) {
30
+ const breakdown = {
31
+ excessiveAccess: scoreExcessiveAccess(systems),
32
+ writeRisk: scoreWriteRisk(systems),
33
+ sensitiveData: scoreSensitiveData(systems),
34
+ scopeCreep: scoreScopeCreep(systems),
35
+ };
36
+ const rawScore = breakdown.excessiveAccess * WEIGHTS.excessiveAccess +
37
+ breakdown.writeRisk * WEIGHTS.writeRisk +
38
+ breakdown.sensitiveData * WEIGHTS.sensitiveData +
39
+ breakdown.scopeCreep * WEIGHTS.scopeCreep;
40
+ // Escalation: if multiple HIGH-severity risks from LLM analysis, bump up
41
+ const highOrCriticalRisks = risks.filter(r => r.severity === 'high' || r.severity === 'critical');
42
+ const escalation = highOrCriticalRisks.length >= 2 ? 10 : 0;
43
+ const score = Math.min(100, Math.round(rawScore + escalation));
44
+ return {
45
+ overall: scoreToLevel(score),
46
+ score,
47
+ breakdown,
48
+ };
49
+ }
50
+ /**
51
+ * Excessive access: ratio of excessive scopes to total requested across all systems.
52
+ * Weighted by blast radius of each system.
53
+ */
54
+ function scoreExcessiveAccess(systems) {
55
+ if (systems.length === 0)
56
+ return 0;
57
+ let totalWeighted = 0;
58
+ let totalRequested = 0;
59
+ for (const sys of systems) {
60
+ const requested = sys.scopesRequested.length || 1;
61
+ const excessive = sys.scopesDelta.length;
62
+ const multiplier = BLAST_RADIUS_MULTIPLIER[sys.blastRadius] ?? 0.5;
63
+ totalWeighted += (excessive / requested) * multiplier * 100;
64
+ totalRequested++;
65
+ }
66
+ return Math.min(100, Math.round(totalWeighted / totalRequested));
67
+ }
68
+ /**
69
+ * Write risk: based on write operations across all systems.
70
+ * Considers reversibility, approval requirements, blast radius, and volume.
71
+ */
72
+ function scoreWriteRisk(systems) {
73
+ if (systems.length === 0)
74
+ return 0;
75
+ let maxWriteScore = 0;
76
+ for (const sys of systems) {
77
+ const multiplier = BLAST_RADIUS_MULTIPLIER[sys.blastRadius] ?? 0.5;
78
+ for (const write of sys.writeOperations) {
79
+ let writeScore = 40; // base: writes exist
80
+ if (!write.reversible)
81
+ writeScore += 30; // irreversible: +30
82
+ if (!write.approvalRequired)
83
+ writeScore += 15; // no approval: +15
84
+ writeScore *= multiplier; // scale by blast radius
85
+ maxWriteScore = Math.max(maxWriteScore, writeScore);
86
+ }
87
+ }
88
+ return Math.min(100, Math.round(maxWriteScore));
89
+ }
90
+ /**
91
+ * Sensitive data: check dataSensitivity field for known keywords.
92
+ * Weighted by blast radius.
93
+ */
94
+ function scoreSensitiveData(systems) {
95
+ if (systems.length === 0)
96
+ return 0;
97
+ let maxScore = 0;
98
+ for (const sys of systems) {
99
+ const lower = sys.dataSensitivity.toLowerCase();
100
+ const hitCount = SENSITIVE_KEYWORDS.filter(kw => lower.includes(kw)).length;
101
+ if (hitCount === 0)
102
+ continue;
103
+ const multiplier = BLAST_RADIUS_MULTIPLIER[sys.blastRadius] ?? 0.5;
104
+ const sensitivityScore = Math.min(100, hitCount * 25) * multiplier;
105
+ maxScore = Math.max(maxScore, sensitivityScore);
106
+ }
107
+ return Math.min(100, Math.round(maxScore));
108
+ }
109
+ /**
110
+ * Scope creep: ratio of requested scopes to needed scopes across all systems.
111
+ */
112
+ function scoreScopeCreep(systems) {
113
+ if (systems.length === 0)
114
+ return 0;
115
+ let totalRequested = 0;
116
+ let totalNeeded = 0;
117
+ for (const sys of systems) {
118
+ totalRequested += sys.scopesRequested.length;
119
+ totalNeeded += sys.scopesNeeded.length;
120
+ }
121
+ if (totalNeeded === 0)
122
+ return totalRequested > 0 ? 75 : 0;
123
+ const ratio = totalRequested / totalNeeded;
124
+ if (ratio <= 1)
125
+ return 0;
126
+ if (ratio <= 1.5)
127
+ return 25;
128
+ if (ratio <= 2)
129
+ return 50;
130
+ if (ratio <= 3)
131
+ return 75;
132
+ return 100;
133
+ }
134
+ function scoreToLevel(score) {
135
+ if (score <= 20)
136
+ return 'low';
137
+ if (score <= 45)
138
+ return 'medium';
139
+ if (score <= 70)
140
+ return 'high';
141
+ return 'critical';
142
+ }
143
+ //# sourceMappingURL=risk-scorer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk-scorer.js","sourceRoot":"","sources":["../../../src/analysis/risk-scorer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type HeronConfig } from './schema.js';
2
+ export declare function loadConfig(filePath: string): HeronConfig;
3
+ export declare function loadConfigFromFlags(flags: {
4
+ target?: string;
5
+ targetType?: string;
6
+ llmProvider?: string;
7
+ llmModel?: string;
8
+ llmKey?: string;
9
+ output?: string;
10
+ format?: string;
11
+ heronUrl?: string;
12
+ heronKey?: string;
13
+ config?: string;
14
+ }): HeronConfig;
15
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/config/loader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAE7D,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAIxD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,WAAW,CAgCd"}
@@ -0,0 +1,39 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { parse as parseYaml } from 'yaml';
3
+ import { configSchema } from './schema.js';
4
+ export function loadConfig(filePath) {
5
+ const raw = readFileSync(filePath, 'utf-8');
6
+ const parsed = parseYaml(raw);
7
+ return configSchema.parse(parsed);
8
+ }
9
+ export function loadConfigFromFlags(flags) {
10
+ // If config file provided, load it and override with flags
11
+ let base = {};
12
+ if (flags.config) {
13
+ const raw = readFileSync(flags.config, 'utf-8');
14
+ base = parseYaml(raw);
15
+ }
16
+ const config = {
17
+ target: {
18
+ type: flags.targetType ?? base?.target?.type ?? 'http',
19
+ url: flags.target ?? base?.target?.url,
20
+ apiKey: base?.target?.apiKey,
21
+ model: base?.target?.model,
22
+ },
23
+ llm: {
24
+ provider: flags.llmProvider ?? base?.llm?.provider ?? 'anthropic',
25
+ apiKey: flags.llmKey ?? process.env.HERON_LLM_API_KEY ?? base?.llm?.apiKey,
26
+ model: flags.llmModel ?? base?.llm?.model,
27
+ },
28
+ output: {
29
+ format: flags.format ?? base?.output?.format ?? 'markdown',
30
+ path: flags.output ?? base?.output?.path,
31
+ },
32
+ heron: flags.heronUrl ? {
33
+ apiUrl: flags.heronUrl,
34
+ apiKey: flags.heronKey ?? '',
35
+ } : base?.heron,
36
+ };
37
+ return configSchema.parse(config);
38
+ }
39
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/config/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAoB,MAAM,aAAa,CAAC;AAE7D,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAWnC;IACC,2DAA2D;IAC3D,IAAI,IAAI,GAA4B,EAAE,CAAC;IAEvC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChD,IAAI,GAAG,SAAS,CAAC,GAAG,CAA4B,CAAC;IACnD,CAAC;IAED,MAAM,MAAM,GAAG;QACb,MAAM,EAAE;YACN,IAAI,EAAE,KAAK,CAAC,UAAU,IAAK,IAAY,EAAE,MAAM,EAAE,IAAI,IAAI,MAAM;YAC/D,GAAG,EAAE,KAAK,CAAC,MAAM,IAAK,IAAY,EAAE,MAAM,EAAE,GAAG;YAC/C,MAAM,EAAG,IAAY,EAAE,MAAM,EAAE,MAAM;YACrC,KAAK,EAAG,IAAY,EAAE,MAAM,EAAE,KAAK;SACpC;QACD,GAAG,EAAE;YACH,QAAQ,EAAE,KAAK,CAAC,WAAW,IAAK,IAAY,EAAE,GAAG,EAAE,QAAQ,IAAI,WAAW;YAC1E,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAK,IAAY,EAAE,GAAG,EAAE,MAAM;YACnF,KAAK,EAAE,KAAK,CAAC,QAAQ,IAAK,IAAY,EAAE,GAAG,EAAE,KAAK;SACnD;QACD,MAAM,EAAE;YACN,MAAM,EAAE,KAAK,CAAC,MAAM,IAAK,IAAY,EAAE,MAAM,EAAE,MAAM,IAAI,UAAU;YACnE,IAAI,EAAE,KAAK,CAAC,MAAM,IAAK,IAAY,EAAE,MAAM,EAAE,IAAI;SAClD;QACD,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtB,MAAM,EAAE,KAAK,CAAC,QAAQ;YACtB,MAAM,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE;SAC7B,CAAC,CAAC,CAAE,IAAY,EAAE,KAAK;KACzB,CAAC;IAEF,OAAO,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,146 @@
1
+ import { z } from 'zod';
2
+ export declare const targetSchema: z.ZodObject<{
3
+ type: z.ZodEnum<["http", "interactive"]>;
4
+ url: z.ZodOptional<z.ZodString>;
5
+ apiKey: z.ZodOptional<z.ZodString>;
6
+ model: z.ZodOptional<z.ZodString>;
7
+ }, "strip", z.ZodTypeAny, {
8
+ type: "http" | "interactive";
9
+ url?: string | undefined;
10
+ apiKey?: string | undefined;
11
+ model?: string | undefined;
12
+ }, {
13
+ type: "http" | "interactive";
14
+ url?: string | undefined;
15
+ apiKey?: string | undefined;
16
+ model?: string | undefined;
17
+ }>;
18
+ export declare const llmSchema: z.ZodObject<{
19
+ provider: z.ZodEnum<["anthropic", "openai", "gemini"]>;
20
+ apiKey: z.ZodOptional<z.ZodString>;
21
+ model: z.ZodOptional<z.ZodString>;
22
+ }, "strip", z.ZodTypeAny, {
23
+ provider: "anthropic" | "openai" | "gemini";
24
+ apiKey?: string | undefined;
25
+ model?: string | undefined;
26
+ }, {
27
+ provider: "anthropic" | "openai" | "gemini";
28
+ apiKey?: string | undefined;
29
+ model?: string | undefined;
30
+ }>;
31
+ export declare const outputSchema: z.ZodObject<{
32
+ format: z.ZodDefault<z.ZodEnum<["markdown", "json"]>>;
33
+ path: z.ZodOptional<z.ZodString>;
34
+ }, "strip", z.ZodTypeAny, {
35
+ format: "markdown" | "json";
36
+ path?: string | undefined;
37
+ }, {
38
+ path?: string | undefined;
39
+ format?: "markdown" | "json" | undefined;
40
+ }>;
41
+ export declare const heronSchema: z.ZodOptional<z.ZodObject<{
42
+ apiUrl: z.ZodString;
43
+ apiKey: z.ZodString;
44
+ }, "strip", z.ZodTypeAny, {
45
+ apiKey: string;
46
+ apiUrl: string;
47
+ }, {
48
+ apiKey: string;
49
+ apiUrl: string;
50
+ }>>;
51
+ export declare const configSchema: z.ZodObject<{
52
+ target: z.ZodObject<{
53
+ type: z.ZodEnum<["http", "interactive"]>;
54
+ url: z.ZodOptional<z.ZodString>;
55
+ apiKey: z.ZodOptional<z.ZodString>;
56
+ model: z.ZodOptional<z.ZodString>;
57
+ }, "strip", z.ZodTypeAny, {
58
+ type: "http" | "interactive";
59
+ url?: string | undefined;
60
+ apiKey?: string | undefined;
61
+ model?: string | undefined;
62
+ }, {
63
+ type: "http" | "interactive";
64
+ url?: string | undefined;
65
+ apiKey?: string | undefined;
66
+ model?: string | undefined;
67
+ }>;
68
+ llm: z.ZodObject<{
69
+ provider: z.ZodEnum<["anthropic", "openai", "gemini"]>;
70
+ apiKey: z.ZodOptional<z.ZodString>;
71
+ model: z.ZodOptional<z.ZodString>;
72
+ }, "strip", z.ZodTypeAny, {
73
+ provider: "anthropic" | "openai" | "gemini";
74
+ apiKey?: string | undefined;
75
+ model?: string | undefined;
76
+ }, {
77
+ provider: "anthropic" | "openai" | "gemini";
78
+ apiKey?: string | undefined;
79
+ model?: string | undefined;
80
+ }>;
81
+ output: z.ZodDefault<z.ZodObject<{
82
+ format: z.ZodDefault<z.ZodEnum<["markdown", "json"]>>;
83
+ path: z.ZodOptional<z.ZodString>;
84
+ }, "strip", z.ZodTypeAny, {
85
+ format: "markdown" | "json";
86
+ path?: string | undefined;
87
+ }, {
88
+ path?: string | undefined;
89
+ format?: "markdown" | "json" | undefined;
90
+ }>>;
91
+ heron: z.ZodOptional<z.ZodObject<{
92
+ apiUrl: z.ZodString;
93
+ apiKey: z.ZodString;
94
+ }, "strip", z.ZodTypeAny, {
95
+ apiKey: string;
96
+ apiUrl: string;
97
+ }, {
98
+ apiKey: string;
99
+ apiUrl: string;
100
+ }>>;
101
+ }, "strip", z.ZodTypeAny, {
102
+ target: {
103
+ type: "http" | "interactive";
104
+ url?: string | undefined;
105
+ apiKey?: string | undefined;
106
+ model?: string | undefined;
107
+ };
108
+ llm: {
109
+ provider: "anthropic" | "openai" | "gemini";
110
+ apiKey?: string | undefined;
111
+ model?: string | undefined;
112
+ };
113
+ output: {
114
+ format: "markdown" | "json";
115
+ path?: string | undefined;
116
+ };
117
+ heron?: {
118
+ apiKey: string;
119
+ apiUrl: string;
120
+ } | undefined;
121
+ }, {
122
+ target: {
123
+ type: "http" | "interactive";
124
+ url?: string | undefined;
125
+ apiKey?: string | undefined;
126
+ model?: string | undefined;
127
+ };
128
+ llm: {
129
+ provider: "anthropic" | "openai" | "gemini";
130
+ apiKey?: string | undefined;
131
+ model?: string | undefined;
132
+ };
133
+ output?: {
134
+ path?: string | undefined;
135
+ format?: "markdown" | "json" | undefined;
136
+ } | undefined;
137
+ heron?: {
138
+ apiKey: string;
139
+ apiUrl: string;
140
+ } | undefined;
141
+ }>;
142
+ export type HeronConfig = z.infer<typeof configSchema>;
143
+ export type TargetConfig = z.infer<typeof targetSchema>;
144
+ export type LLMConfig = z.infer<typeof llmSchema>;
145
+ export type OutputConfig = z.infer<typeof outputSchema>;
146
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;EAKvB,CAAC;AAEH,eAAO,MAAM,SAAS;;;;;;;;;;;;EAIpB,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;EAGvB,CAAC;AAEH,eAAO,MAAM,WAAW;;;;;;;;;GAGX,CAAC;AAEd,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKvB,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AACvD,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AACxD,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC;AAClD,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { z } from 'zod';
2
+ export const targetSchema = z.object({
3
+ type: z.enum(['http', 'interactive']),
4
+ url: z.string().url().optional(),
5
+ apiKey: z.string().optional(),
6
+ model: z.string().optional(),
7
+ });
8
+ export const llmSchema = z.object({
9
+ provider: z.enum(['anthropic', 'openai', 'gemini']),
10
+ apiKey: z.string().optional(),
11
+ model: z.string().optional(),
12
+ });
13
+ export const outputSchema = z.object({
14
+ format: z.enum(['markdown', 'json']).default('markdown'),
15
+ path: z.string().optional(),
16
+ });
17
+ export const heronSchema = z.object({
18
+ apiUrl: z.string().url(),
19
+ apiKey: z.string(),
20
+ }).optional();
21
+ export const configSchema = z.object({
22
+ target: targetSchema,
23
+ llm: llmSchema,
24
+ output: outputSchema.default({ format: 'markdown' }),
25
+ heron: heronSchema,
26
+ });
27
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/config/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACrC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAChC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC7B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACnD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC7B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;IACxD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC5B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IACxB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;CACnB,CAAC,CAAC,QAAQ,EAAE,CAAC;AAEd,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,YAAY;IACpB,GAAG,EAAE,SAAS;IACd,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IACpD,KAAK,EAAE,WAAW;CACnB,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { AgentConnector, AgentMetadata } from './types.js';
2
+ import type { TargetConfig } from '../config/schema.js';
3
+ /**
4
+ * Connects to an agent via OpenAI-compatible chat API.
5
+ * Works with OpenAI, Anthropic (via proxy), local models (Ollama, LM Studio), etc.
6
+ */
7
+ export declare class HttpConnector implements AgentConnector {
8
+ private url;
9
+ private apiKey;
10
+ private model;
11
+ private history;
12
+ constructor(config: TargetConfig);
13
+ sendMessage(message: string): Promise<string>;
14
+ getMetadata(): Promise<AgentMetadata>;
15
+ close(): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=http-connector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-connector.d.ts","sourceRoot":"","sources":["../../../src/connectors/http-connector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAOxD;;;GAGG;AACH,qBAAa,aAAc,YAAW,cAAc;IAClD,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,OAAO,CAAqB;gBAExB,MAAM,EAAE,YAAY;IAS1B,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAqC7C,WAAW,IAAI,OAAO,CAAC,aAAa,CAAC;IAOrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Connects to an agent via OpenAI-compatible chat API.
3
+ * Works with OpenAI, Anthropic (via proxy), local models (Ollama, LM Studio), etc.
4
+ */
5
+ export class HttpConnector {
6
+ url;
7
+ apiKey;
8
+ model;
9
+ history = [];
10
+ constructor(config) {
11
+ if (!config.url) {
12
+ throw new Error('Target URL is required for HTTP connector');
13
+ }
14
+ this.url = config.url;
15
+ this.apiKey = config.apiKey;
16
+ this.model = config.model;
17
+ }
18
+ async sendMessage(message) {
19
+ this.history.push({ role: 'user', content: message });
20
+ const headers = {
21
+ 'Content-Type': 'application/json',
22
+ };
23
+ if (this.apiKey) {
24
+ headers['Authorization'] = `Bearer ${this.apiKey}`;
25
+ }
26
+ const body = {
27
+ messages: this.history,
28
+ };
29
+ if (this.model) {
30
+ body.model = this.model;
31
+ }
32
+ const response = await fetch(this.url, {
33
+ method: 'POST',
34
+ headers,
35
+ body: JSON.stringify(body),
36
+ });
37
+ if (!response.ok) {
38
+ const text = await response.text();
39
+ throw new Error(`Agent HTTP error ${response.status}: ${text}`);
40
+ }
41
+ const data = await response.json();
42
+ const reply = data.choices?.[0]?.message?.content ?? '';
43
+ this.history.push({ role: 'assistant', content: reply });
44
+ return reply;
45
+ }
46
+ async getMetadata() {
47
+ return {
48
+ provider: 'http',
49
+ model: this.model,
50
+ };
51
+ }
52
+ async close() {
53
+ this.history = [];
54
+ }
55
+ }
56
+ //# sourceMappingURL=http-connector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-connector.js","sourceRoot":"","sources":["../../../src/connectors/http-connector.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,MAAM,OAAO,aAAa;IAChB,GAAG,CAAS;IACZ,MAAM,CAAqB;IAC3B,KAAK,CAAqB;IAC1B,OAAO,GAAkB,EAAE,CAAC;IAEpC,YAAY,MAAoB;QAC9B,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAe;QAC/B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAEtD,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;SACnC,CAAC;QACF,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC;QACrD,CAAC;QAED,MAAM,IAAI,GAA4B;YACpC,QAAQ,EAAE,IAAI,CAAC,OAAO;SACvB,CAAC;QACF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAC1B,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE;YACrC,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAE/B,CAAC;QAEF,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;QACxD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO;YACL,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACpB,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ import type { TargetConfig } from '../config/schema.js';
2
+ import type { AgentConnector } from './types.js';
3
+ export declare function createConnector(config: TargetConfig): AgentConnector;
4
+ export type { AgentConnector, AgentMetadata } from './types.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/connectors/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIjD,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,CASpE;AAED,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}