@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
|
@@ -10,6 +10,7 @@ import fs from 'fs';
|
|
|
10
10
|
import path from 'path';
|
|
11
11
|
import { DEFAULT_INDEX_EXTENSIONS, GRAPH_CONFIGS, resolveGraphScanDir, } from './types.js';
|
|
12
12
|
import { DEFAULT_PROJECT_AIWG_DIR, resolveProjectAiwgDir, } from '../config/project-artifacts.js';
|
|
13
|
+
import { dropGitignored } from '../config/gitignore.js';
|
|
13
14
|
import { workspaceLinkedFiles } from '../smiths/context-pipeline/workspace-context.js';
|
|
14
15
|
import { discoverProjectLocalBundles } from '../extensions/project-local-discovery.js';
|
|
15
16
|
function pathContains(parent, child) {
|
|
@@ -32,16 +33,18 @@ export function indexPathFor(cwd, fullPath, graph) {
|
|
|
32
33
|
return toPosixPath(relative);
|
|
33
34
|
return fullPath;
|
|
34
35
|
}
|
|
35
|
-
export function findArtifactFiles(dir, extensions = DEFAULT_INDEX_EXTENSIONS) {
|
|
36
|
-
return walkArtifactFiles(dir, extensions, new Set());
|
|
36
|
+
export function findArtifactFiles(dir, extensions = DEFAULT_INDEX_EXTENSIONS, acceptPath = () => true) {
|
|
37
|
+
return walkArtifactFiles(dir, extensions, new Set(), acceptPath);
|
|
37
38
|
}
|
|
38
39
|
/** Recursively find indexable files, excluding hidden directories such as .index. */
|
|
39
|
-
function walkArtifactFiles(dir, extensions, seenRealDirs,
|
|
40
|
+
function walkArtifactFiles(dir, extensions, seenRealDirs, acceptPath, knownStat) {
|
|
40
41
|
const results = [];
|
|
41
|
-
if (!fs.existsSync(dir))
|
|
42
|
+
if (!fs.existsSync(dir) || !acceptPath(dir, knownStat))
|
|
42
43
|
return results;
|
|
43
44
|
let realDir;
|
|
44
45
|
try {
|
|
46
|
+
if ((knownStat ?? fs.lstatSync(dir)).isSymbolicLink())
|
|
47
|
+
return results;
|
|
45
48
|
realDir = fs.realpathSync(dir);
|
|
46
49
|
}
|
|
47
50
|
catch {
|
|
@@ -55,8 +58,8 @@ function walkArtifactFiles(dir, extensions, seenRealDirs, boundary) {
|
|
|
55
58
|
const fullPath = path.join(dir, entry.name);
|
|
56
59
|
let stat;
|
|
57
60
|
try {
|
|
58
|
-
stat = fs.
|
|
59
|
-
if (
|
|
61
|
+
stat = fs.lstatSync(fullPath);
|
|
62
|
+
if (stat.isSymbolicLink() || !acceptPath(fullPath, stat, dir))
|
|
60
63
|
continue;
|
|
61
64
|
}
|
|
62
65
|
catch {
|
|
@@ -65,7 +68,7 @@ function walkArtifactFiles(dir, extensions, seenRealDirs, boundary) {
|
|
|
65
68
|
if (stat.isDirectory()) {
|
|
66
69
|
if (entry.name.startsWith('.'))
|
|
67
70
|
continue;
|
|
68
|
-
results.push(...walkArtifactFiles(fullPath, extensions, seenRealDirs,
|
|
71
|
+
results.push(...walkArtifactFiles(fullPath, extensions, seenRealDirs, acceptPath, stat));
|
|
69
72
|
}
|
|
70
73
|
else if (stat.isFile() && extensions.some(extension => entry.name.endsWith(extension))) {
|
|
71
74
|
results.push(fullPath);
|
|
@@ -73,22 +76,96 @@ function walkArtifactFiles(dir, extensions, seenRealDirs, boundary) {
|
|
|
73
76
|
}
|
|
74
77
|
return results;
|
|
75
78
|
}
|
|
79
|
+
/** Runtime and acquisition scratch beneath either the local or relocated artifact root. */
|
|
80
|
+
export const INDEX_SCRATCH_DIRS = [
|
|
81
|
+
'working', 'sessions', 'scratch', 'tmp', 'temp', 'cache', '.index', '.cache', '.storage-cache',
|
|
82
|
+
];
|
|
76
83
|
/** Return the exact current source-file set used by a standard graph build. */
|
|
77
|
-
export async function collectGraphIndexFiles(cwd, graph) {
|
|
84
|
+
export async function collectGraphIndexFiles(cwd, graph, options = {}) {
|
|
78
85
|
const config = graph ? GRAPH_CONFIGS[graph] : undefined;
|
|
79
86
|
if (graph && !config) {
|
|
80
87
|
throw new Error(`Unknown graph: ${graph}`);
|
|
81
88
|
}
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
const
|
|
89
|
+
const artifactRoot = resolveProjectAiwgDir(cwd);
|
|
90
|
+
const excludedDirs = [path.join(cwd, DEFAULT_PROJECT_AIWG_DIR), artifactRoot]
|
|
91
|
+
.flatMap(root => INDEX_SCRATCH_DIRS.map(name => path.resolve(root, name)));
|
|
92
|
+
const excludedPaths = new Set(excludedDirs);
|
|
93
|
+
// A directory's ancestors are shared by thousands of sibling artifacts.
|
|
94
|
+
// Cache only within this scan so the next build still notices new symlinks.
|
|
95
|
+
const safePaths = new Map();
|
|
96
|
+
const roots = [artifactRoot, cwd].map(root => path.resolve(root));
|
|
97
|
+
const artifactPrefix = roots[0].endsWith(path.sep) ? roots[0] : roots[0] + path.sep;
|
|
98
|
+
const acceptPath = (file, knownStat, parent) => {
|
|
99
|
+
// The walker already checked this parent and rejected symlink entries.
|
|
100
|
+
// A regular file cannot introduce an excluded ancestor; only an exact
|
|
101
|
+
// excluded path remains to check. Avoid normalizing and memoizing every
|
|
102
|
+
// leaf merely to repeat its parent's proof thousands of times.
|
|
103
|
+
if (parent && knownStat?.isFile() && safePaths.get(parent) === true) {
|
|
104
|
+
if (process.platform === 'win32'
|
|
105
|
+
? excludedDirs.some(dir => pathContains(dir, file)) : excludedPaths.has(file))
|
|
106
|
+
return false;
|
|
107
|
+
options.fileStats?.set(file, knownStat);
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
const inputPath = file;
|
|
111
|
+
file = path.resolve(file);
|
|
112
|
+
if (excludedDirs.some(dir => process.platform === 'win32'
|
|
113
|
+
? pathContains(dir, file) : file === dir || file.startsWith(dir + path.sep)))
|
|
114
|
+
return false;
|
|
115
|
+
if (knownStat && !knownStat.isSymbolicLink() && safePaths.get(path.dirname(file)) === true) {
|
|
116
|
+
if (knownStat.isFile())
|
|
117
|
+
options.fileStats?.set(inputPath, knownStat);
|
|
118
|
+
safePaths.set(file, true);
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
// Explicit scopes and workspace links can start below a symlink. Check
|
|
122
|
+
// their ancestors too, stopping at the authorized root (which may be external).
|
|
123
|
+
const inArtifactRoot = process.platform === 'win32'
|
|
124
|
+
? pathContains(roots[0], file) : file === roots[0] || file.startsWith(artifactPrefix);
|
|
125
|
+
const root = inArtifactRoot ? roots[0] : roots[1];
|
|
126
|
+
let current = file;
|
|
127
|
+
const checked = [];
|
|
128
|
+
let safe = true;
|
|
129
|
+
while (pathContains(root, current)) {
|
|
130
|
+
if (safePaths.has(current)) {
|
|
131
|
+
safe = safePaths.get(current);
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
checked.push(current);
|
|
135
|
+
try {
|
|
136
|
+
const stat = current === file && knownStat ? knownStat : fs.lstatSync(current);
|
|
137
|
+
if (stat.isSymbolicLink()) {
|
|
138
|
+
safe = false;
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
if (current === file && stat.isFile())
|
|
142
|
+
options.fileStats?.set(inputPath, stat);
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
safe = false;
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
if (current === root)
|
|
149
|
+
break;
|
|
150
|
+
current = path.dirname(current);
|
|
151
|
+
}
|
|
152
|
+
for (const candidate of checked)
|
|
153
|
+
safePaths.set(candidate, safe);
|
|
154
|
+
return safe;
|
|
155
|
+
};
|
|
156
|
+
const scanDirs = options.scope
|
|
157
|
+
? [path.resolve(cwd, options.scope)]
|
|
158
|
+
: config
|
|
159
|
+
? config.scanDirs.map(directory => resolveGraphScanDir(cwd, directory))
|
|
160
|
+
: [artifactRoot];
|
|
161
|
+
const extensions = options.scope ? DEFAULT_INDEX_EXTENSIONS : config?.extensions ?? DEFAULT_INDEX_EXTENSIONS;
|
|
86
162
|
const files = new Set();
|
|
163
|
+
const ignoreRoots = new Set([cwd, ...scanDirs.filter(dir => !pathContains(cwd, dir))]);
|
|
87
164
|
for (const scanDir of scanDirs) {
|
|
88
|
-
for (const file of findArtifactFiles(scanDir, extensions))
|
|
165
|
+
for (const file of findArtifactFiles(scanDir, extensions, acceptPath))
|
|
89
166
|
files.add(file);
|
|
90
167
|
}
|
|
91
|
-
if (!graph || graph === 'project') {
|
|
168
|
+
if (!options.scope && (!graph || graph === 'project')) {
|
|
92
169
|
// Additional search roots authorize bundle payloads, not the surrounding
|
|
93
170
|
// external corpus. Reuse deployment's validated source resolution, including
|
|
94
171
|
// plugin payloads, and prevent payload symlinks from escaping that boundary.
|
|
@@ -96,8 +173,9 @@ export async function collectGraphIndexFiles(cwd, graph) {
|
|
|
96
173
|
for (const bundle of bundles) {
|
|
97
174
|
if (scanDirs.some(scanDir => pathContains(scanDir, bundle.artifactPath)))
|
|
98
175
|
continue;
|
|
99
|
-
|
|
100
|
-
|
|
176
|
+
if (!pathContains(cwd, bundle.artifactPath))
|
|
177
|
+
ignoreRoots.add(bundle.artifactPath);
|
|
178
|
+
for (const file of findArtifactFiles(bundle.artifactPath, extensions, acceptPath)) {
|
|
101
179
|
files.add(file);
|
|
102
180
|
}
|
|
103
181
|
}
|
|
@@ -107,10 +185,46 @@ export async function collectGraphIndexFiles(cwd, graph) {
|
|
|
107
185
|
...await workspaceLinkedFiles(cwd),
|
|
108
186
|
];
|
|
109
187
|
for (const contextFile of contextFiles) {
|
|
110
|
-
if (extensions.some(extension => contextFile.endsWith(extension)))
|
|
188
|
+
if (acceptPath(contextFile) && extensions.some(extension => contextFile.endsWith(extension)))
|
|
111
189
|
files.add(contextFile);
|
|
112
190
|
}
|
|
113
191
|
}
|
|
114
|
-
|
|
192
|
+
let sources = [...files];
|
|
193
|
+
if (!options.includeIgnored) {
|
|
194
|
+
// Many projects ignore the whole artifact root (`.aiwg/`). Honoring that
|
|
195
|
+
// would empty the index, so ignore rules apply only beneath a scan root
|
|
196
|
+
// that is not itself ignored; runtime directories are excluded regardless.
|
|
197
|
+
const exemptRoots = [];
|
|
198
|
+
if (!options.scope) {
|
|
199
|
+
// Sibling roots use the same Git context. Probe them together without
|
|
200
|
+
// merging external roots or changing which ignored roots are exempt.
|
|
201
|
+
const byParent = new Map();
|
|
202
|
+
for (const dir of scanDirs.filter(dir => fs.existsSync(dir))) {
|
|
203
|
+
const parent = path.dirname(dir);
|
|
204
|
+
const siblings = byParent.get(parent) ?? [];
|
|
205
|
+
siblings.push(dir);
|
|
206
|
+
byParent.set(parent, siblings);
|
|
207
|
+
}
|
|
208
|
+
for (const [parent, siblings] of byParent) {
|
|
209
|
+
const kept = new Set(dropGitignored(parent, siblings));
|
|
210
|
+
exemptRoots.push(...siblings.filter(dir => !kept.has(dir)));
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
const isExempt = (file) => exemptRoots.some(dir => pathContains(dir, file));
|
|
214
|
+
// Git rejects paths outside its worktree. Filter authorized external roots
|
|
215
|
+
// separately so they cannot disable ignore filtering for local sources.
|
|
216
|
+
for (const root of ignoreRoots) {
|
|
217
|
+
const candidates = sources.filter(file => pathContains(root, file) && !isExempt(file));
|
|
218
|
+
const kept = new Set(dropGitignored(root, candidates));
|
|
219
|
+
sources = sources.filter(file => !pathContains(root, file) || isExempt(file) || kept.has(file));
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
if (options.fileStats) {
|
|
223
|
+
const selected = new Set(sources);
|
|
224
|
+
for (const file of options.fileStats.keys())
|
|
225
|
+
if (!selected.has(file))
|
|
226
|
+
options.fileStats.delete(file);
|
|
227
|
+
}
|
|
228
|
+
return sources;
|
|
115
229
|
}
|
|
116
230
|
//# sourceMappingURL=index-files.js.map
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/** Bounded artifact-local preparation; ordered graph reduction stays in index-builder. */
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import { Worker } from 'node:worker_threads';
|
|
4
|
+
export function indexPreparationWorkers(jobs, requested, cores = os.availableParallelism(), memory = Math.min(os.freemem(), process.availableMemory?.() ?? Infinity), totalBytes = 0) {
|
|
5
|
+
if (requested !== undefined && (!Number.isInteger(requested) || requested < 0))
|
|
6
|
+
throw new Error('Index workers must be a nonnegative integer');
|
|
7
|
+
if (jobs < 64 || cores < 3 || requested === 0 || requested === 1)
|
|
8
|
+
return 0;
|
|
9
|
+
// Thread startup costs dominate lightweight scans even at thousands of files.
|
|
10
|
+
// Explicit thread requests bypass only this conservative automatic workload gate.
|
|
11
|
+
if (requested === undefined && (jobs < 1000 || !Number.isFinite(totalBytes) || totalBytes < 16 * 1024 ** 2))
|
|
12
|
+
return 0;
|
|
13
|
+
const byMemory = Math.floor((memory - 512 * 1024 ** 2) / (256 * 1024 ** 2));
|
|
14
|
+
const bounded = Math.max(0, Math.min(requested ?? 4, 4, cores - 1, byMemory, jobs));
|
|
15
|
+
return bounded >= 2 ? bounded : 0;
|
|
16
|
+
}
|
|
17
|
+
export async function runIndexPreparation(jobs, serial, moduleUrl, requested) {
|
|
18
|
+
const workerCount = indexPreparationWorkers(jobs.length, requested, undefined, undefined, jobs.reduce((total, job) => total + job.sizeBytes, 0));
|
|
19
|
+
if (!workerCount)
|
|
20
|
+
return { results: jobs.map(serial), workerCount: 0 };
|
|
21
|
+
const results = new Array(jobs.length), workers = [];
|
|
22
|
+
let next = 0, completed = 0, stopped = false;
|
|
23
|
+
try {
|
|
24
|
+
await new Promise((resolve, reject) => {
|
|
25
|
+
const fail = (error) => { stopped = true; reject(error); };
|
|
26
|
+
const dispatch = (worker) => {
|
|
27
|
+
if (!stopped && next < jobs.length) {
|
|
28
|
+
const index = next++;
|
|
29
|
+
worker.postMessage({ index, job: jobs[index] });
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
for (let index = 0; index < workerCount; index++) {
|
|
33
|
+
const worker = new Worker(new URL('./index-worker.mjs', import.meta.url), {
|
|
34
|
+
workerData: { moduleUrl }, execArgv: [], resourceLimits: { maxOldGenerationSizeMb: 256 },
|
|
35
|
+
});
|
|
36
|
+
workers.push(worker);
|
|
37
|
+
worker.on('error', fail);
|
|
38
|
+
worker.on('exit', code => { if (!stopped && completed < jobs.length)
|
|
39
|
+
fail(new Error(`Index preparation worker exited early (${code})`)); });
|
|
40
|
+
worker.on('message', message => {
|
|
41
|
+
if (stopped)
|
|
42
|
+
return;
|
|
43
|
+
if (message.error) {
|
|
44
|
+
fail(new Error(message.error));
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
results[message.index] = message.result;
|
|
48
|
+
completed++;
|
|
49
|
+
if (completed === jobs.length) {
|
|
50
|
+
stopped = true;
|
|
51
|
+
resolve();
|
|
52
|
+
}
|
|
53
|
+
else
|
|
54
|
+
dispatch(worker);
|
|
55
|
+
});
|
|
56
|
+
dispatch(worker);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
return { results, workerCount };
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
await Promise.all(workers.map(worker => worker.terminate()));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=index-preparation.js.map
|