@raidiant/notifai 10.1.7 → 11.0.1
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/CHANGELOG.md +42 -0
- package/README.md +23 -13
- package/dist/claude-wake.d.ts +1 -2
- package/dist/claude-wake.js +15 -61
- package/dist/claude-wake.js.map +1 -1
- package/dist/cli-bin.js +3 -14
- package/dist/cli-bin.js.map +1 -1
- package/dist/cli-contract.d.ts +12 -0
- package/dist/cli-contract.js +19 -0
- package/dist/cli-contract.js.map +1 -0
- package/dist/cli-release.d.ts +0 -1
- package/dist/cli-release.js +5 -21
- package/dist/cli-release.js.map +1 -1
- package/dist/client.d.ts +2 -2
- package/dist/codex-wake.d.ts +1 -1
- package/dist/codex-wake.js +8 -36
- package/dist/codex-wake.js.map +1 -1
- package/dist/command-session.js +2 -1
- package/dist/command-session.js.map +1 -1
- package/dist/commands-acknowledge.d.ts +13 -0
- package/dist/commands-acknowledge.js +67 -0
- package/dist/commands-acknowledge.js.map +1 -0
- package/dist/commands-ask.d.ts +63 -0
- package/dist/commands-ask.js +407 -0
- package/dist/commands-ask.js.map +1 -0
- package/dist/commands-close.d.ts +6 -0
- package/dist/commands-close.js +197 -0
- package/dist/commands-close.js.map +1 -0
- package/dist/commands-config.js +2 -2
- package/dist/commands-config.js.map +1 -1
- package/dist/commands-core.js +2 -2
- package/dist/commands-core.js.map +1 -1
- package/dist/commands-doctor.js +61 -120
- package/dist/commands-doctor.js.map +1 -1
- package/dist/commands-harness-context.d.ts +0 -1
- package/dist/commands-harness-context.js +2 -4
- package/dist/commands-harness-context.js.map +1 -1
- package/dist/commands-hook-diagnostics.d.ts +27 -0
- package/dist/commands-hook-diagnostics.js +97 -0
- package/dist/commands-hook-diagnostics.js.map +1 -0
- package/dist/commands-hook-install.d.ts +26 -0
- package/dist/commands-hook-install.js +549 -0
- package/dist/commands-hook-install.js.map +1 -0
- package/dist/commands-hook-run.d.ts +29 -0
- package/dist/commands-hook-run.js +517 -0
- package/dist/commands-hook-run.js.map +1 -0
- package/dist/commands-init.d.ts +2 -7
- package/dist/commands-init.js +59 -92
- package/dist/commands-init.js.map +1 -1
- package/dist/commands-send.js +35 -3
- package/dist/commands-send.js.map +1 -1
- package/dist/commands-skill.js +5 -5
- package/dist/commands-skill.js.map +1 -1
- package/dist/commands-update.js +17 -31
- package/dist/commands-update.js.map +1 -1
- package/dist/commands.d.ts +11 -6
- package/dist/commands.js +9 -4
- package/dist/commands.js.map +1 -1
- package/dist/config.d.ts +14 -4
- package/dist/config.js +35 -9
- package/dist/config.js.map +1 -1
- package/dist/file-lock.d.ts +3 -0
- package/dist/file-lock.js +33 -17
- package/dist/file-lock.js.map +1 -1
- package/dist/guidance-content.js +30 -15
- package/dist/guidance-content.js.map +1 -1
- package/dist/hook-acknowledgements.d.ts +42 -0
- package/dist/hook-acknowledgements.js +316 -0
- package/dist/hook-acknowledgements.js.map +1 -0
- package/dist/hook-events.d.ts +6 -0
- package/dist/hook-events.js +22 -0
- package/dist/hook-events.js.map +1 -0
- package/dist/hook-gates.d.ts +7 -0
- package/dist/hook-gates.js +21 -0
- package/dist/hook-gates.js.map +1 -0
- package/dist/hook-lifecycle.d.ts +93 -0
- package/dist/{hooks.js → hook-lifecycle.js} +61 -1359
- package/dist/hook-lifecycle.js.map +1 -0
- package/dist/hook-project-sessions.d.ts +28 -0
- package/dist/hook-project-sessions.js +141 -0
- package/dist/hook-project-sessions.js.map +1 -0
- package/dist/hook-question-lock.d.ts +7 -0
- package/dist/hook-question-lock.js +173 -0
- package/dist/hook-question-lock.js.map +1 -0
- package/dist/hook-question-retirement.d.ts +57 -0
- package/dist/hook-question-retirement.js +261 -0
- package/dist/hook-question-retirement.js.map +1 -0
- package/dist/hook-question-state.d.ts +45 -0
- package/dist/hook-question-state.js +196 -0
- package/dist/hook-question-state.js.map +1 -0
- package/dist/hook-session-state.d.ts +31 -0
- package/dist/hook-session-state.js +249 -0
- package/dist/hook-session-state.js.map +1 -0
- package/dist/{hooks.d.ts → hook-types.d.ts} +17 -236
- package/dist/hook-types.js +4 -0
- package/dist/hook-types.js.map +1 -0
- package/dist/install-hooks.d.ts +72 -60
- package/dist/install-hooks.js +292 -211
- package/dist/install-hooks.js.map +1 -1
- package/dist/interactive.d.ts +3 -16
- package/dist/interactive.js +19 -95
- package/dist/interactive.js.map +1 -1
- package/dist/local-path.d.ts +7 -0
- package/dist/local-path.js +27 -0
- package/dist/local-path.js.map +1 -0
- package/dist/node-floor.js +3 -10
- package/dist/node-floor.js.map +1 -1
- package/dist/npm-invocation.d.ts +34 -0
- package/dist/npm-invocation.js +53 -0
- package/dist/npm-invocation.js.map +1 -0
- package/dist/openclaw-plugin.d.ts +12 -3
- package/dist/openclaw-plugin.js +42 -16
- package/dist/openclaw-plugin.js.map +1 -1
- package/dist/opencode-plugin.d.ts +2 -2
- package/dist/opencode-plugin.js +4 -6
- package/dist/opencode-plugin.js.map +1 -1
- package/dist/program.js +11 -13
- package/dist/program.js.map +1 -1
- package/dist/project-enablement.d.ts +6 -0
- package/dist/project-enablement.js +11 -27
- package/dist/project-enablement.js.map +1 -1
- package/dist/question-settlement-process.d.ts +1 -1
- package/dist/readiness.d.ts +0 -2
- package/dist/readiness.js +0 -4
- package/dist/readiness.js.map +1 -1
- package/dist/send.d.ts +8 -4
- package/dist/send.js +145 -26
- package/dist/send.js.map +1 -1
- package/dist/session-activation.d.ts +3 -1
- package/dist/session-activation.js +16 -0
- package/dist/session-activation.js.map +1 -1
- package/dist/skill-source/manifest.json +4 -4
- package/dist/skill-source/notifai/SKILL.md +60 -60
- package/dist/skill-source/notifai/references/harness-setup.md +41 -16
- package/dist/ui/config-view.d.ts +0 -2
- package/dist/ui/config-view.js +1 -5
- package/dist/ui/config-view.js.map +1 -1
- package/dist/ui/theme.d.ts +0 -3
- package/dist/ui/theme.js +0 -1
- package/dist/ui/theme.js.map +1 -1
- package/dist/version.d.ts +22 -0
- package/dist/version.js +51 -0
- package/dist/version.js.map +1 -0
- package/dist/wake-support.d.ts +8 -0
- package/dist/wake-support.js +38 -0
- package/dist/wake-support.js.map +1 -0
- package/package.json +2 -2
- package/dist/cli-update-contract.d.ts +0 -7
- package/dist/cli-update-contract.js +0 -10
- package/dist/cli-update-contract.js.map +0 -1
- package/dist/commands-hooks.d.ts +0 -160
- package/dist/commands-hooks.js +0 -1800
- package/dist/commands-hooks.js.map +0 -1
- package/dist/hooks.js.map +0 -1
|
@@ -0,0 +1,549 @@
|
|
|
1
|
+
/** Hook installation and uninstallation across supported harnesses. */
|
|
2
|
+
import { existsSync, lstatSync, readFileSync, readdirSync, rmSync, rmdirSync } from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { atomicWriteFileSync } from './atomic-file.js';
|
|
5
|
+
import { EXIT } from './commands-core.js';
|
|
6
|
+
import { stopShapeProblems } from './commands-hook-shape.js';
|
|
7
|
+
import { withTargetFileLock } from './file-lock.js';
|
|
8
|
+
import { HARNESS_LABELS, HOOK_INSTALLABLE_HARNESSES, } from './harnesses.js';
|
|
9
|
+
import { installHookAdapter, isNpxAdapterTarget } from './hook-adapter.js';
|
|
10
|
+
import { HOOK_EVENTS, requiredHookEvents } from './hook-events.js';
|
|
11
|
+
import { NON_ROUTING_BLOCKING_STOP_TIMEOUT_SECONDS, applyPlan, buildCursorHookConfig, buildHookConfig, cleanupEmptiedCodexLayer, codexCoexistenceNotes, codexHomeNote, codexLegacyProjectLayers, codexMachineLayerPaths, codexRepresentationProblems, detectHarness, detectedHarnesses, findInstallations, findLegacyProjectInstallations, handlerEvent, loadCursorSettings, loadSettings, machineHookFiles, mergeCursorHooks, mergeHooks, removeCursorHooks, removeHooks, settingsFile, withCodexLayerTransaction, } from './install-hooks.js';
|
|
12
|
+
import { OPENCLAW_PLUGIN_MANIFEST, OPENCLAW_PLUGIN_PACKAGE, isOurOpenclawPlugin, mergeOpenclawNotifaiEntry, openclawConfigPath, openclawPluginManifest, openclawPluginPackage, openclawPluginSource, parseOpenclawConfig, removeOpenclawLoadPath, removeOpenclawNotifaiEntry, } from './openclaw-plugin.js';
|
|
13
|
+
import { isOurOpencodePlugin, opencodePluginSource } from './opencode-plugin.js';
|
|
14
|
+
import { packageVersion } from './release.js';
|
|
15
|
+
import { CLI_PACKAGE_NAME, cliPackageSpec } from './cli-contract.js';
|
|
16
|
+
import { activeNpmCli } from './npm-invocation.js';
|
|
17
|
+
/** True when this process is `npx` / `npm exec`, not a global or linked install. */
|
|
18
|
+
export function runningViaNpx(env, scriptPath) {
|
|
19
|
+
if (env['npm_command'] === 'exec')
|
|
20
|
+
return true;
|
|
21
|
+
return scriptPath.includes(`${path.sep}_npx${path.sep}`);
|
|
22
|
+
}
|
|
23
|
+
function fileHookInstallTarget(target) {
|
|
24
|
+
if (target === undefined || isNpxAdapterTarget(target))
|
|
25
|
+
return undefined;
|
|
26
|
+
return target;
|
|
27
|
+
}
|
|
28
|
+
function resolveHookAdapterTarget(deps, flags) {
|
|
29
|
+
if (deps.hookInstallTarget !== undefined && isNpxAdapterTarget(deps.hookInstallTarget)) {
|
|
30
|
+
return deps.hookInstallTarget;
|
|
31
|
+
}
|
|
32
|
+
const fileTarget = fileHookInstallTarget(deps.hookInstallTarget);
|
|
33
|
+
const execPath = flags.execPath ?? fileTarget?.execPath ?? process.execPath;
|
|
34
|
+
const scriptPath = flags.scriptPath ?? fileTarget?.scriptPath ?? process.argv[1] ?? 'notifai';
|
|
35
|
+
if (runningViaNpx(deps.env, scriptPath)) {
|
|
36
|
+
const version = packageVersion();
|
|
37
|
+
const npmCli = activeNpmCli(deps.env);
|
|
38
|
+
if (version === null) {
|
|
39
|
+
throw new Error(`Could not read this CLI version, so an npx hook target cannot be pinned. Install \`${CLI_PACKAGE_NAME}\` globally and rerun \`notifai hooks install\`.`);
|
|
40
|
+
}
|
|
41
|
+
if (npmCli === null) {
|
|
42
|
+
throw new Error(`This process looks like npx but npm_execpath is missing. Install \`${CLI_PACKAGE_NAME}\` globally and rerun \`notifai hooks install\`.`);
|
|
43
|
+
}
|
|
44
|
+
return { kind: 'npx', execPath, npmCli, spec: cliPackageSpec(version) };
|
|
45
|
+
}
|
|
46
|
+
return { execPath, scriptPath };
|
|
47
|
+
}
|
|
48
|
+
function printHooksInstallClose(deps, harness, file) {
|
|
49
|
+
const label = HARNESS_LABELS[harness];
|
|
50
|
+
const activation = harness === 'codex'
|
|
51
|
+
? 'Approve the Notifai handlers in `/hooks` if Codex asks, then start one fresh Codex session, send one prompt, and run `notifai doctor`.'
|
|
52
|
+
: harness === 'cursor'
|
|
53
|
+
? 'Start one fresh Cursor conversation, send one prompt, finish its first turn, then run `notifai doctor`.'
|
|
54
|
+
: harness === 'opencode'
|
|
55
|
+
? 'Restart OpenCode, start one fresh session, send one prompt, then run `notifai doctor`.'
|
|
56
|
+
: harness === 'openclaw'
|
|
57
|
+
? 'Restart the OpenClaw Gateway, start one fresh Agent Session, send one prompt, then run `notifai doctor`.'
|
|
58
|
+
: `Start one fresh ${label} session, send one prompt, then run \`notifai doctor\`.`;
|
|
59
|
+
if (deps.io.interactive === true && deps.io.note) {
|
|
60
|
+
void deps.io.note(`${file}\n${activation}`, `${label} hooks installed`);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
deps.io.out(`Installed ${harness} hooks in ${file}`);
|
|
64
|
+
deps.io.out(activation);
|
|
65
|
+
}
|
|
66
|
+
export function hooksInstallCommand(deps, flags) {
|
|
67
|
+
if (flags.harness === undefined) {
|
|
68
|
+
const detected = detectedHarnesses(deps.cwd, deps.env);
|
|
69
|
+
if (detected.length === 0) {
|
|
70
|
+
deps.io.err(`Could not tell which harness you mean — pass --harness <${HOOK_INSTALLABLE_HARNESSES.join('|')}>.`);
|
|
71
|
+
return EXIT.usage;
|
|
72
|
+
}
|
|
73
|
+
let ok = true;
|
|
74
|
+
for (const harness of detected) {
|
|
75
|
+
if (hooksInstallCommand(deps, { ...flags, harness }) !== EXIT.ok)
|
|
76
|
+
ok = false;
|
|
77
|
+
}
|
|
78
|
+
return ok ? EXIT.ok : EXIT.failed;
|
|
79
|
+
}
|
|
80
|
+
const harness = resolveHarness(deps, flags.harness);
|
|
81
|
+
if (!harness)
|
|
82
|
+
return EXIT.usage;
|
|
83
|
+
const adapterTarget = resolveHookAdapterTarget(deps, flags);
|
|
84
|
+
const scriptPath = flags.scriptPath ?? fileHookInstallTarget(adapterTarget)?.scriptPath ?? process.argv[1] ?? 'notifai';
|
|
85
|
+
const hookPlatform = deps.hookPlatform ?? process.platform;
|
|
86
|
+
const nodePath = adapterTarget.execPath;
|
|
87
|
+
let adapterPath;
|
|
88
|
+
try {
|
|
89
|
+
adapterPath = installHookAdapter(adapterTarget, deps.hookAdapterHome, hookPlatform).path;
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
deps.io.err(`Could not prepare the stable hook adapter: ${String(err)}`);
|
|
93
|
+
return EXIT.failed;
|
|
94
|
+
}
|
|
95
|
+
// Codex is the one harness whose layer holds two candidate files, so its
|
|
96
|
+
// transaction anchors on `config.toml` and the inspection names the target.
|
|
97
|
+
const codexPaths = harness === 'codex' ? codexMachineLayerPaths(deps.env, hookPlatform) : null;
|
|
98
|
+
const settingsTarget = codexPaths?.configToml ?? settingsFile(harness, deps.env, hookPlatform);
|
|
99
|
+
// OpenCode's adapter is a generated plugin module rather than a handler
|
|
100
|
+
// merged into a settings document, so it owns the whole file.
|
|
101
|
+
if (harness === 'opencode') {
|
|
102
|
+
return finishInstall(deps, harness, scriptPath, installOpencodePlugin(deps, settingsTarget, {
|
|
103
|
+
adapterPath,
|
|
104
|
+
timeoutSeconds: NON_ROUTING_BLOCKING_STOP_TIMEOUT_SECONDS,
|
|
105
|
+
platform: hookPlatform,
|
|
106
|
+
nodePath,
|
|
107
|
+
...(flags.narrate === undefined ? {} : { narrate: flags.narrate }),
|
|
108
|
+
}));
|
|
109
|
+
}
|
|
110
|
+
if (harness === 'openclaw') {
|
|
111
|
+
return finishInstall(deps, harness, scriptPath, installOpenclawPlugin(deps, settingsTarget, {
|
|
112
|
+
adapterPath,
|
|
113
|
+
timeoutSeconds: NON_ROUTING_BLOCKING_STOP_TIMEOUT_SECONDS,
|
|
114
|
+
platform: hookPlatform,
|
|
115
|
+
nodePath,
|
|
116
|
+
...(flags.narrate === undefined ? {} : { narrate: flags.narrate }),
|
|
117
|
+
}));
|
|
118
|
+
}
|
|
119
|
+
if (harness === 'cursor') {
|
|
120
|
+
try {
|
|
121
|
+
withTargetFileLock(settingsTarget, () => {
|
|
122
|
+
const document = loadCursorSettings(settingsTarget);
|
|
123
|
+
const result = mergeCursorHooks(document, buildCursorHookConfig({
|
|
124
|
+
adapterPath,
|
|
125
|
+
harness: 'cursor',
|
|
126
|
+
platform: hookPlatform,
|
|
127
|
+
nodePath,
|
|
128
|
+
}), scriptPath);
|
|
129
|
+
applyPlan(settingsTarget, result.document);
|
|
130
|
+
return result;
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
deps.io.err(String(err));
|
|
135
|
+
return EXIT.failed;
|
|
136
|
+
}
|
|
137
|
+
if (flags.narrate !== false)
|
|
138
|
+
printHooksInstallClose(deps, harness, settingsTarget);
|
|
139
|
+
return finishInstall(deps, harness, scriptPath, EXIT.ok);
|
|
140
|
+
}
|
|
141
|
+
const installInto = (file) => {
|
|
142
|
+
const document = loadSettings(file);
|
|
143
|
+
const foreignStopCount = foreignStopHandlers(document).length;
|
|
144
|
+
const result = mergeHooks(document, buildHookConfig({
|
|
145
|
+
adapterPath,
|
|
146
|
+
harness,
|
|
147
|
+
platform: hookPlatform,
|
|
148
|
+
nodePath,
|
|
149
|
+
}), scriptPath);
|
|
150
|
+
applyPlan(file, result.document);
|
|
151
|
+
return { file, foreignStopCount };
|
|
152
|
+
};
|
|
153
|
+
let installed;
|
|
154
|
+
try {
|
|
155
|
+
installed =
|
|
156
|
+
codexPaths === null
|
|
157
|
+
? withTargetFileLock(settingsTarget, () => installInto(settingsTarget))
|
|
158
|
+
: withCodexLayerTransaction(codexPaths, (inspection) => {
|
|
159
|
+
// Notifai's own handlers in the representation it is not writing
|
|
160
|
+
// are moved, not preserved: they are stripped here and rewritten
|
|
161
|
+
// into the target below, inside the same layer transaction.
|
|
162
|
+
const staleTarget = inspection.writeTarget === inspection.paths.hooksJson
|
|
163
|
+
? inspection.paths.configToml
|
|
164
|
+
: inspection.paths.hooksJson;
|
|
165
|
+
const staleEvents = staleTarget === inspection.paths.hooksJson
|
|
166
|
+
? inspection.ourJsonEvents
|
|
167
|
+
: inspection.ourTomlEvents;
|
|
168
|
+
if (staleEvents.length > 0) {
|
|
169
|
+
const staleDocument = loadSettings(staleTarget);
|
|
170
|
+
const stripped = removeHooks(staleDocument, scriptPath);
|
|
171
|
+
if (stripped.replaced.length > 0)
|
|
172
|
+
applyPlan(staleTarget, stripped.document);
|
|
173
|
+
}
|
|
174
|
+
return installInto(inspection.writeTarget);
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
deps.io.err(String(err));
|
|
179
|
+
return EXIT.failed;
|
|
180
|
+
}
|
|
181
|
+
if (flags.narrate !== false)
|
|
182
|
+
printHooksInstallClose(deps, harness, installed.file);
|
|
183
|
+
if (installed.foreignStopCount > 0) {
|
|
184
|
+
const label = HARNESS_LABELS[harness];
|
|
185
|
+
deps.io.out(`This layer already has a Stop handler that Notifai does not own. ${label} may run it alongside Notifai's handler; Notifai preserves it but has not assessed its behavior.`);
|
|
186
|
+
}
|
|
187
|
+
if (harness === 'codex') {
|
|
188
|
+
for (const problem of codexRepresentationProblems(deps.env, hookPlatform)) {
|
|
189
|
+
deps.io.out(problem);
|
|
190
|
+
}
|
|
191
|
+
for (const note of codexCoexistenceNotes(deps.env, hookPlatform)) {
|
|
192
|
+
deps.io.out(note);
|
|
193
|
+
}
|
|
194
|
+
const home = codexHomeNote(deps.env, hookPlatform);
|
|
195
|
+
if (home !== null)
|
|
196
|
+
deps.io.out(home);
|
|
197
|
+
}
|
|
198
|
+
return finishInstall(deps, harness, scriptPath, EXIT.ok);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Clear this Project's leftover Notifai wiring, once the Machine installation
|
|
202
|
+
* this run just wrote is proven current.
|
|
203
|
+
*
|
|
204
|
+
* Order matters and is the whole reason this is not part of the write above: a
|
|
205
|
+
* legacy Project handler is still routing questions until the Machine one can
|
|
206
|
+
* be shown to have every required event, a sound Stop shape, and no structural
|
|
207
|
+
* problem. Removing it first would leave a window with no working route, and
|
|
208
|
+
* removing it after a failed install would leave none at all.
|
|
209
|
+
*/
|
|
210
|
+
function finishInstall(deps, harness, scriptPath, code) {
|
|
211
|
+
if (code !== EXIT.ok)
|
|
212
|
+
return code;
|
|
213
|
+
if (!machineInstallationIsCurrent(deps, harness))
|
|
214
|
+
return code;
|
|
215
|
+
removeLegacyProjectInstallations(deps, harness, scriptPath);
|
|
216
|
+
return code;
|
|
217
|
+
}
|
|
218
|
+
/** Whether exactly one complete, undamaged Machine installation is in place. */
|
|
219
|
+
function machineInstallationIsCurrent(deps, harness) {
|
|
220
|
+
const installations = findInstallations(deps.env, deps.hookAdapterHome, deps.hookPlatform).filter((installation) => installation.harness === harness);
|
|
221
|
+
if (installations.length !== 1)
|
|
222
|
+
return false;
|
|
223
|
+
const installation = installations[0];
|
|
224
|
+
if ((installation.problems?.length ?? 0) > 0)
|
|
225
|
+
return false;
|
|
226
|
+
if (stopShapeProblems(installation, deps.hookPlatform).length > 0)
|
|
227
|
+
return false;
|
|
228
|
+
const installed = new Set(installation.handlers
|
|
229
|
+
.map((handler) => handlerEvent(handler.command))
|
|
230
|
+
.filter((event) => event !== null && HOOK_EVENTS.includes(event)));
|
|
231
|
+
return requiredHookEvents(harness).every((event) => installed.has(event));
|
|
232
|
+
}
|
|
233
|
+
function foreignStopHandlers(document) {
|
|
234
|
+
const groups = document.hooks?.['Stop'];
|
|
235
|
+
if (!Array.isArray(groups))
|
|
236
|
+
return [];
|
|
237
|
+
return groups
|
|
238
|
+
.flatMap((group) => group.hooks ?? [])
|
|
239
|
+
.filter((handler) => !/ hook (session-start|subagent-start|activation-stop|user-prompt-submit|stop|session-end)\b/.test(handler.command));
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Writes the OpenCode plugin, replacing any Notifai plugin already there —
|
|
243
|
+
* including one a different checkout wrote, matched on the managed marker for
|
|
244
|
+
* the same reason command hooks are.
|
|
245
|
+
*/
|
|
246
|
+
function installOpencodePlugin(deps, file, options) {
|
|
247
|
+
try {
|
|
248
|
+
withTargetFileLock(file, () => {
|
|
249
|
+
if (existsSync(file)) {
|
|
250
|
+
assertOwnedRegularFile(file);
|
|
251
|
+
const existing = readFileSync(file, 'utf8');
|
|
252
|
+
if (!isOurOpencodePlugin(existing)) {
|
|
253
|
+
throw new Error(`${file} exists and was not written by Notifai; move it aside first.`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
atomicWriteFileSync(file, opencodePluginSource(options), {
|
|
257
|
+
mode: 0o600,
|
|
258
|
+
preserveMode: false,
|
|
259
|
+
requireCurrentUserOwner: true,
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
catch (err) {
|
|
264
|
+
deps.io.err(String(err));
|
|
265
|
+
return EXIT.failed;
|
|
266
|
+
}
|
|
267
|
+
if (options.narrate !== false)
|
|
268
|
+
printHooksInstallClose(deps, 'opencode', file);
|
|
269
|
+
return EXIT.ok;
|
|
270
|
+
}
|
|
271
|
+
function installOpenclawPlugin(deps, file, options) {
|
|
272
|
+
const pluginDir = path.dirname(file);
|
|
273
|
+
try {
|
|
274
|
+
withTargetFileLock(file, () => {
|
|
275
|
+
if (existsSync(file)) {
|
|
276
|
+
assertOwnedRegularFile(file);
|
|
277
|
+
const existing = readFileSync(file, 'utf8');
|
|
278
|
+
if (!isOurOpenclawPlugin(existing)) {
|
|
279
|
+
throw new Error(`${file} exists and was not written by Notifai; move it aside first.`);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
atomicWriteFileSync(file, openclawPluginSource(options), {
|
|
283
|
+
mode: 0o600,
|
|
284
|
+
preserveMode: false,
|
|
285
|
+
requireCurrentUserOwner: true,
|
|
286
|
+
});
|
|
287
|
+
atomicWriteFileSync(path.join(pluginDir, OPENCLAW_PLUGIN_MANIFEST), openclawPluginManifest(), {
|
|
288
|
+
mode: 0o600,
|
|
289
|
+
preserveMode: false,
|
|
290
|
+
requireCurrentUserOwner: true,
|
|
291
|
+
});
|
|
292
|
+
atomicWriteFileSync(path.join(pluginDir, OPENCLAW_PLUGIN_PACKAGE), openclawPluginPackage(), {
|
|
293
|
+
mode: 0o600,
|
|
294
|
+
preserveMode: false,
|
|
295
|
+
requireCurrentUserOwner: true,
|
|
296
|
+
});
|
|
297
|
+
});
|
|
298
|
+
writeOpenclawEnablement(deps);
|
|
299
|
+
}
|
|
300
|
+
catch (err) {
|
|
301
|
+
deps.io.err(String(err));
|
|
302
|
+
return EXIT.failed;
|
|
303
|
+
}
|
|
304
|
+
if (options.narrate !== false)
|
|
305
|
+
printHooksInstallClose(deps, 'openclaw', file);
|
|
306
|
+
return EXIT.ok;
|
|
307
|
+
}
|
|
308
|
+
function writeOpenclawEnablement(deps) {
|
|
309
|
+
const configFile = openclawConfigPath(deps.env, deps.hookPlatform);
|
|
310
|
+
withTargetFileLock(configFile, () => {
|
|
311
|
+
let config = {};
|
|
312
|
+
if (existsSync(configFile)) {
|
|
313
|
+
assertOwnedRegularFile(configFile);
|
|
314
|
+
config = parseOpenclawConfig(readFileSync(configFile, 'utf8'));
|
|
315
|
+
}
|
|
316
|
+
const merged = mergeOpenclawNotifaiEntry(config);
|
|
317
|
+
atomicWriteFileSync(configFile, `${JSON.stringify(merged, null, 2)}\n`, {
|
|
318
|
+
mode: 0o600,
|
|
319
|
+
preserveMode: true,
|
|
320
|
+
requireCurrentUserOwner: true,
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Delete a Notifai-written plugin module and everything generated beside it.
|
|
326
|
+
*
|
|
327
|
+
* Returns what happened rather than narrating, because uninstall and migration
|
|
328
|
+
* cleanup say different things about the same outcome.
|
|
329
|
+
*/
|
|
330
|
+
function removeNotifaiPluginFile(harness, file) {
|
|
331
|
+
const pluginDir = path.dirname(file);
|
|
332
|
+
return withTargetFileLock(file, () => {
|
|
333
|
+
if (!existsSync(file))
|
|
334
|
+
return 'absent';
|
|
335
|
+
assertOwnedRegularFile(file);
|
|
336
|
+
const source = readFileSync(file, 'utf8');
|
|
337
|
+
// We own the whole file, but only if we wrote it.
|
|
338
|
+
const ours = harness === 'openclaw' ? isOurOpenclawPlugin(source) : isOurOpencodePlugin(source);
|
|
339
|
+
if (!ours)
|
|
340
|
+
return 'foreign';
|
|
341
|
+
rmSync(file, { force: true });
|
|
342
|
+
if (harness === 'openclaw') {
|
|
343
|
+
rmSync(path.join(pluginDir, OPENCLAW_PLUGIN_MANIFEST), { force: true });
|
|
344
|
+
rmSync(path.join(pluginDir, OPENCLAW_PLUGIN_PACKAGE), { force: true });
|
|
345
|
+
if (existsSync(pluginDir) && readdirSync(pluginDir).length === 0)
|
|
346
|
+
rmdirSync(pluginDir);
|
|
347
|
+
}
|
|
348
|
+
return 'removed';
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
/** Rewrite OpenClaw's config through one of the two entry-shaping helpers. */
|
|
352
|
+
function editOpenclawConfig(deps, edit) {
|
|
353
|
+
const configFile = openclawConfigPath(deps.env, deps.hookPlatform);
|
|
354
|
+
if (!existsSync(configFile))
|
|
355
|
+
return;
|
|
356
|
+
withTargetFileLock(configFile, () => {
|
|
357
|
+
assertOwnedRegularFile(configFile);
|
|
358
|
+
const config = parseOpenclawConfig(readFileSync(configFile, 'utf8'));
|
|
359
|
+
const next = edit(config);
|
|
360
|
+
if (next === config)
|
|
361
|
+
return;
|
|
362
|
+
atomicWriteFileSync(configFile, `${JSON.stringify(next, null, 2)}\n`, {
|
|
363
|
+
mode: 0o600,
|
|
364
|
+
preserveMode: true,
|
|
365
|
+
requireCurrentUserOwner: true,
|
|
366
|
+
});
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
/** Strip only Notifai's handlers from each settings document that exists. */
|
|
370
|
+
function stripNotifaiHandlers(files, scriptPath, cursor, locked) {
|
|
371
|
+
const existing = files.filter((candidate) => existsSync(candidate));
|
|
372
|
+
const removed = [];
|
|
373
|
+
for (const candidate of existing) {
|
|
374
|
+
const strip = () => {
|
|
375
|
+
const result = cursor
|
|
376
|
+
? removeCursorHooks(loadCursorSettings(candidate), scriptPath)
|
|
377
|
+
: removeHooks(loadSettings(candidate), scriptPath);
|
|
378
|
+
if (result.replaced.length > 0)
|
|
379
|
+
applyPlan(candidate, result.document);
|
|
380
|
+
return result;
|
|
381
|
+
};
|
|
382
|
+
const result = locked ? strip() : withTargetFileLock(candidate, strip);
|
|
383
|
+
if (result.replaced.length > 0)
|
|
384
|
+
removed.push({ file: candidate, events: result.replaced });
|
|
385
|
+
}
|
|
386
|
+
return { existing, removed };
|
|
387
|
+
}
|
|
388
|
+
export function hooksUninstallCommand(deps, flags) {
|
|
389
|
+
const harness = resolveHarness(deps, flags.harness);
|
|
390
|
+
if (!harness)
|
|
391
|
+
return EXIT.usage;
|
|
392
|
+
const scriptPath = flags.scriptPath ?? process.argv[1] ?? 'notifai';
|
|
393
|
+
const codexPaths = harness === 'codex' ? codexMachineLayerPaths(deps.env, deps.hookPlatform) : null;
|
|
394
|
+
const file = codexPaths?.configToml ?? settingsFile(harness, deps.env, deps.hookPlatform);
|
|
395
|
+
try {
|
|
396
|
+
if (harness === 'opencode' || harness === 'openclaw') {
|
|
397
|
+
const outcome = removeNotifaiPluginFile(harness, file);
|
|
398
|
+
if (outcome === 'removed') {
|
|
399
|
+
if (harness === 'openclaw') {
|
|
400
|
+
editOpenclawConfig(deps, (config) => removeOpenclawNotifaiEntry(config, path.dirname(file)));
|
|
401
|
+
}
|
|
402
|
+
deps.io.out(`Removed the Notifai ${HARNESS_LABELS[harness]} plugin at ${file}`);
|
|
403
|
+
}
|
|
404
|
+
else if (outcome === 'foreign') {
|
|
405
|
+
deps.io.out(`Left ${file} alone: Notifai did not write it.`);
|
|
406
|
+
}
|
|
407
|
+
else {
|
|
408
|
+
deps.io.out(`Nothing to remove: ${file} does not exist.`);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
else if (harness === 'cursor') {
|
|
412
|
+
const result = stripNotifaiHandlers([file], scriptPath, true, false);
|
|
413
|
+
if (result.existing.length === 0) {
|
|
414
|
+
deps.io.out(`Nothing to remove: ${file} does not exist.`);
|
|
415
|
+
}
|
|
416
|
+
else if (result.removed.length > 0) {
|
|
417
|
+
for (const entry of result.removed) {
|
|
418
|
+
deps.io.out(`Removed Notifai hooks (${entry.events.join(', ')}) from ${entry.file}`);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
else {
|
|
422
|
+
deps.io.out(`No Notifai hooks found in ${file}`);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
else {
|
|
426
|
+
const files = machineHookFiles(harness, deps.env, deps.hookPlatform);
|
|
427
|
+
const result = codexPaths === null
|
|
428
|
+
? stripNotifaiHandlers(files, scriptPath, false, false)
|
|
429
|
+
: withCodexLayerTransaction(codexPaths, (inspection) => {
|
|
430
|
+
const stripped = stripNotifaiHandlers(files, scriptPath, false, true);
|
|
431
|
+
cleanupEmptiedCodexLayer(inspection.paths);
|
|
432
|
+
return stripped;
|
|
433
|
+
});
|
|
434
|
+
if (result.existing.length === 0) {
|
|
435
|
+
deps.io.out(`Nothing to remove: ${file} does not exist.`);
|
|
436
|
+
}
|
|
437
|
+
else if (result.removed.length > 0) {
|
|
438
|
+
for (const entry of result.removed) {
|
|
439
|
+
deps.io.out(`Removed Notifai hooks (${entry.events.join(', ')}) from ${entry.file}`);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
else {
|
|
443
|
+
deps.io.out(`No Notifai hooks found in ${result.existing.join(', ')}`);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
catch (err) {
|
|
448
|
+
deps.io.err(String(err));
|
|
449
|
+
return EXIT.failed;
|
|
450
|
+
}
|
|
451
|
+
// Uninstall means no Notifai lifecycle wiring is left anywhere this Project
|
|
452
|
+
// can reach, not just in the one file the Machine installation used.
|
|
453
|
+
removeLegacyProjectInstallations(deps, harness, scriptPath);
|
|
454
|
+
return EXIT.ok;
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Remove Notifai's own Project-scoped definitions discoverable from this
|
|
458
|
+
* Project. Foreign handlers sharing those files are never touched, and a file
|
|
459
|
+
* Notifai did not write is never deleted.
|
|
460
|
+
*/
|
|
461
|
+
export function removeLegacyProjectInstallations(deps, harness, scriptPath) {
|
|
462
|
+
const legacy = findLegacyProjectInstallations(deps.cwd, deps.env, deps.hookAdapterHome, deps.hookPlatform).filter((installation) => installation.harness === harness);
|
|
463
|
+
if (legacy.length === 0)
|
|
464
|
+
return;
|
|
465
|
+
try {
|
|
466
|
+
if (harness === 'opencode' || harness === 'openclaw') {
|
|
467
|
+
for (const installation of legacy) {
|
|
468
|
+
if (removeNotifaiPluginFile(harness, installation.file) !== 'removed')
|
|
469
|
+
continue;
|
|
470
|
+
if (harness === 'openclaw') {
|
|
471
|
+
editOpenclawConfig(deps, (config) => removeOpenclawLoadPath(config, path.dirname(installation.file)));
|
|
472
|
+
}
|
|
473
|
+
deps.io.out(`Removed the leftover Project-scoped Notifai ${HARNESS_LABELS[harness]} plugin at ${installation.file}`);
|
|
474
|
+
}
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
477
|
+
const files = legacy.map((installation) => installation.file);
|
|
478
|
+
const result = stripNotifaiHandlers(files, scriptPath, harness === 'cursor', false);
|
|
479
|
+
for (const entry of result.removed) {
|
|
480
|
+
deps.io.out(`Removed leftover Project-scoped Notifai hooks (${entry.events.join(', ')}) from ${entry.file}`);
|
|
481
|
+
}
|
|
482
|
+
if (harness === 'codex') {
|
|
483
|
+
for (const paths of codexLegacyProjectLayers(deps.cwd))
|
|
484
|
+
cleanupEmptiedCodexLayer(paths);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
catch (err) {
|
|
488
|
+
deps.io.err(`Could not remove leftover Project-scoped ${harness} hooks: ${String(err)}`);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
function assertOwnedRegularFile(file) {
|
|
492
|
+
const stat = lstatSync(file);
|
|
493
|
+
if (stat.isSymbolicLink() || !stat.isFile()) {
|
|
494
|
+
throw new Error(`${file} is not a regular file; refusing to read or replace it.`);
|
|
495
|
+
}
|
|
496
|
+
const uid = typeof process.getuid === 'function' ? process.getuid() : undefined;
|
|
497
|
+
if (uid !== undefined && stat.uid !== uid) {
|
|
498
|
+
throw new Error(`${file} is owned by uid ${stat.uid}, not the current user.`);
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
function resolveHarness(deps, requested) {
|
|
502
|
+
if (requested !== undefined) {
|
|
503
|
+
if (HOOK_INSTALLABLE_HARNESSES.includes(requested))
|
|
504
|
+
return requested;
|
|
505
|
+
deps.io.err(`Unknown harness "${requested}". Supported: ${HOOK_INSTALLABLE_HARNESSES.join(', ')}.`);
|
|
506
|
+
return null;
|
|
507
|
+
}
|
|
508
|
+
const detected = detectHarness(deps.cwd, deps.env);
|
|
509
|
+
if (!detected) {
|
|
510
|
+
deps.io.err(`Could not tell which harness to install for — pass --harness <${HOOK_INSTALLABLE_HARNESSES.join('|')}>.`);
|
|
511
|
+
return null;
|
|
512
|
+
}
|
|
513
|
+
return detected;
|
|
514
|
+
}
|
|
515
|
+
/**
|
|
516
|
+
* Which harnesses to wire. An explicit `--harness` still wins as a singleton.
|
|
517
|
+
* Otherwise: every detected harness, or a human picker when detection is empty
|
|
518
|
+
* or names more than one.
|
|
519
|
+
*/
|
|
520
|
+
export async function pickHarnessesToInstall(deps, requested) {
|
|
521
|
+
if (requested !== undefined) {
|
|
522
|
+
const harness = resolveHarness(deps, requested);
|
|
523
|
+
return harness === null ? null : [harness];
|
|
524
|
+
}
|
|
525
|
+
const detected = detectedHarnesses(deps.cwd, deps.env);
|
|
526
|
+
if (detected.length === 1)
|
|
527
|
+
return detected;
|
|
528
|
+
if (deps.io.interactive === true && deps.io.multiselect) {
|
|
529
|
+
const picked = await deps.io.multiselect('Which agent harnesses should Notifai wire here?', HOOK_INSTALLABLE_HARNESSES.map((name) => ({
|
|
530
|
+
value: name,
|
|
531
|
+
label: HARNESS_LABELS[name],
|
|
532
|
+
...(detected.includes(name) ? { hint: 'detected on this machine' } : {}),
|
|
533
|
+
})), detected);
|
|
534
|
+
if (picked === null)
|
|
535
|
+
return null;
|
|
536
|
+
const unknown = picked.filter((name) => !HOOK_INSTALLABLE_HARNESSES.includes(name));
|
|
537
|
+
if (unknown.length > 0) {
|
|
538
|
+
deps.io.err(`Unknown harness "${unknown[0]}". Supported: ${HOOK_INSTALLABLE_HARNESSES.join(', ')}.`);
|
|
539
|
+
return null;
|
|
540
|
+
}
|
|
541
|
+
return picked;
|
|
542
|
+
}
|
|
543
|
+
if (detected.length === 0) {
|
|
544
|
+
deps.io.err(`Could not tell which harness to wire. Run: notifai hooks install --harness <${HOOK_INSTALLABLE_HARNESSES.join('|')}>`);
|
|
545
|
+
return null;
|
|
546
|
+
}
|
|
547
|
+
return detected;
|
|
548
|
+
}
|
|
549
|
+
//# sourceMappingURL=commands-hook-install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands-hook-install.js","sourceRoot":"","sources":["../src/commands-hook-install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type CommandDeps } from './commands-core.js';
|
|
2
|
+
import { type HookHarness } from './hook-types.js';
|
|
3
|
+
/** SessionEnd cleanup must precede every diagnostic that can wait on a file lock. */
|
|
4
|
+
export declare function hookDefersDiagnosticsUntilAfterCleanup(event: unknown): event is 'session-end';
|
|
5
|
+
/**
|
|
6
|
+
* Runs one harness hook. Contract with every harness: hook JSON arrives on
|
|
7
|
+
* stdin, harness output (if any) goes to stdout, diagnostics go to stderr, and
|
|
8
|
+
* exit 0 with no stdout means "no decision or added context — carry on as normal".
|
|
9
|
+
*
|
|
10
|
+
* Every failure path in here must reach that no-decision state. A hook that
|
|
11
|
+
* throws, or that blocks past the harness's timeout, degrades the agent for a
|
|
12
|
+
* feature the user only asked to make it more convenient.
|
|
13
|
+
*/
|
|
14
|
+
export declare function hookRunCommand(deps: CommandDeps, event: string, readStdin: () => Promise<string>, harness?: HookHarness): Promise<number>;
|
|
15
|
+
/**
|
|
16
|
+
* What went wrong, in terms of what to do about it.
|
|
17
|
+
*
|
|
18
|
+
* On 2026-08-03 a contract change shipped without the server deploy that goes
|
|
19
|
+
* with it. The CLI stamped `lifecycle` on every question draft, the deployed
|
|
20
|
+
* server rejected the unknown field, and escalation stopped working entirely —
|
|
21
|
+
* announced as "hook failed, deferring to the terminal", which reads like a
|
|
22
|
+
* flaky network. The information needed to diagnose it in one second was
|
|
23
|
+
* already in hand: a 422 whose details name the offending path. It was being
|
|
24
|
+
* thrown away by `String(err)`.
|
|
25
|
+
*
|
|
26
|
+
* A hook still exits 0 whatever this says. Handing the terminal back is always
|
|
27
|
+
* right; the only question is whether the user is told anything they can use.
|
|
28
|
+
*/
|
|
29
|
+
export declare function describeHookFailure(err: unknown): string[];
|