@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 @@
|
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../src/trace/host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AACpF,MAAM,MAAM,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AACzC,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,IAAI,CAAC;IACX,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,CAAC,EAAE,IAAI,CAAC;CACjB;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,IAAU,CAAC;AAsBpC,+FAA+F;AAC/F,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CA6BrD"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which agent sent a hook payload, and how much of what it did its transcript
|
|
3
|
+
* keeps. Worked out from the payload itself, before any transcript is parsed,
|
|
4
|
+
* never from the settings file that fired the hook: Cursor and Copilot CLI run
|
|
5
|
+
* the Claude Code hooks in `.claude/settings.json` too, so a payload on a
|
|
6
|
+
* Claude hook can carry a Cursor or Copilot transcript path. Parsed as Claude,
|
|
7
|
+
* such a file shows no typed words and no tool results, and every save would
|
|
8
|
+
* look like the agent's own.
|
|
9
|
+
*
|
|
10
|
+
* Tiers (how far Trail can trust the record):
|
|
11
|
+
* - A: typed words told apart, tool calls, results with a failure signal,
|
|
12
|
+
* compactions. Claude Code.
|
|
13
|
+
* - B: a full record whose host checks aren't written up yet. Codex, until HC1 to HC12 are (P31): its rollouts
|
|
14
|
+
* are read and folded (phase 2), but learning stays off.
|
|
15
|
+
* - C: typed words, calls at best, no results Trail can read. Copilot CLI,
|
|
16
|
+
* Gemini CLI (no hooks wired, no parser yet).
|
|
17
|
+
* - D: nothing Trail can read, or a shape it doesn't know. Cursor (its
|
|
18
|
+
* transcripts keep no results), anything unknown.
|
|
19
|
+
* Only tier A can make a live item; everything else is held for a yes.
|
|
20
|
+
*
|
|
21
|
+
* `subagent` is set when the payload comes from a subagent's tool call or
|
|
22
|
+
* stop (Claude Code adds `agent_id` there, never on the main thread). Its
|
|
23
|
+
* transcript path still names the parent session, so the caller stays out.
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Codex's tier (design 4.18, P31): the one constant that flips to "A", in the commit that writes up HC1 to HC12 in
|
|
27
|
+
* host-checks.md and passes the Codex legs of J04, J10 and J13 in a real session. Until then a test home may set
|
|
28
|
+
* TRAIL_TIER_CODEX=A (host-facts.ts `hostTier`).
|
|
29
|
+
*/
|
|
30
|
+
export const CODEX_TIER = "B";
|
|
31
|
+
const TIER = { claude: "A", codex: CODEX_TIER, cursor: "D", copilot: "C", gemini: "C", unknown: "D" };
|
|
32
|
+
/** Keys only Cursor's hooks send, on its own events and on Claude's. */
|
|
33
|
+
const CURSOR_KEYS = ["conversation_id", "generation_id", "cursor_version", "workspace_roots"];
|
|
34
|
+
/** Antigravity: camelCase like Copilot, but its own. Not a host Trail reads yet. */
|
|
35
|
+
const ANTIGRAVITY_KEYS = ["conversationId", "artifactDirectoryPath", "workspacePaths"];
|
|
36
|
+
/** Copilot CLI's own hooks speak camelCase; on a .claude/settings.json it switches to snake_case with an ISO timestamp. */
|
|
37
|
+
const COPILOT_KEYS = ["sessionId", "toolName", "toolArgs", "transcriptPath", "toolResult"];
|
|
38
|
+
/** Events only Gemini CLI has; SessionStart, SessionEnd and Notification it shares with Claude Code. */
|
|
39
|
+
const GEMINI_EVENTS = new Set(["BeforeTool", "AfterTool", "BeforeAgent", "AfterAgent", "BeforeModel", "AfterModel", "BeforeToolSelection", "PreCompress"]);
|
|
40
|
+
function result(host, subagent = false) {
|
|
41
|
+
return subagent ? { host, tier: TIER[host], subagent: true } : { host, tier: TIER[host] };
|
|
42
|
+
}
|
|
43
|
+
/** Forward slashes, so one set of checks reads Windows paths too. */
|
|
44
|
+
function slashed(p) {
|
|
45
|
+
return p.replace(/\\/g, "/");
|
|
46
|
+
}
|
|
47
|
+
/** The host that sent `payload` and its tier. Never throws; anything unreadable is unknown. */
|
|
48
|
+
export function detectHost(payload) {
|
|
49
|
+
try {
|
|
50
|
+
if (!payload || typeof payload !== "object" || Array.isArray(payload))
|
|
51
|
+
return result("unknown");
|
|
52
|
+
const p = payload;
|
|
53
|
+
const has = (k) => Object.prototype.hasOwnProperty.call(p, k) && p[k] !== undefined && p[k] !== null;
|
|
54
|
+
const rawPath = has("transcript_path") ? p.transcript_path : p.transcriptPath;
|
|
55
|
+
const path = typeof rawPath === "string" ? slashed(rawPath) : "";
|
|
56
|
+
const file = path.slice(path.lastIndexOf("/") + 1);
|
|
57
|
+
const event = typeof p.hook_event_name === "string" ? p.hook_event_name : "";
|
|
58
|
+
if (CURSOR_KEYS.some(has) || path.includes("/.cursor/") || path.includes("/agent-transcripts/"))
|
|
59
|
+
return result("cursor");
|
|
60
|
+
if (ANTIGRAVITY_KEYS.some(has) || path.includes("/.gemini/antigravity"))
|
|
61
|
+
return result("unknown");
|
|
62
|
+
if (has("turn_id") || /^rollout-.*\.jsonl(\.zst)?$/.test(file) || path.includes("/.codex/sessions/"))
|
|
63
|
+
return result("codex");
|
|
64
|
+
if (COPILOT_KEYS.some(has) || path.includes("/.copilot/"))
|
|
65
|
+
return result("copilot");
|
|
66
|
+
if (GEMINI_EVENTS.has(event) || path.includes("/.gemini/tmp/"))
|
|
67
|
+
return result("gemini");
|
|
68
|
+
// Copilot CLI running a .claude/settings.json speaks snake_case like Claude
|
|
69
|
+
// Code, but stamps an ISO `timestamp`, which Claude Code never sends.
|
|
70
|
+
if (typeof p.timestamp === "string")
|
|
71
|
+
return result("copilot");
|
|
72
|
+
// Claude Code sends a session id and its transcript's path on every event,
|
|
73
|
+
// and names events in PascalCase. Without a transcript nothing proves it.
|
|
74
|
+
const claudeEvent = !has("hook_event_name") || /^[A-Z][A-Za-z]+$/.test(event);
|
|
75
|
+
if (typeof p.session_id === "string" && p.session_id && typeof rawPath === "string" && file.endsWith(".jsonl") && claudeEvent) {
|
|
76
|
+
return result("claude", typeof p.agent_id === "string" && p.agent_id !== "");
|
|
77
|
+
}
|
|
78
|
+
return result("unknown");
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return result("unknown");
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/trace/host.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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Housekeeping for the skills files under `~/.trail` (design 1.3, 2): at most
|
|
3
|
+
* once an hour per machine, old run sheets (7 days), session files (30 days),
|
|
4
|
+
* receipts (1 day), held items shown more than 24 hours ago, and probe
|
|
5
|
+
* results older than 10 minutes. Re-exported from `skill-session.ts`.
|
|
6
|
+
*/
|
|
7
|
+
import { readdirSync, rmSync, statSync } from 'node:fs';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { readJsonSafe, trailPath, withLock, writePrivate } from '../util/private-fs.js';
|
|
10
|
+
import { pruneRunSheets } from './run-sheets.js';
|
|
11
|
+
const HOUR = 3600_000;
|
|
12
|
+
const DAY = 24 * HOUR;
|
|
13
|
+
/** Files in `dir` (not folders) whose mtime is older than `ms`, removed. */
|
|
14
|
+
function dropOld(dir, ms, now, keep = () => false) {
|
|
15
|
+
let names;
|
|
16
|
+
try {
|
|
17
|
+
names = readdirSync(dir);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
for (const name of names) {
|
|
23
|
+
if (keep(name))
|
|
24
|
+
continue;
|
|
25
|
+
const p = join(dir, name);
|
|
26
|
+
try {
|
|
27
|
+
const st = statSync(p);
|
|
28
|
+
if (st.isFile() && now.getTime() - st.mtimeMs > ms)
|
|
29
|
+
rmSync(p, { force: true });
|
|
30
|
+
}
|
|
31
|
+
catch { /* gone already */ }
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Held items shown more than 24 h ago (held/<name>/held.json `shownAt`). */
|
|
35
|
+
function dropShownHeld(dir, now) {
|
|
36
|
+
let names;
|
|
37
|
+
try {
|
|
38
|
+
names = readdirSync(dir);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
for (const name of names) {
|
|
44
|
+
if (name.startsWith('.'))
|
|
45
|
+
continue;
|
|
46
|
+
const held = readJsonSafe(join(dir, name, 'held.json'));
|
|
47
|
+
const shown = typeof held?.shownAt === 'string' ? Date.parse(held.shownAt) : NaN;
|
|
48
|
+
if (!Number.isNaN(shown) && now.getTime() - shown > DAY) {
|
|
49
|
+
try {
|
|
50
|
+
rmSync(join(dir, name), { recursive: true, force: true });
|
|
51
|
+
}
|
|
52
|
+
catch { /* next time */ }
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/** state/probes.json entries `{ at }` older than 10 minutes, under `entries` or at the top level. */
|
|
57
|
+
function dropOldProbes(path, now) {
|
|
58
|
+
const raw = readJsonSafe(path);
|
|
59
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw))
|
|
60
|
+
return;
|
|
61
|
+
const box = raw.entries && typeof raw.entries === 'object' && !Array.isArray(raw.entries) ? raw.entries : raw;
|
|
62
|
+
let changed = false;
|
|
63
|
+
for (const [k, v] of Object.entries(box)) {
|
|
64
|
+
const at = v && typeof v === 'object' ? Date.parse(String(v.at)) : NaN;
|
|
65
|
+
if (!Number.isNaN(at) && now.getTime() - at > 10 * 60_000) {
|
|
66
|
+
delete box[k];
|
|
67
|
+
changed = true;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (changed)
|
|
71
|
+
writePrivate(path, JSON.stringify(raw));
|
|
72
|
+
}
|
|
73
|
+
/** At most once an hour (state/housekeeping.json): pruneRunSheets; sessions/*.json and their .gate.json and
|
|
74
|
+
* .post.jsonl (and crash leftovers beside them) older than 30 days; receipts older than 1 day; held items shown more than 24 h ago;
|
|
75
|
+
* expired state/probes.json entries. */
|
|
76
|
+
export function housekeeping(now = new Date(), env) {
|
|
77
|
+
const mark = trailPath(env, 'state', 'housekeeping.json');
|
|
78
|
+
const last = readJsonSafe(mark);
|
|
79
|
+
const lastAt = typeof last?.at === 'string' ? Date.parse(last.at) : NaN;
|
|
80
|
+
if (!Number.isNaN(lastAt) && now.getTime() - lastAt < HOUR && now.getTime() >= lastAt)
|
|
81
|
+
return;
|
|
82
|
+
// One process does it; another one meanwhile skips it.
|
|
83
|
+
withLock(mark, () => {
|
|
84
|
+
writePrivate(mark, JSON.stringify({ at: now.toISOString() }));
|
|
85
|
+
pruneRunSheets(now, env);
|
|
86
|
+
// Every file: a session's state, gate and marks, and what a crash left beside them (.lock, .steal, .stale, .tmp).
|
|
87
|
+
dropOld(trailPath(env, 'sessions'), 30 * DAY, now);
|
|
88
|
+
dropOld(trailPath(env, 'receipts'), DAY, now, (n) => !n.endsWith('.json'));
|
|
89
|
+
dropShownHeld(trailPath(env, 'held'), now);
|
|
90
|
+
dropOldProbes(trailPath(env, 'state', 'probes.json'), now);
|
|
91
|
+
}, 0);
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=housekeeping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"housekeeping.js","sourceRoot":"","sources":["../../src/trace/housekeeping.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The job vocabulary (design 4.14): which short typed asks name a job, from a
|
|
3
|
+
* fixed list of verb classes ported from the mining's lexicon. Only canonical
|
|
4
|
+
* words and values of known shapes leave this file, never the typed text.
|
|
5
|
+
*
|
|
6
|
+
* An ask is a job only when it is 25 words or fewer, not a status or history
|
|
7
|
+
* question ("did you push?", "is it live", "..., right?") and not a problem
|
|
8
|
+
* report ("prod is broken", "why ..."). Fenced code, quoted lines and very
|
|
9
|
+
* long lines are pasted context, not the ask, and are dropped first.
|
|
10
|
+
*
|
|
11
|
+
* Tuned on one person's prompts; the real near misses live in the private
|
|
12
|
+
* lab, and every test here is synthetic. Pure: no files, no clock.
|
|
13
|
+
*/
|
|
14
|
+
import type { CheckFamily, JobClass, JobMatch, PromptParams } from './types.js';
|
|
15
|
+
type JobDef = {
|
|
16
|
+
job: JobClass;
|
|
17
|
+
pattern: RegExp;
|
|
18
|
+
exclude?: RegExp;
|
|
19
|
+
vocab: Record<string, string>;
|
|
20
|
+
noun: string;
|
|
21
|
+
checkWords: string[];
|
|
22
|
+
};
|
|
23
|
+
export declare const JOB_CLASSES: ReadonlyArray<JobDef>;
|
|
24
|
+
/** Jobs that can reach moment 2, and the check families that fit each (4.2). */
|
|
25
|
+
export declare const OFFER_FAMILIES: Readonly<Partial<Record<JobClass, CheckFamily[]>>>;
|
|
26
|
+
/** pr-green and sweep: judgement loops, left out by spec 23. Never offered, never compiled. */
|
|
27
|
+
export declare const JUDGEMENT_JOBS: ReadonlySet<JobClass>;
|
|
28
|
+
/** Lead words may stack ("ok so did it..."); a tag that asks for a yes ("..., didn't it?") is a status question too. */
|
|
29
|
+
export declare const STATUS_OR_HISTORY: RegExp;
|
|
30
|
+
export declare const PROBLEM_REPORT: RegExp;
|
|
31
|
+
export declare const MAX_ASK_WORDS = 25;
|
|
32
|
+
/**
|
|
33
|
+
* The person's own ask in a typed message: fenced code blocks (an unclosed one
|
|
34
|
+
* runs to the end), quoted lines (`>`) and lines of 800 characters or more
|
|
35
|
+
* dropped. Every matcher of typed text reads this, not the raw message.
|
|
36
|
+
*/
|
|
37
|
+
export declare function askText(typed: string): string;
|
|
38
|
+
export declare function wordCount(text: string): number;
|
|
39
|
+
export declare function isStatusOrHistory(text: string): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Job of a typed ask, or null. Applies the 25-word cap, the status/history filter and the problem filter. `hasBranch`:
|
|
42
|
+
* whether the repo has a branch by a name, for "deploy it to <branch>" (D136 (3)); without it only beta, prod and
|
|
43
|
+
* staging name a ship.
|
|
44
|
+
*/
|
|
45
|
+
export declare function matchJob(typedText: string, opts?: {
|
|
46
|
+
anyLength?: boolean;
|
|
47
|
+
hasBranch?: (name: string) => boolean;
|
|
48
|
+
}): JobMatch | null;
|
|
49
|
+
/** Shape values in a typed ask (semver, sha, #PR, port, branch after 'branch', date). */
|
|
50
|
+
export declare function promptParams(typedText: string): PromptParams;
|
|
51
|
+
export {};
|
|
52
|
+
//# sourceMappingURL=jobs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/trace/jobs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAmChF,KAAK,MAAM,GAAG;IAAE,GAAG,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAMtI,eAAO,MAAM,WAAW,EAAE,aAAa,CAAC,MAAM,CA2D7C,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC,CAE5E,CAAC;AAEH,+FAA+F;AAC/F,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,QAAQ,CAA4C,CAAC;AAE9F,wHAAwH;AACxH,eAAO,MAAM,iBAAiB,QACsU,CAAC;AACrW,eAAO,MAAM,cAAc,QAAmI,CAAC;AAC/J,eAAO,MAAM,aAAa,KAAK,CAAC;AAEhC;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAG7C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAKD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;CAAO,GAAG,QAAQ,GAAG,IAAI,CAqBtI;AAID,yFAAyF;AACzF,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAiB5D"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/** Words that may sit between "run" and "tests": never a conjunction or another verb ("run it and write tests"). */
|
|
2
|
+
const GAP = String.raw `(?:(?!(?:and|then|or|but|to|write|add|fix|create|update|make|remove|delete|skip)\b)[\w./:-]+ ){0,3}?`;
|
|
3
|
+
const RUNNER = String.raw `(?:npm|pnpm|yarn|bun)(?: run)? test\b|npx (?:vitest|jest|playwright test)\b|go test\b|cargo test\b|make test\w*|python3? -m pytest\b|pytest\b|bats\b|rspec\b|jest\b|vitest\b`;
|
|
4
|
+
/** D136 (3): up to 2 words naming what to test before a runner ("sql-output bats"), never a verb that sets it up. */
|
|
5
|
+
const NAMED = String.raw `(?:(?!(?:and|then|or|but|to|write|add|fix|create|update|make|remove|delete|skip|install|configure|set|setup|upgrade|migrate|use|switch|what|how|which|why)\b)[\w./:-]+ ){0,2}?`;
|
|
6
|
+
/** The tests job (4.14, D56b). */
|
|
7
|
+
const TESTS = new RegExp([
|
|
8
|
+
String.raw `\b(?:re-?run|re run|run|kick off|execute)\b (?:the |all (?:of )?(?:the )?|our |my |these |those )?${GAP}(?:tests?|test ?suites?|suites?|specs?)\b`,
|
|
9
|
+
String.raw `\b(?:run|re-?run)\b (?:\S+ ){0,2}?(?:${RUNNER})`,
|
|
10
|
+
String.raw `^\s*(?:please |can you |could you |pls )?(?:${RUNNER})`,
|
|
11
|
+
// D136 (3): "sql-output bats please", "api tests", "sql-output tests please": the whole ask names what to test.
|
|
12
|
+
String.raw `^\s*(?:please |can you |could you |pls )?(?:the )?${NAMED}(?:bats|rspec|pytest|jest|vitest)\b(?: (?:please|pls|again|now))?\s*[.!]*$`,
|
|
13
|
+
String.raw `^\s*(?:please |pls )?(?:the )?(?!(?:write|add|fix|new|more|unit|my|our|your|these|those|some|any|no)\b)[\w./:-]+ tests?(?: (?:please|pls|again|now))?\s*[.!]*$`,
|
|
14
|
+
String.raw `\bmake sure (?:that )?(?:the |all (?:the )?)?(?:\w+ )?tests? (?:still )?(?:pass|are passing|are green|go green)\b`,
|
|
15
|
+
String.raw `\bget (?:the |all (?:the )?)?(?:\w+ )?tests? (?:passing|green|to pass)\b`,
|
|
16
|
+
String.raw `\b(?:integration|e2e|end-to-end|smoke|regression|acceptance) tests?\b`,
|
|
17
|
+
String.raw `\btest (?:it|this|that|everything|all(?: of (?:it|this))?) before (?:push|commit|merg|ship|deploy)\w*`,
|
|
18
|
+
].join('|'));
|
|
19
|
+
/**
|
|
20
|
+
* Not the tests job: how-to and wh- questions, a status question with no lead verb ("integration tests
|
|
21
|
+
* green?"), writing or changing tests, a test environment or account, testing it yourself.
|
|
22
|
+
*/
|
|
23
|
+
const TESTS_NOT = new RegExp([
|
|
24
|
+
String.raw `^\s*(?:(?:ok(?:ay)?|so|and|hmm)[\s,]+)*(?:how|what|which|where|when|why|who)\b`,
|
|
25
|
+
String.raw `\b(?:tests?|suites?|specs?)\b[^?]{0,30}\b(?:pass\w*|green|red|fail\w*|ok|done|finish\w*|running|broken)\s*\?\s*$`,
|
|
26
|
+
String.raw `\b(?:write|writing|add|adding|create|fix|fixing|update|remove|delete|skip|mock|refactor|rewrite|cover)\w* (?:\w+ ){0,3}?(?:tests?|specs?)\b`,
|
|
27
|
+
String.raw `\btest (?:env|environment|channel|account|data|mode|user|key|card|server|db|database|webhook|token|number|payment)s?\b`,
|
|
28
|
+
String.raw `\b(?:myself|yourself|ourselves)\b|\bfor (?:me|us|him|her|them) to (?:re-?)?(?:run|test)\b`,
|
|
29
|
+
String.raw `\b(?:install|configure|set ?up|upgrade|migrate|switch)\w* (?:\w+ ){0,3}?(?:to )?(?:bats|rspec|pytest|jest|vitest)\b`,
|
|
30
|
+
].join('|'));
|
|
31
|
+
/** D136 (3): ship or deploy (it) to a named place: the ship job when the repo has a branch by that name. */
|
|
32
|
+
const SHIP_TO = /\b(?:ship|deploy)\w*(?: (?:it|this|that|them))? to (?:the )?([\w./-]+)/;
|
|
33
|
+
/** Surface forms to canonical words, one map per class. */
|
|
34
|
+
const words = (pairs) => Object.fromEntries(Object.entries(pairs).flatMap(([canon, forms]) => [canon, ...forms].map((f) => [f, canon])));
|
|
35
|
+
export const JOB_CLASSES = [
|
|
36
|
+
{
|
|
37
|
+
job: 'release',
|
|
38
|
+
pattern: /\b(publish\w*|re-?publish|release\w* (a |the )?(new |next )?(version|ver|patch|minor|major)|cut (a |that |the )?release|redo the (npm )?publish|npm publish|bump (the )?version)\b/,
|
|
39
|
+
exclude: /publish\w* (on|to) (the )?(web|website)|call it publish|publishable|\brelease (the )?notes\b|\b(i|we)( have|'ve| had)? (already )?released\b/,
|
|
40
|
+
vocab: words({ publish: ['publishing', 'published', 'publishes', 'republish', 're-publish'], release: ['releases', 'releasing'], bump: ['bumping'], npm: [] }),
|
|
41
|
+
noun: 'release',
|
|
42
|
+
checkWords: ['published', 'released', 'out', 'live', 'up'],
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
job: 'ship',
|
|
46
|
+
pattern: /\b(push|puch|ff|fast.?forward|promote|deploy|ship|merge|update|move|get)\w* (\w+ ){0,4}(to |for |on |in |into )?(the )?(beta|prod|production|staging)\b|\bff to prod\b|\bupdate prod\b|^\s*(please )?ship it\b/,
|
|
47
|
+
exclude: /not working on (prod|beta)/,
|
|
48
|
+
vocab: words({
|
|
49
|
+
push: ['pushed', 'pushing', 'puch'], ff: ['fast-forward', 'fastforward'], promote: ['promoted'], deploy: ['deploying', 'deployed'], ship: ['shipping'],
|
|
50
|
+
merge: ['merged'], update: ['updated'], beta: [], prod: ['production'], staging: [],
|
|
51
|
+
}),
|
|
52
|
+
noun: 'ship',
|
|
53
|
+
checkWords: ['live', 'deployed', 'updated', 'up', 'out', 'green'],
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
job: 'pr-green',
|
|
57
|
+
pattern: /\b(ci\b|ci's|checks? (are |is )?fail\w*|failing (tests|checks)|failed tests|review comments|nitpicks|make (the )?ci (go )?green|ci goes? green|review.?bot)/,
|
|
58
|
+
vocab: words({ ci: ["ci's"], checks: ['check'], review: ['reviews'] }),
|
|
59
|
+
noun: 'CI fix',
|
|
60
|
+
checkWords: [],
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
job: 'sweep',
|
|
64
|
+
pattern: /\b(go through|sweep|verify|check)\b.{0,40}\b(all|other|more|newer|backlog|recent)\b.{0,25}\b(prs|pull requests|issues)\b|\bclose (more )?(issues|prs)\b/,
|
|
65
|
+
vocab: words({ sweep: [], prs: ['pull-requests'], issues: [] }),
|
|
66
|
+
noun: 'PR sweep',
|
|
67
|
+
checkWords: [],
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
job: 'run-local',
|
|
71
|
+
pattern: /\b(open (it|this|the \w+)? ?(locally|in (the )?browser|on (a )?local)|localhost|local server|run it locally|open locally)\b/,
|
|
72
|
+
vocab: words({ open: [], locally: [], localhost: [] }),
|
|
73
|
+
noun: 'local run',
|
|
74
|
+
checkWords: [],
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
job: 'report',
|
|
78
|
+
pattern: /\b(any new (users|people)|new users? (since|till|through|we have|came)|how many (new )?(users|people) (have|came|joined))\b/,
|
|
79
|
+
vocab: words({ new: [], users: ['user', 'people'], signups: ['signup'] }),
|
|
80
|
+
noun: 'report',
|
|
81
|
+
checkWords: [],
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
// D56b, rebuilt from real asks: none said "run the integration tests"; they said "run the tests", "rerun
|
|
85
|
+
// the e2e tests", named the runner, or "make sure the tests pass". "Test this thoroughly end to end" is a
|
|
86
|
+
// feature check the agent designs each time, not a test run, so it stays out.
|
|
87
|
+
job: 'tests',
|
|
88
|
+
pattern: TESTS,
|
|
89
|
+
exclude: TESTS_NOT,
|
|
90
|
+
vocab: words({ integration: [], e2e: ['end-to-end'], tests: ['test', 'suite', 'suites', 'specs', 'spec'] }),
|
|
91
|
+
noun: 'test run',
|
|
92
|
+
checkWords: ['passing', 'green', 'pass', 'passed'],
|
|
93
|
+
},
|
|
94
|
+
];
|
|
95
|
+
/** Jobs that can reach moment 2, and the check families that fit each (4.2). */
|
|
96
|
+
export const OFFER_FAMILIES = Object.freeze({
|
|
97
|
+
release: ['npm-view'], ship: ['deploy', 'ls-remote', 'push'], tests: ['tests'], report: ['query'],
|
|
98
|
+
});
|
|
99
|
+
/** pr-green and sweep: judgement loops, left out by spec 23. Never offered, never compiled. */
|
|
100
|
+
export const JUDGEMENT_JOBS = new Set(['pr-green', 'sweep']);
|
|
101
|
+
/** Lead words may stack ("ok so did it..."); a tag that asks for a yes ("..., didn't it?") is a status question too. */
|
|
102
|
+
export const STATUS_OR_HISTORY = /^\s*(?:(?:okay|ok|so|and|also|hey|btw|wait|hmm|tell(?: me)?)[\s,]+)*(did|is|was|has|have|are|were|does|how did|what did|when did|where did)\b|\b(did (you|we)|is it (live|done|published|deployed|out|up|green)|how did (we|you)|check (now )?if)\b|\b(right|correct)\?\s*$|\b(?:is|are|was|were|did|does|do|has|have)n'?t (?:it|they|we|you|that|he|she)\?\s*$/i;
|
|
103
|
+
export const PROBLEM_REPORT = /\b(not working|(does|did|do)n'?t work|did not work|does not work|went wrong|still (broken|failing|not)|is broken)\b|^\s*why\b/i;
|
|
104
|
+
export const MAX_ASK_WORDS = 25;
|
|
105
|
+
/**
|
|
106
|
+
* The person's own ask in a typed message: fenced code blocks (an unclosed one
|
|
107
|
+
* runs to the end), quoted lines (`>`) and lines of 800 characters or more
|
|
108
|
+
* dropped. Every matcher of typed text reads this, not the raw message.
|
|
109
|
+
*/
|
|
110
|
+
export function askText(typed) {
|
|
111
|
+
const t = String(typed ?? '').replace(/```[\s\S]*?(?:```|$)/g, '\n');
|
|
112
|
+
return t.split(/\r?\n/).filter((l) => !/^\s*>/.test(l) && l.length < 800).join('\n').trim();
|
|
113
|
+
}
|
|
114
|
+
export function wordCount(text) {
|
|
115
|
+
return String(text ?? '').split(/\s+/).filter(Boolean).length;
|
|
116
|
+
}
|
|
117
|
+
export function isStatusOrHistory(text) {
|
|
118
|
+
return STATUS_OR_HISTORY.test(askText(text));
|
|
119
|
+
}
|
|
120
|
+
const URL = /\b[a-z][a-z0-9+.-]*:\/\/\S+/gi;
|
|
121
|
+
const VERSION = /\bv?\d+\.\d+\.\d+(?:-[0-9a-z.]+)?\b/gi;
|
|
122
|
+
/**
|
|
123
|
+
* Job of a typed ask, or null. Applies the 25-word cap, the status/history filter and the problem filter. `hasBranch`:
|
|
124
|
+
* whether the repo has a branch by a name, for "deploy it to <branch>" (D136 (3)); without it only beta, prod and
|
|
125
|
+
* staging name a ship.
|
|
126
|
+
*/
|
|
127
|
+
export function matchJob(typedText, opts = {}) {
|
|
128
|
+
const ask = askText(typedText);
|
|
129
|
+
// The cap is for matching skills; D120 (1)'s continuation of the open run's own job reads any length.
|
|
130
|
+
if (!ask || (!opts.anyLength && wordCount(ask) > MAX_ASK_WORDS))
|
|
131
|
+
return null;
|
|
132
|
+
if (STATUS_OR_HISTORY.test(ask) || PROBLEM_REPORT.test(ask))
|
|
133
|
+
return null;
|
|
134
|
+
const t = ask.toLowerCase().replace(URL, ' url ').replace(VERSION, ' ver ').replace(/\bfast forward/g, 'fast-forward').replace(/\s+/g, ' ').trim();
|
|
135
|
+
for (const c of JOB_CLASSES) {
|
|
136
|
+
if (!c.pattern.test(t) || c.exclude?.test(t))
|
|
137
|
+
continue;
|
|
138
|
+
const found = [];
|
|
139
|
+
for (const w of t.split(/[^a-z0-9'-]+/)) {
|
|
140
|
+
const canon = c.vocab[w] ?? c.vocab[w.replace(/'s$/, '')];
|
|
141
|
+
if (canon && !found.includes(canon))
|
|
142
|
+
found.push(canon);
|
|
143
|
+
}
|
|
144
|
+
return { job: c.job, words: found };
|
|
145
|
+
}
|
|
146
|
+
const to = opts.hasBranch ? SHIP_TO.exec(t) : null;
|
|
147
|
+
if (to && opts.hasBranch(to[1].replace(/[.]+$/, ''))) {
|
|
148
|
+
const ship = JOB_CLASSES.find((c) => c.job === 'ship');
|
|
149
|
+
if (!ship.exclude?.test(t))
|
|
150
|
+
return { job: 'ship', words: [...new Set(t.split(/[^a-z0-9'-]+/).map((w) => ship.vocab[w]).filter((w) => !!w))] };
|
|
151
|
+
}
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
const NOT_A_BRANCH = new Set(['to', 'and', 'the', 'is', 'of', 'for', 'from', 'then', 'with', 'in', 'on', 'it', 'so', 'a', 'name', 'called', 'named']);
|
|
155
|
+
/** Shape values in a typed ask (semver, sha, #PR, port, branch after 'branch', date). */
|
|
156
|
+
export function promptParams(typedText) {
|
|
157
|
+
const t = askText(typedText);
|
|
158
|
+
const out = {};
|
|
159
|
+
const version = /\bv?(\d+\.\d+\.\d+(?:-[0-9A-Za-z.]+)?)\b/.exec(t);
|
|
160
|
+
if (version)
|
|
161
|
+
out.version = version[1].replace(/\.$/, '');
|
|
162
|
+
for (const m of t.matchAll(/\b[0-9a-f]{7,40}\b/g)) {
|
|
163
|
+
if (/\d/.test(m[0]) && /[a-f]/.test(m[0])) {
|
|
164
|
+
out.sha = m[0];
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
const pr = /(?:^|\s)#(\d+)\b|\bpr\s*#?(\d+)\b|\/pull\/(\d+)/i.exec(t);
|
|
169
|
+
if (pr)
|
|
170
|
+
out.pr = pr[1] ?? pr[2] ?? pr[3];
|
|
171
|
+
const port = /\b(?:localhost|127\.0\.0\.1|0\.0\.0\.0):(\d{2,5})\b|--port[= ](\d{2,5})\b|\bPORT=(\d{2,5})\b|\bport (\d{2,5})\b/i.exec(t);
|
|
172
|
+
if (port)
|
|
173
|
+
out.port = port[1] ?? port[2] ?? port[3] ?? port[4];
|
|
174
|
+
const branch = /\bbranch(?: called| named)? ([\w./-]+)/i.exec(t);
|
|
175
|
+
if (branch && !NOT_A_BRANCH.has(branch[1].toLowerCase()) && branch[1].length >= 2)
|
|
176
|
+
out.branch = branch[1];
|
|
177
|
+
const date = /\b20\d\d-\d\d-\d\d\b/.exec(t);
|
|
178
|
+
if (date)
|
|
179
|
+
out.date = date[0];
|
|
180
|
+
return out;
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=jobs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/trace/jobs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"known-repo.d.ts","sourceRoot":"","sources":["../../src/trace/known-repo.ts"],"names":[],"mappings":"AA0CA,qDAAqD;AACrD,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAO9H"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* D117 (3), J16: is this a repo Trail knows? It has a `.trail/` folder (trail
|
|
3
|
+
* init made it, or the team committed one), or its key is in
|
|
4
|
+
* `~/.trail/repos/index.json` (a root commit's key, or an alias either side).
|
|
5
|
+
* Outside one, the global hooks keep no pool and make no offers there; walls
|
|
6
|
+
* and guardrails still apply everywhere.
|
|
7
|
+
*
|
|
8
|
+
* Reads only: one stat and one small JSON file, no git, no process.
|
|
9
|
+
*/
|
|
10
|
+
import { realpathSync, statSync } from 'node:fs';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
import { trailHome } from '../notes/trail-home.js';
|
|
13
|
+
import { readJsonSafe, trailPath } from '../util/private-fs.js';
|
|
14
|
+
function isDir(p) {
|
|
15
|
+
try {
|
|
16
|
+
return statSync(p).isDirectory();
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** `<checkout>/.trail` is a folder and not the Trail home itself (a home folder that is a work tree). */
|
|
23
|
+
function hasTrailFolder(checkout, env) {
|
|
24
|
+
const dot = join(checkout, '.trail');
|
|
25
|
+
if (!isDir(dot))
|
|
26
|
+
return false;
|
|
27
|
+
try {
|
|
28
|
+
return realpathSync(dot) !== realpathSync(trailHome(env));
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function inIndex(key, env) {
|
|
35
|
+
const raw = readJsonSafe(trailPath(env, 'repos', 'index.json'));
|
|
36
|
+
if (!raw || typeof raw !== 'object')
|
|
37
|
+
return false;
|
|
38
|
+
const map = (v) => (v && typeof v === 'object' && !Array.isArray(v) ? v : {});
|
|
39
|
+
const aliases = map(raw.aliases);
|
|
40
|
+
if (Object.prototype.hasOwnProperty.call(aliases, key) || Object.values(aliases).includes(key))
|
|
41
|
+
return true;
|
|
42
|
+
return Object.values(map(raw.roots)).includes(key);
|
|
43
|
+
}
|
|
44
|
+
/** Never throws: a read that fails knows nothing. */
|
|
45
|
+
export function repoKnown(key, checkout, env) {
|
|
46
|
+
try {
|
|
47
|
+
if (checkout && hasTrailFolder(checkout, env))
|
|
48
|
+
return true;
|
|
49
|
+
return typeof key === 'string' && key !== '' && inIndex(key, env);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=known-repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"known-repo.js","sourceRoot":"","sources":["../../src/trace/known-repo.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEhE,SAAS,KAAK,CAAC,CAAS;IACtB,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,yGAAyG;AACzG,SAAS,cAAc,CAAC,QAAgB,EAAE,GAAsB;IAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACrC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9B,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,GAAG,CAAC,KAAK,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,GAAW,EAAE,GAAsB;IAClD,MAAM,GAAG,GAAG,YAAY,CAAyC,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;IACxG,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAClD,MAAM,GAAG,GAAG,CAAC,CAAU,EAA2B,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAA6B,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7I,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5G,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACrD,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,SAAS,CAAC,GAA8B,EAAE,QAAmC,EAAE,GAAsB;IACnH,IAAI,CAAC;QACH,IAAI,QAAQ,IAAI,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3D,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,EAAE,IAAI,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { JobClass, JobMatch } from './types.js';
|
|
2
|
+
export interface PoolDay {
|
|
3
|
+
d: string;
|
|
4
|
+
s: string;
|
|
5
|
+
costly: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface PoolEntry {
|
|
8
|
+
words: string[];
|
|
9
|
+
days: PoolDay[];
|
|
10
|
+
lastGoodRun: string | null;
|
|
11
|
+
lastSeen: string;
|
|
12
|
+
shownAtInit: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface PoolFile {
|
|
15
|
+
v: 1;
|
|
16
|
+
jobs: Partial<Record<JobClass, PoolEntry>>;
|
|
17
|
+
}
|
|
18
|
+
export interface RepeatVerdict {
|
|
19
|
+
ok: boolean;
|
|
20
|
+
sessionDays: number;
|
|
21
|
+
dates: number;
|
|
22
|
+
costlyDays: number;
|
|
23
|
+
need: number;
|
|
24
|
+
}
|
|
25
|
+
/** join(trailHome, 'repos', ...repoKey.split('/'), 'pool.json'): the same folder as repoPlace(..).dir. */
|
|
26
|
+
export declare function poolPath(repoKey: string, env?: NodeJS.ProcessEnv): string;
|
|
27
|
+
export declare function readPool(repoKey: string, env?: NodeJS.ProcessEnv): PoolFile;
|
|
28
|
+
/** 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. */
|
|
29
|
+
export declare function notePoolDay(repoKey: string, m: JobMatch, day: PoolDay, goodRun: string | null, env?: NodeJS.ProcessEnv, now?: Date): PoolEntry | null;
|
|
30
|
+
/** 3rd session-day in 45 days (4th when extraDay), at least 2 of them costly. */
|
|
31
|
+
export declare function repeatedEnough(e: PoolEntry, extraDay: boolean, now?: Date): RepeatVerdict;
|
|
32
|
+
/** Every job counted in the last 45 days, every repo, for `trail skills` (2.10). */
|
|
33
|
+
export declare function watching(env?: NodeJS.ProcessEnv, now?: Date): Array<{
|
|
34
|
+
repoKey: string;
|
|
35
|
+
job: JobClass;
|
|
36
|
+
sessionDays: number;
|
|
37
|
+
costlyDays: number;
|
|
38
|
+
need: number;
|
|
39
|
+
}>;
|
|
40
|
+
//# sourceMappingURL=pool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../src/trace/pool.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAErD,MAAM,WAAW,OAAO;IAAG,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE;AAClE,MAAM,WAAW,SAAS;IAAG,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,OAAO,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE;AACnI,MAAM,WAAW,QAAQ;IAAG,CAAC,EAAE,CAAC,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAA;CAAE;AAC9E,MAAM,WAAW,aAAa;IAAG,EAAE,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAepH,0GAA0G;AAC1G,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAGzE;AA6BD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,QAAQ,CAE3E;AAED,+JAA+J;AAC/J,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,GAAE,IAAiB,GAAG,SAAS,GAAG,IAAI,CAyBjK;AAED,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,GAAE,IAAiB,GAAG,aAAa,CASrG;AA4BD,oFAAoF;AACpF,wBAAgB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,GAAE,IAAiB,GAAG,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,QAAQ,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAa1K"}
|