@aiwg/cli 2026.10.1 → 2026.10.4
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/README.md +2 -2
- package/agentic/code/providers/capability-matrix.yaml +270 -0
- package/agentic/code/providers/model-capabilities.v1.json +3183 -24
- package/bin/aiwg.mjs +135 -47
- package/dist/src/a2a/codecs.js +9 -0
- package/dist/src/agents/grounding/knowledge-base.js +54 -6
- package/dist/src/artifacts/browser-export.js +6 -0
- package/dist/src/artifacts/checksum-manifest.js +1 -0
- package/dist/src/artifacts/citation-parser.js +173 -92
- package/dist/src/artifacts/citation-table-schema.js +59 -0
- package/dist/src/artifacts/cli.js +57 -18
- package/dist/src/artifacts/corpus-tools/snapshot.js +1 -1
- package/dist/src/artifacts/corpus-tools/vision-extract.js +107 -15
- package/dist/src/artifacts/corpus-views/ref-parser.js +3 -1
- package/dist/src/artifacts/corpus-views/renderers.js +3 -3
- package/dist/src/artifacts/discovery-eval.js +6 -4
- package/dist/src/artifacts/fortemi-core-query-adapter.js +36 -3
- package/dist/src/artifacts/fortemi-core-sync.js +166 -40
- package/dist/src/artifacts/framework-capabilities.js +171 -0
- package/dist/src/artifacts/framework-index-paths.js +73 -0
- package/dist/src/artifacts/framework-source-digest.js +75 -0
- package/dist/src/artifacts/index-builder.js +285 -131
- package/dist/src/artifacts/index-files.js +132 -18
- package/dist/src/artifacts/index-preparation.js +65 -0
- package/dist/src/artifacts/index-refresh.js +576 -0
- package/dist/src/artifacts/index-worker.mjs +9 -0
- package/dist/src/artifacts/prebuilt-build-lock.js +47 -4
- package/dist/src/artifacts/prebuilt-deployment.js +46 -0
- package/dist/src/artifacts/prebuilt-relations.js +80 -0
- package/dist/src/artifacts/query-engine.js +410 -88
- package/dist/src/artifacts/relations-builder.js +168 -0
- package/dist/src/artifacts/relations.js +148 -0
- package/dist/src/artifacts/repair.js +9 -4
- package/dist/src/artifacts/stats.js +5 -2
- package/dist/src/artifacts/types.js +30 -10
- package/dist/src/artifacts/watcher.js +1 -1
- package/dist/src/auth/credential-store.js +2 -1
- package/dist/src/catalog/cli.d.mts +5 -0
- package/dist/src/channel/manager.d.mts +20 -0
- package/dist/src/channel/manager.mjs +78 -12
- package/dist/src/cli/child-process-result.js +40 -0
- package/dist/src/cli/command-log.js +2 -3
- package/dist/src/cli/env.js +38 -16
- package/dist/src/cli/flag-parsing.js +236 -0
- package/dist/src/cli/handlers/artifacts.js +3 -0
- package/dist/src/cli/handlers/auth.js +3 -0
- package/dist/src/cli/handlers/decision.js +218 -5
- package/dist/src/cli/handlers/diagnose.js +13 -5
- package/dist/src/cli/handlers/effect.js +4 -2
- package/dist/src/cli/handlers/evidence.js +3 -0
- package/dist/src/cli/handlers/feedback.js +14 -5
- package/dist/src/cli/handlers/help.js +1 -0
- package/dist/src/cli/handlers/index.js +3 -1
- package/dist/src/cli/handlers/init.js +248 -30
- package/dist/src/cli/handlers/lint.js +5 -0
- package/dist/src/cli/handlers/mc.js +23 -0
- package/dist/src/cli/handlers/models.js +169 -10
- package/dist/src/cli/handlers/ralph-launcher.js +2 -0
- package/dist/src/cli/handlers/ralph.js +3 -0
- package/dist/src/cli/handlers/refresh.js +28 -0
- package/dist/src/cli/handlers/regenerate.js +14 -0
- package/dist/src/cli/handlers/resource-versions.js +3 -0
- package/dist/src/cli/handlers/rules.js +195 -0
- package/dist/src/cli/handlers/run.js +4 -0
- package/dist/src/cli/handlers/runtime-info.js +25 -11
- package/dist/src/cli/handlers/script-runner.js +19 -8
- package/dist/src/cli/handlers/session.js +406 -62
- package/dist/src/cli/handlers/sessions.js +243 -76
- package/dist/src/cli/handlers/setup-manifest.js +474 -79
- package/dist/src/cli/handlers/setup.js +180 -39
- package/dist/src/cli/handlers/steward.js +11 -0
- package/dist/src/cli/handlers/subcommands.js +60 -3
- package/dist/src/cli/handlers/team.js +18 -8
- package/dist/src/cli/handlers/uhp.js +3 -0
- package/dist/src/cli/handlers/use.js +307 -55
- package/dist/src/cli/handlers/utilities.js +125 -26
- package/dist/src/cli/handlers/version.js +8 -0
- package/dist/src/cli/prompt-utils.js +72 -0
- package/dist/src/cli/provider-resolution.js +11 -0
- package/dist/src/cli/router.js +15 -1
- package/dist/src/cli/services/deployment-verification.js +19 -9
- package/dist/src/cli/services/provider-prepare-coordinator.js +24 -0
- package/dist/src/cli/skill-usage.js +2 -3
- package/dist/src/config/aiwg-config.js +349 -35
- package/dist/src/config/cli.js +256 -23
- package/dist/src/config/decision-config.js +106 -0
- package/dist/src/config/dispatch-thresholds-runtime.d.mts +8 -0
- package/dist/src/config/dispatch-thresholds-runtime.mjs +38 -0
- package/dist/src/config/gitignore.js +50 -0
- package/dist/src/config/index-graph-overrides.js +36 -0
- package/dist/src/config/project-artifacts-health.d.mts +37 -0
- package/dist/src/config/project-artifacts-health.mjs +14 -3
- package/dist/src/config/project-artifacts-runtime.d.mts +16 -0
- package/dist/src/config/user-config-dir.d.mts +9 -0
- package/dist/src/config/user-config.js +38 -11
- package/dist/src/config/user-registry.js +23 -15
- package/dist/src/config/user-state.js +7 -0
- package/dist/src/decision/adapters/jev.js +75 -27
- package/dist/src/decision/ask.js +203 -43
- package/dist/src/decision/context-live-qualification.js +2 -2
- package/dist/src/decision/driver.js +14 -7
- package/dist/src/decision/ensemble/aggregate.js +23 -10
- package/dist/src/decision/ensemble-study/multifact-study.js +6 -2
- package/dist/src/decision/entry.js +25 -6
- package/dist/src/decision/graph-live-qualification.js +1 -1
- package/dist/src/decision/graph-run.js +9 -0
- package/dist/src/decision/heldout/collector.js +15 -14
- package/dist/src/decision/heldout/contract.js +30 -7
- package/dist/src/decision/index.js +1 -0
- package/dist/src/decision/interop.js +60 -8
- package/dist/src/decision/jev-credentials.js +15 -1
- package/dist/src/decision/ledger.js +942 -0
- package/dist/src/decision/offload-activation.js +137 -0
- package/dist/src/decision/offload.js +550 -0
- package/dist/src/decision/qualification/load.js +4 -6
- package/dist/src/decision/savings.js +28 -0
- package/dist/src/decision/validate.js +6 -3
- package/dist/src/effects/dispatch-verifier.js +252 -0
- package/dist/src/effects/index.js +1 -0
- package/dist/src/effects/types.js +5 -1
- package/dist/src/effects/verifiers/git.js +2 -1
- package/dist/src/effects/verifiers/tracker.js +26 -14
- package/dist/src/extensions/commands/definitions.js +19 -0
- package/dist/src/extensions/project-local-remove.js +36 -1
- package/dist/src/features/installer.js +2 -2
- package/dist/src/flow/graph-metadata.js +5 -0
- package/dist/src/gates/providers/loader.js +64 -18
- package/dist/src/installation/manager-command.d.mts +18 -0
- package/dist/src/installation/manager-command.mjs +15 -3
- package/dist/src/installation/manager.d.mts +49 -0
- package/dist/src/installation/manager.mjs +95 -5
- package/dist/src/issues/cli.js +4 -4
- package/dist/src/issues/local.js +24 -5
- package/dist/src/jobs/runner.js +1 -1
- package/dist/src/lint/cli.js +27 -1
- package/dist/src/lint/loader.js +2 -1
- package/dist/src/lint/reporters.js +25 -1
- package/dist/src/lint/rule-activation.js +43 -0
- package/dist/src/lint/runner.js +137 -62
- package/dist/src/mcp/adapters/codex-runtime.js +366 -56
- package/dist/src/mcp/claude-install.d.mts +4 -0
- package/dist/src/mcp/claude-install.mjs +41 -0
- package/dist/src/mcp/cli.d.mts +1 -0
- package/dist/src/mcp/cli.mjs +620 -85
- package/dist/src/mcp/config-file.d.mts +28 -0
- package/dist/src/mcp/config-file.mjs +279 -0
- package/dist/src/mcp/config-layers.d.mts +36 -0
- package/dist/src/mcp/config-layers.mjs +348 -0
- package/dist/src/mcp/credentials.d.mts +51 -0
- package/dist/src/mcp/credentials.mjs +484 -0
- package/dist/src/mcp/grok-build-config.d.mts +6 -0
- package/dist/src/mcp/grok-build-config.mjs +17 -27
- package/dist/src/mcp/helpers.mjs +109 -4
- package/dist/src/mcp/muse-native-config.d.mts +13 -0
- package/dist/src/mcp/muse-native-config.mjs +1 -0
- package/dist/src/mcp/omp-config.d.mts +4 -0
- package/dist/src/mcp/omp-config.mjs +50 -29
- package/dist/src/mcp/profiles.js +97 -23
- package/dist/src/mcp/profiles.mjs +99 -27
- package/dist/src/mcp/registry.js +248 -131
- package/dist/src/mcp/registry.mjs +169 -100
- package/dist/src/mcp/server-config.d.mts +3 -0
- package/dist/src/mcp/server-config.mjs +89 -0
- package/dist/src/mcp/server.mjs +127 -82
- package/dist/src/mcp/test-simple.mjs +2 -1
- package/dist/src/mcp/toml-editor.d.mts +4 -0
- package/dist/src/mcp/toml-string.d.mts +1 -0
- package/dist/src/mcp/toml-string.mjs +9 -0
- package/dist/src/mcp/toml-strip-mcp.d.mts +1 -0
- package/dist/src/mcp/toml-strip-mcp.mjs +135 -0
- package/dist/src/mcp/tool-filters.d.mts +46 -0
- package/dist/src/mcp/tool-filters.mjs +357 -0
- package/dist/src/mcp/tools/agentic-sandbox.mjs +3 -1
- package/dist/src/mcp/tools/decision.mjs +22 -3
- package/dist/src/mcp/tools/discovery.mjs +62 -55
- package/dist/src/mcp/tools/orchestration.mjs +50 -2
- package/dist/src/mcp/tools/subsystems.mjs +39 -8
- package/dist/src/mcp/tools/worker-invoke.mjs +2856 -0
- package/dist/src/mcp/tools/worker-shell-control.mjs +289 -0
- package/dist/src/mcp/tools/worker-stdin-runtime.mjs +79 -0
- package/dist/src/memory/project-registry.js +2 -2
- package/dist/src/mission-protocol/codecs.js +647 -1
- package/dist/src/mission-protocol/types.js +110 -0
- package/dist/src/mission-protocol/worker-status.js +2 -0
- package/dist/src/models/config-loader.js +76 -14
- package/dist/src/models/grok-build-models.js +93 -41
- package/dist/src/models/model-capabilities.v1.json +3183 -24
- package/dist/src/models/model-discovery.js +931 -67
- package/dist/src/models/provider-policy.js +719 -11
- package/dist/src/models/qualification-digest.d.mts +2 -0
- package/dist/src/models/qualification-digest.mjs +17 -0
- package/dist/src/models/resolver.js +261 -0
- package/dist/src/models/worker-direct-readiness.js +550 -0
- package/dist/src/models/worker-dispatch-offer.js +169 -0
- package/dist/src/models/worker-health-readiness.js +144 -0
- package/dist/src/models/worker-installation.d.mts +39 -0
- package/dist/src/models/worker-installation.mjs +986 -0
- package/dist/src/models/wrapper-route.js +18 -0
- package/dist/src/ops/registry.js +9 -14
- package/dist/src/plugins/standalone-packager.js +4 -3
- package/dist/src/process/bounded-child-process.d.mts +84 -0
- package/dist/src/process/bounded-child-process.mjs +430 -0
- package/dist/src/process/cli-command.d.mts +16 -0
- package/dist/src/process/cli-command.mjs +75 -0
- package/dist/src/process/signal-child.d.mts +6 -0
- package/dist/src/process/signal-child.mjs +7 -0
- package/dist/src/providers/capability-matrix.js +8 -0
- package/dist/src/providers/capability-matrix.yaml +270 -0
- package/dist/src/providers/deployed-skill-roots.js +20 -0
- package/dist/src/providers/grok-build-acp.js +3 -2
- package/dist/src/providers/grok-build-headless.js +53 -23
- package/dist/src/providers/grok-build-inspect.js +1 -0
- package/dist/src/providers/omp-agent.d.mts +8 -0
- package/dist/src/providers/omp-diagnostics.d.mts +1 -0
- package/dist/src/providers/omp-paths.d.mts +13 -0
- package/dist/src/providers/provider-definitions.js +9 -1
- package/dist/src/providers/provider-definitions.mjs +9 -2
- package/dist/src/providers/skill-ownership.d.mts +9 -0
- package/dist/src/providers/skill-ownership.mjs +88 -0
- package/dist/src/rules/activation.d.mts +21 -0
- package/dist/src/rules/activation.mjs +62 -0
- package/dist/src/rules/inline-budget.d.mts +26 -0
- package/dist/src/rules/inline-budget.mjs +66 -0
- package/dist/src/rules/inventory.js +129 -0
- package/dist/src/rules/pin-state.js +73 -0
- package/dist/src/rules/pins.d.mts +14 -0
- package/dist/src/rules/pins.mjs +112 -0
- package/dist/src/rules/rule-frontmatter.schema.json +197 -0
- package/dist/src/serve/executor-registry.js +16 -24
- package/dist/src/serve/fleet-mission-conductor.js +9 -0
- package/dist/src/serve/mission-conductor.js +47 -12
- package/dist/src/serve/shared-host-scheduler.js +2 -0
- package/dist/src/serve/worker-invocation.js +558 -0
- package/dist/src/serve/worker-stdin-frame.d.mts +10 -0
- package/dist/src/serve/worker-stdin-frame.mjs +107 -0
- package/dist/src/sessions/adapter-registry.js +49 -0
- package/dist/src/sessions/adapters/claude.js +39 -54
- package/dist/src/sessions/adapters/codex.js +82 -67
- package/dist/src/sessions/adapters/copilot.js +4 -4
- package/dist/src/sessions/adapters/cursor.js +40 -57
- package/dist/src/sessions/adapters/deepseek-harness.js +15 -12
- package/dist/src/sessions/adapters/factory.js +31 -27
- package/dist/src/sessions/adapters/generic.js +43 -9
- package/dist/src/sessions/adapters/grok-build.js +11 -11
- package/dist/src/sessions/adapters/grokbot-locator.js +111 -0
- package/dist/src/sessions/adapters/grokbot.js +434 -24
- package/dist/src/sessions/adapters/hermes.js +27 -29
- package/dist/src/sessions/adapters/muse-workspace-scan.js +128 -0
- package/dist/src/sessions/adapters/muse.js +200 -104
- package/dist/src/sessions/adapters/omp.js +28 -14
- package/dist/src/sessions/adapters/openclaw.js +89 -79
- package/dist/src/sessions/adapters/opencode.js +27 -24
- package/dist/src/sessions/adapters/openhuman.js +18 -60
- package/dist/src/sessions/adapters/pi.js +30 -14
- package/dist/src/sessions/adapters/warp.js +3 -3
- package/dist/src/sessions/adapters/windsurf.js +19 -48
- package/dist/src/sessions/batch-contracts.js +25 -5
- package/dist/src/sessions/batch-import.js +72 -51
- package/dist/src/sessions/candidates.js +47 -11
- package/dist/src/sessions/contracts.js +75 -2
- package/dist/src/sessions/coverage-preflight.js +134 -0
- package/dist/src/sessions/discovery.js +3 -0
- package/dist/src/sessions/export-plan.js +4 -3
- package/dist/src/sessions/grok-build-cli.js +67 -5
- package/dist/src/sessions/import-exclusions.js +72 -0
- package/dist/src/sessions/import-lease.js +34 -18
- package/dist/src/sessions/import-limits.js +37 -0
- package/dist/src/sessions/importer.js +84 -46
- package/dist/src/sessions/index.js +2 -0
- package/dist/src/sessions/lifecycle.js +45 -0
- package/dist/src/sessions/policy.js +133 -25
- package/dist/src/sessions/readers.js +106 -53
- package/dist/src/sessions/refresh.js +106 -0
- package/dist/src/sessions/repository.js +199 -63
- package/dist/src/sessions/workspace-discovery.js +315 -88
- package/dist/src/sessions/workspace-matching.js +107 -0
- package/dist/src/skills/adapters/clawhub.js +10 -8
- package/dist/src/skills/adapters/openclaw.js +10 -7
- package/dist/src/skills/importer.js +1 -0
- package/dist/src/smiths/context-pipeline/aiwg-md.js +11 -0
- package/dist/src/smiths/context-pipeline/claude-hook.js +3 -26
- package/dist/src/smiths/context-pipeline/finalization.js +6 -5
- package/dist/src/smiths/context-pipeline/generator.js +21 -4
- package/dist/src/smiths/context-pipeline/parallelism-section.js +195 -14
- package/dist/src/smiths/context-pipeline/workspace-context.js +116 -9
- package/dist/src/smiths/hook-bridge/codex-translator.js +6 -5
- package/dist/src/smiths/mcpsmith/example.js +1 -1
- package/dist/src/smiths/mcpsmith/generator.js +1 -1
- package/dist/src/smiths/toolsmith/runtime-discovery.d.mts +10 -0
- package/dist/src/smiths/toolsmith/runtime-discovery.mjs +85 -31
- package/dist/src/storage/backends/fs.js +18 -76
- package/dist/src/storage/backends/logseq.js +68 -7
- package/dist/src/storage/backends/obsidian.js +1 -0
- package/dist/src/storage/fortemi-qualification-receipt.js +2 -2
- package/dist/src/testing/generators/test-code-generator.js +57 -30
- package/dist/src/tracker/forge-http.js +2 -1
- package/dist/src/uhp/client.js +11 -1
- package/dist/src/uhp/mission.js +5 -0
- package/dist/src/update/checker.d.mts +2 -0
- package/dist/src/update/checker.mjs +5 -5
- package/dist/src/update/notifier.mjs +54 -2
- package/dist/src/update/service.d.mts +22 -0
- package/dist/src/utils/contained-filesystem.d.mts +37 -0
- package/dist/src/utils/contained-filesystem.mjs +683 -0
- package/dist/src/utils/temporary-directory.js +36 -0
- package/dist/src/writing/example-generator.js +1 -1
- package/dist/src/writing/fidelity.js +18 -1
- package/package.json +32 -2
- package/schemas/mission-v1.schema.json +2429 -0
- package/schemas/models/model-catalog.v1.schema.json +301 -0
- package/schemas/models/model-config-compatibility.v1.schema.json +281 -0
- package/schemas/models/model-policy.v1.schema.json +14 -0
- package/schemas/models/provider-model-capabilities.v1.schema.json +1072 -0
- package/tools/_resolve-impl.mjs +39 -2
- package/tools/agents/deploy-agents.mjs +64 -23
- package/tools/agents/providers/base.mjs +153 -166
- package/tools/agents/providers/claude.mjs +8 -24
- package/tools/agents/providers/codex.mjs +18 -11
- package/tools/agents/providers/cursor.mjs +19 -18
- package/tools/agents/providers/grok-build.mjs +3 -1
- package/tools/agents/providers/grokbot.mjs +11 -12
- package/tools/agents/providers/hermes.mjs +62 -49
- package/tools/agents/providers/omp.mjs +5 -2
- package/tools/agents/providers/openclaw-translator.mjs +19 -5
- package/tools/agents/providers/openclaw.mjs +9 -4
- package/tools/agents/providers/pi.mjs +5 -0
- package/tools/agents/providers/provider-prepare-channel.mjs +5 -0
- package/tools/agents/providers/provider-prepare-coordinator.mjs +247 -0
- package/tools/agents/providers/provider-prepare-worker.mjs +84 -0
- package/tools/agents/providers/rule-delivery.mjs +1270 -0
- package/tools/agents/providers/warp.mjs +20 -26
- package/tools/cli/decision-offload-report.mjs +40 -0
- package/tools/cli/workspace-status.mjs +862 -0
- package/tools/plugin/package-plugins.mjs +186 -8
- package/tools/plugin/plugin-links.mjs +114 -0
- package/tools/providers/antigravity-transport.mjs +3 -1
- package/tools/providers/deepseek-harness-transport.mjs +360 -0
- package/tools/providers/omp-transport.mjs +194 -0
- package/tools/ralph-external/lib/claude-adapter.mjs +389 -0
- package/tools/ralph-external/lib/codex-adapter.mjs +432 -0
- package/tools/ralph-external/lib/consecutive-failure-circuit-breaker.mjs +1748 -0
- package/tools/ralph-external/lib/deepseek-harness-adapter.mjs +397 -0
- package/tools/ralph-external/lib/factory-adapter.mjs +503 -0
- package/tools/ralph-external/lib/launcher-recovery-evidence.mjs +55 -0
- package/tools/ralph-external/lib/muse-adapter.mjs +364 -0
- package/tools/ralph-external/lib/omp-adapter.mjs +315 -0
- package/tools/ralph-external/lib/opencode-adapter.mjs +575 -0
- package/tools/ralph-external/lib/openhuman-adapter.mjs +75 -0
- package/tools/ralph-external/lib/pi-adapter.mjs +329 -0
- package/tools/ralph-external/lib/provider-adapter.mjs +748 -0
- package/tools/ralph-external/lib/recovery-probe.mjs +72 -0
- package/tools/ralph-external/lib/session-environment.mjs +28 -0
- package/tools/ralph-external/lib/systemd-client.mjs +49 -0
- package/tools/ralph-external/lib/worker-health.mjs +439 -0
- package/tools/ralph-external/lib/worker-isolation.mjs +717 -0
- package/tools/ralph-external/lib/worker-overflow.mjs +50 -0
- package/tools/ralph-external/process-monitor.mjs +1017 -0
- package/tools/ralph-external/session-launcher.mjs +5057 -0
- package/tools/scripts/resource-preflight.mjs +541 -0
- package/tools/skills/deploy-skills-codex.mjs +2 -1
- package/vscode-extension/schemas/aiwg.config.v1.json +2916 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
4
|
+
import { getGraphIndexDir } from './types.js';
|
|
5
|
+
import { frameworkSourceDigest } from './framework-source-digest.js';
|
|
6
|
+
import { acquireDirectoryLock, DirectoryLockContentionError } from './prebuilt-build-lock.js';
|
|
7
|
+
import { FRAMEWORK_CORPUS_KINDS as CORPUS_KINDS, resolveFrameworkCorpusRoot } from './framework-index-paths.js';
|
|
8
|
+
export { resolveFrameworkCorpusRoot } from './framework-index-paths.js';
|
|
9
|
+
function readText(file) {
|
|
10
|
+
try {
|
|
11
|
+
return fs.readFileSync(file, 'utf8');
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return '';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/** Resolve HEAD without spawning git, including worktrees and packed refs. */
|
|
18
|
+
function gitHead(root) {
|
|
19
|
+
let gitDir = path.join(root, '.git');
|
|
20
|
+
const pointer = readText(gitDir).trim();
|
|
21
|
+
if (pointer.startsWith('gitdir: '))
|
|
22
|
+
gitDir = path.resolve(root, pointer.slice(8));
|
|
23
|
+
const head = readText(path.join(gitDir, 'HEAD')).trim();
|
|
24
|
+
if (!head.startsWith('ref: '))
|
|
25
|
+
return head;
|
|
26
|
+
const ref = head.slice(5);
|
|
27
|
+
const common = readText(path.join(gitDir, 'commondir')).trim();
|
|
28
|
+
const commonDir = common ? path.resolve(gitDir, common) : gitDir;
|
|
29
|
+
return readText(path.join(gitDir, ref)).trim()
|
|
30
|
+
|| readText(path.join(commonDir, ref)).trim()
|
|
31
|
+
|| readText(path.join(commonDir, 'packed-refs')).split('\n').find(line => line.endsWith(` ${ref}`))
|
|
32
|
+
|| head;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Root/version identity plus the portable corpus digest. Its per-root stat
|
|
36
|
+
* receipt avoids rereading unchanged source contents and detects uncommitted
|
|
37
|
+
* edits as well as manifest/package/HEAD changes.
|
|
38
|
+
*/
|
|
39
|
+
function sourceFingerprint(root) {
|
|
40
|
+
const hash = createHash('sha256').update('framework-capabilities-v2');
|
|
41
|
+
hash.update(path.resolve(root));
|
|
42
|
+
try {
|
|
43
|
+
hash.update(JSON.parse(readText(path.join(root, 'package.json'))).version ?? '');
|
|
44
|
+
}
|
|
45
|
+
catch { /* fixture root */ }
|
|
46
|
+
hash.update(gitHead(root));
|
|
47
|
+
hash.update(frameworkSourceDigest(root));
|
|
48
|
+
for (const kind of CORPUS_KINDS) {
|
|
49
|
+
const dir = path.join(root, 'agentic/code', kind);
|
|
50
|
+
let entries;
|
|
51
|
+
try {
|
|
52
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
hash.update(kind).update(readText(path.join(dir, 'manifest.json')));
|
|
58
|
+
for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
59
|
+
if (!entry.isDirectory() || entry.name.startsWith('.'))
|
|
60
|
+
continue;
|
|
61
|
+
hash.update(entry.name).update(readText(path.join(dir, entry.name, 'manifest.json')));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return hash.digest('hex');
|
|
65
|
+
}
|
|
66
|
+
/** Stat signatures also notice manual rebuilds, deleted caches, and replacement indexes. */
|
|
67
|
+
function fileSignature(file) {
|
|
68
|
+
try {
|
|
69
|
+
const stat = fs.statSync(file, { bigint: true });
|
|
70
|
+
return `${stat.dev}:${stat.ino}:${stat.size}:${stat.mtimeNs}:${stat.ctimeNs}`;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return '';
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function readReceipt(file) {
|
|
77
|
+
try {
|
|
78
|
+
return JSON.parse(readText(file));
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Reconcile only when a cheap source/index receipt changes. Contenders serve an
|
|
86
|
+
* existing index after a short wait; cold starts wait for the first builder.
|
|
87
|
+
* The shared directory lock recovers owners proven dead on this host.
|
|
88
|
+
*/
|
|
89
|
+
export async function refreshFrameworkCapabilities(root, syncFortemi = true, options = {}) {
|
|
90
|
+
const corpusRoot = resolveFrameworkCorpusRoot(root);
|
|
91
|
+
if (!corpusRoot)
|
|
92
|
+
return;
|
|
93
|
+
root = corpusRoot;
|
|
94
|
+
const dir = getGraphIndexDir(root, 'framework');
|
|
95
|
+
const receiptPath = path.join(dir, 'capability-sources.json');
|
|
96
|
+
const metadataPath = path.join(dir, 'metadata.json');
|
|
97
|
+
const fortemiDir = path.join(path.dirname(dir), 'fortemi-core', 'framework');
|
|
98
|
+
const fortemiSignature = () => [
|
|
99
|
+
'manifest.json', 'aiwg-fortemi-index-v2.json',
|
|
100
|
+
].map(file => fileSignature(path.join(fortemiDir, file))).join('|');
|
|
101
|
+
const source = sourceFingerprint(root);
|
|
102
|
+
const current = () => ({
|
|
103
|
+
source, index: fileSignature(metadataPath), relations: fileSignature(path.join(dir, 'relations.json')), ...(syncFortemi ? { fortemi: fortemiSignature() } : {}),
|
|
104
|
+
});
|
|
105
|
+
const matches = (receipt, probe) => Boolean(!options.force && receipt && probe.index && probe.relations && receipt.relations === probe.relations && receipt.source === probe.source
|
|
106
|
+
&& receipt.index === probe.index && (!syncFortemi || receipt.fortemi === probe.fortemi));
|
|
107
|
+
if (matches(readReceipt(receiptPath), current()))
|
|
108
|
+
return;
|
|
109
|
+
let release;
|
|
110
|
+
try {
|
|
111
|
+
release = await acquireDirectoryLock(path.join(dir, 'capability-refresh.lock'), {
|
|
112
|
+
timeoutMs: fs.existsSync(metadataPath) ? 150 : 60_000,
|
|
113
|
+
pollMs: 25,
|
|
114
|
+
reclaimDeadOwner: true,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
if (error instanceof DirectoryLockContentionError && fs.existsSync(metadataPath))
|
|
119
|
+
return;
|
|
120
|
+
throw error;
|
|
121
|
+
}
|
|
122
|
+
try {
|
|
123
|
+
// Another process may have completed reconciliation while we waited.
|
|
124
|
+
const receipt = readReceipt(receiptPath);
|
|
125
|
+
const probe = current();
|
|
126
|
+
if (matches(receipt, probe))
|
|
127
|
+
return;
|
|
128
|
+
if (options.force || !receipt || !probe.index || receipt.source !== source || receipt.index !== probe.index || !probe.relations || receipt.relations !== probe.relations) {
|
|
129
|
+
const { buildIndex } = await import('./index-builder.js');
|
|
130
|
+
await buildIndex(root, { graph: 'framework', explicit: false, quiet: true });
|
|
131
|
+
}
|
|
132
|
+
// A forced source scan can be a no-op. The prior successful receipt still
|
|
133
|
+
// validates the exact index/export files, so avoid hashing the export again.
|
|
134
|
+
const updated = current();
|
|
135
|
+
const cacheUnchanged = receipt && updated.index && receipt.source === source
|
|
136
|
+
&& receipt.index === updated.index && receipt.fortemi === updated.fortemi;
|
|
137
|
+
if (syncFortemi && !cacheUnchanged) {
|
|
138
|
+
const { getFortemiCoreSyncStatus, syncFortemiCoreIndex } = await import('./fortemi-core-sync.js');
|
|
139
|
+
const status = getFortemiCoreSyncStatus(root, 'framework');
|
|
140
|
+
const indexChanged = receipt?.index ? receipt.index !== updated.index : probe.index !== updated.index;
|
|
141
|
+
if (indexChanged || !status.built || status.stale)
|
|
142
|
+
syncFortemiCoreIndex(root, { graph: 'framework' });
|
|
143
|
+
}
|
|
144
|
+
// Publish only after success. A failed rebuild/sync is retried next call.
|
|
145
|
+
const temp = `${receiptPath}.${process.pid}.tmp`;
|
|
146
|
+
fs.writeFileSync(temp, JSON.stringify(current()));
|
|
147
|
+
fs.renameSync(temp, receiptPath);
|
|
148
|
+
}
|
|
149
|
+
finally {
|
|
150
|
+
await release();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/** Installation is recorded in project config, independently of index coverage. */
|
|
154
|
+
export async function isCorpusBundleInstalled(cwd, root, kind, id) {
|
|
155
|
+
if (!kind || !id)
|
|
156
|
+
return false;
|
|
157
|
+
const { readAiwgConfigCandidate } = await import('../config/aiwg-config.js');
|
|
158
|
+
const config = await readAiwgConfigCandidate(cwd);
|
|
159
|
+
if (!config)
|
|
160
|
+
return false;
|
|
161
|
+
if (config.installed[id] || (kind === 'framework' && config.installed.all))
|
|
162
|
+
return true;
|
|
163
|
+
try {
|
|
164
|
+
const manifest = JSON.parse(fs.readFileSync(path.join(root, 'agentic/code', `${kind}s`, id, 'manifest.json'), 'utf8'));
|
|
165
|
+
return (manifest.modeAliases ?? []).some(alias => Boolean(config.installed[alias]));
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=framework-capabilities.js.map
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { createHash } from 'node:crypto';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
export const FRAMEWORK_CORPUS_KINDS = ['frameworks', 'addons', 'extensions', 'agents', 'behaviors'];
|
|
7
|
+
function canonicalPath(candidate) {
|
|
8
|
+
try {
|
|
9
|
+
return fs.realpathSync(candidate);
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return path.resolve(candidate);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/** Only an AIWG package/repository owns the corpus, never a project or bundle. */
|
|
16
|
+
export function resolveFrameworkCorpusRoot(candidate) {
|
|
17
|
+
let root = canonicalPath(candidate);
|
|
18
|
+
while (true) {
|
|
19
|
+
try {
|
|
20
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8'));
|
|
21
|
+
if (pkg.name === 'aiwg' && FRAMEWORK_CORPUS_KINDS.every(kind => fs.statSync(path.join(root, 'agentic/code', kind)).isDirectory()))
|
|
22
|
+
return canonicalPath(root);
|
|
23
|
+
}
|
|
24
|
+
catch { /* keep looking for the owning package */ }
|
|
25
|
+
const parent = path.dirname(root);
|
|
26
|
+
if (parent === root)
|
|
27
|
+
return null;
|
|
28
|
+
root = parent;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** Works in both src/ and dist/src/, including corpus-free CLI packages. */
|
|
32
|
+
function modulePackageRoot() {
|
|
33
|
+
let root = path.dirname(fileURLToPath(import.meta.url));
|
|
34
|
+
while (true) {
|
|
35
|
+
try {
|
|
36
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8'));
|
|
37
|
+
if (pkg.name === 'aiwg' || pkg.name === '@aiwg/cli')
|
|
38
|
+
return canonicalPath(root);
|
|
39
|
+
}
|
|
40
|
+
catch { /* keep looking for the owning distribution */ }
|
|
41
|
+
const parent = path.dirname(root);
|
|
42
|
+
if (parent === root)
|
|
43
|
+
throw new Error('Cannot resolve the AIWG package root for the framework index');
|
|
44
|
+
root = parent;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** Builders, readers and reconciliation must select the same owning root. */
|
|
48
|
+
export function resolveFrameworkIndexRoot(cwd) {
|
|
49
|
+
return resolveFrameworkCorpusRoot(cwd)
|
|
50
|
+
?? (process.env.AIWG_ROOT
|
|
51
|
+
? resolveFrameworkCorpusRoot(process.env.AIWG_ROOT) ?? canonicalPath(process.env.AIWG_ROOT)
|
|
52
|
+
: modulePackageRoot());
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Shared across projects using this package, isolated from other AIWG roots.
|
|
56
|
+
* Keep the key stable across upgrades: the fingerprint receipt handles source
|
|
57
|
+
* changes, avoiding abandoned directories for every version/commit. All graph
|
|
58
|
+
* sidecars (including relationships) belong beneath this root's framework dir.
|
|
59
|
+
* Legacy unkeyed indexes are left alone; reconciliation builds once here.
|
|
60
|
+
*/
|
|
61
|
+
export function getFrameworkIndexBaseDir(cwd) {
|
|
62
|
+
const root = resolveFrameworkIndexRoot(cwd);
|
|
63
|
+
const key = createHash('sha256').update(root).digest('hex');
|
|
64
|
+
// A lane may share the immutable checkout corpus across isolated homes.
|
|
65
|
+
// Restrict the override to its declared source: fixture/package roots,
|
|
66
|
+
// project graphs and user graphs retain their normal isolation.
|
|
67
|
+
const shared = process.env.AIWG_FRAMEWORK_INDEX_CACHE;
|
|
68
|
+
const source = process.env.AIWG_FRAMEWORK_INDEX_CACHE_SOURCE;
|
|
69
|
+
const xdgData = shared && source && canonicalPath(source) === root
|
|
70
|
+
? shared : process.env.XDG_DATA_HOME ?? path.join(os.homedir(), '.local', 'share');
|
|
71
|
+
return path.join(xdgData, 'aiwg', 'index', 'roots', key);
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=framework-index-paths.js.map
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/** Portable corpus identity; stat receipts are isolated by the #3310 root key. */
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { createHash } from 'node:crypto';
|
|
5
|
+
import { BUILTIN_GRAPH_CONFIGS, INDEX_EXTRACTOR_VERSION, getGraphIndexDir } from './types.js';
|
|
6
|
+
export const FRAMEWORK_RELATIONS_REVISION = 3;
|
|
7
|
+
const REVISION = FRAMEWORK_RELATIONS_REVISION;
|
|
8
|
+
const sha256 = (value) => createHash('sha256').update(value).digest('hex');
|
|
9
|
+
/** No absolute paths, git revision or mtimes enter the portable digest. */
|
|
10
|
+
export function frameworkSourceDigest(root, cache = true) {
|
|
11
|
+
const receiptPath = path.join(getGraphIndexDir(root, 'framework'), 'relationship-sources.json');
|
|
12
|
+
let previous;
|
|
13
|
+
if (cache) {
|
|
14
|
+
try {
|
|
15
|
+
const receipt = JSON.parse(fs.readFileSync(receiptPath, 'utf8'));
|
|
16
|
+
if (receipt.version === REVISION && receipt.files && typeof receipt.files === 'object')
|
|
17
|
+
previous = receipt;
|
|
18
|
+
}
|
|
19
|
+
catch { /* cold/corrupt root receipt */ }
|
|
20
|
+
}
|
|
21
|
+
const files = {};
|
|
22
|
+
const config = BUILTIN_GRAPH_CONFIGS.framework;
|
|
23
|
+
const walk = (dir, extensions = config.extensions) => {
|
|
24
|
+
let children;
|
|
25
|
+
try {
|
|
26
|
+
children = fs.readdirSync(dir, { withFileTypes: true });
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
for (const child of children) {
|
|
32
|
+
if (child.name.startsWith('.') || child.isSymbolicLink())
|
|
33
|
+
continue;
|
|
34
|
+
const file = path.join(dir, child.name);
|
|
35
|
+
if (child.isDirectory())
|
|
36
|
+
walk(file, extensions);
|
|
37
|
+
else if (child.isFile() && extensions.some(ext => child.name.endsWith(ext))
|
|
38
|
+
// These development-only corpus files are excluded by package.files.
|
|
39
|
+
&& !/^(package(?:-lock)?|tsconfig)\.json$/.test(child.name))
|
|
40
|
+
add(file);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
const add = (file, logicalPath) => {
|
|
44
|
+
const relative = logicalPath ?? path.relative(root, file).split(path.sep).join('/');
|
|
45
|
+
const stat = fs.statSync(file);
|
|
46
|
+
const signature = `${stat.dev}:${stat.ino}:${stat.size}:${stat.mtimeMs}:${stat.ctimeMs}`;
|
|
47
|
+
const old = previous?.version === REVISION ? previous.files[relative] : undefined;
|
|
48
|
+
files[relative] = { stat: signature, checksum: old?.stat === signature && /^[a-f0-9]{64}$/.test(old.checksum) ? old.checksum : sha256(fs.readFileSync(file)) };
|
|
49
|
+
};
|
|
50
|
+
for (const dir of config.scanDirs)
|
|
51
|
+
walk(path.join(root, dir));
|
|
52
|
+
// Provider configuration and projection logic are inputs to the resolved table.
|
|
53
|
+
walk(path.join(root, 'schemas/providers'));
|
|
54
|
+
walk(path.join(root, 'tools/agents/providers'), ['.mjs']);
|
|
55
|
+
// The source .mjs is copied verbatim into dist/; use one logical input key
|
|
56
|
+
// so a packed install and its checkout have exactly the same digest.
|
|
57
|
+
const activationKey = 'src/rules/activation.mjs';
|
|
58
|
+
const activation = [path.join(root, activationKey), path.join(root, 'dist', activationKey)]
|
|
59
|
+
.find(file => fs.existsSync(file));
|
|
60
|
+
if (activation)
|
|
61
|
+
add(activation, activationKey);
|
|
62
|
+
const sources = Object.keys(files).sort().map(file => [file, files[file].checksum]);
|
|
63
|
+
const digest = `sha256:${sha256(JSON.stringify({ revision: REVISION, extractor: INDEX_EXTRACTOR_VERSION, config, sources }))}`;
|
|
64
|
+
if (cache) {
|
|
65
|
+
const text = JSON.stringify({ version: REVISION, files });
|
|
66
|
+
if (text !== JSON.stringify(previous)) {
|
|
67
|
+
fs.mkdirSync(path.dirname(receiptPath), { recursive: true });
|
|
68
|
+
const temp = `${receiptPath}.${process.pid}.tmp`;
|
|
69
|
+
fs.writeFileSync(temp, text);
|
|
70
|
+
fs.renameSync(temp, receiptPath);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return digest;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=framework-source-digest.js.map
|