@agimon-ai/doompi-hook 0.0.1-alpha.6 → 0.0.1-alpha.61
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 +56 -13
- package/dist/apiContracts.cjs +17 -0
- package/dist/apiContracts.cjs.map +1 -0
- package/dist/apiContracts.d.mts +53 -0
- package/dist/apiContracts.d.mts.map +1 -0
- package/dist/apiContracts.mjs +13 -0
- package/dist/apiContracts.mjs.map +1 -0
- package/dist/extensions/mcp.cjs +26 -0
- package/dist/extensions/mcp.cjs.map +1 -0
- package/dist/extensions/mcp.d.mts +5 -0
- package/dist/extensions/mcp.d.mts.map +1 -0
- package/dist/extensions/mcp.mjs +21 -0
- package/dist/extensions/mcp.mjs.map +1 -0
- package/dist/extensions/pi.cjs +337 -1
- package/dist/extensions/pi.cjs.map +1 -0
- package/dist/extensions/pi.d.mts +6 -2
- package/dist/extensions/pi.d.mts.map +1 -0
- package/dist/extensions/pi.mjs +332 -1
- package/dist/extensions/pi.mjs.map +1 -0
- package/dist/extensions/server.cjs +81 -0
- package/dist/extensions/server.cjs.map +1 -0
- package/dist/extensions/server.d.mts +5 -0
- package/dist/extensions/server.d.mts.map +1 -0
- package/dist/extensions/server.mjs +76 -0
- package/dist/extensions/server.mjs.map +1 -0
- package/dist/hooks-CReMXrU9.cjs +615 -0
- package/dist/hooks-CReMXrU9.cjs.map +1 -0
- package/dist/hooks-D2s_5hzZ.mjs +473 -0
- package/dist/hooks-D2s_5hzZ.mjs.map +1 -0
- package/dist/index-LpLV04fM.d.mts +297 -0
- package/dist/index-LpLV04fM.d.mts.map +1 -0
- package/dist/index.cjs +22 -1
- package/dist/index.d.mts +2 -12
- package/dist/index.mjs +2 -1
- package/llms.txt +6 -2
- package/package.json +54 -14
- package/src/prompts/doompi-author-hook/SKILL.md +51 -0
- package/dist/_virtual/_rolldown/runtime.cjs +0 -1
- package/dist/adapters/hookDocuments.cjs +0 -2
- package/dist/adapters/hookDocuments.cjs.map +0 -1
- package/dist/adapters/hookDocuments.d.cts +0 -23
- package/dist/adapters/hookDocuments.d.cts.map +0 -1
- package/dist/adapters/hookDocuments.d.mts +0 -23
- package/dist/adapters/hookDocuments.d.mts.map +0 -1
- package/dist/adapters/hookDocuments.mjs +0 -2
- package/dist/adapters/hookDocuments.mjs.map +0 -1
- package/dist/adapters/hookRunner.cjs +0 -2
- package/dist/adapters/hookRunner.cjs.map +0 -1
- package/dist/adapters/hookRunner.d.cts +0 -22
- package/dist/adapters/hookRunner.d.cts.map +0 -1
- package/dist/adapters/hookRunner.d.mts +0 -22
- package/dist/adapters/hookRunner.d.mts.map +0 -1
- package/dist/adapters/hookRunner.mjs +0 -2
- package/dist/adapters/hookRunner.mjs.map +0 -1
- package/dist/adapters/pi/extension.cjs +0 -2
- package/dist/adapters/pi/extension.cjs.map +0 -1
- package/dist/adapters/pi/extension.d.cts +0 -14
- package/dist/adapters/pi/extension.d.cts.map +0 -1
- package/dist/adapters/pi/extension.d.mts +0 -14
- package/dist/adapters/pi/extension.d.mts.map +0 -1
- package/dist/adapters/pi/extension.mjs +0 -2
- package/dist/adapters/pi/extension.mjs.map +0 -1
- package/dist/adapters/pi/hookHandlers.cjs +0 -8
- package/dist/adapters/pi/hookHandlers.cjs.map +0 -1
- package/dist/adapters/pi/hookHandlers.mjs +0 -8
- package/dist/adapters/pi/hookHandlers.mjs.map +0 -1
- package/dist/adapters/telemetry/logSinkTelemetry.cjs +0 -2
- package/dist/adapters/telemetry/logSinkTelemetry.cjs.map +0 -1
- package/dist/adapters/telemetry/logSinkTelemetry.d.cts +0 -14
- package/dist/adapters/telemetry/logSinkTelemetry.d.cts.map +0 -1
- package/dist/adapters/telemetry/logSinkTelemetry.d.mts +0 -14
- package/dist/adapters/telemetry/logSinkTelemetry.d.mts.map +0 -1
- package/dist/adapters/telemetry/logSinkTelemetry.mjs +0 -2
- package/dist/adapters/telemetry/logSinkTelemetry.mjs.map +0 -1
- package/dist/extensions/pi.d.cts +0 -2
- package/dist/index.d.cts +0 -12
- package/dist/services/hookDecisions.cjs +0 -3
- package/dist/services/hookDecisions.cjs.map +0 -1
- package/dist/services/hookDecisions.d.cts +0 -19
- package/dist/services/hookDecisions.d.cts.map +0 -1
- package/dist/services/hookDecisions.d.mts +0 -19
- package/dist/services/hookDecisions.d.mts.map +0 -1
- package/dist/services/hookDecisions.mjs +0 -3
- package/dist/services/hookDecisions.mjs.map +0 -1
- package/dist/services/hookPayload.cjs +0 -2
- package/dist/services/hookPayload.cjs.map +0 -1
- package/dist/services/hookPayload.d.cts +0 -9
- package/dist/services/hookPayload.d.cts.map +0 -1
- package/dist/services/hookPayload.d.mts +0 -9
- package/dist/services/hookPayload.d.mts.map +0 -1
- package/dist/services/hookPayload.mjs +0 -2
- package/dist/services/hookPayload.mjs.map +0 -1
- package/dist/services/hookRegistry.cjs +0 -2
- package/dist/services/hookRegistry.cjs.map +0 -1
- package/dist/services/hookRegistry.d.cts +0 -37
- package/dist/services/hookRegistry.d.cts.map +0 -1
- package/dist/services/hookRegistry.d.mts +0 -37
- package/dist/services/hookRegistry.d.mts.map +0 -1
- package/dist/services/hookRegistry.mjs +0 -2
- package/dist/services/hookRegistry.mjs.map +0 -1
- package/dist/services/pluginHooks.cjs +0 -2
- package/dist/services/pluginHooks.cjs.map +0 -1
- package/dist/services/pluginHooks.d.cts +0 -13
- package/dist/services/pluginHooks.d.cts.map +0 -1
- package/dist/services/pluginHooks.d.mts +0 -13
- package/dist/services/pluginHooks.d.mts.map +0 -1
- package/dist/services/pluginHooks.mjs +0 -2
- package/dist/services/pluginHooks.mjs.map +0 -1
- package/dist/services/toolNames.cjs +0 -2
- package/dist/services/toolNames.cjs.map +0 -1
- package/dist/services/toolNames.d.cts +0 -8
- package/dist/services/toolNames.d.cts.map +0 -1
- package/dist/services/toolNames.d.mts +0 -8
- package/dist/services/toolNames.d.mts.map +0 -1
- package/dist/services/toolNames.mjs +0 -2
- package/dist/services/toolNames.mjs.map +0 -1
- package/dist/types/hooks.cjs +0 -2
- package/dist/types/hooks.cjs.map +0 -1
- package/dist/types/hooks.d.cts +0 -145
- package/dist/types/hooks.d.cts.map +0 -1
- package/dist/types/hooks.d.mts +0 -145
- package/dist/types/hooks.d.mts.map +0 -1
- package/dist/types/hooks.mjs +0 -2
- package/dist/types/hooks.mjs.map +0 -1
- package/dist/types/telemetry.cjs +0 -2
- package/dist/types/telemetry.cjs.map +0 -1
- package/dist/types/telemetry.d.cts +0 -20
- package/dist/types/telemetry.d.cts.map +0 -1
- package/dist/types/telemetry.d.mts +0 -20
- package/dist/types/telemetry.d.mts.map +0 -1
- package/dist/types/telemetry.mjs +0 -2
- package/dist/types/telemetry.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -1,11 +1,21 @@
|
|
|
1
1
|
# @agimon-ai/doompi-hook
|
|
2
2
|
|
|
3
|
-
Claude
|
|
3
|
+
Claude Code-compatible repository and plugin hooks for
|
|
4
4
|
[DoomPi](https://www.npmjs.com/package/@agimon-ai/doompi) sessions.
|
|
5
5
|
|
|
6
6
|
A **hook** is a shell command the repository runs at a point in the session: before a tool call,
|
|
7
7
|
after one, at session start, when the agent settles, and at session end. Commands are declared in
|
|
8
|
-
`.doom/hooks.yaml`, grouped so a mode can turn a whole family of them on or off
|
|
8
|
+
`.doom/hooks.yaml`, grouped so a mode can turn a whole family of them on or off.
|
|
9
|
+
|
|
10
|
+
> **Alpha:** hook configuration and runtime contracts may change between releases.
|
|
11
|
+
|
|
12
|
+
## Requirements
|
|
13
|
+
|
|
14
|
+
- Node.js 22.19.0 or newer
|
|
15
|
+
- Pi 0.85.0
|
|
16
|
+
- `/bin/bash`
|
|
17
|
+
|
|
18
|
+
Configure hooks in `.doom/hooks.yaml`:
|
|
9
19
|
|
|
10
20
|
```yaml
|
|
11
21
|
# .doom/hooks.yaml
|
|
@@ -25,14 +35,15 @@ groups:
|
|
|
25
35
|
skipInSubagent: true
|
|
26
36
|
```
|
|
27
37
|
|
|
28
|
-
A group marked `core: true` always loads. Every other group loads only when the active mode
|
|
29
|
-
it. The same document is read from the global `.doom` directory and from the repository
|
|
30
|
-
repository group replaces the global group of the same
|
|
38
|
+
A group marked `core: true` always loads. Every other group loads only when the active mode selects
|
|
39
|
+
it. The same document is read from the global `.doom` directory and from the repository. A
|
|
40
|
+
repository group replaces the global group of the same ID outright.
|
|
31
41
|
|
|
32
42
|
## Activation
|
|
33
43
|
|
|
34
|
-
The
|
|
35
|
-
|
|
44
|
+
The distribution activates this package by default through the `default.packages` list written by
|
|
45
|
+
`doompi init` and `dpi init` in `.doom/modes.yaml`. Keep it there, or declare it in a selected layer,
|
|
46
|
+
for hooks to run. Layers only declare the `hookGroups` to select; they do not define the hook commands:
|
|
36
47
|
|
|
37
48
|
```yaml
|
|
38
49
|
# .doom/modes.yaml
|
|
@@ -41,14 +52,16 @@ layers:
|
|
|
41
52
|
hookGroups: [safety, workflow]
|
|
42
53
|
```
|
|
43
54
|
|
|
44
|
-
A session with no selected `hookGroups` still runs groups marked `core: true`; other groups remain
|
|
55
|
+
A session with no selected `hookGroups` still runs groups marked `core: true`; other groups remain
|
|
56
|
+
inactive.
|
|
45
57
|
|
|
46
58
|
## What a hook sees and can say
|
|
47
59
|
|
|
48
60
|
Each command is run through `/bin/bash -c` in the repository root, with the Claude Code payload for
|
|
49
|
-
the event on stdin
|
|
50
|
-
|
|
51
|
-
|
|
61
|
+
the event on stdin. The environment includes `CLAUDE_PROJECT_DIR`, `CODEX_REPO_ROOT`, and
|
|
62
|
+
`ORIGINAL_REPO_PATH`. Every resolved hook also receives `CLAUDE_PLUGIN_ROOT`, set to the root that
|
|
63
|
+
declared its repository, personal, or plugin configuration. Tool names in the payload and in
|
|
64
|
+
`matcher` are Claude names (`Bash`, `Write`), not Pi's.
|
|
52
65
|
|
|
53
66
|
The last stdout line that starts with `{` is read as the hook's decision:
|
|
54
67
|
|
|
@@ -70,14 +83,44 @@ indistinguishable from one that passed.
|
|
|
70
83
|
expires, is sent `SIGTERM` and then `SIGKILL` two seconds later, so a stalled hook does not leave
|
|
71
84
|
the processes it started behind.
|
|
72
85
|
|
|
73
|
-
##
|
|
86
|
+
## Help guidance
|
|
87
|
+
|
|
88
|
+
While the Help minor mode is active, this package contributes `doompi-author-hook`. The prompt
|
|
89
|
+
covers `.doom/hooks.yaml`, group activation, commands, payloads, decisions, and verification, and
|
|
90
|
+
is withdrawn when the package or Help provider unloads.
|
|
74
91
|
|
|
75
|
-
|
|
92
|
+
## Install
|
|
93
|
+
|
|
94
|
+
For standalone Pi installation:
|
|
76
95
|
|
|
77
96
|
```bash
|
|
78
97
|
pi install npm:@agimon-ai/doompi-hook
|
|
79
98
|
```
|
|
80
99
|
|
|
100
|
+
## Public API
|
|
101
|
+
|
|
102
|
+
```ts
|
|
103
|
+
import { createBashHookRunner, hookExtension } from '@agimon-ai/doompi-hook';
|
|
104
|
+
import type { HookDecision, HookEventName } from '@agimon-ai/doompi-hook';
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Development
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
pnpm build
|
|
111
|
+
pnpm typecheck
|
|
112
|
+
pnpm test
|
|
113
|
+
pnpm lint
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Maintained by [Agimon](https://agimon.ai/about).
|
|
117
|
+
|
|
81
118
|
## License
|
|
82
119
|
|
|
83
120
|
MIT
|
|
121
|
+
|
|
122
|
+
## Extension lifecycle and source layout
|
|
123
|
+
|
|
124
|
+
`extensions/pi.ts` declares Config-dependent service bindings, typed controller events, and Help resources. The readiness gate in `services/hookRuntime/` keeps session-start hooks ahead of dependent events and rejects stale generations. Session-end hooks finish during `session_shutdown` before the shared helper disposes the service binding.
|
|
125
|
+
|
|
126
|
+
`extensions/server.ts` declares the server hooks from `controllers/serverHooks.ts`. Controllers dispatch through `services/<name>/`; constants and shared types have their own roots. Flat `exports/` publishes reusable capabilities, and extension entry points are built directly.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
Object.defineProperties(exports, {
|
|
2
|
+
__esModule: { value: true },
|
|
3
|
+
[Symbol.toStringTag]: { value: "Module" }
|
|
4
|
+
});
|
|
5
|
+
//#region src/schemas/apiContracts.ts
|
|
6
|
+
/** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */
|
|
7
|
+
const apiContracts = (0, require("@agimon-ai/doompi-core/apiContracts").defineApiContract)({
|
|
8
|
+
version: 1,
|
|
9
|
+
http: [],
|
|
10
|
+
sockets: [],
|
|
11
|
+
dynamic: []
|
|
12
|
+
});
|
|
13
|
+
//#endregion
|
|
14
|
+
exports.apiContracts = apiContracts;
|
|
15
|
+
exports.default = apiContracts;
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=apiContracts.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiContracts.cjs","names":["defineApiContract"],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract } from '@agimon-ai/doompi-core/apiContracts';\n\n/** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */\nexport const apiContracts = defineApiContract({ version: 1, http: [], sockets: [], dynamic: [] });\nexport default apiContracts;\n"],"mappings":";;;;;;AAGA,MAAa,gBAAA,gDAAeA,CAAAA,CAAAA,kBAAAA,CAAkB;CAAE,SAAS;CAAG,MAAM,CAAC;CAAG,SAAS,CAAC;CAAG,SAAS,CAAC;AAAE,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
//#region src/schemas/apiContracts.d.ts
|
|
2
|
+
/** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */
|
|
3
|
+
export declare const apiContracts: {
|
|
4
|
+
version: 1;
|
|
5
|
+
protocols?: Record<string, string> | undefined;
|
|
6
|
+
schemas?: Record<string, boolean | object> | undefined;
|
|
7
|
+
http: {
|
|
8
|
+
id: string;
|
|
9
|
+
scope: "global" | "session" | "workspace";
|
|
10
|
+
basePath?: string | undefined;
|
|
11
|
+
path: string;
|
|
12
|
+
method: "DELETE" | "GET" | "HEAD" | "OPTIONS" | "PATCH" | "POST" | "PUT";
|
|
13
|
+
description: string;
|
|
14
|
+
availability?: string | undefined;
|
|
15
|
+
authentication: "device" | "none" | "owner";
|
|
16
|
+
parameters?: {
|
|
17
|
+
name: string;
|
|
18
|
+
in: "header" | "path" | "query";
|
|
19
|
+
required: boolean;
|
|
20
|
+
schema: boolean | object;
|
|
21
|
+
}[] | undefined;
|
|
22
|
+
body?: {
|
|
23
|
+
contentType: string;
|
|
24
|
+
contentTypes?: string[] | undefined;
|
|
25
|
+
required: boolean;
|
|
26
|
+
schema: boolean | object;
|
|
27
|
+
} | undefined;
|
|
28
|
+
responses: Record<string, {
|
|
29
|
+
description: string;
|
|
30
|
+
contentType?: string | undefined;
|
|
31
|
+
schema?: boolean | object | undefined;
|
|
32
|
+
events?: Record<string, boolean | object> | undefined;
|
|
33
|
+
}>;
|
|
34
|
+
}[];
|
|
35
|
+
sockets: {
|
|
36
|
+
id: string;
|
|
37
|
+
scope: "global" | "session" | "workspace";
|
|
38
|
+
description: string;
|
|
39
|
+
availability?: string | undefined;
|
|
40
|
+
service: string;
|
|
41
|
+
member: string;
|
|
42
|
+
direction: "client-to-server" | "server-to-client";
|
|
43
|
+
kind: "channel" | "method" | "state";
|
|
44
|
+
input: boolean | object;
|
|
45
|
+
output?: boolean | object | undefined;
|
|
46
|
+
errors?: boolean | object | undefined;
|
|
47
|
+
}[];
|
|
48
|
+
dynamic: string[];
|
|
49
|
+
gaps?: string[] | undefined;
|
|
50
|
+
};
|
|
51
|
+
//#endregion
|
|
52
|
+
export { apiContracts as default };
|
|
53
|
+
//# sourceMappingURL=apiContracts.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiContracts.d.mts","names":[],"sources":["../src/schemas/apiContracts.ts"],"mappings":";;qBAGa"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { defineApiContract } from "@agimon-ai/doompi-core/apiContracts";
|
|
2
|
+
//#region src/schemas/apiContracts.ts
|
|
3
|
+
/** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */
|
|
4
|
+
const apiContracts = defineApiContract({
|
|
5
|
+
version: 1,
|
|
6
|
+
http: [],
|
|
7
|
+
sockets: [],
|
|
8
|
+
dynamic: []
|
|
9
|
+
});
|
|
10
|
+
//#endregion
|
|
11
|
+
export { apiContracts, apiContracts as default };
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=apiContracts.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiContracts.mjs","names":[],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract } from '@agimon-ai/doompi-core/apiContracts';\n\n/** This facet contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */\nexport const apiContracts = defineApiContract({ version: 1, http: [], sockets: [], dynamic: [] });\nexport default apiContracts;\n"],"mappings":";;;AAGA,MAAa,eAAe,kBAAkB;CAAE,SAAS;CAAG,MAAM,CAAC;CAAG,SAAS,CAAC;CAAG,SAAS,CAAC;AAAE,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
Object.defineProperties(exports, {
|
|
2
|
+
__esModule: { value: true },
|
|
3
|
+
[Symbol.toStringTag]: { value: "Module" }
|
|
4
|
+
});
|
|
5
|
+
let _agimon_ai_doompi_core_mcpFacet = require("@agimon-ai/doompi-core/mcpFacet");
|
|
6
|
+
let _agimon_ai_doompi_core_serverFacet = require("@agimon-ai/doompi-core/serverFacet");
|
|
7
|
+
//#region src/extensions/workspaces/sessions/(backend)/skill/doompi-author-hook.mcp.ts
|
|
8
|
+
var doompi_author_hook_mcp_default = (0, _agimon_ai_doompi_core_mcpFacet.defineMcpSkill)({
|
|
9
|
+
name: "doompi-author-hook",
|
|
10
|
+
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.",
|
|
11
|
+
read: () => (0, _agimon_ai_doompi_core_serverFacet.readPackageResource)(require("url").pathToFileURL(__filename).href, "src/prompts/doompi-author-hook/SKILL.md")
|
|
12
|
+
});
|
|
13
|
+
//#endregion
|
|
14
|
+
//#region generated/mcp.ts
|
|
15
|
+
const at = (value, context) => typeof value === "function" ? value(context) : value;
|
|
16
|
+
const mcp = (0, _agimon_ai_doompi_core_mcpFacet.defineMcpPlugin)({
|
|
17
|
+
name: "@agimon-ai/doompi-hook",
|
|
18
|
+
session: (context) => ({ get skills() {
|
|
19
|
+
return [at(doompi_author_hook_mcp_default, context)];
|
|
20
|
+
} })
|
|
21
|
+
});
|
|
22
|
+
//#endregion
|
|
23
|
+
exports.default = mcp;
|
|
24
|
+
exports.mcp = mcp;
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=mcp.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.cjs","names":["defineMcpSkill","readPackageResource","defineMcpPlugin","skillDoompiAuthorHook"],"sources":["../../src/extensions/workspaces/sessions/(backend)/skill/doompi-author-hook.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["import { defineMcpSkill } from '@agimon-ai/doompi-core/mcpFacet';\nimport { readPackageResource } from '@agimon-ai/doompi-core/serverFacet';\n\nexport default defineMcpSkill({\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 read: () => readPackageResource(import.meta.url, 'src/prompts/doompi-author-hook/SKILL.md'),\n});\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineMcpPlugin, type DoomMcpSessionPlugin } from '@agimon-ai/doompi-core/mcpFacet';\n\nimport skillDoompiAuthorHook from '../src/extensions/workspaces/sessions/(backend)/skill/doompi-author-hook.mcp';\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 mcp = defineMcpPlugin({\n name: '@agimon-ai/doompi-hook',\n session: (context) => ({\n get skills(): DoomMcpSessionPlugin['skills'] { return [at(skillDoompiAuthorHook, context)]; },\n }) satisfies DoomMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":";;;;;;;AAGA,IAAA,kCAAA,GAAeA,gCAAAA,eAAAA,CAAe;CAC5B,MAAM;CACN,aACE;CACF,aAAA,GAAYC,mCAAAA,oBAAAA,CAAAA,QAAAA,KAAAA,CAAAA,CAAAA,cAAAA,UAAAA,CAAAA,CAAAA,MAAqC,yCAAyC;AAC5F,CAAC;;;ACFD,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AAEpE,MAAa,OAAA,GAAMC,gCAAAA,gBAAAA,CAAgB;CACjC,MAAM;CACN,UAAU,aAAa,EACrB,IAAI,SAAyC;EAAE,OAAO,CAAC,GAAGC,gCAAuB,OAAO,CAAC;CAAG,EAC9F;AACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.mts","names":[],"sources":["../../generated/mcp.ts"],"mappings":";qBASa,+CAAG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { defineMcpPlugin, defineMcpSkill } from "@agimon-ai/doompi-core/mcpFacet";
|
|
2
|
+
import { readPackageResource } from "@agimon-ai/doompi-core/serverFacet";
|
|
3
|
+
//#region src/extensions/workspaces/sessions/(backend)/skill/doompi-author-hook.mcp.ts
|
|
4
|
+
var doompi_author_hook_mcp_default = defineMcpSkill({
|
|
5
|
+
name: "doompi-author-hook",
|
|
6
|
+
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.",
|
|
7
|
+
read: () => readPackageResource(import.meta.url, "src/prompts/doompi-author-hook/SKILL.md")
|
|
8
|
+
});
|
|
9
|
+
//#endregion
|
|
10
|
+
//#region generated/mcp.ts
|
|
11
|
+
const at = (value, context) => typeof value === "function" ? value(context) : value;
|
|
12
|
+
const mcp = defineMcpPlugin({
|
|
13
|
+
name: "@agimon-ai/doompi-hook",
|
|
14
|
+
session: (context) => ({ get skills() {
|
|
15
|
+
return [at(doompi_author_hook_mcp_default, context)];
|
|
16
|
+
} })
|
|
17
|
+
});
|
|
18
|
+
//#endregion
|
|
19
|
+
export { mcp as default, mcp };
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=mcp.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.mjs","names":["skillDoompiAuthorHook"],"sources":["../../src/extensions/workspaces/sessions/(backend)/skill/doompi-author-hook.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["import { defineMcpSkill } from '@agimon-ai/doompi-core/mcpFacet';\nimport { readPackageResource } from '@agimon-ai/doompi-core/serverFacet';\n\nexport default defineMcpSkill({\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 read: () => readPackageResource(import.meta.url, 'src/prompts/doompi-author-hook/SKILL.md'),\n});\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineMcpPlugin, type DoomMcpSessionPlugin } from '@agimon-ai/doompi-core/mcpFacet';\n\nimport skillDoompiAuthorHook from '../src/extensions/workspaces/sessions/(backend)/skill/doompi-author-hook.mcp';\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 mcp = defineMcpPlugin({\n name: '@agimon-ai/doompi-hook',\n session: (context) => ({\n get skills(): DoomMcpSessionPlugin['skills'] { return [at(skillDoompiAuthorHook, context)]; },\n }) satisfies DoomMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":";;;AAGA,IAAA,iCAAe,eAAe;CAC5B,MAAM;CACN,aACE;CACF,YAAY,oBAAoB,YAAY,KAAK,yCAAyC;AAC5F,CAAC;;;ACFD,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AAEpE,MAAa,MAAM,gBAAgB;CACjC,MAAM;CACN,UAAU,aAAa,EACrB,IAAI,SAAyC;EAAE,OAAO,CAAC,GAAGA,gCAAuB,OAAO,CAAC;CAAG,EAC9F;AACF,CAAC"}
|
package/dist/extensions/pi.cjs
CHANGED
|
@@ -1 +1,337 @@
|
|
|
1
|
-
Object.defineProperties(exports,{
|
|
1
|
+
Object.defineProperties(exports, {
|
|
2
|
+
__esModule: { value: true },
|
|
3
|
+
[Symbol.toStringTag]: { value: "Module" }
|
|
4
|
+
});
|
|
5
|
+
const require_hooks = require("../hooks-CReMXrU9.cjs");
|
|
6
|
+
let _agimon_ai_doompi_core_piExtension = require("@agimon-ai/doompi-core/piExtension");
|
|
7
|
+
let _agimon_ai_doompi_core_extensionFile = require("@agimon-ai/doompi-core/extensionFile");
|
|
8
|
+
let _agimon_ai_doompi_config_piContext = require("@agimon-ai/doompi-config/piContext");
|
|
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
|
+
const STEER = { deliverAs: "steer" };
|
|
16
|
+
const SUBAGENT_ENVIRONMENT_FLAG = "PI_SUBAGENT_CHILD";
|
|
17
|
+
//#endregion
|
|
18
|
+
//#region src/services/hookHandlers/index.ts
|
|
19
|
+
/**
|
|
20
|
+
* Registry rows plus plugin hooks for one event, in that order.
|
|
21
|
+
*
|
|
22
|
+
* Both sources are read on every dispatch because either can change mid-session:
|
|
23
|
+
* /mode switches the selected groups and a plugin can rewrite its own config.
|
|
24
|
+
*/
|
|
25
|
+
async function resolveHooks(session, ctx, eventName, toolName) {
|
|
26
|
+
const harness = session.config().harness;
|
|
27
|
+
const repoRoot = harness.root ?? ctx.cwd;
|
|
28
|
+
const [registry, plugins] = await Promise.all([session.documents.registry(repoRoot), session.documents.plugins(harness.pluginHooks)]);
|
|
29
|
+
const hooks = [...require_hooks.selectRegistryHooks(registry.entries, {
|
|
30
|
+
event: eventName,
|
|
31
|
+
toolName,
|
|
32
|
+
allowedGroups: harness.hookGroups,
|
|
33
|
+
inSubagent: Boolean(process.env[SUBAGENT_ENVIRONMENT_FLAG])
|
|
34
|
+
}), ...require_hooks.selectPluginHooks(plugins.documents, eventName, toolName)];
|
|
35
|
+
return {
|
|
36
|
+
repoRoot,
|
|
37
|
+
sessionId: ctx.sessionManager.getSessionId(),
|
|
38
|
+
hooks,
|
|
39
|
+
failures: [...registry.failure ? [registry.failure] : [], ...plugins.failures]
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/** Session end is plugin-only: the registry has no binding for it. */
|
|
43
|
+
async function resolvePluginHooks(session, ctx, eventName) {
|
|
44
|
+
const harness = session.config().harness;
|
|
45
|
+
const plugins = await session.documents.plugins(harness.pluginHooks);
|
|
46
|
+
return {
|
|
47
|
+
repoRoot: harness.root ?? ctx.cwd,
|
|
48
|
+
sessionId: ctx.sessionManager.getSessionId(),
|
|
49
|
+
hooks: require_hooks.selectPluginHooks(plugins.documents, eventName),
|
|
50
|
+
failures: plugins.failures
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async function runHooks(session, ctx, dispatch, payload, statusKey, statusLabel) {
|
|
54
|
+
const outcomes = [];
|
|
55
|
+
try {
|
|
56
|
+
for (const [index, resolved] of dispatch.hooks.entries()) {
|
|
57
|
+
if (ctx.hasUI) ctx.ui.setStatus(statusKey, `${statusLabel} (${index + 1}/${dispatch.hooks.length})...`);
|
|
58
|
+
outcomes.push(await session.runner.run(resolved.hook, payload, {
|
|
59
|
+
repoRoot: dispatch.repoRoot,
|
|
60
|
+
pluginRoot: resolved.root
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
} finally {
|
|
64
|
+
if (ctx.hasUI) ctx.ui.setStatus(statusKey, void 0);
|
|
65
|
+
}
|
|
66
|
+
return outcomes;
|
|
67
|
+
}
|
|
68
|
+
function allFailures(dispatch, outcomes) {
|
|
69
|
+
return [...dispatch.failures, ...require_hooks.failuresFrom(outcomes)];
|
|
70
|
+
}
|
|
71
|
+
function steerHookFailures(pi, failures) {
|
|
72
|
+
if (failures.length === 0) return;
|
|
73
|
+
pi.sendMessage({
|
|
74
|
+
customType: FAILURE_MESSAGE_TYPE,
|
|
75
|
+
content: require_hooks.hookFailureMessage(failures),
|
|
76
|
+
display: true
|
|
77
|
+
}, STEER);
|
|
78
|
+
}
|
|
79
|
+
async function runSessionStartHooks(pi, session, ctx, signal, isCurrent = () => true) {
|
|
80
|
+
signal?.throwIfAborted();
|
|
81
|
+
const dispatch = await resolveHooks(session, ctx, require_hooks.HOOK_EVENT.sessionStart);
|
|
82
|
+
signal?.throwIfAborted();
|
|
83
|
+
const outcomes = await runHooks(session, ctx, dispatch, require_hooks.sessionHookPayload(dispatch.sessionId, dispatch.repoRoot), `${STATUS_PREFIX}:${dispatch.sessionId}:start`, "Running session-start hooks");
|
|
84
|
+
signal?.throwIfAborted();
|
|
85
|
+
if (!isCurrent()) return;
|
|
86
|
+
steerHookFailures(pi, allFailures(dispatch, outcomes));
|
|
87
|
+
const context = require_hooks.additionalContextsFrom(require_hooks.decisionsFrom(outcomes)).join("\n\n");
|
|
88
|
+
if (context) pi.sendMessage({
|
|
89
|
+
customType: CONTEXT_MESSAGE_TYPE,
|
|
90
|
+
content: context,
|
|
91
|
+
display: true
|
|
92
|
+
}, STEER);
|
|
93
|
+
}
|
|
94
|
+
function createSessionStart(pi, resolveRuntime) {
|
|
95
|
+
return (_event, ctx) => {
|
|
96
|
+
const runtime = resolveRuntime();
|
|
97
|
+
if (!runtime?.isCurrent()) return void 0;
|
|
98
|
+
const { readiness, session } = runtime;
|
|
99
|
+
if (readiness) return readiness.start(ctx, (signal, isReady) => runSessionStartHooks(pi, session, ctx, signal, () => runtime.isCurrent() && isReady()));
|
|
100
|
+
return runSessionStartHooks(pi, session, ctx);
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
function createBeforeAgentStart(_pi, resolveRuntime) {
|
|
104
|
+
return async (_event, ctx) => {
|
|
105
|
+
const runtime = resolveRuntime();
|
|
106
|
+
if (!runtime?.isCurrent()) return;
|
|
107
|
+
await runtime.readiness?.wait(ctx);
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function createToolCall(pi, resolveRuntime) {
|
|
111
|
+
return async (event, ctx) => {
|
|
112
|
+
const runtime = resolveRuntime();
|
|
113
|
+
if (!runtime?.isCurrent()) return void 0;
|
|
114
|
+
await runtime.readiness?.wait(ctx);
|
|
115
|
+
if (!runtime.isCurrent()) return void 0;
|
|
116
|
+
const dispatch = await resolveHooks(runtime.session, ctx, require_hooks.HOOK_EVENT.preToolUse, event.toolName);
|
|
117
|
+
if (!runtime.isCurrent()) return void 0;
|
|
118
|
+
const payload = require_hooks.toolHookPayload(event, require_hooks.HOOK_EVENT.preToolUse, dispatch.repoRoot, dispatch.sessionId);
|
|
119
|
+
const outcomes = await runHooks(runtime.session, ctx, dispatch, payload, `${STATUS_PREFIX}:${event.toolCallId}:pre`, `Running pre-tool hooks for ${event.toolName}`);
|
|
120
|
+
if (!runtime.isCurrent()) return void 0;
|
|
121
|
+
const decisions = require_hooks.decisionsFrom(outcomes);
|
|
122
|
+
steerHookFailures(pi, allFailures(dispatch, outcomes));
|
|
123
|
+
const denied = decisions.find(require_hooks.isDenied);
|
|
124
|
+
if (denied) return {
|
|
125
|
+
block: true,
|
|
126
|
+
reason: require_hooks.decisionReason(denied) ?? "Blocked by repository hook"
|
|
127
|
+
};
|
|
128
|
+
const context = require_hooks.additionalContextsFrom(decisions).join("\n\n");
|
|
129
|
+
return context ? {
|
|
130
|
+
block: true,
|
|
131
|
+
reason: context
|
|
132
|
+
} : void 0;
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
function createToolResult(_pi, resolveRuntime) {
|
|
136
|
+
return async (event, ctx) => {
|
|
137
|
+
const runtime = resolveRuntime();
|
|
138
|
+
if (!runtime?.isCurrent()) return void 0;
|
|
139
|
+
await runtime.readiness?.wait(ctx);
|
|
140
|
+
if (!runtime.isCurrent()) return void 0;
|
|
141
|
+
const dispatch = await resolveHooks(runtime.session, ctx, require_hooks.HOOK_EVENT.postToolUse, event.toolName);
|
|
142
|
+
if (!runtime.isCurrent()) return void 0;
|
|
143
|
+
const payload = require_hooks.toolHookPayload(event, require_hooks.HOOK_EVENT.postToolUse, dispatch.repoRoot, dispatch.sessionId);
|
|
144
|
+
const outcomes = await runHooks(runtime.session, ctx, dispatch, payload, `${STATUS_PREFIX}:${event.toolCallId}:post`, `Running post-tool hooks for ${event.toolName}`);
|
|
145
|
+
if (!runtime.isCurrent()) return void 0;
|
|
146
|
+
const decisions = require_hooks.decisionsFrom(outcomes);
|
|
147
|
+
const failures = allFailures(dispatch, outcomes);
|
|
148
|
+
const messages = require_hooks.toolResultMessages(decisions);
|
|
149
|
+
if (failures.length > 0) messages.push(require_hooks.hookFailureMessage(failures));
|
|
150
|
+
if (messages.length === 0) return void 0;
|
|
151
|
+
return {
|
|
152
|
+
content: [...event.content, {
|
|
153
|
+
type: "text",
|
|
154
|
+
text: messages.join("\n\n")
|
|
155
|
+
}],
|
|
156
|
+
isError: event.isError || decisions.some(require_hooks.isDenied)
|
|
157
|
+
};
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
function createAgentSettled(_pi, resolveRuntime) {
|
|
161
|
+
return async (_event, ctx) => {
|
|
162
|
+
const runtime = resolveRuntime();
|
|
163
|
+
if (!runtime?.isCurrent()) return;
|
|
164
|
+
await runtime.readiness?.wait(ctx);
|
|
165
|
+
if (!runtime.isCurrent()) return;
|
|
166
|
+
const dispatch = await resolveHooks(runtime.session, ctx, require_hooks.HOOK_EVENT.stop);
|
|
167
|
+
if (!runtime.isCurrent()) return;
|
|
168
|
+
await runHooks(runtime.session, ctx, dispatch, require_hooks.sessionHookPayload(dispatch.sessionId, dispatch.repoRoot), `${STATUS_PREFIX}:${dispatch.sessionId}:stop`, "Running stop hooks");
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
function createHookHandlers(pi, resolveRuntime) {
|
|
172
|
+
let shutdown;
|
|
173
|
+
return {
|
|
174
|
+
session_start: createSessionStart(pi, resolveRuntime),
|
|
175
|
+
before_agent_start: createBeforeAgentStart(pi, resolveRuntime),
|
|
176
|
+
tool_call: createToolCall(pi, resolveRuntime),
|
|
177
|
+
tool_result: createToolResult(pi, resolveRuntime),
|
|
178
|
+
agent_settled: createAgentSettled(pi, resolveRuntime),
|
|
179
|
+
session_shutdown: (_event, ctx) => {
|
|
180
|
+
const current = resolveRuntime();
|
|
181
|
+
if (!current?.isCurrent()) return void 0;
|
|
182
|
+
shutdown ??= runSessionEndHooks(current.session, ctx);
|
|
183
|
+
return shutdown;
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/** Runs the plugin SessionEnd hooks while the session is still usable. */
|
|
188
|
+
async function runSessionEndHooks(session, ctx) {
|
|
189
|
+
const dispatch = await resolvePluginHooks(session, ctx, require_hooks.HOOK_EVENT.sessionEnd);
|
|
190
|
+
await runHooks(session, ctx, dispatch, require_hooks.sessionHookPayload(dispatch.sessionId, dispatch.repoRoot), `${STATUS_PREFIX}:${dispatch.sessionId}:end`, "Running session-end hooks");
|
|
191
|
+
}
|
|
192
|
+
//#endregion
|
|
193
|
+
//#region src/constants/hook.ts
|
|
194
|
+
const PACKAGE_SOURCE = "@agimon-ai/doompi-hook";
|
|
195
|
+
const HOOK_HELP_SKILL = {
|
|
196
|
+
name: "doompi-author-hook",
|
|
197
|
+
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."
|
|
198
|
+
};
|
|
199
|
+
//#endregion
|
|
200
|
+
//#region src/services/hookRuntime/index.ts
|
|
201
|
+
function hookSession(cordis, options) {
|
|
202
|
+
let telemetry = options.telemetry;
|
|
203
|
+
const requireTelemetry = () => telemetry ??= require_hooks.createHookTelemetry();
|
|
204
|
+
return {
|
|
205
|
+
config: () => (0, _agimon_ai_doompi_config_piContext.requireDoomConfigContext)(cordis),
|
|
206
|
+
runner: options.runner ?? require_hooks.createBashHookRunner({ telemetry: requireTelemetry() }),
|
|
207
|
+
documents: options.documents ?? require_hooks.createHookDocumentReader({ telemetry: requireTelemetry() })
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
function createHookRuntime(cordis, options) {
|
|
211
|
+
const session = hookSession(cordis, options);
|
|
212
|
+
let active = true;
|
|
213
|
+
let generation = 0;
|
|
214
|
+
let readiness;
|
|
215
|
+
return {
|
|
216
|
+
session,
|
|
217
|
+
readiness: {
|
|
218
|
+
start(context, operation) {
|
|
219
|
+
const ownGeneration = ++generation;
|
|
220
|
+
const isCurrent = () => active && ownGeneration === generation;
|
|
221
|
+
const coordinator = (0, _agimon_ai_doompi_core_readiness.readDoomReadinessCoordinator)(cordis);
|
|
222
|
+
if (!coordinator) return operation(new AbortController().signal, isCurrent);
|
|
223
|
+
const previous = readiness;
|
|
224
|
+
const readinessOperation = (async () => {
|
|
225
|
+
if (previous?.coordinator === coordinator) await previous.operation.catch(() => void 0);
|
|
226
|
+
if (!isCurrent()) return;
|
|
227
|
+
await coordinator.start(PACKAGE_SOURCE, `${context.sessionManager.getSessionId()}:${ownGeneration}`, async (signal) => {
|
|
228
|
+
await operation(signal, isCurrent);
|
|
229
|
+
return { value: void 0 };
|
|
230
|
+
}).wait();
|
|
231
|
+
})();
|
|
232
|
+
readinessOperation.catch(() => void 0);
|
|
233
|
+
readiness = {
|
|
234
|
+
sessionManager: context.sessionManager,
|
|
235
|
+
coordinator,
|
|
236
|
+
operation: readinessOperation
|
|
237
|
+
};
|
|
238
|
+
},
|
|
239
|
+
async wait(context) {
|
|
240
|
+
const current = readiness;
|
|
241
|
+
if (!current) return;
|
|
242
|
+
if (current.sessionManager !== context.sessionManager) throw new Error("Hook readiness belongs to a stale Pi session.");
|
|
243
|
+
await current.operation;
|
|
244
|
+
if (!active || current !== readiness) throw new Error("Hook readiness belongs to a stale extension generation.");
|
|
245
|
+
}
|
|
246
|
+
},
|
|
247
|
+
isCurrent: () => active,
|
|
248
|
+
dispose() {
|
|
249
|
+
active = false;
|
|
250
|
+
generation += 1;
|
|
251
|
+
readiness = void 0;
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
function createHookBinding(options) {
|
|
256
|
+
let runtime;
|
|
257
|
+
return {
|
|
258
|
+
plugin(cordis) {
|
|
259
|
+
cordis.inject([_agimon_ai_doompi_core_config.DOOM_CONFIG_SERVICE], (configContext) => {
|
|
260
|
+
const binding = createHookRuntime(configContext, options);
|
|
261
|
+
runtime = binding;
|
|
262
|
+
return () => {
|
|
263
|
+
binding.dispose();
|
|
264
|
+
if (runtime === binding) runtime = void 0;
|
|
265
|
+
};
|
|
266
|
+
});
|
|
267
|
+
},
|
|
268
|
+
runtime: () => runtime
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
//#endregion
|
|
272
|
+
//#region src/extensions/workspaces/sessions/(backend)/_lib/piRoot.ts
|
|
273
|
+
const createHookPiRoot = ({ pi, options }) => {
|
|
274
|
+
const binding = createHookBinding(options ?? {});
|
|
275
|
+
return {
|
|
276
|
+
value: createHookHandlers(pi, binding.runtime),
|
|
277
|
+
services: [binding.plugin]
|
|
278
|
+
};
|
|
279
|
+
};
|
|
280
|
+
//#endregion
|
|
281
|
+
//#region src/extensions/workspaces/sessions/(backend)/root.cli.ts
|
|
282
|
+
var root_cli_default = (0, _agimon_ai_doompi_core_extensionFile.defineRoot)(createHookPiRoot);
|
|
283
|
+
//#endregion
|
|
284
|
+
//#region src/extensions/workspaces/sessions/(backend)/hook/agent-settled.cli.ts
|
|
285
|
+
var agent_settled_cli_default = (0, _agimon_ai_doompi_core_extensionFile.defineCliHook)((context) => context.root.agent_settled);
|
|
286
|
+
//#endregion
|
|
287
|
+
//#region src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.cli.ts
|
|
288
|
+
var before_agent_start_cli_default = (0, _agimon_ai_doompi_core_extensionFile.defineCliHook)((context) => context.root.before_agent_start);
|
|
289
|
+
//#endregion
|
|
290
|
+
//#region src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.cli.ts
|
|
291
|
+
var session_shutdown_cli_default = (0, _agimon_ai_doompi_core_extensionFile.defineCliHook)((context) => context.root.session_shutdown);
|
|
292
|
+
//#endregion
|
|
293
|
+
//#region src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.ts
|
|
294
|
+
var session_start_cli_default = (0, _agimon_ai_doompi_core_extensionFile.defineCliHook)((context) => context.root.session_start);
|
|
295
|
+
//#endregion
|
|
296
|
+
//#region src/extensions/workspaces/sessions/(backend)/hook/tool-call.cli.ts
|
|
297
|
+
var tool_call_cli_default = (0, _agimon_ai_doompi_core_extensionFile.defineCliHook)((context) => context.root.tool_call);
|
|
298
|
+
//#endregion
|
|
299
|
+
//#region src/extensions/workspaces/sessions/(backend)/hook/tool-result.cli.ts
|
|
300
|
+
var tool_result_cli_default = (0, _agimon_ai_doompi_core_extensionFile.defineCliHook)((context) => context.root.tool_result);
|
|
301
|
+
//#endregion
|
|
302
|
+
//#region src/extensions/workspaces/sessions/(backend)/resource/doompi-use-hook.cli.ts
|
|
303
|
+
var doompi_use_hook_cli_default = (0, _agimon_ai_doompi_core_extensionFile.defineResource)({
|
|
304
|
+
source: PACKAGE_SOURCE,
|
|
305
|
+
moduleUrl: require("url").pathToFileURL(__filename).href,
|
|
306
|
+
skills: [HOOK_HELP_SKILL]
|
|
307
|
+
});
|
|
308
|
+
//#endregion
|
|
309
|
+
//#region generated/pi.ts
|
|
310
|
+
const at = (value, context) => typeof value === "function" ? value(context) : value;
|
|
311
|
+
const extension = (0, _agimon_ai_doompi_core_piExtension.definePiExtension)("@agimon-ai/doompi-hook", async (context) => {
|
|
312
|
+
const scopeSession = await root_cli_default(context);
|
|
313
|
+
const contextSession = {
|
|
314
|
+
...context,
|
|
315
|
+
root: scopeSession.value
|
|
316
|
+
};
|
|
317
|
+
return {
|
|
318
|
+
...(0, _agimon_ai_doompi_core_extensionFile.composeRootHooks)(scopeSession),
|
|
319
|
+
events: {
|
|
320
|
+
agent_settled: at(agent_settled_cli_default, contextSession),
|
|
321
|
+
before_agent_start: at(before_agent_start_cli_default, contextSession),
|
|
322
|
+
session_shutdown: at(session_shutdown_cli_default, contextSession),
|
|
323
|
+
session_start: at(session_start_cli_default, contextSession),
|
|
324
|
+
tool_call: at(tool_call_cli_default, contextSession),
|
|
325
|
+
tool_result: at(tool_result_cli_default, contextSession)
|
|
326
|
+
},
|
|
327
|
+
get resources() {
|
|
328
|
+
return [at(doompi_use_hook_cli_default, contextSession)];
|
|
329
|
+
},
|
|
330
|
+
services: [...scopeSession.services ?? []]
|
|
331
|
+
};
|
|
332
|
+
});
|
|
333
|
+
//#endregion
|
|
334
|
+
exports.default = extension;
|
|
335
|
+
exports.extension = extension;
|
|
336
|
+
|
|
337
|
+
//# sourceMappingURL=pi.cjs.map
|