@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,170 @@
|
|
|
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
|
+
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
8
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
9
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
10
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
return path;
|
|
14
|
+
};
|
|
15
|
+
import { existsSync, readdirSync } from "node:fs";
|
|
16
|
+
import { join } from "node:path";
|
|
17
|
+
import { pathToFileURL } from "node:url";
|
|
18
|
+
import { validateHookDescriptor, issueFromError } from "../extensibility/validation.js";
|
|
19
|
+
/**
|
|
20
|
+
* Create a HookAPI instance that collects handlers.
|
|
21
|
+
* Returns the API and functions to set handlers later.
|
|
22
|
+
*/
|
|
23
|
+
function createHookAPI(handlers) {
|
|
24
|
+
let sendHandler = () => { };
|
|
25
|
+
let sendMessageHandler = () => { };
|
|
26
|
+
let sendUserMessageHandler = () => { };
|
|
27
|
+
let steerHandler = () => { };
|
|
28
|
+
let followUpHandler = () => { };
|
|
29
|
+
let isIdleHandler = () => true;
|
|
30
|
+
let appendEntryHandler = () => { };
|
|
31
|
+
const messageRenderers = new Map();
|
|
32
|
+
const commands = new Map();
|
|
33
|
+
const tools = new Map();
|
|
34
|
+
const api = {
|
|
35
|
+
on(event, handler) {
|
|
36
|
+
const list = handlers.get(event) ?? [];
|
|
37
|
+
list.push(handler);
|
|
38
|
+
handlers.set(event, list);
|
|
39
|
+
},
|
|
40
|
+
send(text) {
|
|
41
|
+
sendHandler(text);
|
|
42
|
+
},
|
|
43
|
+
sendUserMessage(text, options) {
|
|
44
|
+
return Promise.resolve(sendUserMessageHandler(text, options));
|
|
45
|
+
},
|
|
46
|
+
steer(text) {
|
|
47
|
+
return Promise.resolve(steerHandler(text));
|
|
48
|
+
},
|
|
49
|
+
followUp(text) {
|
|
50
|
+
return Promise.resolve(followUpHandler(text));
|
|
51
|
+
},
|
|
52
|
+
isIdle() {
|
|
53
|
+
return isIdleHandler();
|
|
54
|
+
},
|
|
55
|
+
sendMessage(message, triggerTurn) {
|
|
56
|
+
sendMessageHandler(message, triggerTurn);
|
|
57
|
+
},
|
|
58
|
+
appendEntry(customType, data) {
|
|
59
|
+
appendEntryHandler(customType, data);
|
|
60
|
+
},
|
|
61
|
+
registerMessageRenderer(customType, renderer) {
|
|
62
|
+
messageRenderers.set(customType, renderer);
|
|
63
|
+
},
|
|
64
|
+
registerCommand(name, options) {
|
|
65
|
+
commands.set(name, { name, ...options });
|
|
66
|
+
},
|
|
67
|
+
registerTool(tool) {
|
|
68
|
+
tools.set(tool.name, tool);
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
return {
|
|
72
|
+
api,
|
|
73
|
+
messageRenderers,
|
|
74
|
+
commands,
|
|
75
|
+
tools,
|
|
76
|
+
setSendHandler: (handler) => { sendHandler = handler; },
|
|
77
|
+
setSendMessageHandler: (handler) => { sendMessageHandler = handler; },
|
|
78
|
+
setSendUserMessageHandler: (handler) => { sendUserMessageHandler = handler; },
|
|
79
|
+
setSteerHandler: (handler) => { steerHandler = handler; },
|
|
80
|
+
setFollowUpHandler: (handler) => { followUpHandler = handler; },
|
|
81
|
+
setIsIdleHandler: (handler) => { isIdleHandler = handler; },
|
|
82
|
+
setAppendEntryHandler: (handler) => { appendEntryHandler = handler; },
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Load a single hook module.
|
|
87
|
+
*/
|
|
88
|
+
async function loadHook(hookPath) {
|
|
89
|
+
try {
|
|
90
|
+
// Use file URL for import - Bun handles TS natively
|
|
91
|
+
const fileUrl = pathToFileURL(hookPath).href;
|
|
92
|
+
const module = await import(__rewriteRelativeImportExtension(fileUrl));
|
|
93
|
+
const factory = module.default;
|
|
94
|
+
if (typeof factory !== "function") {
|
|
95
|
+
return { hook: null, error: "Hook must export a default function" };
|
|
96
|
+
}
|
|
97
|
+
// Create handlers map and API
|
|
98
|
+
const handlers = new Map();
|
|
99
|
+
const { api, messageRenderers, commands, tools, setSendHandler, setSendMessageHandler, setSendUserMessageHandler, setSteerHandler, setFollowUpHandler, setIsIdleHandler, setAppendEntryHandler, } = createHookAPI(handlers);
|
|
100
|
+
// Call factory to register handlers
|
|
101
|
+
await factory(api);
|
|
102
|
+
return {
|
|
103
|
+
hook: {
|
|
104
|
+
path: hookPath,
|
|
105
|
+
handlers,
|
|
106
|
+
messageRenderers,
|
|
107
|
+
commands,
|
|
108
|
+
tools,
|
|
109
|
+
setSendHandler,
|
|
110
|
+
setSendMessageHandler,
|
|
111
|
+
setSendUserMessageHandler,
|
|
112
|
+
setSteerHandler,
|
|
113
|
+
setFollowUpHandler,
|
|
114
|
+
setIsIdleHandler,
|
|
115
|
+
setAppendEntryHandler,
|
|
116
|
+
},
|
|
117
|
+
error: null,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
122
|
+
return { hook: null, error: `Failed to load hook: ${message}` };
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Discover hook files from a directory.
|
|
127
|
+
* Returns all .ts files in the directory (non-recursive).
|
|
128
|
+
*/
|
|
129
|
+
function discoverHooksInDir(dir) {
|
|
130
|
+
if (!existsSync(dir)) {
|
|
131
|
+
return [];
|
|
132
|
+
}
|
|
133
|
+
try {
|
|
134
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
135
|
+
return entries
|
|
136
|
+
.filter((e) => (e.isFile() || e.isSymbolicLink()) && e.name.endsWith(".ts"))
|
|
137
|
+
.map((e) => join(dir, e.name));
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return [];
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Discover and load hooks from the config directory.
|
|
145
|
+
* Loads from ~/.config/marvin/hooks/*.ts
|
|
146
|
+
*
|
|
147
|
+
* @param configDir - Base config directory (e.g., ~/.config/marvin)
|
|
148
|
+
*/
|
|
149
|
+
export async function loadHooks(configDir) {
|
|
150
|
+
const hooks = [];
|
|
151
|
+
const issues = [];
|
|
152
|
+
const hooksDir = join(configDir, "hooks");
|
|
153
|
+
const paths = discoverHooksInDir(hooksDir);
|
|
154
|
+
for (const hookPath of paths) {
|
|
155
|
+
const { hook, error } = await loadHook(hookPath);
|
|
156
|
+
if (error) {
|
|
157
|
+
issues.push(issueFromError("hook", hookPath, error));
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
if (hook) {
|
|
161
|
+
hooks.push(hook);
|
|
162
|
+
issues.push(...validateHookDescriptor({
|
|
163
|
+
path: hook.path,
|
|
164
|
+
events: Array.from(hook.handlers.keys()),
|
|
165
|
+
}));
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return { hooks, issues };
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/hooks/loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;;;;;;;;;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAWxC,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AAqDvF;;;GAGG;AACH,SAAS,aAAa,CAAC,QAAyC;IAa/D,IAAI,WAAW,GAAgB,GAAG,EAAE,GAAE,CAAC,CAAA;IACvC,IAAI,kBAAkB,GAAuB,GAAG,EAAE,GAAE,CAAC,CAAA;IACrD,IAAI,sBAAsB,GAA2B,GAAG,EAAE,GAAE,CAAC,CAAA;IAC7D,IAAI,YAAY,GAAoB,GAAG,EAAE,GAAE,CAAC,CAAA;IAC5C,IAAI,eAAe,GAAoB,GAAG,EAAE,GAAE,CAAC,CAAA;IAC/C,IAAI,aAAa,GAAkB,GAAG,EAAE,CAAC,IAAI,CAAA;IAC7C,IAAI,kBAAkB,GAAuB,GAAG,EAAE,GAAE,CAAC,CAAA;IACrD,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA+B,CAAA;IAC/D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAA;IACrD,MAAM,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAA;IAE/C,MAAM,GAAG,GAAY;QACpB,EAAE,CAAC,KAAK,EAAE,OAAO;YAChB,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;YACtC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAClB,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QAC1B,CAAC;QACD,IAAI,CAAC,IAAY;YAChB,WAAW,CAAC,IAAI,CAAC,CAAA;QAClB,CAAC;QACD,eAAe,CAAC,IAAY,EAAE,OAAO;YACpC,OAAO,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;QAC9D,CAAC;QACD,KAAK,CAAC,IAAY;YACjB,OAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;QAC3C,CAAC;QACD,QAAQ,CAAC,IAAY;YACpB,OAAO,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAA;QAC9C,CAAC;QACD,MAAM;YACL,OAAO,aAAa,EAAE,CAAA;QACvB,CAAC;QACD,WAAW,CAAC,OAAO,EAAE,WAAW;YAC/B,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;QACzC,CAAC;QACD,WAAW,CAAC,UAAU,EAAE,IAAI;YAC3B,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;QACrC,CAAC;QACD,uBAAuB,CAAC,UAAU,EAAE,QAAQ;YAC3C,gBAAgB,CAAC,GAAG,CAAC,UAAU,EAAE,QAA+B,CAAC,CAAA;QAClE,CAAC;QACD,eAAe,CAAC,IAAI,EAAE,OAAO;YAC5B,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;QACzC,CAAC;QACD,YAAY,CAAC,IAAI;YAChB,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAC3B,CAAC;KACD,CAAA;IAED,OAAO;QACN,GAAG;QACH,gBAAgB;QAChB,QAAQ;QACR,KAAK;QACL,cAAc,EAAE,CAAC,OAAO,EAAE,EAAE,GAAG,WAAW,GAAG,OAAO,CAAA,CAAC,CAAC;QACtD,qBAAqB,EAAE,CAAC,OAAO,EAAE,EAAE,GAAG,kBAAkB,GAAG,OAAO,CAAA,CAAC,CAAC;QACpE,yBAAyB,EAAE,CAAC,OAAO,EAAE,EAAE,GAAG,sBAAsB,GAAG,OAAO,CAAA,CAAC,CAAC;QAC5E,eAAe,EAAE,CAAC,OAAO,EAAE,EAAE,GAAG,YAAY,GAAG,OAAO,CAAA,CAAC,CAAC;QACxD,kBAAkB,EAAE,CAAC,OAAO,EAAE,EAAE,GAAG,eAAe,GAAG,OAAO,CAAA,CAAC,CAAC;QAC9D,gBAAgB,EAAE,CAAC,OAAO,EAAE,EAAE,GAAG,aAAa,GAAG,OAAO,CAAA,CAAC,CAAC;QAC1D,qBAAqB,EAAE,CAAC,OAAO,EAAE,EAAE,GAAG,kBAAkB,GAAG,OAAO,CAAA,CAAC,CAAC;KACpE,CAAA;AACF,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,QAAQ,CAAC,QAAgB;IACvC,IAAI,CAAC;QACJ,oDAAoD;QACpD,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAA;QAC5C,MAAM,MAAM,GAAG,MAAM,MAAM,kCAAC,OAAO,EAAC,CAAA;QACpC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAsB,CAAA;QAE7C,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;YACnC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,qCAAqC,EAAE,CAAA;QACpE,CAAC;QAED,8BAA8B;QAC9B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAA;QACtD,MAAM,EACL,GAAG,EACH,gBAAgB,EAChB,QAAQ,EACR,KAAK,EACL,cAAc,EACd,qBAAqB,EACrB,yBAAyB,EACzB,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,GACrB,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;QAE3B,oCAAoC;QACpC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAA;QAElB,OAAO;YACN,IAAI,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,QAAQ;gBACR,gBAAgB;gBAChB,QAAQ;gBACR,KAAK;gBACL,cAAc;gBACd,qBAAqB;gBACrB,yBAAyB;gBACzB,eAAe;gBACf,kBAAkB;gBAClB,gBAAgB;gBAChB,qBAAqB;aACrB;YACD,KAAK,EAAE,IAAI;SACX,CAAA;IACF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAChE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,wBAAwB,OAAO,EAAE,EAAE,CAAA;IAChE,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,SAAS,kBAAkB,CAAC,GAAW;IACtC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAA;IACV,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;QACzD,OAAO,OAAO;aACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;aAC3E,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IAChC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,EAAE,CAAA;IACV,CAAC;AACF,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,SAAiB;IAChD,MAAM,KAAK,GAAiB,EAAE,CAAA;IAC9B,MAAM,MAAM,GAAsB,EAAE,CAAA;IAEpC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IACzC,MAAM,KAAK,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAA;IAE1C,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;QAC9B,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAEhD,IAAI,KAAK,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAA;YACpD,SAAQ;QACT,CAAC;QAED,IAAI,IAAI,EAAE,CAAC;YACV,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAChB,MAAM,CAAC,IAAI,CACV,GAAG,sBAAsB,CAAC;gBACzB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;aACxC,CAAC,CACF,CAAA;QACF,CAAC;IACF,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;AACzB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Message } from "@yeshwanthyk/ai";
|
|
2
|
+
import type { HookRunner } from "./runner.js";
|
|
3
|
+
interface MessageLike {
|
|
4
|
+
role: string;
|
|
5
|
+
content?: unknown;
|
|
6
|
+
timestamp?: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Transform app messages to LLM-compatible messages.
|
|
10
|
+
* - Converts hook messages to user messages
|
|
11
|
+
* - Handles attachments (images, documents)
|
|
12
|
+
* - Applies chat.messages.transform hook
|
|
13
|
+
*/
|
|
14
|
+
export declare function transformMessages(hookRunner: HookRunner, messages: MessageLike[]): Promise<Message[]>;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=message-transformer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-transformer.d.ts","sourceRoot":"","sources":["../../src/hooks/message-transformer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAA6B,MAAM,iBAAiB,CAAA;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAS7C,UAAU,WAAW;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACtC,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,WAAW,EAAE,GACrB,OAAO,CAAC,OAAO,EAAE,CAAC,CA4CpB"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transform app messages to LLM-compatible messages.
|
|
3
|
+
* - Converts hook messages to user messages
|
|
4
|
+
* - Handles attachments (images, documents)
|
|
5
|
+
* - Applies chat.messages.transform hook
|
|
6
|
+
*/
|
|
7
|
+
export async function transformMessages(hookRunner, messages) {
|
|
8
|
+
const llmMessages = [];
|
|
9
|
+
for (const message of messages) {
|
|
10
|
+
if (message.role === "hookMessage") {
|
|
11
|
+
const hookMsg = message;
|
|
12
|
+
const content = typeof hookMsg.content === "string"
|
|
13
|
+
? [{ type: "text", text: hookMsg.content }]
|
|
14
|
+
: hookMsg.content;
|
|
15
|
+
llmMessages.push({ role: "user", content, timestamp: hookMsg.timestamp });
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
if (message.role === "user") {
|
|
19
|
+
const userMessage = message;
|
|
20
|
+
const { attachments, ...rest } = userMessage;
|
|
21
|
+
if (!attachments || attachments.length === 0) {
|
|
22
|
+
llmMessages.push(rest);
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const content = Array.isArray(rest.content)
|
|
26
|
+
? [...rest.content]
|
|
27
|
+
: [{ type: "text", text: rest.content }];
|
|
28
|
+
for (const attachment of attachments) {
|
|
29
|
+
if (attachment.type === "image") {
|
|
30
|
+
content.push({ type: "image", data: attachment.content, mimeType: attachment.mimeType });
|
|
31
|
+
}
|
|
32
|
+
else if (attachment.type === "document" && attachment.extractedText) {
|
|
33
|
+
content.push({ type: "text", text: `\n\n[Document: ${attachment.fileName}]\n${attachment.extractedText}` });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
llmMessages.push({ ...rest, content });
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (message.role === "assistant" || message.role === "toolResult") {
|
|
40
|
+
llmMessages.push(message);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Apply hook transforms
|
|
44
|
+
return hookRunner.emitContext(llmMessages);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=message-transformer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-transformer.js","sourceRoot":"","sources":["../../src/hooks/message-transformer.ts"],"names":[],"mappings":"AAiBA;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACtC,UAAsB,EACtB,QAAuB;IAEvB,MAAM,WAAW,GAAc,EAAE,CAAA;IAEjC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAChC,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,OAA0B,CAAA;YAC1C,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ;gBAClD,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpD,CAAC,CAAC,OAAO,CAAC,OAAO,CAAA;YAClB,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAA;YACzE,SAAQ;QACT,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC7B,MAAM,WAAW,GAAG,OAAqC,CAAA;YACzD,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,EAAE,GAAG,WAAW,CAAA;YAC5C,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9C,WAAW,CAAC,IAAI,CAAC,IAAe,CAAC,CAAA;gBACjC,SAAQ;YACT,CAAC;YAED,MAAM,OAAO,GAAmC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;gBAC1E,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;gBACnB,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,OAAiB,EAAE,CAAC,CAAA;YAEnD,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACtC,IAAI,UAAU,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBACjC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAA;gBACzF,CAAC;qBAAM,IAAI,UAAU,CAAC,IAAI,KAAK,UAAU,IAAI,UAAU,CAAC,aAAa,EAAE,CAAC;oBACvE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,UAAU,CAAC,QAAQ,MAAM,UAAU,CAAC,aAAa,EAAE,EAAE,CAAC,CAAA;gBAC5G,CAAC;YACF,CAAC;YAED,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAa,CAAC,CAAA;YACjD,SAAQ;QACT,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACnE,WAAW,CAAC,IAAI,CAAC,OAAkB,CAAC,CAAA;QACrC,CAAC;IACF,CAAC;IAED,wBAAwB;IACxB,OAAO,UAAU,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;AAC3C,CAAC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook runner - executes hooks and manages event emission.
|
|
3
|
+
*/
|
|
4
|
+
import type { AppendEntryHandler, DeliveryHandler, IsIdleHandler, LoadedHook, SendHandler, SendMessageHandler, SendUserMessageHandler } from "./loader.js";
|
|
5
|
+
import type { BeforeAgentStartResult, ChatMessageEvent, HookError, HookEvent, HookEventContext, HookEventType, HookMessageRenderer, HookSessionContext, HookUIContext, RegisteredCommand, RegisteredTool, TokenUsage, ToolExecuteBeforeEvent, ToolExecuteBeforeResult, ToolExecuteAfterEvent, ToolExecuteAfterResult } from "./types.js";
|
|
6
|
+
import type { AgentRunConfig } from "@yeshwanthyk/agent-core";
|
|
7
|
+
import type { Api, ImageContent, Message, Model } from "@yeshwanthyk/ai";
|
|
8
|
+
import type { ReadonlySessionManager } from "../session-manager.js";
|
|
9
|
+
/** Listener for hook errors */
|
|
10
|
+
export type HookErrorListener = (error: HookError) => void;
|
|
11
|
+
/**
|
|
12
|
+
* HookRunner executes hooks and manages event emission.
|
|
13
|
+
*/
|
|
14
|
+
export declare class HookRunner {
|
|
15
|
+
private hooks;
|
|
16
|
+
private cwd;
|
|
17
|
+
private configDir;
|
|
18
|
+
private sessionManager;
|
|
19
|
+
private uiContext;
|
|
20
|
+
private sessionContext;
|
|
21
|
+
private hasUI;
|
|
22
|
+
private errorListeners;
|
|
23
|
+
private sessionIdProvider;
|
|
24
|
+
private modelProvider;
|
|
25
|
+
private tokenUsage;
|
|
26
|
+
private contextLimit;
|
|
27
|
+
private sendUserMessageHandler;
|
|
28
|
+
private steerHandler;
|
|
29
|
+
private followUpHandler;
|
|
30
|
+
private isIdleHandler;
|
|
31
|
+
constructor(hooks: LoadedHook[], cwd: string, configDir: string, sessionManager: ReadonlySessionManager);
|
|
32
|
+
/**
|
|
33
|
+
* Initialize the runner with handlers and context providers.
|
|
34
|
+
* Must be called before emitting events.
|
|
35
|
+
*/
|
|
36
|
+
initialize(options: {
|
|
37
|
+
sendHandler: SendHandler;
|
|
38
|
+
sendMessageHandler: SendMessageHandler;
|
|
39
|
+
sendUserMessageHandler: SendUserMessageHandler;
|
|
40
|
+
steerHandler: DeliveryHandler;
|
|
41
|
+
followUpHandler: DeliveryHandler;
|
|
42
|
+
isIdleHandler: IsIdleHandler;
|
|
43
|
+
appendEntryHandler: AppendEntryHandler;
|
|
44
|
+
getSessionId: () => string | null;
|
|
45
|
+
getModel: () => Model<Api> | null;
|
|
46
|
+
uiContext?: HookUIContext;
|
|
47
|
+
sessionContext?: HookSessionContext;
|
|
48
|
+
hasUI?: boolean;
|
|
49
|
+
}): void;
|
|
50
|
+
/** Update token usage for context tracking */
|
|
51
|
+
updateTokenUsage(tokens: TokenUsage, contextLimit: number): void;
|
|
52
|
+
/** Get the paths of all loaded hooks */
|
|
53
|
+
getHookPaths(): string[];
|
|
54
|
+
/**
|
|
55
|
+
* Set the send handler for all hooks' marvin.send().
|
|
56
|
+
* Call this when the app initializes.
|
|
57
|
+
*/
|
|
58
|
+
setSendHandler(handler: SendHandler): void;
|
|
59
|
+
/** Subscribe to hook errors */
|
|
60
|
+
onError(listener: HookErrorListener): () => void;
|
|
61
|
+
private emitError;
|
|
62
|
+
private runHandlerEffect;
|
|
63
|
+
/** Check if any hooks have handlers for the given event type */
|
|
64
|
+
hasHandlers(eventType: HookEventType): boolean;
|
|
65
|
+
private createContext;
|
|
66
|
+
/**
|
|
67
|
+
* Emit a general event to all hooks.
|
|
68
|
+
* Errors are caught and reported, not propagated.
|
|
69
|
+
*/
|
|
70
|
+
emit(event: HookEvent): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Emit tool.execute.before event.
|
|
73
|
+
* If any hook blocks, returns the block result.
|
|
74
|
+
* If any hook errors, throws (fail-safe: block on error).
|
|
75
|
+
*/
|
|
76
|
+
emitToolExecuteBefore(event: ToolExecuteBeforeEvent): Promise<ToolExecuteBeforeResult | undefined>;
|
|
77
|
+
/**
|
|
78
|
+
* Emit tool.execute.after event.
|
|
79
|
+
* Returns the last non-undefined result (for chaining modifications).
|
|
80
|
+
*/
|
|
81
|
+
emitToolExecuteAfter(event: ToolExecuteAfterEvent): Promise<ToolExecuteAfterResult | undefined>;
|
|
82
|
+
/** Get current session ID */
|
|
83
|
+
getSessionId(): string | null;
|
|
84
|
+
/** Get current hook context */
|
|
85
|
+
getContext(): HookEventContext;
|
|
86
|
+
/** Get message renderer for a custom type */
|
|
87
|
+
getMessageRenderer(customType: string): HookMessageRenderer | undefined;
|
|
88
|
+
/** Get all registered commands */
|
|
89
|
+
getRegisteredCommands(): RegisteredCommand[];
|
|
90
|
+
/** Get a registered command by name */
|
|
91
|
+
getCommand(name: string): RegisteredCommand | undefined;
|
|
92
|
+
/** Get all registered tools */
|
|
93
|
+
getRegisteredTools(): RegisteredTool[];
|
|
94
|
+
/** Get a registered tool by name */
|
|
95
|
+
getTool(name: string): RegisteredTool | undefined;
|
|
96
|
+
/** Transform messages through chat.messages.transform hooks */
|
|
97
|
+
emitContext(messages: Message[]): Promise<Message[]>;
|
|
98
|
+
/** Emit chat.message event */
|
|
99
|
+
emitChatMessage(input: ChatMessageEvent["input"], output: ChatMessageEvent["output"]): Promise<void>;
|
|
100
|
+
/** Emit agent.before_start event and return first message result */
|
|
101
|
+
emitBeforeAgentStart(prompt: string, images?: ImageContent[]): Promise<BeforeAgentStartResult | undefined>;
|
|
102
|
+
/** Apply run config through chat/auth/model hooks */
|
|
103
|
+
applyRunConfig(cfg: AgentRunConfig, sessionId: string | null): Promise<AgentRunConfig>;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Create an empty hook runner (when no hooks are loaded).
|
|
107
|
+
*/
|
|
108
|
+
export declare function createEmptyRunner(cwd: string, configDir: string, sessionManager: ReadonlySessionManager): HookRunner;
|
|
109
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/hooks/runner.ts"],"names":[],"mappings":"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"}
|