@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,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The file side of kept versions (versions.ts): plain reads that never
|
|
3
|
+
* follow a link or open a FIFO, synced writes, folders kept whole by temp
|
|
4
|
+
* folder and rename, pruning, lesson files by id and kind, and swapping a
|
|
5
|
+
* skill's scripts/ with a way back. Nothing here decides whether to write.
|
|
6
|
+
*/
|
|
7
|
+
import { randomBytes } from 'node:crypto';
|
|
8
|
+
import { closeSync, fsyncSync, lstatSync, mkdirSync, openSync, readdirSync, readFileSync, renameSync, rmSync, writeSync } from 'node:fs';
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { MAX_SKILL_BYTES } from './store-fs.js';
|
|
11
|
+
import { localDate } from './settings.js';
|
|
12
|
+
import { matter } from '../util/front-matter.js';
|
|
13
|
+
import { isGuardrailLesson } from './lessons.js';
|
|
14
|
+
const HAND_KEPT = 3;
|
|
15
|
+
export const V_DIR = /^v([1-9]\d{0,5})$/;
|
|
16
|
+
export function versionsDir(ref) {
|
|
17
|
+
return join(ref.dir, '.versions');
|
|
18
|
+
}
|
|
19
|
+
export const lst = (p) => {
|
|
20
|
+
try {
|
|
21
|
+
return lstatSync(p);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
/** The text of a regular file of at most 64 KB, never through a link; null otherwise (a FIFO is never opened). */
|
|
28
|
+
export function regularText(path) {
|
|
29
|
+
const s = lst(path);
|
|
30
|
+
if (!s?.isFile() || s.size > MAX_SKILL_BYTES)
|
|
31
|
+
return null;
|
|
32
|
+
try {
|
|
33
|
+
return readFileSync(path, 'utf8');
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** A new file, written and synced (O_EXCL: never over something there). */
|
|
40
|
+
export function writeSynced(path, data, mode = 0o600) {
|
|
41
|
+
const fd = openSync(path, 'wx', mode);
|
|
42
|
+
try {
|
|
43
|
+
const buf = Buffer.from(data, 'utf8');
|
|
44
|
+
for (let off = 0; off < buf.length;)
|
|
45
|
+
off += writeSync(fd, buf, off, buf.length - off);
|
|
46
|
+
fsyncSync(fd);
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
closeSync(fd);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export function syncDir(dir) {
|
|
53
|
+
try {
|
|
54
|
+
const fd = openSync(dir, 'r');
|
|
55
|
+
try {
|
|
56
|
+
fsyncSync(fd);
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
closeSync(fd);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch { /* not every platform syncs a folder */ }
|
|
63
|
+
}
|
|
64
|
+
/** A folder of ours, made 0700; a link or a file in its place refuses (throws). */
|
|
65
|
+
export function ownDir(dir) {
|
|
66
|
+
const s = lst(dir);
|
|
67
|
+
if (s && !s.isDirectory())
|
|
68
|
+
throw new LinkError(dir);
|
|
69
|
+
if (!s)
|
|
70
|
+
mkdirSync(dir, { mode: 0o700 });
|
|
71
|
+
}
|
|
72
|
+
export class LinkError extends Error {
|
|
73
|
+
}
|
|
74
|
+
/** The plain files of `from` (scripts/, lessons/) copied into a new folder `to`; links and folders inside are left out. */
|
|
75
|
+
export function copyFlat(from, to, mode, only) {
|
|
76
|
+
if (!lst(from)?.isDirectory())
|
|
77
|
+
return 0;
|
|
78
|
+
let n = 0;
|
|
79
|
+
for (const name of readdirSync(from)) {
|
|
80
|
+
if (name.startsWith('.') || (only && !only(name)))
|
|
81
|
+
continue;
|
|
82
|
+
const s = lst(join(from, name));
|
|
83
|
+
if (!s?.isFile() || s.size > MAX_SKILL_BYTES)
|
|
84
|
+
continue;
|
|
85
|
+
if (!n)
|
|
86
|
+
mkdirSync(to, { mode: 0o700 });
|
|
87
|
+
writeSynced(join(to, name), readFileSync(join(from, name), 'utf8'), mode);
|
|
88
|
+
n++;
|
|
89
|
+
}
|
|
90
|
+
return n;
|
|
91
|
+
}
|
|
92
|
+
export const tmpName = (dir, tag) => join(dir, `.${tag}.tmp-${randomBytes(4).toString('hex')}`);
|
|
93
|
+
/**
|
|
94
|
+
* `.versions/<name>/` holding `text` as SKILL.md (and `scripts` copied when given): written in a temp folder, synced,
|
|
95
|
+
* renamed into place. A folder already there with the same SKILL.md is reused; with other bytes, 'changed'.
|
|
96
|
+
*/
|
|
97
|
+
export function keepFolder(ref, name, text, scripts) {
|
|
98
|
+
const vdir = versionsDir(ref);
|
|
99
|
+
ownDir(vdir);
|
|
100
|
+
const at = join(vdir, name);
|
|
101
|
+
if (lst(at))
|
|
102
|
+
return regularText(join(at, 'SKILL.md')) === text && lst(at).isDirectory() ? 'same' : 'changed';
|
|
103
|
+
const tmp = tmpName(vdir, name);
|
|
104
|
+
mkdirSync(tmp, { mode: 0o700 });
|
|
105
|
+
try {
|
|
106
|
+
writeSynced(join(tmp, 'SKILL.md'), text);
|
|
107
|
+
if (scripts)
|
|
108
|
+
copyFlat(scripts, join(tmp, 'scripts'), 0o700);
|
|
109
|
+
syncDir(tmp);
|
|
110
|
+
renameSync(tmp, at);
|
|
111
|
+
syncDir(vdir);
|
|
112
|
+
return 'kept';
|
|
113
|
+
}
|
|
114
|
+
catch (e) {
|
|
115
|
+
rmSync(tmp, { recursive: true, force: true });
|
|
116
|
+
throw e;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/** The person's edited file kept as `hand-<date>` (`-2`, `-3` the same day; the same bytes reuse it), the last 3 kept. */
|
|
120
|
+
export function keepHand(ref, text, now) {
|
|
121
|
+
const base = `hand-${localDate(now)}`;
|
|
122
|
+
for (let k = 1; k < 100; k++) {
|
|
123
|
+
const name = k === 1 ? base : `${base}-${k}`;
|
|
124
|
+
const r = keepFolder(ref, name, text, null);
|
|
125
|
+
if (r !== 'changed') {
|
|
126
|
+
prune(ref, /^hand-\d{4}-\d{2}-\d{2}(?:-\d+)?$/, HAND_KEPT, name);
|
|
127
|
+
return name;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
throw new Error('trail: too many kept copies of this skill today');
|
|
131
|
+
}
|
|
132
|
+
/** Removes the oldest folders matching `re` past `keep` (by version number, else by name), never `spare`. */
|
|
133
|
+
export function prune(ref, re, keep, spare) {
|
|
134
|
+
let names;
|
|
135
|
+
try {
|
|
136
|
+
names = readdirSync(versionsDir(ref)).filter((n) => re.test(n) && n !== spare && lst(join(versionsDir(ref), n))?.isDirectory());
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const key = (n) => V_DIR.exec(n)?.[1] ?? n;
|
|
142
|
+
names.sort((a, b) => key(a).localeCompare(key(b), 'en', { numeric: true }));
|
|
143
|
+
const extra = names.length + (spare ? 1 : 0) - keep;
|
|
144
|
+
for (const n of names.slice(0, Math.max(0, extra)))
|
|
145
|
+
rmSync(join(versionsDir(ref), n), { recursive: true, force: true });
|
|
146
|
+
}
|
|
147
|
+
/** The top-level lesson files of a skill folder, with the id and kind readLessons gives them. */
|
|
148
|
+
export function lessonFiles(dir) {
|
|
149
|
+
let names;
|
|
150
|
+
try {
|
|
151
|
+
if (!lst(join(dir, 'lessons'))?.isDirectory())
|
|
152
|
+
return [];
|
|
153
|
+
names = readdirSync(join(dir, 'lessons')).filter((n) => n.endsWith('.md') && !n.startsWith('.'));
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return [];
|
|
157
|
+
}
|
|
158
|
+
return names.flatMap((name) => {
|
|
159
|
+
const text = regularText(join(dir, 'lessons', name));
|
|
160
|
+
if (text === null)
|
|
161
|
+
return [];
|
|
162
|
+
const fm = matter(text, { scalars: ['id', 'kind', 'skill', 'src', 'at', 'wall'] });
|
|
163
|
+
if (fm.refused)
|
|
164
|
+
return [];
|
|
165
|
+
const d = fm.data;
|
|
166
|
+
const id = typeof d.id === 'string' ? d.id : '';
|
|
167
|
+
const lesson = { text: String(fm.content ?? ''), kind: d.kind === 'guardrail' ? 'guardrail' : 'lesson' };
|
|
168
|
+
return [{ name, id, guardrail: isGuardrailLesson(lesson) }];
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
/** Moves lesson files into `to` (made 0700); a move that fails leaves the lesson riding the block, which is harmless. */
|
|
172
|
+
export function moveLessons(dir, files, to) {
|
|
173
|
+
if (!files.length)
|
|
174
|
+
return;
|
|
175
|
+
try {
|
|
176
|
+
ownDir(to);
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
for (const f of files) {
|
|
182
|
+
try {
|
|
183
|
+
renameSync(join(dir, 'lessons', f.name), join(to, f.name));
|
|
184
|
+
}
|
|
185
|
+
catch { /* stays where it was */ }
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/** scripts/ replaced by the files in `from` (a folder) or `helpers`; `undo` puts the old ones back, `done` drops them. */
|
|
189
|
+
export function swapScripts(ref, src) {
|
|
190
|
+
const scripts = join(ref.dir, 'scripts');
|
|
191
|
+
const s = lst(scripts);
|
|
192
|
+
if (s && !s.isDirectory())
|
|
193
|
+
throw new LinkError(scripts);
|
|
194
|
+
const tmp = tmpName(ref.dir, 'scripts');
|
|
195
|
+
mkdirSync(tmp, { mode: 0o700 });
|
|
196
|
+
try {
|
|
197
|
+
if (src.from)
|
|
198
|
+
copyFlat(src.from, join(tmp, 'new'), 0o700);
|
|
199
|
+
else {
|
|
200
|
+
mkdirSync(join(tmp, 'new'), { mode: 0o700 });
|
|
201
|
+
for (const h of src.helpers ?? []) {
|
|
202
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/.test(h.file))
|
|
203
|
+
throw new Error('trail: a helper script needs a plain file name');
|
|
204
|
+
writeSynced(join(tmp, 'new', h.file), h.content, 0o700);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
if (!lst(join(tmp, 'new')))
|
|
208
|
+
mkdirSync(join(tmp, 'new'), { mode: 0o700 });
|
|
209
|
+
if (s)
|
|
210
|
+
renameSync(scripts, join(tmp, 'old'));
|
|
211
|
+
renameSync(join(tmp, 'new'), scripts);
|
|
212
|
+
}
|
|
213
|
+
catch (e) {
|
|
214
|
+
if (!lst(scripts) && lst(join(tmp, 'old')))
|
|
215
|
+
renameSync(join(tmp, 'old'), scripts);
|
|
216
|
+
rmSync(tmp, { recursive: true, force: true });
|
|
217
|
+
throw e;
|
|
218
|
+
}
|
|
219
|
+
return {
|
|
220
|
+
undo: () => {
|
|
221
|
+
try {
|
|
222
|
+
if (lst(join(tmp, 'old'))) {
|
|
223
|
+
rmSync(scripts, { recursive: true, force: true });
|
|
224
|
+
renameSync(join(tmp, 'old'), scripts);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
finally {
|
|
228
|
+
rmSync(tmp, { recursive: true, force: true });
|
|
229
|
+
}
|
|
230
|
+
},
|
|
231
|
+
done: () => rmSync(tmp, { recursive: true, force: true }),
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=versions-fs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versions-fs.js","sourceRoot":"","sources":["../../src/skills/versions-fs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAc,MAAM,SAAS,CAAC;AACrJ,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAe,MAAM,cAAc,CAAC;AAE9D,MAAM,SAAS,GAAG,CAAC,CAAC;AACpB,MAAM,CAAC,MAAM,KAAK,GAAG,mBAAmB,CAAC;AAEzC,MAAM,UAAU,WAAW,CAAC,GAAa;IACvC,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAgB,EAAE;IAC7C,IAAI,CAAC;QACH,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAGF,kHAAkH;AAClH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,GAAG,eAAe;QAAE,OAAO,IAAI,CAAC;IAC1D,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,IAAY,EAAE,IAAI,GAAG,KAAK;IAClE,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACtC,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC,MAAM;YAAI,GAAG,IAAI,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;QACvF,SAAS,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC;YAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;gBAAS,CAAC;YAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC,CAAC,uCAAuC,CAAC,CAAC;AACrD,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,MAAM,CAAC,GAAW;IAChC,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IACnB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;QAAE,MAAM,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC;IACpD,IAAI,CAAC,CAAC;QAAE,SAAS,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1C,CAAC;AACD,MAAM,OAAO,SAAU,SAAQ,KAAK;CAAG;AAEvC,2HAA2H;AAC3H,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,EAAU,EAAE,IAAY,EAAE,IAAgC;IAC/F,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE;QAAE,OAAO,CAAC,CAAC;IACxC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAAE,SAAS;QAC5D,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,GAAG,eAAe;YAAE,SAAS;QACvD,IAAI,CAAC,CAAC;YAAE,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACvC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;QAC1E,CAAC,EAAE,CAAC;IACN,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,GAAW,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG,QAAQ,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAEhH;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,GAAa,EAAE,IAAY,EAAE,IAAY,EAAE,OAAsB;IAC1F,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,CAAC,IAAI,CAAC,CAAC;IACb,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5B,IAAI,GAAG,CAAC,EAAE,CAAC;QAAE,OAAO,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,CAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9G,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAChC,SAAS,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAChC,IAAI,CAAC;QACH,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,OAAO;YAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,CAAC;QACb,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,CAAC;IACV,CAAC;AACH,CAAC;AAED,0HAA0H;AAC1H,MAAM,UAAU,QAAQ,CAAC,GAAa,EAAE,IAAY,EAAE,GAAS;IAC7D,MAAM,IAAI,GAAG,QAAQ,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;IACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACpB,KAAK,CAAC,GAAG,EAAE,mCAAmC,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YACjE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;AACrE,CAAC;AAED,6GAA6G;AAC7G,MAAM,UAAU,KAAK,CAAC,GAAa,EAAE,EAAU,EAAE,IAAY,EAAE,KAAc;IAC3E,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IAClI,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5E,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACpD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC1H,CAAC;AAOD,iGAAiG;AACjG,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,EAAE,WAAW,EAAE;YAAE,OAAO,EAAE,CAAC;QACzD,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IACnG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC5B,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;QACrD,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;QAC7B,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACnF,IAAI,EAAE,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,EAAE,CAAC,IAA+B,CAAC;QAC7C,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAY,CAAC;QACnH,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,yHAAyH;AACzH,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,KAAmB,EAAE,EAAU;IACtE,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO;IAC1B,IAAI,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC;YAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,wBAAwB,CAAC,CAAC;IACxG,CAAC;AACH,CAAC;AAID,0HAA0H;AAC1H,MAAM,UAAU,WAAW,CAAC,GAAa,EAAE,GAA0D;IACnG,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;QAAE,MAAM,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACxC,SAAS,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAChC,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,IAAI;YAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;aACrD,CAAC;YACJ,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7C,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;gBAClC,IAAI,CAAC,mCAAmC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;gBACzH,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAAE,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACzE,IAAI,CAAC;YAAE,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QAC7C,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QAClF,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,CAAC;IACV,CAAC;IACD,OAAO;QACL,IAAI,EAAE,GAAG,EAAE;YACT,IAAI,CAAC;gBACH,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;oBAC1B,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;oBAClD,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QACD,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;KAC1D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { ChangeOp, CompiledSkill, FoldOp, SkillRef, SkillState } from './types.js';
|
|
2
|
+
export { versionsDir } from './versions-fs.js';
|
|
3
|
+
export declare const VERSIONS_KEPT = 10;
|
|
4
|
+
export type VersionWhy = 'busy' | 'changed' | 'link' | 'io';
|
|
5
|
+
/** Test seam: runs right before the write's state update (step 4), so a test can hold the state lock. */
|
|
6
|
+
export declare const VERSION_SEAMS: {
|
|
7
|
+
beforeState?: () => void;
|
|
8
|
+
};
|
|
9
|
+
/** Kept version numbers, ascending: `v<n>` folders only (links and files skipped). */
|
|
10
|
+
export declare function listVersions(ref: SkillRef): number[];
|
|
11
|
+
/** The number the next written version gets: one past both the file's own and every kept one. */
|
|
12
|
+
export declare function nextVersion(ref: SkillRef, current: number): number;
|
|
13
|
+
/**
|
|
14
|
+
* 4.5: keeps the current file, writes `next` as the next version, updates state and the ledger. `next.meta.version`
|
|
15
|
+
* must be that next number (`nextVersion`), or nothing is written: the bytes written are the bytes shown.
|
|
16
|
+
*/
|
|
17
|
+
export declare function writeNewVersion(ref: SkillRef, next: CompiledSkill, o: {
|
|
18
|
+
op: ChangeOp;
|
|
19
|
+
offerId: string | null;
|
|
20
|
+
baseHash: string;
|
|
21
|
+
lessonIds?: string[];
|
|
22
|
+
env?: NodeJS.ProcessEnv;
|
|
23
|
+
now?: Date;
|
|
24
|
+
}): {
|
|
25
|
+
ok: true;
|
|
26
|
+
version: number;
|
|
27
|
+
} | {
|
|
28
|
+
ok: false;
|
|
29
|
+
why: 'busy' | 'changed' | 'link' | 'io';
|
|
30
|
+
};
|
|
31
|
+
/** 4.6: the proposal beside a hand-edited file, the person's file kept as hand-<date>. Never touches SKILL.md. */
|
|
32
|
+
export declare function writeProposal(ref: SkillRef, next: CompiledSkill, op: FoldOp | 'replace', env?: NodeJS.ProcessEnv, now?: Date): {
|
|
33
|
+
path: string;
|
|
34
|
+
diff: string;
|
|
35
|
+
hand: string;
|
|
36
|
+
version: number;
|
|
37
|
+
} | null;
|
|
38
|
+
/**
|
|
39
|
+
* 4.6 and R8, from a read of the file (`candidatesHere`): a file equal to an unfinished write's hash finishes it; one
|
|
40
|
+
* equal to the state's hash clears a stale marker; one equal to the proposal is taken as Trail's own (adopted). True
|
|
41
|
+
* when the file was adopted. One compare when nothing is pending; the locks only on a match.
|
|
42
|
+
*/
|
|
43
|
+
export declare function adoptIfCopied(ref: SkillRef, st: SkillState | null, fileHash: string, env?: NodeJS.ProcessEnv, now?: Date): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* 4.12, person only (the CLI checks the terminal; the agent guard denies `restore-version`): `.versions/v<n>/` back
|
|
46
|
+
* as a new version. The current file is kept first (a hand-edited one as hand-<date>, R6). The restored file's
|
|
47
|
+
* `version` is rewritten to the new number through the round trip; one that doesn't round-trip goes back as it is.
|
|
48
|
+
*/
|
|
49
|
+
export declare function restoreVersion(ref: SkillRef, version: number, env?: NodeJS.ProcessEnv, now?: Date): {
|
|
50
|
+
ok: true;
|
|
51
|
+
version: number;
|
|
52
|
+
} | {
|
|
53
|
+
ok: false;
|
|
54
|
+
why: 'unknown' | 'busy' | 'link' | 'io';
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=versions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versions.d.ts","sourceRoot":"","sources":["../../src/skills/versions.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAaxF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,eAAO,MAAM,aAAa,KAAK,CAAC;AAEhC,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC;AAE5D,yGAAyG;AACzG,eAAO,MAAM,aAAa,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;CAAO,CAAC;AAE9D,sFAAsF;AACtF,wBAAgB,YAAY,CAAC,GAAG,EAAE,QAAQ,GAAG,MAAM,EAAE,CAYpD;AAED,iGAAiG;AACjG,wBAAgB,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAElE;AAoJD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE;IAAE,EAAE,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAC9H,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAAA;CAAE,CASrJ;AAID,kHAAkH;AAClH,wBAAgB,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,GAAE,IAAiB,GACvI;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAyBrE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,GAAE,IAAiB,GAAG,OAAO,CA+C9I;AAID;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,GAAE,IAAiB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;CAAE,CAgBtM"}
|
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kept versions of a personal skill (phase 2 design 2.1, 4.5, 4.6, 4.12):
|
|
3
|
+
* `skills/<name>/.versions/`. Trail writes a new SKILL.md only over the file
|
|
4
|
+
* it wrote itself, byte for byte (0 rule 2), and only after the file it is
|
|
5
|
+
* about to replace is kept as `v<n>/` (0 rule 3). A file the person changed
|
|
6
|
+
* is never written: the change goes beside it as `proposed-v<n>/`, with the
|
|
7
|
+
* person's file kept as `hand-<date>/`, and Trail takes the file as its own
|
|
8
|
+
* again only when the person copied the proposal over it, byte for byte.
|
|
9
|
+
*
|
|
10
|
+
* A write marks itself in the state first (`pendingWrite`, R8), so a process
|
|
11
|
+
* killed between the new file and the state is finished on the next read
|
|
12
|
+
* instead of looking hand-edited forever. A state that can't be written
|
|
13
|
+
* puts the old file back (D68). Every path refuses a link, a file that isn't
|
|
14
|
+
* regular, or one over 64 KB, and fails closed: nothing changes.
|
|
15
|
+
*
|
|
16
|
+
* This module never imports the fold (fold.ts imports recall.ts, which
|
|
17
|
+
* calls `adoptIfCopied`): it writes text it is given.
|
|
18
|
+
*/
|
|
19
|
+
import { readdirSync, rmSync } from 'node:fs';
|
|
20
|
+
import { join } from 'node:path';
|
|
21
|
+
import { parseSkillMd, renderSkillMd, skillHash } from './skillmd.js';
|
|
22
|
+
import { getSkillState, updateSkillState } from './state.js';
|
|
23
|
+
import { appendLedger } from './ledger.js';
|
|
24
|
+
import { underStoreLock } from './store-fs.js';
|
|
25
|
+
import { phraseSha } from './staleness.js';
|
|
26
|
+
import { rebuildCompiled } from './skill-rebuild.js';
|
|
27
|
+
import { printDiff } from './skill-diff.js';
|
|
28
|
+
import { writePrivate } from '../util/private-fs.js';
|
|
29
|
+
import { copyFlat, keepFolder, keepHand, lessonFiles, LinkError, lst, moveLessons, ownDir, prune, regularText, swapScripts, V_DIR, versionsDir, } from './versions-fs.js';
|
|
30
|
+
export { versionsDir } from './versions-fs.js';
|
|
31
|
+
export const VERSIONS_KEPT = 10;
|
|
32
|
+
/** Test seam: runs right before the write's state update (step 4), so a test can hold the state lock. */
|
|
33
|
+
export const VERSION_SEAMS = {};
|
|
34
|
+
/** Kept version numbers, ascending: `v<n>` folders only (links and files skipped). */
|
|
35
|
+
export function listVersions(ref) {
|
|
36
|
+
let names;
|
|
37
|
+
try {
|
|
38
|
+
if (!lst(versionsDir(ref))?.isDirectory())
|
|
39
|
+
return [];
|
|
40
|
+
names = readdirSync(versionsDir(ref));
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
return names.flatMap((n) => {
|
|
46
|
+
const m = V_DIR.exec(n);
|
|
47
|
+
return m && lst(join(versionsDir(ref), n))?.isDirectory() ? [Number(m[1])] : [];
|
|
48
|
+
}).sort((a, b) => a - b);
|
|
49
|
+
}
|
|
50
|
+
/** The number the next written version gets: one past both the file's own and every kept one. */
|
|
51
|
+
export function nextVersion(ref, current) {
|
|
52
|
+
return Math.max(current, 0, ...listVersions(ref)) + 1;
|
|
53
|
+
}
|
|
54
|
+
const intOf = (v) => (typeof v === 'string' && /^[1-9]\d{0,5}$/.test(v) ? Number(v) : 1);
|
|
55
|
+
/** 2.2: what a new version resets. Uses, checked uses, where it came from and when it was added stay. */
|
|
56
|
+
function versionReset(s, hash, asks, at) {
|
|
57
|
+
s.hash = hash;
|
|
58
|
+
s.status = 'candidate';
|
|
59
|
+
s.changedAt = at;
|
|
60
|
+
s.firings = [];
|
|
61
|
+
s.lastFails = [];
|
|
62
|
+
delete s.statusWhy;
|
|
63
|
+
delete s.prevStatus;
|
|
64
|
+
delete s.fixHash;
|
|
65
|
+
s.proposed = null;
|
|
66
|
+
s.pendingWrite = null;
|
|
67
|
+
const keep = new Set(asks.split(',').map((p) => p.trim()).filter(Boolean).map(phraseSha));
|
|
68
|
+
if (s.cueMisses && typeof s.cueMisses === 'object')
|
|
69
|
+
s.cueMisses = Object.fromEntries(Object.entries(s.cueMisses).filter(([k]) => keep.has(k)));
|
|
70
|
+
}
|
|
71
|
+
const clearPending = (id, env) => {
|
|
72
|
+
try {
|
|
73
|
+
updateSkillState(id, (s) => (s ? { ...s, pendingWrite: null } : s), env);
|
|
74
|
+
}
|
|
75
|
+
catch { /* the marker is harmless: its hash isn't the file's */ }
|
|
76
|
+
};
|
|
77
|
+
/** 4.5 steps 1 to 6 under the store lock, then the state lock. */
|
|
78
|
+
function commit(ref, c, env, now) {
|
|
79
|
+
if (ref.scope !== 'personal')
|
|
80
|
+
return { ok: false, why: 'changed' };
|
|
81
|
+
try {
|
|
82
|
+
return underStoreLock(env, () => commitLocked(ref, c, env, now));
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
if (e instanceof LinkError)
|
|
86
|
+
return { ok: false, why: 'link' };
|
|
87
|
+
return { ok: false, why: /busy/.test(e instanceof Error ? e.message : '') ? 'busy' : 'io' };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function commitLocked(ref, c, env, now) {
|
|
91
|
+
// 1. The folder and the file are Trail's: no link, a regular file of at most 64 KB, Trail's own bytes.
|
|
92
|
+
const dirSt = lst(ref.dir);
|
|
93
|
+
if (!dirSt || dirSt.isSymbolicLink())
|
|
94
|
+
return { ok: false, why: dirSt ? 'link' : 'io' };
|
|
95
|
+
if (!dirSt.isDirectory())
|
|
96
|
+
return { ok: false, why: 'io' };
|
|
97
|
+
const vs = lst(versionsDir(ref));
|
|
98
|
+
if (vs && !vs.isDirectory())
|
|
99
|
+
return { ok: false, why: 'link' };
|
|
100
|
+
const fileSt = lst(ref.file);
|
|
101
|
+
if (fileSt?.isSymbolicLink())
|
|
102
|
+
return { ok: false, why: 'link' };
|
|
103
|
+
const text = regularText(ref.file);
|
|
104
|
+
if (text === null)
|
|
105
|
+
return { ok: false, why: 'changed' };
|
|
106
|
+
const parsed = parseSkillMd(text, ref.name);
|
|
107
|
+
const st = getSkillState(ref.id, env);
|
|
108
|
+
if (!parsed || parsed.meta.trail !== ref.id || !st || st.scope !== 'personal')
|
|
109
|
+
return { ok: false, why: 'changed' };
|
|
110
|
+
const hash = skillHash(text);
|
|
111
|
+
const handEdited = hash !== st.hash;
|
|
112
|
+
if (c.baseHash !== null && (handEdited || hash !== c.baseHash))
|
|
113
|
+
return { ok: false, why: 'changed' };
|
|
114
|
+
const from = intOf(parsed.meta.version);
|
|
115
|
+
const to = nextVersion(ref, from);
|
|
116
|
+
if (c.expect !== undefined && c.expect !== to)
|
|
117
|
+
return { ok: false, why: 'changed' };
|
|
118
|
+
const next = c.render(to);
|
|
119
|
+
const nextHash = skillHash(next);
|
|
120
|
+
const at = now.toISOString();
|
|
121
|
+
if (!updateSkillState(ref.id, (s) => (s ? { ...s, pendingWrite: { hash: nextHash, from, at } } : s), env))
|
|
122
|
+
return { ok: false, why: 'busy' };
|
|
123
|
+
let swap = null;
|
|
124
|
+
try {
|
|
125
|
+
// 2. The file it replaces is kept first: Trail's own as v<from>, a hand-edited one (a restore only) as hand-<date>.
|
|
126
|
+
let keptAs = null;
|
|
127
|
+
if (handEdited)
|
|
128
|
+
keepHand(ref, text, now);
|
|
129
|
+
else {
|
|
130
|
+
keptAs = `v${from}`;
|
|
131
|
+
if (keepFolder(ref, keptAs, text, join(ref.dir, 'scripts')) === 'changed') {
|
|
132
|
+
clearPending(ref.id, env);
|
|
133
|
+
return { ok: false, why: 'changed' };
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// 3. The new file (temp file and rename), and for a replace or restore its scripts.
|
|
137
|
+
if (c.helpers)
|
|
138
|
+
swap = swapScripts(ref, { helpers: c.helpers });
|
|
139
|
+
else if (c.restoreFrom && lst(join(c.restoreFrom, 'scripts'))?.isDirectory())
|
|
140
|
+
swap = swapScripts(ref, { from: join(c.restoreFrom, 'scripts') });
|
|
141
|
+
writePrivate(ref.file, next);
|
|
142
|
+
if (regularText(ref.file) !== next)
|
|
143
|
+
throw new Error('trail: the new SKILL.md did not read back');
|
|
144
|
+
// 4. The state, then the ledger line. A state that can't be written puts the old file back (D68).
|
|
145
|
+
VERSION_SEAMS.beforeState?.();
|
|
146
|
+
const asks = String(parseSkillMd(next, ref.name)?.meta.asks ?? '');
|
|
147
|
+
const done = updateSkillState(ref.id, (s) => {
|
|
148
|
+
if (!s)
|
|
149
|
+
return s;
|
|
150
|
+
versionReset(s, nextHash, asks, at);
|
|
151
|
+
return s;
|
|
152
|
+
}, env);
|
|
153
|
+
if (!done) {
|
|
154
|
+
putBack(ref, text, swap);
|
|
155
|
+
swap = null;
|
|
156
|
+
clearPending(ref.id, env);
|
|
157
|
+
return { ok: false, why: 'busy' };
|
|
158
|
+
}
|
|
159
|
+
try {
|
|
160
|
+
swap?.done();
|
|
161
|
+
}
|
|
162
|
+
catch { /* the old scripts stay in a dot folder nobody reads */ }
|
|
163
|
+
swap = null;
|
|
164
|
+
try {
|
|
165
|
+
appendLedger(ref.id, { at, event: 'changed', skill: ref.id, op: c.op, from, to, offerId: c.offerId, ...(c.lessonIds?.length ? { lessonIds: c.lessonIds } : {}) }, env);
|
|
166
|
+
}
|
|
167
|
+
catch { /* the state is the truth; the ledger is its record */ }
|
|
168
|
+
// 5. Lessons: folded ones move to lessons/.folded; a replace's go with the old version; a restore brings its own back.
|
|
169
|
+
try {
|
|
170
|
+
const files = lessonFiles(ref.dir);
|
|
171
|
+
if (c.lessonIds?.length)
|
|
172
|
+
moveLessons(ref.dir, files.filter((f) => c.lessonIds.includes(f.id)), join(ref.dir, 'lessons', '.folded'));
|
|
173
|
+
if (c.replace && keptAs)
|
|
174
|
+
moveLessons(ref.dir, files.filter((f) => !f.guardrail), join(versionsDir(ref), keptAs, 'lessons'));
|
|
175
|
+
if (c.restoreFrom && lst(join(c.restoreFrom, 'lessons'))?.isDirectory()) {
|
|
176
|
+
const have = new Set(files.map((f) => f.name));
|
|
177
|
+
copyFlat(join(c.restoreFrom, 'lessons'), join(ref.dir, 'lessons'), 0o600, (n) => n.endsWith('.md') && !have.has(n));
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch { /* a lesson left riding the block is harmless */ }
|
|
181
|
+
// 6. Ten kept versions.
|
|
182
|
+
prune(ref, V_DIR, VERSIONS_KEPT);
|
|
183
|
+
return { ok: true, version: to };
|
|
184
|
+
}
|
|
185
|
+
catch (e) {
|
|
186
|
+
putBack(ref, text, swap);
|
|
187
|
+
clearPending(ref.id, env);
|
|
188
|
+
if (e instanceof LinkError)
|
|
189
|
+
return { ok: false, why: 'link' };
|
|
190
|
+
return { ok: false, why: 'io' };
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/** The old file (and scripts) back, when it isn't already. */
|
|
194
|
+
function putBack(ref, text, swap) {
|
|
195
|
+
try {
|
|
196
|
+
if (regularText(ref.file) !== text)
|
|
197
|
+
writePrivate(ref.file, text);
|
|
198
|
+
}
|
|
199
|
+
catch { /* the marker lets the next read tell the new file from a hand edit */ }
|
|
200
|
+
try {
|
|
201
|
+
swap?.undo();
|
|
202
|
+
}
|
|
203
|
+
catch { /* scripts/ as the new version left it */ }
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* 4.5: keeps the current file, writes `next` as the next version, updates state and the ledger. `next.meta.version`
|
|
207
|
+
* must be that next number (`nextVersion`), or nothing is written: the bytes written are the bytes shown.
|
|
208
|
+
*/
|
|
209
|
+
export function writeNewVersion(ref, next, o) {
|
|
210
|
+
if (typeof o.baseHash !== 'string' || !o.baseHash)
|
|
211
|
+
return { ok: false, why: 'changed' };
|
|
212
|
+
const replace = o.op === 'replace';
|
|
213
|
+
return commit(ref, {
|
|
214
|
+
render: (v) => renderSkillMd({ ...next, meta: { ...next.meta, version: String(v) } }),
|
|
215
|
+
op: o.op, offerId: o.offerId, baseHash: o.baseHash, lessonIds: o.op === 'extend' ? o.lessonIds : undefined,
|
|
216
|
+
// A fold keeps scripts/ as it is (a rebuilt skill's helpers are names only); a replace writes the fresh compile's (R22).
|
|
217
|
+
helpers: replace ? next.helpers : null, replace, expect: Number(next.meta.version),
|
|
218
|
+
}, o.env, o.now ?? new Date());
|
|
219
|
+
}
|
|
220
|
+
/* ---------------------------------------------------------- hand edits (4.6) */
|
|
221
|
+
/** 4.6: the proposal beside a hand-edited file, the person's file kept as hand-<date>. Never touches SKILL.md. */
|
|
222
|
+
export function writeProposal(ref, next, op, env, now = new Date()) {
|
|
223
|
+
if (ref.scope !== 'personal')
|
|
224
|
+
return null;
|
|
225
|
+
try {
|
|
226
|
+
return underStoreLock(env, () => {
|
|
227
|
+
const dirSt = lst(ref.dir);
|
|
228
|
+
if (!dirSt?.isDirectory() || lst(ref.file)?.isSymbolicLink())
|
|
229
|
+
return null;
|
|
230
|
+
const current = regularText(ref.file);
|
|
231
|
+
if (current === null)
|
|
232
|
+
return null;
|
|
233
|
+
const version = intOf(next.meta.version);
|
|
234
|
+
const text = renderSkillMd(next);
|
|
235
|
+
const name = `proposed-v${version}`;
|
|
236
|
+
// One proposal at a time: an older one goes first.
|
|
237
|
+
ownDir(versionsDir(ref));
|
|
238
|
+
for (const n of readdirSync(versionsDir(ref)))
|
|
239
|
+
if (/^proposed-/.test(n) && n !== name)
|
|
240
|
+
rmSync(join(versionsDir(ref), n), { recursive: true, force: true });
|
|
241
|
+
if (lst(join(versionsDir(ref), name)))
|
|
242
|
+
rmSync(join(versionsDir(ref), name), { recursive: true, force: true });
|
|
243
|
+
keepFolder(ref, name, text, null);
|
|
244
|
+
const hand = keepHand(ref, current, now);
|
|
245
|
+
const done = updateSkillState(ref.id, (s) => (s ? { ...s, proposed: { hash: skillHash(text), version, op, at: now.toISOString() } } : s), env);
|
|
246
|
+
if (!done)
|
|
247
|
+
return null;
|
|
248
|
+
const path = join(versionsDir(ref), name, 'SKILL.md');
|
|
249
|
+
return { path, hand, version, diff: printDiff(current, text, [`${ref.name}/SKILL.md (yours)`, `${ref.name}/.versions/${name}/SKILL.md`]) };
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
return null;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* 4.6 and R8, from a read of the file (`candidatesHere`): a file equal to an unfinished write's hash finishes it; one
|
|
258
|
+
* equal to the state's hash clears a stale marker; one equal to the proposal is taken as Trail's own (adopted). True
|
|
259
|
+
* when the file was adopted. One compare when nothing is pending; the locks only on a match.
|
|
260
|
+
*/
|
|
261
|
+
export function adoptIfCopied(ref, st, fileHash, env, now = new Date()) {
|
|
262
|
+
if (!st || ref.scope !== 'personal' || typeof fileHash !== 'string')
|
|
263
|
+
return false;
|
|
264
|
+
const pending = st.pendingWrite && typeof st.pendingWrite === 'object' ? st.pendingWrite : null;
|
|
265
|
+
const proposed = st.proposed && typeof st.proposed === 'object' ? st.proposed : null;
|
|
266
|
+
if (pending && (fileHash === pending.hash || fileHash === st.hash)) {
|
|
267
|
+
// Under the store lock (a try): a write still running holds it, so its own new file is never "finished" here and
|
|
268
|
+
// then put back by that write (D68), which would leave Trail's file looking hand-edited. The file is read again inside.
|
|
269
|
+
try {
|
|
270
|
+
underStoreLock(env, () => {
|
|
271
|
+
const text = regularText(ref.file);
|
|
272
|
+
const now = text === null ? null : skillHash(text);
|
|
273
|
+
if (now !== fileHash)
|
|
274
|
+
return;
|
|
275
|
+
const asks = fileHash === pending.hash ? String(parseSkillMd(text, ref.name)?.meta.asks ?? '') : null;
|
|
276
|
+
updateSkillState(ref.id, (s) => {
|
|
277
|
+
if (!s?.pendingWrite)
|
|
278
|
+
return s;
|
|
279
|
+
if (fileHash === s.pendingWrite.hash)
|
|
280
|
+
versionReset(s, fileHash, asks ?? '', s.pendingWrite.at);
|
|
281
|
+
else if (fileHash === s.hash)
|
|
282
|
+
s.pendingWrite = null;
|
|
283
|
+
return s;
|
|
284
|
+
}, env);
|
|
285
|
+
}, 200);
|
|
286
|
+
}
|
|
287
|
+
catch { /* busy: the next read finishes it */ }
|
|
288
|
+
return false;
|
|
289
|
+
}
|
|
290
|
+
if (!proposed || fileHash !== proposed.hash)
|
|
291
|
+
return false;
|
|
292
|
+
let adopted = false;
|
|
293
|
+
try {
|
|
294
|
+
underStoreLock(env, () => {
|
|
295
|
+
const text = regularText(ref.file);
|
|
296
|
+
if (text === null || skillHash(text) !== fileHash || lst(ref.dir)?.isSymbolicLink())
|
|
297
|
+
return;
|
|
298
|
+
const asks = String(parseSkillMd(text, ref.name)?.meta.asks ?? '');
|
|
299
|
+
const at = now.toISOString();
|
|
300
|
+
const done = updateSkillState(ref.id, (s) => {
|
|
301
|
+
if (!s?.proposed || s.proposed.hash !== fileHash)
|
|
302
|
+
return s;
|
|
303
|
+
versionReset(s, fileHash, asks, at);
|
|
304
|
+
adopted = true;
|
|
305
|
+
return s;
|
|
306
|
+
}, env);
|
|
307
|
+
if (!done || !adopted)
|
|
308
|
+
return;
|
|
309
|
+
try {
|
|
310
|
+
appendLedger(ref.id, { at, event: 'changed', skill: ref.id, op: 'adopted', from: Math.max(0, proposed.version - 1), to: proposed.version, offerId: null }, env);
|
|
311
|
+
}
|
|
312
|
+
catch { /* the state is the truth */ }
|
|
313
|
+
try {
|
|
314
|
+
rmSync(join(versionsDir(ref), `proposed-v${proposed.version}`), { recursive: true, force: true });
|
|
315
|
+
}
|
|
316
|
+
catch { /* left beside it */ }
|
|
317
|
+
}, 200);
|
|
318
|
+
}
|
|
319
|
+
catch {
|
|
320
|
+
return false;
|
|
321
|
+
}
|
|
322
|
+
return adopted;
|
|
323
|
+
}
|
|
324
|
+
/* ------------------------------------------------------- restore (4.12, P28) */
|
|
325
|
+
/**
|
|
326
|
+
* 4.12, person only (the CLI checks the terminal; the agent guard denies `restore-version`): `.versions/v<n>/` back
|
|
327
|
+
* as a new version. The current file is kept first (a hand-edited one as hand-<date>, R6). The restored file's
|
|
328
|
+
* `version` is rewritten to the new number through the round trip; one that doesn't round-trip goes back as it is.
|
|
329
|
+
*/
|
|
330
|
+
export function restoreVersion(ref, version, env, now = new Date()) {
|
|
331
|
+
if (!Number.isSafeInteger(version) || version < 1)
|
|
332
|
+
return { ok: false, why: 'unknown' };
|
|
333
|
+
const from = join(versionsDir(ref), `v${version}`);
|
|
334
|
+
const fs = lst(from);
|
|
335
|
+
if (fs?.isSymbolicLink() || lst(versionsDir(ref))?.isSymbolicLink())
|
|
336
|
+
return { ok: false, why: 'link' };
|
|
337
|
+
const old = fs?.isDirectory() ? regularText(join(from, 'SKILL.md')) : null;
|
|
338
|
+
const parsed = old === null ? null : parseSkillMd(old, ref.name);
|
|
339
|
+
if (old === null || !parsed || parsed.meta.trail !== ref.id)
|
|
340
|
+
return { ok: false, why: 'unknown' };
|
|
341
|
+
const st = getSkillState(ref.id, env);
|
|
342
|
+
const rebuilt = rebuildCompiled(old, parsed, { source: st?.source ?? null, helpers: [], runId: st?.runId ?? null });
|
|
343
|
+
const r = commit(ref, {
|
|
344
|
+
render: (v) => (rebuilt ? renderSkillMd({ ...rebuilt, meta: { ...rebuilt.meta, version: String(v) } }) : old),
|
|
345
|
+
op: 'restore-version', offerId: null, baseHash: null, restoreFrom: from,
|
|
346
|
+
}, env, now);
|
|
347
|
+
if (r.ok)
|
|
348
|
+
return r;
|
|
349
|
+
return { ok: false, why: r.why === 'changed' ? 'io' : r.why };
|
|
350
|
+
}
|
|
351
|
+
//# sourceMappingURL=versions.js.map
|