@agimon-ai/po-hook 0.0.0-alpha.13 → 0.0.0-alpha.14
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 +1 -1
- package/dist/apiContracts.cjs +1 -1
- package/dist/apiContracts.cjs.map +1 -1
- package/dist/apiContracts.d.mts +1 -1
- package/dist/apiContracts.mjs +1 -1
- package/dist/apiContracts.mjs.map +1 -1
- package/dist/extensions/mcp.cjs +2 -2
- package/dist/extensions/mcp.cjs.map +1 -1
- package/dist/extensions/mcp.mjs +1 -1
- package/dist/extensions/mcp.mjs.map +1 -1
- package/dist/extensions/server.cjs +9 -8
- package/dist/extensions/server.cjs.map +1 -1
- package/dist/extensions/server.d.mts +2 -2
- package/dist/extensions/server.d.mts.map +1 -1
- package/dist/extensions/server.mjs +6 -5
- package/dist/extensions/server.mjs.map +1 -1
- package/package.json +7 -7
- package/src/prompts/po-author-hook/SKILL.md +1 -1
package/README.md
CHANGED
|
@@ -126,7 +126,7 @@ Stop payloads include `stop_hook_active` when a prior refusal is active. After f
|
|
|
126
126
|
|
|
127
127
|
## Event ownership and children
|
|
128
128
|
|
|
129
|
-
Native server
|
|
129
|
+
Native server plugins own lifecycle rows (`SessionStart`, `Stop`, and plugin-only `SessionEnd`) and tool dispatch with shared session-local module setup. Session-start readiness precedes dependent turns/tools. Session-end runs once during shutdown before service disposal.
|
|
130
130
|
|
|
131
131
|
Native children run only `PreToolUse` and `PostToolUse`. Registry and plugin tool hooks run, excluding registry rows marked `skipInSubagent`. Children do not run `SessionStart`, `Stop`, or `SessionEnd`. Each child has its own module setup/state and pins its launch selection and module generation, even after the parent reloads or disposes.
|
|
132
132
|
|
package/dist/apiContracts.cjs
CHANGED
|
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
|
|
|
3
3
|
[Symbol.toStringTag]: { value: "Module" }
|
|
4
4
|
});
|
|
5
5
|
//#region src/schemas/apiContracts.ts
|
|
6
|
-
/** This
|
|
6
|
+
/** This server plugin contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */
|
|
7
7
|
const apiContracts = (0, require("@agimon-ai/po-core/apiContracts").defineApiContract)({
|
|
8
8
|
version: 1,
|
|
9
9
|
http: [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiContracts.cjs","names":["defineApiContract"],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract } from '@agimon-ai/po-core/apiContracts';\n\n/** This
|
|
1
|
+
{"version":3,"file":"apiContracts.cjs","names":["defineApiContract"],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract } from '@agimon-ai/po-core/apiContracts';\n\n/** This server plugin 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,4CAAeA,CAAAA,CAAAA,kBAAAA,CAAkB;CAAE,SAAS;CAAG,MAAM,CAAC;CAAG,SAAS,CAAC;CAAG,SAAS,CAAC;AAAE,CAAC"}
|
package/dist/apiContracts.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/schemas/apiContracts.d.ts
|
|
2
|
-
/** This
|
|
2
|
+
/** This server plugin contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */
|
|
3
3
|
export declare const apiContracts: {
|
|
4
4
|
version: 1;
|
|
5
5
|
protocols?: Record<string, string> | undefined;
|
package/dist/apiContracts.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineApiContract } from "@agimon-ai/po-core/apiContracts";
|
|
2
2
|
//#region src/schemas/apiContracts.ts
|
|
3
|
-
/** This
|
|
3
|
+
/** This server plugin contributes agent tools, commands or lifecycle only, with no separate HTTP or socket surface. */
|
|
4
4
|
const apiContracts = defineApiContract({
|
|
5
5
|
version: 1,
|
|
6
6
|
http: [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiContracts.mjs","names":[],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract } from '@agimon-ai/po-core/apiContracts';\n\n/** This
|
|
1
|
+
{"version":3,"file":"apiContracts.mjs","names":[],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract } from '@agimon-ai/po-core/apiContracts';\n\n/** This server plugin 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"}
|
package/dist/extensions/mcp.cjs
CHANGED
|
@@ -3,12 +3,12 @@ Object.defineProperties(exports, {
|
|
|
3
3
|
[Symbol.toStringTag]: { value: "Module" }
|
|
4
4
|
});
|
|
5
5
|
let _agimon_ai_po_core_mcpFacet = require("@agimon-ai/po-core/mcpFacet");
|
|
6
|
-
let
|
|
6
|
+
let _agimon_ai_po_core_serverPlugin = require("@agimon-ai/po-core/serverPlugin");
|
|
7
7
|
//#region src/extensions/workspaces/sessions/(backend)/skill/po-author-hook.mcp.ts
|
|
8
8
|
var po_author_hook_mcp_default = (0, _agimon_ai_po_core_mcpFacet.defineMcpSkill)({
|
|
9
9
|
name: "po-author-hook",
|
|
10
10
|
description: "Author Po repository or plugin hooks. Use when creating or changing .po/hooks.yaml, selecting hook groups from modes.yaml, writing hook commands, or adapting Claude Code hook payloads and decisions to Po.",
|
|
11
|
-
read: () => (0,
|
|
11
|
+
read: () => (0, _agimon_ai_po_core_serverPlugin.readPackageResource)(require("url").pathToFileURL(__filename).href, "src/prompts/po-author-hook/SKILL.md")
|
|
12
12
|
});
|
|
13
13
|
//#endregion
|
|
14
14
|
//#region generated/mcp.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.cjs","names":["defineMcpSkill","readPackageResource","defineMcpPlugin","skillPoAuthorHook"],"sources":["../../src/extensions/workspaces/sessions/(backend)/skill/po-author-hook.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["import { defineMcpSkill } from '@agimon-ai/po-core/mcpFacet';\nimport { readPackageResource } from '@agimon-ai/po-core/
|
|
1
|
+
{"version":3,"file":"mcp.cjs","names":["defineMcpSkill","readPackageResource","defineMcpPlugin","skillPoAuthorHook"],"sources":["../../src/extensions/workspaces/sessions/(backend)/skill/po-author-hook.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["import { defineMcpSkill } from '@agimon-ai/po-core/mcpFacet';\nimport { readPackageResource } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineMcpSkill({\n name: 'po-author-hook',\n description:\n 'Author Po repository or plugin hooks. Use when creating or changing .po/hooks.yaml, selecting hook groups from modes.yaml, writing hook commands, or adapting Claude Code hook payloads and decisions to Po.',\n read: () => readPackageResource(import.meta.url, 'src/prompts/po-author-hook/SKILL.md'),\n});\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineMcpPlugin, type PoMcpSessionPlugin } from '@agimon-ai/po-core/mcpFacet';\n\nimport skillPoAuthorHook from '../src/extensions/workspaces/sessions/(backend)/skill/po-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/po-hook',\n session: (context) => ({\n get skills(): PoMcpSessionPlugin['skills'] { return [at(skillPoAuthorHook, context)]; },\n }) satisfies PoMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":";;;;;;;AAGA,IAAA,8BAAA,GAAeA,4BAAAA,eAAAA,CAAe;CAC5B,MAAM;CACN,aACE;CACF,aAAA,GAAYC,gCAAAA,oBAAAA,CAAAA,QAAAA,KAAAA,CAAAA,CAAAA,cAAAA,UAAAA,CAAAA,CAAAA,MAAqC,qCAAqC;AACxF,CAAC;;;ACFD,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AAEpE,MAAa,OAAA,GAAMC,4BAAAA,gBAAAA,CAAgB;CACjC,MAAM;CACN,UAAU,aAAa,EACrB,IAAI,SAAuC;EAAE,OAAO,CAAC,GAAGC,4BAAmB,OAAO,CAAC;CAAG,EACxF;AACF,CAAC"}
|
package/dist/extensions/mcp.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { defineMcpPlugin, defineMcpSkill } from "@agimon-ai/po-core/mcpFacet";
|
|
2
|
-
import { readPackageResource } from "@agimon-ai/po-core/
|
|
2
|
+
import { readPackageResource } from "@agimon-ai/po-core/serverPlugin";
|
|
3
3
|
//#region src/extensions/workspaces/sessions/(backend)/skill/po-author-hook.mcp.ts
|
|
4
4
|
var po_author_hook_mcp_default = defineMcpSkill({
|
|
5
5
|
name: "po-author-hook",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.mjs","names":["skillPoAuthorHook"],"sources":["../../src/extensions/workspaces/sessions/(backend)/skill/po-author-hook.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["import { defineMcpSkill } from '@agimon-ai/po-core/mcpFacet';\nimport { readPackageResource } from '@agimon-ai/po-core/
|
|
1
|
+
{"version":3,"file":"mcp.mjs","names":["skillPoAuthorHook"],"sources":["../../src/extensions/workspaces/sessions/(backend)/skill/po-author-hook.mcp.ts","../../generated/mcp.ts"],"sourcesContent":["import { defineMcpSkill } from '@agimon-ai/po-core/mcpFacet';\nimport { readPackageResource } from '@agimon-ai/po-core/serverPlugin';\n\nexport default defineMcpSkill({\n name: 'po-author-hook',\n description:\n 'Author Po repository or plugin hooks. Use when creating or changing .po/hooks.yaml, selecting hook groups from modes.yaml, writing hook commands, or adapting Claude Code hook payloads and decisions to Po.',\n read: () => readPackageResource(import.meta.url, 'src/prompts/po-author-hook/SKILL.md'),\n});\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineMcpPlugin, type PoMcpSessionPlugin } from '@agimon-ai/po-core/mcpFacet';\n\nimport skillPoAuthorHook from '../src/extensions/workspaces/sessions/(backend)/skill/po-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/po-hook',\n session: (context) => ({\n get skills(): PoMcpSessionPlugin['skills'] { return [at(skillPoAuthorHook, context)]; },\n }) satisfies PoMcpSessionPlugin,\n});\n\nexport default mcp;\n"],"mappings":";;;AAGA,IAAA,6BAAe,eAAe;CAC5B,MAAM;CACN,aACE;CACF,YAAY,oBAAoB,YAAY,KAAK,qCAAqC;AACxF,CAAC;;;ACFD,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AAEpE,MAAa,MAAM,gBAAgB;CACjC,MAAM;CACN,UAAU,aAAa,EACrB,IAAI,SAAuC;EAAE,OAAO,CAAC,GAAGA,4BAAmB,OAAO,CAAC;CAAG,EACxF;AACF,CAAC"}
|
|
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
|
|
|
3
3
|
[Symbol.toStringTag]: { value: "Module" }
|
|
4
4
|
});
|
|
5
5
|
const require_hookModules = require("../hookModules-BCecT6-e.cjs");
|
|
6
|
-
let
|
|
6
|
+
let _agimon_ai_po_core_serverPlugin = require("@agimon-ai/po-core/serverPlugin");
|
|
7
7
|
let _agimon_ai_po_core_extensionFile = require("@agimon-ai/po-core/extensionFile");
|
|
8
8
|
let _agimon_ai_po_core_headless = require("@agimon-ai/po-core/headless");
|
|
9
9
|
let _agimon_ai_po_config_piContext = require("@agimon-ai/po-config/piContext");
|
|
@@ -558,9 +558,9 @@ var po_author_hook_server_default = (0, _agimon_ai_po_core_extensionFile.defineR
|
|
|
558
558
|
description: "Author Po repository or plugin hooks. Use when creating or changing .po/hooks.yaml, selecting hook groups from modes.yaml, writing hook commands, or adapting Claude Code hook payloads and decisions to Po.",
|
|
559
559
|
when: _agimon_ai_po_core_help.PO_HELP_WHEN,
|
|
560
560
|
kind: "skill",
|
|
561
|
-
path: (0,
|
|
561
|
+
path: (0, _agimon_ai_po_core_serverPlugin.packageResourcePath)(require("url").pathToFileURL(__filename).href, "src/prompts/po-author-hook/SKILL.md"),
|
|
562
562
|
read: async () => {
|
|
563
|
-
const text = await (0,
|
|
563
|
+
const text = await (0, _agimon_ai_po_core_serverPlugin.readPackageResource)(require("url").pathToFileURL(__filename).href, "src/prompts/po-author-hook/SKILL.md");
|
|
564
564
|
if (!text.trim()) throw new Error("The installed hook-authoring skill is missing or unreadable.");
|
|
565
565
|
return text;
|
|
566
566
|
}
|
|
@@ -572,11 +572,12 @@ const via = (identity, value) => value === void 0 ? void 0 : {
|
|
|
572
572
|
...identity,
|
|
573
573
|
...value
|
|
574
574
|
};
|
|
575
|
-
const
|
|
575
|
+
const serverPlugin = (0, _agimon_ai_po_core_serverPlugin.defineServerPlugin)({
|
|
576
576
|
name: "@agimon-ai/po-hook",
|
|
577
|
-
providerOverrides: (0,
|
|
577
|
+
providerOverrides: (0, _agimon_ai_po_core_serverPlugin.composeServerProviderOverrides)(root_server_default),
|
|
578
|
+
injects: (0, _agimon_ai_po_core_extensionFile.composeRootInjects)({ session: [root_server_default] }),
|
|
578
579
|
session: async (context) => {
|
|
579
|
-
const scopeSession = await root_server_default
|
|
580
|
+
const scopeSession = await context.scopeRoot("session", root_server_default, context);
|
|
580
581
|
const contextSession = {
|
|
581
582
|
...context,
|
|
582
583
|
root: scopeSession.value
|
|
@@ -605,7 +606,7 @@ const facet = (0, _agimon_ai_po_core_serverFacet.defineServerPlugin)({
|
|
|
605
606
|
}
|
|
606
607
|
});
|
|
607
608
|
//#endregion
|
|
608
|
-
exports.default =
|
|
609
|
-
exports.
|
|
609
|
+
exports.default = serverPlugin;
|
|
610
|
+
exports.serverPlugin = serverPlugin;
|
|
610
611
|
|
|
611
612
|
//# sourceMappingURL=server.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.cjs","names":["HOOK_EVENT","selectRegistryHooks","selectPluginHooks","toolHookPayload","sessionHookPayload","toolResultMessages","isDenied","decisionReason","additionalContextsFrom","hookFailureMessage","createHookTelemetry","createHookModules","createHookDocumentReader","createBashHookRunner","HOOK_EVENT","hookFailureMessage","requirePoConfigContext","PO_CONFIG_SERVICE","PO_CHILD_SESSION_HOOKS_SERVICE","PoHeadlessPromptAdmissionError","HOOK_EVENT","hookFailureMessage","additionalContextsFrom","decisionReason","isDenied","PoHeadlessPromptAdmissionError","defineRoot","defineHook","defineHook","defineHook","defineHook","defineHook","defineHook","defineHook","defineResource","PO_HELP_WHEN","packageResourcePath","readPackageResource","defineServerPlugin","composeServerProviderOverrides","rootSession","composeRootHooks","hookAgentEnd","hookAgentSettled","hookBeforeAgentStart","hookSessionShutdown","hookSessionStart","hookToolCall","hookToolResult","resourcePoAuthorHook"],"sources":["../../src/constants/hookHandlers.ts","../../src/services/hookDispatch/index.ts","../../src/services/hookRuntime/type.ts","../../src/services/hookRuntime/index.ts","../../src/services/serverHooks/index.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/serverRoot.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/agent-end.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/session-start.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/tool-call.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/tool-result.server.ts","../../src/constants/hook.ts","../../src/extensions/workspaces/sessions/(backend)/resource/po-author-hook.server.ts","../../generated/server.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 { ToolResultEvent } from '@earendil-works/pi-coding-agent';\n\nimport { BLOCKED_BY_HOOK, CONTEXT_SEPARATOR } from '../../constants/hookHandlers';\nimport { HOOK_EVENT } from '../../constants/hooks';\nimport type { HookFailure, HookToolEvent, ResolvedHook } from '../../types/hooks';\nimport {\n additionalContextsFrom,\n decisionReason,\n hookFailureMessage,\n isDenied,\n toolResultMessages,\n} from '../hookDecisions';\nimport { sessionHookPayload, toolHookPayload } from '../hookPayload';\nimport { selectRegistryHooks } from '../hookRegistry';\nimport type { HookSession } from '../hookRuntime/type';\nimport { selectPluginHooks } from '../pluginHooks';\nimport type { HookDispatchRequest, HookDispatchResult, HookDispatchScope } from './type';\n\nfunction isJson(value: unknown, ancestors = new Set<object>()): boolean {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return true;\n if (typeof value === 'number') return Number.isFinite(value);\n if (typeof value !== 'object' || ancestors.has(value)) return false;\n ancestors.add(value);\n const valid =\n (Array.isArray(value) || Object.getPrototypeOf(value) === Object.prototype) &&\n Object.values(value).every((entry) => isJson(entry, ancestors));\n ancestors.delete(value);\n return valid;\n}\n\nfunction commandFailure(row: ResolvedHook, error: unknown): HookFailure {\n return {\n command: row.hook.command ?? row.hook.module,\n message: error instanceof Error ? error.message : String(error),\n reason: 'hook_execution',\n };\n}\n\n/** Registry rows interleave command and module bindings, followed by plugin commands. */\nexport async function dispatchHooks(\n session: HookSession,\n scope: HookDispatchScope,\n request: HookDispatchRequest,\n): Promise<HookDispatchResult> {\n const signal = scope.operationSignal ? AbortSignal.any([scope.signal, scope.operationSignal]) : scope.signal;\n signal.throwIfAborted();\n const harness = session.config().harness;\n const plugins = await session.documents.plugins(harness.pluginHooks);\n const registry =\n request.eventName === HOOK_EVENT.sessionEnd\n ? { entries: [], failure: undefined }\n : await session.documents.registry(scope.repoRoot);\n signal.throwIfAborted();\n const event = request.event;\n const toolName = event && 'toolName' in event ? event.toolName : undefined;\n const hooks = [\n ...selectRegistryHooks(registry.entries, {\n event: request.eventName,\n toolName,\n allowedGroups: harness.hookGroups,\n inSubagent: scope.isSubagent,\n }),\n ...selectPluginHooks(plugins.documents, request.eventName, toolName),\n ];\n const decisions: HookDispatchResult['decisions'] = [];\n const failures = [...(registry.failure ? [registry.failure] : []), ...plugins.failures];\n let toolCall: HookDispatchResult['toolCall'];\n let patchedResult = false;\n for (const [index, row] of hooks.entries()) {\n signal.throwIfAborted();\n request.progress?.(index, hooks.length);\n if (row.hook.command === undefined) {\n if (!event) continue;\n let proposed: typeof event;\n try {\n proposed = structuredClone(event);\n } catch (error) {\n failures.push(commandFailure(row, error));\n continue;\n }\n const outcome = await session.modules.invoke(row, proposed, scope, scope.operationSignal);\n signal.throwIfAborted();\n if (outcome.failure) {\n failures.push(outcome.failure);\n continue;\n }\n // A failed or late invocation cannot mutate live tool input or output.\n try {\n if (event.type === 'tool_call' && proposed.type === 'tool_call') {\n if (\n typeof proposed.input !== 'object' ||\n proposed.input === null ||\n Array.isArray(proposed.input) ||\n !isJson(proposed.input)\n ) {\n throw new Error('Hook tool input must be a JSON object.');\n }\n const input = structuredClone(proposed.input);\n for (const key of Object.keys(event.input)) delete (event.input as Record<string, unknown>)[key];\n Object.assign(event.input, input);\n if (outcome.result && 'block' in outcome.result && outcome.result.block) {\n toolCall = { block: true, reason: outcome.result.reason ?? BLOCKED_BY_HOOK };\n break;\n }\n } else if (event.type === 'tool_result' && outcome.result) {\n const patch = structuredClone(outcome.result);\n if ('content' in patch && patch.content !== undefined) event.content = patch.content;\n if ('details' in patch) event.details = patch.details;\n if ('isError' in patch && patch.isError !== undefined) event.isError = patch.isError;\n patchedResult = true;\n }\n } catch (error) {\n failures.push(commandFailure(row, error));\n }\n continue;\n }\n const payload =\n event && 'toolName' in event\n ? toolHookPayload(event as HookToolEvent, request.eventName, scope.repoRoot, scope.sessionId, {\n parentSessionId: scope.parentSessionId,\n agent: scope.agent,\n })\n : sessionHookPayload(scope.sessionId, scope.repoRoot);\n // The catch covers hook execution only. Readiness, host effects and abort errors propagate.\n let outcome;\n try {\n outcome = await session.runner.run(\n row.hook,\n { ...payload, ...request.extraPayload },\n {\n repoRoot: scope.repoRoot,\n pluginRoot: row.root,\n },\n );\n } catch (error) {\n failures.push(commandFailure(row, error));\n continue;\n }\n signal.throwIfAborted();\n if (outcome.failure) failures.push(outcome.failure);\n if (!outcome.decision) continue;\n decisions.push(outcome.decision);\n if (event?.type === 'tool_result') {\n const messages = toolResultMessages([outcome.decision]);\n if (messages.length > 0)\n event.content = [...event.content, { type: 'text', text: messages.join(CONTEXT_SEPARATOR) }];\n if (isDenied(outcome.decision)) event.isError = true;\n patchedResult ||= messages.length > 0 || isDenied(outcome.decision);\n }\n if (isDenied(outcome.decision)) {\n if (event?.type === 'tool_call')\n toolCall = {\n block: true,\n reason: decisionReason(outcome.decision) ?? BLOCKED_BY_HOOK,\n };\n break;\n }\n }\n if (event?.type === 'tool_call' && !toolCall) {\n const context = additionalContextsFrom(decisions).join(CONTEXT_SEPARATOR);\n if (context) toolCall = { block: true, reason: context };\n }\n if (event?.type === 'tool_result' && failures.length > 0) {\n event.content = [...event.content, { type: 'text', text: hookFailureMessage(failures) }];\n patchedResult = true;\n }\n return {\n decisions,\n failures,\n ...(toolCall ? { toolCall } : {}),\n ...(event?.type === 'tool_result' && patchedResult\n ? {\n toolResult: {\n content: (event as ToolResultEvent).content,\n details: (event as ToolResultEvent).details,\n isError: event.isError,\n },\n }\n : {}),\n };\n}\n","import type { PoConfigContext } from '@agimon-ai/po-config/types';\nimport type { PoChildSessionHooks } from '@agimon-ai/po-core/childSession';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport type { HookContext } from '../../types/hookModule';\nimport type { HookDocumentReader, HookRunner } from '../../types/hooks';\nimport type { HookTelemetry } from '../../types/telemetry';\nimport type { HookModules } from '../hookModules/type';\n\nexport const PO_HOOK_SESSION_SERVICE = 'po/hook-session';\nexport interface HookExtensionOptions {\n telemetry?: HookTelemetry;\n runner?: HookRunner;\n documents?: HookDocumentReader;\n}\n\n/** One host session owns its module registry and lifetime; children borrow only immutable config. */\nexport interface HookSession {\n config(): PoConfigContext;\n prepare(isSubagent?: boolean): Promise<void>;\n readonly runner: HookRunner;\n readonly documents: HookDocumentReader;\n readonly modules: HookModules;\n readonly signal: AbortSignal;\n readonly parentContext?: Omit<HookContext, 'signal'>;\n}\n\n/** One dependency-complete Hook runtime owned by a reactive Cordis fiber. */\nexport interface HookRuntime {\n readonly session: HookSession;\n readonly childHooks: PoChildSessionHooks;\n isCurrent(): boolean;\n}\n\nexport type HookRuntimeResolver = () => HookRuntime | undefined;\n\nexport interface HookRuntimeBinding extends HookRuntime {\n dispose(): Promise<void>;\n}\nexport interface HookBinding {\n readonly plugin: (this: void, context: Context) => void;\n readonly runtime: HookRuntimeResolver;\n}\n\ndeclare module '@deepseek-ai/cordis' {\n interface Context {\n 'po/hook-session': HookRuntime;\n }\n}\n","import { requirePoConfigContext } from '@agimon-ai/po-config/piContext';\nimport type { PoConfigContext } from '@agimon-ai/po-config/types';\nimport { PO_CHILD_SESSION_HOOKS_SERVICE, type PoChildSessionHooks } from '@agimon-ai/po-core/childSession';\nimport { PO_CONFIG_SERVICE } from '@agimon-ai/po-core/config';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ToolCallEvent, ToolResultEvent } from '@earendil-works/pi-coding-agent';\n\nimport { HOOK_EVENT } from '../../constants/hooks';\nimport type { HookContext, JsonValue } from '../../types/hookModule';\nimport type { HookTelemetry } from '../../types/telemetry';\nimport { hookFailureMessage } from '../hookDecisions';\nimport { dispatchHooks } from '../hookDispatch';\nimport { createHookDocumentReader } from '../hookDocuments';\nimport { createHookModules } from '../hookModules';\nimport { createBashHookRunner } from '../hookRunner';\nimport { createHookTelemetry } from '../hookTelemetry';\nimport { PO_HOOK_SESSION_SERVICE, type HookSession } from './type';\nimport type { HookBinding, HookExtensionOptions, HookRuntimeBinding } from './type';\n\nexport function createHookSession(\n config: () => PoConfigContext,\n options: HookExtensionOptions,\n signal: AbortSignal,\n): 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 const modules = createHookModules({ descriptor: config().harness.hookModules });\n const documents = options.documents ?? createHookDocumentReader({ telemetry: requireTelemetry() });\n let preparation: Promise<void> | undefined;\n return {\n config,\n signal,\n modules,\n prepare(isSubagent = false) {\n preparation ??= (async () => {\n const harness = config().harness;\n if (harness.hooks === false) return;\n const registry = await documents.registry(harness.root ?? process.cwd());\n // Registry read failures keep their existing advisory dispatch policy.\n if (registry.failure) return;\n const allowed = harness.hookGroups === undefined ? undefined : new Set(harness.hookGroups);\n const rows = registry.entries\n .filter((row) => row.core || !allowed || allowed.has(row.groupId))\n .filter((row) => !(isSubagent && row.skipInSubagent));\n await modules.validate(rows);\n })();\n return preparation;\n },\n runner: options.runner ?? createBashHookRunner({ telemetry: requireTelemetry() }),\n documents,\n };\n}\n\nfunction childHooksFor(parent: HookSession): PoChildSessionHooks {\n return {\n bind(scope) {\n // Children retain their launch selection and artifacts, even if the parent reloads.\n const config = structuredClone(parent.config());\n const controller = new AbortController();\n const signal = AbortSignal.any([controller.signal, scope.signal]);\n const session = createHookSession(() => config, { runner: parent.runner, documents: parent.documents }, signal);\n let disposal: Promise<void> | undefined;\n const context = (): HookContext => {\n const sessionId = scope.sessionId();\n if (!sessionId) throw new Error('Child hook identity is unavailable before runtime startup.');\n return {\n sessionId,\n parentSessionId: scope.request.parentSessionId,\n agent: scope.request.agent,\n isSubagent: true,\n cwd: scope.request.cwd,\n repoRoot: config.harness.root ?? scope.request.cwd,\n signal,\n sendMessage: (text, delivery) => scope.sendMessage(text, delivery),\n appendCustomEntry: (type, data) => scope.appendCustomEntry(type, data),\n };\n };\n return {\n async beforeTool(event, execution) {\n await session.prepare(true);\n const native = {\n type: 'tool_call',\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n input: event.args,\n } as ToolCallEvent;\n const result = await dispatchHooks(\n session,\n { ...context(), operationSignal: execution.abortSignal },\n {\n eventName: HOOK_EVENT.preToolUse,\n event: native,\n },\n );\n if (result.failures.length > 0) await scope.sendMessage(hookFailureMessage(result.failures), 'steer');\n return result.toolCall?.block\n ? { block: { reason: result.toolCall.reason ?? 'Blocked by repository hook' } }\n : { args: native.input as Record<string, JsonValue> };\n },\n async afterTool(event, execution) {\n const native = {\n type: 'tool_result',\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n input: event.args,\n content: event.content,\n details: event.details,\n isError: event.isError,\n } as ToolResultEvent;\n const result = await dispatchHooks(\n session,\n { ...context(), operationSignal: execution.abortSignal },\n {\n eventName: HOOK_EVENT.postToolUse,\n event: native,\n },\n );\n return result.toolResult\n ? {\n content: result.toolResult.content,\n details: result.toolResult.details as JsonValue | undefined,\n isError: result.toolResult.isError,\n }\n : undefined;\n },\n dispose() {\n disposal ??= (async () => {\n controller.abort();\n await session.modules.dispose();\n })();\n return disposal;\n },\n };\n },\n };\n}\n\nexport function createHookRuntime(\n cordis: Context,\n options: HookExtensionOptions,\n parentContext?: Omit<HookContext, 'signal'>,\n lifetimeSignal?: AbortSignal,\n): HookRuntimeBinding {\n const controller = new AbortController();\n const signal = lifetimeSignal ? AbortSignal.any([controller.signal, lifetimeSignal]) : controller.signal;\n const session: HookSession = {\n ...createHookSession(() => requirePoConfigContext(cordis), options, signal),\n parentContext,\n };\n let disposal: Promise<void> | undefined;\n let active = true;\n return {\n session,\n childHooks: childHooksFor(session),\n isCurrent: () => active && !signal.aborted,\n dispose() {\n active = false;\n controller.abort();\n disposal ??= session.modules.dispose();\n return disposal;\n },\n };\n}\n\nexport function createHookBinding(\n options: HookExtensionOptions,\n parentContext?: Omit<HookContext, 'signal'>,\n lifetimeSignal?: AbortSignal,\n): HookBinding {\n let runtime: HookRuntimeBinding | undefined;\n return {\n plugin(cordis) {\n cordis.inject([PO_CONFIG_SERVICE], (configContext) => {\n const binding = createHookRuntime(configContext, options, parentContext, lifetimeSignal);\n runtime = binding;\n configContext.provide(PO_CHILD_SESSION_HOOKS_SERVICE, binding.childHooks);\n configContext.provide(PO_HOOK_SESSION_SERVICE, binding);\n return async () => {\n if (runtime === binding) runtime = undefined;\n await binding.dispose();\n };\n });\n },\n runtime: () => runtime,\n };\n}\n","import {\n PoHeadlessPromptAdmissionError,\n type PoHeadlessExecutionContext,\n type PoHeadlessHook,\n} from '@agimon-ai/po-core/headless';\nimport type { ToolCallEvent, ToolResultEvent } from '@earendil-works/pi-coding-agent';\n\nimport {\n BLOCKED_BY_HOOK,\n STATUS_PREFIX,\n SUBAGENT_ENVIRONMENT_FLAG,\n CONTEXT_SEPARATOR,\n FAILURE_MESSAGE_TYPE,\n MAX_STOP_REFUSALS,\n STOP_HOOK_ACTIVE_FIELD,\n} from '../../constants/hookHandlers';\nimport { HOOK_EVENT } from '../../constants/hooks';\nimport type { HookNativeEvent } from '../../types/hookModule';\nimport { additionalContextsFrom, decisionReason, hookFailureMessage, isDenied } from '../hookDecisions';\nimport { dispatchHooks } from '../hookDispatch';\nimport type { HookDispatchScope } from '../hookDispatch/type';\nimport type { HookRuntime, HookRuntimeResolver } from '../hookRuntime/type';\n\nfunction hookEntry(event: Readonly<Record<string, unknown>>): Record<string, unknown> {\n return { version: 1, event: typeof event.type === 'string' ? event.type : 'headless-hook', data: event };\n}\n\nfunction scopeFor(runtime: HookRuntime, execution: PoHeadlessExecutionContext): HookDispatchScope {\n return {\n sessionId: execution.sessionId,\n isSubagent: Boolean(execution.environment[SUBAGENT_ENVIRONMENT_FLAG]),\n cwd: execution.cwd,\n repoRoot: execution.repoRoot,\n model: execution.model,\n signal: runtime.session.signal,\n operationSignal: execution.signal,\n async sendMessage(text, delivery) {\n if (!execution.session.admitPrompt)\n throw new PoHeadlessPromptAdmissionError('The session cannot admit a hook prompt.');\n await execution.session.admitPrompt(text, delivery);\n },\n appendCustomEntry: (type, data) => execution.session.appendCustomEntry(type, data),\n };\n}\n\n/** One native owner dispatches lifecycle and tool rows for this session. */\nexport function createServerHooks(resolveRuntime: HookRuntimeResolver) {\n const startups = new WeakMap<HookRuntime, Promise<void>>();\n const shutdowns = new WeakMap<HookRuntime, Promise<void>>();\n const refusals = new WeakMap<HookRuntime, number>();\n async function runLifecycle(\n runtime: HookRuntime,\n execution: PoHeadlessExecutionContext,\n eventName: string,\n event?: Readonly<Record<string, unknown>>,\n extraPayload?: Record<string, unknown>,\n ) {\n const key = `${STATUS_PREFIX}:${execution.sessionId}:${eventName}`;\n try {\n return await dispatchHooks(runtime.session, scopeFor(runtime, execution), {\n eventName,\n event: event as HookNativeEvent | undefined,\n extraPayload,\n progress: (index, total) =>\n execution.client.setStatus(key, `Running ${eventName} hooks (${index + 1}/${total})...`),\n });\n } finally {\n execution.client.setStatus(key, undefined);\n }\n }\n function start(\n runtime: HookRuntime,\n execution: PoHeadlessExecutionContext,\n event: Readonly<Record<string, unknown>> = { type: 'session_start' },\n ) {\n let startup = startups.get(runtime);\n if (!startup) {\n startup = (async () => {\n const scope = scopeFor(runtime, execution);\n await runtime.session.prepare(scope.isSubagent);\n if (scope.isSubagent) return;\n const result = await runLifecycle(runtime, execution, HOOK_EVENT.sessionStart, {\n ...event,\n type: 'session_start',\n });\n if (!runtime.isCurrent()) return;\n if (result.failures.length) await scope.sendMessage(hookFailureMessage(result.failures), 'steer');\n const context = additionalContextsFrom(result.decisions).join(CONTEXT_SEPARATOR);\n if (context) await scope.sendMessage(context, 'steer');\n })();\n startups.set(runtime, startup);\n }\n return startup;\n }\n const sessionStart: PoHeadlessHook<'session_start'> = {\n event: 'session_start',\n async handle(event, execution) {\n const runtime = resolveRuntime();\n if (runtime?.isCurrent()) await start(runtime, execution, event);\n },\n };\n const agentEnd: PoHeadlessHook<'agent_end'> = {\n event: 'agent_end',\n async handle(event, execution) {\n const runtime = resolveRuntime();\n if (!runtime?.isCurrent() || scopeFor(runtime, execution).isSubagent) return;\n await start(runtime, execution);\n const count = refusals.get(runtime) ?? 0;\n const result = await runLifecycle(\n runtime,\n execution,\n HOOK_EVENT.stop,\n { ...event, type: 'agent_settled' },\n { [STOP_HOOK_ACTIVE_FIELD]: count > 0 },\n );\n if (!runtime.isCurrent()) return;\n const appendFailure = async (text: string) => {\n if (!execution.session.appendMessage) throw new Error('The session cannot append hook diagnostics.');\n await execution.session.appendMessage({ type: FAILURE_MESSAGE_TYPE, text });\n };\n if (result.failures.length) await appendFailure(hookFailureMessage(result.failures));\n const reason = decisionReason(result.decisions.find(isDenied));\n if (!reason) {\n refusals.set(runtime, 0);\n return;\n }\n if (count >= MAX_STOP_REFUSALS) {\n refusals.set(runtime, 0);\n await appendFailure(\n `A Stop hook refused ${String(MAX_STOP_REFUSALS)} stops in a row, so the agent stops here. Its last reason: ${reason}`,\n );\n return;\n }\n // Advance only after successful admission. Admission does not await the successor turn.\n await scopeFor(runtime, execution).sendMessage(reason, 'followUp');\n refusals.set(runtime, count + 1);\n },\n };\n const beforeAgentStart: PoHeadlessHook<'before_agent_start'> = {\n event: 'before_agent_start',\n async handle(event, execution) {\n const runtime = resolveRuntime();\n if (runtime?.isCurrent()) await start(runtime, execution);\n await execution.session.appendCustomEntry('po-hook', hookEntry(event));\n },\n };\n const toolCall: PoHeadlessHook<'tool_call'> = {\n event: 'tool_call',\n async handle(event, execution) {\n const runtime = resolveRuntime();\n if (!runtime?.isCurrent()) return;\n const scope = scopeFor(runtime, execution);\n try {\n await start(runtime, execution);\n } catch (error) {\n return { block: { reason: error instanceof Error ? error.message : String(error) } };\n }\n const native = {\n type: 'tool_call',\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n input: event.args,\n } as ToolCallEvent;\n const key = `${STATUS_PREFIX}:${native.toolCallId}:pre`;\n try {\n const result = await dispatchHooks(runtime.session, scope, {\n eventName: HOOK_EVENT.preToolUse,\n event: native,\n progress: (index, total) =>\n execution.client.setStatus(key, `Running pre-tool hooks for ${native.toolName} (${index + 1}/${total})...`),\n });\n if (result.failures.length > 0) await scope.sendMessage(hookFailureMessage(result.failures), 'steer');\n return result.toolCall?.block\n ? { block: { reason: result.toolCall.reason ?? BLOCKED_BY_HOOK } }\n : { args: native.input };\n } finally {\n execution.client.setStatus(key, undefined);\n }\n },\n };\n const toolResult: PoHeadlessHook<'tool_result'> = {\n event: 'tool_result',\n async handle(event, execution) {\n await execution.session.appendCustomEntry('po-hook', hookEntry(event));\n const runtime = resolveRuntime();\n if (!runtime?.isCurrent()) return;\n await start(runtime, execution);\n const native = {\n type: 'tool_result',\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n input: event.args,\n content: event.content,\n details: event.details,\n isError: event.isError,\n } as ToolResultEvent;\n const key = `${STATUS_PREFIX}:${native.toolCallId}:post`;\n try {\n const result = await dispatchHooks(runtime.session, scopeFor(runtime, execution), {\n eventName: HOOK_EVENT.postToolUse,\n event: native,\n progress: (index, total) =>\n execution.client.setStatus(\n key,\n `Running post-tool hooks for ${native.toolName} (${index + 1}/${total})...`,\n ),\n });\n return result.toolResult;\n } finally {\n execution.client.setStatus(key, undefined);\n }\n },\n };\n const agentSettled: PoHeadlessHook<'agent_settled'> = {\n event: 'agent_settled',\n handle: (event, execution) => execution.session.appendCustomEntry('po-hook', hookEntry(event)),\n };\n const sessionShutdown: PoHeadlessHook<'session_shutdown'> = {\n event: 'session_shutdown',\n async handle(_event, execution) {\n const runtime = resolveRuntime();\n if (runtime?.isCurrent() && !scopeFor(runtime, execution).isSubagent) {\n let shutdown = shutdowns.get(runtime);\n if (!shutdown) {\n shutdown = runLifecycle(runtime, execution, HOOK_EVENT.sessionEnd).then(() => undefined);\n shutdowns.set(runtime, shutdown);\n }\n await shutdown;\n }\n execution.client.setStatus('po-hook', undefined);\n },\n };\n return { sessionStart, agentEnd, beforeAgentStart, toolCall, toolResult, agentSettled, sessionShutdown };\n}\n","import { PoHeadlessPromptAdmissionError } from '@agimon-ai/po-core/headless';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport { SUBAGENT_ENVIRONMENT_FLAG } from '../../../../../constants/hookHandlers';\nimport { createHookBinding } from '../../../../../services/hookRuntime';\nimport { createServerHooks } from '../../../../../services/serverHooks';\n\nexport const createHookServerRoot = ({ agent, signal }: PoServerPluginContext) => {\n if (!agent) throw new Error('Hook session requires the headless host.');\n const execution = agent.context;\n const binding = createHookBinding(\n {},\n {\n sessionId: execution.sessionId,\n isSubagent: Boolean(execution.environment[SUBAGENT_ENVIRONMENT_FLAG]),\n cwd: execution.cwd,\n repoRoot: execution.repoRoot,\n get model() {\n return execution.model;\n },\n async sendMessage(text, delivery) {\n if (!execution.session.admitPrompt)\n throw new PoHeadlessPromptAdmissionError('The session cannot admit a hook prompt.');\n await execution.session.admitPrompt(text, delivery);\n },\n appendCustomEntry: (type, data) => execution.session.appendCustomEntry(type, data),\n },\n signal,\n );\n return { value: createServerHooks(binding.runtime), services: [binding.plugin] };\n};\n\nexport type HookServerScope = Awaited<ReturnType<typeof createHookServerRoot>>['value'];\n","import { defineRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport { createHookServerRoot } from './_lib/serverRoot';\n\nexport default defineRoot(createHookServerRoot);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport type { HookServerScope } from '../_lib/serverRoot';\n\nexport default defineHook(({ root }: WithRoot<PoServerPluginContext, HookServerScope>) => root.agentEnd);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport type { HookServerScope } from '../_lib/serverRoot';\n\nexport default defineHook(({ root }: WithRoot<PoServerPluginContext, HookServerScope>) => root.agentSettled);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport type { HookServerScope } from '../_lib/serverRoot';\n\nexport default defineHook(({ root }: WithRoot<PoServerPluginContext, HookServerScope>) => root.beforeAgentStart);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport type { HookServerScope } from '../_lib/serverRoot';\n\nexport default defineHook(({ root }: WithRoot<PoServerPluginContext, HookServerScope>) => root.sessionShutdown);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport type { HookServerScope } from '../_lib/serverRoot';\n\nexport default defineHook(({ root }: WithRoot<PoServerPluginContext, HookServerScope>) => root.sessionStart);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport type { HookServerScope } from '../_lib/serverRoot';\n\nexport default defineHook(({ root }: WithRoot<PoServerPluginContext, HookServerScope>) => root.toolCall);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport type { HookServerScope } from '../_lib/serverRoot';\n\nexport default defineHook(({ root }: WithRoot<PoServerPluginContext, HookServerScope>) => root.toolResult);\n","export const PACKAGE_SOURCE = '@agimon-ai/po-hook';\nexport const HOOK_HELP_SKILL = {\n name: 'po-author-hook',\n description:\n 'Author Po repository or plugin hooks. Use when creating or changing .po/hooks.yaml, selecting hook groups from modes.yaml, writing hook commands, or adapting Claude Code hook payloads and decisions to Po.',\n};\n","import { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { PO_HELP_WHEN } from '@agimon-ai/po-core/help';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverFacet';\n\nimport { HOOK_HELP_SKILL } from '../../../../../constants/hook';\n\nexport default defineResource({\n ...HOOK_HELP_SKILL,\n when: PO_HELP_WHEN,\n kind: 'skill' as const,\n path: packageResourcePath(import.meta.url, 'src/prompts/po-author-hook/SKILL.md'),\n read: async () => {\n const text = await readPackageResource(import.meta.url, 'src/prompts/po-author-hook/SKILL.md');\n if (!text.trim()) throw new Error('The installed hook-authoring skill is missing or unreadable.');\n return text;\n },\n});\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineServerPlugin, type PoServerSessionPlugin } from '@agimon-ai/po-core/serverFacet';\nimport { composeServerProviderOverrides } from '@agimon-ai/po-core/serverFacet';\nimport { composeRootHooks } from '@agimon-ai/po-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport hookAgentEnd from '../src/extensions/workspaces/sessions/(backend)/hook/agent-end.server';\nimport hookAgentSettled from '../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.server';\nimport hookBeforeAgentStart from '../src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.server';\nimport hookSessionShutdown from '../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server';\nimport hookSessionStart from '../src/extensions/workspaces/sessions/(backend)/hook/session-start.server';\nimport hookToolCall from '../src/extensions/workspaces/sessions/(backend)/hook/tool-call.server';\nimport hookToolResult from '../src/extensions/workspaces/sessions/(backend)/hook/tool-result.server';\nimport resourcePoAuthorHook from '../src/extensions/workspaces/sessions/(backend)/resource/po-author-hook.server';\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;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/po-hook',\n providerOverrides: composeServerProviderOverrides(rootSession),\n session: async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get hooks(): PoServerSessionPlugin['hooks'] { return [via({ event: 'agent_end' }, at(hookAgentEnd, contextSession)), via({ event: 'agent_settled' }, at(hookAgentSettled, contextSession)), via({ event: 'before_agent_start' }, at(hookBeforeAgentStart, contextSession)), via({ event: 'session_shutdown' }, at(hookSessionShutdown, contextSession)), via({ event: 'session_start' }, at(hookSessionStart, contextSession)), via({ event: 'tool_call' }, at(hookToolCall, contextSession)), via({ event: 'tool_result' }, at(hookToolResult, contextSession))]; },\n get resources(): PoServerSessionPlugin['resources'] { return [at(resourcePoAuthorHook, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): PoServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default facet;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.cjs","names":["HOOK_EVENT","selectRegistryHooks","selectPluginHooks","toolHookPayload","sessionHookPayload","toolResultMessages","isDenied","decisionReason","additionalContextsFrom","hookFailureMessage","createHookTelemetry","createHookModules","createHookDocumentReader","createBashHookRunner","HOOK_EVENT","hookFailureMessage","requirePoConfigContext","PO_CONFIG_SERVICE","PO_CHILD_SESSION_HOOKS_SERVICE","PoHeadlessPromptAdmissionError","HOOK_EVENT","hookFailureMessage","additionalContextsFrom","decisionReason","isDenied","PoHeadlessPromptAdmissionError","defineRoot","defineHook","defineHook","defineHook","defineHook","defineHook","defineHook","defineHook","defineResource","PO_HELP_WHEN","packageResourcePath","readPackageResource","defineServerPlugin","composeServerProviderOverrides","rootSession","composeRootInjects","composeRootHooks","hookAgentEnd","hookAgentSettled","hookBeforeAgentStart","hookSessionShutdown","hookSessionStart","hookToolCall","hookToolResult","resourcePoAuthorHook"],"sources":["../../src/constants/hookHandlers.ts","../../src/services/hookDispatch/index.ts","../../src/services/hookRuntime/type.ts","../../src/services/hookRuntime/index.ts","../../src/services/serverHooks/index.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/serverRoot.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/agent-end.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/session-start.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/tool-call.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/tool-result.server.ts","../../src/constants/hook.ts","../../src/extensions/workspaces/sessions/(backend)/resource/po-author-hook.server.ts","../../generated/server.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 { ToolResultEvent } from '@earendil-works/pi-coding-agent';\n\nimport { BLOCKED_BY_HOOK, CONTEXT_SEPARATOR } from '../../constants/hookHandlers';\nimport { HOOK_EVENT } from '../../constants/hooks';\nimport type { HookFailure, HookToolEvent, ResolvedHook } from '../../types/hooks';\nimport {\n additionalContextsFrom,\n decisionReason,\n hookFailureMessage,\n isDenied,\n toolResultMessages,\n} from '../hookDecisions';\nimport { sessionHookPayload, toolHookPayload } from '../hookPayload';\nimport { selectRegistryHooks } from '../hookRegistry';\nimport type { HookSession } from '../hookRuntime/type';\nimport { selectPluginHooks } from '../pluginHooks';\nimport type { HookDispatchRequest, HookDispatchResult, HookDispatchScope } from './type';\n\nfunction isJson(value: unknown, ancestors = new Set<object>()): boolean {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return true;\n if (typeof value === 'number') return Number.isFinite(value);\n if (typeof value !== 'object' || ancestors.has(value)) return false;\n ancestors.add(value);\n const valid =\n (Array.isArray(value) || Object.getPrototypeOf(value) === Object.prototype) &&\n Object.values(value).every((entry) => isJson(entry, ancestors));\n ancestors.delete(value);\n return valid;\n}\n\nfunction commandFailure(row: ResolvedHook, error: unknown): HookFailure {\n return {\n command: row.hook.command ?? row.hook.module,\n message: error instanceof Error ? error.message : String(error),\n reason: 'hook_execution',\n };\n}\n\n/** Registry rows interleave command and module bindings, followed by plugin commands. */\nexport async function dispatchHooks(\n session: HookSession,\n scope: HookDispatchScope,\n request: HookDispatchRequest,\n): Promise<HookDispatchResult> {\n const signal = scope.operationSignal ? AbortSignal.any([scope.signal, scope.operationSignal]) : scope.signal;\n signal.throwIfAborted();\n const harness = session.config().harness;\n const plugins = await session.documents.plugins(harness.pluginHooks);\n const registry =\n request.eventName === HOOK_EVENT.sessionEnd\n ? { entries: [], failure: undefined }\n : await session.documents.registry(scope.repoRoot);\n signal.throwIfAborted();\n const event = request.event;\n const toolName = event && 'toolName' in event ? event.toolName : undefined;\n const hooks = [\n ...selectRegistryHooks(registry.entries, {\n event: request.eventName,\n toolName,\n allowedGroups: harness.hookGroups,\n inSubagent: scope.isSubagent,\n }),\n ...selectPluginHooks(plugins.documents, request.eventName, toolName),\n ];\n const decisions: HookDispatchResult['decisions'] = [];\n const failures = [...(registry.failure ? [registry.failure] : []), ...plugins.failures];\n let toolCall: HookDispatchResult['toolCall'];\n let patchedResult = false;\n for (const [index, row] of hooks.entries()) {\n signal.throwIfAborted();\n request.progress?.(index, hooks.length);\n if (row.hook.command === undefined) {\n if (!event) continue;\n let proposed: typeof event;\n try {\n proposed = structuredClone(event);\n } catch (error) {\n failures.push(commandFailure(row, error));\n continue;\n }\n const outcome = await session.modules.invoke(row, proposed, scope, scope.operationSignal);\n signal.throwIfAborted();\n if (outcome.failure) {\n failures.push(outcome.failure);\n continue;\n }\n // A failed or late invocation cannot mutate live tool input or output.\n try {\n if (event.type === 'tool_call' && proposed.type === 'tool_call') {\n if (\n typeof proposed.input !== 'object' ||\n proposed.input === null ||\n Array.isArray(proposed.input) ||\n !isJson(proposed.input)\n ) {\n throw new Error('Hook tool input must be a JSON object.');\n }\n const input = structuredClone(proposed.input);\n for (const key of Object.keys(event.input)) delete (event.input as Record<string, unknown>)[key];\n Object.assign(event.input, input);\n if (outcome.result && 'block' in outcome.result && outcome.result.block) {\n toolCall = { block: true, reason: outcome.result.reason ?? BLOCKED_BY_HOOK };\n break;\n }\n } else if (event.type === 'tool_result' && outcome.result) {\n const patch = structuredClone(outcome.result);\n if ('content' in patch && patch.content !== undefined) event.content = patch.content;\n if ('details' in patch) event.details = patch.details;\n if ('isError' in patch && patch.isError !== undefined) event.isError = patch.isError;\n patchedResult = true;\n }\n } catch (error) {\n failures.push(commandFailure(row, error));\n }\n continue;\n }\n const payload =\n event && 'toolName' in event\n ? toolHookPayload(event as HookToolEvent, request.eventName, scope.repoRoot, scope.sessionId, {\n parentSessionId: scope.parentSessionId,\n agent: scope.agent,\n })\n : sessionHookPayload(scope.sessionId, scope.repoRoot);\n // The catch covers hook execution only. Readiness, host effects and abort errors propagate.\n let outcome;\n try {\n outcome = await session.runner.run(\n row.hook,\n { ...payload, ...request.extraPayload },\n {\n repoRoot: scope.repoRoot,\n pluginRoot: row.root,\n },\n );\n } catch (error) {\n failures.push(commandFailure(row, error));\n continue;\n }\n signal.throwIfAborted();\n if (outcome.failure) failures.push(outcome.failure);\n if (!outcome.decision) continue;\n decisions.push(outcome.decision);\n if (event?.type === 'tool_result') {\n const messages = toolResultMessages([outcome.decision]);\n if (messages.length > 0)\n event.content = [...event.content, { type: 'text', text: messages.join(CONTEXT_SEPARATOR) }];\n if (isDenied(outcome.decision)) event.isError = true;\n patchedResult ||= messages.length > 0 || isDenied(outcome.decision);\n }\n if (isDenied(outcome.decision)) {\n if (event?.type === 'tool_call')\n toolCall = {\n block: true,\n reason: decisionReason(outcome.decision) ?? BLOCKED_BY_HOOK,\n };\n break;\n }\n }\n if (event?.type === 'tool_call' && !toolCall) {\n const context = additionalContextsFrom(decisions).join(CONTEXT_SEPARATOR);\n if (context) toolCall = { block: true, reason: context };\n }\n if (event?.type === 'tool_result' && failures.length > 0) {\n event.content = [...event.content, { type: 'text', text: hookFailureMessage(failures) }];\n patchedResult = true;\n }\n return {\n decisions,\n failures,\n ...(toolCall ? { toolCall } : {}),\n ...(event?.type === 'tool_result' && patchedResult\n ? {\n toolResult: {\n content: (event as ToolResultEvent).content,\n details: (event as ToolResultEvent).details,\n isError: event.isError,\n },\n }\n : {}),\n };\n}\n","import type { PoConfigContext } from '@agimon-ai/po-config/types';\nimport type { PoChildSessionHooks } from '@agimon-ai/po-core/childSession';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport type { HookContext } from '../../types/hookModule';\nimport type { HookDocumentReader, HookRunner } from '../../types/hooks';\nimport type { HookTelemetry } from '../../types/telemetry';\nimport type { HookModules } from '../hookModules/type';\n\nexport const PO_HOOK_SESSION_SERVICE = 'po/hook-session';\nexport interface HookExtensionOptions {\n telemetry?: HookTelemetry;\n runner?: HookRunner;\n documents?: HookDocumentReader;\n}\n\n/** One host session owns its module registry and lifetime; children borrow only immutable config. */\nexport interface HookSession {\n config(): PoConfigContext;\n prepare(isSubagent?: boolean): Promise<void>;\n readonly runner: HookRunner;\n readonly documents: HookDocumentReader;\n readonly modules: HookModules;\n readonly signal: AbortSignal;\n readonly parentContext?: Omit<HookContext, 'signal'>;\n}\n\n/** One dependency-complete Hook runtime owned by a reactive Cordis fiber. */\nexport interface HookRuntime {\n readonly session: HookSession;\n readonly childHooks: PoChildSessionHooks;\n isCurrent(): boolean;\n}\n\nexport type HookRuntimeResolver = () => HookRuntime | undefined;\n\nexport interface HookRuntimeBinding extends HookRuntime {\n dispose(): Promise<void>;\n}\nexport interface HookBinding {\n readonly plugin: (this: void, context: Context) => void;\n readonly runtime: HookRuntimeResolver;\n}\n\ndeclare module '@deepseek-ai/cordis' {\n interface Context {\n 'po/hook-session': HookRuntime;\n }\n}\n","import { requirePoConfigContext } from '@agimon-ai/po-config/piContext';\nimport type { PoConfigContext } from '@agimon-ai/po-config/types';\nimport { PO_CHILD_SESSION_HOOKS_SERVICE, type PoChildSessionHooks } from '@agimon-ai/po-core/childSession';\nimport { PO_CONFIG_SERVICE } from '@agimon-ai/po-core/config';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ToolCallEvent, ToolResultEvent } from '@earendil-works/pi-coding-agent';\n\nimport { HOOK_EVENT } from '../../constants/hooks';\nimport type { HookContext, JsonValue } from '../../types/hookModule';\nimport type { HookTelemetry } from '../../types/telemetry';\nimport { hookFailureMessage } from '../hookDecisions';\nimport { dispatchHooks } from '../hookDispatch';\nimport { createHookDocumentReader } from '../hookDocuments';\nimport { createHookModules } from '../hookModules';\nimport { createBashHookRunner } from '../hookRunner';\nimport { createHookTelemetry } from '../hookTelemetry';\nimport { PO_HOOK_SESSION_SERVICE, type HookSession } from './type';\nimport type { HookBinding, HookExtensionOptions, HookRuntimeBinding } from './type';\n\nexport function createHookSession(\n config: () => PoConfigContext,\n options: HookExtensionOptions,\n signal: AbortSignal,\n): 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 const modules = createHookModules({ descriptor: config().harness.hookModules });\n const documents = options.documents ?? createHookDocumentReader({ telemetry: requireTelemetry() });\n let preparation: Promise<void> | undefined;\n return {\n config,\n signal,\n modules,\n prepare(isSubagent = false) {\n preparation ??= (async () => {\n const harness = config().harness;\n if (harness.hooks === false) return;\n const registry = await documents.registry(harness.root ?? process.cwd());\n // Registry read failures keep their existing advisory dispatch policy.\n if (registry.failure) return;\n const allowed = harness.hookGroups === undefined ? undefined : new Set(harness.hookGroups);\n const rows = registry.entries\n .filter((row) => row.core || !allowed || allowed.has(row.groupId))\n .filter((row) => !(isSubagent && row.skipInSubagent));\n await modules.validate(rows);\n })();\n return preparation;\n },\n runner: options.runner ?? createBashHookRunner({ telemetry: requireTelemetry() }),\n documents,\n };\n}\n\nfunction childHooksFor(parent: HookSession): PoChildSessionHooks {\n return {\n bind(scope) {\n // Children retain their launch selection and artifacts, even if the parent reloads.\n const config = structuredClone(parent.config());\n const controller = new AbortController();\n const signal = AbortSignal.any([controller.signal, scope.signal]);\n const session = createHookSession(() => config, { runner: parent.runner, documents: parent.documents }, signal);\n let disposal: Promise<void> | undefined;\n const context = (): HookContext => {\n const sessionId = scope.sessionId();\n if (!sessionId) throw new Error('Child hook identity is unavailable before runtime startup.');\n return {\n sessionId,\n parentSessionId: scope.request.parentSessionId,\n agent: scope.request.agent,\n isSubagent: true,\n cwd: scope.request.cwd,\n repoRoot: config.harness.root ?? scope.request.cwd,\n signal,\n sendMessage: (text, delivery) => scope.sendMessage(text, delivery),\n appendCustomEntry: (type, data) => scope.appendCustomEntry(type, data),\n };\n };\n return {\n async beforeTool(event, execution) {\n await session.prepare(true);\n const native = {\n type: 'tool_call',\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n input: event.args,\n } as ToolCallEvent;\n const result = await dispatchHooks(\n session,\n { ...context(), operationSignal: execution.abortSignal },\n {\n eventName: HOOK_EVENT.preToolUse,\n event: native,\n },\n );\n if (result.failures.length > 0) await scope.sendMessage(hookFailureMessage(result.failures), 'steer');\n return result.toolCall?.block\n ? { block: { reason: result.toolCall.reason ?? 'Blocked by repository hook' } }\n : { args: native.input as Record<string, JsonValue> };\n },\n async afterTool(event, execution) {\n const native = {\n type: 'tool_result',\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n input: event.args,\n content: event.content,\n details: event.details,\n isError: event.isError,\n } as ToolResultEvent;\n const result = await dispatchHooks(\n session,\n { ...context(), operationSignal: execution.abortSignal },\n {\n eventName: HOOK_EVENT.postToolUse,\n event: native,\n },\n );\n return result.toolResult\n ? {\n content: result.toolResult.content,\n details: result.toolResult.details as JsonValue | undefined,\n isError: result.toolResult.isError,\n }\n : undefined;\n },\n dispose() {\n disposal ??= (async () => {\n controller.abort();\n await session.modules.dispose();\n })();\n return disposal;\n },\n };\n },\n };\n}\n\nexport function createHookRuntime(\n cordis: Context,\n options: HookExtensionOptions,\n parentContext?: Omit<HookContext, 'signal'>,\n lifetimeSignal?: AbortSignal,\n): HookRuntimeBinding {\n const controller = new AbortController();\n const signal = lifetimeSignal ? AbortSignal.any([controller.signal, lifetimeSignal]) : controller.signal;\n const session: HookSession = {\n ...createHookSession(() => requirePoConfigContext(cordis), options, signal),\n parentContext,\n };\n let disposal: Promise<void> | undefined;\n let active = true;\n return {\n session,\n childHooks: childHooksFor(session),\n isCurrent: () => active && !signal.aborted,\n dispose() {\n active = false;\n controller.abort();\n disposal ??= session.modules.dispose();\n return disposal;\n },\n };\n}\n\nexport function createHookBinding(\n options: HookExtensionOptions,\n parentContext?: Omit<HookContext, 'signal'>,\n lifetimeSignal?: AbortSignal,\n): HookBinding {\n let runtime: HookRuntimeBinding | undefined;\n return {\n plugin(cordis) {\n cordis.inject([PO_CONFIG_SERVICE], (configContext) => {\n const binding = createHookRuntime(configContext, options, parentContext, lifetimeSignal);\n runtime = binding;\n configContext.provide(PO_CHILD_SESSION_HOOKS_SERVICE, binding.childHooks);\n configContext.provide(PO_HOOK_SESSION_SERVICE, binding);\n return async () => {\n if (runtime === binding) runtime = undefined;\n await binding.dispose();\n };\n });\n },\n runtime: () => runtime,\n };\n}\n","import {\n PoHeadlessPromptAdmissionError,\n type PoHeadlessExecutionContext,\n type PoHeadlessHook,\n} from '@agimon-ai/po-core/headless';\nimport type { ToolCallEvent, ToolResultEvent } from '@earendil-works/pi-coding-agent';\n\nimport {\n BLOCKED_BY_HOOK,\n STATUS_PREFIX,\n SUBAGENT_ENVIRONMENT_FLAG,\n CONTEXT_SEPARATOR,\n FAILURE_MESSAGE_TYPE,\n MAX_STOP_REFUSALS,\n STOP_HOOK_ACTIVE_FIELD,\n} from '../../constants/hookHandlers';\nimport { HOOK_EVENT } from '../../constants/hooks';\nimport type { HookNativeEvent } from '../../types/hookModule';\nimport { additionalContextsFrom, decisionReason, hookFailureMessage, isDenied } from '../hookDecisions';\nimport { dispatchHooks } from '../hookDispatch';\nimport type { HookDispatchScope } from '../hookDispatch/type';\nimport type { HookRuntime, HookRuntimeResolver } from '../hookRuntime/type';\n\nfunction hookEntry(event: Readonly<Record<string, unknown>>): Record<string, unknown> {\n return { version: 1, event: typeof event.type === 'string' ? event.type : 'headless-hook', data: event };\n}\n\nfunction scopeFor(runtime: HookRuntime, execution: PoHeadlessExecutionContext): HookDispatchScope {\n return {\n sessionId: execution.sessionId,\n isSubagent: Boolean(execution.environment[SUBAGENT_ENVIRONMENT_FLAG]),\n cwd: execution.cwd,\n repoRoot: execution.repoRoot,\n model: execution.model,\n signal: runtime.session.signal,\n operationSignal: execution.signal,\n async sendMessage(text, delivery) {\n if (!execution.session.admitPrompt)\n throw new PoHeadlessPromptAdmissionError('The session cannot admit a hook prompt.');\n await execution.session.admitPrompt(text, delivery);\n },\n appendCustomEntry: (type, data) => execution.session.appendCustomEntry(type, data),\n };\n}\n\n/** One native owner dispatches lifecycle and tool rows for this session. */\nexport function createServerHooks(resolveRuntime: HookRuntimeResolver) {\n const startups = new WeakMap<HookRuntime, Promise<void>>();\n const shutdowns = new WeakMap<HookRuntime, Promise<void>>();\n const refusals = new WeakMap<HookRuntime, number>();\n async function runLifecycle(\n runtime: HookRuntime,\n execution: PoHeadlessExecutionContext,\n eventName: string,\n event?: Readonly<Record<string, unknown>>,\n extraPayload?: Record<string, unknown>,\n ) {\n const key = `${STATUS_PREFIX}:${execution.sessionId}:${eventName}`;\n try {\n return await dispatchHooks(runtime.session, scopeFor(runtime, execution), {\n eventName,\n event: event as HookNativeEvent | undefined,\n extraPayload,\n progress: (index, total) =>\n execution.client.setStatus(key, `Running ${eventName} hooks (${index + 1}/${total})...`),\n });\n } finally {\n execution.client.setStatus(key, undefined);\n }\n }\n function start(\n runtime: HookRuntime,\n execution: PoHeadlessExecutionContext,\n event: Readonly<Record<string, unknown>> = { type: 'session_start' },\n ) {\n let startup = startups.get(runtime);\n if (!startup) {\n startup = (async () => {\n const scope = scopeFor(runtime, execution);\n await runtime.session.prepare(scope.isSubagent);\n if (scope.isSubagent) return;\n const result = await runLifecycle(runtime, execution, HOOK_EVENT.sessionStart, {\n ...event,\n type: 'session_start',\n });\n if (!runtime.isCurrent()) return;\n if (result.failures.length) await scope.sendMessage(hookFailureMessage(result.failures), 'steer');\n const context = additionalContextsFrom(result.decisions).join(CONTEXT_SEPARATOR);\n if (context) await scope.sendMessage(context, 'steer');\n })();\n startups.set(runtime, startup);\n }\n return startup;\n }\n const sessionStart: PoHeadlessHook<'session_start'> = {\n event: 'session_start',\n async handle(event, execution) {\n const runtime = resolveRuntime();\n if (runtime?.isCurrent()) await start(runtime, execution, event);\n },\n };\n const agentEnd: PoHeadlessHook<'agent_end'> = {\n event: 'agent_end',\n async handle(event, execution) {\n const runtime = resolveRuntime();\n if (!runtime?.isCurrent() || scopeFor(runtime, execution).isSubagent) return;\n await start(runtime, execution);\n const count = refusals.get(runtime) ?? 0;\n const result = await runLifecycle(\n runtime,\n execution,\n HOOK_EVENT.stop,\n { ...event, type: 'agent_settled' },\n { [STOP_HOOK_ACTIVE_FIELD]: count > 0 },\n );\n if (!runtime.isCurrent()) return;\n const appendFailure = async (text: string) => {\n if (!execution.session.appendMessage) throw new Error('The session cannot append hook diagnostics.');\n await execution.session.appendMessage({ type: FAILURE_MESSAGE_TYPE, text });\n };\n if (result.failures.length) await appendFailure(hookFailureMessage(result.failures));\n const reason = decisionReason(result.decisions.find(isDenied));\n if (!reason) {\n refusals.set(runtime, 0);\n return;\n }\n if (count >= MAX_STOP_REFUSALS) {\n refusals.set(runtime, 0);\n await appendFailure(\n `A Stop hook refused ${String(MAX_STOP_REFUSALS)} stops in a row, so the agent stops here. Its last reason: ${reason}`,\n );\n return;\n }\n // Advance only after successful admission. Admission does not await the successor turn.\n await scopeFor(runtime, execution).sendMessage(reason, 'followUp');\n refusals.set(runtime, count + 1);\n },\n };\n const beforeAgentStart: PoHeadlessHook<'before_agent_start'> = {\n event: 'before_agent_start',\n async handle(event, execution) {\n const runtime = resolveRuntime();\n if (runtime?.isCurrent()) await start(runtime, execution);\n await execution.session.appendCustomEntry('po-hook', hookEntry(event));\n },\n };\n const toolCall: PoHeadlessHook<'tool_call'> = {\n event: 'tool_call',\n async handle(event, execution) {\n const runtime = resolveRuntime();\n if (!runtime?.isCurrent()) return;\n const scope = scopeFor(runtime, execution);\n try {\n await start(runtime, execution);\n } catch (error) {\n return { block: { reason: error instanceof Error ? error.message : String(error) } };\n }\n const native = {\n type: 'tool_call',\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n input: event.args,\n } as ToolCallEvent;\n const key = `${STATUS_PREFIX}:${native.toolCallId}:pre`;\n try {\n const result = await dispatchHooks(runtime.session, scope, {\n eventName: HOOK_EVENT.preToolUse,\n event: native,\n progress: (index, total) =>\n execution.client.setStatus(key, `Running pre-tool hooks for ${native.toolName} (${index + 1}/${total})...`),\n });\n if (result.failures.length > 0) await scope.sendMessage(hookFailureMessage(result.failures), 'steer');\n return result.toolCall?.block\n ? { block: { reason: result.toolCall.reason ?? BLOCKED_BY_HOOK } }\n : { args: native.input };\n } finally {\n execution.client.setStatus(key, undefined);\n }\n },\n };\n const toolResult: PoHeadlessHook<'tool_result'> = {\n event: 'tool_result',\n async handle(event, execution) {\n await execution.session.appendCustomEntry('po-hook', hookEntry(event));\n const runtime = resolveRuntime();\n if (!runtime?.isCurrent()) return;\n await start(runtime, execution);\n const native = {\n type: 'tool_result',\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n input: event.args,\n content: event.content,\n details: event.details,\n isError: event.isError,\n } as ToolResultEvent;\n const key = `${STATUS_PREFIX}:${native.toolCallId}:post`;\n try {\n const result = await dispatchHooks(runtime.session, scopeFor(runtime, execution), {\n eventName: HOOK_EVENT.postToolUse,\n event: native,\n progress: (index, total) =>\n execution.client.setStatus(\n key,\n `Running post-tool hooks for ${native.toolName} (${index + 1}/${total})...`,\n ),\n });\n return result.toolResult;\n } finally {\n execution.client.setStatus(key, undefined);\n }\n },\n };\n const agentSettled: PoHeadlessHook<'agent_settled'> = {\n event: 'agent_settled',\n handle: (event, execution) => execution.session.appendCustomEntry('po-hook', hookEntry(event)),\n };\n const sessionShutdown: PoHeadlessHook<'session_shutdown'> = {\n event: 'session_shutdown',\n async handle(_event, execution) {\n const runtime = resolveRuntime();\n if (runtime?.isCurrent() && !scopeFor(runtime, execution).isSubagent) {\n let shutdown = shutdowns.get(runtime);\n if (!shutdown) {\n shutdown = runLifecycle(runtime, execution, HOOK_EVENT.sessionEnd).then(() => undefined);\n shutdowns.set(runtime, shutdown);\n }\n await shutdown;\n }\n execution.client.setStatus('po-hook', undefined);\n },\n };\n return { sessionStart, agentEnd, beforeAgentStart, toolCall, toolResult, agentSettled, sessionShutdown };\n}\n","import { PoHeadlessPromptAdmissionError } from '@agimon-ai/po-core/headless';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport { SUBAGENT_ENVIRONMENT_FLAG } from '../../../../../constants/hookHandlers';\nimport { createHookBinding } from '../../../../../services/hookRuntime';\nimport { createServerHooks } from '../../../../../services/serverHooks';\n\nexport const createHookServerRoot = ({ agent, signal }: PoServerPluginContext) => {\n if (!agent) throw new Error('Hook session requires the headless host.');\n const execution = agent.context;\n const binding = createHookBinding(\n {},\n {\n sessionId: execution.sessionId,\n isSubagent: Boolean(execution.environment[SUBAGENT_ENVIRONMENT_FLAG]),\n cwd: execution.cwd,\n repoRoot: execution.repoRoot,\n get model() {\n return execution.model;\n },\n async sendMessage(text, delivery) {\n if (!execution.session.admitPrompt)\n throw new PoHeadlessPromptAdmissionError('The session cannot admit a hook prompt.');\n await execution.session.admitPrompt(text, delivery);\n },\n appendCustomEntry: (type, data) => execution.session.appendCustomEntry(type, data),\n },\n signal,\n );\n return { value: createServerHooks(binding.runtime), services: [binding.plugin] };\n};\n\nexport type HookServerScope = Awaited<ReturnType<typeof createHookServerRoot>>['value'];\n","import { defineRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport { createHookServerRoot } from './_lib/serverRoot';\n\nexport default defineRoot(createHookServerRoot);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport type { HookServerScope } from '../_lib/serverRoot';\n\nexport default defineHook(({ root }: WithRoot<PoServerPluginContext, HookServerScope>) => root.agentEnd);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport type { HookServerScope } from '../_lib/serverRoot';\n\nexport default defineHook(({ root }: WithRoot<PoServerPluginContext, HookServerScope>) => root.agentSettled);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport type { HookServerScope } from '../_lib/serverRoot';\n\nexport default defineHook(({ root }: WithRoot<PoServerPluginContext, HookServerScope>) => root.beforeAgentStart);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport type { HookServerScope } from '../_lib/serverRoot';\n\nexport default defineHook(({ root }: WithRoot<PoServerPluginContext, HookServerScope>) => root.sessionShutdown);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport type { HookServerScope } from '../_lib/serverRoot';\n\nexport default defineHook(({ root }: WithRoot<PoServerPluginContext, HookServerScope>) => root.sessionStart);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport type { HookServerScope } from '../_lib/serverRoot';\n\nexport default defineHook(({ root }: WithRoot<PoServerPluginContext, HookServerScope>) => root.toolCall);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport type { HookServerScope } from '../_lib/serverRoot';\n\nexport default defineHook(({ root }: WithRoot<PoServerPluginContext, HookServerScope>) => root.toolResult);\n","export const PACKAGE_SOURCE = '@agimon-ai/po-hook';\nexport const HOOK_HELP_SKILL = {\n name: 'po-author-hook',\n description:\n 'Author Po repository or plugin hooks. Use when creating or changing .po/hooks.yaml, selecting hook groups from modes.yaml, writing hook commands, or adapting Claude Code hook payloads and decisions to Po.',\n};\n","import { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { PO_HELP_WHEN } from '@agimon-ai/po-core/help';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverPlugin';\n\nimport { HOOK_HELP_SKILL } from '../../../../../constants/hook';\n\nexport default defineResource({\n ...HOOK_HELP_SKILL,\n when: PO_HELP_WHEN,\n kind: 'skill' as const,\n path: packageResourcePath(import.meta.url, 'src/prompts/po-author-hook/SKILL.md'),\n read: async () => {\n const text = await readPackageResource(import.meta.url, 'src/prompts/po-author-hook/SKILL.md');\n if (!text.trim()) throw new Error('The installed hook-authoring skill is missing or unreadable.');\n return text;\n },\n});\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineServerPlugin, type PoServerSessionPlugin } from '@agimon-ai/po-core/serverPlugin';\nimport { composeServerProviderOverrides } from '@agimon-ai/po-core/serverPlugin';\nimport { composeRootHooks, composeRootInjects } from '@agimon-ai/po-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport hookAgentEnd from '../src/extensions/workspaces/sessions/(backend)/hook/agent-end.server';\nimport hookAgentSettled from '../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.server';\nimport hookBeforeAgentStart from '../src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.server';\nimport hookSessionShutdown from '../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server';\nimport hookSessionStart from '../src/extensions/workspaces/sessions/(backend)/hook/session-start.server';\nimport hookToolCall from '../src/extensions/workspaces/sessions/(backend)/hook/tool-call.server';\nimport hookToolResult from '../src/extensions/workspaces/sessions/(backend)/hook/tool-result.server';\nimport resourcePoAuthorHook from '../src/extensions/workspaces/sessions/(backend)/resource/po-author-hook.server';\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;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const serverPlugin = defineServerPlugin({\n name: '@agimon-ai/po-hook',\n providerOverrides: composeServerProviderOverrides(rootSession),\n injects: composeRootInjects({ session: [rootSession] }),\n session: async (context) => {\n const scopeSession = await context.scopeRoot('session', rootSession, context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get hooks(): PoServerSessionPlugin['hooks'] { return [via({ event: 'agent_end' }, at(hookAgentEnd, contextSession)), via({ event: 'agent_settled' }, at(hookAgentSettled, contextSession)), via({ event: 'before_agent_start' }, at(hookBeforeAgentStart, contextSession)), via({ event: 'session_shutdown' }, at(hookSessionShutdown, contextSession)), via({ event: 'session_start' }, at(hookSessionStart, contextSession)), via({ event: 'tool_call' }, at(hookToolCall, contextSession)), via({ event: 'tool_result' }, at(hookToolResult, contextSession))]; },\n get resources(): PoServerSessionPlugin['resources'] { return [at(resourcePoAuthorHook, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): PoServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default serverPlugin;\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region generated/server.d.ts
|
|
2
|
-
export declare const
|
|
2
|
+
export declare const serverPlugin: import("@agimon-ai/po-core/serverPlugin").PoServerPlugin;
|
|
3
3
|
//#endregion
|
|
4
|
-
export {
|
|
4
|
+
export { serverPlugin as default };
|
|
5
5
|
//# sourceMappingURL=server.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.mts","names":[],"sources":["../../generated/server.ts"],"mappings":";qBAqBa,
|
|
1
|
+
{"version":3,"file":"server.d.mts","names":[],"sources":["../../generated/server.ts"],"mappings":";qBAqBa,wDAAY"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { a as createBashHookRunner, b as isDenied, c as createHookDocumentReader, d as selectRegistryHooks, g as decisionReason, h as additionalContextsFrom, i as createHookTelemetry, n as HOOK_EVENT, o as sessionHookPayload, r as selectPluginHooks, s as toolHookPayload, t as createHookModules, x as toolResultMessages, y as hookFailureMessage } from "../hookModules-ClLNr9FP.mjs";
|
|
2
|
-
import { composeServerProviderOverrides, defineServerPlugin, packageResourcePath, readPackageResource } from "@agimon-ai/po-core/
|
|
3
|
-
import { composeRootHooks, defineHook, defineResource, defineRoot } from "@agimon-ai/po-core/extensionFile";
|
|
2
|
+
import { composeServerProviderOverrides, defineServerPlugin, packageResourcePath, readPackageResource } from "@agimon-ai/po-core/serverPlugin";
|
|
3
|
+
import { composeRootHooks, composeRootInjects, defineHook, defineResource, defineRoot } from "@agimon-ai/po-core/extensionFile";
|
|
4
4
|
import { PoHeadlessPromptAdmissionError } from "@agimon-ai/po-core/headless";
|
|
5
5
|
import { requirePoConfigContext } from "@agimon-ai/po-config/piContext";
|
|
6
6
|
import { PO_CHILD_SESSION_HOOKS_SERVICE } from "@agimon-ai/po-core/childSession";
|
|
@@ -568,11 +568,12 @@ const via = (identity, value) => value === void 0 ? void 0 : {
|
|
|
568
568
|
...identity,
|
|
569
569
|
...value
|
|
570
570
|
};
|
|
571
|
-
const
|
|
571
|
+
const serverPlugin = defineServerPlugin({
|
|
572
572
|
name: "@agimon-ai/po-hook",
|
|
573
573
|
providerOverrides: composeServerProviderOverrides(root_server_default),
|
|
574
|
+
injects: composeRootInjects({ session: [root_server_default] }),
|
|
574
575
|
session: async (context) => {
|
|
575
|
-
const scopeSession = await root_server_default
|
|
576
|
+
const scopeSession = await context.scopeRoot("session", root_server_default, context);
|
|
576
577
|
const contextSession = {
|
|
577
578
|
...context,
|
|
578
579
|
root: scopeSession.value
|
|
@@ -601,6 +602,6 @@ const facet = defineServerPlugin({
|
|
|
601
602
|
}
|
|
602
603
|
});
|
|
603
604
|
//#endregion
|
|
604
|
-
export {
|
|
605
|
+
export { serverPlugin as default, serverPlugin };
|
|
605
606
|
|
|
606
607
|
//# sourceMappingURL=server.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.mjs","names":["rootSession","hookAgentEnd","hookAgentSettled","hookBeforeAgentStart","hookSessionShutdown","hookSessionStart","hookToolCall","hookToolResult","resourcePoAuthorHook"],"sources":["../../src/constants/hookHandlers.ts","../../src/services/hookDispatch/index.ts","../../src/services/hookRuntime/type.ts","../../src/services/hookRuntime/index.ts","../../src/services/serverHooks/index.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/serverRoot.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/agent-end.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/session-start.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/tool-call.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/tool-result.server.ts","../../src/constants/hook.ts","../../src/extensions/workspaces/sessions/(backend)/resource/po-author-hook.server.ts","../../generated/server.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 { ToolResultEvent } from '@earendil-works/pi-coding-agent';\n\nimport { BLOCKED_BY_HOOK, CONTEXT_SEPARATOR } from '../../constants/hookHandlers';\nimport { HOOK_EVENT } from '../../constants/hooks';\nimport type { HookFailure, HookToolEvent, ResolvedHook } from '../../types/hooks';\nimport {\n additionalContextsFrom,\n decisionReason,\n hookFailureMessage,\n isDenied,\n toolResultMessages,\n} from '../hookDecisions';\nimport { sessionHookPayload, toolHookPayload } from '../hookPayload';\nimport { selectRegistryHooks } from '../hookRegistry';\nimport type { HookSession } from '../hookRuntime/type';\nimport { selectPluginHooks } from '../pluginHooks';\nimport type { HookDispatchRequest, HookDispatchResult, HookDispatchScope } from './type';\n\nfunction isJson(value: unknown, ancestors = new Set<object>()): boolean {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return true;\n if (typeof value === 'number') return Number.isFinite(value);\n if (typeof value !== 'object' || ancestors.has(value)) return false;\n ancestors.add(value);\n const valid =\n (Array.isArray(value) || Object.getPrototypeOf(value) === Object.prototype) &&\n Object.values(value).every((entry) => isJson(entry, ancestors));\n ancestors.delete(value);\n return valid;\n}\n\nfunction commandFailure(row: ResolvedHook, error: unknown): HookFailure {\n return {\n command: row.hook.command ?? row.hook.module,\n message: error instanceof Error ? error.message : String(error),\n reason: 'hook_execution',\n };\n}\n\n/** Registry rows interleave command and module bindings, followed by plugin commands. */\nexport async function dispatchHooks(\n session: HookSession,\n scope: HookDispatchScope,\n request: HookDispatchRequest,\n): Promise<HookDispatchResult> {\n const signal = scope.operationSignal ? AbortSignal.any([scope.signal, scope.operationSignal]) : scope.signal;\n signal.throwIfAborted();\n const harness = session.config().harness;\n const plugins = await session.documents.plugins(harness.pluginHooks);\n const registry =\n request.eventName === HOOK_EVENT.sessionEnd\n ? { entries: [], failure: undefined }\n : await session.documents.registry(scope.repoRoot);\n signal.throwIfAborted();\n const event = request.event;\n const toolName = event && 'toolName' in event ? event.toolName : undefined;\n const hooks = [\n ...selectRegistryHooks(registry.entries, {\n event: request.eventName,\n toolName,\n allowedGroups: harness.hookGroups,\n inSubagent: scope.isSubagent,\n }),\n ...selectPluginHooks(plugins.documents, request.eventName, toolName),\n ];\n const decisions: HookDispatchResult['decisions'] = [];\n const failures = [...(registry.failure ? [registry.failure] : []), ...plugins.failures];\n let toolCall: HookDispatchResult['toolCall'];\n let patchedResult = false;\n for (const [index, row] of hooks.entries()) {\n signal.throwIfAborted();\n request.progress?.(index, hooks.length);\n if (row.hook.command === undefined) {\n if (!event) continue;\n let proposed: typeof event;\n try {\n proposed = structuredClone(event);\n } catch (error) {\n failures.push(commandFailure(row, error));\n continue;\n }\n const outcome = await session.modules.invoke(row, proposed, scope, scope.operationSignal);\n signal.throwIfAborted();\n if (outcome.failure) {\n failures.push(outcome.failure);\n continue;\n }\n // A failed or late invocation cannot mutate live tool input or output.\n try {\n if (event.type === 'tool_call' && proposed.type === 'tool_call') {\n if (\n typeof proposed.input !== 'object' ||\n proposed.input === null ||\n Array.isArray(proposed.input) ||\n !isJson(proposed.input)\n ) {\n throw new Error('Hook tool input must be a JSON object.');\n }\n const input = structuredClone(proposed.input);\n for (const key of Object.keys(event.input)) delete (event.input as Record<string, unknown>)[key];\n Object.assign(event.input, input);\n if (outcome.result && 'block' in outcome.result && outcome.result.block) {\n toolCall = { block: true, reason: outcome.result.reason ?? BLOCKED_BY_HOOK };\n break;\n }\n } else if (event.type === 'tool_result' && outcome.result) {\n const patch = structuredClone(outcome.result);\n if ('content' in patch && patch.content !== undefined) event.content = patch.content;\n if ('details' in patch) event.details = patch.details;\n if ('isError' in patch && patch.isError !== undefined) event.isError = patch.isError;\n patchedResult = true;\n }\n } catch (error) {\n failures.push(commandFailure(row, error));\n }\n continue;\n }\n const payload =\n event && 'toolName' in event\n ? toolHookPayload(event as HookToolEvent, request.eventName, scope.repoRoot, scope.sessionId, {\n parentSessionId: scope.parentSessionId,\n agent: scope.agent,\n })\n : sessionHookPayload(scope.sessionId, scope.repoRoot);\n // The catch covers hook execution only. Readiness, host effects and abort errors propagate.\n let outcome;\n try {\n outcome = await session.runner.run(\n row.hook,\n { ...payload, ...request.extraPayload },\n {\n repoRoot: scope.repoRoot,\n pluginRoot: row.root,\n },\n );\n } catch (error) {\n failures.push(commandFailure(row, error));\n continue;\n }\n signal.throwIfAborted();\n if (outcome.failure) failures.push(outcome.failure);\n if (!outcome.decision) continue;\n decisions.push(outcome.decision);\n if (event?.type === 'tool_result') {\n const messages = toolResultMessages([outcome.decision]);\n if (messages.length > 0)\n event.content = [...event.content, { type: 'text', text: messages.join(CONTEXT_SEPARATOR) }];\n if (isDenied(outcome.decision)) event.isError = true;\n patchedResult ||= messages.length > 0 || isDenied(outcome.decision);\n }\n if (isDenied(outcome.decision)) {\n if (event?.type === 'tool_call')\n toolCall = {\n block: true,\n reason: decisionReason(outcome.decision) ?? BLOCKED_BY_HOOK,\n };\n break;\n }\n }\n if (event?.type === 'tool_call' && !toolCall) {\n const context = additionalContextsFrom(decisions).join(CONTEXT_SEPARATOR);\n if (context) toolCall = { block: true, reason: context };\n }\n if (event?.type === 'tool_result' && failures.length > 0) {\n event.content = [...event.content, { type: 'text', text: hookFailureMessage(failures) }];\n patchedResult = true;\n }\n return {\n decisions,\n failures,\n ...(toolCall ? { toolCall } : {}),\n ...(event?.type === 'tool_result' && patchedResult\n ? {\n toolResult: {\n content: (event as ToolResultEvent).content,\n details: (event as ToolResultEvent).details,\n isError: event.isError,\n },\n }\n : {}),\n };\n}\n","import type { PoConfigContext } from '@agimon-ai/po-config/types';\nimport type { PoChildSessionHooks } from '@agimon-ai/po-core/childSession';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport type { HookContext } from '../../types/hookModule';\nimport type { HookDocumentReader, HookRunner } from '../../types/hooks';\nimport type { HookTelemetry } from '../../types/telemetry';\nimport type { HookModules } from '../hookModules/type';\n\nexport const PO_HOOK_SESSION_SERVICE = 'po/hook-session';\nexport interface HookExtensionOptions {\n telemetry?: HookTelemetry;\n runner?: HookRunner;\n documents?: HookDocumentReader;\n}\n\n/** One host session owns its module registry and lifetime; children borrow only immutable config. */\nexport interface HookSession {\n config(): PoConfigContext;\n prepare(isSubagent?: boolean): Promise<void>;\n readonly runner: HookRunner;\n readonly documents: HookDocumentReader;\n readonly modules: HookModules;\n readonly signal: AbortSignal;\n readonly parentContext?: Omit<HookContext, 'signal'>;\n}\n\n/** One dependency-complete Hook runtime owned by a reactive Cordis fiber. */\nexport interface HookRuntime {\n readonly session: HookSession;\n readonly childHooks: PoChildSessionHooks;\n isCurrent(): boolean;\n}\n\nexport type HookRuntimeResolver = () => HookRuntime | undefined;\n\nexport interface HookRuntimeBinding extends HookRuntime {\n dispose(): Promise<void>;\n}\nexport interface HookBinding {\n readonly plugin: (this: void, context: Context) => void;\n readonly runtime: HookRuntimeResolver;\n}\n\ndeclare module '@deepseek-ai/cordis' {\n interface Context {\n 'po/hook-session': HookRuntime;\n }\n}\n","import { requirePoConfigContext } from '@agimon-ai/po-config/piContext';\nimport type { PoConfigContext } from '@agimon-ai/po-config/types';\nimport { PO_CHILD_SESSION_HOOKS_SERVICE, type PoChildSessionHooks } from '@agimon-ai/po-core/childSession';\nimport { PO_CONFIG_SERVICE } from '@agimon-ai/po-core/config';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ToolCallEvent, ToolResultEvent } from '@earendil-works/pi-coding-agent';\n\nimport { HOOK_EVENT } from '../../constants/hooks';\nimport type { HookContext, JsonValue } from '../../types/hookModule';\nimport type { HookTelemetry } from '../../types/telemetry';\nimport { hookFailureMessage } from '../hookDecisions';\nimport { dispatchHooks } from '../hookDispatch';\nimport { createHookDocumentReader } from '../hookDocuments';\nimport { createHookModules } from '../hookModules';\nimport { createBashHookRunner } from '../hookRunner';\nimport { createHookTelemetry } from '../hookTelemetry';\nimport { PO_HOOK_SESSION_SERVICE, type HookSession } from './type';\nimport type { HookBinding, HookExtensionOptions, HookRuntimeBinding } from './type';\n\nexport function createHookSession(\n config: () => PoConfigContext,\n options: HookExtensionOptions,\n signal: AbortSignal,\n): 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 const modules = createHookModules({ descriptor: config().harness.hookModules });\n const documents = options.documents ?? createHookDocumentReader({ telemetry: requireTelemetry() });\n let preparation: Promise<void> | undefined;\n return {\n config,\n signal,\n modules,\n prepare(isSubagent = false) {\n preparation ??= (async () => {\n const harness = config().harness;\n if (harness.hooks === false) return;\n const registry = await documents.registry(harness.root ?? process.cwd());\n // Registry read failures keep their existing advisory dispatch policy.\n if (registry.failure) return;\n const allowed = harness.hookGroups === undefined ? undefined : new Set(harness.hookGroups);\n const rows = registry.entries\n .filter((row) => row.core || !allowed || allowed.has(row.groupId))\n .filter((row) => !(isSubagent && row.skipInSubagent));\n await modules.validate(rows);\n })();\n return preparation;\n },\n runner: options.runner ?? createBashHookRunner({ telemetry: requireTelemetry() }),\n documents,\n };\n}\n\nfunction childHooksFor(parent: HookSession): PoChildSessionHooks {\n return {\n bind(scope) {\n // Children retain their launch selection and artifacts, even if the parent reloads.\n const config = structuredClone(parent.config());\n const controller = new AbortController();\n const signal = AbortSignal.any([controller.signal, scope.signal]);\n const session = createHookSession(() => config, { runner: parent.runner, documents: parent.documents }, signal);\n let disposal: Promise<void> | undefined;\n const context = (): HookContext => {\n const sessionId = scope.sessionId();\n if (!sessionId) throw new Error('Child hook identity is unavailable before runtime startup.');\n return {\n sessionId,\n parentSessionId: scope.request.parentSessionId,\n agent: scope.request.agent,\n isSubagent: true,\n cwd: scope.request.cwd,\n repoRoot: config.harness.root ?? scope.request.cwd,\n signal,\n sendMessage: (text, delivery) => scope.sendMessage(text, delivery),\n appendCustomEntry: (type, data) => scope.appendCustomEntry(type, data),\n };\n };\n return {\n async beforeTool(event, execution) {\n await session.prepare(true);\n const native = {\n type: 'tool_call',\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n input: event.args,\n } as ToolCallEvent;\n const result = await dispatchHooks(\n session,\n { ...context(), operationSignal: execution.abortSignal },\n {\n eventName: HOOK_EVENT.preToolUse,\n event: native,\n },\n );\n if (result.failures.length > 0) await scope.sendMessage(hookFailureMessage(result.failures), 'steer');\n return result.toolCall?.block\n ? { block: { reason: result.toolCall.reason ?? 'Blocked by repository hook' } }\n : { args: native.input as Record<string, JsonValue> };\n },\n async afterTool(event, execution) {\n const native = {\n type: 'tool_result',\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n input: event.args,\n content: event.content,\n details: event.details,\n isError: event.isError,\n } as ToolResultEvent;\n const result = await dispatchHooks(\n session,\n { ...context(), operationSignal: execution.abortSignal },\n {\n eventName: HOOK_EVENT.postToolUse,\n event: native,\n },\n );\n return result.toolResult\n ? {\n content: result.toolResult.content,\n details: result.toolResult.details as JsonValue | undefined,\n isError: result.toolResult.isError,\n }\n : undefined;\n },\n dispose() {\n disposal ??= (async () => {\n controller.abort();\n await session.modules.dispose();\n })();\n return disposal;\n },\n };\n },\n };\n}\n\nexport function createHookRuntime(\n cordis: Context,\n options: HookExtensionOptions,\n parentContext?: Omit<HookContext, 'signal'>,\n lifetimeSignal?: AbortSignal,\n): HookRuntimeBinding {\n const controller = new AbortController();\n const signal = lifetimeSignal ? AbortSignal.any([controller.signal, lifetimeSignal]) : controller.signal;\n const session: HookSession = {\n ...createHookSession(() => requirePoConfigContext(cordis), options, signal),\n parentContext,\n };\n let disposal: Promise<void> | undefined;\n let active = true;\n return {\n session,\n childHooks: childHooksFor(session),\n isCurrent: () => active && !signal.aborted,\n dispose() {\n active = false;\n controller.abort();\n disposal ??= session.modules.dispose();\n return disposal;\n },\n };\n}\n\nexport function createHookBinding(\n options: HookExtensionOptions,\n parentContext?: Omit<HookContext, 'signal'>,\n lifetimeSignal?: AbortSignal,\n): HookBinding {\n let runtime: HookRuntimeBinding | undefined;\n return {\n plugin(cordis) {\n cordis.inject([PO_CONFIG_SERVICE], (configContext) => {\n const binding = createHookRuntime(configContext, options, parentContext, lifetimeSignal);\n runtime = binding;\n configContext.provide(PO_CHILD_SESSION_HOOKS_SERVICE, binding.childHooks);\n configContext.provide(PO_HOOK_SESSION_SERVICE, binding);\n return async () => {\n if (runtime === binding) runtime = undefined;\n await binding.dispose();\n };\n });\n },\n runtime: () => runtime,\n };\n}\n","import {\n PoHeadlessPromptAdmissionError,\n type PoHeadlessExecutionContext,\n type PoHeadlessHook,\n} from '@agimon-ai/po-core/headless';\nimport type { ToolCallEvent, ToolResultEvent } from '@earendil-works/pi-coding-agent';\n\nimport {\n BLOCKED_BY_HOOK,\n STATUS_PREFIX,\n SUBAGENT_ENVIRONMENT_FLAG,\n CONTEXT_SEPARATOR,\n FAILURE_MESSAGE_TYPE,\n MAX_STOP_REFUSALS,\n STOP_HOOK_ACTIVE_FIELD,\n} from '../../constants/hookHandlers';\nimport { HOOK_EVENT } from '../../constants/hooks';\nimport type { HookNativeEvent } from '../../types/hookModule';\nimport { additionalContextsFrom, decisionReason, hookFailureMessage, isDenied } from '../hookDecisions';\nimport { dispatchHooks } from '../hookDispatch';\nimport type { HookDispatchScope } from '../hookDispatch/type';\nimport type { HookRuntime, HookRuntimeResolver } from '../hookRuntime/type';\n\nfunction hookEntry(event: Readonly<Record<string, unknown>>): Record<string, unknown> {\n return { version: 1, event: typeof event.type === 'string' ? event.type : 'headless-hook', data: event };\n}\n\nfunction scopeFor(runtime: HookRuntime, execution: PoHeadlessExecutionContext): HookDispatchScope {\n return {\n sessionId: execution.sessionId,\n isSubagent: Boolean(execution.environment[SUBAGENT_ENVIRONMENT_FLAG]),\n cwd: execution.cwd,\n repoRoot: execution.repoRoot,\n model: execution.model,\n signal: runtime.session.signal,\n operationSignal: execution.signal,\n async sendMessage(text, delivery) {\n if (!execution.session.admitPrompt)\n throw new PoHeadlessPromptAdmissionError('The session cannot admit a hook prompt.');\n await execution.session.admitPrompt(text, delivery);\n },\n appendCustomEntry: (type, data) => execution.session.appendCustomEntry(type, data),\n };\n}\n\n/** One native owner dispatches lifecycle and tool rows for this session. */\nexport function createServerHooks(resolveRuntime: HookRuntimeResolver) {\n const startups = new WeakMap<HookRuntime, Promise<void>>();\n const shutdowns = new WeakMap<HookRuntime, Promise<void>>();\n const refusals = new WeakMap<HookRuntime, number>();\n async function runLifecycle(\n runtime: HookRuntime,\n execution: PoHeadlessExecutionContext,\n eventName: string,\n event?: Readonly<Record<string, unknown>>,\n extraPayload?: Record<string, unknown>,\n ) {\n const key = `${STATUS_PREFIX}:${execution.sessionId}:${eventName}`;\n try {\n return await dispatchHooks(runtime.session, scopeFor(runtime, execution), {\n eventName,\n event: event as HookNativeEvent | undefined,\n extraPayload,\n progress: (index, total) =>\n execution.client.setStatus(key, `Running ${eventName} hooks (${index + 1}/${total})...`),\n });\n } finally {\n execution.client.setStatus(key, undefined);\n }\n }\n function start(\n runtime: HookRuntime,\n execution: PoHeadlessExecutionContext,\n event: Readonly<Record<string, unknown>> = { type: 'session_start' },\n ) {\n let startup = startups.get(runtime);\n if (!startup) {\n startup = (async () => {\n const scope = scopeFor(runtime, execution);\n await runtime.session.prepare(scope.isSubagent);\n if (scope.isSubagent) return;\n const result = await runLifecycle(runtime, execution, HOOK_EVENT.sessionStart, {\n ...event,\n type: 'session_start',\n });\n if (!runtime.isCurrent()) return;\n if (result.failures.length) await scope.sendMessage(hookFailureMessage(result.failures), 'steer');\n const context = additionalContextsFrom(result.decisions).join(CONTEXT_SEPARATOR);\n if (context) await scope.sendMessage(context, 'steer');\n })();\n startups.set(runtime, startup);\n }\n return startup;\n }\n const sessionStart: PoHeadlessHook<'session_start'> = {\n event: 'session_start',\n async handle(event, execution) {\n const runtime = resolveRuntime();\n if (runtime?.isCurrent()) await start(runtime, execution, event);\n },\n };\n const agentEnd: PoHeadlessHook<'agent_end'> = {\n event: 'agent_end',\n async handle(event, execution) {\n const runtime = resolveRuntime();\n if (!runtime?.isCurrent() || scopeFor(runtime, execution).isSubagent) return;\n await start(runtime, execution);\n const count = refusals.get(runtime) ?? 0;\n const result = await runLifecycle(\n runtime,\n execution,\n HOOK_EVENT.stop,\n { ...event, type: 'agent_settled' },\n { [STOP_HOOK_ACTIVE_FIELD]: count > 0 },\n );\n if (!runtime.isCurrent()) return;\n const appendFailure = async (text: string) => {\n if (!execution.session.appendMessage) throw new Error('The session cannot append hook diagnostics.');\n await execution.session.appendMessage({ type: FAILURE_MESSAGE_TYPE, text });\n };\n if (result.failures.length) await appendFailure(hookFailureMessage(result.failures));\n const reason = decisionReason(result.decisions.find(isDenied));\n if (!reason) {\n refusals.set(runtime, 0);\n return;\n }\n if (count >= MAX_STOP_REFUSALS) {\n refusals.set(runtime, 0);\n await appendFailure(\n `A Stop hook refused ${String(MAX_STOP_REFUSALS)} stops in a row, so the agent stops here. Its last reason: ${reason}`,\n );\n return;\n }\n // Advance only after successful admission. Admission does not await the successor turn.\n await scopeFor(runtime, execution).sendMessage(reason, 'followUp');\n refusals.set(runtime, count + 1);\n },\n };\n const beforeAgentStart: PoHeadlessHook<'before_agent_start'> = {\n event: 'before_agent_start',\n async handle(event, execution) {\n const runtime = resolveRuntime();\n if (runtime?.isCurrent()) await start(runtime, execution);\n await execution.session.appendCustomEntry('po-hook', hookEntry(event));\n },\n };\n const toolCall: PoHeadlessHook<'tool_call'> = {\n event: 'tool_call',\n async handle(event, execution) {\n const runtime = resolveRuntime();\n if (!runtime?.isCurrent()) return;\n const scope = scopeFor(runtime, execution);\n try {\n await start(runtime, execution);\n } catch (error) {\n return { block: { reason: error instanceof Error ? error.message : String(error) } };\n }\n const native = {\n type: 'tool_call',\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n input: event.args,\n } as ToolCallEvent;\n const key = `${STATUS_PREFIX}:${native.toolCallId}:pre`;\n try {\n const result = await dispatchHooks(runtime.session, scope, {\n eventName: HOOK_EVENT.preToolUse,\n event: native,\n progress: (index, total) =>\n execution.client.setStatus(key, `Running pre-tool hooks for ${native.toolName} (${index + 1}/${total})...`),\n });\n if (result.failures.length > 0) await scope.sendMessage(hookFailureMessage(result.failures), 'steer');\n return result.toolCall?.block\n ? { block: { reason: result.toolCall.reason ?? BLOCKED_BY_HOOK } }\n : { args: native.input };\n } finally {\n execution.client.setStatus(key, undefined);\n }\n },\n };\n const toolResult: PoHeadlessHook<'tool_result'> = {\n event: 'tool_result',\n async handle(event, execution) {\n await execution.session.appendCustomEntry('po-hook', hookEntry(event));\n const runtime = resolveRuntime();\n if (!runtime?.isCurrent()) return;\n await start(runtime, execution);\n const native = {\n type: 'tool_result',\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n input: event.args,\n content: event.content,\n details: event.details,\n isError: event.isError,\n } as ToolResultEvent;\n const key = `${STATUS_PREFIX}:${native.toolCallId}:post`;\n try {\n const result = await dispatchHooks(runtime.session, scopeFor(runtime, execution), {\n eventName: HOOK_EVENT.postToolUse,\n event: native,\n progress: (index, total) =>\n execution.client.setStatus(\n key,\n `Running post-tool hooks for ${native.toolName} (${index + 1}/${total})...`,\n ),\n });\n return result.toolResult;\n } finally {\n execution.client.setStatus(key, undefined);\n }\n },\n };\n const agentSettled: PoHeadlessHook<'agent_settled'> = {\n event: 'agent_settled',\n handle: (event, execution) => execution.session.appendCustomEntry('po-hook', hookEntry(event)),\n };\n const sessionShutdown: PoHeadlessHook<'session_shutdown'> = {\n event: 'session_shutdown',\n async handle(_event, execution) {\n const runtime = resolveRuntime();\n if (runtime?.isCurrent() && !scopeFor(runtime, execution).isSubagent) {\n let shutdown = shutdowns.get(runtime);\n if (!shutdown) {\n shutdown = runLifecycle(runtime, execution, HOOK_EVENT.sessionEnd).then(() => undefined);\n shutdowns.set(runtime, shutdown);\n }\n await shutdown;\n }\n execution.client.setStatus('po-hook', undefined);\n },\n };\n return { sessionStart, agentEnd, beforeAgentStart, toolCall, toolResult, agentSettled, sessionShutdown };\n}\n","import { PoHeadlessPromptAdmissionError } from '@agimon-ai/po-core/headless';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport { SUBAGENT_ENVIRONMENT_FLAG } from '../../../../../constants/hookHandlers';\nimport { createHookBinding } from '../../../../../services/hookRuntime';\nimport { createServerHooks } from '../../../../../services/serverHooks';\n\nexport const createHookServerRoot = ({ agent, signal }: PoServerPluginContext) => {\n if (!agent) throw new Error('Hook session requires the headless host.');\n const execution = agent.context;\n const binding = createHookBinding(\n {},\n {\n sessionId: execution.sessionId,\n isSubagent: Boolean(execution.environment[SUBAGENT_ENVIRONMENT_FLAG]),\n cwd: execution.cwd,\n repoRoot: execution.repoRoot,\n get model() {\n return execution.model;\n },\n async sendMessage(text, delivery) {\n if (!execution.session.admitPrompt)\n throw new PoHeadlessPromptAdmissionError('The session cannot admit a hook prompt.');\n await execution.session.admitPrompt(text, delivery);\n },\n appendCustomEntry: (type, data) => execution.session.appendCustomEntry(type, data),\n },\n signal,\n );\n return { value: createServerHooks(binding.runtime), services: [binding.plugin] };\n};\n\nexport type HookServerScope = Awaited<ReturnType<typeof createHookServerRoot>>['value'];\n","import { defineRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport { createHookServerRoot } from './_lib/serverRoot';\n\nexport default defineRoot(createHookServerRoot);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport type { HookServerScope } from '../_lib/serverRoot';\n\nexport default defineHook(({ root }: WithRoot<PoServerPluginContext, HookServerScope>) => root.agentEnd);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport type { HookServerScope } from '../_lib/serverRoot';\n\nexport default defineHook(({ root }: WithRoot<PoServerPluginContext, HookServerScope>) => root.agentSettled);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport type { HookServerScope } from '../_lib/serverRoot';\n\nexport default defineHook(({ root }: WithRoot<PoServerPluginContext, HookServerScope>) => root.beforeAgentStart);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport type { HookServerScope } from '../_lib/serverRoot';\n\nexport default defineHook(({ root }: WithRoot<PoServerPluginContext, HookServerScope>) => root.sessionShutdown);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport type { HookServerScope } from '../_lib/serverRoot';\n\nexport default defineHook(({ root }: WithRoot<PoServerPluginContext, HookServerScope>) => root.sessionStart);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport type { HookServerScope } from '../_lib/serverRoot';\n\nexport default defineHook(({ root }: WithRoot<PoServerPluginContext, HookServerScope>) => root.toolCall);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverFacet';\n\nimport type { HookServerScope } from '../_lib/serverRoot';\n\nexport default defineHook(({ root }: WithRoot<PoServerPluginContext, HookServerScope>) => root.toolResult);\n","export const PACKAGE_SOURCE = '@agimon-ai/po-hook';\nexport const HOOK_HELP_SKILL = {\n name: 'po-author-hook',\n description:\n 'Author Po repository or plugin hooks. Use when creating or changing .po/hooks.yaml, selecting hook groups from modes.yaml, writing hook commands, or adapting Claude Code hook payloads and decisions to Po.',\n};\n","import { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { PO_HELP_WHEN } from '@agimon-ai/po-core/help';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverFacet';\n\nimport { HOOK_HELP_SKILL } from '../../../../../constants/hook';\n\nexport default defineResource({\n ...HOOK_HELP_SKILL,\n when: PO_HELP_WHEN,\n kind: 'skill' as const,\n path: packageResourcePath(import.meta.url, 'src/prompts/po-author-hook/SKILL.md'),\n read: async () => {\n const text = await readPackageResource(import.meta.url, 'src/prompts/po-author-hook/SKILL.md');\n if (!text.trim()) throw new Error('The installed hook-authoring skill is missing or unreadable.');\n return text;\n },\n});\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineServerPlugin, type PoServerSessionPlugin } from '@agimon-ai/po-core/serverFacet';\nimport { composeServerProviderOverrides } from '@agimon-ai/po-core/serverFacet';\nimport { composeRootHooks } from '@agimon-ai/po-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport hookAgentEnd from '../src/extensions/workspaces/sessions/(backend)/hook/agent-end.server';\nimport hookAgentSettled from '../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.server';\nimport hookBeforeAgentStart from '../src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.server';\nimport hookSessionShutdown from '../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server';\nimport hookSessionStart from '../src/extensions/workspaces/sessions/(backend)/hook/session-start.server';\nimport hookToolCall from '../src/extensions/workspaces/sessions/(backend)/hook/tool-call.server';\nimport hookToolResult from '../src/extensions/workspaces/sessions/(backend)/hook/tool-result.server';\nimport resourcePoAuthorHook from '../src/extensions/workspaces/sessions/(backend)/resource/po-author-hook.server';\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;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/po-hook',\n providerOverrides: composeServerProviderOverrides(rootSession),\n session: async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get hooks(): PoServerSessionPlugin['hooks'] { return [via({ event: 'agent_end' }, at(hookAgentEnd, contextSession)), via({ event: 'agent_settled' }, at(hookAgentSettled, contextSession)), via({ event: 'before_agent_start' }, at(hookBeforeAgentStart, contextSession)), via({ event: 'session_shutdown' }, at(hookSessionShutdown, contextSession)), via({ event: 'session_start' }, at(hookSessionStart, contextSession)), via({ event: 'tool_call' }, at(hookToolCall, contextSession)), via({ event: 'tool_result' }, at(hookToolResult, contextSession))]; },\n get resources(): PoServerSessionPlugin['resources'] { return [at(resourcePoAuthorHook, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): PoServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default facet;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.mjs","names":["rootSession","hookAgentEnd","hookAgentSettled","hookBeforeAgentStart","hookSessionShutdown","hookSessionStart","hookToolCall","hookToolResult","resourcePoAuthorHook"],"sources":["../../src/constants/hookHandlers.ts","../../src/services/hookDispatch/index.ts","../../src/services/hookRuntime/type.ts","../../src/services/hookRuntime/index.ts","../../src/services/serverHooks/index.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/serverRoot.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/agent-end.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/session-start.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/tool-call.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/tool-result.server.ts","../../src/constants/hook.ts","../../src/extensions/workspaces/sessions/(backend)/resource/po-author-hook.server.ts","../../generated/server.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 { ToolResultEvent } from '@earendil-works/pi-coding-agent';\n\nimport { BLOCKED_BY_HOOK, CONTEXT_SEPARATOR } from '../../constants/hookHandlers';\nimport { HOOK_EVENT } from '../../constants/hooks';\nimport type { HookFailure, HookToolEvent, ResolvedHook } from '../../types/hooks';\nimport {\n additionalContextsFrom,\n decisionReason,\n hookFailureMessage,\n isDenied,\n toolResultMessages,\n} from '../hookDecisions';\nimport { sessionHookPayload, toolHookPayload } from '../hookPayload';\nimport { selectRegistryHooks } from '../hookRegistry';\nimport type { HookSession } from '../hookRuntime/type';\nimport { selectPluginHooks } from '../pluginHooks';\nimport type { HookDispatchRequest, HookDispatchResult, HookDispatchScope } from './type';\n\nfunction isJson(value: unknown, ancestors = new Set<object>()): boolean {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return true;\n if (typeof value === 'number') return Number.isFinite(value);\n if (typeof value !== 'object' || ancestors.has(value)) return false;\n ancestors.add(value);\n const valid =\n (Array.isArray(value) || Object.getPrototypeOf(value) === Object.prototype) &&\n Object.values(value).every((entry) => isJson(entry, ancestors));\n ancestors.delete(value);\n return valid;\n}\n\nfunction commandFailure(row: ResolvedHook, error: unknown): HookFailure {\n return {\n command: row.hook.command ?? row.hook.module,\n message: error instanceof Error ? error.message : String(error),\n reason: 'hook_execution',\n };\n}\n\n/** Registry rows interleave command and module bindings, followed by plugin commands. */\nexport async function dispatchHooks(\n session: HookSession,\n scope: HookDispatchScope,\n request: HookDispatchRequest,\n): Promise<HookDispatchResult> {\n const signal = scope.operationSignal ? AbortSignal.any([scope.signal, scope.operationSignal]) : scope.signal;\n signal.throwIfAborted();\n const harness = session.config().harness;\n const plugins = await session.documents.plugins(harness.pluginHooks);\n const registry =\n request.eventName === HOOK_EVENT.sessionEnd\n ? { entries: [], failure: undefined }\n : await session.documents.registry(scope.repoRoot);\n signal.throwIfAborted();\n const event = request.event;\n const toolName = event && 'toolName' in event ? event.toolName : undefined;\n const hooks = [\n ...selectRegistryHooks(registry.entries, {\n event: request.eventName,\n toolName,\n allowedGroups: harness.hookGroups,\n inSubagent: scope.isSubagent,\n }),\n ...selectPluginHooks(plugins.documents, request.eventName, toolName),\n ];\n const decisions: HookDispatchResult['decisions'] = [];\n const failures = [...(registry.failure ? [registry.failure] : []), ...plugins.failures];\n let toolCall: HookDispatchResult['toolCall'];\n let patchedResult = false;\n for (const [index, row] of hooks.entries()) {\n signal.throwIfAborted();\n request.progress?.(index, hooks.length);\n if (row.hook.command === undefined) {\n if (!event) continue;\n let proposed: typeof event;\n try {\n proposed = structuredClone(event);\n } catch (error) {\n failures.push(commandFailure(row, error));\n continue;\n }\n const outcome = await session.modules.invoke(row, proposed, scope, scope.operationSignal);\n signal.throwIfAborted();\n if (outcome.failure) {\n failures.push(outcome.failure);\n continue;\n }\n // A failed or late invocation cannot mutate live tool input or output.\n try {\n if (event.type === 'tool_call' && proposed.type === 'tool_call') {\n if (\n typeof proposed.input !== 'object' ||\n proposed.input === null ||\n Array.isArray(proposed.input) ||\n !isJson(proposed.input)\n ) {\n throw new Error('Hook tool input must be a JSON object.');\n }\n const input = structuredClone(proposed.input);\n for (const key of Object.keys(event.input)) delete (event.input as Record<string, unknown>)[key];\n Object.assign(event.input, input);\n if (outcome.result && 'block' in outcome.result && outcome.result.block) {\n toolCall = { block: true, reason: outcome.result.reason ?? BLOCKED_BY_HOOK };\n break;\n }\n } else if (event.type === 'tool_result' && outcome.result) {\n const patch = structuredClone(outcome.result);\n if ('content' in patch && patch.content !== undefined) event.content = patch.content;\n if ('details' in patch) event.details = patch.details;\n if ('isError' in patch && patch.isError !== undefined) event.isError = patch.isError;\n patchedResult = true;\n }\n } catch (error) {\n failures.push(commandFailure(row, error));\n }\n continue;\n }\n const payload =\n event && 'toolName' in event\n ? toolHookPayload(event as HookToolEvent, request.eventName, scope.repoRoot, scope.sessionId, {\n parentSessionId: scope.parentSessionId,\n agent: scope.agent,\n })\n : sessionHookPayload(scope.sessionId, scope.repoRoot);\n // The catch covers hook execution only. Readiness, host effects and abort errors propagate.\n let outcome;\n try {\n outcome = await session.runner.run(\n row.hook,\n { ...payload, ...request.extraPayload },\n {\n repoRoot: scope.repoRoot,\n pluginRoot: row.root,\n },\n );\n } catch (error) {\n failures.push(commandFailure(row, error));\n continue;\n }\n signal.throwIfAborted();\n if (outcome.failure) failures.push(outcome.failure);\n if (!outcome.decision) continue;\n decisions.push(outcome.decision);\n if (event?.type === 'tool_result') {\n const messages = toolResultMessages([outcome.decision]);\n if (messages.length > 0)\n event.content = [...event.content, { type: 'text', text: messages.join(CONTEXT_SEPARATOR) }];\n if (isDenied(outcome.decision)) event.isError = true;\n patchedResult ||= messages.length > 0 || isDenied(outcome.decision);\n }\n if (isDenied(outcome.decision)) {\n if (event?.type === 'tool_call')\n toolCall = {\n block: true,\n reason: decisionReason(outcome.decision) ?? BLOCKED_BY_HOOK,\n };\n break;\n }\n }\n if (event?.type === 'tool_call' && !toolCall) {\n const context = additionalContextsFrom(decisions).join(CONTEXT_SEPARATOR);\n if (context) toolCall = { block: true, reason: context };\n }\n if (event?.type === 'tool_result' && failures.length > 0) {\n event.content = [...event.content, { type: 'text', text: hookFailureMessage(failures) }];\n patchedResult = true;\n }\n return {\n decisions,\n failures,\n ...(toolCall ? { toolCall } : {}),\n ...(event?.type === 'tool_result' && patchedResult\n ? {\n toolResult: {\n content: (event as ToolResultEvent).content,\n details: (event as ToolResultEvent).details,\n isError: event.isError,\n },\n }\n : {}),\n };\n}\n","import type { PoConfigContext } from '@agimon-ai/po-config/types';\nimport type { PoChildSessionHooks } from '@agimon-ai/po-core/childSession';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport type { HookContext } from '../../types/hookModule';\nimport type { HookDocumentReader, HookRunner } from '../../types/hooks';\nimport type { HookTelemetry } from '../../types/telemetry';\nimport type { HookModules } from '../hookModules/type';\n\nexport const PO_HOOK_SESSION_SERVICE = 'po/hook-session';\nexport interface HookExtensionOptions {\n telemetry?: HookTelemetry;\n runner?: HookRunner;\n documents?: HookDocumentReader;\n}\n\n/** One host session owns its module registry and lifetime; children borrow only immutable config. */\nexport interface HookSession {\n config(): PoConfigContext;\n prepare(isSubagent?: boolean): Promise<void>;\n readonly runner: HookRunner;\n readonly documents: HookDocumentReader;\n readonly modules: HookModules;\n readonly signal: AbortSignal;\n readonly parentContext?: Omit<HookContext, 'signal'>;\n}\n\n/** One dependency-complete Hook runtime owned by a reactive Cordis fiber. */\nexport interface HookRuntime {\n readonly session: HookSession;\n readonly childHooks: PoChildSessionHooks;\n isCurrent(): boolean;\n}\n\nexport type HookRuntimeResolver = () => HookRuntime | undefined;\n\nexport interface HookRuntimeBinding extends HookRuntime {\n dispose(): Promise<void>;\n}\nexport interface HookBinding {\n readonly plugin: (this: void, context: Context) => void;\n readonly runtime: HookRuntimeResolver;\n}\n\ndeclare module '@deepseek-ai/cordis' {\n interface Context {\n 'po/hook-session': HookRuntime;\n }\n}\n","import { requirePoConfigContext } from '@agimon-ai/po-config/piContext';\nimport type { PoConfigContext } from '@agimon-ai/po-config/types';\nimport { PO_CHILD_SESSION_HOOKS_SERVICE, type PoChildSessionHooks } from '@agimon-ai/po-core/childSession';\nimport { PO_CONFIG_SERVICE } from '@agimon-ai/po-core/config';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ToolCallEvent, ToolResultEvent } from '@earendil-works/pi-coding-agent';\n\nimport { HOOK_EVENT } from '../../constants/hooks';\nimport type { HookContext, JsonValue } from '../../types/hookModule';\nimport type { HookTelemetry } from '../../types/telemetry';\nimport { hookFailureMessage } from '../hookDecisions';\nimport { dispatchHooks } from '../hookDispatch';\nimport { createHookDocumentReader } from '../hookDocuments';\nimport { createHookModules } from '../hookModules';\nimport { createBashHookRunner } from '../hookRunner';\nimport { createHookTelemetry } from '../hookTelemetry';\nimport { PO_HOOK_SESSION_SERVICE, type HookSession } from './type';\nimport type { HookBinding, HookExtensionOptions, HookRuntimeBinding } from './type';\n\nexport function createHookSession(\n config: () => PoConfigContext,\n options: HookExtensionOptions,\n signal: AbortSignal,\n): 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 const modules = createHookModules({ descriptor: config().harness.hookModules });\n const documents = options.documents ?? createHookDocumentReader({ telemetry: requireTelemetry() });\n let preparation: Promise<void> | undefined;\n return {\n config,\n signal,\n modules,\n prepare(isSubagent = false) {\n preparation ??= (async () => {\n const harness = config().harness;\n if (harness.hooks === false) return;\n const registry = await documents.registry(harness.root ?? process.cwd());\n // Registry read failures keep their existing advisory dispatch policy.\n if (registry.failure) return;\n const allowed = harness.hookGroups === undefined ? undefined : new Set(harness.hookGroups);\n const rows = registry.entries\n .filter((row) => row.core || !allowed || allowed.has(row.groupId))\n .filter((row) => !(isSubagent && row.skipInSubagent));\n await modules.validate(rows);\n })();\n return preparation;\n },\n runner: options.runner ?? createBashHookRunner({ telemetry: requireTelemetry() }),\n documents,\n };\n}\n\nfunction childHooksFor(parent: HookSession): PoChildSessionHooks {\n return {\n bind(scope) {\n // Children retain their launch selection and artifacts, even if the parent reloads.\n const config = structuredClone(parent.config());\n const controller = new AbortController();\n const signal = AbortSignal.any([controller.signal, scope.signal]);\n const session = createHookSession(() => config, { runner: parent.runner, documents: parent.documents }, signal);\n let disposal: Promise<void> | undefined;\n const context = (): HookContext => {\n const sessionId = scope.sessionId();\n if (!sessionId) throw new Error('Child hook identity is unavailable before runtime startup.');\n return {\n sessionId,\n parentSessionId: scope.request.parentSessionId,\n agent: scope.request.agent,\n isSubagent: true,\n cwd: scope.request.cwd,\n repoRoot: config.harness.root ?? scope.request.cwd,\n signal,\n sendMessage: (text, delivery) => scope.sendMessage(text, delivery),\n appendCustomEntry: (type, data) => scope.appendCustomEntry(type, data),\n };\n };\n return {\n async beforeTool(event, execution) {\n await session.prepare(true);\n const native = {\n type: 'tool_call',\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n input: event.args,\n } as ToolCallEvent;\n const result = await dispatchHooks(\n session,\n { ...context(), operationSignal: execution.abortSignal },\n {\n eventName: HOOK_EVENT.preToolUse,\n event: native,\n },\n );\n if (result.failures.length > 0) await scope.sendMessage(hookFailureMessage(result.failures), 'steer');\n return result.toolCall?.block\n ? { block: { reason: result.toolCall.reason ?? 'Blocked by repository hook' } }\n : { args: native.input as Record<string, JsonValue> };\n },\n async afterTool(event, execution) {\n const native = {\n type: 'tool_result',\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n input: event.args,\n content: event.content,\n details: event.details,\n isError: event.isError,\n } as ToolResultEvent;\n const result = await dispatchHooks(\n session,\n { ...context(), operationSignal: execution.abortSignal },\n {\n eventName: HOOK_EVENT.postToolUse,\n event: native,\n },\n );\n return result.toolResult\n ? {\n content: result.toolResult.content,\n details: result.toolResult.details as JsonValue | undefined,\n isError: result.toolResult.isError,\n }\n : undefined;\n },\n dispose() {\n disposal ??= (async () => {\n controller.abort();\n await session.modules.dispose();\n })();\n return disposal;\n },\n };\n },\n };\n}\n\nexport function createHookRuntime(\n cordis: Context,\n options: HookExtensionOptions,\n parentContext?: Omit<HookContext, 'signal'>,\n lifetimeSignal?: AbortSignal,\n): HookRuntimeBinding {\n const controller = new AbortController();\n const signal = lifetimeSignal ? AbortSignal.any([controller.signal, lifetimeSignal]) : controller.signal;\n const session: HookSession = {\n ...createHookSession(() => requirePoConfigContext(cordis), options, signal),\n parentContext,\n };\n let disposal: Promise<void> | undefined;\n let active = true;\n return {\n session,\n childHooks: childHooksFor(session),\n isCurrent: () => active && !signal.aborted,\n dispose() {\n active = false;\n controller.abort();\n disposal ??= session.modules.dispose();\n return disposal;\n },\n };\n}\n\nexport function createHookBinding(\n options: HookExtensionOptions,\n parentContext?: Omit<HookContext, 'signal'>,\n lifetimeSignal?: AbortSignal,\n): HookBinding {\n let runtime: HookRuntimeBinding | undefined;\n return {\n plugin(cordis) {\n cordis.inject([PO_CONFIG_SERVICE], (configContext) => {\n const binding = createHookRuntime(configContext, options, parentContext, lifetimeSignal);\n runtime = binding;\n configContext.provide(PO_CHILD_SESSION_HOOKS_SERVICE, binding.childHooks);\n configContext.provide(PO_HOOK_SESSION_SERVICE, binding);\n return async () => {\n if (runtime === binding) runtime = undefined;\n await binding.dispose();\n };\n });\n },\n runtime: () => runtime,\n };\n}\n","import {\n PoHeadlessPromptAdmissionError,\n type PoHeadlessExecutionContext,\n type PoHeadlessHook,\n} from '@agimon-ai/po-core/headless';\nimport type { ToolCallEvent, ToolResultEvent } from '@earendil-works/pi-coding-agent';\n\nimport {\n BLOCKED_BY_HOOK,\n STATUS_PREFIX,\n SUBAGENT_ENVIRONMENT_FLAG,\n CONTEXT_SEPARATOR,\n FAILURE_MESSAGE_TYPE,\n MAX_STOP_REFUSALS,\n STOP_HOOK_ACTIVE_FIELD,\n} from '../../constants/hookHandlers';\nimport { HOOK_EVENT } from '../../constants/hooks';\nimport type { HookNativeEvent } from '../../types/hookModule';\nimport { additionalContextsFrom, decisionReason, hookFailureMessage, isDenied } from '../hookDecisions';\nimport { dispatchHooks } from '../hookDispatch';\nimport type { HookDispatchScope } from '../hookDispatch/type';\nimport type { HookRuntime, HookRuntimeResolver } from '../hookRuntime/type';\n\nfunction hookEntry(event: Readonly<Record<string, unknown>>): Record<string, unknown> {\n return { version: 1, event: typeof event.type === 'string' ? event.type : 'headless-hook', data: event };\n}\n\nfunction scopeFor(runtime: HookRuntime, execution: PoHeadlessExecutionContext): HookDispatchScope {\n return {\n sessionId: execution.sessionId,\n isSubagent: Boolean(execution.environment[SUBAGENT_ENVIRONMENT_FLAG]),\n cwd: execution.cwd,\n repoRoot: execution.repoRoot,\n model: execution.model,\n signal: runtime.session.signal,\n operationSignal: execution.signal,\n async sendMessage(text, delivery) {\n if (!execution.session.admitPrompt)\n throw new PoHeadlessPromptAdmissionError('The session cannot admit a hook prompt.');\n await execution.session.admitPrompt(text, delivery);\n },\n appendCustomEntry: (type, data) => execution.session.appendCustomEntry(type, data),\n };\n}\n\n/** One native owner dispatches lifecycle and tool rows for this session. */\nexport function createServerHooks(resolveRuntime: HookRuntimeResolver) {\n const startups = new WeakMap<HookRuntime, Promise<void>>();\n const shutdowns = new WeakMap<HookRuntime, Promise<void>>();\n const refusals = new WeakMap<HookRuntime, number>();\n async function runLifecycle(\n runtime: HookRuntime,\n execution: PoHeadlessExecutionContext,\n eventName: string,\n event?: Readonly<Record<string, unknown>>,\n extraPayload?: Record<string, unknown>,\n ) {\n const key = `${STATUS_PREFIX}:${execution.sessionId}:${eventName}`;\n try {\n return await dispatchHooks(runtime.session, scopeFor(runtime, execution), {\n eventName,\n event: event as HookNativeEvent | undefined,\n extraPayload,\n progress: (index, total) =>\n execution.client.setStatus(key, `Running ${eventName} hooks (${index + 1}/${total})...`),\n });\n } finally {\n execution.client.setStatus(key, undefined);\n }\n }\n function start(\n runtime: HookRuntime,\n execution: PoHeadlessExecutionContext,\n event: Readonly<Record<string, unknown>> = { type: 'session_start' },\n ) {\n let startup = startups.get(runtime);\n if (!startup) {\n startup = (async () => {\n const scope = scopeFor(runtime, execution);\n await runtime.session.prepare(scope.isSubagent);\n if (scope.isSubagent) return;\n const result = await runLifecycle(runtime, execution, HOOK_EVENT.sessionStart, {\n ...event,\n type: 'session_start',\n });\n if (!runtime.isCurrent()) return;\n if (result.failures.length) await scope.sendMessage(hookFailureMessage(result.failures), 'steer');\n const context = additionalContextsFrom(result.decisions).join(CONTEXT_SEPARATOR);\n if (context) await scope.sendMessage(context, 'steer');\n })();\n startups.set(runtime, startup);\n }\n return startup;\n }\n const sessionStart: PoHeadlessHook<'session_start'> = {\n event: 'session_start',\n async handle(event, execution) {\n const runtime = resolveRuntime();\n if (runtime?.isCurrent()) await start(runtime, execution, event);\n },\n };\n const agentEnd: PoHeadlessHook<'agent_end'> = {\n event: 'agent_end',\n async handle(event, execution) {\n const runtime = resolveRuntime();\n if (!runtime?.isCurrent() || scopeFor(runtime, execution).isSubagent) return;\n await start(runtime, execution);\n const count = refusals.get(runtime) ?? 0;\n const result = await runLifecycle(\n runtime,\n execution,\n HOOK_EVENT.stop,\n { ...event, type: 'agent_settled' },\n { [STOP_HOOK_ACTIVE_FIELD]: count > 0 },\n );\n if (!runtime.isCurrent()) return;\n const appendFailure = async (text: string) => {\n if (!execution.session.appendMessage) throw new Error('The session cannot append hook diagnostics.');\n await execution.session.appendMessage({ type: FAILURE_MESSAGE_TYPE, text });\n };\n if (result.failures.length) await appendFailure(hookFailureMessage(result.failures));\n const reason = decisionReason(result.decisions.find(isDenied));\n if (!reason) {\n refusals.set(runtime, 0);\n return;\n }\n if (count >= MAX_STOP_REFUSALS) {\n refusals.set(runtime, 0);\n await appendFailure(\n `A Stop hook refused ${String(MAX_STOP_REFUSALS)} stops in a row, so the agent stops here. Its last reason: ${reason}`,\n );\n return;\n }\n // Advance only after successful admission. Admission does not await the successor turn.\n await scopeFor(runtime, execution).sendMessage(reason, 'followUp');\n refusals.set(runtime, count + 1);\n },\n };\n const beforeAgentStart: PoHeadlessHook<'before_agent_start'> = {\n event: 'before_agent_start',\n async handle(event, execution) {\n const runtime = resolveRuntime();\n if (runtime?.isCurrent()) await start(runtime, execution);\n await execution.session.appendCustomEntry('po-hook', hookEntry(event));\n },\n };\n const toolCall: PoHeadlessHook<'tool_call'> = {\n event: 'tool_call',\n async handle(event, execution) {\n const runtime = resolveRuntime();\n if (!runtime?.isCurrent()) return;\n const scope = scopeFor(runtime, execution);\n try {\n await start(runtime, execution);\n } catch (error) {\n return { block: { reason: error instanceof Error ? error.message : String(error) } };\n }\n const native = {\n type: 'tool_call',\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n input: event.args,\n } as ToolCallEvent;\n const key = `${STATUS_PREFIX}:${native.toolCallId}:pre`;\n try {\n const result = await dispatchHooks(runtime.session, scope, {\n eventName: HOOK_EVENT.preToolUse,\n event: native,\n progress: (index, total) =>\n execution.client.setStatus(key, `Running pre-tool hooks for ${native.toolName} (${index + 1}/${total})...`),\n });\n if (result.failures.length > 0) await scope.sendMessage(hookFailureMessage(result.failures), 'steer');\n return result.toolCall?.block\n ? { block: { reason: result.toolCall.reason ?? BLOCKED_BY_HOOK } }\n : { args: native.input };\n } finally {\n execution.client.setStatus(key, undefined);\n }\n },\n };\n const toolResult: PoHeadlessHook<'tool_result'> = {\n event: 'tool_result',\n async handle(event, execution) {\n await execution.session.appendCustomEntry('po-hook', hookEntry(event));\n const runtime = resolveRuntime();\n if (!runtime?.isCurrent()) return;\n await start(runtime, execution);\n const native = {\n type: 'tool_result',\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n input: event.args,\n content: event.content,\n details: event.details,\n isError: event.isError,\n } as ToolResultEvent;\n const key = `${STATUS_PREFIX}:${native.toolCallId}:post`;\n try {\n const result = await dispatchHooks(runtime.session, scopeFor(runtime, execution), {\n eventName: HOOK_EVENT.postToolUse,\n event: native,\n progress: (index, total) =>\n execution.client.setStatus(\n key,\n `Running post-tool hooks for ${native.toolName} (${index + 1}/${total})...`,\n ),\n });\n return result.toolResult;\n } finally {\n execution.client.setStatus(key, undefined);\n }\n },\n };\n const agentSettled: PoHeadlessHook<'agent_settled'> = {\n event: 'agent_settled',\n handle: (event, execution) => execution.session.appendCustomEntry('po-hook', hookEntry(event)),\n };\n const sessionShutdown: PoHeadlessHook<'session_shutdown'> = {\n event: 'session_shutdown',\n async handle(_event, execution) {\n const runtime = resolveRuntime();\n if (runtime?.isCurrent() && !scopeFor(runtime, execution).isSubagent) {\n let shutdown = shutdowns.get(runtime);\n if (!shutdown) {\n shutdown = runLifecycle(runtime, execution, HOOK_EVENT.sessionEnd).then(() => undefined);\n shutdowns.set(runtime, shutdown);\n }\n await shutdown;\n }\n execution.client.setStatus('po-hook', undefined);\n },\n };\n return { sessionStart, agentEnd, beforeAgentStart, toolCall, toolResult, agentSettled, sessionShutdown };\n}\n","import { PoHeadlessPromptAdmissionError } from '@agimon-ai/po-core/headless';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport { SUBAGENT_ENVIRONMENT_FLAG } from '../../../../../constants/hookHandlers';\nimport { createHookBinding } from '../../../../../services/hookRuntime';\nimport { createServerHooks } from '../../../../../services/serverHooks';\n\nexport const createHookServerRoot = ({ agent, signal }: PoServerPluginContext) => {\n if (!agent) throw new Error('Hook session requires the headless host.');\n const execution = agent.context;\n const binding = createHookBinding(\n {},\n {\n sessionId: execution.sessionId,\n isSubagent: Boolean(execution.environment[SUBAGENT_ENVIRONMENT_FLAG]),\n cwd: execution.cwd,\n repoRoot: execution.repoRoot,\n get model() {\n return execution.model;\n },\n async sendMessage(text, delivery) {\n if (!execution.session.admitPrompt)\n throw new PoHeadlessPromptAdmissionError('The session cannot admit a hook prompt.');\n await execution.session.admitPrompt(text, delivery);\n },\n appendCustomEntry: (type, data) => execution.session.appendCustomEntry(type, data),\n },\n signal,\n );\n return { value: createServerHooks(binding.runtime), services: [binding.plugin] };\n};\n\nexport type HookServerScope = Awaited<ReturnType<typeof createHookServerRoot>>['value'];\n","import { defineRoot } from '@agimon-ai/po-core/extensionFile';\n\nimport { createHookServerRoot } from './_lib/serverRoot';\n\nexport default defineRoot(createHookServerRoot);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport type { HookServerScope } from '../_lib/serverRoot';\n\nexport default defineHook(({ root }: WithRoot<PoServerPluginContext, HookServerScope>) => root.agentEnd);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport type { HookServerScope } from '../_lib/serverRoot';\n\nexport default defineHook(({ root }: WithRoot<PoServerPluginContext, HookServerScope>) => root.agentSettled);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport type { HookServerScope } from '../_lib/serverRoot';\n\nexport default defineHook(({ root }: WithRoot<PoServerPluginContext, HookServerScope>) => root.beforeAgentStart);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport type { HookServerScope } from '../_lib/serverRoot';\n\nexport default defineHook(({ root }: WithRoot<PoServerPluginContext, HookServerScope>) => root.sessionShutdown);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport type { HookServerScope } from '../_lib/serverRoot';\n\nexport default defineHook(({ root }: WithRoot<PoServerPluginContext, HookServerScope>) => root.sessionStart);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport type { HookServerScope } from '../_lib/serverRoot';\n\nexport default defineHook(({ root }: WithRoot<PoServerPluginContext, HookServerScope>) => root.toolCall);\n","import { defineHook, type WithRoot } from '@agimon-ai/po-core/extensionFile';\nimport type { PoServerPluginContext } from '@agimon-ai/po-core/serverPlugin';\n\nimport type { HookServerScope } from '../_lib/serverRoot';\n\nexport default defineHook(({ root }: WithRoot<PoServerPluginContext, HookServerScope>) => root.toolResult);\n","export const PACKAGE_SOURCE = '@agimon-ai/po-hook';\nexport const HOOK_HELP_SKILL = {\n name: 'po-author-hook',\n description:\n 'Author Po repository or plugin hooks. Use when creating or changing .po/hooks.yaml, selecting hook groups from modes.yaml, writing hook commands, or adapting Claude Code hook payloads and decisions to Po.',\n};\n","import { defineResource } from '@agimon-ai/po-core/extensionFile';\nimport { PO_HELP_WHEN } from '@agimon-ai/po-core/help';\nimport { packageResourcePath, readPackageResource } from '@agimon-ai/po-core/serverPlugin';\n\nimport { HOOK_HELP_SKILL } from '../../../../../constants/hook';\n\nexport default defineResource({\n ...HOOK_HELP_SKILL,\n when: PO_HELP_WHEN,\n kind: 'skill' as const,\n path: packageResourcePath(import.meta.url, 'src/prompts/po-author-hook/SKILL.md'),\n read: async () => {\n const text = await readPackageResource(import.meta.url, 'src/prompts/po-author-hook/SKILL.md');\n if (!text.trim()) throw new Error('The installed hook-authoring skill is missing or unreadable.');\n return text;\n },\n});\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineServerPlugin, type PoServerSessionPlugin } from '@agimon-ai/po-core/serverPlugin';\nimport { composeServerProviderOverrides } from '@agimon-ai/po-core/serverPlugin';\nimport { composeRootHooks, composeRootInjects } from '@agimon-ai/po-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport hookAgentEnd from '../src/extensions/workspaces/sessions/(backend)/hook/agent-end.server';\nimport hookAgentSettled from '../src/extensions/workspaces/sessions/(backend)/hook/agent-settled.server';\nimport hookBeforeAgentStart from '../src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.server';\nimport hookSessionShutdown from '../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server';\nimport hookSessionStart from '../src/extensions/workspaces/sessions/(backend)/hook/session-start.server';\nimport hookToolCall from '../src/extensions/workspaces/sessions/(backend)/hook/tool-call.server';\nimport hookToolResult from '../src/extensions/workspaces/sessions/(backend)/hook/tool-result.server';\nimport resourcePoAuthorHook from '../src/extensions/workspaces/sessions/(backend)/resource/po-author-hook.server';\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;\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const serverPlugin = defineServerPlugin({\n name: '@agimon-ai/po-hook',\n providerOverrides: composeServerProviderOverrides(rootSession),\n injects: composeRootInjects({ session: [rootSession] }),\n session: async (context) => {\n const scopeSession = await context.scopeRoot('session', rootSession, context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get hooks(): PoServerSessionPlugin['hooks'] { return [via({ event: 'agent_end' }, at(hookAgentEnd, contextSession)), via({ event: 'agent_settled' }, at(hookAgentSettled, contextSession)), via({ event: 'before_agent_start' }, at(hookBeforeAgentStart, contextSession)), via({ event: 'session_shutdown' }, at(hookSessionShutdown, contextSession)), via({ event: 'session_start' }, at(hookSessionStart, contextSession)), via({ event: 'tool_call' }, at(hookToolCall, contextSession)), via({ event: 'tool_result' }, at(hookToolResult, contextSession))]; },\n get resources(): PoServerSessionPlugin['resources'] { return [at(resourcePoAuthorHook, contextSession)]; },\n services: [...(scopeSession.services ?? [])],\n get activities(): PoServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default serverPlugin;\n"],"mappings":";;;;;;;;;AAAA,MAAa,gBAAgB;AAC7B,MAAa,uBAAuB;;AAepC,MAAa,yBAAyB;AAEtC,MAAa,4BAA4B;;;ACAzC,SAAS,OAAO,OAAgB,4BAAY,IAAI,IAAY,GAAY;CACtE,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW,OAAO;CACtF,IAAI,OAAO,UAAU,UAAU,OAAO,OAAO,SAAS,KAAK;CAC3D,IAAI,OAAO,UAAU,YAAY,UAAU,IAAI,KAAK,GAAG,OAAO;CAC9D,UAAU,IAAI,KAAK;CACnB,MAAM,SACH,MAAM,QAAQ,KAAK,KAAK,OAAO,eAAe,KAAK,MAAM,OAAO,cACjE,OAAO,OAAO,KAAK,CAAC,CAAC,OAAO,UAAU,OAAO,OAAO,SAAS,CAAC;CAChE,UAAU,OAAO,KAAK;CACtB,OAAO;AACT;AAEA,SAAS,eAAe,KAAmB,OAA6B;CACtE,OAAO;EACL,SAAS,IAAI,KAAK,WAAW,IAAI,KAAK;EACtC,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;EAC9D,QAAQ;CACV;AACF;;AAGA,eAAsB,cACpB,SACA,OACA,SAC6B;CAC7B,MAAM,SAAS,MAAM,kBAAkB,YAAY,IAAI,CAAC,MAAM,QAAQ,MAAM,eAAe,CAAC,IAAI,MAAM;CACtG,OAAO,eAAe;CACtB,MAAM,UAAU,QAAQ,OAAO,CAAC,CAAC;CACjC,MAAM,UAAU,MAAM,QAAQ,UAAU,QAAQ,QAAQ,WAAW;CACnE,MAAM,WACJ,QAAQ,cAAc,WAAW,aAC7B;EAAE,SAAS,CAAC;EAAG,SAAS,KAAA;CAAU,IAClC,MAAM,QAAQ,UAAU,SAAS,MAAM,QAAQ;CACrD,OAAO,eAAe;CACtB,MAAM,QAAQ,QAAQ;CACtB,MAAM,WAAW,SAAS,cAAc,QAAQ,MAAM,WAAW,KAAA;CACjE,MAAM,QAAQ,CACZ,GAAG,oBAAoB,SAAS,SAAS;EACvC,OAAO,QAAQ;EACf;EACA,eAAe,QAAQ;EACvB,YAAY,MAAM;CACpB,CAAC,GACD,GAAG,kBAAkB,QAAQ,WAAW,QAAQ,WAAW,QAAQ,CACrE;CACA,MAAM,YAA6C,CAAC;CACpD,MAAM,WAAW,CAAC,GAAI,SAAS,UAAU,CAAC,SAAS,OAAO,IAAI,CAAC,GAAI,GAAG,QAAQ,QAAQ;CACtF,IAAI;CACJ,IAAI,gBAAgB;CACpB,KAAK,MAAM,CAAC,OAAO,QAAQ,MAAM,QAAQ,GAAG;EAC1C,OAAO,eAAe;EACtB,QAAQ,WAAW,OAAO,MAAM,MAAM;EACtC,IAAI,IAAI,KAAK,YAAY,KAAA,GAAW;GAClC,IAAI,CAAC,OAAO;GACZ,IAAI;GACJ,IAAI;IACF,WAAW,gBAAgB,KAAK;GAClC,SAAS,OAAO;IACd,SAAS,KAAK,eAAe,KAAK,KAAK,CAAC;IACxC;GACF;GACA,MAAM,UAAU,MAAM,QAAQ,QAAQ,OAAO,KAAK,UAAU,OAAO,MAAM,eAAe;GACxF,OAAO,eAAe;GACtB,IAAI,QAAQ,SAAS;IACnB,SAAS,KAAK,QAAQ,OAAO;IAC7B;GACF;GAEA,IAAI;IACF,IAAI,MAAM,SAAS,eAAe,SAAS,SAAS,aAAa;KAC/D,IACE,OAAO,SAAS,UAAU,YAC1B,SAAS,UAAU,QACnB,MAAM,QAAQ,SAAS,KAAK,KAC5B,CAAC,OAAO,SAAS,KAAK,GAEtB,MAAM,IAAI,MAAM,wCAAwC;KAE1D,MAAM,QAAQ,gBAAgB,SAAS,KAAK;KAC5C,KAAK,MAAM,OAAO,OAAO,KAAK,MAAM,KAAK,GAAG,OAAQ,MAAM,MAAkC;KAC5F,OAAO,OAAO,MAAM,OAAO,KAAK;KAChC,IAAI,QAAQ,UAAU,WAAW,QAAQ,UAAU,QAAQ,OAAO,OAAO;MACvE,WAAW;OAAE,OAAO;OAAM,QAAQ,QAAQ,OAAO,UAAA;MAA0B;MAC3E;KACF;IACF,OAAO,IAAI,MAAM,SAAS,iBAAiB,QAAQ,QAAQ;KACzD,MAAM,QAAQ,gBAAgB,QAAQ,MAAM;KAC5C,IAAI,aAAa,SAAS,MAAM,YAAY,KAAA,GAAW,MAAM,UAAU,MAAM;KAC7E,IAAI,aAAa,OAAO,MAAM,UAAU,MAAM;KAC9C,IAAI,aAAa,SAAS,MAAM,YAAY,KAAA,GAAW,MAAM,UAAU,MAAM;KAC7E,gBAAgB;IAClB;GACF,SAAS,OAAO;IACd,SAAS,KAAK,eAAe,KAAK,KAAK,CAAC;GAC1C;GACA;EACF;EACA,MAAM,UACJ,SAAS,cAAc,QACnB,gBAAgB,OAAwB,QAAQ,WAAW,MAAM,UAAU,MAAM,WAAW;GAC1F,iBAAiB,MAAM;GACvB,OAAO,MAAM;EACf,CAAC,IACD,mBAAmB,MAAM,WAAW,MAAM,QAAQ;EAExD,IAAI;EACJ,IAAI;GACF,UAAU,MAAM,QAAQ,OAAO,IAC7B,IAAI,MACJ;IAAE,GAAG;IAAS,GAAG,QAAQ;GAAa,GACtC;IACE,UAAU,MAAM;IAChB,YAAY,IAAI;GAClB,CACF;EACF,SAAS,OAAO;GACd,SAAS,KAAK,eAAe,KAAK,KAAK,CAAC;GACxC;EACF;EACA,OAAO,eAAe;EACtB,IAAI,QAAQ,SAAS,SAAS,KAAK,QAAQ,OAAO;EAClD,IAAI,CAAC,QAAQ,UAAU;EACvB,UAAU,KAAK,QAAQ,QAAQ;EAC/B,IAAI,OAAO,SAAS,eAAe;GACjC,MAAM,WAAW,mBAAmB,CAAC,QAAQ,QAAQ,CAAC;GACtD,IAAI,SAAS,SAAS,GACpB,MAAM,UAAU,CAAC,GAAG,MAAM,SAAS;IAAE,MAAM;IAAQ,MAAM,SAAS,KAAA,MAAsB;GAAE,CAAC;GAC7F,IAAI,SAAS,QAAQ,QAAQ,GAAG,MAAM,UAAU;GAChD,kBAAkB,SAAS,SAAS,KAAK,SAAS,QAAQ,QAAQ;EACpE;EACA,IAAI,SAAS,QAAQ,QAAQ,GAAG;GAC9B,IAAI,OAAO,SAAS,aAClB,WAAW;IACT,OAAO;IACP,QAAQ,eAAe,QAAQ,QAAQ,KAAA;GACzC;GACF;EACF;CACF;CACA,IAAI,OAAO,SAAS,eAAe,CAAC,UAAU;EAC5C,MAAM,UAAU,uBAAuB,SAAS,CAAC,CAAC,KAAA,MAAsB;EACxE,IAAI,SAAS,WAAW;GAAE,OAAO;GAAM,QAAQ;EAAQ;CACzD;CACA,IAAI,OAAO,SAAS,iBAAiB,SAAS,SAAS,GAAG;EACxD,MAAM,UAAU,CAAC,GAAG,MAAM,SAAS;GAAE,MAAM;GAAQ,MAAM,mBAAmB,QAAQ;EAAE,CAAC;EACvF,gBAAgB;CAClB;CACA,OAAO;EACL;EACA;EACA,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;EAC/B,GAAI,OAAO,SAAS,iBAAiB,gBACjC,EACE,YAAY;GACV,SAAU,MAA0B;GACpC,SAAU,MAA0B;GACpC,SAAS,MAAM;EACjB,EACF,IACA,CAAC;CACP;AACF;;;AC3KA,MAAa,0BAA0B;;;ACUvC,SAAgB,kBACd,QACA,SACA,QACa;CAGb,IAAI,YAAY,QAAQ;CACxB,MAAM,yBAAyC,cAAc,oBAAoB;CACjF,MAAM,UAAU,kBAAkB,EAAE,YAAY,OAAO,CAAC,CAAC,QAAQ,YAAY,CAAC;CAC9E,MAAM,YAAY,QAAQ,aAAa,yBAAyB,EAAE,WAAW,iBAAiB,EAAE,CAAC;CACjG,IAAI;CACJ,OAAO;EACL;EACA;EACA;EACA,QAAQ,aAAa,OAAO;GAC1B,iBAAiB,YAAY;IAC3B,MAAM,UAAU,OAAO,CAAC,CAAC;IACzB,IAAI,QAAQ,UAAU,OAAO;IAC7B,MAAM,WAAW,MAAM,UAAU,SAAS,QAAQ,QAAQ,QAAQ,IAAI,CAAC;IAEvE,IAAI,SAAS,SAAS;IACtB,MAAM,UAAU,QAAQ,eAAe,KAAA,IAAY,KAAA,IAAY,IAAI,IAAI,QAAQ,UAAU;IACzF,MAAM,OAAO,SAAS,QACnB,QAAQ,QAAQ,IAAI,QAAQ,CAAC,WAAW,QAAQ,IAAI,IAAI,OAAO,CAAC,CAAC,CACjE,QAAQ,QAAQ,EAAE,cAAc,IAAI,eAAe;IACtD,MAAM,QAAQ,SAAS,IAAI;GAC7B,EAAA,CAAG;GACH,OAAO;EACT;EACA,QAAQ,QAAQ,UAAU,qBAAqB,EAAE,WAAW,iBAAiB,EAAE,CAAC;EAChF;CACF;AACF;AAEA,SAAS,cAAc,QAA0C;CAC/D,OAAO,EACL,KAAK,OAAO;EAEV,MAAM,SAAS,gBAAgB,OAAO,OAAO,CAAC;EAC9C,MAAM,aAAa,IAAI,gBAAgB;EACvC,MAAM,SAAS,YAAY,IAAI,CAAC,WAAW,QAAQ,MAAM,MAAM,CAAC;EAChE,MAAM,UAAU,wBAAwB,QAAQ;GAAE,QAAQ,OAAO;GAAQ,WAAW,OAAO;EAAU,GAAG,MAAM;EAC9G,IAAI;EACJ,MAAM,gBAA6B;GACjC,MAAM,YAAY,MAAM,UAAU;GAClC,IAAI,CAAC,WAAW,MAAM,IAAI,MAAM,4DAA4D;GAC5F,OAAO;IACL;IACA,iBAAiB,MAAM,QAAQ;IAC/B,OAAO,MAAM,QAAQ;IACrB,YAAY;IACZ,KAAK,MAAM,QAAQ;IACnB,UAAU,OAAO,QAAQ,QAAQ,MAAM,QAAQ;IAC/C;IACA,cAAc,MAAM,aAAa,MAAM,YAAY,MAAM,QAAQ;IACjE,oBAAoB,MAAM,SAAS,MAAM,kBAAkB,MAAM,IAAI;GACvE;EACF;EACA,OAAO;GACL,MAAM,WAAW,OAAO,WAAW;IACjC,MAAM,QAAQ,QAAQ,IAAI;IAC1B,MAAM,SAAS;KACb,MAAM;KACN,YAAY,MAAM;KAClB,UAAU,MAAM;KAChB,OAAO,MAAM;IACf;IACA,MAAM,SAAS,MAAM,cACnB,SACA;KAAE,GAAG,QAAQ;KAAG,iBAAiB,UAAU;IAAY,GACvD;KACE,WAAW,WAAW;KACtB,OAAO;IACT,CACF;IACA,IAAI,OAAO,SAAS,SAAS,GAAG,MAAM,MAAM,YAAY,mBAAmB,OAAO,QAAQ,GAAG,OAAO;IACpG,OAAO,OAAO,UAAU,QACpB,EAAE,OAAO,EAAE,QAAQ,OAAO,SAAS,UAAU,6BAA6B,EAAE,IAC5E,EAAE,MAAM,OAAO,MAAmC;GACxD;GACA,MAAM,UAAU,OAAO,WAAW;IAChC,MAAM,SAAS;KACb,MAAM;KACN,YAAY,MAAM;KAClB,UAAU,MAAM;KAChB,OAAO,MAAM;KACb,SAAS,MAAM;KACf,SAAS,MAAM;KACf,SAAS,MAAM;IACjB;IACA,MAAM,SAAS,MAAM,cACnB,SACA;KAAE,GAAG,QAAQ;KAAG,iBAAiB,UAAU;IAAY,GACvD;KACE,WAAW,WAAW;KACtB,OAAO;IACT,CACF;IACA,OAAO,OAAO,aACV;KACE,SAAS,OAAO,WAAW;KAC3B,SAAS,OAAO,WAAW;KAC3B,SAAS,OAAO,WAAW;IAC7B,IACA,KAAA;GACN;GACA,UAAU;IACR,cAAc,YAAY;KACxB,WAAW,MAAM;KACjB,MAAM,QAAQ,QAAQ,QAAQ;IAChC,EAAA,CAAG;IACH,OAAO;GACT;EACF;CACF,EACF;AACF;AAEA,SAAgB,kBACd,QACA,SACA,eACA,gBACoB;CACpB,MAAM,aAAa,IAAI,gBAAgB;CACvC,MAAM,SAAS,iBAAiB,YAAY,IAAI,CAAC,WAAW,QAAQ,cAAc,CAAC,IAAI,WAAW;CAClG,MAAM,UAAuB;EAC3B,GAAG,wBAAwB,uBAAuB,MAAM,GAAG,SAAS,MAAM;EAC1E;CACF;CACA,IAAI;CACJ,IAAI,SAAS;CACb,OAAO;EACL;EACA,YAAY,cAAc,OAAO;EACjC,iBAAiB,UAAU,CAAC,OAAO;EACnC,UAAU;GACR,SAAS;GACT,WAAW,MAAM;GACjB,aAAa,QAAQ,QAAQ,QAAQ;GACrC,OAAO;EACT;CACF;AACF;AAEA,SAAgB,kBACd,SACA,eACA,gBACa;CACb,IAAI;CACJ,OAAO;EACL,OAAO,QAAQ;GACb,OAAO,OAAO,CAAC,iBAAiB,IAAI,kBAAkB;IACpD,MAAM,UAAU,kBAAkB,eAAe,SAAS,eAAe,cAAc;IACvF,UAAU;IACV,cAAc,QAAQ,gCAAgC,QAAQ,UAAU;IACxE,cAAc,QAAQ,yBAAyB,OAAO;IACtD,OAAO,YAAY;KACjB,IAAI,YAAY,SAAS,UAAU,KAAA;KACnC,MAAM,QAAQ,QAAQ;IACxB;GACF,CAAC;EACH;EACA,eAAe;CACjB;AACF;;;ACpKA,SAAS,UAAU,OAAmE;CACpF,OAAO;EAAE,SAAS;EAAG,OAAO,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;EAAiB,MAAM;CAAM;AACzG;AAEA,SAAS,SAAS,SAAsB,WAA0D;CAChG,OAAO;EACL,WAAW,UAAU;EACrB,YAAY,QAAQ,UAAU,YAAY,0BAA0B;EACpE,KAAK,UAAU;EACf,UAAU,UAAU;EACpB,OAAO,UAAU;EACjB,QAAQ,QAAQ,QAAQ;EACxB,iBAAiB,UAAU;EAC3B,MAAM,YAAY,MAAM,UAAU;GAChC,IAAI,CAAC,UAAU,QAAQ,aACrB,MAAM,IAAI,+BAA+B,yCAAyC;GACpF,MAAM,UAAU,QAAQ,YAAY,MAAM,QAAQ;EACpD;EACA,oBAAoB,MAAM,SAAS,UAAU,QAAQ,kBAAkB,MAAM,IAAI;CACnF;AACF;;AAGA,SAAgB,kBAAkB,gBAAqC;CACrE,MAAM,2BAAW,IAAI,QAAoC;CACzD,MAAM,4BAAY,IAAI,QAAoC;CAC1D,MAAM,2BAAW,IAAI,QAA6B;CAClD,eAAe,aACb,SACA,WACA,WACA,OACA,cACA;EACA,MAAM,MAAM,GAAG,cAAc,GAAG,UAAU,UAAU,GAAG;EACvD,IAAI;GACF,OAAO,MAAM,cAAc,QAAQ,SAAS,SAAS,SAAS,SAAS,GAAG;IACxE;IACO;IACP;IACA,WAAW,OAAO,UAChB,UAAU,OAAO,UAAU,KAAK,WAAW,UAAU,UAAU,QAAQ,EAAE,GAAG,MAAM,KAAK;GAC3F,CAAC;EACH,UAAU;GACR,UAAU,OAAO,UAAU,KAAK,KAAA,CAAS;EAC3C;CACF;CACA,SAAS,MACP,SACA,WACA,QAA2C,EAAE,MAAM,gBAAgB,GACnE;EACA,IAAI,UAAU,SAAS,IAAI,OAAO;EAClC,IAAI,CAAC,SAAS;GACZ,WAAW,YAAY;IACrB,MAAM,QAAQ,SAAS,SAAS,SAAS;IACzC,MAAM,QAAQ,QAAQ,QAAQ,MAAM,UAAU;IAC9C,IAAI,MAAM,YAAY;IACtB,MAAM,SAAS,MAAM,aAAa,SAAS,WAAW,WAAW,cAAc;KAC7E,GAAG;KACH,MAAM;IACR,CAAC;IACD,IAAI,CAAC,QAAQ,UAAU,GAAG;IAC1B,IAAI,OAAO,SAAS,QAAQ,MAAM,MAAM,YAAY,mBAAmB,OAAO,QAAQ,GAAG,OAAO;IAChG,MAAM,UAAU,uBAAuB,OAAO,SAAS,CAAC,CAAC,KAAA,MAAsB;IAC/E,IAAI,SAAS,MAAM,MAAM,YAAY,SAAS,OAAO;GACvD,EAAA,CAAG;GACH,SAAS,IAAI,SAAS,OAAO;EAC/B;EACA,OAAO;CACT;CA2IA,OAAO;EAAE,cAAA;GAzIP,OAAO;GACP,MAAM,OAAO,OAAO,WAAW;IAC7B,MAAM,UAAU,eAAe;IAC/B,IAAI,SAAS,UAAU,GAAG,MAAM,MAAM,SAAS,WAAW,KAAK;GACjE;EAqIkB;EAAG,UAAA;GAlIrB,OAAO;GACP,MAAM,OAAO,OAAO,WAAW;IAC7B,MAAM,UAAU,eAAe;IAC/B,IAAI,CAAC,SAAS,UAAU,KAAK,SAAS,SAAS,SAAS,CAAC,CAAC,YAAY;IACtE,MAAM,MAAM,SAAS,SAAS;IAC9B,MAAM,QAAQ,SAAS,IAAI,OAAO,KAAK;IACvC,MAAM,SAAS,MAAM,aACnB,SACA,WACA,WAAW,MACX;KAAE,GAAG;KAAO,MAAM;IAAgB,GAClC,GAAG,yBAAyB,QAAQ,EAAE,CACxC;IACA,IAAI,CAAC,QAAQ,UAAU,GAAG;IAC1B,MAAM,gBAAgB,OAAO,SAAiB;KAC5C,IAAI,CAAC,UAAU,QAAQ,eAAe,MAAM,IAAI,MAAM,6CAA6C;KACnG,MAAM,UAAU,QAAQ,cAAc;MAAE,MAAM;MAAsB;KAAK,CAAC;IAC5E;IACA,IAAI,OAAO,SAAS,QAAQ,MAAM,cAAc,mBAAmB,OAAO,QAAQ,CAAC;IACnF,MAAM,SAAS,eAAe,OAAO,UAAU,KAAK,QAAQ,CAAC;IAC7D,IAAI,CAAC,QAAQ;KACX,SAAS,IAAI,SAAS,CAAC;KACvB;IACF;IACA,IAAI,SAAA,GAA4B;KAC9B,SAAS,IAAI,SAAS,CAAC;KACvB,MAAM,cACJ,uBAAuB,OAAA,CAAwB,EAAE,6DAA6D,QAChH;KACA;IACF;IAEA,MAAM,SAAS,SAAS,SAAS,CAAC,CAAC,YAAY,QAAQ,UAAU;IACjE,SAAS,IAAI,SAAS,QAAQ,CAAC;GACjC;EAgG4B;EAAG,kBAAA;GA7F/B,OAAO;GACP,MAAM,OAAO,OAAO,WAAW;IAC7B,MAAM,UAAU,eAAe;IAC/B,IAAI,SAAS,UAAU,GAAG,MAAM,MAAM,SAAS,SAAS;IACxD,MAAM,UAAU,QAAQ,kBAAkB,WAAW,UAAU,KAAK,CAAC;GACvE;EAwF8C;EAAG,UAAA;GArFjD,OAAO;GACP,MAAM,OAAO,OAAO,WAAW;IAC7B,MAAM,UAAU,eAAe;IAC/B,IAAI,CAAC,SAAS,UAAU,GAAG;IAC3B,MAAM,QAAQ,SAAS,SAAS,SAAS;IACzC,IAAI;KACF,MAAM,MAAM,SAAS,SAAS;IAChC,SAAS,OAAO;KACd,OAAO,EAAE,OAAO,EAAE,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,EAAE;IACrF;IACA,MAAM,SAAS;KACb,MAAM;KACN,YAAY,MAAM;KAClB,UAAU,MAAM;KAChB,OAAO,MAAM;IACf;IACA,MAAM,MAAM,GAAG,cAAc,GAAG,OAAO,WAAW;IAClD,IAAI;KACF,MAAM,SAAS,MAAM,cAAc,QAAQ,SAAS,OAAO;MACzD,WAAW,WAAW;MACtB,OAAO;MACP,WAAW,OAAO,UAChB,UAAU,OAAO,UAAU,KAAK,8BAA8B,OAAO,SAAS,IAAI,QAAQ,EAAE,GAAG,MAAM,KAAK;KAC9G,CAAC;KACD,IAAI,OAAO,SAAS,SAAS,GAAG,MAAM,MAAM,YAAY,mBAAmB,OAAO,QAAQ,GAAG,OAAO;KACpG,OAAO,OAAO,UAAU,QACpB,EAAE,OAAO,EAAE,QAAQ,OAAO,SAAS,UAAA,6BAA0B,EAAE,IAC/D,EAAE,MAAM,OAAO,MAAM;IAC3B,UAAU;KACR,UAAU,OAAO,UAAU,KAAK,KAAA,CAAS;IAC3C;GACF;EAsDwD;EAAG,YAAA;GAnD3D,OAAO;GACP,MAAM,OAAO,OAAO,WAAW;IAC7B,MAAM,UAAU,QAAQ,kBAAkB,WAAW,UAAU,KAAK,CAAC;IACrE,MAAM,UAAU,eAAe;IAC/B,IAAI,CAAC,SAAS,UAAU,GAAG;IAC3B,MAAM,MAAM,SAAS,SAAS;IAC9B,MAAM,SAAS;KACb,MAAM;KACN,YAAY,MAAM;KAClB,UAAU,MAAM;KAChB,OAAO,MAAM;KACb,SAAS,MAAM;KACf,SAAS,MAAM;KACf,SAAS,MAAM;IACjB;IACA,MAAM,MAAM,GAAG,cAAc,GAAG,OAAO,WAAW;IAClD,IAAI;KAUF,QAAO,MATc,cAAc,QAAQ,SAAS,SAAS,SAAS,SAAS,GAAG;MAChF,WAAW,WAAW;MACtB,OAAO;MACP,WAAW,OAAO,UAChB,UAAU,OAAO,UACf,KACA,+BAA+B,OAAO,SAAS,IAAI,QAAQ,EAAE,GAAG,MAAM,KACxE;KACJ,CAAC,EAAA,CACa;IAChB,UAAU;KACR,UAAU,OAAO,UAAU,KAAK,KAAA,CAAS;IAC3C;GACF;EAqBoE;EAAG,cAAA;GAlBvE,OAAO;GACP,SAAS,OAAO,cAAc,UAAU,QAAQ,kBAAkB,WAAW,UAAU,KAAK,CAAC;EAiBX;EAAG,iBAAA;GAdrF,OAAO;GACP,MAAM,OAAO,QAAQ,WAAW;IAC9B,MAAM,UAAU,eAAe;IAC/B,IAAI,SAAS,UAAU,KAAK,CAAC,SAAS,SAAS,SAAS,CAAC,CAAC,YAAY;KACpE,IAAI,WAAW,UAAU,IAAI,OAAO;KACpC,IAAI,CAAC,UAAU;MACb,WAAW,aAAa,SAAS,WAAW,WAAW,UAAU,CAAC,CAAC,WAAW,KAAA,CAAS;MACvF,UAAU,IAAI,SAAS,QAAQ;KACjC;KACA,MAAM;IACR;IACA,UAAU,OAAO,UAAU,WAAW,KAAA,CAAS;GACjD;EAEmG;CAAE;AACzG;;;AClOA,MAAa,wBAAwB,EAAE,OAAO,aAAoC;CAChF,IAAI,CAAC,OAAO,MAAM,IAAI,MAAM,0CAA0C;CACtE,MAAM,YAAY,MAAM;CACxB,MAAM,UAAU,kBACd,CAAC,GACD;EACE,WAAW,UAAU;EACrB,YAAY,QAAQ,UAAU,YAAY,0BAA0B;EACpE,KAAK,UAAU;EACf,UAAU,UAAU;EACpB,IAAI,QAAQ;GACV,OAAO,UAAU;EACnB;EACA,MAAM,YAAY,MAAM,UAAU;GAChC,IAAI,CAAC,UAAU,QAAQ,aACrB,MAAM,IAAI,+BAA+B,yCAAyC;GACpF,MAAM,UAAU,QAAQ,YAAY,MAAM,QAAQ;EACpD;EACA,oBAAoB,MAAM,SAAS,UAAU,QAAQ,kBAAkB,MAAM,IAAI;CACnF,GACA,MACF;CACA,OAAO;EAAE,OAAO,kBAAkB,QAAQ,OAAO;EAAG,UAAU,CAAC,QAAQ,MAAM;CAAE;AACjF;;;AC1BA,IAAA,sBAAe,WAAW,oBAAoB;;;ACC9C,IAAA,2BAAe,YAAY,EAAE,WAA6D,KAAK,QAAQ;;;ACAvG,IAAA,+BAAe,YAAY,EAAE,WAA6D,KAAK,YAAY;;;ACA3G,IAAA,oCAAe,YAAY,EAAE,WAA6D,KAAK,gBAAgB;;;ACA/G,IAAA,kCAAe,YAAY,EAAE,WAA6D,KAAK,eAAe;;;ACA9G,IAAA,+BAAe,YAAY,EAAE,WAA6D,KAAK,YAAY;;;ACA3G,IAAA,2BAAe,YAAY,EAAE,WAA6D,KAAK,QAAQ;;;ACAvG,IAAA,6BAAe,YAAY,EAAE,WAA6D,KAAK,UAAU;;;AECzG,IAAA,gCAAe,eAAe;CDJ5B,MAAM;CACN,aACE;CCIF,MAAM;CACN,MAAM;CACN,MAAM,oBAAoB,YAAY,KAAK,qCAAqC;CAChF,MAAM,YAAY;EAChB,MAAM,OAAO,MAAM,oBAAoB,YAAY,KAAK,qCAAqC;EAC7F,IAAI,CAAC,KAAK,KAAK,GAAG,MAAM,IAAI,MAAM,8DAA8D;EAChG,OAAO;CACT;AACF,CAAC;;;ACAD,MAAM,MAAY,OAA0B,YAC1C,OAAO,UAAU,aAAc,MAAwB,OAAO,IAAI;AACpE,MAAM,OAAU,UAAmC,UAChD,UAAU,KAAA,IAAY,KAAA,IAAY;CAAE,GAAG;CAAU,GAAI;AAAiB;AAEzE,MAAa,eAAe,mBAAmB;CAC7C,MAAM;CACN,mBAAmB,+BAA+BA,mBAAW;CAC7D,SAAS,mBAAmB,EAAE,SAAS,CAACA,mBAAW,EAAE,CAAC;CACtD,SAAS,OAAO,YAAY;EAC1B,MAAM,eAAe,MAAM,QAAQ,UAAU,WAAWA,qBAAa,OAAO;EAC5E,MAAM,iBAAiB;GAAE,GAAG;GAAS,MAAM,aAAa;EAAM;EAC9D,OAAO;GACL,GAAG,iBAAiB,YAAY;GAChC,IAAI,QAAwC;IAAE,OAAO;KAAC,IAAI,EAAE,OAAO,YAAY,GAAG,GAAGC,0BAAc,cAAc,CAAC;KAAG,IAAI,EAAE,OAAO,gBAAgB,GAAG,GAAGC,8BAAkB,cAAc,CAAC;KAAG,IAAI,EAAE,OAAO,qBAAqB,GAAG,GAAGC,mCAAsB,cAAc,CAAC;KAAG,IAAI,EAAE,OAAO,mBAAmB,GAAG,GAAGC,iCAAqB,cAAc,CAAC;KAAG,IAAI,EAAE,OAAO,gBAAgB,GAAG,GAAGC,8BAAkB,cAAc,CAAC;KAAG,IAAI,EAAE,OAAO,YAAY,GAAG,GAAGC,0BAAc,cAAc,CAAC;KAAG,IAAI,EAAE,OAAO,cAAc,GAAG,GAAGC,4BAAgB,cAAc,CAAC;IAAC;GAAG;GACniB,IAAI,YAAgD;IAAE,OAAO,CAAC,GAAGC,+BAAsB,cAAc,CAAC;GAAG;GACzG,UAAU,CAAC,GAAI,aAAa,YAAY,CAAC,CAAE;GAC3C,IAAI,aAAkD;IAAE,OAAO,CAAC,GAAI,aAAa,cAAc,CAAC,CAAE;GAAG;EACvG;CACF;AACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agimon-ai/po-hook",
|
|
3
|
-
"version": "0.0.0-alpha.
|
|
3
|
+
"version": "0.0.0-alpha.14",
|
|
4
4
|
"description": "Claude-Code-compatible repository and plugin hook runner for Po sessions.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -66,15 +66,15 @@
|
|
|
66
66
|
"access": "public"
|
|
67
67
|
},
|
|
68
68
|
"dependencies": {
|
|
69
|
-
"@agimon-ai/po-config": "0.0.0-alpha.
|
|
70
|
-
"@agimon-ai/po-core": "0.0.0-alpha.
|
|
71
|
-
"@agimon-ai/po-telemetry": "0.0.0-alpha.
|
|
72
|
-
"@deepseek-ai/cordis": "4.0.
|
|
69
|
+
"@agimon-ai/po-config": "0.0.0-alpha.14",
|
|
70
|
+
"@agimon-ai/po-core": "0.0.0-alpha.14",
|
|
71
|
+
"@agimon-ai/po-telemetry": "0.0.0-alpha.14",
|
|
72
|
+
"@deepseek-ai/cordis": "4.0.5",
|
|
73
73
|
"yaml": "2.9.1"
|
|
74
74
|
},
|
|
75
75
|
"devDependencies": {
|
|
76
|
-
"@agimon-ai/po-build": "0.0.0-alpha.
|
|
77
|
-
"@agimon-ai/vibe-lint-plugin-po-extension": "0.0.0-alpha.
|
|
76
|
+
"@agimon-ai/po-build": "0.0.0-alpha.14",
|
|
77
|
+
"@agimon-ai/vibe-lint-plugin-po-extension": "0.0.0-alpha.14",
|
|
78
78
|
"@earendil-works/pi-coding-agent": "1.3.0",
|
|
79
79
|
"@types/node": "26.6.5",
|
|
80
80
|
"@vitest/coverage-v8": "5.0.4",
|
|
@@ -109,7 +109,7 @@ Module `agent_settled` cannot implement command Stop continuation by returning a
|
|
|
109
109
|
|
|
110
110
|
## Ownership, sync, and failures
|
|
111
111
|
|
|
112
|
-
Terminal parents use Pi tool and lifecycle handlers. For headless parents, the Pi bridge owns `SessionStart`, `Stop`, and plugin `SessionEnd`; server
|
|
112
|
+
Terminal parents use Pi tool and lifecycle handlers. For headless parents, the Pi bridge owns `SessionStart`, `Stop`, and plugin `SessionEnd`; server plugins alone own tool dispatch. Lifecycle/tool paths share session module setup. Session-start readiness gates dependent turns/tools. Shutdown runs session-end once before disposal.
|
|
113
113
|
|
|
114
114
|
Native children in both adapters run only `PreToolUse` and `PostToolUse`, never lifecycle rows, regardless of `skipInSubagent`. Children have separate setup/state and retain their launch selection and compiled modules after parent reload/disposal.
|
|
115
115
|
|