@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,173 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Per-harness exact-session probes for the Session Attendant.
|
|
3
|
-
*
|
|
4
|
-
* Each answers one local question every two seconds: is the harness process
|
|
5
|
-
* that started this attendant still running, and does it still host this
|
|
6
|
-
* exact Agent Session? Anything short of proof is `uncertain`, never `running`.
|
|
7
|
-
*/
|
|
8
|
-
import { readFileSync } from 'node:fs';
|
|
9
|
-
import os from 'node:os';
|
|
10
|
-
import path from 'node:path';
|
|
11
|
-
import { parseDescriptor } from './claude-wake.js';
|
|
12
|
-
import { normalizeProcessStart, pidExists, processIdentityLiveness, processStartTime, } from './process-identity.js';
|
|
13
|
-
import { readOpenclawGeneration } from './openclaw-generation.js';
|
|
14
|
-
import { readSessionIncarnation, sessionHasEnded } from './hook-session-state.js';
|
|
15
|
-
export function attendantSupport(harness, platform) {
|
|
16
|
-
if (harness === 'grok') {
|
|
17
|
-
return { supported: false, reason: 'grok-has-no-exact-session-writer-or-attendant' };
|
|
18
|
-
}
|
|
19
|
-
if (harness === 'claude-code') {
|
|
20
|
-
// The descriptor, inbox socket, and own-child delivery are proven on macOS.
|
|
21
|
-
// Windows has none of them; Linux shares the socket design.
|
|
22
|
-
return platform === 'darwin' || platform === 'linux'
|
|
23
|
-
? { supported: true }
|
|
24
|
-
: { supported: false, reason: `claude-code-${platform}-unproven` };
|
|
25
|
-
}
|
|
26
|
-
if (harness === 'codex') {
|
|
27
|
-
// Proven on macOS: the hook's parent is the Codex process, and Codex keeps
|
|
28
|
-
// an async hook for its declared timeout while the thread stays loaded.
|
|
29
|
-
// Windows reports no parent the same way.
|
|
30
|
-
return platform === 'darwin' || platform === 'linux'
|
|
31
|
-
? { supported: true }
|
|
32
|
-
: { supported: false, reason: `codex-${platform}-unproven` };
|
|
33
|
-
}
|
|
34
|
-
if (harness === 'openclaw') {
|
|
35
|
-
return platform === 'darwin'
|
|
36
|
-
? { supported: true }
|
|
37
|
-
: { supported: false, reason: `openclaw-${platform}-unproven` };
|
|
38
|
-
}
|
|
39
|
-
if (harness === 'hermes') {
|
|
40
|
-
// The local classic CLI plugin owns an in-process writer and its child.
|
|
41
|
-
// Python select() cannot watch that pipe on Windows.
|
|
42
|
-
return platform === 'darwin' || platform === 'linux'
|
|
43
|
-
? { supported: true }
|
|
44
|
-
: { supported: false, reason: `hermes-${platform}-unproven` };
|
|
45
|
-
}
|
|
46
|
-
return { supported: false, reason: 'harness-has-no-exact-session-probe' };
|
|
47
|
-
}
|
|
48
|
-
/** The Gateway process plus current CLI-owned generation prove OpenClaw presence. */
|
|
49
|
-
export function openclawAttendanceProbe(options) {
|
|
50
|
-
const readStart = options.readStart ?? processStartTime;
|
|
51
|
-
const exists = options.exists ?? pidExists;
|
|
52
|
-
return () => {
|
|
53
|
-
if (options.endedByHook() || sessionHasEnded(options.sessionKey, options.env)) {
|
|
54
|
-
return { state: 'ended', reason: 'session-end-hook' };
|
|
55
|
-
}
|
|
56
|
-
if (processIdentityLiveness(options.gateway, readStart, exists) !== 'alive') {
|
|
57
|
-
return { state: 'ended', reason: 'harness-gone' };
|
|
58
|
-
}
|
|
59
|
-
const current = readOpenclawGeneration(options.sessionKey, options.env);
|
|
60
|
-
const incarnation = readSessionIncarnation(options.sessionKey, options.env);
|
|
61
|
-
if (current === null || current.ended || !current.activated ||
|
|
62
|
-
current.id !== options.generationId ||
|
|
63
|
-
incarnation?.openclaw_generation !== options.generationId) {
|
|
64
|
-
return { state: 'ended', reason: 'session-replaced' };
|
|
65
|
-
}
|
|
66
|
-
const activity = options.activity?.() ?? null;
|
|
67
|
-
return activity === null
|
|
68
|
-
? { state: 'uncertain', reason: 'gateway-session-unobserved' }
|
|
69
|
-
: { state: 'running', activity };
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
export function claudeDescriptorDir(env) {
|
|
73
|
-
const configured = env['CLAUDE_CONFIG_DIR'];
|
|
74
|
-
return path.join(configured && path.isAbsolute(configured) ? configured : path.join(os.homedir(), '.claude'), 'sessions');
|
|
75
|
-
}
|
|
76
|
-
export function systemClaudeProbeAdapters(env) {
|
|
77
|
-
const dir = claudeDescriptorDir(env);
|
|
78
|
-
return {
|
|
79
|
-
readDescriptor: (pid) => JSON.parse(readFileSync(path.join(dir, `${pid}.json`), 'utf8')),
|
|
80
|
-
pidExists,
|
|
81
|
-
readStart: processStartTime,
|
|
82
|
-
parentPid: () => process.ppid,
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* The Claude Code probe. Every call re-establishes the evidence; nothing is
|
|
87
|
-
* carried over from an earlier call, so one failed check can never be
|
|
88
|
-
* followed by `running` without a fresh successful one.
|
|
89
|
-
*
|
|
90
|
-
* - The harness PID is gone, or now belongs to a process with another start
|
|
91
|
-
* time: `ended` (harness-gone). Checked on every call: a SIGKILLed harness
|
|
92
|
-
* leaves its descriptor behind, and a reused PID would satisfy the rest.
|
|
93
|
-
* While the harness is still this process's parent the identity holds
|
|
94
|
-
* without a lookup — a parent cannot be replaced under a living child;
|
|
95
|
-
* otherwise (an npx adapter in between, or an orphaned attendant) the start
|
|
96
|
-
* time is read again.
|
|
97
|
-
* - The start time cannot be read: `uncertain`.
|
|
98
|
-
* - The descriptor for that PID names another session id: `/clear` or
|
|
99
|
-
* `/resume` replaced this session in the same process: `ended`.
|
|
100
|
-
* - The descriptor is missing: Claude Code 2.1.282 removes it about a second
|
|
101
|
-
* *before* SessionEnd and exit, so with the process alive this is
|
|
102
|
-
* `uncertain`.
|
|
103
|
-
* - The descriptor's `procStart` (UTC `ps` text) differs from the harness
|
|
104
|
-
* start read the same way: the evidence disagrees, `uncertain`.
|
|
105
|
-
*
|
|
106
|
-
* Activity comes from the descriptor `status`: `idle` is idle, anything else
|
|
107
|
-
* (busy, waiting on a permission prompt) is working.
|
|
108
|
-
*/
|
|
109
|
-
export function claudeAttendanceProbe(options) {
|
|
110
|
-
const { adapters, harness } = options;
|
|
111
|
-
const expectedStart = normalizeProcessStart(harness.start);
|
|
112
|
-
return () => {
|
|
113
|
-
if (options.endedByHook())
|
|
114
|
-
return { state: 'ended', reason: 'session-end-hook' };
|
|
115
|
-
const alive = adapters.parentPid() === harness.pid
|
|
116
|
-
? 'alive'
|
|
117
|
-
: processIdentityLiveness(harness, adapters.readStart, adapters.pidExists);
|
|
118
|
-
if (alive === 'gone')
|
|
119
|
-
return { state: 'ended', reason: 'harness-gone' };
|
|
120
|
-
let raw;
|
|
121
|
-
try {
|
|
122
|
-
raw = adapters.readDescriptor(harness.pid);
|
|
123
|
-
}
|
|
124
|
-
catch {
|
|
125
|
-
return { state: 'uncertain', reason: 'descriptor-missing' };
|
|
126
|
-
}
|
|
127
|
-
const descriptor = parseDescriptor(raw);
|
|
128
|
-
if (descriptor === null || descriptor.pid !== harness.pid) {
|
|
129
|
-
return { state: 'uncertain', reason: 'descriptor-unrecognised' };
|
|
130
|
-
}
|
|
131
|
-
if (normalizeProcessStart(descriptor.procStart) !== expectedStart) {
|
|
132
|
-
// A stale descriptor, or a clock format this build does not know.
|
|
133
|
-
return { state: 'uncertain', reason: 'process-start-mismatch' };
|
|
134
|
-
}
|
|
135
|
-
if (descriptor.sessionId !== options.sessionId) {
|
|
136
|
-
return { state: 'ended', reason: 'session-replaced' };
|
|
137
|
-
}
|
|
138
|
-
if (alive === 'unknown')
|
|
139
|
-
return { state: 'uncertain', reason: 'process-start-unreadable' };
|
|
140
|
-
return { state: 'running', activity: descriptor.status === 'idle' ? 'idle' : 'working' };
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* The Codex probe. Codex publishes no session descriptor, so the evidence is
|
|
145
|
-
* the Codex process that started this attendant and the thread's own hooks:
|
|
146
|
-
*
|
|
147
|
-
* - SessionEnd's marker for this incarnation: `ended`. Codex runs SessionEnd
|
|
148
|
-
* when the thread closes, is archived or deleted, or unloads after idling
|
|
149
|
-
* with no client, then kills the attendant.
|
|
150
|
-
* - The Codex PID is gone or now names a process with another start time:
|
|
151
|
-
* `ended` (harness-gone). A crashed or killed Codex never runs SessionEnd
|
|
152
|
-
* and leaves the attendant behind in its own process group.
|
|
153
|
-
* - The start time cannot be read: `uncertain`.
|
|
154
|
-
*
|
|
155
|
-
* Activity comes from this thread's prompt, trusted tool, and turn-end hooks.
|
|
156
|
-
*/
|
|
157
|
-
export function codexAttendanceProbe(options) {
|
|
158
|
-
const { adapters, harness } = options;
|
|
159
|
-
return () => {
|
|
160
|
-
if (options.endedByHook())
|
|
161
|
-
return { state: 'ended', reason: 'session-end-hook' };
|
|
162
|
-
const alive = adapters.parentPid() === harness.pid
|
|
163
|
-
? 'alive'
|
|
164
|
-
: processIdentityLiveness(harness, adapters.readStart, adapters.pidExists);
|
|
165
|
-
if (alive === 'gone')
|
|
166
|
-
return { state: 'ended', reason: 'harness-gone' };
|
|
167
|
-
if (alive === 'unknown')
|
|
168
|
-
return { state: 'uncertain', reason: 'process-start-unreadable' };
|
|
169
|
-
const activity = options.activity();
|
|
170
|
-
return activity === null ? { state: 'uncertain', reason: 'turn-activity-unobserved' } : { state: 'running', activity };
|
|
171
|
-
};
|
|
172
|
-
}
|
|
173
|
-
//# sourceMappingURL=session-attendant-probe.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-attendant-probe.js","sourceRoot":"","sources":["../src/session-attendant-probe.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAElD,OAAO,EACL,qBAAqB,EACrB,SAAS,EACT,uBAAuB,EACvB,gBAAgB,GAEjB,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAKjF,MAAM,UAAU,gBAAgB,CAC9B,OAAgC,EAChC,QAAyB;IAEzB,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,+CAA+C,EAAE,CAAA;IACtF,CAAC;IACD,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;QAC9B,4EAA4E;QAC5E,4DAA4D;QAC5D,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,OAAO;YAClD,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;YACrB,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,QAAQ,WAAW,EAAE,CAAA;IACtE,CAAC;IACD,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,2EAA2E;QAC3E,wEAAwE;QACxE,0CAA0C;QAC1C,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,OAAO;YAClD,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;YACrB,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,QAAQ,WAAW,EAAE,CAAA;IAChE,CAAC;IACD,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;QAC3B,OAAO,QAAQ,KAAK,QAAQ;YAC1B,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;YACrB,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,QAAQ,WAAW,EAAE,CAAA;IACnE,CAAC;IACD,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,wEAAwE;QACxE,qDAAqD;QACrD,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,OAAO;YAClD,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE;YACrB,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,QAAQ,WAAW,EAAE,CAAA;IACjE,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,oCAAoC,EAAE,CAAA;AAC3E,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,uBAAuB,CAAC,OASvC;IACC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,gBAAgB,CAAA;IACvD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,SAAS,CAAA;IAC1C,OAAO,GAAG,EAAE;QACV,IAAI,OAAO,CAAC,WAAW,EAAE,IAAI,eAAe,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9E,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAA;QACvD,CAAC;QACD,IAAI,uBAAuB,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,OAAO,EAAE,CAAC;YAC5E,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;QACnD,CAAC;QACD,MAAM,OAAO,GAAG,sBAAsB,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;QACvE,MAAM,WAAW,GAAG,sBAAsB,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;QAC3E,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,SAAS;YACvD,OAAO,CAAC,EAAE,KAAK,OAAO,CAAC,YAAY;YACnC,WAAW,EAAE,mBAAmB,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC;YAC9D,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAA;QACvD,CAAC;QACD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,EAAE,IAAI,IAAI,CAAA;QAC7C,OAAO,QAAQ,KAAK,IAAI;YACtB,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,4BAA4B,EAAE;YAC9D,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAA;IACpC,CAAC,CAAA;AACH,CAAC;AAUD,MAAM,UAAU,mBAAmB,CAAC,GAAsB;IACxD,MAAM,UAAU,GAAG,GAAG,CAAC,mBAAmB,CAAC,CAAA;IAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,EAAE,UAAU,CAAC,CAAA;AAC3H,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,GAAsB;IAC9D,MAAM,GAAG,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAA;IACpC,OAAO;QACL,cAAc,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,EAAE,MAAM,CAAC,CAAY;QACnG,SAAS;QACT,SAAS,EAAE,gBAAgB;QAC3B,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI;KAC9B,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAMrC;IACC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;IACrC,MAAM,aAAa,GAAG,qBAAqB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAC1D,OAAO,GAAG,EAAE;QACV,IAAI,OAAO,CAAC,WAAW,EAAE;YAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAA;QAChF,MAAM,KAAK,GACT,QAAQ,CAAC,SAAS,EAAE,KAAK,OAAO,CAAC,GAAG;YAClC,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,uBAAuB,CAAC,OAAO,EAAE,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAA;QAC9E,IAAI,KAAK,KAAK,MAAM;YAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;QACvE,IAAI,GAAY,CAAA;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAA;QAC7D,CAAC;QACD,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,CAAA;QACvC,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;YAC1D,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAA;QAClE,CAAC;QACD,IAAI,qBAAqB,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,aAAa,EAAE,CAAC;YAClE,kEAAkE;YAClE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAA;QACjE,CAAC;QACD,IAAI,UAAU,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC;YAC/C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAA;QACvD,CAAC;QACD,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAA;QAC1F,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,CAAA;IAC1F,CAAC,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAOpC;IACC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;IACrC,OAAO,GAAG,EAAE;QACV,IAAI,OAAO,CAAC,WAAW,EAAE;YAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAA;QAChF,MAAM,KAAK,GACT,QAAQ,CAAC,SAAS,EAAE,KAAK,OAAO,CAAC,GAAG;YAClC,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,uBAAuB,CAAC,OAAO,EAAE,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAA;QAC9E,IAAI,KAAK,KAAK,MAAM;YAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;QACvE,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAA;QAC1F,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAA;QACnC,OAAO,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAA;IACxH,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import type { AttendantPhase, AttendantStatus } from './session-attendant.js';
|
|
2
|
-
import type { SessionActivity } from '@raidiant/notifai-protocol';
|
|
3
|
-
import type { DeliveryLease } from './session-delivery.js';
|
|
4
|
-
import { type NativeTurnSnapshot } from './codex-native-turn.js';
|
|
5
|
-
/** One live attendant per Agent Session: PID + process start time + incarnation. */
|
|
6
|
-
export declare function attendantClaimPath(sessionId: string, env: NodeJS.ProcessEnv): string;
|
|
7
|
-
export declare function attendantStatusPath(sessionId: string, env: NodeJS.ProcessEnv): string;
|
|
8
|
-
export declare function writeAttendantStatus(sessionId: string, env: NodeJS.ProcessEnv, status: AttendantStatus): void;
|
|
9
|
-
export interface AttendantReport {
|
|
10
|
-
session_id: string;
|
|
11
|
-
phase: AttendantPhase;
|
|
12
|
-
/** Whether the recorded attendant process could still be running. */
|
|
13
|
-
alive: boolean;
|
|
14
|
-
generation: number | null;
|
|
15
|
-
activity: string | null;
|
|
16
|
-
reason: string | null;
|
|
17
|
-
accepts_messages: boolean;
|
|
18
|
-
writer_ready: boolean;
|
|
19
|
-
updated_at: number;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Every attendant status on this machine, newest first. An attendant whose
|
|
23
|
-
* process is gone without writing `exited` is reported as not alive.
|
|
24
|
-
*/
|
|
25
|
-
export declare function listAttendantReports(env: NodeJS.ProcessEnv): AttendantReport[];
|
|
26
|
-
/** Admission proof from the exact, live classic-CLI plugin writer. */
|
|
27
|
-
export declare function hermesQuestionRouteReady(sessionId: string, env: NodeJS.ProcessEnv, now?: number): boolean;
|
|
28
|
-
/**
|
|
29
|
-
* The lease a writer beside the attendant (the answer waiter) may claim under:
|
|
30
|
-
* the generation the live attendant of this session holds right now, or null.
|
|
31
|
-
* The service still decides; a stale read is refused as `generation_fenced`.
|
|
32
|
-
*/
|
|
33
|
-
export declare function readAttendantLease(sessionId: string, env: NodeJS.ProcessEnv): DeliveryLease | null;
|
|
34
|
-
/**
|
|
35
|
-
* Saved fencing identity for Codex SessionEnd, even if the attendant died
|
|
36
|
-
* before the hook started. Ending presence is not a harness write: it must
|
|
37
|
-
* survive a missing/dead claim and an exited status. The service checks the
|
|
38
|
-
* exact incarnation and generation, so a saved report cannot end a newer
|
|
39
|
-
* lease. Only the current local incarnation may supply that identity.
|
|
40
|
-
*/
|
|
41
|
-
export declare function readAttendantEndingLease(sessionId: string, env: NodeJS.ProcessEnv): DeliveryLease | null;
|
|
42
|
-
/**
|
|
43
|
-
* A thread's own turn boundaries, for a harness that publishes no activity of
|
|
44
|
-
* its own (Codex), scoped to one session incarnation (its stable start key).
|
|
45
|
-
*
|
|
46
|
-
* Starts are observed by synchronous prompt and tool hooks. Automatic goal
|
|
47
|
-
* continuations can omit the prompt hook; their first trusted tool callback
|
|
48
|
-
* observes the turn instead. Ends come from asynchronous hooks (Stop, Interrupt) that may run late
|
|
49
|
-
* or before the start they close, so they are matched by turn id. A start of a
|
|
50
|
-
* turn already seen — started or ended — is stale and never replaces the
|
|
51
|
-
* current turn. The thread is working while its current turn has no end.
|
|
52
|
-
*/
|
|
53
|
-
export declare function turnActivityPath(sessionId: string, env: NodeJS.ProcessEnv): string;
|
|
54
|
-
/** A turn of incarnation `key` started. Ignored when that turn was already seen. */
|
|
55
|
-
export declare function recordTurnStart(sessionId: string, env: NodeJS.ProcessEnv, key: string, turnId: string): void;
|
|
56
|
-
/** Mutation-free admission check; safe inside the session-state lock. */
|
|
57
|
-
export declare function nativeTurnContinues(sessionId: string, env: NodeJS.ProcessEnv, key: string, snapshot: NativeTurnSnapshot): boolean;
|
|
58
|
-
/** An async callback may advance only with native order and the same live owner. */
|
|
59
|
-
export declare function reconcileNativeTurn(sessionId: string, env: NodeJS.ProcessEnv, key: string, turnId: string, snapshot: NativeTurnSnapshot, stillOwned: () => boolean, starting?: boolean): boolean;
|
|
60
|
-
/** A turn ended (or was interrupted), whenever its hook got to run. */
|
|
61
|
-
export declare function recordTurnEnd(sessionId: string, env: NodeJS.ProcessEnv, turnId: string): void;
|
|
62
|
-
/** Working while incarnation `key`'s current turn has no recorded end. */
|
|
63
|
-
export declare function readTurnActivity(sessionId: string, env: NodeJS.ProcessEnv, key: string): SessionActivity;
|
|
64
|
-
/** Last observed activity for this owner, never the missing-record idle default.
|
|
65
|
-
* This is a display projection only; queue admission requires a fresh native read. */
|
|
66
|
-
export declare function observedCodexTurnActivity(sessionId: string, env: NodeJS.ProcessEnv, key: string): SessionActivity | null;
|
|
67
|
-
/** Exact active turn, used to reject a tool hook that outlived interruption. */
|
|
68
|
-
export declare function currentCodexTurn(sessionId: string, env: NodeJS.ProcessEnv, key: string): string | null;
|
|
69
|
-
/** Historical hook success is not proof that the current native turn was seen. */
|
|
70
|
-
export declare function codexNativeActivityObserved(sessionId: string, env: NodeJS.ProcessEnv): boolean;
|
|
@@ -1,256 +0,0 @@
|
|
|
1
|
-
/** Local files of the Session Attendant: its exclusive claim and its readable status. */
|
|
2
|
-
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import { atomicWriteFileSync } from './atomic-file.js';
|
|
5
|
-
import { sanitizeSessionId, stateDir } from './config.js';
|
|
6
|
-
import { withFileLock } from './file-lock.js';
|
|
7
|
-
import { readSessionIncarnation, readSessionState } from './hook-session-state.js';
|
|
8
|
-
import { claimHolderMayRun, readClaimFile } from './hook-question-lock.js';
|
|
9
|
-
import { readNativeTurnSnapshot } from './codex-native-turn.js';
|
|
10
|
-
/** One live attendant per Agent Session: PID + process start time + incarnation. */
|
|
11
|
-
export function attendantClaimPath(sessionId, env) {
|
|
12
|
-
return path.join(stateDir(env), 'sessions', `${sanitizeSessionId(sessionId)}.attendant`);
|
|
13
|
-
}
|
|
14
|
-
export function attendantStatusPath(sessionId, env) {
|
|
15
|
-
return path.join(stateDir(env), 'sessions', `${sanitizeSessionId(sessionId)}.attendance.json`);
|
|
16
|
-
}
|
|
17
|
-
export function writeAttendantStatus(sessionId, env, status) {
|
|
18
|
-
atomicWriteFileSync(attendantStatusPath(sessionId, env), `${JSON.stringify({ session_id: sessionId, pid: process.pid, ...status })}\n`);
|
|
19
|
-
}
|
|
20
|
-
const PHASES = new Set([
|
|
21
|
-
'dormant',
|
|
22
|
-
'unsupported',
|
|
23
|
-
'acquiring',
|
|
24
|
-
'attending',
|
|
25
|
-
'waiting-for-lease',
|
|
26
|
-
'uncertain',
|
|
27
|
-
'exited',
|
|
28
|
-
]);
|
|
29
|
-
/**
|
|
30
|
-
* Every attendant status on this machine, newest first. An attendant whose
|
|
31
|
-
* process is gone without writing `exited` is reported as not alive.
|
|
32
|
-
*/
|
|
33
|
-
export function listAttendantReports(env) {
|
|
34
|
-
const directory = path.join(stateDir(env), 'sessions');
|
|
35
|
-
if (!existsSync(directory))
|
|
36
|
-
return [];
|
|
37
|
-
const reports = [];
|
|
38
|
-
for (const name of readdirSync(directory)) {
|
|
39
|
-
if (!name.endsWith('.attendance.json'))
|
|
40
|
-
continue;
|
|
41
|
-
try {
|
|
42
|
-
const parsed = JSON.parse(readFileSync(path.join(directory, name), 'utf8'));
|
|
43
|
-
const sessionId = parsed['session_id'];
|
|
44
|
-
const phase = parsed['phase'];
|
|
45
|
-
if (typeof sessionId !== 'string' || typeof phase !== 'string' || !PHASES.has(phase))
|
|
46
|
-
continue;
|
|
47
|
-
const claim = readClaimFile(attendantClaimPath(sessionId, env));
|
|
48
|
-
const alive = phase !== 'exited' && claim !== null && claim['pid'] === parsed['pid'] && claimHolderMayRun(claim);
|
|
49
|
-
reports.push({
|
|
50
|
-
session_id: sessionId,
|
|
51
|
-
phase: phase,
|
|
52
|
-
alive,
|
|
53
|
-
generation: typeof parsed['generation'] === 'number' ? parsed['generation'] : null,
|
|
54
|
-
activity: typeof parsed['activity'] === 'string' ? parsed['activity'] : null,
|
|
55
|
-
reason: typeof parsed['reason'] === 'string' ? parsed['reason'] : null,
|
|
56
|
-
accepts_messages: parsed['accepts_messages'] === true,
|
|
57
|
-
writer_ready: parsed['writer_ready'] === true,
|
|
58
|
-
updated_at: typeof parsed['updated_at'] === 'number' ? parsed['updated_at'] : 0,
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
catch {
|
|
62
|
-
// A half-written or foreign file is not an attendant.
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
return reports.sort((a, b) => b.updated_at - a.updated_at);
|
|
66
|
-
}
|
|
67
|
-
/** Admission proof from the exact, live classic-CLI plugin writer. */
|
|
68
|
-
export function hermesQuestionRouteReady(sessionId, env, now = Date.now()) {
|
|
69
|
-
const report = listAttendantReports(env).find((entry) => entry.session_id === sessionId);
|
|
70
|
-
return report !== undefined && report.alive && report.writer_ready &&
|
|
71
|
-
now >= report.updated_at && now - report.updated_at <= 5_000 &&
|
|
72
|
-
(report.phase === 'dormant' || report.phase === 'acquiring' || report.phase === 'attending');
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* The lease a writer beside the attendant (the answer waiter) may claim under:
|
|
76
|
-
* the generation the live attendant of this session holds right now, or null.
|
|
77
|
-
* The service still decides; a stale read is refused as `generation_fenced`.
|
|
78
|
-
*/
|
|
79
|
-
export function readAttendantLease(sessionId, env) {
|
|
80
|
-
try {
|
|
81
|
-
const status = JSON.parse(readFileSync(attendantStatusPath(sessionId, env), 'utf8'));
|
|
82
|
-
const generation = status['generation'];
|
|
83
|
-
const incarnation = status['incarnation'];
|
|
84
|
-
if (status['phase'] !== 'attending' ||
|
|
85
|
-
typeof generation !== 'number' ||
|
|
86
|
-
!Number.isInteger(generation) ||
|
|
87
|
-
generation < 1 ||
|
|
88
|
-
typeof incarnation !== 'string') {
|
|
89
|
-
return null;
|
|
90
|
-
}
|
|
91
|
-
const claim = readClaimFile(attendantClaimPath(sessionId, env));
|
|
92
|
-
if (claim === null || claim['pid'] !== status['pid'] || !claimHolderMayRun(claim))
|
|
93
|
-
return null;
|
|
94
|
-
return { incarnation, generation };
|
|
95
|
-
}
|
|
96
|
-
catch {
|
|
97
|
-
return null;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Saved fencing identity for Codex SessionEnd, even if the attendant died
|
|
102
|
-
* before the hook started. Ending presence is not a harness write: it must
|
|
103
|
-
* survive a missing/dead claim and an exited status. The service checks the
|
|
104
|
-
* exact incarnation and generation, so a saved report cannot end a newer
|
|
105
|
-
* lease. Only the current local incarnation may supply that identity.
|
|
106
|
-
*/
|
|
107
|
-
export function readAttendantEndingLease(sessionId, env) {
|
|
108
|
-
try {
|
|
109
|
-
const status = JSON.parse(readFileSync(attendantStatusPath(sessionId, env), 'utf8'));
|
|
110
|
-
const generation = status['generation'];
|
|
111
|
-
const incarnation = status['incarnation'];
|
|
112
|
-
if (status['session_id'] !== sessionId ||
|
|
113
|
-
typeof generation !== 'number' ||
|
|
114
|
-
!Number.isSafeInteger(generation) ||
|
|
115
|
-
generation < 1 ||
|
|
116
|
-
typeof incarnation !== 'string' ||
|
|
117
|
-
readSessionIncarnation(sessionId, env)?.incarnation !== incarnation) {
|
|
118
|
-
return null;
|
|
119
|
-
}
|
|
120
|
-
return { incarnation, generation };
|
|
121
|
-
}
|
|
122
|
-
catch {
|
|
123
|
-
return null;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* A thread's own turn boundaries, for a harness that publishes no activity of
|
|
128
|
-
* its own (Codex), scoped to one session incarnation (its stable start key).
|
|
129
|
-
*
|
|
130
|
-
* Starts are observed by synchronous prompt and tool hooks. Automatic goal
|
|
131
|
-
* continuations can omit the prompt hook; their first trusted tool callback
|
|
132
|
-
* observes the turn instead. Ends come from asynchronous hooks (Stop, Interrupt) that may run late
|
|
133
|
-
* or before the start they close, so they are matched by turn id. A start of a
|
|
134
|
-
* turn already seen — started or ended — is stale and never replaces the
|
|
135
|
-
* current turn. The thread is working while its current turn has no end.
|
|
136
|
-
*/
|
|
137
|
-
export function turnActivityPath(sessionId, env) {
|
|
138
|
-
return path.join(stateDir(env), 'sessions', `${sanitizeSessionId(sessionId)}.turns.json`);
|
|
139
|
-
}
|
|
140
|
-
/** Turn ids kept to recognise a late hook; a late hook trails its turn by seconds. */
|
|
141
|
-
const TURNS_KEPT = 32;
|
|
142
|
-
function readTurns(file) {
|
|
143
|
-
const ids = (value) => Array.isArray(value) ? value.filter((turn) => typeof turn === 'string') : [];
|
|
144
|
-
try {
|
|
145
|
-
const parsed = JSON.parse(readFileSync(file, 'utf8'));
|
|
146
|
-
const native = parsed['native'];
|
|
147
|
-
return {
|
|
148
|
-
key: typeof parsed['key'] === 'string' ? parsed['key'] : null,
|
|
149
|
-
current: typeof parsed['current'] === 'string' ? parsed['current'] : null,
|
|
150
|
-
started: ids(parsed['started']),
|
|
151
|
-
ended: ids(parsed['ended']),
|
|
152
|
-
...(native !== null && typeof native === 'object' &&
|
|
153
|
-
typeof native.file === 'string' && typeof native.identity === 'string' &&
|
|
154
|
-
typeof native.offset === 'number' && Number.isSafeInteger(native.offset) && native.offset >= 0
|
|
155
|
-
? { native: { file: native.file, identity: native.identity, offset: native.offset } } : {}),
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
catch {
|
|
159
|
-
return { key: null, current: null, started: [], ended: [] };
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
function updateTurns(sessionId, env, update) {
|
|
163
|
-
const file = turnActivityPath(sessionId, env);
|
|
164
|
-
withFileLock(`${file}.lock`, () => {
|
|
165
|
-
const next = update(readTurns(file));
|
|
166
|
-
atomicWriteFileSync(file, `${JSON.stringify({ session_id: sessionId, ...next })}\n`);
|
|
167
|
-
},
|
|
168
|
-
// The prompt hook runs in front of the User's turn; activity is only a hint.
|
|
169
|
-
{ waitMs: 500 });
|
|
170
|
-
}
|
|
171
|
-
const keep = (ids, id) => [...ids.filter((turn) => turn !== id), id].slice(-TURNS_KEPT);
|
|
172
|
-
/** A turn of incarnation `key` started. Ignored when that turn was already seen. */
|
|
173
|
-
export function recordTurnStart(sessionId, env, key, turnId) {
|
|
174
|
-
updateTurns(sessionId, env, (record) => {
|
|
175
|
-
const same = record.key === key ? record : { key, current: null, started: [], ended: record.ended };
|
|
176
|
-
if (same.started.includes(turnId) || same.ended.includes(turnId))
|
|
177
|
-
return same;
|
|
178
|
-
return { ...same, current: turnId, started: keep(same.started, turnId) };
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
function nativeFollows(same, snapshot) {
|
|
182
|
-
const turnId = snapshot.latest.id;
|
|
183
|
-
if (same.native !== undefined && (same.native.identity !== snapshot.identity ||
|
|
184
|
-
same.native.file !== snapshot.file || same.native.offset > snapshot.latest.offset))
|
|
185
|
-
return false;
|
|
186
|
-
if (same.current !== null && same.current !== turnId && !same.ended.includes(same.current)) {
|
|
187
|
-
const currentOffset = snapshot.positions.get(same.current);
|
|
188
|
-
if (currentOffset === undefined || currentOffset > snapshot.latest.offset)
|
|
189
|
-
return false;
|
|
190
|
-
}
|
|
191
|
-
// Confirming native completion is an Idle observation, never resurrection.
|
|
192
|
-
if (same.ended.includes(turnId) && !snapshot.latest.ended)
|
|
193
|
-
return false;
|
|
194
|
-
return true;
|
|
195
|
-
}
|
|
196
|
-
/** Mutation-free admission check; safe inside the session-state lock. */
|
|
197
|
-
export function nativeTurnContinues(sessionId, env, key, snapshot) {
|
|
198
|
-
const record = readTurns(turnActivityPath(sessionId, env));
|
|
199
|
-
return record.key === key && nativeFollows(record, snapshot);
|
|
200
|
-
}
|
|
201
|
-
/** An async callback may advance only with native order and the same live owner. */
|
|
202
|
-
export function reconcileNativeTurn(sessionId, env, key, turnId, snapshot, stillOwned, starting = false) {
|
|
203
|
-
let recorded = false;
|
|
204
|
-
updateTurns(sessionId, env, record => {
|
|
205
|
-
if (!stillOwned() || snapshot.latest.id !== turnId)
|
|
206
|
-
return record;
|
|
207
|
-
// A re-arm cannot establish a new incarnation from an older transcript.
|
|
208
|
-
if (record.key !== key && !starting)
|
|
209
|
-
return record;
|
|
210
|
-
const same = record.key === key ? record : { key, current: null, started: [], ended: record.ended };
|
|
211
|
-
if (!nativeFollows(same, snapshot))
|
|
212
|
-
return record;
|
|
213
|
-
recorded = true;
|
|
214
|
-
return {
|
|
215
|
-
...same, current: turnId, started: keep(same.started, turnId),
|
|
216
|
-
ended: snapshot.latest.ended ? keep(same.ended, turnId) : same.ended,
|
|
217
|
-
native: { file: snapshot.file, identity: snapshot.identity, offset: snapshot.latest.offset },
|
|
218
|
-
};
|
|
219
|
-
});
|
|
220
|
-
return recorded;
|
|
221
|
-
}
|
|
222
|
-
/** A turn ended (or was interrupted), whenever its hook got to run. */
|
|
223
|
-
export function recordTurnEnd(sessionId, env, turnId) {
|
|
224
|
-
updateTurns(sessionId, env, (record) => ({ ...record, ended: keep(record.ended, turnId) }));
|
|
225
|
-
}
|
|
226
|
-
/** Working while incarnation `key`'s current turn has no recorded end. */
|
|
227
|
-
export function readTurnActivity(sessionId, env, key) {
|
|
228
|
-
const { key: recorded, current, ended } = readTurns(turnActivityPath(sessionId, env));
|
|
229
|
-
return recorded === key && current !== null && !ended.includes(current) ? 'working' : 'idle';
|
|
230
|
-
}
|
|
231
|
-
/** Last observed activity for this owner, never the missing-record idle default.
|
|
232
|
-
* This is a display projection only; queue admission requires a fresh native read. */
|
|
233
|
-
export function observedCodexTurnActivity(sessionId, env, key) {
|
|
234
|
-
const record = readTurns(turnActivityPath(sessionId, env));
|
|
235
|
-
if (record.key !== key || record.current === null)
|
|
236
|
-
return null;
|
|
237
|
-
return record.ended.includes(record.current) ? 'idle' : 'working';
|
|
238
|
-
}
|
|
239
|
-
/** Exact active turn, used to reject a tool hook that outlived interruption. */
|
|
240
|
-
export function currentCodexTurn(sessionId, env, key) {
|
|
241
|
-
const record = readTurns(turnActivityPath(sessionId, env));
|
|
242
|
-
return record.key === key && record.current !== null && !record.ended.includes(record.current)
|
|
243
|
-
? record.current : null;
|
|
244
|
-
}
|
|
245
|
-
/** Historical hook success is not proof that the current native turn was seen. */
|
|
246
|
-
export function codexNativeActivityObserved(sessionId, env) {
|
|
247
|
-
const proof = readSessionState(sessionId, env).codex_native_turn;
|
|
248
|
-
const owner = readSessionIncarnation(sessionId, env);
|
|
249
|
-
if (proof === undefined || owner?.key !== proof.key)
|
|
250
|
-
return false;
|
|
251
|
-
const native = readNativeTurnSnapshot(proof.transcript_path, sessionId, env);
|
|
252
|
-
const record = readTurns(turnActivityPath(sessionId, env));
|
|
253
|
-
return native !== null && record.key === owner.key && record.current === native.latest.id &&
|
|
254
|
-
proof.turn_id === native.latest.id && (native.latest.ended === record.ended.includes(native.latest.id));
|
|
255
|
-
}
|
|
256
|
-
//# sourceMappingURL=session-attendant-state.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-attendant-state.js","sourceRoot":"","sources":["../src/session-attendant-state.ts"],"names":[],"mappings":"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"}
|