@raidiant/notifai 11.7.1 → 12.0.0-beta.13
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 +57 -0
- package/NOTICE +16 -0
- package/THIRD_PARTY_NOTICES +725 -0
- package/bin/notifai.mjs +11420 -0
- package/data/install.ps1 +318 -0
- package/data/release.json +1 -0
- package/inventory.json +1 -0
- package/npm-adapter-files.json +52 -0
- package/package.json +14 -44
- package/README.md +0 -168
- package/dist/agent-update-notice.d.ts +0 -7
- package/dist/agent-update-notice.js +0 -77
- package/dist/agent-update-notice.js.map +0 -1
- package/dist/atomic-file.d.ts +0 -30
- package/dist/atomic-file.js +0 -148
- package/dist/atomic-file.js.map +0 -1
- package/dist/attendant-update.d.ts +0 -15
- package/dist/attendant-update.js +0 -96
- package/dist/attendant-update.js.map +0 -1
- package/dist/claude-wake.d.ts +0 -108
- package/dist/claude-wake.js +0 -369
- package/dist/claude-wake.js.map +0 -1
- package/dist/cli-bin.d.ts +0 -26
- package/dist/cli-bin.js +0 -220
- package/dist/cli-bin.js.map +0 -1
- package/dist/cli-contract.d.ts +0 -16
- package/dist/cli-contract.js +0 -27
- package/dist/cli-contract.js.map +0 -1
- package/dist/cli-release.d.ts +0 -36
- package/dist/cli-release.js +0 -85
- package/dist/cli-release.js.map +0 -1
- package/dist/client.d.ts +0 -109
- package/dist/client.js +0 -217
- package/dist/client.js.map +0 -1
- package/dist/codex-answer-control.d.ts +0 -14
- package/dist/codex-answer-control.js +0 -41
- package/dist/codex-answer-control.js.map +0 -1
- package/dist/codex-answer-presentation.d.ts +0 -18
- package/dist/codex-answer-presentation.js +0 -113
- package/dist/codex-answer-presentation.js.map +0 -1
- package/dist/codex-input-lifecycle.d.ts +0 -10
- package/dist/codex-input-lifecycle.js +0 -63
- package/dist/codex-input-lifecycle.js.map +0 -1
- package/dist/codex-native-control.d.ts +0 -13
- package/dist/codex-native-control.js +0 -120
- package/dist/codex-native-control.js.map +0 -1
- package/dist/codex-native-turn.d.ts +0 -37
- package/dist/codex-native-turn.js +0 -155
- package/dist/codex-native-turn.js.map +0 -1
- package/dist/codex-question-bindings.d.ts +0 -76
- package/dist/codex-question-bindings.js +0 -151
- package/dist/codex-question-bindings.js.map +0 -1
- package/dist/codex-queue-control.d.ts +0 -21
- package/dist/codex-queue-control.js +0 -59
- package/dist/codex-queue-control.js.map +0 -1
- package/dist/codex-tool-messages.d.ts +0 -7
- package/dist/codex-tool-messages.js +0 -126
- package/dist/codex-tool-messages.js.map +0 -1
- package/dist/codex-wake.d.ts +0 -58
- package/dist/codex-wake.js +0 -135
- package/dist/codex-wake.js.map +0 -1
- package/dist/command-session.d.ts +0 -14
- package/dist/command-session.js +0 -31
- package/dist/command-session.js.map +0 -1
- package/dist/commands-acknowledge.d.ts +0 -13
- package/dist/commands-acknowledge.js +0 -116
- package/dist/commands-acknowledge.js.map +0 -1
- package/dist/commands-agent-sessions.d.ts +0 -6
- package/dist/commands-agent-sessions.js +0 -51
- package/dist/commands-agent-sessions.js.map +0 -1
- package/dist/commands-ask.d.ts +0 -62
- package/dist/commands-ask.js +0 -503
- package/dist/commands-ask.js.map +0 -1
- package/dist/commands-auth.d.ts +0 -76
- package/dist/commands-auth.js +0 -421
- package/dist/commands-auth.js.map +0 -1
- package/dist/commands-close.d.ts +0 -6
- package/dist/commands-close.js +0 -273
- package/dist/commands-close.js.map +0 -1
- package/dist/commands-config.d.ts +0 -31
- package/dist/commands-config.js +0 -272
- package/dist/commands-config.js.map +0 -1
- package/dist/commands-core.d.ts +0 -145
- package/dist/commands-core.js +0 -190
- package/dist/commands-core.js.map +0 -1
- package/dist/commands-devices.d.ts +0 -41
- package/dist/commands-devices.js +0 -144
- package/dist/commands-devices.js.map +0 -1
- package/dist/commands-doctor.d.ts +0 -25
- package/dist/commands-doctor.js +0 -1553
- package/dist/commands-doctor.js.map +0 -1
- package/dist/commands-guidance.d.ts +0 -27
- package/dist/commands-guidance.js +0 -150
- package/dist/commands-guidance.js.map +0 -1
- package/dist/commands-harness-context.d.ts +0 -57
- package/dist/commands-harness-context.js +0 -102
- package/dist/commands-harness-context.js.map +0 -1
- package/dist/commands-hook-attend.d.ts +0 -70
- package/dist/commands-hook-attend.js +0 -655
- package/dist/commands-hook-attend.js.map +0 -1
- package/dist/commands-hook-diagnostics.d.ts +0 -37
- package/dist/commands-hook-diagnostics.js +0 -136
- package/dist/commands-hook-diagnostics.js.map +0 -1
- package/dist/commands-hook-install.d.ts +0 -26
- package/dist/commands-hook-install.js +0 -784
- package/dist/commands-hook-install.js.map +0 -1
- package/dist/commands-hook-run.d.ts +0 -29
- package/dist/commands-hook-run.js +0 -933
- package/dist/commands-hook-run.js.map +0 -1
- package/dist/commands-hook-shape.d.ts +0 -19
- package/dist/commands-hook-shape.js +0 -48
- package/dist/commands-hook-shape.js.map +0 -1
- package/dist/commands-init.d.ts +0 -42
- package/dist/commands-init.js +0 -901
- package/dist/commands-init.js.map +0 -1
- package/dist/commands-io.d.ts +0 -2
- package/dist/commands-io.js +0 -117
- package/dist/commands-io.js.map +0 -1
- package/dist/commands-logs.d.ts +0 -30
- package/dist/commands-logs.js +0 -201
- package/dist/commands-logs.js.map +0 -1
- package/dist/commands-native-acknowledge.d.ts +0 -8
- package/dist/commands-native-acknowledge.js +0 -114
- package/dist/commands-native-acknowledge.js.map +0 -1
- package/dist/commands-project.d.ts +0 -4
- package/dist/commands-project.js +0 -41
- package/dist/commands-project.js.map +0 -1
- package/dist/commands-receive.d.ts +0 -3
- package/dist/commands-receive.js +0 -59
- package/dist/commands-receive.js.map +0 -1
- package/dist/commands-send-support.d.ts +0 -59
- package/dist/commands-send-support.js +0 -258
- package/dist/commands-send-support.js.map +0 -1
- package/dist/commands-send.d.ts +0 -34
- package/dist/commands-send.js +0 -900
- package/dist/commands-send.js.map +0 -1
- package/dist/commands-setup-proof.d.ts +0 -43
- package/dist/commands-setup-proof.js +0 -134
- package/dist/commands-setup-proof.js.map +0 -1
- package/dist/commands-skill.d.ts +0 -21
- package/dist/commands-skill.js +0 -199
- package/dist/commands-skill.js.map +0 -1
- package/dist/commands-sounds.d.ts +0 -12
- package/dist/commands-sounds.js +0 -35
- package/dist/commands-sounds.js.map +0 -1
- package/dist/commands-update-check.d.ts +0 -6
- package/dist/commands-update-check.js +0 -102
- package/dist/commands-update-check.js.map +0 -1
- package/dist/commands-update-resume.d.ts +0 -7
- package/dist/commands-update-resume.js +0 -143
- package/dist/commands-update-resume.js.map +0 -1
- package/dist/commands-update-skill.d.ts +0 -5
- package/dist/commands-update-skill.js +0 -36
- package/dist/commands-update-skill.js.map +0 -1
- package/dist/commands-update.d.ts +0 -11
- package/dist/commands-update.js +0 -286
- package/dist/commands-update.js.map +0 -1
- package/dist/commands.d.ts +0 -26
- package/dist/commands.js +0 -27
- package/dist/commands.js.map +0 -1
- package/dist/config-schema.d.ts +0 -62
- package/dist/config-schema.js +0 -302
- package/dist/config-schema.js.map +0 -1
- package/dist/config.d.ts +0 -181
- package/dist/config.js +0 -357
- package/dist/config.js.map +0 -1
- package/dist/credentials.d.ts +0 -96
- package/dist/credentials.js +0 -342
- package/dist/credentials.js.map +0 -1
- package/dist/file-lock.d.ts +0 -34
- package/dist/file-lock.js +0 -367
- package/dist/file-lock.js.map +0 -1
- package/dist/generated-session-label.d.ts +0 -2
- package/dist/generated-session-label.js +0 -152
- package/dist/generated-session-label.js.map +0 -1
- package/dist/guidance-content.d.ts +0 -53
- package/dist/guidance-content.js +0 -248
- package/dist/guidance-content.js.map +0 -1
- package/dist/guidance-render.d.ts +0 -25
- package/dist/guidance-render.js +0 -47
- package/dist/guidance-render.js.map +0 -1
- package/dist/guidance.d.ts +0 -69
- package/dist/guidance.js +0 -173
- package/dist/guidance.js.map +0 -1
- package/dist/harness-session-title.d.ts +0 -22
- package/dist/harness-session-title.js +0 -74
- package/dist/harness-session-title.js.map +0 -1
- package/dist/harnesses.d.ts +0 -65
- package/dist/harnesses.js +0 -159
- package/dist/harnesses.js.map +0 -1
- package/dist/hermes-attendant.d.ts +0 -38
- package/dist/hermes-attendant.js +0 -337
- package/dist/hermes-attendant.js.map +0 -1
- package/dist/hermes-plugin.d.ts +0 -11
- package/dist/hermes-plugin.js +0 -299
- package/dist/hermes-plugin.js.map +0 -1
- package/dist/hook-acknowledgements.d.ts +0 -70
- package/dist/hook-acknowledgements.js +0 -490
- package/dist/hook-acknowledgements.js.map +0 -1
- package/dist/hook-adapter.d.ts +0 -48
- package/dist/hook-adapter.js +0 -419
- package/dist/hook-adapter.js.map +0 -1
- package/dist/hook-events.d.ts +0 -105
- package/dist/hook-events.js +0 -130
- package/dist/hook-events.js.map +0 -1
- package/dist/hook-gates.d.ts +0 -7
- package/dist/hook-gates.js +0 -20
- package/dist/hook-gates.js.map +0 -1
- package/dist/hook-input.d.ts +0 -10
- package/dist/hook-input.js +0 -64
- package/dist/hook-input.js.map +0 -1
- package/dist/hook-lifecycle.d.ts +0 -112
- package/dist/hook-lifecycle.js +0 -2031
- package/dist/hook-lifecycle.js.map +0 -1
- package/dist/hook-project-sessions.d.ts +0 -28
- package/dist/hook-project-sessions.js +0 -141
- package/dist/hook-project-sessions.js.map +0 -1
- package/dist/hook-question-lock.d.ts +0 -29
- package/dist/hook-question-lock.js +0 -217
- package/dist/hook-question-lock.js.map +0 -1
- package/dist/hook-question-retirement.d.ts +0 -74
- package/dist/hook-question-retirement.js +0 -314
- package/dist/hook-question-retirement.js.map +0 -1
- package/dist/hook-question-state.d.ts +0 -58
- package/dist/hook-question-state.js +0 -239
- package/dist/hook-question-state.js.map +0 -1
- package/dist/hook-session-state.d.ts +0 -127
- package/dist/hook-session-state.js +0 -488
- package/dist/hook-session-state.js.map +0 -1
- package/dist/hook-types.d.ts +0 -476
- package/dist/hook-types.js +0 -4
- package/dist/hook-types.js.map +0 -1
- package/dist/injection-render.d.ts +0 -36
- package/dist/injection-render.js +0 -61
- package/dist/injection-render.js.map +0 -1
- package/dist/install-hooks.d.ts +0 -470
- package/dist/install-hooks.js +0 -1622
- package/dist/install-hooks.js.map +0 -1
- package/dist/integration-health.d.ts +0 -26
- package/dist/integration-health.js +0 -133
- package/dist/integration-health.js.map +0 -1
- package/dist/interactive.d.ts +0 -22
- package/dist/interactive.js +0 -644
- package/dist/interactive.js.map +0 -1
- package/dist/invocation-context.d.ts +0 -47
- package/dist/invocation-context.js +0 -164
- package/dist/invocation-context.js.map +0 -1
- package/dist/local-path.d.ts +0 -7
- package/dist/local-path.js +0 -27
- package/dist/local-path.js.map +0 -1
- package/dist/logging.d.ts +0 -157
- package/dist/logging.js +0 -599
- package/dist/logging.js.map +0 -1
- package/dist/main-run.d.ts +0 -1
- package/dist/main-run.js +0 -42
- package/dist/main-run.js.map +0 -1
- package/dist/main.d.ts +0 -2
- package/dist/main.js +0 -12
- package/dist/main.js.map +0 -1
- package/dist/native-answer-operation.d.ts +0 -70
- package/dist/native-answer-operation.js +0 -247
- package/dist/native-answer-operation.js.map +0 -1
- package/dist/native-skills.d.ts +0 -64
- package/dist/native-skills.js +0 -167
- package/dist/native-skills.js.map +0 -1
- package/dist/node-floor.d.ts +0 -19
- package/dist/node-floor.js +0 -32
- package/dist/node-floor.js.map +0 -1
- package/dist/npm-invocation.d.ts +0 -34
- package/dist/npm-invocation.js +0 -53
- package/dist/npm-invocation.js.map +0 -1
- package/dist/openclaw-continuation-bridge.d.ts +0 -7
- package/dist/openclaw-continuation-bridge.js +0 -64
- package/dist/openclaw-continuation-bridge.js.map +0 -1
- package/dist/openclaw-gateway-readiness.d.ts +0 -1
- package/dist/openclaw-gateway-readiness.js +0 -24
- package/dist/openclaw-gateway-readiness.js.map +0 -1
- package/dist/openclaw-generation.d.ts +0 -21
- package/dist/openclaw-generation.js +0 -115
- package/dist/openclaw-generation.js.map +0 -1
- package/dist/openclaw-message-bridge.d.ts +0 -8
- package/dist/openclaw-message-bridge.js +0 -93
- package/dist/openclaw-message-bridge.js.map +0 -1
- package/dist/openclaw-pending.d.ts +0 -8
- package/dist/openclaw-pending.js +0 -47
- package/dist/openclaw-pending.js.map +0 -1
- package/dist/openclaw-plugin.d.ts +0 -75
- package/dist/openclaw-plugin.js +0 -1353
- package/dist/openclaw-plugin.js.map +0 -1
- package/dist/openclaw-session-access.d.ts +0 -12
- package/dist/openclaw-session-access.js +0 -79
- package/dist/openclaw-session-access.js.map +0 -1
- package/dist/opencode-plugin.d.ts +0 -88
- package/dist/opencode-plugin.js +0 -286
- package/dist/opencode-plugin.js.map +0 -1
- package/dist/orca-session-title.d.ts +0 -11
- package/dist/orca-session-title.js +0 -111
- package/dist/orca-session-title.js.map +0 -1
- package/dist/pack-feedback-slice.d.ts +0 -35
- package/dist/pack-feedback-slice.js +0 -126
- package/dist/pack-feedback-slice.js.map +0 -1
- package/dist/pairing-qr.d.ts +0 -5
- package/dist/pairing-qr.js +0 -24
- package/dist/pairing-qr.js.map +0 -1
- package/dist/pending-pairing.d.ts +0 -38
- package/dist/pending-pairing.js +0 -70
- package/dist/pending-pairing.js.map +0 -1
- package/dist/platform.d.ts +0 -67
- package/dist/platform.js +0 -140
- package/dist/platform.js.map +0 -1
- package/dist/process-identity.d.ts +0 -26
- package/dist/process-identity.js +0 -82
- package/dist/process-identity.js.map +0 -1
- package/dist/program.d.ts +0 -59
- package/dist/program.js +0 -691
- package/dist/program.js.map +0 -1
- package/dist/project-enablement.d.ts +0 -21
- package/dist/project-enablement.js +0 -71
- package/dist/project-enablement.js.map +0 -1
- package/dist/question-settlement-process.d.ts +0 -17
- package/dist/question-settlement-process.js +0 -35
- package/dist/question-settlement-process.js.map +0 -1
- package/dist/question-timing.d.ts +0 -46
- package/dist/question-timing.js +0 -48
- package/dist/question-timing.js.map +0 -1
- package/dist/readiness.d.ts +0 -153
- package/dist/readiness.js +0 -149
- package/dist/readiness.js.map +0 -1
- package/dist/release.d.ts +0 -31
- package/dist/release.js +0 -52
- package/dist/release.js.map +0 -1
- package/dist/send-attempts.d.ts +0 -26
- package/dist/send-attempts.js +0 -139
- package/dist/send-attempts.js.map +0 -1
- package/dist/send.d.ts +0 -115
- package/dist/send.js +0 -421
- package/dist/send.js.map +0 -1
- package/dist/session-activation.d.ts +0 -13
- package/dist/session-activation.js +0 -64
- package/dist/session-activation.js.map +0 -1
- package/dist/session-attendant-probe.d.ts +0 -85
- package/dist/session-attendant-probe.js +0 -173
- package/dist/session-attendant-probe.js.map +0 -1
- package/dist/session-attendant-state.d.ts +0 -70
- package/dist/session-attendant-state.js +0 -256
- package/dist/session-attendant-state.js.map +0 -1
- package/dist/session-attendant.d.ts +0 -143
- package/dist/session-attendant.js +0 -520
- package/dist/session-attendant.js.map +0 -1
- package/dist/session-delivery.d.ts +0 -249
- package/dist/session-delivery.js +0 -576
- package/dist/session-delivery.js.map +0 -1
- package/dist/session-handoff.d.ts +0 -98
- package/dist/session-handoff.js +0 -118
- package/dist/session-handoff.js.map +0 -1
- package/dist/session-input-wakes.d.ts +0 -78
- package/dist/session-input-wakes.js +0 -239
- package/dist/session-input-wakes.js.map +0 -1
- package/dist/session-inputs.d.ts +0 -57
- package/dist/session-inputs.js +0 -434
- package/dist/session-inputs.js.map +0 -1
- package/dist/session-labels.d.ts +0 -56
- package/dist/session-labels.js +0 -396
- package/dist/session-labels.js.map +0 -1
- package/dist/session-message-handoff.d.ts +0 -39
- package/dist/session-message-handoff.js +0 -107
- package/dist/session-message-handoff.js.map +0 -1
- package/dist/setup-destinations.d.ts +0 -23
- package/dist/setup-destinations.js +0 -44
- package/dist/setup-destinations.js.map +0 -1
- package/dist/skill-integrity.d.ts +0 -54
- package/dist/skill-integrity.js +0 -164
- package/dist/skill-integrity.js.map +0 -1
- package/dist/skill-source/manifest.json +0 -40
- package/dist/skill-source/notifai/SKILL.md +0 -350
- package/dist/skill-source/notifai/references/diagnostics.md +0 -36
- package/dist/skill-source/notifai/references/harness-setup.md +0 -384
- package/dist/skill-source/notifai/references/native-questions.md +0 -51
- package/dist/skill-source/notifai/references/notes-and-edits.md +0 -54
- package/dist/skill-source/notifai/references/send-details.md +0 -14
- package/dist/skill-source/notifai/references/updates.md +0 -116
- package/dist/skill-source/notifai/references/writing-examples.md +0 -56
- package/dist/sound-ref.d.ts +0 -23
- package/dist/sound-ref.js +0 -28
- package/dist/sound-ref.js.map +0 -1
- package/dist/ui/banner.d.ts +0 -22
- package/dist/ui/banner.js +0 -87
- package/dist/ui/banner.js.map +0 -1
- package/dist/ui/config-view.d.ts +0 -30
- package/dist/ui/config-view.js +0 -108
- package/dist/ui/config-view.js.map +0 -1
- package/dist/ui/help.d.ts +0 -44
- package/dist/ui/help.js +0 -107
- package/dist/ui/help.js.map +0 -1
- package/dist/ui/theme.d.ts +0 -90
- package/dist/ui/theme.js +0 -244
- package/dist/ui/theme.js.map +0 -1
- package/dist/update-handoff.d.ts +0 -29
- package/dist/update-handoff.js +0 -69
- package/dist/update-handoff.js.map +0 -1
- package/dist/url-policy.d.ts +0 -85
- package/dist/url-policy.js +0 -369
- package/dist/url-policy.js.map +0 -1
- package/dist/version.d.ts +0 -40
- package/dist/version.js +0 -132
- package/dist/version.js.map +0 -1
- package/dist/wake-support.d.ts +0 -40
- package/dist/wake-support.js +0 -95
- package/dist/wake-support.js.map +0 -1
package/dist/session-delivery.js
DELETED
|
@@ -1,576 +0,0 @@
|
|
|
1
|
-
import { DELIVERY_CLAIM_REFUSAL_REASONS } from '@raidiant/notifai-protocol';
|
|
2
|
-
import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from 'node:fs';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import { atomicWriteFileSync } from './atomic-file.js';
|
|
5
|
-
import { ApiCallError, NetworkError } from './client.js';
|
|
6
|
-
import { sanitizeSessionId, stateDir } from './config.js';
|
|
7
|
-
import { withFileLock } from './file-lock.js';
|
|
8
|
-
import { acquireClaimFile, releaseClaimFile } from './hook-question-lock.js';
|
|
9
|
-
import { normalizeProcessStart, processIdentityLiveness, } from './process-identity.js';
|
|
10
|
-
/** How long a writer waits for another writer's hand-off into the same session. */
|
|
11
|
-
export const DELIVERY_LOCK_WAIT_MS = 30_000;
|
|
12
|
-
/** A write must be committed at least this long before its claim deadline. */
|
|
13
|
-
export const DELIVERY_WRITE_MARGIN_MS = 2_000;
|
|
14
|
-
/** The first byte of a write must leave at least this long before the deadline. */
|
|
15
|
-
export const DELIVERY_WRITE_BOUNDARY_MS = 500;
|
|
16
|
-
/** Settled attempts stay readable as long as an Answer Edit may still need them. */
|
|
17
|
-
const JOURNAL_KEEP_MS = 7 * 24 * 3600 * 1000;
|
|
18
|
-
const JOURNAL_CAP = 200;
|
|
19
|
-
const LOCK_POLL_MS = 100;
|
|
20
|
-
export function deliveryJournalPath(sessionId, env) {
|
|
21
|
-
return path.join(stateDir(env), 'sessions', `${sanitizeSessionId(sessionId)}.deliveries`);
|
|
22
|
-
}
|
|
23
|
-
export function deliveryLockPath(sessionId, env) {
|
|
24
|
-
return path.join(stateDir(env), 'sessions', `${sanitizeSessionId(sessionId)}.delivering`);
|
|
25
|
-
}
|
|
26
|
-
/** What an attempt's journal stage lets anyone report for it once its writer is gone. */
|
|
27
|
-
export function recoveredOutcome(stage) {
|
|
28
|
-
switch (stage) {
|
|
29
|
-
case 'claimed':
|
|
30
|
-
case 'released':
|
|
31
|
-
return 'released';
|
|
32
|
-
case 'written':
|
|
33
|
-
return 'handed_off';
|
|
34
|
-
case 'writing':
|
|
35
|
-
case 'failed':
|
|
36
|
-
return 'unconfirmed';
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
export function readDeliveryJournal(sessionId, env) {
|
|
40
|
-
const file = deliveryJournalPath(sessionId, env);
|
|
41
|
-
if (!existsSync(file))
|
|
42
|
-
return [];
|
|
43
|
-
try {
|
|
44
|
-
const parsed = JSON.parse(readFileSync(file, 'utf8'));
|
|
45
|
-
const entries = parsed?.entries;
|
|
46
|
-
return Array.isArray(entries) ? entries.filter(isJournalEntry) : [];
|
|
47
|
-
}
|
|
48
|
-
catch {
|
|
49
|
-
// A corrupt journal is no evidence: nothing is reported from it and no
|
|
50
|
-
// writer is proven gone by it.
|
|
51
|
-
return [];
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
function updateDeliveryJournal(sessionId, env, update) {
|
|
55
|
-
const file = deliveryJournalPath(sessionId, env);
|
|
56
|
-
withFileLock(`${file}.lock`, () => {
|
|
57
|
-
const next = update(readDeliveryJournal(sessionId, env));
|
|
58
|
-
atomicWriteFileSync(file, `${JSON.stringify({ session_id: sessionId, entries: next }, null, 2)}\n`);
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
function setStage(deps, attemptIds, stage) {
|
|
62
|
-
updateDeliveryJournal(deps.sessionId, deps.env, (entries) => entries.map((entry) => (attemptIds.has(entry.attempt_id) ? { ...entry, stage } : entry)));
|
|
63
|
-
}
|
|
64
|
-
/** Attempts this process is between claim and report; recovery never reports them. */
|
|
65
|
-
const inFlight = new Set();
|
|
66
|
-
/**
|
|
67
|
-
* Exclusive right to hand off into one session, held by PID and start time so
|
|
68
|
-
* a writer that died never keeps it. Null when another writer kept it longer
|
|
69
|
-
* than `waitMs`.
|
|
70
|
-
*/
|
|
71
|
-
export async function acquireDeliveryLock(deps, waitMs = DELIVERY_LOCK_WAIT_MS) {
|
|
72
|
-
const file = deliveryLockPath(deps.sessionId, deps.env);
|
|
73
|
-
const deadline = deps.monotonic() + waitMs;
|
|
74
|
-
for (;;) {
|
|
75
|
-
const token = acquireClaimFile(file, { purpose: 'delivery' }, deps.wall());
|
|
76
|
-
if (token !== null) {
|
|
77
|
-
let released = false;
|
|
78
|
-
return {
|
|
79
|
-
release: () => {
|
|
80
|
-
if (released)
|
|
81
|
-
return;
|
|
82
|
-
released = true;
|
|
83
|
-
releaseClaimFile(file, token);
|
|
84
|
-
},
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
if (deps.monotonic() >= deadline)
|
|
88
|
-
return null;
|
|
89
|
-
await deps.sleep(LOCK_POLL_MS);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
function sameProcess(a, b) {
|
|
93
|
-
return a.pid === b.pid && normalizeProcessStart(a.start) === normalizeProcessStart(b.start);
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Report every unreported attempt whose writer can no longer report it: one
|
|
97
|
-
* that is gone, or this process's own attempt whose report failed earlier.
|
|
98
|
-
* A live writer's attempt is its own to report. Settled entries are pruned.
|
|
99
|
-
*/
|
|
100
|
-
export async function recoverDeliveryJournal(deps) {
|
|
101
|
-
const liveness = deps.liveness ?? ((identity) => processIdentityLiveness(identity));
|
|
102
|
-
let reported = 0;
|
|
103
|
-
for (const entry of readDeliveryJournal(deps.sessionId, deps.env)) {
|
|
104
|
-
if (deps.recoveryDeadline !== undefined && deps.monotonic() >= deps.recoveryDeadline)
|
|
105
|
-
break;
|
|
106
|
-
if (!reportable(entry, deps.writer, liveness))
|
|
107
|
-
continue;
|
|
108
|
-
if (entry.unclaimed === true) {
|
|
109
|
-
if (await recordUnclaimed(deps, entry))
|
|
110
|
-
reported += 1;
|
|
111
|
-
continue;
|
|
112
|
-
}
|
|
113
|
-
const own = sameProcess(entry.writer, deps.writer);
|
|
114
|
-
const outcome = recoveredOutcome(entry.stage);
|
|
115
|
-
if (await reportAttempt(deps, entry.attempt_id, outcome, own ? 'retry' : 'recovered'))
|
|
116
|
-
reported += 1;
|
|
117
|
-
}
|
|
118
|
-
const cutoff = deps.wall() - JOURNAL_KEEP_MS;
|
|
119
|
-
updateDeliveryJournal(deps.sessionId, deps.env, (entries) => {
|
|
120
|
-
// Unsettled entries are never pruned; settled ones age out and are capped.
|
|
121
|
-
const settled = entries.filter((entry) => entry.reported !== undefined && (entry.reported_at ?? entry.claimed_at) >= cutoff);
|
|
122
|
-
const keep = new Set(settled.slice(-JOURNAL_CAP));
|
|
123
|
-
return entries.filter((entry) => entry.reported === undefined || keep.has(entry));
|
|
124
|
-
});
|
|
125
|
-
return reported;
|
|
126
|
-
}
|
|
127
|
-
/** Whether a recovery may report this entry now. */
|
|
128
|
-
function reportable(entry, self, liveness) {
|
|
129
|
-
if (entry.reported !== undefined || inFlight.has(entry.attempt_id))
|
|
130
|
-
return false;
|
|
131
|
-
if (entry.unclaimed === true)
|
|
132
|
-
return true;
|
|
133
|
-
return sameProcess(entry.writer, self) || liveness(entry.writer) === 'gone';
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Journal selected answers just written without a claim, then record each
|
|
137
|
-
* with the service. A failed record stays in the journal: the next hand-off in
|
|
138
|
-
* this session, or the machine-wide sweep, records it later.
|
|
139
|
-
*/
|
|
140
|
-
export async function recordUnclaimedHandOffs(deps, requestIds) {
|
|
141
|
-
if (requestIds.length === 0)
|
|
142
|
-
return true;
|
|
143
|
-
const entries = requestIds.map((requestId) => ({
|
|
144
|
-
attempt_id: `unclaimed:${requestId}`,
|
|
145
|
-
subject: { type: 'answer', request_id: requestId },
|
|
146
|
-
stage: 'written',
|
|
147
|
-
writer: deps.writer,
|
|
148
|
-
unclaimed: true,
|
|
149
|
-
claimed_at: deps.wall(),
|
|
150
|
-
}));
|
|
151
|
-
updateDeliveryJournal(deps.sessionId, deps.env, (current) => [
|
|
152
|
-
...current.filter((entry) => !entries.some((added) => added.attempt_id === entry.attempt_id)),
|
|
153
|
-
...entries,
|
|
154
|
-
]);
|
|
155
|
-
let recorded = true;
|
|
156
|
-
for (const entry of entries)
|
|
157
|
-
recorded = (await recordUnclaimed(deps, entry)) && recorded;
|
|
158
|
-
return recorded;
|
|
159
|
-
}
|
|
160
|
-
async function recordUnclaimed(deps, entry) {
|
|
161
|
-
if (entry.subject.type !== 'answer')
|
|
162
|
-
return false;
|
|
163
|
-
const requestId = entry.subject.request_id;
|
|
164
|
-
let settled;
|
|
165
|
-
try {
|
|
166
|
-
const recorded = await deps.client.claimDeliveryAttempt(deps.sessionId, {
|
|
167
|
-
subject: { type: 'answer', request_id: requestId },
|
|
168
|
-
already_handed_off: true,
|
|
169
|
-
});
|
|
170
|
-
settled = { reported: 'handed_off' };
|
|
171
|
-
deps.log?.info('delivery.handoff', {
|
|
172
|
-
subject: 'answer',
|
|
173
|
-
request_id: requestId,
|
|
174
|
-
attempt_id: recorded.attempt_id,
|
|
175
|
-
outcome: 'handed_off',
|
|
176
|
-
source: 'after-the-fact',
|
|
177
|
-
reported: true,
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
catch (err) {
|
|
181
|
-
const refusal = err instanceof ApiCallError && err.status === 409 && err.code === 'claim_refused'
|
|
182
|
-
? refusalReason(err.details)
|
|
183
|
-
: err instanceof ApiCallError && err.status === 404
|
|
184
|
-
? 'not_found'
|
|
185
|
-
: null;
|
|
186
|
-
deps.log?.error('delivery.handoff', {
|
|
187
|
-
subject: 'answer',
|
|
188
|
-
request_id: requestId,
|
|
189
|
-
outcome: 'handed_off',
|
|
190
|
-
source: 'after-the-fact',
|
|
191
|
-
reported: false,
|
|
192
|
-
...(refusal === null ? {} : { refused: refusal }),
|
|
193
|
-
message: err instanceof Error ? err.message : String(err),
|
|
194
|
-
});
|
|
195
|
-
// A transport failure, or another attempt still pending, stays owed: that
|
|
196
|
-
// attempt may yet report `released`, and then this write must be recorded.
|
|
197
|
-
// Every other refusal is final (another attempt settled the answer, this
|
|
198
|
-
// machine does not own the lease, or the answer was never selected).
|
|
199
|
-
if (refusal === null || refusal === 'attempt_pending')
|
|
200
|
-
return false;
|
|
201
|
-
settled = { reported: 'released', refused: refusal };
|
|
202
|
-
}
|
|
203
|
-
const at = deps.wall();
|
|
204
|
-
updateDeliveryJournal(deps.sessionId, deps.env, (entries) => entries.map((candidate) => candidate.attempt_id === entry.attempt_id ? { ...candidate, ...settled, reported_at: at } : candidate));
|
|
205
|
-
return settled.reported === 'handed_off';
|
|
206
|
-
}
|
|
207
|
-
/** At most this often per machine, and at most this many journals per sweep. */
|
|
208
|
-
export const JOURNAL_SWEEP_INTERVAL_MS = 10 * 60_000;
|
|
209
|
-
export const JOURNAL_SWEEP_MAX_JOURNALS = 20;
|
|
210
|
-
/** Journals read per sweep while looking for those that owe something. */
|
|
211
|
-
export const JOURNAL_SWEEP_MAX_SCANNED = 500;
|
|
212
|
-
/**
|
|
213
|
-
* Report, from any hook that already holds a client, the attempts that dead
|
|
214
|
-
* writers left in any session's journal on this machine. A session that never
|
|
215
|
-
* runs again has no next hand-off to recover its journal, and until someone
|
|
216
|
-
* reports, the service keeps those attempts pending (holding their Answer
|
|
217
|
-
* Edits, or a claimed Session Message until its abandonment sweep).
|
|
218
|
-
*
|
|
219
|
-
* Bounded: rate-limited by a stamp file, a fixed number of journals read and
|
|
220
|
-
* recovered per sweep. Only journals that owe something reportable now are
|
|
221
|
-
* recovered, oldest first, so none can be starved. Gone writers' attempts and
|
|
222
|
-
* unrecorded unclaimed hand-offs are reported; a live writer reports its own.
|
|
223
|
-
*/
|
|
224
|
-
export async function sweepDeliveryJournals(input) {
|
|
225
|
-
const directory = path.join(stateDir(input.env), 'sessions');
|
|
226
|
-
const stamp = path.join(stateDir(input.env), 'last-delivery-sweep');
|
|
227
|
-
if (input.force !== true) {
|
|
228
|
-
try {
|
|
229
|
-
if (existsSync(stamp) && input.now - statSync(stamp).mtimeMs < JOURNAL_SWEEP_INTERVAL_MS)
|
|
230
|
-
return 0;
|
|
231
|
-
}
|
|
232
|
-
catch {
|
|
233
|
-
return 0;
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
if (!existsSync(directory))
|
|
237
|
-
return 0;
|
|
238
|
-
mkdirSync(path.dirname(stamp), { recursive: true });
|
|
239
|
-
let cursor = '';
|
|
240
|
-
try {
|
|
241
|
-
cursor = existsSync(stamp) ? readFileSync(stamp, 'utf8').trim() : '';
|
|
242
|
-
}
|
|
243
|
-
catch {
|
|
244
|
-
cursor = '';
|
|
245
|
-
}
|
|
246
|
-
writeFileSync(stamp, cursor, { mode: 0o600 });
|
|
247
|
-
// Read journals round-robin from where the last sweep stopped, so every
|
|
248
|
-
// journal is eventually looked at however many settled ones accumulate, and
|
|
249
|
-
// recover only those that owe something reportable now: settled journals and
|
|
250
|
-
// newer debt can never starve an older one out.
|
|
251
|
-
const liveness = input.liveness ?? ((identity) => processIdentityLiveness(identity));
|
|
252
|
-
const names = readdirSync(directory)
|
|
253
|
-
.filter((name) => name.endsWith('.deliveries'))
|
|
254
|
-
.sort();
|
|
255
|
-
const start = Math.max(0, names.findIndex((name) => name > cursor));
|
|
256
|
-
const rotated = [...names.slice(start), ...names.slice(0, start)];
|
|
257
|
-
const candidates = rotated.slice(0, JOURNAL_SWEEP_MAX_SCANNED).map((name) => ({ file: path.join(directory, name), name }));
|
|
258
|
-
const owing = [];
|
|
259
|
-
let scanned = 0;
|
|
260
|
-
for (const { file } of candidates) {
|
|
261
|
-
if (owing.length >= JOURNAL_SWEEP_MAX_JOURNALS)
|
|
262
|
-
break;
|
|
263
|
-
scanned += 1;
|
|
264
|
-
let sessionId;
|
|
265
|
-
try {
|
|
266
|
-
sessionId = JSON.parse(readFileSync(file, 'utf8')).session_id;
|
|
267
|
-
}
|
|
268
|
-
catch {
|
|
269
|
-
continue;
|
|
270
|
-
}
|
|
271
|
-
if (typeof sessionId !== 'string' || deliveryJournalPath(sessionId, input.env) !== file)
|
|
272
|
-
continue;
|
|
273
|
-
if (readDeliveryJournal(sessionId, input.env).some((entry) => reportable(entry, input.writer, liveness))) {
|
|
274
|
-
owing.push(sessionId);
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
const last = candidates[scanned - 1]?.name;
|
|
278
|
-
if (last !== undefined)
|
|
279
|
-
writeFileSync(stamp, last, { mode: 0o600 });
|
|
280
|
-
let reported = 0;
|
|
281
|
-
for (const sessionId of owing) {
|
|
282
|
-
reported += await recoverDeliveryJournal({
|
|
283
|
-
sessionId,
|
|
284
|
-
env: input.env,
|
|
285
|
-
client: input.client,
|
|
286
|
-
monotonic: () => performance.now(),
|
|
287
|
-
wall: () => input.now,
|
|
288
|
-
sleep: (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds)),
|
|
289
|
-
writer: input.writer,
|
|
290
|
-
...(input.log === undefined ? {} : { log: input.log }),
|
|
291
|
-
...(input.liveness === undefined ? {} : { liveness: input.liveness }),
|
|
292
|
-
});
|
|
293
|
-
}
|
|
294
|
-
return reported;
|
|
295
|
-
}
|
|
296
|
-
/** Report one outcome and record it; false leaves the entry for a later recovery. */
|
|
297
|
-
async function reportAttempt(deps, attemptId, outcome, source) {
|
|
298
|
-
let stored;
|
|
299
|
-
try {
|
|
300
|
-
stored = (await deps.client.reportDeliveryAttempt(attemptId, { outcome })).outcome;
|
|
301
|
-
}
|
|
302
|
-
catch (err) {
|
|
303
|
-
if (!(err instanceof ApiCallError && err.status === 404)) {
|
|
304
|
-
deps.log?.error('delivery.handoff', {
|
|
305
|
-
attempt_id: attemptId,
|
|
306
|
-
outcome,
|
|
307
|
-
source,
|
|
308
|
-
reported: false,
|
|
309
|
-
message: err instanceof Error ? err.message : String(err),
|
|
310
|
-
});
|
|
311
|
-
return false;
|
|
312
|
-
}
|
|
313
|
-
// The service keeps no such attempt from this machine; nothing is owed.
|
|
314
|
-
stored = outcome;
|
|
315
|
-
}
|
|
316
|
-
const at = deps.wall();
|
|
317
|
-
updateDeliveryJournal(deps.sessionId, deps.env, (entries) => entries.map((entry) => entry.attempt_id === attemptId ? { ...entry, reported: stored, reported_at: at } : entry));
|
|
318
|
-
deps.log?.info('delivery.handoff', {
|
|
319
|
-
attempt_id: attemptId,
|
|
320
|
-
outcome,
|
|
321
|
-
source,
|
|
322
|
-
reported: true,
|
|
323
|
-
...(stored === outcome ? {} : { stored }),
|
|
324
|
-
});
|
|
325
|
-
return true;
|
|
326
|
-
}
|
|
327
|
-
/**
|
|
328
|
-
* The Answer Edit release proof: this machine's journal names the writer of
|
|
329
|
-
* the fenced answer's latest attempt, and that process is gone. Claimed writes
|
|
330
|
-
* are in-process, so a gone writer leaves nothing that can still write.
|
|
331
|
-
* Deadline expiry alone is never proof.
|
|
332
|
-
*/
|
|
333
|
-
export function answerWriterGone(sessionId, env, requestId, liveness = (identity) => processIdentityLiveness(identity), groupAlive = processGroupAlive) {
|
|
334
|
-
const entry = readDeliveryJournal(sessionId, env)
|
|
335
|
-
.filter((candidate) => candidate.subject.type === 'answer' && candidate.subject.request_id === requestId)
|
|
336
|
-
.at(-1);
|
|
337
|
-
if (entry === undefined || inFlight.has(entry.attempt_id) || liveness(entry.writer) !== 'gone')
|
|
338
|
-
return false;
|
|
339
|
-
if (entry.subprocess !== true)
|
|
340
|
-
return true;
|
|
341
|
-
// A subprocess write is gone only when its whole recorded group is.
|
|
342
|
-
return (entry.groups?.length ?? 0) > 0 && entry.groups.every((pgid) => !groupAlive(pgid));
|
|
343
|
-
}
|
|
344
|
-
/** Signal 0 to a process group: ESRCH means no process of it remains. */
|
|
345
|
-
export function processGroupAlive(pgid) {
|
|
346
|
-
if (!Number.isInteger(pgid) || pgid <= 1)
|
|
347
|
-
return true;
|
|
348
|
-
try {
|
|
349
|
-
process.kill(-pgid, 0);
|
|
350
|
-
return true;
|
|
351
|
-
}
|
|
352
|
-
catch (err) {
|
|
353
|
-
return err.code !== 'ESRCH';
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
/**
|
|
357
|
-
* The answers of this batch whose earlier hand-off already began a write: a
|
|
358
|
-
* restart must never write them again, since the harness has no dedup key.
|
|
359
|
-
*/
|
|
360
|
-
export function answersAlreadyWritten(sessionId, env, requestIds) {
|
|
361
|
-
const wanted = new Set(requestIds);
|
|
362
|
-
const found = new Map();
|
|
363
|
-
for (const entry of readDeliveryJournal(sessionId, env)) {
|
|
364
|
-
if (entry.subject.type !== 'answer' || !wanted.has(entry.subject.request_id))
|
|
365
|
-
continue;
|
|
366
|
-
if (entry.stage === 'writing' || entry.stage === 'failed' || entry.stage === 'written') {
|
|
367
|
-
found.set(entry.subject.request_id, entry.stage);
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
return [...found].map(([requestId, stage]) => ({ requestId, stage }));
|
|
371
|
-
}
|
|
372
|
-
async function claimOne(deps, lease, subject, earlierAnswerWriterGone) {
|
|
373
|
-
const body = {
|
|
374
|
-
incarnation: lease.incarnation,
|
|
375
|
-
generation: lease.generation,
|
|
376
|
-
subject,
|
|
377
|
-
...(earlierAnswerWriterGone ? { earlier_answer_writer_gone: true } : {}),
|
|
378
|
-
};
|
|
379
|
-
// One retry on transport failure: the service replays the same attempt to
|
|
380
|
-
// the same claimant while its deadline stands, so a lost response costs
|
|
381
|
-
// nothing.
|
|
382
|
-
for (let attempt = 1;; attempt += 1) {
|
|
383
|
-
const sentAt = deps.monotonic();
|
|
384
|
-
try {
|
|
385
|
-
const claimed = await deps.client.claimDeliveryAttempt(deps.sessionId, body);
|
|
386
|
-
return {
|
|
387
|
-
attempt: {
|
|
388
|
-
attemptId: claimed.attempt_id,
|
|
389
|
-
subject,
|
|
390
|
-
deadline: sentAt + claimed.claim_remaining_ms,
|
|
391
|
-
},
|
|
392
|
-
};
|
|
393
|
-
}
|
|
394
|
-
catch (err) {
|
|
395
|
-
if (err instanceof ApiCallError) {
|
|
396
|
-
if (err.status === 404)
|
|
397
|
-
return { reason: 'not_found' };
|
|
398
|
-
if (err.status === 409 && err.code === 'claim_refused')
|
|
399
|
-
return { reason: refusalReason(err.details) };
|
|
400
|
-
if (err.status < 500 && err.status !== 408 && err.status !== 429)
|
|
401
|
-
return { reason: 'unavailable' };
|
|
402
|
-
}
|
|
403
|
-
else if (!(err instanceof NetworkError)) {
|
|
404
|
-
return { reason: 'unavailable' };
|
|
405
|
-
}
|
|
406
|
-
if (attempt >= 2)
|
|
407
|
-
return { reason: 'unavailable' };
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
function refusalReason(details) {
|
|
412
|
-
const reason = details?.reason;
|
|
413
|
-
return typeof reason === 'string' && DELIVERY_CLAIM_REFUSAL_REASONS.includes(reason)
|
|
414
|
-
? reason
|
|
415
|
-
: 'not_claimable';
|
|
416
|
-
}
|
|
417
|
-
/**
|
|
418
|
-
* Claim `subjects` for one write under the session's delivery lock. Null when
|
|
419
|
-
* the lock stayed with another writer past `lockWaitMs`; the caller writes
|
|
420
|
-
* nothing claimed then.
|
|
421
|
-
*/
|
|
422
|
-
export async function beginHandOff(deps, request) {
|
|
423
|
-
const lock = await acquireDeliveryLock(deps, request.lockWaitMs);
|
|
424
|
-
if (lock === null)
|
|
425
|
-
return null;
|
|
426
|
-
const claimed = [];
|
|
427
|
-
const refused = [];
|
|
428
|
-
try {
|
|
429
|
-
await recoverDeliveryJournal(deps);
|
|
430
|
-
for (const subject of request.subjects) {
|
|
431
|
-
if (request.lease === null) {
|
|
432
|
-
refused.push({ subject, reason: 'unavailable' });
|
|
433
|
-
break;
|
|
434
|
-
}
|
|
435
|
-
if (request.mayClaim?.() === false)
|
|
436
|
-
break;
|
|
437
|
-
if (request.stopAtRefusal && request.mayWrite?.() === false)
|
|
438
|
-
break;
|
|
439
|
-
const result = await claimOne(deps, request.lease, subject, request.earlierAnswerWriterGone?.(subject) ?? false);
|
|
440
|
-
if ('reason' in result) {
|
|
441
|
-
refused.push({ subject, reason: result.reason });
|
|
442
|
-
deps.log?.info('delivery.claimed', { ...subjectFields(subject), claimed: false, reason: result.reason });
|
|
443
|
-
if (request.stopAtRefusal && result.reason !== 'not_claimable' && result.reason !== 'not_found')
|
|
444
|
-
break;
|
|
445
|
-
continue;
|
|
446
|
-
}
|
|
447
|
-
claimed.push(result.attempt);
|
|
448
|
-
inFlight.add(result.attempt.attemptId);
|
|
449
|
-
const entry = {
|
|
450
|
-
attempt_id: result.attempt.attemptId,
|
|
451
|
-
subject,
|
|
452
|
-
stage: 'claimed',
|
|
453
|
-
writer: deps.writer,
|
|
454
|
-
claimed_at: deps.wall(),
|
|
455
|
-
};
|
|
456
|
-
updateDeliveryJournal(deps.sessionId, deps.env, (entries) => [...entries, entry]);
|
|
457
|
-
deps.log?.info('delivery.claimed', {
|
|
458
|
-
...subjectFields(subject),
|
|
459
|
-
claimed: true,
|
|
460
|
-
attempt_id: result.attempt.attemptId,
|
|
461
|
-
generation: request.lease.generation,
|
|
462
|
-
});
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
catch (err) {
|
|
466
|
-
// Journal I/O failed around a claim: give back what was claimed, unwritten.
|
|
467
|
-
await settle(deps, claimed, 'released', lock);
|
|
468
|
-
throw err;
|
|
469
|
-
}
|
|
470
|
-
let began = false;
|
|
471
|
-
let finished = false;
|
|
472
|
-
const attemptIds = new Set(claimed.map((attempt) => attempt.attemptId));
|
|
473
|
-
const earliest = Math.min(...claimed.map((attempt) => attempt.deadline));
|
|
474
|
-
const committable = () => deps.monotonic() < earliest - DELIVERY_WRITE_MARGIN_MS;
|
|
475
|
-
return {
|
|
476
|
-
claimed,
|
|
477
|
-
refused,
|
|
478
|
-
begin: (commit, options = {}) => {
|
|
479
|
-
if (finished)
|
|
480
|
-
return false;
|
|
481
|
-
if (began)
|
|
482
|
-
return true;
|
|
483
|
-
if (!committable()) {
|
|
484
|
-
deps.log?.info('delivery.handoff', { attempts: claimed.length, began: false, reason: 'claim-deadline' });
|
|
485
|
-
return false;
|
|
486
|
-
}
|
|
487
|
-
if (request.mayWrite !== undefined && !request.mayWrite())
|
|
488
|
-
return false;
|
|
489
|
-
// The lease check can block; the caller's fence must not run late.
|
|
490
|
-
if (!committable()) {
|
|
491
|
-
deps.log?.info('delivery.handoff', { attempts: claimed.length, began: false, reason: 'claim-deadline' });
|
|
492
|
-
return false;
|
|
493
|
-
}
|
|
494
|
-
if (commit !== undefined && !commit())
|
|
495
|
-
return false;
|
|
496
|
-
if (claimed.length > 0) {
|
|
497
|
-
updateDeliveryJournal(deps.sessionId, deps.env, (entries) => entries.map((entry) => attemptIds.has(entry.attempt_id)
|
|
498
|
-
? { ...entry, stage: 'writing', ...(options.subprocess === true ? { subprocess: true } : {}),
|
|
499
|
-
...(options.presentation === undefined ? {} : { presentation: structuredClone(options.presentation) }) }
|
|
500
|
-
: entry));
|
|
501
|
-
// Everything above may have blocked: the deadline holds after it too.
|
|
502
|
-
if (!committable()) {
|
|
503
|
-
updateDeliveryJournal(deps.sessionId, deps.env, (entries) => entries.map((entry) => {
|
|
504
|
-
if (!attemptIds.has(entry.attempt_id))
|
|
505
|
-
return entry;
|
|
506
|
-
const reverted = { ...entry, stage: 'claimed' };
|
|
507
|
-
delete reverted.subprocess;
|
|
508
|
-
delete reverted.presentation;
|
|
509
|
-
return reverted;
|
|
510
|
-
}));
|
|
511
|
-
deps.log?.info('delivery.handoff', { attempts: claimed.length, began: false, reason: 'claim-deadline' });
|
|
512
|
-
return false;
|
|
513
|
-
}
|
|
514
|
-
}
|
|
515
|
-
began = true;
|
|
516
|
-
return true;
|
|
517
|
-
},
|
|
518
|
-
writable: () => claimed.length === 0 || deps.monotonic() < earliest - DELIVERY_WRITE_BOUNDARY_MS,
|
|
519
|
-
remainingMs: () => claimed.length === 0 ? Number.POSITIVE_INFINITY : Math.max(0, earliest - DELIVERY_WRITE_BOUNDARY_MS - deps.monotonic()),
|
|
520
|
-
recordGroup: (pgid) => {
|
|
521
|
-
if (claimed.length === 0)
|
|
522
|
-
return;
|
|
523
|
-
updateDeliveryJournal(deps.sessionId, deps.env, (entries) => entries.map((entry) => attemptIds.has(entry.attempt_id) ? { ...entry, groups: [...new Set([...(entry.groups ?? []), pgid])] } : entry));
|
|
524
|
-
},
|
|
525
|
-
finish: async (result) => {
|
|
526
|
-
if (finished)
|
|
527
|
-
return;
|
|
528
|
-
finished = true;
|
|
529
|
-
// A write that began and did not complete may have reached the harness,
|
|
530
|
-
// unless it was stopped before its first byte left.
|
|
531
|
-
const stage = !began || result === 'aborted' ? 'released' : result === 'written' ? 'written' : 'failed';
|
|
532
|
-
await settle(deps, claimed, stage, lock);
|
|
533
|
-
},
|
|
534
|
-
};
|
|
535
|
-
}
|
|
536
|
-
async function settle(deps, claimed, stage, lock) {
|
|
537
|
-
try {
|
|
538
|
-
if (claimed.length > 0)
|
|
539
|
-
setStage(deps, new Set(claimed.map((attempt) => attempt.attemptId)), stage);
|
|
540
|
-
}
|
|
541
|
-
finally {
|
|
542
|
-
lock.release();
|
|
543
|
-
}
|
|
544
|
-
const outcome = recoveredOutcome(stage);
|
|
545
|
-
for (const attempt of claimed) {
|
|
546
|
-
let reported = false;
|
|
547
|
-
for (let round = 0; round < 3 && !reported; round += 1) {
|
|
548
|
-
if (round > 0)
|
|
549
|
-
await deps.sleep(1_000 * round);
|
|
550
|
-
reported = await reportAttempt(deps, attempt.attemptId, outcome, 'writer');
|
|
551
|
-
}
|
|
552
|
-
// Unreported stays in the journal; this process or the next lock holder
|
|
553
|
-
// reports it, and until then the service treats the outcome as pending.
|
|
554
|
-
inFlight.delete(attempt.attemptId);
|
|
555
|
-
}
|
|
556
|
-
}
|
|
557
|
-
function subjectFields(subject) {
|
|
558
|
-
return subject.type === 'answer'
|
|
559
|
-
? { subject: 'answer', request_id: subject.request_id }
|
|
560
|
-
: { subject: 'session_message', message_id: subject.message_id };
|
|
561
|
-
}
|
|
562
|
-
function isJournalEntry(value) {
|
|
563
|
-
if (typeof value !== 'object' || value === null)
|
|
564
|
-
return false;
|
|
565
|
-
const entry = value;
|
|
566
|
-
const writer = entry['writer'];
|
|
567
|
-
const subject = entry['subject'];
|
|
568
|
-
return (typeof entry['attempt_id'] === 'string' &&
|
|
569
|
-
typeof entry['stage'] === 'string' &&
|
|
570
|
-
['claimed', 'writing', 'written', 'failed', 'released'].includes(entry['stage']) &&
|
|
571
|
-
typeof writer?.['pid'] === 'number' &&
|
|
572
|
-
typeof writer['start'] === 'string' &&
|
|
573
|
-
((subject?.['type'] === 'answer' && typeof subject['request_id'] === 'string') ||
|
|
574
|
-
(subject?.['type'] === 'session_message' && typeof subject['message_id'] === 'string')));
|
|
575
|
-
}
|
|
576
|
-
//# sourceMappingURL=session-delivery.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-delivery.js","sourceRoot":"","sources":["../src/session-delivery.ts"],"names":[],"mappings":"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"}
|