opena2a-cli 0.1.0 → 0.1.2

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 (76) hide show
  1. package/README.md +280 -0
  2. package/dist/adapters/registry.js +1 -1
  3. package/dist/adapters/registry.js.map +1 -1
  4. package/dist/commands/init.d.ts.map +1 -1
  5. package/dist/commands/init.js +78 -3
  6. package/dist/commands/init.js.map +1 -1
  7. package/dist/commands/protect.d.ts +2 -0
  8. package/dist/commands/protect.d.ts.map +1 -1
  9. package/dist/commands/protect.js +56 -10
  10. package/dist/commands/protect.js.map +1 -1
  11. package/dist/commands/runtime.d.ts +1 -1
  12. package/dist/commands/runtime.js +5 -5
  13. package/dist/commands/runtime.js.map +1 -1
  14. package/dist/commands/self-register.js +6 -6
  15. package/dist/commands/self-register.js.map +1 -1
  16. package/dist/commands/shield.d.ts +36 -0
  17. package/dist/commands/shield.d.ts.map +1 -0
  18. package/dist/commands/shield.js +834 -0
  19. package/dist/commands/shield.js.map +1 -0
  20. package/dist/commands/verify.js +1 -1
  21. package/dist/commands/verify.js.map +1 -1
  22. package/dist/index.js +29 -0
  23. package/dist/index.js.map +1 -1
  24. package/dist/shield/detect.d.ts +18 -0
  25. package/dist/shield/detect.d.ts.map +1 -0
  26. package/dist/shield/detect.js +402 -0
  27. package/dist/shield/detect.js.map +1 -0
  28. package/dist/shield/events.d.ts +65 -0
  29. package/dist/shield/events.d.ts.map +1 -0
  30. package/dist/shield/events.js +342 -0
  31. package/dist/shield/events.js.map +1 -0
  32. package/dist/shield/init.d.ts +22 -0
  33. package/dist/shield/init.d.ts.map +1 -0
  34. package/dist/shield/init.js +290 -0
  35. package/dist/shield/init.js.map +1 -0
  36. package/dist/shield/integrity.d.ts +75 -0
  37. package/dist/shield/integrity.d.ts.map +1 -0
  38. package/dist/shield/integrity.js +435 -0
  39. package/dist/shield/integrity.js.map +1 -0
  40. package/dist/shield/llm-backend.d.ts +36 -0
  41. package/dist/shield/llm-backend.d.ts.map +1 -0
  42. package/dist/shield/llm-backend.js +145 -0
  43. package/dist/shield/llm-backend.js.map +1 -0
  44. package/dist/shield/llm.d.ts +116 -0
  45. package/dist/shield/llm.d.ts.map +1 -0
  46. package/dist/shield/llm.js +536 -0
  47. package/dist/shield/llm.js.map +1 -0
  48. package/dist/shield/policy.d.ts +70 -0
  49. package/dist/shield/policy.d.ts.map +1 -0
  50. package/dist/shield/policy.js +399 -0
  51. package/dist/shield/policy.js.map +1 -0
  52. package/dist/shield/session.d.ts +63 -0
  53. package/dist/shield/session.d.ts.map +1 -0
  54. package/dist/shield/session.js +242 -0
  55. package/dist/shield/session.js.map +1 -0
  56. package/dist/shield/signing.d.ts +41 -0
  57. package/dist/shield/signing.d.ts.map +1 -0
  58. package/dist/shield/signing.js +161 -0
  59. package/dist/shield/signing.js.map +1 -0
  60. package/dist/shield/status.d.ts +4 -0
  61. package/dist/shield/status.d.ts.map +1 -0
  62. package/dist/shield/status.js +241 -0
  63. package/dist/shield/status.js.map +1 -0
  64. package/dist/shield/types.d.ts +398 -0
  65. package/dist/shield/types.d.ts.map +1 -0
  66. package/dist/shield/types.js +31 -0
  67. package/dist/shield/types.js.map +1 -0
  68. package/dist/util/drift-liveness.d.ts +37 -0
  69. package/dist/util/drift-liveness.d.ts.map +1 -0
  70. package/dist/util/drift-liveness.js +114 -0
  71. package/dist/util/drift-liveness.js.map +1 -0
  72. package/dist/util/drift-verification.d.ts +60 -0
  73. package/dist/util/drift-verification.d.ts.map +1 -0
  74. package/dist/util/drift-verification.js +457 -0
  75. package/dist/util/drift-verification.js.map +1 -0
  76. package/package.json +4 -2
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ // Shield LLM Backend Abstraction
3
+ //
4
+ // Two backends:
5
+ // 1. Claude Code CLI (primary, zero-config): detects `claude` binary and
6
+ // uses `claude --print` for completions. No API key required.
7
+ // 2. Anthropic API (secondary): uses ANTHROPIC_API_KEY for direct API calls.
8
+ //
9
+ // Nesting prevention: if $CLAUDECODE is set, we're already inside a Claude
10
+ // Code session and spawning `claude --print` would nest. Fall back to API.
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.isClaudeCodeAvailable = isClaudeCodeAvailable;
13
+ exports.detectBackend = detectBackend;
14
+ exports.callClaudeCode = callClaudeCode;
15
+ exports.callLlm = callLlm;
16
+ const node_child_process_1 = require("node:child_process");
17
+ const CLAUDE_CODE_TIMEOUT_MS = 30_000;
18
+ // Approximate tokens from text length (used when Claude Code doesn't report exact counts)
19
+ function estimateTokens(text) {
20
+ // ~4 chars per token is a reasonable approximation
21
+ return Math.ceil(text.length / 4);
22
+ }
23
+ /**
24
+ * Check if the Claude Code CLI binary is available and safe to call.
25
+ *
26
+ * Returns false if:
27
+ * - `which claude` fails (not installed)
28
+ * - $CLAUDECODE is set (nesting prevention)
29
+ */
30
+ function isClaudeCodeAvailable() {
31
+ // Nesting prevention: if CLAUDECODE env var is set, we're already
32
+ // inside a Claude Code session. Don't spawn another.
33
+ if (process.env.CLAUDECODE) {
34
+ return false;
35
+ }
36
+ try {
37
+ const result = (0, node_child_process_1.execSync)('which claude', {
38
+ encoding: 'utf-8',
39
+ timeout: 5_000,
40
+ stdio: ['pipe', 'pipe', 'pipe'],
41
+ });
42
+ return result.trim().length > 0;
43
+ }
44
+ catch {
45
+ return false;
46
+ }
47
+ }
48
+ /**
49
+ * Detect which LLM backend is available.
50
+ *
51
+ * Priority:
52
+ * 1. Claude Code CLI (zero-config, no API key needed)
53
+ * 2. Anthropic API (requires ANTHROPIC_API_KEY + consent)
54
+ * 3. None
55
+ */
56
+ async function detectBackend() {
57
+ // 1. Try Claude Code CLI
58
+ if (isClaudeCodeAvailable()) {
59
+ return { backend: 'claude-code' };
60
+ }
61
+ // 2. Try Anthropic API
62
+ const apiKey = process.env.ANTHROPIC_API_KEY;
63
+ if (apiKey) {
64
+ // Check consent via @opena2a/shared
65
+ try {
66
+ const shared = await import('@opena2a/shared');
67
+ const mod = 'default' in shared ? shared.default : shared;
68
+ if (!mod.isLlmEnabled()) {
69
+ return { backend: 'none' };
70
+ }
71
+ }
72
+ catch {
73
+ // shared not available -- allow (backward compat)
74
+ }
75
+ return { backend: 'api', apiKey };
76
+ }
77
+ return { backend: 'none' };
78
+ }
79
+ /**
80
+ * Call the Claude Code CLI as an LLM backend.
81
+ *
82
+ * Uses `claude --print` with JSON output format and Haiku model
83
+ * for cost-efficient, fast completions.
84
+ */
85
+ function callClaudeCode(systemPrompt, userPrompt, _maxTokens) {
86
+ try {
87
+ const result = (0, node_child_process_1.execFileSync)('claude', [
88
+ '--print',
89
+ '--output-format', 'json',
90
+ '--model', 'haiku',
91
+ '--max-turns', '1',
92
+ '--no-session-persistence',
93
+ '--system-prompt', systemPrompt,
94
+ userPrompt,
95
+ ], {
96
+ encoding: 'utf-8',
97
+ timeout: CLAUDE_CODE_TIMEOUT_MS,
98
+ stdio: ['pipe', 'pipe', 'pipe'],
99
+ env: { ...process.env },
100
+ });
101
+ // Parse JSON output from claude --print --output-format json
102
+ const parsed = JSON.parse(result);
103
+ const text = parsed.result ?? '';
104
+ if (!text)
105
+ return null;
106
+ return {
107
+ text,
108
+ inputTokens: estimateTokens(systemPrompt + userPrompt),
109
+ outputTokens: estimateTokens(text),
110
+ backend: 'claude-code',
111
+ };
112
+ }
113
+ catch {
114
+ return null;
115
+ }
116
+ }
117
+ /**
118
+ * Unified LLM call interface.
119
+ *
120
+ * Routes to Claude Code CLI or Anthropic API based on detected backend.
121
+ * Returns null if no backend is available or the call fails.
122
+ */
123
+ async function callLlm(systemPrompt, userPrompt, maxTokens) {
124
+ const { backend, apiKey } = await detectBackend();
125
+ if (backend === 'none')
126
+ return null;
127
+ if (backend === 'claude-code') {
128
+ return callClaudeCode(systemPrompt, userPrompt, maxTokens);
129
+ }
130
+ // API backend -- use callHaiku (imported lazily to avoid circular deps)
131
+ if (backend === 'api' && apiKey) {
132
+ const { callHaiku } = await import('./llm.js');
133
+ const result = await callHaiku(systemPrompt, userPrompt, maxTokens, apiKey);
134
+ if (!result)
135
+ return null;
136
+ return {
137
+ text: result.text,
138
+ inputTokens: result.inputTokens,
139
+ outputTokens: result.outputTokens,
140
+ backend: 'api',
141
+ };
142
+ }
143
+ return null;
144
+ }
145
+ //# sourceMappingURL=llm-backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-backend.js","sourceRoot":"","sources":["../../src/shield/llm-backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Shield LLM Intelligence Layer
3
+ *
4
+ * Uses Claude Haiku for lightweight, cost-efficient security analysis:
5
+ * 1. Policy suggestions from observed agent behavior
6
+ * 2. Anomaly explanations for unusual actions
7
+ * 3. Weekly report narrative generation
8
+ * 4. Incident triage and severity classification
9
+ *
10
+ * Design principles:
11
+ * - Batch processing: aggregate events, analyze in bulk (not per-event)
12
+ * - Aggressive caching: file-based cache with TTLs per analysis type
13
+ * - Graceful degradation: returns null if no API key or no consent
14
+ * - Cost target: <$1/month at typical usage (~$0.40/month estimated)
15
+ * - Zero network by default: only calls API when LLM is explicitly enabled
16
+ */
17
+ import type { AnomalyExplanation, IncidentTriage, LlmAnalysisType, LlmBackend, LlmCache, LlmCacheEntry, PolicySuggestion, ReportNarrative, ShieldEvent, WeeklyReport } from './types.js';
18
+ /** Load the LLM response cache from disk. Verifies signature integrity first. */
19
+ export declare function loadCache(): LlmCache;
20
+ /** Save the cache to disk, pruning expired entries. Re-signs the cache file. */
21
+ export declare function saveCache(cache: LlmCache): void;
22
+ /** Compute a cache key from input data. */
23
+ export declare function cacheKey(analysisType: LlmAnalysisType, input: string): string;
24
+ /** Look up a cached result. Returns null if not found or expired. */
25
+ export declare function getCached(cache: LlmCache, key: string): LlmCacheEntry | null;
26
+ /**
27
+ * Make a single API call to Claude Haiku.
28
+ * Returns the text response and token usage, or null on failure.
29
+ */
30
+ export declare function callHaiku(systemPrompt: string, userPrompt: string, maxTokens: number, apiKey: string): Promise<{
31
+ text: string;
32
+ inputTokens: number;
33
+ outputTokens: number;
34
+ } | null>;
35
+ /**
36
+ * Check if LLM intelligence is available.
37
+ *
38
+ * Priority:
39
+ * 1. Claude Code CLI (zero-config, no API key needed)
40
+ * 2. Anthropic API (requires ANTHROPIC_API_KEY + consent)
41
+ * 3. None
42
+ *
43
+ * Returns the detected backend and optional API key.
44
+ */
45
+ export declare function checkLlmAvailable(): Promise<{
46
+ backend: LlmBackend;
47
+ apiKey?: string;
48
+ }>;
49
+ /**
50
+ * Analyze observed agent behavior and suggest a security policy.
51
+ *
52
+ * Input: summarized event data (not raw events -- pre-aggregated to save tokens).
53
+ */
54
+ export declare function suggestPolicy(agent: string, behaviorSummary: {
55
+ totalActions: number;
56
+ totalSessions: number;
57
+ topProcesses: {
58
+ name: string;
59
+ count: number;
60
+ }[];
61
+ topCredentials: {
62
+ name: string;
63
+ count: number;
64
+ }[];
65
+ topFilePaths: {
66
+ path: string;
67
+ count: number;
68
+ }[];
69
+ topNetworkHosts: {
70
+ host: string;
71
+ count: number;
72
+ }[];
73
+ }): Promise<PolicySuggestion | null>;
74
+ /**
75
+ * Explain why a specific event or action is anomalous.
76
+ *
77
+ * Designed for batch use: call with a few flagged events, not every event.
78
+ */
79
+ export declare function explainAnomaly(event: ShieldEvent, context: {
80
+ agentName: string;
81
+ normalActions: string[];
82
+ isFirstOccurrence: boolean;
83
+ }): Promise<AnomalyExplanation | null>;
84
+ /**
85
+ * Generate a human-readable narrative for a weekly report.
86
+ *
87
+ * Input: pre-computed report metrics (not raw events).
88
+ */
89
+ export declare function generateNarrative(report: WeeklyReport): Promise<ReportNarrative | null>;
90
+ /**
91
+ * Triage a batch of related events as a potential incident.
92
+ *
93
+ * Input: a small batch of related high-severity events.
94
+ */
95
+ export declare function triageIncident(events: ShieldEvent[], context: {
96
+ policyMode: string;
97
+ agentName: string;
98
+ recentBaseline: string[];
99
+ }): Promise<IncidentTriage | null>;
100
+ export interface LlmCacheStats {
101
+ totalEntries: number;
102
+ validEntries: number;
103
+ totalInputTokens: number;
104
+ totalOutputTokens: number;
105
+ estimatedCostUsd: number;
106
+ byType: Record<LlmAnalysisType, number>;
107
+ }
108
+ /**
109
+ * Compute cache statistics for diagnostics.
110
+ *
111
+ * Estimated cost uses Haiku pricing:
112
+ * Input: $0.80 per million tokens
113
+ * Output: $4.00 per million tokens
114
+ */
115
+ export declare function getCacheStats(): LlmCacheStats;
116
+ //# sourceMappingURL=llm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../src/shield/llm.ts"],"names":[],"mappings":"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"}