@raidiant/notifai 11.6.2 → 11.7.0-beta.2
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 +19 -0
- package/dist/atomic-file.d.ts +1 -1
- package/dist/atomic-file.js +8 -3
- package/dist/atomic-file.js.map +1 -1
- package/dist/client.d.ts +5 -1
- package/dist/client.js +2 -0
- package/dist/client.js.map +1 -1
- package/dist/codex-answer-control.d.ts +14 -0
- package/dist/codex-answer-control.js +41 -0
- package/dist/codex-answer-control.js.map +1 -0
- package/dist/codex-answer-presentation.d.ts +18 -0
- package/dist/codex-answer-presentation.js +113 -0
- package/dist/codex-answer-presentation.js.map +1 -0
- package/dist/codex-input-lifecycle.d.ts +10 -0
- package/dist/codex-input-lifecycle.js +63 -0
- package/dist/codex-input-lifecycle.js.map +1 -0
- package/dist/codex-native-control.d.ts +13 -0
- package/dist/codex-native-control.js +120 -0
- package/dist/codex-native-control.js.map +1 -0
- package/dist/codex-native-turn.d.ts +18 -0
- package/dist/codex-native-turn.js +46 -4
- package/dist/codex-native-turn.js.map +1 -1
- package/dist/codex-question-bindings.d.ts +76 -0
- package/dist/codex-question-bindings.js +151 -0
- package/dist/codex-question-bindings.js.map +1 -0
- package/dist/codex-queue-control.d.ts +21 -0
- package/dist/codex-queue-control.js +59 -0
- package/dist/codex-queue-control.js.map +1 -0
- package/dist/codex-tool-messages.js +40 -16
- package/dist/codex-tool-messages.js.map +1 -1
- package/dist/commands-acknowledge.d.ts +2 -4
- package/dist/commands-acknowledge.js +7 -0
- package/dist/commands-acknowledge.js.map +1 -1
- package/dist/commands-ask.js +70 -13
- package/dist/commands-ask.js.map +1 -1
- package/dist/commands-auth.d.ts +3 -1
- package/dist/commands-auth.js +88 -28
- package/dist/commands-auth.js.map +1 -1
- package/dist/commands-close.js +51 -3
- package/dist/commands-close.js.map +1 -1
- package/dist/commands-core.d.ts +7 -0
- package/dist/commands-core.js +1 -0
- package/dist/commands-core.js.map +1 -1
- package/dist/commands-hook-attend.js +50 -10
- package/dist/commands-hook-attend.js.map +1 -1
- package/dist/commands-hook-run.js +2 -1
- package/dist/commands-hook-run.js.map +1 -1
- package/dist/commands-init.d.ts +2 -0
- package/dist/commands-init.js +3 -3
- package/dist/commands-init.js.map +1 -1
- package/dist/commands-io.js +7 -0
- package/dist/commands-io.js.map +1 -1
- package/dist/commands-native-acknowledge.d.ts +8 -0
- package/dist/commands-native-acknowledge.js +114 -0
- package/dist/commands-native-acknowledge.js.map +1 -0
- package/dist/credentials.d.ts +5 -0
- package/dist/credentials.js.map +1 -1
- package/dist/hermes-attendant.js +4 -0
- package/dist/hermes-attendant.js.map +1 -1
- package/dist/hook-acknowledgements.d.ts +1 -0
- package/dist/hook-acknowledgements.js +3 -1
- package/dist/hook-acknowledgements.js.map +1 -1
- package/dist/hook-lifecycle.d.ts +12 -1
- package/dist/hook-lifecycle.js +145 -79
- package/dist/hook-lifecycle.js.map +1 -1
- package/dist/hook-question-retirement.js +2 -1
- package/dist/hook-question-retirement.js.map +1 -1
- package/dist/hook-question-state.d.ts +6 -2
- package/dist/hook-question-state.js +19 -7
- package/dist/hook-question-state.js.map +1 -1
- package/dist/hook-session-state.d.ts +5 -1
- package/dist/hook-session-state.js +48 -14
- package/dist/hook-session-state.js.map +1 -1
- package/dist/hook-types.d.ts +23 -1
- package/dist/hook-types.js.map +1 -1
- package/dist/native-answer-operation.d.ts +70 -0
- package/dist/native-answer-operation.js +247 -0
- package/dist/native-answer-operation.js.map +1 -0
- package/dist/pairing-qr.d.ts +5 -0
- package/dist/pairing-qr.js +24 -0
- package/dist/pairing-qr.js.map +1 -0
- package/dist/pending-pairing.d.ts +1 -0
- package/dist/pending-pairing.js +7 -5
- package/dist/pending-pairing.js.map +1 -1
- package/dist/program.js +9 -3
- package/dist/program.js.map +1 -1
- package/dist/session-attendant-probe.d.ts +1 -1
- package/dist/session-attendant-probe.js +2 -1
- package/dist/session-attendant-probe.js.map +1 -1
- package/dist/session-attendant-state.d.ts +5 -0
- package/dist/session-attendant-state.js +29 -10
- package/dist/session-attendant-state.js.map +1 -1
- package/dist/session-delivery.d.ts +29 -0
- package/dist/session-delivery.js +3 -1
- package/dist/session-delivery.js.map +1 -1
- package/dist/session-input-wakes.d.ts +78 -0
- package/dist/session-input-wakes.js +239 -0
- package/dist/session-input-wakes.js.map +1 -0
- package/dist/session-inputs.d.ts +41 -6
- package/dist/session-inputs.js +199 -19
- package/dist/session-inputs.js.map +1 -1
- package/dist/skill-source/manifest.json +8 -4
- package/dist/skill-source/notifai/SKILL.md +30 -28
- package/dist/skill-source/notifai/references/harness-setup.md +33 -20
- package/dist/skill-source/notifai/references/native-questions.md +51 -0
- package/package.json +10 -3
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/** Durable wake attempts. Native I/O never runs inside the session-state lock. */
|
|
2
|
+
import type { NativeTurnSnapshot } from './codex-native-turn.js';
|
|
3
|
+
import { type QueueControl } from './codex-queue-control.js';
|
|
4
|
+
import { type ProcessIdentity } from './process-identity.js';
|
|
5
|
+
export interface InputWakeAttempt {
|
|
6
|
+
token: string;
|
|
7
|
+
ownerKey: string;
|
|
8
|
+
incarnation: string;
|
|
9
|
+
generation: number | null;
|
|
10
|
+
namespace: string;
|
|
11
|
+
inputIds: string[];
|
|
12
|
+
text: string;
|
|
13
|
+
writer: ProcessIdentity;
|
|
14
|
+
phase: 'prepared' | 'sending' | 'accepted' | 'unknown' | 'consumed' | 'cancelled';
|
|
15
|
+
detached: boolean;
|
|
16
|
+
nativeId?: string;
|
|
17
|
+
cleanupChecks?: number;
|
|
18
|
+
recoveryEvidence?: {
|
|
19
|
+
identity: string;
|
|
20
|
+
file: string;
|
|
21
|
+
size: number;
|
|
22
|
+
highWater: number;
|
|
23
|
+
turnId: string;
|
|
24
|
+
idleSince?: number;
|
|
25
|
+
checkedAt: number;
|
|
26
|
+
};
|
|
27
|
+
nextCheckAt?: number;
|
|
28
|
+
}
|
|
29
|
+
type Scope = {
|
|
30
|
+
sessionId: string;
|
|
31
|
+
env: NodeJS.ProcessEnv;
|
|
32
|
+
};
|
|
33
|
+
type Owner = {
|
|
34
|
+
key: string;
|
|
35
|
+
incarnation: string;
|
|
36
|
+
generation: number | null;
|
|
37
|
+
};
|
|
38
|
+
export declare const readInputWakes: ({ sessionId, env }: Scope) => InputWakeAttempt[];
|
|
39
|
+
/** Persist election before the first native byte. Pending IDs include input
|
|
40
|
+
* revision, not just a reusable question ID. Callbacks must only read: this
|
|
41
|
+
* runs under the session-state lock, including the final activity check. */
|
|
42
|
+
export declare function electInputWake(input: Scope & {
|
|
43
|
+
owner: Owner;
|
|
44
|
+
namespace: string;
|
|
45
|
+
pendingIds(): string[] | null;
|
|
46
|
+
mayWake(): boolean;
|
|
47
|
+
text(token: string): string;
|
|
48
|
+
}): InputWakeAttempt | null;
|
|
49
|
+
/** The second gate covers a hook drain or a new prompt after election. A
|
|
50
|
+
* drain after admission detaches the attempt; its late receipt is retained. */
|
|
51
|
+
export declare function admitInputWake(input: Scope & {
|
|
52
|
+
token: string;
|
|
53
|
+
control: QueueControl;
|
|
54
|
+
pendingIds(): string[] | null;
|
|
55
|
+
mayWake(): boolean;
|
|
56
|
+
}): Promise<void>;
|
|
57
|
+
/** Detach before cleanup I/O so an old deletion cannot suppress new input. */
|
|
58
|
+
export declare function detachInputWakes(input: Scope & {
|
|
59
|
+
pendingIds(): string[] | null;
|
|
60
|
+
}): void;
|
|
61
|
+
/** A prompt identifies its own attempt. Manual receive has no such identity. */
|
|
62
|
+
export declare function observeInputWake(scope: Scope, token: string): void;
|
|
63
|
+
/** Reconnect is read/reconcile only: never add an uncertain attempt again. */
|
|
64
|
+
export declare function reconcileInputWakes(scope: Scope, control: QueueControl, now?: number): Promise<void>;
|
|
65
|
+
/** One content-free liveness replacement for each immutable pending revision.
|
|
66
|
+
* Absence is not rejection: an old wake may still arrive. This does not alter
|
|
67
|
+
* the input delivery journal or repeat any answer presentation.
|
|
68
|
+
* Native/eligibility readers must be synchronous and mutation-free. */
|
|
69
|
+
export declare function recoverUncertainInputWake(input: Scope & {
|
|
70
|
+
owner: Owner;
|
|
71
|
+
control: QueueControl;
|
|
72
|
+
pendingIds(): string[] | null;
|
|
73
|
+
mayWake(): boolean;
|
|
74
|
+
native(): NativeTurnSnapshot | null;
|
|
75
|
+
text(token: string): string;
|
|
76
|
+
monotonic?: () => number;
|
|
77
|
+
}): Promise<InputWakeAttempt | null>;
|
|
78
|
+
export {};
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { CodexControlNotSent } from './codex-native-control.js';
|
|
3
|
+
import {} from './codex-queue-control.js';
|
|
4
|
+
import { readSessionIncarnation, readSessionState, sessionHasEnded, updateSessionState } from './hook-session-state.js';
|
|
5
|
+
import { currentProcessIdentity, processIdentityLiveness } from './process-identity.js';
|
|
6
|
+
import { readAttendantLease } from './session-attendant-state.js';
|
|
7
|
+
const CLEANUP_BATCH = 8;
|
|
8
|
+
const RETAINED_DETACHED = 64;
|
|
9
|
+
const terminal = (attempt) => ['consumed', 'cancelled'].includes(attempt.phase);
|
|
10
|
+
export const readInputWakes = ({ sessionId, env }) => readSessionState(sessionId, env).input_wake_attempts ?? [];
|
|
11
|
+
function owns(scope, owner) {
|
|
12
|
+
const current = readSessionIncarnation(scope.sessionId, scope.env);
|
|
13
|
+
if (current?.key !== owner.key || current.incarnation !== owner.incarnation || sessionHasEnded(scope.sessionId, scope.env) ||
|
|
14
|
+
current.harness_process === undefined || processIdentityLiveness(current.harness_process) !== 'alive')
|
|
15
|
+
return false;
|
|
16
|
+
if (owner.generation === null)
|
|
17
|
+
return true;
|
|
18
|
+
const lease = readAttendantLease(scope.sessionId, scope.env);
|
|
19
|
+
return lease?.incarnation === owner.incarnation && lease.generation === owner.generation;
|
|
20
|
+
}
|
|
21
|
+
function mutate(scope, transform) {
|
|
22
|
+
updateSessionState(scope.sessionId, scope.env, state => {
|
|
23
|
+
const attempts = transform(state.input_wake_attempts ?? []);
|
|
24
|
+
const finished = attempts.filter(terminal).slice(-32);
|
|
25
|
+
// An evicted unresolved record is abandoned cleanup, never cancellation.
|
|
26
|
+
// Keep live writers until their native operation's bounded deadline ends.
|
|
27
|
+
const prunable = attempts.filter(a => !terminal(a) && a.detached &&
|
|
28
|
+
!(a.phase === 'sending' && processIdentityLiveness(a.writer) !== 'gone'));
|
|
29
|
+
const retained = new Set(prunable.slice(-RETAINED_DETACHED).map(a => a.token));
|
|
30
|
+
const active = attempts.filter(a => !terminal(a) && (!prunable.includes(a) || retained.has(a.token)));
|
|
31
|
+
return { ...state, input_wake_attempts: active.concat(finished) };
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/** Persist election before the first native byte. Pending IDs include input
|
|
35
|
+
* revision, not just a reusable question ID. Callbacks must only read: this
|
|
36
|
+
* runs under the session-state lock, including the final activity check. */
|
|
37
|
+
export function electInputWake(input) {
|
|
38
|
+
const writer = currentProcessIdentity();
|
|
39
|
+
if (writer === null)
|
|
40
|
+
return null;
|
|
41
|
+
let elected = null;
|
|
42
|
+
mutate(input, attempts => {
|
|
43
|
+
if (!owns(input, input.owner) || !input.mayWake())
|
|
44
|
+
return attempts;
|
|
45
|
+
const ids = input.pendingIds();
|
|
46
|
+
if (ids === null || ids.length === 0)
|
|
47
|
+
return attempts;
|
|
48
|
+
const outstanding = attempts.filter(a => a.incarnation === input.owner.incarnation && !a.detached && !terminal(a));
|
|
49
|
+
const coalesced = outstanding.find(a => a.phase === 'accepted' || a.phase === 'prepared' ||
|
|
50
|
+
(a.phase === 'sending' && processIdentityLiveness(a.writer) !== 'gone'));
|
|
51
|
+
if (coalesced !== undefined)
|
|
52
|
+
return attempts.map(a => a.token === coalesced.token
|
|
53
|
+
? { ...a, inputIds: [...new Set([...a.inputIds, ...ids])] } : a);
|
|
54
|
+
// A genuinely new revision may escape an unresolved older wake.
|
|
55
|
+
const covered = new Set(outstanding.flatMap(a => a.inputIds));
|
|
56
|
+
if (outstanding.length > 0 && ids.every(id => covered.has(id)))
|
|
57
|
+
return attempts;
|
|
58
|
+
// Bound admitted operations even if several callers stall before receipt.
|
|
59
|
+
if (attempts.filter(a => a.phase === 'sending' && processIdentityLiveness(a.writer) !== 'gone').length >= CLEANUP_BATCH)
|
|
60
|
+
return attempts;
|
|
61
|
+
attempts = attempts.map(a => outstanding.includes(a) ? { ...a, detached: true } : a);
|
|
62
|
+
const token = randomUUID();
|
|
63
|
+
elected = { token, ownerKey: input.owner.key, incarnation: input.owner.incarnation,
|
|
64
|
+
generation: input.owner.generation, namespace: input.namespace, inputIds: ids,
|
|
65
|
+
text: input.text(token), writer, phase: 'prepared', detached: false };
|
|
66
|
+
return [...attempts, elected];
|
|
67
|
+
});
|
|
68
|
+
return elected;
|
|
69
|
+
}
|
|
70
|
+
/** The second gate covers a hook drain or a new prompt after election. A
|
|
71
|
+
* drain after admission detaches the attempt; its late receipt is retained. */
|
|
72
|
+
export async function admitInputWake(input) {
|
|
73
|
+
let sending;
|
|
74
|
+
mutate(input, attempts => attempts.map(a => {
|
|
75
|
+
if (a.token !== input.token || a.phase !== 'prepared')
|
|
76
|
+
return a;
|
|
77
|
+
const owner = { key: a.ownerKey, incarnation: a.incarnation, generation: a.generation };
|
|
78
|
+
const ids = input.pendingIds();
|
|
79
|
+
if (ids === null)
|
|
80
|
+
return a;
|
|
81
|
+
const pending = new Set(ids);
|
|
82
|
+
if (a.detached || input.control.threadId !== input.sessionId || input.control.namespace !== a.namespace || !owns(input, owner) || !input.mayWake() || !a.inputIds.some(id => pending.has(id))) {
|
|
83
|
+
return { ...a, phase: 'cancelled', detached: true };
|
|
84
|
+
}
|
|
85
|
+
sending = { ...a, phase: 'sending' };
|
|
86
|
+
return sending;
|
|
87
|
+
}));
|
|
88
|
+
if (sending === undefined)
|
|
89
|
+
return;
|
|
90
|
+
try {
|
|
91
|
+
const id = await input.control.add(sending.token, sending.text);
|
|
92
|
+
mutate(input, attempts => attempts.map(a => a.token !== input.token ? a : {
|
|
93
|
+
...a, nativeId: id, phase: terminal(a) ? a.phase : 'accepted',
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
if (error instanceof CodexControlNotSent) {
|
|
98
|
+
mutate(input, attempts => attempts.map(a => a.token === input.token && !terminal(a) ? { ...a, phase: 'cancelled', detached: true } : a));
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
// A crash/timeout/refusal after admission can have reached the backend.
|
|
102
|
+
// It never becomes a new add, including after this helper restarts.
|
|
103
|
+
mutate(input, attempts => attempts.map(a => a.token === input.token && !terminal(a) ? { ...a, phase: 'unknown' } : a));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/** Detach before cleanup I/O so an old deletion cannot suppress new input. */
|
|
107
|
+
export function detachInputWakes(input) {
|
|
108
|
+
mutate(input, attempts => {
|
|
109
|
+
const ids = input.pendingIds();
|
|
110
|
+
if (ids === null)
|
|
111
|
+
return attempts;
|
|
112
|
+
const pending = new Set(ids);
|
|
113
|
+
return attempts.map(a => !terminal(a) && !a.inputIds.some(id => pending.has(id)) ? { ...a, detached: true } : a);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
/** A prompt identifies its own attempt. Manual receive has no such identity. */
|
|
117
|
+
export function observeInputWake(scope, token) {
|
|
118
|
+
mutate(scope, attempts => attempts.map(a => a.token === token ? { ...a, phase: 'consumed', detached: true } : a));
|
|
119
|
+
}
|
|
120
|
+
/** Reconnect is read/reconcile only: never add an uncertain attempt again. */
|
|
121
|
+
export async function reconcileInputWakes(scope, control, now = Date.now()) {
|
|
122
|
+
if (control.threadId !== scope.sessionId)
|
|
123
|
+
return;
|
|
124
|
+
const candidates = readInputWakes(scope)
|
|
125
|
+
.filter(a => !terminal(a) && a.namespace === control.namespace && (a.nextCheckAt ?? 0) <= now)
|
|
126
|
+
.sort((a, b) => (a.nextCheckAt ?? 0) - (b.nextCheckAt ?? 0)).slice(0, CLEANUP_BATCH);
|
|
127
|
+
for (const captured of candidates) {
|
|
128
|
+
// Claim the backoff before native I/O so overlapping helpers cannot scan
|
|
129
|
+
// the same whole backlog. Every pass does at most eight native lookups.
|
|
130
|
+
let claimed = false;
|
|
131
|
+
mutate(scope, attempts => attempts.map(a => {
|
|
132
|
+
if (a.token !== captured.token || terminal(a) || (a.nextCheckAt ?? 0) > now)
|
|
133
|
+
return a;
|
|
134
|
+
claimed = true;
|
|
135
|
+
const checks = (a.cleanupChecks ?? 0) + 1;
|
|
136
|
+
return { ...a, cleanupChecks: checks, nextCheckAt: now + Math.min(30_000, 2_000 * 2 ** Math.min(checks - 1, 4)) };
|
|
137
|
+
}));
|
|
138
|
+
if (!claimed)
|
|
139
|
+
continue;
|
|
140
|
+
let a = captured;
|
|
141
|
+
if (a.phase === 'prepared') {
|
|
142
|
+
if (a.detached || !owns(scope, { key: a.ownerKey, incarnation: a.incarnation, generation: a.generation }) || processIdentityLiveness(a.writer) === 'gone') {
|
|
143
|
+
mutate(scope, attempts => attempts.map(v => v.token === a.token && v.phase === 'prepared' ? { ...v, phase: 'cancelled', detached: true } : v));
|
|
144
|
+
}
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
try {
|
|
148
|
+
if (a.nativeId === undefined) {
|
|
149
|
+
const found = await control.find(a.token, a.text);
|
|
150
|
+
// Absence also means it may have dequeued. Ambiguity is not ownership.
|
|
151
|
+
if (typeof found === 'string')
|
|
152
|
+
continue;
|
|
153
|
+
mutate(scope, attempts => attempts.map(v => v.token === a.token ? { ...v, nativeId: found.id } : v));
|
|
154
|
+
}
|
|
155
|
+
// A drain/observation could have occurred during list. Use current state.
|
|
156
|
+
const current = readInputWakes(scope).find(v => v.token === a.token);
|
|
157
|
+
if (current === undefined || terminal(current) || !current.detached || current.nativeId === undefined)
|
|
158
|
+
continue;
|
|
159
|
+
a = current;
|
|
160
|
+
const deleted = await control.remove(a.nativeId);
|
|
161
|
+
if (deleted)
|
|
162
|
+
mutate(scope, attempts => attempts.map(v => v.token === a.token && !terminal(v) ? { ...v, phase: 'cancelled', detached: true } : v));
|
|
163
|
+
// Delete-absent never means cancelled. A late token observation can still
|
|
164
|
+
// settle this exact attempt without clearing a newer attempt.
|
|
165
|
+
}
|
|
166
|
+
catch { /* Keep unresolved intent for the next bounded reconciliation. */ }
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/** One content-free liveness replacement for each immutable pending revision.
|
|
170
|
+
* Absence is not rejection: an old wake may still arrive. This does not alter
|
|
171
|
+
* the input delivery journal or repeat any answer presentation.
|
|
172
|
+
* Native/eligibility readers must be synchronous and mutation-free. */
|
|
173
|
+
export async function recoverUncertainInputWake(input) {
|
|
174
|
+
if (input.control.threadId !== input.sessionId)
|
|
175
|
+
return null;
|
|
176
|
+
const old = readInputWakes(input).find(a => !a.detached && !terminal(a) && a.phase !== 'prepared' &&
|
|
177
|
+
a.incarnation === input.owner.incarnation && a.namespace === input.control.namespace);
|
|
178
|
+
if (old === undefined || (old.phase === 'sending' && processIdentityLiveness(old.writer) !== 'gone'))
|
|
179
|
+
return null;
|
|
180
|
+
// Every fresh connection has already established this home/thread association.
|
|
181
|
+
let found;
|
|
182
|
+
try {
|
|
183
|
+
found = await input.control.find(old.token, old.text);
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
if (typeof found !== 'string') {
|
|
189
|
+
mutate(input, attempts => attempts.map(a => a.token === old.token ? { ...a, nativeId: found.id } : a));
|
|
190
|
+
return null;
|
|
191
|
+
}
|
|
192
|
+
if (found !== 'absent')
|
|
193
|
+
return null;
|
|
194
|
+
const writer = currentProcessIdentity();
|
|
195
|
+
if (writer === null)
|
|
196
|
+
return null;
|
|
197
|
+
let replacement = null;
|
|
198
|
+
updateSessionState(input.sessionId, input.env, state => {
|
|
199
|
+
if (!owns(input, input.owner))
|
|
200
|
+
return state;
|
|
201
|
+
const attempts = state.input_wake_attempts ?? [];
|
|
202
|
+
const current = attempts.find(a => a.token === old.token);
|
|
203
|
+
if (current === undefined || current.detached || terminal(current) || current.nativeId !== old.nativeId || current.phase !== old.phase)
|
|
204
|
+
return state;
|
|
205
|
+
const native = input.native();
|
|
206
|
+
const ids = input.pendingIds();
|
|
207
|
+
if (native === null || ids === null || ids.length === 0 || !current.inputIds.some(id => ids.includes(id)))
|
|
208
|
+
return state;
|
|
209
|
+
const now = (input.monotonic ?? (() => Number(process.hrtime.bigint() / 1000000n)))();
|
|
210
|
+
const prior = current.recoveryEvidence;
|
|
211
|
+
if (prior !== undefined && (prior.identity !== native.identity || prior.file !== native.file || native.size < prior.highWater))
|
|
212
|
+
return state;
|
|
213
|
+
const same = prior !== undefined && prior.identity === native.identity && prior.file === native.file &&
|
|
214
|
+
native.size >= prior.size && now >= prior.checkedAt;
|
|
215
|
+
const advanced = same && native.latest.ended && native.latest.id !== prior.turnId && native.latest.offset >= prior.size;
|
|
216
|
+
const continuous = same && now - prior.checkedAt <= 6_000 && native.latest.id === prior.turnId;
|
|
217
|
+
const idleSince = native.latest.ended ? continuous ? prior.idleSince ?? now : now : undefined;
|
|
218
|
+
const evidence = { identity: native.identity, file: native.file,
|
|
219
|
+
size: same ? prior.size : native.size, highWater: native.size, turnId: same ? prior.turnId : native.latest.id,
|
|
220
|
+
...(idleSince === undefined ? {} : { idleSince }), checkedAt: now };
|
|
221
|
+
const eligible = native.latest.ended && input.mayWake() && (advanced || (idleSince !== undefined && now - idleSince >= 30_000));
|
|
222
|
+
const used = state.input_wake_recovery?.incarnation === current.incarnation ? state.input_wake_recovery.inputIds : [];
|
|
223
|
+
const fresh = ids.filter(id => !used.includes(id));
|
|
224
|
+
// Retain the budget across drain/re-add and process restart. Reaching this
|
|
225
|
+
// safety cap disables uncertainty replacement, never ordinary new wakes.
|
|
226
|
+
if (!eligible || fresh.length === 0 || used.length + fresh.length > 256) {
|
|
227
|
+
return { ...state, input_wake_attempts: attempts.map(a => a.token === current.token ? { ...a, recoveryEvidence: evidence } : a) };
|
|
228
|
+
}
|
|
229
|
+
const token = randomUUID();
|
|
230
|
+
replacement = { token, ownerKey: input.owner.key, incarnation: input.owner.incarnation,
|
|
231
|
+
generation: input.owner.generation, namespace: input.control.namespace, inputIds: ids,
|
|
232
|
+
text: input.text(token), writer, phase: 'prepared', detached: false };
|
|
233
|
+
return { ...state,
|
|
234
|
+
input_wake_recovery: { incarnation: current.incarnation, inputIds: [...used, ...fresh] },
|
|
235
|
+
input_wake_attempts: [...attempts.map(a => a.token === current.token ? { ...a, detached: true } : a), replacement] };
|
|
236
|
+
});
|
|
237
|
+
return replacement;
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=session-input-wakes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-input-wakes.js","sourceRoot":"","sources":["../src/session-input-wakes.ts"],"names":[],"mappings":"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"}
|
package/dist/session-inputs.d.ts
CHANGED
|
@@ -1,22 +1,57 @@
|
|
|
1
1
|
import type { AttendanceMessage } from '@raidiant/notifai-protocol';
|
|
2
|
-
import type { AcceptedAnswerDelivery, EscalationDeliveryRoute } from './hook-types.js';
|
|
2
|
+
import type { AcceptedAnswerDelivery, AnsweredPending, EscalationDeliveryRoute, SessionState } from './hook-types.js';
|
|
3
3
|
import type { Logger } from './logging.js';
|
|
4
|
-
import { type DeliveryLease, type SequencerDeps } from './session-delivery.js';
|
|
5
|
-
|
|
4
|
+
import { type DeliveryLease, type NativeAnswerPresentation, type SequencerDeps } from './session-delivery.js';
|
|
5
|
+
import { connectCodexQueue } from './codex-queue-control.js';
|
|
6
|
+
export declare function sessionInputWake(token?: string): string;
|
|
6
7
|
/** Atomically coalesce native wakes until one actually reaches its consumer. */
|
|
7
8
|
export declare function wakeSessionInputs(sessionId: string, env: NodeJS.ProcessEnv, send: (text: string) => Promise<boolean>, log?: Logger): Promise<void>;
|
|
8
9
|
export declare function observeSessionInputWake(sessionId: string, env: NodeJS.ProcessEnv, prompt: string | undefined): void;
|
|
9
10
|
export declare function stageSessionAnswers(sessionId: string, env: NodeJS.ProcessEnv, accepted: AcceptedAnswerDelivery): void;
|
|
10
11
|
/** The existing route wakes the exact owner, but no longer owns answer text. */
|
|
11
|
-
export declare function sessionInputRoute(sessionId: string, env: NodeJS.ProcessEnv, route: EscalationDeliveryRoute, log?: Logger): EscalationDeliveryRoute;
|
|
12
|
+
export declare function sessionInputRoute(sessionId: string, env: NodeJS.ProcessEnv, route: EscalationDeliveryRoute, log?: Logger, wakeOwner?: 'producer' | 'attendant'): EscalationDeliveryRoute;
|
|
12
13
|
/** Cache only: the service remains authoritative and claims fence stale copies. */
|
|
13
14
|
export declare function stageSessionMessages(sessionId: string, env: NodeJS.ProcessEnv, lease: DeliveryLease, messages: readonly AttendanceMessage[]): void;
|
|
14
15
|
export declare function readSessionMessages(sessionId: string, env: NodeJS.ProcessEnv, lease: DeliveryLease): AttendanceMessage[];
|
|
15
16
|
export declare function hasSessionInputs(sessionId: string, env: NodeJS.ProcessEnv, lease: DeliveryLease | null): boolean;
|
|
16
|
-
/**
|
|
17
|
-
export declare function
|
|
17
|
+
/** Read-only under the state lock. Unknown cache state is not an empty inbox. */
|
|
18
|
+
export declare function pendingInputRevisionIds(sessionId: string, env: NodeJS.ProcessEnv, lease: DeliveryLease | null, state?: SessionState): string[] | null;
|
|
19
|
+
/** Optional exact queue integration. False means capability was unavailable
|
|
20
|
+
* before election, so the existing supported CLI wake remains the fallback. */
|
|
21
|
+
export declare function wakeCodexSessionInputs(input: {
|
|
22
|
+
sessionId: string;
|
|
23
|
+
env: NodeJS.ProcessEnv;
|
|
24
|
+
lease: DeliveryLease;
|
|
25
|
+
mayWrite(): boolean;
|
|
26
|
+
mayWake(): boolean;
|
|
27
|
+
unknownAllowed?(): boolean;
|
|
28
|
+
connect?: typeof connectCodexQueue;
|
|
29
|
+
}): Promise<boolean>;
|
|
30
|
+
/** Hook drains and the resident observer both call this bounded cleanup path.
|
|
31
|
+
* It never elects a wake, claims input, or acquires the delivery sequencer. */
|
|
32
|
+
export declare function reconcileSessionInputWakes(sessionId: string, env: NodeJS.ProcessEnv, connect?: typeof connectCodexQueue): Promise<void>;
|
|
33
|
+
export interface PreparedInputAnswer {
|
|
34
|
+
presentation: NativeAnswerPresentation;
|
|
35
|
+
/** Refresh exact binding evidence inside the final consumption transaction. */
|
|
36
|
+
validate(state: SessionState): {
|
|
37
|
+
state: SessionState;
|
|
38
|
+
valid: boolean;
|
|
39
|
+
};
|
|
40
|
+
write(mayWrite: () => boolean): Promise<void>;
|
|
41
|
+
close(): void;
|
|
42
|
+
}
|
|
43
|
+
export interface NativeInputAnswers {
|
|
44
|
+
eligible(answer: AnsweredPending, state: SessionState): boolean;
|
|
45
|
+
/** No answer bytes. Null chooses ordinary presentation of the same prefix. */
|
|
46
|
+
prepare(answer: AnsweredPending, state: SessionState, deadline: number): Promise<PreparedInputAnswer | null>;
|
|
47
|
+
}
|
|
48
|
+
/** One ordered prefix, at most 20 inputs, with ownership checked at the byte. */
|
|
49
|
+
declare function drainSessionInputsOnce(input: {
|
|
18
50
|
sequencer: SequencerDeps;
|
|
19
51
|
lease: DeliveryLease | null;
|
|
20
52
|
mayWrite(): boolean;
|
|
21
53
|
write(text: string): void;
|
|
54
|
+
nativeAnswers?: NativeInputAnswers;
|
|
22
55
|
}): Promise<boolean>;
|
|
56
|
+
export declare function drainSessionInputs(input: Parameters<typeof drainSessionInputsOnce>[0]): Promise<boolean>;
|
|
57
|
+
export {};
|