create-agdf 0.30.0 → 0.32.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/generated/.agdf/control/README.md +5 -0
- package/generated/.agdf/control/templates/BRAND.md +28 -0
- package/generated/.agdf/control/templates/artefacts/PRD.md +11 -0
- package/generated/.agdf/control/templates/artefacts/SD.md +4 -0
- package/generated/.agdf/control/templates/artefacts/UX_INTENT_DEFINITION.md +1 -1
- package/generated/.opencode/agdf-interaction-locales.json +436 -2
- package/generated/.opencode/contracts/gate-artifact-preparation.md +9 -3
- package/generated/.opencode/contracts/interaction.md +10 -4
- package/generated/.opencode/contracts/modes.md +5 -0
- package/generated/.opencode/contracts/prd-definition.md +40 -1
- package/generated/.opencode/contracts/quality.md +35 -0
- package/generated/.opencode/contracts/request-activation.md +6 -3
- package/generated/.opencode/contracts/sd-definition.md +46 -0
- package/generated/.opencode/contracts/tp-definition.md +8 -0
- package/generated/.opencode/contracts/ur-definition.md +9 -5
- package/generated/.opencode/skills/agdf-ux-intent-definition/SKILL.md +31 -2
- package/generated/plugins/agdf/.claude-plugin/plugin.json +1 -1
- package/generated/plugins/agdf/.codex-plugin/plugin.json +1 -1
- package/generated/plugins/agdf/companion/events.mjs +119 -0
- package/generated/plugins/agdf/companion/figure.mjs +242 -111
- package/generated/plugins/agdf/companion/gate-bar.mjs +10 -28
- package/generated/plugins/agdf/companion/localization.mjs +15 -32
- package/generated/plugins/agdf/companion/notice.mjs +20 -10
- package/generated/plugins/agdf/companion/register.mjs +310 -66
- package/generated/plugins/agdf/companion/run-state.mjs +89 -90
- package/generated/plugins/agdf/companion/state.mjs +6 -32
- package/generated/plugins/agdf/companion/view.mjs +199 -24
- package/generated/plugins/agdf/control/README.md +5 -0
- package/generated/plugins/agdf/control/templates/BRAND.md +28 -0
- package/generated/plugins/agdf/control/templates/artefacts/PRD.md +11 -0
- package/generated/plugins/agdf/control/templates/artefacts/SD.md +4 -0
- package/generated/plugins/agdf/control/templates/artefacts/UX_INTENT_DEFINITION.md +1 -1
- package/generated/plugins/agdf/mcp/server/README.md +26 -2
- package/generated/plugins/agdf/mcp/server/package.json +3 -3
- package/generated/plugins/agdf/mcp/server/src/generation-runtime.js +14 -3
- package/generated/plugins/agdf/mcp/server/src/generation.js +8 -2
- package/generated/plugins/agdf/mcp/server/src/main.js +5 -1
- package/generated/plugins/agdf/mcp/server/src/next-action.js +227 -0
- package/generated/plugins/agdf/mcp/server/src/prepared-call-transport.js +306 -0
- package/generated/plugins/agdf/mcp/server/src/safe-read-continuation.js +62 -0
- package/generated/plugins/agdf/mcp/server/src/server.js +155 -37
- package/generated/plugins/agdf/mcp/server/ui/cockpit.html +130 -33
- package/generated/plugins/agdf/mcp/server/ui/decision-manifest.json +3 -3
- package/generated/plugins/agdf/mcp/server/ui/decision.html +3 -3
- package/generated/plugins/agdf/mcp/server/ui/manifest.json +3 -3
- package/generated/plugins/agdf/meta/agdf-interaction-locales.json +436 -2
- package/generated/plugins/agdf/meta/agdf-mcp-capability.json +1 -1
- package/generated/plugins/agdf/meta/agdf-plugin.definition.json +1 -1
- package/generated/plugins/agdf/meta/contracts/gate-artifact-preparation.md +9 -3
- package/generated/plugins/agdf/meta/contracts/interaction.md +10 -4
- package/generated/plugins/agdf/meta/contracts/modes.md +5 -0
- package/generated/plugins/agdf/meta/contracts/prd-definition.md +40 -1
- package/generated/plugins/agdf/meta/contracts/quality.md +35 -0
- package/generated/plugins/agdf/meta/contracts/request-activation.md +6 -3
- package/generated/plugins/agdf/meta/contracts/sd-definition.md +46 -0
- package/generated/plugins/agdf/meta/contracts/tp-definition.md +8 -0
- package/generated/plugins/agdf/meta/contracts/ur-definition.md +9 -5
- package/generated/plugins/agdf/meta/copilot-payload-baseline.json +3 -3
- package/generated/plugins/agdf/meta/distribution-profile-history.json +14 -0
- package/generated/plugins/agdf/runtime/create-agdf/generated/plugins/agdf/meta/agdf-interaction-locales.json +436 -2
- package/generated/plugins/agdf/runtime/create-agdf/generated/plugins/agdf/meta/agdf-plugin.definition.json +1 -1
- package/generated/plugins/agdf/runtime/create-agdf/generated/plugins/agdf/meta/contracts/gate-artifact-preparation.md +9 -3
- package/generated/plugins/agdf/runtime/create-agdf/generated/plugins/agdf/meta/contracts/interaction.md +10 -4
- package/generated/plugins/agdf/runtime/create-agdf/generated/plugins/agdf/meta/contracts/modes.md +5 -0
- package/generated/plugins/agdf/runtime/create-agdf/generated/plugins/agdf/meta/contracts/prd-definition.md +40 -1
- package/generated/plugins/agdf/runtime/create-agdf/generated/plugins/agdf/meta/contracts/quality.md +35 -0
- package/generated/plugins/agdf/runtime/create-agdf/generated/plugins/agdf/meta/contracts/request-activation.md +6 -3
- package/generated/plugins/agdf/runtime/create-agdf/generated/plugins/agdf/meta/contracts/sd-definition.md +46 -0
- package/generated/plugins/agdf/runtime/create-agdf/generated/plugins/agdf/meta/contracts/tp-definition.md +8 -0
- package/generated/plugins/agdf/runtime/create-agdf/generated/plugins/agdf/meta/contracts/ur-definition.md +9 -5
- package/generated/plugins/agdf/runtime/create-agdf/lib/cli/command-registry.js +2 -1
- package/generated/plugins/agdf/runtime/create-agdf/lib/cli/parse-args.js +7 -4
- package/generated/plugins/agdf/runtime/create-agdf/lib/cli/project-read-command.js +29 -0
- package/generated/plugins/agdf/runtime/create-agdf/lib/cli/validation-handlers.js +2 -1
- package/generated/plugins/agdf/runtime/create-agdf/lib/mcp-dispatch-runtime.js +36 -7
- package/generated/plugins/agdf/runtime/create-agdf/lib/mcp-lifecycle/package.js +7 -0
- package/generated/plugins/agdf/runtime/create-agdf/lib/mcp-lifecycle/plugin-runtime.js +34 -6
- package/generated/plugins/agdf/runtime/create-agdf/lib/mcp-lifecycle/prepared-call-journal.js +269 -0
- package/generated/plugins/agdf/runtime/create-agdf/lib/mcp-worker-runtime.js +86 -83
- package/generated/plugins/agdf/runtime/create-agdf/lib/runtime/validator-application.js +2 -2
- package/generated/plugins/agdf/runtime/create-agdf/package.json +1 -1
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/companion/events.js +157 -0
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/companion/figure-state.js +38 -0
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/companion/journal.js +186 -0
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/companion/run-view.js +227 -0
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-evaluation/acceptance-criteria.js +2 -0
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-evaluation/closeout-readiness.js +24 -6
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-evaluation/decision-content-placeholder.js +4 -1
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-evaluation/gate-check.js +49 -7
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-evaluation/gate-policy-inputs.js +2 -0
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-evaluation/gate-policy-pure.js +7 -3
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-evaluation/prd-readiness.js +7 -2
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-evaluation/report-decision.js +9 -0
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-evaluation/traceability-readiness.js +57 -8
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-evaluation/ur-readiness.js +15 -2
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/artifact-readiness.js +5 -3
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/authoring-inputs.js +107 -22
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/cockpit-list.js +10 -8
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/cockpit-session.js +11 -3
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/cockpit-work.js +4 -2
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/cockpit.js +47 -33
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/contract.js +64 -24
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/material-recording-calls.js +54 -0
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/project-state.js +2 -1
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/run-classification.js +31 -0
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/selection.js +6 -0
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/service.js +32 -5
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/work-situation.js +25 -0
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-read/cockpit-worker.js +1 -0
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-state/authoring-text-handoff.js +3 -0
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-state/input-resolution.js +7 -5
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-state/material-limits.js +4 -0
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-state/prepared-control-calls.js +137 -0
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-state/presentation-delivery.js +4 -1
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-command-contract.js +10 -4
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-command-schema.js +9 -3
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-command-service.js +35 -11
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-create-command.js +6 -1
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-identity.js +2 -0
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-inventory-reader.js +54 -5
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-inventory.js +12 -27
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-material.js +25 -7
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-presentation-render.js +113 -28
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-revision.js +38 -20
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-source-revisions.js +37 -17
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-state-reader.js +10 -3
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-steps.js +8 -5
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-title.js +43 -0
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/index.js +3 -1
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/interaction-catalog-validation.js +7 -1
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/interaction-catalog.js +8 -0
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/interaction-presentation.js +31 -10
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/mcp-input-hints.js +30 -1
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/mcp-tool-errors.js +5 -3
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/resources/canonical-init-plan.js +1 -1
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/runtime/plugin-provenance.js +9 -2
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/skill-dispatch/contract.js +6 -4
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/skill-dispatch/delivery-intake.js +3 -1
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/skill-dispatch/mcp-continuation.js +25 -2
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/skill-dispatch/prd-definition.js +3 -2
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/skill-dispatch/readiness-findings.js +7 -0
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/skill-dispatch/sd-definition.js +4 -2
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/skill-dispatch/service.js +17 -4
- package/generated/plugins/agdf/runtime/create-agdf/runtime/core/lib/skill-dispatch/tp-definition.js +4 -2
- package/generated/plugins/agdf/runtime/runtime-manifest.json +2 -2
- package/generated/plugins/agdf/scripts/check-runtime-integrity.mjs +4 -3
- package/generated/plugins/agdf/skills/ux-intent-definition/SKILL.md +31 -2
- package/generated/plugins/agdf/skills/ux-intent-definition/help.md +8 -1
- package/generated/plugins/agdf/submission/openai/availability.md +1 -1
- package/generated/plugins/agdf/submission/openai/capability-matrix.json +1 -1
- package/generated/plugins/agdf/submission/openai/release-notes.md +5 -8
- package/generated/plugins/agdf/submission/openai/reviewer-cases.json +1 -1
- package/generated/plugins/agdf-planning/.codex-plugin/plugin.json +1 -1
- package/generated/plugins/agdf-planning/plugin.json +1 -1
- package/generated/plugins/copilot/agdf/.agdf-payload-inventory.json +358 -203
- package/generated/plugins/copilot/agdf/control/README.md +5 -0
- package/generated/plugins/copilot/agdf/control/templates/BRAND.md +28 -0
- package/generated/plugins/copilot/agdf/control/templates/artefacts/PRD.md +11 -0
- package/generated/plugins/copilot/agdf/control/templates/artefacts/SD.md +4 -0
- package/generated/plugins/copilot/agdf/control/templates/artefacts/UX_INTENT_DEFINITION.md +1 -1
- package/generated/plugins/copilot/agdf/mcp/server/README.md +26 -2
- package/generated/plugins/copilot/agdf/mcp/server/package.json +3 -3
- package/generated/plugins/copilot/agdf/mcp/server/src/generation-runtime.js +14 -3
- package/generated/plugins/copilot/agdf/mcp/server/src/generation.js +8 -2
- package/generated/plugins/copilot/agdf/mcp/server/src/main.js +5 -1
- package/generated/plugins/copilot/agdf/mcp/server/src/next-action.js +227 -0
- package/generated/plugins/copilot/agdf/mcp/server/src/prepared-call-transport.js +306 -0
- package/generated/plugins/copilot/agdf/mcp/server/src/safe-read-continuation.js +62 -0
- package/generated/plugins/copilot/agdf/mcp/server/src/server.js +155 -37
- package/generated/plugins/copilot/agdf/meta/agdf-plugin.definition.json +1 -1
- package/generated/plugins/copilot/agdf/meta/distribution-profile-history.json +14 -0
- package/generated/plugins/copilot/agdf/plugin.json +1 -1
- package/generated/plugins/copilot/agdf/runtime/create-agdf/generated/plugins/agdf/meta/agdf-interaction-locales.json +436 -2
- package/generated/plugins/copilot/agdf/runtime/create-agdf/generated/plugins/agdf/meta/agdf-plugin.definition.json +1 -1
- package/generated/plugins/copilot/agdf/runtime/create-agdf/generated/plugins/agdf/meta/contracts/gate-artifact-preparation.md +9 -3
- package/generated/plugins/copilot/agdf/runtime/create-agdf/generated/plugins/agdf/meta/contracts/interaction.md +10 -4
- package/generated/plugins/copilot/agdf/runtime/create-agdf/generated/plugins/agdf/meta/contracts/modes.md +5 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/generated/plugins/agdf/meta/contracts/prd-definition.md +40 -1
- package/generated/plugins/copilot/agdf/runtime/create-agdf/generated/plugins/agdf/meta/contracts/quality.md +35 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/generated/plugins/agdf/meta/contracts/request-activation.md +6 -3
- package/generated/plugins/copilot/agdf/runtime/create-agdf/generated/plugins/agdf/meta/contracts/sd-definition.md +46 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/generated/plugins/agdf/meta/contracts/tp-definition.md +8 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/generated/plugins/agdf/meta/contracts/ur-definition.md +9 -5
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/cli/command-registry.js +2 -1
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/cli/parse-args.js +7 -4
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/cli/project-read-command.js +29 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/cli/validation-handlers.js +2 -1
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/mcp-dispatch-runtime.js +36 -7
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/mcp-lifecycle/package.js +7 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/mcp-lifecycle/plugin-runtime.js +34 -6
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/mcp-lifecycle/prepared-call-journal.js +269 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/mcp-worker-runtime.js +81 -78
- package/generated/plugins/copilot/agdf/runtime/create-agdf/lib/runtime/validator-application.js +2 -2
- package/generated/plugins/copilot/agdf/runtime/create-agdf/package.json +1 -1
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/companion/events.js +157 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/companion/figure-state.js +38 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/companion/journal.js +186 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/companion/run-view.js +227 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-evaluation/acceptance-criteria.js +2 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-evaluation/closeout-readiness.js +24 -6
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-evaluation/decision-content-placeholder.js +4 -1
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-evaluation/gate-check.js +49 -7
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-evaluation/gate-policy-inputs.js +2 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-evaluation/gate-policy-pure.js +7 -3
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-evaluation/prd-readiness.js +7 -2
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-evaluation/report-decision.js +9 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-evaluation/traceability-readiness.js +57 -8
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-evaluation/ur-readiness.js +15 -2
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/artifact-readiness.js +5 -3
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/authoring-inputs.js +107 -22
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/contract.js +64 -24
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/material-recording-calls.js +54 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/project-state.js +2 -1
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/run-classification.js +31 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/selection.js +6 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/service.js +32 -5
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-inspect/work-situation.js +25 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-state/authoring-text-handoff.js +3 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-state/input-resolution.js +7 -5
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-state/material-limits.js +4 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-state/prepared-control-calls.js +137 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-state/presentation-delivery.js +4 -1
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-command-contract.js +10 -4
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-command-schema.js +9 -3
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-command-service.js +35 -11
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-create-command.js +6 -1
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-identity.js +2 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-inventory-reader.js +54 -5
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-inventory.js +12 -27
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-material.js +25 -7
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-presentation-render.js +113 -28
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-revision.js +38 -20
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-source-revisions.js +37 -17
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-state-reader.js +10 -3
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-steps.js +8 -5
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/control-state/run-title.js +43 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/index.js +3 -1
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/interaction-catalog-validation.js +7 -1
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/interaction-catalog.js +8 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/interaction-presentation.js +31 -10
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/mcp-input-hints.js +30 -1
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/mcp-tool-errors.js +5 -3
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/resources/canonical-init-plan.js +1 -1
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/runtime/plugin-provenance.js +9 -2
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/skill-dispatch/contract.js +6 -4
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/skill-dispatch/delivery-intake.js +3 -1
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/skill-dispatch/mcp-continuation.js +25 -2
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/skill-dispatch/prd-definition.js +3 -2
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/skill-dispatch/readiness-findings.js +7 -0
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/skill-dispatch/sd-definition.js +4 -2
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/skill-dispatch/service.js +17 -4
- package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/skill-dispatch/tp-definition.js +4 -2
- package/generated/plugins/copilot/agdf/runtime/runtime-manifest.json +2 -2
- package/generated/plugins/copilot/agdf/skills/agdf-interaction-locales.json +1 -1
- package/generated/plugins/copilot/agdf/skills/agdf-ux-intent-definition/SKILL.md +31 -2
- package/generated/plugins/copilot/agdf/skills/contracts/gate-artifact-preparation.md +9 -3
- package/generated/plugins/copilot/agdf/skills/contracts/interaction.md +10 -4
- package/generated/plugins/copilot/agdf/skills/contracts/modes.md +5 -0
- package/generated/plugins/copilot/agdf/skills/contracts/prd-definition.md +40 -1
- package/generated/plugins/copilot/agdf/skills/contracts/quality.md +35 -0
- package/generated/plugins/copilot/agdf/skills/contracts/request-activation.md +6 -3
- package/generated/plugins/copilot/agdf/skills/contracts/sd-definition.md +46 -0
- package/generated/plugins/copilot/agdf/skills/contracts/tp-definition.md +8 -0
- package/generated/plugins/copilot/agdf/skills/contracts/ur-definition.md +9 -5
- package/generated/submissions/openai/agdf/.codex-plugin/plugin.json +1 -1
- package/generated/submissions/openai/agdf/meta/agdf-interaction-locales.json +436 -2
- package/generated/submissions/openai/agdf/meta/agdf-plugin.definition.json +1 -1
- package/generated/submissions/openai/agdf/meta/contracts/gate-artifact-preparation.md +9 -3
- package/generated/submissions/openai/agdf/meta/contracts/interaction.md +10 -4
- package/generated/submissions/openai/agdf/meta/contracts/modes.md +5 -0
- package/generated/submissions/openai/agdf/meta/contracts/prd-definition.md +40 -1
- package/generated/submissions/openai/agdf/meta/contracts/quality.md +35 -0
- package/generated/submissions/openai/agdf/meta/contracts/request-activation.md +6 -3
- package/generated/submissions/openai/agdf/meta/contracts/sd-definition.md +46 -0
- package/generated/submissions/openai/agdf/meta/contracts/tp-definition.md +8 -0
- package/generated/submissions/openai/agdf/meta/contracts/ur-definition.md +9 -5
- package/generated/submissions/openai/agdf/meta/copilot-payload-baseline.json +3 -3
- package/generated/submissions/openai/agdf/meta/distribution-profile-history.json +14 -0
- package/generated/submissions/openai/agdf/plugin.json +1 -1
- package/generated/submissions/openai/agdf/skills/ux-intent-definition/SKILL.md +31 -2
- package/generated/submissions/openai/agdf/skills/ux-intent-definition/help.md +8 -1
- package/generated/submissions/openai/agdf/submission/openai/availability.md +1 -1
- package/generated/submissions/openai/agdf/submission/openai/capability-matrix.json +1 -1
- package/generated/submissions/openai/agdf/submission/openai/inventory.json +24 -24
- package/generated/submissions/openai/agdf/submission/openai/listing.json +1 -1
- package/generated/submissions/openai/agdf/submission/openai/readiness.json +2 -2
- package/generated/submissions/openai/agdf/submission/openai/readiness.md +2 -2
- package/generated/submissions/openai/agdf/submission/openai/release-notes.md +5 -8
- package/generated/submissions/openai/agdf/submission/openai/reviewer-cases.json +1 -1
- package/lib/cli/command-registry.js +2 -1
- package/lib/cli/parse-args.js +7 -4
- package/lib/cli/project-read-command.js +29 -0
- package/lib/cli/validation-handlers.js +2 -1
- package/lib/mcp-dispatch-runtime.js +36 -7
- package/lib/mcp-lifecycle/package.js +7 -0
- package/lib/mcp-lifecycle/plugin-runtime.js +34 -6
- package/lib/mcp-lifecycle/prepared-call-journal.js +269 -0
- package/lib/mcp-worker-runtime.js +86 -83
- package/lib/runtime/validator-application.js +2 -2
- package/lib/scaffold/plan.js +2 -0
- package/package.json +1 -1
- package/runtime/core/lib/companion/events.js +157 -0
- package/runtime/core/lib/companion/figure-state.js +38 -0
- package/runtime/core/lib/companion/journal.js +186 -0
- package/runtime/core/lib/companion/run-view.js +227 -0
- package/runtime/core/lib/control-evaluation/acceptance-criteria.js +2 -0
- package/runtime/core/lib/control-evaluation/closeout-readiness.js +24 -6
- package/runtime/core/lib/control-evaluation/decision-content-placeholder.js +4 -1
- package/runtime/core/lib/control-evaluation/gate-check.js +49 -7
- package/runtime/core/lib/control-evaluation/gate-policy-inputs.js +2 -0
- package/runtime/core/lib/control-evaluation/gate-policy-pure.js +7 -3
- package/runtime/core/lib/control-evaluation/prd-readiness.js +7 -2
- package/runtime/core/lib/control-evaluation/report-decision.js +9 -0
- package/runtime/core/lib/control-evaluation/traceability-readiness.js +57 -8
- package/runtime/core/lib/control-evaluation/ur-readiness.js +15 -2
- package/runtime/core/lib/control-inspect/artifact-readiness.js +5 -3
- package/runtime/core/lib/control-inspect/authoring-inputs.js +107 -22
- package/runtime/core/lib/control-inspect/cockpit-list.js +10 -8
- package/runtime/core/lib/control-inspect/cockpit-session.js +11 -3
- package/runtime/core/lib/control-inspect/cockpit-work.js +4 -2
- package/runtime/core/lib/control-inspect/cockpit.js +47 -33
- package/runtime/core/lib/control-inspect/contract.js +64 -24
- package/runtime/core/lib/control-inspect/material-recording-calls.js +54 -0
- package/runtime/core/lib/control-inspect/project-state.js +2 -1
- package/runtime/core/lib/control-inspect/run-classification.js +31 -0
- package/runtime/core/lib/control-inspect/selection.js +6 -0
- package/runtime/core/lib/control-inspect/service.js +32 -5
- package/runtime/core/lib/control-inspect/work-situation.js +25 -0
- package/runtime/core/lib/control-read/cockpit-worker.js +1 -0
- package/runtime/core/lib/control-state/authoring-text-handoff.js +3 -0
- package/runtime/core/lib/control-state/input-resolution.js +7 -5
- package/runtime/core/lib/control-state/material-limits.js +4 -0
- package/runtime/core/lib/control-state/prepared-control-calls.js +137 -0
- package/runtime/core/lib/control-state/presentation-delivery.js +4 -1
- package/runtime/core/lib/control-state/run-command-contract.js +10 -4
- package/runtime/core/lib/control-state/run-command-schema.js +9 -3
- package/runtime/core/lib/control-state/run-command-service.js +35 -11
- package/runtime/core/lib/control-state/run-create-command.js +6 -1
- package/runtime/core/lib/control-state/run-identity.js +2 -0
- package/runtime/core/lib/control-state/run-inventory-reader.js +54 -5
- package/runtime/core/lib/control-state/run-inventory.js +12 -27
- package/runtime/core/lib/control-state/run-material.js +25 -7
- package/runtime/core/lib/control-state/run-presentation-render.js +113 -28
- package/runtime/core/lib/control-state/run-revision.js +38 -20
- package/runtime/core/lib/control-state/run-source-revisions.js +37 -17
- package/runtime/core/lib/control-state/run-state-reader.js +10 -3
- package/runtime/core/lib/control-state/run-steps.js +8 -5
- package/runtime/core/lib/control-state/run-title.js +43 -0
- package/runtime/core/lib/index.js +3 -1
- package/runtime/core/lib/interaction-catalog-validation.js +7 -1
- package/runtime/core/lib/interaction-catalog.js +8 -0
- package/runtime/core/lib/interaction-presentation.js +31 -10
- package/runtime/core/lib/mcp-input-hints.js +30 -1
- package/runtime/core/lib/mcp-tool-errors.js +5 -3
- package/runtime/core/lib/resources/canonical-init-plan.js +1 -1
- package/runtime/core/lib/runtime/plugin-provenance.js +9 -2
- package/runtime/core/lib/skill-dispatch/contract.js +6 -4
- package/runtime/core/lib/skill-dispatch/delivery-intake.js +3 -1
- package/runtime/core/lib/skill-dispatch/mcp-continuation.js +25 -2
- package/runtime/core/lib/skill-dispatch/prd-definition.js +3 -2
- package/runtime/core/lib/skill-dispatch/readiness-findings.js +7 -0
- package/runtime/core/lib/skill-dispatch/sd-definition.js +4 -2
- package/runtime/core/lib/skill-dispatch/service.js +17 -4
- package/runtime/core/lib/skill-dispatch/tp-definition.js +4 -2
- package/generated/plugins/agdf/companion/core.mjs +0 -16
- package/generated/plugins/agdf/companion/locales.json +0 -200
|
@@ -4,7 +4,7 @@ import { validateCommandOptions, commandGroupRoutes } from "../cli/command-regis
|
|
|
4
4
|
import { CliUsageError, parseArgs } from "../cli/parse-args.js";
|
|
5
5
|
import { pluginDefinition } from "../cli/runtime-context.js";
|
|
6
6
|
|
|
7
|
-
const validatorCommands = new Set(["project-state", "operation-status", "target-check", "skill-dispatch", "doctor", "gate-check", "delivery-map", "inventory", "delivery-path-search", "contract", "control-maintenance", "run-create", "run-present", "run-revise", "run-step", "run-approve", "run-close", ...Object.keys(commandGroupRoutes)]);
|
|
7
|
+
const validatorCommands = new Set(["project-state", "operation-status", "run-view", "target-check", "skill-dispatch", "doctor", "gate-check", "delivery-map", "inventory", "delivery-path-search", "contract", "control-maintenance", "run-create", "run-present", "run-revise", "run-step", "run-approve", "run-close", ...Object.keys(commandGroupRoutes)]);
|
|
8
8
|
|
|
9
9
|
export async function runValidatorCli(argv = process.argv.slice(2), adapters = {}) {
|
|
10
10
|
const io = adapters.io ?? console;
|
|
@@ -22,7 +22,7 @@ export async function runValidatorCli(argv = process.argv.slice(2), adapters = {
|
|
|
22
22
|
return error.exitCode;
|
|
23
23
|
}
|
|
24
24
|
if (parsed.kind === "help") {
|
|
25
|
-
io.log("AGDF surface-local validator: project-state | operation-status | target-check | skill-dispatch | doctor | gate-check | delivery-map | inventory | delivery-path-search | contract | control-maintenance | run-create | run-present | run-revise | run-step | run-approve | run-close");
|
|
25
|
+
io.log("AGDF surface-local validator: project-state | operation-status | run-view | target-check | skill-dispatch | doctor | gate-check | delivery-map | inventory | delivery-path-search | contract | control-maintenance | run-create | run-present | run-revise | run-step | run-approve | run-close");
|
|
26
26
|
return 0;
|
|
27
27
|
}
|
|
28
28
|
let options;
|
package/lib/scaffold/plan.js
CHANGED
|
@@ -22,6 +22,7 @@ const codexPluginFiles = [
|
|
|
22
22
|
join("plugins", "agdf", "control", "templates", "SOT_REGISTRY.md"),
|
|
23
23
|
join("plugins", "agdf", "control", "templates", "CONTEXT_GRAPH.md"),
|
|
24
24
|
join("plugins", "agdf", "control", "templates", "AGENT_QUALITY_CONTRACTS.json"),
|
|
25
|
+
join("plugins", "agdf", "control", "templates", "BRAND.md"),
|
|
25
26
|
join("plugins", "agdf", "control", "templates", "artefacts", "UR.md"),
|
|
26
27
|
join("plugins", "agdf", "control", "templates", "artefacts", "BROWNFIELD_REVIEW.md"),
|
|
27
28
|
join("plugins", "agdf", "control", "templates", "artefacts", "VERIFIED_CHANGE.md"),
|
|
@@ -47,6 +48,7 @@ const controlFiles = [
|
|
|
47
48
|
join(".agdf", "control", "templates", "SOT_REGISTRY.md"),
|
|
48
49
|
join(".agdf", "control", "templates", "CONTEXT_GRAPH.md"),
|
|
49
50
|
join(".agdf", "control", "templates", "AGENT_QUALITY_CONTRACTS.json"),
|
|
51
|
+
join(".agdf", "control", "templates", "BRAND.md"),
|
|
50
52
|
join(".agdf", "control", "templates", "artefacts", "UR.md"),
|
|
51
53
|
join(".agdf", "control", "templates", "artefacts", "BROWNFIELD_REVIEW.md"),
|
|
52
54
|
join(".agdf", "control", "templates", "artefacts", "VERIFIED_CHANGE.md"),
|
package/package.json
CHANGED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
// Companion events (SD SDD-005, SDD-009): the pure mapping from the final result of an AGDF MCP tool
|
|
2
|
+
// call to zero or one event of schema `companion-event/1`, and the reader of the versioned journal
|
|
3
|
+
// format. Events come from real MCP outcomes, never from host hooks, so the agent cannot shape them.
|
|
4
|
+
// Read-only tools produce none. Review facts (SDD-008) are computed by the runtime and handed in.
|
|
5
|
+
// Host-neutral: no Node built-in, no host API.
|
|
6
|
+
import { COMMAND_TOOL_NAMES, TOOL_RESULT_META } from '../mcp-tool-errors.js';
|
|
7
|
+
import { RUN_STEP_SLOTS } from '../control-state/run-identity.js';
|
|
8
|
+
|
|
9
|
+
export const COMPANION_EVENT_SCHEMA = 'companion-event/1';
|
|
10
|
+
export const EVENT_KINDS = Object.freeze(['approval_requested', 'approval_recorded', 'write_rejected', 'effect_unknown',
|
|
11
|
+
'recovery_required', 'run_completed', 'material_staged', 'document_recorded']);
|
|
12
|
+
// Decision P1: these kinds interrupt as a toast, together with a digest mismatch (a drift warning of
|
|
13
|
+
// the run view); approval recorded and write rejected appear in the pane only.
|
|
14
|
+
export const TOAST_KINDS = Object.freeze(['approval_requested', 'effect_unknown', 'recovery_required', 'run_completed']);
|
|
15
|
+
// Decision P2: at most 40 lines or 4 KiB, whichever is smaller.
|
|
16
|
+
export const PREVIEW_LIMITS = Object.freeze({ lines: 40, bytes: 4096 });
|
|
17
|
+
export const SOURCE_MATCHES = Object.freeze(['match', 'mismatch', 'not_determinable', 'unavailable']);
|
|
18
|
+
|
|
19
|
+
// The tool-result descriptor key and the command tools come from the MCP tool-error contract, and the
|
|
20
|
+
// slot of a recorded step from the run identity owner; all three modules are pure (CR finding CIR-04).
|
|
21
|
+
export const TOOL_RESULT_META_KEY = TOOL_RESULT_META;
|
|
22
|
+
const COMMAND_TOOLS = new Set(COMMAND_TOOL_NAMES);
|
|
23
|
+
const TEXT_LIMIT = 256;
|
|
24
|
+
const encoder = new TextEncoder();
|
|
25
|
+
const bounded = value => (typeof value === 'string' && value.length ? value.slice(0, TEXT_LIMIT) : null);
|
|
26
|
+
|
|
27
|
+
// The bounded preview of a text: cut after the 40th line break unless the text ends there, then to
|
|
28
|
+
// at most 4096 UTF-8 bytes on a character boundary. Exactly 40 lines or 4096 bytes stay whole.
|
|
29
|
+
export function reviewPreview(text) {
|
|
30
|
+
const value = String(text ?? '');
|
|
31
|
+
let preview = value;
|
|
32
|
+
let at = -1;
|
|
33
|
+
for (let line = 0; line < PREVIEW_LIMITS.lines; line += 1) {
|
|
34
|
+
at = value.indexOf('\n', at + 1);
|
|
35
|
+
if (at < 0) break;
|
|
36
|
+
}
|
|
37
|
+
if (at >= 0 && at < value.length - 1) preview = value.slice(0, at + 1);
|
|
38
|
+
if (encoder.encode(preview).length > PREVIEW_LIMITS.bytes) {
|
|
39
|
+
let size = 0;
|
|
40
|
+
let cut = 0;
|
|
41
|
+
for (const char of preview) {
|
|
42
|
+
const width = encoder.encode(char).length;
|
|
43
|
+
if (size + width > PREVIEW_LIMITS.bytes) break;
|
|
44
|
+
size += width;
|
|
45
|
+
cut += char.length;
|
|
46
|
+
}
|
|
47
|
+
preview = preview.slice(0, cut);
|
|
48
|
+
}
|
|
49
|
+
return { text: preview, truncated: preview.length < value.length, bytes: encoder.encode(value).length };
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// One review fact: what the runtime saw of recorded or staged material. Unknown values stay null
|
|
53
|
+
// ("unavailable"), never guessed (PRD AC-007).
|
|
54
|
+
export function reviewFact({ slot = null, source, path = null, digest = null, text = null, sourceMatch }) {
|
|
55
|
+
const preview = typeof text === 'string' ? reviewPreview(text) : null;
|
|
56
|
+
return {
|
|
57
|
+
slot: bounded(slot),
|
|
58
|
+
source: source === 'path' ? 'path' : 'staged',
|
|
59
|
+
path: bounded(path),
|
|
60
|
+
digest: /^sha256:[a-f0-9]{64}$/u.test(digest ?? '') ? digest : null,
|
|
61
|
+
bytes: preview?.bytes ?? null,
|
|
62
|
+
preview: preview?.text ?? null,
|
|
63
|
+
truncated: preview?.truncated ?? null,
|
|
64
|
+
source_match: SOURCE_MATCHES.includes(sourceMatch) ? sourceMatch : 'unavailable',
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// The slot (gate or step) a command names, for the event's gate field.
|
|
69
|
+
export function commandGate(command = {}) {
|
|
70
|
+
const payload = command.payload ?? {};
|
|
71
|
+
if (command.kind === 'closeout.record') return 'OR';
|
|
72
|
+
if (command.kind === 'step.record') return payload.internal_step ?? RUN_STEP_SLOTS[payload.step] ?? null;
|
|
73
|
+
if (command.kind === 'verified_change.record') return 'Verified Change';
|
|
74
|
+
if (command.kind === 'ur_draft.replace') return 'UR';
|
|
75
|
+
if (command.kind === 'operation.recover') return null;
|
|
76
|
+
return typeof payload.gate === 'string' ? payload.gate : null;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function successKind(command, result) {
|
|
80
|
+
const kind = command?.kind;
|
|
81
|
+
if (kind === 'presentation.deliver') {
|
|
82
|
+
return result.historical_effect === true || result.presentation_delivery?.historical_delivery === true
|
|
83
|
+
? null : 'approval_requested';
|
|
84
|
+
}
|
|
85
|
+
if (kind === 'approval.record') return 'approval_recorded';
|
|
86
|
+
if (kind === 'closeout.record') return 'run_completed';
|
|
87
|
+
if (kind === 'material.stage' && command.payload?.action === 'seal') return 'material_staged';
|
|
88
|
+
// Every document recording of run-steps.recordRunStep (run-command-service.js).
|
|
89
|
+
if (['step.record', 'artefact.record', 'verified_change.record', 'ur_draft.replace'].includes(kind)) return 'document_recorded';
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// The event kind of one final command result, or null for a read, a replay or an outcome outside
|
|
94
|
+
// the eight kinds. A failure is classified by the projected descriptor's effect state first, so a
|
|
95
|
+
// thrown failure of unknown effect is never reported as rejected.
|
|
96
|
+
export function eventKind(toolName, input, result) {
|
|
97
|
+
if (!COMMAND_TOOLS.has(toolName) || !result || typeof result !== 'object') return null;
|
|
98
|
+
const descriptor = result._meta?.[TOOL_RESULT_META_KEY] ?? null;
|
|
99
|
+
if (result.outcome === 'accepted') return successKind(input?.command, result);
|
|
100
|
+
if (result.outcome === 'already_applied') return null;
|
|
101
|
+
if (result.outcome === 'recovery_required') return 'recovery_required';
|
|
102
|
+
if (result.outcome === 'effect_unknown' || descriptor?.effect_state === 'unknown') return 'effect_unknown';
|
|
103
|
+
if (descriptor?.failed || result.outcome === 'rejected') return 'write_rejected';
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// The event of one final tool result: { schema_version, id, at, root, run_id, gate, kind, outcome,
|
|
108
|
+
// reason, operation_id, review } or null. `id`, `at` and `root` come from the writer; `review` holds
|
|
109
|
+
// the runtime's review facts for staged or recorded material.
|
|
110
|
+
export function deriveEvent(toolName, input, result, { id, at, root = null, review = null } = {}) {
|
|
111
|
+
const kind = eventKind(toolName, input, result);
|
|
112
|
+
if (!kind) return null;
|
|
113
|
+
const descriptor = result._meta?.[TOOL_RESULT_META_KEY] ?? null;
|
|
114
|
+
const facts = Array.isArray(review) && review.length && ['material_staged', 'document_recorded'].includes(kind) ? review.slice(0, 4) : null;
|
|
115
|
+
return {
|
|
116
|
+
schema_version: COMPANION_EVENT_SCHEMA,
|
|
117
|
+
id: bounded(id),
|
|
118
|
+
at: bounded(at),
|
|
119
|
+
root: typeof root === 'string' && root.length ? root : bounded(input?.primary_target) ?? bounded(input?.working_directory),
|
|
120
|
+
run_id: bounded(input?.run_id) ?? bounded(result.run_id),
|
|
121
|
+
gate: kind === 'material_staged' ? facts?.[0]?.slot ?? null : commandGate(input?.command),
|
|
122
|
+
kind,
|
|
123
|
+
outcome: bounded(result.outcome) ?? (descriptor?.failed ? 'failed' : null),
|
|
124
|
+
reason: descriptor?.failed ? bounded(descriptor.code) ?? bounded(result.reason) : null,
|
|
125
|
+
operation_id: bounded(input?.operation_id),
|
|
126
|
+
review: facts,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// A journal line is an event when it parses and carries the schema, a known kind and an id.
|
|
131
|
+
export function validEvent(value) {
|
|
132
|
+
return Boolean(value) && typeof value === 'object' && !Array.isArray(value) && value.schema_version === COMPANION_EVENT_SCHEMA
|
|
133
|
+
&& EVENT_KINDS.includes(value.kind) && typeof value.id === 'string' && typeof value.at === 'string';
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// The events of a journal text in file order; malformed or foreign lines are skipped, since several
|
|
137
|
+
// MCP servers may interleave lines (SDD-006).
|
|
138
|
+
export function parseEventLines(text) {
|
|
139
|
+
const events = [];
|
|
140
|
+
for (const line of String(text ?? '').split('\n')) {
|
|
141
|
+
if (!line.trim()) continue;
|
|
142
|
+
try {
|
|
143
|
+
const value = JSON.parse(line);
|
|
144
|
+
if (validEvent(value)) events.push(value);
|
|
145
|
+
} catch { /* an interleaved or cut line */ }
|
|
146
|
+
}
|
|
147
|
+
return events;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Roots compare after normalizing separators, a trailing separator and, on win32, case (SD 5).
|
|
151
|
+
export function sameRoot(left, right, { win32 = false } = {}) {
|
|
152
|
+
const normal = value => {
|
|
153
|
+
const text = String(value ?? '').replaceAll('\\', '/').replace(/\/+$/u, '');
|
|
154
|
+
return win32 ? text.toLowerCase() : text;
|
|
155
|
+
};
|
|
156
|
+
return Boolean(left) && Boolean(right) && normal(left) === normal(right);
|
|
157
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// Companion figure state (SD SDD-004): one mood and a reason descriptor per run-view entry, derived
|
|
2
|
+
// only from the status-card fields the run view copied. Pure and host-neutral; hosts localize the
|
|
3
|
+
// reason with the catalog's companion section and may overlay their own activity (turn in progress).
|
|
4
|
+
import { COMPANION_MOODS } from '../interaction-catalog.js';
|
|
5
|
+
import { RUN_MODES } from '../control-state/run-identity.js';
|
|
6
|
+
|
|
7
|
+
export { COMPANION_MOODS };
|
|
8
|
+
// The internal steps between an approved TP and QA, shown as building in structured runs; hosts that
|
|
9
|
+
// mark the build phase use this list (CR finding CIR-04).
|
|
10
|
+
export const BUILD_GATES = Object.freeze(['Brownfield Analysis', 'CD+Tests', 'CR']);
|
|
11
|
+
export const STRUCTURED_MODES = Object.freeze(RUN_MODES.filter(mode => mode.startsWith('structured_')));
|
|
12
|
+
// The ended lifecycles of run-operations.js (ENDED_LIFECYCLES), kept here so this module stays pure;
|
|
13
|
+
// the companion tests assert both agree.
|
|
14
|
+
export const ENDED_LIFECYCLES = Object.freeze(['superseded', 'abandoned']);
|
|
15
|
+
// The pending approval as the run inventory reads it (run-inventory.js runAttention): a negated
|
|
16
|
+
// mention ("No Approval: QA") is no pending approval.
|
|
17
|
+
const pendingApproval = missing => String(missing ?? '').match(/(?<!\b(?:[Nn]o|[Nn]ot|[Ww]ithout) )\bApproval: (UR|PRD|SD|TP|QA|UAT|OR)\b/u)?.[1] ?? null;
|
|
18
|
+
|
|
19
|
+
// { mood, reason: { key, gate?, decision?, reason? } }; null or no entry is the idle figure.
|
|
20
|
+
export function deriveFigureState(entry) {
|
|
21
|
+
if (!entry) return { mood: 'bereit', reason: { key: 'idle' } };
|
|
22
|
+
if (entry.valid === false) return { mood: 'blockiert', reason: { key: 'unreadable', reason: entry.unreadable_reason ?? 'run_state_invalid' } };
|
|
23
|
+
if (entry.evaluation_error) return { mood: 'blockiert', reason: { key: 'unreadable', reason: entry.evaluation_error } };
|
|
24
|
+
// A completed run whose evaluation is blocked is not done: the block is shown like any other.
|
|
25
|
+
const blocked = entry.evaluated === true && (entry.status === 'blocked' || Boolean(entry.blocking_reason && entry.blocking_reason !== 'none'));
|
|
26
|
+
// A completed run without confirmed completion is still shown, but claims nothing: its own reason.
|
|
27
|
+
if (entry.lifecycle === 'completed' && !blocked) return entry.completion_confirmed === true
|
|
28
|
+
? { mood: 'fertig', reason: { key: 'done' } } : { mood: 'bereit', reason: { key: 'completionUnconfirmed' } };
|
|
29
|
+
if (ENDED_LIFECYCLES.includes(entry.lifecycle)) return { mood: 'bereit', reason: { key: 'ended' } };
|
|
30
|
+
if (!entry.evaluated) return { mood: 'bereit', reason: { key: 'idle' } };
|
|
31
|
+
const gate = entry.current_gate;
|
|
32
|
+
if (blocked) return { mood: 'blockiert', reason: { key: 'blocked', gate, decision: entry.blocking_reason } };
|
|
33
|
+
const approval = pendingApproval(entry.missing_approval);
|
|
34
|
+
if (approval) return { mood: 'wartet', reason: { key: 'waitingApproval', gate: approval } };
|
|
35
|
+
if (entry.user_action_required === 'yes') return { mood: 'wartet', reason: { key: 'waitingDecision', gate } };
|
|
36
|
+
if (STRUCTURED_MODES.includes(entry.mode) && BUILD_GATES.includes(gate)) return { mood: 'baut', reason: { key: 'building', gate } };
|
|
37
|
+
return { mood: 'laeuft', reason: { key: 'working', gate } };
|
|
38
|
+
}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
// Companion event journal (SD SDD-006, SDD-008): the runtime appends one line per event of a final
|
|
2
|
+
// AGDF MCP tool result to `companion/events.jsonl` below the plugin data root, bounded to 256 KiB with
|
|
3
|
+
// one rotation file `events.1.jsonl`. It is a notification channel only, never a source of truth, and
|
|
4
|
+
// nothing here writes under `.agdf/control`. Every failure is swallowed: the tool result never changes.
|
|
5
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
6
|
+
import { appendFileSync, lstatSync, mkdirSync, readFileSync, realpathSync, renameSync, statSync } from 'node:fs';
|
|
7
|
+
import { isAbsolute, join, resolve } from 'node:path';
|
|
8
|
+
import { resolveTaskTarget } from '../task-target-resolution.js';
|
|
9
|
+
import { artefactFileDigest } from '../control-state/run-seal-compute.js';
|
|
10
|
+
import { containedRegularFile } from '../control-state/contained-file.js';
|
|
11
|
+
import { atomicWrite, withOwnedFileLock } from '../owned-file-lock.js';
|
|
12
|
+
import { commandGate, deriveEvent, eventKind, reviewFact } from './events.js';
|
|
13
|
+
|
|
14
|
+
export const JOURNAL_DIRECTORY = 'companion';
|
|
15
|
+
export const JOURNAL_FILE = 'events.jsonl';
|
|
16
|
+
export const JOURNAL_ROTATED_FILE = 'events.1.jsonl';
|
|
17
|
+
export const JOURNAL_LIMIT_BYTES = 256 * 1024;
|
|
18
|
+
// The launcher hands its data root (CLAUDE_PLUGIN_DATA on Claude, --data on Codex) to the runtime
|
|
19
|
+
// processes through this variable (SDD-006).
|
|
20
|
+
export const COMPANION_DATA_ROOT_ENV = 'AGDF_COMPANION_DATA_ROOT';
|
|
21
|
+
const SOURCE_TEXT_LIMIT = 1024 * 1024;
|
|
22
|
+
const RESERVATIONS_FILE = 'approval-requests.json';
|
|
23
|
+
const RESERVATIONS_LIFETIME_MS = 30 * 60_000;
|
|
24
|
+
const RESERVATIONS_MAX_ENTRIES = 8192;
|
|
25
|
+
const RESERVATIONS_MAX_BYTES = 1024 * 1024;
|
|
26
|
+
const RESERVATIONS_LOCK_WAIT_MS = 50;
|
|
27
|
+
const DIGEST = /^[a-f0-9]{64}$/u;
|
|
28
|
+
|
|
29
|
+
export const journalPath = dataRoot => join(dataRoot, JOURNAL_DIRECTORY, JOURNAL_FILE);
|
|
30
|
+
|
|
31
|
+
const isLink = path => { try { return lstatSync(path).isSymbolicLink(); } catch { return false; } };
|
|
32
|
+
|
|
33
|
+
function readReservations(path) {
|
|
34
|
+
let stat;
|
|
35
|
+
try { stat = lstatSync(path); }
|
|
36
|
+
catch (error) { if (error.code === 'ENOENT') return []; throw error; }
|
|
37
|
+
if (!stat.isFile() || stat.size > RESERVATIONS_MAX_BYTES) throw Error('invalid notification reservations');
|
|
38
|
+
const bytes = readFileSync(path);
|
|
39
|
+
if (bytes.length > RESERVATIONS_MAX_BYTES) throw Error('invalid notification reservations');
|
|
40
|
+
const stored = JSON.parse(bytes);
|
|
41
|
+
if (!stored || typeof stored !== 'object' || Array.isArray(stored)) throw Error('invalid notification reservations');
|
|
42
|
+
const entries = Object.entries(stored);
|
|
43
|
+
if (entries.length > RESERVATIONS_MAX_ENTRIES
|
|
44
|
+
|| entries.some(([key, expires]) => !DIGEST.test(key) || !Number.isSafeInteger(expires) || expires < 0)) {
|
|
45
|
+
throw Error('invalid notification reservations');
|
|
46
|
+
}
|
|
47
|
+
return entries;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Only the notification survives a serving-process restart. Neither this
|
|
51
|
+
// reservation nor the journal line participates in delivery or approval.
|
|
52
|
+
function reserveApprovalRequest(dataRoot, input, at) {
|
|
53
|
+
const identity = [input.target_id, input.run_id, input.expected_revision_id,
|
|
54
|
+
input.command.payload.presentation_id, input.operation_id];
|
|
55
|
+
if (!identity.every(value => typeof value === 'string' && value.length > 0)) return false;
|
|
56
|
+
const key = createHash('sha256').update(JSON.stringify(identity)).digest('hex');
|
|
57
|
+
const directory = join(dataRoot, JOURNAL_DIRECTORY);
|
|
58
|
+
if (isLink(dataRoot) || isLink(directory)) return false;
|
|
59
|
+
mkdirSync(directory, { recursive: true, mode: 0o700 });
|
|
60
|
+
const path = join(directory, RESERVATIONS_FILE);
|
|
61
|
+
const deadline = performance.now() + RESERVATIONS_LOCK_WAIT_MS;
|
|
62
|
+
for (;;) {
|
|
63
|
+
try {
|
|
64
|
+
return withOwnedFileLock(path, () => {
|
|
65
|
+
const live = new Map(readReservations(path).filter(([, expires]) => expires > at));
|
|
66
|
+
if (live.has(key) || live.size >= RESERVATIONS_MAX_ENTRIES) return false;
|
|
67
|
+
live.set(key, at + RESERVATIONS_LIFETIME_MS);
|
|
68
|
+
const bytes = JSON.stringify(Object.fromEntries(live));
|
|
69
|
+
if (Buffer.byteLength(bytes) > RESERVATIONS_MAX_BYTES) return false;
|
|
70
|
+
atomicWrite(path, bytes);
|
|
71
|
+
return true;
|
|
72
|
+
});
|
|
73
|
+
} catch (error) {
|
|
74
|
+
const remaining = deadline - performance.now();
|
|
75
|
+
if (error.lock_owner_status !== 'live' || remaining <= 0) return false;
|
|
76
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, Math.min(5, remaining));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Appends one event line; rotates first when the line would cross the bound. Returns whether the line
|
|
82
|
+
// was written. Concurrent servers may interleave whole lines or lose some at rotation (accepted).
|
|
83
|
+
export function appendJournalEvent(dataRoot, event, { limit = JOURNAL_LIMIT_BYTES } = {}) {
|
|
84
|
+
try {
|
|
85
|
+
if (typeof dataRoot !== 'string' || !dataRoot || !event) return false;
|
|
86
|
+
const directory = join(dataRoot, JOURNAL_DIRECTORY);
|
|
87
|
+
if (isLink(dataRoot) || isLink(directory)) return false;
|
|
88
|
+
mkdirSync(directory, { recursive: true });
|
|
89
|
+
const line = `${JSON.stringify(event)}\n`;
|
|
90
|
+
const size = Buffer.byteLength(line, 'utf8');
|
|
91
|
+
if (size > limit) return false;
|
|
92
|
+
const file = join(directory, JOURNAL_FILE);
|
|
93
|
+
if (isLink(file)) return false;
|
|
94
|
+
let current = 0;
|
|
95
|
+
try { current = statSync(file).size; } catch { current = 0; }
|
|
96
|
+
if (current > 0 && current + size > limit) renameSync(file, join(directory, JOURNAL_ROTATED_FILE));
|
|
97
|
+
appendFileSync(file, line, 'utf8');
|
|
98
|
+
return true;
|
|
99
|
+
} catch {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// The governance root of a command input, resolved like the material store does; the input's own
|
|
105
|
+
// target path when it does not resolve.
|
|
106
|
+
export function commandRoot(input = {}) {
|
|
107
|
+
try {
|
|
108
|
+
const target = resolveTaskTarget({ workingDirectory: input.working_directory, targetSource: input.target_source, primaryTarget: input.primary_target });
|
|
109
|
+
if (target.resolution_state === 'resolved' && target.governance_target) return target.governance_target;
|
|
110
|
+
} catch { /* fall back to the input path */ }
|
|
111
|
+
return input.primary_target ?? input.working_directory ?? null;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// The event's root: the caller's target path when it names the same directory as the resolved root
|
|
115
|
+
// through another spelling (junction, symlink, subst drive), so a host comparing with its own session
|
|
116
|
+
// root still matches (SD SDD-005 "the MCP target path", CR finding A6); else the resolved root.
|
|
117
|
+
// Review facts keep reading below the resolved root.
|
|
118
|
+
export function eventRoot(input = {}, root = commandRoot(input)) {
|
|
119
|
+
const given = typeof input.primary_target === 'string' && isAbsolute(input.primary_target) ? resolve(input.primary_target) : null;
|
|
120
|
+
if (!given || !root || given === root) return root;
|
|
121
|
+
try { return realpathSync(given) === realpathSync(root) ? given : root; } catch { return root; }
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Review facts of a path source: the file read now, its canonical digest from the node digest owner
|
|
125
|
+
// compared with the declared digest (match or mismatch); unreadable files are unavailable.
|
|
126
|
+
function pathFact(root, slot, source) {
|
|
127
|
+
const current = root ? artefactFileDigest(root, source.path) : 'unresolved';
|
|
128
|
+
if (!/^sha256:/u.test(current)) return reviewFact({ slot, source: 'path', path: source.path, digest: source.digest, sourceMatch: 'unavailable' });
|
|
129
|
+
let text = null;
|
|
130
|
+
try {
|
|
131
|
+
const file = containedRegularFile(root, String(source.path).trim());
|
|
132
|
+
if (file.status === 'valid' && statSync(file.path).size <= SOURCE_TEXT_LIMIT) text = readFileSync(file.path, 'utf8');
|
|
133
|
+
} catch { text = null; }
|
|
134
|
+
return reviewFact({ slot, source: 'path', path: source.path, digest: source.digest, text, sourceMatch: current === source.digest ? 'match' : 'mismatch' });
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Review facts (SDD-008, decision P4): sealed staged material carries its preview, size and digest
|
|
138
|
+
// with source_match not_determinable; a recording from a path carries the path, the recorded digest
|
|
139
|
+
// and whether the file still matches it; a recording from staged material names its digest only.
|
|
140
|
+
export function reviewFacts(toolName, input, result, { sealedFiles = () => null, root = commandRoot(input) } = {}) {
|
|
141
|
+
const kind = eventKind(toolName, input, result);
|
|
142
|
+
const command = input?.command ?? {};
|
|
143
|
+
if (kind === 'material_staged') {
|
|
144
|
+
const files = sealedFiles(command.payload?.transfer_id) ?? [];
|
|
145
|
+
return files.map(file => reviewFact({ slot: file.slot, source: 'staged', digest: file.digest, text: file.content, sourceMatch: 'not_determinable' }));
|
|
146
|
+
}
|
|
147
|
+
if (kind !== 'document_recorded') return null;
|
|
148
|
+
const payload = command.payload ?? {};
|
|
149
|
+
const source = payload.source ?? payload.material ?? null;
|
|
150
|
+
const slot = commandGate(command);
|
|
151
|
+
if (source?.path) return [pathFact(root, slot, source)];
|
|
152
|
+
if (source?.material_id) return [reviewFact({ slot, source: 'staged', digest: source.digest, sourceMatch: 'not_determinable' })];
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// The runtime's observer of final tool results. Without a data root it does nothing.
|
|
157
|
+
export function createCompanionJournal({ dataRoot = process.env[COMPANION_DATA_ROOT_ENV], sealedFiles = () => null,
|
|
158
|
+
now = () => new Date(), newId = randomUUID, limit = JOURNAL_LIMIT_BYTES } = {}) {
|
|
159
|
+
const enabled = typeof dataRoot === 'string' && dataRoot.length > 0;
|
|
160
|
+
return Object.freeze({
|
|
161
|
+
enabled,
|
|
162
|
+
path: enabled ? journalPath(dataRoot) : null,
|
|
163
|
+
// Whether `observe` writes an event for this result, without writing: a facade asks this for a
|
|
164
|
+
// result its generation produced, and so already journaled.
|
|
165
|
+
observes(toolName, input, result) {
|
|
166
|
+
if (!enabled) return false;
|
|
167
|
+
try { return Boolean(eventKind(toolName, input, result)); } catch { return false; }
|
|
168
|
+
},
|
|
169
|
+
observe(toolName, input, result) {
|
|
170
|
+
if (!enabled) return false;
|
|
171
|
+
try {
|
|
172
|
+
const kind = eventKind(toolName, input, result);
|
|
173
|
+
if (!kind) return false;
|
|
174
|
+
const root = commandRoot(input);
|
|
175
|
+
const review = reviewFacts(toolName, input, result, { sealedFiles, root });
|
|
176
|
+
const at = now();
|
|
177
|
+
const event = deriveEvent(toolName, input, result, { id: newId(), at: at.toISOString(), root: eventRoot(input, root), review });
|
|
178
|
+
if (!event) return false;
|
|
179
|
+
if (kind === 'approval_requested' && !reserveApprovalRequest(dataRoot, input, at.getTime())) return false;
|
|
180
|
+
return appendJournalEvent(dataRoot, event, { limit });
|
|
181
|
+
} catch {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
});
|
|
186
|
+
}
|