@fenixforce/kernel 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/dist/agent/execution-result.d.ts +27 -0
- package/dist/agent-loop.d.ts +55 -0
- package/dist/api/dashboard.d.ts +260 -0
- package/dist/api/index.d.ts +9 -0
- package/dist/api/middleware.d.ts +46 -0
- package/dist/api/openai-compat.d.ts +163 -0
- package/dist/api/server.d.ts +44 -0
- package/dist/api/streaming.d.ts +15 -0
- package/dist/api/webhook-triggers.d.ts +139 -0
- package/dist/billing/cost-meter.d.ts +123 -0
- package/dist/billing/index.d.ts +2 -0
- package/dist/boot.d.ts +109 -0
- package/dist/channels/discord.d.ts +99 -0
- package/dist/channels/email.d.ts +88 -0
- package/dist/channels/http-api.d.ts +155 -0
- package/dist/channels/index.d.ts +20 -0
- package/dist/channels/mcp-channel.d.ts +75 -0
- package/dist/channels/mobile-hil.d.ts +88 -0
- package/dist/channels/openai-compat.d.ts +42 -0
- package/dist/channels/registry.d.ts +80 -0
- package/dist/channels/signal.d.ts +75 -0
- package/dist/channels/slack.d.ts +115 -0
- package/dist/channels/teams.d.ts +106 -0
- package/dist/channels/telegram.d.ts +164 -0
- package/dist/channels/types.d.ts +71 -0
- package/dist/channels/whatsapp.d.ts +83 -0
- package/dist/checkpoint.d.ts +77 -0
- package/dist/config/canary.d.ts +74 -0
- package/dist/config/constitution.d.ts +57 -0
- package/dist/config/defaults.d.ts +17 -0
- package/dist/config/index.d.ts +8 -0
- package/dist/config/loader.d.ts +11 -0
- package/dist/config/provider-config.d.ts +29 -0
- package/dist/config/schema.d.ts +118 -0
- package/dist/config/steering-rules.d.ts +28 -0
- package/dist/content/chunker.d.ts +42 -0
- package/dist/content/entity-extractor.d.ts +58 -0
- package/dist/content/index.d.ts +8 -0
- package/dist/content/ocr.d.ts +79 -0
- package/dist/content/pipeline.d.ts +153 -0
- package/dist/context-overflow.d.ts +19 -0
- package/dist/editions/mobile.d.ts +12 -0
- package/dist/editions/pro.d.ts +12 -0
- package/dist/editions/voices.d.ts +14 -0
- package/dist/events/block-manager.d.ts +37 -0
- package/dist/events/bus.d.ts +39 -0
- package/dist/events/index.d.ts +8 -0
- package/dist/events/session-manager.d.ts +59 -0
- package/dist/events/stream-adapter.d.ts +24 -0
- package/dist/events/types.d.ts +465 -0
- package/dist/events/websocket.d.ts +34 -0
- package/dist/extensions/defaults/05-session-repair.d.ts +6 -0
- package/dist/extensions/defaults/10-logging.d.ts +6 -0
- package/dist/extensions/defaults/15-loop-guard.d.ts +6 -0
- package/dist/extensions/defaults/20-cost-tracking.d.ts +7 -0
- package/dist/extensions/defaults/25-ssrf-protection.d.ts +6 -0
- package/dist/extensions/defaults/30-rate-limiting.d.ts +6 -0
- package/dist/extensions/defaults/35-shell-bleed.d.ts +6 -0
- package/dist/extensions/defaults/40-observation-capture.d.ts +7 -0
- package/dist/extensions/defaults/45-context-survival.d.ts +6 -0
- package/dist/extensions/defaults/50-context-budget.d.ts +6 -0
- package/dist/extensions/defaults/55-steering-rules.d.ts +7 -0
- package/dist/extensions/defaults/60-quality-gates.d.ts +7 -0
- package/dist/extensions/defaults/65-job-dispatch.d.ts +24 -0
- package/dist/extensions/defaults/70-skill-loader.d.ts +18 -0
- package/dist/extensions/hooks.d.ts +74 -0
- package/dist/extensions/index.d.ts +21 -0
- package/dist/extensions/intervention.d.ts +59 -0
- package/dist/extensions/manager.d.ts +63 -0
- package/dist/extensions/runner.d.ts +63 -0
- package/dist/hooks/hook-manager.d.ts +39 -0
- package/dist/hooks/hook-types.d.ts +60 -0
- package/dist/identity/assembler.d.ts +45 -0
- package/dist/identity/ccc-adapter.d.ts +33 -0
- package/dist/identity/index.d.ts +6 -0
- package/dist/identity/persona-parser.d.ts +24 -0
- package/dist/identity/soul-parser.d.ts +23 -0
- package/dist/identity/user-populator.d.ts +20 -0
- package/dist/index.d.ts +227 -0
- package/dist/index.js +579 -0
- package/dist/interrupt.d.ts +84 -0
- package/dist/job-queue.d.ts +69 -0
- package/dist/jobs/index.d.ts +12 -0
- package/dist/jobs/memory-queue.d.ts +23 -0
- package/dist/jobs/planned-tasks.d.ts +121 -0
- package/dist/jobs/queue.d.ts +79 -0
- package/dist/jobs/router.d.ts +23 -0
- package/dist/jobs/synthesize-memories.d.ts +26 -0
- package/dist/jobs/types.d.ts +47 -0
- package/dist/jobs/worker-pool.d.ts +25 -0
- package/dist/jobs/worker.d.ts +40 -0
- package/dist/loop/autonomous-controller.d.ts +91 -0
- package/dist/loop/backpressure.d.ts +64 -0
- package/dist/loop/fresh-context.d.ts +48 -0
- package/dist/loop/prd-importer.d.ts +134 -0
- package/dist/loop/stop-controller.d.ts +31 -0
- package/dist/loop-guard.d.ts +32 -0
- package/dist/mcp/tool-executor.d.ts +57 -0
- package/dist/memory/brain-artifacts.d.ts +25 -0
- package/dist/memory/dual-search.d.ts +67 -0
- package/dist/memory/episodic.d.ts +45 -0
- package/dist/memory/index.d.ts +27 -0
- package/dist/memory/knowledge-graph.d.ts +89 -0
- package/dist/memory/markdown-store.d.ts +64 -0
- package/dist/memory/metadata-filter.d.ts +29 -0
- package/dist/memory/mid-conversation-saves.d.ts +17 -0
- package/dist/memory/note-parser.d.ts +34 -0
- package/dist/memory/observation-store.d.ts +36 -0
- package/dist/memory/observation-thresholds.d.ts +26 -0
- package/dist/memory/progressive-search.d.ts +25 -0
- package/dist/memory/synthesis.d.ts +36 -0
- package/dist/memory/tree-index.d.ts +104 -0
- package/dist/memory/write-gate.d.ts +63 -0
- package/dist/mission-control.d.ts +34 -0
- package/dist/pre-classifier-widgets.d.ts +40 -0
- package/dist/pre-classifier.d.ts +19 -0
- package/dist/prompt/context-budget.d.ts +68 -0
- package/dist/prompt/index.d.ts +3 -0
- package/dist/prompt/system-prompt.d.ts +32 -0
- package/dist/prompt/templates.d.ts +11 -0
- package/dist/providers/anthropic.d.ts +24 -0
- package/dist/providers/auto-detect.d.ts +16 -0
- package/dist/providers/auto-discover.d.ts +28 -0
- package/dist/providers/bedrock.d.ts +38 -0
- package/dist/providers/cache-strategy.d.ts +58 -0
- package/dist/providers/circuit-breaker.d.ts +33 -0
- package/dist/providers/cost-meter.d.ts +74 -0
- package/dist/providers/cost-tracking.d.ts +36 -0
- package/dist/providers/google.d.ts +35 -0
- package/dist/providers/index.d.ts +32 -0
- package/dist/providers/interface.d.ts +98 -0
- package/dist/providers/json-repair.d.ts +10 -0
- package/dist/providers/key-rotation.d.ts +36 -0
- package/dist/providers/manager.d.ts +64 -0
- package/dist/providers/model-registry.d.ts +50 -0
- package/dist/providers/openai-compatible.d.ts +26 -0
- package/dist/providers/optimization-modes.d.ts +38 -0
- package/dist/providers/provider-manager.d.ts +71 -0
- package/dist/providers/runtime-crud.d.ts +68 -0
- package/dist/providers/sidecar-lifecycle.d.ts +40 -0
- package/dist/providers/stream-wrapper.d.ts +21 -0
- package/dist/providers/structured-verify.d.ts +31 -0
- package/dist/providers/versioning.d.ts +18 -0
- package/dist/quality-gates.d.ts +10 -0
- package/dist/scheduler/engine.d.ts +95 -0
- package/dist/scheduler/index.d.ts +4 -0
- package/dist/scheduler/webhook-handler.d.ts +37 -0
- package/dist/sdk/agent.d.ts +22 -0
- package/dist/sdk/cli.d.ts +2 -0
- package/dist/sdk/client.d.ts +19 -0
- package/dist/sdk/index.d.ts +24 -0
- package/dist/sdk/jobs.d.ts +25 -0
- package/dist/sdk/memory.d.ts +18 -0
- package/dist/sdk/types.d.ts +69 -0
- package/dist/security/approval-gates.d.ts +166 -0
- package/dist/security/content-wrapper.d.ts +38 -0
- package/dist/security/guard-rails.d.ts +6 -0
- package/dist/security/index.d.ts +21 -0
- package/dist/security/instruction-hierarchy.d.ts +109 -0
- package/dist/security/pii-tokenizer.d.ts +30 -0
- package/dist/security/reputation.d.ts +53 -0
- package/dist/security/secret-store.d.ts +41 -0
- package/dist/security/security-engine.d.ts +53 -0
- package/dist/security/shell-bleed.d.ts +15 -0
- package/dist/security/ssrf.d.ts +12 -0
- package/dist/security/taint-tracker.d.ts +63 -0
- package/dist/security/tool-access-control.d.ts +114 -0
- package/dist/session-compaction.d.ts +20 -0
- package/dist/session-orient.d.ts +22 -0
- package/dist/session-repair.d.ts +6 -0
- package/dist/storage/index.d.ts +24 -0
- package/dist/storage/interface.d.ts +245 -0
- package/dist/storage/postgres.d.ts +6 -0
- package/dist/storage/sqlite.d.ts +2 -0
- package/dist/streaming/reasoning.d.ts +67 -0
- package/dist/task-tracker.d.ts +26 -0
- package/dist/testing/action-cache.d.ts +39 -0
- package/dist/testing/incident-eval.d.ts +49 -0
- package/dist/testing/workflow-evals.d.ts +73 -0
- package/dist/tools/access-control.d.ts +60 -0
- package/dist/tools/browser-engine.d.ts +73 -0
- package/dist/tools/builtins/jobs-router.d.ts +7 -0
- package/dist/tools/builtins/tasks-router.d.ts +25 -0
- package/dist/tools/index.d.ts +20 -0
- package/dist/tools/map-reduce.d.ts +64 -0
- package/dist/tools/registry.d.ts +39 -0
- package/dist/tools/router.d.ts +30 -0
- package/dist/tools/routers/browser-router.d.ts +12 -0
- package/dist/tools/routers/code-router.d.ts +34 -0
- package/dist/tools/routers/file-router.d.ts +35 -0
- package/dist/tools/routers/memory-router.d.ts +21 -0
- package/dist/tools/routers/schedule-router.d.ts +31 -0
- package/dist/tools/routers/search-backends.d.ts +47 -0
- package/dist/tools/routers/task-router.d.ts +32 -0
- package/dist/tools/routers/web-router.d.ts +36 -0
- package/dist/tools/skill-discovery.d.ts +32 -0
- package/dist/tools/skill-loader.d.ts +76 -0
- package/dist/tools/skill-types.d.ts +21 -0
- package/dist/voice/audio-intelligence.d.ts +42 -0
- package/dist/voice/barge-in.d.ts +51 -0
- package/dist/voice/index.d.ts +22 -0
- package/dist/voice/marker-parser.d.ts +31 -0
- package/dist/voice/sidecar-manager.d.ts +68 -0
- package/dist/voice/speaker-focus.d.ts +41 -0
- package/dist/voice/speaker-voiceprint.d.ts +47 -0
- package/dist/voice/speech-intent.d.ts +51 -0
- package/dist/voice/speechmatics-stt.d.ts +77 -0
- package/dist/voice/speechmatics-tts.d.ts +39 -0
- package/dist/voice/stt-provider.d.ts +40 -0
- package/dist/voice/transcript.d.ts +19 -0
- package/dist/voice/turn-detection.d.ts +53 -0
- package/dist/wrapup.d.ts +15 -0
- package/package.json +39 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { AgentEvent } from "./types.js";
|
|
2
|
+
import type { EventBus } from "./bus.js";
|
|
3
|
+
export type EventListener = (event: AgentEvent) => void;
|
|
4
|
+
export interface Session {
|
|
5
|
+
id: string;
|
|
6
|
+
createdAt: number;
|
|
7
|
+
events: AgentEvent[];
|
|
8
|
+
listeners: Set<EventListener>;
|
|
9
|
+
}
|
|
10
|
+
export interface SessionManagerConfig {
|
|
11
|
+
/** Buffer TTL in milliseconds (default: 30 minutes) */
|
|
12
|
+
bufferTtlMs?: number;
|
|
13
|
+
/** Max events to buffer per session (default: 10000) */
|
|
14
|
+
maxBufferSize?: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Manages sessions with event buffering for reconnection.
|
|
18
|
+
*
|
|
19
|
+
* Each session keeps a ring buffer of events. When a client
|
|
20
|
+
* reconnects (new WebSocket, SSE, or Telegram poll), it calls
|
|
21
|
+
* `replay()` to receive all buffered events, then `subscribe()`
|
|
22
|
+
* for live events going forward.
|
|
23
|
+
*
|
|
24
|
+
* Sessions auto-expire after `bufferTtlMs` of inactivity.
|
|
25
|
+
*/
|
|
26
|
+
export declare class SessionManager {
|
|
27
|
+
private sessions;
|
|
28
|
+
private timers;
|
|
29
|
+
private readonly bufferTtlMs;
|
|
30
|
+
private readonly maxBufferSize;
|
|
31
|
+
constructor(config?: SessionManagerConfig);
|
|
32
|
+
/** Create a new session. */
|
|
33
|
+
create(id?: string): Session;
|
|
34
|
+
/** Get a session by ID. */
|
|
35
|
+
get(id: string): Session | undefined;
|
|
36
|
+
/** Subscribe to live events for a session. Returns unsubscribe function. */
|
|
37
|
+
subscribe(id: string, listener: EventListener): () => void;
|
|
38
|
+
/** Buffer an event for a session and notify live listeners. */
|
|
39
|
+
bufferEvent(sessionId: string, event: AgentEvent): Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* Replay all buffered events to a listener (for reconnection).
|
|
42
|
+
* Returns the count of replayed events.
|
|
43
|
+
*/
|
|
44
|
+
replay(sessionId: string, listener: EventListener): number;
|
|
45
|
+
/**
|
|
46
|
+
* Wire this session manager to an EventBus for automatic buffering.
|
|
47
|
+
* Only buffers events whose sessionId matches.
|
|
48
|
+
* Returns an unsubscribe function.
|
|
49
|
+
*/
|
|
50
|
+
connectBus(bus: EventBus, sessionId: string): () => void;
|
|
51
|
+
/** Delete a session and clean up its timer. */
|
|
52
|
+
delete(id: string): boolean;
|
|
53
|
+
/** Number of active sessions. */
|
|
54
|
+
get size(): number;
|
|
55
|
+
/** Clean up all sessions and timers. */
|
|
56
|
+
destroy(): void;
|
|
57
|
+
private resetTtl;
|
|
58
|
+
private clearTtl;
|
|
59
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AgentEvent } from "./types.js";
|
|
2
|
+
import type { EventBus } from "./bus.js";
|
|
3
|
+
export interface StreamAdapterConfig {
|
|
4
|
+
/** Event bus to emit events to */
|
|
5
|
+
bus: EventBus;
|
|
6
|
+
/** Callback when the stream completes normally */
|
|
7
|
+
onComplete?: () => void;
|
|
8
|
+
/** Callback when the stream throws an error */
|
|
9
|
+
onError?: (error: unknown) => void;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Pipe an async iterable of AgentEvents into an EventBus.
|
|
13
|
+
*
|
|
14
|
+
* Consumes the iterable sequentially, emitting each event.
|
|
15
|
+
* On error, emits an `error` event so subscribers are notified,
|
|
16
|
+
* then calls the onError callback.
|
|
17
|
+
*/
|
|
18
|
+
export declare function pipeToEventBus(stream: AsyncIterable<AgentEvent>, config: StreamAdapterConfig): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Collect all events from an async iterable into an array.
|
|
21
|
+
* Useful for testing — returns the full event list after
|
|
22
|
+
* the stream completes.
|
|
23
|
+
*/
|
|
24
|
+
export declare function collectEvents(stream: AsyncIterable<AgentEvent>): Promise<AgentEvent[]>;
|
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
export type { CompletionParams, CompletionResult, ProviderCapabilities, ToolCall, } from "../providers/interface.js";
|
|
2
|
+
export type { TokenUsage } from "../providers/stream-wrapper.js";
|
|
3
|
+
export type { CostRecord } from "../providers/cost-tracking.js";
|
|
4
|
+
export type { JobStatus, JobPriority, JobOptions, Job, } from "../../src/job-queue.js";
|
|
5
|
+
export type AgentMode = "conversation" | "task" | "code" | "research" | "voice" | "passive";
|
|
6
|
+
export interface AgentInput {
|
|
7
|
+
text?: string;
|
|
8
|
+
audioUrl?: string;
|
|
9
|
+
images?: string[];
|
|
10
|
+
attachments?: Array<{
|
|
11
|
+
name: string;
|
|
12
|
+
mimeType: string;
|
|
13
|
+
url: string;
|
|
14
|
+
}>;
|
|
15
|
+
}
|
|
16
|
+
export interface AgentContext {
|
|
17
|
+
sessionId: string;
|
|
18
|
+
mode: AgentMode;
|
|
19
|
+
turnNumber: number;
|
|
20
|
+
tokenBudget: number;
|
|
21
|
+
tokensUsed: number;
|
|
22
|
+
activeTools: string[];
|
|
23
|
+
workspaceId?: string;
|
|
24
|
+
}
|
|
25
|
+
export type TaskItemStatus = "pending" | "in_progress" | "done" | "blocked";
|
|
26
|
+
export interface TaskItem {
|
|
27
|
+
id: string;
|
|
28
|
+
title: string;
|
|
29
|
+
status: TaskItemStatus;
|
|
30
|
+
subtasks?: TaskItem[];
|
|
31
|
+
verification?: QualityCheck;
|
|
32
|
+
}
|
|
33
|
+
export interface TaskTracker {
|
|
34
|
+
readonly tasks: readonly TaskItem[];
|
|
35
|
+
add(title: string): TaskItem;
|
|
36
|
+
update(id: string, status: TaskItemStatus): void;
|
|
37
|
+
current(): TaskItem | undefined;
|
|
38
|
+
}
|
|
39
|
+
export interface QualityCheck {
|
|
40
|
+
passed: boolean;
|
|
41
|
+
checks: Array<{
|
|
42
|
+
name: string;
|
|
43
|
+
passed: boolean;
|
|
44
|
+
message?: string;
|
|
45
|
+
}>;
|
|
46
|
+
timestamp: number;
|
|
47
|
+
}
|
|
48
|
+
export interface StreamChunk {
|
|
49
|
+
content: string;
|
|
50
|
+
index: number;
|
|
51
|
+
finishReason: string | null;
|
|
52
|
+
}
|
|
53
|
+
export interface ContentSource {
|
|
54
|
+
id: string;
|
|
55
|
+
type: "url" | "file" | "text" | "pdf" | "image";
|
|
56
|
+
uri: string;
|
|
57
|
+
mimeType?: string;
|
|
58
|
+
metadata?: Record<string, unknown>;
|
|
59
|
+
}
|
|
60
|
+
export interface ContentChunk {
|
|
61
|
+
id: string;
|
|
62
|
+
sourceId: string;
|
|
63
|
+
text: string;
|
|
64
|
+
index: number;
|
|
65
|
+
embedding?: number[];
|
|
66
|
+
metadata?: Record<string, unknown>;
|
|
67
|
+
}
|
|
68
|
+
export interface ContentSearchResult {
|
|
69
|
+
chunk: ContentChunk;
|
|
70
|
+
score: number;
|
|
71
|
+
highlights?: string[];
|
|
72
|
+
}
|
|
73
|
+
export type BlockType = "text" | "code" | "citation" | "image" | "thinking" | "tool_call" | "tool_result" | "error";
|
|
74
|
+
export interface Block {
|
|
75
|
+
id: string;
|
|
76
|
+
type: BlockType;
|
|
77
|
+
data: unknown;
|
|
78
|
+
createdAt: number;
|
|
79
|
+
}
|
|
80
|
+
export interface BlockPatch {
|
|
81
|
+
op: "replace" | "append" | "remove";
|
|
82
|
+
path: string;
|
|
83
|
+
value?: unknown;
|
|
84
|
+
}
|
|
85
|
+
export interface QueryClassification {
|
|
86
|
+
intent: "factual" | "creative" | "analytical" | "conversational" | "code" | "search";
|
|
87
|
+
confidence: number;
|
|
88
|
+
entities?: string[];
|
|
89
|
+
language?: string;
|
|
90
|
+
}
|
|
91
|
+
export interface StructuredOutputSchema {
|
|
92
|
+
type: "object" | "array";
|
|
93
|
+
properties?: Record<string, {
|
|
94
|
+
type: string;
|
|
95
|
+
description?: string;
|
|
96
|
+
}>;
|
|
97
|
+
required?: string[];
|
|
98
|
+
items?: StructuredOutputSchema;
|
|
99
|
+
}
|
|
100
|
+
export type EventUrgency = "immediate" | "soon" | "later";
|
|
101
|
+
export interface AgentEventMeta {
|
|
102
|
+
/** Delivery urgency: immediate (process now), soon (next tick), later (when idle). */
|
|
103
|
+
urgency?: EventUrgency;
|
|
104
|
+
/** Priority within same urgency tier. 0 = lowest, 10 = highest. */
|
|
105
|
+
priority?: number;
|
|
106
|
+
}
|
|
107
|
+
interface BaseEvent extends AgentEventMeta {
|
|
108
|
+
timestamp: number;
|
|
109
|
+
sessionId?: string;
|
|
110
|
+
}
|
|
111
|
+
export interface AgentStartEvent extends BaseEvent {
|
|
112
|
+
type: "agent:start";
|
|
113
|
+
mode: AgentMode;
|
|
114
|
+
input: AgentInput;
|
|
115
|
+
}
|
|
116
|
+
export interface ContextBuiltEvent extends BaseEvent {
|
|
117
|
+
type: "context:built";
|
|
118
|
+
tokenCount: number;
|
|
119
|
+
messageCount: number;
|
|
120
|
+
}
|
|
121
|
+
export interface ContextOverflowEvent extends BaseEvent {
|
|
122
|
+
type: "context:overflow";
|
|
123
|
+
tokensUsed: number;
|
|
124
|
+
tokenBudget: number;
|
|
125
|
+
}
|
|
126
|
+
export interface ContextTruncatingEvent extends BaseEvent {
|
|
127
|
+
type: "context:truncating";
|
|
128
|
+
beforeTokens: number;
|
|
129
|
+
afterTokens: number;
|
|
130
|
+
strategy: string;
|
|
131
|
+
}
|
|
132
|
+
export interface TokenEvent extends BaseEvent {
|
|
133
|
+
type: "token";
|
|
134
|
+
content: string;
|
|
135
|
+
index: number;
|
|
136
|
+
}
|
|
137
|
+
export interface ToolStartEvent extends BaseEvent {
|
|
138
|
+
type: "tool:start";
|
|
139
|
+
toolName: string;
|
|
140
|
+
arguments: Record<string, unknown>;
|
|
141
|
+
callId: string;
|
|
142
|
+
}
|
|
143
|
+
export interface ToolResultEvent extends BaseEvent {
|
|
144
|
+
type: "tool:result";
|
|
145
|
+
toolName: string;
|
|
146
|
+
callId: string;
|
|
147
|
+
result?: unknown;
|
|
148
|
+
error?: string;
|
|
149
|
+
durationMs: number;
|
|
150
|
+
}
|
|
151
|
+
export interface ResponseFinalEvent extends BaseEvent {
|
|
152
|
+
type: "response:final";
|
|
153
|
+
content: string;
|
|
154
|
+
usage: {
|
|
155
|
+
inputTokens: number;
|
|
156
|
+
outputTokens: number;
|
|
157
|
+
};
|
|
158
|
+
finishReason: string | null;
|
|
159
|
+
}
|
|
160
|
+
export interface AgentEndEvent extends BaseEvent {
|
|
161
|
+
type: "agent:end";
|
|
162
|
+
reason: "complete" | "error" | "cancelled" | "timeout";
|
|
163
|
+
totalTurns: number;
|
|
164
|
+
totalTokens: number;
|
|
165
|
+
}
|
|
166
|
+
export interface LoopWarningEvent extends BaseEvent {
|
|
167
|
+
type: "loop:warning";
|
|
168
|
+
turnCount: number;
|
|
169
|
+
pattern: string;
|
|
170
|
+
}
|
|
171
|
+
export interface LoopBlockedEvent extends BaseEvent {
|
|
172
|
+
type: "loop:blocked";
|
|
173
|
+
turnCount: number;
|
|
174
|
+
reason: string;
|
|
175
|
+
}
|
|
176
|
+
export interface SessionCompactedEvent extends BaseEvent {
|
|
177
|
+
type: "session:compacted";
|
|
178
|
+
beforeTokens: number;
|
|
179
|
+
afterTokens: number;
|
|
180
|
+
droppedMessages: number;
|
|
181
|
+
}
|
|
182
|
+
export interface WrapupCompleteEvent extends BaseEvent {
|
|
183
|
+
type: "wrapup:complete";
|
|
184
|
+
summary: string;
|
|
185
|
+
}
|
|
186
|
+
export interface ModeChangedEvent extends BaseEvent {
|
|
187
|
+
type: "mode:changed";
|
|
188
|
+
from: AgentMode;
|
|
189
|
+
to: AgentMode;
|
|
190
|
+
reason: string;
|
|
191
|
+
}
|
|
192
|
+
export interface TaskPlannedEvent extends BaseEvent {
|
|
193
|
+
type: "task:planned";
|
|
194
|
+
tasks: TaskItem[];
|
|
195
|
+
}
|
|
196
|
+
export interface TaskUpdatedEvent extends BaseEvent {
|
|
197
|
+
type: "task:updated";
|
|
198
|
+
taskId: string;
|
|
199
|
+
status: TaskItemStatus;
|
|
200
|
+
title: string;
|
|
201
|
+
}
|
|
202
|
+
export interface VerificationResultEvent extends BaseEvent {
|
|
203
|
+
type: "verification:result";
|
|
204
|
+
taskId: string;
|
|
205
|
+
check: QualityCheck;
|
|
206
|
+
}
|
|
207
|
+
export interface CostTrackedEvent extends BaseEvent {
|
|
208
|
+
type: "cost:tracked";
|
|
209
|
+
provider: string;
|
|
210
|
+
model: string;
|
|
211
|
+
inputTokens: number;
|
|
212
|
+
outputTokens: number;
|
|
213
|
+
estimatedCost: number;
|
|
214
|
+
}
|
|
215
|
+
export interface ProviderCircuitOpenEvent extends BaseEvent {
|
|
216
|
+
type: "provider:circuit:open";
|
|
217
|
+
provider: string;
|
|
218
|
+
failureCount: number;
|
|
219
|
+
cooldownMs: number;
|
|
220
|
+
}
|
|
221
|
+
export interface ProviderCircuitHalfopenEvent extends BaseEvent {
|
|
222
|
+
type: "provider:circuit:halfopen";
|
|
223
|
+
provider: string;
|
|
224
|
+
}
|
|
225
|
+
export interface ProviderCircuitClosedEvent extends BaseEvent {
|
|
226
|
+
type: "provider:circuit:closed";
|
|
227
|
+
provider: string;
|
|
228
|
+
}
|
|
229
|
+
export interface QuotaWarningEvent extends BaseEvent {
|
|
230
|
+
type: "quota:warning";
|
|
231
|
+
provider: string;
|
|
232
|
+
usagePercent: number;
|
|
233
|
+
remainingTokens?: number;
|
|
234
|
+
}
|
|
235
|
+
export interface QuotaExceededEvent extends BaseEvent {
|
|
236
|
+
type: "quota:exceeded";
|
|
237
|
+
provider: string;
|
|
238
|
+
limit: number;
|
|
239
|
+
}
|
|
240
|
+
export interface ApprovalRequestedEvent extends BaseEvent {
|
|
241
|
+
type: "approval:requested";
|
|
242
|
+
toolName: string;
|
|
243
|
+
callId: string;
|
|
244
|
+
arguments: Record<string, unknown>;
|
|
245
|
+
}
|
|
246
|
+
export interface ApprovalGrantedEvent extends BaseEvent {
|
|
247
|
+
type: "approval:granted";
|
|
248
|
+
callId: string;
|
|
249
|
+
}
|
|
250
|
+
export interface ApprovalDeniedEvent extends BaseEvent {
|
|
251
|
+
type: "approval:denied";
|
|
252
|
+
callId: string;
|
|
253
|
+
reason?: string;
|
|
254
|
+
}
|
|
255
|
+
export interface SSRFBlockedEvent extends BaseEvent {
|
|
256
|
+
type: "ssrf:blocked";
|
|
257
|
+
url: string;
|
|
258
|
+
resolvedIp?: string;
|
|
259
|
+
}
|
|
260
|
+
export interface ShellBleedDetectedEvent extends BaseEvent {
|
|
261
|
+
type: "shell-bleed:detected";
|
|
262
|
+
command: string;
|
|
263
|
+
pattern: string;
|
|
264
|
+
}
|
|
265
|
+
export interface MemoryExtractedEvent extends BaseEvent {
|
|
266
|
+
type: "memory:extracted";
|
|
267
|
+
facts: string[];
|
|
268
|
+
sourceMessageId?: string;
|
|
269
|
+
}
|
|
270
|
+
export interface MemoryConsolidatedEvent extends BaseEvent {
|
|
271
|
+
type: "memory:consolidated";
|
|
272
|
+
mergedCount: number;
|
|
273
|
+
prunedCount: number;
|
|
274
|
+
}
|
|
275
|
+
export interface MemorySavedImmediateEvent extends BaseEvent {
|
|
276
|
+
type: "memory:saved-immediate";
|
|
277
|
+
key: string;
|
|
278
|
+
value: string;
|
|
279
|
+
}
|
|
280
|
+
export interface ObservationCapturedEvent extends BaseEvent {
|
|
281
|
+
type: "observation:captured";
|
|
282
|
+
observation: string;
|
|
283
|
+
confidence: number;
|
|
284
|
+
}
|
|
285
|
+
export interface ObservationThresholdExceededEvent extends BaseEvent {
|
|
286
|
+
type: "observation:threshold-exceeded";
|
|
287
|
+
observation: string;
|
|
288
|
+
count: number;
|
|
289
|
+
threshold: number;
|
|
290
|
+
}
|
|
291
|
+
export interface VoiceSTTStartEvent extends BaseEvent {
|
|
292
|
+
type: "voice:stt:start";
|
|
293
|
+
audioUrl: string;
|
|
294
|
+
}
|
|
295
|
+
export interface VoiceSTTCompleteEvent extends BaseEvent {
|
|
296
|
+
type: "voice:stt:complete";
|
|
297
|
+
transcript: string;
|
|
298
|
+
confidence: number;
|
|
299
|
+
durationMs: number;
|
|
300
|
+
}
|
|
301
|
+
export interface VoiceTTSStartEvent extends BaseEvent {
|
|
302
|
+
type: "voice:tts:start";
|
|
303
|
+
text: string;
|
|
304
|
+
}
|
|
305
|
+
export interface VoiceTTSChunkEvent extends BaseEvent {
|
|
306
|
+
type: "voice:tts:chunk";
|
|
307
|
+
audioData: Uint8Array | string;
|
|
308
|
+
index: number;
|
|
309
|
+
}
|
|
310
|
+
export interface VoiceTTSCompleteEvent extends BaseEvent {
|
|
311
|
+
type: "voice:tts:complete";
|
|
312
|
+
durationMs: number;
|
|
313
|
+
charCount: number;
|
|
314
|
+
}
|
|
315
|
+
export interface VoiceSidecarStartedEvent extends BaseEvent {
|
|
316
|
+
type: "voice:sidecar:started";
|
|
317
|
+
provider: string;
|
|
318
|
+
endpoint: string;
|
|
319
|
+
}
|
|
320
|
+
export interface VoiceSidecarCrashedEvent extends BaseEvent {
|
|
321
|
+
type: "voice:sidecar:crashed";
|
|
322
|
+
provider: string;
|
|
323
|
+
error: string;
|
|
324
|
+
restartAttempt: number;
|
|
325
|
+
}
|
|
326
|
+
export interface VoiceBargeInEvent extends BaseEvent {
|
|
327
|
+
type: "voice:barge-in";
|
|
328
|
+
spokenText: string;
|
|
329
|
+
pendingText: string;
|
|
330
|
+
turnNumber: number;
|
|
331
|
+
}
|
|
332
|
+
export interface VoiceSpeakerDetectedEvent extends BaseEvent {
|
|
333
|
+
type: "voice:speaker:detected";
|
|
334
|
+
speakerId: string;
|
|
335
|
+
isKnown: boolean;
|
|
336
|
+
label?: string;
|
|
337
|
+
}
|
|
338
|
+
export interface VoiceTurnEndEvent extends BaseEvent {
|
|
339
|
+
type: "voice:turn:end";
|
|
340
|
+
preset: string;
|
|
341
|
+
silenceDurationMs: number;
|
|
342
|
+
speakerId?: string;
|
|
343
|
+
}
|
|
344
|
+
export interface VoiceIntelligenceReadyEvent extends BaseEvent {
|
|
345
|
+
type: "voice:intelligence:ready";
|
|
346
|
+
features: string[];
|
|
347
|
+
jobId?: string;
|
|
348
|
+
}
|
|
349
|
+
export interface ErrorEvent extends BaseEvent {
|
|
350
|
+
type: "error";
|
|
351
|
+
error: string;
|
|
352
|
+
code?: string;
|
|
353
|
+
recoverable: boolean;
|
|
354
|
+
}
|
|
355
|
+
export interface ExtensionFiredEvent extends BaseEvent {
|
|
356
|
+
type: "extension:fired";
|
|
357
|
+
extensionId: string;
|
|
358
|
+
hook: string;
|
|
359
|
+
durationMs?: number;
|
|
360
|
+
}
|
|
361
|
+
export interface JobEnqueuedEvent extends BaseEvent {
|
|
362
|
+
type: "job:enqueued";
|
|
363
|
+
jobId: string;
|
|
364
|
+
jobType: string;
|
|
365
|
+
jobPriority: string;
|
|
366
|
+
}
|
|
367
|
+
export interface JobStartedEvent extends BaseEvent {
|
|
368
|
+
type: "job:started";
|
|
369
|
+
jobId: string;
|
|
370
|
+
jobType: string;
|
|
371
|
+
}
|
|
372
|
+
export interface JobCompletedEvent extends BaseEvent {
|
|
373
|
+
type: "job:completed";
|
|
374
|
+
jobId: string;
|
|
375
|
+
jobType: string;
|
|
376
|
+
result: unknown;
|
|
377
|
+
}
|
|
378
|
+
export interface JobFailedEvent extends BaseEvent {
|
|
379
|
+
type: "job:failed";
|
|
380
|
+
jobId: string;
|
|
381
|
+
jobType: string;
|
|
382
|
+
error: string;
|
|
383
|
+
attempt: number;
|
|
384
|
+
maxRetries: number;
|
|
385
|
+
}
|
|
386
|
+
export interface JobDeadEvent extends BaseEvent {
|
|
387
|
+
type: "job:dead";
|
|
388
|
+
jobId: string;
|
|
389
|
+
jobType: string;
|
|
390
|
+
totalAttempts: number;
|
|
391
|
+
}
|
|
392
|
+
export interface ContentIngestingEvent extends BaseEvent {
|
|
393
|
+
type: "content:ingesting";
|
|
394
|
+
sourceId: string;
|
|
395
|
+
stage: string;
|
|
396
|
+
progress: number;
|
|
397
|
+
}
|
|
398
|
+
export interface ContentReadyEvent extends BaseEvent {
|
|
399
|
+
type: "content:ready";
|
|
400
|
+
sourceId: string;
|
|
401
|
+
chunks: number;
|
|
402
|
+
wordCount: number;
|
|
403
|
+
}
|
|
404
|
+
export interface ContentErrorEvent extends BaseEvent {
|
|
405
|
+
type: "content:error";
|
|
406
|
+
sourceId: string;
|
|
407
|
+
stage: string;
|
|
408
|
+
error: string;
|
|
409
|
+
}
|
|
410
|
+
export interface OCRProcessingEvent extends BaseEvent {
|
|
411
|
+
type: "ocr:processing";
|
|
412
|
+
sourceId: string;
|
|
413
|
+
pageNumber: number;
|
|
414
|
+
totalPages: number;
|
|
415
|
+
}
|
|
416
|
+
export interface RetrievalTreeStepEvent extends BaseEvent {
|
|
417
|
+
type: "retrieval:tree_step";
|
|
418
|
+
nodePath: string;
|
|
419
|
+
decision: string;
|
|
420
|
+
outcome: string;
|
|
421
|
+
}
|
|
422
|
+
export interface SidecarCooldownEvent extends BaseEvent {
|
|
423
|
+
type: "sidecar:cooldown";
|
|
424
|
+
provider: string;
|
|
425
|
+
cooldownUntil: number;
|
|
426
|
+
attempts: number;
|
|
427
|
+
}
|
|
428
|
+
export interface InterventionRequestedEvent extends BaseEvent {
|
|
429
|
+
type: "intervention:requested";
|
|
430
|
+
messageId: string;
|
|
431
|
+
handler: string;
|
|
432
|
+
}
|
|
433
|
+
export interface InterventionResultEvent extends BaseEvent {
|
|
434
|
+
type: "intervention:result";
|
|
435
|
+
messageId: string;
|
|
436
|
+
action: "approve" | "deny" | "modify" | "skip";
|
|
437
|
+
}
|
|
438
|
+
export interface BlockEmittedEvent extends BaseEvent {
|
|
439
|
+
type: "block:emitted";
|
|
440
|
+
blockId: string;
|
|
441
|
+
blockType: BlockType;
|
|
442
|
+
data: unknown;
|
|
443
|
+
}
|
|
444
|
+
export interface BlockUpdatedEvent extends BaseEvent {
|
|
445
|
+
type: "block:updated";
|
|
446
|
+
blockId: string;
|
|
447
|
+
patch: BlockPatch;
|
|
448
|
+
}
|
|
449
|
+
export interface SessionReconnectedEvent extends BaseEvent {
|
|
450
|
+
type: "session:reconnected";
|
|
451
|
+
reconnectedSessionId: string;
|
|
452
|
+
replayedEventCount: number;
|
|
453
|
+
}
|
|
454
|
+
export interface QueryClassifiedEvent extends BaseEvent {
|
|
455
|
+
type: "query:classified";
|
|
456
|
+
queryId: string;
|
|
457
|
+
classification: QueryClassification;
|
|
458
|
+
standaloneQuery: string;
|
|
459
|
+
skipAgent: boolean;
|
|
460
|
+
}
|
|
461
|
+
export type AgentEvent = AgentStartEvent | ContextBuiltEvent | ContextOverflowEvent | ContextTruncatingEvent | TokenEvent | ToolStartEvent | ToolResultEvent | ResponseFinalEvent | AgentEndEvent | LoopWarningEvent | LoopBlockedEvent | SessionCompactedEvent | WrapupCompleteEvent | ModeChangedEvent | TaskPlannedEvent | TaskUpdatedEvent | VerificationResultEvent | CostTrackedEvent | ProviderCircuitOpenEvent | ProviderCircuitHalfopenEvent | ProviderCircuitClosedEvent | QuotaWarningEvent | QuotaExceededEvent | ApprovalRequestedEvent | ApprovalGrantedEvent | ApprovalDeniedEvent | SSRFBlockedEvent | ShellBleedDetectedEvent | MemoryExtractedEvent | MemoryConsolidatedEvent | MemorySavedImmediateEvent | ObservationCapturedEvent | ObservationThresholdExceededEvent | VoiceSTTStartEvent | VoiceSTTCompleteEvent | VoiceTTSStartEvent | VoiceTTSChunkEvent | VoiceTTSCompleteEvent | VoiceSidecarStartedEvent | VoiceSidecarCrashedEvent | VoiceBargeInEvent | VoiceSpeakerDetectedEvent | VoiceTurnEndEvent | VoiceIntelligenceReadyEvent | ErrorEvent | ExtensionFiredEvent | JobEnqueuedEvent | JobStartedEvent | JobCompletedEvent | JobFailedEvent | JobDeadEvent | ContentIngestingEvent | ContentReadyEvent | ContentErrorEvent | OCRProcessingEvent | RetrievalTreeStepEvent | SidecarCooldownEvent | InterventionRequestedEvent | InterventionResultEvent | BlockEmittedEvent | BlockUpdatedEvent | SessionReconnectedEvent | QueryClassifiedEvent;
|
|
462
|
+
export type EventOfType<T extends AgentEvent["type"]> = Extract<AgentEvent, {
|
|
463
|
+
type: T;
|
|
464
|
+
}>;
|
|
465
|
+
export type AgentEventType = AgentEvent["type"];
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { AgentEvent } from "./types.js";
|
|
2
|
+
import type { EventBus } from "./bus.js";
|
|
3
|
+
export type WebSocketChannel = "agent" | "workspace";
|
|
4
|
+
export interface WebSocketMessage {
|
|
5
|
+
channel: WebSocketChannel;
|
|
6
|
+
event: AgentEvent;
|
|
7
|
+
sequence: number;
|
|
8
|
+
}
|
|
9
|
+
/** Minimal sender abstraction — works with any WebSocket implementation. */
|
|
10
|
+
export interface WebSocketSender {
|
|
11
|
+
send(message: WebSocketMessage): void;
|
|
12
|
+
close(): void;
|
|
13
|
+
readonly readyState: number;
|
|
14
|
+
}
|
|
15
|
+
export interface DualWebSocketConfig {
|
|
16
|
+
/** Event bus to subscribe to */
|
|
17
|
+
bus: EventBus;
|
|
18
|
+
/** Sender for the agent channel (per-session events) */
|
|
19
|
+
agentSender: WebSocketSender;
|
|
20
|
+
/** Sender for the workspace channel (cross-session events) */
|
|
21
|
+
workspaceSender: WebSocketSender;
|
|
22
|
+
/** Event types routed to workspace channel (rest go to agent) */
|
|
23
|
+
workspaceEvents?: Set<string>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Set up dual WebSocket channels.
|
|
27
|
+
*
|
|
28
|
+
* Events are routed by type:
|
|
29
|
+
* - Workspace events (jobs, costs, provider status) → workspace channel
|
|
30
|
+
* - Everything else → agent channel
|
|
31
|
+
*
|
|
32
|
+
* Returns a teardown function that unsubscribes and closes both senders.
|
|
33
|
+
*/
|
|
34
|
+
export declare function setupDualWebSocket(config: DualWebSocketConfig): () => void;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default extension: loop guard (priority 15).
|
|
3
|
+
* Wraps LoopGuard.check() to detect stuck tool-call patterns.
|
|
4
|
+
*/
|
|
5
|
+
import type { ExtensionManager } from "../manager.js";
|
|
6
|
+
export declare function registerLoopGuard(mgr: ExtensionManager, maxTotal?: number): void;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default extension: cost tracking (priority 20).
|
|
3
|
+
* Wraps CostMeter.track() to persist token usage after calls.
|
|
4
|
+
*/
|
|
5
|
+
import type { ExtensionManager } from "../manager.js";
|
|
6
|
+
import type { CostMeter } from "../../providers/cost-meter.js";
|
|
7
|
+
export declare function registerCostTracking(mgr: ExtensionManager, meter: CostMeter): void;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default extension: rate limiting (priority 30).
|
|
3
|
+
* Simple in-memory sliding-window rate limiter.
|
|
4
|
+
*/
|
|
5
|
+
import type { ExtensionManager } from "../manager.js";
|
|
6
|
+
export declare function registerRateLimiting(mgr: ExtensionManager, windowMs?: number, maxRequests?: number): void;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default extension: observation capture (priority 40).
|
|
3
|
+
* Wraps checkObservationThresholds() for review detection.
|
|
4
|
+
*/
|
|
5
|
+
import type { ExtensionManager } from "../manager.js";
|
|
6
|
+
import type { StorageAdapter } from "../../storage/interface.js";
|
|
7
|
+
export declare function registerObservationCapture(mgr: ExtensionManager, storage: StorageAdapter): void;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default extension: context survival / compaction (priority 45).
|
|
3
|
+
* Wraps shouldCompact + sessionCompact for automatic trimming.
|
|
4
|
+
*/
|
|
5
|
+
import type { ExtensionManager } from "../manager.js";
|
|
6
|
+
export declare function registerContextSurvival(mgr: ExtensionManager): void;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default extension: steering rules (priority 55).
|
|
3
|
+
* Wraps resolveRules() to filter rules for current context.
|
|
4
|
+
*/
|
|
5
|
+
import type { ExtensionManager } from "../manager.js";
|
|
6
|
+
import type { SteeringRuleSet } from "../../config/steering-rules.js";
|
|
7
|
+
export declare function registerSteeringRules(mgr: ExtensionManager, ruleSet: SteeringRuleSet): void;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default extension: quality gates (priority 60).
|
|
3
|
+
* Wraps qualityGates() to run verification checks before completion.
|
|
4
|
+
*/
|
|
5
|
+
import type { ExtensionManager } from "../manager.js";
|
|
6
|
+
import type { TaskTracker } from "../../events/types.js";
|
|
7
|
+
export declare function registerQualityGates(mgr: ExtensionManager, _tracker: TaskTracker, _sessionId: string): void;
|