@aiwg/cli 0.0.0-bootstrap.0 → 2026.7.18
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/LICENSE +21 -0
- package/README.md +22 -1
- package/bin/aiwg.mjs +349 -0
- package/dist/src/a2a/agent-card.js +145 -0
- package/dist/src/a2a/client.js +411 -0
- package/dist/src/a2a/hitl-cli.js +171 -0
- package/dist/src/a2a/hitl-driver.js +370 -0
- package/dist/src/a2a/hitl.js +181 -0
- package/dist/src/a2a/http.js +193 -0
- package/dist/src/a2a/jcs.js +128 -0
- package/dist/src/a2a/jws.js +187 -0
- package/dist/src/a2a/types.js +24 -0
- package/dist/src/a2a/webhook.js +240 -0
- package/dist/src/activity-log/cli.js +348 -0
- package/dist/src/activity-log/parser.js +81 -0
- package/dist/src/activity-log/types.js +50 -0
- package/dist/src/agents/agent-deployer.js +367 -0
- package/dist/src/agents/agent-packager.js +271 -0
- package/dist/src/agents/agent-validator.js +271 -0
- package/dist/src/agents/grounding/knowledge-base.js +161 -0
- package/dist/src/agents/grounding/types.js +12 -0
- package/dist/src/agents/index.js +10 -0
- package/dist/src/agents/packaged-agent-inventory.js +75 -0
- package/dist/src/agents/types.js +7 -0
- package/dist/src/api/index.d.ts +10 -0
- package/dist/src/api/index.js +10 -0
- package/dist/src/artifacts/address-parser.js +73 -0
- package/dist/src/artifacts/audit/cli.js +183 -0
- package/dist/src/artifacts/audit/drift.js +122 -0
- package/dist/src/artifacts/audit/types.js +12 -0
- package/dist/src/artifacts/backends/graphology-backend.js +160 -0
- package/dist/src/artifacts/backends/json-backend.js +129 -0
- package/dist/src/artifacts/backends/sqlite-backend.js +199 -0
- package/dist/src/artifacts/browser-export.js +622 -0
- package/dist/src/artifacts/capability-resolver.js +94 -0
- package/dist/src/artifacts/checksum-manifest.js +91 -0
- package/dist/src/artifacts/citation-parser.js +162 -0
- package/dist/src/artifacts/cli.js +1486 -0
- package/dist/src/artifacts/corpus-tools/citation-densify.js +311 -0
- package/dist/src/artifacts/corpus-tools/cli.js +393 -0
- package/dist/src/artifacts/corpus-tools/corpus-graph.js +225 -0
- package/dist/src/artifacts/corpus-tools/curator.js +186 -0
- package/dist/src/artifacts/corpus-tools/discovery-log.js +70 -0
- package/dist/src/artifacts/corpus-tools/funder-network.js +141 -0
- package/dist/src/artifacts/corpus-tools/induction-audit.js +233 -0
- package/dist/src/artifacts/corpus-tools/integrity-scan.js +202 -0
- package/dist/src/artifacts/corpus-tools/profile-communities.js +166 -0
- package/dist/src/artifacts/corpus-tools/profile-edges.js +72 -0
- package/dist/src/artifacts/corpus-tools/profile-embed.js +113 -0
- package/dist/src/artifacts/corpus-tools/profile-generate-fm.js +167 -0
- package/dist/src/artifacts/corpus-tools/profile-generate.js +181 -0
- package/dist/src/artifacts/corpus-tools/profile-metrics.js +98 -0
- package/dist/src/artifacts/corpus-tools/profile-status.js +86 -0
- package/dist/src/artifacts/corpus-tools/profile-temporal.js +139 -0
- package/dist/src/artifacts/corpus-tools/radar-init.js +93 -0
- package/dist/src/artifacts/corpus-tools/radar-report.js +118 -0
- package/dist/src/artifacts/corpus-tools/radar-shared.js +189 -0
- package/dist/src/artifacts/corpus-tools/radar-status.js +68 -0
- package/dist/src/artifacts/corpus-tools/sidecar-lint.js +233 -0
- package/dist/src/artifacts/corpus-tools/sidecar-repair.js +277 -0
- package/dist/src/artifacts/corpus-tools/snapshot.js +591 -0
- package/dist/src/artifacts/corpus-tools/source-types.js +164 -0
- package/dist/src/artifacts/corpus-tools/vision-extract.js +243 -0
- package/dist/src/artifacts/corpus-views/build.js +126 -0
- package/dist/src/artifacts/corpus-views/corpus-config.js +124 -0
- package/dist/src/artifacts/corpus-views/ref-parser.js +437 -0
- package/dist/src/artifacts/corpus-views/renderers.js +353 -0
- package/dist/src/artifacts/corpus-views/taxonomies.js +131 -0
- package/dist/src/artifacts/dep-graph.js +173 -0
- package/dist/src/artifacts/discover-facets.js +375 -0
- package/dist/src/artifacts/embedding-index.js +354 -0
- package/dist/src/artifacts/enrichment/cli.js +240 -0
- package/dist/src/artifacts/enrichment/prompt.js +47 -0
- package/dist/src/artifacts/enrichment/store.js +90 -0
- package/dist/src/artifacts/enrichment/types.js +12 -0
- package/dist/src/artifacts/fortemi-core-query-adapter.js +475 -0
- package/dist/src/artifacts/fortemi-core-sync.js +251 -0
- package/dist/src/artifacts/fortemi-shard-export.js +44 -0
- package/dist/src/artifacts/fulltext.js +108 -0
- package/dist/src/artifacts/graph-backend.js +51 -0
- package/dist/src/artifacts/graph-query.js +247 -0
- package/dist/src/artifacts/hybrid-query.js +225 -0
- package/dist/src/artifacts/index-builder.js +1089 -0
- package/dist/src/artifacts/index-reader.js +112 -0
- package/dist/src/artifacts/index-status.js +193 -0
- package/dist/src/artifacts/legacy-index-migration.js +169 -0
- package/dist/src/artifacts/move.js +154 -0
- package/dist/src/artifacts/operational-state.js +239 -0
- package/dist/src/artifacts/prebuilt-build-lock.js +49 -0
- package/dist/src/artifacts/query-engine.js +1955 -0
- package/dist/src/artifacts/source-graph.js +529 -0
- package/dist/src/artifacts/stats.js +169 -0
- package/dist/src/artifacts/types.js +606 -0
- package/dist/src/artifacts/views/cli.js +293 -0
- package/dist/src/artifacts/views/definition.js +170 -0
- package/dist/src/artifacts/views/store.js +149 -0
- package/dist/src/artifacts/views/types.js +8 -0
- package/dist/src/artifacts/watcher.js +255 -0
- package/dist/src/catalog/builtin-models.json +636 -0
- package/dist/src/catalog/cli.js +228 -0
- package/dist/src/catalog/cli.mjs +289 -0
- package/dist/src/catalog/index.js +15 -0
- package/dist/src/catalog/loader.js +217 -0
- package/dist/src/catalog/loader.mjs +251 -0
- package/dist/src/catalog/sources.json +41 -0
- package/dist/src/catalog/types.js +8 -0
- package/dist/src/channel/manager.mjs +504 -0
- package/dist/src/cli/agent-spawn.js +178 -0
- package/dist/src/cli/cli-extension-loader.js +245 -0
- package/dist/src/cli/command-log.js +275 -0
- package/dist/src/cli/config-loader.js +232 -0
- package/dist/src/cli/env.js +82 -0
- package/dist/src/cli/errors.js +150 -0
- package/dist/src/cli/find-package-root.js +40 -0
- package/dist/src/cli/git-hooks.js +250 -0
- package/dist/src/cli/handlers/agentcard.js +206 -0
- package/dist/src/cli/handlers/artifacts.js +76 -0
- package/dist/src/cli/handlers/best-practices-audit.js +280 -0
- package/dist/src/cli/handlers/cockpit.js +137 -0
- package/dist/src/cli/handlers/command-log.js +37 -0
- package/dist/src/cli/handlers/daemon.js +59 -0
- package/dist/src/cli/handlers/diagnose.js +300 -0
- package/dist/src/cli/handlers/execution-mode.js +105 -0
- package/dist/src/cli/handlers/feedback.js +341 -0
- package/dist/src/cli/handlers/help.js +147 -0
- package/dist/src/cli/handlers/index.js +302 -0
- package/dist/src/cli/handlers/init.js +179 -0
- package/dist/src/cli/handlers/install.js +129 -0
- package/dist/src/cli/handlers/issues.js +46 -0
- package/dist/src/cli/handlers/lint.js +42 -0
- package/dist/src/cli/handlers/local-executor.js +315 -0
- package/dist/src/cli/handlers/marketplace.js +168 -0
- package/dist/src/cli/handlers/mc.js +1010 -0
- package/dist/src/cli/handlers/models.js +352 -0
- package/dist/src/cli/handlers/packages.js +155 -0
- package/dist/src/cli/handlers/ralph-launcher.js +717 -0
- package/dist/src/cli/handlers/ralph.js +575 -0
- package/dist/src/cli/handlers/refresh.js +432 -0
- package/dist/src/cli/handlers/regenerate.js +336 -0
- package/dist/src/cli/handlers/repo-access.js +109 -0
- package/dist/src/cli/handlers/run.js +165 -0
- package/dist/src/cli/handlers/runtime-info.js +301 -0
- package/dist/src/cli/handlers/sandbox.js +197 -0
- package/dist/src/cli/handlers/scaffolding.js +149 -0
- package/dist/src/cli/handlers/script-runner.js +121 -0
- package/dist/src/cli/handlers/sdlc-accelerate.js +148 -0
- package/dist/src/cli/handlers/serve.js +1835 -0
- package/dist/src/cli/handlers/session.js +348 -0
- package/dist/src/cli/handlers/setup.js +440 -0
- package/dist/src/cli/handlers/skill-lint.js +367 -0
- package/dist/src/cli/handlers/skill-usage.js +74 -0
- package/dist/src/cli/handlers/steward.js +567 -0
- package/dist/src/cli/handlers/subcommands.js +1702 -0
- package/dist/src/cli/handlers/team.js +337 -0
- package/dist/src/cli/handlers/types.js +11 -0
- package/dist/src/cli/handlers/use.js +2772 -0
- package/dist/src/cli/handlers/utilities.js +703 -0
- package/dist/src/cli/handlers/version.js +134 -0
- package/dist/src/cli/handlers/workspace-context.js +93 -0
- package/dist/src/cli/handlers/workspace.js +126 -0
- package/dist/src/cli/help-generator.js +178 -0
- package/dist/src/cli/hooks/builtin/activity-log-hook.js +126 -0
- package/dist/src/cli/hooks/executor.js +96 -0
- package/dist/src/cli/hooks/index.js +15 -0
- package/dist/src/cli/hooks/registry.js +143 -0
- package/dist/src/cli/hooks/types.js +13 -0
- package/dist/src/cli/log.js +492 -0
- package/dist/src/cli/project-isolation/detect.js +70 -0
- package/dist/src/cli/project-isolation/index.js +7 -0
- package/dist/src/cli/project-isolation/signals.js +17 -0
- package/dist/src/cli/project-isolation/warning.js +102 -0
- package/dist/src/cli/prompt-utils.js +155 -0
- package/dist/src/cli/provider-deployment-plan.js +126 -0
- package/dist/src/cli/provider-resolution.js +119 -0
- package/dist/src/cli/router.js +305 -0
- package/dist/src/cli/scope-resolver.js +392 -0
- package/dist/src/cli/skill-usage.js +616 -0
- package/dist/src/cli/ui.js +224 -0
- package/dist/src/cli/watch-service.js +203 -0
- package/dist/src/cli/workflow-orchestrator.js +478 -0
- package/dist/src/cli/workspace-signals.js +321 -0
- package/dist/src/community/footer.js +14 -0
- package/dist/src/community/links.js +123 -0
- package/dist/src/community/milestones.js +46 -0
- package/dist/src/community/nudge-policy.js +93 -0
- package/dist/src/config/aiwg-config.js +883 -0
- package/dist/src/config/cli.js +703 -0
- package/dist/src/config/gitignore.js +156 -0
- package/dist/src/config/project-artifacts.js +76 -0
- package/dist/src/config/user-config.js +428 -0
- package/dist/src/config/user-registry.js +127 -0
- package/dist/src/config/workspace.js +276 -0
- package/dist/src/contributors/detect.js +39 -0
- package/dist/src/contributors/discover.js +172 -0
- package/dist/src/contributors/heuristic.js +186 -0
- package/dist/src/contributors/index.js +11 -0
- package/dist/src/contributors/types.js +13 -0
- package/dist/src/contributors/validation.js +116 -0
- package/dist/src/data/community.schema.json +43 -0
- package/dist/src/data/community.yaml +16 -0
- package/dist/src/extensions/capability-index.js +270 -0
- package/dist/src/extensions/claude-hooks-installer.js +268 -0
- package/dist/src/extensions/commands/definitions.js +3485 -0
- package/dist/src/extensions/deployment-registration.js +463 -0
- package/dist/src/extensions/index.js +22 -0
- package/dist/src/extensions/loader.js +132 -0
- package/dist/src/extensions/managed-marker.js +100 -0
- package/dist/src/extensions/manifest.js +196 -0
- package/dist/src/extensions/project-local-activity.js +114 -0
- package/dist/src/extensions/project-local-discovery.js +261 -0
- package/dist/src/extensions/project-local-doctor.js +281 -0
- package/dist/src/extensions/project-local-gitignore.js +176 -0
- package/dist/src/extensions/project-local-paths.js +121 -0
- package/dist/src/extensions/project-local-promote.js +218 -0
- package/dist/src/extensions/project-local-remove.js +373 -0
- package/dist/src/extensions/project-local-scaffold.js +252 -0
- package/dist/src/extensions/project-quickref.js +291 -0
- package/dist/src/extensions/registry.js +368 -0
- package/dist/src/extensions/shadow-resolver.js +271 -0
- package/dist/src/extensions/types.js +86 -0
- package/dist/src/extensions/upstream-registry.js +195 -0
- package/dist/src/extensions/validation.js +631 -0
- package/dist/src/features/catalog.js +88 -0
- package/dist/src/features/cli.js +197 -0
- package/dist/src/features/installer.js +57 -0
- package/dist/src/features/paths.js +14 -0
- package/dist/src/features/runtime.js +21 -0
- package/dist/src/features/status.js +134 -0
- package/dist/src/hooks/laziness-detection.js +532 -0
- package/dist/src/intake/git-history-analyzer.js +486 -0
- package/dist/src/intake/index.js +9 -0
- package/dist/src/issues/cli.js +327 -0
- package/dist/src/issues/index.js +5 -0
- package/dist/src/issues/live.js +154 -0
- package/dist/src/issues/local.js +666 -0
- package/dist/src/issues/sync.js +143 -0
- package/dist/src/issues/types.js +2 -0
- package/dist/src/issues/workflows.js +164 -0
- package/dist/src/kb/cli.js +173 -0
- package/dist/src/lint/cli.js +171 -0
- package/dist/src/lint/loader.js +225 -0
- package/dist/src/lint/reporters.js +141 -0
- package/dist/src/lint/runner.js +364 -0
- package/dist/src/lint/types.js +10 -0
- package/dist/src/marketplace/cache.js +110 -0
- package/dist/src/marketplace/identifier.js +63 -0
- package/dist/src/marketplace/registry.js +36 -0
- package/dist/src/marketplace/sources/clawhub.js +53 -0
- package/dist/src/marketplace/sources/git.js +45 -0
- package/dist/src/marketplace/types.js +9 -0
- package/dist/src/mcp/adapters/codex-runtime.js +224 -0
- package/dist/src/mcp/cli.mjs +1197 -0
- package/dist/src/mcp/elicitation.mjs +149 -0
- package/dist/src/mcp/helpers.mjs +287 -0
- package/dist/src/mcp/index.mjs +11 -0
- package/dist/src/mcp/profiles.js +263 -0
- package/dist/src/mcp/profiles.mjs +360 -0
- package/dist/src/mcp/registry.js +376 -0
- package/dist/src/mcp/registry.mjs +387 -0
- package/dist/src/mcp/server.mjs +633 -0
- package/dist/src/mcp/test-simple.mjs +271 -0
- package/dist/src/mcp/tools/command-run.mjs +101 -0
- package/dist/src/mcp/tools/discovery.mjs +291 -0
- package/dist/src/mcp/tools/interaction.mjs +87 -0
- package/dist/src/mcp/tools/orchestration.mjs +320 -0
- package/dist/src/mcp/tools/subsystems.mjs +640 -0
- package/dist/src/memory/cli.js +166 -0
- package/dist/src/memory/project-registry.js +282 -0
- package/dist/src/metrics/artifact-metrics.js +184 -0
- package/dist/src/metrics/context-budget.js +174 -0
- package/dist/src/metrics/token-counter.js +133 -0
- package/dist/src/models/config-loader.js +228 -0
- package/dist/src/models/index.js +22 -0
- package/dist/src/models/model-capabilities.v1.json +120 -0
- package/dist/src/models/model-catalog.v1.json +96 -0
- package/dist/src/models/model-discovery.js +521 -0
- package/dist/src/models/provider-models.js +73 -0
- package/dist/src/models/provider-policy.js +273 -0
- package/dist/src/models/resolver.js +245 -0
- package/dist/src/models/router.js +70 -0
- package/dist/src/models/types.js +8 -0
- package/dist/src/models/wrapper-deployment.js +178 -0
- package/dist/src/models/wrapper-route.js +54 -0
- package/dist/src/ops/cli.js +268 -0
- package/dist/src/ops/registry.js +623 -0
- package/dist/src/packages/adapters/clawhub.js +113 -0
- package/dist/src/packages/adapters/git.js +153 -0
- package/dist/src/packages/adapters/gitea.js +93 -0
- package/dist/src/packages/adapters/github.js +69 -0
- package/dist/src/packages/adapters/local-cache.js +89 -0
- package/dist/src/packages/package-registry.js +143 -0
- package/dist/src/packages/registry.js +238 -0
- package/dist/src/packages/types.js +11 -0
- package/dist/src/plugin/cross-framework-ops.js +475 -0
- package/dist/src/plugin/framework-config-loader.js +235 -0
- package/dist/src/plugin/framework-detector.js +186 -0
- package/dist/src/plugin/framework-isolator.js +341 -0
- package/dist/src/plugin/framework-migration.js +371 -0
- package/dist/src/plugin/metadata-validator.js +906 -0
- package/dist/src/plugin/plugin-installer.js +436 -0
- package/dist/src/plugin/plugin-status.js +369 -0
- package/dist/src/plugin/plugin-uninstaller.js +473 -0
- package/dist/src/plugin/registry-validator.js +344 -0
- package/dist/src/plugin/skill-command-translator.js +415 -0
- package/dist/src/plugin/workspace-creator.js +189 -0
- package/dist/src/plugin/workspace-migrator.js +821 -0
- package/dist/src/policy/authorization.js +390 -0
- package/dist/src/policy/repo-access.js +215 -0
- package/dist/src/provenance/cli.js +16 -0
- package/dist/src/providers/capability-matrix.js +300 -0
- package/dist/src/providers/capability-matrix.yaml +514 -0
- package/dist/src/providers/provider-definitions.js +977 -0
- package/dist/src/providers/provider-definitions.mjs +159 -0
- package/dist/src/providers/provider-inventory.js +169 -0
- package/dist/src/quality/feedback-ab.js +174 -0
- package/dist/src/quality/feedback-collector.js +176 -0
- package/dist/src/quality/feedback-tracker.js +123 -0
- package/dist/src/quality/patterns/adr.json +24 -0
- package/dist/src/quality/patterns/sad.json +24 -0
- package/dist/src/quality/patterns/test-plan.json +24 -0
- package/dist/src/quality/patterns/use-case.json +24 -0
- package/dist/src/quality/scoring.js +157 -0
- package/dist/src/reflections/cli.js +15 -0
- package/dist/src/release/plan.js +139 -0
- package/dist/src/research/cache/manager.js +227 -0
- package/dist/src/research/clients/arxiv.js +156 -0
- package/dist/src/research/clients/base.js +197 -0
- package/dist/src/research/clients/crossref.js +112 -0
- package/dist/src/research/clients/semantic-scholar.js +126 -0
- package/dist/src/research/clients/unpaywall.js +87 -0
- package/dist/src/research/index.js +14 -0
- package/dist/src/research/query-cli.js +336 -0
- package/dist/src/research/services/acquisition.js +313 -0
- package/dist/src/research/services/archival.js +225 -0
- package/dist/src/research/services/citation.js +279 -0
- package/dist/src/research/services/discovery.js +243 -0
- package/dist/src/research/services/documentation.js +269 -0
- package/dist/src/research/services/index.js +14 -0
- package/dist/src/research/services/provenance.js +279 -0
- package/dist/src/research/services/quality.js +370 -0
- package/dist/src/research/services/types.js +7 -0
- package/dist/src/research/storage-cli.js +20 -0
- package/dist/src/research/types.js +47 -0
- package/dist/src/resources/index.d.ts +2 -0
- package/dist/src/resources/index.js +2 -0
- package/dist/src/resources/web-release.d.ts +89 -0
- package/dist/src/resources/web-release.js +886 -0
- package/dist/src/rlm/cache/cli.js +162 -0
- package/dist/src/rlm/cache/hash.js +35 -0
- package/dist/src/rlm/cache/store.js +170 -0
- package/dist/src/rlm/cache/types.js +8 -0
- package/dist/src/rlm/cli.js +650 -0
- package/dist/src/serve/a2a-terminal-observer.js +120 -0
- package/dist/src/serve/agent-router.js +205 -0
- package/dist/src/serve/dispatch-router.js +171 -0
- package/dist/src/serve/executor-registry.js +715 -0
- package/dist/src/serve/mission-conductor.js +177 -0
- package/dist/src/serve/orchestrator-adapter.js +113 -0
- package/dist/src/serve/orchestrator-override.js +94 -0
- package/dist/src/serve/orchestrator-pty.js +133 -0
- package/dist/src/serve/pty-bridge.js +799 -0
- package/dist/src/serve/sandbox-registry.js +832 -0
- package/dist/src/serve/screen-reader.js +228 -0
- package/dist/src/serve/stack-adapters.js +68 -0
- package/dist/src/serve/telemetry.js +143 -0
- package/dist/src/skills/adapters/clawhub.js +250 -0
- package/dist/src/skills/adapters/local.js +335 -0
- package/dist/src/skills/adapters/openclaw.js +316 -0
- package/dist/src/skills/cli.js +334 -0
- package/dist/src/skills/registry.js +117 -0
- package/dist/src/skills/run.js +259 -0
- package/dist/src/skills/runtime.js +94 -0
- package/dist/src/skills/types.js +10 -0
- package/dist/src/smiths/agentsmith/demo.js +116 -0
- package/dist/src/smiths/agentsmith/examples.js +300 -0
- package/dist/src/smiths/agentsmith/generator.js +503 -0
- package/dist/src/smiths/agentsmith/index.js +11 -0
- package/dist/src/smiths/agentsmith/types.js +8 -0
- package/dist/src/smiths/commandsmith/example.js +220 -0
- package/dist/src/smiths/commandsmith/generator.js +288 -0
- package/dist/src/smiths/commandsmith/index.js +41 -0
- package/dist/src/smiths/commandsmith/templates.js +296 -0
- package/dist/src/smiths/commandsmith/types.js +7 -0
- package/dist/src/smiths/context-pipeline/aiwg-md.js +104 -0
- package/dist/src/smiths/context-pipeline/allowlist.js +195 -0
- package/dist/src/smiths/context-pipeline/claude-hook.js +127 -0
- package/dist/src/smiths/context-pipeline/discovery.js +187 -0
- package/dist/src/smiths/context-pipeline/external-links-section.js +49 -0
- package/dist/src/smiths/context-pipeline/finalization.js +147 -0
- package/dist/src/smiths/context-pipeline/generator.js +477 -0
- package/dist/src/smiths/context-pipeline/index.js +30 -0
- package/dist/src/smiths/context-pipeline/legacy-inject.js +103 -0
- package/dist/src/smiths/context-pipeline/managed-hook.js +95 -0
- package/dist/src/smiths/context-pipeline/overflow.js +212 -0
- package/dist/src/smiths/context-pipeline/parallelism-section.js +94 -0
- package/dist/src/smiths/context-pipeline/provider-policy.js +64 -0
- package/dist/src/smiths/context-pipeline/sanitizer.js +93 -0
- package/dist/src/smiths/context-pipeline/types.js +23 -0
- package/dist/src/smiths/context-pipeline/workspace-context.js +988 -0
- package/dist/src/smiths/hook-bridge/codex-translator.js +129 -0
- package/dist/src/smiths/hook-bridge/copilot-translator.js +64 -0
- package/dist/src/smiths/hook-bridge/factory-translator.js +43 -0
- package/dist/src/smiths/hook-bridge/hermes-translator.js +88 -0
- package/dist/src/smiths/hook-bridge/index.js +79 -0
- package/dist/src/smiths/hook-bridge/loader.js +116 -0
- package/dist/src/smiths/hook-bridge/shim.js +89 -0
- package/dist/src/smiths/hook-bridge/types.js +31 -0
- package/dist/src/smiths/index.js +39 -0
- package/dist/src/smiths/mcpsmith/analyzers/cli-analyzer.js +390 -0
- package/dist/src/smiths/mcpsmith/example.js +119 -0
- package/dist/src/smiths/mcpsmith/generator.js +236 -0
- package/dist/src/smiths/mcpsmith/index.js +17 -0
- package/dist/src/smiths/mcpsmith/types.js +10 -0
- package/dist/src/smiths/platform-paths.js +101 -0
- package/dist/src/smiths/skillsmith/codex-sidecar.js +85 -0
- package/dist/src/smiths/skillsmith/collision-detector.js +249 -0
- package/dist/src/smiths/skillsmith/demo.js +83 -0
- package/dist/src/smiths/skillsmith/examples.js +161 -0
- package/dist/src/smiths/skillsmith/generator.js +316 -0
- package/dist/src/smiths/skillsmith/index.js +12 -0
- package/dist/src/smiths/skillsmith/namespace-adapter.js +180 -0
- package/dist/src/smiths/skillsmith/platform-resolver.js +157 -0
- package/dist/src/smiths/skillsmith/types.js +9 -0
- package/dist/src/smiths/toolsmith/index.js +10 -0
- package/dist/src/smiths/toolsmith/runtime-discovery.mjs +710 -0
- package/dist/src/smiths/toolsmith/types.js +8 -0
- package/dist/src/storage/backends/fortemi.js +227 -0
- package/dist/src/storage/backends/fs.js +134 -0
- package/dist/src/storage/backends/logseq.js +309 -0
- package/dist/src/storage/backends/obsidian.js +233 -0
- package/dist/src/storage/cli.js +468 -0
- package/dist/src/storage/config.js +272 -0
- package/dist/src/storage/index.js +108 -0
- package/dist/src/storage/subsystem-cli.js +201 -0
- package/dist/src/storage/types.js +33 -0
- package/dist/src/testing/corpus/corpus-builder.js +383 -0
- package/dist/src/testing/corpus/ground-truth-manager.js +460 -0
- package/dist/src/testing/corpus/index.js +10 -0
- package/dist/src/testing/fixtures/index.js +9 -0
- package/dist/src/testing/fixtures/test-data-factory.js +472 -0
- package/dist/src/testing/generators/index.js +11 -0
- package/dist/src/testing/generators/test-case-generator.js +393 -0
- package/dist/src/testing/generators/test-code-generator.js +384 -0
- package/dist/src/testing/generators/use-case-parser.js +325 -0
- package/dist/src/testing/index.js +11 -0
- package/dist/src/tracker/capability-protocol.js +118 -0
- package/dist/src/update/checker.mjs +396 -0
- package/dist/src/update/notifier.mjs +235 -0
- package/dist/src/writing/content-diversifier.js +804 -0
- package/dist/src/writing/example-generator.js +959 -0
- package/dist/src/writing/example-templates.js +99 -0
- package/dist/src/writing/pattern-library.js +486 -0
- package/dist/src/writing/patterns/banned-phrases.json +4413 -0
- package/dist/src/writing/patterns/formulaic-structures.json +1300 -0
- package/dist/src/writing/patterns/generic-adjectives.json +1510 -0
- package/dist/src/writing/patterns/hedging-language.json +2096 -0
- package/dist/src/writing/patterns/transition-words.json +1285 -0
- package/dist/src/writing/patterns/weak-verbs.json +1112 -0
- package/dist/src/writing/prompt-optimizer.js +660 -0
- package/dist/src/writing/prompt-templates.js +583 -0
- package/dist/src/writing/scoring-config-loader.js +168 -0
- package/dist/src/writing/validation-engine.js +595 -0
- package/dist/src/writing/validation-rules.js +380 -0
- package/dist/src/writing/voice-analyzer.js +439 -0
- package/dist/src/writing/voice-calibration.js +661 -0
- package/dist/src/writing/voice-profiles.json +588 -0
- package/package.json +65 -9
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
// HITL orchestrator driver — glues the SSE stream consumer, envelope
|
|
2
|
+
// extractor, delivery adapter, schema validator, and reply poster
|
|
3
|
+
// together.
|
|
4
|
+
//
|
|
5
|
+
// Usage:
|
|
6
|
+
//
|
|
7
|
+
// import { A2AClient } from './client.js';
|
|
8
|
+
// import { CliHitlDeliveryAdapter } from './hitl-cli.js';
|
|
9
|
+
// import { driveHitlPromptsForTask } from './hitl-driver.js';
|
|
10
|
+
//
|
|
11
|
+
// const client = new A2AClient({ ... });
|
|
12
|
+
// await driveHitlPromptsForTask({
|
|
13
|
+
// client,
|
|
14
|
+
// taskId,
|
|
15
|
+
// adapter: new CliHitlDeliveryAdapter(),
|
|
16
|
+
// auditLog,
|
|
17
|
+
// });
|
|
18
|
+
//
|
|
19
|
+
// The driver:
|
|
20
|
+
// 1. Subscribes to the task's SSE stream.
|
|
21
|
+
// 2. For each `status-update` with `state === 'input-required'`, extracts
|
|
22
|
+
// the hitl-prompt envelope (returns silently if absent — not every
|
|
23
|
+
// input-required state carries a HITL prompt).
|
|
24
|
+
// 3. Validates the envelope, sets up a deadline-based AbortController if
|
|
25
|
+
// `envelope.deadline` is present.
|
|
26
|
+
// 4. Routes to the configured delivery adapter to collect a response.
|
|
27
|
+
// 5. Validates the response against `envelope.response_schema` using Ajv.
|
|
28
|
+
// 6. POSTs the reply Message via `client.sendMessage`. Surfaces 422
|
|
29
|
+
// `hitl_response_invalid` as a clear operator error and re-prompts.
|
|
30
|
+
// 7. Writes one audit-log entry per decision.
|
|
31
|
+
//
|
|
32
|
+
// Concurrent prompts are correlated by `prompt_id` and tracked in an
|
|
33
|
+
// in-memory Map so a single task may have multiple outstanding HITL
|
|
34
|
+
// prompts simultaneously (per spec).
|
|
35
|
+
//
|
|
36
|
+
// @issue #1255
|
|
37
|
+
import { createRequire } from 'node:module';
|
|
38
|
+
import { existsSync } from 'node:fs';
|
|
39
|
+
import { dirname, join, resolve as resolvePath } from 'node:path';
|
|
40
|
+
import { fileURLToPath } from 'node:url';
|
|
41
|
+
import { buildHitlResponseMessage, extractHitlEnvelope, validateResponseStructurally, } from './hitl.js';
|
|
42
|
+
/** Default audit log — writes to stderr as JSONL. Replace with a file/HTTP sink in production. */
|
|
43
|
+
export class StderrHitlAuditLog {
|
|
44
|
+
append(entry) {
|
|
45
|
+
process.stderr.write(JSON.stringify({ hitl_audit: entry }) + '\n');
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
49
|
+
let _ajvCompile = null;
|
|
50
|
+
let _ajvBootstrapped = false;
|
|
51
|
+
function bootstrapAjv() {
|
|
52
|
+
if (_ajvBootstrapped)
|
|
53
|
+
return;
|
|
54
|
+
_ajvBootstrapped = true;
|
|
55
|
+
try {
|
|
56
|
+
const require = createRequire(fileURLToPath(import.meta.url));
|
|
57
|
+
const projectRoot = resolvePath(dirname(fileURLToPath(import.meta.url)), '..', '..');
|
|
58
|
+
const candidates = [
|
|
59
|
+
join(projectRoot, 'node_modules', 'ajv', 'dist', '2020.js'),
|
|
60
|
+
join(projectRoot, 'node_modules', 'ajv', 'dist', 'ajv.js'),
|
|
61
|
+
];
|
|
62
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
63
|
+
let Ajv = null;
|
|
64
|
+
for (const p of candidates) {
|
|
65
|
+
if (existsSync(p)) {
|
|
66
|
+
try {
|
|
67
|
+
Ajv = require(p);
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
/* try next */
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (!Ajv)
|
|
76
|
+
return;
|
|
77
|
+
const AjvClass = Ajv.default ?? Ajv;
|
|
78
|
+
// strict: false because operator-supplied schemas vary widely; we
|
|
79
|
+
// accept whatever they declare. validateSchema: false avoids meta-
|
|
80
|
+
// schema URI fetches.
|
|
81
|
+
const ajv = new AjvClass({
|
|
82
|
+
strict: false,
|
|
83
|
+
allErrors: true,
|
|
84
|
+
validateSchema: false,
|
|
85
|
+
});
|
|
86
|
+
const formatsPath = join(projectRoot, 'node_modules', 'ajv-formats', 'dist', 'index.js');
|
|
87
|
+
if (existsSync(formatsPath)) {
|
|
88
|
+
try {
|
|
89
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
90
|
+
const fm = require(formatsPath);
|
|
91
|
+
const addFormats = fm.default ?? fm;
|
|
92
|
+
if (typeof addFormats === 'function')
|
|
93
|
+
addFormats(ajv);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
/* formats are optional */
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
100
|
+
_ajvCompile = (schema) => ajv.compile(schema);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
/* graceful degrade to structural validator */
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Validate `response` against the JSON Schema in `envelope.response_schema`.
|
|
108
|
+
* Uses Ajv when available (transitive dep); falls back to the structural
|
|
109
|
+
* validator in `hitl.ts` otherwise.
|
|
110
|
+
*/
|
|
111
|
+
export function validateResponseAgainstSchema(envelope, response) {
|
|
112
|
+
bootstrapAjv();
|
|
113
|
+
if (_ajvCompile) {
|
|
114
|
+
try {
|
|
115
|
+
const validate = _ajvCompile(envelope.response_schema);
|
|
116
|
+
if (validate(response))
|
|
117
|
+
return { ok: true };
|
|
118
|
+
const errors = (validate.errors ?? []).map(formatAjvError);
|
|
119
|
+
return { ok: false, errors };
|
|
120
|
+
}
|
|
121
|
+
catch (e) {
|
|
122
|
+
// Schema itself was malformed — fall through to structural.
|
|
123
|
+
// Don't swallow silently: include the error in fallback notes.
|
|
124
|
+
const structural = validateResponseStructurally(envelope.response_schema, response);
|
|
125
|
+
if (structural.ok)
|
|
126
|
+
return structural;
|
|
127
|
+
return {
|
|
128
|
+
ok: false,
|
|
129
|
+
errors: [
|
|
130
|
+
`ajv refused schema (${e.message}); structural fallback:`,
|
|
131
|
+
...structural.errors,
|
|
132
|
+
],
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return validateResponseStructurally(envelope.response_schema, response);
|
|
137
|
+
}
|
|
138
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
139
|
+
function formatAjvError(err) {
|
|
140
|
+
const path = err.instancePath || '$';
|
|
141
|
+
return `${path}: ${err.message ?? 'invalid'}`;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Subscribe to a task's SSE stream and drive HITL prompts to completion
|
|
145
|
+
* via the supplied adapter. Resolves when the stream closes (task reaches
|
|
146
|
+
* a terminal state) or when `maxPrompts` is reached.
|
|
147
|
+
*/
|
|
148
|
+
export async function driveHitlPromptsForTask(opts) {
|
|
149
|
+
const auditLog = opts.auditLog ?? new StderrHitlAuditLog();
|
|
150
|
+
const maxRetries = Math.max(1, opts.maxRevalidationRetries ?? 3);
|
|
151
|
+
const messageIdFactory = opts.messageIdFactory ?? defaultMessageIdFactory;
|
|
152
|
+
let prompts = 0;
|
|
153
|
+
const subscription = opts.client.subscribeToTask(opts.taskId, {
|
|
154
|
+
signal: opts.signal,
|
|
155
|
+
});
|
|
156
|
+
try {
|
|
157
|
+
for await (const event of subscription) {
|
|
158
|
+
const envelope = extractEnvelopeFromEvent(event);
|
|
159
|
+
if (!envelope)
|
|
160
|
+
continue;
|
|
161
|
+
const ctx = inferEventContext(event);
|
|
162
|
+
await driveOnePrompt({
|
|
163
|
+
envelope,
|
|
164
|
+
client: opts.client,
|
|
165
|
+
adapter: opts.adapter,
|
|
166
|
+
auditLog,
|
|
167
|
+
taskId: opts.taskId,
|
|
168
|
+
contextId: ctx.contextId,
|
|
169
|
+
deadline: envelope.deadline,
|
|
170
|
+
maxRetries,
|
|
171
|
+
messageIdFactory,
|
|
172
|
+
});
|
|
173
|
+
prompts++;
|
|
174
|
+
if (opts.maxPrompts !== undefined && prompts >= opts.maxPrompts)
|
|
175
|
+
break;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
finally {
|
|
179
|
+
subscription.close();
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Drive a single prompt-response cycle. Exposed for callers that want
|
|
184
|
+
* to bypass the SSE stream (e.g. when an envelope arrives via the push-
|
|
185
|
+
* notification webhook receiver in #1256).
|
|
186
|
+
*/
|
|
187
|
+
export async function driveOnePrompt(opts) {
|
|
188
|
+
const auditLog = opts.auditLog;
|
|
189
|
+
const maxRetries = Math.max(1, opts.maxRetries ?? 3);
|
|
190
|
+
const messageIdFactory = opts.messageIdFactory ?? defaultMessageIdFactory;
|
|
191
|
+
const startedAt = Date.now();
|
|
192
|
+
// Set up the deadline AbortController if the envelope declares one.
|
|
193
|
+
const controller = new AbortController();
|
|
194
|
+
const deadlineMs = parseDeadline(opts.envelope.deadline);
|
|
195
|
+
let deadlineTimer;
|
|
196
|
+
if (deadlineMs !== null) {
|
|
197
|
+
const remaining = deadlineMs - Date.now();
|
|
198
|
+
if (remaining <= 0) {
|
|
199
|
+
controller.abort();
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
deadlineTimer = setTimeout(() => controller.abort(), remaining);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
let lastError;
|
|
206
|
+
try {
|
|
207
|
+
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
208
|
+
let response;
|
|
209
|
+
try {
|
|
210
|
+
response = await opts.adapter.collect(opts.envelope, {
|
|
211
|
+
...(opts.taskId !== undefined ? { taskId: opts.taskId } : {}),
|
|
212
|
+
...(opts.contextId !== undefined ? { contextId: opts.contextId } : {}),
|
|
213
|
+
signal: controller.signal,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
if (controller.signal.aborted) {
|
|
218
|
+
await auditLog.append({
|
|
219
|
+
decided_at: new Date().toISOString(),
|
|
220
|
+
operator: adapterOperator(opts.adapter),
|
|
221
|
+
channel: opts.adapter.name,
|
|
222
|
+
prompt_id: opts.envelope.prompt_id,
|
|
223
|
+
...(opts.taskId !== undefined ? { task_id: opts.taskId } : {}),
|
|
224
|
+
...(opts.contextId !== undefined ? { context_id: opts.contextId } : {}),
|
|
225
|
+
outcome: 'expired',
|
|
226
|
+
error: deadlineMs !== null && Date.now() >= deadlineMs
|
|
227
|
+
? 'deadline expired before response'
|
|
228
|
+
: err.message,
|
|
229
|
+
duration_ms: Date.now() - startedAt,
|
|
230
|
+
});
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
await auditLog.append({
|
|
234
|
+
decided_at: new Date().toISOString(),
|
|
235
|
+
operator: adapterOperator(opts.adapter),
|
|
236
|
+
channel: opts.adapter.name,
|
|
237
|
+
prompt_id: opts.envelope.prompt_id,
|
|
238
|
+
...(opts.taskId !== undefined ? { task_id: opts.taskId } : {}),
|
|
239
|
+
...(opts.contextId !== undefined ? { context_id: opts.contextId } : {}),
|
|
240
|
+
outcome: 'aborted',
|
|
241
|
+
error: err.message,
|
|
242
|
+
duration_ms: Date.now() - startedAt,
|
|
243
|
+
});
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
const validation = validateResponseAgainstSchema(opts.envelope, response);
|
|
247
|
+
if (!validation.ok) {
|
|
248
|
+
lastError = validation.errors.join('; ');
|
|
249
|
+
// Surface the schema gap clearly and let the operator retry.
|
|
250
|
+
process.stderr.write(`HITL response invalid: ${lastError}\n` +
|
|
251
|
+
(attempt + 1 < maxRetries
|
|
252
|
+
? `(retry ${attempt + 1}/${maxRetries - 1})\n`
|
|
253
|
+
: ''));
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
// Validation passed — POST the reply.
|
|
257
|
+
const reply = buildHitlResponseMessage({
|
|
258
|
+
promptId: opts.envelope.prompt_id,
|
|
259
|
+
response,
|
|
260
|
+
messageId: messageIdFactory(),
|
|
261
|
+
...(opts.taskId !== undefined ? { taskId: opts.taskId } : {}),
|
|
262
|
+
...(opts.contextId !== undefined ? { contextId: opts.contextId } : {}),
|
|
263
|
+
});
|
|
264
|
+
try {
|
|
265
|
+
await opts.client.sendMessage(reply);
|
|
266
|
+
}
|
|
267
|
+
catch (err) {
|
|
268
|
+
// Surface 422 hitl_response_invalid distinctly from network errors.
|
|
269
|
+
const msg = err.message;
|
|
270
|
+
if (/422|hitl_response_invalid/.test(msg)) {
|
|
271
|
+
lastError = msg;
|
|
272
|
+
process.stderr.write(`Executor rejected response (HTTP 422): ${msg}\n` +
|
|
273
|
+
(attempt + 1 < maxRetries
|
|
274
|
+
? `(retry ${attempt + 1}/${maxRetries - 1})\n`
|
|
275
|
+
: ''));
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
await auditLog.append({
|
|
279
|
+
decided_at: new Date().toISOString(),
|
|
280
|
+
operator: adapterOperator(opts.adapter),
|
|
281
|
+
channel: opts.adapter.name,
|
|
282
|
+
prompt_id: opts.envelope.prompt_id,
|
|
283
|
+
...(opts.taskId !== undefined ? { task_id: opts.taskId } : {}),
|
|
284
|
+
...(opts.contextId !== undefined ? { context_id: opts.contextId } : {}),
|
|
285
|
+
outcome: 'send_failed',
|
|
286
|
+
error: msg,
|
|
287
|
+
duration_ms: Date.now() - startedAt,
|
|
288
|
+
});
|
|
289
|
+
throw err;
|
|
290
|
+
}
|
|
291
|
+
await auditLog.append({
|
|
292
|
+
decided_at: new Date().toISOString(),
|
|
293
|
+
operator: adapterOperator(opts.adapter),
|
|
294
|
+
channel: opts.adapter.name,
|
|
295
|
+
prompt_id: opts.envelope.prompt_id,
|
|
296
|
+
...(opts.taskId !== undefined ? { task_id: opts.taskId } : {}),
|
|
297
|
+
...(opts.contextId !== undefined ? { context_id: opts.contextId } : {}),
|
|
298
|
+
outcome: 'responded',
|
|
299
|
+
response,
|
|
300
|
+
duration_ms: Date.now() - startedAt,
|
|
301
|
+
});
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
// Exhausted retries — record the final invalid outcome.
|
|
305
|
+
await auditLog.append({
|
|
306
|
+
decided_at: new Date().toISOString(),
|
|
307
|
+
operator: adapterOperator(opts.adapter),
|
|
308
|
+
channel: opts.adapter.name,
|
|
309
|
+
prompt_id: opts.envelope.prompt_id,
|
|
310
|
+
...(opts.taskId !== undefined ? { task_id: opts.taskId } : {}),
|
|
311
|
+
...(opts.contextId !== undefined ? { context_id: opts.contextId } : {}),
|
|
312
|
+
outcome: 'invalid',
|
|
313
|
+
error: lastError ?? 'response did not validate after max retries',
|
|
314
|
+
duration_ms: Date.now() - startedAt,
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
finally {
|
|
318
|
+
if (deadlineTimer)
|
|
319
|
+
clearTimeout(deadlineTimer);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
// ── helpers ────────────────────────────────────────────────────────────
|
|
323
|
+
function extractEnvelopeFromEvent(event) {
|
|
324
|
+
if (event.kind === 'task-state') {
|
|
325
|
+
const result = extractHitlEnvelope(event.task);
|
|
326
|
+
if (result?.ok)
|
|
327
|
+
return result.envelope;
|
|
328
|
+
return null;
|
|
329
|
+
}
|
|
330
|
+
if (event.kind === 'status-update') {
|
|
331
|
+
const result = extractHitlEnvelope(event.status);
|
|
332
|
+
if (result?.ok)
|
|
333
|
+
return result.envelope;
|
|
334
|
+
return null;
|
|
335
|
+
}
|
|
336
|
+
return null;
|
|
337
|
+
}
|
|
338
|
+
function inferEventContext(event) {
|
|
339
|
+
if (event.kind === 'task-state') {
|
|
340
|
+
return event.task.contextId !== undefined
|
|
341
|
+
? { contextId: event.task.contextId }
|
|
342
|
+
: {};
|
|
343
|
+
}
|
|
344
|
+
// status-update / artifact-update don't carry a contextId; the caller
|
|
345
|
+
// can pass one through `driveOnePrompt` directly if it has one cached.
|
|
346
|
+
return {};
|
|
347
|
+
}
|
|
348
|
+
function parseDeadline(deadline) {
|
|
349
|
+
if (!deadline)
|
|
350
|
+
return null;
|
|
351
|
+
const ms = Date.parse(deadline);
|
|
352
|
+
return Number.isFinite(ms) ? ms : null;
|
|
353
|
+
}
|
|
354
|
+
function adapterOperator(adapter) {
|
|
355
|
+
// CLI adapter exposes `operatorId`; other adapters may too. Fall back
|
|
356
|
+
// to the adapter name so the audit entry is never empty.
|
|
357
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
358
|
+
const id = adapter.operatorId;
|
|
359
|
+
return typeof id === 'string' && id.length > 0 ? id : adapter.name;
|
|
360
|
+
}
|
|
361
|
+
function defaultMessageIdFactory() {
|
|
362
|
+
// Prefer crypto.randomUUID; fall back to timestamp+random for older node.
|
|
363
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
364
|
+
const crypto = globalThis.crypto;
|
|
365
|
+
if (crypto && typeof crypto.randomUUID === 'function') {
|
|
366
|
+
return crypto.randomUUID();
|
|
367
|
+
}
|
|
368
|
+
return `hitl-reply-${Date.now()}-${Math.floor(Math.random() * 1e9)}`;
|
|
369
|
+
}
|
|
370
|
+
//# sourceMappingURL=hitl-driver.js.map
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
// HITL prompt envelope extractor + delivery adapter interface.
|
|
2
|
+
//
|
|
3
|
+
// Per `agentic-sandbox/docs/contracts/extensions/hitl-prompt/v1/spec.md`,
|
|
4
|
+
// when a task transitions to `input-required` the executor places a HITL
|
|
5
|
+
// prompt envelope at:
|
|
6
|
+
//
|
|
7
|
+
// task.status.message.metadata['https://agentic-sandbox.aiwg.io/extensions/hitl-prompt/v1']
|
|
8
|
+
//
|
|
9
|
+
// The envelope has required keys (prompt_id, prompt, response_schema) and
|
|
10
|
+
// optional keys (deadline, allowed_responders). AIWG's orchestrator owns
|
|
11
|
+
// the workflow:
|
|
12
|
+
//
|
|
13
|
+
// 1. Detect `input-required` state on a Task / status-update event
|
|
14
|
+
// 2. Extract the envelope
|
|
15
|
+
// 3. Route to a HitlDeliveryAdapter (CLI / Slack / web)
|
|
16
|
+
// 4. Validate the operator's response against `response_schema`
|
|
17
|
+
// 5. POST a reply Message with `metadata.hitl_response_for: <prompt_id>`
|
|
18
|
+
// and the response payload at `metadata.<URI>`
|
|
19
|
+
//
|
|
20
|
+
// This module handles steps 1–4. Step 5 lives in the A2AClient consumer
|
|
21
|
+
// that drives the task lifecycle.
|
|
22
|
+
//
|
|
23
|
+
// @issue #1255
|
|
24
|
+
import { A2A_HITL_PROMPT_V1 } from './client.js';
|
|
25
|
+
/** Required envelope keys per spec §Prompt envelope. */
|
|
26
|
+
const REQUIRED_ENVELOPE_KEYS = ['prompt_id', 'prompt', 'response_schema'];
|
|
27
|
+
/**
|
|
28
|
+
* Pull the HITL envelope out of a Task / TaskStatus / Message metadata
|
|
29
|
+
* blob. Returns `null` when the structure is not `input-required` or
|
|
30
|
+
* doesn't carry the envelope. Returns a typed envelope when valid.
|
|
31
|
+
*
|
|
32
|
+
* Pass either the full Task, just the TaskStatus, or just the
|
|
33
|
+
* `status.message` to suit the calling site.
|
|
34
|
+
*/
|
|
35
|
+
export function extractHitlEnvelope(source) {
|
|
36
|
+
if (!source)
|
|
37
|
+
return null;
|
|
38
|
+
// Get to the `metadata` object that should carry the envelope.
|
|
39
|
+
let metadata;
|
|
40
|
+
let stateGuardPassed = false;
|
|
41
|
+
if (isTask(source)) {
|
|
42
|
+
if (source.status.state !== 'input-required')
|
|
43
|
+
return null;
|
|
44
|
+
stateGuardPassed = true;
|
|
45
|
+
metadata = source.status.message?.metadata;
|
|
46
|
+
}
|
|
47
|
+
else if (isTaskStatus(source)) {
|
|
48
|
+
if (source.state !== 'input-required')
|
|
49
|
+
return null;
|
|
50
|
+
stateGuardPassed = true;
|
|
51
|
+
metadata = source.message?.metadata;
|
|
52
|
+
}
|
|
53
|
+
else if (isMessage(source)) {
|
|
54
|
+
// No state to guard on; assume caller already filtered by state.
|
|
55
|
+
stateGuardPassed = true;
|
|
56
|
+
metadata = source.metadata;
|
|
57
|
+
}
|
|
58
|
+
if (!stateGuardPassed)
|
|
59
|
+
return null;
|
|
60
|
+
if (!metadata) {
|
|
61
|
+
return { ok: false, reason: 'no metadata on status.message' };
|
|
62
|
+
}
|
|
63
|
+
const raw = metadata[A2A_HITL_PROMPT_V1];
|
|
64
|
+
if (raw === undefined) {
|
|
65
|
+
return { ok: false, reason: `missing envelope at metadata[${A2A_HITL_PROMPT_V1}]` };
|
|
66
|
+
}
|
|
67
|
+
if (typeof raw !== 'object' || raw === null || Array.isArray(raw)) {
|
|
68
|
+
return { ok: false, reason: 'envelope is not an object' };
|
|
69
|
+
}
|
|
70
|
+
const env = raw;
|
|
71
|
+
for (const key of REQUIRED_ENVELOPE_KEYS) {
|
|
72
|
+
if (!(key in env)) {
|
|
73
|
+
return { ok: false, reason: `envelope missing required key: ${key}` };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (typeof env['prompt_id'] !== 'string' || env['prompt_id'].length === 0) {
|
|
77
|
+
return { ok: false, reason: 'prompt_id must be a non-empty string' };
|
|
78
|
+
}
|
|
79
|
+
if (typeof env['prompt'] !== 'string') {
|
|
80
|
+
return { ok: false, reason: 'prompt must be a string' };
|
|
81
|
+
}
|
|
82
|
+
return { ok: true, envelope: env };
|
|
83
|
+
}
|
|
84
|
+
/** Build the response Message that closes a HITL prompt cycle. */
|
|
85
|
+
export function buildHitlResponseMessage(opts) {
|
|
86
|
+
const message = {
|
|
87
|
+
messageId: opts.messageId,
|
|
88
|
+
role: 'user',
|
|
89
|
+
parts: [
|
|
90
|
+
{
|
|
91
|
+
kind: 'data',
|
|
92
|
+
data: opts.response,
|
|
93
|
+
},
|
|
94
|
+
],
|
|
95
|
+
metadata: {
|
|
96
|
+
hitl_response_for: opts.promptId,
|
|
97
|
+
[A2A_HITL_PROMPT_V1]: { response: opts.response },
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
if (opts.taskId !== undefined)
|
|
101
|
+
message.taskId = opts.taskId;
|
|
102
|
+
if (opts.contextId !== undefined)
|
|
103
|
+
message.contextId = opts.contextId;
|
|
104
|
+
return message;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Validate a response payload against the envelope's `response_schema`.
|
|
108
|
+
*
|
|
109
|
+
* This module deliberately stays free of an `ajv` import so consumers can
|
|
110
|
+
* either plug in their own validator (see `validateResponseAgainstSchema`)
|
|
111
|
+
* or fall back to structural checks. AIWG already has `ajv` in the dep
|
|
112
|
+
* graph from `src/research/`, so the typical wiring is:
|
|
113
|
+
*
|
|
114
|
+
* import Ajv from 'ajv';
|
|
115
|
+
* const ajv = new Ajv({ allErrors: true });
|
|
116
|
+
* const validate = ajv.compile(envelope.response_schema);
|
|
117
|
+
* const ok = validate(response);
|
|
118
|
+
* if (!ok) { ... use validate.errors ... }
|
|
119
|
+
*
|
|
120
|
+
* For tests we ship a tiny structural validator below that covers the
|
|
121
|
+
* happy path. A full `ajv` wiring lands at the orchestrator call site so
|
|
122
|
+
* AIWG can pick its own validator strategy (Ajv strict mode, Zod, etc.).
|
|
123
|
+
*/
|
|
124
|
+
export function validateResponseStructurally(schema, response) {
|
|
125
|
+
const errors = [];
|
|
126
|
+
walk(schema, response, '$', errors);
|
|
127
|
+
return errors.length === 0 ? { ok: true } : { ok: false, errors };
|
|
128
|
+
}
|
|
129
|
+
function walk(schema, value, path, errors) {
|
|
130
|
+
if (schema === null || typeof schema !== 'object' || Array.isArray(schema))
|
|
131
|
+
return;
|
|
132
|
+
const s = schema;
|
|
133
|
+
if (typeof s['type'] === 'string') {
|
|
134
|
+
const expected = s['type'];
|
|
135
|
+
const actual = typeOf(value);
|
|
136
|
+
if (expected !== actual) {
|
|
137
|
+
errors.push(`${path}: expected ${expected}, got ${actual}`);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (s['type'] === 'object' && value !== null && typeof value === 'object' && !Array.isArray(value)) {
|
|
142
|
+
const v = value;
|
|
143
|
+
const required = Array.isArray(s['required']) ? s['required'] : [];
|
|
144
|
+
for (const r of required) {
|
|
145
|
+
if (typeof r === 'string' && !(r in v)) {
|
|
146
|
+
errors.push(`${path}.${r}: required field missing`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const properties = s['properties'] && typeof s['properties'] === 'object' && !Array.isArray(s['properties'])
|
|
150
|
+
? s['properties']
|
|
151
|
+
: {};
|
|
152
|
+
for (const [k, sub] of Object.entries(properties)) {
|
|
153
|
+
if (k in v)
|
|
154
|
+
walk(sub, v[k], `${path}.${k}`, errors);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (s['type'] === 'array' && Array.isArray(value)) {
|
|
158
|
+
const items = s['items'];
|
|
159
|
+
if (items) {
|
|
160
|
+
value.forEach((el, i) => walk(items, el, `${path}[${i}]`, errors));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function typeOf(v) {
|
|
165
|
+
if (v === null)
|
|
166
|
+
return 'null';
|
|
167
|
+
if (Array.isArray(v))
|
|
168
|
+
return 'array';
|
|
169
|
+
return typeof v;
|
|
170
|
+
}
|
|
171
|
+
// ---------- narrow type guards ----------
|
|
172
|
+
function isTask(v) {
|
|
173
|
+
return typeof v === 'object' && v !== null && 'id' in v && 'status' in v;
|
|
174
|
+
}
|
|
175
|
+
function isTaskStatus(v) {
|
|
176
|
+
return typeof v === 'object' && v !== null && 'state' in v && !('id' in v);
|
|
177
|
+
}
|
|
178
|
+
function isMessage(v) {
|
|
179
|
+
return typeof v === 'object' && v !== null && 'messageId' in v && 'role' in v;
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=hitl.js.map
|