@raidiant/notifai 11.7.1-beta.2 → 12.0.0-beta.5
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 +56 -4
- package/NOTICE +16 -0
- package/THIRD_PARTY_NOTICES +725 -0
- package/bin/notifai.mjs +11387 -0
- package/data/install.ps1 +318 -0
- package/data/release.json +1 -0
- package/inventory.json +1 -0
- package/npm-adapter-files.json +52 -0
- package/package.json +14 -44
- package/README.md +0 -168
- package/dist/agent-update-notice.d.ts +0 -7
- package/dist/agent-update-notice.js +0 -77
- package/dist/agent-update-notice.js.map +0 -1
- package/dist/atomic-file.d.ts +0 -30
- package/dist/atomic-file.js +0 -148
- package/dist/atomic-file.js.map +0 -1
- package/dist/attendant-update.d.ts +0 -15
- package/dist/attendant-update.js +0 -96
- package/dist/attendant-update.js.map +0 -1
- package/dist/claude-wake.d.ts +0 -108
- package/dist/claude-wake.js +0 -369
- package/dist/claude-wake.js.map +0 -1
- package/dist/cli-bin.d.ts +0 -26
- package/dist/cli-bin.js +0 -220
- package/dist/cli-bin.js.map +0 -1
- package/dist/cli-contract.d.ts +0 -16
- package/dist/cli-contract.js +0 -27
- package/dist/cli-contract.js.map +0 -1
- package/dist/cli-release.d.ts +0 -36
- package/dist/cli-release.js +0 -85
- package/dist/cli-release.js.map +0 -1
- package/dist/client.d.ts +0 -109
- package/dist/client.js +0 -217
- package/dist/client.js.map +0 -1
- package/dist/codex-answer-control.d.ts +0 -14
- package/dist/codex-answer-control.js +0 -41
- package/dist/codex-answer-control.js.map +0 -1
- package/dist/codex-answer-presentation.d.ts +0 -18
- package/dist/codex-answer-presentation.js +0 -113
- package/dist/codex-answer-presentation.js.map +0 -1
- package/dist/codex-input-lifecycle.d.ts +0 -10
- package/dist/codex-input-lifecycle.js +0 -63
- package/dist/codex-input-lifecycle.js.map +0 -1
- package/dist/codex-native-control.d.ts +0 -13
- package/dist/codex-native-control.js +0 -120
- package/dist/codex-native-control.js.map +0 -1
- package/dist/codex-native-turn.d.ts +0 -37
- package/dist/codex-native-turn.js +0 -155
- package/dist/codex-native-turn.js.map +0 -1
- package/dist/codex-question-bindings.d.ts +0 -76
- package/dist/codex-question-bindings.js +0 -151
- package/dist/codex-question-bindings.js.map +0 -1
- package/dist/codex-queue-control.d.ts +0 -21
- package/dist/codex-queue-control.js +0 -59
- package/dist/codex-queue-control.js.map +0 -1
- package/dist/codex-tool-messages.d.ts +0 -7
- package/dist/codex-tool-messages.js +0 -126
- package/dist/codex-tool-messages.js.map +0 -1
- package/dist/codex-wake.d.ts +0 -58
- package/dist/codex-wake.js +0 -135
- package/dist/codex-wake.js.map +0 -1
- package/dist/command-session.d.ts +0 -14
- package/dist/command-session.js +0 -31
- package/dist/command-session.js.map +0 -1
- package/dist/commands-acknowledge.d.ts +0 -13
- package/dist/commands-acknowledge.js +0 -116
- package/dist/commands-acknowledge.js.map +0 -1
- package/dist/commands-agent-sessions.d.ts +0 -6
- package/dist/commands-agent-sessions.js +0 -51
- package/dist/commands-agent-sessions.js.map +0 -1
- package/dist/commands-ask.d.ts +0 -62
- package/dist/commands-ask.js +0 -503
- package/dist/commands-ask.js.map +0 -1
- package/dist/commands-auth.d.ts +0 -76
- package/dist/commands-auth.js +0 -421
- package/dist/commands-auth.js.map +0 -1
- package/dist/commands-close.d.ts +0 -6
- package/dist/commands-close.js +0 -273
- package/dist/commands-close.js.map +0 -1
- package/dist/commands-config.d.ts +0 -31
- package/dist/commands-config.js +0 -272
- package/dist/commands-config.js.map +0 -1
- package/dist/commands-core.d.ts +0 -145
- package/dist/commands-core.js +0 -190
- package/dist/commands-core.js.map +0 -1
- package/dist/commands-devices.d.ts +0 -41
- package/dist/commands-devices.js +0 -144
- package/dist/commands-devices.js.map +0 -1
- package/dist/commands-doctor.d.ts +0 -25
- package/dist/commands-doctor.js +0 -1553
- package/dist/commands-doctor.js.map +0 -1
- package/dist/commands-guidance.d.ts +0 -27
- package/dist/commands-guidance.js +0 -150
- package/dist/commands-guidance.js.map +0 -1
- package/dist/commands-harness-context.d.ts +0 -57
- package/dist/commands-harness-context.js +0 -102
- package/dist/commands-harness-context.js.map +0 -1
- package/dist/commands-hook-attend.d.ts +0 -70
- package/dist/commands-hook-attend.js +0 -655
- package/dist/commands-hook-attend.js.map +0 -1
- package/dist/commands-hook-diagnostics.d.ts +0 -37
- package/dist/commands-hook-diagnostics.js +0 -136
- package/dist/commands-hook-diagnostics.js.map +0 -1
- package/dist/commands-hook-install.d.ts +0 -26
- package/dist/commands-hook-install.js +0 -784
- package/dist/commands-hook-install.js.map +0 -1
- package/dist/commands-hook-run.d.ts +0 -29
- package/dist/commands-hook-run.js +0 -933
- package/dist/commands-hook-run.js.map +0 -1
- package/dist/commands-hook-shape.d.ts +0 -19
- package/dist/commands-hook-shape.js +0 -48
- package/dist/commands-hook-shape.js.map +0 -1
- package/dist/commands-init.d.ts +0 -42
- package/dist/commands-init.js +0 -901
- package/dist/commands-init.js.map +0 -1
- package/dist/commands-io.d.ts +0 -2
- package/dist/commands-io.js +0 -117
- package/dist/commands-io.js.map +0 -1
- package/dist/commands-logs.d.ts +0 -30
- package/dist/commands-logs.js +0 -201
- package/dist/commands-logs.js.map +0 -1
- package/dist/commands-native-acknowledge.d.ts +0 -8
- package/dist/commands-native-acknowledge.js +0 -114
- package/dist/commands-native-acknowledge.js.map +0 -1
- package/dist/commands-project.d.ts +0 -4
- package/dist/commands-project.js +0 -41
- package/dist/commands-project.js.map +0 -1
- package/dist/commands-receive.d.ts +0 -3
- package/dist/commands-receive.js +0 -59
- package/dist/commands-receive.js.map +0 -1
- package/dist/commands-send-support.d.ts +0 -59
- package/dist/commands-send-support.js +0 -258
- package/dist/commands-send-support.js.map +0 -1
- package/dist/commands-send.d.ts +0 -34
- package/dist/commands-send.js +0 -900
- package/dist/commands-send.js.map +0 -1
- package/dist/commands-setup-proof.d.ts +0 -43
- package/dist/commands-setup-proof.js +0 -134
- package/dist/commands-setup-proof.js.map +0 -1
- package/dist/commands-skill.d.ts +0 -21
- package/dist/commands-skill.js +0 -199
- package/dist/commands-skill.js.map +0 -1
- package/dist/commands-sounds.d.ts +0 -12
- package/dist/commands-sounds.js +0 -35
- package/dist/commands-sounds.js.map +0 -1
- package/dist/commands-update-check.d.ts +0 -6
- package/dist/commands-update-check.js +0 -102
- package/dist/commands-update-check.js.map +0 -1
- package/dist/commands-update-resume.d.ts +0 -7
- package/dist/commands-update-resume.js +0 -143
- package/dist/commands-update-resume.js.map +0 -1
- package/dist/commands-update-skill.d.ts +0 -5
- package/dist/commands-update-skill.js +0 -36
- package/dist/commands-update-skill.js.map +0 -1
- package/dist/commands-update.d.ts +0 -11
- package/dist/commands-update.js +0 -286
- package/dist/commands-update.js.map +0 -1
- package/dist/commands.d.ts +0 -26
- package/dist/commands.js +0 -27
- package/dist/commands.js.map +0 -1
- package/dist/config-schema.d.ts +0 -62
- package/dist/config-schema.js +0 -302
- package/dist/config-schema.js.map +0 -1
- package/dist/config.d.ts +0 -181
- package/dist/config.js +0 -357
- package/dist/config.js.map +0 -1
- package/dist/credentials.d.ts +0 -96
- package/dist/credentials.js +0 -342
- package/dist/credentials.js.map +0 -1
- package/dist/file-lock.d.ts +0 -34
- package/dist/file-lock.js +0 -367
- package/dist/file-lock.js.map +0 -1
- package/dist/generated-session-label.d.ts +0 -2
- package/dist/generated-session-label.js +0 -152
- package/dist/generated-session-label.js.map +0 -1
- package/dist/guidance-content.d.ts +0 -53
- package/dist/guidance-content.js +0 -248
- package/dist/guidance-content.js.map +0 -1
- package/dist/guidance-render.d.ts +0 -25
- package/dist/guidance-render.js +0 -47
- package/dist/guidance-render.js.map +0 -1
- package/dist/guidance.d.ts +0 -69
- package/dist/guidance.js +0 -173
- package/dist/guidance.js.map +0 -1
- package/dist/harness-session-title.d.ts +0 -22
- package/dist/harness-session-title.js +0 -74
- package/dist/harness-session-title.js.map +0 -1
- package/dist/harnesses.d.ts +0 -65
- package/dist/harnesses.js +0 -159
- package/dist/harnesses.js.map +0 -1
- package/dist/hermes-attendant.d.ts +0 -38
- package/dist/hermes-attendant.js +0 -337
- package/dist/hermes-attendant.js.map +0 -1
- package/dist/hermes-plugin.d.ts +0 -11
- package/dist/hermes-plugin.js +0 -299
- package/dist/hermes-plugin.js.map +0 -1
- package/dist/hook-acknowledgements.d.ts +0 -70
- package/dist/hook-acknowledgements.js +0 -490
- package/dist/hook-acknowledgements.js.map +0 -1
- package/dist/hook-adapter.d.ts +0 -48
- package/dist/hook-adapter.js +0 -419
- package/dist/hook-adapter.js.map +0 -1
- package/dist/hook-events.d.ts +0 -105
- package/dist/hook-events.js +0 -130
- package/dist/hook-events.js.map +0 -1
- package/dist/hook-gates.d.ts +0 -7
- package/dist/hook-gates.js +0 -20
- package/dist/hook-gates.js.map +0 -1
- package/dist/hook-input.d.ts +0 -10
- package/dist/hook-input.js +0 -64
- package/dist/hook-input.js.map +0 -1
- package/dist/hook-lifecycle.d.ts +0 -112
- package/dist/hook-lifecycle.js +0 -2031
- package/dist/hook-lifecycle.js.map +0 -1
- package/dist/hook-project-sessions.d.ts +0 -28
- package/dist/hook-project-sessions.js +0 -141
- package/dist/hook-project-sessions.js.map +0 -1
- package/dist/hook-question-lock.d.ts +0 -29
- package/dist/hook-question-lock.js +0 -217
- package/dist/hook-question-lock.js.map +0 -1
- package/dist/hook-question-retirement.d.ts +0 -74
- package/dist/hook-question-retirement.js +0 -314
- package/dist/hook-question-retirement.js.map +0 -1
- package/dist/hook-question-state.d.ts +0 -58
- package/dist/hook-question-state.js +0 -239
- package/dist/hook-question-state.js.map +0 -1
- package/dist/hook-session-state.d.ts +0 -127
- package/dist/hook-session-state.js +0 -488
- package/dist/hook-session-state.js.map +0 -1
- package/dist/hook-types.d.ts +0 -476
- package/dist/hook-types.js +0 -4
- package/dist/hook-types.js.map +0 -1
- package/dist/injection-render.d.ts +0 -36
- package/dist/injection-render.js +0 -61
- package/dist/injection-render.js.map +0 -1
- package/dist/install-hooks.d.ts +0 -470
- package/dist/install-hooks.js +0 -1622
- package/dist/install-hooks.js.map +0 -1
- package/dist/integration-health.d.ts +0 -26
- package/dist/integration-health.js +0 -133
- package/dist/integration-health.js.map +0 -1
- package/dist/interactive.d.ts +0 -22
- package/dist/interactive.js +0 -644
- package/dist/interactive.js.map +0 -1
- package/dist/invocation-context.d.ts +0 -47
- package/dist/invocation-context.js +0 -164
- package/dist/invocation-context.js.map +0 -1
- package/dist/local-path.d.ts +0 -7
- package/dist/local-path.js +0 -27
- package/dist/local-path.js.map +0 -1
- package/dist/logging.d.ts +0 -157
- package/dist/logging.js +0 -599
- package/dist/logging.js.map +0 -1
- package/dist/main-run.d.ts +0 -1
- package/dist/main-run.js +0 -42
- package/dist/main-run.js.map +0 -1
- package/dist/main.d.ts +0 -2
- package/dist/main.js +0 -12
- package/dist/main.js.map +0 -1
- package/dist/native-answer-operation.d.ts +0 -70
- package/dist/native-answer-operation.js +0 -247
- package/dist/native-answer-operation.js.map +0 -1
- package/dist/native-skills.d.ts +0 -64
- package/dist/native-skills.js +0 -167
- package/dist/native-skills.js.map +0 -1
- package/dist/node-floor.d.ts +0 -19
- package/dist/node-floor.js +0 -32
- package/dist/node-floor.js.map +0 -1
- package/dist/npm-invocation.d.ts +0 -34
- package/dist/npm-invocation.js +0 -53
- package/dist/npm-invocation.js.map +0 -1
- package/dist/openclaw-continuation-bridge.d.ts +0 -7
- package/dist/openclaw-continuation-bridge.js +0 -64
- package/dist/openclaw-continuation-bridge.js.map +0 -1
- package/dist/openclaw-gateway-readiness.d.ts +0 -1
- package/dist/openclaw-gateway-readiness.js +0 -24
- package/dist/openclaw-gateway-readiness.js.map +0 -1
- package/dist/openclaw-generation.d.ts +0 -21
- package/dist/openclaw-generation.js +0 -115
- package/dist/openclaw-generation.js.map +0 -1
- package/dist/openclaw-message-bridge.d.ts +0 -8
- package/dist/openclaw-message-bridge.js +0 -93
- package/dist/openclaw-message-bridge.js.map +0 -1
- package/dist/openclaw-pending.d.ts +0 -8
- package/dist/openclaw-pending.js +0 -47
- package/dist/openclaw-pending.js.map +0 -1
- package/dist/openclaw-plugin.d.ts +0 -75
- package/dist/openclaw-plugin.js +0 -1353
- package/dist/openclaw-plugin.js.map +0 -1
- package/dist/openclaw-session-access.d.ts +0 -12
- package/dist/openclaw-session-access.js +0 -79
- package/dist/openclaw-session-access.js.map +0 -1
- package/dist/opencode-plugin.d.ts +0 -88
- package/dist/opencode-plugin.js +0 -286
- package/dist/opencode-plugin.js.map +0 -1
- package/dist/orca-session-title.d.ts +0 -11
- package/dist/orca-session-title.js +0 -111
- package/dist/orca-session-title.js.map +0 -1
- package/dist/pack-feedback-slice.d.ts +0 -35
- package/dist/pack-feedback-slice.js +0 -126
- package/dist/pack-feedback-slice.js.map +0 -1
- package/dist/pairing-qr.d.ts +0 -5
- package/dist/pairing-qr.js +0 -24
- package/dist/pairing-qr.js.map +0 -1
- package/dist/pending-pairing.d.ts +0 -38
- package/dist/pending-pairing.js +0 -70
- package/dist/pending-pairing.js.map +0 -1
- package/dist/platform.d.ts +0 -67
- package/dist/platform.js +0 -140
- package/dist/platform.js.map +0 -1
- package/dist/process-identity.d.ts +0 -26
- package/dist/process-identity.js +0 -82
- package/dist/process-identity.js.map +0 -1
- package/dist/program.d.ts +0 -59
- package/dist/program.js +0 -691
- package/dist/program.js.map +0 -1
- package/dist/project-enablement.d.ts +0 -21
- package/dist/project-enablement.js +0 -71
- package/dist/project-enablement.js.map +0 -1
- package/dist/question-settlement-process.d.ts +0 -17
- package/dist/question-settlement-process.js +0 -35
- package/dist/question-settlement-process.js.map +0 -1
- package/dist/question-timing.d.ts +0 -46
- package/dist/question-timing.js +0 -48
- package/dist/question-timing.js.map +0 -1
- package/dist/readiness.d.ts +0 -153
- package/dist/readiness.js +0 -149
- package/dist/readiness.js.map +0 -1
- package/dist/release.d.ts +0 -31
- package/dist/release.js +0 -52
- package/dist/release.js.map +0 -1
- package/dist/send-attempts.d.ts +0 -26
- package/dist/send-attempts.js +0 -139
- package/dist/send-attempts.js.map +0 -1
- package/dist/send.d.ts +0 -115
- package/dist/send.js +0 -421
- package/dist/send.js.map +0 -1
- package/dist/session-activation.d.ts +0 -13
- package/dist/session-activation.js +0 -64
- package/dist/session-activation.js.map +0 -1
- package/dist/session-attendant-probe.d.ts +0 -85
- package/dist/session-attendant-probe.js +0 -173
- package/dist/session-attendant-probe.js.map +0 -1
- package/dist/session-attendant-state.d.ts +0 -70
- package/dist/session-attendant-state.js +0 -256
- package/dist/session-attendant-state.js.map +0 -1
- package/dist/session-attendant.d.ts +0 -143
- package/dist/session-attendant.js +0 -520
- package/dist/session-attendant.js.map +0 -1
- package/dist/session-delivery.d.ts +0 -249
- package/dist/session-delivery.js +0 -576
- package/dist/session-delivery.js.map +0 -1
- package/dist/session-handoff.d.ts +0 -98
- package/dist/session-handoff.js +0 -118
- package/dist/session-handoff.js.map +0 -1
- package/dist/session-input-wakes.d.ts +0 -78
- package/dist/session-input-wakes.js +0 -239
- package/dist/session-input-wakes.js.map +0 -1
- package/dist/session-inputs.d.ts +0 -57
- package/dist/session-inputs.js +0 -434
- package/dist/session-inputs.js.map +0 -1
- package/dist/session-labels.d.ts +0 -56
- package/dist/session-labels.js +0 -396
- package/dist/session-labels.js.map +0 -1
- package/dist/session-message-handoff.d.ts +0 -39
- package/dist/session-message-handoff.js +0 -107
- package/dist/session-message-handoff.js.map +0 -1
- package/dist/setup-destinations.d.ts +0 -23
- package/dist/setup-destinations.js +0 -44
- package/dist/setup-destinations.js.map +0 -1
- package/dist/skill-integrity.d.ts +0 -54
- package/dist/skill-integrity.js +0 -164
- package/dist/skill-integrity.js.map +0 -1
- package/dist/skill-source/manifest.json +0 -40
- package/dist/skill-source/notifai/SKILL.md +0 -350
- package/dist/skill-source/notifai/references/diagnostics.md +0 -36
- package/dist/skill-source/notifai/references/harness-setup.md +0 -384
- package/dist/skill-source/notifai/references/native-questions.md +0 -51
- package/dist/skill-source/notifai/references/notes-and-edits.md +0 -54
- package/dist/skill-source/notifai/references/send-details.md +0 -14
- package/dist/skill-source/notifai/references/updates.md +0 -116
- package/dist/skill-source/notifai/references/writing-examples.md +0 -56
- package/dist/sound-ref.d.ts +0 -23
- package/dist/sound-ref.js +0 -28
- package/dist/sound-ref.js.map +0 -1
- package/dist/ui/banner.d.ts +0 -22
- package/dist/ui/banner.js +0 -87
- package/dist/ui/banner.js.map +0 -1
- package/dist/ui/config-view.d.ts +0 -30
- package/dist/ui/config-view.js +0 -108
- package/dist/ui/config-view.js.map +0 -1
- package/dist/ui/help.d.ts +0 -44
- package/dist/ui/help.js +0 -107
- package/dist/ui/help.js.map +0 -1
- package/dist/ui/theme.d.ts +0 -90
- package/dist/ui/theme.js +0 -244
- package/dist/ui/theme.js.map +0 -1
- package/dist/update-handoff.d.ts +0 -29
- package/dist/update-handoff.js +0 -69
- package/dist/update-handoff.js.map +0 -1
- package/dist/url-policy.d.ts +0 -85
- package/dist/url-policy.js +0 -369
- package/dist/url-policy.js.map +0 -1
- package/dist/version.d.ts +0 -40
- package/dist/version.js +0 -132
- package/dist/version.js.map +0 -1
- package/dist/wake-support.d.ts +0 -40
- package/dist/wake-support.js +0 -95
- package/dist/wake-support.js.map +0 -1
package/dist/send.js
DELETED
|
@@ -1,421 +0,0 @@
|
|
|
1
|
-
import { COLLAPSE_KEY_MAX_BYTES, INTERRUPTION_LEVELS, MEDIA_MAX_ITEMS, NOTIFICATION_SCHEMA_VERSION, QUESTION_TEXT_MAX_LENGTH, SUMMARY_MAX_LENGTH, NOTIFICATION_KINDS, PLATFORMS, } from '@raidiant/notifai-protocol';
|
|
2
|
-
import { isCliSoundRef, unknownSoundMessage } from './sound-ref.js';
|
|
3
|
-
/** A backslash-n pair that was not itself escaped as a literal backslash. */
|
|
4
|
-
const ACCIDENTAL_ESCAPED_NEWLINE = /(?:^|[^\\])\\n/;
|
|
5
|
-
export function hasAccidentalEscapedNewlines(body) {
|
|
6
|
-
return ACCIDENTAL_ESCAPED_NEWLINE.test(body);
|
|
7
|
-
}
|
|
8
|
-
export function accidentalEscapedNewlineMessage() {
|
|
9
|
-
return [
|
|
10
|
-
'This body contains the two-character sequence \\n, which is sent literally and shows as \\n on the device.',
|
|
11
|
-
'To send a real line break, pass a multiline --body or --body-file -.',
|
|
12
|
-
'If you meant the visible characters \\n, pass --literal-backslash-n.',
|
|
13
|
-
].join('\n');
|
|
14
|
-
}
|
|
15
|
-
export function rejectAccidentalEscapedNewlines(body, allowLiteral) {
|
|
16
|
-
if (allowLiteral === true || body === undefined)
|
|
17
|
-
return null;
|
|
18
|
-
return hasAccidentalEscapedNewlines(body) ? accidentalEscapedNewlineMessage() : null;
|
|
19
|
-
}
|
|
20
|
-
/** Validate media cardinality and positional alt pairing before any upload starts. */
|
|
21
|
-
export function validateMediaInputs(images, alts) {
|
|
22
|
-
const imageCount = images?.length ?? 0;
|
|
23
|
-
const imageAlts = alts ?? [];
|
|
24
|
-
if (imageCount > MEDIA_MAX_ITEMS)
|
|
25
|
-
return `Attach at most ${MEDIA_MAX_ITEMS} images.`;
|
|
26
|
-
if (imageAlts.length > imageCount) {
|
|
27
|
-
return `Received ${imageAlts.length} --image-alt values for ${imageCount} --image values.`;
|
|
28
|
-
}
|
|
29
|
-
if (imageAlts.some((alt) => alt.length < 1 || alt.length > 256)) {
|
|
30
|
-
return '--image-alt must be 1-256 characters.';
|
|
31
|
-
}
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
34
|
-
/** Validate a frozen value-object manifest without collapsing sparse alt text. */
|
|
35
|
-
function validateMediaManifest(media) {
|
|
36
|
-
if (media.length > MEDIA_MAX_ITEMS)
|
|
37
|
-
return `Attach at most ${MEDIA_MAX_ITEMS} images.`;
|
|
38
|
-
if (media.some((item) => item.alt !== undefined && (item.alt.length < 1 || item.alt.length > 256))) {
|
|
39
|
-
return 'Media alt text must be 1-256 characters.';
|
|
40
|
-
}
|
|
41
|
-
return null;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* A body may reference an attached image only through Markdown image syntax:
|
|
45
|
-
* `` for a position in `--image` order, or
|
|
46
|
-
* `` for an id that is also attached. Companions resolve
|
|
47
|
-
* the `media:` scheme only as an image target; a bare token or a link would
|
|
48
|
-
* reach the User as raw text, so both are refused here rather than rendered
|
|
49
|
-
* wrongly there.
|
|
50
|
-
*/
|
|
51
|
-
const MEDIA_IMAGE_REFERENCE = /!\[[^\]\n]*\]\(\s*<?media:([^\s)>]*)>?(?:\s+(?:"[^"\n]*"|'[^'\n]*'|\([^\n)]*\)))?\s*\)/g;
|
|
52
|
-
/** A stray `media:` token outside image syntax: a position or a media id. */
|
|
53
|
-
const STRAY_MEDIA_REFERENCE = /media:(?:\d+(?![A-Za-z0-9_-])|med_[A-Za-z0-9_-]+)/;
|
|
54
|
-
/** Split Markdown into literal code (fences and spans) and the prose around it. */
|
|
55
|
-
function markdownProseSegments(body) {
|
|
56
|
-
const segments = [];
|
|
57
|
-
let fence = null;
|
|
58
|
-
let prose = '';
|
|
59
|
-
let code = '';
|
|
60
|
-
const flushProse = () => {
|
|
61
|
-
if (prose.length === 0)
|
|
62
|
-
return;
|
|
63
|
-
segments.push(...inlineCodeSegments(prose));
|
|
64
|
-
prose = '';
|
|
65
|
-
};
|
|
66
|
-
// Keep each line's own newline so the segments concatenate back to the body.
|
|
67
|
-
for (const line of body.split(/(?<=\n)/)) {
|
|
68
|
-
if (fence !== null) {
|
|
69
|
-
code += line;
|
|
70
|
-
const close = line.trim().match(/^(`{3,}|~{3,})\s*$/);
|
|
71
|
-
if (close?.[1]?.[0] === fence.marker && close[1].length >= fence.length) {
|
|
72
|
-
segments.push({ text: code, code: true });
|
|
73
|
-
code = '';
|
|
74
|
-
fence = null;
|
|
75
|
-
}
|
|
76
|
-
continue;
|
|
77
|
-
}
|
|
78
|
-
const open = line.trim().match(/^(`{3,}|~{3,})/);
|
|
79
|
-
if (open?.[1]) {
|
|
80
|
-
flushProse();
|
|
81
|
-
fence = { marker: open[1][0], length: open[1].length };
|
|
82
|
-
code = line;
|
|
83
|
-
continue;
|
|
84
|
-
}
|
|
85
|
-
prose += line;
|
|
86
|
-
}
|
|
87
|
-
flushProse();
|
|
88
|
-
if (code.length > 0)
|
|
89
|
-
segments.push({ text: code, code: true });
|
|
90
|
-
return segments;
|
|
91
|
-
}
|
|
92
|
-
/** Split prose at backtick spans so a literal `media:1` in code stays literal. */
|
|
93
|
-
function inlineCodeSegments(prose) {
|
|
94
|
-
const segments = [];
|
|
95
|
-
let cursor = 0;
|
|
96
|
-
const runs = /`+/g;
|
|
97
|
-
let match;
|
|
98
|
-
while ((match = runs.exec(prose)) !== null) {
|
|
99
|
-
const open = match[0];
|
|
100
|
-
const closeIndex = prose.indexOf(open, match.index + open.length);
|
|
101
|
-
if (closeIndex === -1)
|
|
102
|
-
continue;
|
|
103
|
-
const end = closeIndex + open.length;
|
|
104
|
-
if (match.index > cursor)
|
|
105
|
-
segments.push({ text: prose.slice(cursor, match.index), code: false });
|
|
106
|
-
segments.push({ text: prose.slice(match.index, end), code: true });
|
|
107
|
-
cursor = end;
|
|
108
|
-
runs.lastIndex = end;
|
|
109
|
-
}
|
|
110
|
-
if (cursor < prose.length)
|
|
111
|
-
segments.push({ text: prose.slice(cursor), code: false });
|
|
112
|
-
return segments;
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Rewrite authorable 1-based media positions to canonical ready media ids and
|
|
116
|
-
* refuse every other shape of media reference before anything is sent.
|
|
117
|
-
*/
|
|
118
|
-
export function rewriteMediaReferences(body, mediaIds) {
|
|
119
|
-
let error;
|
|
120
|
-
const rewritten = markdownProseSegments(body)
|
|
121
|
-
.map((segment) => {
|
|
122
|
-
if (segment.code || error !== undefined)
|
|
123
|
-
return segment.text;
|
|
124
|
-
const images = [];
|
|
125
|
-
// Choose a marker absent from authored text. A fixed private-use
|
|
126
|
-
// character lets input such as `\uE0000\uE000` impersonate a placeholder
|
|
127
|
-
// and duplicate an image reference during restoration.
|
|
128
|
-
let imageMarker = '\uE000';
|
|
129
|
-
while (segment.text.includes(imageMarker))
|
|
130
|
-
imageMarker += '\uE000';
|
|
131
|
-
const masked = segment.text.replace(MEDIA_IMAGE_REFERENCE, (reference, target) => {
|
|
132
|
-
if (error !== undefined)
|
|
133
|
-
return reference;
|
|
134
|
-
let mediaId;
|
|
135
|
-
if (/^\d+$/.test(target)) {
|
|
136
|
-
const position = Number(target);
|
|
137
|
-
mediaId = String(position) === target ? mediaIds[position - 1] : undefined;
|
|
138
|
-
if (mediaId === undefined) {
|
|
139
|
-
error = `Body reference "media:${target}" has no matching --image occurrence.`;
|
|
140
|
-
return reference;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
else if (/^med_[A-Za-z0-9_-]+$/.test(target)) {
|
|
144
|
-
if (!mediaIds.includes(target)) {
|
|
145
|
-
error = `Body reference "media:${target}" is not attached; pass it with --image.`;
|
|
146
|
-
return reference;
|
|
147
|
-
}
|
|
148
|
-
mediaId = target;
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
error = `Body reference "media:${target}" is neither an --image position nor a media id.`;
|
|
152
|
-
return reference;
|
|
153
|
-
}
|
|
154
|
-
images.push(reference.replace(`media:${target}`, `media:${mediaId}`));
|
|
155
|
-
return `${imageMarker}${images.length - 1}${imageMarker}`;
|
|
156
|
-
});
|
|
157
|
-
if (error !== undefined)
|
|
158
|
-
return segment.text;
|
|
159
|
-
const stray = masked.match(STRAY_MEDIA_REFERENCE);
|
|
160
|
-
if (stray !== null) {
|
|
161
|
-
error =
|
|
162
|
-
`Body reference "${stray[0]}" is not a Markdown image. Write ` +
|
|
163
|
-
` — a bare or linked media reference is never rendered.`;
|
|
164
|
-
return segment.text;
|
|
165
|
-
}
|
|
166
|
-
return images.reduce((restored, image, index) => restored.replaceAll(`${imageMarker}${index}${imageMarker}`, image), masked);
|
|
167
|
-
})
|
|
168
|
-
.join('');
|
|
169
|
-
return error === undefined ? { ok: true, body: rewritten } : { ok: false, error };
|
|
170
|
-
}
|
|
171
|
-
/** Merge flags over resolved config into a Notification Request draft. */
|
|
172
|
-
export function buildDraft(config, flags, invocation = {}) {
|
|
173
|
-
if (!flags.title || !flags.summary || flags.summary.trim() === '') {
|
|
174
|
-
return { ok: false, error: 'Both --title and --summary are required.' };
|
|
175
|
-
}
|
|
176
|
-
if (Array.from(flags.summary).length > SUMMARY_MAX_LENGTH) {
|
|
177
|
-
return {
|
|
178
|
-
ok: false,
|
|
179
|
-
error: `--summary must be at most ${SUMMARY_MAX_LENGTH} Unicode characters.`,
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
if (/[\u0000-\u001F\u007F-\u009F\u2028\u2029]/u.test(flags.summary)) {
|
|
183
|
-
return { ok: false, error: '--summary must be one line of plain text.' };
|
|
184
|
-
}
|
|
185
|
-
const platform = resolvePlatform(flags.platform);
|
|
186
|
-
if (!platform) {
|
|
187
|
-
return { ok: false, error: `Unknown platform "${flags.platform}" — use ${PLATFORMS.join(' or ')}.` };
|
|
188
|
-
}
|
|
189
|
-
if (flags.media !== undefined && (flags.image !== undefined || flags.imageAlt !== undefined)) {
|
|
190
|
-
return { ok: false, error: 'Internal media manifests cannot be combined with --image or --image-alt.' };
|
|
191
|
-
}
|
|
192
|
-
const imageIds = flags.media?.map((item) => item.media_id) ?? flags.image ?? [];
|
|
193
|
-
const imageAlts = flags.imageAlt ?? [];
|
|
194
|
-
const mediaInputError = flags.media === undefined
|
|
195
|
-
? validateMediaInputs(imageIds, imageAlts)
|
|
196
|
-
: validateMediaManifest(flags.media);
|
|
197
|
-
if (mediaInputError !== null)
|
|
198
|
-
return { ok: false, error: mediaInputError };
|
|
199
|
-
const media = flags.media ??
|
|
200
|
-
imageIds.map((media_id, index) => ({
|
|
201
|
-
media_id,
|
|
202
|
-
...(imageAlts[index] !== undefined ? { alt: imageAlts[index] } : {}),
|
|
203
|
-
}));
|
|
204
|
-
const body = flags.body === undefined
|
|
205
|
-
? undefined
|
|
206
|
-
: rewriteMediaReferences(flags.body, imageIds);
|
|
207
|
-
if (body !== undefined && !body.ok)
|
|
208
|
-
return body;
|
|
209
|
-
const deviceIds = flags.all ? null : (flags.device?.length ? flags.device : config.devices.value);
|
|
210
|
-
const targets = deviceIds && deviceIds.length > 0 ? { mode: 'selected', device_ids: deviceIds } : { mode: 'all' };
|
|
211
|
-
if (flags.kind !== undefined &&
|
|
212
|
-
!NOTIFICATION_KINDS.includes(flags.kind)) {
|
|
213
|
-
return {
|
|
214
|
-
ok: false,
|
|
215
|
-
error: `Unknown kind "${flags.kind}" — supported: ${NOTIFICATION_KINDS.map((kind) => `"${kind}"`).join(', ')}.`,
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
// Explicit --sound and the saved sound key outrank kind. The server is the
|
|
219
|
-
// one that applies kind, Project, and Account maps — stamping a kind default
|
|
220
|
-
// here would look like an explicit choice and skip those layers. `none` is
|
|
221
|
-
// still silent.
|
|
222
|
-
const sound = flags.sound !== undefined ? flags.sound : config.sound.value;
|
|
223
|
-
if (sound !== null && sound !== undefined && !isCliSoundRef(sound)) {
|
|
224
|
-
return {
|
|
225
|
-
ok: false,
|
|
226
|
-
error: unknownSoundMessage(sound),
|
|
227
|
-
};
|
|
228
|
-
}
|
|
229
|
-
const level = flags.level !== undefined ? flags.level : config.interruption_level.value;
|
|
230
|
-
if (level !== null &&
|
|
231
|
-
level !== undefined &&
|
|
232
|
-
!INTERRUPTION_LEVELS.includes(level)) {
|
|
233
|
-
return { ok: false, error: `Unknown interruption level "${level}".` };
|
|
234
|
-
}
|
|
235
|
-
if (platform === 'android' && level !== null && level !== undefined) {
|
|
236
|
-
return {
|
|
237
|
-
ok: false,
|
|
238
|
-
error: 'Android does not support caller-selected interruption levels. Remove --level or unset the configured interruption_level; kind, notification channels, and device settings own attention on Android.',
|
|
239
|
-
};
|
|
240
|
-
}
|
|
241
|
-
const appleOptions = {};
|
|
242
|
-
const androidOptions = {};
|
|
243
|
-
if (sound === 'none') {
|
|
244
|
-
appleOptions.sound = null;
|
|
245
|
-
androidOptions.sound = null;
|
|
246
|
-
}
|
|
247
|
-
else if (sound !== null && sound !== undefined) {
|
|
248
|
-
appleOptions.sound = sound;
|
|
249
|
-
androidOptions.sound = sound;
|
|
250
|
-
}
|
|
251
|
-
if (flags.threadId !== undefined) {
|
|
252
|
-
appleOptions.thread_id = flags.threadId;
|
|
253
|
-
androidOptions.thread_id = flags.threadId;
|
|
254
|
-
}
|
|
255
|
-
if (level !== null && level !== undefined) {
|
|
256
|
-
appleOptions.interruption_level = level;
|
|
257
|
-
}
|
|
258
|
-
if (flags.data?.length) {
|
|
259
|
-
const data = {};
|
|
260
|
-
for (const pair of flags.data) {
|
|
261
|
-
const eq = pair.indexOf('=');
|
|
262
|
-
if (eq <= 0)
|
|
263
|
-
return { ok: false, error: `--data expects key=value, got "${pair}".` };
|
|
264
|
-
data[pair.slice(0, eq)] = pair.slice(eq + 1);
|
|
265
|
-
}
|
|
266
|
-
appleOptions.custom_data = data;
|
|
267
|
-
androidOptions.custom_data = data;
|
|
268
|
-
}
|
|
269
|
-
const ttl = flags.ttl ?? config.ttl_seconds.value;
|
|
270
|
-
const collapse = flags.collapseKey ?? config.collapse_key.value;
|
|
271
|
-
if (collapse !== null &&
|
|
272
|
-
collapse !== undefined &&
|
|
273
|
-
Buffer.byteLength(collapse, 'utf8') > COLLAPSE_KEY_MAX_BYTES) {
|
|
274
|
-
return {
|
|
275
|
-
ok: false,
|
|
276
|
-
error: `--collapse-key must be at most ${COLLAPSE_KEY_MAX_BYTES} UTF-8 bytes.`,
|
|
277
|
-
};
|
|
278
|
-
}
|
|
279
|
-
if (flags.projectless === true && flags.project !== undefined) {
|
|
280
|
-
return { ok: false, error: 'Choose either --project or --projectless, not both.' };
|
|
281
|
-
}
|
|
282
|
-
const project = flags.projectless === true
|
|
283
|
-
? undefined
|
|
284
|
-
: flags.project ?? config.project.value ?? invocation.inferredProject;
|
|
285
|
-
// Ids are derived from labels so an agent writing a one-liner does not have
|
|
286
|
-
// to invent them, but they stay the stable thing it branches on afterwards.
|
|
287
|
-
const choices = parseChoices(flags.choice);
|
|
288
|
-
if (choices === 'invalid') {
|
|
289
|
-
return {
|
|
290
|
-
ok: false,
|
|
291
|
-
error: CHOICE_USAGE,
|
|
292
|
-
};
|
|
293
|
-
}
|
|
294
|
-
if (flags.multi && choices === null && flags.questions === undefined) {
|
|
295
|
-
return { ok: false, error: '--multi needs answers to select between; add --choice.' };
|
|
296
|
-
}
|
|
297
|
-
if (flags.reply &&
|
|
298
|
-
flags.questions === undefined &&
|
|
299
|
-
Array.from(flags.summary).length > QUESTION_TEXT_MAX_LENGTH) {
|
|
300
|
-
return {
|
|
301
|
-
ok: false,
|
|
302
|
-
error: `Keep the question within ${QUESTION_TEXT_MAX_LENGTH} characters and put ` +
|
|
303
|
-
'the longer explanation in the optional Markdown Body.',
|
|
304
|
-
};
|
|
305
|
-
}
|
|
306
|
-
const hasAppleOptions = Object.keys(appleOptions).length > 0;
|
|
307
|
-
const hasAndroidOptions = Object.keys(androidOptions).length > 0;
|
|
308
|
-
let platformOptions;
|
|
309
|
-
if (flags.platform === undefined) {
|
|
310
|
-
if (hasAppleOptions || hasAndroidOptions) {
|
|
311
|
-
platformOptions = {
|
|
312
|
-
...(hasAppleOptions ? { ios: appleOptions, macos: appleOptions } : {}),
|
|
313
|
-
...(hasAndroidOptions ? { android: androidOptions } : {}),
|
|
314
|
-
};
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
else if (platform === 'android') {
|
|
318
|
-
if (hasAndroidOptions)
|
|
319
|
-
platformOptions = { android: androidOptions };
|
|
320
|
-
}
|
|
321
|
-
else if (hasAppleOptions) {
|
|
322
|
-
platformOptions =
|
|
323
|
-
platform === 'ios' ? { ios: appleOptions } : { macos: appleOptions };
|
|
324
|
-
}
|
|
325
|
-
const draft = {
|
|
326
|
-
schema_version: NOTIFICATION_SCHEMA_VERSION,
|
|
327
|
-
...(flags.kind !== undefined
|
|
328
|
-
? { kind: flags.kind }
|
|
329
|
-
: {}),
|
|
330
|
-
...(flags.lifecycle !== undefined ? { lifecycle: flags.lifecycle } : {}),
|
|
331
|
-
...(project !== null && project !== undefined ? { project } : {}),
|
|
332
|
-
...(invocation.source !== undefined ? { source: invocation.source } : {}),
|
|
333
|
-
presentation: {
|
|
334
|
-
title: flags.title,
|
|
335
|
-
summary: flags.summary,
|
|
336
|
-
...(body !== undefined ? { body: body.body } : {}),
|
|
337
|
-
...(media.length > 0 ? { media } : {}),
|
|
338
|
-
},
|
|
339
|
-
targets,
|
|
340
|
-
delivery: { ttl_seconds: ttl, collapse_key: collapse },
|
|
341
|
-
...(flags.reply
|
|
342
|
-
? {
|
|
343
|
-
reply: {
|
|
344
|
-
expires_in_seconds: flags.replyWindow ?? config.reply_window_seconds.value,
|
|
345
|
-
questions: flags.questions ?? [
|
|
346
|
-
{
|
|
347
|
-
id: 'q1',
|
|
348
|
-
text: flags.summary,
|
|
349
|
-
...(choices !== null ? { choices } : {}),
|
|
350
|
-
...(flags.multi ? { multi: true } : {}),
|
|
351
|
-
},
|
|
352
|
-
],
|
|
353
|
-
},
|
|
354
|
-
}
|
|
355
|
-
: {}),
|
|
356
|
-
...(platformOptions !== undefined ? { platform: platformOptions } : {}),
|
|
357
|
-
};
|
|
358
|
-
return { ok: true, draft, platform };
|
|
359
|
-
}
|
|
360
|
-
function resolvePlatform(value) {
|
|
361
|
-
if (value === undefined)
|
|
362
|
-
return 'ios';
|
|
363
|
-
return PLATFORMS.includes(value) ? value : null;
|
|
364
|
-
}
|
|
365
|
-
/** Human one-screen receipt summary; agents use --json instead. */
|
|
366
|
-
export function formatReceipt(receipt) {
|
|
367
|
-
const lines = [];
|
|
368
|
-
const overall = receipt.overall === 'provider_accepted_all'
|
|
369
|
-
? 'accepted by the push provider for every device'
|
|
370
|
-
: receipt.overall === 'provider_accepted_partial'
|
|
371
|
-
? 'accepted for some devices'
|
|
372
|
-
: receipt.overall === 'provider_rejected_all'
|
|
373
|
-
? 'rejected for every device'
|
|
374
|
-
: 'still in flight';
|
|
375
|
-
lines.push(`request ${receipt.request_id}${receipt.replayed ? ' (replayed)' : ''}: ${overall}`);
|
|
376
|
-
for (const d of receipt.deliveries) {
|
|
377
|
-
const detail = d.provider_reason ? ` (${d.provider_reason})` : '';
|
|
378
|
-
lines.push(` ${d.device_name}: ${d.state}${detail}`);
|
|
379
|
-
}
|
|
380
|
-
lines.push(` device receipt is not assessed here; run notifai status ${receipt.request_id} for Companion Receipt evidence`);
|
|
381
|
-
for (const w of receipt.warnings)
|
|
382
|
-
lines.push(` warning ${w.path}: ${w.message}`);
|
|
383
|
-
return lines.join('\n');
|
|
384
|
-
}
|
|
385
|
-
/** Stable exit codes: 0 ok/pending, 1 rejected everywhere. */
|
|
386
|
-
export function receiptExitCode(receipt) {
|
|
387
|
-
return receipt.overall === 'provider_rejected_all' ? 1 : 0;
|
|
388
|
-
}
|
|
389
|
-
/**
|
|
390
|
-
* One flag occurrence, one answer: `--choice Staging --choice Production` ->
|
|
391
|
-
* `[{id:'staging',label:'Staging'}, ...]`.
|
|
392
|
-
*
|
|
393
|
-
* Commas are ordinary characters. The old single-value comma split produced
|
|
394
|
-
* buttons the agent never intended ("Nothing, I'll review" became two answers)
|
|
395
|
-
* and nothing downstream could detect it, so the delimiter form is gone
|
|
396
|
-
* rather than guarded: a label is a label.
|
|
397
|
-
*/
|
|
398
|
-
export function parseChoices(value) {
|
|
399
|
-
if (value === undefined || value.length === 0)
|
|
400
|
-
return null;
|
|
401
|
-
const labels = value.map((part) => part.trim()).filter((part) => part.length > 0);
|
|
402
|
-
if (labels.length < 2 || labels.length > 6)
|
|
403
|
-
return 'invalid';
|
|
404
|
-
const choices = labels.map((label) => ({ id: slugify(label), label }));
|
|
405
|
-
if (choices.some((choice) => choice.id === ''))
|
|
406
|
-
return 'invalid';
|
|
407
|
-
if (new Set(choices.map((choice) => choice.id)).size !== choices.length)
|
|
408
|
-
return 'invalid';
|
|
409
|
-
return choices;
|
|
410
|
-
}
|
|
411
|
-
/** Message shared by every surface that accepts choice labels. */
|
|
412
|
-
export const CHOICE_USAGE = 'Offer 2-6 answers, one --choice flag per answer, unique once slugified — ' +
|
|
413
|
-
'e.g. --choice "Yes, ship it" --choice "Not yet".';
|
|
414
|
-
export function slugify(label) {
|
|
415
|
-
return label
|
|
416
|
-
.toLowerCase()
|
|
417
|
-
.replace(/[^a-z0-9]+/g, '-')
|
|
418
|
-
.replace(/^-+|-+$/g, '')
|
|
419
|
-
.slice(0, 32);
|
|
420
|
-
}
|
|
421
|
-
//# sourceMappingURL=send.js.map
|
package/dist/send.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"send.js","sourceRoot":"","sources":["../src/send.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { HookHarness } from './hook-types.js';
|
|
2
|
-
export declare const WORKER_ACTIVATION_CONTEXT = "Notifai worker context: an Agent Event is a meaningful occurrence in your work; a Notification Request is a deliberate User-visible message about one. Report Agent Events to the parent and do not send Notification Requests unless the parent explicitly delegated that ownership. If delegated, load the Notifai skill and run `notifai guidance` before composing one.";
|
|
3
|
-
export declare const MISSING_LIFECYCLE_GUIDANCE_CONTEXT = "Notifai lifecycle guidance could not be loaded, so Project Enablement is unverified. Run `notifai init --json` to check setup, then `notifai guidance` before deciding whether or how to send a Notification Request.";
|
|
4
|
-
/** One lifecycle meaning, encoded for each harness output contract. */
|
|
5
|
-
export declare function sessionActivationOutput(harness: HookHarness | undefined, hookEventName: 'SessionStart' | 'SubagentStart', cwd?: string, env?: NodeJS.ProcessEnv, notice?: string): string | undefined;
|
|
6
|
-
/** Inject a journaled device answer into the User's new turn. */
|
|
7
|
-
export declare function userPromptContextOutput(harness: HookHarness | undefined, context: string): string | undefined;
|
|
8
|
-
/**
|
|
9
|
-
* Cursor currently accepts sessionStart context without reliably delivering it
|
|
10
|
-
* to the model. Its native post-Stop follow-up is the narrow fallback and is
|
|
11
|
-
* claimed once per conversation by the hook-state layer.
|
|
12
|
-
*/
|
|
13
|
-
export declare function cursorStopActivationOutput(cwd?: string, env?: NodeJS.ProcessEnv, notice?: string): string;
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { Buffer } from 'node:buffer';
|
|
2
|
-
import { GUIDANCE_CONTEXT_MAX_BYTES, boundedEffectiveGuidance } from './guidance-render.js';
|
|
3
|
-
const ROOT_OWNERSHIP = 'Notifai is enabled for this Project. You own Notification Requests unless explicitly assigned elsewhere. Load the Notifai skill before your first Notification Request. ' +
|
|
4
|
-
'Load the skill\'s naming rules on a change of job. ' +
|
|
5
|
-
'Follow the effective guidance below. Under it, when owned or coordinated work needs a User decision, approval, sign-in, credential setup or physical action, register with `notifai ask` in the same turn as the conversation question; conversation alone misses an away User. Ask for safe setup or readiness, never for credentials. Harness permission prompts stay in the harness. ' +
|
|
6
|
-
'Missing readiness: `notifai init --json`.';
|
|
7
|
-
export const WORKER_ACTIVATION_CONTEXT = 'Notifai worker context: an Agent Event is a meaningful occurrence in your work; a Notification Request is a deliberate User-visible message about one. Report Agent Events to the parent and do not send Notification Requests unless the parent explicitly delegated that ownership. If delegated, load the Notifai skill and run `notifai guidance` before composing one.';
|
|
8
|
-
export const MISSING_LIFECYCLE_GUIDANCE_CONTEXT = 'Notifai lifecycle guidance could not be loaded, so Project Enablement is unverified. Run `notifai init --json` to check setup, then `notifai guidance` before deciding whether or how to send a Notification Request.';
|
|
9
|
-
function rootActivationContext(cwd, env, notice, maxBytes = GUIDANCE_CONTEXT_MAX_BYTES) {
|
|
10
|
-
const opening = notice === undefined ? ROOT_OWNERSHIP : `${ROOT_OWNERSHIP}\n\n${notice}`;
|
|
11
|
-
const guidance = boundedEffectiveGuidance({
|
|
12
|
-
cwd,
|
|
13
|
-
env,
|
|
14
|
-
maxBytes: maxBytes - Buffer.byteLength(`${opening}\n\n`, 'utf8'),
|
|
15
|
-
});
|
|
16
|
-
return `${opening}\n\n${guidance.ok ? guidance.content : guidance.fallback}`;
|
|
17
|
-
}
|
|
18
|
-
/** One lifecycle meaning, encoded for each harness output contract. */
|
|
19
|
-
export function sessionActivationOutput(harness, hookEventName, cwd = process.cwd(), env = process.env, notice) {
|
|
20
|
-
const context = hookEventName === 'SubagentStart'
|
|
21
|
-
? WORKER_ACTIVATION_CONTEXT
|
|
22
|
-
: rootActivationContext(cwd, env, notice, harness === 'hermes' ? 3900 : GUIDANCE_CONTEXT_MAX_BYTES);
|
|
23
|
-
if (harness === 'opencode' || harness === 'openclaw' || harness === 'hermes')
|
|
24
|
-
return context;
|
|
25
|
-
if (harness === 'cursor') {
|
|
26
|
-
return JSON.stringify({ additional_context: context });
|
|
27
|
-
}
|
|
28
|
-
if (harness === 'claude-code' || harness === 'codex') {
|
|
29
|
-
return JSON.stringify({
|
|
30
|
-
hookSpecificOutput: {
|
|
31
|
-
hookEventName,
|
|
32
|
-
additionalContext: context,
|
|
33
|
-
},
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
return undefined;
|
|
37
|
-
}
|
|
38
|
-
/** Inject a journaled device answer into the User's new turn. */
|
|
39
|
-
export function userPromptContextOutput(harness, context) {
|
|
40
|
-
if (harness === 'opencode' || harness === 'openclaw')
|
|
41
|
-
return context;
|
|
42
|
-
if (harness === 'cursor')
|
|
43
|
-
return JSON.stringify({ additional_context: context });
|
|
44
|
-
if (harness === 'claude-code' || harness === 'codex') {
|
|
45
|
-
return JSON.stringify({
|
|
46
|
-
hookSpecificOutput: {
|
|
47
|
-
hookEventName: 'UserPromptSubmit',
|
|
48
|
-
additionalContext: context,
|
|
49
|
-
},
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
return undefined;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Cursor currently accepts sessionStart context without reliably delivering it
|
|
56
|
-
* to the model. Its native post-Stop follow-up is the narrow fallback and is
|
|
57
|
-
* claimed once per conversation by the hook-state layer.
|
|
58
|
-
*/
|
|
59
|
-
export function cursorStopActivationOutput(cwd = process.cwd(), env = process.env, notice) {
|
|
60
|
-
return JSON.stringify({
|
|
61
|
-
followup_message: rootActivationContext(cwd, env, notice),
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
//# sourceMappingURL=session-activation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-activation.js","sourceRoot":"","sources":["../src/session-activation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import type { HookHarness } from './hook-types.js';
|
|
2
|
-
import { type ProcessIdentity } from './process-identity.js';
|
|
3
|
-
import type { HarnessProbe } from './session-attendant.js';
|
|
4
|
-
import type { SessionActivity } from '@raidiant/notifai-protocol';
|
|
5
|
-
/** Whether this build runs a Session Attendant for a harness on a platform, and why not. */
|
|
6
|
-
export type AttendantSupport = {
|
|
7
|
-
supported: true;
|
|
8
|
-
} | {
|
|
9
|
-
supported: false;
|
|
10
|
-
reason: string;
|
|
11
|
-
};
|
|
12
|
-
export declare function attendantSupport(harness: HookHarness | undefined, platform: NodeJS.Platform): AttendantSupport;
|
|
13
|
-
/** The Gateway process plus current CLI-owned generation prove OpenClaw presence. */
|
|
14
|
-
export declare function openclawAttendanceProbe(options: {
|
|
15
|
-
sessionKey: string;
|
|
16
|
-
generationId: string;
|
|
17
|
-
gateway: ProcessIdentity;
|
|
18
|
-
env: NodeJS.ProcessEnv;
|
|
19
|
-
endedByHook: () => boolean;
|
|
20
|
-
activity?: () => SessionActivity | null;
|
|
21
|
-
readStart?: (pid: number) => string | null;
|
|
22
|
-
exists?: (pid: number) => boolean;
|
|
23
|
-
}): () => HarnessProbe;
|
|
24
|
-
export interface ClaudeProbeAdapters {
|
|
25
|
-
readDescriptor(pid: number): unknown;
|
|
26
|
-
pidExists(pid: number): boolean;
|
|
27
|
-
readStart(pid: number): string | null;
|
|
28
|
-
/** This process's current parent; the kernel updates it when the parent exits. */
|
|
29
|
-
parentPid(): number;
|
|
30
|
-
}
|
|
31
|
-
export declare function claudeDescriptorDir(env: NodeJS.ProcessEnv): string;
|
|
32
|
-
export declare function systemClaudeProbeAdapters(env: NodeJS.ProcessEnv): ClaudeProbeAdapters;
|
|
33
|
-
/**
|
|
34
|
-
* The Claude Code probe. Every call re-establishes the evidence; nothing is
|
|
35
|
-
* carried over from an earlier call, so one failed check can never be
|
|
36
|
-
* followed by `running` without a fresh successful one.
|
|
37
|
-
*
|
|
38
|
-
* - The harness PID is gone, or now belongs to a process with another start
|
|
39
|
-
* time: `ended` (harness-gone). Checked on every call: a SIGKILLed harness
|
|
40
|
-
* leaves its descriptor behind, and a reused PID would satisfy the rest.
|
|
41
|
-
* While the harness is still this process's parent the identity holds
|
|
42
|
-
* without a lookup — a parent cannot be replaced under a living child;
|
|
43
|
-
* otherwise (an npx adapter in between, or an orphaned attendant) the start
|
|
44
|
-
* time is read again.
|
|
45
|
-
* - The start time cannot be read: `uncertain`.
|
|
46
|
-
* - The descriptor for that PID names another session id: `/clear` or
|
|
47
|
-
* `/resume` replaced this session in the same process: `ended`.
|
|
48
|
-
* - The descriptor is missing: Claude Code 2.1.282 removes it about a second
|
|
49
|
-
* *before* SessionEnd and exit, so with the process alive this is
|
|
50
|
-
* `uncertain`.
|
|
51
|
-
* - The descriptor's `procStart` (UTC `ps` text) differs from the harness
|
|
52
|
-
* start read the same way: the evidence disagrees, `uncertain`.
|
|
53
|
-
*
|
|
54
|
-
* Activity comes from the descriptor `status`: `idle` is idle, anything else
|
|
55
|
-
* (busy, waiting on a permission prompt) is working.
|
|
56
|
-
*/
|
|
57
|
-
export declare function claudeAttendanceProbe(options: {
|
|
58
|
-
sessionId: string;
|
|
59
|
-
harness: ProcessIdentity;
|
|
60
|
-
/** SessionEnd's marker for exactly this incarnation. */
|
|
61
|
-
endedByHook: () => boolean;
|
|
62
|
-
adapters: ClaudeProbeAdapters;
|
|
63
|
-
}): () => HarnessProbe;
|
|
64
|
-
/**
|
|
65
|
-
* The Codex probe. Codex publishes no session descriptor, so the evidence is
|
|
66
|
-
* the Codex process that started this attendant and the thread's own hooks:
|
|
67
|
-
*
|
|
68
|
-
* - SessionEnd's marker for this incarnation: `ended`. Codex runs SessionEnd
|
|
69
|
-
* when the thread closes, is archived or deleted, or unloads after idling
|
|
70
|
-
* with no client, then kills the attendant.
|
|
71
|
-
* - The Codex PID is gone or now names a process with another start time:
|
|
72
|
-
* `ended` (harness-gone). A crashed or killed Codex never runs SessionEnd
|
|
73
|
-
* and leaves the attendant behind in its own process group.
|
|
74
|
-
* - The start time cannot be read: `uncertain`.
|
|
75
|
-
*
|
|
76
|
-
* Activity comes from this thread's prompt, trusted tool, and turn-end hooks.
|
|
77
|
-
*/
|
|
78
|
-
export declare function codexAttendanceProbe(options: {
|
|
79
|
-
harness: ProcessIdentity;
|
|
80
|
-
/** SessionEnd's marker for exactly this incarnation. */
|
|
81
|
-
endedByHook: () => boolean;
|
|
82
|
-
/** Working while this thread's latest recorded turn has not ended. */
|
|
83
|
-
activity: () => SessionActivity | null;
|
|
84
|
-
adapters: Pick<ClaudeProbeAdapters, 'pidExists' | 'readStart' | 'parentPid'>;
|
|
85
|
-
}): () => HarnessProbe;
|