@nanonets/graft 0.24.0 → 0.24.1
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/dist/ask/ask.d.ts +8 -0
- package/dist/ask/ask.d.ts.map +1 -1
- package/dist/ask/ask.js +33 -12
- package/dist/ask/ask.js.map +1 -1
- package/dist/claude/hook-io.d.ts +44 -0
- package/dist/claude/hook-io.d.ts.map +1 -0
- package/dist/claude/hook-io.js +144 -0
- package/dist/claude/hook-io.js.map +1 -0
- package/dist/claude/skills-hook-util.d.ts +25 -0
- package/dist/claude/skills-hook-util.d.ts.map +1 -0
- package/dist/claude/skills-hook-util.js +71 -0
- package/dist/claude/skills-hook-util.js.map +1 -0
- package/dist/cli-picker.d.ts +24 -0
- package/dist/cli-picker.d.ts.map +1 -1
- package/dist/cli-picker.js +36 -5
- package/dist/cli-picker.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +278 -29
- package/dist/cli.js.map +1 -1
- package/dist/cloud/lookup-activity.d.ts +16 -0
- package/dist/cloud/lookup-activity.d.ts.map +1 -0
- package/dist/cloud/lookup-activity.js +56 -0
- package/dist/cloud/lookup-activity.js.map +1 -0
- package/dist/cloud/nudge.d.ts.map +1 -1
- package/dist/cloud/nudge.js +3 -0
- package/dist/cloud/nudge.js.map +1 -1
- package/dist/cloud/onboarding.d.ts +237 -0
- package/dist/cloud/onboarding.d.ts.map +1 -0
- package/dist/cloud/onboarding.js +536 -0
- package/dist/cloud/onboarding.js.map +1 -0
- package/dist/cloud/pair.d.ts +76 -0
- package/dist/cloud/pair.d.ts.map +1 -0
- package/dist/cloud/pair.js +249 -0
- package/dist/cloud/pair.js.map +1 -0
- package/dist/cloud/workspace-sync.d.ts +10 -2
- package/dist/cloud/workspace-sync.d.ts.map +1 -1
- package/dist/cloud/workspace-sync.js +119 -7
- package/dist/cloud/workspace-sync.js.map +1 -1
- package/dist/cloud/workspace.d.ts +22 -1
- package/dist/cloud/workspace.d.ts.map +1 -1
- package/dist/cloud/workspace.js +16 -1
- package/dist/cloud/workspace.js.map +1 -1
- package/dist/graph/native.d.ts +2 -0
- package/dist/graph/native.d.ts.map +1 -1
- package/dist/graph/native.js +29 -4
- package/dist/graph/native.js.map +1 -1
- package/dist/hosts/claude-global.d.ts +14 -0
- package/dist/hosts/claude-global.d.ts.map +1 -1
- package/dist/hosts/claude-global.js +38 -3
- package/dist/hosts/claude-global.js.map +1 -1
- package/dist/init/install-record.d.ts +21 -0
- package/dist/init/install-record.d.ts.map +1 -0
- package/dist/init/install-record.js +144 -0
- package/dist/init/install-record.js.map +1 -0
- package/dist/init/plain-file.d.ts +11 -0
- package/dist/init/plain-file.d.ts.map +1 -0
- package/dist/init/plain-file.js +80 -0
- package/dist/init/plain-file.js.map +1 -0
- package/dist/mcp/brains.d.ts +72 -0
- package/dist/mcp/brains.d.ts.map +1 -0
- package/dist/mcp/brains.js +220 -0
- package/dist/mcp/brains.js.map +1 -0
- package/dist/mcp/server.d.ts +3 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +40 -5
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +7 -2
- package/dist/mcp/tools.js.map +1 -1
- package/dist/notes/cold-start.d.ts +30 -1
- package/dist/notes/cold-start.d.ts.map +1 -1
- package/dist/notes/cold-start.js +98 -19
- package/dist/notes/cold-start.js.map +1 -1
- package/dist/notes/every-repo.d.ts +18 -0
- package/dist/notes/every-repo.d.ts.map +1 -0
- package/dist/notes/every-repo.js +86 -0
- package/dist/notes/every-repo.js.map +1 -0
- package/dist/notes/guardrails.d.ts +8 -0
- package/dist/notes/guardrails.d.ts.map +1 -0
- package/dist/notes/guardrails.js +38 -0
- package/dist/notes/guardrails.js.map +1 -0
- package/dist/notes/lesson-index.d.ts +13 -0
- package/dist/notes/lesson-index.d.ts.map +1 -0
- package/dist/notes/lesson-index.js +135 -0
- package/dist/notes/lesson-index.js.map +1 -0
- package/dist/notes/linked-learnings.d.ts +8 -0
- package/dist/notes/linked-learnings.d.ts.map +1 -0
- package/dist/notes/linked-learnings.js +113 -0
- package/dist/notes/linked-learnings.js.map +1 -0
- package/dist/notes/replace.d.ts +14 -0
- package/dist/notes/replace.d.ts.map +1 -0
- package/dist/notes/replace.js +38 -0
- package/dist/notes/replace.js.map +1 -0
- package/dist/notes/repo-notes-dir.d.ts +2 -0
- package/dist/notes/repo-notes-dir.d.ts.map +1 -0
- package/dist/notes/repo-notes-dir.js +16 -0
- package/dist/notes/repo-notes-dir.js.map +1 -0
- package/dist/skills/anchors-cli.d.ts +33 -0
- package/dist/skills/anchors-cli.d.ts.map +1 -0
- package/dist/skills/anchors-cli.js +274 -0
- package/dist/skills/anchors-cli.js.map +1 -0
- package/dist/skills/anchors-git.d.ts +29 -0
- package/dist/skills/anchors-git.d.ts.map +1 -0
- package/dist/skills/anchors-git.js +241 -0
- package/dist/skills/anchors-git.js.map +1 -0
- package/dist/skills/anchors-wide.d.ts +25 -0
- package/dist/skills/anchors-wide.d.ts.map +1 -0
- package/dist/skills/anchors-wide.js +481 -0
- package/dist/skills/anchors-wide.js.map +1 -0
- package/dist/skills/anchors.d.ts +32 -0
- package/dist/skills/anchors.d.ts.map +1 -0
- package/dist/skills/anchors.js +485 -0
- package/dist/skills/anchors.js.map +1 -0
- package/dist/skills/check-result.d.ts +26 -0
- package/dist/skills/check-result.d.ts.map +1 -0
- package/dist/skills/check-result.js +46 -0
- package/dist/skills/check-result.js.map +1 -0
- package/dist/skills/codex-sandbox.d.ts +6 -0
- package/dist/skills/codex-sandbox.d.ts.map +1 -0
- package/dist/skills/codex-sandbox.js +55 -0
- package/dist/skills/codex-sandbox.js.map +1 -0
- package/dist/skills/compile-split.d.ts +57 -0
- package/dist/skills/compile-split.d.ts.map +1 -0
- package/dist/skills/compile-split.js +532 -0
- package/dist/skills/compile-split.js.map +1 -0
- package/dist/skills/compile-version.d.ts +37 -0
- package/dist/skills/compile-version.d.ts.map +1 -0
- package/dist/skills/compile-version.js +56 -0
- package/dist/skills/compile-version.js.map +1 -0
- package/dist/skills/compile-waits.d.ts +12 -0
- package/dist/skills/compile-waits.d.ts.map +1 -0
- package/dist/skills/compile-waits.js +52 -0
- package/dist/skills/compile-waits.js.map +1 -0
- package/dist/skills/compile-words.d.ts +82 -0
- package/dist/skills/compile-words.d.ts.map +1 -0
- package/dist/skills/compile-words.js +385 -0
- package/dist/skills/compile-words.js.map +1 -0
- package/dist/skills/compile.d.ts +35 -0
- package/dist/skills/compile.d.ts.map +1 -0
- package/dist/skills/compile.js +488 -0
- package/dist/skills/compile.js.map +1 -0
- package/dist/skills/credit-facts.d.ts +8 -0
- package/dist/skills/credit-facts.d.ts.map +1 -0
- package/dist/skills/credit-facts.js +32 -0
- package/dist/skills/credit-facts.js.map +1 -0
- package/dist/skills/directive-words.d.ts +11 -0
- package/dist/skills/directive-words.d.ts.map +1 -0
- package/dist/skills/directive-words.js +33 -0
- package/dist/skills/directive-words.js.map +1 -0
- package/dist/skills/fidelity.d.ts +42 -0
- package/dist/skills/fidelity.d.ts.map +1 -0
- package/dist/skills/fidelity.js +138 -0
- package/dist/skills/fidelity.js.map +1 -0
- package/dist/skills/forget-notice.d.ts +44 -0
- package/dist/skills/forget-notice.d.ts.map +1 -0
- package/dist/skills/forget-notice.js +131 -0
- package/dist/skills/forget-notice.js.map +1 -0
- package/dist/skills/found-skill.d.ts +35 -0
- package/dist/skills/found-skill.d.ts.map +1 -0
- package/dist/skills/found-skill.js +66 -0
- package/dist/skills/found-skill.js.map +1 -0
- package/dist/skills/front-version.d.ts +12 -0
- package/dist/skills/front-version.d.ts.map +1 -0
- package/dist/skills/front-version.js +87 -0
- package/dist/skills/front-version.js.map +1 -0
- package/dist/skills/host-facts.d.ts +51 -0
- package/dist/skills/host-facts.d.ts.map +1 -0
- package/dist/skills/host-facts.js +134 -0
- package/dist/skills/host-facts.js.map +1 -0
- package/dist/skills/ledger.d.ts +43 -0
- package/dist/skills/ledger.d.ts.map +1 -0
- package/dist/skills/ledger.js +336 -0
- package/dist/skills/ledger.js.map +1 -0
- package/dist/skills/lessons.d.ts +60 -0
- package/dist/skills/lessons.d.ts.map +1 -0
- package/dist/skills/lessons.js +396 -0
- package/dist/skills/lessons.js.map +1 -0
- package/dist/skills/offer-answers.d.ts +20 -0
- package/dist/skills/offer-answers.d.ts.map +1 -0
- package/dist/skills/offer-answers.js +51 -0
- package/dist/skills/offer-answers.js.map +1 -0
- package/dist/skills/own-folder.d.ts +9 -0
- package/dist/skills/own-folder.d.ts.map +1 -0
- package/dist/skills/own-folder.js +36 -0
- package/dist/skills/own-folder.js.map +1 -0
- package/dist/skills/person.d.ts +34 -0
- package/dist/skills/person.d.ts.map +1 -0
- package/dist/skills/person.js +102 -0
- package/dist/skills/person.js.map +1 -0
- package/dist/skills/probe-clean.d.ts +9 -0
- package/dist/skills/probe-clean.d.ts.map +1 -0
- package/dist/skills/probe-clean.js +48 -0
- package/dist/skills/probe-clean.js.map +1 -0
- package/dist/skills/probes.d.ts +26 -0
- package/dist/skills/probes.d.ts.map +1 -0
- package/dist/skills/probes.js +225 -0
- package/dist/skills/probes.js.map +1 -0
- package/dist/skills/recall.d.ts +119 -0
- package/dist/skills/recall.d.ts.map +1 -0
- package/dist/skills/recall.js +370 -0
- package/dist/skills/recall.js.map +1 -0
- package/dist/skills/receipts.d.ts +44 -0
- package/dist/skills/receipts.d.ts.map +1 -0
- package/dist/skills/receipts.js +223 -0
- package/dist/skills/receipts.js.map +1 -0
- package/dist/skills/run-checkout.d.ts +4 -0
- package/dist/skills/run-checkout.d.ts.map +1 -0
- package/dist/skills/run-checkout.js +37 -0
- package/dist/skills/run-checkout.js.map +1 -0
- package/dist/skills/runblock.d.ts +45 -0
- package/dist/skills/runblock.d.ts.map +1 -0
- package/dist/skills/runblock.js +222 -0
- package/dist/skills/runblock.js.map +1 -0
- package/dist/skills/save-parse.d.ts +42 -0
- package/dist/skills/save-parse.d.ts.map +1 -0
- package/dist/skills/save-parse.js +172 -0
- package/dist/skills/save-parse.js.map +1 -0
- package/dist/skills/save-store.d.ts +12 -0
- package/dist/skills/save-store.d.ts.map +1 -0
- package/dist/skills/save-store.js +22 -0
- package/dist/skills/save-store.js.map +1 -0
- package/dist/skills/settings.d.ts +38 -0
- package/dist/skills/settings.d.ts.map +1 -0
- package/dist/skills/settings.js +133 -0
- package/dist/skills/settings.js.map +1 -0
- package/dist/skills/skill-diff.d.ts +40 -0
- package/dist/skills/skill-diff.d.ts.map +1 -0
- package/dist/skills/skill-diff.js +191 -0
- package/dist/skills/skill-diff.js.map +1 -0
- package/dist/skills/skill-file.d.ts +24 -0
- package/dist/skills/skill-file.d.ts.map +1 -0
- package/dist/skills/skill-file.js +97 -0
- package/dist/skills/skill-file.js.map +1 -0
- package/dist/skills/skill-rebuild.d.ts +27 -0
- package/dist/skills/skill-rebuild.d.ts.map +1 -0
- package/dist/skills/skill-rebuild.js +85 -0
- package/dist/skills/skill-rebuild.js.map +1 -0
- package/dist/skills/skillmd.d.ts +17 -0
- package/dist/skills/skillmd.d.ts.map +1 -0
- package/dist/skills/skillmd.js +219 -0
- package/dist/skills/skillmd.js.map +1 -0
- package/dist/skills/skills.d.ts +2 -0
- package/dist/skills/skills.d.ts.map +1 -1
- package/dist/skills/skills.js +1 -1
- package/dist/skills/skills.js.map +1 -1
- package/dist/skills/staleness.d.ts +27 -0
- package/dist/skills/staleness.d.ts.map +1 -0
- package/dist/skills/staleness.js +178 -0
- package/dist/skills/staleness.js.map +1 -0
- package/dist/skills/state.d.ts +36 -0
- package/dist/skills/state.d.ts.map +1 -0
- package/dist/skills/state.js +259 -0
- package/dist/skills/state.js.map +1 -0
- package/dist/skills/store-fs.d.ts +77 -0
- package/dist/skills/store-fs.d.ts.map +1 -0
- package/dist/skills/store-fs.js +194 -0
- package/dist/skills/store-fs.js.map +1 -0
- package/dist/skills/store-held.d.ts +44 -0
- package/dist/skills/store-held.d.ts.map +1 -0
- package/dist/skills/store-held.js +147 -0
- package/dist/skills/store-held.js.map +1 -0
- package/dist/skills/store.d.ts +73 -0
- package/dist/skills/store.d.ts.map +1 -0
- package/dist/skills/store.js +279 -0
- package/dist/skills/store.js.map +1 -0
- package/dist/skills/validate.d.ts +11 -0
- package/dist/skills/validate.d.ts.map +1 -0
- package/dist/skills/validate.js +112 -0
- package/dist/skills/validate.js.map +1 -0
- package/dist/skills/versions-fs.d.ts +45 -0
- package/dist/skills/versions-fs.d.ts.map +1 -0
- package/dist/skills/versions-fs.js +234 -0
- package/dist/skills/versions-fs.js.map +1 -0
- package/dist/skills/versions.d.ts +56 -0
- package/dist/skills/versions.d.ts.map +1 -0
- package/dist/skills/versions.js +351 -0
- package/dist/skills/versions.js.map +1 -0
- package/dist/trace/checks.d.ts +63 -0
- package/dist/trace/checks.d.ts.map +1 -0
- package/dist/trace/checks.js +487 -0
- package/dist/trace/checks.js.map +1 -0
- package/dist/trace/claude.d.ts +124 -0
- package/dist/trace/claude.d.ts.map +1 -0
- package/dist/trace/claude.js +303 -0
- package/dist/trace/claude.js.map +1 -0
- package/dist/trace/codex-exec.d.ts +22 -0
- package/dist/trace/codex-exec.d.ts.map +1 -0
- package/dist/trace/codex-exec.js +129 -0
- package/dist/trace/codex-exec.js.map +1 -0
- package/dist/trace/codex-meta.d.ts +23 -0
- package/dist/trace/codex-meta.d.ts.map +1 -0
- package/dist/trace/codex-meta.js +112 -0
- package/dist/trace/codex-meta.js.map +1 -0
- package/dist/trace/codex.d.ts +33 -0
- package/dist/trace/codex.d.ts.map +1 -0
- package/dist/trace/codex.js +485 -0
- package/dist/trace/codex.js.map +1 -0
- package/dist/trace/cursor.d.ts +16 -0
- package/dist/trace/cursor.d.ts.map +1 -0
- package/dist/trace/cursor.js +133 -0
- package/dist/trace/cursor.js.map +1 -0
- package/dist/trace/dialect.d.ts +43 -0
- package/dist/trace/dialect.d.ts.map +1 -0
- package/dist/trace/dialect.js +95 -0
- package/dist/trace/dialect.js.map +1 -0
- package/dist/trace/epochs.d.ts +10 -0
- package/dist/trace/epochs.d.ts.map +1 -0
- package/dist/trace/epochs.js +16 -0
- package/dist/trace/epochs.js.map +1 -0
- package/dist/trace/failure.d.ts +15 -0
- package/dist/trace/failure.d.ts.map +1 -0
- package/dist/trace/failure.js +69 -0
- package/dist/trace/failure.js.map +1 -0
- package/dist/trace/gate-file.d.ts +71 -0
- package/dist/trace/gate-file.d.ts.map +1 -0
- package/dist/trace/gate-file.js +329 -0
- package/dist/trace/gate-file.js.map +1 -0
- package/dist/trace/guard-fast.d.ts +22 -0
- package/dist/trace/guard-fast.d.ts.map +1 -0
- package/dist/trace/guard-fast.js +213 -0
- package/dist/trace/guard-fast.js.map +1 -0
- package/dist/trace/housekeeping.d.ts +5 -0
- package/dist/trace/housekeeping.d.ts.map +1 -0
- package/dist/trace/housekeeping.js +93 -0
- package/dist/trace/housekeeping.js.map +1 -0
- package/dist/trace/jobs.d.ts +52 -0
- package/dist/trace/jobs.d.ts.map +1 -0
- package/dist/trace/jobs.js +182 -0
- package/dist/trace/jobs.js.map +1 -0
- package/dist/trace/known-repo.d.ts +3 -0
- package/dist/trace/known-repo.d.ts.map +1 -0
- package/dist/trace/known-repo.js +55 -0
- package/dist/trace/known-repo.js.map +1 -0
- package/dist/trace/pool.d.ts +40 -0
- package/dist/trace/pool.d.ts.map +1 -0
- package/dist/trace/pool.js +154 -0
- package/dist/trace/pool.js.map +1 -0
- package/dist/trace/repairs.d.ts +27 -0
- package/dist/trace/repairs.d.ts.map +1 -0
- package/dist/trace/repairs.js +303 -0
- package/dist/trace/repairs.js.map +1 -0
- package/dist/trace/run-calls.d.ts +82 -0
- package/dist/trace/run-calls.d.ts.map +1 -0
- package/dist/trace/run-calls.js +331 -0
- package/dist/trace/run-calls.js.map +1 -0
- package/dist/trace/run-join.d.ts +20 -0
- package/dist/trace/run-join.d.ts.map +1 -0
- package/dist/trace/run-join.js +99 -0
- package/dist/trace/run-join.js.map +1 -0
- package/dist/trace/run-sheets.d.ts +26 -0
- package/dist/trace/run-sheets.d.ts.map +1 -0
- package/dist/trace/run-sheets.js +145 -0
- package/dist/trace/run-sheets.js.map +1 -0
- package/dist/trace/run-turns.d.ts +24 -0
- package/dist/trace/run-turns.d.ts.map +1 -0
- package/dist/trace/run-turns.js +67 -0
- package/dist/trace/run-turns.js.map +1 -0
- package/dist/trace/run-verdict.d.ts +24 -0
- package/dist/trace/run-verdict.d.ts.map +1 -0
- package/dist/trace/run-verdict.js +176 -0
- package/dist/trace/run-verdict.js.map +1 -0
- package/dist/trace/runs.d.ts +54 -0
- package/dist/trace/runs.d.ts.map +1 -0
- package/dist/trace/runs.js +501 -0
- package/dist/trace/runs.js.map +1 -0
- package/dist/trace/skill-session.d.ts +64 -0
- package/dist/trace/skill-session.d.ts.map +1 -0
- package/dist/trace/skill-session.js +232 -0
- package/dist/trace/skill-session.js.map +1 -0
- package/dist/trace/tamper.d.ts +12 -0
- package/dist/trace/tamper.d.ts.map +1 -0
- package/dist/trace/tamper.js +405 -0
- package/dist/trace/tamper.js.map +1 -0
- package/dist/trace/typed.d.ts +30 -0
- package/dist/trace/typed.d.ts.map +1 -0
- package/dist/trace/typed.js +132 -0
- package/dist/trace/typed.js.map +1 -0
- package/dist/trace/wall-state.d.ts +86 -0
- package/dist/trace/wall-state.d.ts.map +1 -0
- package/dist/trace/wall-state.js +279 -0
- package/dist/trace/wall-state.js.map +1 -0
- package/dist/trace/walls.d.ts +40 -0
- package/dist/trace/walls.d.ts.map +1 -0
- package/dist/trace/walls.js +318 -0
- package/dist/trace/walls.js.map +1 -0
- package/dist/vendor/tree-sitter-swift/LICENSE +21 -0
- package/dist/vendor/tree-sitter-swift/node-types.json +30694 -0
- package/dist/vendor/tree-sitter-swift/prebuilds/darwin-arm64/tree-sitter-swift.node +0 -0
- package/dist/vendor/tree-sitter-swift/prebuilds/darwin-x64/tree-sitter-swift.node +0 -0
- package/dist/vendor/tree-sitter-swift/prebuilds/linux-arm64/tree-sitter-swift.node +0 -0
- package/dist/vendor/tree-sitter-swift/prebuilds/linux-x64/tree-sitter-swift.node +0 -0
- package/dist/vendor/tree-sitter-swift/prebuilds/win32-arm64/tree-sitter-swift.node +0 -0
- package/dist/vendor/tree-sitter-swift/prebuilds/win32-x64/tree-sitter-swift.node +0 -0
- package/package.json +6 -3
- package/scripts/stamp-telemetry-key.mjs +8 -5
- package/scripts/vendor-grammars.mjs +35 -0
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The small files the PreToolUse fast path reads while a skill's run block is
|
|
3
|
+
* live, kept beside phase 0's session state in `<trail home>/sessions/`:
|
|
4
|
+
*
|
|
5
|
+
* - `<id>.gate.json`: the live run blocks' gated steps (a publish, a push to
|
|
6
|
+
* prod, a deploy, ...), grouped so one ask of the person covers a run of
|
|
7
|
+
* consecutive steps of one kind, and which asks were made and approved.
|
|
8
|
+
* It exists only while something is live.
|
|
9
|
+
* - `<id>.post.jsonl`: outcomes PostToolUse and PostToolUseFailure saw
|
|
10
|
+
* before the transcript had them, one line each, taken by the next
|
|
11
|
+
* catch-up. The transcript's result always wins when it arrives.
|
|
12
|
+
*
|
|
13
|
+
* An approval is the asked call's own PostToolUse: the person said yes and
|
|
14
|
+
* the command ran. A failed asked call (PostToolUseFailure) never approves,
|
|
15
|
+
* because a refused ask may arrive the same way.
|
|
16
|
+
*
|
|
17
|
+
* Every shell command passes through PreToolUse, so this file stays light:
|
|
18
|
+
* static imports are node:path, node:os and the shell lexer; node:fs and
|
|
19
|
+
* node:crypto come from `process.getBuiltinModule`, as pre-bash.ts does.
|
|
20
|
+
* Writes are tmp-and-rename (or one O_APPEND write) at 0600 in a 0700 folder.
|
|
21
|
+
*/
|
|
22
|
+
import { homedir } from 'node:os';
|
|
23
|
+
import { dirname, join, resolve } from 'node:path';
|
|
24
|
+
import { programOf } from './shell.js';
|
|
25
|
+
/** A gate file bigger than this is not read: the fast path never parses much. */
|
|
26
|
+
const MAX_GATE_BYTES = 16 * 1024;
|
|
27
|
+
const MAX_TAIL = 200;
|
|
28
|
+
const MAX_MARKS = 2000;
|
|
29
|
+
const fs = () => process.getBuiltinModule('node:fs');
|
|
30
|
+
const crypto = () => process.getBuiltinModule('node:crypto');
|
|
31
|
+
/** The same answer as notes/home.ts trailHome(env); a test holds them equal. */
|
|
32
|
+
export function trailHomeFast(env = process.env) {
|
|
33
|
+
return env.TRAIL_HOME ? resolve(env.TRAIL_HOME) : join(homedir(), '.trail');
|
|
34
|
+
}
|
|
35
|
+
/** A session id as a file name, as phase 0's state.ts does it (a test holds them equal). */
|
|
36
|
+
function fileId(sessionId) {
|
|
37
|
+
if (/^[A-Za-z0-9_-][A-Za-z0-9._-]{0,127}$/.test(sessionId))
|
|
38
|
+
return sessionId;
|
|
39
|
+
return `h-${crypto().createHash('sha256').update(String(sessionId)).digest('hex').slice(0, 16)}`;
|
|
40
|
+
}
|
|
41
|
+
/** `<home>/sessions/<id><suffix>`: the session's files (`.json`, `.gate.json`, `.post.jsonl`). */
|
|
42
|
+
export function sessionPath(sessionId, suffix, env = process.env) {
|
|
43
|
+
return join(trailHomeFast(env), 'sessions', `${fileId(String(sessionId))}${suffix}`);
|
|
44
|
+
}
|
|
45
|
+
export function gateFilePath(sessionId, env = process.env) {
|
|
46
|
+
return sessionPath(sessionId, '.gate.json', env);
|
|
47
|
+
}
|
|
48
|
+
function postPath(sessionId, env) {
|
|
49
|
+
return sessionPath(sessionId, '.post.jsonl', env);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* A folder only its owner can open, made if missing and tightened if it was looser. A link is left alone: a chmod
|
|
53
|
+
* would follow it and tighten what it points to. The mode is set through a descriptor that refuses a link (as
|
|
54
|
+
* state.ts ensurePrivateDir, kept here so this file loads only node:path and node:os).
|
|
55
|
+
*/
|
|
56
|
+
function privateDir(dir) {
|
|
57
|
+
const f = fs();
|
|
58
|
+
try {
|
|
59
|
+
if (f.lstatSync(dir).isSymbolicLink())
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
catch { /* missing: made below */ }
|
|
63
|
+
f.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
64
|
+
const k = f.constants;
|
|
65
|
+
if (process.platform === 'win32' || k.O_NOFOLLOW === undefined)
|
|
66
|
+
return;
|
|
67
|
+
try {
|
|
68
|
+
const fd = f.openSync(dir, k.O_RDONLY | (k.O_DIRECTORY ?? 0) | k.O_NOFOLLOW);
|
|
69
|
+
try {
|
|
70
|
+
f.fchmodSync(fd, 0o700);
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
f.closeSync(fd);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch (e) {
|
|
77
|
+
// A folder its owner can't read can't be opened, but can still be tightened.
|
|
78
|
+
if (e.code !== 'EACCES')
|
|
79
|
+
return;
|
|
80
|
+
try {
|
|
81
|
+
if (!f.lstatSync(dir).isSymbolicLink())
|
|
82
|
+
f.chmodSync(dir, 0o700);
|
|
83
|
+
}
|
|
84
|
+
catch { /* not ours to change */ }
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/** tmp file + rename at 0600. */
|
|
88
|
+
function writeWhole(path, data) {
|
|
89
|
+
const f = fs();
|
|
90
|
+
privateDir(dirname(path));
|
|
91
|
+
const tmp = `${path}.${process.pid}.${Math.random().toString(16).slice(2, 8)}.tmp`;
|
|
92
|
+
try {
|
|
93
|
+
const fd = f.openSync(tmp, 'wx', 0o600);
|
|
94
|
+
try {
|
|
95
|
+
f.fchmodSync(fd, 0o600);
|
|
96
|
+
f.writeSync(fd, data);
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
f.closeSync(fd);
|
|
100
|
+
}
|
|
101
|
+
f.renameSync(tmp, path);
|
|
102
|
+
}
|
|
103
|
+
catch (e) {
|
|
104
|
+
try {
|
|
105
|
+
f.rmSync(tmp, { force: true });
|
|
106
|
+
}
|
|
107
|
+
catch { /* nothing more to do */ }
|
|
108
|
+
throw e;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const isStr = (v) => typeof v === 'string';
|
|
112
|
+
const strOrNull = (v) => v === null || typeof v === 'string';
|
|
113
|
+
function validGroup(g) {
|
|
114
|
+
if (!g || typeof g !== 'object')
|
|
115
|
+
return false;
|
|
116
|
+
const x = g;
|
|
117
|
+
return isStr(x.kind) && Array.isArray(x.steps) && x.steps.every((s) => s && typeof s.n === 'number' && isStr(s.text))
|
|
118
|
+
&& strOrNull(x.askedAt) && strOrNull(x.askedToolUseId) && strOrNull(x.approvedAt);
|
|
119
|
+
}
|
|
120
|
+
function validGate(v) {
|
|
121
|
+
if (!v || typeof v !== 'object' || Array.isArray(v))
|
|
122
|
+
return false;
|
|
123
|
+
const g = v;
|
|
124
|
+
if (g.v !== 1 || typeof g.epoch !== 'number' || !Array.isArray(g.live))
|
|
125
|
+
return false;
|
|
126
|
+
return g.live.every((l) => l && isStr(l.injId) && isStr(l.name) && Array.isArray(l.steps) && Array.isArray(l.groups) && l.groups.every(validGroup));
|
|
127
|
+
}
|
|
128
|
+
/** No lock; a file over 16 KB or bad JSON reads as null. */
|
|
129
|
+
export function readGateFile(sessionId, env = process.env) {
|
|
130
|
+
try {
|
|
131
|
+
const f = fs();
|
|
132
|
+
const path = gateFilePath(sessionId, env);
|
|
133
|
+
const st = f.statSync(path);
|
|
134
|
+
if (!st.isFile() || st.size > MAX_GATE_BYTES)
|
|
135
|
+
return null;
|
|
136
|
+
const v = JSON.parse(f.readFileSync(path, 'utf8'));
|
|
137
|
+
return validGate(v) ? v : null;
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/** Gated steps, consecutive ones of one kind together (one ask covers a group). */
|
|
144
|
+
function groupsOf(steps, gated) {
|
|
145
|
+
const sorted = [...gated].filter((g) => g.step >= 1 && g.step <= steps.length).sort((a, b) => a.step - b.step);
|
|
146
|
+
const out = [];
|
|
147
|
+
for (const g of sorted) {
|
|
148
|
+
const text = steps[g.step - 1];
|
|
149
|
+
const step = { n: g.step, text, program: programOf(text) };
|
|
150
|
+
const last = out[out.length - 1];
|
|
151
|
+
const prev = last?.steps[last.steps.length - 1];
|
|
152
|
+
if (last && prev && last.kind === g.kind && prev.n === g.step - 1)
|
|
153
|
+
last.steps.push(step);
|
|
154
|
+
else
|
|
155
|
+
out.push({ kind: g.kind, steps: [step], askedAt: null, askedToolUseId: null, approvedAt: null });
|
|
156
|
+
}
|
|
157
|
+
return out;
|
|
158
|
+
}
|
|
159
|
+
const sameSteps = (a, b) => a.kind === b.kind && a.steps.length === b.steps.length && a.steps.every((s, i) => s.n === b.steps[i].n && s.text === b.steps[i].text);
|
|
160
|
+
/** Rewrites `live` from st.injected (live ones), keeping asked/approved marks of injections that stay. Deletes the file when nothing is live. */
|
|
161
|
+
export function writeGateFile(sessionId, st, env = process.env) {
|
|
162
|
+
const path = gateFilePath(sessionId, env);
|
|
163
|
+
const old = readGateFile(sessionId, env);
|
|
164
|
+
const live = st.injected.filter((i) => i.live).map((inj) => {
|
|
165
|
+
const before = old?.live.find((l) => l.injId === inj.injId);
|
|
166
|
+
const groups = groupsOf(inj.steps, inj.gated).map((g) => {
|
|
167
|
+
const kept = before?.groups.find((b) => sameSteps(b, g));
|
|
168
|
+
return kept ? { ...g, askedAt: kept.askedAt, askedToolUseId: kept.askedToolUseId, approvedAt: kept.approvedAt, askedStep: kept.askedStep ?? null } : g;
|
|
169
|
+
});
|
|
170
|
+
const handed = before?.steps.join('\n') === inj.steps.join('\n') ? validHanded(before?.handed) : [];
|
|
171
|
+
return { injId: inj.injId, name: inj.name, skillId: inj.skillId, params: inj.params, steps: inj.steps, check: inj.check, groups, ...(handed.length ? { handed } : {}) };
|
|
172
|
+
});
|
|
173
|
+
if (!live.length) {
|
|
174
|
+
try {
|
|
175
|
+
fs().rmSync(path, { force: true });
|
|
176
|
+
}
|
|
177
|
+
catch { /* gone already */ }
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
// Over the cap the file would read as nothing: keep the newest blocks that fit.
|
|
181
|
+
let file = { v: 1, epoch: st.epoch, live };
|
|
182
|
+
let text = JSON.stringify(file);
|
|
183
|
+
while (Buffer.byteLength(text) > MAX_GATE_BYTES && file.live.length > 1) {
|
|
184
|
+
file = { ...file, live: file.live.slice(1) };
|
|
185
|
+
text = JSON.stringify(file);
|
|
186
|
+
}
|
|
187
|
+
writeWhole(path, text);
|
|
188
|
+
}
|
|
189
|
+
function rewrite(sessionId, env, change) {
|
|
190
|
+
const g = readGateFile(sessionId, env);
|
|
191
|
+
if (!g || !change(g))
|
|
192
|
+
return false;
|
|
193
|
+
writeWhole(gateFilePath(sessionId, env), JSON.stringify(g));
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
export function markAsked(sessionId, injId, group, toolUseId, now, env = process.env, step) {
|
|
197
|
+
rewrite(sessionId, env, (g) => {
|
|
198
|
+
const target = g.live.find((l) => l.injId === injId)?.groups[group];
|
|
199
|
+
if (!target)
|
|
200
|
+
return false;
|
|
201
|
+
target.askedAt = now.toISOString();
|
|
202
|
+
target.askedToolUseId = toolUseId;
|
|
203
|
+
target.approvedAt = null;
|
|
204
|
+
target.askedStep = typeof step === 'number' ? step : null;
|
|
205
|
+
return true;
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
const MAX_HANDED = 8;
|
|
209
|
+
const validHanded = (v) => (Array.isArray(v) ? v : []).filter((h) => !!h && typeof h.n === 'number' && Number.isInteger(h.n) && h.n >= 1 && isStr(h.at)).slice(-MAX_HANDED);
|
|
210
|
+
/** D137: the gated step `step` of block `injId` was denied and printed for the person to run (no ask possible here). */
|
|
211
|
+
export function markHanded(sessionId, injId, step, now, env = process.env) {
|
|
212
|
+
rewrite(sessionId, env, (g) => {
|
|
213
|
+
const l = g.live.find((x) => x.injId === injId);
|
|
214
|
+
if (!l || !Number.isInteger(step) || step < 1 || step > l.steps.length)
|
|
215
|
+
return false;
|
|
216
|
+
l.handed = [...validHanded(l.handed).filter((h) => h.n !== step), { n: step, at: now.toISOString() }].slice(-MAX_HANDED);
|
|
217
|
+
return true;
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
/** D137: every handed step the gate file holds, by block. */
|
|
221
|
+
export function readHanded(sessionId, env = process.env) {
|
|
222
|
+
const g = readGateFile(sessionId, env);
|
|
223
|
+
return g ? g.live.flatMap((l) => validHanded(l.handed).map((h) => ({ ...h, injId: l.injId }))) : [];
|
|
224
|
+
}
|
|
225
|
+
/** true when toolUseId was an asked call (sets approvedAt). PostToolUse only: a failed asked call (PostToolUseFailure) never
|
|
226
|
+
* approves its group, because a refused ask may arrive the same way; the next step in the group asks again (3.3). */
|
|
227
|
+
export function markApproved(sessionId, toolUseId, now, env = process.env) {
|
|
228
|
+
if (!toolUseId)
|
|
229
|
+
return false;
|
|
230
|
+
return rewrite(sessionId, env, (g) => {
|
|
231
|
+
let hit = false;
|
|
232
|
+
for (const l of g.live)
|
|
233
|
+
for (const grp of l.groups) {
|
|
234
|
+
if (grp.askedToolUseId === toolUseId) {
|
|
235
|
+
grp.approvedAt = now.toISOString();
|
|
236
|
+
hit = true;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return hit;
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* `<home>/sessions/<id>.post.jsonl`, one O_APPEND write at 0600. Opened without blocking and written only when it
|
|
244
|
+
* is a regular file: a FIFO planted at the path would otherwise hold PostToolUse until its timeout (D100 18). A FIFO
|
|
245
|
+
* or anything else that isn't a regular file is skipped, and the mark is lost (the fold reads the call anyway).
|
|
246
|
+
*/
|
|
247
|
+
export function appendPostMark(sessionId, mark, env = process.env) {
|
|
248
|
+
const f = fs();
|
|
249
|
+
const path = postPath(sessionId, env);
|
|
250
|
+
const clean = { id: String(mark.id), at: String(mark.at), failed: mark.failed === true };
|
|
251
|
+
if (typeof mark.tail === 'string')
|
|
252
|
+
clean.tail = mark.tail.slice(-MAX_TAIL);
|
|
253
|
+
privateDir(dirname(path));
|
|
254
|
+
// Never through a symlink: one planted at this path would have the hook append to, and chmod, its target.
|
|
255
|
+
const { O_WRONLY, O_APPEND, O_CREAT, O_NOFOLLOW, O_NONBLOCK } = f.constants;
|
|
256
|
+
let fd;
|
|
257
|
+
try {
|
|
258
|
+
fd = f.openSync(path, O_WRONLY | O_APPEND | O_CREAT | O_NOFOLLOW | (O_NONBLOCK ?? 0), 0o600);
|
|
259
|
+
}
|
|
260
|
+
catch (e) {
|
|
261
|
+
// A FIFO with no reader refuses a non-blocking open for writing.
|
|
262
|
+
if (e.code === 'ENXIO')
|
|
263
|
+
return;
|
|
264
|
+
throw e;
|
|
265
|
+
}
|
|
266
|
+
try {
|
|
267
|
+
if (!f.fstatSync(fd).isFile())
|
|
268
|
+
return;
|
|
269
|
+
f.fchmodSync(fd, 0o600);
|
|
270
|
+
f.writeSync(fd, `${JSON.stringify(clean)}\n`);
|
|
271
|
+
}
|
|
272
|
+
finally {
|
|
273
|
+
f.closeSync(fd);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
function asMark(v) {
|
|
277
|
+
if (!v || typeof v !== 'object' || Array.isArray(v))
|
|
278
|
+
return null;
|
|
279
|
+
const m = v;
|
|
280
|
+
if (!isStr(m.id) || !m.id || !isStr(m.at) || typeof m.failed !== 'boolean')
|
|
281
|
+
return null;
|
|
282
|
+
return isStr(m.tail) ? { id: m.id, at: m.at, failed: m.failed, tail: m.tail.slice(-MAX_TAIL) } : { id: m.id, at: m.at, failed: m.failed };
|
|
283
|
+
}
|
|
284
|
+
/** Read and truncate: the file is moved aside first, so a mark appended meanwhile waits for the next take. */
|
|
285
|
+
export function takePostMarks(sessionId, env = process.env) {
|
|
286
|
+
const f = fs();
|
|
287
|
+
const path = postPath(sessionId, env);
|
|
288
|
+
const aside = `${path}.${process.pid}.${Math.random().toString(16).slice(2, 8)}.take`;
|
|
289
|
+
try {
|
|
290
|
+
f.renameSync(path, aside);
|
|
291
|
+
}
|
|
292
|
+
catch {
|
|
293
|
+
return [];
|
|
294
|
+
}
|
|
295
|
+
try {
|
|
296
|
+
const out = [];
|
|
297
|
+
for (const line of f.readFileSync(aside, 'utf8').split('\n')) {
|
|
298
|
+
if (!line.trim())
|
|
299
|
+
continue;
|
|
300
|
+
try {
|
|
301
|
+
const m = asMark(JSON.parse(line));
|
|
302
|
+
if (m)
|
|
303
|
+
out.push(m);
|
|
304
|
+
}
|
|
305
|
+
catch { /* a broken line is skipped */ }
|
|
306
|
+
}
|
|
307
|
+
return out.slice(-MAX_MARKS);
|
|
308
|
+
}
|
|
309
|
+
catch {
|
|
310
|
+
return [];
|
|
311
|
+
}
|
|
312
|
+
finally {
|
|
313
|
+
try {
|
|
314
|
+
f.rmSync(aside, { force: true });
|
|
315
|
+
}
|
|
316
|
+
catch { /* nothing more to do */ }
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
/** settings.json's `skills === 'on'`, read with fs only. */
|
|
320
|
+
export function skillsOnFast(env = process.env) {
|
|
321
|
+
try {
|
|
322
|
+
const v = JSON.parse(fs().readFileSync(join(trailHomeFast(env), 'settings.json'), 'utf8'));
|
|
323
|
+
return !!v && typeof v === 'object' && !Array.isArray(v) && v.skills === 'on';
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
return false;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=gate-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate-file.js","sourceRoot":"","sources":["../../src/trace/gate-file.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGnD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAyBvC,iFAAiF;AACjF,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,CAAC;AACjC,MAAM,QAAQ,GAAG,GAAG,CAAC;AACrB,MAAM,SAAS,GAAG,IAAI,CAAC;AAEvB,MAAM,EAAE,GAAG,GAAc,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAc,CAAC;AAC7E,MAAM,MAAM,GAAG,GAAkB,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,aAAa,CAAkB,CAAC;AAE7F,gFAAgF;AAChF,MAAM,UAAU,aAAa,CAAC,MAAyB,OAAO,CAAC,GAAG;IAChE,OAAO,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC9E,CAAC;AAED,4FAA4F;AAC5F,SAAS,MAAM,CAAC,SAAiB;IAC/B,IAAI,sCAAsC,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAC7E,OAAO,KAAK,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AACnG,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,WAAW,CAAC,SAAiB,EAAE,MAAc,EAAE,MAAyB,OAAO,CAAC,GAAG;IACjG,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,SAAiB,EAAE,MAAyB,OAAO,CAAC,GAAG;IAClF,OAAO,WAAW,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,QAAQ,CAAC,SAAiB,EAAE,GAAsB;IACzD,OAAO,WAAW,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;AACpD,CAAC;AAED;;;;GAIG;AACH,SAAS,UAAU,CAAC,GAAW;IAC7B,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC;IACf,IAAI,CAAC;QACH,IAAI,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE;YAAE,OAAO;IAChD,CAAC;IAAC,MAAM,CAAC,CAAC,yBAAyB,CAAC,CAAC;IACrC,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC;IACtB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,CAAC,UAAU,KAAK,SAAS;QAAE,OAAO;IACvE,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;QAC7E,IAAI,CAAC;YAAC,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAAC,CAAC;gBAAS,CAAC;YAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,6EAA6E;QAC7E,IAAK,CAA2B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO;QAC3D,IAAI,CAAC;YAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE;gBAAE,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,wBAAwB,CAAC,CAAC;IAC7G,CAAC;AACH,CAAC;AAED,iCAAiC;AACjC,SAAS,UAAU,CAAC,IAAY,EAAE,IAAY;IAC5C,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC;IACf,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1B,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;IACnF,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC;YACH,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACxB,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACxB,CAAC;gBAAS,CAAC;YACT,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QACD,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC;YAAC,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,wBAAwB,CAAC,CAAC;QAC1E,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAED,MAAM,KAAK,GAAG,CAAC,CAAU,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;AACjE,MAAM,SAAS,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC;AAEtE,SAAS,UAAU,CAAC,CAAU;IAC5B,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9C,MAAM,CAAC,GAAG,CAAc,CAAC;IACzB,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;WAChH,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;AACtF,CAAC;AAED,SAAS,SAAS,CAAC,CAAU;IAC3B,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAClE,MAAM,CAAC,GAAG,CAAa,CAAC;IACxB,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACrF,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;AACtJ,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,YAAY,CAAC,SAAiB,EAAE,MAAyB,OAAO,CAAC,GAAG;IAClF,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC1C,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,GAAG,cAAc;YAAE,OAAO,IAAI,CAAC;QAC1D,MAAM,CAAC,GAAY,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAC5D,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,mFAAmF;AACnF,SAAS,QAAQ,CAAC,KAAe,EAAE,KAA+C;IAChF,MAAM,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IAC/G,MAAM,GAAG,GAAgB,EAAE,CAAC;IAC5B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAE,CAAC;QAChC,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAChD,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC;YAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;YACpF,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IACxG,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,SAAS,GAAG,CAAC,CAAY,EAAE,CAAY,EAAE,EAAE,CAC/C,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC;AAE1I,iJAAiJ;AACjJ,MAAM,UAAU,aAAa,CAAC,SAAiB,EAAE,EAAqB,EAAE,MAAyB,OAAO,CAAC,GAAG;IAC1G,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACzC,MAAM,IAAI,GAAqB,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAC3E,MAAM,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACtD,MAAM,IAAI,GAAG,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACzD,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACzJ,CAAC,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpG,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC1K,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,IAAI,CAAC;YAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;QACxE,OAAO;IACT,CAAC;IACD,gFAAgF;IAChF,IAAI,IAAI,GAAa,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;IACrD,IAAI,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxE,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IACD,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,OAAO,CAAC,SAAiB,EAAE,GAAsB,EAAE,MAAgC;IAC1F,MAAM,CAAC,GAAG,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACvC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,UAAU,CAAC,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,SAAiB,EAAE,KAAa,EAAE,KAAa,EAAE,SAAiB,EAAE,GAAS,EAAE,MAAyB,OAAO,CAAC,GAAG,EAAE,IAAa;IAC1J,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE;QAC5B,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC1B,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,CAAC,cAAc,GAAG,SAAS,CAAC;QAClC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,MAAM,CAAC,SAAS,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,CAAC;AACrB,MAAM,WAAW,GAAG,CAAC,CAAU,EAAY,EAAE,CAC3C,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC;AAEhK,wHAAwH;AACxH,MAAM,UAAU,UAAU,CAAC,SAAiB,EAAE,KAAa,EAAE,IAAY,EAAE,GAAS,EAAE,MAAyB,OAAO,CAAC,GAAG;IACxH,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE;QAC5B,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;QAChD,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QACrF,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,CAAC;QACzH,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,UAAU,CAAC,SAAiB,EAAE,MAAyB,OAAO,CAAC,GAAG;IAChF,MAAM,CAAC,GAAG,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACvC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACtG,CAAC;AAED;sHACsH;AACtH,MAAM,UAAU,YAAY,CAAC,SAAiB,EAAE,SAAiB,EAAE,GAAS,EAAE,MAAyB,OAAO,CAAC,GAAG;IAChH,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7B,OAAO,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE;QACnC,IAAI,GAAG,GAAG,KAAK,CAAC;QAChB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI;YAAE,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;gBACnD,IAAI,GAAG,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;oBAAC,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;oBAAC,GAAG,GAAG,IAAI,CAAC;gBAAC,CAAC;YAC3F,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,IAAc,EAAE,MAAyB,OAAO,CAAC,GAAG;IACpG,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC;IACf,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACtC,MAAM,KAAK,GAAa,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;IACnG,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;QAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC3E,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1B,0GAA0G;IAC1G,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC;IAC5E,IAAI,EAAU,CAAC;IACf,IAAI,CAAC;QACH,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,CAAC,UAAU,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC/F,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,iEAAiE;QACjE,IAAK,CAA2B,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO;QAC1D,MAAM,CAAC,CAAC;IACV,CAAC;IACD,IAAI,CAAC;QACH,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;YAAE,OAAO;QACtC,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACxB,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;YAAS,CAAC;QACT,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,CAAU;IACxB,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACjE,MAAM,CAAC,GAAG,CAA4B,CAAC;IACvC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACxF,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAC5I,CAAC;AAED,8GAA8G;AAC9G,MAAM,UAAU,aAAa,CAAC,SAAiB,EAAE,MAAyB,OAAO,CAAC,GAAG;IACnF,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC;IACf,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC;IACtF,IAAI,CAAC;QACH,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAe,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7D,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE,SAAS;YAC3B,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBACnC,IAAI,CAAC;oBAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACrB,CAAC;YAAC,MAAM,CAAC,CAAC,8BAA8B,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,wBAAwB,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,YAAY,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC/D,IAAI,CAAC;QACH,MAAM,CAAC,GAAY,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,eAAe,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QACpG,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAK,CAA0B,CAAC,MAAM,KAAK,IAAI,CAAC;IAC1G,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** J16's words, then the way out (R29), as information about the denied command (D88). */
|
|
2
|
+
export declare const SURE_FAIL_REASON: string;
|
|
3
|
+
/**
|
|
4
|
+
* Where `timeout` lives when the hook's PATH is narrower than the shell's (4.11 step 3, R29). `$HOME` is env.HOME,
|
|
5
|
+
* `$USER` env.USER. Review: nix-darwin's per-user profile joins 4.11's list. /usr/bin and /bin stay out: a hook's
|
|
6
|
+
* PATH always holds them, and on Linux (where coreutils puts timeout there) they would hide the deny path from CI.
|
|
7
|
+
*/
|
|
8
|
+
export declare const FIXED_DIRS: readonly string[];
|
|
9
|
+
/** The PATH's folders, split on the platform's delimiter (';' on Windows), absolute ones only. */
|
|
10
|
+
export declare function pathDirs(env: NodeJS.ProcessEnv): string[];
|
|
11
|
+
/** The file names a program can have: itself, and on Windows with each PATHEXT ending too (git.exe, npm.cmd). */
|
|
12
|
+
export declare function programFiles(name: string, env: NodeJS.ProcessEnv): string[];
|
|
13
|
+
/** PATH dirs from env, then the fixed folders of 4.11. */
|
|
14
|
+
export declare function timeoutOnPath(env: NodeJS.ProcessEnv): boolean;
|
|
15
|
+
/** Reads <trail home>/learnings/no-timeout.md (under 1 KB) when it exists. Deny only when sure (4.11). */
|
|
16
|
+
export declare function sureFail(command: string, env: NodeJS.ProcessEnv): {
|
|
17
|
+
deny: string;
|
|
18
|
+
check: 'no-timeout';
|
|
19
|
+
} | null;
|
|
20
|
+
/** Appends {at, restSha} to sessions/<id>.denied.jsonl (O_APPEND, 0600, 4 KB cap) for the avoided credit. */
|
|
21
|
+
export declare function markDenied(sessionId: string, command: string, env: NodeJS.ProcessEnv, now?: Date): void;
|
|
22
|
+
//# sourceMappingURL=guard-fast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard-fast.d.ts","sourceRoot":"","sources":["../../src/trace/guard-fast.ts"],"names":[],"mappings":"AAuBA,0FAA0F;AAC1F,eAAO,MAAM,gBAAgB,QAG2E,CAAC;AAEzG;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,SAAS,MAAM,EAKtC,CAAC;AAmFH,kGAAkG;AAClG,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,EAAE,CAEzD;AAED,iHAAiH;AACjH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,EAAE,CAI3E;AAkBD,0DAA0D;AAC1D,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAW7D;AAED,0GAA0G;AAC1G,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,GAAG,IAAI,CAU9G;AAED,6GAA6G;AAC7G,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,GAAE,IAAiB,GAAG,IAAI,CAsBnH"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The sure-fail guardrail on the PreToolUse fast path (design 4.11): when
|
|
3
|
+
* the person kept the no-timeout guardrail, a `timeout N ...` command is
|
|
4
|
+
* denied, but only when no `timeout` program exists on this machine, so the
|
|
5
|
+
* command would fail anyway. Nothing else is ever denied here, and anything
|
|
6
|
+
* odd (no file, a retired or edited one, a read that throws) allows.
|
|
7
|
+
*
|
|
8
|
+
* The caller decides whether skills are on (0 rule 1); this file only reads
|
|
9
|
+
* `<trail home>/learnings/no-timeout.md` (one small file, R56).
|
|
10
|
+
*
|
|
11
|
+
* Fast-path safe (0 rule 8): static imports are node:path, node:os and the
|
|
12
|
+
* shell lexer files already on the path; node:fs and node:crypto come from
|
|
13
|
+
* `process.getBuiltinModule`. TRAIL_HOME is resolved as gate-file.ts does.
|
|
14
|
+
*/
|
|
15
|
+
import { homedir, userInfo } from 'node:os';
|
|
16
|
+
import { delimiter, dirname, isAbsolute, join } from 'node:path';
|
|
17
|
+
import { sessionPath, trailHomeFast } from './gate-file.js';
|
|
18
|
+
import { normalizeCommand, stripTimeout } from './shell.js';
|
|
19
|
+
import { afterTimeout, simpleCommands } from './shell-words.js';
|
|
20
|
+
import { ASSIGN, words } from './shell-scan.js';
|
|
21
|
+
/** J16's words, then the way out (R29), as information about the denied command (D88). */
|
|
22
|
+
export const SURE_FAIL_REASON = '[trail] Trail, the tool this person installed, stopped this command before it ran: '
|
|
23
|
+
+ 'this Mac has no timeout program (a guardrail this person kept), so it would fail with "timeout: command not found". '
|
|
24
|
+
+ "The usual fix is the same command without timeout, using the Bash tool's own timeout parameter or run_in_background. "
|
|
25
|
+
+ 'If timeout is installed here now, the person can drop this guardrail with trail forget no-timeout.';
|
|
26
|
+
/**
|
|
27
|
+
* Where `timeout` lives when the hook's PATH is narrower than the shell's (4.11 step 3, R29). `$HOME` is env.HOME,
|
|
28
|
+
* `$USER` env.USER. Review: nix-darwin's per-user profile joins 4.11's list. /usr/bin and /bin stay out: a hook's
|
|
29
|
+
* PATH always holds them, and on Linux (where coreutils puts timeout there) they would hide the deny path from CI.
|
|
30
|
+
*/
|
|
31
|
+
export const FIXED_DIRS = Object.freeze([
|
|
32
|
+
'/opt/homebrew/bin', '/usr/local/bin', '/opt/homebrew/opt/coreutils/libexec/gnubin', '/usr/local/opt/coreutils/libexec/gnubin',
|
|
33
|
+
'/opt/local/bin', '/opt/local/libexec/gnubin', '$HOME/.nix-profile/bin', '/run/current-system/sw/bin',
|
|
34
|
+
'/nix/var/nix/profiles/default/bin', '$HOME/bin', '$HOME/.local/bin',
|
|
35
|
+
'/etc/profiles/per-user/$USER/bin',
|
|
36
|
+
]);
|
|
37
|
+
const MAX_FILE = 4 * 1024;
|
|
38
|
+
/** A longer command is allowed unread: the deny is only for when Trail is sure, and parsing 2 MB took 150 ms here. */
|
|
39
|
+
const MAX_COMMAND = 64 * 1024;
|
|
40
|
+
const MAX_DENIED = 4 * 1024;
|
|
41
|
+
const fs = () => process.getBuiltinModule('node:fs');
|
|
42
|
+
const crypto = () => process.getBuiltinModule('node:crypto');
|
|
43
|
+
/** A front-matter value: quotes and padding gone, lower case. */
|
|
44
|
+
const value = (raw) => raw.trim().replace(/^(['"])(.*)\1$/, '$2').trim().toLowerCase();
|
|
45
|
+
/** The guardrail file says: active, check no-timeout, enforce sure-fail (2.5). Anything else, or a read error: false. */
|
|
46
|
+
function guardrailKept(env) {
|
|
47
|
+
const f = fs();
|
|
48
|
+
let text;
|
|
49
|
+
try {
|
|
50
|
+
const path = join(trailHomeFast(env), 'learnings', 'no-timeout.md');
|
|
51
|
+
// O_NONBLOCK: a FIFO planted here would otherwise hold the hook until its 5 s run out.
|
|
52
|
+
const fd = f.openSync(path, f.constants.O_RDONLY | (f.constants.O_NOFOLLOW ?? 0) | (f.constants.O_NONBLOCK ?? 0));
|
|
53
|
+
try {
|
|
54
|
+
const st = f.fstatSync(fd);
|
|
55
|
+
if (!st.isFile() || st.size > MAX_FILE)
|
|
56
|
+
return false;
|
|
57
|
+
const buf = Buffer.alloc(st.size);
|
|
58
|
+
const n = f.readSync(fd, buf, 0, st.size, 0);
|
|
59
|
+
text = buf.toString('utf8', 0, n);
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
f.closeSync(fd);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
const m = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/.exec(text);
|
|
69
|
+
if (!m)
|
|
70
|
+
return false;
|
|
71
|
+
const fm = {};
|
|
72
|
+
for (const line of m[1].split(/\r?\n/)) {
|
|
73
|
+
const kv = /^([a-z]+):(.*)$/.exec(line);
|
|
74
|
+
if (kv)
|
|
75
|
+
fm[kv[1]] = value(kv[2]);
|
|
76
|
+
}
|
|
77
|
+
return (fm.status ?? 'active') === 'active' && fm.check === 'no-timeout' && fm.enforce === 'sure-fail';
|
|
78
|
+
}
|
|
79
|
+
/** The words of a simple command after env prefixes (`A=1`, `env [-i] [-u N] A=1`). */
|
|
80
|
+
function afterEnv(simple) {
|
|
81
|
+
let w = words(simple);
|
|
82
|
+
while (w.length && ASSIGN.test(w[0]))
|
|
83
|
+
w = w.slice(1);
|
|
84
|
+
if (w[0] === 'env') {
|
|
85
|
+
let i = 1;
|
|
86
|
+
while (i < w.length && (w[i].startsWith('-') || ASSIGN.test(w[i])))
|
|
87
|
+
i += /^-[uCS]$/.test(w[i]) ? 2 : 1;
|
|
88
|
+
w = w.slice(i);
|
|
89
|
+
}
|
|
90
|
+
return w;
|
|
91
|
+
}
|
|
92
|
+
/** `timeout() {`, `function timeout`, `alias timeout=` anywhere in the command: its own timeout, so not sure (R29). */
|
|
93
|
+
const OWN_TIMEOUT = /(?:^|[\s;&|({])(?:timeout\s*\(\s*\)|function\s+timeout\b|alias\s+(?:-\S+\s+)*['"]?timeout=)/;
|
|
94
|
+
/**
|
|
95
|
+
* The command may find a `timeout` the hook can't see: it changes PATH, or loads the person's shell setup
|
|
96
|
+
* (`source`, `.`, `eval`, `hash`), whose PATH, alias or function Trail can't read. Not sure, so allow.
|
|
97
|
+
*/
|
|
98
|
+
const CHANGES_LOOKUP = /(?:^|[\s;&|({`])(?:(?:export|typeset|declare|local|readonly)\s+(?:-\S+\s+)*)?(?:PATH|path)\+?=|(?:^|[\s;&|({`])(?:source|eval|hash|rehash)(?:\s|$)|(?:^|[\s;&|({`])\.\s+\S/;
|
|
99
|
+
/** How many simple commands run `timeout DURATION ...` (after env prefixes). `gtimeout` never. */
|
|
100
|
+
function timeoutRuns(command) {
|
|
101
|
+
let n = 0;
|
|
102
|
+
for (const s of simpleCommands(command)) {
|
|
103
|
+
const w = afterEnv(s);
|
|
104
|
+
if (w[0] === 'timeout' && afterTimeout(w) !== null)
|
|
105
|
+
n++;
|
|
106
|
+
}
|
|
107
|
+
return n;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Sure only when every `timeout` in the command is one of those runs. Any other (`command -v timeout &&`,
|
|
111
|
+
* `which timeout`, `[[ -x …/timeout ]]`, `ln -s … ~/bin/timeout`, a function or alias) means the command looks for
|
|
112
|
+
* one, falls back, or puts one in place: it may well not fail, so it is allowed (R29).
|
|
113
|
+
*/
|
|
114
|
+
function onlyRunsTimeout(command) {
|
|
115
|
+
const runs = timeoutRuns(command);
|
|
116
|
+
return runs > 0 && (command.match(/\btimeout\b/g) ?? []).length === runs;
|
|
117
|
+
}
|
|
118
|
+
/** The PATH's folders, split on the platform's delimiter (';' on Windows), absolute ones only. */
|
|
119
|
+
export function pathDirs(env) {
|
|
120
|
+
return String(env.PATH ?? '').split(delimiter).filter((d) => d !== '' && isAbsolute(d));
|
|
121
|
+
}
|
|
122
|
+
/** The file names a program can have: itself, and on Windows with each PATHEXT ending too (git.exe, npm.cmd). */
|
|
123
|
+
export function programFiles(name, env) {
|
|
124
|
+
if (process.platform !== 'win32')
|
|
125
|
+
return [name];
|
|
126
|
+
const exts = String(env.PATHEXT || '.COM;.EXE;.BAT;.CMD').split(';').map((e) => e.trim().toLowerCase()).filter((e) => /^\.[a-z0-9]{1,8}$/.test(e));
|
|
127
|
+
return [name, ...exts.map((e) => name + e)];
|
|
128
|
+
}
|
|
129
|
+
/** An executable regular file at `dir/timeout` (on Windows, which has no exec bit, any timeout.exe and the like). */
|
|
130
|
+
function executableIn(dir, env) {
|
|
131
|
+
if (!dir)
|
|
132
|
+
return false;
|
|
133
|
+
const f = fs();
|
|
134
|
+
return programFiles('timeout', env).some((name) => {
|
|
135
|
+
try {
|
|
136
|
+
const p = join(dir, name);
|
|
137
|
+
if (!f.statSync(p).isFile())
|
|
138
|
+
return false;
|
|
139
|
+
f.accessSync(p, f.constants.X_OK);
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
/** PATH dirs from env, then the fixed folders of 4.11. */
|
|
148
|
+
export function timeoutOnPath(env) {
|
|
149
|
+
const home = env.HOME || homedir();
|
|
150
|
+
let user = env.USER || env.LOGNAME || '';
|
|
151
|
+
if (!user)
|
|
152
|
+
try {
|
|
153
|
+
user = userInfo().username;
|
|
154
|
+
}
|
|
155
|
+
catch { /* none */ }
|
|
156
|
+
const dirs = pathDirs(env);
|
|
157
|
+
for (const d of FIXED_DIRS) {
|
|
158
|
+
if (d.startsWith('$HOME'))
|
|
159
|
+
dirs.push(join(home, d.slice('$HOME'.length)));
|
|
160
|
+
else if (d.includes('$USER')) {
|
|
161
|
+
if (/^[\w.-]{1,64}$/.test(user))
|
|
162
|
+
dirs.push(d.replace('$USER', user));
|
|
163
|
+
}
|
|
164
|
+
else
|
|
165
|
+
dirs.push(d);
|
|
166
|
+
}
|
|
167
|
+
return [...new Set(dirs)].some((d) => executableIn(d, env));
|
|
168
|
+
}
|
|
169
|
+
/** Reads <trail home>/learnings/no-timeout.md (under 1 KB) when it exists. Deny only when sure (4.11). */
|
|
170
|
+
export function sureFail(command, env) {
|
|
171
|
+
try {
|
|
172
|
+
if (typeof command !== 'string' || command.length > MAX_COMMAND || !/\btimeout\b/.test(command))
|
|
173
|
+
return null;
|
|
174
|
+
if (!onlyRunsTimeout(command) || OWN_TIMEOUT.test(command) || CHANGES_LOOKUP.test(command))
|
|
175
|
+
return null;
|
|
176
|
+
if (!guardrailKept(env))
|
|
177
|
+
return null;
|
|
178
|
+
if (timeoutOnPath(env))
|
|
179
|
+
return null;
|
|
180
|
+
return { deny: SURE_FAIL_REASON, check: 'no-timeout' };
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/** Appends {at, restSha} to sessions/<id>.denied.jsonl (O_APPEND, 0600, 4 KB cap) for the avoided credit. */
|
|
187
|
+
export function markDenied(sessionId, command, env, now = new Date()) {
|
|
188
|
+
try {
|
|
189
|
+
const f = fs();
|
|
190
|
+
const path = sessionPath(String(sessionId), '.denied.jsonl', env);
|
|
191
|
+
const rest = normalizeCommand(stripTimeout(String(command ?? '')));
|
|
192
|
+
const line = `${JSON.stringify({ at: now.toISOString(), restSha: `sha256:${crypto().createHash('sha256').update(rest).digest('hex')}` })}\n`;
|
|
193
|
+
const dir = dirname(path);
|
|
194
|
+
f.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
195
|
+
const { O_WRONLY, O_APPEND, O_CREAT, O_NOFOLLOW, O_NONBLOCK } = f.constants;
|
|
196
|
+
// O_NONBLOCK: a FIFO planted here would otherwise hold the hook until its 5 s run out (with no reader, ENXIO).
|
|
197
|
+
const fd = f.openSync(path, O_WRONLY | O_APPEND | O_CREAT | (O_NOFOLLOW ?? 0) | (O_NONBLOCK ?? 0), 0o600);
|
|
198
|
+
try {
|
|
199
|
+
const st = f.fstatSync(fd);
|
|
200
|
+
if (!st.isFile() || st.size + Buffer.byteLength(line) > MAX_DENIED)
|
|
201
|
+
return;
|
|
202
|
+
f.fchmodSync(fd, 0o600);
|
|
203
|
+
f.writeSync(fd, line);
|
|
204
|
+
}
|
|
205
|
+
finally {
|
|
206
|
+
f.closeSync(fd);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
/* the avoided count is best effort */
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=guard-fast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard-fast.js","sourceRoot":"","sources":["../../src/trace/guard-fast.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** At most once an hour (state/housekeeping.json): pruneRunSheets; sessions/*.json and their .gate.json and
|
|
2
|
+
* .post.jsonl (and crash leftovers beside them) older than 30 days; receipts older than 1 day; held items shown more than 24 h ago;
|
|
3
|
+
* expired state/probes.json entries. */
|
|
4
|
+
export declare function housekeeping(now?: Date, env?: NodeJS.ProcessEnv): void;
|
|
5
|
+
//# sourceMappingURL=housekeeping.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"housekeeping.d.ts","sourceRoot":"","sources":["../../src/trace/housekeeping.ts"],"names":[],"mappings":"AAkEA;;yCAEyC;AACzC,wBAAgB,YAAY,CAAC,GAAG,GAAE,IAAiB,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,IAAI,CAelF"}
|