@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,24 @@
|
|
|
1
|
+
import type { ExtensionDefinition } from "../manager.js";
|
|
2
|
+
export interface JobDispatchConfig {
|
|
3
|
+
/** Callback invoked when a job is dispatched from a tool result */
|
|
4
|
+
onJobDispatched?: (job: {
|
|
5
|
+
id: string;
|
|
6
|
+
type: string;
|
|
7
|
+
toolName: string;
|
|
8
|
+
}) => void;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Create the job-dispatch default extension.
|
|
12
|
+
*
|
|
13
|
+
* This extension listens for `tool:result` events and detects when
|
|
14
|
+
* a tool has returned a job submission (id + status=queued + type).
|
|
15
|
+
* It tracks dispatched jobs and optionally notifies via callback.
|
|
16
|
+
*/
|
|
17
|
+
export declare function createJobDispatchExtension(config?: JobDispatchConfig): ExtensionDefinition;
|
|
18
|
+
/** Access tracked jobs from the extension (for testing/inspection) */
|
|
19
|
+
export declare function getDispatchedJobs(ext: ExtensionDefinition): Array<{
|
|
20
|
+
id: string;
|
|
21
|
+
type: string;
|
|
22
|
+
toolName: string;
|
|
23
|
+
timestamp: number;
|
|
24
|
+
}>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ExtensionDefinition } from "../manager.js";
|
|
2
|
+
import type { Skill } from "../../tools/skill-discovery.js";
|
|
3
|
+
export interface SkillLoaderConfig {
|
|
4
|
+
/** Pre-discovered skills to search (avoids re-scanning disk) */
|
|
5
|
+
skills: Skill[];
|
|
6
|
+
/** Maximum number of skills to inject per prompt (default: 2) */
|
|
7
|
+
maxSkills?: number;
|
|
8
|
+
/** Callback when skills are loaded into context */
|
|
9
|
+
onSkillsLoaded?: (skills: string[]) => void;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Create the skill-loader default extension.
|
|
13
|
+
*
|
|
14
|
+
* During `prompt:build`, this extension looks at the user's query
|
|
15
|
+
* (from `context.data.query`), searches the skill library, and
|
|
16
|
+
* appends matching skill instructions to the messages array.
|
|
17
|
+
*/
|
|
18
|
+
export declare function createSkillLoaderExtension(config: SkillLoaderConfig): ExtensionDefinition;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { AgentEvent, AgentEventType } from "../events/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Hook points in the agent lifecycle.
|
|
4
|
+
*
|
|
5
|
+
* - "event" hooks fire on any AgentEvent (filtered by eventTypes).
|
|
6
|
+
* - Named hooks fire at specific lifecycle points.
|
|
7
|
+
*/
|
|
8
|
+
export type HookPoint = "prompt:build" | "tool:before" | "tool:after" | "response:before" | "response:after" | "event";
|
|
9
|
+
/**
|
|
10
|
+
* Context passed to every hook invocation.
|
|
11
|
+
* The `data` field varies by hook point.
|
|
12
|
+
*/
|
|
13
|
+
export interface HookContext {
|
|
14
|
+
sessionId: string;
|
|
15
|
+
hookPoint: HookPoint;
|
|
16
|
+
/** The event that triggered this hook (for "event" hooks) */
|
|
17
|
+
event?: AgentEvent;
|
|
18
|
+
/** Mutable data bag — hooks can read/modify to pass data downstream */
|
|
19
|
+
data: Record<string, unknown>;
|
|
20
|
+
/** Accumulated messages for prompt:build hooks */
|
|
21
|
+
messages?: Array<{
|
|
22
|
+
role: string;
|
|
23
|
+
content: string;
|
|
24
|
+
}>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Return value from a hook handler.
|
|
28
|
+
* - `continue`: proceed to next hook in chain (default)
|
|
29
|
+
* - `skip`: skip remaining hooks for this point
|
|
30
|
+
* - `halt`: stop the entire pipeline (agent loop should check this)
|
|
31
|
+
*/
|
|
32
|
+
export type HookResult = {
|
|
33
|
+
action: "continue" | "skip" | "halt";
|
|
34
|
+
/** Optional data to merge into HookContext.data */
|
|
35
|
+
data?: Record<string, unknown>;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* A registered hook with its handler, priority, and metadata.
|
|
39
|
+
*/
|
|
40
|
+
export interface Hook {
|
|
41
|
+
/** Unique identifier for this hook */
|
|
42
|
+
id: string;
|
|
43
|
+
/** Which extension registered this hook */
|
|
44
|
+
extensionId: string;
|
|
45
|
+
/** Which point in the lifecycle to fire */
|
|
46
|
+
point: HookPoint;
|
|
47
|
+
/** Numeric priority — lower fires first (default: 50) */
|
|
48
|
+
priority: number;
|
|
49
|
+
/** For "event" hooks: which event types to listen to (empty = all) */
|
|
50
|
+
eventTypes?: AgentEventType[];
|
|
51
|
+
/** The handler function */
|
|
52
|
+
handler: HookHandler;
|
|
53
|
+
/** Whether this hook is currently enabled */
|
|
54
|
+
enabled: boolean;
|
|
55
|
+
}
|
|
56
|
+
export type HookHandler = (context: HookContext) => Promise<HookResult>;
|
|
57
|
+
/**
|
|
58
|
+
* Execute a chain of hooks in priority order.
|
|
59
|
+
*
|
|
60
|
+
* Hooks are sorted by priority (ascending — lower first).
|
|
61
|
+
* The chain stops early if a hook returns `skip` or `halt`.
|
|
62
|
+
* Returns the final merged context data and the terminal action.
|
|
63
|
+
*/
|
|
64
|
+
export declare function executeHookChain(hooks: Hook[], context: HookContext): Promise<{
|
|
65
|
+
action: "continue" | "skip" | "halt";
|
|
66
|
+
data: Record<string, unknown>;
|
|
67
|
+
}>;
|
|
68
|
+
/** Create a hook with sensible defaults */
|
|
69
|
+
export declare function createHook(extensionId: string, point: HookPoint, handler: HookHandler, opts?: {
|
|
70
|
+
id?: string;
|
|
71
|
+
priority?: number;
|
|
72
|
+
eventTypes?: AgentEventType[];
|
|
73
|
+
enabled?: boolean;
|
|
74
|
+
}): Hook;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export * from "./hooks.js";
|
|
2
|
+
export { ExtensionManager, type ExtensionDefinition, type ExtensionAPI } from "./manager.js";
|
|
3
|
+
export { ExtensionRunner, createExtensionRunner } from "./runner.js";
|
|
4
|
+
export { registerSessionRepair } from "./defaults/05-session-repair.js";
|
|
5
|
+
export { registerLogging } from "./defaults/10-logging.js";
|
|
6
|
+
export { registerLoopGuard } from "./defaults/15-loop-guard.js";
|
|
7
|
+
export { registerCostTracking } from "./defaults/20-cost-tracking.js";
|
|
8
|
+
export { registerSsrfProtection } from "./defaults/25-ssrf-protection.js";
|
|
9
|
+
export { registerRateLimiting } from "./defaults/30-rate-limiting.js";
|
|
10
|
+
export { registerShellBleed } from "./defaults/35-shell-bleed.js";
|
|
11
|
+
export { registerObservationCapture } from "./defaults/40-observation-capture.js";
|
|
12
|
+
export { registerContextSurvival } from "./defaults/45-context-survival.js";
|
|
13
|
+
export { registerContextBudget } from "./defaults/50-context-budget.js";
|
|
14
|
+
export { registerSteeringRules } from "./defaults/55-steering-rules.js";
|
|
15
|
+
export { registerQualityGates } from "./defaults/60-quality-gates.js";
|
|
16
|
+
export { createJobDispatchExtension, getDispatchedJobs } from "./defaults/65-job-dispatch.js";
|
|
17
|
+
export type { JobDispatchConfig } from "./defaults/65-job-dispatch.js";
|
|
18
|
+
export { createSkillLoaderExtension } from "./defaults/70-skill-loader.js";
|
|
19
|
+
export type { SkillLoaderConfig as SkillLoaderExtensionConfig } from "./defaults/70-skill-loader.js";
|
|
20
|
+
export { createInterventionPipeline } from "./intervention.js";
|
|
21
|
+
export type { InterventionMessage, InterventionAction, InterventionHandler, InterventionEventType, InterventionEvent, InterventionEventListener, InterventionPipeline, } from "./intervention.js";
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intervention Handlers — extension point for intercepting and modifying
|
|
3
|
+
* messages before agent processing. Operates on ALL messages (more
|
|
4
|
+
* powerful than tool:before/tool:after hooks).
|
|
5
|
+
*
|
|
6
|
+
* Use cases:
|
|
7
|
+
* - Content filtering (strip PII before agent sees it)
|
|
8
|
+
* - Audit logging
|
|
9
|
+
* - Rate limiting
|
|
10
|
+
* - Prompt injection scanning in agent-to-agent communication
|
|
11
|
+
*
|
|
12
|
+
* Yields intervention:requested and intervention:result events.
|
|
13
|
+
*/
|
|
14
|
+
export interface InterventionMessage {
|
|
15
|
+
role: string;
|
|
16
|
+
content: string;
|
|
17
|
+
metadata?: Record<string, unknown>;
|
|
18
|
+
}
|
|
19
|
+
export type InterventionAction = InterventionMessage | "drop";
|
|
20
|
+
export interface InterventionHandler {
|
|
21
|
+
/** Unique handler identifier. */
|
|
22
|
+
id: string;
|
|
23
|
+
/** Priority (lower runs first). Default 50. */
|
|
24
|
+
priority?: number;
|
|
25
|
+
/** Intercept outbound messages before sending to a recipient. */
|
|
26
|
+
onSend?(message: InterventionMessage, recipient: string): InterventionAction | Promise<InterventionAction>;
|
|
27
|
+
/** Intercept messages before publishing to the event bus. */
|
|
28
|
+
onPublish?(message: InterventionMessage): InterventionAction | Promise<InterventionAction>;
|
|
29
|
+
/** Intercept inbound responses from a sender. */
|
|
30
|
+
onResponse?(message: InterventionMessage, sender: string): InterventionAction | Promise<InterventionAction>;
|
|
31
|
+
}
|
|
32
|
+
export type InterventionEventType = "intervention:requested" | "intervention:result";
|
|
33
|
+
export interface InterventionEvent {
|
|
34
|
+
type: InterventionEventType;
|
|
35
|
+
timestamp: Date;
|
|
36
|
+
handlerId: string;
|
|
37
|
+
hook: "onSend" | "onPublish" | "onResponse";
|
|
38
|
+
action: "pass" | "modify" | "drop";
|
|
39
|
+
detail: string;
|
|
40
|
+
}
|
|
41
|
+
export type InterventionEventListener = (event: InterventionEvent) => void;
|
|
42
|
+
export interface InterventionPipeline {
|
|
43
|
+
/** Register a handler. */
|
|
44
|
+
register(handler: InterventionHandler): void;
|
|
45
|
+
/** Unregister a handler by ID. */
|
|
46
|
+
unregister(handlerId: string): boolean;
|
|
47
|
+
/** List registered handler IDs in priority order. */
|
|
48
|
+
listHandlers(): string[];
|
|
49
|
+
/** Run the onSend pipeline. Returns modified message or null if dropped. */
|
|
50
|
+
runSend(message: InterventionMessage, recipient: string): Promise<InterventionMessage | null>;
|
|
51
|
+
/** Run the onPublish pipeline. Returns modified message or null if dropped. */
|
|
52
|
+
runPublish(message: InterventionMessage): Promise<InterventionMessage | null>;
|
|
53
|
+
/** Run the onResponse pipeline. Returns modified message or null if dropped. */
|
|
54
|
+
runResponse(message: InterventionMessage, sender: string): Promise<InterventionMessage | null>;
|
|
55
|
+
/** Events. */
|
|
56
|
+
on(listener: InterventionEventListener): void;
|
|
57
|
+
off(listener: InterventionEventListener): void;
|
|
58
|
+
}
|
|
59
|
+
export declare function createInterventionPipeline(): InterventionPipeline;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { AgentEvent } from "../events/types.js";
|
|
2
|
+
import { type Hook, type HookPoint, type HookContext, type HookHandler } from "./hooks.js";
|
|
3
|
+
export interface ExtensionDefinition {
|
|
4
|
+
/** Unique extension ID (e.g. "fenix.job-dispatch") */
|
|
5
|
+
id: string;
|
|
6
|
+
/** Human-readable name */
|
|
7
|
+
name: string;
|
|
8
|
+
/** Semver version */
|
|
9
|
+
version?: string;
|
|
10
|
+
/** Setup function — registers hooks, called during load */
|
|
11
|
+
setup: (api: ExtensionAPI) => void | Promise<void>;
|
|
12
|
+
/** Teardown function — cleanup on unload */
|
|
13
|
+
teardown?: () => void | Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
/** API surface exposed to extensions during setup */
|
|
16
|
+
export interface ExtensionAPI {
|
|
17
|
+
/** Register a hook at a lifecycle point */
|
|
18
|
+
registerHook(point: HookPoint, handler: HookHandler, opts?: {
|
|
19
|
+
id?: string;
|
|
20
|
+
priority?: number;
|
|
21
|
+
eventTypes?: AgentEvent["type"][];
|
|
22
|
+
enabled?: boolean;
|
|
23
|
+
}): string;
|
|
24
|
+
/** Access the extension's own ID */
|
|
25
|
+
extensionId: string;
|
|
26
|
+
}
|
|
27
|
+
export declare class ExtensionManager {
|
|
28
|
+
private extensions;
|
|
29
|
+
private hooks;
|
|
30
|
+
private allHooks;
|
|
31
|
+
/** Register and set up an extension */
|
|
32
|
+
register(ext: ExtensionDefinition): Promise<void>;
|
|
33
|
+
/** Register multiple extensions in order */
|
|
34
|
+
registerAll(exts: ExtensionDefinition[]): Promise<void>;
|
|
35
|
+
/** Unregister an extension, removing all its hooks */
|
|
36
|
+
unregister(extensionId: string): Promise<void>;
|
|
37
|
+
/** Check if an extension is registered */
|
|
38
|
+
has(extensionId: string): boolean;
|
|
39
|
+
/** Get all registered extension IDs */
|
|
40
|
+
listExtensions(): string[];
|
|
41
|
+
/** Get all hooks at a specific point, sorted by priority */
|
|
42
|
+
getHooks(point: HookPoint): Hook[];
|
|
43
|
+
/** Get a hook by ID */
|
|
44
|
+
getHook(hookId: string): Hook | undefined;
|
|
45
|
+
/** Enable or disable a specific hook */
|
|
46
|
+
setHookEnabled(hookId: string, enabled: boolean): boolean;
|
|
47
|
+
/** Total registered hooks */
|
|
48
|
+
get hookCount(): number;
|
|
49
|
+
/**
|
|
50
|
+
* Dispatch a lifecycle event to all hooks at the given point.
|
|
51
|
+
* Executes the hook chain in priority order.
|
|
52
|
+
*/
|
|
53
|
+
dispatch(point: HookPoint, context: Omit<HookContext, "hookPoint">): Promise<{
|
|
54
|
+
action: "continue" | "skip" | "halt";
|
|
55
|
+
data: Record<string, unknown>;
|
|
56
|
+
}>;
|
|
57
|
+
/**
|
|
58
|
+
* Dispatch an AgentEvent to all "event" hooks.
|
|
59
|
+
* Filters hooks by their eventTypes configuration.
|
|
60
|
+
*/
|
|
61
|
+
dispatchEvent(event: AgentEvent, sessionId: string, extraData?: Record<string, unknown>): Promise<void>;
|
|
62
|
+
private removeHook;
|
|
63
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extension Runner — loads and executes extensions from default, user,
|
|
3
|
+
* and project directories with numbered prefix ordering.
|
|
4
|
+
*
|
|
5
|
+
* Three-level override: default → user → project.
|
|
6
|
+
* Extensions with the same ID registered later replace earlier ones.
|
|
7
|
+
*
|
|
8
|
+
* Hooks: tool:before, tool:after, agent:init, agent:end,
|
|
9
|
+
* memory:before-save, prompt:build, response:before, response:after, event
|
|
10
|
+
*
|
|
11
|
+
* Extension hooks are async, executed in priority order via the
|
|
12
|
+
* ExtensionManager's hook chain. A null/skip return from tool:before
|
|
13
|
+
* cancels the tool call.
|
|
14
|
+
*/
|
|
15
|
+
import { ExtensionManager, type ExtensionDefinition } from "./manager.js";
|
|
16
|
+
export interface ExtensionSource {
|
|
17
|
+
/** Directory path containing extension files */
|
|
18
|
+
path: string;
|
|
19
|
+
/** Source level for override precedence */
|
|
20
|
+
level: "default" | "user" | "project";
|
|
21
|
+
}
|
|
22
|
+
export interface ExtensionRunnerConfig {
|
|
23
|
+
/** Extension sources in override order (later overrides earlier) */
|
|
24
|
+
sources: ExtensionSource[];
|
|
25
|
+
/** Optional filter — only load extensions matching these IDs */
|
|
26
|
+
filter?: string[];
|
|
27
|
+
}
|
|
28
|
+
export declare class ExtensionRunner {
|
|
29
|
+
private readonly manager;
|
|
30
|
+
private readonly config;
|
|
31
|
+
private loaded;
|
|
32
|
+
constructor(manager: ExtensionManager, config: ExtensionRunnerConfig);
|
|
33
|
+
/**
|
|
34
|
+
* Discover and load extensions from all configured sources.
|
|
35
|
+
*
|
|
36
|
+
* Extensions are loaded in order:
|
|
37
|
+
* 1. Sorted by numeric prefix (10-logging, 15-loop-guard, etc.)
|
|
38
|
+
* 2. Within same prefix, later levels override earlier (default < user < project)
|
|
39
|
+
*
|
|
40
|
+
* Returns the number of extensions loaded.
|
|
41
|
+
*/
|
|
42
|
+
loadAll(): Promise<number>;
|
|
43
|
+
/**
|
|
44
|
+
* Load extensions from pre-built definitions (no filesystem discovery).
|
|
45
|
+
* Useful for testing or programmatic setup.
|
|
46
|
+
*/
|
|
47
|
+
loadDefinitions(definitions: ExtensionDefinition[]): Promise<number>;
|
|
48
|
+
/** Unload all loaded extensions. */
|
|
49
|
+
unloadAll(): Promise<void>;
|
|
50
|
+
/** Get the list of loaded extensions with their metadata. */
|
|
51
|
+
listLoaded(): Array<{
|
|
52
|
+
id: string;
|
|
53
|
+
level: string;
|
|
54
|
+
order: number;
|
|
55
|
+
}>;
|
|
56
|
+
/** Access the underlying extension manager. */
|
|
57
|
+
getManager(): ExtensionManager;
|
|
58
|
+
private discoverFromDirectory;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Create a runner with default configuration for the standard extension directories.
|
|
62
|
+
*/
|
|
63
|
+
export declare function createExtensionRunner(manager: ExtensionManager, basePath: string): ExtensionRunner;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { HookEvent, HookAction, HookContext, HookHandler, HookRegistrationOptions } from "./hook-types.js";
|
|
2
|
+
export declare class HookManager {
|
|
3
|
+
private hooks;
|
|
4
|
+
/**
|
|
5
|
+
* Register a handler for a lifecycle event.
|
|
6
|
+
* Returns a disposer function to unregister.
|
|
7
|
+
*/
|
|
8
|
+
on(event: HookEvent, handler: HookHandler, opts?: HookRegistrationOptions): () => void;
|
|
9
|
+
/**
|
|
10
|
+
* Execute all handlers for an event. Returns the first non-continue
|
|
11
|
+
* action, or { type: "continue" } if all handlers pass.
|
|
12
|
+
*/
|
|
13
|
+
execute(ctx: HookContext): Promise<HookAction>;
|
|
14
|
+
/**
|
|
15
|
+
* Synchronous execute for performance-critical paths.
|
|
16
|
+
* Handlers must return synchronously; async handlers are skipped.
|
|
17
|
+
*/
|
|
18
|
+
executeSync(ctx: HookContext): HookAction;
|
|
19
|
+
/** Number of registered hooks for a given event (or all events). */
|
|
20
|
+
count(event?: HookEvent): number;
|
|
21
|
+
/** Remove all hooks. */
|
|
22
|
+
clear(): void;
|
|
23
|
+
/** List all registered hook IDs for an event. */
|
|
24
|
+
list(event: HookEvent): string[];
|
|
25
|
+
private remove;
|
|
26
|
+
private matches;
|
|
27
|
+
}
|
|
28
|
+
export declare function dangerousCommandBlocker(ctx: HookContext): HookAction;
|
|
29
|
+
export declare function syntaxChecker(ctx: HookContext): HookAction;
|
|
30
|
+
export declare function contextWindowMonitor(ctx: HookContext): HookAction;
|
|
31
|
+
export declare function setSessionUnattended(sessionId: string, unattended: boolean): void;
|
|
32
|
+
export declare function autonomousDecisionEnforcer(ctx: HookContext): HookAction;
|
|
33
|
+
/**
|
|
34
|
+
* Register the 4 default guard-rail hooks on a HookManager.
|
|
35
|
+
* Priority 0 ensures they fire before user-registered hooks.
|
|
36
|
+
*/
|
|
37
|
+
export declare function registerDefaultGuardRails(manager: HookManager): void;
|
|
38
|
+
/** Reset guard rail state (for tests). */
|
|
39
|
+
export declare function _resetHookState(): void;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { ToolResult } from "../tools/router.js";
|
|
2
|
+
export type HookEvent = "swarm:start" | "swarm:stop" | "first:message" | "user:prompt" | "agent:step" | "agent:stop" | "pre:tool:use" | "post:tool:use" | "pre:delegation" | "post:delegation" | "context:warning" | "breakpoint:enter" | "breakpoint:exit";
|
|
3
|
+
export type HookAction = {
|
|
4
|
+
type: "continue";
|
|
5
|
+
} | {
|
|
6
|
+
type: "halt";
|
|
7
|
+
reason: string;
|
|
8
|
+
} | {
|
|
9
|
+
type: "replace";
|
|
10
|
+
result: ToolResult;
|
|
11
|
+
} | {
|
|
12
|
+
type: "reprompt";
|
|
13
|
+
prompt: string;
|
|
14
|
+
} | {
|
|
15
|
+
type: "finish-agent";
|
|
16
|
+
reason: string;
|
|
17
|
+
} | {
|
|
18
|
+
type: "finish-swarm";
|
|
19
|
+
reason: string;
|
|
20
|
+
};
|
|
21
|
+
export interface HookContext {
|
|
22
|
+
event: HookEvent;
|
|
23
|
+
sessionId: string;
|
|
24
|
+
agentId?: string;
|
|
25
|
+
swarmId?: string;
|
|
26
|
+
/** Tool name (for pre:tool:use / post:tool:use). */
|
|
27
|
+
toolName?: string;
|
|
28
|
+
/** Tool arguments (for pre:tool:use). */
|
|
29
|
+
toolArgs?: Record<string, unknown>;
|
|
30
|
+
/** Tool result (for post:tool:use). */
|
|
31
|
+
toolResult?: ToolResult;
|
|
32
|
+
/** Delegation target (for pre:delegation / post:delegation). */
|
|
33
|
+
delegationTarget?: string;
|
|
34
|
+
/** Context usage ratio 0–1 (for context:warning). */
|
|
35
|
+
contextUsage?: number;
|
|
36
|
+
/** User prompt text (for user:prompt / first:message). */
|
|
37
|
+
prompt?: string;
|
|
38
|
+
/** Arbitrary data bag for passing info between hooks. */
|
|
39
|
+
data?: Record<string, unknown>;
|
|
40
|
+
}
|
|
41
|
+
export type HookHandler = (ctx: HookContext) => HookAction | Promise<HookAction>;
|
|
42
|
+
export interface HookRegistrationOptions {
|
|
43
|
+
/** Regex or exact tool name match (for pre:tool:use / post:tool:use). */
|
|
44
|
+
matcher?: string | RegExp;
|
|
45
|
+
/** Context usage threshold (for context:warning). */
|
|
46
|
+
threshold?: number;
|
|
47
|
+
/** Scope to a specific agent ID. */
|
|
48
|
+
scope?: string;
|
|
49
|
+
/** Numeric priority — lower fires first. Default 50. */
|
|
50
|
+
priority?: number;
|
|
51
|
+
}
|
|
52
|
+
export interface RegisteredHook {
|
|
53
|
+
id: string;
|
|
54
|
+
event: HookEvent;
|
|
55
|
+
handler: HookHandler;
|
|
56
|
+
matcher?: RegExp;
|
|
57
|
+
threshold?: number;
|
|
58
|
+
scope?: string;
|
|
59
|
+
priority: number;
|
|
60
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Identity Assembler — reads identity files from workspace/identity/ directory,
|
|
3
|
+
* resolves per-channel overrides, and assembles into a single identity block
|
|
4
|
+
* for the system prompt.
|
|
5
|
+
*
|
|
6
|
+
* File resolution order:
|
|
7
|
+
* 1. soul.md — platform-level personality (base layer)
|
|
8
|
+
* 2. persona.md — workspace-level customization (overrides soul)
|
|
9
|
+
* 3. overrides/{channel}.md — channel-specific overrides
|
|
10
|
+
* 4. user.md — auto-populated from LPM traits
|
|
11
|
+
*
|
|
12
|
+
* Respects identity token budget (default 800 tokens).
|
|
13
|
+
*/
|
|
14
|
+
import { type MemorySegmentLike } from "./user-populator.js";
|
|
15
|
+
import type { StorageAdapter } from "../storage/interface.js";
|
|
16
|
+
export interface IdentityBlock {
|
|
17
|
+
name: string;
|
|
18
|
+
role: string | null;
|
|
19
|
+
tone: string;
|
|
20
|
+
language: string;
|
|
21
|
+
content: string;
|
|
22
|
+
tokenEstimate: number;
|
|
23
|
+
}
|
|
24
|
+
export interface AssemblerOptions {
|
|
25
|
+
/** Max tokens for the assembled identity block (default: 800) */
|
|
26
|
+
tokenBudget?: number;
|
|
27
|
+
/** Channel name for per-channel overrides (e.g. "telegram", "discord") */
|
|
28
|
+
channel?: string;
|
|
29
|
+
/** User memory segments for auto-populating user traits */
|
|
30
|
+
userSegments?: MemorySegmentLike[];
|
|
31
|
+
}
|
|
32
|
+
export declare class IdentityAssembler {
|
|
33
|
+
private readonly storage;
|
|
34
|
+
constructor(storage: StorageAdapter);
|
|
35
|
+
/** Assemble a complete identity block for the system prompt. */
|
|
36
|
+
assemble(workspaceId: string, options?: AssemblerOptions): Promise<IdentityBlock>;
|
|
37
|
+
/** Assemble from raw markdown strings (for testing or non-storage use). */
|
|
38
|
+
static assembleFromStrings(soulMd: string | null, personaMd: string | null, channelOverrideMd?: string | null, options?: {
|
|
39
|
+
tokenBudget?: number;
|
|
40
|
+
userSegments?: MemorySegmentLike[];
|
|
41
|
+
}): IdentityBlock;
|
|
42
|
+
private loadFiles;
|
|
43
|
+
private findFile;
|
|
44
|
+
private findAndParse;
|
|
45
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CCC Character Card Import/Export — Character Card V3 format adapter.
|
|
3
|
+
*
|
|
4
|
+
* Import: CCC JSON → Fenix identity files (persona.md, soul.md, knowledge.md).
|
|
5
|
+
* Export: Fenix identity files → CCC V3 JSON (or PNG with embedded metadata).
|
|
6
|
+
*/
|
|
7
|
+
export interface CharacterCardV3 {
|
|
8
|
+
spec: "chara_card_v3";
|
|
9
|
+
spec_version: "3.0";
|
|
10
|
+
data: {
|
|
11
|
+
name: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
personality?: string;
|
|
14
|
+
scenario?: string;
|
|
15
|
+
system_prompt?: string;
|
|
16
|
+
post_history_instructions?: string;
|
|
17
|
+
first_mes?: string;
|
|
18
|
+
mes_example?: string;
|
|
19
|
+
tags?: string[];
|
|
20
|
+
creator?: string;
|
|
21
|
+
creator_notes?: string;
|
|
22
|
+
alternate_greetings?: string[];
|
|
23
|
+
extensions?: Record<string, unknown>;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export interface IdentityFiles {
|
|
27
|
+
"persona.md": string;
|
|
28
|
+
"soul.md": string;
|
|
29
|
+
"knowledge.md": string;
|
|
30
|
+
metadata: Record<string, unknown>;
|
|
31
|
+
}
|
|
32
|
+
export declare function importCharacterCard(source: string | Buffer): IdentityFiles;
|
|
33
|
+
export declare function exportCharacterCard(identityDir: string): Promise<CharacterCardV3>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { IdentityAssembler, type IdentityBlock, type AssemblerOptions } from "./assembler.js";
|
|
2
|
+
export { parseSoul, type SoulConfig } from "./soul-parser.js";
|
|
3
|
+
export { parsePersona, type PersonaConfig } from "./persona-parser.js";
|
|
4
|
+
export { extractTraits, renderUserBlock, type UserTraits } from "./user-populator.js";
|
|
5
|
+
export { importCharacterCard, exportCharacterCard } from "./ccc-adapter.js";
|
|
6
|
+
export type { CharacterCardV3, IdentityFiles } from "./ccc-adapter.js";
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persona Parser — reads and parses persona.md (customer-defined overrides).
|
|
3
|
+
*
|
|
4
|
+
* persona.md allows workspace owners to customize the assistant's identity
|
|
5
|
+
* beyond the platform soul. Fields here take precedence over soul.md.
|
|
6
|
+
*
|
|
7
|
+
* Expected format:
|
|
8
|
+
* ---
|
|
9
|
+
* displayName: Aria
|
|
10
|
+
* role: Customer Success Agent
|
|
11
|
+
* language: en
|
|
12
|
+
* ---
|
|
13
|
+
* # Custom Instructions
|
|
14
|
+
* ...markdown content...
|
|
15
|
+
*/
|
|
16
|
+
export interface PersonaConfig {
|
|
17
|
+
displayName: string | null;
|
|
18
|
+
role: string | null;
|
|
19
|
+
language: string;
|
|
20
|
+
overrides: Record<string, string>;
|
|
21
|
+
content: string;
|
|
22
|
+
}
|
|
23
|
+
/** Parse a persona.md file into structured config. */
|
|
24
|
+
export declare function parsePersona(markdown: string): PersonaConfig;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Soul Parser — reads and parses soul.md (platform-level personality).
|
|
3
|
+
*
|
|
4
|
+
* soul.md defines the core personality traits, tone, and behavioral
|
|
5
|
+
* guidelines that apply across all workspaces. This is the base layer
|
|
6
|
+
* that persona.md overrides.
|
|
7
|
+
*
|
|
8
|
+
* Expected format:
|
|
9
|
+
* ---
|
|
10
|
+
* name: Fenix
|
|
11
|
+
* tone: warm, direct
|
|
12
|
+
* ---
|
|
13
|
+
* # Personality
|
|
14
|
+
* ...markdown content...
|
|
15
|
+
*/
|
|
16
|
+
export interface SoulConfig {
|
|
17
|
+
name: string;
|
|
18
|
+
tone: string;
|
|
19
|
+
traits: string[];
|
|
20
|
+
content: string;
|
|
21
|
+
}
|
|
22
|
+
/** Parse a soul.md file into structured config. */
|
|
23
|
+
export declare function parseSoul(markdown: string): SoulConfig;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User Populator — auto-populates user.md from LPM (Long-term Personal Memory) traits.
|
|
3
|
+
*
|
|
4
|
+
* Reads user preferences, facts, and traits from memory segments
|
|
5
|
+
* and assembles a user.md-style block for the system prompt.
|
|
6
|
+
*/
|
|
7
|
+
export interface UserTraits {
|
|
8
|
+
name: string | null;
|
|
9
|
+
preferences: string[];
|
|
10
|
+
facts: string[];
|
|
11
|
+
language: string | null;
|
|
12
|
+
}
|
|
13
|
+
export interface MemorySegmentLike {
|
|
14
|
+
content: string;
|
|
15
|
+
category: "fact" | "preference" | "experience" | "knowledge";
|
|
16
|
+
}
|
|
17
|
+
/** Extract user traits from memory segments. */
|
|
18
|
+
export declare function extractTraits(segments: MemorySegmentLike[]): UserTraits;
|
|
19
|
+
/** Render user traits into a user.md-style markdown block. */
|
|
20
|
+
export declare function renderUserBlock(traits: UserTraits, maxTokens?: number): string;
|