@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,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A2A terminal observer.
|
|
3
|
+
*
|
|
4
|
+
* v2 dispatch returns an A2A Task immediately. Executors may not also emit the
|
|
5
|
+
* executor-contract mission.* event stream, so aiwg serve must follow the task
|
|
6
|
+
* until it reaches a terminal A2A state and then project that state into the
|
|
7
|
+
* ExecutorRegistry mission model.
|
|
8
|
+
*
|
|
9
|
+
* @issue #1374
|
|
10
|
+
*/
|
|
11
|
+
import { A2AClient } from '../a2a/client.js';
|
|
12
|
+
import { isTerminalTaskState, } from '../a2a/types.js';
|
|
13
|
+
const DEFAULT_POLL_INTERVAL_MS = 1000;
|
|
14
|
+
const DEFAULT_MAX_POLLS = 300;
|
|
15
|
+
export async function observeA2ATerminalState(registry, executor, missionId, a2aInstanceId, initialTask, opts = {}) {
|
|
16
|
+
try {
|
|
17
|
+
const clientOpts = {
|
|
18
|
+
baseUrl: executor.transportEndpoints.rest,
|
|
19
|
+
bearer: executor.token,
|
|
20
|
+
instanceId: a2aInstanceId,
|
|
21
|
+
};
|
|
22
|
+
if (opts.fetch)
|
|
23
|
+
clientOpts.fetch = opts.fetch;
|
|
24
|
+
const client = new A2AClient(clientOpts);
|
|
25
|
+
let task = initialTask;
|
|
26
|
+
emitNonTerminalProgress(registry, executor.executorId, missionId, task);
|
|
27
|
+
for (let attempt = 0; attempt <= (opts.maxPolls ?? DEFAULT_MAX_POLLS); attempt++) {
|
|
28
|
+
if (isTerminalTaskState(task.status.state)) {
|
|
29
|
+
emitTerminalTask(registry, executor.executorId, missionId, task);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (attempt === (opts.maxPolls ?? DEFAULT_MAX_POLLS))
|
|
33
|
+
break;
|
|
34
|
+
await sleep(opts.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS);
|
|
35
|
+
task = await client.getTask(task.id);
|
|
36
|
+
emitNonTerminalProgress(registry, executor.executorId, missionId, task);
|
|
37
|
+
}
|
|
38
|
+
registry.failMission(missionId, `A2A task ${initialTask.id} did not reach a terminal state before observer timeout`);
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
registry.failMission(missionId, `A2A terminal observer failed: ${err.message ?? String(err)}`);
|
|
42
|
+
opts.onError?.(err);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function emitNonTerminalProgress(registry, executorId, missionId, task) {
|
|
46
|
+
const state = task.status.state;
|
|
47
|
+
if (state === 'working') {
|
|
48
|
+
registry.handleEvent(makeEnvelope('mission.started', executorId, missionId, task, {
|
|
49
|
+
state: 'running',
|
|
50
|
+
a2a_task_id: task.id,
|
|
51
|
+
summary: taskStatusSummary(task),
|
|
52
|
+
}));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (state === 'input-required') {
|
|
56
|
+
registry.handleEvent(makeEnvelope('mission.hitl_required', executorId, missionId, task, {
|
|
57
|
+
state: 'hitl-required',
|
|
58
|
+
a2a_task_id: task.id,
|
|
59
|
+
summary: taskStatusSummary(task),
|
|
60
|
+
}));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function emitTerminalTask(registry, executorId, missionId, task) {
|
|
64
|
+
const state = task.status.state;
|
|
65
|
+
if (state === 'completed') {
|
|
66
|
+
registry.handleEvent(makeEnvelope('mission.completed', executorId, missionId, task, {
|
|
67
|
+
state: 'done',
|
|
68
|
+
a2a_task_id: task.id,
|
|
69
|
+
summary: taskStatusSummary(task),
|
|
70
|
+
...exitCodeData(task),
|
|
71
|
+
}));
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (state === 'canceled') {
|
|
75
|
+
registry.handleEvent(makeEnvelope('mission.aborted', executorId, missionId, task, {
|
|
76
|
+
state: 'aborted',
|
|
77
|
+
a2a_task_id: task.id,
|
|
78
|
+
summary: taskStatusSummary(task),
|
|
79
|
+
error: taskStatusSummary(task) ?? `A2A task ${task.id} was canceled`,
|
|
80
|
+
...exitCodeData(task),
|
|
81
|
+
}));
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
registry.handleEvent(makeEnvelope('mission.failed', executorId, missionId, task, {
|
|
85
|
+
state: 'failed',
|
|
86
|
+
a2a_task_id: task.id,
|
|
87
|
+
summary: taskStatusSummary(task),
|
|
88
|
+
error: taskStatusSummary(task) ?? `A2A task ${task.id} reached terminal state ${state}`,
|
|
89
|
+
...exitCodeData(task),
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
function makeEnvelope(event, executorId, missionId, task, data) {
|
|
93
|
+
return {
|
|
94
|
+
event,
|
|
95
|
+
executor_id: executorId,
|
|
96
|
+
mission_id: missionId,
|
|
97
|
+
ts: task.status.timestamp ?? new Date().toISOString(),
|
|
98
|
+
data,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
function taskStatusSummary(task) {
|
|
102
|
+
const status = task.status;
|
|
103
|
+
return typeof status.summary === 'string' ? status.summary : undefined;
|
|
104
|
+
}
|
|
105
|
+
function exitCodeData(task) {
|
|
106
|
+
const status = task.status;
|
|
107
|
+
return typeof status.exit_code === 'number' ? { exit_code: status.exit_code } : {};
|
|
108
|
+
}
|
|
109
|
+
function sleep(ms) {
|
|
110
|
+
return new Promise((resolve) => {
|
|
111
|
+
const timer = setTimeout(resolve, ms);
|
|
112
|
+
if (typeof timer === 'object' && typeof timer.unref === 'function') {
|
|
113
|
+
timer.unref();
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
export function isA2ATerminalState(state) {
|
|
118
|
+
return isTerminalTaskState(state);
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=a2a-terminal-observer.js.map
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Router
|
|
3
|
+
*
|
|
4
|
+
* Capability-based and load-aware agent routing for task dispatch (#916).
|
|
5
|
+
* Selects the best available agent for a task based on declared filters
|
|
6
|
+
* (framework requirements, inventory, resource thresholds) and real-time
|
|
7
|
+
* metrics (CPU/memory load from #911).
|
|
8
|
+
*
|
|
9
|
+
* Also exposes routeMission() for executor-level routing (#1179).
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Select the best executor from the provided list using filter criteria.
|
|
13
|
+
*
|
|
14
|
+
* Default-selection policy (per ADR §3):
|
|
15
|
+
* 1. Sandbox-first: prefer any executor with isolation:vm or isolation:container
|
|
16
|
+
* 2. Local fallback: isolation:none or isolation:host
|
|
17
|
+
* 3. 503 if no executor is connected and matching
|
|
18
|
+
*
|
|
19
|
+
* `long_running: true` requires the 'resumable' capability.
|
|
20
|
+
*
|
|
21
|
+
* Returns an ExecutorRoutingResult with the selected executor and full candidate list.
|
|
22
|
+
*/
|
|
23
|
+
export function routeMission(executors, filter, longRunning = false) {
|
|
24
|
+
const matched = [];
|
|
25
|
+
const rejected = [];
|
|
26
|
+
// Only consider connected executors
|
|
27
|
+
const connected = executors.filter((e) => e.connected);
|
|
28
|
+
const disconnected = executors.filter((e) => !e.connected);
|
|
29
|
+
for (const e of disconnected) {
|
|
30
|
+
rejected.push({ executorId: e.executorId, reason: 'executor not connected' });
|
|
31
|
+
}
|
|
32
|
+
for (const executor of connected) {
|
|
33
|
+
// Pinned executor_id
|
|
34
|
+
if (filter.executor_id && executor.executorId !== filter.executor_id) {
|
|
35
|
+
rejected.push({ executorId: executor.executorId, reason: `executor_id does not match '${filter.executor_id}'` });
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
// Long-running requires resumable
|
|
39
|
+
if (longRunning && !executor.capabilities.includes('resumable')) {
|
|
40
|
+
rejected.push({ executorId: executor.executorId, reason: 'long_running requires resumable capability' });
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
// All requested capabilities must be present
|
|
44
|
+
if (filter.capabilities && filter.capabilities.length > 0) {
|
|
45
|
+
const missing = filter.capabilities.filter((c) => !executor.capabilities.includes(c));
|
|
46
|
+
if (missing.length > 0) {
|
|
47
|
+
rejected.push({ executorId: executor.executorId, reason: `missing capabilities: ${missing.join(', ')}` });
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
matched.push({
|
|
52
|
+
executor,
|
|
53
|
+
matchReason: 'matches all filter criteria',
|
|
54
|
+
rejected,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
if (matched.length === 0) {
|
|
58
|
+
return { selected: undefined, candidates: [], filter };
|
|
59
|
+
}
|
|
60
|
+
// ADR §3: sandbox-first policy — prefer vm/container isolation
|
|
61
|
+
const sandboxFirst = matched.filter((c) => c.executor.capabilities.some((cap) => cap === 'isolation:vm' || cap === 'isolation:container'));
|
|
62
|
+
let selected;
|
|
63
|
+
if (sandboxFirst.length > 0) {
|
|
64
|
+
selected = { ...sandboxFirst[0], matchReason: 'sandbox-first (isolation:vm/container)', rejected };
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
selected = { ...matched[0], matchReason: 'local fallback (no vm/container executor)', rejected };
|
|
68
|
+
}
|
|
69
|
+
return { selected, candidates: matched, filter };
|
|
70
|
+
}
|
|
71
|
+
// ============================================================
|
|
72
|
+
// Matching logic
|
|
73
|
+
// ============================================================
|
|
74
|
+
/** Returns a rejection reason string, or null if the agent matches. */
|
|
75
|
+
export function matchAgent(agent, filter) {
|
|
76
|
+
// Direct agent targeting
|
|
77
|
+
if (filter.agent_id) {
|
|
78
|
+
const matches = agent.agentId === filter.agent_id
|
|
79
|
+
|| agent.instanceId === filter.agent_id
|
|
80
|
+
|| agent.logicalName === filter.agent_id;
|
|
81
|
+
if (!matches)
|
|
82
|
+
return `agentId/instanceId/logicalName does not match '${filter.agent_id}'`;
|
|
83
|
+
}
|
|
84
|
+
if (filter.agent_name) {
|
|
85
|
+
if (agent.logicalName !== filter.agent_name) {
|
|
86
|
+
return `logicalName '${agent.logicalName ?? 'none'}' does not match '${filter.agent_name}'`;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (filter.sandbox_id && agent.sandboxId !== filter.sandbox_id) {
|
|
90
|
+
return `sandboxId '${agent.sandboxId}' does not match '${filter.sandbox_id}'`;
|
|
91
|
+
}
|
|
92
|
+
// Status check — skip disconnected/error agents
|
|
93
|
+
if (agent.status === 'disconnected' || agent.status === 'error') {
|
|
94
|
+
return `agent status is '${agent.status}'`;
|
|
95
|
+
}
|
|
96
|
+
// Platform requirements are declared per installed AIWG framework. A match
|
|
97
|
+
// on any framework provider means the agent can receive work for that
|
|
98
|
+
// provider.
|
|
99
|
+
if (filter.platform) {
|
|
100
|
+
const providers = new Set(agent.aiwgFrameworks?.flatMap((f) => f.providers) ?? []);
|
|
101
|
+
if (!providers.has(filter.platform)) {
|
|
102
|
+
return `platform providers do not include '${filter.platform}'`;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Framework requirements
|
|
106
|
+
if (filter.frameworks && filter.frameworks.length > 0) {
|
|
107
|
+
const installed = new Set(agent.aiwgFrameworks?.map((f) => f.name) ?? []);
|
|
108
|
+
const missing = filter.frameworks.filter((f) => !installed.has(f));
|
|
109
|
+
if (missing.length > 0)
|
|
110
|
+
return `missing frameworks: ${missing.join(', ')}`;
|
|
111
|
+
}
|
|
112
|
+
// Agent inventory requirements
|
|
113
|
+
if (filter.agents && filter.agents.length > 0) {
|
|
114
|
+
const installed = new Set(agent.inventory?.agents.map((a) => a.name) ?? []);
|
|
115
|
+
const missing = filter.agents.filter((a) => !installed.has(a));
|
|
116
|
+
if (missing.length > 0)
|
|
117
|
+
return `missing agents in inventory: ${missing.join(', ')}`;
|
|
118
|
+
}
|
|
119
|
+
// Skill inventory requirements
|
|
120
|
+
if (filter.skills && filter.skills.length > 0) {
|
|
121
|
+
const installed = new Set(agent.inventory?.skills.map((s) => s.name) ?? []);
|
|
122
|
+
const missing = filter.skills.filter((s) => !installed.has(s));
|
|
123
|
+
if (missing.length > 0)
|
|
124
|
+
return `missing skills in inventory: ${missing.join(', ')}`;
|
|
125
|
+
}
|
|
126
|
+
// CPU load threshold
|
|
127
|
+
if (filter.max_cpu_percent !== undefined && agent.latestMetrics) {
|
|
128
|
+
if (agent.latestMetrics.cpu_percent > filter.max_cpu_percent) {
|
|
129
|
+
return `CPU ${agent.latestMetrics.cpu_percent.toFixed(1)}% exceeds max ${filter.max_cpu_percent}%`;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Memory requirements (convert GB → bytes)
|
|
133
|
+
if (filter.min_memory_gb !== undefined && agent.latestMetrics) {
|
|
134
|
+
const freeBytes = agent.latestMetrics.memory_total_bytes - agent.latestMetrics.memory_used_bytes;
|
|
135
|
+
const freeGB = freeBytes / (1024 ** 3);
|
|
136
|
+
if (freeGB < filter.min_memory_gb) {
|
|
137
|
+
return `free memory ${freeGB.toFixed(1)}GB below min ${filter.min_memory_gb}GB`;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return null; // matches
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Score an agent for ranking (lower = better).
|
|
144
|
+
* Primary: CPU percent. Secondary: memory usage percent.
|
|
145
|
+
*/
|
|
146
|
+
function agentScore(agent) {
|
|
147
|
+
const cpu = agent.latestMetrics?.cpu_percent ?? 50;
|
|
148
|
+
const memPct = agent.latestMetrics && agent.latestMetrics.memory_total_bytes > 0
|
|
149
|
+
? (agent.latestMetrics.memory_used_bytes / agent.latestMetrics.memory_total_bytes) * 100
|
|
150
|
+
: 50;
|
|
151
|
+
return cpu * 0.7 + memPct * 0.3;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Select the best agent from candidates using filter criteria.
|
|
155
|
+
* Returns a RoutingResult with selected agent and full candidate list.
|
|
156
|
+
*/
|
|
157
|
+
export function routeTask(agents, filter) {
|
|
158
|
+
const matched = [];
|
|
159
|
+
const rejected = [];
|
|
160
|
+
for (const agent of agents) {
|
|
161
|
+
const reason = matchAgent(agent, filter);
|
|
162
|
+
if (reason === null) {
|
|
163
|
+
matched.push({
|
|
164
|
+
sandboxId: agent.sandboxId,
|
|
165
|
+
sandboxName: agent.sandboxName,
|
|
166
|
+
agent,
|
|
167
|
+
matchReason: 'matches all filter criteria',
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
rejected.push({ agentId: agent.agentId, sandboxId: agent.sandboxId, reason });
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// Sort matched agents by score (lower = better)
|
|
175
|
+
matched.sort((a, b) => agentScore(a.agent) - agentScore(b.agent));
|
|
176
|
+
// Apply fallback if no direct match
|
|
177
|
+
if (matched.length === 0 && filter.fallback && filter.fallback.strategy !== 'none') {
|
|
178
|
+
const relaxedFilter = { ...filter };
|
|
179
|
+
if (filter.fallback.strategy === 'any_with_framework') {
|
|
180
|
+
// Relax: keep only framework + status requirements
|
|
181
|
+
delete relaxedFilter.agents;
|
|
182
|
+
delete relaxedFilter.skills;
|
|
183
|
+
delete relaxedFilter.max_cpu_percent;
|
|
184
|
+
delete relaxedFilter.min_memory_gb;
|
|
185
|
+
delete relaxedFilter.agent_id;
|
|
186
|
+
delete relaxedFilter.agent_name;
|
|
187
|
+
relaxedFilter.fallback = undefined;
|
|
188
|
+
}
|
|
189
|
+
else if (filter.fallback.strategy === 'any') {
|
|
190
|
+
// Relax everything except sandbox affinity
|
|
191
|
+
return routeTask(agents, { sandbox_id: filter.sandbox_id });
|
|
192
|
+
}
|
|
193
|
+
return routeTask(agents, relaxedFilter);
|
|
194
|
+
}
|
|
195
|
+
const selected = matched[0];
|
|
196
|
+
if (selected) {
|
|
197
|
+
selected.rejected = rejected.map((r) => ({ agentId: r.agentId, reason: r.reason }));
|
|
198
|
+
}
|
|
199
|
+
return {
|
|
200
|
+
selected,
|
|
201
|
+
candidates: matched,
|
|
202
|
+
filter,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=agent-router.js.map
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dispatch Router — outbound mission dispatch with A2A-first + v1 fallback.
|
|
3
|
+
*
|
|
4
|
+
* AIWG exposes `POST /api/v1/sessions/:id/dispatch` as its public mission
|
|
5
|
+
* intake. The original implementation forwarded to the executor's v1
|
|
6
|
+
* `/dispatch` endpoint (`${rest}/dispatch`). Per #1252, AIWG should now
|
|
7
|
+
* try the A2A path first (`POST /agents/{a2aInstanceId}/v1/messages:send`)
|
|
8
|
+
* and fall back to v1 on 404 with a structured deprecation warning.
|
|
9
|
+
*
|
|
10
|
+
* Wire-shape mapping (v1 dispatch payload → A2A Message):
|
|
11
|
+
*
|
|
12
|
+
* v1 payload → A2A Message
|
|
13
|
+
* -------------------------------- --------------------------------------
|
|
14
|
+
* mission_id message.messageId (idempotency key)
|
|
15
|
+
* objective parts[0] = { kind: 'text', text: ... }
|
|
16
|
+
* completion metadata.completion
|
|
17
|
+
* executor_filter metadata.executor_filter
|
|
18
|
+
* long_running metadata.long_running
|
|
19
|
+
* <any other field> metadata.<field>
|
|
20
|
+
*
|
|
21
|
+
* @issue #1252 #1254 #1259
|
|
22
|
+
*/
|
|
23
|
+
import { A2A_IDEMPOTENCY_V1, A2A_RUNTIME_V1, A2AClient, } from '../a2a/client.js';
|
|
24
|
+
import { A2AError } from '../a2a/http.js';
|
|
25
|
+
/**
|
|
26
|
+
* Route a dispatch to an executor. Tries v2 first, falls back to v1 on 404
|
|
27
|
+
* or when `forceV1` is set. Throws on all other failure modes — caller is
|
|
28
|
+
* responsible for surfacing 5xx to the inbound caller.
|
|
29
|
+
*/
|
|
30
|
+
export async function routeDispatch(executor, payload, opts = {}) {
|
|
31
|
+
if (opts.forceV1 === true) {
|
|
32
|
+
const v1 = await dispatchV1(executor, payload, opts);
|
|
33
|
+
return v1;
|
|
34
|
+
}
|
|
35
|
+
// Try v2 first.
|
|
36
|
+
try {
|
|
37
|
+
const v2 = await dispatchV2(executor, payload, opts);
|
|
38
|
+
return v2;
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
// Only fall back on a 404 from the v2 path. Everything else propagates.
|
|
42
|
+
if (err instanceof A2AError && err.status === 404) {
|
|
43
|
+
// Capture sunset for the telemetry event if any was attached.
|
|
44
|
+
const sunset = err.problem.code === 'aiwg.deprecation_strict' ? undefined : undefined;
|
|
45
|
+
if (opts.onV1Fallback) {
|
|
46
|
+
opts.onV1Fallback({
|
|
47
|
+
executorId: executor.executorId,
|
|
48
|
+
reason: `v2 endpoint returned 404 (path=${err.path})`,
|
|
49
|
+
...(sunset !== undefined ? { sunset } : {}),
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return dispatchV1(executor, payload, opts);
|
|
53
|
+
}
|
|
54
|
+
throw err;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** v2 path — A2A `messages:send`. */
|
|
58
|
+
async function dispatchV2(executor, payload, opts) {
|
|
59
|
+
const a2aInstanceId = resolveA2AInstanceId(executor, payload, opts);
|
|
60
|
+
const clientOpts = {
|
|
61
|
+
baseUrl: executor.transportEndpoints.rest,
|
|
62
|
+
bearer: executor.token,
|
|
63
|
+
instanceId: a2aInstanceId,
|
|
64
|
+
requiredExtensions: opts.requiredExtensions ?? [A2A_RUNTIME_V1, A2A_IDEMPOTENCY_V1],
|
|
65
|
+
};
|
|
66
|
+
if (opts.fetch)
|
|
67
|
+
clientOpts.fetch = opts.fetch;
|
|
68
|
+
if (opts.optionalExtensions)
|
|
69
|
+
clientOpts.optionalExtensions = opts.optionalExtensions;
|
|
70
|
+
if (opts.onDeprecation)
|
|
71
|
+
clientOpts.onDeprecation = opts.onDeprecation;
|
|
72
|
+
const client = new A2AClient(clientOpts);
|
|
73
|
+
const message = payloadToMessage(payload);
|
|
74
|
+
const result = await client.sendMessage(message);
|
|
75
|
+
return {
|
|
76
|
+
missionId: payload.mission_id,
|
|
77
|
+
executorId: executor.executorId,
|
|
78
|
+
a2aInstanceId,
|
|
79
|
+
dispatchPath: 'v2',
|
|
80
|
+
task: result.task,
|
|
81
|
+
idempotentReplayed: result.idempotentReplayed,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function resolveA2AInstanceId(executor, payload, opts) {
|
|
85
|
+
const filter = payload.executor_filter ?? {};
|
|
86
|
+
const filterInstance = filter['a2a_instance_id'] ?? filter['instance_id'];
|
|
87
|
+
return opts.a2aInstanceId
|
|
88
|
+
?? payload.a2a_instance_id
|
|
89
|
+
?? (typeof filterInstance === 'string' ? filterInstance : undefined)
|
|
90
|
+
?? executor.a2aInstanceId
|
|
91
|
+
?? executor.executorId;
|
|
92
|
+
}
|
|
93
|
+
/** v1 path — fall back to the legacy `/dispatch` endpoint. */
|
|
94
|
+
async function dispatchV1(executor, payload, opts) {
|
|
95
|
+
const fetchImpl = opts.fetch ?? fetch;
|
|
96
|
+
const url = `${executor.transportEndpoints.rest.replace(/\/+$/, '')}/dispatch`;
|
|
97
|
+
const resp = await fetchImpl(url, {
|
|
98
|
+
method: 'POST',
|
|
99
|
+
headers: {
|
|
100
|
+
'content-type': 'application/json',
|
|
101
|
+
authorization: `Bearer ${executor.token}`,
|
|
102
|
+
},
|
|
103
|
+
body: JSON.stringify(payload),
|
|
104
|
+
});
|
|
105
|
+
// Inspect deprecation headers from the v1 response — these are exactly
|
|
106
|
+
// what #1259 is meant to surface.
|
|
107
|
+
if (opts.onDeprecation) {
|
|
108
|
+
const dep = readDeprecation(`${executor.transportEndpoints.rest}/dispatch`, resp.headers);
|
|
109
|
+
if (dep)
|
|
110
|
+
opts.onDeprecation(dep);
|
|
111
|
+
}
|
|
112
|
+
if (!resp.ok) {
|
|
113
|
+
const detail = await resp.text().catch(() => '');
|
|
114
|
+
throw new Error(`v1 dispatch failed: ${resp.status} ${detail}`);
|
|
115
|
+
}
|
|
116
|
+
let estimatedStart;
|
|
117
|
+
try {
|
|
118
|
+
const json = (await resp.json());
|
|
119
|
+
if (typeof json['estimated_start'] === 'string') {
|
|
120
|
+
estimatedStart = json['estimated_start'];
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
/* optional */
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
missionId: payload.mission_id,
|
|
128
|
+
executorId: executor.executorId,
|
|
129
|
+
dispatchPath: 'v1-fallback',
|
|
130
|
+
idempotentReplayed: false,
|
|
131
|
+
...(estimatedStart !== undefined ? { estimatedStart } : {}),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/** Map a v1 dispatch payload to an A2A Message. */
|
|
135
|
+
function payloadToMessage(payload) {
|
|
136
|
+
const metadata = {};
|
|
137
|
+
for (const [k, v] of Object.entries(payload)) {
|
|
138
|
+
if (k === 'mission_id' || k === 'objective')
|
|
139
|
+
continue;
|
|
140
|
+
if (v === undefined)
|
|
141
|
+
continue;
|
|
142
|
+
// V1DispatchPayload allows boolean — coerce to JSON.
|
|
143
|
+
metadata[k] = v;
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
messageId: payload.mission_id,
|
|
147
|
+
role: 'user',
|
|
148
|
+
parts: [{ kind: 'text', text: payload.objective }],
|
|
149
|
+
metadata,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
function readDeprecation(path, headers) {
|
|
153
|
+
const sunset = headers.get('sunset') ?? undefined;
|
|
154
|
+
const deprecated = headers.get('deprecated') ?? undefined;
|
|
155
|
+
const link = headers.get('link') ?? undefined;
|
|
156
|
+
if (!sunset && !deprecated && !link)
|
|
157
|
+
return undefined;
|
|
158
|
+
let successor;
|
|
159
|
+
if (link) {
|
|
160
|
+
const m = /<([^>]+)>\s*;\s*[^,]*rel\s*=\s*"?successor-version"?/i.exec(link);
|
|
161
|
+
if (m)
|
|
162
|
+
successor = m[1];
|
|
163
|
+
}
|
|
164
|
+
return {
|
|
165
|
+
path,
|
|
166
|
+
...(sunset ? { sunset } : {}),
|
|
167
|
+
...(deprecated ? { deprecated } : {}),
|
|
168
|
+
...(successor ? { successor } : {}),
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=dispatch-router.js.map
|