@raidiant/notifai 11.7.1 → 12.0.0-beta.11
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 +53 -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
|
@@ -1,488 +0,0 @@
|
|
|
1
|
-
/** Durable per-Agent-Session state, activation bookkeeping, and pruning. */
|
|
2
|
-
import { randomBytes } from 'node:crypto';
|
|
3
|
-
import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync, utimesSync, writeFileSync, } from 'node:fs';
|
|
4
|
-
import path from 'node:path';
|
|
5
|
-
import { atomicWriteFileSync } from './atomic-file.js';
|
|
6
|
-
import { sanitizeSessionId, sessionConfigPath, stateDir } from './config.js';
|
|
7
|
-
import { withFileLock } from './file-lock.js';
|
|
8
|
-
export function sessionStatePath(sessionId, env) {
|
|
9
|
-
return path.join(stateDir(env), 'sessions', `${sanitizeSessionId(sessionId)}.json`);
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Durable cancellation for observers that can outlive the harness process.
|
|
13
|
-
*
|
|
14
|
-
* Absence of session state is not enough: SessionEnd deliberately deletes it,
|
|
15
|
-
* and an in-flight submit/fence could otherwise recreate it afterwards. The
|
|
16
|
-
* marker shares the session-state lock, giving every racing writer one total
|
|
17
|
-
* order: either its state lands before SessionEnd and is cleaned up there, or
|
|
18
|
-
* it observes this marker and must not write or deliver into the ended session.
|
|
19
|
-
*/
|
|
20
|
-
function sessionEndMarkerPath(sessionId, env) {
|
|
21
|
-
return path.join(stateDir(env), 'sessions', `${sanitizeSessionId(sessionId)}.ended`);
|
|
22
|
-
}
|
|
23
|
-
export function sessionHasEnded(sessionId, env) {
|
|
24
|
-
return existsSync(sessionEndMarkerPath(sessionId, env));
|
|
25
|
-
}
|
|
26
|
-
export function lifecycleStamp(wall = Date.now()) {
|
|
27
|
-
return { wall, mono: process.hrtime.bigint().toString() };
|
|
28
|
-
}
|
|
29
|
-
function parseStamp(value) {
|
|
30
|
-
if (typeof value !== 'object' || value === null)
|
|
31
|
-
return null;
|
|
32
|
-
const record = value;
|
|
33
|
-
return typeof record['wall'] === 'number' &&
|
|
34
|
-
typeof record['mono'] === 'string' &&
|
|
35
|
-
/^\d{1,30}$/.test(record['mono'])
|
|
36
|
-
? { wall: record['wall'], mono: record['mono'] }
|
|
37
|
-
: null;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Whether `edge` happened before `reference`, a stamp taken by this process.
|
|
41
|
-
* A monotonic value ahead of this process's own clock can only come from an
|
|
42
|
-
* earlier boot, so it is earlier too; an edge without a stamp (an older
|
|
43
|
-
* build's marker) is treated as earlier.
|
|
44
|
-
*/
|
|
45
|
-
export function happenedBefore(edge, reference) {
|
|
46
|
-
if (edge === null)
|
|
47
|
-
return true;
|
|
48
|
-
const mono = BigInt(edge.mono);
|
|
49
|
-
return mono < BigInt(reference.mono) || mono > process.hrtime.bigint();
|
|
50
|
-
}
|
|
51
|
-
export function markSessionEnded(sessionId, env, now) {
|
|
52
|
-
const stateFile = sessionStatePath(sessionId, env);
|
|
53
|
-
return withFileLock(`${stateFile}.lock`, () => {
|
|
54
|
-
const current = readSessionIncarnation(sessionId, env);
|
|
55
|
-
const marker = { stamp: lifecycleStamp(now), ends: current?.key ?? null };
|
|
56
|
-
atomicWriteFileSync(sessionEndMarkerPath(sessionId, env), `${JSON.stringify(marker)}\n`);
|
|
57
|
-
return marker;
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
/** The end marker, or null when the session carries none. */
|
|
61
|
-
export function readSessionEndMarker(sessionId, env) {
|
|
62
|
-
let raw;
|
|
63
|
-
try {
|
|
64
|
-
raw = readFileSync(sessionEndMarkerPath(sessionId, env), 'utf8');
|
|
65
|
-
}
|
|
66
|
-
catch {
|
|
67
|
-
return null;
|
|
68
|
-
}
|
|
69
|
-
try {
|
|
70
|
-
const parsed = JSON.parse(raw);
|
|
71
|
-
if (typeof parsed === 'object' && parsed !== null) {
|
|
72
|
-
return {
|
|
73
|
-
stamp: parseStamp(parsed['stamp']),
|
|
74
|
-
ends: typeof parsed['ends'] === 'string' ? parsed['ends'] : null,
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
catch {
|
|
79
|
-
// An older build wrote bare milliseconds.
|
|
80
|
-
}
|
|
81
|
-
return { stamp: null, ends: null };
|
|
82
|
-
}
|
|
83
|
-
/** Whether this marker ended exactly this incarnation. */
|
|
84
|
-
export function endsIncarnation(marker, incarnation) {
|
|
85
|
-
return marker !== null && marker.ends === incarnation.key;
|
|
86
|
-
}
|
|
87
|
-
function sessionIncarnationPath(sessionId, env) {
|
|
88
|
-
return path.join(stateDir(env), 'sessions', `${sanitizeSessionId(sessionId)}.incarnation.json`);
|
|
89
|
-
}
|
|
90
|
-
export function readSessionIncarnation(sessionId, env) {
|
|
91
|
-
try {
|
|
92
|
-
const parsed = JSON.parse(readFileSync(sessionIncarnationPath(sessionId, env), 'utf8'));
|
|
93
|
-
if (typeof parsed !== 'object' || parsed === null)
|
|
94
|
-
return null;
|
|
95
|
-
const record = parsed;
|
|
96
|
-
const start = parseStamp(record['start']);
|
|
97
|
-
if (typeof record['key'] !== 'string' ||
|
|
98
|
-
typeof record['incarnation'] !== 'string' ||
|
|
99
|
-
!/^inc_[A-Za-z0-9_-]{10,64}$/.test(record['incarnation']) ||
|
|
100
|
-
start === null) {
|
|
101
|
-
return null;
|
|
102
|
-
}
|
|
103
|
-
const harness = record['harness_process'];
|
|
104
|
-
return {
|
|
105
|
-
key: record['key'],
|
|
106
|
-
incarnation: record['incarnation'],
|
|
107
|
-
start,
|
|
108
|
-
...(typeof record['openclaw_generation'] === 'string'
|
|
109
|
-
? { openclaw_generation: record['openclaw_generation'] }
|
|
110
|
-
: {}),
|
|
111
|
-
...(harness !== undefined &&
|
|
112
|
-
typeof harness['pid'] === 'number' &&
|
|
113
|
-
typeof harness['start'] === 'string'
|
|
114
|
-
? { harness_process: { pid: harness['pid'], start: harness['start'] } }
|
|
115
|
-
: {}),
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
catch {
|
|
119
|
-
return null;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
export function newIncarnationId() {
|
|
123
|
-
return `inc_${randomBytes(12).toString('base64url')}`;
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* The one shared, idempotent start of an Agent Session incarnation.
|
|
127
|
-
*
|
|
128
|
-
* Every SessionStart handler calls it before anything reads the end marker,
|
|
129
|
-
* stamped with the moment its own invocation began.
|
|
130
|
-
*
|
|
131
|
-
* - The recorded incarnation is joined when it runs in the same harness
|
|
132
|
-
* process and has not ended — the second handler of one start — or when its
|
|
133
|
-
* end came *after* this handler began: that end is this start's own, seen by
|
|
134
|
-
* a delayed handler, and it must stay ended.
|
|
135
|
-
* - Otherwise a new incarnation is minted: no record, another harness
|
|
136
|
-
* process, or the recorded incarnation ended before this handler began
|
|
137
|
-
* (in-process `/resume` after `/clear`).
|
|
138
|
-
* - An end marker from before this handler, for any incarnation but the one
|
|
139
|
-
* joined, is dropped; a later one is kept.
|
|
140
|
-
*/
|
|
141
|
-
export function beginSessionIncarnation(sessionId, env, options) {
|
|
142
|
-
const stateFile = sessionStatePath(sessionId, env);
|
|
143
|
-
return withFileLock(`${stateFile}.lock`, () => {
|
|
144
|
-
const marker = readSessionEndMarker(sessionId, env);
|
|
145
|
-
const current = readSessionIncarnation(sessionId, env);
|
|
146
|
-
const differentHarness = options.harnessProcess !== undefined &&
|
|
147
|
-
current?.harness_process !== undefined &&
|
|
148
|
-
(current.harness_process.pid !== options.harnessProcess.pid ||
|
|
149
|
-
current.harness_process.start !== options.harnessProcess.start);
|
|
150
|
-
const differentOpenclawGeneration = options.openclawGeneration !== undefined &&
|
|
151
|
-
current?.openclaw_generation !== options.openclawGeneration;
|
|
152
|
-
const endedEarlier = current !== null && endsIncarnation(marker, current) && happenedBefore(marker.stamp, options.stamp);
|
|
153
|
-
let next;
|
|
154
|
-
if (current !== null && !differentHarness && !differentOpenclawGeneration && !endedEarlier) {
|
|
155
|
-
next =
|
|
156
|
-
current.harness_process === undefined && options.harnessProcess !== undefined
|
|
157
|
-
? { ...current, harness_process: options.harnessProcess }
|
|
158
|
-
: current;
|
|
159
|
-
}
|
|
160
|
-
else {
|
|
161
|
-
next = {
|
|
162
|
-
key: randomBytes(12).toString('base64url'),
|
|
163
|
-
incarnation: newIncarnationId(),
|
|
164
|
-
start: options.stamp,
|
|
165
|
-
...(options.openclawGeneration === undefined
|
|
166
|
-
? {}
|
|
167
|
-
: { openclaw_generation: options.openclawGeneration }),
|
|
168
|
-
...(options.harnessProcess === undefined ? {} : { harness_process: options.harnessProcess }),
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
|
-
if (options.clearEarlierEnd !== false &&
|
|
172
|
-
marker !== null &&
|
|
173
|
-
!endsIncarnation(marker, next) &&
|
|
174
|
-
happenedBefore(marker.stamp, options.stamp)) {
|
|
175
|
-
rmSync(sessionEndMarkerPath(sessionId, env), { force: true });
|
|
176
|
-
}
|
|
177
|
-
if (next !== current) {
|
|
178
|
-
atomicWriteFileSync(sessionIncarnationPath(sessionId, env), `${JSON.stringify(next)}\n`);
|
|
179
|
-
}
|
|
180
|
-
return next;
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
/**
|
|
184
|
-
* Replace this incarnation's service identity after the service refused it,
|
|
185
|
-
* keeping its local key and start. Only the holder of `expected` may rotate it.
|
|
186
|
-
*/
|
|
187
|
-
export function rotateSessionIncarnation(sessionId, env, expected) {
|
|
188
|
-
const stateFile = sessionStatePath(sessionId, env);
|
|
189
|
-
return withFileLock(`${stateFile}.lock`, () => {
|
|
190
|
-
const current = readSessionIncarnation(sessionId, env);
|
|
191
|
-
if (current === null || current.incarnation !== expected)
|
|
192
|
-
return null;
|
|
193
|
-
const next = { ...current, incarnation: newIncarnationId() };
|
|
194
|
-
atomicWriteFileSync(sessionIncarnationPath(sessionId, env), `${JSON.stringify(next)}\n`);
|
|
195
|
-
return next;
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* Whether this Agent Session ever had a Notification Request accepted on this
|
|
200
|
-
* machine. Its Session Attendant makes no network call before this marker
|
|
201
|
-
* exists, so sessions that never notified are never reported.
|
|
202
|
-
*/
|
|
203
|
-
function sessionNotifiedPath(sessionId, env) {
|
|
204
|
-
return path.join(stateDir(env), 'sessions', `${sanitizeSessionId(sessionId)}.notified`);
|
|
205
|
-
}
|
|
206
|
-
export function sessionNotified(sessionId, env) {
|
|
207
|
-
return existsSync(sessionNotifiedPath(sessionId, env));
|
|
208
|
-
}
|
|
209
|
-
/** Record the first accepted Notification Request of an Agent Session. Never throws. */
|
|
210
|
-
export function recordSessionNotified(sessionId, env, now) {
|
|
211
|
-
try {
|
|
212
|
-
const file = sessionNotifiedPath(sessionId, env);
|
|
213
|
-
if (existsSync(file))
|
|
214
|
-
return;
|
|
215
|
-
mkdirSync(path.dirname(file), { recursive: true });
|
|
216
|
-
atomicWriteFileSync(file, `${now}\n`);
|
|
217
|
-
}
|
|
218
|
-
catch {
|
|
219
|
-
// The marker only wakes a dormant attendant; the notification already left.
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* Keep a long-running session's small files younger than the abandoned-state
|
|
224
|
-
* prune, including any extra files its owner names (the attendant's claim).
|
|
225
|
-
*/
|
|
226
|
-
export function refreshSessionMarkers(sessionId, env, now, extra = []) {
|
|
227
|
-
const at = new Date(now);
|
|
228
|
-
for (const file of [sessionIncarnationPath(sessionId, env), sessionNotifiedPath(sessionId, env), ...extra]) {
|
|
229
|
-
try {
|
|
230
|
-
utimesSync(file, at, at);
|
|
231
|
-
}
|
|
232
|
-
catch {
|
|
233
|
-
// Missing is fine; the prune only removes what is old.
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
export function readSessionState(sessionId, env) {
|
|
238
|
-
const file = sessionStatePath(sessionId, env);
|
|
239
|
-
if (!existsSync(file))
|
|
240
|
-
return {};
|
|
241
|
-
try {
|
|
242
|
-
const parsed = JSON.parse(readFileSync(file, 'utf8'));
|
|
243
|
-
if (typeof parsed !== 'object' || parsed === null)
|
|
244
|
-
return {};
|
|
245
|
-
const state = { ...parsed };
|
|
246
|
-
delete state.session_id;
|
|
247
|
-
return state;
|
|
248
|
-
}
|
|
249
|
-
catch {
|
|
250
|
-
// A corrupt marker must not wedge the harness; treat it as "no evidence",
|
|
251
|
-
// which fails closed onto ordinary terminal behaviour.
|
|
252
|
-
return {};
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
/**
|
|
256
|
-
* Resolve a stable question or request id to the one exact session that owns it.
|
|
257
|
-
*
|
|
258
|
-
* This deliberately searches lifecycle state, not checkout pointers: question
|
|
259
|
-
* identity is global on this machine, while a linked worktree is only where a
|
|
260
|
-
* command happened to run. Ambiguous or corrupt matches fail closed.
|
|
261
|
-
*/
|
|
262
|
-
export function findOwningSession(id, env) {
|
|
263
|
-
const directory = path.join(stateDir(env), 'sessions');
|
|
264
|
-
if (!existsSync(directory))
|
|
265
|
-
return { sessionId: null, ambiguous: false };
|
|
266
|
-
const matches = [];
|
|
267
|
-
for (const name of readdirSync(directory)) {
|
|
268
|
-
if (!name.endsWith('.json'))
|
|
269
|
-
continue;
|
|
270
|
-
let persisted = null;
|
|
271
|
-
try {
|
|
272
|
-
const parsed = JSON.parse(readFileSync(path.join(directory, name), 'utf8'));
|
|
273
|
-
if (typeof parsed === 'object' && parsed !== null) {
|
|
274
|
-
persisted = parsed;
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
catch {
|
|
278
|
-
// Corrupt lifecycle state is not identity evidence.
|
|
279
|
-
}
|
|
280
|
-
if (persisted === null || typeof persisted.session_id !== 'string')
|
|
281
|
-
continue;
|
|
282
|
-
const sessionId = persisted.session_id;
|
|
283
|
-
const state = persisted;
|
|
284
|
-
const pendingMatch = pendingList(state).some((entry) => entry.question_id === id || entry.request_id === id);
|
|
285
|
-
const retiringMatch = (state.retiring ?? []).some((entry) => entry.question_id === id || entry.request_id === id);
|
|
286
|
-
const historyMatch = (state.question_history ?? []).some((entry) => entry.question_id === id || entry.request_id === id);
|
|
287
|
-
const acknowledgementMatch = (state.acknowledgement_due ?? []).some((entry) => entry.request_id === id) ||
|
|
288
|
-
(state.message_acknowledgement_due ?? []).some((entry) => entry.message_id === id) ||
|
|
289
|
-
(state.openclaw_foreground_replies ?? []).some((entry) => entry.request_id === id);
|
|
290
|
-
const acceptedMatch = state.accepted?.answers.some(({ pending }) => pending.question_id === id || pending.request_id === id) ?? false;
|
|
291
|
-
const deliveredMatch = state.delivered_answers?.some(({ pending }) => pending.question_id === id || pending.request_id === id) ?? false;
|
|
292
|
-
const nativeMatch = state.native_answer_operations?.some(entry => entry.question_id === id || entry.request_id === id) || state.codex_question_bindings?.some(entry => entry.question_id === id || entry.confirmed_request_id === id) || false;
|
|
293
|
-
if (pendingMatch || retiringMatch || historyMatch || acknowledgementMatch || acceptedMatch || deliveredMatch || nativeMatch) {
|
|
294
|
-
matches.push(sessionId);
|
|
295
|
-
if (matches.length > 1)
|
|
296
|
-
return { sessionId: null, ambiguous: true };
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
return { sessionId: matches[0] ?? null, ambiguous: false };
|
|
300
|
-
}
|
|
301
|
-
export function writeSessionState(sessionId, env, state) {
|
|
302
|
-
const file = sessionStatePath(sessionId, env);
|
|
303
|
-
withFileLock(`${file}.lock`, () => writeSessionStateUnlocked(file, sessionId, state));
|
|
304
|
-
}
|
|
305
|
-
export function clearSessionState(sessionId, env) {
|
|
306
|
-
const file = sessionStatePath(sessionId, env);
|
|
307
|
-
withFileLock(`${file}.lock`, () => {
|
|
308
|
-
clearSessionStateUnlocked(sessionId, env);
|
|
309
|
-
});
|
|
310
|
-
}
|
|
311
|
-
/** Caller owns the session lock. Completed keys remain non-reusable until the
|
|
312
|
-
* whole abandoned session is pruned; unfinished operations pin that boundary.
|
|
313
|
-
*/
|
|
314
|
-
export function clearSessionStateUnlocked(sessionId, env) {
|
|
315
|
-
const file = sessionStatePath(sessionId, env);
|
|
316
|
-
const current = readSessionState(sessionId, env);
|
|
317
|
-
if ((current.native_answer_operations?.length ?? 0) > 0 || (current.codex_question_bindings?.length ?? 0) > 0) {
|
|
318
|
-
writeSessionStateUnlocked(file, sessionId, {
|
|
319
|
-
...(current.native_answer_operations === undefined ? {} : { native_answer_operations: current.native_answer_operations }),
|
|
320
|
-
...(current.codex_question_bindings === undefined ? {} : { codex_question_bindings: current.codex_question_bindings }),
|
|
321
|
-
...(current.codex_question_marker_counter === undefined ? {} : { codex_question_marker_counter: current.codex_question_marker_counter }),
|
|
322
|
-
...(current.question_history === undefined ? {} : { question_history: current.question_history }),
|
|
323
|
-
});
|
|
324
|
-
}
|
|
325
|
-
else
|
|
326
|
-
rmSync(file, { force: true });
|
|
327
|
-
// The session override lives in a sibling file; leaving it behind meant a
|
|
328
|
-
// later session reusing the id silently inherited `ask_notifications = false`.
|
|
329
|
-
rmSync(sessionConfigPath(sessionId, env), { force: true });
|
|
330
|
-
}
|
|
331
|
-
export function writeSessionStateUnlocked(file, sessionId, state) {
|
|
332
|
-
atomicWriteFileSync(file, `${JSON.stringify({ ...state, session_id: sessionId }, null, 2)}\n`);
|
|
333
|
-
}
|
|
334
|
-
export function updateSessionState(sessionId, env, update) {
|
|
335
|
-
const file = sessionStatePath(sessionId, env);
|
|
336
|
-
return withFileLock(`${file}.lock`, () => {
|
|
337
|
-
const current = readSessionState(sessionId, env);
|
|
338
|
-
// SessionEnd and every asynchronous writer share this lock. Once the
|
|
339
|
-
// durable marker exists, no observer may recreate state for that session.
|
|
340
|
-
if (sessionHasEnded(sessionId, env))
|
|
341
|
-
return current;
|
|
342
|
-
const next = update(current);
|
|
343
|
-
writeSessionStateUnlocked(file, sessionId, next);
|
|
344
|
-
return next;
|
|
345
|
-
});
|
|
346
|
-
}
|
|
347
|
-
/** Record the current installation when an owner session starts. */
|
|
348
|
-
export function recordSessionStart(sessionId, env, harness, cwd, codexStopDefinitionFingerprint, stamp = lifecycleStamp(), openclawGeneration) {
|
|
349
|
-
// Harnesses may reuse a session id only by explicitly starting that session
|
|
350
|
-
// again. That lifecycle edge is the sole authority for clearing cancellation,
|
|
351
|
-
// and it clears only an end recorded before this handler started.
|
|
352
|
-
beginSessionIncarnation(sessionId, env, {
|
|
353
|
-
stamp,
|
|
354
|
-
...(openclawGeneration === undefined ? {} : { openclawGeneration }),
|
|
355
|
-
});
|
|
356
|
-
updateSessionState(sessionId, env, (current) => {
|
|
357
|
-
const next = {
|
|
358
|
-
...current,
|
|
359
|
-
...(harness === undefined ? {} : { harness }),
|
|
360
|
-
...(cwd === undefined
|
|
361
|
-
? {}
|
|
362
|
-
: { activation_cwd: harness === 'codex' ? cwd : current.activation_cwd ?? cwd }),
|
|
363
|
-
};
|
|
364
|
-
// A Codex SessionStart materializes one new runtime generation. Absence of
|
|
365
|
-
// singular proof must replace prior proof too; retaining it would let a
|
|
366
|
-
// resumed session borrow the definition loaded by an earlier runtime.
|
|
367
|
-
if (harness === 'codex') {
|
|
368
|
-
delete next.codex_stop_definition_fingerprint;
|
|
369
|
-
if (codexStopDefinitionFingerprint !== undefined) {
|
|
370
|
-
next.codex_stop_definition_fingerprint = codexStopDefinitionFingerprint;
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
return next;
|
|
374
|
-
});
|
|
375
|
-
}
|
|
376
|
-
/** Atomically claim Cursor's first-Stop activation fallback once per conversation. */
|
|
377
|
-
export function claimCursorStopActivation(sessionId, env, now) {
|
|
378
|
-
const claimGuardMs = 30_000;
|
|
379
|
-
let claimed = false;
|
|
380
|
-
updateSessionState(sessionId, env, (current) => {
|
|
381
|
-
if (current.cursor_activation_confirmed_at !== undefined)
|
|
382
|
-
return current;
|
|
383
|
-
if (current.cursor_activation_claimed_at !== undefined &&
|
|
384
|
-
now - current.cursor_activation_claimed_at < claimGuardMs) {
|
|
385
|
-
return current;
|
|
386
|
-
}
|
|
387
|
-
claimed = true;
|
|
388
|
-
return { ...current, cursor_activation_claimed_at: now };
|
|
389
|
-
});
|
|
390
|
-
return claimed;
|
|
391
|
-
}
|
|
392
|
-
/** Cursor's loop_count proves the previous Stop follow-up reached the host. */
|
|
393
|
-
export function confirmCursorStopActivation(sessionId, env, now) {
|
|
394
|
-
let owned = false;
|
|
395
|
-
updateSessionState(sessionId, env, (current) => {
|
|
396
|
-
if (current.cursor_activation_confirmed_at !== undefined) {
|
|
397
|
-
owned = true;
|
|
398
|
-
return current;
|
|
399
|
-
}
|
|
400
|
-
if (current.cursor_activation_claimed_at === undefined)
|
|
401
|
-
return current;
|
|
402
|
-
owned = true;
|
|
403
|
-
return { ...current, cursor_activation_confirmed_at: now };
|
|
404
|
-
});
|
|
405
|
-
return owned;
|
|
406
|
-
}
|
|
407
|
-
/** A fresh/cleared Cursor lifecycle makes its next Stop the fallback owner again. */
|
|
408
|
-
export function resetCursorStopActivation(sessionId, env) {
|
|
409
|
-
updateSessionState(sessionId, env, (current) => {
|
|
410
|
-
if (current.cursor_activation_claimed_at === undefined &&
|
|
411
|
-
current.cursor_activation_confirmed_at === undefined) {
|
|
412
|
-
return current;
|
|
413
|
-
}
|
|
414
|
-
const next = { ...current };
|
|
415
|
-
delete next.cursor_activation_claimed_at;
|
|
416
|
-
delete next.cursor_activation_confirmed_at;
|
|
417
|
-
return next;
|
|
418
|
-
});
|
|
419
|
-
}
|
|
420
|
-
/**
|
|
421
|
-
* Session state a crashed harness left behind.
|
|
422
|
-
*
|
|
423
|
-
* `SessionEnd` removes session state and leaves a short-lived cancellation
|
|
424
|
-
* marker; a harness that crashes or is killed never reaches it. At roughly a
|
|
425
|
-
* hundred sessions a day that is tens of thousands of files a year, none of
|
|
426
|
-
* which anything reads.
|
|
427
|
-
*
|
|
428
|
-
* Opportunistic rather than scheduled: hooks are the only thing that runs, so
|
|
429
|
-
* a hook is where this has to live. It is rate-limited by its own stamp file
|
|
430
|
-
* so the common case costs one `stat`, not a directory walk — a Stop hook is
|
|
431
|
-
* on the critical path of every turn.
|
|
432
|
-
*/
|
|
433
|
-
const SESSION_PRUNE_AFTER_MS = 7 * 24 * 3600 * 1000;
|
|
434
|
-
const SESSION_PRUNE_INTERVAL_MS = 24 * 3600 * 1000;
|
|
435
|
-
export function pruneAbandonedSessions(env, now = Date.now(), maxAgeMs = SESSION_PRUNE_AFTER_MS) {
|
|
436
|
-
const directory = path.join(stateDir(env), 'sessions');
|
|
437
|
-
const stamp = path.join(stateDir(env), 'last-prune');
|
|
438
|
-
try {
|
|
439
|
-
if (existsSync(stamp) && now - statSync(stamp).mtimeMs < SESSION_PRUNE_INTERVAL_MS)
|
|
440
|
-
return 0;
|
|
441
|
-
mkdirSync(path.dirname(stamp), { recursive: true });
|
|
442
|
-
writeFileSync(stamp, '', { mode: 0o600 });
|
|
443
|
-
if (!existsSync(directory))
|
|
444
|
-
return 0;
|
|
445
|
-
let removed = 0;
|
|
446
|
-
for (const name of readdirSync(directory)) {
|
|
447
|
-
const file = path.join(directory, name);
|
|
448
|
-
try {
|
|
449
|
-
if (!statSync(file).isFile())
|
|
450
|
-
continue;
|
|
451
|
-
// Every sibling of an unfinished native operation shares the same
|
|
452
|
-
// lifecycle fence. Keep the state, incarnation and end marker together.
|
|
453
|
-
const stem = name.replace(/\..*$/, '');
|
|
454
|
-
const stateFile = path.join(directory, `${stem}.json`);
|
|
455
|
-
const prune = () => {
|
|
456
|
-
if (existsSync(stateFile)) {
|
|
457
|
-
const state = JSON.parse(readFileSync(stateFile, 'utf8'));
|
|
458
|
-
if (state.native_answer_operations?.some(op => op.acknowledgement === undefined))
|
|
459
|
-
return;
|
|
460
|
-
}
|
|
461
|
-
const age = now - statSync(file).mtimeMs;
|
|
462
|
-
// A negative age means the clock moved, not that the file is old.
|
|
463
|
-
// Deleting live session state on an NTP correction would lose a
|
|
464
|
-
// question already on the user's phone.
|
|
465
|
-
if (age <= maxAgeMs)
|
|
466
|
-
return;
|
|
467
|
-
rmSync(file, { force: true });
|
|
468
|
-
removed += 1;
|
|
469
|
-
};
|
|
470
|
-
withFileLock(`${stateFile}.lock`, prune);
|
|
471
|
-
}
|
|
472
|
-
catch {
|
|
473
|
-
// A file that vanished under us, or one we may not read. Neither is
|
|
474
|
-
// worth failing a hook for, and the next pass will see it again.
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
return removed;
|
|
478
|
-
}
|
|
479
|
-
catch {
|
|
480
|
-
// Housekeeping must never be the reason a turn fails.
|
|
481
|
-
return 0;
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
/** The registered-question queue. Anything but the current shape reads as empty. */
|
|
485
|
-
export function pendingList(state) {
|
|
486
|
-
return Array.isArray(state.pending) ? state.pending : [];
|
|
487
|
-
}
|
|
488
|
-
//# sourceMappingURL=hook-session-state.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hook-session-state.js","sourceRoot":"","sources":["../src/hook-session-state.ts"],"names":[],"mappings":"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"}
|