@raidiant/notifai 11.4.0-beta.2 → 11.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/CHANGELOG.md +9 -2
  2. package/dist/claude-wake.d.ts +11 -3
  3. package/dist/claude-wake.js +74 -67
  4. package/dist/claude-wake.js.map +1 -1
  5. package/dist/client.d.ts +23 -2
  6. package/dist/client.js +11 -5
  7. package/dist/client.js.map +1 -1
  8. package/dist/codex-wake.d.ts +12 -2
  9. package/dist/codex-wake.js +50 -13
  10. package/dist/codex-wake.js.map +1 -1
  11. package/dist/commands-acknowledge.d.ts +4 -2
  12. package/dist/commands-acknowledge.js +35 -4
  13. package/dist/commands-acknowledge.js.map +1 -1
  14. package/dist/commands-ask.js +2 -2
  15. package/dist/commands-ask.js.map +1 -1
  16. package/dist/commands-close.js +16 -4
  17. package/dist/commands-close.js.map +1 -1
  18. package/dist/commands-core.d.ts +6 -0
  19. package/dist/commands-core.js.map +1 -1
  20. package/dist/commands-doctor.js +46 -1
  21. package/dist/commands-doctor.js.map +1 -1
  22. package/dist/commands-hook-attend.d.ts +61 -0
  23. package/dist/commands-hook-attend.js +475 -0
  24. package/dist/commands-hook-attend.js.map +1 -0
  25. package/dist/commands-hook-diagnostics.js +2 -2
  26. package/dist/commands-hook-diagnostics.js.map +1 -1
  27. package/dist/commands-hook-install.js +1 -1
  28. package/dist/commands-hook-install.js.map +1 -1
  29. package/dist/commands-hook-run.js +59 -2
  30. package/dist/commands-hook-run.js.map +1 -1
  31. package/dist/commands-send.js +6 -1
  32. package/dist/commands-send.js.map +1 -1
  33. package/dist/guidance-content.js +9 -35
  34. package/dist/guidance-content.js.map +1 -1
  35. package/dist/hook-acknowledgements.d.ts +25 -5
  36. package/dist/hook-acknowledgements.js +102 -45
  37. package/dist/hook-acknowledgements.js.map +1 -1
  38. package/dist/hook-events.d.ts +26 -1
  39. package/dist/hook-events.js +38 -2
  40. package/dist/hook-events.js.map +1 -1
  41. package/dist/hook-lifecycle.d.ts +6 -0
  42. package/dist/hook-lifecycle.js +297 -26
  43. package/dist/hook-lifecycle.js.map +1 -1
  44. package/dist/hook-question-lock.d.ts +18 -0
  45. package/dist/hook-question-lock.js +80 -57
  46. package/dist/hook-question-lock.js.map +1 -1
  47. package/dist/hook-question-retirement.d.ts +10 -2
  48. package/dist/hook-question-retirement.js +21 -4
  49. package/dist/hook-question-retirement.js.map +1 -1
  50. package/dist/hook-session-state.d.ts +90 -1
  51. package/dist/hook-session-state.js +201 -9
  52. package/dist/hook-session-state.js.map +1 -1
  53. package/dist/hook-types.d.ts +50 -2
  54. package/dist/injection-render.d.ts +36 -0
  55. package/dist/injection-render.js +61 -0
  56. package/dist/injection-render.js.map +1 -0
  57. package/dist/install-hooks.d.ts +14 -0
  58. package/dist/install-hooks.js +47 -2
  59. package/dist/install-hooks.js.map +1 -1
  60. package/dist/logging.d.ts +1 -1
  61. package/dist/logging.js +12 -0
  62. package/dist/logging.js.map +1 -1
  63. package/dist/process-identity.d.ts +26 -0
  64. package/dist/process-identity.js +82 -0
  65. package/dist/process-identity.js.map +1 -0
  66. package/dist/program.js +6 -6
  67. package/dist/program.js.map +1 -1
  68. package/dist/session-attendant-probe.d.ts +74 -0
  69. package/dist/session-attendant-probe.js +131 -0
  70. package/dist/session-attendant-probe.js.map +1 -0
  71. package/dist/session-attendant-state.d.ts +53 -0
  72. package/dist/session-attendant-state.js +175 -0
  73. package/dist/session-attendant-state.js.map +1 -0
  74. package/dist/session-attendant.d.ts +135 -0
  75. package/dist/session-attendant.js +493 -0
  76. package/dist/session-attendant.js.map +1 -0
  77. package/dist/session-delivery.d.ts +214 -0
  78. package/dist/session-delivery.js +560 -0
  79. package/dist/session-delivery.js.map +1 -0
  80. package/dist/session-handoff.d.ts +98 -0
  81. package/dist/session-handoff.js +118 -0
  82. package/dist/session-handoff.js.map +1 -0
  83. package/dist/session-message-handoff.d.ts +35 -0
  84. package/dist/session-message-handoff.js +99 -0
  85. package/dist/session-message-handoff.js.map +1 -0
  86. package/dist/skill-source/manifest.json +20 -4
  87. package/dist/skill-source/notifai/SKILL.md +19 -57
  88. package/dist/skill-source/notifai/references/diagnostics.md +31 -0
  89. package/dist/skill-source/notifai/references/harness-setup.md +3 -0
  90. package/dist/skill-source/notifai/references/notes-and-edits.md +38 -0
  91. package/dist/skill-source/notifai/references/send-details.md +14 -0
  92. package/dist/skill-source/notifai/references/writing-examples.md +56 -0
  93. package/dist/wake-support.d.ts +33 -1
  94. package/dist/wake-support.js +65 -8
  95. package/dist/wake-support.js.map +1 -1
  96. package/package.json +2 -2
@@ -0,0 +1,475 @@
1
+ /**
2
+ * `notifai hook attend`: the asynchronous handler that becomes an Agent
3
+ * Session's Session Attendant, or exits within milliseconds when a healthy
4
+ * attendant for this exact session incarnation already runs.
5
+ *
6
+ * Installed on SessionStart next to the short activation handler (which it
7
+ * never delays: the harness does not wait for an async handler), and on
8
+ * UserPromptSubmit and Stop to re-arm a session whose attendant died.
9
+ */
10
+ import { existsSync, readFileSync } from 'node:fs';
11
+ import path from 'node:path';
12
+ import { EXIT, makeClient } from './commands-core.js';
13
+ import { claudeSessionPid } from './commands-harness-context.js';
14
+ import { loadConfig } from './config.js';
15
+ import { inspectHookAdapter, isNpxAdapterTarget } from './hook-adapter.js';
16
+ import { acquireClaimFile, claimHolderMayRun, readClaimFile, releaseClaimFile } from './hook-question-lock.js';
17
+ import { beginSessionIncarnation, endsIncarnation, readSessionEndMarker, readSessionIncarnation, refreshSessionMarkers, rotateSessionIncarnation, sessionNotified, } from './hook-session-state.js';
18
+ import { findInstallations, findLegacyProjectInstallations, handlerEvent } from './install-hooks.js';
19
+ import { logSettingsFrom } from './logging.js';
20
+ import { processExecutableName, processStartTime } from './process-identity.js';
21
+ import { projectBinding, projectEnabled } from './project-enablement.js';
22
+ import { packageVersion } from './release.js';
23
+ import { runSessionAttendant, systemAttendantClock, } from './session-attendant.js';
24
+ import { attendantSupport, claudeAttendanceProbe, codexAttendanceProbe, systemClaudeProbeAdapters, } from './session-attendant-probe.js';
25
+ import { attendantClaimPath, attendantStatusPath, readAttendantHeldLease, readTurnActivity, recordTurnEnd, recordTurnStart, turnActivityPath, writeAttendantStatus, } from './session-attendant-state.js';
26
+ import { CLI_PACKAGE_NAME } from './cli-contract.js';
27
+ import { inspectClaudeInbox, systemClaudeWakeAdapters } from './claude-wake.js';
28
+ import { currentProcessIdentity } from './process-identity.js';
29
+ import { inspectCodexQueue, systemCodexWakeAdapters } from './codex-wake.js';
30
+ import { claudeSourceDescriptor, deliverIntoClaudeSession, deliverIntoCodexThread } from './session-handoff.js';
31
+ import { handOffSessionMessages } from './session-message-handoff.js';
32
+ import { compareVersions } from './version.js';
33
+ const SUPERSEDED_OWNER_WAIT_MS = 6_000;
34
+ /**
35
+ * Bound on Codex SessionEnd's `ended` report. Codex allows SessionEnd at most
36
+ * three seconds, and the CLI's own start and durable cleanup come first.
37
+ */
38
+ export const CODEX_SESSION_END_REPORT_MS = 1_000;
39
+ export async function attendHook(deps, input) {
40
+ const { envelope, harness, cwd, logger } = input;
41
+ const seams = deps.attendant ?? {};
42
+ const end = (outcome, data = {}) => {
43
+ logger.info('hook.end', { hook: 'attend', outcome, decided: false, ...data });
44
+ return EXIT.ok;
45
+ };
46
+ // Read once, now: an in-place reinstall replaces the manifest on disk, and
47
+ // rereading it later would compare the installed files with themselves.
48
+ const runningVersion = deps.runningVersion === undefined ? packageVersion() : deps.runningVersion;
49
+ const sessionId = envelope.session_id;
50
+ if (sessionId === undefined)
51
+ return end('ignored', { reason: 'missing-session-id' });
52
+ const support = attendantSupport(harness, deps.hookPlatform ?? process.platform);
53
+ if (!support.supported)
54
+ return end('unsupported', { reason: support.reason });
55
+ const starting = envelope.hook_event_name === 'SessionStart' || envelope.source !== undefined;
56
+ const claimFile = attendantClaimPath(sessionId, deps.env);
57
+ // Codex has no session descriptor: its activity is this thread's own turn
58
+ // boundaries. The synchronous prompt hook records each start in order; the
59
+ // turn-end and interrupt copies record ends here, before anything else.
60
+ if (harness === 'codex')
61
+ recordCodexTurnEnd(envelope, sessionId, deps.env);
62
+ // Codex allows Interrupt three seconds: that copy records the turn's end and
63
+ // never becomes the attendant.
64
+ if (envelope.hook_event_name === 'Interrupt')
65
+ return end('recorded');
66
+ // The hook adapter names the harness process that ran it. Claude Code also
67
+ // names itself; Codex is only ever the declared parent.
68
+ const pid = harness === 'codex' ? declaredHookSourcePid(deps.env) : declaredHookSourcePid(deps.env) ?? claudeSessionPid(deps.env);
69
+ if (pid === undefined)
70
+ return end('ignored', { reason: 'harness-process-unproven' });
71
+ if (!starting) {
72
+ // Re-arm fast path, before any configuration or gate work: this runs on
73
+ // every prompt and every turn end, and almost always finds its owner.
74
+ const current = readSessionIncarnation(sessionId, deps.env);
75
+ const holder = readClaimFile(claimFile);
76
+ if (current !== null &&
77
+ current.harness_process?.pid === (seams.harnessProcess?.pid ?? pid) &&
78
+ holder?.['incarnation'] === current.incarnation &&
79
+ claimHolderMayRun(holder)) {
80
+ return end('owner-present', { same_incarnation: true, holder_alive: true });
81
+ }
82
+ }
83
+ const gates = seams.gates ?? (() => attendantGates(deps, cwd, sessionId, harness, runningVersion));
84
+ try {
85
+ const config = loadConfig({ cwd, env: deps.env, sessionId });
86
+ logger.adopt(logSettingsFrom(config));
87
+ logger.bind({ project: config.project.value });
88
+ }
89
+ catch {
90
+ // The gate below reports enablement it cannot read.
91
+ }
92
+ const gate = gates();
93
+ if (!gate.ok)
94
+ return end('ignored', { reason: gate.reason });
95
+ // Codex runs a hook through `$SHELL -lc`. bash and zsh exec the adapter, so
96
+ // its parent is Codex; a shell that does not would be named instead and
97
+ // outlive a crashed Codex. Only the Codex executable itself is proof.
98
+ if (seams.harnessProcess === undefined && harness === 'codex' && processExecutableName(pid) !== 'codex') {
99
+ return end('ignored', { reason: 'harness-process-not-codex' });
100
+ }
101
+ const harnessProcess = seams.harnessProcess ?? (() => {
102
+ const start = processStartTime(pid);
103
+ return start === null ? null : { pid, start };
104
+ })();
105
+ if (harnessProcess === null)
106
+ return end('ignored', { reason: 'harness-process-unproven' });
107
+ const clock = seams.clock ?? systemAttendantClock;
108
+ let record = await withLockRetry(clock, () => beginSessionIncarnation(sessionId, deps.env, {
109
+ stamp: input.invokedAt,
110
+ harnessProcess,
111
+ clearEarlierEnd: starting,
112
+ }));
113
+ // One live attendant per session. A holder serving an older incarnation of
114
+ // this session (an in-process resume moments after a clear) steps aside
115
+ // within one probe; a holder serving this one is healthy, so this exits.
116
+ const waitUntil = clock.monotonic() + (seams.supersededOwnerWaitMs ?? SUPERSEDED_OWNER_WAIT_MS);
117
+ let token = null;
118
+ while (true) {
119
+ token = acquireClaimFile(claimFile, { incarnation: record.incarnation }, clock.wall());
120
+ if (token !== null)
121
+ break;
122
+ const holder = readClaimFile(claimFile);
123
+ if (holder?.['incarnation'] === record.incarnation || clock.monotonic() >= waitUntil) {
124
+ return end('owner-present', {
125
+ same_incarnation: holder?.['incarnation'] === record.incarnation,
126
+ holder_alive: claimHolderMayRun(holder),
127
+ });
128
+ }
129
+ await clock.sleep(250, new AbortController().signal).catch(() => undefined);
130
+ record = readSessionIncarnation(sessionId, deps.env) ?? record;
131
+ }
132
+ logger.info('hook.end', {
133
+ hook: 'attend',
134
+ outcome: 'attending',
135
+ decided: false,
136
+ source: envelope.source ?? envelope.hook_event_name ?? null,
137
+ });
138
+ const served = record;
139
+ const probeAdapters = seams.probeAdapters ?? systemClaudeProbeAdapters(deps.env);
140
+ // SessionEnd names the incarnation it ended; an end of any other one,
141
+ // earlier or later, is not this attendant's.
142
+ const endedByHook = () => endsIncarnation(readSessionEndMarker(sessionId, deps.env), served);
143
+ const probe = harness === 'codex'
144
+ ? codexAttendanceProbe({
145
+ harness: harnessProcess,
146
+ endedByHook,
147
+ activity: () => readTurnActivity(sessionId, deps.env, served.key),
148
+ adapters: probeAdapters,
149
+ })
150
+ : claudeAttendanceProbe({ sessionId, harness: harnessProcess, endedByHook, adapters: probeAdapters });
151
+ let client;
152
+ const connect = () => {
153
+ if (client !== undefined)
154
+ return client;
155
+ const credential = deps.store.load();
156
+ client = credential
157
+ ? makeClient(deps, credential.baseUrl, `Bearer nfm_${credential.machineId}.${credential.secret}`)
158
+ : null;
159
+ return client;
160
+ };
161
+ const messages = sessionMessageWriter({
162
+ deps,
163
+ harness: harness,
164
+ sessionId,
165
+ cwd: envelope.cwd ?? cwd,
166
+ harnessPid: harnessProcess.pid,
167
+ writer: seams.writer === undefined ? currentProcessIdentity() : seams.writer,
168
+ clock,
169
+ logger,
170
+ });
171
+ const signals = seams.signalled === undefined ? terminationSignal() : null;
172
+ try {
173
+ const result = await runSessionAttendant({
174
+ sessionId,
175
+ incarnation: record.incarnation,
176
+ incarnationNow: () => readSessionIncarnation(sessionId, deps.env)?.incarnation ?? null,
177
+ rotateIncarnation: (expected) => {
178
+ const next = rotateSessionIncarnation(sessionId, deps.env, expected);
179
+ if (next === null)
180
+ return null;
181
+ // Keep the claim naming the incarnation it serves.
182
+ releaseClaimFile(claimFile, token);
183
+ token = acquireClaimFile(claimFile, { incarnation: next.incarnation }, clock.wall());
184
+ return token === null ? null : next.incarnation;
185
+ },
186
+ probe,
187
+ // A claim that vanished or changed hands fences this attendant: another
188
+ // may already serve the same incarnation.
189
+ claimHeld: () => token !== null && readClaimFile(claimFile)?.['token'] === token,
190
+ notified: () => sessionNotified(sessionId, deps.env),
191
+ gates,
192
+ client: connect,
193
+ serverSupportsAttendance: async (api) => (await api.compatibility()).server_capabilities.includes('session_attendance'),
194
+ // The service accepts notes for this session only while an attendant
195
+ // that can hand them in place says so.
196
+ acceptsMessages: messages !== null,
197
+ ...(messages === null
198
+ ? {}
199
+ : {
200
+ onMessages: async (batch, attendant) => {
201
+ const api = connect();
202
+ return api === null ? 'done' : messages(api, batch, attendant);
203
+ },
204
+ }),
205
+ clock,
206
+ logger,
207
+ writeStatus: (status) => writeAttendantStatus(sessionId, deps.env, status),
208
+ heartbeat: () => refreshSessionMarkers(sessionId, deps.env, clock.wall(), [
209
+ claimFile,
210
+ attendantStatusPath(sessionId, deps.env),
211
+ turnActivityPath(sessionId, deps.env),
212
+ ]),
213
+ signalled: seams.signalled ?? signals.promise,
214
+ ...(seams.probeIntervalMs === undefined ? {} : { probeIntervalMs: seams.probeIntervalMs }),
215
+ ...(seams.waitSeconds === undefined ? {} : { waitSeconds: seams.waitSeconds }),
216
+ });
217
+ seams.onExit?.(result);
218
+ }
219
+ finally {
220
+ signals?.dispose();
221
+ if (token !== null)
222
+ releaseClaimFile(claimFile, token);
223
+ }
224
+ return EXIT.ok;
225
+ }
226
+ /**
227
+ * The attendant's Session Message writer, or null when this session cannot
228
+ * take a message in place: for Claude Code no inbox socket (`--bare`, an older
229
+ * Claude Code, an unsupported protocol), for Codex no thread id, and for
230
+ * either no provable writer identity. Null keeps the attendant presence-only,
231
+ * and the service accepts no notes for the session.
232
+ */
233
+ function sessionMessageWriter(input) {
234
+ const { deps, sessionId, harnessPid, writer, clock, logger } = input;
235
+ if (writer === null)
236
+ return null;
237
+ const sequencerFor = (client) => ({
238
+ sessionId,
239
+ env: deps.env,
240
+ client,
241
+ monotonic: () => clock.monotonic(),
242
+ wall: () => clock.wall(),
243
+ sleep: (milliseconds) => clock.sleep(milliseconds, new AbortController().signal),
244
+ writer,
245
+ log: logger,
246
+ });
247
+ if (input.harness === 'codex')
248
+ return codexMessageWriter({ deps, sessionId, cwd: input.cwd, logger, sequencerFor });
249
+ const adapters = deps.claudeWake ?? systemClaudeWakeAdapters(deps.env);
250
+ const inbox = inspectClaudeInbox({
251
+ pid: harnessPid,
252
+ platform: deps.hookPlatform ?? process.platform,
253
+ readDescriptor: adapters.readDescriptor,
254
+ socketExists: existsSync,
255
+ });
256
+ if (inbox.state !== 'ready') {
257
+ logger.info('attendant.state', { messages: 'unavailable', reason: inbox.reason });
258
+ return null;
259
+ }
260
+ return (client, batch, attendant) => handOffSessionMessages(batch, attendant, {
261
+ sequencer: sequencerFor(client),
262
+ write: (text, begin, guard) => deliverIntoClaudeSession({
263
+ sessionId,
264
+ sourcePid: harnessPid,
265
+ // Read at each write: the probe keeps proving this harness hosts the
266
+ // session, and Claude Code rewrites its descriptor as it runs.
267
+ sourceDescriptor: claudeSourceDescriptor(sessionId, harnessPid, adapters),
268
+ adapters,
269
+ text,
270
+ begin,
271
+ guard,
272
+ // Resident: the attendant outlives the ancestry check without waiting.
273
+ holdAfterSend: false,
274
+ writer: 'Session Attendant',
275
+ }),
276
+ });
277
+ }
278
+ /**
279
+ * Codex takes a Session Message through the thread's own durable inbox: the
280
+ * `codex queue` writer runs as a subprocess in its own process group, so it is
281
+ * journaled as a subprocess write and its group recorded the moment it exists.
282
+ * The attendant lives only while Codex keeps this thread loaded, and a loaded
283
+ * thread starts a turn for a queued message whether it was idle or working.
284
+ */
285
+ function codexMessageWriter(input) {
286
+ const { deps, sessionId, cwd, logger } = input;
287
+ const queue = inspectCodexQueue(sessionId, deps.env);
288
+ if (queue.state !== 'ready') {
289
+ logger.info('attendant.state', { messages: 'unavailable', reason: queue.reason });
290
+ return null;
291
+ }
292
+ const adapters = deps.codexWake ?? systemCodexWakeAdapters(deps.env);
293
+ if (adapters.available?.() === false) {
294
+ // A queue writer that cannot start would leave every note unconfirmed.
295
+ logger.info('attendant.state', { messages: 'unavailable', reason: 'codex-executable-not-found' });
296
+ return null;
297
+ }
298
+ return (client, batch, attendant) => handOffSessionMessages(batch, attendant, {
299
+ sequencer: input.sequencerFor(client),
300
+ write: (text, begin, guard, writerGroup) => deliverIntoCodexThread({
301
+ threadId: queue.threadId,
302
+ cwd,
303
+ env: deps.env,
304
+ adapters,
305
+ text,
306
+ begin: () => begin('subprocess'),
307
+ guard,
308
+ onSpawn: writerGroup,
309
+ }),
310
+ });
311
+ }
312
+ /** Record the Codex turn this turn end or interrupt closes. */
313
+ function recordCodexTurnEnd(envelope, sessionId, env) {
314
+ const turnId = envelope.turn_id;
315
+ const event = envelope.hook_event_name;
316
+ if (typeof turnId !== 'string' || turnId === '' || (event !== 'Stop' && event !== 'Interrupt'))
317
+ return;
318
+ try {
319
+ recordTurnEnd(sessionId, env, turnId);
320
+ }
321
+ catch {
322
+ // Activity is a hint; a busy lock never costs the session its attendant.
323
+ }
324
+ }
325
+ /**
326
+ * Record the Codex turn this prompt starts. Called from the synchronous
327
+ * UserPromptSubmit hook: Codex runs it before the turn and one turn at a time,
328
+ * which is what orders recorded starts. Never throws.
329
+ */
330
+ export function recordCodexTurnStart(envelope, env) {
331
+ const sessionId = envelope.session_id;
332
+ const turnId = envelope.turn_id;
333
+ if (sessionId === undefined || typeof turnId !== 'string' || turnId === '')
334
+ return;
335
+ try {
336
+ const current = readSessionIncarnation(sessionId, env);
337
+ if (current !== null)
338
+ recordTurnStart(sessionId, env, current.key, turnId);
339
+ }
340
+ catch {
341
+ // Activity is a hint; it never delays or fails the User's prompt.
342
+ }
343
+ }
344
+ /**
345
+ * Re-checked before every exchange: the User-owned Project Enablement, and
346
+ * the installed CLI/hook contract. Hooks removed or replaced by a build that
347
+ * does not attend, or an installed CLI older than this attendant, withdraw it.
348
+ */
349
+ export function attendantGates(deps, cwd, sessionId, harness, runningVersion) {
350
+ try {
351
+ const config = loadConfig({ cwd, env: deps.env, sessionId });
352
+ if (!projectEnabled(projectBinding(cwd, deps.env, config.project.value))) {
353
+ return { ok: false, reason: 'project-disabled' };
354
+ }
355
+ }
356
+ catch {
357
+ return { ok: false, reason: 'enablement-unavailable' };
358
+ }
359
+ // The handler that started this attendant lives in the Machine layer, or in
360
+ // a Project layer an older build wrote; either keeps the contract in place.
361
+ const attendInstalled = [
362
+ ...findInstallations(deps.env, deps.hookAdapterHome, deps.hookPlatform),
363
+ ...findLegacyProjectInstallations(cwd, deps.env, deps.hookAdapterHome, deps.hookPlatform),
364
+ ]
365
+ .filter((installation) => installation.harness === harness)
366
+ .some((installation) => installation.handlers.some((handler) => handlerEvent(handler.command) === 'attend'));
367
+ if (!attendInstalled)
368
+ return { ok: false, reason: 'attend-handler-removed' };
369
+ // Fail closed: an installed contract this attendant cannot establish is not
370
+ // one it may keep attending under.
371
+ const installed = installedCliVersion(inspectHookAdapter(deps.hookAdapterHome, deps.hookPlatform).target);
372
+ if (runningVersion === null || installed === null)
373
+ return { ok: false, reason: 'cli-contract-unknown' };
374
+ const order = compareVersions(installed, runningVersion);
375
+ if (order === 'unparseable')
376
+ return { ok: false, reason: 'cli-contract-unknown' };
377
+ if (order === 'before')
378
+ return { ok: false, reason: 'cli-downgraded' };
379
+ return { ok: true };
380
+ }
381
+ function installedCliVersion(target) {
382
+ if (target === null)
383
+ return null;
384
+ if (isNpxAdapterTarget(target)) {
385
+ // Installers pin npx targets to an exact version: `@raidiant/notifai@1.2.3`.
386
+ const prefix = `${CLI_PACKAGE_NAME}@`;
387
+ return target.spec.startsWith(prefix) ? target.spec.slice(prefix.length) : null;
388
+ }
389
+ try {
390
+ const manifest = path.join(path.dirname(target.scriptPath), '..', 'package.json');
391
+ const parsed = JSON.parse(readFileSync(manifest, 'utf8'));
392
+ return typeof parsed.version === 'string' ? parsed.version : null;
393
+ }
394
+ catch {
395
+ return null;
396
+ }
397
+ }
398
+ /**
399
+ * The session-state lock is shared with the synchronous activation handler
400
+ * running beside this one. This handler is asynchronous and nobody waits on
401
+ * it, so it outlasts a busy moment instead of giving the session up.
402
+ */
403
+ async function withLockRetry(clock, action) {
404
+ for (let attempt = 1;; attempt += 1) {
405
+ try {
406
+ return action();
407
+ }
408
+ catch (err) {
409
+ if (attempt >= 8 || !(err instanceof Error) || !err.message.startsWith('timed out waiting for file lock')) {
410
+ throw err;
411
+ }
412
+ await clock.sleep(250 * attempt, new AbortController().signal);
413
+ }
414
+ }
415
+ }
416
+ function declaredHookSourcePid(env) {
417
+ const value = Number(env['NOTIFAI_HOOK_SOURCE_PID']);
418
+ return Number.isInteger(value) && value > 0 ? value : undefined;
419
+ }
420
+ /**
421
+ * Terminal close reaches the attendant as SIGTERM with no SessionEnd; treat
422
+ * any termination signal as "ending, report once".
423
+ */
424
+ function terminationSignal() {
425
+ const signals = ['SIGTERM', 'SIGHUP', 'SIGINT'];
426
+ let resolve;
427
+ const promise = new Promise((done) => {
428
+ resolve = done;
429
+ });
430
+ const onSignal = () => resolve();
431
+ for (const signal of signals)
432
+ process.on(signal, onSignal);
433
+ return {
434
+ promise,
435
+ dispose: () => {
436
+ for (const signal of signals)
437
+ process.off(signal, onSignal);
438
+ },
439
+ };
440
+ }
441
+ /**
442
+ * Codex's SessionEnd reports the attended session `ended`.
443
+ *
444
+ * On Codex the attendant cannot: Codex SIGKILLs every unfinished async hook's
445
+ * process group the moment SessionEnd returns, before the attendant's next
446
+ * probe could see the end marker. SessionEnd therefore ends the lease the live
447
+ * attendant holds, with that lease's own incarnation and generation, so the
448
+ * service fences it exactly as the attendant's own report would. Without a
449
+ * held lease there is nothing to end; a failed report leaves the lease to
450
+ * lapse, and presence reads out of reach.
451
+ */
452
+ export async function reportCodexSessionEnded(deps, sessionId) {
453
+ const lease = readAttendantHeldLease(sessionId, deps.env);
454
+ if (lease === null)
455
+ return 'no-lease';
456
+ const credential = deps.store.load();
457
+ if (!credential)
458
+ return 'not-paired';
459
+ const client = makeClient(deps, credential.baseUrl, `Bearer nfm_${credential.machineId}.${credential.secret}`, {
460
+ timeoutMs: CODEX_SESSION_END_REPORT_MS,
461
+ });
462
+ const bound = new AbortController();
463
+ const timer = setTimeout(() => bound.abort(), CODEX_SESSION_END_REPORT_MS);
464
+ try {
465
+ await client.attend(sessionId, { incarnation: lease.incarnation, generation: lease.generation, state: 'ended' }, { waitSeconds: 0, signal: bound.signal });
466
+ return 'reported';
467
+ }
468
+ catch {
469
+ return 'failed';
470
+ }
471
+ finally {
472
+ clearTimeout(timer);
473
+ }
474
+ }
475
+ //# sourceMappingURL=commands-hook-attend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands-hook-attend.js","sourceRoot":"","sources":["../src/commands-hook-attend.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ import { HERMES_QUESTION_ROUTING_UNAVAILABLE, isHookInstallableHarness, question
6
6
  import { inspectHookAdapter } from './hook-adapter.js';
7
7
  import { HOOK_EVENTS } from './hook-events.js';
8
8
  import { readSessionState } from './hook-session-state.js';
9
- import { codexStopDefinitionFingerprint, codexTrustProblems, handlerEvent, } from './install-hooks.js';
9
+ import { codexStopDefinitionFingerprint, codexRoutingTrustProblems, handlerEvent, } from './install-hooks.js';
10
10
  export const CODEX_HOOK_APPROVAL_USER_ACTION = {
11
11
  code: 'codex_hook_approval_required',
12
12
  harness: 'codex',
@@ -58,7 +58,7 @@ export function activeQuestionRouteProblems(deps, active, installations) {
58
58
  }
59
59
  for (const installation of matching)
60
60
  problems.push(...stopShapeProblems(installation, deps.hookPlatform));
61
- problems.push(...codexTrustProblems(matching, deps.env));
61
+ problems.push(...codexRoutingTrustProblems(matching, deps.env));
62
62
  if (active.harness === 'codex' && active.sessionId !== undefined) {
63
63
  const state = readSessionState(active.sessionId, deps.env);
64
64
  const currentFingerprint = codexStopDefinitionFingerprint(matching);
@@ -1 +1 @@
1
- {"version":3,"file":"commands-hook-diagnostics.js","sourceRoot":"","sources":["../src/commands-hook-diagnostics.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,OAAO,EAAoB,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAA6B,MAAM,+BAA+B,CAAA;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EACL,mCAAmC,EACnC,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EACL,8BAA8B,EAC9B,kBAAkB,EAClB,YAAY,GAEb,MAAM,oBAAoB,CAAA;AAC3B,MAAM,CAAC,MAAM,+BAA+B,GAAG;IAC7C,IAAI,EAAE,8BAA8B;IACpC,OAAO,EAAE,OAAO;IAChB,MAAM,EAAE,iCAAiC;IACzC,OAAO,EAAE,+IAA+I;CAChJ,CAAA;AAEV,MAAM,CAAC,MAAM,+BAA+B,GAAG;IAC7C,IAAI,EAAE,8BAA8B;IACpC,OAAO,EAAE,OAAO;IAChB,MAAM,EAAE,2BAA2B;IACnC,OAAO,EAAE,gFAAgF;CACjF,CAAA;AAEV,MAAM,CAAC,MAAM,mCAAmC,GAC9C,wOAAwO,CAAA;AAE1O,MAAM,CAAC,MAAM,0CAA0C,GACrD,kIAAkI,CAAA;AAEpI;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CACzC,IAAiB,EACjB,MAA4B,EAC5B,aAA6B;IAE7B,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACnC,QAAQ,CAAC,IAAI,CACX,cAAc,MAAM,CAAC,KAAK,+JAA+J,CAC1L,CAAA;IACH,CAAC;IACD,MAAM,UAAU,GAAG,wBAAwB,CAAC,MAAM,CAAC,OAAO,CAAC;QACzD,CAAC,CAAC,yBAAyB,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC;QAClF,CAAC,CAAC,mCAAmC,CAAA;IACvC,IAAI,UAAU,CAAC,gBAAgB,KAAK,aAAa,EAAE,CAAC;QAClD,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,KAAK,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAA;IAClE,CAAC;IACD,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CACnC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,CAC1D,CAAA;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,QAAQ,CAAC,IAAI,CACX,GAAG,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,4BAA4B,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,qCAAqC,CAClJ,CAAA;IACH,CAAC;IACD,KAAK,MAAM,YAAY,IAAI,QAAQ,EAAE,CAAC;QACpC,KAAK,MAAM,OAAO,IAAI,YAAY,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;YAClD,QAAQ,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC,CAAA;QACnD,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;YAC5C,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;YAC3C,IAAI,KAAK,KAAK,IAAI,IAAI,CAAE,WAAiC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1E,QAAQ,CAAC,IAAI,CACX,GAAG,OAAO,CAAC,KAAK,OAAO,YAAY,CAAC,IAAI,gCAAgC,KAAK,mBAAmB,MAAM,CAAC,KAAK,QAAQ,CACrH,CAAA;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,kBAAkB,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC3F,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACxB,CAAC;IACD,KAAK,MAAM,YAAY,IAAI,QAAQ;QAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAA;IACzG,QAAQ,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IACxD,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACjE,MAAM,KAAK,GAAG,gBAAgB,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;QAC1D,MAAM,kBAAkB,GAAG,8BAA8B,CAAC,QAAQ,CAAC,CAAA;QACnE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;YAC9D,QAAQ,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAA;QAC3D,CAAC;aAAM,IACL,kBAAkB,KAAK,SAAS;YAChC,KAAK,CAAC,OAAO,KAAK,OAAO;YACzB,KAAK,CAAC,iCAAiC,KAAK,kBAAkB,EAC9D,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAA;QACpD,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;AAC/B,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,oBAAoB,CAAC,aAA6B;IAChE,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAA;IACpF,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAA;IACjG,CAAC;IACD,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CACT,yGAAyG,CAC1G,CAAA;IACH,CAAC;IACD,IAAI,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CACT,kKAAkK,CACnK,CAAA;IACH,CAAC;IACD,IAAI,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CACT,0IAA0I,CAC3I,CAAA;IACH,CAAC;IACD,IAAI,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CACT,mJAAmJ,CACpJ,CAAA;IACH,CAAC;IACD,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAA;AAChC,CAAC"}
1
+ {"version":3,"file":"commands-hook-diagnostics.js","sourceRoot":"","sources":["../src/commands-hook-diagnostics.ts"],"names":[],"mappings":"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"}
@@ -286,7 +286,7 @@ function machineInstallationIsCurrent(deps, harness) {
286
286
  const installed = new Set(installation.handlers
287
287
  .map((handler) => handlerEvent(handler.command))
288
288
  .filter((event) => event !== null && HOOK_EVENTS.includes(event)));
289
- return requiredHookEvents(harness).every((event) => installed.has(event));
289
+ return requiredHookEvents(harness, deps.hookPlatform).every((event) => installed.has(event));
290
290
  }
291
291
  function foreignStopHandlers(document) {
292
292
  const groups = document.hooks?.['Stop'];