@raidiant/notifai 11.7.1-beta.2 → 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 +61 -4
- package/NOTICE +16 -0
- package/THIRD_PARTY_NOTICES +725 -0
- package/bin/notifai.mjs +11420 -0
- package/data/install.ps1 +318 -0
- package/data/release.json +1 -0
- package/inventory.json +1 -0
- package/npm-adapter-files.json +52 -0
- package/package.json +14 -44
- package/README.md +0 -168
- package/dist/agent-update-notice.d.ts +0 -7
- package/dist/agent-update-notice.js +0 -77
- package/dist/agent-update-notice.js.map +0 -1
- package/dist/atomic-file.d.ts +0 -30
- package/dist/atomic-file.js +0 -148
- package/dist/atomic-file.js.map +0 -1
- package/dist/attendant-update.d.ts +0 -15
- package/dist/attendant-update.js +0 -96
- package/dist/attendant-update.js.map +0 -1
- package/dist/claude-wake.d.ts +0 -108
- package/dist/claude-wake.js +0 -369
- package/dist/claude-wake.js.map +0 -1
- package/dist/cli-bin.d.ts +0 -26
- package/dist/cli-bin.js +0 -220
- package/dist/cli-bin.js.map +0 -1
- package/dist/cli-contract.d.ts +0 -16
- package/dist/cli-contract.js +0 -27
- package/dist/cli-contract.js.map +0 -1
- package/dist/cli-release.d.ts +0 -36
- package/dist/cli-release.js +0 -85
- package/dist/cli-release.js.map +0 -1
- package/dist/client.d.ts +0 -109
- package/dist/client.js +0 -217
- package/dist/client.js.map +0 -1
- package/dist/codex-answer-control.d.ts +0 -14
- package/dist/codex-answer-control.js +0 -41
- package/dist/codex-answer-control.js.map +0 -1
- package/dist/codex-answer-presentation.d.ts +0 -18
- package/dist/codex-answer-presentation.js +0 -113
- package/dist/codex-answer-presentation.js.map +0 -1
- package/dist/codex-input-lifecycle.d.ts +0 -10
- package/dist/codex-input-lifecycle.js +0 -63
- package/dist/codex-input-lifecycle.js.map +0 -1
- package/dist/codex-native-control.d.ts +0 -13
- package/dist/codex-native-control.js +0 -120
- package/dist/codex-native-control.js.map +0 -1
- package/dist/codex-native-turn.d.ts +0 -37
- package/dist/codex-native-turn.js +0 -155
- package/dist/codex-native-turn.js.map +0 -1
- package/dist/codex-question-bindings.d.ts +0 -76
- package/dist/codex-question-bindings.js +0 -151
- package/dist/codex-question-bindings.js.map +0 -1
- package/dist/codex-queue-control.d.ts +0 -21
- package/dist/codex-queue-control.js +0 -59
- package/dist/codex-queue-control.js.map +0 -1
- package/dist/codex-tool-messages.d.ts +0 -7
- package/dist/codex-tool-messages.js +0 -126
- package/dist/codex-tool-messages.js.map +0 -1
- package/dist/codex-wake.d.ts +0 -58
- package/dist/codex-wake.js +0 -135
- package/dist/codex-wake.js.map +0 -1
- package/dist/command-session.d.ts +0 -14
- package/dist/command-session.js +0 -31
- package/dist/command-session.js.map +0 -1
- package/dist/commands-acknowledge.d.ts +0 -13
- package/dist/commands-acknowledge.js +0 -116
- package/dist/commands-acknowledge.js.map +0 -1
- package/dist/commands-agent-sessions.d.ts +0 -6
- package/dist/commands-agent-sessions.js +0 -51
- package/dist/commands-agent-sessions.js.map +0 -1
- package/dist/commands-ask.d.ts +0 -62
- package/dist/commands-ask.js +0 -503
- package/dist/commands-ask.js.map +0 -1
- package/dist/commands-auth.d.ts +0 -76
- package/dist/commands-auth.js +0 -421
- package/dist/commands-auth.js.map +0 -1
- package/dist/commands-close.d.ts +0 -6
- package/dist/commands-close.js +0 -273
- package/dist/commands-close.js.map +0 -1
- package/dist/commands-config.d.ts +0 -31
- package/dist/commands-config.js +0 -272
- package/dist/commands-config.js.map +0 -1
- package/dist/commands-core.d.ts +0 -145
- package/dist/commands-core.js +0 -190
- package/dist/commands-core.js.map +0 -1
- package/dist/commands-devices.d.ts +0 -41
- package/dist/commands-devices.js +0 -144
- package/dist/commands-devices.js.map +0 -1
- package/dist/commands-doctor.d.ts +0 -25
- package/dist/commands-doctor.js +0 -1553
- package/dist/commands-doctor.js.map +0 -1
- package/dist/commands-guidance.d.ts +0 -27
- package/dist/commands-guidance.js +0 -150
- package/dist/commands-guidance.js.map +0 -1
- package/dist/commands-harness-context.d.ts +0 -57
- package/dist/commands-harness-context.js +0 -102
- package/dist/commands-harness-context.js.map +0 -1
- package/dist/commands-hook-attend.d.ts +0 -70
- package/dist/commands-hook-attend.js +0 -655
- package/dist/commands-hook-attend.js.map +0 -1
- package/dist/commands-hook-diagnostics.d.ts +0 -37
- package/dist/commands-hook-diagnostics.js +0 -136
- package/dist/commands-hook-diagnostics.js.map +0 -1
- package/dist/commands-hook-install.d.ts +0 -26
- package/dist/commands-hook-install.js +0 -784
- package/dist/commands-hook-install.js.map +0 -1
- package/dist/commands-hook-run.d.ts +0 -29
- package/dist/commands-hook-run.js +0 -933
- package/dist/commands-hook-run.js.map +0 -1
- package/dist/commands-hook-shape.d.ts +0 -19
- package/dist/commands-hook-shape.js +0 -48
- package/dist/commands-hook-shape.js.map +0 -1
- package/dist/commands-init.d.ts +0 -42
- package/dist/commands-init.js +0 -901
- package/dist/commands-init.js.map +0 -1
- package/dist/commands-io.d.ts +0 -2
- package/dist/commands-io.js +0 -117
- package/dist/commands-io.js.map +0 -1
- package/dist/commands-logs.d.ts +0 -30
- package/dist/commands-logs.js +0 -201
- package/dist/commands-logs.js.map +0 -1
- package/dist/commands-native-acknowledge.d.ts +0 -8
- package/dist/commands-native-acknowledge.js +0 -114
- package/dist/commands-native-acknowledge.js.map +0 -1
- package/dist/commands-project.d.ts +0 -4
- package/dist/commands-project.js +0 -41
- package/dist/commands-project.js.map +0 -1
- package/dist/commands-receive.d.ts +0 -3
- package/dist/commands-receive.js +0 -59
- package/dist/commands-receive.js.map +0 -1
- package/dist/commands-send-support.d.ts +0 -59
- package/dist/commands-send-support.js +0 -258
- package/dist/commands-send-support.js.map +0 -1
- package/dist/commands-send.d.ts +0 -34
- package/dist/commands-send.js +0 -900
- package/dist/commands-send.js.map +0 -1
- package/dist/commands-setup-proof.d.ts +0 -43
- package/dist/commands-setup-proof.js +0 -134
- package/dist/commands-setup-proof.js.map +0 -1
- package/dist/commands-skill.d.ts +0 -21
- package/dist/commands-skill.js +0 -199
- package/dist/commands-skill.js.map +0 -1
- package/dist/commands-sounds.d.ts +0 -12
- package/dist/commands-sounds.js +0 -35
- package/dist/commands-sounds.js.map +0 -1
- package/dist/commands-update-check.d.ts +0 -6
- package/dist/commands-update-check.js +0 -102
- package/dist/commands-update-check.js.map +0 -1
- package/dist/commands-update-resume.d.ts +0 -7
- package/dist/commands-update-resume.js +0 -143
- package/dist/commands-update-resume.js.map +0 -1
- package/dist/commands-update-skill.d.ts +0 -5
- package/dist/commands-update-skill.js +0 -36
- package/dist/commands-update-skill.js.map +0 -1
- package/dist/commands-update.d.ts +0 -11
- package/dist/commands-update.js +0 -286
- package/dist/commands-update.js.map +0 -1
- package/dist/commands.d.ts +0 -26
- package/dist/commands.js +0 -27
- package/dist/commands.js.map +0 -1
- package/dist/config-schema.d.ts +0 -62
- package/dist/config-schema.js +0 -302
- package/dist/config-schema.js.map +0 -1
- package/dist/config.d.ts +0 -181
- package/dist/config.js +0 -357
- package/dist/config.js.map +0 -1
- package/dist/credentials.d.ts +0 -96
- package/dist/credentials.js +0 -342
- package/dist/credentials.js.map +0 -1
- package/dist/file-lock.d.ts +0 -34
- package/dist/file-lock.js +0 -367
- package/dist/file-lock.js.map +0 -1
- package/dist/generated-session-label.d.ts +0 -2
- package/dist/generated-session-label.js +0 -152
- package/dist/generated-session-label.js.map +0 -1
- package/dist/guidance-content.d.ts +0 -53
- package/dist/guidance-content.js +0 -248
- package/dist/guidance-content.js.map +0 -1
- package/dist/guidance-render.d.ts +0 -25
- package/dist/guidance-render.js +0 -47
- package/dist/guidance-render.js.map +0 -1
- package/dist/guidance.d.ts +0 -69
- package/dist/guidance.js +0 -173
- package/dist/guidance.js.map +0 -1
- package/dist/harness-session-title.d.ts +0 -22
- package/dist/harness-session-title.js +0 -74
- package/dist/harness-session-title.js.map +0 -1
- package/dist/harnesses.d.ts +0 -65
- package/dist/harnesses.js +0 -159
- package/dist/harnesses.js.map +0 -1
- package/dist/hermes-attendant.d.ts +0 -38
- package/dist/hermes-attendant.js +0 -337
- package/dist/hermes-attendant.js.map +0 -1
- package/dist/hermes-plugin.d.ts +0 -11
- package/dist/hermes-plugin.js +0 -299
- package/dist/hermes-plugin.js.map +0 -1
- package/dist/hook-acknowledgements.d.ts +0 -70
- package/dist/hook-acknowledgements.js +0 -490
- package/dist/hook-acknowledgements.js.map +0 -1
- package/dist/hook-adapter.d.ts +0 -48
- package/dist/hook-adapter.js +0 -419
- package/dist/hook-adapter.js.map +0 -1
- package/dist/hook-events.d.ts +0 -105
- package/dist/hook-events.js +0 -130
- package/dist/hook-events.js.map +0 -1
- package/dist/hook-gates.d.ts +0 -7
- package/dist/hook-gates.js +0 -20
- package/dist/hook-gates.js.map +0 -1
- package/dist/hook-input.d.ts +0 -10
- package/dist/hook-input.js +0 -64
- package/dist/hook-input.js.map +0 -1
- package/dist/hook-lifecycle.d.ts +0 -112
- package/dist/hook-lifecycle.js +0 -2031
- package/dist/hook-lifecycle.js.map +0 -1
- package/dist/hook-project-sessions.d.ts +0 -28
- package/dist/hook-project-sessions.js +0 -141
- package/dist/hook-project-sessions.js.map +0 -1
- package/dist/hook-question-lock.d.ts +0 -29
- package/dist/hook-question-lock.js +0 -217
- package/dist/hook-question-lock.js.map +0 -1
- package/dist/hook-question-retirement.d.ts +0 -74
- package/dist/hook-question-retirement.js +0 -314
- package/dist/hook-question-retirement.js.map +0 -1
- package/dist/hook-question-state.d.ts +0 -58
- package/dist/hook-question-state.js +0 -239
- package/dist/hook-question-state.js.map +0 -1
- package/dist/hook-session-state.d.ts +0 -127
- package/dist/hook-session-state.js +0 -488
- package/dist/hook-session-state.js.map +0 -1
- package/dist/hook-types.d.ts +0 -476
- package/dist/hook-types.js +0 -4
- package/dist/hook-types.js.map +0 -1
- package/dist/injection-render.d.ts +0 -36
- package/dist/injection-render.js +0 -61
- package/dist/injection-render.js.map +0 -1
- package/dist/install-hooks.d.ts +0 -470
- package/dist/install-hooks.js +0 -1622
- package/dist/install-hooks.js.map +0 -1
- package/dist/integration-health.d.ts +0 -26
- package/dist/integration-health.js +0 -133
- package/dist/integration-health.js.map +0 -1
- package/dist/interactive.d.ts +0 -22
- package/dist/interactive.js +0 -644
- package/dist/interactive.js.map +0 -1
- package/dist/invocation-context.d.ts +0 -47
- package/dist/invocation-context.js +0 -164
- package/dist/invocation-context.js.map +0 -1
- package/dist/local-path.d.ts +0 -7
- package/dist/local-path.js +0 -27
- package/dist/local-path.js.map +0 -1
- package/dist/logging.d.ts +0 -157
- package/dist/logging.js +0 -599
- package/dist/logging.js.map +0 -1
- package/dist/main-run.d.ts +0 -1
- package/dist/main-run.js +0 -42
- package/dist/main-run.js.map +0 -1
- package/dist/main.d.ts +0 -2
- package/dist/main.js +0 -12
- package/dist/main.js.map +0 -1
- package/dist/native-answer-operation.d.ts +0 -70
- package/dist/native-answer-operation.js +0 -247
- package/dist/native-answer-operation.js.map +0 -1
- package/dist/native-skills.d.ts +0 -64
- package/dist/native-skills.js +0 -167
- package/dist/native-skills.js.map +0 -1
- package/dist/node-floor.d.ts +0 -19
- package/dist/node-floor.js +0 -32
- package/dist/node-floor.js.map +0 -1
- package/dist/npm-invocation.d.ts +0 -34
- package/dist/npm-invocation.js +0 -53
- package/dist/npm-invocation.js.map +0 -1
- package/dist/openclaw-continuation-bridge.d.ts +0 -7
- package/dist/openclaw-continuation-bridge.js +0 -64
- package/dist/openclaw-continuation-bridge.js.map +0 -1
- package/dist/openclaw-gateway-readiness.d.ts +0 -1
- package/dist/openclaw-gateway-readiness.js +0 -24
- package/dist/openclaw-gateway-readiness.js.map +0 -1
- package/dist/openclaw-generation.d.ts +0 -21
- package/dist/openclaw-generation.js +0 -115
- package/dist/openclaw-generation.js.map +0 -1
- package/dist/openclaw-message-bridge.d.ts +0 -8
- package/dist/openclaw-message-bridge.js +0 -93
- package/dist/openclaw-message-bridge.js.map +0 -1
- package/dist/openclaw-pending.d.ts +0 -8
- package/dist/openclaw-pending.js +0 -47
- package/dist/openclaw-pending.js.map +0 -1
- package/dist/openclaw-plugin.d.ts +0 -75
- package/dist/openclaw-plugin.js +0 -1353
- package/dist/openclaw-plugin.js.map +0 -1
- package/dist/openclaw-session-access.d.ts +0 -12
- package/dist/openclaw-session-access.js +0 -79
- package/dist/openclaw-session-access.js.map +0 -1
- package/dist/opencode-plugin.d.ts +0 -88
- package/dist/opencode-plugin.js +0 -286
- package/dist/opencode-plugin.js.map +0 -1
- package/dist/orca-session-title.d.ts +0 -11
- package/dist/orca-session-title.js +0 -111
- package/dist/orca-session-title.js.map +0 -1
- package/dist/pack-feedback-slice.d.ts +0 -35
- package/dist/pack-feedback-slice.js +0 -126
- package/dist/pack-feedback-slice.js.map +0 -1
- package/dist/pairing-qr.d.ts +0 -5
- package/dist/pairing-qr.js +0 -24
- package/dist/pairing-qr.js.map +0 -1
- package/dist/pending-pairing.d.ts +0 -38
- package/dist/pending-pairing.js +0 -70
- package/dist/pending-pairing.js.map +0 -1
- package/dist/platform.d.ts +0 -67
- package/dist/platform.js +0 -140
- package/dist/platform.js.map +0 -1
- package/dist/process-identity.d.ts +0 -26
- package/dist/process-identity.js +0 -82
- package/dist/process-identity.js.map +0 -1
- package/dist/program.d.ts +0 -59
- package/dist/program.js +0 -691
- package/dist/program.js.map +0 -1
- package/dist/project-enablement.d.ts +0 -21
- package/dist/project-enablement.js +0 -71
- package/dist/project-enablement.js.map +0 -1
- package/dist/question-settlement-process.d.ts +0 -17
- package/dist/question-settlement-process.js +0 -35
- package/dist/question-settlement-process.js.map +0 -1
- package/dist/question-timing.d.ts +0 -46
- package/dist/question-timing.js +0 -48
- package/dist/question-timing.js.map +0 -1
- package/dist/readiness.d.ts +0 -153
- package/dist/readiness.js +0 -149
- package/dist/readiness.js.map +0 -1
- package/dist/release.d.ts +0 -31
- package/dist/release.js +0 -52
- package/dist/release.js.map +0 -1
- package/dist/send-attempts.d.ts +0 -26
- package/dist/send-attempts.js +0 -139
- package/dist/send-attempts.js.map +0 -1
- package/dist/send.d.ts +0 -115
- package/dist/send.js +0 -421
- package/dist/send.js.map +0 -1
- package/dist/session-activation.d.ts +0 -13
- package/dist/session-activation.js +0 -64
- package/dist/session-activation.js.map +0 -1
- package/dist/session-attendant-probe.d.ts +0 -85
- package/dist/session-attendant-probe.js +0 -173
- package/dist/session-attendant-probe.js.map +0 -1
- package/dist/session-attendant-state.d.ts +0 -70
- package/dist/session-attendant-state.js +0 -256
- package/dist/session-attendant-state.js.map +0 -1
- package/dist/session-attendant.d.ts +0 -143
- package/dist/session-attendant.js +0 -520
- package/dist/session-attendant.js.map +0 -1
- package/dist/session-delivery.d.ts +0 -249
- package/dist/session-delivery.js +0 -576
- package/dist/session-delivery.js.map +0 -1
- package/dist/session-handoff.d.ts +0 -98
- package/dist/session-handoff.js +0 -118
- package/dist/session-handoff.js.map +0 -1
- package/dist/session-input-wakes.d.ts +0 -78
- package/dist/session-input-wakes.js +0 -239
- package/dist/session-input-wakes.js.map +0 -1
- package/dist/session-inputs.d.ts +0 -57
- package/dist/session-inputs.js +0 -434
- package/dist/session-inputs.js.map +0 -1
- package/dist/session-labels.d.ts +0 -56
- package/dist/session-labels.js +0 -396
- package/dist/session-labels.js.map +0 -1
- package/dist/session-message-handoff.d.ts +0 -39
- package/dist/session-message-handoff.js +0 -107
- package/dist/session-message-handoff.js.map +0 -1
- package/dist/setup-destinations.d.ts +0 -23
- package/dist/setup-destinations.js +0 -44
- package/dist/setup-destinations.js.map +0 -1
- package/dist/skill-integrity.d.ts +0 -54
- package/dist/skill-integrity.js +0 -164
- package/dist/skill-integrity.js.map +0 -1
- package/dist/skill-source/manifest.json +0 -40
- package/dist/skill-source/notifai/SKILL.md +0 -350
- package/dist/skill-source/notifai/references/diagnostics.md +0 -36
- package/dist/skill-source/notifai/references/harness-setup.md +0 -384
- package/dist/skill-source/notifai/references/native-questions.md +0 -51
- package/dist/skill-source/notifai/references/notes-and-edits.md +0 -54
- package/dist/skill-source/notifai/references/send-details.md +0 -14
- package/dist/skill-source/notifai/references/updates.md +0 -116
- package/dist/skill-source/notifai/references/writing-examples.md +0 -56
- package/dist/sound-ref.d.ts +0 -23
- package/dist/sound-ref.js +0 -28
- package/dist/sound-ref.js.map +0 -1
- package/dist/ui/banner.d.ts +0 -22
- package/dist/ui/banner.js +0 -87
- package/dist/ui/banner.js.map +0 -1
- package/dist/ui/config-view.d.ts +0 -30
- package/dist/ui/config-view.js +0 -108
- package/dist/ui/config-view.js.map +0 -1
- package/dist/ui/help.d.ts +0 -44
- package/dist/ui/help.js +0 -107
- package/dist/ui/help.js.map +0 -1
- package/dist/ui/theme.d.ts +0 -90
- package/dist/ui/theme.js +0 -244
- package/dist/ui/theme.js.map +0 -1
- package/dist/update-handoff.d.ts +0 -29
- package/dist/update-handoff.js +0 -69
- package/dist/update-handoff.js.map +0 -1
- package/dist/url-policy.d.ts +0 -85
- package/dist/url-policy.js +0 -369
- package/dist/url-policy.js.map +0 -1
- package/dist/version.d.ts +0 -40
- package/dist/version.js +0 -132
- package/dist/version.js.map +0 -1
- package/dist/wake-support.d.ts +0 -40
- package/dist/wake-support.js +0 -95
- package/dist/wake-support.js.map +0 -1
package/dist/logging.js
DELETED
|
@@ -1,599 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Local, agent-facing logs.
|
|
3
|
-
*
|
|
4
|
-
* Most of what this CLI does happens where nobody is looking. A harness hook
|
|
5
|
-
* runs headless in front of every prompt; its stderr is swallowed by the
|
|
6
|
-
* harness, and its most consequential act is usually a decision to do nothing —
|
|
7
|
-
* the question stayed in the terminal, and no line anywhere says why. An agent
|
|
8
|
-
* asked afterwards "did my question reach the phone?" has had no way to find
|
|
9
|
-
* out. This is the record that answers that.
|
|
10
|
-
*
|
|
11
|
-
* Written for an agent to read, which is a different job from writing for a
|
|
12
|
-
* person:
|
|
13
|
-
*
|
|
14
|
-
* - One JSON object per line, so `grep`, `jq`, and a plain read all work
|
|
15
|
-
* without a parser and without reading the file whole.
|
|
16
|
-
* - A closed event vocabulary, so a filter written once keeps matching.
|
|
17
|
-
* - A run id stamped on every line of one invocation, so "what happened
|
|
18
|
-
* during that command" is a single query rather than a reconstruction.
|
|
19
|
-
* - Retrieval bounded by default (`notifai logs`), because an unbounded dump
|
|
20
|
-
* into a context window is worse than no log at all.
|
|
21
|
-
*
|
|
22
|
-
* Local only. Nothing here is uploaded, and nothing in the record is shaped for
|
|
23
|
-
* a server. If submitting a log for debugging is ever added it will be an
|
|
24
|
-
* explicit, separate act by the user.
|
|
25
|
-
*
|
|
26
|
-
* ## Concurrency
|
|
27
|
-
*
|
|
28
|
-
* Several processes share one file: the hook fires per turn, `send` and `ask`
|
|
29
|
-
* fire whenever an agent calls them, and worktrees run in parallel. Every write
|
|
30
|
-
* takes one short cross-process lock around the shared size check, any rotation,
|
|
31
|
-
* and the append. Without that transaction, several writers can all observe the
|
|
32
|
-
* same remaining budget and independently push the file past its configured cap.
|
|
33
|
-
*
|
|
34
|
-
* The record itself still lands in one `O_APPEND` write. That keeps a line whole
|
|
35
|
-
* if an uncooperating process touches the file, while the lock makes cooperating
|
|
36
|
-
* Notifai processes agree which inode owns the record and when it must rotate.
|
|
37
|
-
*
|
|
38
|
-
* ## Failure
|
|
39
|
-
*
|
|
40
|
-
* Logging may never break the CLI. A read-only home, a full disk, or a
|
|
41
|
-
* directory someone replaced with a file all end the same way: logging switches
|
|
42
|
-
* itself off for the rest of the process and the command carries on. A
|
|
43
|
-
* diagnostic that can take down the thing it observes is not a diagnostic.
|
|
44
|
-
*/
|
|
45
|
-
import { randomBytes } from 'node:crypto';
|
|
46
|
-
import { appendFileSync, mkdirSync, readFileSync, readdirSync, renameSync, statSync, unlinkSync } from 'node:fs';
|
|
47
|
-
import path from 'node:path';
|
|
48
|
-
import { CONFIG_KEYS, LOG_LEVELS, loadConfig, stateDir, } from './config.js';
|
|
49
|
-
import { withFileLock } from './file-lock.js';
|
|
50
|
-
/** Bumped when the record shape changes in a way a reader must notice. */
|
|
51
|
-
export const LOG_SCHEMA_VERSION = 1;
|
|
52
|
-
export { LOG_LEVELS };
|
|
53
|
-
/**
|
|
54
|
-
* The levels a record can actually carry.
|
|
55
|
-
*
|
|
56
|
-
* `off` is a setting that stops writing, never a severity anything is written
|
|
57
|
-
* at — so offering it as a retrieval filter accepted a query that could only
|
|
58
|
-
* ever match nothing, and then blamed the result on too narrow a search.
|
|
59
|
-
*/
|
|
60
|
-
export const RECORD_LEVELS = LOG_LEVELS.filter((level) => level !== 'off');
|
|
61
|
-
const LEVEL_RANK = { off: 0, error: 1, info: 2, debug: 3 };
|
|
62
|
-
/**
|
|
63
|
-
* The closed vocabulary. A filter is only worth writing if it keeps matching,
|
|
64
|
-
* so these names are a contract: add to the list rather than rephrasing an
|
|
65
|
-
* existing one, and keep each event answering exactly one question.
|
|
66
|
-
*/
|
|
67
|
-
export const LOG_EVENTS = [
|
|
68
|
-
/** A CLI invocation began: which command, which flag names, which version. */
|
|
69
|
-
'cli.start',
|
|
70
|
-
/** It ended: exit code and how long it took. */
|
|
71
|
-
'cli.end',
|
|
72
|
-
/** A command failed. Carries the server's own code and rejected paths. */
|
|
73
|
-
'cli.error',
|
|
74
|
-
/** Which config layer won, for the keys that changed the outcome. */
|
|
75
|
-
'config.resolved',
|
|
76
|
-
/** One HTTP call to the service: method, path, status, duration. */
|
|
77
|
-
'http.call',
|
|
78
|
-
/** A send crossed its ambiguous network boundary with this retry identity. */
|
|
79
|
-
'send.attempt',
|
|
80
|
-
/** A notification was accepted by the service. */
|
|
81
|
-
'send.submitted',
|
|
82
|
-
/** What became of it per device. */
|
|
83
|
-
'send.outcome',
|
|
84
|
-
/** `notifai ask` registered a question for Question Routing. */
|
|
85
|
-
'ask.registered',
|
|
86
|
-
/** An answer came back from a device. */
|
|
87
|
-
'reply.received',
|
|
88
|
-
/** An agent attempted to acknowledge the user's reply. */
|
|
89
|
-
'acknowledgement.attempted',
|
|
90
|
-
/** The service recorded or replayed an Agent Acknowledgement. */
|
|
91
|
-
'acknowledgement.outcome',
|
|
92
|
-
/** A harness hook started. */
|
|
93
|
-
'hook.start',
|
|
94
|
-
/** A hook decided whether a question may leave the terminal, and why. */
|
|
95
|
-
'hook.gate',
|
|
96
|
-
/** A question reached the user's devices. */
|
|
97
|
-
'hook.pushed',
|
|
98
|
-
/** A retirement close was attempted, and whether the server proved it. */
|
|
99
|
-
'hook.retirement',
|
|
100
|
-
/** The hook handed an answer back to the agent. */
|
|
101
|
-
'hook.answer',
|
|
102
|
-
/** The hook finished, with or without a decision. */
|
|
103
|
-
'hook.end',
|
|
104
|
-
/** A Session Attendant took ownership of its Agent Session. */
|
|
105
|
-
'attendant.start',
|
|
106
|
-
/** A Session Attendant changed phase: dormant, attending, uncertain, and why. */
|
|
107
|
-
'attendant.state',
|
|
108
|
-
/** A Session Attendant acquired, lost, or re-identified its presence lease. */
|
|
109
|
-
'attendant.lease',
|
|
110
|
-
/** A Session Attendant stopped: why, and what it last reported. */
|
|
111
|
-
'attendant.exit',
|
|
112
|
-
/** A hand-off into an Agent Session was claimed, or refused and why. */
|
|
113
|
-
'delivery.claimed',
|
|
114
|
-
/** How a claimed hand-off ended, and whether its outcome reached the service. */
|
|
115
|
-
'delivery.handoff',
|
|
116
|
-
/** The active file was rotated. Explains a gap to anyone reading backwards. */
|
|
117
|
-
'log.rotated',
|
|
118
|
-
];
|
|
119
|
-
// ---------------------------------------------------------------------------
|
|
120
|
-
// Limits
|
|
121
|
-
// ---------------------------------------------------------------------------
|
|
122
|
-
/**
|
|
123
|
-
* A record must fit in one write to stay atomic against other processes, and
|
|
124
|
-
* must fit in a reader's context window to be worth writing at all. Both point
|
|
125
|
-
* at the same answer: keep them small and truncate loudly.
|
|
126
|
-
*/
|
|
127
|
-
const MAX_RECORD_BYTES = 8_000;
|
|
128
|
-
const MAX_STRING_CHARS = 400;
|
|
129
|
-
const MAX_ARRAY_ITEMS = 20;
|
|
130
|
-
const MAX_DEPTH = 4;
|
|
131
|
-
/**
|
|
132
|
-
* Redaction is unconditional, not a level. A log is the artefact most likely to
|
|
133
|
-
* be pasted into a conversation, an issue, or a future upload, and a bearer
|
|
134
|
-
* token that only leaks at `debug` still leaks.
|
|
135
|
-
*/
|
|
136
|
-
const SECRET_KEY_PATTERN = /secret|token|password|authorization|credential|verifier|api[_-]?key/i;
|
|
137
|
-
const MACHINE_TOKEN_PATTERN = /nfm_[A-Za-z0-9._-]{6,}/g;
|
|
138
|
-
/** Notification and question content: persist length, never the words. */
|
|
139
|
-
const CONTENT_STRING_KEYS = new Set(['title', 'subtitle', 'summary', 'body', 'text', 'question']);
|
|
140
|
-
/** Choice labels, reply answers, and raw argv: persist counts, never values. */
|
|
141
|
-
const CONTENT_LIST_KEYS = new Set(['answers', 'choices', 'argv']);
|
|
142
|
-
export const REDACTED = '[redacted]';
|
|
143
|
-
// ---------------------------------------------------------------------------
|
|
144
|
-
// Paths
|
|
145
|
-
// ---------------------------------------------------------------------------
|
|
146
|
-
export function logsDir(env = process.env) {
|
|
147
|
-
return path.join(stateDir(env), 'logs');
|
|
148
|
-
}
|
|
149
|
-
export function activeLogPath(env = process.env) {
|
|
150
|
-
return path.join(logsDir(env), 'notifai.jsonl');
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Archives are timestamp-named so lexical order is chronological order — the
|
|
154
|
-
* reader needs no `stat` to walk them, and two processes rotating at once
|
|
155
|
-
* cannot collide on a name.
|
|
156
|
-
*/
|
|
157
|
-
const ARCHIVE_PATTERN = /^notifai-\d{8}T\d{9}Z-[0-9a-f]{4}\.jsonl$/;
|
|
158
|
-
function archiveName(now) {
|
|
159
|
-
const stamp = new Date(now).toISOString().replace(/[-:.]/g, '');
|
|
160
|
-
return `notifai-${stamp}-${randomBytes(2).toString('hex')}.jsonl`;
|
|
161
|
-
}
|
|
162
|
-
/** Archives, oldest first. */
|
|
163
|
-
export function archiveLogPaths(env = process.env) {
|
|
164
|
-
const dir = logsDir(env);
|
|
165
|
-
let entries;
|
|
166
|
-
try {
|
|
167
|
-
entries = readdirSync(dir);
|
|
168
|
-
}
|
|
169
|
-
catch {
|
|
170
|
-
return [];
|
|
171
|
-
}
|
|
172
|
-
return entries
|
|
173
|
-
.filter((name) => ARCHIVE_PATTERN.test(name))
|
|
174
|
-
.sort()
|
|
175
|
-
.map((name) => path.join(dir, name));
|
|
176
|
-
}
|
|
177
|
-
// ---------------------------------------------------------------------------
|
|
178
|
-
// Redaction and shaping
|
|
179
|
-
// ---------------------------------------------------------------------------
|
|
180
|
-
function redactString(value) {
|
|
181
|
-
const scrubbed = value.replace(MACHINE_TOKEN_PATTERN, 'nfm_[redacted]');
|
|
182
|
-
if (scrubbed.length <= MAX_STRING_CHARS)
|
|
183
|
-
return scrubbed;
|
|
184
|
-
return `${scrubbed.slice(0, MAX_STRING_CHARS)}…(+${scrubbed.length - MAX_STRING_CHARS} chars)`;
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* Flag names only — argv values are notification content and user text.
|
|
188
|
-
*
|
|
189
|
-
* `--title=SECRET` must become `--title`. Filtering on a `--` prefix is not
|
|
190
|
-
* enough: inline assignment would otherwise persist the value.
|
|
191
|
-
*/
|
|
192
|
-
export function argvFlagNames(argv) {
|
|
193
|
-
const names = [];
|
|
194
|
-
for (const token of argv) {
|
|
195
|
-
if (!token.startsWith('--') || token === '--')
|
|
196
|
-
continue;
|
|
197
|
-
const eq = token.indexOf('=');
|
|
198
|
-
names.push(eq === -1 ? token : token.slice(0, eq));
|
|
199
|
-
}
|
|
200
|
-
return names;
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* Shape a value for the record: drop what must never be written, truncate what
|
|
204
|
-
* would flood a reader, and refuse to recurse for ever into a cyclic object.
|
|
205
|
-
*/
|
|
206
|
-
export function shape(value, depth = 0) {
|
|
207
|
-
if (value === null || value === undefined)
|
|
208
|
-
return value;
|
|
209
|
-
if (typeof value === 'string')
|
|
210
|
-
return redactString(value);
|
|
211
|
-
if (typeof value === 'number' || typeof value === 'boolean')
|
|
212
|
-
return value;
|
|
213
|
-
if (typeof value === 'bigint')
|
|
214
|
-
return String(value);
|
|
215
|
-
if (value instanceof Error)
|
|
216
|
-
return redactString(`${value.name}: ${value.message}`);
|
|
217
|
-
if (depth >= MAX_DEPTH)
|
|
218
|
-
return '[deep]';
|
|
219
|
-
if (Array.isArray(value)) {
|
|
220
|
-
const items = value.slice(0, MAX_ARRAY_ITEMS).map((item) => shape(item, depth + 1));
|
|
221
|
-
return value.length > MAX_ARRAY_ITEMS ? [...items, `…(+${value.length - MAX_ARRAY_ITEMS} more)`] : items;
|
|
222
|
-
}
|
|
223
|
-
if (typeof value === 'object') {
|
|
224
|
-
const out = {};
|
|
225
|
-
for (const [key, nested] of Object.entries(value)) {
|
|
226
|
-
if (nested === undefined)
|
|
227
|
-
continue;
|
|
228
|
-
if (SECRET_KEY_PATTERN.test(key)) {
|
|
229
|
-
out[key] = REDACTED;
|
|
230
|
-
continue;
|
|
231
|
-
}
|
|
232
|
-
if (CONTENT_STRING_KEYS.has(key) && typeof nested === 'string') {
|
|
233
|
-
out[`${key}_chars`] = nested.length;
|
|
234
|
-
continue;
|
|
235
|
-
}
|
|
236
|
-
if (key === 'argv' && Array.isArray(nested)) {
|
|
237
|
-
out.flags = argvFlagNames(nested.filter((token) => typeof token === 'string'));
|
|
238
|
-
out.argv_count = nested.length;
|
|
239
|
-
continue;
|
|
240
|
-
}
|
|
241
|
-
if (CONTENT_LIST_KEYS.has(key) && Array.isArray(nested)) {
|
|
242
|
-
out[`${key}_count`] = nested.length;
|
|
243
|
-
continue;
|
|
244
|
-
}
|
|
245
|
-
out[key] = shape(nested, depth + 1);
|
|
246
|
-
}
|
|
247
|
-
return out;
|
|
248
|
-
}
|
|
249
|
-
return String(value);
|
|
250
|
-
}
|
|
251
|
-
/**
|
|
252
|
-
* A record as one line, guaranteed to fit a single write. An oversized payload
|
|
253
|
-
* loses its data rather than its line: knowing an event happened and that its
|
|
254
|
-
* detail was too large beats losing the event.
|
|
255
|
-
*/
|
|
256
|
-
export function serialize(record) {
|
|
257
|
-
const line = `${JSON.stringify(record)}\n`;
|
|
258
|
-
if (Buffer.byteLength(line) <= MAX_RECORD_BYTES)
|
|
259
|
-
return line;
|
|
260
|
-
const trimmed = {
|
|
261
|
-
...record,
|
|
262
|
-
data: { dropped: 'record exceeded the per-line cap', bytes: Buffer.byteLength(line) },
|
|
263
|
-
};
|
|
264
|
-
return `${JSON.stringify(trimmed)}\n`;
|
|
265
|
-
}
|
|
266
|
-
export const DEFAULT_LOG_SETTINGS = {
|
|
267
|
-
level: 'info',
|
|
268
|
-
maxBytes: 2_000_000,
|
|
269
|
-
maxFiles: 3,
|
|
270
|
-
};
|
|
271
|
-
/** A logger that records nothing, for tests and for `log_level = off`. */
|
|
272
|
-
export function nullLogger(runId = 'r_none') {
|
|
273
|
-
return {
|
|
274
|
-
runId,
|
|
275
|
-
enabled: false,
|
|
276
|
-
error: () => undefined,
|
|
277
|
-
info: () => undefined,
|
|
278
|
-
debug: () => undefined,
|
|
279
|
-
bind: () => undefined,
|
|
280
|
-
adopt: () => undefined,
|
|
281
|
-
};
|
|
282
|
-
}
|
|
283
|
-
export function newRunId() {
|
|
284
|
-
return `r_${randomBytes(6).toString('hex')}`;
|
|
285
|
-
}
|
|
286
|
-
export function createLogger(options = {}) {
|
|
287
|
-
const env = options.env ?? process.env;
|
|
288
|
-
const now = options.now ?? Date.now;
|
|
289
|
-
const runId = options.runId ?? newRunId();
|
|
290
|
-
const settings = { ...DEFAULT_LOG_SETTINGS, ...options.settings };
|
|
291
|
-
const bindings = { cmd: options.cmd ?? 'notifai' };
|
|
292
|
-
const dir = logsDir(env);
|
|
293
|
-
const active = activeLogPath(env);
|
|
294
|
-
const lock = `${active}.lock`;
|
|
295
|
-
let broken = false;
|
|
296
|
-
function currentSize() {
|
|
297
|
-
try {
|
|
298
|
-
return statSync(active).size;
|
|
299
|
-
}
|
|
300
|
-
catch {
|
|
301
|
-
return 0;
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
/**
|
|
305
|
-
* Keep the inode handoff and retention prune inside the caller's byte-budget
|
|
306
|
-
* transaction, so every writer agrees which history the fresh file replaces.
|
|
307
|
-
*/
|
|
308
|
-
function rotate() {
|
|
309
|
-
const target = path.join(dir, archiveName(now()));
|
|
310
|
-
try {
|
|
311
|
-
renameSync(active, target);
|
|
312
|
-
}
|
|
313
|
-
catch (err) {
|
|
314
|
-
const code = err.code;
|
|
315
|
-
if (code !== 'ENOENT')
|
|
316
|
-
throw err;
|
|
317
|
-
return null;
|
|
318
|
-
}
|
|
319
|
-
const keep = Math.max(0, settings.maxFiles - 1);
|
|
320
|
-
const archives = archiveLogPaths(env);
|
|
321
|
-
for (const stale of archives.slice(0, Math.max(0, archives.length - keep))) {
|
|
322
|
-
try {
|
|
323
|
-
unlinkSync(stale);
|
|
324
|
-
}
|
|
325
|
-
catch {
|
|
326
|
-
// An external cleaner removed it; the retained-file bound still holds.
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
return path.basename(target);
|
|
330
|
-
}
|
|
331
|
-
function write(level, event, data) {
|
|
332
|
-
if (broken || LEVEL_RANK[settings.level] < LEVEL_RANK[level])
|
|
333
|
-
return;
|
|
334
|
-
try {
|
|
335
|
-
const record = {
|
|
336
|
-
v: LOG_SCHEMA_VERSION,
|
|
337
|
-
ts: new Date(now()).toISOString(),
|
|
338
|
-
level,
|
|
339
|
-
event,
|
|
340
|
-
run: runId,
|
|
341
|
-
cmd: bindings.cmd ?? 'notifai',
|
|
342
|
-
pid: process.pid,
|
|
343
|
-
...(bindings.project ? { project: bindings.project } : {}),
|
|
344
|
-
...(bindings.session ? { session: bindings.session } : {}),
|
|
345
|
-
...(data === undefined ? {} : { data: shape(data) }),
|
|
346
|
-
};
|
|
347
|
-
const line = serialize(record);
|
|
348
|
-
const bytes = Buffer.byteLength(line);
|
|
349
|
-
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
350
|
-
withFileLock(lock, () => {
|
|
351
|
-
let payload = line;
|
|
352
|
-
if (currentSize() + bytes > settings.maxBytes) {
|
|
353
|
-
const rotated = rotate();
|
|
354
|
-
if (rotated !== null) {
|
|
355
|
-
const marker = serialize({
|
|
356
|
-
...record,
|
|
357
|
-
event: 'log.rotated',
|
|
358
|
-
data: { archived_to: rotated },
|
|
359
|
-
});
|
|
360
|
-
// A marker is diagnostic, not permission to violate the cap. The
|
|
361
|
-
// product configuration cannot make this branch drop it — maxBytes
|
|
362
|
-
// is at least 64 KB and each line is at most 8 KB — but tiny injected
|
|
363
|
-
// test settings may not have room for both atomic records.
|
|
364
|
-
if (Buffer.byteLength(marker) + bytes <= settings.maxBytes)
|
|
365
|
-
payload = marker + line;
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
// One record cannot be split without corrupting JSONL. If an internal
|
|
369
|
-
// caller injects maxBytes below that record's size, this one-record file
|
|
370
|
-
// is the only unavoidable overshoot. Valid CLI configuration makes the
|
|
371
|
-
// invariant unreachable (64 KB minimum versus an 8 KB record cap).
|
|
372
|
-
appendFileSync(active, payload, { mode: 0o600, flag: 'a' });
|
|
373
|
-
});
|
|
374
|
-
}
|
|
375
|
-
catch {
|
|
376
|
-
// One failure is enough: a sink that cannot write will not start working
|
|
377
|
-
// mid-command, and retrying it on every event would cost the hook path
|
|
378
|
-
// real time for nothing.
|
|
379
|
-
broken = true;
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
return {
|
|
383
|
-
runId,
|
|
384
|
-
get enabled() {
|
|
385
|
-
return !broken && settings.level !== 'off';
|
|
386
|
-
},
|
|
387
|
-
error: (event, data) => write('error', event, data),
|
|
388
|
-
info: (event, data) => write('info', event, data),
|
|
389
|
-
debug: (event, data) => write('debug', event, data),
|
|
390
|
-
bind: (fields) => Object.assign(bindings, fields),
|
|
391
|
-
adopt: (next) => Object.assign(settings, next),
|
|
392
|
-
};
|
|
393
|
-
}
|
|
394
|
-
/** Log settings as the layered config resolved them. */
|
|
395
|
-
export function logSettingsFrom(config) {
|
|
396
|
-
return {
|
|
397
|
-
level: config.log_level.value,
|
|
398
|
-
maxBytes: config.log_max_bytes.value,
|
|
399
|
-
maxFiles: config.log_max_files.value,
|
|
400
|
-
};
|
|
401
|
-
}
|
|
402
|
-
const lastResolvedConfig = new WeakMap();
|
|
403
|
-
/** Record each distinct resolution once per invocation when debug logging is on. */
|
|
404
|
-
export function logConfigResolved(logger, config) {
|
|
405
|
-
const values = Object.fromEntries(CONFIG_KEYS.map((key) => [
|
|
406
|
-
key,
|
|
407
|
-
{ value: config[key].value, source: config[key].source },
|
|
408
|
-
]));
|
|
409
|
-
const fingerprint = JSON.stringify(values);
|
|
410
|
-
if (lastResolvedConfig.get(logger) === fingerprint)
|
|
411
|
-
return;
|
|
412
|
-
lastResolvedConfig.set(logger, fingerprint);
|
|
413
|
-
logger.debug('config.resolved', { values });
|
|
414
|
-
}
|
|
415
|
-
/**
|
|
416
|
-
* The logger for a CLI invocation, configured from disk.
|
|
417
|
-
*
|
|
418
|
-
* It loads config itself rather than being handed one, because the earliest
|
|
419
|
-
* thing worth logging is the command starting — which is before any command has
|
|
420
|
-
* resolved anything, and sometimes before a config file that fails to parse has
|
|
421
|
-
* been discovered. A config that throws leaves the defaults in place; it is
|
|
422
|
-
* reported by the command that needed it, not silently swallowed here.
|
|
423
|
-
*/
|
|
424
|
-
export function bootstrapLogger(options = {}) {
|
|
425
|
-
const env = options.env ?? process.env;
|
|
426
|
-
let settings = {};
|
|
427
|
-
let project = null;
|
|
428
|
-
try {
|
|
429
|
-
const config = loadConfig({ cwd: options.cwd ?? process.cwd(), env });
|
|
430
|
-
settings = logSettingsFrom(config);
|
|
431
|
-
project = config.project.value;
|
|
432
|
-
}
|
|
433
|
-
catch {
|
|
434
|
-
// Defaults, and the command reports the parse failure in its own words.
|
|
435
|
-
}
|
|
436
|
-
// Keep a real, mutable logger even when this bootstrap directory says off.
|
|
437
|
-
// Harness payloads can resolve a more-specific project or session later and
|
|
438
|
-
// adopt settings that legitimately re-enable the same invocation.
|
|
439
|
-
const logger = createLogger({ env, settings });
|
|
440
|
-
if (project !== null)
|
|
441
|
-
logger.bind({ project });
|
|
442
|
-
return logger;
|
|
443
|
-
}
|
|
444
|
-
function containsExactString(value, expected) {
|
|
445
|
-
if (typeof value === 'string')
|
|
446
|
-
return value === expected;
|
|
447
|
-
if (Array.isArray(value))
|
|
448
|
-
return value.some((item) => containsExactString(item, expected));
|
|
449
|
-
return false;
|
|
450
|
-
}
|
|
451
|
-
const REQUEST_ID_KEYS = new Set(['request_id', 'request_ids', 'retires_request_id']);
|
|
452
|
-
/** Match identity fields, never prose that happens to mention the same token. */
|
|
453
|
-
function containsRequestIdentity(value, expected) {
|
|
454
|
-
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
455
|
-
return false;
|
|
456
|
-
for (const [key, nested] of Object.entries(value)) {
|
|
457
|
-
if (REQUEST_ID_KEYS.has(key) && containsExactString(nested, expected))
|
|
458
|
-
return true;
|
|
459
|
-
if (containsRequestIdentity(nested, expected))
|
|
460
|
-
return true;
|
|
461
|
-
}
|
|
462
|
-
return false;
|
|
463
|
-
}
|
|
464
|
-
function matches(record, raw, query) {
|
|
465
|
-
if (query.level !== undefined && LEVEL_RANK[record.level] > LEVEL_RANK[query.level])
|
|
466
|
-
return false;
|
|
467
|
-
if (query.event !== undefined && query.event.length > 0 && !query.event.includes(record.event))
|
|
468
|
-
return false;
|
|
469
|
-
if (query.run !== undefined && record.run !== query.run)
|
|
470
|
-
return false;
|
|
471
|
-
if (query.session !== undefined && record.session !== query.session)
|
|
472
|
-
return false;
|
|
473
|
-
if (query.project !== undefined && record.project !== query.project)
|
|
474
|
-
return false;
|
|
475
|
-
if (query.request !== undefined && !containsRequestIdentity(record.data, query.request))
|
|
476
|
-
return false;
|
|
477
|
-
if (query.contains !== undefined && !raw.toLowerCase().includes(query.contains.toLowerCase()))
|
|
478
|
-
return false;
|
|
479
|
-
return true;
|
|
480
|
-
}
|
|
481
|
-
function isRecord(parsed) {
|
|
482
|
-
return (typeof parsed === 'object' &&
|
|
483
|
-
parsed !== null &&
|
|
484
|
-
parsed.v === LOG_SCHEMA_VERSION &&
|
|
485
|
-
typeof parsed.event === 'string' &&
|
|
486
|
-
typeof parsed.ts === 'string');
|
|
487
|
-
}
|
|
488
|
-
/**
|
|
489
|
-
* Newest matching records, walking the active file and then the archives
|
|
490
|
-
* backwards and stopping as soon as the limit is met.
|
|
491
|
-
*
|
|
492
|
-
* A partially written or corrupt line is skipped rather than fatal. The point
|
|
493
|
-
* of a line-oriented log is that damage stays on its own line, and a reader
|
|
494
|
-
* that throws on one bad byte throws away everything else that was fine.
|
|
495
|
-
*/
|
|
496
|
-
export function readLogRecords(env = process.env, query = {}) {
|
|
497
|
-
const limit = query.limit ?? 50;
|
|
498
|
-
const files = [activeLogPath(env), ...archiveLogPaths(env).reverse()];
|
|
499
|
-
const collected = [];
|
|
500
|
-
const consulted = [];
|
|
501
|
-
let more = false;
|
|
502
|
-
for (const file of files) {
|
|
503
|
-
if (collected.length >= limit) {
|
|
504
|
-
more = true;
|
|
505
|
-
break;
|
|
506
|
-
}
|
|
507
|
-
let contents;
|
|
508
|
-
try {
|
|
509
|
-
contents = readFileSync(file, 'utf8');
|
|
510
|
-
}
|
|
511
|
-
catch {
|
|
512
|
-
continue;
|
|
513
|
-
}
|
|
514
|
-
consulted.push(file);
|
|
515
|
-
const lines = contents.split('\n');
|
|
516
|
-
let reachedFloor = false;
|
|
517
|
-
for (let index = lines.length - 1; index >= 0; index -= 1) {
|
|
518
|
-
const raw = lines[index];
|
|
519
|
-
if (raw === undefined || raw.trim() === '')
|
|
520
|
-
continue;
|
|
521
|
-
let parsed;
|
|
522
|
-
try {
|
|
523
|
-
parsed = JSON.parse(raw);
|
|
524
|
-
}
|
|
525
|
-
catch {
|
|
526
|
-
continue;
|
|
527
|
-
}
|
|
528
|
-
if (!isRecord(parsed))
|
|
529
|
-
continue;
|
|
530
|
-
if (query.since !== undefined && Date.parse(parsed.ts) < query.since) {
|
|
531
|
-
// Files are chronological, so everything behind this is older too.
|
|
532
|
-
reachedFloor = true;
|
|
533
|
-
break;
|
|
534
|
-
}
|
|
535
|
-
if (!matches(parsed, raw, query))
|
|
536
|
-
continue;
|
|
537
|
-
if (collected.length >= limit) {
|
|
538
|
-
more = true;
|
|
539
|
-
break;
|
|
540
|
-
}
|
|
541
|
-
collected.push(parsed);
|
|
542
|
-
}
|
|
543
|
-
if (reachedFloor)
|
|
544
|
-
break;
|
|
545
|
-
}
|
|
546
|
-
return { records: collected.reverse(), files: consulted, more };
|
|
547
|
-
}
|
|
548
|
-
/** Bytes currently held by the logs, for `doctor` and for `logs --path`. */
|
|
549
|
-
export function logsDiskUsage(env = process.env) {
|
|
550
|
-
let bytes = 0;
|
|
551
|
-
let files = 0;
|
|
552
|
-
for (const file of [activeLogPath(env), ...archiveLogPaths(env)]) {
|
|
553
|
-
try {
|
|
554
|
-
bytes += statSync(file).size;
|
|
555
|
-
files += 1;
|
|
556
|
-
}
|
|
557
|
-
catch {
|
|
558
|
-
// Not there; it simply does not count.
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
|
-
return { files, bytes };
|
|
562
|
-
}
|
|
563
|
-
// ---------------------------------------------------------------------------
|
|
564
|
-
// Rendering
|
|
565
|
-
// ---------------------------------------------------------------------------
|
|
566
|
-
const LEVEL_MARK = { error: '!', info: ' ', debug: '·' };
|
|
567
|
-
/** `key=value` pairs for the parts of `data` worth a glance, bounded in width. */
|
|
568
|
-
function summarize(data, width) {
|
|
569
|
-
if (data === undefined)
|
|
570
|
-
return '';
|
|
571
|
-
const parts = [];
|
|
572
|
-
let used = 0;
|
|
573
|
-
for (const [key, value] of Object.entries(data)) {
|
|
574
|
-
if (value === null || value === undefined)
|
|
575
|
-
continue;
|
|
576
|
-
const rendered = typeof value === 'object' ? JSON.stringify(value) : String(value);
|
|
577
|
-
const flattened = rendered.replace(/\s+/g, ' ');
|
|
578
|
-
const piece = `${key}=${flattened.length > 60 ? `${flattened.slice(0, 60)}…` : flattened}`;
|
|
579
|
-
if (used + piece.length > width) {
|
|
580
|
-
parts.push('…');
|
|
581
|
-
break;
|
|
582
|
-
}
|
|
583
|
-
parts.push(piece);
|
|
584
|
-
used += piece.length + 1;
|
|
585
|
-
}
|
|
586
|
-
return parts.join(' ');
|
|
587
|
-
}
|
|
588
|
-
/**
|
|
589
|
-
* One record, one line. The fixed left columns matter more than they look:
|
|
590
|
-
* aligned columns are what let a reader — human or model — scan for the one
|
|
591
|
-
* line that differs instead of reading every line.
|
|
592
|
-
*/
|
|
593
|
-
export function renderRecord(record) {
|
|
594
|
-
const when = record.ts.replace('T', ' ').replace(/\.\d+Z$/, '');
|
|
595
|
-
const event = record.event.padEnd(15);
|
|
596
|
-
const summary = summarize(record.data, 110);
|
|
597
|
-
return `${when} ${LEVEL_MARK[record.level]} ${event} ${summary}`.trimEnd();
|
|
598
|
-
}
|
|
599
|
-
//# sourceMappingURL=logging.js.map
|
package/dist/logging.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logging.js","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"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"}
|
package/dist/main-run.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/main-run.js
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Everything the CLI needs to actually run a command.
|
|
3
|
-
*
|
|
4
|
-
* Separate from `main.ts` so that the Node floor check there can decide
|
|
5
|
-
* whether this file is safe to parse at all: a static import would be hoisted
|
|
6
|
-
* above the check and fail first on the very runtimes the check exists to
|
|
7
|
-
* turn away.
|
|
8
|
-
*/
|
|
9
|
-
import { realIo } from './commands.js';
|
|
10
|
-
import { defaultCredentialStore } from './credentials.js';
|
|
11
|
-
import { nativeSkills } from './native-skills.js';
|
|
12
|
-
import { argvFlagNames, bootstrapLogger } from './logging.js';
|
|
13
|
-
import { buildProgram } from './program.js';
|
|
14
|
-
import { spawnQuestionSettlement } from './question-settlement-process.js';
|
|
15
|
-
/**
|
|
16
|
-
* The local record for this invocation.
|
|
17
|
-
*
|
|
18
|
-
* Built before the command tree so that the very first thing recorded is the
|
|
19
|
-
* command starting — including for a command that goes on to fail before it has
|
|
20
|
-
* resolved anything. It configures itself from disk and disables itself if it
|
|
21
|
-
* cannot write, so nothing below has to handle it failing.
|
|
22
|
-
*/
|
|
23
|
-
const logger = bootstrapLogger();
|
|
24
|
-
const deps = {
|
|
25
|
-
io: realIo(),
|
|
26
|
-
store: defaultCredentialStore(),
|
|
27
|
-
env: process.env,
|
|
28
|
-
cwd: process.cwd(),
|
|
29
|
-
nativeSkills,
|
|
30
|
-
spawnQuestionSettlement,
|
|
31
|
-
logger,
|
|
32
|
-
};
|
|
33
|
-
const startedAt = Date.now();
|
|
34
|
-
process.on('exit', (code) => {
|
|
35
|
-
logger.info('cli.end', {
|
|
36
|
-
exit: code,
|
|
37
|
-
duration_ms: Date.now() - startedAt,
|
|
38
|
-
flags: argvFlagNames(process.argv.slice(2)),
|
|
39
|
-
});
|
|
40
|
-
});
|
|
41
|
-
await buildProgram(deps).parseAsync(process.argv);
|
|
42
|
-
//# sourceMappingURL=main-run.js.map
|