@agimon-ai/doompi-hook 0.0.1-alpha.87 → 0.0.1-alpha.89
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 +112 -54
- package/dist/authoring.cjs +10 -0
- package/dist/authoring.cjs.map +1 -0
- package/dist/authoring.d.mts +7 -0
- package/dist/authoring.d.mts.map +1 -0
- package/dist/authoring.mjs +9 -0
- package/dist/authoring.mjs.map +1 -0
- package/dist/extensions/pi.cjs +104 -227
- package/dist/extensions/pi.cjs.map +1 -1
- package/dist/extensions/pi.d.mts +1 -1
- package/dist/extensions/pi.d.mts.map +1 -1
- package/dist/extensions/pi.mjs +94 -217
- package/dist/extensions/pi.mjs.map +1 -1
- package/dist/extensions/server.cjs +157 -38
- package/dist/extensions/server.cjs.map +1 -1
- package/dist/extensions/server.d.mts.map +1 -1
- package/dist/extensions/server.mjs +159 -40
- package/dist/extensions/server.mjs.map +1 -1
- package/dist/hookModule-c2GtLnm1.d.mts +54 -0
- package/dist/hookModule-c2GtLnm1.d.mts.map +1 -0
- package/dist/{hooks-GyYjEZKZ.mjs → hookModules-DAFDGPUC.mjs} +257 -8
- package/dist/hookModules-DAFDGPUC.mjs.map +1 -0
- package/dist/{hooks-BeDKiWFr.cjs → hookModules-hfDQUKiA.cjs} +264 -7
- package/dist/hookModules-hfDQUKiA.cjs.map +1 -0
- package/dist/hookRuntime-BLFf_6_E.cjs +435 -0
- package/dist/hookRuntime-BLFf_6_E.cjs.map +1 -0
- package/dist/hookRuntime-D27m9ndl.mjs +346 -0
- package/dist/hookRuntime-D27m9ndl.mjs.map +1 -0
- package/dist/{index-CcfteHKn.d.mts → index-Dhd9UC9g.d.mts} +79 -11
- package/dist/index-Dhd9UC9g.d.mts.map +1 -0
- package/dist/index.cjs +22 -21
- package/dist/index.d.mts +3 -2
- package/dist/index.mjs +2 -2
- package/llms.txt +2 -2
- package/package.json +12 -7
- package/src/prompts/doompi-author-hook/SKILL.md +97 -20
- package/dist/hooks-BeDKiWFr.cjs.map +0 -1
- package/dist/hooks-GyYjEZKZ.mjs.map +0 -1
- package/dist/index-CcfteHKn.d.mts.map +0 -1
package/dist/extensions/pi.cjs
CHANGED
|
@@ -2,116 +2,86 @@ Object.defineProperties(exports, {
|
|
|
2
2
|
__esModule: { value: true },
|
|
3
3
|
[Symbol.toStringTag]: { value: "Module" }
|
|
4
4
|
});
|
|
5
|
-
const
|
|
5
|
+
const require_hookModules = require("../hookModules-hfDQUKiA.cjs");
|
|
6
|
+
const require_hookRuntime = require("../hookRuntime-BLFf_6_E.cjs");
|
|
6
7
|
let _agimon_ai_doompi_core_piExtension = require("@agimon-ai/doompi-core/piExtension");
|
|
7
8
|
let _agimon_ai_doompi_core_extensionFile = require("@agimon-ai/doompi-core/extensionFile");
|
|
8
|
-
let
|
|
9
|
-
let _agimon_ai_doompi_core_config = require("@agimon-ai/doompi-core/config");
|
|
10
|
-
let _agimon_ai_doompi_core_readiness = require("@agimon-ai/doompi-core/readiness");
|
|
11
|
-
//#region src/constants/hookHandlers.ts
|
|
12
|
-
const STATUS_PREFIX = "repository-hooks";
|
|
13
|
-
const FAILURE_MESSAGE_TYPE = "repository-hook-failure";
|
|
14
|
-
const CONTEXT_MESSAGE_TYPE = "repository-hook-context";
|
|
15
|
-
/** A Stop hook refused the stop; its reason sends the agent back to work. */
|
|
16
|
-
const STOP_BLOCK_MESSAGE_TYPE = "repository-hook-stop-block";
|
|
17
|
-
const STEER = { deliverAs: "steer" };
|
|
18
|
-
/** Starts a new turn on a settled agent, so a refused stop is not a silent one. */
|
|
19
|
-
const FOLLOW_UP_TURN = {
|
|
20
|
-
deliverAs: "followUp",
|
|
21
|
-
triggerTurn: true
|
|
22
|
-
};
|
|
23
|
-
/** Adds a message to a settled agent's conversation without starting a turn. */
|
|
24
|
-
const NO_TURN = { triggerTurn: false };
|
|
25
|
-
/** Claude's Stop hook input field: true when the agent is already continuing because of a Stop hook. */
|
|
26
|
-
const STOP_HOOK_ACTIVE_FIELD = "stop_hook_active";
|
|
27
|
-
const SUBAGENT_ENVIRONMENT_FLAG = "PI_SUBAGENT_CHILD";
|
|
28
|
-
//#endregion
|
|
9
|
+
let _agimon_ai_doompi_core_cordisHost = require("@agimon-ai/doompi-core/cordisHost");
|
|
29
10
|
//#region src/services/hookHandlers/index.ts
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
*/
|
|
36
|
-
async function resolveHooks(session, ctx, eventName, toolName) {
|
|
37
|
-
const harness = session.config().harness;
|
|
38
|
-
const repoRoot = harness.root ?? ctx.cwd;
|
|
39
|
-
const [registry, plugins] = await Promise.all([session.documents.registry(repoRoot), session.documents.plugins(harness.pluginHooks)]);
|
|
40
|
-
const hooks = [...require_hooks.selectRegistryHooks(registry.entries, {
|
|
41
|
-
event: eventName,
|
|
42
|
-
toolName,
|
|
43
|
-
allowedGroups: harness.hookGroups,
|
|
44
|
-
inSubagent: Boolean(process.env[SUBAGENT_ENVIRONMENT_FLAG])
|
|
45
|
-
}), ...require_hooks.selectPluginHooks(plugins.documents, eventName, toolName)];
|
|
46
|
-
return {
|
|
47
|
-
repoRoot,
|
|
48
|
-
sessionId: ctx.sessionManager.getSessionId(),
|
|
49
|
-
hooks,
|
|
50
|
-
failures: [...registry.failure ? [registry.failure] : [], ...plugins.failures]
|
|
11
|
+
function scopeFor(pi, session, ctx) {
|
|
12
|
+
if (session.parentContext) return {
|
|
13
|
+
...session.parentContext,
|
|
14
|
+
signal: session.signal,
|
|
15
|
+
operationSignal: ctx.signal
|
|
51
16
|
};
|
|
52
|
-
}
|
|
53
|
-
/** Session end is plugin-only: the registry has no binding for it. */
|
|
54
|
-
async function resolvePluginHooks(session, ctx, eventName) {
|
|
55
|
-
const harness = session.config().harness;
|
|
56
|
-
const plugins = await session.documents.plugins(harness.pluginHooks);
|
|
57
17
|
return {
|
|
58
|
-
repoRoot: harness.root ?? ctx.cwd,
|
|
59
18
|
sessionId: ctx.sessionManager.getSessionId(),
|
|
60
|
-
|
|
61
|
-
|
|
19
|
+
isSubagent: Boolean(process.env[require_hookRuntime.SUBAGENT_ENVIRONMENT_FLAG]),
|
|
20
|
+
cwd: ctx.cwd,
|
|
21
|
+
repoRoot: session.config().harness.root ?? ctx.cwd,
|
|
22
|
+
...ctx.model ? { model: {
|
|
23
|
+
provider: ctx.model.provider,
|
|
24
|
+
id: ctx.model.id
|
|
25
|
+
} } : {},
|
|
26
|
+
signal: session.signal,
|
|
27
|
+
operationSignal: ctx.signal,
|
|
28
|
+
async sendMessage(text, delivery) {
|
|
29
|
+
pi.sendMessage({
|
|
30
|
+
customType: require_hookRuntime.CONTEXT_MESSAGE_TYPE,
|
|
31
|
+
content: text,
|
|
32
|
+
display: true
|
|
33
|
+
}, { deliverAs: delivery });
|
|
34
|
+
},
|
|
35
|
+
async appendCustomEntry(type, data) {
|
|
36
|
+
pi.appendEntry(type, data);
|
|
37
|
+
}
|
|
62
38
|
};
|
|
63
39
|
}
|
|
64
|
-
async function
|
|
65
|
-
const outcomes = [];
|
|
40
|
+
async function runPiDispatch(pi, session, ctx, request, statusKey, statusLabel, signal) {
|
|
66
41
|
try {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
42
|
+
const scope = scopeFor(pi, session, ctx);
|
|
43
|
+
return await require_hookRuntime.dispatchHooks(session, {
|
|
44
|
+
...scope,
|
|
45
|
+
operationSignal: signal ?? scope.operationSignal
|
|
46
|
+
}, {
|
|
47
|
+
...request,
|
|
48
|
+
progress: (index, total) => {
|
|
49
|
+
if (ctx.hasUI) ctx.ui.setStatus(statusKey, `${statusLabel} (${index + 1}/${total})...`);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
74
52
|
} finally {
|
|
75
53
|
if (ctx.hasUI) ctx.ui.setStatus(statusKey, void 0);
|
|
76
54
|
}
|
|
77
|
-
return outcomes;
|
|
78
55
|
}
|
|
79
|
-
function
|
|
80
|
-
return [...dispatch.failures, ...require_hooks.failuresFrom(outcomes)];
|
|
81
|
-
}
|
|
82
|
-
function steerHookFailures(pi, failures) {
|
|
56
|
+
async function steerHookFailures(pi, session, failures) {
|
|
83
57
|
if (failures.length === 0) return;
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
}, STEER);
|
|
89
|
-
}
|
|
90
|
-
async function runSessionStartHooks(pi, session, ctx, signal, isCurrent = () => true) {
|
|
91
|
-
signal?.throwIfAborted();
|
|
92
|
-
const dispatch = await resolveHooks(session, ctx, require_hooks.HOOK_EVENT.sessionStart);
|
|
93
|
-
signal?.throwIfAborted();
|
|
94
|
-
const outcomes = await runHooks(session, ctx, dispatch, require_hooks.sessionHookPayload(dispatch.sessionId, dispatch.repoRoot), `${STATUS_PREFIX}:${dispatch.sessionId}:start`, "Running session-start hooks");
|
|
95
|
-
signal?.throwIfAborted();
|
|
96
|
-
if (!isCurrent()) return;
|
|
97
|
-
steerHookFailures(pi, allFailures(dispatch, outcomes));
|
|
98
|
-
const context = require_hooks.additionalContextsFrom(require_hooks.decisionsFrom(outcomes)).join("\n\n");
|
|
99
|
-
if (context) pi.sendMessage({
|
|
100
|
-
customType: CONTEXT_MESSAGE_TYPE,
|
|
101
|
-
content: context,
|
|
58
|
+
if (session.parentContext) await session.parentContext.sendMessage(require_hookModules.hookFailureMessage(failures), "steer");
|
|
59
|
+
else pi.sendMessage({
|
|
60
|
+
customType: require_hookRuntime.FAILURE_MESSAGE_TYPE,
|
|
61
|
+
content: require_hookModules.hookFailureMessage(failures),
|
|
102
62
|
display: true
|
|
103
|
-
}, STEER);
|
|
63
|
+
}, require_hookRuntime.STEER);
|
|
104
64
|
}
|
|
105
65
|
function createSessionStart(pi, resolveRuntime) {
|
|
106
|
-
return (
|
|
66
|
+
return (event, ctx) => {
|
|
107
67
|
const runtime = resolveRuntime();
|
|
108
|
-
if (!runtime?.isCurrent()) return void 0;
|
|
109
|
-
const {
|
|
110
|
-
|
|
111
|
-
|
|
68
|
+
if (!runtime?.isCurrent() || scopeFor(pi, runtime.session, ctx).isSubagent) return void 0;
|
|
69
|
+
const { session, readiness } = runtime;
|
|
70
|
+
const run = async (signal, isReady = () => true) => {
|
|
71
|
+
const result = await runPiDispatch(pi, session, ctx, {
|
|
72
|
+
eventName: require_hookModules.HOOK_EVENT.sessionStart,
|
|
73
|
+
event
|
|
74
|
+
}, `${require_hookRuntime.STATUS_PREFIX}:${ctx.sessionManager.getSessionId()}:start`, "Running session-start hooks", signal);
|
|
75
|
+
signal?.throwIfAborted();
|
|
76
|
+
if (!runtime.isCurrent() || !isReady()) return;
|
|
77
|
+
await steerHookFailures(pi, session, result.failures);
|
|
78
|
+
const context = require_hookModules.additionalContextsFrom(result.decisions).join("\n\n");
|
|
79
|
+
if (context) await scopeFor(pi, session, ctx).sendMessage(context, "steer");
|
|
80
|
+
};
|
|
81
|
+
return readiness ? readiness.start(ctx, run) : run();
|
|
112
82
|
};
|
|
113
83
|
}
|
|
114
|
-
function createBeforeAgentStart(
|
|
84
|
+
function createBeforeAgentStart(resolveRuntime) {
|
|
115
85
|
return async (_event, ctx) => {
|
|
116
86
|
const runtime = resolveRuntime();
|
|
117
87
|
if (!runtime?.isCurrent()) return;
|
|
@@ -124,65 +94,48 @@ function createToolCall(pi, resolveRuntime) {
|
|
|
124
94
|
if (!runtime?.isCurrent()) return void 0;
|
|
125
95
|
await runtime.readiness?.wait(ctx);
|
|
126
96
|
if (!runtime.isCurrent()) return void 0;
|
|
127
|
-
const
|
|
97
|
+
const result = await runPiDispatch(pi, runtime.session, ctx, {
|
|
98
|
+
eventName: require_hookModules.HOOK_EVENT.preToolUse,
|
|
99
|
+
event
|
|
100
|
+
}, `${require_hookRuntime.STATUS_PREFIX}:${event.toolCallId}:pre`, `Running pre-tool hooks for ${event.toolName}`);
|
|
128
101
|
if (!runtime.isCurrent()) return void 0;
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
if (!runtime.isCurrent()) return void 0;
|
|
132
|
-
const decisions = require_hooks.decisionsFrom(outcomes);
|
|
133
|
-
steerHookFailures(pi, allFailures(dispatch, outcomes));
|
|
134
|
-
const denied = decisions.find(require_hooks.isDenied);
|
|
135
|
-
if (denied) return {
|
|
136
|
-
block: true,
|
|
137
|
-
reason: require_hooks.decisionReason(denied) ?? "Blocked by repository hook"
|
|
138
|
-
};
|
|
139
|
-
const context = require_hooks.additionalContextsFrom(decisions).join("\n\n");
|
|
140
|
-
return context ? {
|
|
141
|
-
block: true,
|
|
142
|
-
reason: context
|
|
143
|
-
} : void 0;
|
|
102
|
+
await steerHookFailures(pi, runtime.session, result.failures);
|
|
103
|
+
return result.toolCall;
|
|
144
104
|
};
|
|
145
105
|
}
|
|
146
|
-
function createToolResult(
|
|
106
|
+
function createToolResult(pi, resolveRuntime) {
|
|
147
107
|
return async (event, ctx) => {
|
|
148
108
|
const runtime = resolveRuntime();
|
|
149
109
|
if (!runtime?.isCurrent()) return void 0;
|
|
150
110
|
await runtime.readiness?.wait(ctx);
|
|
151
111
|
if (!runtime.isCurrent()) return void 0;
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
112
|
+
const result = await runPiDispatch(pi, runtime.session, ctx, {
|
|
113
|
+
eventName: require_hookModules.HOOK_EVENT.postToolUse,
|
|
114
|
+
event
|
|
115
|
+
}, `${require_hookRuntime.STATUS_PREFIX}:${event.toolCallId}:post`, `Running post-tool hooks for ${event.toolName}`);
|
|
156
116
|
if (!runtime.isCurrent()) return void 0;
|
|
157
|
-
|
|
158
|
-
const failures = allFailures(dispatch, outcomes);
|
|
159
|
-
const messages = require_hooks.toolResultMessages(decisions);
|
|
160
|
-
if (failures.length > 0) messages.push(require_hooks.hookFailureMessage(failures));
|
|
161
|
-
if (messages.length === 0) return void 0;
|
|
162
|
-
return {
|
|
163
|
-
content: [...event.content, {
|
|
164
|
-
type: "text",
|
|
165
|
-
text: messages.join("\n\n")
|
|
166
|
-
}],
|
|
167
|
-
isError: event.isError || decisions.some(require_hooks.isDenied)
|
|
168
|
-
};
|
|
117
|
+
return result.toolResult;
|
|
169
118
|
};
|
|
170
119
|
}
|
|
171
120
|
function createAgentSettled(pi, resolveRuntime) {
|
|
172
121
|
let refusals = 0;
|
|
173
|
-
return async (
|
|
122
|
+
return async (event, ctx) => {
|
|
174
123
|
const runtime = resolveRuntime();
|
|
175
|
-
if (!runtime?.isCurrent()) return;
|
|
124
|
+
if (!runtime?.isCurrent() || scopeFor(pi, runtime.session, ctx).isSubagent) return;
|
|
176
125
|
await runtime.readiness?.wait(ctx);
|
|
177
126
|
if (!runtime.isCurrent()) return;
|
|
178
|
-
const
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
}, `${STATUS_PREFIX}:${dispatch.sessionId}:stop`, "Running stop hooks");
|
|
127
|
+
const result = await runPiDispatch(pi, runtime.session, ctx, {
|
|
128
|
+
eventName: require_hookModules.HOOK_EVENT.stop,
|
|
129
|
+
event,
|
|
130
|
+
extraPayload: { [require_hookRuntime.STOP_HOOK_ACTIVE_FIELD]: refusals > 0 }
|
|
131
|
+
}, `${require_hookRuntime.STATUS_PREFIX}:${ctx.sessionManager.getSessionId()}:stop`, "Running stop hooks");
|
|
184
132
|
if (!runtime.isCurrent()) return;
|
|
185
|
-
|
|
133
|
+
if (result.failures.length > 0) pi.sendMessage({
|
|
134
|
+
customType: require_hookRuntime.FAILURE_MESSAGE_TYPE,
|
|
135
|
+
content: require_hookModules.hookFailureMessage(result.failures),
|
|
136
|
+
display: true
|
|
137
|
+
}, require_hookRuntime.NO_TURN);
|
|
138
|
+
const reason = require_hookModules.decisionReason(result.decisions.find(require_hookModules.isDenied));
|
|
186
139
|
if (!reason) {
|
|
187
140
|
refusals = 0;
|
|
188
141
|
return;
|
|
@@ -190,126 +143,50 @@ function createAgentSettled(pi, resolveRuntime) {
|
|
|
190
143
|
if (refusals >= 5) {
|
|
191
144
|
refusals = 0;
|
|
192
145
|
pi.sendMessage({
|
|
193
|
-
customType: FAILURE_MESSAGE_TYPE,
|
|
146
|
+
customType: require_hookRuntime.FAILURE_MESSAGE_TYPE,
|
|
194
147
|
content: `A Stop hook refused ${String(5)} stops in a row, so the agent stops here. Its last reason: ${reason}`,
|
|
195
148
|
display: true
|
|
196
|
-
}, NO_TURN);
|
|
149
|
+
}, require_hookRuntime.NO_TURN);
|
|
197
150
|
return;
|
|
198
151
|
}
|
|
199
152
|
refusals += 1;
|
|
200
153
|
pi.sendMessage({
|
|
201
|
-
customType: STOP_BLOCK_MESSAGE_TYPE,
|
|
154
|
+
customType: require_hookRuntime.STOP_BLOCK_MESSAGE_TYPE,
|
|
202
155
|
content: reason,
|
|
203
156
|
display: true
|
|
204
|
-
}, FOLLOW_UP_TURN);
|
|
157
|
+
}, require_hookRuntime.FOLLOW_UP_TURN);
|
|
205
158
|
};
|
|
206
159
|
}
|
|
207
160
|
function createHookHandlers(pi, resolveRuntime) {
|
|
208
161
|
let shutdown;
|
|
209
162
|
return {
|
|
210
163
|
session_start: createSessionStart(pi, resolveRuntime),
|
|
211
|
-
before_agent_start: createBeforeAgentStart(
|
|
164
|
+
before_agent_start: createBeforeAgentStart(resolveRuntime),
|
|
212
165
|
tool_call: createToolCall(pi, resolveRuntime),
|
|
213
166
|
tool_result: createToolResult(pi, resolveRuntime),
|
|
214
167
|
agent_settled: createAgentSettled(pi, resolveRuntime),
|
|
215
168
|
session_shutdown: (_event, ctx) => {
|
|
216
169
|
const current = resolveRuntime();
|
|
217
|
-
if (!current?.isCurrent()) return void 0;
|
|
218
|
-
shutdown ??= runSessionEndHooks(current.session, ctx);
|
|
170
|
+
if (!current?.isCurrent() || scopeFor(pi, current.session, ctx).isSubagent) return void 0;
|
|
171
|
+
shutdown ??= runSessionEndHooks(pi, current.session, ctx);
|
|
219
172
|
return shutdown;
|
|
220
173
|
}
|
|
221
174
|
};
|
|
222
175
|
}
|
|
223
|
-
/**
|
|
224
|
-
async function runSessionEndHooks(session, ctx) {
|
|
225
|
-
|
|
226
|
-
await runHooks(session, ctx, dispatch, require_hooks.sessionHookPayload(dispatch.sessionId, dispatch.repoRoot), `${STATUS_PREFIX}:${dispatch.sessionId}:end`, "Running session-end hooks");
|
|
227
|
-
}
|
|
228
|
-
//#endregion
|
|
229
|
-
//#region src/constants/hook.ts
|
|
230
|
-
const PACKAGE_SOURCE = "@agimon-ai/doompi-hook";
|
|
231
|
-
const HOOK_HELP_SKILL = {
|
|
232
|
-
name: "doompi-author-hook",
|
|
233
|
-
description: "Author DoomPi repository or plugin hooks. Use when creating or changing .doom/hooks.yaml, selecting hook groups from modes.yaml, writing hook commands, or adapting Claude Code hook payloads and decisions to DoomPi."
|
|
234
|
-
};
|
|
235
|
-
//#endregion
|
|
236
|
-
//#region src/services/hookRuntime/index.ts
|
|
237
|
-
function hookSession(cordis, options) {
|
|
238
|
-
let telemetry = options.telemetry;
|
|
239
|
-
const requireTelemetry = () => telemetry ??= require_hooks.createHookTelemetry();
|
|
240
|
-
return {
|
|
241
|
-
config: () => (0, _agimon_ai_doompi_config_piContext.requireDoomConfigContext)(cordis),
|
|
242
|
-
runner: options.runner ?? require_hooks.createBashHookRunner({ telemetry: requireTelemetry() }),
|
|
243
|
-
documents: options.documents ?? require_hooks.createHookDocumentReader({ telemetry: requireTelemetry() })
|
|
244
|
-
};
|
|
245
|
-
}
|
|
246
|
-
function createHookRuntime(cordis, options) {
|
|
247
|
-
const session = hookSession(cordis, options);
|
|
248
|
-
let active = true;
|
|
249
|
-
let generation = 0;
|
|
250
|
-
let readiness;
|
|
251
|
-
return {
|
|
252
|
-
session,
|
|
253
|
-
readiness: {
|
|
254
|
-
start(context, operation) {
|
|
255
|
-
const ownGeneration = ++generation;
|
|
256
|
-
const isCurrent = () => active && ownGeneration === generation;
|
|
257
|
-
const coordinator = (0, _agimon_ai_doompi_core_readiness.readDoomReadinessCoordinator)(cordis);
|
|
258
|
-
if (!coordinator) return operation(new AbortController().signal, isCurrent);
|
|
259
|
-
const previous = readiness;
|
|
260
|
-
const readinessOperation = (async () => {
|
|
261
|
-
if (previous?.coordinator === coordinator) await previous.operation.catch(() => void 0);
|
|
262
|
-
if (!isCurrent()) return;
|
|
263
|
-
await coordinator.start(PACKAGE_SOURCE, `${context.sessionManager.getSessionId()}:${ownGeneration}`, async (signal) => {
|
|
264
|
-
await operation(signal, isCurrent);
|
|
265
|
-
return { value: void 0 };
|
|
266
|
-
}).wait();
|
|
267
|
-
})();
|
|
268
|
-
readinessOperation.catch(() => void 0);
|
|
269
|
-
readiness = {
|
|
270
|
-
sessionManager: context.sessionManager,
|
|
271
|
-
coordinator,
|
|
272
|
-
operation: readinessOperation
|
|
273
|
-
};
|
|
274
|
-
},
|
|
275
|
-
async wait(context) {
|
|
276
|
-
const current = readiness;
|
|
277
|
-
if (!current) return;
|
|
278
|
-
if (current.sessionManager !== context.sessionManager) throw new Error("Hook readiness belongs to a stale Pi session.");
|
|
279
|
-
await current.operation;
|
|
280
|
-
if (!active || current !== readiness) throw new Error("Hook readiness belongs to a stale extension generation.");
|
|
281
|
-
}
|
|
282
|
-
},
|
|
283
|
-
isCurrent: () => active,
|
|
284
|
-
dispose() {
|
|
285
|
-
active = false;
|
|
286
|
-
generation += 1;
|
|
287
|
-
readiness = void 0;
|
|
288
|
-
}
|
|
289
|
-
};
|
|
290
|
-
}
|
|
291
|
-
function createHookBinding(options) {
|
|
292
|
-
let runtime;
|
|
293
|
-
return {
|
|
294
|
-
plugin(cordis) {
|
|
295
|
-
cordis.inject([_agimon_ai_doompi_core_config.DOOM_CONFIG_SERVICE], (configContext) => {
|
|
296
|
-
const binding = createHookRuntime(configContext, options);
|
|
297
|
-
runtime = binding;
|
|
298
|
-
return () => {
|
|
299
|
-
binding.dispose();
|
|
300
|
-
if (runtime === binding) runtime = void 0;
|
|
301
|
-
};
|
|
302
|
-
});
|
|
303
|
-
},
|
|
304
|
-
runtime: () => runtime
|
|
305
|
-
};
|
|
176
|
+
/** SessionEnd remains plugin-only and once-only while the session is still usable. */
|
|
177
|
+
async function runSessionEndHooks(pi, session, ctx) {
|
|
178
|
+
await runPiDispatch(pi, session, ctx, { eventName: require_hookModules.HOOK_EVENT.sessionEnd }, `${require_hookRuntime.STATUS_PREFIX}:${ctx.sessionManager.getSessionId()}:end`, "Running session-end hooks");
|
|
306
179
|
}
|
|
307
180
|
//#endregion
|
|
308
181
|
//#region src/extensions/workspaces/sessions/(backend)/_lib/piRoot.ts
|
|
309
|
-
const createHookPiRoot = ({ pi, options }) => {
|
|
310
|
-
const binding = createHookBinding(options ?? {});
|
|
182
|
+
const createHookPiRoot = ({ pi, options, context }) => {
|
|
183
|
+
const binding = require_hookRuntime.createHookBinding(options ?? {});
|
|
184
|
+
const runtime = () => {
|
|
185
|
+
const server = context.get(_agimon_ai_doompi_core_cordisHost.DOOM_CORDIS_SERVER_SERVICES);
|
|
186
|
+
return server ? server.get(require_hookRuntime.DOOM_HOOK_SESSION_SERVICE) : binding.runtime();
|
|
187
|
+
};
|
|
311
188
|
return {
|
|
312
|
-
value: createHookHandlers(pi,
|
|
189
|
+
value: createHookHandlers(pi, runtime),
|
|
313
190
|
services: [binding.plugin]
|
|
314
191
|
};
|
|
315
192
|
};
|
|
@@ -337,9 +214,9 @@ var tool_result_cli_default = (0, _agimon_ai_doompi_core_extensionFile.defineCli
|
|
|
337
214
|
//#endregion
|
|
338
215
|
//#region src/extensions/workspaces/sessions/(backend)/resource/doompi-use-hook.cli.ts
|
|
339
216
|
var doompi_use_hook_cli_default = (0, _agimon_ai_doompi_core_extensionFile.defineResource)({
|
|
340
|
-
source: PACKAGE_SOURCE,
|
|
217
|
+
source: require_hookRuntime.PACKAGE_SOURCE,
|
|
341
218
|
moduleUrl: require("url").pathToFileURL(__filename).href,
|
|
342
|
-
skills: [HOOK_HELP_SKILL]
|
|
219
|
+
skills: [require_hookRuntime.HOOK_HELP_SKILL]
|
|
343
220
|
});
|
|
344
221
|
//#endregion
|
|
345
222
|
//#region generated/pi.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi.cjs","names":["selectRegistryHooks","selectPluginHooks","failuresFrom","hookFailureMessage","HOOK_EVENT","sessionHookPayload","additionalContextsFrom","decisionsFrom","toolHookPayload","isDenied","decisionReason","toolResultMessages","createHookTelemetry","requireDoomConfigContext","createBashHookRunner","createHookDocumentReader","readDoomReadinessCoordinator","DOOM_CONFIG_SERVICE","defineRoot","defineCliHook","defineCliHook","defineCliHook","defineCliHook","defineCliHook","defineCliHook","defineResource","definePiExtension","rootSession","composeRootHooks","hookAgentSettled","hookBeforeAgentStart","hookSessionShutdown","hookSessionStart","hookToolCall","hookToolResult","resourceDoompiUseHook"],"sources":["../../src/constants/hookHandlers.ts","../../src/services/hookHandlers/index.ts","../../src/constants/hook.ts","../../src/services/hookRuntime/index.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/piRoot.ts","../../src/extensions/workspaces/sessions/(backend)/root.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/tool-call.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/tool-result.cli.ts","../../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-hook.cli.ts","../../generated/pi.ts"],"sourcesContent":["export const STATUS_PREFIX = 'repository-hooks';\nexport const FAILURE_MESSAGE_TYPE = 'repository-hook-failure';\nexport const CONTEXT_MESSAGE_TYPE = 'repository-hook-context';\n/** A Stop hook refused the stop; its reason sends the agent back to work. */\nexport const STOP_BLOCK_MESSAGE_TYPE = 'repository-hook-stop-block';\nexport const STEER = { deliverAs: 'steer' } as const;\n/** Starts a new turn on a settled agent, so a refused stop is not a silent one. */\nexport const FOLLOW_UP_TURN = { deliverAs: 'followUp', triggerTurn: true } as const;\n/** Adds a message to a settled agent's conversation without starting a turn. */\nexport const NO_TURN = { triggerTurn: false } as const;\n/**\n * How many stops in a row a Stop hook may refuse before the agent is left to\n * stop. A hook that never lets go would otherwise send it back forever.\n */\nexport const MAX_STOP_REFUSALS = 5;\n/** Claude's Stop hook input field: true when the agent is already continuing because of a Stop hook. */\nexport const STOP_HOOK_ACTIVE_FIELD = 'stop_hook_active';\nexport const BLOCKED_BY_HOOK = 'Blocked by repository hook';\nexport const SUBAGENT_ENVIRONMENT_FLAG = 'PI_SUBAGENT_CHILD';\nexport const CONTEXT_SEPARATOR = '\\n\\n';\n","import type { PiEventHandlers } from '@agimon-ai/doompi-core/piExtension';\nimport type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport {\n STATUS_PREFIX,\n FAILURE_MESSAGE_TYPE,\n CONTEXT_MESSAGE_TYPE,\n STOP_BLOCK_MESSAGE_TYPE,\n FOLLOW_UP_TURN,\n MAX_STOP_REFUSALS,\n NO_TURN,\n STEER,\n STOP_HOOK_ACTIVE_FIELD,\n BLOCKED_BY_HOOK,\n SUBAGENT_ENVIRONMENT_FLAG,\n CONTEXT_SEPARATOR,\n} from '../../constants/hookHandlers';\nimport { HOOK_EVENT } from '../../constants/hooks';\nimport {\n additionalContextsFrom,\n decisionReason,\n decisionsFrom,\n failuresFrom,\n hookFailureMessage,\n isDenied,\n toolResultMessages,\n} from '../../services/hookDecisions';\nimport { sessionHookPayload, toolHookPayload } from '../../services/hookPayload';\nimport { selectRegistryHooks } from '../../services/hookRegistry';\nimport type { HookRuntimeResolver, HookSession } from '../../services/hookRuntime/type';\nimport { selectPluginHooks } from '../../services/pluginHooks';\nimport {\n type HookFailure,\n type HookOutcome,\n type HookPayload,\n type HookToolEvent,\n type ResolvedHook,\n} from '../../types/hooks';\n\n/** Everything one dispatch resolved before it ran anything. */\ninterface HookDispatch {\n repoRoot: string;\n sessionId: string;\n hooks: ResolvedHook[];\n failures: HookFailure[];\n}\n\n/**\n * Registry rows plus plugin hooks for one event, in that order.\n *\n * Both sources are read on every dispatch because either can change mid-session:\n * /mode switches the selected groups and a plugin can rewrite its own config.\n */\nasync function resolveHooks(\n session: HookSession,\n ctx: ExtensionContext,\n eventName: string,\n toolName?: string,\n): Promise<HookDispatch> {\n const harness = session.config().harness;\n const repoRoot = harness.root ?? ctx.cwd;\n const [registry, plugins] = await Promise.all([\n session.documents.registry(repoRoot),\n session.documents.plugins(harness.pluginHooks),\n ]);\n const hooks = [\n ...selectRegistryHooks(registry.entries, {\n event: eventName,\n toolName,\n allowedGroups: harness.hookGroups,\n inSubagent: Boolean(process.env[SUBAGENT_ENVIRONMENT_FLAG]),\n }),\n ...selectPluginHooks(plugins.documents, eventName, toolName),\n ];\n return {\n repoRoot,\n sessionId: ctx.sessionManager.getSessionId(),\n hooks,\n failures: [...(registry.failure ? [registry.failure] : []), ...plugins.failures],\n };\n}\n\n/** Session end is plugin-only: the registry has no binding for it. */\nasync function resolvePluginHooks(\n session: HookSession,\n ctx: ExtensionContext,\n eventName: string,\n): Promise<HookDispatch> {\n const harness = session.config().harness;\n const plugins = await session.documents.plugins(harness.pluginHooks);\n return {\n repoRoot: harness.root ?? ctx.cwd,\n sessionId: ctx.sessionManager.getSessionId(),\n hooks: selectPluginHooks(plugins.documents, eventName),\n failures: plugins.failures,\n };\n}\n\nasync function runHooks(\n session: HookSession,\n ctx: ExtensionContext,\n dispatch: HookDispatch,\n payload: HookPayload,\n statusKey: string,\n statusLabel: string,\n): Promise<HookOutcome[]> {\n const outcomes: HookOutcome[] = [];\n try {\n for (const [index, resolved] of dispatch.hooks.entries()) {\n if (ctx.hasUI) ctx.ui.setStatus(statusKey, `${statusLabel} (${index + 1}/${dispatch.hooks.length})...`);\n outcomes.push(\n await session.runner.run(resolved.hook, payload, { repoRoot: dispatch.repoRoot, pluginRoot: resolved.root }),\n );\n }\n } finally {\n if (ctx.hasUI) ctx.ui.setStatus(statusKey, undefined);\n }\n return outcomes;\n}\n\nfunction allFailures(dispatch: HookDispatch, outcomes: ReadonlyArray<HookOutcome>): HookFailure[] {\n return [...dispatch.failures, ...failuresFrom(outcomes)];\n}\n\nfunction steerHookFailures(pi: ExtensionAPI, failures: ReadonlyArray<HookFailure>): void {\n if (failures.length === 0) return;\n pi.sendMessage({ customType: FAILURE_MESSAGE_TYPE, content: hookFailureMessage(failures), display: true }, STEER);\n}\n\nasync function runSessionStartHooks(\n pi: ExtensionAPI,\n session: HookSession,\n ctx: ExtensionContext,\n signal?: AbortSignal,\n isCurrent: () => boolean = () => true,\n): Promise<void> {\n signal?.throwIfAborted();\n const dispatch = await resolveHooks(session, ctx, HOOK_EVENT.sessionStart);\n signal?.throwIfAborted();\n const outcomes = await runHooks(\n session,\n ctx,\n dispatch,\n sessionHookPayload(dispatch.sessionId, dispatch.repoRoot),\n `${STATUS_PREFIX}:${dispatch.sessionId}:start`,\n 'Running session-start hooks',\n );\n signal?.throwIfAborted();\n if (!isCurrent()) return;\n steerHookFailures(pi, allFailures(dispatch, outcomes));\n const context = additionalContextsFrom(decisionsFrom(outcomes)).join(CONTEXT_SEPARATOR);\n if (context) pi.sendMessage({ customType: CONTEXT_MESSAGE_TYPE, content: context, display: true }, STEER);\n}\n\nfunction createSessionStart(pi: ExtensionAPI, resolveRuntime: HookRuntimeResolver): PiEventHandlers['session_start'] {\n return (_event, ctx) => {\n const runtime = resolveRuntime();\n if (!runtime?.isCurrent()) return undefined;\n const { readiness, session } = runtime;\n if (readiness) {\n return readiness.start(ctx, (signal, isReady) =>\n runSessionStartHooks(pi, session, ctx, signal, () => runtime.isCurrent() && isReady()),\n );\n }\n return runSessionStartHooks(pi, session, ctx);\n };\n}\n\nfunction createBeforeAgentStart(\n _pi: ExtensionAPI,\n resolveRuntime: HookRuntimeResolver,\n): PiEventHandlers['before_agent_start'] {\n return async (_event, ctx) => {\n const runtime = resolveRuntime();\n if (!runtime?.isCurrent()) return;\n await runtime.readiness?.wait(ctx);\n };\n}\n\nfunction createToolCall(pi: ExtensionAPI, resolveRuntime: HookRuntimeResolver): PiEventHandlers['tool_call'] {\n return async (event, ctx) => {\n const runtime = resolveRuntime();\n if (!runtime?.isCurrent()) return undefined;\n await runtime.readiness?.wait(ctx);\n if (!runtime.isCurrent()) return undefined;\n const dispatch = await resolveHooks(runtime.session, ctx, HOOK_EVENT.preToolUse, event.toolName);\n if (!runtime.isCurrent()) return undefined;\n const payload = toolHookPayload(\n event as HookToolEvent,\n HOOK_EVENT.preToolUse,\n dispatch.repoRoot,\n dispatch.sessionId,\n );\n const outcomes = await runHooks(\n runtime.session,\n ctx,\n dispatch,\n payload,\n `${STATUS_PREFIX}:${event.toolCallId}:pre`,\n `Running pre-tool hooks for ${event.toolName}`,\n );\n if (!runtime.isCurrent()) return undefined;\n const decisions = decisionsFrom(outcomes);\n steerHookFailures(pi, allFailures(dispatch, outcomes));\n const denied = decisions.find(isDenied);\n if (denied) return { block: true, reason: decisionReason(denied) ?? BLOCKED_BY_HOOK };\n const context = additionalContextsFrom(decisions).join(CONTEXT_SEPARATOR);\n return context ? { block: true, reason: context } : undefined;\n };\n}\n\nfunction createToolResult(_pi: ExtensionAPI, resolveRuntime: HookRuntimeResolver): PiEventHandlers['tool_result'] {\n return async (event, ctx) => {\n const runtime = resolveRuntime();\n if (!runtime?.isCurrent()) return undefined;\n await runtime.readiness?.wait(ctx);\n if (!runtime.isCurrent()) return undefined;\n const dispatch = await resolveHooks(runtime.session, ctx, HOOK_EVENT.postToolUse, event.toolName);\n if (!runtime.isCurrent()) return undefined;\n const payload = toolHookPayload(\n event as HookToolEvent,\n HOOK_EVENT.postToolUse,\n dispatch.repoRoot,\n dispatch.sessionId,\n );\n const outcomes = await runHooks(\n runtime.session,\n ctx,\n dispatch,\n payload,\n `${STATUS_PREFIX}:${event.toolCallId}:post`,\n `Running post-tool hooks for ${event.toolName}`,\n );\n if (!runtime.isCurrent()) return undefined;\n const decisions = decisionsFrom(outcomes);\n const failures = allFailures(dispatch, outcomes);\n const messages = toolResultMessages(decisions);\n if (failures.length > 0) messages.push(hookFailureMessage(failures));\n if (messages.length === 0) return undefined;\n // The result is appended to rather than replaced, so the tool's own output\n // still reaches the model alongside whatever the hook had to say.\n return {\n content: [...event.content, { type: 'text' as const, text: messages.join(CONTEXT_SEPARATOR) }],\n isError: event.isError || decisions.some(isDenied),\n };\n };\n}\n\nfunction createAgentSettled(pi: ExtensionAPI, resolveRuntime: HookRuntimeResolver): PiEventHandlers['agent_settled'] {\n // Stops refused in a row. A hook reads it as Claude's stop_hook_active, and it caps the loop.\n let refusals = 0;\n return async (_event, ctx) => {\n const runtime = resolveRuntime();\n if (!runtime?.isCurrent()) return;\n await runtime.readiness?.wait(ctx);\n if (!runtime.isCurrent()) return;\n const dispatch = await resolveHooks(runtime.session, ctx, HOOK_EVENT.stop);\n if (!runtime.isCurrent()) return;\n // skipInSubagent on the workflow-stop binding keeps subagents from closing\n // the parent's workflow step.\n const outcomes = await runHooks(\n runtime.session,\n ctx,\n dispatch,\n { ...sessionHookPayload(dispatch.sessionId, dispatch.repoRoot), [STOP_HOOK_ACTIVE_FIELD]: refusals > 0 },\n `${STATUS_PREFIX}:${dispatch.sessionId}:stop`,\n 'Running stop hooks',\n );\n if (!runtime.isCurrent()) return;\n // A Stop hook that refuses the stop, like a workflow step still waiting\n // for its decision, sends the agent back with its reason. The new turn\n // also keeps auto-stop from ending the session in between.\n const reason = decisionReason(decisionsFrom(outcomes).find(isDenied));\n if (!reason) {\n refusals = 0;\n return;\n }\n if (refusals >= MAX_STOP_REFUSALS) {\n refusals = 0;\n pi.sendMessage(\n {\n customType: FAILURE_MESSAGE_TYPE,\n content: `A Stop hook refused ${String(MAX_STOP_REFUSALS)} stops in a row, so the agent stops here. Its last reason: ${reason}`,\n display: true,\n },\n NO_TURN,\n );\n return;\n }\n refusals += 1;\n pi.sendMessage({ customType: STOP_BLOCK_MESSAGE_TYPE, content: reason, display: true }, FOLLOW_UP_TURN);\n };\n}\n\nexport function createHookHandlers(pi: ExtensionAPI, resolveRuntime: HookRuntimeResolver): PiEventHandlers {\n let shutdown: Promise<void> | undefined;\n return {\n session_start: createSessionStart(pi, resolveRuntime),\n before_agent_start: createBeforeAgentStart(pi, resolveRuntime),\n tool_call: createToolCall(pi, resolveRuntime),\n tool_result: createToolResult(pi, resolveRuntime),\n agent_settled: createAgentSettled(pi, resolveRuntime),\n session_shutdown: (_event, ctx) => {\n const current = resolveRuntime();\n if (!current?.isCurrent()) return undefined;\n shutdown ??= runSessionEndHooks(current.session, ctx);\n return shutdown;\n },\n };\n}\n\n/** Runs the plugin SessionEnd hooks while the session is still usable. */\nexport async function runSessionEndHooks(session: HookSession, ctx: ExtensionContext): Promise<void> {\n const dispatch = await resolvePluginHooks(session, ctx, HOOK_EVENT.sessionEnd);\n await runHooks(\n session,\n ctx,\n dispatch,\n sessionHookPayload(dispatch.sessionId, dispatch.repoRoot),\n `${STATUS_PREFIX}:${dispatch.sessionId}:end`,\n 'Running session-end hooks',\n );\n}\n","export const PACKAGE_SOURCE = '@agimon-ai/doompi-hook';\nexport const HOOK_HELP_SKILL = {\n name: 'doompi-author-hook',\n description:\n 'Author DoomPi repository or plugin hooks. Use when creating or changing .doom/hooks.yaml, selecting hook groups from modes.yaml, writing hook commands, or adapting Claude Code hook payloads and decisions to DoomPi.',\n};\n","import { requireDoomConfigContext } from '@agimon-ai/doompi-config/piContext';\nimport { DOOM_CONFIG_SERVICE } from '@agimon-ai/doompi-core/config';\nimport { type DoomReadinessCoordinator, readDoomReadinessCoordinator } from '@agimon-ai/doompi-core/readiness';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport { PACKAGE_SOURCE } from '../../constants/hook';\nimport type { HookTelemetry } from '../../types/telemetry';\nimport { createHookDocumentReader } from '../hookDocuments';\nimport { createBashHookRunner } from '../hookRunner';\nimport { createHookTelemetry } from '../hookTelemetry';\nimport { type HookReadinessGate, type HookSession } from './type';\nimport type { HookBinding, HookExtensionOptions, HookRuntimeBinding } from './type';\n\nfunction hookSession(cordis: Context, options: HookExtensionOptions): HookSession {\n // The log sink is only built if something actually reports to it, so a fully\n // stubbed session never touches the telemetry backend.\n let telemetry = options.telemetry;\n const requireTelemetry = (): HookTelemetry => (telemetry ??= createHookTelemetry());\n return {\n config: () => requireDoomConfigContext(cordis),\n runner: options.runner ?? createBashHookRunner({ telemetry: requireTelemetry() }),\n documents: options.documents ?? createHookDocumentReader({ telemetry: requireTelemetry() }),\n };\n}\n\nfunction createHookRuntime(cordis: Context, options: HookExtensionOptions): HookRuntimeBinding {\n const session = hookSession(cordis, options);\n let active = true;\n let generation = 0;\n let readiness:\n | {\n readonly sessionManager: object;\n readonly coordinator: DoomReadinessCoordinator;\n readonly operation: Promise<void>;\n }\n | undefined;\n const readinessGate: HookReadinessGate = {\n start(context, operation) {\n const ownGeneration = ++generation;\n const isCurrent = (): boolean => active && ownGeneration === generation;\n const coordinator = readDoomReadinessCoordinator(cordis);\n if (!coordinator) return operation(new AbortController().signal, isCurrent);\n\n const previous = readiness;\n const readinessOperation = (async (): Promise<void> => {\n if (previous?.coordinator === coordinator) await previous.operation.catch(() => undefined);\n if (!isCurrent()) return;\n const handle = coordinator.start(\n PACKAGE_SOURCE,\n `${context.sessionManager.getSessionId()}:${ownGeneration}`,\n async (signal) => {\n await operation(signal, isCurrent);\n return { value: undefined };\n },\n );\n await handle.wait();\n })();\n // Config's coordinator owns the single user-facing failure notification.\n void readinessOperation.catch(() => undefined);\n readiness = {\n sessionManager: context.sessionManager,\n coordinator,\n operation: readinessOperation,\n };\n return undefined;\n },\n async wait(context: ExtensionContext): Promise<void> {\n const current = readiness;\n if (!current) return;\n if (current.sessionManager !== context.sessionManager) {\n throw new Error('Hook readiness belongs to a stale Pi session.');\n }\n await current.operation;\n if (!active || current !== readiness) {\n throw new Error('Hook readiness belongs to a stale extension generation.');\n }\n },\n };\n return {\n session,\n readiness: readinessGate,\n isCurrent: () => active,\n dispose() {\n active = false;\n generation += 1;\n readiness = undefined;\n },\n };\n}\n\nexport function createHookBinding(options: HookExtensionOptions): HookBinding {\n let runtime: HookRuntimeBinding | undefined;\n return {\n plugin(cordis) {\n cordis.inject([DOOM_CONFIG_SERVICE], (configContext) => {\n const binding = createHookRuntime(configContext, options);\n runtime = binding;\n return () => {\n binding.dispose();\n if (runtime === binding) runtime = undefined;\n };\n });\n },\n runtime: () => runtime,\n };\n}\n","import type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport { createHookHandlers } from '../../../../../services/hookHandlers';\nimport { createHookBinding } from '../../../../../services/hookRuntime';\nimport type { HookExtensionOptions } from '../../../../../services/hookRuntime/type';\n\nexport const createHookPiRoot = ({ pi, options }: PiPluginContext<HookExtensionOptions>) => {\n const binding = createHookBinding(options ?? {});\n return { value: createHookHandlers(pi, binding.runtime), services: [binding.plugin] };\n};\nexport type HookPiScope = Awaited<ReturnType<typeof createHookPiRoot>>['value'];\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { createHookPiRoot } from './_lib/piRoot';\n\nexport default defineRoot(createHookPiRoot);\n","import { defineCliHook, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiEventHandlers, PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { HookPiScope } from '../_lib/piRoot';\nexport default defineCliHook(\n (context: WithRoot<PiPluginContext<unknown>, HookPiScope>): PiEventHandlers['agent_settled'] =>\n context.root.agent_settled,\n);\n","import { defineCliHook, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiEventHandlers, PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { HookPiScope } from '../_lib/piRoot';\nexport default defineCliHook(\n (context: WithRoot<PiPluginContext<unknown>, HookPiScope>): PiEventHandlers['before_agent_start'] =>\n context.root.before_agent_start,\n);\n","import { defineCliHook, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiEventHandlers, PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { HookPiScope } from '../_lib/piRoot';\nexport default defineCliHook(\n (context: WithRoot<PiPluginContext<unknown>, HookPiScope>): PiEventHandlers['session_shutdown'] =>\n context.root.session_shutdown,\n);\n","import { defineCliHook, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiEventHandlers, PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { HookPiScope } from '../_lib/piRoot';\nexport default defineCliHook(\n (context: WithRoot<PiPluginContext<unknown>, HookPiScope>): PiEventHandlers['session_start'] =>\n context.root.session_start,\n);\n","import { defineCliHook, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiEventHandlers, PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { HookPiScope } from '../_lib/piRoot';\nexport default defineCliHook(\n (context: WithRoot<PiPluginContext<unknown>, HookPiScope>): PiEventHandlers['tool_call'] => context.root.tool_call,\n);\n","import { defineCliHook, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiEventHandlers, PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { HookPiScope } from '../_lib/piRoot';\nexport default defineCliHook(\n (context: WithRoot<PiPluginContext<unknown>, HookPiScope>): PiEventHandlers['tool_result'] =>\n context.root.tool_result,\n);\n","import { defineResource } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { HOOK_HELP_SKILL, PACKAGE_SOURCE } from '../../../../../constants/hook';\nexport default defineResource({ source: PACKAGE_SOURCE, moduleUrl: import.meta.url, skills: [HOOK_HELP_SKILL] });\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { definePiExtension, type PiPluginContext, type PiPluginContributions } from '@agimon-ai/doompi-core/piExtension';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.cli';\nimport hookAgentSettled from '../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli';\nimport hookBeforeAgentStart from '../src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.cli';\nimport hookSessionShutdown from '../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.cli';\nimport hookSessionStart from '../src/extensions/workspaces/sessions/(backend)/hook/session-start.cli';\nimport hookToolCall from '../src/extensions/workspaces/sessions/(backend)/hook/tool-call.cli';\nimport hookToolResult from '../src/extensions/workspaces/sessions/(backend)/hook/tool-result.cli';\nimport resourceDoompiUseHook from '../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-hook.cli';\n\ntype OptionsOf<T> = T extends (context: PiPluginContext<infer Options>) => unknown ? Options : never;\ntype InferredOptions = Exclude<OptionsOf<typeof rootSession> | OptionsOf<typeof hookAgentSettled> | OptionsOf<typeof hookBeforeAgentStart> | OptionsOf<typeof hookSessionShutdown> | OptionsOf<typeof hookSessionStart> | OptionsOf<typeof hookToolCall> | OptionsOf<typeof hookToolResult> | OptionsOf<typeof resourceDoompiUseHook>, undefined>;\ntype Intersect<Union> =\n (Union extends unknown ? (value: Union) => void : never) extends (value: infer Value) => void ? Value : never;\ntype ExtensionOptions = [InferredOptions] extends [never] ? undefined : Intersect<InferredOptions>;\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\n\nexport const extension = definePiExtension<ExtensionOptions>('@agimon-ai/doompi-hook', async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n events: {\n agent_settled: at(hookAgentSettled, contextSession) as NonNullable<PiPluginContributions['events']>['agent_settled'],\n before_agent_start: at(hookBeforeAgentStart, contextSession) as NonNullable<PiPluginContributions['events']>['before_agent_start'],\n session_shutdown: at(hookSessionShutdown, contextSession) as NonNullable<PiPluginContributions['events']>['session_shutdown'],\n session_start: at(hookSessionStart, contextSession) as NonNullable<PiPluginContributions['events']>['session_start'],\n tool_call: at(hookToolCall, contextSession) as NonNullable<PiPluginContributions['events']>['tool_call'],\n tool_result: at(hookToolResult, contextSession) as NonNullable<PiPluginContributions['events']>['tool_result'],\n },\n get resources(): PiPluginContributions['resources'] { return [at(resourceDoompiUseHook, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n };\n});\n\nexport default extension;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pi.cjs","names":["SUBAGENT_ENVIRONMENT_FLAG","CONTEXT_MESSAGE_TYPE","dispatchHooks","hookFailureMessage","FAILURE_MESSAGE_TYPE","STEER","HOOK_EVENT","STATUS_PREFIX","additionalContextsFrom","STOP_HOOK_ACTIVE_FIELD","NO_TURN","decisionReason","isDenied","STOP_BLOCK_MESSAGE_TYPE","FOLLOW_UP_TURN","createHookBinding","DOOM_CORDIS_SERVER_SERVICES","DOOM_HOOK_SESSION_SERVICE","defineRoot","defineCliHook","defineCliHook","defineCliHook","defineCliHook","defineCliHook","defineCliHook","defineResource","PACKAGE_SOURCE","HOOK_HELP_SKILL","definePiExtension","rootSession","composeRootHooks","hookAgentSettled","hookBeforeAgentStart","hookSessionShutdown","hookSessionStart","hookToolCall","hookToolResult","resourceDoompiUseHook"],"sources":["../../src/services/hookHandlers/index.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/piRoot.ts","../../src/extensions/workspaces/sessions/(backend)/root.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/tool-call.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/tool-result.cli.ts","../../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-hook.cli.ts","../../generated/pi.ts"],"sourcesContent":["import type { PiEventHandlers } from '@agimon-ai/doompi-core/piExtension';\nimport type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport {\n STATUS_PREFIX,\n FAILURE_MESSAGE_TYPE,\n CONTEXT_MESSAGE_TYPE,\n STOP_BLOCK_MESSAGE_TYPE,\n FOLLOW_UP_TURN,\n MAX_STOP_REFUSALS,\n NO_TURN,\n STEER,\n STOP_HOOK_ACTIVE_FIELD,\n SUBAGENT_ENVIRONMENT_FLAG,\n CONTEXT_SEPARATOR,\n} from '../../constants/hookHandlers';\nimport { HOOK_EVENT } from '../../constants/hooks';\nimport type { HookFailure } from '../../types/hooks';\nimport { additionalContextsFrom, decisionReason, hookFailureMessage, isDenied } from '../hookDecisions';\nimport { dispatchHooks } from '../hookDispatch';\nimport type { HookDispatchRequest, HookDispatchResult, HookDispatchScope } from '../hookDispatch/type';\nimport type { HookRuntimeResolver, HookSession } from '../hookRuntime/type';\n\nfunction scopeFor(pi: ExtensionAPI, session: HookSession, ctx: ExtensionContext): HookDispatchScope {\n if (session.parentContext) return { ...session.parentContext, signal: session.signal, operationSignal: ctx.signal };\n return {\n sessionId: ctx.sessionManager.getSessionId(),\n isSubagent: Boolean(process.env[SUBAGENT_ENVIRONMENT_FLAG]),\n cwd: ctx.cwd,\n repoRoot: session.config().harness.root ?? ctx.cwd,\n ...(ctx.model ? { model: { provider: ctx.model.provider, id: ctx.model.id } } : {}),\n signal: session.signal,\n operationSignal: ctx.signal,\n async sendMessage(text, delivery) {\n pi.sendMessage({ customType: CONTEXT_MESSAGE_TYPE, content: text, display: true }, { deliverAs: delivery });\n },\n async appendCustomEntry(type, data) {\n pi.appendEntry(type, data);\n },\n };\n}\n\nasync function runPiDispatch(\n pi: ExtensionAPI,\n session: HookSession,\n ctx: ExtensionContext,\n request: HookDispatchRequest,\n statusKey: string,\n statusLabel: string,\n signal?: AbortSignal,\n): Promise<HookDispatchResult> {\n try {\n const scope = scopeFor(pi, session, ctx);\n return await dispatchHooks(\n session,\n { ...scope, operationSignal: signal ?? scope.operationSignal },\n {\n ...request,\n progress: (index, total) => {\n if (ctx.hasUI) ctx.ui.setStatus(statusKey, `${statusLabel} (${index + 1}/${total})...`);\n },\n },\n );\n } finally {\n if (ctx.hasUI) ctx.ui.setStatus(statusKey, undefined);\n }\n}\n\nasync function steerHookFailures(\n pi: ExtensionAPI,\n session: HookSession,\n failures: ReadonlyArray<HookFailure>,\n): Promise<void> {\n if (failures.length === 0) return;\n if (session.parentContext) await session.parentContext.sendMessage(hookFailureMessage(failures), 'steer');\n else\n pi.sendMessage({ customType: FAILURE_MESSAGE_TYPE, content: hookFailureMessage(failures), display: true }, STEER);\n}\n\nfunction createSessionStart(pi: ExtensionAPI, resolveRuntime: HookRuntimeResolver): PiEventHandlers['session_start'] {\n return (event, ctx) => {\n const runtime = resolveRuntime();\n if (!runtime?.isCurrent() || scopeFor(pi, runtime.session, ctx).isSubagent) return undefined;\n const { session, readiness } = runtime;\n const run = async (signal?: AbortSignal, isReady: () => boolean = () => true): Promise<void> => {\n const result = await runPiDispatch(\n pi,\n session,\n ctx,\n { eventName: HOOK_EVENT.sessionStart, event },\n `${STATUS_PREFIX}:${ctx.sessionManager.getSessionId()}:start`,\n 'Running session-start hooks',\n signal,\n );\n signal?.throwIfAborted();\n if (!runtime.isCurrent() || !isReady()) return;\n await steerHookFailures(pi, session, result.failures);\n const context = additionalContextsFrom(result.decisions).join(CONTEXT_SEPARATOR);\n if (context) await scopeFor(pi, session, ctx).sendMessage(context, 'steer');\n };\n return readiness ? readiness.start(ctx, run) : run();\n };\n}\n\nfunction createBeforeAgentStart(resolveRuntime: HookRuntimeResolver): PiEventHandlers['before_agent_start'] {\n return async (_event, ctx) => {\n const runtime = resolveRuntime();\n if (!runtime?.isCurrent()) return;\n await runtime.readiness?.wait(ctx);\n };\n}\n\nfunction createToolCall(pi: ExtensionAPI, resolveRuntime: HookRuntimeResolver): PiEventHandlers['tool_call'] {\n return async (event, ctx) => {\n const runtime = resolveRuntime();\n if (!runtime?.isCurrent()) return undefined;\n // Readiness is a host gate, not an advisory hook error.\n await runtime.readiness?.wait(ctx);\n if (!runtime.isCurrent()) return undefined;\n const result = await runPiDispatch(\n pi,\n runtime.session,\n ctx,\n { eventName: HOOK_EVENT.preToolUse, event },\n `${STATUS_PREFIX}:${event.toolCallId}:pre`,\n `Running pre-tool hooks for ${event.toolName}`,\n );\n if (!runtime.isCurrent()) return undefined;\n await steerHookFailures(pi, runtime.session, result.failures);\n return result.toolCall;\n };\n}\n\nfunction createToolResult(pi: ExtensionAPI, resolveRuntime: HookRuntimeResolver): PiEventHandlers['tool_result'] {\n return async (event, ctx) => {\n const runtime = resolveRuntime();\n if (!runtime?.isCurrent()) return undefined;\n await runtime.readiness?.wait(ctx);\n if (!runtime.isCurrent()) return undefined;\n const result = await runPiDispatch(\n pi,\n runtime.session,\n ctx,\n { eventName: HOOK_EVENT.postToolUse, event },\n `${STATUS_PREFIX}:${event.toolCallId}:post`,\n `Running post-tool hooks for ${event.toolName}`,\n );\n if (!runtime.isCurrent()) return undefined;\n return result.toolResult;\n };\n}\n\nfunction createAgentSettled(pi: ExtensionAPI, resolveRuntime: HookRuntimeResolver): PiEventHandlers['agent_settled'] {\n let refusals = 0;\n return async (event, ctx) => {\n const runtime = resolveRuntime();\n if (!runtime?.isCurrent() || scopeFor(pi, runtime.session, ctx).isSubagent) return;\n await runtime.readiness?.wait(ctx);\n if (!runtime.isCurrent()) return;\n const result = await runPiDispatch(\n pi,\n runtime.session,\n ctx,\n {\n eventName: HOOK_EVENT.stop,\n event,\n extraPayload: { [STOP_HOOK_ACTIVE_FIELD]: refusals > 0 },\n },\n `${STATUS_PREFIX}:${ctx.sessionManager.getSessionId()}:stop`,\n 'Running stop hooks',\n );\n if (!runtime.isCurrent()) return;\n if (result.failures.length > 0)\n pi.sendMessage(\n {\n customType: FAILURE_MESSAGE_TYPE,\n content: hookFailureMessage(result.failures),\n display: true,\n },\n NO_TURN,\n );\n const reason = decisionReason(result.decisions.find(isDenied));\n if (!reason) {\n refusals = 0;\n return;\n }\n if (refusals >= MAX_STOP_REFUSALS) {\n refusals = 0;\n pi.sendMessage(\n {\n customType: FAILURE_MESSAGE_TYPE,\n content: `A Stop hook refused ${String(MAX_STOP_REFUSALS)} stops in a row, so the agent stops here. Its last reason: ${reason}`,\n display: true,\n },\n NO_TURN,\n );\n return;\n }\n refusals += 1;\n pi.sendMessage({ customType: STOP_BLOCK_MESSAGE_TYPE, content: reason, display: true }, FOLLOW_UP_TURN);\n };\n}\n\nexport function createHookHandlers(pi: ExtensionAPI, resolveRuntime: HookRuntimeResolver): PiEventHandlers {\n let shutdown: Promise<void> | undefined;\n return {\n session_start: createSessionStart(pi, resolveRuntime),\n before_agent_start: createBeforeAgentStart(resolveRuntime),\n tool_call: createToolCall(pi, resolveRuntime),\n tool_result: createToolResult(pi, resolveRuntime),\n agent_settled: createAgentSettled(pi, resolveRuntime),\n session_shutdown: (_event, ctx) => {\n const current = resolveRuntime();\n if (!current?.isCurrent() || scopeFor(pi, current.session, ctx).isSubagent) return undefined;\n shutdown ??= runSessionEndHooks(pi, current.session, ctx);\n return shutdown;\n },\n };\n}\n\n/** SessionEnd remains plugin-only and once-only while the session is still usable. */\nexport async function runSessionEndHooks(pi: ExtensionAPI, session: HookSession, ctx: ExtensionContext): Promise<void> {\n await runPiDispatch(\n pi,\n session,\n ctx,\n { eventName: HOOK_EVENT.sessionEnd },\n `${STATUS_PREFIX}:${ctx.sessionManager.getSessionId()}:end`,\n 'Running session-end hooks',\n );\n}\n","import { DOOM_CORDIS_SERVER_SERVICES, type DoomCordisServerServices } from '@agimon-ai/doompi-core/cordisHost';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport { createHookHandlers } from '../../../../../services/hookHandlers';\nimport { createHookBinding } from '../../../../../services/hookRuntime';\nimport {\n DOOM_HOOK_SESSION_SERVICE,\n type HookExtensionOptions,\n type HookRuntime,\n} from '../../../../../services/hookRuntime/type';\n\nexport const createHookPiRoot = ({ pi, options, context }: PiPluginContext<HookExtensionOptions>) => {\n const binding = createHookBinding(options ?? {});\n const runtime = (): HookRuntime | undefined => {\n // The bridge publishes this accessor just before session_start. Never build\n // a second session instance for headless lifecycle handlers.\n const server = context.get(DOOM_CORDIS_SERVER_SERVICES) as DoomCordisServerServices | undefined;\n return server ? server.get<HookRuntime>(DOOM_HOOK_SESSION_SERVICE) : binding.runtime();\n };\n return { value: createHookHandlers(pi, runtime), services: [binding.plugin] };\n};\nexport type HookPiScope = Awaited<ReturnType<typeof createHookPiRoot>>['value'];\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { createHookPiRoot } from './_lib/piRoot';\n\nexport default defineRoot(createHookPiRoot);\n","import { defineCliHook, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiEventHandlers, PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { HookPiScope } from '../_lib/piRoot';\nexport default defineCliHook(\n (context: WithRoot<PiPluginContext<unknown>, HookPiScope>): PiEventHandlers['agent_settled'] =>\n context.root.agent_settled,\n);\n","import { defineCliHook, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiEventHandlers, PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { HookPiScope } from '../_lib/piRoot';\nexport default defineCliHook(\n (context: WithRoot<PiPluginContext<unknown>, HookPiScope>): PiEventHandlers['before_agent_start'] =>\n context.root.before_agent_start,\n);\n","import { defineCliHook, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiEventHandlers, PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { HookPiScope } from '../_lib/piRoot';\nexport default defineCliHook(\n (context: WithRoot<PiPluginContext<unknown>, HookPiScope>): PiEventHandlers['session_shutdown'] =>\n context.root.session_shutdown,\n);\n","import { defineCliHook, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiEventHandlers, PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { HookPiScope } from '../_lib/piRoot';\nexport default defineCliHook(\n (context: WithRoot<PiPluginContext<unknown>, HookPiScope>): PiEventHandlers['session_start'] =>\n context.root.session_start,\n);\n","import { defineCliHook, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiEventHandlers, PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { HookPiScope } from '../_lib/piRoot';\nexport default defineCliHook(\n (context: WithRoot<PiPluginContext<unknown>, HookPiScope>): PiEventHandlers['tool_call'] => context.root.tool_call,\n);\n","import { defineCliHook, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiEventHandlers, PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport type { HookPiScope } from '../_lib/piRoot';\nexport default defineCliHook(\n (context: WithRoot<PiPluginContext<unknown>, HookPiScope>): PiEventHandlers['tool_result'] =>\n context.root.tool_result,\n);\n","import { defineResource } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { HOOK_HELP_SKILL, PACKAGE_SOURCE } from '../../../../../constants/hook';\nexport default defineResource({ source: PACKAGE_SOURCE, moduleUrl: import.meta.url, skills: [HOOK_HELP_SKILL] });\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { definePiExtension, type PiPluginContext, type PiPluginContributions } from '@agimon-ai/doompi-core/piExtension';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.cli';\nimport hookAgentSettled from '../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli';\nimport hookBeforeAgentStart from '../src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.cli';\nimport hookSessionShutdown from '../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.cli';\nimport hookSessionStart from '../src/extensions/workspaces/sessions/(backend)/hook/session-start.cli';\nimport hookToolCall from '../src/extensions/workspaces/sessions/(backend)/hook/tool-call.cli';\nimport hookToolResult from '../src/extensions/workspaces/sessions/(backend)/hook/tool-result.cli';\nimport resourceDoompiUseHook from '../src/extensions/workspaces/sessions/(backend)/resource/doompi-use-hook.cli';\n\ntype OptionsOf<T> = T extends (context: PiPluginContext<infer Options>) => unknown ? Options : never;\ntype InferredOptions = Exclude<OptionsOf<typeof rootSession> | OptionsOf<typeof hookAgentSettled> | OptionsOf<typeof hookBeforeAgentStart> | OptionsOf<typeof hookSessionShutdown> | OptionsOf<typeof hookSessionStart> | OptionsOf<typeof hookToolCall> | OptionsOf<typeof hookToolResult> | OptionsOf<typeof resourceDoompiUseHook>, undefined>;\ntype Intersect<Union> =\n (Union extends unknown ? (value: Union) => void : never) extends (value: infer Value) => void ? Value : never;\ntype ExtensionOptions = [InferredOptions] extends [never] ? undefined : Intersect<InferredOptions>;\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\n\nexport const extension = definePiExtension<ExtensionOptions>('@agimon-ai/doompi-hook', async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n events: {\n agent_settled: at(hookAgentSettled, contextSession) as NonNullable<PiPluginContributions['events']>['agent_settled'],\n before_agent_start: at(hookBeforeAgentStart, contextSession) as NonNullable<PiPluginContributions['events']>['before_agent_start'],\n session_shutdown: at(hookSessionShutdown, contextSession) as NonNullable<PiPluginContributions['events']>['session_shutdown'],\n session_start: at(hookSessionStart, contextSession) as NonNullable<PiPluginContributions['events']>['session_start'],\n tool_call: at(hookToolCall, contextSession) as NonNullable<PiPluginContributions['events']>['tool_call'],\n tool_result: at(hookToolResult, contextSession) as NonNullable<PiPluginContributions['events']>['tool_result'],\n },\n get resources(): PiPluginContributions['resources'] { return [at(resourceDoompiUseHook, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n };\n});\n\nexport default extension;\n"],"mappings":"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"}
|
package/dist/extensions/pi.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { s as HookExtensionOptions } from "../index-Dhd9UC9g.mjs";
|
|
2
2
|
//#region generated/pi.d.ts
|
|
3
3
|
export declare const extension: import("@agimon-ai/doompi-core/runtimePiExtension").DefinedPiExtension<HookExtensionOptions>;
|
|
4
4
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pi.d.mts","names":[],"sources":["../../generated/pi.ts"],"mappings":";;qBAuBa,+DAAS,
|
|
1
|
+
{"version":3,"file":"pi.d.mts","names":["_$___src_exports0.HookExtensionOptions"],"sources":["../../generated/pi.ts"],"mappings":";;qBAuBa,+DAAS,mBAATA"}
|