@zerwiz/ymir 0.1.3 → 0.1.5
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/.agents/README.md +291 -0
- package/.agents/agents/bragi-marketer.md +111 -0
- package/.agents/agents/brokk.md +352 -0
- package/.agents/agents/forseti-reviewer.md +93 -0
- package/.agents/agents/frigg-consent.md +77 -0
- package/.agents/agents/groa-update.md +77 -0
- package/.agents/agents/hnoss-designer.md +69 -0
- package/.agents/agents/huginn-researcher.md +99 -0
- package/.agents/agents/jord-projects.md +78 -0
- package/.agents/agents/kvasir-scout.md +91 -0
- package/.agents/agents/mimir-planner.md +92 -0
- package/.agents/agents/muninn-stow.md +77 -0
- package/.agents/agents/saga-bearings.md +78 -0
- package/.agents/agents/sindri-developer.md +114 -0
- package/.agents/agents/snotra-documenter.md +105 -0
- package/.agents/agents/syn-recovery.md +78 -0
- package/.agents/agents/tyr-check.md +78 -0
- package/.agents/agents/urdh-hold.md +77 -0
- package/.agents/agents/volundr-smith.md +80 -0
- package/.agents/agents/vor-diagnostics.md +77 -0
- package/.agents/assets/agents/naming.md +50 -0
- package/.agents/assets/agents/registry.md +93 -0
- package/.agents/assets/agents/runtime.md +36 -0
- package/.agents/assets/agents/toon-tasks-cli.md +42 -0
- package/.agents/assets/templates/company_entity.template.md +37 -0
- package/.agents/backend/backends/cmux.sh +649 -0
- package/.agents/backend/backends/herdr-eventwait.py +157 -0
- package/.agents/backend/backends/herdr-workspace-move.py +114 -0
- package/.agents/backend/backends/herdr.sh +3386 -0
- package/.agents/backend/backends/orca.sh +290 -0
- package/.agents/backend/backends/tmux.sh +357 -0
- package/.agents/backend/backends/zellij.sh +700 -0
- package/.agents/backend/fm-afk-launch.sh +654 -0
- package/.agents/backend/fm-afk-return.sh +241 -0
- package/.agents/backend/fm-afk-start.sh +172 -0
- package/.agents/backend/fm-arm-command-policy.mjs +960 -0
- package/.agents/backend/fm-arm-pretool-check.sh +200 -0
- package/.agents/backend/fm-backend-hometag-lib.sh +52 -0
- package/.agents/backend/fm-backend.sh +981 -0
- package/.agents/backend/fm-backlog-handoff.sh +909 -0
- package/.agents/backend/fm-backlog-receive.sh +187 -0
- package/.agents/backend/fm-backlog-transition-lib.sh +779 -0
- package/.agents/backend/fm-bearings-board.sh +204 -0
- package/.agents/backend/fm-bearings-snapshot.sh +546 -0
- package/.agents/backend/fm-bootstrap.sh +1568 -0
- package/.agents/backend/fm-branch-outcome.sh +203 -0
- package/.agents/backend/fm-branch-prompt.sh +101 -0
- package/.agents/backend/fm-brief.sh +452 -0
- package/.agents/backend/fm-busy-event.sh +234 -0
- package/.agents/backend/fm-busy-lib.sh +986 -0
- package/.agents/backend/fm-captain-hold.sh +1001 -0
- package/.agents/backend/fm-cd-command-policy.mjs +153 -0
- package/.agents/backend/fm-cd-pretool-check.sh +190 -0
- package/.agents/backend/fm-check-lib.sh +74 -0
- package/.agents/backend/fm-check-register.sh +42 -0
- package/.agents/backend/fm-check-unregister.sh +52 -0
- package/.agents/backend/fm-classify-lib.sh +1770 -0
- package/.agents/backend/fm-claude-stop-autoarm.sh +334 -0
- package/.agents/backend/fm-composer-lib.sh +1416 -0
- package/.agents/backend/fm-config-inherit-lib.sh +1202 -0
- package/.agents/backend/fm-config-push.sh +254 -0
- package/.agents/backend/fm-control-lib.sh +251 -0
- package/.agents/backend/fm-control.sh +878 -0
- package/.agents/backend/fm-crew-state.sh +625 -0
- package/.agents/backend/fm-cursor-lib.sh +243 -0
- package/.agents/backend/fm-decision-hold.sh +232 -0
- package/.agents/backend/fm-doc-audience-check.sh +269 -0
- package/.agents/backend/fm-dod-lib.sh +67 -0
- package/.agents/backend/fm-ensure-agents-md.sh +253 -0
- package/.agents/backend/fm-extension-launch-barrier.mjs +129 -0
- package/.agents/backend/fm-extension.mjs +2577 -0
- package/.agents/backend/fm-extension.sh +16 -0
- package/.agents/backend/fm-ff-lib.sh +420 -0
- package/.agents/backend/fm-fleet-snapshot.sh +1463 -0
- package/.agents/backend/fm-fleet-sync.sh +458 -0
- package/.agents/backend/fm-fleet-view.sh +96 -0
- package/.agents/backend/fm-gate-refuse-lib.sh +102 -0
- package/.agents/backend/fm-guard.sh +242 -0
- package/.agents/backend/fm-harness.sh +195 -0
- package/.agents/backend/fm-herdr-ci-cleanup.sh +115 -0
- package/.agents/backend/fm-herdr-lab.sh +346 -0
- package/.agents/backend/fm-herdr-session-cleanup.sh +337 -0
- package/.agents/backend/fm-home-seed.sh +984 -0
- package/.agents/backend/fm-home-summary-refresh.sh +255 -0
- package/.agents/backend/fm-hook-host-lib.sh +36 -0
- package/.agents/backend/fm-inactive-reconcile.sh +531 -0
- package/.agents/backend/fm-inbox.sh +399 -0
- package/.agents/backend/fm-install-actionlint.sh +84 -0
- package/.agents/backend/fm-install-herdr.sh +96 -0
- package/.agents/backend/fm-install-shellcheck.sh +84 -0
- package/.agents/backend/fm-install-treehouse.sh +95 -0
- package/.agents/backend/fm-kimi-turnend-hook.sh +276 -0
- package/.agents/backend/fm-lease-lib.sh +218 -0
- package/.agents/backend/fm-lease.sh +189 -0
- package/.agents/backend/fm-line-cap-lib.sh +51 -0
- package/.agents/backend/fm-lint-workflows.sh +137 -0
- package/.agents/backend/fm-lint.sh +591 -0
- package/.agents/backend/fm-lock-lib.sh +104 -0
- package/.agents/backend/fm-lock.sh +107 -0
- package/.agents/backend/fm-marker-lib.sh +12 -0
- package/.agents/backend/fm-merge-local.sh +74 -0
- package/.agents/backend/fm-merge-outcome-lib.sh +138 -0
- package/.agents/backend/fm-nm-run-lib.sh +124 -0
- package/.agents/backend/fm-on.sh +125 -0
- package/.agents/backend/fm-operational-input.sh +253 -0
- package/.agents/backend/fm-peek.sh +46 -0
- package/.agents/backend/fm-pending-reply-lib.sh +1409 -0
- package/.agents/backend/fm-pr-check.sh +135 -0
- package/.agents/backend/fm-pr-lib.sh +1016 -0
- package/.agents/backend/fm-pr-merge.sh +707 -0
- package/.agents/backend/fm-pr-poll.sh +110 -0
- package/.agents/backend/fm-primary-scope-lib.sh +33 -0
- package/.agents/backend/fm-procevent-extension-capture.pl +259 -0
- package/.agents/backend/fm-procevent-lavish.sh +628 -0
- package/.agents/backend/fm-procevent-lib.sh +892 -0
- package/.agents/backend/fm-procevent-quota.sh +290 -0
- package/.agents/backend/fm-procevent-remote-reply.sh +577 -0
- package/.agents/backend/fm-procevent-when.sh +504 -0
- package/.agents/backend/fm-procevent.sh +1466 -0
- package/.agents/backend/fm-project-mode.sh +92 -0
- package/.agents/backend/fm-project-origin-lib.sh +180 -0
- package/.agents/backend/fm-promote.sh +282 -0
- package/.agents/backend/fm-public-followup-emit.sh +260 -0
- package/.agents/backend/fm-public-followup-lib.sh +398 -0
- package/.agents/backend/fm-public-followup.sh +1330 -0
- package/.agents/backend/fm-push-transition-lib.sh +168 -0
- package/.agents/backend/fm-quota-axi-lib.sh +93 -0
- package/.agents/backend/fm-quota-choose.sh +384 -0
- package/.agents/backend/fm-remote-delta-read.sh +189 -0
- package/.agents/backend/fm-remote-doctor.sh +800 -0
- package/.agents/backend/fm-remote-entrypoint.sh +193 -0
- package/.agents/backend/fm-remote-file.sh +234 -0
- package/.agents/backend/fm-remote-home-provision.sh +259 -0
- package/.agents/backend/fm-remote-home-seed.sh +259 -0
- package/.agents/backend/fm-remote-inherit-push.sh +90 -0
- package/.agents/backend/fm-remote-inherit.sh +179 -0
- package/.agents/backend/fm-remote-job-lib.sh +1241 -0
- package/.agents/backend/fm-remote-job-reap-orphans.sh +137 -0
- package/.agents/backend/fm-remote-job-worker.sh +1124 -0
- package/.agents/backend/fm-remote-readiness-lib.sh +44 -0
- package/.agents/backend/fm-remote-secondmate-control.sh +340 -0
- package/.agents/backend/fm-review-diff.sh +158 -0
- package/.agents/backend/fm-secondmate-charter-lib.sh +44 -0
- package/.agents/backend/fm-secondmate-nudge-lib.sh +68 -0
- package/.agents/backend/fm-secondmate-parent-lib.sh +70 -0
- package/.agents/backend/fm-secondmate-reconcile.sh +371 -0
- package/.agents/backend/fm-secondmate-registry-lib.sh +311 -0
- package/.agents/backend/fm-secondmate-report.sh +88 -0
- package/.agents/backend/fm-send.sh +1059 -0
- package/.agents/backend/fm-session-lock-lib.sh +176 -0
- package/.agents/backend/fm-session-start.sh +970 -0
- package/.agents/backend/fm-sessionstart-cursor.sh +40 -0
- package/.agents/backend/fm-sessionstart-nudge.sh +45 -0
- package/.agents/backend/fm-sessionstart-run.sh +145 -0
- package/.agents/backend/fm-spawn.sh +3153 -0
- package/.agents/backend/fm-startup-memory-budget-lib.sh +224 -0
- package/.agents/backend/fm-startup-memory-budget.sh +94 -0
- package/.agents/backend/fm-startup-network.sh +642 -0
- package/.agents/backend/fm-stow-cascade.sh +251 -0
- package/.agents/backend/fm-subagent-pretool-check.sh +207 -0
- package/.agents/backend/fm-supervise-daemon.sh +1732 -0
- package/.agents/backend/fm-supervision-instructions.sh +215 -0
- package/.agents/backend/fm-supervision-lib.sh +90 -0
- package/.agents/backend/fm-supervisor-target-lib.sh +78 -0
- package/.agents/backend/fm-tangle-lib.sh +53 -0
- package/.agents/backend/fm-task-inbox-lib.sh +402 -0
- package/.agents/backend/fm-tasks-axi-lib.sh +123 -0
- package/.agents/backend/fm-teardown.sh +2922 -0
- package/.agents/backend/fm-test-isolation-proof.sh +588 -0
- package/.agents/backend/fm-test-run.sh +2191 -0
- package/.agents/backend/fm-timeout-lib.sh +141 -0
- package/.agents/backend/fm-timing-lib.sh +179 -0
- package/.agents/backend/fm-tmux-lib.sh +291 -0
- package/.agents/backend/fm-tool-update-check.sh +898 -0
- package/.agents/backend/fm-trace-context-lib.sh +227 -0
- package/.agents/backend/fm-transition-lib.sh +103 -0
- package/.agents/backend/fm-turnend-guard-cursor.sh +391 -0
- package/.agents/backend/fm-turnend-guard-grok.sh +90 -0
- package/.agents/backend/fm-turnend-guard.sh +432 -0
- package/.agents/backend/fm-update.sh +110 -0
- package/.agents/backend/fm-vendor-auth-probe.sh +190 -0
- package/.agents/backend/fm-voice-client.py +1373 -0
- package/.agents/backend/fm-voice-relay.py +1256 -0
- package/.agents/backend/fm-wake-drain.sh +592 -0
- package/.agents/backend/fm-wake-grant.sh +127 -0
- package/.agents/backend/fm-wake-lib.sh +1849 -0
- package/.agents/backend/fm-watch-arm.sh +602 -0
- package/.agents/backend/fm-watch-checkpoint.sh +109 -0
- package/.agents/backend/fm-watch.sh +1962 -0
- package/.agents/backend/fm-x-dismiss.sh +116 -0
- package/.agents/backend/fm-x-followup.sh +286 -0
- package/.agents/backend/fm-x-lib.sh +1000 -0
- package/.agents/backend/fm-x-link.sh +234 -0
- package/.agents/backend/fm-x-poll.sh +185 -0
- package/.agents/backend/fm-x-reply.sh +385 -0
- package/.agents/backend/fm_voice_frame.py +166 -0
- package/.agents/backend/fm_voice_records.py +574 -0
- package/.agents/backend/model-bridge.py +290 -0
- package/.agents/backend/opencode-go-bridge.py +30 -0
- package/.agents/bus/README.md +12 -0
- package/.agents/bus/messages.json +1 -0
- package/.agents/config/agents.machine.example.yaml +16 -0
- package/.agents/config/agents.yaml +50 -0
- package/.agents/config/agents.yaml.example +72 -0
- package/.agents/config/crew-dispatch.json +22 -0
- package/.agents/config/cron.yaml +9 -0
- package/.agents/config/eindri-dispatch.json +67 -0
- package/.agents/config/eindri-harness +1 -0
- package/.agents/config/startup-memory-budget +1 -0
- package/.agents/config/tailscale-sync.yaml +27 -0
- package/.agents/filebrowser/.filebrowser.json +6 -0
- package/.agents/filebrowser/README.md +11 -0
- package/.agents/gateway/README.md +12 -0
- package/.agents/github/README.md +15 -0
- package/.agents/github/webhooks/.gitkeep +0 -0
- package/.agents/github/workflows/.gitkeep +0 -0
- package/.agents/harness/opencode/plugins/lib/rodd-operational-input.js +37 -0
- package/.agents/harness/opencode/plugins/package.json +4 -0
- package/.agents/harness/opencode/plugins/saga-sessionstart.js +77 -0
- package/.agents/harness/opencode/plugins/syn-cd-check.js +61 -0
- package/.agents/harness/opencode/plugins/syn-pretool-check.js +68 -0
- package/.agents/harness/opencode/plugins/syn-turnend-guard.js +105 -0
- package/.agents/harness/opencode/plugins/syn-watch-arm.js +521 -0
- package/.agents/memory/README.md +46 -0
- package/.agents/memory/kaia.engram +0 -0
- package/.agents/memory/kaia.engram-shm +0 -0
- package/.agents/memory/kaia.engram-wal +0 -0
- package/.agents/memory/runes_audit.md +5 -0
- package/.agents/memory/well/episodes.jsonl +367 -0
- package/.agents/memory/well/workspace.jsonl +27 -0
- package/.agents/migrations/0001-hodd-layout.sh +38 -0
- package/.agents/migrations/0002-a2a-mcp.sh +27 -0
- package/.agents/migrations/0003-private-data-separation.sh +111 -0
- package/.agents/migrations/0004-hoard-and-realms.sh +104 -0
- package/.agents/sandbox/Dockerfile.utgard +19 -0
- package/.agents/sandbox/README.md +14 -0
- package/.agents/sandbox/utgard.config.json +14 -0
- package/.agents/skills/README.md +59 -0
- package/.agents/skills/bragi-marketing/README.md +3 -0
- package/.agents/skills/bragi-marketing/SKILL.md +82 -0
- package/.agents/skills/eindri-homes/README.md +3 -0
- package/.agents/skills/eindri-homes/SKILL.md +291 -0
- package/.agents/skills/eindri-homes/assets/control-plane.md +122 -0
- package/.agents/skills/eindri-homes/assets/dispatch.md +80 -0
- package/.agents/skills/frigg-consent/README.md +3 -0
- package/.agents/skills/frigg-consent/SKILL.md +56 -0
- package/.agents/skills/galdr-ymirsystem/README.md +3 -0
- package/.agents/skills/galdr-ymirsystem/SKILL.md +158 -0
- package/.agents/skills/galdr-ymirsystem/assets/README.md +74 -0
- package/.agents/skills/galdr-ymirsystem/assets/brokk-distro-runtime.md +390 -0
- package/.agents/skills/galdr-ymirsystem/assets/build-method.md +113 -0
- package/.agents/skills/galdr-ymirsystem/assets/build-tool-categories.md +178 -0
- package/.agents/skills/galdr-ymirsystem/assets/eindri-orchestration.md +518 -0
- package/.agents/skills/galdr-ymirsystem/assets/eindri-profiles.md +136 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/README.md +673 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/claude-code.md +197 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/codex.md +191 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/cursor.md +193 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/opencode.md +262 -0
- package/.agents/skills/galdr-ymirsystem/assets/harness-integration/pi.md +295 -0
- package/.agents/skills/galdr-ymirsystem/assets/hlidskjalf-ui.md +496 -0
- package/.agents/skills/galdr-ymirsystem/assets/installation.md +571 -0
- package/.agents/skills/galdr-ymirsystem/assets/local-models/HOST-DATA.example.md +72 -0
- package/.agents/skills/galdr-ymirsystem/assets/local-models.md +274 -0
- package/.agents/skills/galdr-ymirsystem/assets/memory-well.md +161 -0
- package/.agents/skills/galdr-ymirsystem/assets/nornir-jobs.md +377 -0
- package/.agents/skills/galdr-ymirsystem/assets/norse-naming.md +325 -0
- package/.agents/skills/galdr-ymirsystem/assets/odrerir-hall.md +129 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/einherjar-spawn.schema.json +81 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/herdr-profile.toml +75 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/pi-profile.yml +96 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot/supervision-tree.yml +163 -0
- package/.agents/skills/galdr-ymirsystem/assets/pi-boot-guide.md +58 -0
- package/.agents/skills/galdr-ymirsystem/assets/porting-upstream-to-norse.md +301 -0
- package/.agents/skills/galdr-ymirsystem/assets/principles.md +385 -0
- package/.agents/skills/galdr-ymirsystem/assets/reference-adoption.md +99 -0
- package/.agents/skills/galdr-ymirsystem/assets/registry.md +379 -0
- package/.agents/skills/galdr-ymirsystem/assets/runtime-compliance.md +463 -0
- package/.agents/skills/galdr-ymirsystem/assets/runtime-components.md +553 -0
- package/.agents/skills/galdr-ymirsystem/assets/smidja.md +175 -0
- package/.agents/skills/galdr-ymirsystem/schemas/toon-schemas.md +190 -0
- package/.agents/skills/galdr-ymirsystem/scripts/README.md +45 -0
- package/.agents/skills/galdr-ymirsystem/scripts/bench-one.sh +248 -0
- package/.agents/skills/galdr-ymirsystem/scripts/compliance-check.sh +360 -0
- package/.agents/skills/galdr-ymirsystem/scripts/gpu-sample.sh +43 -0
- package/.agents/skills/galdr-ymirsystem/scripts/stop-all.sh +34 -0
- package/.agents/skills/galdr-ymirsystem/scripts/toon-check.py +188 -0
- package/.agents/skills/gjallarhorn-relay/README.md +3 -0
- package/.agents/skills/gjallarhorn-relay/SKILL.md +283 -0
- package/.agents/skills/groa-update/SKILL.md +70 -0
- package/.agents/skills/hamr-adapters/README.md +3 -0
- package/.agents/skills/hamr-adapters/SKILL.md +123 -0
- package/.agents/skills/hamr-adapters/references/common/control-and-recovery.md +37 -0
- package/.agents/skills/hamr-adapters/references/common/dispatch.md +32 -0
- package/.agents/skills/hamr-adapters/references/common/model-and-effort.md +42 -0
- package/.agents/skills/hamr-adapters/references/common/primary-hooks.md +40 -0
- package/.agents/skills/hamr-adapters/references/harness/claude.md +55 -0
- package/.agents/skills/hamr-adapters/references/harness/codex.md +43 -0
- package/.agents/skills/hamr-adapters/references/harness/cursor.md +75 -0
- package/.agents/skills/hamr-adapters/references/harness/grok.md +69 -0
- package/.agents/skills/hamr-adapters/references/harness/kimi.md +51 -0
- package/.agents/skills/hamr-adapters/references/harness/muse.md +70 -0
- package/.agents/skills/hamr-adapters/references/harness/opencode.md +42 -0
- package/.agents/skills/hamr-adapters/references/harness/pi.md +56 -0
- package/.agents/skills/herdr-panes/README.md +3 -0
- package/.agents/skills/herdr-panes/SKILL.md +92 -0
- package/.agents/skills/herdr-panes/assets/herdr-backend.md +346 -0
- package/.agents/skills/herdr-panes/assets/tmux-backend.md +115 -0
- package/.agents/skills/hnoss-design/DESIGN.md +19 -0
- package/.agents/skills/hnoss-design/README.md +3 -0
- package/.agents/skills/hnoss-design/SKILL.md +83 -0
- package/.agents/skills/hvild-afk/README.md +3 -0
- package/.agents/skills/hvild-afk/SKILL.md +241 -0
- package/.agents/skills/jord-projects/README.md +3 -0
- package/.agents/skills/jord-projects/SKILL.md +92 -0
- package/.agents/skills/lifecycle/SKILL.md +56 -0
- package/.agents/skills/lifecycle/smoke_test.sh +52 -0
- package/.agents/skills/lifecycle/start.sh +21 -0
- package/.agents/skills/lifecycle/status.sh +35 -0
- package/.agents/skills/lifecycle/stop.sh +16 -0
- package/.agents/skills/muninn-stow/README.md +3 -0
- package/.agents/skills/muninn-stow/SKILL.md +309 -0
- package/.agents/skills/no-mistakes/SKILL.md +379 -0
- package/.agents/skills/nornir-schedule/README.md +3 -0
- package/.agents/skills/nornir-schedule/SKILL.md +25 -0
- package/.agents/skills/nornir-schedule/assets/events.md +137 -0
- package/.agents/skills/nornir-schedule/assets/quota.md +131 -0
- package/.agents/skills/nsr-compliance/README.md +3 -0
- package/.agents/skills/nsr-compliance/SKILL.md +29 -0
- package/.agents/skills/nsr-compliance/assets/nsr/README.md +40 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/README.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/git-workflow.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/security.md +22 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/RULES/tech-stack.md +8 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/SKILL.md +71 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/config/core_four.yaml +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/validate_code.sh +29 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/gates/verify_docs.py +66 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/generate.sh +109 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/NSRcompliance/templates/compliance/telemetry/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/README.md +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/README.md +36 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/features/SKILL-template.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/README.md +25 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/SKILL.md +13 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/create_branch.sh +6 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/safe_commit.sh +9 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/git_ops/sync_upstream.sh +6 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/README.md +27 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/SKILL.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/smoke_test.sh +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/start.sh +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/status.sh +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/agents_skills/lifecycle/stop.sh +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/config/core_four.yaml +13 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/compliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/README.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/api.md +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/compliance-wiring.md +155 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/BEST_PRACTICES/frontend.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/README.md +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/README.md +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/clients/template-README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/deploy.sh +49 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/development.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/production.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/envs/staging.env.example +17 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/CI_CD/deployment/tenants/template.env.example +8 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/README.md +26 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/agent.md +7 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/developers/dev-1.md +20 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/linux.md +9 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/macos.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/shared.md +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/DEVELOPER_SETUP/windows.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/README.md +25 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/_template.md +41 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/HOSTING/hosting-1.md +41 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/README.md +21 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/README.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/deployment.md +19 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/disaster-recovery.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/RUNBOOK/ops-tasks.md +14 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/features/README.md +16 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/project-skills.md +146 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/research/software-compliance-research.md +269 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/docs/working-with-agents.md +260 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/AGENTS.md +38 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/ARCHITECTURE.md +36 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/BEST_PRACTICES.md +27 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/CI_CD.md +23 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/FEATURES.md +15 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/README.md +22 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/RULES.md +37 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/STRUCTURE.md +45 -0
- package/.agents/skills/nsr-compliance/assets/nsr/assets/root/TECH_STACK.md +28 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scaffold-spec.md +63 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scripts/scaffold.sh +103 -0
- package/.agents/skills/nsr-compliance/assets/nsr/scripts/validate.sh +52 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/SKILL.md +71 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/config/core_four.yaml +16 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_danger.sh +102 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/check_wiring.sh +69 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/validate_code.sh +29 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/gates/verify_docs.py +66 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/generate.sh +109 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/result_envelope.json +14 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/envelopes/task_envelope.json +20 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/harness/runner.py +303 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/telemetry/logger.py +112 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/README.md +18 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/config/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/README.md +12 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_env.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_paths.sh +20 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/gates/check_platform.sh +23 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/README.md +11 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/harness/envelopes/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/README.md +10 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/installer/install.sh +125 -0
- package/.agents/skills/nsr-compliance/assets/nsrcompliance/templates/compliance/telemetry/README.md +11 -0
- package/.agents/skills/pr-ops/README.md +3 -0
- package/.agents/skills/pr-ops/SKILL.md +109 -0
- package/.agents/skills/ratatoskr-a2a/README.md +3 -0
- package/.agents/skills/ratatoskr-a2a/SKILL.md +148 -0
- package/.agents/skills/rules-check-drift/SKILL.md +81 -0
- package/.agents/skills/saga-bearings/README.md +3 -0
- package/.agents/skills/saga-bearings/SKILL.md +26 -0
- package/.agents/skills/saga-bearings/assets/bearings.md +161 -0
- package/.agents/skills/saga-bearings/assets/board-template.html +731 -0
- package/.agents/skills/saga-bearings/assets/recap.md +56 -0
- package/.agents/skills/syn-recovery/README.md +3 -0
- package/.agents/skills/syn-recovery/SKILL.md +54 -0
- package/.agents/skills/tyr-check/README.md +3 -0
- package/.agents/skills/tyr-check/SKILL.md +218 -0
- package/.agents/skills/urdh-hold/README.md +3 -0
- package/.agents/skills/urdh-hold/SKILL.md +25 -0
- package/.agents/skills/urdh-hold/assets/decisions.md +15 -0
- package/.agents/skills/urdh-hold/assets/hold.md +54 -0
- package/.agents/skills/vor-diagnostics/README.md +3 -0
- package/.agents/skills/vor-diagnostics/SKILL.md +68 -0
- package/.agents/skills/ymir-host/README.md +3 -0
- package/.agents/skills/ymir-host/SKILL.md +34 -0
- package/.agents/skills/ymir-host/assets/desktop.md +36 -0
- package/.agents/skills/ymir-host/assets/omarchy.md +297 -0
- package/.agents/skills/ymir-host/assets/runbooks.md +15 -0
- package/.agents/skills/ymir-host/assets/thjazi.md +220 -0
- package/.agents/skills/ymir-host/assets/update.md +64 -0
- package/.agents/tests/assets/board-render-harness.mjs +117 -0
- package/.agents/tests/cmux-test-safety.sh +51 -0
- package/.agents/tests/fixtures.sh +291 -0
- package/.agents/tests/fm-afk-inject-e2e.test.sh +428 -0
- package/.agents/tests/fm-afk-inject-herdr-e2e.test.sh +536 -0
- package/.agents/tests/fm-afk-launch.test.sh +961 -0
- package/.agents/tests/fm-afk-pi-herdr-return-e2e.test.sh +297 -0
- package/.agents/tests/fm-afk-return.test.sh +283 -0
- package/.agents/tests/fm-arm-pretool-check.test.sh +482 -0
- package/.agents/tests/fm-ask-user-authority.test.sh +42 -0
- package/.agents/tests/fm-backend-autodetect-smoke.test.sh +176 -0
- package/.agents/tests/fm-backend-cmux-smoke.test.sh +188 -0
- package/.agents/tests/fm-backend-cmux.test.sh +1166 -0
- package/.agents/tests/fm-backend-herdr-eventwait-smoke.test.sh +136 -0
- package/.agents/tests/fm-backend-herdr-eventwait.test.py +106 -0
- package/.agents/tests/fm-backend-herdr-focus-flash-e2e.test.sh +409 -0
- package/.agents/tests/fm-backend-herdr-launcher-workspace-e2e.test.sh +437 -0
- package/.agents/tests/fm-backend-herdr-presentation-e2e.test.sh +1424 -0
- package/.agents/tests/fm-backend-herdr-prune-safety-e2e.test.sh +180 -0
- package/.agents/tests/fm-backend-herdr-respawn-idem-e2e.test.sh +182 -0
- package/.agents/tests/fm-backend-herdr-smoke.test.sh +355 -0
- package/.agents/tests/fm-backend-herdr-workspace-per-home-e2e.test.sh +251 -0
- package/.agents/tests/fm-backend-herdr.test.sh +4606 -0
- package/.agents/tests/fm-backend-orca.test.sh +1357 -0
- package/.agents/tests/fm-backend-tmux-smoke.test.sh +173 -0
- package/.agents/tests/fm-backend-zellij-smoke.test.sh +205 -0
- package/.agents/tests/fm-backend-zellij.test.sh +1360 -0
- package/.agents/tests/fm-backend.test.sh +1142 -0
- package/.agents/tests/fm-backlog-atomicity.test.sh +2302 -0
- package/.agents/tests/fm-backlog-handoff.test.sh +1360 -0
- package/.agents/tests/fm-bearings-board-render.test.sh +135 -0
- package/.agents/tests/fm-bearings-board.test.sh +414 -0
- package/.agents/tests/fm-bearings-snapshot.test.sh +1990 -0
- package/.agents/tests/fm-bootstrap-network-parallel.test.sh +316 -0
- package/.agents/tests/fm-bootstrap.test.sh +1178 -0
- package/.agents/tests/fm-branch-supervision.test.sh +552 -0
- package/.agents/tests/fm-brief.test.sh +785 -0
- package/.agents/tests/fm-busy-adapter-wiring.test.sh +324 -0
- package/.agents/tests/fm-busy-state.test.sh +465 -0
- package/.agents/tests/fm-calm-pi-extension.test.sh +3979 -0
- package/.agents/tests/fm-captain-hold-lifecycle.test.sh +1187 -0
- package/.agents/tests/fm-cd-pretool-check.test.sh +400 -0
- package/.agents/tests/fm-check-unregister.test.sh +198 -0
- package/.agents/tests/fm-classify-corr-token.test.sh +543 -0
- package/.agents/tests/fm-classify-decision-key.test.sh +340 -0
- package/.agents/tests/fm-claude-stop-autoarm-live-e2e.test.sh +164 -0
- package/.agents/tests/fm-claude-stop-autoarm.test.sh +1190 -0
- package/.agents/tests/fm-cmux-claude-composer-live-e2e.test.sh +110 -0
- package/.agents/tests/fm-codex-continuity-live-e2e.test.sh +55 -0
- package/.agents/tests/fm-composer-ghost.test.sh +716 -0
- package/.agents/tests/fm-composer-lib.test.sh +666 -0
- package/.agents/tests/fm-composer-matrix-live-e2e.test.sh +220 -0
- package/.agents/tests/fm-control-herdr-smoke.test.sh +149 -0
- package/.agents/tests/fm-control-relaunch.test.sh +1530 -0
- package/.agents/tests/fm-control.test.sh +910 -0
- package/.agents/tests/fm-crew-state.test.sh +1610 -0
- package/.agents/tests/fm-cursor-harness.test.sh +404 -0
- package/.agents/tests/fm-cursor-primary-live-e2e.test.sh +217 -0
- package/.agents/tests/fm-cursor-primary.test.sh +708 -0
- package/.agents/tests/fm-daemon.test.sh +2740 -0
- package/.agents/tests/fm-documentation-audiences.test.sh +141 -0
- package/.agents/tests/fm-ensure-agents-md.test.sh +371 -0
- package/.agents/tests/fm-extension-binding.test.sh +2187 -0
- package/.agents/tests/fm-fleet-snapshot-view.test.sh +816 -0
- package/.agents/tests/fm-fleet-sync.test.sh +721 -0
- package/.agents/tests/fm-gate-refuse.test.sh +356 -0
- package/.agents/tests/fm-gitignore-config.test.sh +89 -0
- package/.agents/tests/fm-gotmp.test.sh +230 -0
- package/.agents/tests/fm-grok-continuity-live-e2e.test.sh +112 -0
- package/.agents/tests/fm-grok-harness.test.sh +117 -0
- package/.agents/tests/fm-grok-stop-live-e2e.test.sh +219 -0
- package/.agents/tests/fm-guard-stale-banner.test.sh +709 -0
- package/.agents/tests/fm-harness-adapter-instructions-live-e2e.test.sh +134 -0
- package/.agents/tests/fm-harness-adapter-references.test.sh +30 -0
- package/.agents/tests/fm-harness-liveness-drift-live-e2e.test.sh +151 -0
- package/.agents/tests/fm-herdr-lab.test.sh +243 -0
- package/.agents/tests/fm-herdr-session-cleanup-e2e.test.sh +146 -0
- package/.agents/tests/fm-herdr-session-cleanup.test.sh +329 -0
- package/.agents/tests/fm-herdr-submit-confirm-live-e2e.test.sh +125 -0
- package/.agents/tests/fm-herdr-version-floor-live-e2e.test.sh +144 -0
- package/.agents/tests/fm-home-summary-refresh.test.sh +971 -0
- package/.agents/tests/fm-inactive-reconcile.test.sh +485 -0
- package/.agents/tests/fm-kimi-harness.test.sh +687 -0
- package/.agents/tests/fm-lint-workflows.test.sh +532 -0
- package/.agents/tests/fm-lint.test.sh +1023 -0
- package/.agents/tests/fm-muse-harness.test.sh +932 -0
- package/.agents/tests/fm-muse-signals-live-e2e.test.sh +205 -0
- package/.agents/tests/fm-no-mistakes-required.test.sh +72 -0
- package/.agents/tests/fm-on.test.sh +507 -0
- package/.agents/tests/fm-opencode-primary-live-e2e.test.sh +357 -0
- package/.agents/tests/fm-operational-input.test.sh +160 -0
- package/.agents/tests/fm-peek-remote.test.sh +110 -0
- package/.agents/tests/fm-pending-reply.test.sh +1288 -0
- package/.agents/tests/fm-pi-branch-extension.test.sh +3182 -0
- package/.agents/tests/fm-pi-branch-live-e2e.test.sh +527 -0
- package/.agents/tests/fm-pi-primary-live-e2e.test.sh +345 -0
- package/.agents/tests/fm-pi-primary-types.test.sh +68 -0
- package/.agents/tests/fm-pi-watch-extension.test.sh +2843 -0
- package/.agents/tests/fm-pr-check-security.test.sh +2140 -0
- package/.agents/tests/fm-pr-merge.test.sh +2135 -0
- package/.agents/tests/fm-procevent-quota.test.sh +225 -0
- package/.agents/tests/fm-procevent-when.test.sh +406 -0
- package/.agents/tests/fm-procevent.test.sh +1745 -0
- package/.agents/tests/fm-project-origin.test.sh +110 -0
- package/.agents/tests/fm-public-followup.test.sh +2272 -0
- package/.agents/tests/fm-quota-array-dispatch-live-e2e.test.sh +526 -0
- package/.agents/tests/fm-quota-choose.test.sh +626 -0
- package/.agents/tests/fm-remote-backlog-handoff.test.sh +453 -0
- package/.agents/tests/fm-remote-doctor.test.sh +625 -0
- package/.agents/tests/fm-remote-entrypoint.test.sh +59 -0
- package/.agents/tests/fm-remote-job-orphan-reap.test.sh +205 -0
- package/.agents/tests/fm-remote-job.test.sh +768 -0
- package/.agents/tests/fm-remote-reply.test.sh +520 -0
- package/.agents/tests/fm-remote-secondmate-lifecycle-e2e.test.sh +1256 -0
- package/.agents/tests/fm-remote-secondmate-parent-binding.test.sh +326 -0
- package/.agents/tests/fm-remote-secondmate-trace-context.test.sh +310 -0
- package/.agents/tests/fm-remote-transport-lanes.test.sh +431 -0
- package/.agents/tests/fm-review-diff.test.sh +176 -0
- package/.agents/tests/fm-secondmate-harness.test.sh +2600 -0
- package/.agents/tests/fm-secondmate-lifecycle-e2e.test.sh +259 -0
- package/.agents/tests/fm-secondmate-liveness.test.sh +559 -0
- package/.agents/tests/fm-secondmate-reconcile.test.sh +732 -0
- package/.agents/tests/fm-secondmate-safety.test.sh +2972 -0
- package/.agents/tests/fm-secondmate-sync.test.sh +913 -0
- package/.agents/tests/fm-send-inbox-doorbell-live-e2e.test.sh +206 -0
- package/.agents/tests/fm-send-inbox.test.sh +352 -0
- package/.agents/tests/fm-send-popup-settle.test.sh +167 -0
- package/.agents/tests/fm-send-remote-delivery.test.sh +796 -0
- package/.agents/tests/fm-send-resolve-key.test.sh +551 -0
- package/.agents/tests/fm-send-secondmate-marker-herdr-e2e.test.sh +187 -0
- package/.agents/tests/fm-send-secondmate-marker.test.sh +278 -0
- package/.agents/tests/fm-send-settle.test.sh +147 -0
- package/.agents/tests/fm-send-strict.test.sh +241 -0
- package/.agents/tests/fm-session-lock-ancestry.test.sh +365 -0
- package/.agents/tests/fm-session-start.test.sh +2515 -0
- package/.agents/tests/fm-sessionstart-hook-live-e2e.test.sh +631 -0
- package/.agents/tests/fm-sessionstart-instruction-refresh-live-e2e.test.sh +230 -0
- package/.agents/tests/fm-sessionstart-nudge.test.sh +1039 -0
- package/.agents/tests/fm-shared-captain-inheritance.test.sh +404 -0
- package/.agents/tests/fm-spawn-batch.test.sh +148 -0
- package/.agents/tests/fm-spawn-dispatch-profile.test.sh +827 -0
- package/.agents/tests/fm-spawn-pool-base-freshen.test.sh +440 -0
- package/.agents/tests/fm-spawn-worktree-settle.test.sh +147 -0
- package/.agents/tests/fm-startup-memory-budget.test.sh +333 -0
- package/.agents/tests/fm-startup-network.test.sh +712 -0
- package/.agents/tests/fm-stow-cascade.test.sh +370 -0
- package/.agents/tests/fm-subagent-pretool-check.test.sh +291 -0
- package/.agents/tests/fm-supervision-events.test.sh +156 -0
- package/.agents/tests/fm-supervision-instructions.test.sh +189 -0
- package/.agents/tests/fm-tangle-guard.test.sh +277 -0
- package/.agents/tests/fm-task-delivery.test.sh +420 -0
- package/.agents/tests/fm-task-inbox.test.sh +513 -0
- package/.agents/tests/fm-teardown-endpoint-safety.test.sh +374 -0
- package/.agents/tests/fm-teardown.test.sh +2665 -0
- package/.agents/tests/fm-test-fixture-cleanup.test.sh +172 -0
- package/.agents/tests/fm-test-fixtures.test.sh +132 -0
- package/.agents/tests/fm-test-isolation-proof.test.sh +278 -0
- package/.agents/tests/fm-test-run.test.sh +1196 -0
- package/.agents/tests/fm-tmux-agent-liveness.test.sh +354 -0
- package/.agents/tests/fm-tmux-submit-busy.test.sh +340 -0
- package/.agents/tests/fm-tool-update-check.test.sh +1044 -0
- package/.agents/tests/fm-trace-context-lib.test.sh +253 -0
- package/.agents/tests/fm-trace-context-spawn.test.sh +581 -0
- package/.agents/tests/fm-transition-lib.test.sh +54 -0
- package/.agents/tests/fm-turnend-guard.test.sh +1822 -0
- package/.agents/tests/fm-update.test.sh +304 -0
- package/.agents/tests/fm-vendor-auth-probe.test.sh +395 -0
- package/.agents/tests/fm-voice-relay.test.sh +4741 -0
- package/.agents/tests/fm-wake-daemon-lifecycle-e2e.test.sh +171 -0
- package/.agents/tests/fm-wake-drain-open-decisions-cursor.test.sh +356 -0
- package/.agents/tests/fm-wake-drain-open-decisions.test.sh +226 -0
- package/.agents/tests/fm-wake-drain-unread-status.test.sh +379 -0
- package/.agents/tests/fm-wake-queue.test.sh +1224 -0
- package/.agents/tests/fm-watch-arm.test.sh +821 -0
- package/.agents/tests/fm-watch-checkpoint.test.sh +87 -0
- package/.agents/tests/fm-watch-recovery-loop.test.sh +223 -0
- package/.agents/tests/fm-watch-triage.test.sh +3889 -0
- package/.agents/tests/fm-watcher-lock.test.sh +1133 -0
- package/.agents/tests/fm-x-mode.test.sh +3042 -0
- package/.agents/tests/gleipnir-guard-pretool-check.test.sh +51 -0
- package/.agents/tests/gleipnir-machine-lock.test.sh +130 -0
- package/.agents/tests/herdr-test-safety.sh +42 -0
- package/.agents/tests/lib.sh +315 -0
- package/.agents/tests/remote-herdr-fixture.sh +125 -0
- package/.agents/tests/secondmate-helpers.sh +193 -0
- package/.agents/tests/smoke.test.sh +93 -0
- package/.agents/tests/wake-helpers.sh +338 -0
- package/.agents/tests/zellij-test-safety.sh +60 -0
- package/.agents/tools/README.md +10 -0
- package/.agents/tools/bin/tasks-cli +267 -0
- package/.agents/tools/tasks-cli.ts +216 -0
- package/AGENTS.md +454 -0
- package/CHANGELOG.md +881 -0
- package/LICENSE +1 -1
- package/NOTICE +63 -0
- package/README.md +113 -39
- package/RULES/01-domains.md +51 -0
- package/RULES/02-agents.md +78 -0
- package/RULES/03-houses.md +61 -0
- package/RULES/04-hoard.md +65 -0
- package/RULES/05-platforms.md +67 -0
- package/RULES/06-append-only.md +58 -0
- package/RULES/07-config.md +45 -0
- package/RULES/08-delivery-gate.md +75 -0
- package/RULES/README.md +20 -0
- package/bin/README.md +107 -0
- package/bin/a2a-mcp.sh +98 -0
- package/bin/a2a-serve.py +103 -0
- package/bin/a2a-serve.sh +8 -0
- package/bin/a2a-talk.sh +50 -0
- package/bin/a2abridge-ensure.sh +108 -0
- package/bin/agent-run.sh +43 -0
- package/bin/agents-config.sh +233 -0
- package/bin/apodex-smoke-test.sh +92 -0
- package/bin/bifrost-bridge.sh +112 -0
- package/bin/bifrost-ingress.sh +77 -0
- package/bin/bootstrap-macos.sh +107 -0
- package/bin/bootstrap-windows.ps1 +112 -0
- package/bin/branch-guard.sh +64 -0
- package/bin/brokk +73 -0
- package/bin/brokk-classify-lib.sh +1770 -0
- package/bin/brokk-lease-lib.sh +222 -0
- package/bin/brokk-lease.sh +193 -0
- package/bin/brokk-lint.sh +65 -0
- package/bin/brokk-send.sh +38 -0
- package/bin/brokk-update.sh +9 -0
- package/bin/brokk-wake-grant.sh +127 -0
- package/bin/brokk-wake-lib.sh +1849 -0
- package/bin/changelog-guard.sh +165 -0
- package/bin/crash-sense.sh +160 -0
- package/bin/desktop-place.sh +224 -0
- package/bin/docs-guard.sh +39 -0
- package/bin/editor-place.sh +207 -0
- package/bin/eindri-acclaim.sh +34 -0
- package/bin/eindri-control.sh +28 -0
- package/bin/eindri-role.sh +83 -0
- package/bin/eindri-seen.sh +41 -0
- package/bin/eindri-send.sh +15 -0
- package/bin/eindri-start.sh +85 -0
- package/bin/eindri-watch.sh +57 -0
- package/bin/einherjar-spawn.sh +576 -0
- package/bin/eir-doctor.sh +112 -0
- package/bin/erindi-brief.sh +271 -0
- package/bin/fleet-apply.sh +68 -0
- package/bin/github-deploy.sh +81 -0
- package/bin/gjallarhorn-expose.sh +102 -0
- package/bin/gjallarhorn-notify.sh +58 -0
- package/bin/gjallarhorn-purge.sh +54 -0
- package/bin/gjallarhorn-tunnel.sh +72 -0
- package/bin/gleipnir-lock-lib.sh +284 -0
- package/bin/groa-update.sh +122 -0
- package/bin/hall-snapshot.sh +92 -0
- package/bin/hamr-harness.sh +246 -0
- package/bin/heimdall-ssh-keys.sh +374 -0
- package/bin/herdr-agents.py +44 -0
- package/bin/herdr-ensure.sh +104 -0
- package/bin/herdr-run.sh +431 -0
- package/bin/hermes-ensure.sh +88 -0
- package/bin/hoard-lib.sh +25 -0
- package/bin/hodd.sh +78 -0
- package/bin/host-sense.sh +199 -0
- package/bin/huginn-research-worker.sh +108 -0
- package/bin/local-model-lock.sh +51 -0
- package/bin/mimir-bridge.py +226 -0
- package/bin/mimir-bridge.sh +87 -0
- package/bin/mimir-ingest.sh +131 -0
- package/bin/mimir.sh +113 -0
- package/bin/mjollnir-webhook.sh +59 -0
- package/bin/mjollnir.sh +85 -0
- package/bin/model-hardware.sh +82 -0
- package/bin/model-resolve.sh +147 -0
- package/bin/models-detect.sh +178 -0
- package/bin/nornir-cron-start.sh +162 -0
- package/bin/nornir-job-daily-briefing.sh +191 -0
- package/bin/nornir-job-git-sync.sh +152 -0
- package/bin/nornir-job-memory-housekeeping.sh +114 -0
- package/bin/nornir-job-observer.sh +166 -0
- package/bin/nornir-job-skillopt-sleep.sh +76 -0
- package/bin/omarchy-hook-install.sh +60 -0
- package/bin/omarchy-install.sh +148 -0
- package/bin/omarchy-plugins.sh +174 -0
- package/bin/omarchy-sense.sh +149 -0
- package/bin/perm-guard.sh +30 -0
- package/bin/pi-agent.sh +68 -0
- package/bin/pi-ensure.sh +77 -0
- package/bin/pi-local.sh +37 -0
- package/bin/pi-seat.sh +63 -0
- package/bin/prereq-ensure.sh +166 -0
- package/bin/private-guard.sh +38 -0
- package/bin/project-git.sh +55 -0
- package/bin/public-guard.sh +70 -0
- package/bin/ratatoskr.sh +49 -0
- package/bin/realm-lib.sh +32 -0
- package/bin/repo-scrub.sh +62 -0
- package/bin/rodd-operational-input.sh +250 -0
- package/bin/runes-append.sh +198 -0
- package/bin/saga-session-start.sh +172 -0
- package/bin/saga-sessionstart-run.sh +79 -0
- package/bin/saga-wake-drain.sh +41 -0
- package/bin/secret-guard.sh +63 -0
- package/bin/sessrumnir-ensure.sh +100 -0
- package/bin/sessrumnir-sync.sh +237 -0
- package/bin/sessrumnir.sh +91 -0
- package/bin/skillopt-setup.sh +76 -0
- package/bin/skuld-branch-outcome.sh +203 -0
- package/bin/skuld-branch-prompt.sh +101 -0
- package/bin/smidja-bootstrap.sh +90 -0
- package/bin/smidja-observe.sh +86 -0
- package/bin/syn-arm-pretool-check.sh +57 -0
- package/bin/syn-asset-pretool-check.sh +76 -0
- package/bin/syn-cd-pretool-check.sh +28 -0
- package/bin/syn-guard-pretool-check.sh +83 -0
- package/bin/syn-turnend-guard.sh +36 -0
- package/bin/syn-watch-arm.sh +99 -0
- package/bin/tailscale-sync.sh +190 -0
- package/bin/telegram-bot.sh +69 -0
- package/bin/toolchain.sh +74 -0
- package/bin/utgard.sh +111 -0
- package/bin/valhalla.sh +115 -0
- package/bin/valknut-load.sh +260 -0
- package/bin/vor-crew-state.sh +124 -0
- package/bin/wedge-notify.sh +47 -0
- package/bin/workspace-provision.sh +80 -0
- package/bin/workspace-rag.sh +150 -0
- package/bin/wyrd-db.sh +47 -0
- package/bin/yggdrasil.sh +152 -0
- package/bin/ymir-edit.sh +145 -0
- package/bin/ymir-install.sh +641 -0
- package/bin/ymir-invite.sh +93 -0
- package/bin/ymir-isolation.sh +88 -0
- package/bin/ymir-migrate.sh +61 -0
- package/bin/ymir-platform.sh +348 -0
- package/bin/ymir-say.sh +97 -0
- package/bin/ymir-setup-auth.sh +108 -0
- package/bin/ymir-validate.sh +173 -0
- package/bin/ymir.js +74 -16
- package/docs/Architecture.md +339 -0
- package/docs/design.md +351 -0
- package/docs/installations/README.md +63 -0
- package/docs/installations/ymir-home.md +93 -0
- package/docs/integration.md +105 -0
- package/docs/lore.md +1056 -0
- package/docs/research/agent-harnesses.md +290 -0
- package/docs/runbooks/README.md +19 -0
- package/docs/runbooks/a2a.md +91 -0
- package/docs/runbooks/agent-permissions.md +99 -0
- package/docs/runbooks/agents.md +57 -0
- package/docs/runbooks/models.md +69 -0
- package/docs/runbooks/realm-onboarding.md +60 -0
- package/docs/runbooks/secrets-and-hoard.md +60 -0
- package/docs/runbooks/updates-and-migrations.md +110 -0
- package/docs/runbooks/worktrees-isolation.md +72 -0
- package/docs/session-start.md +105 -0
- package/docs/skillopt-integration.md +321 -0
- package/docs/sync-system.md +66 -0
- package/docs/workspaces.md +104 -0
- package/docs/ymir-rut.md +260 -0
- package/package.json +44 -14
- package/packaging/build.sh +74 -0
- package/packaging/macos/Ymir Installer.command +43 -0
- package/packaging/windows/ymir-setup.nsi +74 -0
- package/scripts/README.md +22 -0
- package/scripts/electron.sh +210 -0
- package/scripts/start.sh +167 -0
- package/scripts/stop.sh +113 -0
- package/install.sh +0 -35
|
@@ -0,0 +1,527 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Opt-in live guard for the Pi supervision-branch extension against the REAL
|
|
3
|
+
# installed @earendil-works/pi-coding-agent SDK (no stubs): the branch session
|
|
4
|
+
# is created through the real DefaultResourceLoader/SessionManager/
|
|
5
|
+
# createAgentSession surface, the custom bash and fm_branch_report tool
|
|
6
|
+
# definitions must be accepted by the real tool registry, the session file and
|
|
7
|
+
# pointer must persist on disk, and - because the isolated agent dir carries no
|
|
8
|
+
# credentials and no models - the branch's first prompt must fail fast and
|
|
9
|
+
# prove the never-lose-a-wake fallback to main against the real SDK. It also
|
|
10
|
+
# resolves the supervision-branch model pin through the branch's REAL
|
|
11
|
+
# ModelRuntime, so a pin the vendor cannot resolve is proven to refuse the
|
|
12
|
+
# build rather than silently running the branch on main's model. A second
|
|
13
|
+
# probe pins the vendor contract that pin rests on: an explicit model must beat
|
|
14
|
+
# the model a reopened session recorded, proven against a local,
|
|
15
|
+
# never-contacted fake provider. A third probe does the same for the
|
|
16
|
+
# supervision-branch effort pin: Pi's own supported-level list is what the
|
|
17
|
+
# picker offers, Pi's own clamp is what lowers a level a model cannot run, and
|
|
18
|
+
# an explicit thinking level must beat the level a reopened session recorded.
|
|
19
|
+
#
|
|
20
|
+
# No provider call leaves the machine. The branch probe points
|
|
21
|
+
# PI_CODING_AGENT_DIR at an empty directory, so it reads no credentials and
|
|
22
|
+
# model resolution stays empty by construction. The precedence probe reads
|
|
23
|
+
# only a local placeholder key for its never-contacted fake provider. Run after
|
|
24
|
+
# every Pi upgrade and before trusting refreshed per-harness evidence
|
|
25
|
+
# (docs/verification/runtime-backends.md).
|
|
26
|
+
set -u
|
|
27
|
+
|
|
28
|
+
if [ "${FM_PI_BRANCH_LIVE_E2E:-0}" != 1 ]; then
|
|
29
|
+
echo "skip: set FM_PI_BRANCH_LIVE_E2E=1 to run the real-SDK Pi branch regression"
|
|
30
|
+
exit 0
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
# shellcheck source=tests/lib.sh
|
|
34
|
+
. "$(dirname "${BASH_SOURCE[0]}")/lib.sh"
|
|
35
|
+
export NODE_NO_WARNINGS=1
|
|
36
|
+
|
|
37
|
+
PI_PACKAGE_DIR=${FM_PI_PACKAGE_DIR:-"$(npm root -g)/@earendil-works/pi-coding-agent"}
|
|
38
|
+
if [ ! -f "$PI_PACKAGE_DIR/package.json" ]; then
|
|
39
|
+
fail "Pi package absent: the live branch guard needs @earendil-works/pi-coding-agent installed (FM_PI_PACKAGE_DIR to override)"
|
|
40
|
+
fi
|
|
41
|
+
PI_VERSION=$(jq -r '.version' "$PI_PACKAGE_DIR/package.json" 2>/dev/null || printf 'unknown')
|
|
42
|
+
|
|
43
|
+
TMP_ROOT=$(fm_test_tmproot fm-pi-branch-live)
|
|
44
|
+
repo="$TMP_ROOT/repo"
|
|
45
|
+
home="$TMP_ROOT/home"
|
|
46
|
+
agentdir="$TMP_ROOT/agent-dir"
|
|
47
|
+
mkdir -p "$repo/.pi/extensions/lib" "$repo/node_modules/@earendil-works" \
|
|
48
|
+
"$home/state" "$home/config" "$agentdir"
|
|
49
|
+
cp "$ROOT/.pi/extensions/fm-branch-supervision.ts" "$repo/.pi/extensions/fm-branch-supervision.ts"
|
|
50
|
+
cp "$ROOT/.pi/extensions/lib/fm-branch-dispatch.ts" "$repo/.pi/extensions/lib/fm-branch-dispatch.ts"
|
|
51
|
+
cp "$ROOT/.pi/extensions/lib/fm-branch-model-picker.ts" "$repo/.pi/extensions/lib/fm-branch-model-picker.ts"
|
|
52
|
+
cp "$ROOT/.pi/extensions/lib/fm-calm-visibility.ts" "$repo/.pi/extensions/lib/fm-calm-visibility.ts"
|
|
53
|
+
cp "$ROOT/.pi/extensions/lib/fm-operational-input.ts" "$repo/.pi/extensions/lib/fm-operational-input.ts"
|
|
54
|
+
mkdir -p "$repo/bin"
|
|
55
|
+
cp "$ROOT/bin/fm-operational-input.sh" "$repo/bin/fm-operational-input.sh"
|
|
56
|
+
chmod +x "$repo/bin/fm-operational-input.sh"
|
|
57
|
+
ln -s "$PI_PACKAGE_DIR" "$repo/node_modules/@earendil-works/pi-coding-agent"
|
|
58
|
+
ln -s "$PI_PACKAGE_DIR/node_modules/@earendil-works/pi-tui" "$repo/node_modules/@earendil-works/pi-tui"
|
|
59
|
+
ln -s "$PI_PACKAGE_DIR/node_modules/@earendil-works/pi-ai" "$repo/node_modules/@earendil-works/pi-ai"
|
|
60
|
+
ln -s "$PI_PACKAGE_DIR/node_modules/typebox" "$repo/node_modules/typebox"
|
|
61
|
+
|
|
62
|
+
# Stock macOS Bash 3.2 cannot reliably parse JavaScript template literals in a
|
|
63
|
+
# heredoc nested inside command substitution, so capture through a file.
|
|
64
|
+
PLUGIN="$repo/.pi/extensions/fm-branch-supervision.ts" FM_HOME="$home" FM_ROOT_OVERRIDE="$ROOT" \
|
|
65
|
+
PI_CODING_AGENT_DIR="$agentdir" PI_PACKAGE_DIR="$PI_PACKAGE_DIR" node --input-type=module > "$TMP_ROOT/node-output" 2>&1 <<'EOF'
|
|
66
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
67
|
+
import { resolve } from "node:path";
|
|
68
|
+
import { pathToFileURL } from "node:url";
|
|
69
|
+
|
|
70
|
+
const home = resolve(process.env.FM_HOME);
|
|
71
|
+
// Supervision is default-on: the live guard exercises the branch with no
|
|
72
|
+
// captain grant file present at all.
|
|
73
|
+
const approvedProject = `${home}/projects/live-probe`;
|
|
74
|
+
mkdirSync(approvedProject, { recursive: true });
|
|
75
|
+
writeFileSync(`${home}/state/live-probe.meta`, `project=${approvedProject}\nwindow=fm-live-probe\n`);
|
|
76
|
+
writeFileSync(`${home}/state/.wake-queue`, "1\t1\tsignal\tlive-probe.status\tsignal: live-sdk probe\n");
|
|
77
|
+
const busHandlers = new Map();
|
|
78
|
+
const bus = {
|
|
79
|
+
on(channel, handler) {
|
|
80
|
+
busHandlers.set(channel, [...(busHandlers.get(channel) ?? []), handler]);
|
|
81
|
+
return () => {};
|
|
82
|
+
},
|
|
83
|
+
emit(channel, data) {
|
|
84
|
+
for (const handler of busHandlers.get(channel) ?? []) handler(data);
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
const mainUserMessages = [];
|
|
88
|
+
const piHandlers = new Map();
|
|
89
|
+
const pi = {
|
|
90
|
+
events: bus,
|
|
91
|
+
on(event, handler) {
|
|
92
|
+
piHandlers.set(event, [...(piHandlers.get(event) ?? []), handler]);
|
|
93
|
+
},
|
|
94
|
+
registerTool() {},
|
|
95
|
+
registerCommand() {},
|
|
96
|
+
registerMessageRenderer() {},
|
|
97
|
+
sendMessage() {},
|
|
98
|
+
sendUserMessage(content, options) {
|
|
99
|
+
mainUserMessages.push({ content, options: options ?? {} });
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
const mod = await import(pathToFileURL(process.env.PLUGIN).href);
|
|
103
|
+
mod.default(pi);
|
|
104
|
+
// The real model surface, built from the same empty agent dir: no
|
|
105
|
+
// credentials are read and no catalog is fetched, so every model lookup is
|
|
106
|
+
// genuinely empty by construction.
|
|
107
|
+
const { ModelRegistry, ModelRuntime } = await import(
|
|
108
|
+
pathToFileURL(`${process.env.PI_PACKAGE_DIR}/dist/index.js`).href
|
|
109
|
+
);
|
|
110
|
+
const modelRegistry = new ModelRegistry(
|
|
111
|
+
await ModelRuntime.create({
|
|
112
|
+
authPath: `${process.env.PI_CODING_AGENT_DIR}/auth.json`,
|
|
113
|
+
modelsPath: `${process.env.PI_CODING_AGENT_DIR}/models.json`,
|
|
114
|
+
}),
|
|
115
|
+
);
|
|
116
|
+
if (typeof modelRegistry.getAvailable !== "function" || typeof modelRegistry.hasConfiguredAuth !== "function") {
|
|
117
|
+
throw new Error("the real ModelRegistry no longer exposes the model surface the supervision picker reads");
|
|
118
|
+
}
|
|
119
|
+
const sessionCtx = {
|
|
120
|
+
sessionManager: { getSessionFile: () => `${home}/main.jsonl`, getEntries: () => [] },
|
|
121
|
+
modelRegistry,
|
|
122
|
+
};
|
|
123
|
+
for (const handler of piHandlers.get("session_start") ?? []) await handler({}, sessionCtx);
|
|
124
|
+
if (existsSync(`${home}/state/.pi-branch-extension-loaded`)) {
|
|
125
|
+
throw new Error("branch activated before the primary session acquired its lock");
|
|
126
|
+
}
|
|
127
|
+
writeFileSync(`${home}/state/.lock`, `${process.pid}\n`);
|
|
128
|
+
|
|
129
|
+
const offer = {
|
|
130
|
+
message: "signal: live-sdk probe",
|
|
131
|
+
projects: [approvedProject],
|
|
132
|
+
heartbeat: false,
|
|
133
|
+
eligible: true,
|
|
134
|
+
accepted: false,
|
|
135
|
+
accept() {
|
|
136
|
+
offer.accepted = true;
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
bus.emit("fm-branch-supervision:dispatch", offer);
|
|
140
|
+
if (!offer.accepted) throw new Error("branch did not accept the wake offer against the real SDK");
|
|
141
|
+
for (let i = 0; i < 600 && mainUserMessages.length === 0; i += 1) {
|
|
142
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
143
|
+
}
|
|
144
|
+
// With an empty agent dir there is no model, so the branch's first prompt
|
|
145
|
+
// must fail fast and return the wake to main - proving both that the real
|
|
146
|
+
// createAgentSession accepted our loader, tools, and custom definitions
|
|
147
|
+
// (construction succeeds) and that the fallback keeps the wake.
|
|
148
|
+
if (mainUserMessages.length !== 1) throw new Error("wake was lost: no fallback reached main");
|
|
149
|
+
const fallback = mainUserMessages[0].content;
|
|
150
|
+
if (!fallback.includes("FIRSTMATE WATCHER WAKE: signal: live-sdk probe")) {
|
|
151
|
+
throw new Error(`fallback lost the wake reason: ${fallback}`);
|
|
152
|
+
}
|
|
153
|
+
if (!fallback.includes("Supervision branch unavailable")) {
|
|
154
|
+
throw new Error(`fallback did not name the branch failure: ${fallback}`);
|
|
155
|
+
}
|
|
156
|
+
if (!existsSync(`${home}/state/.branch-session`)) {
|
|
157
|
+
throw new Error("real SessionManager did not persist the branch session pointer");
|
|
158
|
+
}
|
|
159
|
+
// The real SessionManager writes the session file lazily (on its first
|
|
160
|
+
// persisted entry), so assert the pointer's placement rather than the file:
|
|
161
|
+
// the recorded path must live under this home branch-session store.
|
|
162
|
+
const pointer = readFileSync(`${home}/state/.branch-session`, "utf8").trim();
|
|
163
|
+
if (!pointer.startsWith(`${home}/state/branch-session/`) || !pointer.endsWith(".jsonl")) {
|
|
164
|
+
throw new Error(`recorded branch session pointer is misplaced: ${pointer}`);
|
|
165
|
+
}
|
|
166
|
+
if (!existsSync(`${home}/state/branch-session`)) {
|
|
167
|
+
throw new Error("branch session store directory was not created");
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// A model pin the branch's REAL runtime cannot resolve must refuse the build
|
|
171
|
+
// and return the wake to main naming the pin, rather than silently running the
|
|
172
|
+
// branch on whatever model main would have used.
|
|
173
|
+
writeFileSync(`${home}/config/supervision-branch-model`, "openai/no-such-live-model\n");
|
|
174
|
+
for (const handler of piHandlers.get("session_shutdown") ?? []) await handler({}, sessionCtx);
|
|
175
|
+
for (const handler of piHandlers.get("session_start") ?? []) await handler({}, sessionCtx);
|
|
176
|
+
writeFileSync(`${home}/state/.wake-queue`, "1\t2\tsignal\tlive-probe.status\tsignal: live pin probe\n");
|
|
177
|
+
const pinOffer = {
|
|
178
|
+
message: "signal: live pin probe",
|
|
179
|
+
projects: [approvedProject],
|
|
180
|
+
heartbeat: false,
|
|
181
|
+
eligible: true,
|
|
182
|
+
accepted: false,
|
|
183
|
+
accept() {
|
|
184
|
+
pinOffer.accepted = true;
|
|
185
|
+
},
|
|
186
|
+
};
|
|
187
|
+
bus.emit("fm-branch-supervision:dispatch", pinOffer);
|
|
188
|
+
if (!pinOffer.accepted) throw new Error("branch did not accept the pinned wake offer");
|
|
189
|
+
for (let i = 0; i < 600 && mainUserMessages.length === 1; i += 1) {
|
|
190
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
191
|
+
}
|
|
192
|
+
if (mainUserMessages.length !== 2) throw new Error("pinned wake was lost: no fallback reached main");
|
|
193
|
+
const pinFallback = mainUserMessages[1].content;
|
|
194
|
+
if (!pinFallback.includes("openai/no-such-live-model") || !pinFallback.includes("supervision model pin")) {
|
|
195
|
+
throw new Error(`the real-SDK fallback did not name the unusable pin: ${pinFallback}`);
|
|
196
|
+
}
|
|
197
|
+
console.log("LIVE_OK");
|
|
198
|
+
process.exit(0);
|
|
199
|
+
EOF
|
|
200
|
+
status=$?
|
|
201
|
+
out=$(cat "$TMP_ROOT/node-output")
|
|
202
|
+
if [ "$status" -ne 0 ] || [ "$out" != "LIVE_OK" ]; then
|
|
203
|
+
fail "real-SDK Pi branch guard failed against pi-coding-agent $PI_VERSION: $out"
|
|
204
|
+
fi
|
|
205
|
+
pass "real Pi SDK $PI_VERSION accepts the branch session construction and preserves an unpromptable wake"
|
|
206
|
+
|
|
207
|
+
# Second probe: the vendor contract the supervision-branch model pin rests on.
|
|
208
|
+
# An explicit model must beat the model a reopened session recorded, or a pin
|
|
209
|
+
# would silently stop applying the first time the branch reopens. Proven with
|
|
210
|
+
# a local, never-contacted fake provider with a placeholder key, so no request
|
|
211
|
+
# leaves the machine and no user credential is read.
|
|
212
|
+
modeldir="$TMP_ROOT/model-agent-dir"
|
|
213
|
+
mkdir -p "$modeldir" "$TMP_ROOT/model-sessions"
|
|
214
|
+
cat > "$modeldir/models.json" <<'JSON'
|
|
215
|
+
{
|
|
216
|
+
"providers": {
|
|
217
|
+
"fm-live-fake": {
|
|
218
|
+
"baseUrl": "http://127.0.0.1:9/v1",
|
|
219
|
+
"api": "openai-completions",
|
|
220
|
+
"apiKey": "fm-live-placeholder",
|
|
221
|
+
"models": [
|
|
222
|
+
{ "id": "fm-live-a", "name": "fm live a", "contextWindow": 8192, "maxTokens": 512 },
|
|
223
|
+
{ "id": "fm-live-b", "name": "fm live b", "contextWindow": 8192, "maxTokens": 512 }
|
|
224
|
+
]
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
JSON
|
|
229
|
+
PI_PACKAGE_DIR="$PI_PACKAGE_DIR" PI_CODING_AGENT_DIR="$modeldir" FM_LIVE_SESSIONS="$TMP_ROOT/model-sessions" \
|
|
230
|
+
node --input-type=module > "$TMP_ROOT/model-output" 2>&1 <<'EOF'
|
|
231
|
+
import { pathToFileURL } from "node:url";
|
|
232
|
+
|
|
233
|
+
const pkg = pathToFileURL(`${process.env.PI_PACKAGE_DIR}/dist/index.js`).href;
|
|
234
|
+
const { ModelRegistry, ModelRuntime, SessionManager, createAgentSession } = await import(pkg);
|
|
235
|
+
const runtime = await ModelRuntime.create({
|
|
236
|
+
authPath: `${process.env.PI_CODING_AGENT_DIR}/auth.json`,
|
|
237
|
+
modelsPath: `${process.env.PI_CODING_AGENT_DIR}/models.json`,
|
|
238
|
+
});
|
|
239
|
+
const registry = new ModelRegistry(runtime);
|
|
240
|
+
await registry.refresh();
|
|
241
|
+
|
|
242
|
+
// The candidates resolve through the same registry calls the picker makes.
|
|
243
|
+
const first = registry.find("fm-live-fake", "fm-live-a");
|
|
244
|
+
const second = registry.find("fm-live-fake", "fm-live-b");
|
|
245
|
+
if (!first || !second) throw new Error("the real registry did not resolve the locally declared models");
|
|
246
|
+
if (!registry.hasConfiguredAuth(first)) throw new Error("hasConfiguredAuth rejected a locally declared model with a key");
|
|
247
|
+
if (!registry.getAvailable().some((model) => model.id === "fm-live-a")) {
|
|
248
|
+
throw new Error("getAvailable no longer lists a model with configured credentials, so the picker would be empty");
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
const cwd = process.cwd();
|
|
252
|
+
const sessions = process.env.FM_LIVE_SESSIONS;
|
|
253
|
+
const creating = SessionManager.create(cwd, sessions);
|
|
254
|
+
const created = await createAgentSession({ cwd, sessionManager: creating, modelRuntime: runtime, model: first, tools: [] });
|
|
255
|
+
if (created.session.model?.id !== "fm-live-a") {
|
|
256
|
+
throw new Error(`a pinned model was not applied on create: ${created.session.model?.id}`);
|
|
257
|
+
}
|
|
258
|
+
const sessionFile = creating.getSessionFile();
|
|
259
|
+
|
|
260
|
+
// Reopen the SAME session with a different pin: the explicit model must win
|
|
261
|
+
// over the one the session recorded.
|
|
262
|
+
const repinned = await createAgentSession({
|
|
263
|
+
cwd,
|
|
264
|
+
sessionManager: SessionManager.open(sessionFile, sessions),
|
|
265
|
+
modelRuntime: runtime,
|
|
266
|
+
model: second,
|
|
267
|
+
tools: [],
|
|
268
|
+
});
|
|
269
|
+
if (repinned.session.model?.id !== "fm-live-b") {
|
|
270
|
+
throw new Error(`a reopened session ignored the pin and kept its recorded model: ${repinned.session.model?.id}`);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// With no pin the reopened session restores its own recorded model, which is
|
|
274
|
+
// the untouched behavior an absent pin must keep.
|
|
275
|
+
const unpinned = await createAgentSession({
|
|
276
|
+
cwd,
|
|
277
|
+
sessionManager: SessionManager.open(sessionFile, sessions),
|
|
278
|
+
modelRuntime: runtime,
|
|
279
|
+
tools: [],
|
|
280
|
+
});
|
|
281
|
+
if (unpinned.session.model?.id !== "fm-live-a") {
|
|
282
|
+
throw new Error(`an unpinned reopen did not restore the session's own model: ${unpinned.session.model?.id}`);
|
|
283
|
+
}
|
|
284
|
+
console.log("MODEL_OK");
|
|
285
|
+
process.exit(0);
|
|
286
|
+
EOF
|
|
287
|
+
status=$?
|
|
288
|
+
out=$(cat "$TMP_ROOT/model-output")
|
|
289
|
+
if [ "$status" -ne 0 ] || [ "$out" != "MODEL_OK" ]; then
|
|
290
|
+
fail "real-SDK model-pin precedence guard failed against pi-coding-agent $PI_VERSION: $out"
|
|
291
|
+
fi
|
|
292
|
+
pass "real Pi SDK $PI_VERSION applies an explicit branch model on create and over a reopened session's recorded model"
|
|
293
|
+
|
|
294
|
+
# Third probe: the vendor contract the supervision-branch EFFORT pin rests on.
|
|
295
|
+
# Same never-contacted local provider, now declaring models with different
|
|
296
|
+
# reasoning ceilings so Pi's own supported-level list and clamp are exercised
|
|
297
|
+
# for real. The recorded-level case needs a session file on disk, and Pi
|
|
298
|
+
# flushes one only once an assistant message exists, so the probe appends both
|
|
299
|
+
# entries through the real SessionManager rather than hand-writing the format.
|
|
300
|
+
effortdir="$TMP_ROOT/effort-agent-dir"
|
|
301
|
+
mkdir -p "$effortdir" "$TMP_ROOT/effort-sessions"
|
|
302
|
+
cat > "$effortdir/models.json" <<'JSON'
|
|
303
|
+
{
|
|
304
|
+
"providers": {
|
|
305
|
+
"fm-live-fake": {
|
|
306
|
+
"baseUrl": "http://127.0.0.1:9/v1",
|
|
307
|
+
"api": "openai-completions",
|
|
308
|
+
"apiKey": "fm-live-placeholder",
|
|
309
|
+
"models": [
|
|
310
|
+
{
|
|
311
|
+
"id": "fm-live-deep",
|
|
312
|
+
"name": "fm live deep",
|
|
313
|
+
"contextWindow": 8192,
|
|
314
|
+
"maxTokens": 512,
|
|
315
|
+
"reasoning": true,
|
|
316
|
+
"thinkingLevelMap": {
|
|
317
|
+
"minimal": "minimal",
|
|
318
|
+
"low": "low",
|
|
319
|
+
"medium": "medium",
|
|
320
|
+
"high": "high",
|
|
321
|
+
"xhigh": "xhigh",
|
|
322
|
+
"max": "max"
|
|
323
|
+
}
|
|
324
|
+
},
|
|
325
|
+
{ "id": "fm-live-shallow", "name": "fm live shallow", "contextWindow": 8192, "maxTokens": 512, "reasoning": true },
|
|
326
|
+
{ "id": "fm-live-plain", "name": "fm live plain", "contextWindow": 8192, "maxTokens": 512 }
|
|
327
|
+
]
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
JSON
|
|
332
|
+
PI_PACKAGE_DIR="$PI_PACKAGE_DIR" PI_CODING_AGENT_DIR="$effortdir" FM_LIVE_SESSIONS="$TMP_ROOT/effort-sessions" \
|
|
333
|
+
node --input-type=module > "$TMP_ROOT/effort-output" 2>&1 <<'EOF'
|
|
334
|
+
import { pathToFileURL } from "node:url";
|
|
335
|
+
|
|
336
|
+
const packageRoot = process.env.PI_PACKAGE_DIR;
|
|
337
|
+
const pkg = pathToFileURL(`${packageRoot}/dist/index.js`).href;
|
|
338
|
+
const { ModelRegistry, ModelRuntime, SessionManager, createAgentSession } = await import(pkg);
|
|
339
|
+
// The same specifier the extension imports; Pi's extension loader aliases it
|
|
340
|
+
// to this package's own bundled copy.
|
|
341
|
+
const { clampThinkingLevel, getSupportedThinkingLevels } = await import(
|
|
342
|
+
pathToFileURL(`${packageRoot}/node_modules/@earendil-works/pi-ai/dist/compat.js`).href
|
|
343
|
+
);
|
|
344
|
+
const runtime = await ModelRuntime.create({
|
|
345
|
+
authPath: `${process.env.PI_CODING_AGENT_DIR}/auth.json`,
|
|
346
|
+
modelsPath: `${process.env.PI_CODING_AGENT_DIR}/models.json`,
|
|
347
|
+
});
|
|
348
|
+
const registry = new ModelRegistry(runtime);
|
|
349
|
+
await registry.refresh();
|
|
350
|
+
|
|
351
|
+
const deep = registry.find("fm-live-fake", "fm-live-deep");
|
|
352
|
+
const shallow = registry.find("fm-live-fake", "fm-live-shallow");
|
|
353
|
+
const plain = registry.find("fm-live-fake", "fm-live-plain");
|
|
354
|
+
if (!deep || !shallow || !plain) throw new Error("the real registry did not resolve the locally declared effort models");
|
|
355
|
+
|
|
356
|
+
// Pi's own vocabulary, and the same list the extension declares for rejecting
|
|
357
|
+
// an unrecognized hand-edited pin. The tracked strict typecheck enforces this
|
|
358
|
+
// from the type side; this is the runtime half, checked after a Pi upgrade.
|
|
359
|
+
const vocabulary = ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
|
|
360
|
+
const deepLevels = getSupportedThinkingLevels(deep);
|
|
361
|
+
if (JSON.stringify(deepLevels) !== JSON.stringify(vocabulary)) {
|
|
362
|
+
throw new Error(`Pi's own effort vocabulary changed: ${JSON.stringify(deepLevels)}`);
|
|
363
|
+
}
|
|
364
|
+
// A reasoning model that maps no extended levels stops below them, and a
|
|
365
|
+
// non-reasoning model offers only "off" - so the picker's menu really does
|
|
366
|
+
// narrow with the model the captain just chose.
|
|
367
|
+
const shallowLevels = getSupportedThinkingLevels(shallow);
|
|
368
|
+
if (shallowLevels.includes("xhigh") || shallowLevels.includes("max") || !shallowLevels.includes("high")) {
|
|
369
|
+
throw new Error(`Pi no longer narrows the level list for an unmapped model: ${JSON.stringify(shallowLevels)}`);
|
|
370
|
+
}
|
|
371
|
+
if (JSON.stringify(getSupportedThinkingLevels(plain)) !== JSON.stringify(["off"])) {
|
|
372
|
+
throw new Error("Pi no longer reports a non-reasoning model as effort-off only");
|
|
373
|
+
}
|
|
374
|
+
if (clampThinkingLevel(shallow, "max") !== "high") {
|
|
375
|
+
throw new Error(`Pi's own clamp no longer lowers an unsupported level: ${clampThinkingLevel(shallow, "max")}`);
|
|
376
|
+
}
|
|
377
|
+
// An unrecognized token collapses to the model's lowest level, which is why
|
|
378
|
+
// the extension rejects one as "no pin" before it can reach this clamp.
|
|
379
|
+
if (clampThinkingLevel(shallow, "fm-not-a-level") !== "off") {
|
|
380
|
+
throw new Error("Pi's clamp no longer collapses an unrecognized token, so the extension's guard needs review");
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
const cwd = process.cwd();
|
|
384
|
+
const sessions = process.env.FM_LIVE_SESSIONS;
|
|
385
|
+
const creating = SessionManager.create(cwd, sessions);
|
|
386
|
+
const created = await createAgentSession({
|
|
387
|
+
cwd,
|
|
388
|
+
sessionManager: creating,
|
|
389
|
+
modelRuntime: runtime,
|
|
390
|
+
model: deep,
|
|
391
|
+
thinkingLevel: "xhigh",
|
|
392
|
+
tools: [],
|
|
393
|
+
});
|
|
394
|
+
if (created.session.thinkingLevel !== "xhigh") {
|
|
395
|
+
throw new Error(`a pinned effort was not applied on create: ${created.session.thinkingLevel}`);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// Record a level in a session file Pi will actually restore from.
|
|
399
|
+
const recording = SessionManager.create(cwd, sessions);
|
|
400
|
+
recording.appendThinkingLevelChange("xhigh");
|
|
401
|
+
recording.appendMessage({
|
|
402
|
+
role: "assistant",
|
|
403
|
+
content: [{ type: "text", text: "recorded" }],
|
|
404
|
+
api: "openai-completions",
|
|
405
|
+
provider: "fm-live-fake",
|
|
406
|
+
model: "fm-live-deep",
|
|
407
|
+
usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } },
|
|
408
|
+
stopReason: "stop",
|
|
409
|
+
});
|
|
410
|
+
const recorded = recording.getSessionFile();
|
|
411
|
+
|
|
412
|
+
// With no override the reopened session restores its own recorded level -
|
|
413
|
+
// which is exactly why an unpinned branch must apply main's effort
|
|
414
|
+
// explicitly instead of merely omitting it.
|
|
415
|
+
const restored = await createAgentSession({
|
|
416
|
+
cwd,
|
|
417
|
+
sessionManager: SessionManager.open(recorded, sessions),
|
|
418
|
+
modelRuntime: runtime,
|
|
419
|
+
model: deep,
|
|
420
|
+
tools: [],
|
|
421
|
+
});
|
|
422
|
+
if (restored.session.thinkingLevel !== "xhigh") {
|
|
423
|
+
throw new Error(`a reopened session no longer restores its recorded effort: ${restored.session.thinkingLevel}`);
|
|
424
|
+
}
|
|
425
|
+
// An explicit level must beat that recorded one, or the pin would silently
|
|
426
|
+
// stop applying the first time the branch reopens.
|
|
427
|
+
const overridden = await createAgentSession({
|
|
428
|
+
cwd,
|
|
429
|
+
sessionManager: SessionManager.open(recorded, sessions),
|
|
430
|
+
modelRuntime: runtime,
|
|
431
|
+
model: deep,
|
|
432
|
+
thinkingLevel: "low",
|
|
433
|
+
tools: [],
|
|
434
|
+
});
|
|
435
|
+
if (overridden.session.thinkingLevel !== "low") {
|
|
436
|
+
throw new Error(`a reopened session ignored the effort override and kept its recorded level: ${overridden.session.thinkingLevel}`);
|
|
437
|
+
}
|
|
438
|
+
// Pi clamps at build time, so a pin above the branch model's ceiling lowers
|
|
439
|
+
// the branch rather than refusing it.
|
|
440
|
+
const clamped = await createAgentSession({
|
|
441
|
+
cwd,
|
|
442
|
+
sessionManager: SessionManager.open(recorded, sessions),
|
|
443
|
+
modelRuntime: runtime,
|
|
444
|
+
model: shallow,
|
|
445
|
+
thinkingLevel: "max",
|
|
446
|
+
tools: [],
|
|
447
|
+
});
|
|
448
|
+
if (clamped.session.thinkingLevel !== "high") {
|
|
449
|
+
throw new Error(`an over-ceiling effort override was not clamped on build: ${clamped.session.thinkingLevel}`);
|
|
450
|
+
}
|
|
451
|
+
console.log("EFFORT_OK");
|
|
452
|
+
process.exit(0);
|
|
453
|
+
EOF
|
|
454
|
+
status=$?
|
|
455
|
+
out=$(cat "$TMP_ROOT/effort-output")
|
|
456
|
+
if [ "$status" -ne 0 ] || [ "$out" != "EFFORT_OK" ]; then
|
|
457
|
+
fail "real-SDK effort-pin guard failed against pi-coding-agent $PI_VERSION: $out"
|
|
458
|
+
fi
|
|
459
|
+
pass "real Pi SDK $PI_VERSION reports its own supported effort levels and applies an explicit branch effort over a reopened session's recorded level"
|
|
460
|
+
|
|
461
|
+
# Fourth probe: the vendor contract the captain-outcome envelope rests on. Pi
|
|
462
|
+
# keeps ONLY `content` when it converts a custom message for the provider, so
|
|
463
|
+
# `content` is the entire payload main's model receives and is the only place a
|
|
464
|
+
# captain outcome can carry its own identity. When it carried none, main could
|
|
465
|
+
# not tell an incoming outcome from its own earlier answer and re-emitted that
|
|
466
|
+
# answer instead of relaying the outcome. This runs the real SDK's own
|
|
467
|
+
# convertToLlm over bytes the REAL protocol encoder produced, then hands the
|
|
468
|
+
# model-visible text back to the real parser, proving the delivery path end to
|
|
469
|
+
# end instead of assuming it.
|
|
470
|
+
captain_payload=$(printf 'relay this\n\ntask-9: PR ready' \
|
|
471
|
+
| "$ROOT/bin/fm-operational-input.sh" encode branch-outcome) \
|
|
472
|
+
|| fail "the operational-input owner does not encode the branch-outcome kind"
|
|
473
|
+
CAPTAIN_PAYLOAD="$captain_payload" ROUTINE_PAYLOAD="⛵ task-9: worker healthy" \
|
|
474
|
+
DELIVERY_DIR="$TMP_ROOT" PI_PACKAGE_DIR="$PI_PACKAGE_DIR" \
|
|
475
|
+
node --input-type=module > "$TMP_ROOT/delivery-output" 2>&1 <<'EOF'
|
|
476
|
+
import { writeFileSync } from "node:fs";
|
|
477
|
+
import { resolve } from "node:path";
|
|
478
|
+
import { pathToFileURL } from "node:url";
|
|
479
|
+
|
|
480
|
+
const pkg = resolve(process.env.PI_PACKAGE_DIR);
|
|
481
|
+
const { convertToLlm } = await import(pathToFileURL(`${pkg}/dist/index.js`).href);
|
|
482
|
+
if (typeof convertToLlm !== "function") {
|
|
483
|
+
throw new Error("this Pi no longer exports convertToLlm: the delivery contract is unproven");
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
const captainContent = process.env.CAPTAIN_PAYLOAD;
|
|
487
|
+
const routineContent = process.env.ROUTINE_PAYLOAD;
|
|
488
|
+
const converted = convertToLlm([
|
|
489
|
+
{ role: "custom", customType: "fm-branch-merge", content: captainContent, display: false, timestamp: 1 },
|
|
490
|
+
{ role: "custom", customType: "fm-branch-merge", content: routineContent, display: true, timestamp: 2 },
|
|
491
|
+
]);
|
|
492
|
+
if (converted.length !== 2) {
|
|
493
|
+
throw new Error(`Pi no longer delivers one provider message per custom message: ${converted.length}`);
|
|
494
|
+
}
|
|
495
|
+
for (const message of converted) {
|
|
496
|
+
if (message.role !== "user") {
|
|
497
|
+
throw new Error(`Pi delivers a custom message as role ${message.role}, not user`);
|
|
498
|
+
}
|
|
499
|
+
if ("customType" in message || "display" in message) {
|
|
500
|
+
throw new Error("Pi now forwards customType or display, so content is no longer the whole payload");
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
const textOf = (message) =>
|
|
504
|
+
typeof message.content === "string"
|
|
505
|
+
? message.content
|
|
506
|
+
: message.content.map((block) => block.text ?? "").join("");
|
|
507
|
+
if (textOf(converted[0]) !== captainContent || textOf(converted[1]) !== routineContent) {
|
|
508
|
+
throw new Error("Pi altered custom-message content on the way to the provider");
|
|
509
|
+
}
|
|
510
|
+
writeFileSync(`${process.env.DELIVERY_DIR}/live-delivered-captain`, textOf(converted[0]));
|
|
511
|
+
writeFileSync(`${process.env.DELIVERY_DIR}/live-delivered-routine`, textOf(converted[1]));
|
|
512
|
+
console.log("DELIVERY_OK");
|
|
513
|
+
process.exit(0);
|
|
514
|
+
EOF
|
|
515
|
+
status=$?
|
|
516
|
+
out=$(cat "$TMP_ROOT/delivery-output")
|
|
517
|
+
if [ "$status" -ne 0 ] || [ "$out" != "DELIVERY_OK" ]; then
|
|
518
|
+
fail "real-SDK custom-message delivery guard failed against pi-coding-agent $PI_VERSION: $out"
|
|
519
|
+
fi
|
|
520
|
+
delivered_kind=$("$ROOT/bin/fm-operational-input.sh" kind < "$TMP_ROOT/live-delivered-captain") \
|
|
521
|
+
|| fail "pi-coding-agent $PI_VERSION delivered the captain outcome as text the protocol cannot type"
|
|
522
|
+
[ "$delivered_kind" = branch-outcome ] \
|
|
523
|
+
|| fail "pi-coding-agent $PI_VERSION delivered the captain outcome as kind '$delivered_kind'"
|
|
524
|
+
if "$ROOT/bin/fm-operational-input.sh" kind < "$TMP_ROOT/live-delivered-routine" >/dev/null 2>&1; then
|
|
525
|
+
fail "a routine note survived Pi conversion as typed operational input"
|
|
526
|
+
fi
|
|
527
|
+
pass "real Pi SDK $PI_VERSION delivers a custom message to the provider as user text carrying only content, so the captain outcome's typed envelope is what reaches the model"
|