@nanonets/graft 0.23.1 → 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/README.md +4 -4
- package/dist/ai/crux.d.ts +31 -3
- package/dist/ai/crux.d.ts.map +1 -1
- package/dist/ai/crux.js +88 -10
- package/dist/ai/crux.js.map +1 -1
- package/dist/ai/llm/openai.d.ts +101 -0
- package/dist/ai/llm/openai.d.ts.map +1 -1
- package/dist/ai/llm/openai.js +396 -6
- package/dist/ai/llm/openai.js.map +1 -1
- package/dist/ai/llm/recover-tool.d.ts +2 -0
- package/dist/ai/llm/recover-tool.d.ts.map +1 -1
- package/dist/ai/llm/recover-tool.js +1 -1
- package/dist/ai/llm/recover-tool.js.map +1 -1
- package/dist/ai/synthesize.d.ts.map +1 -1
- package/dist/ai/synthesize.js +100 -1
- package/dist/ai/synthesize.js.map +1 -1
- 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/format.js +1 -1
- package/dist/claude/format.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/hooks.d.ts +0 -18
- package/dist/claude/hooks.d.ts.map +1 -1
- package/dist/claude/hooks.js +24 -77
- package/dist/claude/hooks.js.map +1 -1
- package/dist/claude/init.js +3 -3
- package/dist/claude/init.js.map +1 -1
- package/dist/claude/note-signals.d.ts +28 -0
- package/dist/claude/note-signals.d.ts.map +1 -0
- package/dist/claude/note-signals.js +325 -0
- package/dist/claude/note-signals.js.map +1 -0
- package/dist/claude/shim-template.d.ts.map +1 -1
- package/dist/claude/shim-template.js +10 -4
- package/dist/claude/shim-template.js.map +1 -1
- package/dist/claude/skill-template.d.ts.map +1 -1
- package/dist/claude/skill-template.js +49 -18
- package/dist/claude/skill-template.js.map +1 -1
- 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/claude/state.d.ts +4 -3
- package/dist/claude/state.d.ts.map +1 -1
- package/dist/claude/state.js.map +1 -1
- package/dist/claude/sync-run.js +1 -1
- package/dist/claude/sync-run.js.map +1 -1
- package/dist/cli-picker.d.ts +36 -5
- package/dist/cli-picker.d.ts.map +1 -1
- package/dist/cli-picker.js +60 -13
- package/dist/cli-picker.js.map +1 -1
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +406 -64
- 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/context/batches.d.ts +29 -0
- package/dist/context/batches.d.ts.map +1 -0
- package/dist/context/batches.js +130 -0
- package/dist/context/batches.js.map +1 -0
- package/dist/context/build.d.ts +7 -2
- package/dist/context/build.d.ts.map +1 -1
- package/dist/context/build.js +84 -50
- package/dist/context/build.js.map +1 -1
- package/dist/context/node-file.d.ts.map +1 -1
- package/dist/context/node-file.js +41 -4
- package/dist/context/node-file.js.map +1 -1
- package/dist/engine.d.ts +2 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +1 -0
- package/dist/engine.js.map +1 -1
- package/dist/graph/cards.d.ts.map +1 -1
- package/dist/graph/cards.js +9 -4
- package/dist/graph/cards.js.map +1 -1
- package/dist/graph/enrich.d.ts.map +1 -1
- package/dist/graph/enrich.js +8 -3
- package/dist/graph/enrich.js.map +1 -1
- package/dist/graph/generic.d.ts.map +1 -1
- package/dist/graph/generic.js +207 -6
- package/dist/graph/generic.js.map +1 -1
- package/dist/graph/lsp/client.d.ts +18 -0
- package/dist/graph/lsp/client.d.ts.map +1 -1
- package/dist/graph/lsp/client.js +40 -2
- package/dist/graph/lsp/client.js.map +1 -1
- package/dist/graph/lsp/enrich.d.ts.map +1 -1
- package/dist/graph/lsp/enrich.js +9 -1
- package/dist/graph/lsp/enrich.js.map +1 -1
- package/dist/graph/lsp/registry.d.ts +7 -0
- package/dist/graph/lsp/registry.d.ts.map +1 -1
- package/dist/graph/lsp/registry.js +27 -2
- package/dist/graph/lsp/registry.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/graph/queries/gleam.scm +51 -0
- package/dist/graph/resolve.d.ts.map +1 -1
- package/dist/graph/resolve.js +65 -3
- package/dist/graph/resolve.js.map +1 -1
- package/dist/graph/workspace-cli.d.ts +2 -0
- package/dist/graph/workspace-cli.d.ts.map +1 -1
- package/dist/graph/workspace-cli.js +1 -1
- package/dist/graph/workspace-cli.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/branches.d.ts +7 -1
- package/dist/notes/branches.d.ts.map +1 -1
- package/dist/notes/branches.js +31 -3
- package/dist/notes/branches.js.map +1 -1
- package/dist/notes/cold-start.d.ts +42 -3
- package/dist/notes/cold-start.d.ts.map +1 -1
- package/dist/notes/cold-start.js +144 -24
- package/dist/notes/cold-start.js.map +1 -1
- package/dist/notes/credit.d.ts +37 -0
- package/dist/notes/credit.d.ts.map +1 -0
- package/dist/notes/credit.js +78 -0
- package/dist/notes/credit.js.map +1 -0
- 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/find-notes.d.ts +17 -0
- package/dist/notes/find-notes.d.ts.map +1 -0
- package/dist/notes/find-notes.js +48 -0
- package/dist/notes/find-notes.js.map +1 -0
- package/dist/notes/flatten.d.ts +31 -0
- package/dist/notes/flatten.d.ts.map +1 -0
- package/dist/notes/flatten.js +73 -0
- package/dist/notes/flatten.js.map +1 -0
- package/dist/notes/git-facts.d.ts +2 -0
- package/dist/notes/git-facts.d.ts.map +1 -1
- package/dist/notes/git-facts.js +6 -0
- package/dist/notes/git-facts.js.map +1 -1
- 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/home.d.ts +24 -6
- package/dist/notes/home.d.ts.map +1 -1
- package/dist/notes/home.js +82 -15
- package/dist/notes/home.js.map +1 -1
- package/dist/notes/learning-fields.d.ts +102 -0
- package/dist/notes/learning-fields.d.ts.map +1 -0
- package/dist/notes/learning-fields.js +214 -0
- package/dist/notes/learning-fields.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/memory-notes.d.ts +71 -0
- package/dist/notes/memory-notes.d.ts.map +1 -0
- package/dist/notes/memory-notes.js +239 -0
- package/dist/notes/memory-notes.js.map +1 -0
- package/dist/notes/note-gate.d.ts +42 -0
- package/dist/notes/note-gate.d.ts.map +1 -0
- package/dist/notes/note-gate.js +181 -0
- package/dist/notes/note-gate.js.map +1 -0
- package/dist/notes/notes.d.ts +29 -85
- package/dist/notes/notes.d.ts.map +1 -1
- package/dist/notes/notes.js +69 -254
- package/dist/notes/notes.js.map +1 -1
- package/dist/notes/pr-reviews.d.ts +35 -7
- package/dist/notes/pr-reviews.d.ts.map +1 -1
- package/dist/notes/pr-reviews.js +156 -46
- package/dist/notes/pr-reviews.js.map +1 -1
- 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/notes/secrets.d.ts +28 -0
- package/dist/notes/secrets.d.ts.map +1 -0
- package/dist/notes/secrets.js +362 -0
- package/dist/notes/secrets.js.map +1 -0
- package/dist/notes/targets.d.ts +37 -0
- package/dist/notes/targets.d.ts.map +1 -0
- package/dist/notes/targets.js +108 -0
- package/dist/notes/targets.js.map +1 -0
- package/dist/notes/team-check.d.ts +22 -0
- package/dist/notes/team-check.d.ts.map +1 -0
- package/dist/notes/team-check.js +130 -0
- package/dist/notes/team-check.js.map +1 -0
- package/dist/notes/trail-home.d.ts +3 -0
- package/dist/notes/trail-home.d.ts.map +1 -0
- package/dist/notes/trail-home.js +12 -0
- package/dist/notes/trail-home.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/answers-prompt.d.ts +13 -0
- package/dist/skills/answers-prompt.d.ts.map +1 -0
- package/dist/skills/answers-prompt.js +83 -0
- package/dist/skills/answers-prompt.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/never-save.d.ts +5 -0
- package/dist/skills/never-save.d.ts.map +1 -0
- package/dist/skills/never-save.js +158 -0
- package/dist/skills/never-save.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/params.d.ts +39 -0
- package/dist/skills/params.d.ts.map +1 -0
- package/dist/skills/params.js +275 -0
- package/dist/skills/params.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/ran-less.d.ts +5 -0
- package/dist/skills/ran-less.d.ts.map +1 -0
- package/dist/skills/ran-less.js +51 -0
- package/dist/skills/ran-less.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/risk-delta.d.ts +32 -0
- package/dist/skills/risk-delta.d.ts.map +1 -0
- package/dist/skills/risk-delta.js +56 -0
- package/dist/skills/risk-delta.js.map +1 -0
- package/dist/skills/risk.d.ts +73 -0
- package/dist/skills/risk.d.ts.map +1 -0
- package/dist/skills/risk.js +396 -0
- package/dist/skills/risk.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/types.d.ts +422 -0
- package/dist/skills/types.d.ts.map +1 -0
- package/dist/skills/types.js +2 -0
- package/dist/skills/types.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/telemetry/contract.d.ts.map +1 -1
- package/dist/telemetry/contract.js +8 -6
- package/dist/telemetry/contract.js.map +1 -1
- package/dist/telemetry/notice.d.ts.map +1 -1
- package/dist/telemetry/notice.js +3 -1
- package/dist/telemetry/notice.js.map +1 -1
- package/dist/trace/check-reads.d.ts +36 -0
- package/dist/trace/check-reads.d.ts.map +1 -0
- package/dist/trace/check-reads.js +57 -0
- package/dist/trace/check-reads.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/host.d.ts +40 -0
- package/dist/trace/host.d.ts.map +1 -0
- package/dist/trace/host.js +84 -0
- package/dist/trace/host.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/redact.d.ts +8 -0
- package/dist/trace/redact.d.ts.map +1 -0
- package/dist/trace/redact.js +63 -0
- package/dist/trace/redact.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/seen-cache.d.ts +9 -0
- package/dist/trace/seen-cache.d.ts.map +1 -0
- package/dist/trace/seen-cache.js +46 -0
- package/dist/trace/seen-cache.js.map +1 -0
- package/dist/trace/shell-scan.d.ts +52 -0
- package/dist/trace/shell-scan.d.ts.map +1 -0
- package/dist/trace/shell-scan.js +318 -0
- package/dist/trace/shell-scan.js.map +1 -0
- package/dist/trace/shell-words.d.ts +91 -0
- package/dist/trace/shell-words.d.ts.map +1 -0
- package/dist/trace/shell-words.js +558 -0
- package/dist/trace/shell-words.js.map +1 -0
- package/dist/trace/shell.d.ts +91 -0
- package/dist/trace/shell.d.ts.map +1 -0
- package/dist/trace/shell.js +435 -0
- package/dist/trace/shell.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/state.d.ts +27 -0
- package/dist/trace/state.d.ts.map +1 -0
- package/dist/trace/state.js +98 -0
- package/dist/trace/state.js.map +1 -0
- package/dist/trace/tamper-code.d.ts +9 -0
- package/dist/trace/tamper-code.d.ts.map +1 -0
- package/dist/trace/tamper-code.js +174 -0
- package/dist/trace/tamper-code.js.map +1 -0
- package/dist/trace/tamper-git.d.ts +12 -0
- package/dist/trace/tamper-git.d.ts.map +1 -0
- package/dist/trace/tamper-git.js +77 -0
- package/dist/trace/tamper-git.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/types.d.ts +477 -0
- package/dist/trace/types.d.ts.map +1 -0
- package/dist/trace/types.js +12 -0
- package/dist/trace/types.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-glob.d.ts +11 -0
- package/dist/trace/walls-glob.d.ts.map +1 -0
- package/dist/trace/walls-glob.js +264 -0
- package/dist/trace/walls-glob.js.map +1 -0
- package/dist/trace/walls-quoted.d.ts +25 -0
- package/dist/trace/walls-quoted.d.ts.map +1 -0
- package/dist/trace/walls-quoted.js +81 -0
- package/dist/trace/walls-quoted.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/upkeep.d.ts +1 -1
- package/dist/upkeep.d.ts.map +1 -1
- package/dist/upkeep.js +4 -1
- package/dist/upkeep.js.map +1 -1
- package/dist/util/actions-folder.d.ts +2 -0
- package/dist/util/actions-folder.d.ts.map +1 -0
- package/dist/util/actions-folder.js +9 -0
- package/dist/util/actions-folder.js.map +1 -0
- package/dist/util/front-matter.d.ts +31 -4
- package/dist/util/front-matter.d.ts.map +1 -1
- package/dist/util/front-matter.js +95 -3
- package/dist/util/front-matter.js.map +1 -1
- package/dist/util/private-file.d.ts +14 -0
- package/dist/util/private-file.d.ts.map +1 -0
- package/dist/util/private-file.js +82 -0
- package/dist/util/private-file.js.map +1 -0
- package/dist/util/private-fs.d.ts +25 -0
- package/dist/util/private-fs.d.ts.map +1 -0
- package/dist/util/private-fs.js +253 -0
- package/dist/util/private-fs.js.map +1 -0
- package/dist/util/state.d.ts.map +1 -1
- package/dist/util/state.js +3 -0
- package/dist/util/state.js.map +1 -1
- 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/dist/viewer/app.js +2 -2
- package/package.json +10 -7
- package/scripts/run-tests.mjs +14 -2
- package/scripts/stamp-telemetry-key.mjs +8 -5
- package/scripts/vendor-grammars.mjs +35 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The pool (design 2.3): for one repo, the days each job came back, kept in
|
|
3
|
+
* `~/.trail/repos/<key>/pool.json` beside phase 0's repo folder. A day is a
|
|
4
|
+
* session-day: the local date a run started on and the session's hash, with
|
|
5
|
+
* whether that run cost much (5+ tool calls or a failure). Job words from a
|
|
6
|
+
* fixed vocabulary and days only: no prompt text, no commands.
|
|
7
|
+
*
|
|
8
|
+
* Only jobs that can reach moment 2 are counted (release, ship, tests,
|
|
9
|
+
* report). A job is due an offer on its 3rd session-day in the last 45 days
|
|
10
|
+
* counting today (the 4th under the governor), at least 2 of them costly.
|
|
11
|
+
* Days older than that are dropped on every write.
|
|
12
|
+
*/
|
|
13
|
+
import { readdirSync, statSync } from 'node:fs';
|
|
14
|
+
import { join, relative, sep } from 'node:path';
|
|
15
|
+
import { localDate, readSettings } from '../skills/settings.js';
|
|
16
|
+
import { readJsonSafe, trailPath, withLock, writePrivate } from '../util/private-fs.js';
|
|
17
|
+
import { OFFER_FAMILIES } from './jobs.js';
|
|
18
|
+
/** The window: today and the 44 days before it. */
|
|
19
|
+
const WINDOW_DAYS = 45;
|
|
20
|
+
const MAX_WORDS = 12;
|
|
21
|
+
const DATE = /^\d{4}-\d{2}-\d{2}$/;
|
|
22
|
+
/** The first local date inside the 45-day window that ends today. */
|
|
23
|
+
function windowStart(now) {
|
|
24
|
+
const d = new Date(now.getFullYear(), now.getMonth(), now.getDate() - (WINDOW_DAYS - 1), 12);
|
|
25
|
+
return localDate(d);
|
|
26
|
+
}
|
|
27
|
+
const offerJob = (job) => Object.prototype.hasOwnProperty.call(OFFER_FAMILIES, job);
|
|
28
|
+
/** join(trailHome, 'repos', ...repoKey.split('/'), 'pool.json'): the same folder as repoPlace(..).dir. */
|
|
29
|
+
export function poolPath(repoKey, env) {
|
|
30
|
+
const parts = String(repoKey).split('/').filter((p) => p && p !== '.' && p !== '..');
|
|
31
|
+
return trailPath(env, 'repos', ...parts, 'pool.json');
|
|
32
|
+
}
|
|
33
|
+
function cleanEntry(v) {
|
|
34
|
+
if (!v || typeof v !== 'object' || Array.isArray(v))
|
|
35
|
+
return null;
|
|
36
|
+
const e = v;
|
|
37
|
+
const days = Array.isArray(e.days)
|
|
38
|
+
? e.days.filter((d) => !!d && typeof d.d === 'string' && DATE.test(d.d) && typeof d.s === 'string').map((d) => ({ d: d.d, s: d.s, costly: d.costly === true }))
|
|
39
|
+
: [];
|
|
40
|
+
return {
|
|
41
|
+
words: Array.isArray(e.words) ? e.words.filter((w) => typeof w === 'string').slice(0, MAX_WORDS) : [],
|
|
42
|
+
days,
|
|
43
|
+
lastGoodRun: typeof e.lastGoodRun === 'string' ? e.lastGoodRun : null,
|
|
44
|
+
lastSeen: typeof e.lastSeen === 'string' ? e.lastSeen : days.map((d) => d.d).sort().at(-1) ?? '',
|
|
45
|
+
shownAtInit: e.shownAtInit === true,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function parsePool(raw) {
|
|
49
|
+
const jobs = {};
|
|
50
|
+
const r = raw && typeof raw === 'object' && !Array.isArray(raw) ? raw : {};
|
|
51
|
+
if (r.jobs && typeof r.jobs === 'object' && !Array.isArray(r.jobs)) {
|
|
52
|
+
for (const [job, v] of Object.entries(r.jobs)) {
|
|
53
|
+
const e = cleanEntry(v);
|
|
54
|
+
if (e && offerJob(job))
|
|
55
|
+
jobs[job] = e;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return { v: 1, jobs };
|
|
59
|
+
}
|
|
60
|
+
export function readPool(repoKey, env) {
|
|
61
|
+
return parsePool(readJsonSafe(poolPath(repoKey, env)));
|
|
62
|
+
}
|
|
63
|
+
/** Adds or updates the (d, s) day for a job (costly OR-ed), prunes days older than 45 and entries unseen for 45 days. Locked; null when the lock timed out. */
|
|
64
|
+
export function notePoolDay(repoKey, m, day, goodRun, env, now = new Date()) {
|
|
65
|
+
if (!offerJob(m.job) || !DATE.test(day.d))
|
|
66
|
+
return null;
|
|
67
|
+
const path = poolPath(repoKey, env);
|
|
68
|
+
const from = windowStart(now);
|
|
69
|
+
const done = withLock(path, () => {
|
|
70
|
+
const raw = readJsonSafe(path);
|
|
71
|
+
const keep = raw && typeof raw === 'object' && !Array.isArray(raw) ? raw : {};
|
|
72
|
+
const pool = parsePool(raw);
|
|
73
|
+
const e = pool.jobs[m.job] ?? { words: [], days: [], lastGoodRun: null, lastSeen: day.d, shownAtInit: false };
|
|
74
|
+
for (const w of m.words)
|
|
75
|
+
if (e.words.length < MAX_WORDS && !e.words.includes(w))
|
|
76
|
+
e.words.push(w);
|
|
77
|
+
const same = e.days.find((x) => x.d === day.d && x.s === day.s);
|
|
78
|
+
if (same)
|
|
79
|
+
same.costly = same.costly || day.costly;
|
|
80
|
+
else
|
|
81
|
+
e.days.push({ d: day.d, s: day.s, costly: day.costly });
|
|
82
|
+
e.days.sort((a, b) => (a.d < b.d ? -1 : a.d > b.d ? 1 : 0));
|
|
83
|
+
if (goodRun)
|
|
84
|
+
e.lastGoodRun = goodRun;
|
|
85
|
+
if (day.d > e.lastSeen)
|
|
86
|
+
e.lastSeen = day.d;
|
|
87
|
+
pool.jobs[m.job] = e;
|
|
88
|
+
for (const [job, entry] of Object.entries(pool.jobs)) {
|
|
89
|
+
entry.days = entry.days.filter((x) => x.d >= from);
|
|
90
|
+
if (!entry.days.length || entry.lastSeen < from)
|
|
91
|
+
delete pool.jobs[job];
|
|
92
|
+
}
|
|
93
|
+
writePrivate(path, JSON.stringify({ ...keep, v: 1, jobs: pool.jobs }));
|
|
94
|
+
return pool.jobs[m.job] ?? null;
|
|
95
|
+
});
|
|
96
|
+
return done.ok ? done.value : null;
|
|
97
|
+
}
|
|
98
|
+
/** 3rd session-day in 45 days (4th when extraDay), at least 2 of them costly. */
|
|
99
|
+
export function repeatedEnough(e, extraDay, now = new Date()) {
|
|
100
|
+
const from = windowStart(now);
|
|
101
|
+
const today = localDate(now);
|
|
102
|
+
const days = e.days.filter((x) => x.d >= from && x.d <= today);
|
|
103
|
+
const sessionDays = new Set(days.map((x) => `${x.d}|${x.s}`)).size;
|
|
104
|
+
const costlyDays = new Set(days.filter((x) => x.costly).map((x) => `${x.d}|${x.s}`)).size;
|
|
105
|
+
const dates = new Set(days.map((x) => x.d)).size;
|
|
106
|
+
const need = extraDay ? 4 : 3;
|
|
107
|
+
return { ok: sessionDays >= need && costlyDays >= 2, sessionDays, dates, costlyDays, need };
|
|
108
|
+
}
|
|
109
|
+
/** The governor from the settings cache (4.13 step 7): 3 or more answers lately, fewer than 1 in 3 a yes. */
|
|
110
|
+
function governorOn(env) {
|
|
111
|
+
const nine = readSettings(env).lastNine;
|
|
112
|
+
return nine.length >= 3 && nine.filter((a) => a === 'yes').length * 3 < nine.length;
|
|
113
|
+
}
|
|
114
|
+
/** Every pool.json under `dir`, as repo keys (the folders between `repos/` and the file). */
|
|
115
|
+
function poolKeys(root, dir, depth, out) {
|
|
116
|
+
if (depth > 6)
|
|
117
|
+
return;
|
|
118
|
+
let names;
|
|
119
|
+
try {
|
|
120
|
+
names = readdirSync(dir);
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
for (const name of names) {
|
|
126
|
+
const p = join(dir, name);
|
|
127
|
+
if (name === 'pool.json')
|
|
128
|
+
out.push(relative(root, dir).split(sep).join('/'));
|
|
129
|
+
else if (!name.startsWith('.')) {
|
|
130
|
+
try {
|
|
131
|
+
if (statSync(p).isDirectory())
|
|
132
|
+
poolKeys(root, p, depth + 1, out);
|
|
133
|
+
}
|
|
134
|
+
catch { /* gone */ }
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/** Every job counted in the last 45 days, every repo, for `trail skills` (2.10). */
|
|
139
|
+
export function watching(env, now = new Date()) {
|
|
140
|
+
const root = trailPath(env, 'repos');
|
|
141
|
+
const keys = [];
|
|
142
|
+
poolKeys(root, root, 0, keys);
|
|
143
|
+
const extra = keys.length ? governorOn(env) : false;
|
|
144
|
+
const out = [];
|
|
145
|
+
for (const repoKey of keys.filter(Boolean)) {
|
|
146
|
+
for (const [job, e] of Object.entries(readPool(repoKey, env).jobs)) {
|
|
147
|
+
const v = repeatedEnough(e, extra, now);
|
|
148
|
+
if (v.sessionDays > 0)
|
|
149
|
+
out.push({ repoKey, job, sessionDays: v.sessionDays, costlyDays: v.costlyDays, need: v.need });
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return out;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../../src/trace/pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** The fold-time secret rule (4.10). */
|
|
2
|
+
export declare function redactSecrets(cmd: string): {
|
|
3
|
+
cmd: string | null;
|
|
4
|
+
secret?: 'named' | 'refused';
|
|
5
|
+
};
|
|
6
|
+
/** flatLine(text, max), or undefined when secretReason finds anything in it. */
|
|
7
|
+
export declare function cleanLine(text: string, max: number): string | undefined;
|
|
8
|
+
//# sourceMappingURL=redact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../../src/trace/redact.ts"],"names":[],"mappings":"AAyBA,wCAAwC;AACxC,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAAE,CAwB/F;AAED,gFAAgF;AAChF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKvE"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The fold-time secret rule (design 4.10). A command that ran is kept only in
|
|
3
|
+
* a form with no secret in it: a secret assigned to a name (`NPM_TOKEN=…`,
|
|
4
|
+
* `--token …`) becomes `${NAME:?set NAME}`, which still runs and says what to
|
|
5
|
+
* set; anything else secret-shaped makes the whole command unusable, stored
|
|
6
|
+
* as null. Nothing secret-shaped reaches `sessions/`, `runs/`, marks or a
|
|
7
|
+
* skill.
|
|
8
|
+
*
|
|
9
|
+
* A named value ends where the shell word ends (`;`, `&&`, `|` stay put), and
|
|
10
|
+
* its placeholder is always double-quoted so it expands. A command over 2,000
|
|
11
|
+
* characters is never compiled (the fold marks it truncated), so it is stored
|
|
12
|
+
* as null without a look.
|
|
13
|
+
*/
|
|
14
|
+
import { flatLine } from '../notes/flatten.js';
|
|
15
|
+
import { secretReason } from '../notes/secrets.js';
|
|
16
|
+
const placeholder = (name) => `\${${name}:?set ${name}}`;
|
|
17
|
+
/** A value: quoted (anything but its quote), or a bare word (up to a space, a quote or a shell operator). */
|
|
18
|
+
const VALUE = String.raw `(?:'([^']*)'|"([^"]*)"|([^\s'"\x60;&|<>()]+))`;
|
|
19
|
+
const ASSIGNED = new RegExp(String.raw `\b([A-Z][A-Z0-9_]{2,})=${VALUE}`, 'g');
|
|
20
|
+
const FLAG = new RegExp(String.raw `--(token|password|api-key|apikey|secret|key)([= ])${VALUE}`, 'g');
|
|
21
|
+
const BEARER = /(\bBearer\s+)([^\s'"]+)/gi;
|
|
22
|
+
/** Commands longer than this are never compiled (4.1 `truncated`) and are not scanned. */
|
|
23
|
+
const MAX_SCANNED = 2000;
|
|
24
|
+
/** The fold-time secret rule (4.10). */
|
|
25
|
+
export function redactSecrets(cmd) {
|
|
26
|
+
const raw = String(cmd ?? '');
|
|
27
|
+
if (raw.length > MAX_SCANNED)
|
|
28
|
+
return { cmd: null, secret: 'refused' };
|
|
29
|
+
if (secretReason(raw) === null)
|
|
30
|
+
return { cmd: raw };
|
|
31
|
+
// Values assigned to a name, so a later `Bearer <value>` can take that name.
|
|
32
|
+
const named = new Map();
|
|
33
|
+
let out = raw.replace(ASSIGNED, (whole, name, sq, dq, bare) => {
|
|
34
|
+
const value = sq ?? dq ?? bare ?? '';
|
|
35
|
+
if (secretReason(`${name}=${value}`) === null && secretReason(value) === null)
|
|
36
|
+
return whole;
|
|
37
|
+
named.set(value, name);
|
|
38
|
+
// Double quotes, or none: a placeholder in single quotes would never expand.
|
|
39
|
+
return `${name}=${bare === undefined ? '"' : ''}${placeholder(name)}${bare === undefined ? '"' : ''}`;
|
|
40
|
+
});
|
|
41
|
+
out = out.replace(FLAG, (whole, flag, sep, sq, dq, bare) => {
|
|
42
|
+
const value = sq ?? dq ?? bare ?? '';
|
|
43
|
+
if (secretReason(`--${flag} ${value}`) === null && secretReason(value) === null)
|
|
44
|
+
return whole;
|
|
45
|
+
return `--${flag}${sep}"${placeholder(flag.toUpperCase().replace(/-/g, '_'))}"`;
|
|
46
|
+
});
|
|
47
|
+
out = out.replace(BEARER, (whole, lead, value) => {
|
|
48
|
+
const name = named.get(value);
|
|
49
|
+
return name ? `${lead}${placeholder(name)}` : whole;
|
|
50
|
+
});
|
|
51
|
+
if (out === raw || secretReason(out) !== null)
|
|
52
|
+
return { cmd: null, secret: 'refused' };
|
|
53
|
+
return { cmd: out, secret: 'named' };
|
|
54
|
+
}
|
|
55
|
+
/** flatLine(text, max), or undefined when secretReason finds anything in it. */
|
|
56
|
+
export function cleanLine(text, max) {
|
|
57
|
+
const raw = typeof text === 'string' ? text : '';
|
|
58
|
+
if (secretReason(raw) !== null)
|
|
59
|
+
return undefined;
|
|
60
|
+
const line = flatLine(raw, max);
|
|
61
|
+
return secretReason(line) === null ? line : undefined;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=redact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/trace/redact.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { FixDelta, RepairEvent, RunCall, RunState } from './types.js';
|
|
2
|
+
/** Where relativized delta text points: `$HOME` for home, `./` for the repo root (4.12 step 5). */
|
|
3
|
+
export interface RepairOpts {
|
|
4
|
+
home?: string;
|
|
5
|
+
root?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* A failure that never counts as a wall or a repair (4.12 step 1). `next` is the call right after it (or the
|
|
9
|
+
* retry), for the two rows about what followed: an identical retry that passed (a flake), and the same chain
|
|
10
|
+
* with its failing `&&` tail dropped. The other rows read the call alone, and also hold for an exit-0 call: a
|
|
11
|
+
* CI log read or a query is never a wall, failed or not.
|
|
12
|
+
*/
|
|
13
|
+
export declare function ignoredFailure(call: RunCall, next: RunCall | null): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* The delta between a failing call and its retry (4.12 step 4), with the enabling calls between them: enabling
|
|
16
|
+
* steps first (in the order they ran), then wrappers, env and flags. [] when there is none, when `retry` is not
|
|
17
|
+
* a passing retry of the same command, or when any part fails the secret or risk rules: [] means no repair.
|
|
18
|
+
*/
|
|
19
|
+
export declare function fixDelta(failed: RunCall, retry: RunCall, between: RunCall[], opts?: RepairOpts): FixDelta[];
|
|
20
|
+
/**
|
|
21
|
+
* Every failed call with a `wall` in the run that a later call (within 10) of the same command fixed with a
|
|
22
|
+
* delta (4.12). One repair per retry, the earliest failure's; at most 5, oldest first.
|
|
23
|
+
*/
|
|
24
|
+
export declare function detectRepairs(run: RunState, opts?: RepairOpts): RepairEvent[];
|
|
25
|
+
/** At run close (runs.ts): `run.repairs` from its calls, while it still has them; left alone once they are emptied. */
|
|
26
|
+
export declare function noteRepairs(run: RunState, opts?: RepairOpts): void;
|
|
27
|
+
//# sourceMappingURL=repairs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repairs.d.ts","sourceRoot":"","sources":["../../src/trace/repairs.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3E,mGAAmG;AACnG,MAAM,WAAW,UAAU;IAAG,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE;AA+C5D;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,CAY3E;AA4FD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,GAAE,UAAe,GAAG,QAAQ,EAAE,CAwC/G;AAWD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,GAAE,UAAe,GAAG,WAAW,EAAE,CA2BjF;AAED,uHAAuH;AACvH,wBAAgB,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,GAAE,UAAe,GAAG,IAAI,CAKtE"}
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The repair detector (design 4.12, research v3): a call that failed on a
|
|
3
|
+
* known wall, and the retry of the same command within 10 calls that worked
|
|
4
|
+
* because of what changed around it. The change (the fix delta) is an env
|
|
5
|
+
* variable set, a flag added, a wrapper from a fixed list put in front, or a
|
|
6
|
+
* step of another program that ran between them (`colima start`).
|
|
7
|
+
*
|
|
8
|
+
* Some failures never count (`ignoredFailure`): a hook or host deny, a CI
|
|
9
|
+
* log read (the log is a failure), SQL and GraphQL query errors (data, not
|
|
10
|
+
* tooling), a flake, a chain whose failing tail was dropped, and look-only
|
|
11
|
+
* calls.
|
|
12
|
+
*
|
|
13
|
+
* A delta's text can become a lesson the agent reads as "what fixed it", and
|
|
14
|
+
* an agent chooses the retry, so every delta passes the rules a skill step
|
|
15
|
+
* passes (R26): no secret, nothing on the never-save list, nothing gated.
|
|
16
|
+
* Any delta that fails them drops the whole repair.
|
|
17
|
+
*
|
|
18
|
+
* Pure: reads only the run's calls (commands already secret-checked by the
|
|
19
|
+
* fold). Never throws.
|
|
20
|
+
*/
|
|
21
|
+
import { homedir } from 'node:os';
|
|
22
|
+
import { secretReason } from '../notes/secrets.js';
|
|
23
|
+
import { gatedKind } from '../skills/risk.js';
|
|
24
|
+
import { neverSave } from '../skills/never-save.js';
|
|
25
|
+
import { OWN_FILES, RISKY_STEP, riskyDelta } from '../skills/risk-delta.js';
|
|
26
|
+
import { callText } from './checks.js';
|
|
27
|
+
import { commandKind, leadingCds, normalizeCommand, relativizePaths, splitTop, stripLeadingSleep, stripOutputFilters, stripTrailingEcho } from './shell.js';
|
|
28
|
+
import { afterTimeout, programOfText } from './shell-words.js';
|
|
29
|
+
import { ASSIGN, base, unquote, words } from './shell-scan.js';
|
|
30
|
+
/** The retry is one of the next 10 calls (4.12 step 3). */
|
|
31
|
+
const WINDOW = 10;
|
|
32
|
+
/** At most 5 repairs a run (RunState.repairs). */
|
|
33
|
+
const MAX_REPAIRS = 5;
|
|
34
|
+
/* ------------------------------------------------------------ ignored rows */
|
|
35
|
+
/** A hook or the host refused the call; Trail's own sure-fail deny is one. errorLine is flatLine'd, so `[trail]` may be gone. */
|
|
36
|
+
const DENIED = [
|
|
37
|
+
/^\w+:\w+ hook (?:error|returned blocking error)/,
|
|
38
|
+
/^(?:\[trail\]\s*)?Trail, the tool this person installed, stopped this command\b/,
|
|
39
|
+
/^trail(?::| ·) /, // Trail's gated-step deny and the save gate's refusals (b2 review)
|
|
40
|
+
/^Permission (?:for this (?:action|command)|to use \S+(?: with command .*?)?) (?:was|has been) denied/,
|
|
41
|
+
/^The user doesn't want to proceed with this tool use/,
|
|
42
|
+
/^<tool_use_error>/,
|
|
43
|
+
];
|
|
44
|
+
/** Bounded between `view` and `--log`, so a long run of `gh run view` words can't make it quadratic (b2 review). */
|
|
45
|
+
const CI_LOG = /\bgh\s+run\s+view\b[^;&|\n]{0,400}?\s--log(?:-failed)?(?=\s|$|[;&|)])/;
|
|
46
|
+
/** A query client (also through `docker exec`), or GraphQL through gh. */
|
|
47
|
+
const QUERY_CLIENT = /(?:^|[\s;&|(/])(?:psql|mysql|mariadb|sqlite3|duckdb|clickhouse(?:-client)?|snowsql|cqlsh|mongosh)(?=\s|$)|\bbq\s+query\b|\bcockroach\s+sql\b|\bgh\s+api\s+graphql\b/;
|
|
48
|
+
/** What a query error says first: Postgres, MySQL, SQLite, GraphQL. */
|
|
49
|
+
const QUERY_ERROR = /^(?:ERROR|error):\s+(?:syntax error|relation|column|function|operator|permission denied for|duplicate key|invalid input syntax|null value)\b|^ERROR \d{4} \(\w+\)|^(?:Parse|Runtime) error near\b|^Error: (?:near|no such (?:table|column))\b|^GraphQL(?:Error)?:|\bdoesn't exist on type\b|"errors":\s*\[/i;
|
|
50
|
+
const collapse = (s) => s.trim().replace(/\s+/g, ' ');
|
|
51
|
+
/** How far a dropped tail is looked for: the retry's own length plus this, and at most this many pieces (linear, b2 review). */
|
|
52
|
+
const TAIL_SLACK = 2048;
|
|
53
|
+
const TAIL_PIECES = 64;
|
|
54
|
+
/** `A && B` failed and `A` alone then passed: the failure was the dropped tail's (4.12 step 1). */
|
|
55
|
+
function droppedTail(cmd, next) {
|
|
56
|
+
const want = normalizeCommand(next);
|
|
57
|
+
const segs = splitTop(cmd);
|
|
58
|
+
let head = '';
|
|
59
|
+
for (let k = 0; k < segs.length - 1 && k < TAIL_PIECES; k++) {
|
|
60
|
+
const seg = segs[k];
|
|
61
|
+
if (seg.sep !== '&&' && seg.sep !== ';')
|
|
62
|
+
return false;
|
|
63
|
+
head = head ? `${head} ${seg.text}` : seg.text;
|
|
64
|
+
if (head.length > next.length + TAIL_SLACK)
|
|
65
|
+
return false;
|
|
66
|
+
if (normalizeCommand(head) === want)
|
|
67
|
+
return true;
|
|
68
|
+
head = `${head} ${seg.sep}`;
|
|
69
|
+
}
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* A failure that never counts as a wall or a repair (4.12 step 1). `next` is the call right after it (or the
|
|
74
|
+
* retry), for the two rows about what followed: an identical retry that passed (a flake), and the same chain
|
|
75
|
+
* with its failing `&&` tail dropped. The other rows read the call alone, and also hold for an exit-0 call: a
|
|
76
|
+
* CI log read or a query is never a wall, failed or not.
|
|
77
|
+
*/
|
|
78
|
+
export function ignoredFailure(call, next) {
|
|
79
|
+
try {
|
|
80
|
+
if (call.kind === 'look' || call.kind === 'plumbing')
|
|
81
|
+
return true;
|
|
82
|
+
const cmd = callText(call);
|
|
83
|
+
if (CI_LOG.test(cmd) || QUERY_CLIENT.test(cmd))
|
|
84
|
+
return true;
|
|
85
|
+
const line = typeof call.errorLine === 'string' ? call.errorLine : '';
|
|
86
|
+
if (DENIED.some((re) => re.test(line)) || QUERY_ERROR.test(line))
|
|
87
|
+
return true;
|
|
88
|
+
if (!call.failed || !next || next.failed || typeof next.cmd !== 'string')
|
|
89
|
+
return false;
|
|
90
|
+
return collapse(cmd) === collapse(next.cmd) || droppedTail(cmd, next.cmd);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const PLACEHOLDER = /\$\{[A-Za-z_]\w*:\?set /;
|
|
97
|
+
/** Wrappers that only change how the same command runs; any of these added in a retry drops the repair unless it is on ALLOWED. */
|
|
98
|
+
const WRAPPERS = new Set(['sudo', 'doas', 'nice', 'nohup', 'time', 'exec', 'command', 'caffeinate', 'stdbuf', 'ionice', 'chrt']);
|
|
99
|
+
const TWO_WORD_FLAG = /^-[nuCgDhprtUTwc]$/;
|
|
100
|
+
function strip(cmd) {
|
|
101
|
+
let s = String(cmd ?? '').trim();
|
|
102
|
+
for (let n = 0; n < 20; n++) {
|
|
103
|
+
const next = stripLeadingSleep(leadingCds(stripTrailingEcho(stripOutputFilters(s))).rest);
|
|
104
|
+
if (next === s)
|
|
105
|
+
break;
|
|
106
|
+
s = next;
|
|
107
|
+
}
|
|
108
|
+
return s;
|
|
109
|
+
}
|
|
110
|
+
function envPart(word) {
|
|
111
|
+
const w = unquote(word);
|
|
112
|
+
return ASSIGN.test(w) ? { name: w.slice(0, w.indexOf('=')), text: w } : null;
|
|
113
|
+
}
|
|
114
|
+
function coreOf(cmd) {
|
|
115
|
+
const s = strip(cmd);
|
|
116
|
+
let w = words(s);
|
|
117
|
+
const env = [];
|
|
118
|
+
const wrappers = [];
|
|
119
|
+
for (let n = 0; n < 24 && w.length; n++) {
|
|
120
|
+
while (w.length && ASSIGN.test(w[0]))
|
|
121
|
+
env.push(envPart(w.shift()));
|
|
122
|
+
const p = w[0] ?? '';
|
|
123
|
+
if (p === 'env') {
|
|
124
|
+
let i = 1;
|
|
125
|
+
for (; i < w.length; i++) {
|
|
126
|
+
const e = envPart(w[i]);
|
|
127
|
+
if (e)
|
|
128
|
+
env.push(e);
|
|
129
|
+
else if (/^(?:-u|--unset|-C|--chdir|-S|--split-string)$/.test(w[i]))
|
|
130
|
+
i++;
|
|
131
|
+
else if (!w[i].startsWith('-'))
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
w = w.slice(i);
|
|
135
|
+
}
|
|
136
|
+
else if (p === 'noglob') {
|
|
137
|
+
wrappers.push({ name: p, text: p });
|
|
138
|
+
w = w.slice(1);
|
|
139
|
+
}
|
|
140
|
+
else if (p === 'timeout' || p === 'gtimeout') {
|
|
141
|
+
const rest = afterTimeout(w);
|
|
142
|
+
if (!rest)
|
|
143
|
+
break;
|
|
144
|
+
wrappers.push({ name: p, text: w.slice(0, w.length - rest.length).join(' ') });
|
|
145
|
+
w = rest;
|
|
146
|
+
}
|
|
147
|
+
else if (p === 'colima' && w[1] === 'ssh' && w[2] === '--') {
|
|
148
|
+
wrappers.push({ name: 'colima ssh --', text: 'colima ssh --' });
|
|
149
|
+
w = w.slice(3);
|
|
150
|
+
}
|
|
151
|
+
else if (WRAPPERS.has(base(p)) && !(p === 'command' && /^-[vV]$/.test(w[1] ?? ''))) {
|
|
152
|
+
let i = 1;
|
|
153
|
+
while (i < w.length && w[i].startsWith('-'))
|
|
154
|
+
i += TWO_WORD_FLAG.test(w[i]) ? 2 : 1;
|
|
155
|
+
wrappers.push({ name: base(p), text: w.slice(0, i).join(' ') });
|
|
156
|
+
w = w.slice(i);
|
|
157
|
+
}
|
|
158
|
+
else
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
if (!w.length)
|
|
162
|
+
return null;
|
|
163
|
+
return { env, wrappers, words: w.map(unquote), text: w.join(' ') };
|
|
164
|
+
}
|
|
165
|
+
const isFlag = (w) => w.length > 1 && w.startsWith('-') && w !== '--';
|
|
166
|
+
/** The flags the retry added, when the retry is the failed command once they, its env and its wrappers are off; else null. */
|
|
167
|
+
function addedFlags(failed, retry) {
|
|
168
|
+
const had = new Set(failed.words);
|
|
169
|
+
const added = retry.words.filter((w) => isFlag(w) && !had.has(w));
|
|
170
|
+
const rest = retry.words.filter((w) => !(isFlag(w) && !had.has(w)));
|
|
171
|
+
if (rest.length !== failed.words.length || rest.some((w, i) => w !== failed.words[i]))
|
|
172
|
+
return null;
|
|
173
|
+
return added;
|
|
174
|
+
}
|
|
175
|
+
const programOf = (c) => programOfText(c.text).prog ?? base(c.words[0] ?? '');
|
|
176
|
+
/** A wrapper a retry may add: noglob, `colima ssh --`, and gtimeout where timeout failed (4.12 step 4). */
|
|
177
|
+
function allowedWrapper(name, failed) {
|
|
178
|
+
if (name === 'noglob' || name === 'colima ssh --')
|
|
179
|
+
return true;
|
|
180
|
+
return name === 'gtimeout' && failed.wrappers.some((w) => w.name === 'timeout');
|
|
181
|
+
}
|
|
182
|
+
/** No secret, nothing never-save, nothing gated (4.12 steps 5, 6; R26). */
|
|
183
|
+
const safe = (text) => secretReason(text) === null && !PLACEHOLDER.test(text) && neverSave(text) === null && gatedKind(text) === null;
|
|
184
|
+
/** A call with a whole command whose outcome is known: a result in the transcript, or a PostToolUse mark (an open call reads as not failed); a background call's result says only that it started. */
|
|
185
|
+
const usable = (c) => typeof c.cmd === 'string' && !c.truncated && c.bg !== true && (c.src?.result != null || c.fromMark === true);
|
|
186
|
+
/**
|
|
187
|
+
* The delta between a failing call and its retry (4.12 step 4), with the enabling calls between them: enabling
|
|
188
|
+
* steps first (in the order they ran), then wrappers, env and flags. [] when there is none, when `retry` is not
|
|
189
|
+
* a passing retry of the same command, or when any part fails the secret or risk rules: [] means no repair.
|
|
190
|
+
*/
|
|
191
|
+
export function fixDelta(failed, retry, between, opts = {}) {
|
|
192
|
+
try {
|
|
193
|
+
if (!usable(failed) || !usable(retry) || retry.failed)
|
|
194
|
+
return [];
|
|
195
|
+
// An edit, or a call that changed files, between them may be the fix: the delta alone isn't (b2 review).
|
|
196
|
+
if ((retry.editsBefore ?? 0) !== (failed.editsBefore ?? 0))
|
|
197
|
+
return [];
|
|
198
|
+
if ((Array.isArray(between) ? between : []).some((c) => c.kind === 'work'))
|
|
199
|
+
return [];
|
|
200
|
+
const f = coreOf(failed.cmd);
|
|
201
|
+
const r = coreOf(retry.cmd);
|
|
202
|
+
if (!f || !r)
|
|
203
|
+
return [];
|
|
204
|
+
const flags = addedFlags(f, r);
|
|
205
|
+
if (!flags)
|
|
206
|
+
return [];
|
|
207
|
+
const home = opts.home ?? homedir();
|
|
208
|
+
const root = opts.root ?? '';
|
|
209
|
+
const rel = (t) => relativizePaths(t, root, home);
|
|
210
|
+
const out = [];
|
|
211
|
+
const prog = programOf(f);
|
|
212
|
+
for (const c of Array.isArray(between) ? between : []) {
|
|
213
|
+
if (c.failed || !usable(c) || c.kind !== 'step' || commandKind(c.cmd) !== 'step')
|
|
214
|
+
continue;
|
|
215
|
+
const core = coreOf(c.cmd);
|
|
216
|
+
if (!core || programOf(core) === prog)
|
|
217
|
+
continue;
|
|
218
|
+
out.push({ kind: 'enable-step', name: programOf(core), text: rel(strip(c.cmd)), callId: c.id });
|
|
219
|
+
}
|
|
220
|
+
const hadWrap = new Set(f.wrappers.map((w) => w.name));
|
|
221
|
+
for (const w of r.wrappers) {
|
|
222
|
+
if (hadWrap.has(w.name))
|
|
223
|
+
continue;
|
|
224
|
+
if (!allowedWrapper(w.name, f))
|
|
225
|
+
return [];
|
|
226
|
+
out.push({ kind: 'wrapper', name: w.name, text: w.text, callId: retry.id });
|
|
227
|
+
}
|
|
228
|
+
const hadEnv = new Set(f.env.map((e) => e.name));
|
|
229
|
+
for (const e of r.env)
|
|
230
|
+
if (!hadEnv.has(e.name))
|
|
231
|
+
out.push({ kind: 'env', name: e.name, text: rel(e.text), callId: retry.id });
|
|
232
|
+
for (const flag of flags)
|
|
233
|
+
out.push({ kind: 'flag', name: flag.split('=')[0], text: rel(flag), callId: retry.id });
|
|
234
|
+
if (!out.length)
|
|
235
|
+
return [];
|
|
236
|
+
// The retry as it ran (its cds, filters and echo included) and each delta's own text. The step rules read it
|
|
237
|
+
// relativized, as the deltas are: a path inside a checkout that sits in /tmp (Linux CI, a scratch clone) is `./`.
|
|
238
|
+
const whole = rel(retry.cmd);
|
|
239
|
+
if (!safe(retry.cmd) || RISKY_STEP.test(whole) || OWN_FILES.test(whole) || out.some((d) => !safe(d.text) || riskyDelta(d)))
|
|
240
|
+
return [];
|
|
241
|
+
return out;
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
return [];
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* A wall hit that failed: the call failed, or its wall's words came out of a top-level pipe (`go test 2>&1 | tail`),
|
|
249
|
+
* whose exit code is the filter's, so 0 says nothing (fix-lab5). matchWall already drops planted and log-read text.
|
|
250
|
+
*/
|
|
251
|
+
function wallFailed(c) {
|
|
252
|
+
if (c.failed)
|
|
253
|
+
return true;
|
|
254
|
+
return !!c.wall && typeof c.cmd === 'string' && splitTop(c.cmd).some((s) => s.sep === '|');
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Every failed call with a `wall` in the run that a later call (within 10) of the same command fixed with a
|
|
258
|
+
* delta (4.12). One repair per retry, the earliest failure's; at most 5, oldest first.
|
|
259
|
+
*/
|
|
260
|
+
export function detectRepairs(run, opts = {}) {
|
|
261
|
+
const out = [];
|
|
262
|
+
try {
|
|
263
|
+
const calls = Array.isArray(run?.calls) ? run.calls : [];
|
|
264
|
+
const used = new Set();
|
|
265
|
+
for (let i = 0; i < calls.length && out.length < MAX_REPAIRS; i++) {
|
|
266
|
+
const f = calls[i];
|
|
267
|
+
if (!f.wall || !wallFailed(f) || !usable(f) || ignoredFailure(f, calls[i + 1] ?? null))
|
|
268
|
+
continue;
|
|
269
|
+
const fc = coreOf(f.cmd);
|
|
270
|
+
if (!fc)
|
|
271
|
+
continue;
|
|
272
|
+
for (let j = i + 1; j <= i + WINDOW && j < calls.length; j++) {
|
|
273
|
+
const r = calls[j];
|
|
274
|
+
if (r.failed || r.wall || !usable(r) || used.has(r.id))
|
|
275
|
+
continue;
|
|
276
|
+
const rc = coreOf(r.cmd);
|
|
277
|
+
if (!rc || !addedFlags(fc, rc))
|
|
278
|
+
continue;
|
|
279
|
+
const delta = fixDelta(f, r, calls.slice(i + 1, j), opts);
|
|
280
|
+
if (delta.length) {
|
|
281
|
+
used.add(r.id);
|
|
282
|
+
out.push({ cls: f.wall, program: programOf(fc), failCallId: f.id, fixCallId: r.id, delta, epoch: run.epoch, runId: run.id ?? null, at: r.at });
|
|
283
|
+
}
|
|
284
|
+
break;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
catch {
|
|
289
|
+
/* fail open: what was found so far */
|
|
290
|
+
}
|
|
291
|
+
return out;
|
|
292
|
+
}
|
|
293
|
+
/** At run close (runs.ts): `run.repairs` from its calls, while it still has them; left alone once they are emptied. */
|
|
294
|
+
export function noteRepairs(run, opts = {}) {
|
|
295
|
+
if (!Array.isArray(run?.calls) || !run.calls.length)
|
|
296
|
+
return;
|
|
297
|
+
const found = detectRepairs(run, opts);
|
|
298
|
+
if (found.length)
|
|
299
|
+
run.repairs = found;
|
|
300
|
+
else
|
|
301
|
+
delete run.repairs;
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=repairs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repairs.js","sourceRoot":"","sources":["../../src/trace/repairs.ts"],"names":[],"mappings":"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"}
|