@nanonets/graft 0.24.0 → 0.25.0
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 +26 -21
- 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/blast/render.js +1 -1
- package/dist/blast/render.js.map +1 -1
- package/dist/brand.js +1 -1
- package/dist/brand.js.map +1 -1
- package/dist/check/learning-edits.d.ts +18 -3
- package/dist/check/learning-edits.d.ts.map +1 -1
- package/dist/check/learning-edits.js +54 -10
- package/dist/check/learning-edits.js.map +1 -1
- package/dist/check/local-check.d.ts +7 -3
- package/dist/check/local-check.d.ts.map +1 -1
- package/dist/check/local-check.js +55 -11
- package/dist/check/local-check.js.map +1 -1
- package/dist/check/types.d.ts +11 -2
- package/dist/check/types.d.ts.map +1 -1
- package/dist/claude/format.d.ts +11 -7
- package/dist/claude/format.d.ts.map +1 -1
- package/dist/claude/format.js +50 -28
- 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/hook-layers.d.ts +4 -2
- package/dist/claude/hook-layers.d.ts.map +1 -1
- package/dist/claude/hook-layers.js +21 -4
- package/dist/claude/hook-layers.js.map +1 -1
- package/dist/claude/hooks.d.ts +9 -32
- package/dist/claude/hooks.d.ts.map +1 -1
- package/dist/claude/hooks.js +154 -350
- package/dist/claude/hooks.js.map +1 -1
- package/dist/claude/init.d.ts.map +1 -1
- package/dist/claude/init.js +56 -18
- package/dist/claude/init.js.map +1 -1
- package/dist/claude/note-signals.d.ts +6 -0
- package/dist/claude/note-signals.d.ts.map +1 -1
- package/dist/claude/note-signals.js +14 -3
- package/dist/claude/note-signals.js.map +1 -1
- package/dist/claude/post-bash.d.ts +26 -0
- package/dist/claude/post-bash.d.ts.map +1 -0
- package/dist/claude/post-bash.js +191 -0
- package/dist/claude/post-bash.js.map +1 -0
- package/dist/claude/pre-bash-skills.d.ts +21 -0
- package/dist/claude/pre-bash-skills.d.ts.map +1 -0
- package/dist/claude/pre-bash-skills.js +253 -0
- package/dist/claude/pre-bash-skills.js.map +1 -0
- package/dist/claude/pre-bash.d.ts +50 -0
- package/dist/claude/pre-bash.d.ts.map +1 -0
- package/dist/claude/pre-bash.js +245 -0
- package/dist/claude/pre-bash.js.map +1 -0
- package/dist/claude/prompt-consent.d.ts +19 -0
- package/dist/claude/prompt-consent.d.ts.map +1 -0
- package/dist/claude/prompt-consent.js +14 -0
- package/dist/claude/prompt-consent.js.map +1 -0
- package/dist/claude/prompt-hook.d.ts +76 -0
- package/dist/claude/prompt-hook.d.ts.map +1 -0
- package/dist/claude/prompt-hook.js +303 -0
- package/dist/claude/prompt-hook.js.map +1 -0
- package/dist/claude/prompt-skills.d.ts +19 -0
- package/dist/claude/prompt-skills.d.ts.map +1 -0
- package/dist/claude/prompt-skills.js +305 -0
- package/dist/claude/prompt-skills.js.map +1 -0
- package/dist/claude/session-metrics.js +4 -4
- package/dist/claude/session-metrics.js.map +1 -1
- package/dist/claude/settings-merge.d.ts +10 -0
- package/dist/claude/settings-merge.d.ts.map +1 -1
- package/dist/claude/settings-merge.js +46 -17
- package/dist/claude/settings-merge.js.map +1 -1
- package/dist/claude/shim-template.d.ts.map +1 -1
- package/dist/claude/shim-template.js +86 -28
- package/dist/claude/shim-template.js.map +1 -1
- package/dist/claude/skill-template.d.ts +2 -0
- package/dist/claude/skill-template.d.ts.map +1 -1
- package/dist/claude/skill-template.js +53 -34
- package/dist/claude/skill-template.js.map +1 -1
- package/dist/claude/skill-use.d.ts +16 -0
- package/dist/claude/skill-use.d.ts.map +1 -0
- package/dist/claude/skill-use.js +78 -0
- package/dist/claude/skill-use.js.map +1 -0
- package/dist/claude/skills-hook-util.d.ts +25 -0
- package/dist/claude/skills-hook-util.d.ts.map +1 -0
- package/dist/claude/skills-hook-util.js +71 -0
- package/dist/claude/skills-hook-util.js.map +1 -0
- package/dist/claude/skills-wiring.d.ts +26 -0
- package/dist/claude/skills-wiring.d.ts.map +1 -0
- package/dist/claude/skills-wiring.js +110 -0
- package/dist/claude/skills-wiring.js.map +1 -0
- package/dist/claude/start-init.d.ts +13 -0
- package/dist/claude/start-init.d.ts.map +1 -0
- package/dist/claude/start-init.js +75 -0
- package/dist/claude/start-init.js.map +1 -0
- package/dist/claude/start-skills.d.ts +31 -0
- package/dist/claude/start-skills.d.ts.map +1 -0
- package/dist/claude/start-skills.js +274 -0
- package/dist/claude/start-skills.js.map +1 -0
- package/dist/claude/state.d.ts +19 -7
- package/dist/claude/state.d.ts.map +1 -1
- package/dist/claude/state.js +59 -4
- package/dist/claude/state.js.map +1 -1
- package/dist/claude/stop-skills.d.ts +23 -0
- package/dist/claude/stop-skills.d.ts.map +1 -0
- package/dist/claude/stop-skills.js +233 -0
- package/dist/claude/stop-skills.js.map +1 -0
- package/dist/claude/stop.d.ts +23 -0
- package/dist/claude/stop.d.ts.map +1 -0
- package/dist/claude/stop.js +219 -0
- package/dist/claude/stop.js.map +1 -0
- package/dist/claude/tally.d.ts +29 -41
- package/dist/claude/tally.d.ts.map +1 -1
- package/dist/claude/tally.js +111 -165
- package/dist/claude/tally.js.map +1 -1
- package/dist/claude/walls-hook.d.ts +52 -0
- package/dist/claude/walls-hook.d.ts.map +1 -0
- package/dist/claude/walls-hook.js +279 -0
- package/dist/claude/walls-hook.js.map +1 -0
- package/dist/cli-epilogue.d.ts.map +1 -1
- package/dist/cli-epilogue.js +24 -14
- package/dist/cli-epilogue.js.map +1 -1
- package/dist/cli-meta.js +3 -3
- package/dist/cli-meta.js.map +1 -1
- package/dist/cli-picker.d.ts +24 -0
- package/dist/cli-picker.d.ts.map +1 -1
- package/dist/cli-picker.js +44 -11
- package/dist/cli-picker.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +475 -390
- package/dist/cli.js.map +1 -1
- package/dist/cloud/head-learnings.d.ts +13 -0
- package/dist/cloud/head-learnings.d.ts.map +1 -0
- package/dist/cloud/head-learnings.js +84 -0
- package/dist/cloud/head-learnings.js.map +1 -0
- package/dist/cloud/lookup-activity.d.ts +18 -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 +15 -7
- package/dist/cloud/nudge.d.ts.map +1 -1
- package/dist/cloud/nudge.js +45 -33
- package/dist/cloud/nudge.js.map +1 -1
- package/dist/cloud/onboarding.d.ts +273 -0
- package/dist/cloud/onboarding.d.ts.map +1 -0
- package/dist/cloud/onboarding.js +612 -0
- package/dist/cloud/onboarding.js.map +1 -0
- package/dist/cloud/other-repos.d.ts +39 -0
- package/dist/cloud/other-repos.d.ts.map +1 -0
- package/dist/cloud/other-repos.js +137 -0
- package/dist/cloud/other-repos.js.map +1 -0
- package/dist/cloud/pair.d.ts +86 -0
- package/dist/cloud/pair.d.ts.map +1 -0
- package/dist/cloud/pair.js +270 -0
- package/dist/cloud/pair.js.map +1 -0
- package/dist/cloud/workspace-sync.d.ts +75 -11
- package/dist/cloud/workspace-sync.d.ts.map +1 -1
- package/dist/cloud/workspace-sync.js +409 -53
- package/dist/cloud/workspace-sync.js.map +1 -1
- package/dist/cloud/workspace.d.ts +95 -10
- package/dist/cloud/workspace.d.ts.map +1 -1
- package/dist/cloud/workspace.js +112 -9
- package/dist/cloud/workspace.js.map +1 -1
- package/dist/graph/native.d.ts +2 -0
- package/dist/graph/native.d.ts.map +1 -1
- package/dist/graph/native.js +29 -4
- package/dist/graph/native.js.map +1 -1
- package/dist/hosts/claude-global.d.ts +14 -0
- package/dist/hosts/claude-global.d.ts.map +1 -1
- package/dist/hosts/claude-global.js +39 -4
- package/dist/hosts/claude-global.js.map +1 -1
- package/dist/hosts/codex-hooks.d.ts +6 -0
- package/dist/hosts/codex-hooks.d.ts.map +1 -1
- package/dist/hosts/codex-hooks.js +89 -16
- package/dist/hosts/codex-hooks.js.map +1 -1
- package/dist/hosts/codex-trust.d.ts +28 -0
- package/dist/hosts/codex-trust.d.ts.map +1 -0
- package/dist/hosts/codex-trust.js +280 -0
- package/dist/hosts/codex-trust.js.map +1 -0
- package/dist/hosts/cursor-hooks.d.ts.map +1 -1
- package/dist/hosts/cursor-hooks.js +3 -1
- package/dist/hosts/cursor-hooks.js.map +1 -1
- package/dist/init/candidates.d.ts +60 -0
- package/dist/init/candidates.d.ts.map +1 -0
- package/dist/init/candidates.js +202 -0
- package/dist/init/candidates.js.map +1 -0
- package/dist/init/claude-call.d.ts +51 -0
- package/dist/init/claude-call.d.ts.map +1 -0
- package/dist/init/claude-call.js +199 -0
- package/dist/init/claude-call.js.map +1 -0
- package/dist/init/discover-worker.d.ts +18 -0
- package/dist/init/discover-worker.d.ts.map +1 -0
- package/dist/init/discover-worker.js +111 -0
- package/dist/init/discover-worker.js.map +1 -0
- package/dist/init/handover.d.ts +16 -0
- package/dist/init/handover.d.ts.map +1 -0
- package/dist/init/handover.js +92 -0
- package/dist/init/handover.js.map +1 -0
- package/dist/init/howtos.d.ts +20 -0
- package/dist/init/howtos.d.ts.map +1 -0
- package/dist/init/howtos.js +90 -0
- package/dist/init/howtos.js.map +1 -0
- package/dist/init/init-record.d.ts +134 -0
- package/dist/init/init-record.d.ts.map +1 -0
- package/dist/init/init-record.js +339 -0
- package/dist/init/init-record.js.map +1 -0
- package/dist/init/install-paths.d.ts +6 -0
- package/dist/init/install-paths.d.ts.map +1 -0
- package/dist/init/install-paths.js +87 -0
- package/dist/init/install-paths.js.map +1 -0
- 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/keep-answer.d.ts +43 -0
- package/dist/init/keep-answer.d.ts.map +1 -0
- package/dist/init/keep-answer.js +118 -0
- package/dist/init/keep-answer.js.map +1 -0
- package/dist/init/keep-gate.d.ts +30 -0
- package/dist/init/keep-gate.d.ts.map +1 -0
- package/dist/init/keep-gate.js +178 -0
- package/dist/init/keep-gate.js.map +1 -0
- package/dist/init/keep-list.d.ts +67 -0
- package/dist/init/keep-list.d.ts.map +1 -0
- package/dist/init/keep-list.js +232 -0
- package/dist/init/keep-list.js.map +1 -0
- package/dist/init/keep.d.ts +52 -0
- package/dist/init/keep.d.ts.map +1 -0
- package/dist/init/keep.js +393 -0
- package/dist/init/keep.js.map +1 -0
- package/dist/init/look-back-mine.d.ts +37 -0
- package/dist/init/look-back-mine.d.ts.map +1 -0
- package/dist/init/look-back-mine.js +215 -0
- package/dist/init/look-back-mine.js.map +1 -0
- package/dist/init/look-back.d.ts +81 -0
- package/dist/init/look-back.d.ts.map +1 -0
- package/dist/init/look-back.js +170 -0
- package/dist/init/look-back.js.map +1 -0
- package/dist/init/miners.d.ts +46 -0
- package/dist/init/miners.d.ts.map +1 -0
- package/dist/init/miners.js +141 -0
- package/dist/init/miners.js.map +1 -0
- package/dist/init/name-call.d.ts +37 -0
- package/dist/init/name-call.d.ts.map +1 -0
- package/dist/init/name-call.js +151 -0
- package/dist/init/name-call.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 +83 -0
- package/dist/init/plain-file.js.map +1 -0
- package/dist/init/prefs.d.ts +70 -0
- package/dist/init/prefs.d.ts.map +1 -0
- package/dist/init/prefs.js +282 -0
- package/dist/init/prefs.js.map +1 -0
- package/dist/init/relay.d.ts +15 -0
- package/dist/init/relay.d.ts.map +1 -0
- package/dist/init/relay.js +15 -0
- package/dist/init/relay.js.map +1 -0
- package/dist/init/replay-runs.d.ts +121 -0
- package/dist/init/replay-runs.d.ts.map +1 -0
- package/dist/init/replay-runs.js +457 -0
- package/dist/init/replay-runs.js.map +1 -0
- package/dist/init/replay-tamper.d.ts +18 -0
- package/dist/init/replay-tamper.d.ts.map +1 -0
- package/dist/init/replay-tamper.js +87 -0
- package/dist/init/replay-tamper.js.map +1 -0
- package/dist/init/review-screen.d.ts +74 -0
- package/dist/init/review-screen.d.ts.map +1 -0
- package/dist/init/review-screen.js +258 -0
- package/dist/init/review-screen.js.map +1 -0
- package/dist/init/review-tty.d.ts +29 -0
- package/dist/init/review-tty.d.ts.map +1 -0
- package/dist/init/review-tty.js +218 -0
- package/dist/init/review-tty.js.map +1 -0
- package/dist/init/review.d.ts +12 -0
- package/dist/init/review.d.ts.map +1 -0
- package/dist/init/review.js +12 -0
- package/dist/init/review.js.map +1 -0
- package/dist/init/run.d.ts +87 -0
- package/dist/init/run.d.ts.map +1 -0
- package/dist/init/run.js +347 -0
- package/dist/init/run.js.map +1 -0
- package/dist/init/sessions.d.ts +63 -0
- package/dist/init/sessions.d.ts.map +1 -0
- package/dist/init/sessions.js +377 -0
- package/dist/init/sessions.js.map +1 -0
- package/dist/init/transcript.d.ts +81 -0
- package/dist/init/transcript.d.ts.map +1 -0
- package/dist/init/transcript.js +216 -0
- package/dist/init/transcript.js.map +1 -0
- package/dist/init/types.d.ts +139 -0
- package/dist/init/types.d.ts.map +1 -0
- package/dist/init/types.js +2 -0
- package/dist/init/types.js.map +1 -0
- package/dist/mcp/brains.d.ts +72 -0
- package/dist/mcp/brains.d.ts.map +1 -0
- package/dist/mcp/brains.js +220 -0
- package/dist/mcp/brains.js.map +1 -0
- package/dist/mcp/server.d.ts +3 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +40 -5
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +7 -2
- package/dist/mcp/tools.js.map +1 -1
- package/dist/notes/cold-start.d.ts +5 -184
- package/dist/notes/cold-start.d.ts.map +1 -1
- package/dist/notes/cold-start.js +5 -575
- package/dist/notes/cold-start.js.map +1 -1
- package/dist/notes/edit-overlap.d.ts.map +1 -1
- package/dist/notes/edit-overlap.js +4 -1
- package/dist/notes/edit-overlap.js.map +1 -1
- package/dist/notes/every-repo.d.ts +18 -0
- package/dist/notes/every-repo.d.ts.map +1 -0
- package/dist/notes/every-repo.js +86 -0
- package/dist/notes/every-repo.js.map +1 -0
- package/dist/notes/guardrails.d.ts +8 -0
- package/dist/notes/guardrails.d.ts.map +1 -0
- package/dist/notes/guardrails.js +38 -0
- package/dist/notes/guardrails.js.map +1 -0
- package/dist/notes/lesson-index.d.ts +13 -0
- package/dist/notes/lesson-index.d.ts.map +1 -0
- package/dist/notes/lesson-index.js +135 -0
- package/dist/notes/lesson-index.js.map +1 -0
- package/dist/notes/linked-learnings.d.ts +8 -0
- package/dist/notes/linked-learnings.d.ts.map +1 -0
- package/dist/notes/linked-learnings.js +113 -0
- package/dist/notes/linked-learnings.js.map +1 -0
- package/dist/notes/notes.d.ts +8 -4
- package/dist/notes/notes.d.ts.map +1 -1
- package/dist/notes/notes.js +9 -7
- package/dist/notes/notes.js.map +1 -1
- package/dist/notes/pr-reviews.d.ts +4 -0
- package/dist/notes/pr-reviews.d.ts.map +1 -1
- package/dist/notes/pr-reviews.js +6 -5
- 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/repo-trail.d.ts +1 -1
- package/dist/notes/repo-trail.d.ts.map +1 -1
- package/dist/notes/repo-trail.js +24 -4
- package/dist/notes/repo-trail.js.map +1 -1
- package/dist/search/grep.d.ts.map +1 -1
- package/dist/search/grep.js +4 -2
- package/dist/search/grep.js.map +1 -1
- package/dist/search/user-regexp.d.ts +26 -0
- package/dist/search/user-regexp.d.ts.map +1 -0
- package/dist/search/user-regexp.js +150 -0
- package/dist/search/user-regexp.js.map +1 -0
- package/dist/skills/anchors-cli.d.ts +38 -0
- package/dist/skills/anchors-cli.d.ts.map +1 -0
- package/dist/skills/anchors-cli.js +279 -0
- package/dist/skills/anchors-cli.js.map +1 -0
- package/dist/skills/anchors-git.d.ts +29 -0
- package/dist/skills/anchors-git.d.ts.map +1 -0
- package/dist/skills/anchors-git.js +241 -0
- package/dist/skills/anchors-git.js.map +1 -0
- package/dist/skills/anchors-wide.d.ts +25 -0
- package/dist/skills/anchors-wide.d.ts.map +1 -0
- package/dist/skills/anchors-wide.js +481 -0
- package/dist/skills/anchors-wide.js.map +1 -0
- package/dist/skills/anchors.d.ts +32 -0
- package/dist/skills/anchors.d.ts.map +1 -0
- package/dist/skills/anchors.js +485 -0
- package/dist/skills/anchors.js.map +1 -0
- package/dist/skills/check-result.d.ts +26 -0
- package/dist/skills/check-result.d.ts.map +1 -0
- package/dist/skills/check-result.js +46 -0
- package/dist/skills/check-result.js.map +1 -0
- package/dist/skills/cli-skills-1b.d.ts +17 -0
- package/dist/skills/cli-skills-1b.d.ts.map +1 -0
- package/dist/skills/cli-skills-1b.js +166 -0
- package/dist/skills/cli-skills-1b.js.map +1 -0
- package/dist/skills/cli-skills-2.d.ts +35 -0
- package/dist/skills/cli-skills-2.d.ts.map +1 -0
- package/dist/skills/cli-skills-2.js +129 -0
- package/dist/skills/cli-skills-2.js.map +1 -0
- package/dist/skills/cli-skills-report-1b.d.ts +49 -0
- package/dist/skills/cli-skills-report-1b.d.ts.map +1 -0
- package/dist/skills/cli-skills-report-1b.js +191 -0
- package/dist/skills/cli-skills-report-1b.js.map +1 -0
- package/dist/skills/cli-skills-report.d.ts +86 -0
- package/dist/skills/cli-skills-report.d.ts.map +1 -0
- package/dist/skills/cli-skills-report.js +121 -0
- package/dist/skills/cli-skills-report.js.map +1 -0
- package/dist/skills/cli-skills.d.ts +30 -0
- package/dist/skills/cli-skills.d.ts.map +1 -0
- package/dist/skills/cli-skills.js +379 -0
- package/dist/skills/cli-skills.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 +550 -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 +85 -0
- package/dist/skills/compile-words.d.ts.map +1 -0
- package/dist/skills/compile-words.js +445 -0
- package/dist/skills/compile-words.js.map +1 -0
- package/dist/skills/compile.d.ts +42 -0
- package/dist/skills/compile.d.ts.map +1 -0
- package/dist/skills/compile.js +505 -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/credit.d.ts +86 -0
- package/dist/skills/credit.d.ts.map +1 -0
- package/dist/skills/credit.js +259 -0
- package/dist/skills/credit.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/fold-gated.d.ts +3 -0
- package/dist/skills/fold-gated.d.ts.map +1 -0
- package/dist/skills/fold-gated.js +78 -0
- package/dist/skills/fold-gated.js.map +1 -0
- package/dist/skills/fold.d.ts +87 -0
- package/dist/skills/fold.d.ts.map +1 -0
- package/dist/skills/fold.js +348 -0
- package/dist/skills/fold.js.map +1 -0
- package/dist/skills/follow-learnings.d.ts +128 -0
- package/dist/skills/follow-learnings.d.ts.map +1 -0
- package/dist/skills/follow-learnings.js +278 -0
- package/dist/skills/follow-learnings.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/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/learning-steps.d.ts +43 -0
- package/dist/skills/learning-steps.d.ts.map +1 -0
- package/dist/skills/learning-steps.js +294 -0
- package/dist/skills/learning-steps.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/lesson-gate.d.ts +25 -0
- package/dist/skills/lesson-gate.d.ts.map +1 -0
- package/dist/skills/lesson-gate.js +316 -0
- package/dist/skills/lesson-gate.js.map +1 -0
- package/dist/skills/lessons.d.ts +60 -0
- package/dist/skills/lessons.d.ts.map +1 -0
- package/dist/skills/lessons.js +396 -0
- package/dist/skills/lessons.js.map +1 -0
- package/dist/skills/offer-answers.d.ts +20 -0
- package/dist/skills/offer-answers.d.ts.map +1 -0
- package/dist/skills/offer-answers.js +51 -0
- package/dist/skills/offer-answers.js.map +1 -0
- package/dist/skills/offer-drift.d.ts +35 -0
- package/dist/skills/offer-drift.d.ts.map +1 -0
- package/dist/skills/offer-drift.js +98 -0
- package/dist/skills/offer-drift.js.map +1 -0
- package/dist/skills/offer-lesson.d.ts +31 -0
- package/dist/skills/offer-lesson.d.ts.map +1 -0
- package/dist/skills/offer-lesson.js +123 -0
- package/dist/skills/offer-lesson.js.map +1 -0
- package/dist/skills/offer-lines.d.ts +40 -0
- package/dist/skills/offer-lines.d.ts.map +1 -0
- package/dist/skills/offer-lines.js +80 -0
- package/dist/skills/offer-lines.js.map +1 -0
- package/dist/skills/offer-moment.d.ts +102 -0
- package/dist/skills/offer-moment.d.ts.map +1 -0
- package/dist/skills/offer-moment.js +260 -0
- package/dist/skills/offer-moment.js.map +1 -0
- package/dist/skills/offer-repair.d.ts +36 -0
- package/dist/skills/offer-repair.d.ts.map +1 -0
- package/dist/skills/offer-repair.js +212 -0
- package/dist/skills/offer-repair.js.map +1 -0
- package/dist/skills/offer-retire.d.ts +53 -0
- package/dist/skills/offer-retire.d.ts.map +1 -0
- package/dist/skills/offer-retire.js +149 -0
- package/dist/skills/offer-retire.js.map +1 -0
- package/dist/skills/offer-update.d.ts +54 -0
- package/dist/skills/offer-update.d.ts.map +1 -0
- package/dist/skills/offer-update.js +115 -0
- package/dist/skills/offer-update.js.map +1 -0
- package/dist/skills/offer-words-1b.d.ts +32 -0
- package/dist/skills/offer-words-1b.d.ts.map +1 -0
- package/dist/skills/offer-words-1b.js +80 -0
- package/dist/skills/offer-words-1b.js.map +1 -0
- package/dist/skills/offer-words-2.d.ts +123 -0
- package/dist/skills/offer-words-2.d.ts.map +1 -0
- package/dist/skills/offer-words-2.js +194 -0
- package/dist/skills/offer-words-2.js.map +1 -0
- package/dist/skills/offer-words.d.ts +65 -0
- package/dist/skills/offer-words.d.ts.map +1 -0
- package/dist/skills/offer-words.js +205 -0
- package/dist/skills/offer-words.js.map +1 -0
- package/dist/skills/offers.d.ts +66 -0
- package/dist/skills/offers.d.ts.map +1 -0
- package/dist/skills/offers.js +284 -0
- package/dist/skills/offers.js.map +1 -0
- package/dist/skills/own-folder.d.ts +9 -0
- package/dist/skills/own-folder.d.ts.map +1 -0
- package/dist/skills/own-folder.js +36 -0
- package/dist/skills/own-folder.js.map +1 -0
- package/dist/skills/person.d.ts +34 -0
- package/dist/skills/person.d.ts.map +1 -0
- package/dist/skills/person.js +102 -0
- package/dist/skills/person.js.map +1 -0
- package/dist/skills/probe-clean.d.ts +9 -0
- package/dist/skills/probe-clean.d.ts.map +1 -0
- package/dist/skills/probe-clean.js +48 -0
- package/dist/skills/probe-clean.js.map +1 -0
- package/dist/skills/probes.d.ts +26 -0
- package/dist/skills/probes.d.ts.map +1 -0
- package/dist/skills/probes.js +225 -0
- package/dist/skills/probes.js.map +1 -0
- package/dist/skills/recall.d.ts +119 -0
- package/dist/skills/recall.d.ts.map +1 -0
- package/dist/skills/recall.js +370 -0
- package/dist/skills/recall.js.map +1 -0
- package/dist/skills/receipts.d.ts +44 -0
- package/dist/skills/receipts.d.ts.map +1 -0
- package/dist/skills/receipts.js +223 -0
- package/dist/skills/receipts.js.map +1 -0
- package/dist/skills/run-checkout.d.ts +4 -0
- package/dist/skills/run-checkout.d.ts.map +1 -0
- package/dist/skills/run-checkout.js +37 -0
- package/dist/skills/run-checkout.js.map +1 -0
- package/dist/skills/runblock.d.ts +47 -0
- package/dist/skills/runblock.d.ts.map +1 -0
- package/dist/skills/runblock.js +227 -0
- package/dist/skills/runblock.js.map +1 -0
- package/dist/skills/save-gate.d.ts +64 -0
- package/dist/skills/save-gate.d.ts.map +1 -0
- package/dist/skills/save-gate.js +354 -0
- package/dist/skills/save-gate.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/save-verify.d.ts +59 -0
- package/dist/skills/save-verify.d.ts.map +1 -0
- package/dist/skills/save-verify.js +390 -0
- package/dist/skills/save-verify.js.map +1 -0
- package/dist/skills/settings.d.ts +48 -0
- package/dist/skills/settings.d.ts.map +1 -0
- package/dist/skills/settings.js +155 -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 +28 -8
- package/dist/skills/skills.d.ts.map +1 -1
- package/dist/skills/skills.js +106 -53
- 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 +8 -0
- package/dist/skills/types.d.ts.map +1 -1
- package/dist/skills/update-gate.d.ts +36 -0
- package/dist/skills/update-gate.d.ts.map +1 -0
- package/dist/skills/update-gate.js +357 -0
- package/dist/skills/update-gate.js.map +1 -0
- package/dist/skills/update-plan.d.ts +40 -0
- package/dist/skills/update-plan.d.ts.map +1 -0
- package/dist/skills/update-plan.js +196 -0
- package/dist/skills/update-plan.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/value-line.d.ts +94 -0
- package/dist/skills/value-line.d.ts.map +1 -0
- package/dist/skills/value-line.js +355 -0
- package/dist/skills/value-line.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 +15 -1
- package/dist/telemetry/contract.d.ts.map +1 -1
- package/dist/telemetry/contract.js +80 -11
- package/dist/telemetry/contract.js.map +1 -1
- package/dist/telemetry/gate.js +4 -4
- package/dist/telemetry/gate.js.map +1 -1
- package/dist/telemetry/index.d.ts +1 -1
- package/dist/telemetry/index.d.ts.map +1 -1
- package/dist/telemetry/index.js +1 -1
- package/dist/telemetry/index.js.map +1 -1
- package/dist/telemetry/notice.js +5 -5
- package/dist/telemetry/notice.js.map +1 -1
- package/dist/telemetry/queue.d.ts.map +1 -1
- package/dist/telemetry/queue.js +7 -7
- package/dist/telemetry/queue.js.map +1 -1
- package/dist/telemetry/track.d.ts.map +1 -1
- package/dist/telemetry/track.js +4 -3
- package/dist/telemetry/track.js.map +1 -1
- package/dist/trace/checks.d.ts +63 -0
- package/dist/trace/checks.d.ts.map +1 -0
- package/dist/trace/checks.js +495 -0
- package/dist/trace/checks.js.map +1 -0
- package/dist/trace/claude.d.ts +124 -0
- package/dist/trace/claude.d.ts.map +1 -0
- package/dist/trace/claude.js +303 -0
- package/dist/trace/claude.js.map +1 -0
- package/dist/trace/codex-exec.d.ts +22 -0
- package/dist/trace/codex-exec.d.ts.map +1 -0
- package/dist/trace/codex-exec.js +129 -0
- package/dist/trace/codex-exec.js.map +1 -0
- package/dist/trace/codex-meta.d.ts +23 -0
- package/dist/trace/codex-meta.d.ts.map +1 -0
- package/dist/trace/codex-meta.js +112 -0
- package/dist/trace/codex-meta.js.map +1 -0
- package/dist/trace/codex.d.ts +33 -0
- package/dist/trace/codex.d.ts.map +1 -0
- package/dist/trace/codex.js +485 -0
- package/dist/trace/codex.js.map +1 -0
- package/dist/trace/cursor.d.ts +16 -0
- package/dist/trace/cursor.d.ts.map +1 -0
- package/dist/trace/cursor.js +133 -0
- package/dist/trace/cursor.js.map +1 -0
- package/dist/trace/dialect.d.ts +43 -0
- package/dist/trace/dialect.d.ts.map +1 -0
- package/dist/trace/dialect.js +95 -0
- package/dist/trace/dialect.js.map +1 -0
- package/dist/trace/epochs.d.ts +10 -0
- package/dist/trace/epochs.d.ts.map +1 -0
- package/dist/trace/epochs.js +16 -0
- package/dist/trace/epochs.js.map +1 -0
- package/dist/trace/failure.d.ts +15 -0
- package/dist/trace/failure.d.ts.map +1 -0
- package/dist/trace/failure.js +69 -0
- package/dist/trace/failure.js.map +1 -0
- package/dist/trace/gate-file.d.ts +71 -0
- package/dist/trace/gate-file.d.ts.map +1 -0
- package/dist/trace/gate-file.js +329 -0
- package/dist/trace/gate-file.js.map +1 -0
- package/dist/trace/guard-fast.d.ts +22 -0
- package/dist/trace/guard-fast.d.ts.map +1 -0
- package/dist/trace/guard-fast.js +213 -0
- package/dist/trace/guard-fast.js.map +1 -0
- package/dist/trace/housekeeping.d.ts +5 -0
- package/dist/trace/housekeeping.d.ts.map +1 -0
- package/dist/trace/housekeeping.js +93 -0
- package/dist/trace/housekeeping.js.map +1 -0
- package/dist/trace/jobs.d.ts +52 -0
- package/dist/trace/jobs.d.ts.map +1 -0
- package/dist/trace/jobs.js +182 -0
- package/dist/trace/jobs.js.map +1 -0
- package/dist/trace/known-repo.d.ts +3 -0
- package/dist/trace/known-repo.d.ts.map +1 -0
- package/dist/trace/known-repo.js +55 -0
- package/dist/trace/known-repo.js.map +1 -0
- package/dist/trace/pool.d.ts +40 -0
- package/dist/trace/pool.d.ts.map +1 -0
- package/dist/trace/pool.js +154 -0
- package/dist/trace/pool.js.map +1 -0
- package/dist/trace/repairs.d.ts +27 -0
- package/dist/trace/repairs.d.ts.map +1 -0
- package/dist/trace/repairs.js +303 -0
- package/dist/trace/repairs.js.map +1 -0
- package/dist/trace/run-calls.d.ts +82 -0
- package/dist/trace/run-calls.d.ts.map +1 -0
- package/dist/trace/run-calls.js +331 -0
- package/dist/trace/run-calls.js.map +1 -0
- package/dist/trace/run-join.d.ts +20 -0
- package/dist/trace/run-join.d.ts.map +1 -0
- package/dist/trace/run-join.js +99 -0
- package/dist/trace/run-join.js.map +1 -0
- package/dist/trace/run-sheets.d.ts +26 -0
- package/dist/trace/run-sheets.d.ts.map +1 -0
- package/dist/trace/run-sheets.js +145 -0
- package/dist/trace/run-sheets.js.map +1 -0
- package/dist/trace/run-turns.d.ts +24 -0
- package/dist/trace/run-turns.d.ts.map +1 -0
- package/dist/trace/run-turns.js +67 -0
- package/dist/trace/run-turns.js.map +1 -0
- package/dist/trace/run-verdict.d.ts +24 -0
- package/dist/trace/run-verdict.d.ts.map +1 -0
- package/dist/trace/run-verdict.js +176 -0
- package/dist/trace/run-verdict.js.map +1 -0
- package/dist/trace/runs.d.ts +54 -0
- package/dist/trace/runs.d.ts.map +1 -0
- package/dist/trace/runs.js +501 -0
- package/dist/trace/runs.js.map +1 -0
- package/dist/trace/skill-session.d.ts +64 -0
- package/dist/trace/skill-session.d.ts.map +1 -0
- package/dist/trace/skill-session.js +232 -0
- package/dist/trace/skill-session.js.map +1 -0
- package/dist/trace/tamper.d.ts +12 -0
- package/dist/trace/tamper.d.ts.map +1 -0
- package/dist/trace/tamper.js +405 -0
- package/dist/trace/tamper.js.map +1 -0
- package/dist/trace/typed.d.ts +30 -0
- package/dist/trace/typed.d.ts.map +1 -0
- package/dist/trace/typed.js +132 -0
- package/dist/trace/typed.js.map +1 -0
- package/dist/trace/wall-state.d.ts +86 -0
- package/dist/trace/wall-state.d.ts.map +1 -0
- package/dist/trace/wall-state.js +279 -0
- package/dist/trace/wall-state.js.map +1 -0
- package/dist/trace/walls.d.ts +40 -0
- package/dist/trace/walls.d.ts.map +1 -0
- package/dist/trace/walls.js +318 -0
- package/dist/trace/walls.js.map +1 -0
- package/dist/upkeep-run.d.ts.map +1 -1
- package/dist/upkeep-run.js +2 -23
- package/dist/upkeep-run.js.map +1 -1
- package/dist/upkeep.d.ts.map +1 -1
- package/dist/upkeep.js +2 -3
- package/dist/upkeep.js.map +1 -1
- package/dist/util/private-fs.d.ts +6 -0
- package/dist/util/private-fs.d.ts.map +1 -1
- package/dist/util/private-fs.js +9 -1
- package/dist/util/private-fs.js.map +1 -1
- package/dist/util/state.d.ts.map +1 -1
- package/dist/util/state.js +17 -3
- 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/package.json +6 -3
- package/scripts/stamp-telemetry-key.mjs +8 -5
- package/scripts/vendor-grammars.mjs +35 -0
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill offers (design 2.5, 4.12, 4.13, spec 9): the log of every offer
|
|
3
|
+
* shown and answered (`~/.trail/offers.jsonl`, the never-ask-again list), the
|
|
4
|
+
* budget every offer shares, and the bookkeeping an answer leaves.
|
|
5
|
+
*
|
|
6
|
+
* The budget, in this order: offers off (everywhere or in this repo), a repo
|
|
7
|
+
* paused after two nos, 1 offer per session, 1 in the first week after skills
|
|
8
|
+
* go on, 3 a week, never again after a no for that (repo, job), one more
|
|
9
|
+
* chance 14+ days after an ignored offer and then never, and the governor:
|
|
10
|
+
* when fewer than 1 in 3 of the last 9 answered offers were kept, a job has
|
|
11
|
+
* to come back one more day before it is offered.
|
|
12
|
+
*
|
|
13
|
+
* The log is the truth. `settings.json` keeps only the pause and a cache of
|
|
14
|
+
* the governor's window; only this file writes them (a static test pins it).
|
|
15
|
+
* The words of an offer and of the answers to it are in `offer-words.ts`.
|
|
16
|
+
*/
|
|
17
|
+
import { randomBytes } from 'node:crypto';
|
|
18
|
+
import { localDate, noteGovernor, pauseRepo, readSettings } from './settings.js';
|
|
19
|
+
import { appendPrivateLine, trailPath } from '../util/private-fs.js';
|
|
20
|
+
import { readFileSync } from 'node:fs';
|
|
21
|
+
export { answerDirective, endsWithLine, isKeepLine, keepLine, noticeText, offerLines, postToolOfferText, stopBlockReason, GOVERNOR_LINE, KEEP_IT, } from './offer-words.js';
|
|
22
|
+
import { GOVERNOR_LINE } from './offer-words.js';
|
|
23
|
+
const DAY_MS = 86_400_000;
|
|
24
|
+
const WEEK_MS = 7 * DAY_MS;
|
|
25
|
+
const IGNORED_AFTER_MS = DAY_MS;
|
|
26
|
+
const SECOND_CHANCE_MS = 14 * DAY_MS;
|
|
27
|
+
const PAUSE_DAYS = 14;
|
|
28
|
+
const WEEK_CAP = 3;
|
|
29
|
+
const GOVERNOR_WINDOW = 9;
|
|
30
|
+
const EVENTS = new Set(['shown', 'answer', 'not-shown', 'closed']);
|
|
31
|
+
/** Phase 2 (R2): moments 5 and 6 and the retire proposal are kept as themselves; a moment this file doesn't know is
|
|
32
|
+
* written as 'repeated' (line below), so each new one must be listed here first. */
|
|
33
|
+
const MOMENTS = new Set(['repeated', 'repaired', 'correction', 'update', 'drift', 'retire']);
|
|
34
|
+
/** 2.4: what an answer line's yes chose. */
|
|
35
|
+
const OPS = new Set(['update', 'extend', 'split', 'replace', 'retire']);
|
|
36
|
+
const ANSWERS = new Set(['yes', 'no', 'show', 'none', 'withdrawn']);
|
|
37
|
+
const CHANNELS = new Set(['stop', 'notice', 'post-tool']);
|
|
38
|
+
/** <home>/offers.jsonl */
|
|
39
|
+
export function offersPath(env) {
|
|
40
|
+
return trailPath(env, 'offers.jsonl');
|
|
41
|
+
}
|
|
42
|
+
const str = (v) => typeof v === 'string';
|
|
43
|
+
function asLine(v) {
|
|
44
|
+
if (!v || typeof v !== 'object' || Array.isArray(v))
|
|
45
|
+
return null;
|
|
46
|
+
const l = v;
|
|
47
|
+
if (!str(l.id) || !str(l.at) || Number.isNaN(Date.parse(l.at)) || !EVENTS.has(l.event))
|
|
48
|
+
return null;
|
|
49
|
+
if (!str(l.repo) || !str(l.key) || !str(l.runId) || !str(l.name) || !CHANNELS.has(l.channel))
|
|
50
|
+
return null;
|
|
51
|
+
// 1b (4.20): a closed line is only ever init's, a no; every other line is an offer of moment 2, 3 or 4.
|
|
52
|
+
if (l.event === 'closed')
|
|
53
|
+
return l.moment === 'init' && l.answer === 'no' ? l : null;
|
|
54
|
+
if (!MOMENTS.has(l.moment))
|
|
55
|
+
return null;
|
|
56
|
+
if (l.event === 'answer' && !ANSWERS.has(l.answer))
|
|
57
|
+
return null;
|
|
58
|
+
// 2.4: an op outside the set is dropped, the line kept (its answer still counts).
|
|
59
|
+
if (Object.hasOwn(l, 'op') && !(l.event === 'answer' && OPS.has(l.op))) {
|
|
60
|
+
const { op: _op, ...rest } = l;
|
|
61
|
+
return rest;
|
|
62
|
+
}
|
|
63
|
+
return l;
|
|
64
|
+
}
|
|
65
|
+
export function readOffers(env) {
|
|
66
|
+
let text;
|
|
67
|
+
try {
|
|
68
|
+
text = readFileSync(offersPath(env), 'utf8');
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
const out = [];
|
|
74
|
+
for (const raw of text.split('\n')) {
|
|
75
|
+
if (!raw.trim())
|
|
76
|
+
continue;
|
|
77
|
+
try {
|
|
78
|
+
const l = asLine(JSON.parse(raw));
|
|
79
|
+
if (l)
|
|
80
|
+
out.push(l);
|
|
81
|
+
}
|
|
82
|
+
catch { /* a bad line is skipped */ }
|
|
83
|
+
}
|
|
84
|
+
return out;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Folds 'shown' + 'answer' + 'not-shown' lines by id: one record per offer with its final answer. The record's
|
|
88
|
+
* `at` is when it was shown; `not-shown` (the agent left it out) wins over `shown`; the last answer wins.
|
|
89
|
+
*/
|
|
90
|
+
export function foldOffers(lines) {
|
|
91
|
+
const byId = new Map();
|
|
92
|
+
for (const l of lines) {
|
|
93
|
+
let r = byId.get(l.id);
|
|
94
|
+
if (r === undefined) {
|
|
95
|
+
const { answer: _a, ...base } = l;
|
|
96
|
+
r = { ...base, event: l.event === 'answer' ? 'shown' : l.event, answer: null };
|
|
97
|
+
byId.set(l.id, r);
|
|
98
|
+
}
|
|
99
|
+
if (l.event === 'not-shown' && r.event !== 'closed')
|
|
100
|
+
r.event = 'not-shown';
|
|
101
|
+
if (l.event === 'closed')
|
|
102
|
+
r.answer = 'no';
|
|
103
|
+
if (l.event === 'answer' && l.answer) {
|
|
104
|
+
r.answer = l.answer;
|
|
105
|
+
if (l.op)
|
|
106
|
+
r.op = l.op;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return [...byId.values()];
|
|
110
|
+
}
|
|
111
|
+
/** yes, no or none (an ignored offer: answered none, or shown and never answered for 24 h); null otherwise, and for init's closed lines. */
|
|
112
|
+
function settled(r, now) {
|
|
113
|
+
if (r.event === 'closed')
|
|
114
|
+
return null; // "said no" for its key only (4.20, P10)
|
|
115
|
+
if (r.answer === 'yes' || r.answer === 'no' || r.answer === 'none')
|
|
116
|
+
return r.answer;
|
|
117
|
+
if (r.answer === null && r.event === 'shown' && now.getTime() - Date.parse(r.at) > IGNORED_AFTER_MS)
|
|
118
|
+
return 'none';
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
const byTime = (a, b) => Date.parse(a.at) - Date.parse(b.at);
|
|
122
|
+
/** The governor's window: the last 9 offers that were kept, refused or ignored, oldest first. */
|
|
123
|
+
function lastNine(records, now) {
|
|
124
|
+
return records.slice().sort(byTime).flatMap((r) => {
|
|
125
|
+
const s = settled(r, now);
|
|
126
|
+
return s ? [s] : [];
|
|
127
|
+
}).slice(-GOVERNOR_WINDOW);
|
|
128
|
+
}
|
|
129
|
+
const governorOn = (nine) => nine.length >= 3 && nine.filter((a) => a === 'yes').length * 3 < nine.length;
|
|
130
|
+
/** 4.13, steps 1 to 8 in order. */
|
|
131
|
+
export function offerBudget(c) {
|
|
132
|
+
const now = c.now ?? new Date();
|
|
133
|
+
const s = readSettings(c.env);
|
|
134
|
+
if (s.offers === 'off')
|
|
135
|
+
return { ok: false, why: 'off' };
|
|
136
|
+
if (s.offRepos.includes(c.repoKey))
|
|
137
|
+
return { ok: false, why: 'off-here' };
|
|
138
|
+
const until = s.pausedUntil[c.repoKey];
|
|
139
|
+
if (until && until > localDate(now))
|
|
140
|
+
return { ok: false, why: 'paused' };
|
|
141
|
+
if (c.sessionOfferUsed)
|
|
142
|
+
return { ok: false, why: 'session' };
|
|
143
|
+
const records = foldOffers(readOffers(c.env));
|
|
144
|
+
const shown = records.filter((r) => r.event === 'shown');
|
|
145
|
+
const since = s.onSince === null ? NaN : Date.parse(s.onSince);
|
|
146
|
+
if (!Number.isNaN(since) && now.getTime() - since < WEEK_MS && shown.some((r) => Date.parse(r.at) >= since))
|
|
147
|
+
return { ok: false, why: 'first-week' };
|
|
148
|
+
const weekAgo = now.getTime() - WEEK_MS;
|
|
149
|
+
if (shown.filter((r) => Date.parse(r.at) > weekAgo && Date.parse(r.at) <= now.getTime() + 5000).length >= WEEK_CAP)
|
|
150
|
+
return { ok: false, why: 'week' };
|
|
151
|
+
const mine = records.filter((r) => r.key === c.key);
|
|
152
|
+
if (mine.some((r) => r.answer === 'no'))
|
|
153
|
+
return { ok: false, why: 'said-no' };
|
|
154
|
+
const ignored = mine.filter((r) => settled(r, now) === 'none');
|
|
155
|
+
let secondChance = false;
|
|
156
|
+
if (ignored.length >= 2)
|
|
157
|
+
return { ok: false, why: 'no-answer-twice' };
|
|
158
|
+
if (ignored.length === 1) {
|
|
159
|
+
if (now.getTime() - Date.parse(ignored[0].at) < SECOND_CHANCE_MS)
|
|
160
|
+
return { ok: false, why: 'too-soon' };
|
|
161
|
+
secondChance = true;
|
|
162
|
+
}
|
|
163
|
+
return { ok: true, extraDay: governorOn(lastNine(records, now)), secondChance };
|
|
164
|
+
}
|
|
165
|
+
function line(o, repoKey, event, now, answer, op) {
|
|
166
|
+
const moment = MOMENTS.has(o.moment) ? o.moment : 'repeated';
|
|
167
|
+
const l = { id: o.offerId, at: now.toISOString(), event, repo: repoKey, key: o.key, moment, runId: o.runId, name: o.name, channel: o.channel };
|
|
168
|
+
if (answer)
|
|
169
|
+
l.answer = answer;
|
|
170
|
+
if (answer && op && OPS.has(op))
|
|
171
|
+
l.op = op;
|
|
172
|
+
return l;
|
|
173
|
+
}
|
|
174
|
+
function append(l, env) {
|
|
175
|
+
appendPrivateLine(offersPath(env), JSON.stringify(l));
|
|
176
|
+
}
|
|
177
|
+
/** The governor cache in settings.json: the window as it is now; said-at kept while the governor stays on. */
|
|
178
|
+
function refreshGovernor(env, now, saidAt) {
|
|
179
|
+
const nine = lastNine(foldOffers(readOffers(env)), now);
|
|
180
|
+
const s = readSettings(env);
|
|
181
|
+
const keep = saidAt === undefined ? s.governorSaidAt : saidAt;
|
|
182
|
+
const next = governorOn(nine) ? keep : null;
|
|
183
|
+
if (JSON.stringify(s.lastNine) === JSON.stringify(nine) && s.governorSaidAt === next)
|
|
184
|
+
return;
|
|
185
|
+
try {
|
|
186
|
+
noteGovernor(nine, next, env);
|
|
187
|
+
}
|
|
188
|
+
catch { /* busy: the log stays the truth, the cache catches up next time */ }
|
|
189
|
+
}
|
|
190
|
+
export function recordShown(o, repoKey, env, now = new Date()) {
|
|
191
|
+
append(line(o, repoKey, 'shown', now), env);
|
|
192
|
+
refreshGovernor(env, now);
|
|
193
|
+
}
|
|
194
|
+
/** A stop or post-tool offer the agent left out: the session stays spent; the week and the governor ignore it. */
|
|
195
|
+
export function recordNotShown(o, repoKey, env, now = new Date()) {
|
|
196
|
+
append(line(o, repoKey, 'not-shown', now), env);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Records the answer and refreshes settings.lastNine. The 2nd 'no' in a row in this repo pauses it 14 days.
|
|
200
|
+
* Phase 2 (2.4): `op` says which change a yes chose (a fold op, drift's 'replace', or 'retire'); `answer` stays 1a's.
|
|
201
|
+
*/
|
|
202
|
+
export function recordAnswer(o, repoKey, a, env, now = new Date(), op) {
|
|
203
|
+
const before = a === 'no' ? foldOffers(readOffers(env)) : [];
|
|
204
|
+
append(line(o, repoKey, 'answer', now, a, op), env);
|
|
205
|
+
refreshGovernor(env, now);
|
|
206
|
+
if (a !== 'no')
|
|
207
|
+
return { paused: false, firstNo: false };
|
|
208
|
+
const firstNo = !before.some((r) => r.answer === 'no' && r.event !== 'closed' && r.id !== o.offerId);
|
|
209
|
+
const here = foldOffers(readOffers(env)).filter((r) => r.repo === repoKey).sort(byTime).filter((r) => settled(r, now) !== null);
|
|
210
|
+
const lastTwo = here.slice(-2);
|
|
211
|
+
if (lastTwo.length < 2 || !lastTwo.every((r) => settled(r, now) === 'no'))
|
|
212
|
+
return { paused: false, firstNo };
|
|
213
|
+
try {
|
|
214
|
+
pauseRepo(repoKey, new Date(now.getTime() + PAUSE_DAYS * DAY_MS), env);
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
return { paused: false, firstNo }; // not written: not said
|
|
218
|
+
}
|
|
219
|
+
return { paused: true, firstNo };
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* For `trail skills` (2.10): the governor line the first time it is printed while the governor is on (records
|
|
223
|
+
* governorSaidAt through noteGovernor); null otherwise. noteGovernor clears governorSaidAt when the governor turns
|
|
224
|
+
* off, so it is said again next time.
|
|
225
|
+
*/
|
|
226
|
+
export function governorLine(env, now = new Date()) {
|
|
227
|
+
const nine = lastNine(foldOffers(readOffers(env)), now);
|
|
228
|
+
const s = readSettings(env);
|
|
229
|
+
if (!governorOn(nine)) {
|
|
230
|
+
if (s.governorSaidAt !== null || JSON.stringify(s.lastNine) !== JSON.stringify(nine))
|
|
231
|
+
refreshGovernor(env, now, null);
|
|
232
|
+
return null;
|
|
233
|
+
}
|
|
234
|
+
if (s.governorSaidAt !== null)
|
|
235
|
+
return null;
|
|
236
|
+
try {
|
|
237
|
+
noteGovernor(nine, now.toISOString(), env);
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
return null; // not recorded: say it next time instead of twice
|
|
241
|
+
}
|
|
242
|
+
return GOVERNOR_LINE;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Init's `closed` line (2.4, 4.20, R53): an item the person was shown at `trail init` and didn't keep. It counts as
|
|
246
|
+
* "said no" for `key` forever, and for nothing else: not the session, the week, the first week, the pause or the
|
|
247
|
+
* governor (P10). Its only writer; b6 calls it for each skill key init closes.
|
|
248
|
+
*/
|
|
249
|
+
export function recordInitClosed(repoKey, key, env, now = new Date()) {
|
|
250
|
+
append({
|
|
251
|
+
id: `o-init-${randomBytes(2).toString('hex')}`, at: now.toISOString(), event: 'closed', repo: repoKey, key, moment: 'init', runId: '', name: '',
|
|
252
|
+
channel: 'stop', answer: 'no',
|
|
253
|
+
}, env);
|
|
254
|
+
}
|
|
255
|
+
/* Keys (2.4, 4.10, P8, P13). Moments 5 and 6 are keyed per version, so a no is never asked again for that version and
|
|
256
|
+
* a new version (only after a yes, an adopted hand edit or a restore) may be offered again; the retire proposal is
|
|
257
|
+
* once per skill, ever. A key names a skill, never a repo: the offer's `repo` (1b) says where it was made. */
|
|
258
|
+
const KEY_PART = /^[^|\s]{1,200}$/;
|
|
259
|
+
function keyPart(skillId) {
|
|
260
|
+
if (!KEY_PART.test(String(skillId)))
|
|
261
|
+
throw new Error('trail: not a skill id for an offer key');
|
|
262
|
+
return skillId;
|
|
263
|
+
}
|
|
264
|
+
function keyVersion(version) {
|
|
265
|
+
if (!Number.isSafeInteger(version) || version < 1)
|
|
266
|
+
throw new Error('trail: not a skill version for an offer key');
|
|
267
|
+
return version;
|
|
268
|
+
}
|
|
269
|
+
/** Moment 5's key: `<skillId>|update|v<n>`. */
|
|
270
|
+
export const updateOfferKey = (skillId, version) => `${keyPart(skillId)}|update|v${keyVersion(version)}`;
|
|
271
|
+
/** Moment 6's key: `<skillId>|drift|v<n>`. */
|
|
272
|
+
export const driftOfferKey = (skillId, version) => `${keyPart(skillId)}|drift|v${keyVersion(version)}`;
|
|
273
|
+
/** The retire proposal's key: `<skillId>|retire`. */
|
|
274
|
+
export const retireOfferKey = (skillId) => `${keyPart(skillId)}|retire`;
|
|
275
|
+
const SKILL_KEY = /^([^|\s]{1,200})\|(?:correction|update\|v[1-9]\d*|drift\|v[1-9]\d*|retire)$/;
|
|
276
|
+
/** The skill a skill-keyed offer names (moments 4, 5, 6 and the retire proposal); null for a repo-keyed one (2, 3). */
|
|
277
|
+
export function skillOfOfferKey(key) {
|
|
278
|
+
return SKILL_KEY.exec(String(key))?.[1] ?? null;
|
|
279
|
+
}
|
|
280
|
+
/** 'o-' + 6 hex */
|
|
281
|
+
export function newOfferId() {
|
|
282
|
+
return `o-${randomBytes(3).toString('hex')}`;
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=offers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offers.js","sourceRoot":"","sources":["../../src/skills/offers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** The folders Trail keeps its skill files in. */
|
|
2
|
+
export declare const OWN_FOLDERS: readonly ["skills", "state", "ledger", "held", string];
|
|
3
|
+
/** True when `dir` is a symbolic link (a missing folder is not one). */
|
|
4
|
+
export declare function isLinked(dir: string): boolean;
|
|
5
|
+
/** The first of Trail's own folders that is a link, relative to the home, or null. */
|
|
6
|
+
export declare function linkedOwnFolder(env?: NodeJS.ProcessEnv): string | null;
|
|
7
|
+
/** Throws when `dir` is a link: the message names it, so the person can see what was planted. */
|
|
8
|
+
export declare function ownFolder(dir: string): void;
|
|
9
|
+
//# sourceMappingURL=own-folder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"own-folder.d.ts","sourceRoot":"","sources":["../../src/skills/own-folder.ts"],"names":[],"mappings":"AAeA,kDAAkD;AAClD,eAAO,MAAM,WAAW,wDAA6E,CAAC;AAEtG,wEAAwE;AACxE,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAM7C;AAED,sFAAsF;AACtF,wBAAgB,eAAe,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,GAAG,IAAI,CAGtE;AAED,iGAAiG;AACjG,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE3C"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trail's own folders under its home (`skills`, `state`, `ledger`, `held`,
|
|
3
|
+
* `skills/.retired`) are folders Trail made. A link in place of one was
|
|
4
|
+
* planted (an agent with a shell can do it in one command), and writing
|
|
5
|
+
* through it would put the person's skills, counts or ledger wherever it
|
|
6
|
+
* points, a repo included, and chmod that folder 0700. So a write refuses a
|
|
7
|
+
* folder that is a link. The Trail home itself may be a link (a person's
|
|
8
|
+
* dotfiles); only the folders inside it are checked.
|
|
9
|
+
*
|
|
10
|
+
* Node builtins only.
|
|
11
|
+
*/
|
|
12
|
+
import { lstatSync } from 'node:fs';
|
|
13
|
+
import { join } from 'node:path';
|
|
14
|
+
import { trailHome } from '../notes/trail-home.js';
|
|
15
|
+
/** The folders Trail keeps its skill files in. */
|
|
16
|
+
export const OWN_FOLDERS = ['skills', 'state', 'ledger', 'held', join('skills', '.retired')];
|
|
17
|
+
/** True when `dir` is a symbolic link (a missing folder is not one). */
|
|
18
|
+
export function isLinked(dir) {
|
|
19
|
+
try {
|
|
20
|
+
return lstatSync(dir).isSymbolicLink();
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/** The first of Trail's own folders that is a link, relative to the home, or null. */
|
|
27
|
+
export function linkedOwnFolder(env) {
|
|
28
|
+
const home = trailHome(env ?? process.env);
|
|
29
|
+
return OWN_FOLDERS.find((f) => isLinked(join(home, f))) ?? null;
|
|
30
|
+
}
|
|
31
|
+
/** Throws when `dir` is a link: the message names it, so the person can see what was planted. */
|
|
32
|
+
export function ownFolder(dir) {
|
|
33
|
+
if (isLinked(dir))
|
|
34
|
+
throw new Error(`trail: ${dir} is a link, not Trail's own folder; Trail won't write through it. Remove the link to go on.`);
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=own-folder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"own-folder.js","sourceRoot":"","sources":["../../src/skills/own-folder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,kDAAkD;AAClD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAU,CAAC;AAEtG,wEAAwE;AACxE,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,IAAI,CAAC;QACH,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,eAAe,CAAC,GAAuB;IACrD,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3C,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAClE,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,IAAI,QAAQ,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,6FAA6F,CAAC,CAAC;AACjJ,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface PersonCheck {
|
|
2
|
+
ok: boolean;
|
|
3
|
+
tty: boolean;
|
|
4
|
+
claudeCodeEnv: boolean;
|
|
5
|
+
claudeAncestor: boolean;
|
|
6
|
+
}
|
|
7
|
+
/** One row of the process table: `comm` is the executable (a full path on macOS), `args` the command line. */
|
|
8
|
+
export interface PsRow {
|
|
9
|
+
pid: number;
|
|
10
|
+
ppid: number;
|
|
11
|
+
comm: string;
|
|
12
|
+
args: string;
|
|
13
|
+
}
|
|
14
|
+
/** Seams for tests: the TTYs, the process table, and the process to start from. */
|
|
15
|
+
export interface PersonDeps {
|
|
16
|
+
stdinTTY?: boolean;
|
|
17
|
+
stdoutTTY?: boolean;
|
|
18
|
+
ps?: () => PsRow[] | null;
|
|
19
|
+
pid?: number;
|
|
20
|
+
}
|
|
21
|
+
/** An agent's CLI (Claude Code's, Codex's) or a pty wrapper. */
|
|
22
|
+
export declare function isAgentProcess(r: PsRow): boolean;
|
|
23
|
+
/** True when an agent process is among the 12 above `pid`, or when `pid` isn't in the table (can't tell). */
|
|
24
|
+
export declare function agentAncestor(rows: PsRow[], pid: number): boolean;
|
|
25
|
+
/** The whole process table from `ps` at its own path (never from PATH, which a caller sets), or null. */
|
|
26
|
+
export declare function readProcessTable(): PsRow[] | null;
|
|
27
|
+
/**
|
|
28
|
+
* stdin and stdout are TTYs, CLAUDECODE is unset, and no ancestor process (ps, up to 12 levels) is the claude CLI
|
|
29
|
+
* (basename exactly `claude`, or node running an `@anthropic-ai/claude-code` cli) or a pty wrapper an agent could use
|
|
30
|
+
* (`script`, `expect`, `unbuffer`, python running `pty`). The desktop app (`Claude`, capital C) is not the CLI, so its
|
|
31
|
+
* terminal panel counts as the person's.
|
|
32
|
+
*/
|
|
33
|
+
export declare function personAtTerminal(env?: NodeJS.ProcessEnv, deps?: PersonDeps): PersonCheck;
|
|
34
|
+
//# sourceMappingURL=person.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"person.d.ts","sourceRoot":"","sources":["../../src/skills/person.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,WAAW;IAAG,EAAE,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,OAAO,CAAA;CAAE;AAC3G,8GAA8G;AAC9G,MAAM,WAAW,KAAK;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAChF,mFAAmF;AACnF,MAAM,WAAW,UAAU;IAAG,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,KAAK,EAAE,GAAG,IAAI,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE;AAYhH,gEAAgE;AAChE,wBAAgB,cAAc,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO,CAQhD;AAED,6GAA6G;AAC7G,wBAAgB,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAYjE;AAID,yGAAyG;AACzG,wBAAgB,gBAAgB,IAAI,KAAK,EAAE,GAAG,IAAI,CAqBjD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,EAAE,IAAI,GAAE,UAAe,GAAG,WAAW,CAMzG"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Is the person at their own terminal (design 1.4 `personAtTerminal`)?
|
|
3
|
+
* `trail skills keep`, `skills on` and `offers on` are the person's: an
|
|
4
|
+
* agent that runs them is refused before they run (the agent guard), and the
|
|
5
|
+
* CLI checks again here.
|
|
6
|
+
*
|
|
7
|
+
* The person: stdin and stdout are TTYs, CLAUDECODE is unset, and no process
|
|
8
|
+
* above this one (up to 12 levels) is an agent's CLI (a program named exactly
|
|
9
|
+
* `claude`, or node running `@anthropic-ai/claude-code`; Codex's `codex`, its
|
|
10
|
+
* `codex-<target>` builds, or node running `@openai/codex`, whose exec tool can
|
|
11
|
+
* give a command a terminal) or a pty wrapper an agent could use to fake a
|
|
12
|
+
* terminal (`script`, `expect`, `unbuffer`, python running `pty`). The desktop
|
|
13
|
+
* apps are `Claude` and `Codex`, with a capital C: their own windows are the
|
|
14
|
+
* person's. (`claudeAncestor` keeps its 1a name: any agent ancestor.)
|
|
15
|
+
*
|
|
16
|
+
* When the process table can't be read, the answer is no: a person can run
|
|
17
|
+
* the command again, an agent must not get through on an error.
|
|
18
|
+
*/
|
|
19
|
+
import { execFileSync } from 'node:child_process';
|
|
20
|
+
import { existsSync } from 'node:fs';
|
|
21
|
+
import { basename } from 'node:path';
|
|
22
|
+
const LEVELS = 12;
|
|
23
|
+
const PTY_WRAPPERS = new Set(['script', 'expect', 'unbuffer']);
|
|
24
|
+
/** `python3`, and the macOS framework builds (Homebrew's, Xcode's), which run as `Python`. */
|
|
25
|
+
const PYTHON = /^python[\d.]*$/i;
|
|
26
|
+
const NODE = /^(?:node|nodejs|bun)(?:\.exe)?$/;
|
|
27
|
+
const firstWord = (args) => args.trim().split(/\s+/)[0] ?? '';
|
|
28
|
+
/** Codex's CLI: `codex`, and the per-target builds its npm package ships (`codex-x86_64-unknown-linux-musl`). */
|
|
29
|
+
const CODEX = /^codex(?:-(?:aarch64|x86_64|arm64|amd64)-[\w-]{1,60})?(?:\.exe)?$/;
|
|
30
|
+
/** An agent's CLI (Claude Code's, Codex's) or a pty wrapper. */
|
|
31
|
+
export function isAgentProcess(r) {
|
|
32
|
+
const exe = basename(r.comm.trim());
|
|
33
|
+
const argv0 = basename(firstWord(r.args));
|
|
34
|
+
if (exe === 'claude' || argv0 === 'claude')
|
|
35
|
+
return true;
|
|
36
|
+
if (CODEX.test(exe) || CODEX.test(argv0))
|
|
37
|
+
return true;
|
|
38
|
+
if (NODE.test(exe) && /@anthropic-ai[/\\]claude-code\b|@openai[/\\]codex\b/.test(r.args))
|
|
39
|
+
return true;
|
|
40
|
+
if (PTY_WRAPPERS.has(exe) || PTY_WRAPPERS.has(argv0))
|
|
41
|
+
return true;
|
|
42
|
+
return (PYTHON.test(exe) || PYTHON.test(argv0)) && /\bpty\b/.test(r.args);
|
|
43
|
+
}
|
|
44
|
+
/** True when an agent process is among the 12 above `pid`, or when `pid` isn't in the table (can't tell). */
|
|
45
|
+
export function agentAncestor(rows, pid) {
|
|
46
|
+
const byPid = new Map(rows.map((r) => [r.pid, r]));
|
|
47
|
+
const self = byPid.get(pid);
|
|
48
|
+
if (!self)
|
|
49
|
+
return true;
|
|
50
|
+
let at = self.ppid;
|
|
51
|
+
for (let level = 0; level < LEVELS && at > 1; level++) {
|
|
52
|
+
const r = byPid.get(at);
|
|
53
|
+
if (!r)
|
|
54
|
+
break;
|
|
55
|
+
if (isAgentProcess(r))
|
|
56
|
+
return true;
|
|
57
|
+
at = r.ppid;
|
|
58
|
+
}
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
const PS = ['/bin/ps', '/usr/bin/ps'];
|
|
62
|
+
/** The whole process table from `ps` at its own path (never from PATH, which a caller sets), or null. */
|
|
63
|
+
export function readProcessTable() {
|
|
64
|
+
const ps = PS.find((p) => existsSync(p));
|
|
65
|
+
if (!ps || process.platform === 'win32')
|
|
66
|
+
return null;
|
|
67
|
+
const run = (fields) => execFileSync(ps, ['-A', '-o', fields], {
|
|
68
|
+
encoding: 'utf8', timeout: 3000, maxBuffer: 16 * 1024 * 1024, stdio: ['ignore', 'pipe', 'ignore'], env: { LC_ALL: 'C', PATH: '/usr/bin:/bin' },
|
|
69
|
+
});
|
|
70
|
+
try {
|
|
71
|
+
const rows = new Map();
|
|
72
|
+
for (const line of run('pid=,ppid=,comm=').split('\n')) {
|
|
73
|
+
const m = /^\s*(\d+)\s+(\d+)\s(.*)$/.exec(line);
|
|
74
|
+
if (m)
|
|
75
|
+
rows.set(Number(m[1]), { pid: Number(m[1]), ppid: Number(m[2]), comm: m[3].trim(), args: '' });
|
|
76
|
+
}
|
|
77
|
+
for (const line of run('pid=,args=').split('\n')) {
|
|
78
|
+
const m = /^\s*(\d+)\s(.*)$/.exec(line);
|
|
79
|
+
const r = m ? rows.get(Number(m[1])) : undefined;
|
|
80
|
+
if (r)
|
|
81
|
+
r.args = m[2].trim();
|
|
82
|
+
}
|
|
83
|
+
return rows.size ? [...rows.values()] : null;
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* stdin and stdout are TTYs, CLAUDECODE is unset, and no ancestor process (ps, up to 12 levels) is the claude CLI
|
|
91
|
+
* (basename exactly `claude`, or node running an `@anthropic-ai/claude-code` cli) or a pty wrapper an agent could use
|
|
92
|
+
* (`script`, `expect`, `unbuffer`, python running `pty`). The desktop app (`Claude`, capital C) is not the CLI, so its
|
|
93
|
+
* terminal panel counts as the person's.
|
|
94
|
+
*/
|
|
95
|
+
export function personAtTerminal(env = process.env, deps = {}) {
|
|
96
|
+
const tty = (deps.stdinTTY ?? process.stdin.isTTY === true) && (deps.stdoutTTY ?? process.stdout.isTTY === true);
|
|
97
|
+
const claudeCodeEnv = env.CLAUDECODE !== undefined;
|
|
98
|
+
const rows = (deps.ps ?? readProcessTable)();
|
|
99
|
+
const claudeAncestor = rows === null ? true : agentAncestor(rows, deps.pid ?? process.pid);
|
|
100
|
+
return { ok: tty && !claudeCodeEnv && !claudeAncestor, tty, claudeCodeEnv, claudeAncestor };
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=person.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"person.js","sourceRoot":"","sources":["../../src/skills/person.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
type Git = (args: string[], cwd: string, timeoutMs: number) => {
|
|
2
|
+
code: number | null;
|
|
3
|
+
out: string;
|
|
4
|
+
timedOut: boolean;
|
|
5
|
+
};
|
|
6
|
+
/** Whether every change `git status --porcelain` printed is a path init wrote here and nobody changed since. */
|
|
7
|
+
export declare function onlyTrailChanges(out: string, checkout: string, git: Git, timeoutMs: number, env?: NodeJS.ProcessEnv): boolean;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=probe-clean.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"probe-clean.d.ts","sourceRoot":"","sources":["../../src/skills/probe-clean.ts"],"names":[],"mappings":"AAcA,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;AAYvH,gHAAgH;AAChH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAiB1I"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* D120 (2), replacing D116 item 4's pattern: the clean-tree ready probe leaves
|
|
3
|
+
* out exactly the paths `trail init` recorded writing in this checkout (its
|
|
4
|
+
* install record, src/init/install-record.ts), and only while each still holds
|
|
5
|
+
* what init wrote. So a repo whose wiring isn't committed yet doesn't open every
|
|
6
|
+
* run block with "Uncommitted changes here", and any later edit to one of those
|
|
7
|
+
* files, the person's own settings changes included, blocks again. Anything
|
|
8
|
+
* init never wrote blocks, in `.trail/` too. No record: nothing is left out.
|
|
9
|
+
* Read only: `git status --porcelain` output, one more `git status` per
|
|
10
|
+
* untracked folder (to list its files the way git sees them), the record, and
|
|
11
|
+
* the hashes of the files it names.
|
|
12
|
+
*/
|
|
13
|
+
import { initLeftIt, readInstallRecord } from '../init/install-record.js';
|
|
14
|
+
/** The paths of `git status --porcelain` lines (both sides of a rename, quotes left on: such a path is never init's). */
|
|
15
|
+
function statusPaths(out) {
|
|
16
|
+
const paths = [];
|
|
17
|
+
for (const line of out.split('\n')) {
|
|
18
|
+
if (line.length < 4)
|
|
19
|
+
continue;
|
|
20
|
+
paths.push(...line.slice(3).split(' -> '));
|
|
21
|
+
}
|
|
22
|
+
return paths;
|
|
23
|
+
}
|
|
24
|
+
/** Whether every change `git status --porcelain` printed is a path init wrote here and nobody changed since. */
|
|
25
|
+
export function onlyTrailChanges(out, checkout, git, timeoutMs, env = process.env) {
|
|
26
|
+
const paths = statusPaths(out);
|
|
27
|
+
if (!paths.length)
|
|
28
|
+
return false;
|
|
29
|
+
const files = readInstallRecord(checkout, env);
|
|
30
|
+
if (!files)
|
|
31
|
+
return false;
|
|
32
|
+
for (const p of paths) {
|
|
33
|
+
if (!p.endsWith('/')) {
|
|
34
|
+
if (!initLeftIt(files, checkout, p))
|
|
35
|
+
return false;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
// An untracked folder is shown whole: list its files as git sees them (ignored ones left out).
|
|
39
|
+
const inside = git(['status', '--porcelain', '--untracked-files=all', '--', p], checkout, timeoutMs);
|
|
40
|
+
if (inside.timedOut || inside.code !== 0)
|
|
41
|
+
return false;
|
|
42
|
+
const rels = statusPaths(inside.out);
|
|
43
|
+
if (!rels.length || rels.length > 64 || rels.some((r) => !initLeftIt(files, checkout, r)))
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=probe-clean.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"probe-clean.js","sourceRoot":"","sources":["../../src/skills/probe-clean.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAI1E,yHAAyH;AACzH,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAC9B,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,gHAAgH;AAChH,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,QAAgB,EAAE,GAAQ,EAAE,SAAiB,EAAE,MAAyB,OAAO,CAAC,GAAG;IAC/H,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAChC,MAAM,KAAK,GAAG,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC/C,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;YAClD,SAAS;QACX,CAAC;QACD,+FAA+F;QAC/F,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,aAAa,EAAE,uBAAuB,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QACrG,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACvD,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IAC1G,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ParsedSkill } from './types.js';
|
|
2
|
+
export interface ProbeResult {
|
|
3
|
+
probe: string;
|
|
4
|
+
ok: boolean;
|
|
5
|
+
why?: string;
|
|
6
|
+
fix?: string;
|
|
7
|
+
}
|
|
8
|
+
/** What runs git for a probe; tests stub it. `code` null when it didn't finish. */
|
|
9
|
+
export type ProbeGit = (args: string[], cwd: string, timeoutMs: number) => {
|
|
10
|
+
code: number | null;
|
|
11
|
+
out: string;
|
|
12
|
+
timedOut: boolean;
|
|
13
|
+
};
|
|
14
|
+
export interface ProbeOpts {
|
|
15
|
+
/** At most 300; the prompt hook passes what its deadline leaves. */
|
|
16
|
+
budgetMs?: number;
|
|
17
|
+
git?: ProbeGit;
|
|
18
|
+
}
|
|
19
|
+
export declare const PROBE_BUDGET_MS = 300;
|
|
20
|
+
/** The probes of a skill's `ready` line, in order. */
|
|
21
|
+
export declare function readyProbes(s: Pick<ParsedSkill, 'meta'>): string[];
|
|
22
|
+
/** A passed probe in words, for the run block's ready line; null for a form that never runs. */
|
|
23
|
+
export declare function probePassWords(probe: string): string | null;
|
|
24
|
+
/** Allowlisted local probes only, without a shell, 300 ms total, cached 10 min in <home>/state/probes.json keyed by checkout+probe. */
|
|
25
|
+
export declare function runProbes(s: ParsedSkill, checkout: string, now?: Date, env?: NodeJS.ProcessEnv, opts?: ProbeOpts): ProbeResult[];
|
|
26
|
+
//# sourceMappingURL=probes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"probes.d.ts","sourceRoot":"","sources":["../../src/skills/probes.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAM9C,MAAM,WAAW,WAAW;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE;AAEvF,mFAAmF;AACnF,MAAM,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;AACnI,MAAM,WAAW,SAAS;IACxB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,QAAQ,CAAC;CAChB;AAED,eAAO,MAAM,eAAe,MAAM,CAAC;AAgCnC,sDAAsD;AACtD,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,CAElE;AAID,gGAAgG;AAChG,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAU3D;AA6GD,uIAAuI;AACvI,wBAAgB,SAAS,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,IAAiB,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,EAAE,IAAI,GAAE,SAAc,GAAG,WAAW,EAAE,CA4B7J"}
|