@yeshwanthyk/runtime-effect 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/README.md +19 -0
- package/dist/agent.d.ts +15 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +28 -0
- package/dist/agent.js.map +1 -0
- package/dist/config.d.ts +65 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +232 -0
- package/dist/config.js.map +1 -0
- package/dist/extensibility/custom-commands.d.ts +51 -0
- package/dist/extensibility/custom-commands.d.ts.map +1 -0
- package/dist/extensibility/custom-commands.js +139 -0
- package/dist/extensibility/custom-commands.js.map +1 -0
- package/dist/extensibility/custom-tools/index.d.ts +6 -0
- package/dist/extensibility/custom-tools/index.d.ts.map +1 -0
- package/dist/extensibility/custom-tools/index.js +5 -0
- package/dist/extensibility/custom-tools/index.js.map +1 -0
- package/dist/extensibility/custom-tools/loader.d.ts +24 -0
- package/dist/extensibility/custom-tools/loader.d.ts.map +1 -0
- package/dist/extensibility/custom-tools/loader.js +219 -0
- package/dist/extensibility/custom-tools/loader.js.map +1 -0
- package/dist/extensibility/custom-tools/types.d.ts +102 -0
- package/dist/extensibility/custom-tools/types.d.ts.map +1 -0
- package/dist/extensibility/custom-tools/types.js +5 -0
- package/dist/extensibility/custom-tools/types.js.map +1 -0
- package/dist/extensibility/index.d.ts +36 -0
- package/dist/extensibility/index.d.ts.map +1 -0
- package/dist/extensibility/index.js +79 -0
- package/dist/extensibility/index.js.map +1 -0
- package/dist/extensibility/schema.d.ts +40 -0
- package/dist/extensibility/schema.d.ts.map +1 -0
- package/dist/extensibility/schema.js +75 -0
- package/dist/extensibility/schema.js.map +1 -0
- package/dist/extensibility/validation.d.ts +11 -0
- package/dist/extensibility/validation.d.ts.map +1 -0
- package/dist/extensibility/validation.js +59 -0
- package/dist/extensibility/validation.js.map +1 -0
- package/dist/hooks/context-controller.d.ts +25 -0
- package/dist/hooks/context-controller.d.ts.map +1 -0
- package/dist/hooks/context-controller.js +21 -0
- package/dist/hooks/context-controller.js.map +1 -0
- package/dist/hooks/effects.d.ts +25 -0
- package/dist/hooks/effects.d.ts.map +1 -0
- package/dist/hooks/effects.js +45 -0
- package/dist/hooks/effects.js.map +1 -0
- package/dist/hooks/hook-messages.d.ts +10 -0
- package/dist/hooks/hook-messages.d.ts.map +1 -0
- package/dist/hooks/hook-messages.js +28 -0
- package/dist/hooks/hook-messages.js.map +1 -0
- package/dist/hooks/hook-tool-adapter.d.ts +12 -0
- package/dist/hooks/hook-tool-adapter.d.ts.map +1 -0
- package/dist/hooks/hook-tool-adapter.js +39 -0
- package/dist/hooks/hook-tool-adapter.js.map +1 -0
- package/dist/hooks/hook-transport.d.ts +19 -0
- package/dist/hooks/hook-transport.d.ts.map +1 -0
- package/dist/hooks/hook-transport.js +29 -0
- package/dist/hooks/hook-transport.js.map +1 -0
- package/dist/hooks/hook-ui-context.d.ts +20 -0
- package/dist/hooks/hook-ui-context.d.ts.map +1 -0
- package/dist/hooks/hook-ui-context.js +16 -0
- package/dist/hooks/hook-ui-context.js.map +1 -0
- package/dist/hooks/index.d.ts +17 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +27 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/loader.d.ts +59 -0
- package/dist/hooks/loader.d.ts.map +1 -0
- package/dist/hooks/loader.js +170 -0
- package/dist/hooks/loader.js.map +1 -0
- package/dist/hooks/message-transformer.d.ts +16 -0
- package/dist/hooks/message-transformer.d.ts.map +1 -0
- package/dist/hooks/message-transformer.js +46 -0
- package/dist/hooks/message-transformer.js.map +1 -0
- package/dist/hooks/runner.d.ts +109 -0
- package/dist/hooks/runner.d.ts.map +1 -0
- package/dist/hooks/runner.js +426 -0
- package/dist/hooks/runner.js.map +1 -0
- package/dist/hooks/tool-wrapper.d.ts +16 -0
- package/dist/hooks/tool-wrapper.d.ts.map +1 -0
- package/dist/hooks/tool-wrapper.js +74 -0
- package/dist/hooks/tool-wrapper.js.map +1 -0
- package/dist/hooks/types.d.ts +431 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +8 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/instrumentation.d.ts +56 -0
- package/dist/instrumentation.d.ts.map +1 -0
- package/dist/instrumentation.js +13 -0
- package/dist/instrumentation.js.map +1 -0
- package/dist/lazy-tool-loader.d.ts +67 -0
- package/dist/lazy-tool-loader.d.ts.map +1 -0
- package/dist/lazy-tool-loader.js +129 -0
- package/dist/lazy-tool-loader.js.map +1 -0
- package/dist/lsp.d.ts +16 -0
- package/dist/lsp.d.ts.map +1 -0
- package/dist/lsp.js +24 -0
- package/dist/lsp.js.map +1 -0
- package/dist/runtime.d.ts +62 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +243 -0
- package/dist/runtime.js.map +1 -0
- package/dist/session/execution-plan.d.ts +53 -0
- package/dist/session/execution-plan.d.ts.map +1 -0
- package/dist/session/execution-plan.js +170 -0
- package/dist/session/execution-plan.js.map +1 -0
- package/dist/session/orchestrator.d.ts +21 -0
- package/dist/session/orchestrator.d.ts.map +1 -0
- package/dist/session/orchestrator.js +154 -0
- package/dist/session/orchestrator.js.map +1 -0
- package/dist/session/prompt-queue.d.ts +50 -0
- package/dist/session/prompt-queue.d.ts.map +1 -0
- package/dist/session/prompt-queue.js +155 -0
- package/dist/session/prompt-queue.js.map +1 -0
- package/dist/session-manager.d.ts +80 -0
- package/dist/session-manager.d.ts.map +1 -0
- package/dist/session-manager.js +257 -0
- package/dist/session-manager.js.map +1 -0
- package/dist/tools.d.ts +10 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +19 -0
- package/dist/tools.js.map +1 -0
- package/dist/transports.d.ts +18 -0
- package/dist/transports.d.ts.map +1 -0
- package/dist/transports.js +37 -0
- package/dist/transports.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Value } from "@sinclair/typebox/value";
|
|
2
|
+
import { customCommandSchema, customToolSchema, hookDescriptorSchema, } from "./schema.js";
|
|
3
|
+
const formatSchemaErrorMessage = (error) => {
|
|
4
|
+
const path = error.path === "" ? "value" : error.path;
|
|
5
|
+
return `${path}: ${error.message}`;
|
|
6
|
+
};
|
|
7
|
+
const createIssue = (params) => {
|
|
8
|
+
const issue = {
|
|
9
|
+
kind: params.kind,
|
|
10
|
+
path: params.path,
|
|
11
|
+
message: params.message,
|
|
12
|
+
severity: params.severity ?? "error",
|
|
13
|
+
};
|
|
14
|
+
if (params.hint !== undefined) {
|
|
15
|
+
issue.hint = params.hint;
|
|
16
|
+
}
|
|
17
|
+
return issue;
|
|
18
|
+
};
|
|
19
|
+
export const issueFromError = (kind, path, error, options) => {
|
|
20
|
+
const message = error instanceof Error
|
|
21
|
+
? error.message
|
|
22
|
+
: typeof error === "string"
|
|
23
|
+
? error
|
|
24
|
+
: String(error);
|
|
25
|
+
const params = { kind, path, message, severity: options?.severity ?? "error" };
|
|
26
|
+
if (options?.hint !== undefined) {
|
|
27
|
+
params.hint = options.hint;
|
|
28
|
+
}
|
|
29
|
+
return createIssue(params);
|
|
30
|
+
};
|
|
31
|
+
const validateWithSchema = (schema, value, ctx) => {
|
|
32
|
+
const errors = [...Value.Errors(schema, value)];
|
|
33
|
+
return errors.map((error) => createIssue({
|
|
34
|
+
kind: ctx.kind,
|
|
35
|
+
path: ctx.path,
|
|
36
|
+
message: formatSchemaErrorMessage(error),
|
|
37
|
+
severity: ctx.severity ?? "error",
|
|
38
|
+
}));
|
|
39
|
+
};
|
|
40
|
+
export const validateCustomCommand = (manifest, path) => {
|
|
41
|
+
return validateWithSchema(customCommandSchema, manifest, { kind: "command", path });
|
|
42
|
+
};
|
|
43
|
+
export const validateCustomTool = (descriptor, path) => {
|
|
44
|
+
return validateWithSchema(customToolSchema, descriptor, { kind: "tool", path });
|
|
45
|
+
};
|
|
46
|
+
export const validateHookDescriptor = (descriptor) => {
|
|
47
|
+
return validateWithSchema(hookDescriptorSchema, descriptor, {
|
|
48
|
+
kind: "hook",
|
|
49
|
+
path: descriptor.path,
|
|
50
|
+
severity: "warning",
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
export const formatValidationIssue = (issue) => {
|
|
54
|
+
const prefix = `[${issue.severity.toUpperCase()}][${issue.kind}]`;
|
|
55
|
+
const hint = issue.hint ? `\n hint: ${issue.hint}` : "";
|
|
56
|
+
return `${prefix} ${issue.path}: ${issue.message}${hint}`;
|
|
57
|
+
};
|
|
58
|
+
export const hasBlockingIssues = (issues) => issues.some((issue) => issue.severity === "error");
|
|
59
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/extensibility/validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import type { Api, Model } from "@yeshwanthyk/ai";
|
|
3
|
+
import type { AppendEntryHandler, DeliveryHandler, IsIdleHandler, SendHandler, SendMessageHandler, SendUserMessageHandler } from "./loader.js";
|
|
4
|
+
import type { HookSessionContext, HookUIContext } from "./types.js";
|
|
5
|
+
export interface HookContextHandlers {
|
|
6
|
+
sendHandler: SendHandler;
|
|
7
|
+
sendMessageHandler: SendMessageHandler;
|
|
8
|
+
sendUserMessageHandler: SendUserMessageHandler;
|
|
9
|
+
steerHandler: DeliveryHandler;
|
|
10
|
+
followUpHandler: DeliveryHandler;
|
|
11
|
+
isIdleHandler: IsIdleHandler;
|
|
12
|
+
appendEntryHandler: AppendEntryHandler;
|
|
13
|
+
getSessionId: () => string | null;
|
|
14
|
+
getModel: () => Model<Api> | null;
|
|
15
|
+
uiContext?: HookUIContext;
|
|
16
|
+
sessionContext?: HookSessionContext;
|
|
17
|
+
hasUI?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface HookContextController {
|
|
20
|
+
configure(handlers: HookContextHandlers): Effect.Effect<void>;
|
|
21
|
+
configured(): Effect.Effect<boolean>;
|
|
22
|
+
}
|
|
23
|
+
export declare const HookContextControllerTag: Context.Tag<HookContextController, HookContextController>;
|
|
24
|
+
export declare const HookContextControllerLayer: Layer.Layer<HookContextController, never, import("../instrumentation.js").InstrumentationService | import("../extensibility/index.js").ExtensibilityService>;
|
|
25
|
+
//# sourceMappingURL=context-controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-controller.d.ts","sourceRoot":"","sources":["../../src/hooks/context-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAO,MAAM,QAAQ,CAAA;AACpD,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EACX,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,sBAAsB,EACtB,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAInE,MAAM,WAAW,mBAAmB;IACnC,WAAW,EAAE,WAAW,CAAA;IACxB,kBAAkB,EAAE,kBAAkB,CAAA;IACtC,sBAAsB,EAAE,sBAAsB,CAAA;IAC9C,YAAY,EAAE,eAAe,CAAA;IAC7B,eAAe,EAAE,eAAe,CAAA;IAChC,aAAa,EAAE,aAAa,CAAA;IAC5B,kBAAkB,EAAE,kBAAkB,CAAA;IACtC,YAAY,EAAE,MAAM,MAAM,GAAG,IAAI,CAAA;IACjC,QAAQ,EAAE,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;IACjC,SAAS,CAAC,EAAE,aAAa,CAAA;IACzB,cAAc,CAAC,EAAE,kBAAkB,CAAA;IACnC,KAAK,CAAC,EAAE,OAAO,CAAA;CACf;AAED,MAAM,WAAW,qBAAqB;IACrC,SAAS,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC7D,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;CACpC;AAED,eAAO,MAAM,wBAAwB,2DAAoF,CAAA;AAEzH,eAAO,MAAM,0BAA0B,8JAmBtC,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Context, Effect, Layer, Ref } from "effect";
|
|
2
|
+
import { ExtensibilityTag } from "../extensibility/index.js";
|
|
3
|
+
import { InstrumentationTag } from "../instrumentation.js";
|
|
4
|
+
export const HookContextControllerTag = Context.GenericTag("runtime-effect/HookContextController");
|
|
5
|
+
export const HookContextControllerLayer = Layer.effect(HookContextControllerTag, Effect.gen(function* () {
|
|
6
|
+
const { hookRunner } = yield* ExtensibilityTag;
|
|
7
|
+
const instrumentation = yield* InstrumentationTag;
|
|
8
|
+
const configuredRef = yield* Ref.make(false);
|
|
9
|
+
return {
|
|
10
|
+
configure: Effect.fn(function* (handlers) {
|
|
11
|
+
hookRunner.initialize(handlers);
|
|
12
|
+
instrumentation.record({
|
|
13
|
+
type: "hook:context-configured",
|
|
14
|
+
hasUI: handlers.hasUI ?? false,
|
|
15
|
+
});
|
|
16
|
+
yield* Ref.set(configuredRef, true);
|
|
17
|
+
}),
|
|
18
|
+
configured: () => Ref.get(configuredRef),
|
|
19
|
+
};
|
|
20
|
+
}));
|
|
21
|
+
//# sourceMappingURL=context-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-controller.js","sourceRoot":"","sources":["../../src/hooks/context-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AAWpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAA;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAsB1D,MAAM,CAAC,MAAM,wBAAwB,GAAG,OAAO,CAAC,UAAU,CAAwB,sCAAsC,CAAC,CAAA;AAEzH,MAAM,CAAC,MAAM,0BAA0B,GAAG,KAAK,CAAC,MAAM,CACrD,wBAAwB,EACxB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACnB,MAAM,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC,CAAC,gBAAgB,CAAA;IAC9C,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,kBAAkB,CAAA;IACjD,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAE3C,OAAO;QACN,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,QAA6B;YAC5D,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;YAC/B,eAAe,CAAC,MAAM,CAAC;gBACtB,IAAI,EAAE,yBAAyB;gBAC/B,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,KAAK;aAC9B,CAAC,CAAA;YACF,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,CAAA;QACpC,CAAC,CAAC;QACF,UAAU,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC;KACR,CAAA;AACnC,CAAC,CAAC,CACF,CAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Context, Effect } from "effect";
|
|
2
|
+
import type { AgentRunConfig } from "@yeshwanthyk/agent-core";
|
|
3
|
+
import type { Message, ImageContent } from "@yeshwanthyk/ai";
|
|
4
|
+
import type { HookRunner } from "./runner.js";
|
|
5
|
+
import type { BeforeAgentStartResult, ChatMessageEvent, HookEvent, ToolExecuteAfterEvent, ToolExecuteAfterResult, ToolExecuteBeforeEvent, ToolExecuteBeforeResult } from "./types.js";
|
|
6
|
+
export interface HookEffects {
|
|
7
|
+
emit(event: HookEvent): Effect.Effect<void, unknown>;
|
|
8
|
+
emitBeforeAgentStart(prompt: string, images?: ImageContent[]): Effect.Effect<BeforeAgentStartResult | undefined, unknown>;
|
|
9
|
+
emitChatMessage(input: ChatMessageEvent["input"], output: ChatMessageEvent["output"]): Effect.Effect<void, unknown>;
|
|
10
|
+
emitToolExecuteBefore(event: ToolExecuteBeforeEvent): Effect.Effect<ToolExecuteBeforeResult | undefined, unknown>;
|
|
11
|
+
emitToolExecuteAfter(event: ToolExecuteAfterEvent): Effect.Effect<ToolExecuteAfterResult | undefined, unknown>;
|
|
12
|
+
emitContext(messages: Message[]): Effect.Effect<Message[], unknown>;
|
|
13
|
+
applyRunConfig(cfg: AgentRunConfig, sessionId: string | null): Effect.Effect<AgentRunConfig, unknown>;
|
|
14
|
+
}
|
|
15
|
+
export declare const HookEffectsTag: Context.Tag<HookEffects, HookEffects>;
|
|
16
|
+
export declare const createHookEffects: (hookRunner: HookRunner) => Effect.Effect<{
|
|
17
|
+
emit: (event: HookEvent) => Effect.Effect<undefined, unknown, never>;
|
|
18
|
+
emitBeforeAgentStart: (prompt: string, images?: ImageContent[]) => Effect.Effect<BeforeAgentStartResult | undefined, unknown, never>;
|
|
19
|
+
emitChatMessage: (input: ChatMessageEvent["input"], output: ChatMessageEvent["output"]) => Effect.Effect<undefined, unknown, never>;
|
|
20
|
+
emitToolExecuteBefore: (event: ToolExecuteBeforeEvent) => Effect.Effect<ToolExecuteBeforeResult | undefined, unknown, never>;
|
|
21
|
+
emitToolExecuteAfter: (event: ToolExecuteAfterEvent) => Effect.Effect<ToolExecuteAfterResult<unknown> | undefined, unknown, never>;
|
|
22
|
+
emitContext: (messages: Message[]) => Effect.Effect<Message[], unknown, never>;
|
|
23
|
+
applyRunConfig: (cfg: AgentRunConfig, sessionId: string | null) => Effect.Effect<AgentRunConfig, unknown, never>;
|
|
24
|
+
}, never, import("effect/Scope").Scope>;
|
|
25
|
+
//# sourceMappingURL=effects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effects.d.ts","sourceRoot":"","sources":["../../src/hooks/effects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,OAAO,EAAY,MAAM,EAAuB,MAAM,QAAQ,CAAA;AAEhF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EACX,sBAAsB,EACtB,gBAAgB,EAChB,SAAS,EACT,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,MAAM,YAAY,CAAA;AAgBnB,MAAM,WAAW,WAAW;IAC3B,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACpD,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,sBAAsB,GAAG,SAAS,EAAE,OAAO,CAAC,CAAA;IACzH,eAAe,CAAC,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACnH,qBAAqB,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAAC,MAAM,CAAC,uBAAuB,GAAG,SAAS,EAAE,OAAO,CAAC,CAAA;IACjH,oBAAoB,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,CAAC,MAAM,CAAC,sBAAsB,GAAG,SAAS,EAAE,OAAO,CAAC,CAAA;IAC9G,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAA;IACnE,cAAc,CAAC,GAAG,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,CAAA;CACrG;AAED,eAAO,MAAM,cAAc,uCAAgE,CAAA;AA+B3F,eAAO,MAAM,iBAAiB;kBAUb,SAAS;mCACQ,MAAM,WAAW,YAAY,EAAE;6BAErC,gBAAgB,CAAC,OAAO,CAAC,UAAU,gBAAgB,CAAC,QAAQ,CAAC;mCAEvD,sBAAsB;kCAGvB,qBAAqB;4BAG3B,OAAO,EAAE;0BACX,cAAc,aAAa,MAAM,GAAG,IAAI;uCAG9D,CAAA"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { Channel, Context, Deferred, Effect, Either, Exit, Queue } from "effect";
|
|
2
|
+
import { pipe } from "effect/Function";
|
|
3
|
+
class HookTaskFailure extends Error {
|
|
4
|
+
_tag = "HookTaskFailure";
|
|
5
|
+
constructor(message) {
|
|
6
|
+
super(message);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export const HookEffectsTag = Context.GenericTag("runtime-effect/HookEffects");
|
|
10
|
+
const createQueue = () => Queue.unbounded();
|
|
11
|
+
const processTask = (task) => Effect.matchEffect(Effect.tryPromise({
|
|
12
|
+
try: task.run,
|
|
13
|
+
catch: (error) => new HookTaskFailure(error instanceof Error ? error.message : String(error)),
|
|
14
|
+
}), {
|
|
15
|
+
onFailure: (error) => Deferred.fail(task.deferred, error),
|
|
16
|
+
onSuccess: (value) => Deferred.succeed(task.deferred, value),
|
|
17
|
+
}).pipe((effect) => Effect.as(effect, undefined));
|
|
18
|
+
const finishQueue = (queue) => pipe(queue.offer(Either.left(Exit.succeed(undefined))), (effect) => Effect.zipRight(effect, queue.shutdown));
|
|
19
|
+
const enqueue = Effect.fn(function* (queue, run) {
|
|
20
|
+
const deferred = yield* Deferred.make();
|
|
21
|
+
const task = {
|
|
22
|
+
run: run,
|
|
23
|
+
deferred: deferred,
|
|
24
|
+
};
|
|
25
|
+
yield* queue.offer(Either.right(task));
|
|
26
|
+
return yield* Deferred.await(deferred);
|
|
27
|
+
});
|
|
28
|
+
export const createHookEffects = Effect.fn(function* (hookRunner) {
|
|
29
|
+
const queue = yield* createQueue();
|
|
30
|
+
const worker = Channel.fromQueue(queue).pipe(Channel.mapOutEffect(processTask), Channel.drain);
|
|
31
|
+
yield* Effect.addFinalizer(() => finishQueue(queue));
|
|
32
|
+
yield* Effect.forkScoped(Channel.runDrain(worker));
|
|
33
|
+
const submit = (run) => enqueue(queue, run);
|
|
34
|
+
const submitUnit = (run) => submit(run).pipe((effect) => Effect.as(effect, undefined));
|
|
35
|
+
return {
|
|
36
|
+
emit: (event) => submitUnit(() => hookRunner.emit(event)),
|
|
37
|
+
emitBeforeAgentStart: (prompt, images) => submit(() => hookRunner.emitBeforeAgentStart(prompt, images)),
|
|
38
|
+
emitChatMessage: (input, output) => submitUnit(() => hookRunner.emitChatMessage(input, output)),
|
|
39
|
+
emitToolExecuteBefore: (event) => submit(() => hookRunner.emitToolExecuteBefore(event)),
|
|
40
|
+
emitToolExecuteAfter: (event) => submit(() => hookRunner.emitToolExecuteAfter(event)),
|
|
41
|
+
emitContext: (messages) => submit(() => hookRunner.emitContext(messages)),
|
|
42
|
+
applyRunConfig: (cfg, sessionId) => submit(() => hookRunner.applyRunConfig(cfg, sessionId)),
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
//# sourceMappingURL=effects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"effects.js","sourceRoot":"","sources":["../../src/hooks/effects.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { HookMessage } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Create a HookMessage with current timestamp.
|
|
4
|
+
*/
|
|
5
|
+
export declare function createHookMessage<T = unknown>(input: Pick<HookMessage<T>, "customType" | "content" | "display" | "details">): HookMessage<T>;
|
|
6
|
+
/**
|
|
7
|
+
* Extract text content from a HookMessage.
|
|
8
|
+
*/
|
|
9
|
+
export declare function hookMessageToText(message: HookMessage): string;
|
|
10
|
+
//# sourceMappingURL=hook-messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-messages.d.ts","sourceRoot":"","sources":["../../src/hooks/hook-messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAG7C;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,GAAG,OAAO,EAC5C,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC,GAC3E,WAAW,CAAC,CAAC,CAAC,CAchB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAM9D"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create a HookMessage with current timestamp.
|
|
3
|
+
*/
|
|
4
|
+
export function createHookMessage(input) {
|
|
5
|
+
const message = {
|
|
6
|
+
role: "hookMessage",
|
|
7
|
+
customType: input.customType,
|
|
8
|
+
content: input.content,
|
|
9
|
+
display: input.display,
|
|
10
|
+
timestamp: Date.now(),
|
|
11
|
+
};
|
|
12
|
+
if (input.details !== undefined) {
|
|
13
|
+
message.details = input.details;
|
|
14
|
+
}
|
|
15
|
+
return message;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Extract text content from a HookMessage.
|
|
19
|
+
*/
|
|
20
|
+
export function hookMessageToText(message) {
|
|
21
|
+
if (typeof message.content === "string")
|
|
22
|
+
return message.content;
|
|
23
|
+
const parts = message.content
|
|
24
|
+
.filter((part) => part.type === "text")
|
|
25
|
+
.map((part) => part.text);
|
|
26
|
+
return parts.join("\n");
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=hook-messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-messages.js","sourceRoot":"","sources":["../../src/hooks/hook-messages.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAChC,KAA6E;IAE7E,MAAM,OAAO,GAAmB;QAC/B,IAAI,EAAE,aAAa;QACnB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACrB,CAAA;IAED,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAA;IAChC,CAAC;IAED,OAAO,OAAO,CAAA;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAoB;IACrD,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC,OAAO,CAAA;IAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO;SAC3B,MAAM,CAAC,CAAC,IAAI,EAAuB,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC;SAC3D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC1B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACxB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AgentTool } from "@yeshwanthyk/ai";
|
|
2
|
+
import type { HookRunner } from "./runner.js";
|
|
3
|
+
import type { RegisteredTool, HookEventContext } from "./types.js";
|
|
4
|
+
/**
|
|
5
|
+
* Converts a hook-registered tool to an AgentTool.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createHookToolAdapter(tool: RegisteredTool, getContext: () => HookEventContext): AgentTool<any, undefined>;
|
|
8
|
+
/**
|
|
9
|
+
* Get all hook-registered tools as AgentTools.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getHookTools(hookRunner: HookRunner): AgentTool[];
|
|
12
|
+
//# sourceMappingURL=hook-tool-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-tool-adapter.d.ts","sourceRoot":"","sources":["../../src/hooks/hook-tool-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,iBAAiB,CAAA;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElE;;GAEG;AACH,wBAAgB,qBAAqB,CACpC,IAAI,EAAE,cAAc,EACpB,UAAU,EAAE,MAAM,gBAAgB,GAEhC,SAAS,CAAC,GAAG,EAAE,SAAS,CAAC,CA2B3B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,UAAU,GAAG,SAAS,EAAE,CAIhE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts a hook-registered tool to an AgentTool.
|
|
3
|
+
*/
|
|
4
|
+
export function createHookToolAdapter(tool, getContext
|
|
5
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
6
|
+
) {
|
|
7
|
+
return {
|
|
8
|
+
name: tool.name,
|
|
9
|
+
label: tool.name,
|
|
10
|
+
description: tool.description,
|
|
11
|
+
parameters: {
|
|
12
|
+
type: "object",
|
|
13
|
+
properties: Object.fromEntries(Object.entries(tool.schema.properties).map(([key, prop]) => [
|
|
14
|
+
key,
|
|
15
|
+
{ type: prop.type, description: prop.description, enum: prop.enum },
|
|
16
|
+
])),
|
|
17
|
+
required: tool.schema.required ?? [],
|
|
18
|
+
},
|
|
19
|
+
async execute(_toolCallId, params, _signal, _onUpdate) {
|
|
20
|
+
try {
|
|
21
|
+
const result = await tool.execute(params, getContext());
|
|
22
|
+
const content = [{ type: "text", text: result }];
|
|
23
|
+
return { content, details: undefined };
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
const errorText = err instanceof Error ? err.message : String(err);
|
|
27
|
+
const content = [{ type: "text", text: `Error: ${errorText}` }];
|
|
28
|
+
return { content, details: undefined };
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get all hook-registered tools as AgentTools.
|
|
35
|
+
*/
|
|
36
|
+
export function getHookTools(hookRunner) {
|
|
37
|
+
return hookRunner.getRegisteredTools().map((tool) => createHookToolAdapter(tool, () => hookRunner.getContext()));
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=hook-tool-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-tool-adapter.js","sourceRoot":"","sources":["../../src/hooks/hook-tool-adapter.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACpC,IAAoB,EACpB,UAAkC;AAClC,8DAA8D;;IAE9D,OAAO;QACN,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,IAAI;QAChB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,MAAM,CAAC,WAAW,CAC7B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;gBAC3D,GAAG;gBACH,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;aACnE,CAAC,CACF;YACD,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE;SACpC;QACD,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS;YACpD,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAiC,EAAE,UAAU,EAAE,CAAC,CAAA;gBAClF,MAAM,OAAO,GAAkB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;gBAC/D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAA;YACvC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,MAAM,SAAS,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBAClE,MAAM,OAAO,GAAkB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,SAAS,EAAE,EAAE,CAAC,CAAA;gBAC9E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAA;YACvC,CAAC;QACF,CAAC;KACD,CAAA;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,UAAsB;IAClD,OAAO,UAAU,CAAC,kBAAkB,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACnD,qBAAqB,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAC1D,CAAA;AACF,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { AgentRunConfig, AgentTransport } from "@yeshwanthyk/agent-core";
|
|
2
|
+
import type { AgentEvent, Message } from "@yeshwanthyk/ai";
|
|
3
|
+
import type { HookRunner } from "./runner.js";
|
|
4
|
+
/**
|
|
5
|
+
* Transport wrapper that applies hook transforms before passing to inner transport.
|
|
6
|
+
* - Applies chat.messages.transform to message history
|
|
7
|
+
* - Applies chat.system.transform to system prompt
|
|
8
|
+
* - Applies chat.params to stream options
|
|
9
|
+
* - Applies auth.get for API key/headers overrides
|
|
10
|
+
* - Applies model.resolve for model routing
|
|
11
|
+
*/
|
|
12
|
+
export declare class HookedTransport implements AgentTransport {
|
|
13
|
+
private inner;
|
|
14
|
+
private hooks;
|
|
15
|
+
constructor(inner: AgentTransport, hooks: HookRunner);
|
|
16
|
+
run(messages: Message[], userMessage: Message, cfg: AgentRunConfig, signal?: AbortSignal): AsyncIterable<AgentEvent>;
|
|
17
|
+
continue(messages: Message[], cfg: AgentRunConfig, signal?: AbortSignal): AsyncIterable<AgentEvent>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=hook-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-transport.d.ts","sourceRoot":"","sources":["../../src/hooks/hook-transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C;;;;;;;GAOG;AACH,qBAAa,eAAgB,YAAW,cAAc;IAEpD,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,KAAK;gBADL,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,UAAU;IAGnB,GAAG,CACT,QAAQ,EAAE,OAAO,EAAE,EACnB,WAAW,EAAE,OAAO,EACpB,GAAG,EAAE,cAAc,EACnB,MAAM,CAAC,EAAE,WAAW,GAClB,aAAa,CAAC,UAAU,CAAC;IAOrB,QAAQ,CACd,QAAQ,EAAE,OAAO,EAAE,EACnB,GAAG,EAAE,cAAc,EACnB,MAAM,CAAC,EAAE,WAAW,GAClB,aAAa,CAAC,UAAU,CAAC;CAM5B"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transport wrapper that applies hook transforms before passing to inner transport.
|
|
3
|
+
* - Applies chat.messages.transform to message history
|
|
4
|
+
* - Applies chat.system.transform to system prompt
|
|
5
|
+
* - Applies chat.params to stream options
|
|
6
|
+
* - Applies auth.get for API key/headers overrides
|
|
7
|
+
* - Applies model.resolve for model routing
|
|
8
|
+
*/
|
|
9
|
+
export class HookedTransport {
|
|
10
|
+
inner;
|
|
11
|
+
hooks;
|
|
12
|
+
constructor(inner, hooks) {
|
|
13
|
+
this.inner = inner;
|
|
14
|
+
this.hooks = hooks;
|
|
15
|
+
}
|
|
16
|
+
async *run(messages, userMessage, cfg, signal) {
|
|
17
|
+
const sessionId = this.hooks.getSessionId();
|
|
18
|
+
const nextCfg = await this.hooks.applyRunConfig(cfg, sessionId);
|
|
19
|
+
const transformed = await this.hooks.emitContext(messages);
|
|
20
|
+
yield* this.inner.run(transformed, userMessage, nextCfg, signal);
|
|
21
|
+
}
|
|
22
|
+
async *continue(messages, cfg, signal) {
|
|
23
|
+
const sessionId = this.hooks.getSessionId();
|
|
24
|
+
const nextCfg = await this.hooks.applyRunConfig(cfg, sessionId);
|
|
25
|
+
const transformed = await this.hooks.emitContext(messages);
|
|
26
|
+
yield* this.inner.continue(transformed, nextCfg, signal);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=hook-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-transport.js","sourceRoot":"","sources":["../../src/hooks/hook-transport.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,MAAM,OAAO,eAAe;IAElB;IACA;IAFT,YACS,KAAqB,EACrB,KAAiB;QADjB,UAAK,GAAL,KAAK,CAAgB;QACrB,UAAK,GAAL,KAAK,CAAY;IACvB,CAAC;IAEJ,KAAK,CAAC,CAAC,GAAG,CACT,QAAmB,EACnB,WAAoB,EACpB,GAAmB,EACnB,MAAoB;QAEpB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAA;QAC3C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;QAC/D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;QAC1D,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;IACjE,CAAC;IAED,KAAK,CAAC,CAAC,QAAQ,CACd,QAAmB,EACnB,GAAmB,EACnB,MAAoB;QAEpB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAA;QAC3C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;QAC/D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;QAC1D,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;IACzD,CAAC;CACD"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { HookUIContext } from "./types.js";
|
|
2
|
+
import type { JSX } from "solid-js";
|
|
3
|
+
/**
|
|
4
|
+
* Handlers for creating a HookUIContext.
|
|
5
|
+
*/
|
|
6
|
+
export interface HookUIHandlers {
|
|
7
|
+
setEditorText: (text: string) => void;
|
|
8
|
+
getEditorText: () => string;
|
|
9
|
+
showSelect: (title: string, options: string[]) => Promise<string | undefined>;
|
|
10
|
+
showInput: (title: string, placeholder?: string) => Promise<string | undefined>;
|
|
11
|
+
showConfirm: (title: string, message: string) => Promise<boolean>;
|
|
12
|
+
showNotify: (message: string, type?: "info" | "warning" | "error") => void;
|
|
13
|
+
showEditor?: (title: string, initialText?: string) => Promise<string | undefined>;
|
|
14
|
+
showCustom?: <T>(factory: (done: (result: T) => void) => JSX.Element) => Promise<T | undefined>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Create a HookUIContext from UI handlers.
|
|
18
|
+
*/
|
|
19
|
+
export declare function createHookUIContext(handlers: HookUIHandlers): HookUIContext;
|
|
20
|
+
//# sourceMappingURL=hook-ui-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-ui-context.d.ts","sourceRoot":"","sources":["../../src/hooks/hook-ui-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAEnC;;GAEG;AACH,MAAM,WAAW,cAAc;IAC9B,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACrC,aAAa,EAAE,MAAM,MAAM,CAAA;IAC3B,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAC7E,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAC/E,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACjE,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,KAAK,IAAI,CAAA;IAC1E,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IACjF,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,KAAK,GAAG,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAA;CAC/F;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,GAAG,aAAa,CAW3E"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create a HookUIContext from UI handlers.
|
|
3
|
+
*/
|
|
4
|
+
export function createHookUIContext(handlers) {
|
|
5
|
+
return {
|
|
6
|
+
select: handlers.showSelect,
|
|
7
|
+
confirm: handlers.showConfirm,
|
|
8
|
+
input: handlers.showInput,
|
|
9
|
+
editor: handlers.showEditor ?? (async () => undefined),
|
|
10
|
+
notify: handlers.showNotify,
|
|
11
|
+
custom: handlers.showCustom ?? (async () => undefined),
|
|
12
|
+
setEditorText: handlers.setEditorText,
|
|
13
|
+
getEditorText: handlers.getEditorText,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=hook-ui-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-ui-context.js","sourceRoot":"","sources":["../../src/hooks/hook-ui-context.ts"],"names":[],"mappings":"AAiBA;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAwB;IAC3D,OAAO;QACN,MAAM,EAAE,QAAQ,CAAC,UAAU;QAC3B,OAAO,EAAE,QAAQ,CAAC,WAAW;QAC7B,KAAK,EAAE,QAAQ,CAAC,SAAS;QACzB,MAAM,EAAE,QAAQ,CAAC,UAAU,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;QACtD,MAAM,EAAE,QAAQ,CAAC,UAAU;QAC3B,MAAM,EAAE,QAAQ,CAAC,UAAU,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;QACtD,aAAa,EAAE,QAAQ,CAAC,aAAa;QACrC,aAAa,EAAE,QAAQ,CAAC,aAAa;KACrC,CAAA;AACF,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook system for Marvin coding agent.
|
|
3
|
+
*
|
|
4
|
+
* Hooks are TypeScript modules that subscribe to agent lifecycle events.
|
|
5
|
+
* Load from ~/.config/marvin/hooks/*.ts
|
|
6
|
+
*/
|
|
7
|
+
export * from "./types.js";
|
|
8
|
+
export { loadHooks, type LoadedHook, type LoadHooksResult, type SendHandler, type SendMessageHandler, type SendUserMessageHandler, type DeliveryHandler, type IsIdleHandler, type AppendEntryHandler, } from "./loader.js";
|
|
9
|
+
export { HookRunner, createEmptyRunner, type HookErrorListener } from "./runner.js";
|
|
10
|
+
export { wrapToolWithHooks, wrapToolsWithHooks } from "./tool-wrapper.js";
|
|
11
|
+
export { createHookMessage, hookMessageToText } from "./hook-messages.js";
|
|
12
|
+
export { transformMessages } from "./message-transformer.js";
|
|
13
|
+
export { HookedTransport } from "./hook-transport.js";
|
|
14
|
+
export { createHookToolAdapter, getHookTools } from "./hook-tool-adapter.js";
|
|
15
|
+
export { createHookUIContext, type HookUIHandlers } from "./hook-ui-context.js";
|
|
16
|
+
export { HookContextControllerLayer, HookContextControllerTag, type HookContextController, type HookContextHandlers, } from "./context-controller.js";
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,cAAc,YAAY,CAAA;AAG1B,OAAO,EACN,SAAS,EACT,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,kBAAkB,GACvB,MAAM,aAAa,CAAA;AAGpB,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAGnF,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAGzE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAGzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAG5D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAGrD,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAG5E,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAG/E,OAAO,EACN,0BAA0B,EAC1B,wBAAwB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,GACxB,MAAM,yBAAyB,CAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook system for Marvin coding agent.
|
|
3
|
+
*
|
|
4
|
+
* Hooks are TypeScript modules that subscribe to agent lifecycle events.
|
|
5
|
+
* Load from ~/.config/marvin/hooks/*.ts
|
|
6
|
+
*/
|
|
7
|
+
// Re-export all types for hook authors
|
|
8
|
+
export * from "./types.js";
|
|
9
|
+
// Loader
|
|
10
|
+
export { loadHooks, } from "./loader.js";
|
|
11
|
+
// Runner
|
|
12
|
+
export { HookRunner, createEmptyRunner } from "./runner.js";
|
|
13
|
+
// Tool wrapping
|
|
14
|
+
export { wrapToolWithHooks, wrapToolsWithHooks } from "./tool-wrapper.js";
|
|
15
|
+
// Hook message utilities
|
|
16
|
+
export { createHookMessage, hookMessageToText } from "./hook-messages.js";
|
|
17
|
+
// Message transformer
|
|
18
|
+
export { transformMessages } from "./message-transformer.js";
|
|
19
|
+
// Hook transport wrapper
|
|
20
|
+
export { HookedTransport } from "./hook-transport.js";
|
|
21
|
+
// Hook tool adapter
|
|
22
|
+
export { createHookToolAdapter, getHookTools } from "./hook-tool-adapter.js";
|
|
23
|
+
// Hook UI context
|
|
24
|
+
export { createHookUIContext } from "./hook-ui-context.js";
|
|
25
|
+
// Hook context controller
|
|
26
|
+
export { HookContextControllerLayer, HookContextControllerTag, } from "./context-controller.js";
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,uCAAuC;AACvC,cAAc,YAAY,CAAA;AAE1B,SAAS;AACT,OAAO,EACN,SAAS,GAST,MAAM,aAAa,CAAA;AAEpB,SAAS;AACT,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAA0B,MAAM,aAAa,CAAA;AAEnF,gBAAgB;AAChB,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAEzE,yBAAyB;AACzB,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAEzE,sBAAsB;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAE5D,yBAAyB;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAErD,oBAAoB;AACpB,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAE5E,kBAAkB;AAClB,OAAO,EAAE,mBAAmB,EAAuB,MAAM,sBAAsB,CAAA;AAE/E,0BAA0B;AAC1B,OAAO,EACN,0BAA0B,EAC1B,wBAAwB,GAGxB,MAAM,yBAAyB,CAAA"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook loader - discovers and loads TypeScript hook modules.
|
|
3
|
+
*
|
|
4
|
+
* Hooks are loaded from ~/.config/marvin/hooks/*.ts (non-recursive).
|
|
5
|
+
* Uses Bun's native import() which handles TypeScript directly.
|
|
6
|
+
*/
|
|
7
|
+
import type { HookEventType, HookMessage, HookMessageRenderer, RegisteredCommand, RegisteredTool } from "./types.js";
|
|
8
|
+
import type { ValidationIssue } from "../extensibility/schema.js";
|
|
9
|
+
import type { PromptDeliveryMode } from "../session/prompt-queue.js";
|
|
10
|
+
/** Generic handler function type for internal storage */
|
|
11
|
+
type HandlerFn = (event: any, ctx: any) => Promise<unknown> | unknown;
|
|
12
|
+
/** Send handler type for marvin.send() */
|
|
13
|
+
export type SendHandler = (text: string) => void;
|
|
14
|
+
/** Send message handler type for marvin.sendMessage() */
|
|
15
|
+
export type SendMessageHandler = <T = unknown>(message: Pick<HookMessage<T>, "customType" | "content" | "display" | "details">, triggerTurn?: boolean) => void;
|
|
16
|
+
export type SendUserMessageHandler = (text: string, options?: {
|
|
17
|
+
deliverAs?: PromptDeliveryMode;
|
|
18
|
+
}) => Promise<void> | void;
|
|
19
|
+
export type DeliveryHandler = (text: string) => Promise<void> | void;
|
|
20
|
+
export type IsIdleHandler = () => boolean;
|
|
21
|
+
/** Append entry handler type for marvin.appendEntry() */
|
|
22
|
+
export type AppendEntryHandler = <T = unknown>(customType: string, data?: T) => void;
|
|
23
|
+
/** Registered handlers for a loaded hook */
|
|
24
|
+
export interface LoadedHook {
|
|
25
|
+
/** Original file path */
|
|
26
|
+
path: string;
|
|
27
|
+
/** Map of event type to handler functions */
|
|
28
|
+
handlers: Map<HookEventType, HandlerFn[]>;
|
|
29
|
+
/** Map of custom type to message renderer */
|
|
30
|
+
messageRenderers: Map<string, HookMessageRenderer>;
|
|
31
|
+
/** Map of command name to registered command */
|
|
32
|
+
commands: Map<string, RegisteredCommand>;
|
|
33
|
+
/** Map of tool name to registered tool */
|
|
34
|
+
tools: Map<string, RegisteredTool>;
|
|
35
|
+
/** Set the send handler for this hook's marvin.send() */
|
|
36
|
+
setSendHandler: (handler: SendHandler) => void;
|
|
37
|
+
/** Set the sendMessage handler for this hook's marvin.sendMessage() */
|
|
38
|
+
setSendMessageHandler: (handler: SendMessageHandler) => void;
|
|
39
|
+
setSendUserMessageHandler: (handler: SendUserMessageHandler) => void;
|
|
40
|
+
setSteerHandler: (handler: DeliveryHandler) => void;
|
|
41
|
+
setFollowUpHandler: (handler: DeliveryHandler) => void;
|
|
42
|
+
setIsIdleHandler: (handler: IsIdleHandler) => void;
|
|
43
|
+
/** Set the appendEntry handler for this hook's marvin.appendEntry() */
|
|
44
|
+
setAppendEntryHandler: (handler: AppendEntryHandler) => void;
|
|
45
|
+
}
|
|
46
|
+
/** Result of loading hooks */
|
|
47
|
+
export interface LoadHooksResult {
|
|
48
|
+
hooks: LoadedHook[];
|
|
49
|
+
issues: ValidationIssue[];
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Discover and load hooks from the config directory.
|
|
53
|
+
* Loads from ~/.config/marvin/hooks/*.ts
|
|
54
|
+
*
|
|
55
|
+
* @param configDir - Base config directory (e.g., ~/.config/marvin)
|
|
56
|
+
*/
|
|
57
|
+
export declare function loadHooks(configDir: string): Promise<LoadHooksResult>;
|
|
58
|
+
export {};
|
|
59
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/hooks/loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAEX,aAAa,EAEb,WAAW,EACX,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAEjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAEpE,yDAAyD;AAEzD,KAAK,SAAS,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAA;AAErE,0CAA0C;AAC1C,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;AAEhD,yDAAyD;AACzD,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,GAAG,OAAO,EAC5C,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC,EAC/E,WAAW,CAAC,EAAE,OAAO,KACjB,IAAI,CAAA;AAET,MAAM,MAAM,sBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,kBAAkB,CAAA;CAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;AACzH,MAAM,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;AACpE,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,CAAA;AAEzC,yDAAyD;AACzD,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,CAAA;AAEpF,4CAA4C;AAC5C,MAAM,WAAW,UAAU;IAC1B,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,6CAA6C;IAC7C,QAAQ,EAAE,GAAG,CAAC,aAAa,EAAE,SAAS,EAAE,CAAC,CAAA;IACzC,6CAA6C;IAC7C,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;IAClD,gDAAgD;IAChD,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;IACxC,0CAA0C;IAC1C,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IAClC,yDAAyD;IACzD,cAAc,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAA;IAC9C,uEAAuE;IACvE,qBAAqB,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,IAAI,CAAA;IAC5D,yBAAyB,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,IAAI,CAAA;IACpE,eAAe,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAA;IACnD,kBAAkB,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAA;IACtD,gBAAgB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAA;IAClD,uEAAuE;IACvE,qBAAqB,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,IAAI,CAAA;CAC5D;AAED,8BAA8B;AAC9B,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,UAAU,EAAE,CAAA;IACnB,MAAM,EAAE,eAAe,EAAE,CAAA;CACzB;AA8JD;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA2B3E"}
|