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
|
@@ -50,7 +50,12 @@ export function sourceRevisionQualityFacts(state, readArtefact) {
|
|
|
50
50
|
return facts;
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
export
|
|
53
|
+
export const validExpandedRevisionProof = (...args) => revisionProofProblems(...args).length === 0;
|
|
54
|
+
|
|
55
|
+
// The same rules as a list of named violations, so a rejected proposal can be
|
|
56
|
+
// corrected deliberately instead of by trial. Later checks rely on the structure
|
|
57
|
+
// confirmed by earlier ones, so each block stops at its own violations.
|
|
58
|
+
export function revisionProofProblems(proposal, state, readArtefact, phase) {
|
|
54
59
|
const changed = proposal.changed_statements, affected = SOURCE_GATES.slice(SOURCE_GATES.indexOf(proposal.source_gate));
|
|
55
60
|
const nonempty = value => typeof value === 'string' && value.trim() && value.length <= 4096;
|
|
56
61
|
const assessmentProof = proposal.impact_assessment, index = SOURCE_GATES.indexOf(proposal.source_gate);
|
|
@@ -64,25 +69,40 @@ export function validExpandedRevisionProof(proposal, state, readArtefact, phase)
|
|
|
64
69
|
|| !Array.isArray(assessmentProof.analyses) || assessmentProof.analyses.length !== analyticalTypes.length
|
|
65
70
|
|| !assessmentProof.analyses.every((row, i) => exactObject(row, REVISION_ANALYSIS_FIELDS) && row.type === analyticalTypes[i]
|
|
66
71
|
&& row.path === state.artefacts.get(row.type).path && hashes(row.digest) && nonempty(row.reason)
|
|
67
|
-
&& ['retain', 'reassess'].includes(row.disposition) && (proposal.source_gate !== 'UR' || row.disposition === 'reassess')))
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
&& ['retain', 'reassess'].includes(row.disposition) && (proposal.source_gate !== 'UR' || row.disposition === 'reassess')))
|
|
73
|
+
return ['impact_assessment is invalid'];
|
|
74
|
+
const statementProblem = (row, i) => {
|
|
75
|
+
if (!exactObject(row, REVISION_STATEMENT_FIELDS)) return `changed_statements[${i}] fields must be exactly ${REVISION_STATEMENT_FIELDS.join(', ')}`;
|
|
76
|
+
if (!affected.includes(row.type)) return `changed_statements[${i}].type must be one of ${affected.join(', ')}`;
|
|
77
|
+
if (!proposal.sources.some(source => source.type === row.type && source.path === row.path && source.digest === row.digest))
|
|
78
|
+
return `changed_statements[${i}] path and digest must equal its entry in sources`;
|
|
79
|
+
if (![row.statement, row.intended_change, row.reason].every(nonempty)) return `changed_statements[${i}] statement, intended_change and reason must be nonempty text`;
|
|
80
|
+
if (!String(readArtefact(row.path)).replace(/\r\n?/gu, '\n').includes(row.statement))
|
|
81
|
+
return `changed_statements[${i}].statement must be an exact excerpt of ${row.path}`;
|
|
82
|
+
return null;
|
|
83
|
+
};
|
|
84
|
+
const changeProblems = [
|
|
85
|
+
...(proposal.policy_version === 2 ? [] : ['policy_version must be 2']),
|
|
86
|
+
...(proposal.initiating_phase === phase ? [] : [`initiating_phase must be "${phase}"`]),
|
|
87
|
+
...(Array.isArray(changed) && changed.length ? changed.map(statementProblem).filter(Boolean) : ['changed_statements must be a nonempty list']),
|
|
88
|
+
...(Array.isArray(changed) && changed.some(row => row?.type === proposal.source_gate) ? [] : [`changed_statements must include a ${proposal.source_gate} statement`]),
|
|
89
|
+
];
|
|
90
|
+
if (changeProblems.length) return changeProblems;
|
|
74
91
|
const facts = sourceRevisionQualityFacts(state, readArtefact), assessment = proposal.quality_assessment;
|
|
75
|
-
if (!Array.isArray(assessment) || !assessment.length || assessment.length !== facts.length)
|
|
76
|
-
|
|
77
|
-
|
|
92
|
+
if (!Array.isArray(assessment) || !assessment.length || assessment.length !== facts.length)
|
|
93
|
+
return [`quality_assessment must contain exactly ${facts.length} rows, one per quality record in order`];
|
|
94
|
+
return assessment.map((row, i) => {
|
|
95
|
+
if (!exactObject(row, REVISION_QUALITY_FIELDS) || !['retain', 'reassess'].includes(row.disposition) || !nonempty(row.reason))
|
|
96
|
+
return `quality_assessment[${i}] needs exactly ${REVISION_QUALITY_FIELDS.join(', ')} with disposition retain or reassess and a nonempty reason`;
|
|
78
97
|
const { disposition, reason, ...proof } = row;
|
|
79
|
-
if (canonicalJson(proof) !== canonicalJson(facts[i])) return
|
|
98
|
+
if (canonicalJson(proof) !== canonicalJson(facts[i])) return `quality_assessment[${i}] must copy quality record ${canonicalJson(facts[i])} unchanged`;
|
|
80
99
|
const analysis = proposal.impact_assessment.analyses.find(item => item.type === row.record.type);
|
|
81
|
-
if (analysis && (analysis.disposition !== disposition || analysis.path !== row.record.path || analysis.digest !== row.record.digest))
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
&& !(proposal.source_gate === 'UR' && analysis)
|
|
85
|
-
|
|
100
|
+
if (analysis && (analysis.disposition !== disposition || analysis.path !== row.record.path || analysis.digest !== row.record.digest))
|
|
101
|
+
return `quality_assessment[${i}].disposition must equal the ${row.record.type} analysis disposition`;
|
|
102
|
+
if (disposition === 'retain' && !(row.association === 'current' && !row.sources.some(source => affected.includes(source.type))
|
|
103
|
+
&& !(proposal.source_gate === 'UR' && analysis))) return `quality_assessment[${i}] must be reassess: its record is not current or depends on a changed source`;
|
|
104
|
+
return null;
|
|
105
|
+
}).filter(Boolean);
|
|
86
106
|
}
|
|
87
107
|
|
|
88
108
|
export function sourceRevisionImpact(proposal, activeBindings) {
|
|
@@ -41,6 +41,15 @@ export function readSelectedRun(root, id) {
|
|
|
41
41
|
last_updated_at: parsed.meta.updated_at || stateStats.mtime.toISOString() };
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
+
// The entry names discovery treats as runs: every non-dot entry of the runs folder, sorted. Empty when the
|
|
45
|
+
// folder is missing or no directory. It reads no layout, so the companion run view also counts the run
|
|
46
|
+
// folders of a store whose layout is not supported (PRD AC-002, TP T-004).
|
|
47
|
+
export function runFolderEntries(root) {
|
|
48
|
+
const dir = join(root, ".agdf", "control", "runs");
|
|
49
|
+
if (!existsSync(dir) || lstatKindSync(dir) !== 'directory') return [];
|
|
50
|
+
return readdirSync(dir).filter((entry) => !entry.startsWith(".")).sort();
|
|
51
|
+
}
|
|
52
|
+
|
|
44
53
|
function discoverCapturedRuns(root) {
|
|
45
54
|
const dir = join(root, ".agdf", "control", "runs");
|
|
46
55
|
if (!existsSync(dir)) return [];
|
|
@@ -48,9 +57,7 @@ function discoverCapturedRuns(root) {
|
|
|
48
57
|
if (lstatKindSync(dir) !== 'directory') {
|
|
49
58
|
return [invalidRun("<repository>", dir)];
|
|
50
59
|
}
|
|
51
|
-
return
|
|
52
|
-
.filter((entry) => !entry.startsWith("."))
|
|
53
|
-
.sort()
|
|
60
|
+
return runFolderEntries(root)
|
|
54
61
|
.map((id) => {
|
|
55
62
|
const directory = join(dir, id);
|
|
56
63
|
const path = join(directory, "RUN_STATE.md");
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { extractField } from '../control-evaluation/verified-change.js';
|
|
2
2
|
import { transitionDecisionForRunState } from '../control-evaluation/gate-policy.js';
|
|
3
|
-
import { runDocumentPath, runEvidencePath, isRunDataPath } from './run-identity.js';
|
|
3
|
+
import { runDocumentPath, runEvidencePath, isRunDataPath, RUN_STEP_SLOTS } from './run-identity.js';
|
|
4
4
|
import { resolutionRecordVersion } from './input-resolution.js';
|
|
5
5
|
import { resolveControlCommandTarget } from './approval-command-contract.js';
|
|
6
6
|
|
|
@@ -48,7 +48,7 @@ import { withRunMutationLock, writeRunMutationLocked } from './run-mutation.js';
|
|
|
48
48
|
import { APPROVAL_GATES as DECISION_GATES, REVISION_ID_PATTERN } from './run-identity.js';
|
|
49
49
|
import { runSealState, artefactFileDigest } from './run-seal.js';
|
|
50
50
|
import { inspectUxIntentDecision } from '../control-evaluation/definition-sources.js';
|
|
51
|
-
import { readReportDecision } from '../control-evaluation/report-decision.js';
|
|
51
|
+
import { readReportDecision, REPORT_DECISION_FORMAT } from '../control-evaluation/report-decision.js';
|
|
52
52
|
import { prepareVerifiedChangeRecording } from './run-verified-change.js';
|
|
53
53
|
|
|
54
54
|
// Record one typed transition and its owned files in a single sealed revision.
|
|
@@ -77,6 +77,8 @@ function readRunArtefact(root, runId, rawPath, limit = 131072) {
|
|
|
77
77
|
// Review reports are read within the bound of the closeout quality inspection (inspectQaReports).
|
|
78
78
|
const REVIEW_REPORT_LIMIT = 262144;
|
|
79
79
|
// Every recording of a review or QA report applies the closeout quality rules; at most 64 diagnostics are returned.
|
|
80
|
+
// The staged report must state the result where the parser reads it.
|
|
81
|
+
const unconfirmedDecision = runId => rejected(runId, 'internal_result_unconfirmed', { recovery: REPORT_DECISION_FORMAT.instruction });
|
|
80
82
|
const findingsRefusal = (runId, diagnostics) => rejected(runId, 'review_findings_invalid',
|
|
81
83
|
{ diagnostics: diagnostics.slice(0, 64), ...(diagnostics.length > 64 ? { diagnostics_truncated: true } : {}) });
|
|
82
84
|
function qaReportDiagnostics(root, runId, qa, control, proposedContent) {
|
|
@@ -132,7 +134,7 @@ function recordRunStepLocked(root, input, { policy, date, afterWrite, operationC
|
|
|
132
134
|
stagedSource = resolveMaterial?.(input.sourceBinding);
|
|
133
135
|
const slot = input.step === 'internal' ? input.internalStep : input.step === 'verified_change' ? 'Verified Change'
|
|
134
136
|
: input.step === 'closeout' && stagedSource?.slot === 'Verified Change' ? 'Verified Change'
|
|
135
|
-
:
|
|
137
|
+
: RUN_STEP_SLOTS[input.step];
|
|
136
138
|
if (!stagedSource || stagedSource.slot !== slot) return rejected(runId, 'material_slot_mismatch');
|
|
137
139
|
const file = slot === 'EVIDENCE' ? `EVIDENCE-${stagedSource.digest.slice(7)}.md`
|
|
138
140
|
: ({ UR: 'UR.md', OR: 'OR.md', 'Verified Change': 'VERIFIED_CHANGE.md', ...INTERNAL_STEP_FILES })[slot];
|
|
@@ -178,7 +180,7 @@ function recordRunStepLocked(root, input, { policy, date, afterWrite, operationC
|
|
|
178
180
|
if (step === "review") {
|
|
179
181
|
if (!['CR', 'Quick Task Execution'].includes(before.current_gate)
|
|
180
182
|
|| !['pass', 'revise', 'block'].includes(input.decision)) return rejected(runId, "review_step_not_ready");
|
|
181
|
-
if (readReportDecision(operationSource.content) !== input.decision) return
|
|
183
|
+
if (readReportDecision(operationSource.content) !== input.decision) return unconfirmedDecision(runId);
|
|
182
184
|
const diagnostics = reviewFindingDiagnostics('CR', operationSource.content, { decision: input.decision });
|
|
183
185
|
if (diagnostics.length) return findingsRefusal(runId, diagnostics);
|
|
184
186
|
}
|
|
@@ -218,7 +220,7 @@ function recordRunStepLocked(root, input, { policy, date, afterWrite, operationC
|
|
|
218
220
|
if (!checked.well_formed || !checked.supported || checked.decision !== input.decision
|
|
219
221
|
|| input.decision === 'not_applicable' && (control.source_revision_ux_required || before.next_operation?.analysis === input.internalStep)) return rejected(runId, 'internal_result_unconfirmed');
|
|
220
222
|
} else {
|
|
221
|
-
if (readReportDecision(operationSource.content, { allowNotApplicable: true }) !== input.decision) return
|
|
223
|
+
if (readReportDecision(operationSource.content, { allowNotApplicable: true }) !== input.decision) return unconfirmedDecision(runId);
|
|
222
224
|
}
|
|
223
225
|
if (CORRECTABLE_REVIEWS.includes(input.internalStep)) {
|
|
224
226
|
const diagnostics = reviewFindingDiagnostics(input.internalStep, operationSource.content, { decision: input.decision });
|
|
@@ -306,6 +308,7 @@ function recordRunStepLocked(root, input, { policy, date, afterWrite, operationC
|
|
|
306
308
|
// The quality obligation still names the decisive finding and, where available, its correction path.
|
|
307
309
|
const qa = readiness.findings.includes('closeout_quality_unconfirmed') ? inspectQaReports(root, control, runId, 'pass', 64, true) : null;
|
|
308
310
|
return rejected(runId, 'closeout_obligations_unfulfilled', { findings: readiness.findings,
|
|
311
|
+
...(readiness.expected ? { expected: readiness.expected } : {}),
|
|
309
312
|
...(qa?.reason ? { reason_detail: closeoutQualityDetail(qa, control) } : {}) });
|
|
310
313
|
}
|
|
311
314
|
if (!exactApprovedArtefacts(root, control)) return rejected(runId, 'approved_source_proof_invalid');
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// One owner for a Run's human title and orienting Objective. Pure: no `node:` import, so the run
|
|
2
|
+
// inventory, the cockpit, the companion run view and the status card share exactly this rule.
|
|
3
|
+
// Precedence: registered UR heading, then the authored Objective, then the normalized Run ID.
|
|
4
|
+
import { isDecisionContentPlaceholder } from "../control-evaluation/decision-content-placeholder.js";
|
|
5
|
+
|
|
6
|
+
// The run-ID title every reader shows when no authored title exists.
|
|
7
|
+
export function normalizedRunTitle(runId) {
|
|
8
|
+
const words = String(runId ?? "").replace(/[._-]+/g, " ").replace(/\s+/g, " ").trim();
|
|
9
|
+
return words ? words.replace(/\b\p{L}/gu, (letter) => letter.toUpperCase()) : "AGDF run";
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// A heading as display text: no leading hashes and no inline Markdown marks.
|
|
13
|
+
export function plainHeading(value) {
|
|
14
|
+
return String(value ?? "").replace(/^#+\s*/u, "").replace(/[`*_]/gu, "").replace(/\s+/gu, " ").trim();
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Lines of one level-two section up to the next heading; an empty section stays empty.
|
|
18
|
+
function sectionLines(text, heading) {
|
|
19
|
+
const lines = text.split("\n"), start = lines.findIndex(line => line.trimEnd() === `## ${heading}`);
|
|
20
|
+
if (start < 0) return [];
|
|
21
|
+
const rest = lines.slice(start + 1), end = rest.findIndex(line => /^#{1,2} /u.test(line));
|
|
22
|
+
return end < 0 ? rest : rest.slice(0, end);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// The first paragraph of the Objective, so hard-wrapped objectives stay whole. A template prompt,
|
|
26
|
+
// a status word or a bare generated Run ID is no orientation and yields null.
|
|
27
|
+
export function authoredObjective(runContent) {
|
|
28
|
+
const text = String(runContent ?? "").replace(/^/u, "").replace(/\r\n?/gu, "\n");
|
|
29
|
+
const lines = sectionLines(text, "Objective").map(value => value.trim()), first = lines.findIndex(Boolean);
|
|
30
|
+
if (first < 0) return null;
|
|
31
|
+
const paragraph = lines.slice(first), end = paragraph.indexOf("");
|
|
32
|
+
const value = (end < 0 ? paragraph : paragraph.slice(0, end)).join(" ")
|
|
33
|
+
.replace(/^(?:[-*>]|#+|\d+\.)\s+/u, "").replace(/\*\*|__|`/gu, "").replace(/\s+/gu, " ").trim();
|
|
34
|
+
return isDecisionContentPlaceholder(value) ? null : value;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// `urHeading` is the registered UR document heading without its "UR:" prefix, when the caller read it.
|
|
38
|
+
export function runIdentity({ runId, runContent, urHeading } = {}) {
|
|
39
|
+
const objective = authoredObjective(runContent), ur = plainHeading(urHeading);
|
|
40
|
+
if (ur) return { title: ur, title_source: "ur", objective };
|
|
41
|
+
if (objective) return { title: objective, title_source: "objective", objective };
|
|
42
|
+
return { title: normalizedRunTitle(runId), title_source: "run_id", objective: null };
|
|
43
|
+
}
|
|
@@ -4,12 +4,14 @@ import { createDeliveryContinuationService } from "./delivery-continuation/servi
|
|
|
4
4
|
import { createControlInspectService } from "./control-inspect/service.js";
|
|
5
5
|
import { createRunCommandService } from "./control-state/run-command-service.js";
|
|
6
6
|
import { createRunMaterialStore } from './control-state/run-material.js';
|
|
7
|
+
import { withMaterialRecordingCalls } from './control-inspect/material-recording-calls.js';
|
|
7
8
|
import { evaluateGateCheck } from './control-evaluation/gate-check.js';
|
|
8
9
|
import { evaluateDoctor } from './control-evaluation/doctor.js';
|
|
9
10
|
export { createResourceContext, resources } from "./resources/context.js";
|
|
10
11
|
export function createCoreServices({ resources: context = resources, observers = {}, runtimeBinding } = {}) {
|
|
11
12
|
const contracts = { runtimeContractModules: () => runtimeContractModules(context.pluginDefinition), readRuntimeContract: module => readRuntimeContract(module, { context }), readSkillRuntimeContracts: skill => readSkillRuntimeContracts(skill, { context }) };
|
|
12
|
-
const
|
|
13
|
+
const store = createRunMaterialStore();
|
|
14
|
+
const material = Object.freeze({ ...store, stage: input => withMaterialRecordingCalls(input, store.stage(input)) });
|
|
13
15
|
const reads = observers.gitObservation ? { ...observers,
|
|
14
16
|
evaluateGateCheck: observers.evaluateGateCheck ?? ((root, selection) => evaluateGateCheck(root, selection, observers.gitObservation)),
|
|
15
17
|
evaluateDoctor: observers.evaluateDoctor ?? ((root, selection) => evaluateDoctor(root, selection, observers.gitObservation)),
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { INSTALL_SETUP_STATES, INSTALL_ACTIONS, INSTALL_FAILURE_PHASES, INSTALL_FAILURE_CODES,
|
|
2
|
-
DISPATCH_RECOVERY_CODES, CODEX_HOOK_STATES, DECISION_CARD_LABEL_KEYS, FLOW_EVIDENCE_LABEL_KEYS
|
|
2
|
+
DISPATCH_RECOVERY_CODES, CODEX_HOOK_STATES, DECISION_CARD_LABEL_KEYS, FLOW_EVIDENCE_LABEL_KEYS,
|
|
3
|
+
COMPANION_MOODS, COMPANION_UNREADABLE_REASONS } from "./interaction-catalog.js";
|
|
3
4
|
|
|
4
5
|
// Build-time validation, not a second vocabulary. Unknown and missing copy both fail closed.
|
|
5
6
|
export function validateInteractionCatalog(registry) {
|
|
@@ -18,6 +19,11 @@ export function validateInteractionCatalog(registry) {
|
|
|
18
19
|
check(`${language}.skillDispatch.recoveries`, pack.skillDispatch?.recoveries, DISPATCH_RECOVERY_CODES);
|
|
19
20
|
check(`${language}.decisionCard`, pack.decisionCard, DECISION_CARD_LABEL_KEYS);
|
|
20
21
|
check(`${language}.flowEvidence`, pack.flowEvidence, FLOW_EVIDENCE_LABEL_KEYS);
|
|
22
|
+
check(`${language}.companion.states`, pack.companion?.states, COMPANION_MOODS);
|
|
23
|
+
// Beside the moods the status line names a run view that cannot be read and a project without AGDF.
|
|
24
|
+
check(`${language}.companion.statusStates`, pack.companion?.statusStates, [...COMPANION_MOODS, "unreadable", "notSetUp"]);
|
|
25
|
+
const unreadable = pack.companion?.unreadable;
|
|
26
|
+
check(`${language}.companion.unreadable`, unreadable && Object.fromEntries(COMPANION_UNREADABLE_REASONS.map(key => [key, unreadable[key]])), COMPANION_UNREADABLE_REASONS);
|
|
21
27
|
}
|
|
22
28
|
for (const row of Object.values(CODEX_HOOK_STATES)) {
|
|
23
29
|
if (!INSTALL_SETUP_STATES[row.state]?.actions.includes(row.action)) throw new Error("AGDF_INTERACTION_CATALOG_HOOK_INVALID");
|
package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/interaction-catalog.js
CHANGED
|
@@ -96,3 +96,11 @@ export const DECISION_CARD_COPY_BUDGETS = freeze(Object.fromEntries(DECISION_CAR
|
|
|
96
96
|
'previewUnavailable', 'previewChanged', 'previewIllustrative', 'previewUnsupported'].includes(key)
|
|
97
97
|
? 'description' : 'label'
|
|
98
98
|
])));
|
|
99
|
+
|
|
100
|
+
// Companion figure moods (SD SDD-004) and the per-run reasons it names; the catalog's companion
|
|
101
|
+
// section must carry copy for exactly these keys in every locale.
|
|
102
|
+
export const COMPANION_MOODS = freeze(['laeuft', 'baut', 'wartet', 'blockiert', 'fertig', 'bereit']);
|
|
103
|
+
// The store reasons are every bounded code `boundedCode` can return (CR finding B9).
|
|
104
|
+
export const COMPANION_UNREADABLE_REASONS = freeze(['run_version_unsupported', 'run_state_invalid', 'too_large', 'missing',
|
|
105
|
+
'control_layout_unsupported', 'control_invalid', 'read_failed', 'resource_denied', 'source_changed', 'timeout', 'resource_limit',
|
|
106
|
+
'unavailable', 'exit', 'malformed']);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { RUN_ID_PATTERN } from "./control-state/run-identity.js";
|
|
2
|
-
import {
|
|
2
|
+
import { runInventoryHistoryLine } from "./control-state/run-inventory.js";
|
|
3
|
+
import { authoredObjective, normalizedRunTitle, plainHeading, runIdentity } from "./control-state/run-title.js";
|
|
3
4
|
import { DISPATCH_RECOVERY_CODES, DECISION_CARD_COPY_BUDGETS } from "./interaction-catalog.js";
|
|
4
5
|
import { TASK_TARGET_SOURCES, TASK_TARGET_UNRESOLVED_REASONS } from "./task-target-resolution.js";
|
|
5
6
|
|
|
@@ -127,7 +128,7 @@ function validateReadLocaleRegistry(registry) {
|
|
|
127
128
|
const budget = cardBudget ? budgets[cardBudget]
|
|
128
129
|
: key.startsWith("sourceRevision.") || key.startsWith("mcpErrors.") ? budgets.description
|
|
129
130
|
: key.startsWith("gateTitles.") || key.startsWith("gateActionTitles.") ? budgets.title
|
|
130
|
-
: key.includes("Description") || key.includes("fallbackReasons") || key.startsWith("runResolution.") || key.startsWith("controlSetup.") || key.startsWith("operationalValues.") || key.startsWith("gateRequiredDecisions.") || key.startsWith("taskTargetResolution.nextActions.") || key.startsWith("skillDispatch.recoveries.") || key.startsWith("skillDispatch.sourceInput.") || key.startsWith("primary.actions.") || key.startsWith("primary.afterApproval.") || key.startsWith("primary.narration.") || key.startsWith("gateRationale.") || key.startsWith("interaction.why.") || key.startsWith("mcpLifecycle.actions.") || key.startsWith("mcpLifecycle.permissionEffects.") || key.startsWith("mcpLifecycle.diagnostics.") || key.startsWith("installSetup.actions.") || key.startsWith("installSetup.blockReasons.") || key.startsWith("installSetup.runtimeConsent.") || ["installSetup.invalidChoice", "installSetup.emptyChoice", "installSetup.blockedChoice", "interaction.decisionInstruction", "interaction.decisionPrompt", "interaction.exactTextRequest", "interaction.decisionFollows", "interaction.presentationFailure", "interaction.nonReadyDecision", "primary.quality"].includes(key)
|
|
131
|
+
: key.includes("Description") || key.includes("fallbackReasons") || key.startsWith("companion.") || key.startsWith("runResolution.") || key.startsWith("controlSetup.") || key.startsWith("operationalValues.") || key.startsWith("gateRequiredDecisions.") || key.startsWith("taskTargetResolution.nextActions.") || key.startsWith("skillDispatch.recoveries.") || key.startsWith("skillDispatch.sourceInput.") || key.startsWith("primary.actions.") || key.startsWith("primary.afterApproval.") || key.startsWith("primary.narration.") || key.startsWith("gateRationale.") || key.startsWith("interaction.why.") || key.startsWith("mcpLifecycle.actions.") || key.startsWith("mcpLifecycle.permissionEffects.") || key.startsWith("mcpLifecycle.diagnostics.") || key.startsWith("installSetup.actions.") || key.startsWith("installSetup.blockReasons.") || key.startsWith("installSetup.runtimeConsent.") || ["installSetup.invalidChoice", "installSetup.emptyChoice", "installSetup.blockedChoice", "interaction.decisionInstruction", "interaction.decisionPrompt", "interaction.exactTextRequest", "interaction.decisionFollows", "interaction.presentationFailure", "interaction.nonReadyDecision", "primary.quality"].includes(key)
|
|
131
132
|
? budgets.description
|
|
132
133
|
: budgets.label;
|
|
133
134
|
if (Number.isInteger(budget) && value.length > budget) errors.push(`length_budget:${locale}:${key}`);
|
|
@@ -229,16 +230,11 @@ function stripMarkdown(value) {
|
|
|
229
230
|
.trim();
|
|
230
231
|
}
|
|
231
232
|
|
|
232
|
-
function section(content, heading) {
|
|
233
|
-
const escaped = heading.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
234
|
-
return content.match(new RegExp(`(?:^|\\n)## ${escaped}\\s*\\n([\\s\\S]*?)(?=\\n## |$)`))?.[1]?.trim() ?? "";
|
|
235
|
-
}
|
|
236
|
-
|
|
237
233
|
export { normalizedRunTitle };
|
|
238
234
|
|
|
235
|
+
// The current artefact heading names the card's document; otherwise the shared Run title rule applies.
|
|
239
236
|
export function resolveHumanRunTitle({ currentArtefactHeading, urHeading, runContent, runId }) {
|
|
240
|
-
|
|
241
|
-
return [currentArtefactHeading, urHeading, objective].map(stripMarkdown).find(Boolean) || normalizedRunTitle(runId);
|
|
237
|
+
return plainHeading(currentArtefactHeading) || runIdentity({ runId, runContent, urHeading }).title;
|
|
242
238
|
}
|
|
243
239
|
|
|
244
240
|
function displaySafeTitle(value, fallback) {
|
|
@@ -271,7 +267,7 @@ export function buildRunCandidates(runs) {
|
|
|
271
267
|
return {
|
|
272
268
|
run_id: run.run_id,
|
|
273
269
|
display_title: displaySafeTitle(title, normalizedRunTitle(run.run_id)),
|
|
274
|
-
objective: displaySafeObjective(
|
|
270
|
+
objective: displaySafeObjective(authoredObjective(run.content), normalizedRunTitle(run.run_id)),
|
|
275
271
|
current_gate: currentGate,
|
|
276
272
|
decision: String(run.control_state?.decision || "unknown").replaceAll("`", "").trim() || "unknown",
|
|
277
273
|
next_allowed_action: String(run.control_state?.next_allowed_action ?? "").trim(),
|
|
@@ -437,6 +433,29 @@ export function isOperationalValueRenderable(value, { registry, requestedLocale
|
|
|
437
433
|
}
|
|
438
434
|
}
|
|
439
435
|
|
|
436
|
+
// The localized status-card text of one operational value (next step, after-approval action),
|
|
437
|
+
// exactly as the status card renders it; null when the locale cannot render it.
|
|
438
|
+
export function localizeOperationalValue(value, { registry, requestedLocale } = {}) {
|
|
439
|
+
try {
|
|
440
|
+
const locale = resolvePresentationLocale(registry, requestedLocale);
|
|
441
|
+
const fallbackLocale = resolvePresentationLocale(registry, registry.fallbackLocale);
|
|
442
|
+
return localizedOperationalValue(value, localePack(registry, locale), localePack(registry, fallbackLocale), locale === fallbackLocale);
|
|
443
|
+
} catch {
|
|
444
|
+
return null;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
// The localized status-card text of a blocking condition, exactly as the status card renders it.
|
|
449
|
+
export function localizeBlockingCondition(value, { registry, requestedLocale } = {}) {
|
|
450
|
+
try {
|
|
451
|
+
const locale = resolvePresentationLocale(registry, requestedLocale);
|
|
452
|
+
const fallbackLocale = resolvePresentationLocale(registry, registry.fallbackLocale);
|
|
453
|
+
return localizedBlockingCondition(value, localePack(registry, locale), localePack(registry, fallbackLocale), locale === fallbackLocale);
|
|
454
|
+
} catch {
|
|
455
|
+
return null;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
|
|
440
459
|
function localizedOperationalList(value, pack, fallbackPack, fallbackLocale) {
|
|
441
460
|
if (!Array.isArray(value) || value.length === 0) return pack.primary.none;
|
|
442
461
|
const localized = value.map((item) => localizedOperationalValue(item, pack, fallbackPack, fallbackLocale));
|
|
@@ -451,6 +470,8 @@ function localizedBlockingCondition(value, pack, fallbackPack, fallbackLocale) {
|
|
|
451
470
|
const reasonKeys = {
|
|
452
471
|
AGDF_UR_REQUIREMENTS_INCOMPLETE: "blockedUrRequirements",
|
|
453
472
|
AGDF_PRD_DECISIONS_OPEN: "blockedPrdDecisionsOpen",
|
|
473
|
+
AGDF_PRD_READINESS_INCOMPLETE: "blockedPrdReadiness",
|
|
474
|
+
AGDF_APPROVAL_SUMMARY_INCOMPLETE: "blockedApprovalSummary",
|
|
454
475
|
AGDF_SD_DECISIONS_OPEN: "blockedSdDecisionsOpen",
|
|
455
476
|
AGDF_SD_TRACEABILITY_INCOMPLETE: "blockedSdTraceability",
|
|
456
477
|
AGDF_TP_TRACEABILITY_INCOMPLETE: "blockedTpTraceability",
|
package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/mcp-input-hints.js
CHANGED
|
@@ -3,6 +3,17 @@ import { CONTROL_INSPECT_FUNCTION_DEFINITION, inspectInputValidationHint } from
|
|
|
3
3
|
import { RUN_COMMAND_DESCRIPTORS, RUN_COMMAND_GROUPS, PLANNING_COMMAND_KINDS, TARGET_SCOPED_COMMAND_KINDS, schemaDiagnostics } from './control-state/run-command-schema.js';
|
|
4
4
|
import { RUN_ID_PATTERN } from './control-state/run-identity.js';
|
|
5
5
|
|
|
6
|
+
function unboundCreationHelp(input) {
|
|
7
|
+
const fields = CONTROL_INSPECT_FUNCTION_DEFINITION.inputSchema.properties;
|
|
8
|
+
const keys = ['working_directory', 'primary_target', 'target_source'];
|
|
9
|
+
if (!keys.every(key => Object.hasOwn(input, key) && !schemaDiagnostics(input[key], fields[key]).length)
|
|
10
|
+
|| !isAbsolute(input.working_directory) || !isAbsolute(input.primary_target)
|
|
11
|
+
|| input.presentation_language !== undefined && schemaDiagnostics(input.presentation_language, fields.presentation_language).length) return null;
|
|
12
|
+
return { tool: 'agdf_inspect', arguments: { operation: 'operation-contract', module: 'agdf_run/run.create',
|
|
13
|
+
...Object.fromEntries(keys.map(key => [key, input[key]])),
|
|
14
|
+
...(input.presentation_language === undefined ? {} : { presentation_language: input.presentation_language }) } };
|
|
15
|
+
}
|
|
16
|
+
|
|
6
17
|
// Presentation only: never repairs an argument or decides permission. The SDK
|
|
7
18
|
// and the canonical Core owners still validate the original request unchanged.
|
|
8
19
|
export function mcpInputValidationHint(name, input) {
|
|
@@ -28,17 +39,35 @@ export function mcpInputValidationHint(name, input) {
|
|
|
28
39
|
}
|
|
29
40
|
}
|
|
30
41
|
} else if (name === 'agdf_dispatch' || Object.hasOwn(RUN_COMMAND_GROUPS, name)) {
|
|
42
|
+
if (name === 'agdf_dispatch' && input.intake_mode !== undefined && !input.run_id) {
|
|
43
|
+
messages.push('intake_mode requires intake:true and a nonempty run_id; null is invalid. Initial unbound intake omits BOTH run_id and intake_mode. For a new MCP Run, use the supplied agdf_run/run.create form and its returned binding; never invent a Run ID. A requested resume must keep its confirmed Run/revision, not switch to new.');
|
|
44
|
+
if (input.skill_id === 'gate-check' && input.intake === true && input.intake_mode === 'new'
|
|
45
|
+
&& !['run_id', 'expected_revision_id', 'planning', 'ur_action', 'prd_action', 'sd_action', 'tp_action'].some(key => Object.hasOwn(input, key))
|
|
46
|
+
&& !input.continue_delivery) {
|
|
47
|
+
const help = unboundCreationHelp(input);
|
|
48
|
+
const correction = help && ` Next read-only schema call (no Run creation): ${JSON.stringify(help)}`;
|
|
49
|
+
if (correction && messages.join(' ').length + correction.length <= 768) return messages.join(' ') + correction;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (name === 'agdf_dispatch' && ['ur_action', 'prd_action', 'sd_action', 'tp_action'].some(k => input[k] !== undefined))
|
|
53
|
+
messages.push('Source revision actions use skill_id gate-check, intake:true, intake_mode:resume and expected_revision_id (never revision). An already bound incomplete-draft authoring continuation needs no additional author dispatch/intake: use its supplied writer forms.');
|
|
31
54
|
for (const key of name === 'agdf_dispatch' ? ['skill_id'] : ['command', 'operation_id', 'target_id', 'primary_target', 'target_source'])
|
|
32
55
|
if (!Object.hasOwn(input, key)) messages.push(`Supply ${key}.`);
|
|
33
56
|
const kind = input.command?.kind, descriptor = RUN_COMMAND_DESCRIPTORS[kind];
|
|
34
57
|
if (descriptor?.group === name) {
|
|
58
|
+
if (kind === 'run.create') messages.push('run.create accepts only command.payload.title, with the supplied original operation UUID and target. Omit run_id and expected_revision_id; do not add source, language or other payload fields. Use the returned canonical Run/revision after creation.');
|
|
59
|
+
if (['material.stage', 'planned_material.stage'].includes(kind) && input.command.payload?.action === 'put') {
|
|
60
|
+
const limit = RUN_COMMAND_DESCRIPTORS['material.stage'].payload_schema.oneOf[0].properties.files.items.properties.content.maxLength;
|
|
61
|
+
const oversized = Array.isArray(input.command.payload.files) && input.command.payload.files.find(file => typeof file?.content === 'string' && Buffer.byteLength(file.content, 'utf8') > limit);
|
|
62
|
+
if (oversized) messages.push(`put file is ${Buffer.byteLength(oversized.content, 'utf8')} UTF-8 bytes; maximum ${limit}. Preserve the entire text and use multipart begin/append/seal; measure bytes before submitting. No transfer was dispatched by this validation failure.`);
|
|
63
|
+
}
|
|
35
64
|
if (!['project.initialize', 'run.create', ...PLANNING_COMMAND_KINDS, ...TARGET_SCOPED_COMMAND_KINDS].includes(kind))
|
|
36
65
|
for (const key of ['run_id', 'expected_revision_id']) if (!Object.hasOwn(input, key)) messages.push(`Supply ${key} for ${kind}.`);
|
|
37
66
|
if (PLANNING_COMMAND_KINDS.includes(kind) && !input.planning) messages.push(`Supply planning for ${kind}; no Run/revision.`);
|
|
38
67
|
messages.push(`Read agdf_inspect operation-contract module ${name}/${kind} for this payload. Preserve the original operation UUID and requested revision.`);
|
|
39
68
|
}
|
|
40
69
|
} else return '';
|
|
41
|
-
if (Object.hasOwn(input, 'run_id') && !RUN_ID_PATTERN.test(input.run_id))
|
|
70
|
+
if (Object.hasOwn(input, 'run_id') && (typeof input.run_id !== 'string' || !RUN_ID_PATTERN.test(input.run_id)))
|
|
42
71
|
messages.push('run_id must match ^[a-z0-9][a-z0-9._-]{0,127}$. Select the canonical Run ID from the request or confirmed inventory; do not guess another Run.');
|
|
43
72
|
if (Object.hasOwn(input, 'primary_target') !== Object.hasOwn(input, 'target_source'))
|
|
44
73
|
messages.push('Supply primary_target and target_source together from the confirmed task target; working_directory alone is not target authority.');
|
package/generated/plugins/copilot/agdf/runtime/create-agdf/runtime/core/lib/mcp-tool-errors.js
CHANGED
|
@@ -6,15 +6,17 @@ const fields = ['schema_version', 'failed', 'code', 'category', 'effect_state',
|
|
|
6
6
|
const actions = {
|
|
7
7
|
correct_input: ['input', ['AGDF_PLANNED_METADATA_INVALID', 'planning_identity_mismatch', 'configuration_invalid', 'working_directory_required', 'invalid_input', 'dispatch_input_invalid', 'inspect_input_invalid', 'command_schema_invalid', 'decision_schema_invalid', 'operation_source_invalid', 'material_binding_invalid', 'material_binding_mismatch', 'material_part_invalid', 'material_part_conflict', 'material_part_offset_invalid', 'material_incomplete', 'authoring_binding_stale_or_invalid', 'authoring_cursor_stale_or_invalid']],
|
|
8
8
|
confirm_target: ['binding', ['control_layout_unsupported', 'run_version_unsupported', 'target_unresolved', 'target_binding_mismatch', 'no_reliable_target', 'explicit_target_required', 'target_invalid']],
|
|
9
|
-
refresh_binding: ['binding', ['stale_revision', 'planning_source_stale', 'planned_entry_missing', 'planned_document_missing', 'revision_mismatch', 'operation_binding_stale_or_invalid', 'artifact_revision_stale', 'decision_binding_changed', 'decision_binding_invalid', 'presentation_state_changed', 'presentation_version_decided', 'presentation_not_found', 'presentation_missing', 'operation_source_changed', 'session_expired', 'source_changed', 'snapshot_stale', 'run_missing', 'invalid_run', 'document_missing', 'recovery_binding_invalid', 'run_path_invalid', 'confirmed_git_project_required', 'AGDF_CANONICAL_SCAFFOLD_REQUIRED', 'AGDF_CANONICAL_INIT_CONFLICT', 'AGDF_CANONICAL_INIT_PARTIAL_UNOWNED', 'AGDF_CANONICAL_INIT_ORIGINAL_OPERATION_REQUIRED', 'AGDF_CANONICAL_INIT_PLAN_DRIFT', 'AGDF_CANONICAL_INIT_TARGET_DRIFT']],
|
|
9
|
+
refresh_binding: ['binding', ['stale_revision', 'material_transfer_expired', 'planning_source_stale', 'planned_entry_missing', 'planned_document_missing', 'revision_mismatch', 'operation_binding_stale_or_invalid', 'artifact_revision_stale', 'decision_binding_changed', 'decision_binding_invalid', 'presentation_state_changed', 'presentation_version_decided', 'presentation_not_found', 'presentation_missing', 'operation_source_changed', 'session_expired', 'prepared_call_unknown', 'source_changed', 'snapshot_stale', 'run_missing', 'invalid_run', 'document_missing', 'recovery_binding_invalid', 'run_path_invalid', 'confirmed_git_project_required', 'AGDF_CANONICAL_SCAFFOLD_REQUIRED', 'AGDF_CANONICAL_INIT_CONFLICT', 'AGDF_CANONICAL_INIT_PARTIAL_UNOWNED', 'AGDF_CANONICAL_INIT_ORIGINAL_OPERATION_REQUIRED', 'AGDF_CANONICAL_INIT_PLAN_DRIFT', 'AGDF_CANONICAL_INIT_TARGET_DRIFT']],
|
|
10
10
|
obtain_authority: ['permission', ['resource_denied', 'host_ui_unsupported', 'app_only_mediation_not_qualified', 'approval_required', 'confirmation_required', 'command_group_disabled', 'permission_denied', 'closeout_not_ready']],
|
|
11
11
|
inspect_operation: ['uncertain', ['effect_unknown', 'recovery_required', 'original_operation_unconfirmed', 'operation_payload_conflict', 'another_pending_operation', 'decision_pending', 'decision_result_unknown', 'dispatch_timeout', 'dispatch_worker_termination_unconfirmed', 'generation_connection_lost', 'generation_response_unknown', 'generation_result_limit', 'command_result_budget_exceeded']],
|
|
12
|
-
retry_after_prerequisite: ['runtime', ['dispatch_busy', 'busy', 'dispatch_cancelled', 'cancelled', 'resource_limit', 'timeout', 'dispatch_output_too_large', 'inspect_output_too_large', 'lifecycle_ineligible', 'generation_unavailable', 'generation_capacity_protected', 'generation_input_limit', 'connection_closed', 'connection_control_unavailable', 'generation_route_capacity', 'generation_replacement_busy', 'connection_control_capacity', '
|
|
12
|
+
retry_after_prerequisite: ['runtime', ['dispatch_busy', 'busy', 'dispatch_cancelled', 'cancelled', 'resource_limit', 'timeout', 'dispatch_output_too_large', 'inspect_output_too_large', 'lifecycle_ineligible', 'generation_unavailable', 'generation_capacity_protected', 'generation_input_limit', 'connection_closed', 'connection_control_unavailable', 'generation_route_capacity', 'generation_replacement_busy', 'connection_control_capacity', 'prepared_call_store_unavailable', 'read_unavailable', 'read_failed', 'diagnostic_cursor_invalid', 'material_resource_limit', 'material_state_unavailable', 'delivery_state_unavailable', 'delivery_already_selected', 'decision_display_unconfirmed']],
|
|
13
13
|
repair_runtime: ['runtime', ['runtime_version_mismatch', 'runtime_provenance_invalid']],
|
|
14
14
|
stop: ['unknown', ['dispatch_worker_failed', 'generation_runtime_failed', 'tool_result_invalid', 'unclassified_tool_failure', 'generation_manifest_incompatible']],
|
|
15
15
|
};
|
|
16
16
|
const causes = new Map(Object.entries(actions).flatMap(([action, [category, codes]]) => codes.map(code => [code, { action, category }])));
|
|
17
|
-
|
|
17
|
+
// The command tools of the MCP tool-error contract; every other tool is a read. Companion events use the same list.
|
|
18
|
+
export const COMMAND_TOOL_NAMES = Object.freeze(['agdf_project', 'agdf_run', 'agdf_prepare', 'agdf_record', 'agdf_approve', 'agdf_revise', 'agdf_closeout', 'agdf_decision_action']);
|
|
19
|
+
const commandNames = new Set(COMMAND_TOOL_NAMES);
|
|
18
20
|
export const isEphemeralControlCommand = (name, input = {}) => commandNames.has(name)
|
|
19
21
|
&& ['presentation.deliver', 'material.stage', 'planned_material.stage'].includes(input.command?.kind);
|
|
20
22
|
const commandOutcomes = new Set(['accepted', 'already_applied', 'rejected', 'recovery_required', 'effect_unknown']);
|
|
@@ -23,7 +23,7 @@ export function canonicalInitPlan(languagePreference, context = resources, { lay
|
|
|
23
23
|
{ path: '.agdf/control/README.md', content: load(dirname(root), 'README.md') }];
|
|
24
24
|
for (const store of ['runs', 'planned'])
|
|
25
25
|
files.push({ path: `.agdf/control/${store}/.gitkeep`, content: '' });
|
|
26
|
-
for (const name of ['SOT_REGISTRY.md', 'CONTEXT_GRAPH.md', 'AGENT_QUALITY_CONTRACTS.json'])
|
|
26
|
+
for (const name of ['SOT_REGISTRY.md', 'CONTEXT_GRAPH.md', 'AGENT_QUALITY_CONTRACTS.json', 'BRAND.md'])
|
|
27
27
|
files.push({ path: `.agdf/control/${name}`, content: load(root, name) });
|
|
28
28
|
for (const id of ['UR', 'BROWNFIELD_REVIEW', 'VERIFIED_CHANGE', 'PRD', 'UX_INTENT_DEFINITION', 'SD', 'TP', 'QA_REPORT', 'OR']) {
|
|
29
29
|
resolveArtefactTemplatePath(id, context);
|
|
@@ -196,7 +196,8 @@ const OWNER_MCP_DISPATCHER_RUNTIME_ENTRIES = Object.freeze([...WORKER_MCP_DISPAT
|
|
|
196
196
|
'lib/mcp-owner-protocol.js', 'lib/mcp-lifecycle/facade-runtime.js', 'lib/mcp-lifecycle/facade-thread-entry.js',
|
|
197
197
|
'lib/mcp-lifecycle/owner-client.js', 'lib/mcp-lifecycle/thread-owner.js']);
|
|
198
198
|
const DEFAULT_RESOURCE_ENTRIES = Object.freeze(['generated/plugins/agdf/meta/agdf-defaults.json', 'generated/plugins/agdf/meta/agdf-defaults.schema.json']);
|
|
199
|
-
|
|
199
|
+
const PREPARED_JOURNAL_ENTRY = 'lib/mcp-lifecycle/prepared-call-journal.js';
|
|
200
|
+
export const MCP_DISPATCHER_RUNTIME_ENTRIES = Object.freeze([...OWNER_MCP_DISPATCHER_RUNTIME_ENTRIES, PREPARED_JOURNAL_ENTRY, ...DEFAULT_RESOURCE_ENTRIES]);
|
|
200
201
|
function declaresOwnerEntry(root) {
|
|
201
202
|
const entry = readJson(join(root, 'package.json'))?.exports?.['./mcp-owner-protocol'];
|
|
202
203
|
if (entry !== undefined && entry !== './lib/mcp-owner-protocol.js') throw Error('AGDF_MCP_OWNER_EXPORT_INVALID');
|
|
@@ -222,8 +223,14 @@ const legacyDispatcherEntries = root => existsSync(join(root, "runtime", "core")
|
|
|
222
223
|
const dispatcherEntries = root => {
|
|
223
224
|
const entries = legacyDispatcherEntries(root);
|
|
224
225
|
const protocol = join(root, 'lib/mcp-protocol-runtime.js');
|
|
225
|
-
|
|
226
|
+
const withResources = entries.includes('lib/mcp-protocol-runtime.js') && readFileSync(protocol, 'utf8').includes('resolveMcpInput')
|
|
226
227
|
? [...entries, ...DEFAULT_RESOURCE_ENTRIES] : entries;
|
|
228
|
+
// The already-digested consuming module selects this new dependency. Older
|
|
229
|
+
// images keep their original digest; deleting a required new helper cannot
|
|
230
|
+
// masquerade as a historical image or silently downgrade its inventory.
|
|
231
|
+
return entries.includes('lib/mcp-lifecycle/package.js')
|
|
232
|
+
&& readFileSync(join(root, 'lib/mcp-lifecycle/package.js'), 'utf8').includes("from './prepared-call-journal.js'")
|
|
233
|
+
? [...withResources, PREPARED_JOURNAL_ENTRY] : withResources;
|
|
227
234
|
};
|
|
228
235
|
|
|
229
236
|
// Projection and digesting select the same actual declared image. Old packages
|
|
@@ -31,8 +31,8 @@ export const SKILL_DISPATCH_PRESENTATION_LANGUAGE_DESCRIPTION = "MCP reply-langu
|
|
|
31
31
|
const COMPLETE_DISPATCH_REQUIRED = Object.freeze(['skill_id', 'presentation_language', 'working_directory']);
|
|
32
32
|
export const SKILL_DISPATCH_PRESENTATION_LANGUAGE_RECOVERY = "Provide one well-formed BCP 47 presentation_language tag and retry once.";
|
|
33
33
|
export const SKILL_DISPATCH_TERMINAL_RESPONSE_DESCRIPTION = "For a result with `terminal: true`, the entire assistant response must consist only of host_action.text, copied verbatim. Add no question, explanation, heading, citation, link or other surrounding text; do not translate or reformat it; invoke no later tool and stop.";
|
|
34
|
-
export const SKILL_DISPATCH_INTAKE_DESCRIPTION = "Set true only with skill_id gate-check when the governed delivery intake (catalog delivery.start) is the active route; delivery wins mixed intent, so a gate-check invocation that asks for a change also sets it. Omit
|
|
35
|
-
export const SKILL_DISPATCH_INTAKE_CONTINUATION_DESCRIPTION = "For intake_continuation phase resolve_delivery_run, match the request to supplied UR scope evidence; resume one same-scope run with its expected_revision_id,
|
|
34
|
+
export const SKILL_DISPATCH_INTAKE_DESCRIPTION = "Set true only with skill_id gate-check when the governed delivery intake (catalog delivery.start) is the active route; delivery wins mixed intent, so a gate-check invocation that asks for a change also sets it. Without a confirmed Run, omit BOTH run_id and intake_mode. Omit intake for status, approval or next-step questions. It never grants approval or delivery authority.";
|
|
35
|
+
export const SKILL_DISPATCH_INTAKE_CONTINUATION_DESCRIPTION = "For intake_continuation phase resolve_delivery_run, match the request to supplied UR scope evidence; resume one same-scope run with its expected_revision_id. A new MCP Run uses the supplied agdf_run/run.create form, then its returned Run/revision; never invent an ID or use intake_mode:new without run_id. Ask only about genuinely ambiguous work, never for technical Run IDs. Other phases execute continuation.steps in order; presentation_required shows run-present text and waits for a NEW deliberate response. Preparation approves no gate.";
|
|
36
36
|
export const SKILL_DISPATCH_QA_CANDIDATES_DESCRIPTION = "For a qa-gate skill_continuation, control.candidate_runs is the complete canonical active-run inventory when run selection is unresolved, otherwise an empty array. Use its run_id, objective, normalized current_gate, decision and revision_id fields as data; filter by current_gate: QA and do not rescan run files, invent candidates or omit returned QA candidates.";
|
|
37
37
|
|
|
38
38
|
// skill_id is required, so these constraints still run for every valid request.
|
|
@@ -67,11 +67,11 @@ export const SKILL_DISPATCH_FUNCTION_DEFINITION = deepFreeze({
|
|
|
67
67
|
description: "Authority source for primary_target. Supply it only with primary_target and only when exactly one listed meaning applies; otherwise omit both fields.",
|
|
68
68
|
},
|
|
69
69
|
primary_target: { type: "string", minLength: 1, maxLength: 4096, description: "Absolute governance-target path paired with target_source. Never derive it from working_directory alone." },
|
|
70
|
-
run_id: { type: "string", pattern: RUN_ID_PATTERN.source, description: "Canonical run identifier. Select an existing run from an explicit request, confirmed continuation or unequivocal same-scope assignment after resolve_delivery_run. Scope assignment must use expected_revision_id.
|
|
70
|
+
run_id: { type: "string", pattern: RUN_ID_PATTERN.source, description: "Canonical run identifier. Select an existing run from an explicit request, confirmed continuation or unequivocal same-scope assignment after resolve_delivery_run. Scope assignment must use expected_revision_id. Initial unbound intake omits BOTH run_id and intake_mode, never null. New MCP Runs use agdf_run/run.create and its returned binding; never invent an ID." },
|
|
71
71
|
planning: { ...PLANNING_SCOPE_SCHEMA, description: 'Explicit ur-definition planning mode before any Run. Use one selected plan and source digest (null for capture); no delivery intake or gate approval.' },
|
|
72
72
|
expected_revision_id: { type: "string", pattern: REVISION_ID_PATTERN.source, description: "Revision from the resolve_delivery_run candidate used for scope matching. Requires intake true, intake_mode resume and run_id. Changed or unavailable binding returns fresh assignment evidence before gate evaluation; it never adopts another run automatically." },
|
|
73
73
|
intake: { type: "boolean", description: SKILL_DISPATCH_INTAKE_DESCRIPTION },
|
|
74
|
-
intake_mode: { type: "string", enum: ["new", "resume"], description: "
|
|
74
|
+
intake_mode: { type: "string", enum: ["new", "resume"], description: "Requires intake true and run_id. Omit with run_id for initial unbound intake. resume continues the exact bound run; new is the prospective-ID CLI route, not MCP Run creation. For a new MCP Run, follow the supplied agdf_run/run.create form. Never infer new from ambiguous continuation." },
|
|
75
75
|
ur_action: { type: "string", enum: ["revise"], description: "Explicit user intent to revise the bound unapproved UR. Requires gate-check, intake true, intake_mode resume, run_id and expected_revision_id; never approval." },
|
|
76
76
|
prd_action: { type: "string", enum: ["revise"], description: "Explicit user intent to revise the bound unapproved PRD. Requires gate-check, intake true, intake_mode resume, run_id and expected_revision_id; never approval." },
|
|
77
77
|
sd_action: { type: "string", enum: ["revise"], description: "Explicit user intent to revise the bound unapproved SD. Requires gate-check, intake true, intake_mode resume, run_id and expected_revision_id; never approval." },
|
|
@@ -324,6 +324,8 @@ export function parseSkillDispatchFunctionArguments(argumentsValue, trustedConte
|
|
|
324
324
|
if (Boolean(argumentsValue.target_source) !== Boolean(argumentsValue.primary_target)) {
|
|
325
325
|
throw new SkillDispatchInputError("primary_target", "target_source and primary_target must be supplied together");
|
|
326
326
|
}
|
|
327
|
+
if (argumentsValue.run_id !== undefined && schemaDiagnostics(argumentsValue.run_id, schema.properties.run_id).length)
|
|
328
|
+
throw new SkillDispatchInputError('run_id', 'run_id must be a canonical string; omit it with intake_mode for unbound intake');
|
|
327
329
|
const rawInput = {
|
|
328
330
|
skillId: argumentsValue.skill_id,
|
|
329
331
|
presentationLanguage: argumentsValue.presentation_language,
|
|
@@ -8,6 +8,7 @@ import { isDurableApprovalArtefactPresent } from "../control-evaluation/gate-che
|
|
|
8
8
|
import { extractField } from "../control-evaluation/verified-change.js";
|
|
9
9
|
import { resolveArtifactPresentationLanguages } from "../resources/context.js";
|
|
10
10
|
import { ARTEFACT_TEMPLATE_IDS, resolveArtefactTemplatePath } from "../resources/artefact-templates.js";
|
|
11
|
+
import { readinessFindingsNote } from "./readiness-findings.js";
|
|
11
12
|
|
|
12
13
|
export const DELIVERY_INTAKE_OPERATION = "delivery.start";
|
|
13
14
|
|
|
@@ -81,6 +82,7 @@ export function urDefinitionPhase(targetDir, control, input) {
|
|
|
81
82
|
artifact_path: canonicalPath, template_path: resolveArtefactTemplatePath(ARTEFACT_TEMPLATE_IDS.UR), draft_registered: registered,
|
|
82
83
|
...(input.intake ? { operation_id: DELIVERY_INTAKE_OPERATION } : {}),
|
|
83
84
|
instruction: "Execute ur-definition with the original request and answered context for this exact unapproved UR. Follow the focused contract, record through the existing canonical writer, then redispatch gate-check. Dispatch approves no gate; a changed draft requires a new presentation and a new deliberate response."
|
|
84
|
-
+ (control.ur_readiness
|
|
85
|
+
+ readinessFindingsNote(control.ur_readiness)
|
|
86
|
+
+ (control.ur_readiness?.unfinished_placeholders ? ` Unfinished placeholders by section (replace with concrete text; literal syntax belongs in a code span): ${JSON.stringify(control.ur_readiness.unfinished_placeholders)}.` : ""),
|
|
85
87
|
});
|
|
86
88
|
}
|