arkna-sdk 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.
@@ -0,0 +1,257 @@
1
+ /**
2
+ * ARKNA SDK Client
3
+ *
4
+ * Core client for the ARKNA AI Trust Gateway.
5
+ * Zero runtime dependencies — uses Node 18+ built-in fetch.
6
+ */
7
+ import type { ArknaConfig, ActionResult, ToolDefinition, HeartbeatResult, RegisterResult, GovernanceEnvelope, GatewayMessage, ExecuteOptions, HeartbeatHandle, DeclaredTool, StandingPermitSummary, ContextEntry, ExperienceEntry, RecallOptions, ContextBudgetOptions, GraphOptions, SemanticNode, WorkingMemoryContext, StartRunOptions, RunHandle, StepOptions, StepResult, ToolCallOptions, CompleteRunOptions, RunResult, CaptureContextOptions, SessionHandle, CloseSessionResult, StepInput, StepBatchResult } from './types';
8
+ export declare class ArknaClient {
9
+ private readonly token;
10
+ private readonly baseUrl;
11
+ private readonly timeoutMs;
12
+ private readonly maxRetries;
13
+ private readonly retryDelayMs;
14
+ private agentId;
15
+ private toolsCache;
16
+ private toolsCacheTime;
17
+ private enforcementGuard;
18
+ private enforcementSecret;
19
+ private lastNonce;
20
+ private licenseManager;
21
+ private licenseFetched;
22
+ constructor(config?: ArknaConfig);
23
+ /** Whether HTTP enforcement is active (governed domain interception) */
24
+ get enforcementActive(): boolean;
25
+ /** Number of intercepted direct API calls since client creation */
26
+ get interceptedCalls(): number;
27
+ /** List available tools for this agent (cached 5 min). */
28
+ tools(forceRefresh?: boolean): Promise<ToolDefinition[]>;
29
+ /**
30
+ * Execute a tool through the ARKNA governance gateway.
31
+ *
32
+ * @param toolName - Tool identifier (e.g. 'send_email', 'check_calendly_availability')
33
+ * @param parameters - Tool input parameters
34
+ * @param opts - Optional: custom requestId, dryRun mode
35
+ * @returns ActionResult with decision, result, and signed permit
36
+ */
37
+ execute(toolName: string, parameters: Record<string, unknown>, opts?: ExecuteOptions): Promise<ActionResult>;
38
+ /** Send a single heartbeat. Returns kill switch status.
39
+ * Automatically includes enforcement metadata and cryptographic proof
40
+ * that enforcement is genuinely active (nonce-based, server-verified).
41
+ * @param metadata - Optional metadata to include
42
+ * @param tools - Updated tool declarations (synced on each heartbeat)
43
+ */
44
+ heartbeat(metadata?: Record<string, unknown>, tools?: DeclaredTool[]): Promise<HeartbeatResult>;
45
+ /**
46
+ * Collect system telemetry (CPU, memory). Returns empty object on failure.
47
+ * Used by startHeartbeat when enriched=true. Safe on all platforms.
48
+ */
49
+ private collectSystemTelemetry;
50
+ /**
51
+ * Start a background heartbeat interval.
52
+ * @param intervalMs - Interval in ms (default: 60000 = 1 min)
53
+ * @param options.enriched - Include system telemetry (CPU, memory) in heartbeats
54
+ * @returns Handle with stop() method
55
+ */
56
+ startHeartbeat(intervalMs?: number, options?: {
57
+ enriched?: boolean;
58
+ }): HeartbeatHandle;
59
+ /**
60
+ * Register this agent with the ARKNA gateway.
61
+ * @param name - Agent display name
62
+ * @param platform - Agent platform (e.g. 'crewai', 'langchain', 'custom')
63
+ * @param opts - Optional: description, capabilities, reply_url, tools
64
+ */
65
+ register(name: string, platform: string, opts?: {
66
+ description?: string;
67
+ capabilities?: string[];
68
+ reply_url?: string;
69
+ metadata?: Record<string, unknown>;
70
+ tools?: DeclaredTool[];
71
+ }): Promise<RegisterResult>;
72
+ /**
73
+ * Declare this agent's native tools for ARKNA governance tracking.
74
+ * Convenience method that sends a heartbeat with a tools declaration.
75
+ * ARKNA auto-classifies read-only tools and queues others for admin approval.
76
+ */
77
+ declareTools(tools: DeclaredTool[]): Promise<HeartbeatResult>;
78
+ /** Fetch the full governance envelope (tools, policies, permissions, constitution). */
79
+ governance(): Promise<GovernanceEnvelope>;
80
+ /**
81
+ * Listen for visitor messages via SSE.
82
+ * Calls the callback for each message event.
83
+ * Returns an AbortController to stop listening.
84
+ */
85
+ onMessage(callback: (msg: GatewayMessage) => void): AbortController;
86
+ /**
87
+ * Reply to a visitor message.
88
+ * @param messageId - The message_id from the SSE event
89
+ * @param content - Reply text content
90
+ */
91
+ reply(messageId: string, content: string): Promise<{
92
+ ok: boolean;
93
+ reply_id: string;
94
+ }>;
95
+ /** Poll for the result of a queued action (may return denied status). */
96
+ getActionStatus(requestId: string): Promise<ActionResult>;
97
+ /** Update agent settings (e.g. reply_url). */
98
+ updateAgent(settings: {
99
+ reply_url?: string | null;
100
+ }): Promise<{
101
+ ok: boolean;
102
+ agent_id: string;
103
+ }>;
104
+ /** Push an agent manifest (self-description, capabilities, tools). */
105
+ pushManifest(manifest: Record<string, unknown>): Promise<{
106
+ ok: boolean;
107
+ agent_id: string;
108
+ manifest_pushed_at: string;
109
+ }>;
110
+ /** List active standing permits for this agent. */
111
+ standingPermits(): Promise<{
112
+ agent_id: string;
113
+ standing_permits: StandingPermitSummary[];
114
+ count: number;
115
+ }>;
116
+ /** Agent context — experience log, semantic graph, working context. */
117
+ context: {
118
+ /** Store an experience log entry. */
119
+ store: (entry: ContextEntry) => Promise<{
120
+ id: string;
121
+ content_hash: string;
122
+ }>;
123
+ /** Recall experience log entries with optional filters. */
124
+ recall: (opts?: RecallOptions) => Promise<ExperienceEntry[]>;
125
+ /** Build working context (experience + semantic + shared). */
126
+ working: (opts?: ContextBudgetOptions) => Promise<WorkingMemoryContext>;
127
+ /** Query the semantic knowledge graph. */
128
+ graph: (opts?: GraphOptions) => Promise<SemanticNode[]>;
129
+ /** Share a semantic node with another agent. */
130
+ share: (nodeId: string, targetAgentId: string) => Promise<void>;
131
+ };
132
+ /** @deprecated Use client.context instead */
133
+ get memory(): {
134
+ /** Store an experience log entry. */
135
+ store: (entry: ContextEntry) => Promise<{
136
+ id: string;
137
+ content_hash: string;
138
+ }>;
139
+ /** Recall experience log entries with optional filters. */
140
+ recall: (opts?: RecallOptions) => Promise<ExperienceEntry[]>;
141
+ /** Build working context (experience + semantic + shared). */
142
+ working: (opts?: ContextBudgetOptions) => Promise<WorkingMemoryContext>;
143
+ /** Query the semantic knowledge graph. */
144
+ graph: (opts?: GraphOptions) => Promise<SemanticNode[]>;
145
+ /** Share a semantic node with another agent. */
146
+ share: (nodeId: string, targetAgentId: string) => Promise<void>;
147
+ };
148
+ /**
149
+ * Close a session explicitly.
150
+ * @param sessionId - The session ID to close
151
+ * @param status - 'completed' or 'abandoned'
152
+ * @returns CloseSessionResult with sessionId and status
153
+ */
154
+ closeSession(sessionId: string, status: 'completed' | 'abandoned'): Promise<CloseSessionResult>;
155
+ /**
156
+ * Record multiple steps in a single batch request.
157
+ * @param runId - The run ID to record steps for
158
+ * @param steps - Array of step inputs (max 100)
159
+ * @returns StepBatchResult with step IDs, sequences, and hashes
160
+ */
161
+ recordStepBatch(runId: string, steps: StepInput[]): Promise<StepBatchResult>;
162
+ /**
163
+ * Wait for a queued action to be approved or denied.
164
+ * Polls getActionStatus with exponential backoff until resolved or timeout.
165
+ *
166
+ * @param requestId - The request_id from an execute() that returned NEEDS_APPROVAL
167
+ * @param opts - Optional: timeoutMs (default 300000 = 5 min), pollIntervalMs (default 2000)
168
+ * @returns The final ActionResult once resolved
169
+ * @throws Error if timeout is reached
170
+ */
171
+ waitForApproval(requestId: string, opts?: {
172
+ timeoutMs?: number;
173
+ pollIntervalMs?: number;
174
+ }): Promise<ActionResult>;
175
+ /**
176
+ * Fetch the compiled license from the gateway. Called lazily on first execute.
177
+ * Non-fatal: if fetching fails, falls through to full pipeline.
178
+ */
179
+ fetchLicense(): Promise<void>;
180
+ /** Ensure we've attempted to fetch the license at least once. */
181
+ private ensureLicense;
182
+ /** Whether a status code is safe to retry */
183
+ private isRetryable;
184
+ /** Calculate retry delay with exponential backoff + jitter, respecting Retry-After */
185
+ private getRetryDelay;
186
+ /** Sleep helper */
187
+ private sleep;
188
+ /**
189
+ * Standard request — throws on non-2xx responses.
190
+ * Used for tools, heartbeat, register, governance, etc.
191
+ * Retries on transient errors (429, 5xx) with exponential backoff.
192
+ */
193
+ private request;
194
+ /**
195
+ * Raw request — returns parsed JSON for ANY response with a JSON body.
196
+ * Used for execute() where 200 (ALLOW), 202 (NEEDS_APPROVAL), and 403 (DENY)
197
+ * are all valid governance decisions, not errors.
198
+ * Only throws on network/timeout errors or non-JSON responses.
199
+ * Retries on transient errors but NEVER retries governance decisions.
200
+ */
201
+ private requestRaw;
202
+ /**
203
+ * Verify an ARKNA webhook signature.
204
+ *
205
+ * @param body - Raw request body string
206
+ * @param signatureHeader - Value of X-Arkna-Signature header (e.g. "v1=abc123...")
207
+ * @param timestampHeader - Value of X-Arkna-Timestamp header (epoch seconds)
208
+ * @param secret - Your webhook_secret (from token creation response)
209
+ * @param toleranceSeconds - Max age of the request in seconds (default: 300 = 5 min)
210
+ * @returns true if signature is valid and timestamp is within tolerance
211
+ */
212
+ static verifyWebhookSignature(body: string, signatureHeader: string, timestampHeader: string, secret: string, toleranceSeconds?: number): boolean;
213
+ /** Get the ingestion API base URL (derived from gateway URL) */
214
+ private get ingestionBaseUrl();
215
+ /**
216
+ * Convert camelCase keys to snake_case (shallow, one level deep).
217
+ * Leaves keys that are already snake_case unchanged.
218
+ */
219
+ private static camelToSnake;
220
+ /**
221
+ * Convert snake_case keys to camelCase (shallow, one level deep).
222
+ */
223
+ private static snakeToCamel;
224
+ /**
225
+ * Request to the ingestion API (/api/v1/...).
226
+ * Same retry/timeout logic as the gateway request method.
227
+ */
228
+ private ingestionRequest;
229
+ /** Start a new agent run. Returns a handle with the run ID. */
230
+ startRun(options?: StartRunOptions): Promise<RunHandle>;
231
+ /** Record a step within a run. */
232
+ recordStep(runId: string, options: StepOptions): Promise<StepResult>;
233
+ /** Record a tool call within a run. */
234
+ recordToolCall(runId: string, options: ToolCallOptions): Promise<{
235
+ toolCallId: string;
236
+ }>;
237
+ /** Complete or fail a run. */
238
+ completeRun(runId: string, options: CompleteRunOptions): Promise<RunResult>;
239
+ /** Capture a context snapshot for a run. */
240
+ captureContext(runId: string, options: CaptureContextOptions): Promise<{
241
+ contextPacketId: string;
242
+ }>;
243
+ /** Create a new session to group related runs. */
244
+ createSession(metadata?: Record<string, unknown>): Promise<SessionHandle>;
245
+ /**
246
+ * Convenience: trace a complete run with automatic lifecycle management.
247
+ * Starts a run, calls your function, records the result, completes the run.
248
+ */
249
+ trace<T>(name: string, fn: (run: {
250
+ runId: string;
251
+ step: (opts: StepOptions) => Promise<StepResult>;
252
+ tool: (opts: ToolCallOptions) => Promise<{
253
+ toolCallId: string;
254
+ }>;
255
+ }) => Promise<T>, options?: StartRunOptions): Promise<T>;
256
+ }
257
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}