@raidiant/notifai 11.5.0 → 11.6.0-beta.3

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 (93) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/commands-acknowledge.js +5 -2
  3. package/dist/commands-acknowledge.js.map +1 -1
  4. package/dist/commands-ask.js +9 -2
  5. package/dist/commands-ask.js.map +1 -1
  6. package/dist/commands-doctor.js +21 -15
  7. package/dist/commands-doctor.js.map +1 -1
  8. package/dist/commands-hook-attend.js +42 -6
  9. package/dist/commands-hook-attend.js.map +1 -1
  10. package/dist/commands-hook-install.js +1 -1
  11. package/dist/commands-hook-install.js.map +1 -1
  12. package/dist/commands-hook-run.js +79 -8
  13. package/dist/commands-hook-run.js.map +1 -1
  14. package/dist/commands-send-support.js +3 -0
  15. package/dist/commands-send-support.js.map +1 -1
  16. package/dist/commands-update-check.d.ts +1 -1
  17. package/dist/commands-update-check.js +12 -4
  18. package/dist/commands-update-check.js.map +1 -1
  19. package/dist/commands-update-resume.d.ts +7 -0
  20. package/dist/commands-update-resume.js +133 -0
  21. package/dist/commands-update-resume.js.map +1 -0
  22. package/dist/commands-update.js +25 -11
  23. package/dist/commands-update.js.map +1 -1
  24. package/dist/commands.d.ts +1 -0
  25. package/dist/commands.js +1 -0
  26. package/dist/commands.js.map +1 -1
  27. package/dist/harnesses.d.ts +8 -3
  28. package/dist/harnesses.js +16 -4
  29. package/dist/harnesses.js.map +1 -1
  30. package/dist/hermes-attendant.d.ts +38 -0
  31. package/dist/hermes-attendant.js +333 -0
  32. package/dist/hermes-attendant.js.map +1 -0
  33. package/dist/hermes-plugin.js +142 -4
  34. package/dist/hermes-plugin.js.map +1 -1
  35. package/dist/hook-lifecycle.d.ts +1 -1
  36. package/dist/hook-lifecycle.js +22 -11
  37. package/dist/hook-lifecycle.js.map +1 -1
  38. package/dist/hook-types.d.ts +3 -0
  39. package/dist/integration-health.d.ts +26 -0
  40. package/dist/integration-health.js +133 -0
  41. package/dist/integration-health.js.map +1 -0
  42. package/dist/invocation-context.d.ts +1 -0
  43. package/dist/invocation-context.js +3 -0
  44. package/dist/invocation-context.js.map +1 -1
  45. package/dist/native-skills.d.ts +1 -0
  46. package/dist/native-skills.js +30 -3
  47. package/dist/native-skills.js.map +1 -1
  48. package/dist/openclaw-generation.d.ts +5 -1
  49. package/dist/openclaw-generation.js +27 -5
  50. package/dist/openclaw-generation.js.map +1 -1
  51. package/dist/openclaw-message-bridge.d.ts +8 -0
  52. package/dist/openclaw-message-bridge.js +93 -0
  53. package/dist/openclaw-message-bridge.js.map +1 -0
  54. package/dist/openclaw-pending.d.ts +1 -1
  55. package/dist/openclaw-pending.js +1 -6
  56. package/dist/openclaw-pending.js.map +1 -1
  57. package/dist/openclaw-plugin.js +385 -14
  58. package/dist/openclaw-plugin.js.map +1 -1
  59. package/dist/openclaw-session-access.d.ts +2 -0
  60. package/dist/openclaw-session-access.js +10 -0
  61. package/dist/openclaw-session-access.js.map +1 -1
  62. package/dist/program.d.ts +2 -1
  63. package/dist/program.js +17 -10
  64. package/dist/program.js.map +1 -1
  65. package/dist/session-activation.js +1 -0
  66. package/dist/session-activation.js.map +1 -1
  67. package/dist/session-attendant-probe.d.ts +1 -0
  68. package/dist/session-attendant-probe.js +11 -1
  69. package/dist/session-attendant-probe.js.map +1 -1
  70. package/dist/session-attendant-state.d.ts +3 -0
  71. package/dist/session-attendant-state.js +8 -0
  72. package/dist/session-attendant-state.js.map +1 -1
  73. package/dist/session-attendant.d.ts +6 -0
  74. package/dist/session-attendant.js +12 -0
  75. package/dist/session-attendant.js.map +1 -1
  76. package/dist/session-labels.d.ts +2 -0
  77. package/dist/session-labels.js +5 -0
  78. package/dist/session-labels.js.map +1 -1
  79. package/dist/session-message-handoff.d.ts +3 -1
  80. package/dist/session-message-handoff.js +2 -1
  81. package/dist/session-message-handoff.js.map +1 -1
  82. package/dist/skill-integrity.d.ts +8 -3
  83. package/dist/skill-integrity.js +18 -8
  84. package/dist/skill-integrity.js.map +1 -1
  85. package/dist/skill-source/manifest.json +7 -7
  86. package/dist/skill-source/notifai/SKILL.md +66 -61
  87. package/dist/skill-source/notifai/references/diagnostics.md +5 -0
  88. package/dist/skill-source/notifai/references/harness-setup.md +24 -8
  89. package/dist/skill-source/notifai/references/notes-and-edits.md +6 -0
  90. package/dist/skill-source/notifai/references/updates.md +44 -10
  91. package/dist/update-handoff.js +1 -1
  92. package/dist/update-handoff.js.map +1 -1
  93. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,gBAAgB,GAIjB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,aAAa,GACd,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,cAAc,GACf,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,aAAa,GACd,MAAM,oBAAoB,CAAA;AAC3B,mFAAmF;AACnF,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EACL,mBAAmB,EACnB,sCAAsC,EACtC,cAAc,GACf,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AACvF,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACjE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAA;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAEzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA"}
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,gBAAgB,GAIjB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,aAAa,GACd,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,cAAc,GACf,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,aAAa,GACd,MAAM,oBAAoB,CAAA;AAC3B,mFAAmF;AACnF,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EACL,mBAAmB,EACnB,sCAAsC,EACtC,cAAc,GACf,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AACvF,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACjE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAA;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAEzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA"}
@@ -13,7 +13,7 @@ export type HookInstallableHarness = (typeof HOOK_INSTALLABLE_HARNESSES)[number]
13
13
  export declare function isHookInstallableHarness(value: string): value is HookInstallableHarness;
14
14
  export declare const HARNESS_LABELS: Record<SourceContextHarness, string>;
15
15
  export type DeliveryRoute = 'hook-continuation' | 'inbox-socket' | 'session-queue' | 'owned-control-plane' | 'cold-resume' | 'hold-for-next-turn' | 'unsupported';
16
- export type StopContinuation = 'decision-block' | 'gateway-service' | 'unsupported';
16
+ export type StopContinuation = 'decision-block' | 'gateway-service' | 'plugin-attendant' | 'unsupported';
17
17
  export interface HarnessCapability {
18
18
  /** How an answer is admitted to another turn in the already-open session. */
19
19
  stopContinuation: StopContinuation;
@@ -21,7 +21,10 @@ export interface HarnessCapability {
21
21
  deliveryRoutes: readonly DeliveryRoute[];
22
22
  /** Concise, honest readiness text for doctor and installation guidance. */
23
23
  deliveryContract: string;
24
+ /** Whether this integration can queue Session Notes and post-consumption Answer Edits. */
25
+ sessionMessages?: 'gateway-service' | 'unsupported';
24
26
  }
27
+ export declare const HERMES_CLASSIC_CLI_QUESTION_CAPABILITY: HarnessCapability;
25
28
  export declare const HERMES_QUESTION_ROUTING_UNAVAILABLE: HarnessCapability;
26
29
  /**
27
30
  * The one Hermes integration instance proven by the pinned vertical probe.
@@ -38,7 +41,9 @@ export declare const HERMES_CLASSIC_CLI_LOCAL_CAPABILITY: {
38
41
  readonly setup: "hermes-plugin";
39
42
  readonly activation: "project-enabled-system-prompt-section";
40
43
  readonly sourceContext: "hermes-session-id-and-invocation-cwd";
41
- readonly continuation: "unsupported";
44
+ readonly continuation: "plugin-attendant-exact-session-injection";
45
+ readonly sessionPresence: "plugin-owned-attendant";
46
+ readonly sessionMessages: "in-process-exact-session-injection";
42
47
  };
43
48
  export type HermesClassicCliLocalInstance = (typeof HERMES_CLASSIC_CLI_LOCAL_CAPABILITY)['instance'];
44
49
  /**
@@ -53,7 +58,7 @@ export declare function hermesClassicCliLocalInstance(env: NodeJS.ProcessEnv): H
53
58
  /**
54
59
  * Question-routing contract for hook-installable harnesses.
55
60
  *
56
- * Hermes has managed activation but no Question Routing continuation.
61
+ * Hermes Question Routing is scoped to its proved local classic CLI instance.
57
62
  */
58
63
  export declare const HARNESS_CAPABILITIES: Record<HookInstallableHarness, HarnessCapability>;
59
64
  /** Question-routing capability for the active harness integration on this host. */
package/dist/harnesses.js CHANGED
@@ -65,21 +65,28 @@ const OPENCLAW_CAPABILITY = {
65
65
  stopContinuation: 'gateway-service',
66
66
  deliveryRoutes: ['session-queue'],
67
67
  deliveryContract: 'the Gateway service owns the complete answer window and queues a pointer-only follow-up into the exact current session after claiming the answer; the agent fetches the reply and acknowledges it in that session',
68
+ sessionMessages: 'gateway-service',
68
69
  };
69
70
  const OPENCLAW_UNPROVEN_PLATFORM_CAPABILITY = {
70
71
  stopContinuation: 'unsupported',
71
72
  deliveryRoutes: ['unsupported'],
72
73
  deliveryContract: 'OpenClaw asynchronous answer continuation is verified on macOS only; use a blocking reply command on this host',
74
+ sessionMessages: 'unsupported',
73
75
  };
74
76
  const GROK_CAPABILITY = {
75
77
  stopContinuation: 'decision-block',
76
78
  deliveryRoutes: ['hook-continuation', 'hold-for-next-turn'],
77
79
  deliveryContract: 'the Stop hook holds the complete answer window, then returns a decision block carrying the answer into the same Grok Agent Session; the successor Stop confirms consumption',
78
80
  };
81
+ export const HERMES_CLASSIC_CLI_QUESTION_CAPABILITY = {
82
+ stopContinuation: 'plugin-attendant',
83
+ deliveryRoutes: ['session-queue'],
84
+ deliveryContract: 'the live classic CLI plugin owns the complete answer window and injects the claimed answer into its exact attached session; a stopped process cannot resume or receive an answer',
85
+ };
79
86
  export const HERMES_QUESTION_ROUTING_UNAVAILABLE = {
80
87
  stopContinuation: 'unsupported',
81
88
  deliveryRoutes: ['unsupported'],
82
- deliveryContract: 'Hermes asynchronous ask has no proven continuation owner on this integration surface. Use a blocking `notifai send --reply` question',
89
+ deliveryContract: 'Hermes Question Routing is available only in an attended local classic CLI session; use a blocking `notifai send --reply` question on other Hermes surfaces',
83
90
  };
84
91
  /**
85
92
  * The one Hermes integration instance proven by the pinned vertical probe.
@@ -96,7 +103,9 @@ export const HERMES_CLASSIC_CLI_LOCAL_CAPABILITY = {
96
103
  setup: 'hermes-plugin',
97
104
  activation: 'project-enabled-system-prompt-section',
98
105
  sourceContext: 'hermes-session-id-and-invocation-cwd',
99
- continuation: 'unsupported',
106
+ continuation: 'plugin-attendant-exact-session-injection',
107
+ sessionPresence: 'plugin-owned-attendant',
108
+ sessionMessages: 'in-process-exact-session-injection',
100
109
  };
101
110
  /**
102
111
  * Resolve only the Hermes instance whose complete marker envelope was proven.
@@ -123,7 +132,7 @@ export function hermesClassicCliLocalInstance(env) {
123
132
  /**
124
133
  * Question-routing contract for hook-installable harnesses.
125
134
  *
126
- * Hermes has managed activation but no Question Routing continuation.
135
+ * Hermes Question Routing is scoped to its proved local classic CLI instance.
127
136
  */
128
137
  export const HARNESS_CAPABILITIES = {
129
138
  'claude-code': CLAUDE_CODE_CAPABILITY,
@@ -131,11 +140,14 @@ export const HARNESS_CAPABILITIES = {
131
140
  cursor: CURSOR_CAPABILITY,
132
141
  opencode: OPENCODE_CAPABILITY,
133
142
  openclaw: OPENCLAW_CAPABILITY,
134
- hermes: HERMES_QUESTION_ROUTING_UNAVAILABLE,
143
+ hermes: HERMES_CLASSIC_CLI_QUESTION_CAPABILITY,
135
144
  grok: GROK_CAPABILITY,
136
145
  };
137
146
  /** Question-routing capability for the active harness integration on this host. */
138
147
  export function questionRoutingCapability(harness, platform = process.platform) {
148
+ if (harness === 'hermes' && platform !== 'darwin' && platform !== 'linux') {
149
+ return HERMES_QUESTION_ROUTING_UNAVAILABLE;
150
+ }
139
151
  if (harness === 'claude-code' && platform === 'win32') {
140
152
  return CLAUDE_CODE_WINDOWS_CAPABILITY;
141
153
  }
@@ -1 +1 @@
1
- {"version":3,"file":"harnesses.js","sourceRoot":"","sources":["../src/harnesses.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"harnesses.js","sourceRoot":"","sources":["../src/harnesses.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { Readable, Writable } from 'node:stream';
2
+ import { type CommandDeps } from './commands-core.js';
3
+ import type { EscalationDeliveryRoute } from './hook-types.js';
4
+ import { type HarnessProbe } from './session-attendant.js';
5
+ import type { SessionWriteResult } from './session-handoff.js';
6
+ import type { WriteGuard } from './wake-support.js';
7
+ type Hello = {
8
+ type: 'hello';
9
+ session_id: string;
10
+ cwd: string;
11
+ pid: number;
12
+ };
13
+ /** Framed, bounded IPC to the plugin thread that owns PluginContext. */
14
+ export declare class HermesWriterBridge {
15
+ private input;
16
+ private output;
17
+ private now;
18
+ private lines;
19
+ private helloValue;
20
+ private currentSession;
21
+ private activity;
22
+ private stateAt;
23
+ private closed;
24
+ private ended;
25
+ private nextId;
26
+ private pending;
27
+ private onHello;
28
+ constructor(input: Readable, output: Writable, now?: () => number);
29
+ hello(): Promise<Hello | null>;
30
+ private receive;
31
+ close(): void;
32
+ probe(sessionId: string): HarnessProbe;
33
+ write(sessionId: string, text: string, begin: () => boolean, guard: WriteGuard): Promise<SessionWriteResult>;
34
+ }
35
+ /** The only Hermes answer route: the plugin's attached classic CLI instance. */
36
+ export declare function hermesAnswerRoute(bridge: HermesWriterBridge, sessionId: string): EscalationDeliveryRoute;
37
+ export declare function hermesAttendCommand(deps: CommandDeps, input: Readable, output: Writable): Promise<number>;
38
+ export {};
@@ -0,0 +1,333 @@
1
+ /**
2
+ * The local classic CLI plugin owns this child for one exact Hermes session.
3
+ * Its pipe is an in-process writer bridge, not a second Hermes connection:
4
+ * the plugin checks its attached CLI's session id again at every injection.
5
+ */
6
+ import { existsSync } from 'node:fs';
7
+ import path from 'node:path';
8
+ import readline from 'node:readline';
9
+ import { log, makeClient } from './commands-core.js';
10
+ import { waitForReply } from './commands-send-support.js';
11
+ import { loadConfig } from './config.js';
12
+ import { hermesPluginCurrent } from './hermes-plugin.js';
13
+ import { acquireClaimFile, claimHolderMayRun, readClaimFile, releaseClaimFile } from './hook-question-lock.js';
14
+ import { beginSessionIncarnation, lifecycleStamp, readSessionIncarnation, readSessionState, refreshSessionMarkers, rotateSessionIncarnation, sessionNotified, } from './hook-session-state.js';
15
+ import { handleSessionEnd, runEscalationWaiter } from './hook-lifecycle.js';
16
+ import { currentProcessIdentity, processStartTime } from './process-identity.js';
17
+ import { projectBinding, projectEnabled } from './project-enablement.js';
18
+ import { runSessionAttendant, systemAttendantClock } from './session-attendant.js';
19
+ import { attendantClaimPath, attendantStatusPath, readAttendantLease, writeAttendantStatus } from './session-attendant-state.js';
20
+ import { handOffSessionMessages } from './session-message-handoff.js';
21
+ const STATE_MAX_AGE_MS = 5_000;
22
+ const INITIAL_FRAME_TIMEOUT_MS = 5_000;
23
+ /** Framed, bounded IPC to the plugin thread that owns PluginContext. */
24
+ export class HermesWriterBridge {
25
+ input;
26
+ output;
27
+ now;
28
+ lines;
29
+ helloValue = null;
30
+ currentSession = null;
31
+ activity = 'idle';
32
+ stateAt = 0;
33
+ closed = false;
34
+ ended = false;
35
+ nextId = 0;
36
+ pending = new Map();
37
+ onHello = null;
38
+ constructor(input, output, now = Date.now) {
39
+ this.input = input;
40
+ this.output = output;
41
+ this.now = now;
42
+ this.lines = readline.createInterface({ input, crlfDelay: Infinity });
43
+ this.lines.on('line', line => this.receive(line));
44
+ this.lines.on('close', () => this.close());
45
+ }
46
+ async hello() {
47
+ if (this.helloValue !== null || this.closed)
48
+ return this.helloValue;
49
+ return new Promise(resolve => {
50
+ const timer = setTimeout(() => {
51
+ this.onHello = null;
52
+ resolve(null);
53
+ }, INITIAL_FRAME_TIMEOUT_MS);
54
+ this.onHello = value => {
55
+ clearTimeout(timer);
56
+ resolve(value);
57
+ };
58
+ });
59
+ }
60
+ receive(line) {
61
+ if (line.length > 256 * 1024 || this.closed)
62
+ return;
63
+ let frame;
64
+ try {
65
+ frame = JSON.parse(line);
66
+ }
67
+ catch {
68
+ return;
69
+ }
70
+ if (frame.type === 'hello' && this.helloValue === null &&
71
+ typeof frame.session_id === 'string' && typeof frame.cwd === 'string' &&
72
+ typeof frame.pid === 'number') {
73
+ this.helloValue = frame;
74
+ this.onHello?.(this.helloValue);
75
+ this.onHello = null;
76
+ return;
77
+ }
78
+ if (this.helloValue === null)
79
+ return;
80
+ if (frame.type === 'state' && typeof frame.session_id === 'string' &&
81
+ (frame.activity === 'idle' || frame.activity === 'working')) {
82
+ this.currentSession = frame.session_id;
83
+ this.activity = frame.activity;
84
+ this.stateAt = this.now();
85
+ }
86
+ else if (frame.type === 'end' && frame.session_id === this.helloValue.session_id) {
87
+ this.ended = true;
88
+ this.currentSession = null;
89
+ for (const settle of this.pending.values())
90
+ settle(null);
91
+ this.pending.clear();
92
+ }
93
+ else if (frame.type === 'result' && typeof frame.id === 'number' &&
94
+ typeof frame.accepted === 'boolean') {
95
+ this.pending.get(frame.id)?.(frame);
96
+ this.pending.delete(frame.id);
97
+ }
98
+ }
99
+ close() {
100
+ if (this.closed)
101
+ return;
102
+ this.closed = true;
103
+ this.onHello?.(null);
104
+ this.onHello = null;
105
+ for (const settle of this.pending.values())
106
+ settle(null);
107
+ this.pending.clear();
108
+ this.lines.close();
109
+ this.input.destroy();
110
+ }
111
+ probe(sessionId) {
112
+ if (this.ended)
113
+ return { state: 'ended', reason: 'session-end-hook' };
114
+ if (this.closed || process.ppid !== this.helloValue?.pid)
115
+ return { state: 'ended', reason: 'harness-gone' };
116
+ if (this.currentSession !== null && this.currentSession !== sessionId) {
117
+ return { state: 'ended', reason: 'session-replaced' };
118
+ }
119
+ if (this.currentSession !== sessionId || this.now() - this.stateAt > STATE_MAX_AGE_MS) {
120
+ return { state: 'uncertain', reason: 'plugin-writer-unconfirmed' };
121
+ }
122
+ return { state: 'running', activity: this.activity };
123
+ }
124
+ async write(sessionId, text, begin, guard) {
125
+ if (this.probe(sessionId).state !== 'running')
126
+ return { status: 'unavailable', reason: 'Hermes plugin writer is not current' };
127
+ if (!begin())
128
+ return { status: 'cancelled' };
129
+ if (!guard.writable())
130
+ return { status: 'aborted', reason: 'claim or lease lapsed before Hermes injection' };
131
+ const budget = Math.floor(Math.min(5_000, guard.remainingMs()));
132
+ if (!Number.isFinite(budget) || budget <= 0) {
133
+ return { status: 'aborted', reason: 'claim or lease lapsed before Hermes injection' };
134
+ }
135
+ const id = ++this.nextId;
136
+ const result = new Promise(resolve => this.pending.set(id, resolve));
137
+ try {
138
+ // The plugin checks this again immediately before calling inject_message.
139
+ // A queued pipe write must not outlive the delivery claim.
140
+ this.output.write(`${JSON.stringify({ type: 'write', id, session_id: sessionId, text,
141
+ deadline_ms: Date.now() + budget })}\n`);
142
+ }
143
+ catch (error) {
144
+ this.pending.delete(id);
145
+ return { status: 'failed', reason: 'Hermes writer pipe failed', error };
146
+ }
147
+ let timer;
148
+ const reply = await Promise.race([
149
+ result,
150
+ new Promise(resolve => { timer = setTimeout(() => resolve(null), budget); }),
151
+ ]);
152
+ if (timer !== undefined)
153
+ clearTimeout(timer);
154
+ this.pending.delete(id);
155
+ if (reply === null)
156
+ return { status: 'failed', reason: 'Hermes injection was not confirmed', error: new Error('writer response missing') };
157
+ if (!reply.accepted)
158
+ return { status: 'aborted', reason: reply.reason ?? 'Hermes rejected the exact session' };
159
+ return { status: 'written', route: 'session-queue' };
160
+ }
161
+ }
162
+ /** The only Hermes answer route: the plugin's attached classic CLI instance. */
163
+ export function hermesAnswerRoute(bridge, sessionId) {
164
+ return {
165
+ kind: 'session-queue',
166
+ deliver: async (event) => {
167
+ if (event.writeGuard === undefined)
168
+ return { acknowledgement: 'held', notes: [] };
169
+ const result = await bridge.write(sessionId, event.context, () => event.commitDelivery(), event.writeGuard);
170
+ if (result.status === 'written')
171
+ return {
172
+ acknowledgement: 'delivered', notes: [],
173
+ log: { route: 'session-queue', stage: 'plugin-injection' },
174
+ };
175
+ return {
176
+ acknowledgement: 'held', notes: [],
177
+ log: { reason: result.status === 'failed' ? 'write-unconfirmed' : result.status === 'aborted' ? 'write-aborted' : result.status },
178
+ };
179
+ },
180
+ };
181
+ }
182
+ function hermesGates(deps, cwd, sessionId) {
183
+ try {
184
+ const config = loadConfig({ cwd, env: deps.env, sessionId });
185
+ if (!projectEnabled(projectBinding(cwd, deps.env, config.project.value))) {
186
+ return { ok: false, reason: 'project-disabled' };
187
+ }
188
+ }
189
+ catch {
190
+ return { ok: false, reason: 'enablement-unavailable' };
191
+ }
192
+ if (!hermesPluginCurrent(deps.hookAdapterHome, deps.env)) {
193
+ return { ok: false, reason: 'hermes-plugin-removed-or-replaced' };
194
+ }
195
+ return { ok: true };
196
+ }
197
+ export async function hermesAttendCommand(deps, input, output) {
198
+ const bridge = new HermesWriterBridge(input, output);
199
+ const hello = await bridge.hello();
200
+ if (hello === null || hello.pid !== process.ppid ||
201
+ hello.session_id === '' || hello.session_id !== deps.env['HERMES_SESSION_ID'] ||
202
+ !path.isAbsolute(hello.cwd) || !existsSync(hello.cwd)) {
203
+ bridge.close();
204
+ return 0;
205
+ }
206
+ const { session_id: sessionId, cwd } = hello;
207
+ const gate = () => hermesGates(deps, cwd, sessionId);
208
+ if (!gate().ok) {
209
+ bridge.close();
210
+ return 0;
211
+ }
212
+ const start = processStartTime(hello.pid);
213
+ const writer = currentProcessIdentity();
214
+ if (start === null || writer === null) {
215
+ bridge.close();
216
+ return 0;
217
+ }
218
+ const logger = log(deps);
219
+ logger.bind({ cmd: 'hook hermes-attend', session: sessionId });
220
+ const claimFile = attendantClaimPath(sessionId, deps.env);
221
+ const record = beginSessionIncarnation(sessionId, deps.env, {
222
+ stamp: lifecycleStamp(), harnessProcess: { pid: hello.pid, start }, clearEarlierEnd: true,
223
+ });
224
+ let token = acquireClaimFile(claimFile, { incarnation: record.incarnation }, Date.now());
225
+ const claimDeadline = systemAttendantClock.monotonic() + 6_000;
226
+ while (token === null && systemAttendantClock.monotonic() < claimDeadline) {
227
+ const holder = readClaimFile(claimFile);
228
+ if (holder?.['incarnation'] === record.incarnation && claimHolderMayRun(holder))
229
+ break;
230
+ await systemAttendantClock.sleep(250, new AbortController().signal);
231
+ token = acquireClaimFile(claimFile, { incarnation: record.incarnation }, Date.now());
232
+ }
233
+ if (token === null) {
234
+ bridge.close();
235
+ return 0;
236
+ }
237
+ let client;
238
+ const connect = () => {
239
+ if (client !== undefined)
240
+ return client;
241
+ const credential = deps.store.load();
242
+ client = credential
243
+ ? makeClient(deps, credential.baseUrl, `Bearer nfm_${credential.machineId}.${credential.secret}`)
244
+ : null;
245
+ return client;
246
+ };
247
+ let observer = null;
248
+ const observeQuestions = () => {
249
+ const probe = bridge.probe(sessionId);
250
+ if (observer !== null || probe.state !== 'running' || probe.activity !== 'idle')
251
+ return;
252
+ const state = readSessionState(sessionId, deps.env);
253
+ if (state.harness !== 'hermes' ||
254
+ ((state.pending?.length ?? 0) === 0 && state.accepted === undefined))
255
+ return;
256
+ const api = connect();
257
+ if (api === null)
258
+ return;
259
+ const now = deps.now ?? Date.now;
260
+ const sleep = deps.sleep ?? ((ms) => new Promise(resolve => setTimeout(resolve, ms)));
261
+ const ctx = {
262
+ client: api, config: loadConfig({ cwd, env: deps.env, sessionId }), env: deps.env,
263
+ now, sleep, harness: 'hermes', log: logger,
264
+ waitForFirstReply: async (requestId, timeoutSeconds) => {
265
+ const result = await waitForReply(api, requestId, { timeoutSeconds, afterSeq: 0, now, sleep });
266
+ return { replies: result.response.replies, timedOut: result.timedOut, degraded: result.degraded };
267
+ },
268
+ answerClaims: {
269
+ lease: () => readAttendantLease(sessionId, deps.env), writer,
270
+ monotonic: () => systemAttendantClock.monotonic(),
271
+ },
272
+ };
273
+ observer = runEscalationWaiter(ctx, {
274
+ sessionId, envelope: { session_id: sessionId, cwd },
275
+ route: hermesAnswerRoute(bridge, sessionId), recordStop: false,
276
+ }).then(() => undefined).catch(err => {
277
+ logger.error('hook.end', { hook: 'hermes-question', outcome: 'failed', reason: String(err) });
278
+ }).finally(() => { observer = null; });
279
+ };
280
+ try {
281
+ await runSessionAttendant({
282
+ sessionId,
283
+ incarnation: record.incarnation,
284
+ incarnationNow: () => readSessionIncarnation(sessionId, deps.env)?.incarnation ?? null,
285
+ rotateIncarnation: expected => {
286
+ const next = rotateSessionIncarnation(sessionId, deps.env, expected);
287
+ if (next === null)
288
+ return null;
289
+ releaseClaimFile(claimFile, token);
290
+ token = acquireClaimFile(claimFile, { incarnation: next.incarnation }, Date.now());
291
+ return token === null ? null : next.incarnation;
292
+ },
293
+ probe: () => bridge.probe(sessionId),
294
+ claimHeld: () => token !== null && readClaimFile(claimFile)?.['token'] === token,
295
+ notified: () => sessionNotified(sessionId, deps.env),
296
+ gates: gate,
297
+ client: connect,
298
+ serverSupportsAttendance: async (api) => (await api.compatibility()).server_capabilities.includes('session_attendance'),
299
+ acceptsMessages: true,
300
+ publishProbeStatus: true,
301
+ onProbe: probe => { if (probe.state === 'running' && probe.activity === 'idle')
302
+ observeQuestions(); },
303
+ onMessages: (messages, attendant) => {
304
+ const api = connect();
305
+ if (api === null)
306
+ return Promise.resolve('done');
307
+ return handOffSessionMessages(messages, attendant, {
308
+ sequencer: {
309
+ sessionId, env: deps.env, client: api,
310
+ monotonic: () => systemAttendantClock.monotonic(),
311
+ wall: () => systemAttendantClock.wall(),
312
+ sleep: ms => systemAttendantClock.sleep(ms, new AbortController().signal),
313
+ writer, log: logger,
314
+ },
315
+ write: (text, begin, guard) => bridge.write(sessionId, text, begin, guard),
316
+ });
317
+ },
318
+ clock: systemAttendantClock,
319
+ logger,
320
+ writeStatus: status => writeAttendantStatus(sessionId, deps.env, status),
321
+ heartbeat: () => refreshSessionMarkers(sessionId, deps.env, Date.now(), [claimFile, attendantStatusPath(sessionId, deps.env)]),
322
+ });
323
+ }
324
+ finally {
325
+ bridge.close();
326
+ handleSessionEnd(deps.env, { session_id: sessionId, cwd }, Date.now(), false);
327
+ await observer;
328
+ if (token !== null)
329
+ releaseClaimFile(claimFile, token);
330
+ }
331
+ return 0;
332
+ }
333
+ //# sourceMappingURL=hermes-attendant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hermes-attendant.js","sourceRoot":"","sources":["../src/hermes-attendant.ts"],"names":[],"mappings":"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"}