akm-cli 0.9.17-alpha.2 → 0.9.17-alpha.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/CHANGELOG.md +756 -0
- package/dist/akm +94 -196
- package/dist/cli/shared.js +6 -2
- package/dist/cli.js +22 -9
- package/dist/commands/agent/agent-dispatch.js +1 -1
- package/dist/commands/command/command-execution.js +24 -62
- package/dist/commands/feedback-cli.js +0 -1
- package/dist/commands/health/accept-rate.js +2 -2
- package/dist/commands/health/checks.js +30 -75
- package/dist/commands/health/config-skew.js +38 -0
- package/dist/commands/health/egress.js +54 -0
- package/dist/commands/health/html-report.js +0 -38
- package/dist/commands/health/improve-metrics.js +123 -562
- package/dist/commands/health/plugin-staleness.js +53 -3
- package/dist/commands/health/renderers.js +12 -4
- package/dist/commands/health/report-view-model.js +11 -106
- package/dist/commands/health/types-improve.js +4 -19
- package/dist/commands/health/windows.js +64 -73
- package/dist/commands/health.js +122 -143
- package/dist/commands/improve/consolidate/chunking.js +25 -100
- package/dist/commands/improve/consolidate/sanitize.js +54 -149
- package/dist/commands/improve/consolidate.js +538 -1075
- package/dist/commands/improve/content-hash.js +16 -24
- package/dist/commands/improve/distill/content-repair.js +18 -100
- package/dist/commands/improve/distill-guards.js +20 -81
- package/dist/commands/improve/distill-promotion-policy.js +23 -243
- package/dist/commands/improve/distill.js +608 -1075
- package/dist/commands/improve/eligibility.js +126 -400
- package/dist/commands/improve/execution.js +3 -5
- package/dist/commands/improve/extract.js +487 -1046
- package/dist/commands/improve/feedback-valence.js +0 -25
- package/dist/commands/improve/improve-cli.js +29 -166
- package/dist/commands/improve/improve-result-file.js +10 -66
- package/dist/commands/improve/improve-strategies.js +12 -7
- package/dist/commands/improve/improve-usage-report.js +18 -64
- package/dist/commands/improve/improve.js +443 -1063
- package/dist/commands/improve/ledger.js +114 -0
- package/dist/commands/improve/locks.js +2 -8
- package/dist/commands/improve/loop-stages.js +459 -1172
- package/dist/commands/improve/memory/derived-ref.js +12 -77
- package/dist/commands/improve/memory/memory-belief.js +14 -118
- package/dist/commands/improve/memory/memory-improve.js +4 -3
- package/dist/commands/improve/outcome-loop.js +28 -156
- package/dist/commands/improve/planner.js +5 -10
- package/dist/commands/improve/preparation.js +851 -2339
- package/dist/commands/improve/proactive-maintenance.js +34 -101
- package/dist/commands/improve/reflect-noise.js +104 -280
- package/dist/commands/improve/reflect.js +621 -1367
- package/dist/commands/improve/salience.js +46 -232
- package/dist/commands/improve/session-asset.js +19 -100
- package/dist/commands/improve/stage.js +323 -0
- package/dist/commands/proposal/drain.js +251 -644
- package/dist/commands/proposal/proposal-cli.js +3 -18
- package/dist/commands/proposal/proposal-types.js +20 -41
- package/dist/commands/proposal/proposal.js +1 -2
- package/dist/commands/proposal/propose.js +134 -160
- package/dist/commands/proposal/repository.js +502 -1487
- package/dist/commands/proposal/validators/proposal-quality-validators.js +71 -174
- package/dist/commands/proposal/validators/proposal-validators.js +1 -1
- package/dist/commands/proposal/validators/proposals.js +13 -89
- package/dist/commands/read/curate.js +63 -413
- package/dist/commands/read/search-cli.js +16 -33
- package/dist/commands/read/search.js +17 -23
- package/dist/commands/read/show.js +2 -13
- package/dist/commands/sources/bundle-cli.js +25 -2
- package/dist/commands/sources/bundle-config-ops.js +7 -0
- package/dist/commands/sources/dangerous-env-audit.js +1 -2
- package/dist/commands/sources/info.js +2 -11
- package/dist/commands/sources/installed-stashes.js +197 -746
- package/dist/commands/sources/schema-repair.js +98 -129
- package/dist/commands/sources/source-add.js +62 -12
- package/dist/commands/sources/stash-cli.js +1 -1
- package/dist/commands/tasks/explain.js +10 -13
- package/dist/commands/tasks/tasks-cli.js +9 -8
- package/dist/commands/tasks/tasks.js +326 -930
- package/dist/commands/tasks/validate.js +42 -21
- package/dist/commands/workflow/plan.js +22 -29
- package/dist/commands/workflow-cli.js +4 -4
- package/dist/core/adapter/adapters/akm-adapter.js +0 -1
- package/dist/core/adapter/adapters/akm-lint.js +2 -3
- package/dist/core/adapter/adapters/akm-metadata.js +11 -12
- package/dist/core/adapter/adapters/akm-workflow-adapter.js +1 -1
- package/dist/core/adapter/execution-source.js +17 -29
- package/dist/core/asset/resolve-ref.js +1 -1
- package/dist/core/bundle-id.js +42 -5
- package/dist/core/bundle-rename.js +291 -0
- package/dist/core/config/config-io.js +1 -2
- package/dist/core/config/config-schema.js +1 -33
- package/dist/core/config/config-walker.js +1 -1
- package/dist/core/config/config.js +163 -68
- package/dist/core/config/legacy-source-shape-shim.js +38 -9
- package/dist/core/config/schema/embedding.js +20 -5
- package/dist/core/config/schema/engines.js +5 -0
- package/dist/core/config/schema/execution.js +1 -1
- package/dist/core/config/schema/experimental.js +1 -1
- package/dist/core/config/schema/improve-processes.js +21 -95
- package/dist/core/config/schema/improve.js +4 -42
- package/dist/core/config/schema/scheduler.js +12 -12
- package/dist/core/config/schema/search.js +6 -22
- package/dist/core/env-secret-ref.js +0 -1
- package/dist/core/errors.js +8 -9
- package/dist/core/file-lock.js +76 -173
- package/dist/core/logs-db.js +2 -2
- package/dist/core/paths.js +0 -27
- package/dist/core/redaction.js +109 -2
- package/dist/core/run-lock.js +2 -5
- package/dist/core/spawn-env.js +1 -1
- package/dist/core/state/migrations.js +108 -61
- package/dist/core/state-db-scope.js +2 -4
- package/dist/core/state-db.js +126 -692
- package/dist/core/type-presentation.js +1 -9
- package/dist/core/write-source.js +293 -1012
- package/dist/execution/input-contract.js +1 -1
- package/dist/execution/resolved-request.js +135 -689
- package/dist/execution/source.js +63 -257
- package/dist/execution/target-ref.js +1 -1
- package/dist/indexer/bundle-identity-guard.js +2 -2
- package/dist/indexer/db/graph-db.js +106 -46
- package/dist/indexer/ensure-index.js +44 -85
- package/dist/indexer/graph/graph-extraction.js +340 -562
- package/dist/indexer/graph/graph-related.js +130 -0
- package/dist/indexer/index-rebuild-lock.js +3 -11
- package/dist/indexer/index-writer-lock.js +8 -17
- package/dist/indexer/index-written-assets.js +139 -151
- package/dist/indexer/indexer.js +524 -846
- package/dist/indexer/materialize-embeddings.js +60 -397
- package/dist/indexer/passes/memory-inference.js +81 -90
- package/dist/indexer/passes/metadata.js +132 -200
- package/dist/indexer/read-preflight.js +0 -7
- package/dist/indexer/scan/doc-to-entry.js +1 -3
- package/dist/indexer/scan/drain-dir.js +1 -1
- package/dist/indexer/search/db-search.js +181 -590
- package/dist/indexer/search/fts-query.js +30 -41
- package/dist/indexer/search/ranking.js +28 -154
- package/dist/indexer/search/search-attribution.js +12 -32
- package/dist/indexer/search/search-fields.js +11 -15
- package/dist/indexer/search/search-hit-enrichers.js +54 -85
- package/dist/indexer/search/search-source.js +1 -4
- package/dist/indexer/usage/usage-events.js +2 -7
- package/dist/integrations/agent/engine-fallback.js +23 -40
- package/dist/integrations/agent/engine-resolution.js +93 -183
- package/dist/integrations/agent/execution.js +507 -0
- package/dist/integrations/agent/model-map.js +28 -156
- package/dist/integrations/agent/request-lowering.js +66 -141
- package/dist/integrations/agent/runner-dispatch.js +143 -321
- package/dist/integrations/agent/runner.js +54 -14
- package/dist/integrations/lockfile.js +53 -101
- package/dist/llm/embedders/deterministic.js +2 -3
- package/dist/llm/embedders/profile.js +71 -0
- package/dist/llm/embedders/remote.js +10 -15
- package/dist/llm/graph-extract.js +3 -12
- package/dist/llm/index-passes.js +3 -5
- package/dist/llm/memory-infer.js +1 -2
- package/dist/llm/metadata-enhance.js +1 -2
- package/dist/llm/structured-call.js +5 -24
- package/dist/output/generic-render.js +23 -11
- package/dist/output/html-render.js +13 -10
- package/dist/output/render-registry.js +3 -32
- package/dist/output/shapes/helpers.js +2 -34
- package/dist/output/shapes/passthrough.js +1 -9
- package/dist/{indexer/search/ranking-types.js → output/text/bundle-rename.js} +4 -1
- package/dist/output/text/command-format.js +60 -23
- package/dist/output/text/helpers.js +1 -1
- package/dist/output/text/migrate.js +5 -14
- package/dist/output/text/proposal-format.js +1 -2
- package/dist/output/text/workflow-format.js +0 -32
- package/dist/output/text.js +2 -0
- package/dist/registry/factory.js +4 -19
- package/dist/registry/network.js +66 -220
- package/dist/registry/providers/index.js +0 -2
- package/dist/registry/providers/skills-sh.js +3 -14
- package/dist/registry/providers/static-index.js +24 -26
- package/dist/registry/resolve.js +55 -131
- package/dist/scripts/akm-migrate-node.js +43937 -93313
- package/dist/scripts/akm-migrate.js +43697 -93071
- package/dist/setup/registry-stash-loader.js +4 -13
- package/dist/setup/semantic-assets.js +3 -44
- package/dist/setup/setup.js +1 -1
- package/dist/setup/steps/tasks.js +25 -15
- package/dist/sources/provider-factory.js +17 -18
- package/dist/sources/providers/filesystem.js +2 -3
- package/dist/sources/providers/git-install.js +7 -1
- package/dist/sources/providers/git-provider.js +0 -3
- package/dist/sources/providers/git-stash.js +0 -17
- package/dist/sources/providers/npm.js +2 -4
- package/dist/sources/providers/provider-utils.js +5 -10
- package/dist/sources/providers/website.js +0 -2
- package/dist/sources/snapshot-fetchers/website-ingest.js +1 -1
- package/dist/sources/website-url.js +2 -2
- package/dist/storage/database.js +9 -35
- package/dist/storage/repositories/improve-ledger-repository.js +168 -0
- package/dist/storage/repositories/index-connection.js +34 -70
- package/dist/storage/repositories/index-entries-repository.js +69 -111
- package/dist/storage/repositories/index-entry-mapper.js +1 -2
- package/dist/storage/repositories/index-entry-schema.js +83 -269
- package/dist/storage/repositories/index-fts-repository.js +86 -256
- package/dist/storage/repositories/index-llm-cache-repository.js +17 -0
- package/dist/storage/repositories/index-meta-repository.js +6 -4
- package/dist/storage/repositories/index-schema.js +192 -220
- package/dist/storage/repositories/index-utility-repository.js +8 -29
- package/dist/storage/repositories/index-vec-repository.js +133 -414
- package/dist/storage/repositories/outcome-repository.js +2 -1
- package/dist/storage/repositories/proposals-repository.js +35 -0
- package/dist/storage/repositories/registry-index-cache-repository.js +100 -0
- package/dist/storage/repositories/task-history-repository.js +26 -4
- package/dist/storage/repositories/workflow-runs-repository.js +53 -244
- package/dist/storage/sqlite-migrations.js +136 -0
- package/dist/storage/sqlite-pragmas.js +11 -9
- package/dist/storage/sqlite-transaction.js +170 -0
- package/dist/storage/state-db-integrity.js +34 -27
- package/dist/tasks/activation-config.js +134 -62
- package/dist/tasks/backends/cron.js +129 -277
- package/dist/tasks/backends/exec-utils.js +2 -5
- package/dist/tasks/backends/launchd.js +125 -745
- package/dist/tasks/backends/schtasks.js +101 -620
- package/dist/tasks/prepare/prepare-support.js +5 -15
- package/dist/tasks/prepare/prepare.js +0 -2
- package/dist/tasks/resolve-akm-bin.js +20 -79
- package/dist/tasks/run/attempt-lifecycle.js +0 -1
- package/dist/tasks/scheduler-binding.js +18 -238
- package/dist/tasks/scheduler-invocation.js +52 -52
- package/dist/tasks/scheduler-lock.js +53 -0
- package/dist/tasks/scheduler-sync.js +363 -679
- package/dist/tasks/source/parse-task-source.js +160 -10
- package/dist/tasks/source/task-source-v3-frozen.js +3 -4
- package/dist/tasks/source/task-to-v4.js +2 -2
- package/dist/workflows/authoring/authoring.js +3 -12
- package/dist/workflows/compile.js +211 -0
- package/dist/workflows/concurrency-policy.js +13 -74
- package/dist/workflows/exec/child-invocation.js +3 -17
- package/dist/workflows/exec/child-workflow.js +32 -141
- package/dist/workflows/exec/dispatch-redaction.js +13 -53
- package/dist/workflows/exec/environment.js +98 -0
- package/dist/workflows/exec/exec-unit.js +33 -140
- package/dist/workflows/exec/frozen-judge.js +7 -59
- package/dist/workflows/exec/native-executor.js +82 -341
- package/dist/workflows/exec/param-secrets.js +29 -47
- package/dist/workflows/exec/run-workflow.js +154 -387
- package/dist/workflows/exec/scheduler.js +9 -36
- package/dist/workflows/exec/step-work.js +127 -430
- package/dist/workflows/exec/unit-dispatch.js +11 -63
- package/dist/workflows/exec/unit-writer.js +8 -52
- package/dist/workflows/exec/worktree.js +39 -273
- package/dist/workflows/freeze/child-output-references.js +4 -15
- package/dist/workflows/freeze/environment.js +99 -92
- package/dist/workflows/freeze/freeze.js +172 -0
- package/dist/workflows/freeze/step-values.js +19 -21
- package/dist/workflows/freeze/targets/child-workflow.js +23 -92
- package/dist/workflows/freeze/targets/command.js +10 -33
- package/dist/workflows/freeze/targets/script.js +5 -12
- package/dist/workflows/freeze/targets/shell.js +3 -6
- package/dist/workflows/freeze/targets/task.js +25 -80
- package/dist/workflows/freeze/task-bindings.js +20 -67
- package/dist/workflows/{source-ir/github-yaml.js → github-yaml.js} +88 -206
- package/dist/workflows/ir/params.js +6 -51
- package/dist/workflows/ir/plan-hash.js +2 -34
- package/dist/workflows/parser.js +140 -43
- package/dist/{commands/improve/consolidate/types.js → workflows/plan.js} +2 -1
- package/dist/workflows/renderer.js +36 -69
- package/dist/workflows/resource-limits.js +12 -120
- package/dist/workflows/runtime/agent-identity.js +8 -40
- package/dist/workflows/runtime/run-outputs.js +3 -6
- package/dist/workflows/runtime/run-plan.js +316 -0
- package/dist/workflows/runtime/runs.js +48 -200
- package/dist/workflows/runtime/workflow-asset-loader.js +24 -57
- package/dist/workflows/{source-ir/semantics.js → source-semantics.js} +16 -20
- package/dist/workflows/validate-summary.js +2 -7
- package/docs/integration/bundling-akm.md +49 -42
- package/docs/migration/README.md +1 -0
- package/docs/migration/release-notes/0.9.17.md +41 -0
- package/docs/migration/v0.9.1-to-v0.9.2.md +19 -7
- package/docs/reference/cli.md +182 -125
- package/docs/reference/configuration.md +49 -56
- package/docs/reference/data-and-telemetry.md +19 -20
- package/docs/reference/tasks.md +86 -38
- package/docs/reference/workflow-schema.md +14 -18
- package/docs/reference/workflows.md +6 -9
- package/package.json +1 -1
- package/schemas/akm-config.json +87 -406
- package/dist/commands/health/advisories.js +0 -150
- package/dist/commands/health/metrics.js +0 -329
- package/dist/commands/health/surfaces.js +0 -102
- package/dist/commands/improve/anti-collapse.js +0 -83
- package/dist/commands/improve/collapse-detector.js +0 -432
- package/dist/commands/improve/consolidate/eligibility.js +0 -48
- package/dist/commands/improve/consolidate/merge.js +0 -146
- package/dist/commands/improve/distill/promote-memory.js +0 -329
- package/dist/commands/improve/distill/quality-gate.js +0 -500
- package/dist/commands/improve/memory/memory-contradiction-detect.js +0 -291
- package/dist/commands/improve/proposal-envelope.js +0 -31
- package/dist/commands/improve/run-context.js +0 -123
- package/dist/commands/improve/shared.js +0 -21
- package/dist/commands/improve/source-identity.js +0 -28
- package/dist/commands/improve/triage.js +0 -96
- package/dist/commands/proposal/drain-policies.js +0 -151
- package/dist/commands/sources/update-transaction.js +0 -220
- package/dist/core/action-contributors.js +0 -28
- package/dist/core/config/config-version-shim.js +0 -101
- package/dist/core/config/retired-experimental-keys-shim.js +0 -62
- package/dist/core/fs-txn.js +0 -405
- package/dist/core/lexical-score.js +0 -25
- package/dist/core/maintenance-barrier.js +0 -167
- package/dist/execution/executable-identity.js +0 -105
- package/dist/execution/guarded-source.js +0 -427
- package/dist/indexer/graph/graph-boost.js +0 -427
- package/dist/indexer/graph/graph-dedup.js +0 -95
- package/dist/indexer/search/name-match.js +0 -35
- package/dist/indexer/search/ranking-contributors.js +0 -515
- package/dist/indexer/walk/project-context.js +0 -192
- package/dist/integrations/agent/execution-cascade.js +0 -566
- package/dist/integrations/agent/execution-definitions.js +0 -202
- package/dist/integrations/agent/execution-lowering.js +0 -841
- package/dist/integrations/agent/execution-preparation.js +0 -98
- package/dist/integrations/agent/inline-execution.js +0 -74
- package/dist/registry/create-provider-registry.js +0 -29
- package/dist/registry/pinned-request-helper.js +0 -247
- package/dist/registry/pinned-transport.js +0 -717
- package/dist/sources/providers/index.js +0 -14
- package/dist/storage/engines/sqlite-migrations.js +0 -271
- package/dist/storage/repositories/canaries-repository.js +0 -107
- package/dist/storage/repositories/embedding-salvage-repository.js +0 -184
- package/dist/storage/repositories/registry-cache.js +0 -113
- package/dist/tasks/scheduler-sync-preview.js +0 -52
- package/dist/workflows/freeze/resolve-steps.js +0 -86
- package/dist/workflows/freeze/source-freeze.js +0 -64
- package/dist/workflows/ir/compile.js +0 -321
- package/dist/workflows/ir/environment-v4.js +0 -330
- package/dist/workflows/ir/freeze-v4.js +0 -153
- package/dist/workflows/ir/schema-v4.js +0 -745
- package/dist/workflows/ir/schema.js +0 -354
- package/dist/workflows/program/schema.js +0 -78
- package/dist/workflows/runtime/checkin.js +0 -57
- package/dist/workflows/runtime/plan-classifier.js +0 -196
- package/dist/workflows/runtime/unit-checkin.js +0 -45
- package/dist/workflows/runtime/unit-phases.js +0 -20
- package/dist/workflows/schema.js +0 -4
- package/dist/workflows/source-ir/compile.js +0 -200
- package/dist/workflows/source-ir/program.js +0 -50
- package/dist/workflows/source-ir/result.js +0 -26
- package/dist/workflows/source-ir/schema.js +0 -786
- package/dist/workflows/source-ir/triggers.js +0 -79
- package/dist/workflows/source-ir/uses.js +0 -40
- package/dist/workflows/validator.js +0 -60
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
-
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
-
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
-
import { cloneExecutionJsonObject } from "../../execution/json.js";
|
|
5
|
-
import { withEngineFallback } from "./engine-fallback.js";
|
|
6
|
-
import { planExecutionCascade, } from "./execution-cascade.js";
|
|
7
|
-
import { executionEngineDefinitionsFromConfig } from "./execution-definitions.js";
|
|
8
|
-
import { loadModelMap } from "./model-map.js";
|
|
9
|
-
function own(value, key) {
|
|
10
|
-
return Object.hasOwn(value, key);
|
|
11
|
-
}
|
|
12
|
-
function requestedToolNames(tools) {
|
|
13
|
-
if (tools === null)
|
|
14
|
-
return Object.freeze([]);
|
|
15
|
-
if (typeof tools === "string") {
|
|
16
|
-
return Object.freeze(tools
|
|
17
|
-
.split(",")
|
|
18
|
-
.map((tool) => tool.trim())
|
|
19
|
-
.filter(Boolean));
|
|
20
|
-
}
|
|
21
|
-
if (Array.isArray(tools))
|
|
22
|
-
return Object.freeze(tools.map((tool) => tool.trim()).filter(Boolean));
|
|
23
|
-
const structured = tools;
|
|
24
|
-
// The portable structured spelling is a boolean allow/deny map. Opaque or
|
|
25
|
-
// nested provider policy cannot be reduced to tool names without guessing,
|
|
26
|
-
// so a host name allowlist must deny it (an explicit "*" may still allow it).
|
|
27
|
-
if (Object.values(structured).some((value) => typeof value !== "boolean"))
|
|
28
|
-
return undefined;
|
|
29
|
-
return Object.freeze(Object.keys(structured).filter((tool) => structured[tool] === true));
|
|
30
|
-
}
|
|
31
|
-
/** The production authorizer: executable assets may only narrow a host-owned ceiling. */
|
|
32
|
-
export function toolAuthorizerFromConfig(config) {
|
|
33
|
-
const allowed = new Set(config.execution?.allowedTools ?? []);
|
|
34
|
-
return (input) => {
|
|
35
|
-
const requested = requestedToolNames(input.tools);
|
|
36
|
-
const permitted = allowed.has("*") || requested?.every((tool) => allowed.has(tool)) === true;
|
|
37
|
-
return Object.freeze({
|
|
38
|
-
status: permitted ? "allowed" : "denied",
|
|
39
|
-
policy: "config-execution-allowed-tools",
|
|
40
|
-
});
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
/** Pure common cascade composition once caller-specific sources are rendered. */
|
|
44
|
-
export function planPreparedExecution(options) {
|
|
45
|
-
return planExecutionCascade({
|
|
46
|
-
command: options.command,
|
|
47
|
-
...(own(options, "conversation") ? { conversation: options.conversation } : {}),
|
|
48
|
-
...(own(options, "persona") ? { persona: options.persona } : {}),
|
|
49
|
-
layers: {
|
|
50
|
-
installation: {
|
|
51
|
-
id: "installation-defaults",
|
|
52
|
-
values: options.installationEngine === undefined ? {} : { engine: options.installationEngine },
|
|
53
|
-
},
|
|
54
|
-
...(options.agentLayer ? { agent: options.agentLayer } : {}),
|
|
55
|
-
command: options.commandLayer,
|
|
56
|
-
...(options.invocationDefaults
|
|
57
|
-
? { invocationDefaults: { id: "invocation-defaults", values: options.invocationDefaults } }
|
|
58
|
-
: {}),
|
|
59
|
-
...(options.current ? { current: { id: "current-invocation", values: options.current } } : {}),
|
|
60
|
-
},
|
|
61
|
-
engines: options.engines,
|
|
62
|
-
modelMap: options.modelMap,
|
|
63
|
-
invocationKind: options.invocationKind,
|
|
64
|
-
...(options.authorizeTools ? { authorizeTools: options.authorizeTools } : {}),
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* The one planner adapter for already-rendered command/persona content.
|
|
69
|
-
* Direct, task, improve, proposal, and workflow callers contribute named
|
|
70
|
-
* layers here; none may rebuild engine/model precedence around the cascade.
|
|
71
|
-
*/
|
|
72
|
-
export function prepareResolvedExecution(options) {
|
|
73
|
-
const inputConfig = cloneExecutionJsonObject(options.config, "execution preparation input config");
|
|
74
|
-
const fallback = withEngineFallback(inputConfig);
|
|
75
|
-
const config = cloneExecutionJsonObject(fallback.config, "execution preparation resolved config");
|
|
76
|
-
const defaults = own(config, "defaults") ? config.defaults : undefined;
|
|
77
|
-
const installationEngine = defaults && own(defaults, "engine") ? defaults.engine : undefined;
|
|
78
|
-
const plan = planPreparedExecution({
|
|
79
|
-
command: options.command,
|
|
80
|
-
...(own(options, "conversation") ? { conversation: options.conversation } : {}),
|
|
81
|
-
...(own(options, "persona") ? { persona: options.persona } : {}),
|
|
82
|
-
...(installationEngine === undefined ? {} : { installationEngine }),
|
|
83
|
-
...(options.agentLayer ? { agentLayer: options.agentLayer } : {}),
|
|
84
|
-
commandLayer: options.commandLayer,
|
|
85
|
-
...(options.invocationDefaults ? { invocationDefaults: options.invocationDefaults } : {}),
|
|
86
|
-
...(options.current ? { current: options.current } : {}),
|
|
87
|
-
engines: executionEngineDefinitionsFromConfig(config),
|
|
88
|
-
modelMap: options.modelMap ?? loadModelMap({ engines: config.engines }).map,
|
|
89
|
-
invocationKind: options.invocationKind,
|
|
90
|
-
authorizeTools: options.authorizeTools ?? toolAuthorizerFromConfig(config),
|
|
91
|
-
});
|
|
92
|
-
return Object.freeze({
|
|
93
|
-
plan,
|
|
94
|
-
request: plan.request,
|
|
95
|
-
config,
|
|
96
|
-
...(fallback.fallbackEngineName ? { fallbackEngineName: fallback.fallbackEngineName } : {}),
|
|
97
|
-
});
|
|
98
|
-
}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
-
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
-
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
-
import { createInlineResolvedCommand, } from "../../execution/resolved-request.js";
|
|
5
|
-
import { executionEngineDefinitionFromRunner } from "./execution-definitions.js";
|
|
6
|
-
import { planPreparedExecution, prepareResolvedExecution } from "./execution-preparation.js";
|
|
7
|
-
import { MODEL_MAP_VERSION } from "./model-map.js";
|
|
8
|
-
const EMPTY_EXACT_MODEL_MAP = Object.freeze({
|
|
9
|
-
version: MODEL_MAP_VERSION,
|
|
10
|
-
aliases: Object.freeze(Object.create(null)),
|
|
11
|
-
});
|
|
12
|
-
function own(value, key) {
|
|
13
|
-
return Object.hasOwn(value, key);
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Resolve anonymous command content through the same far-to-near cascade used
|
|
17
|
-
* by stored commands. Tasks, workflows, and internal model work adapt their
|
|
18
|
-
* already-rendered content here rather than rebuilding engine/model precedence.
|
|
19
|
-
*/
|
|
20
|
-
export function prepareInlineExecution(options) {
|
|
21
|
-
const command = createInlineResolvedCommand({
|
|
22
|
-
template: options.content,
|
|
23
|
-
...(own(options, "argumentInput") ? { argumentInput: options.argumentInput } : {}),
|
|
24
|
-
content: options.content,
|
|
25
|
-
});
|
|
26
|
-
return prepareResolvedExecution({
|
|
27
|
-
command,
|
|
28
|
-
config: options.config,
|
|
29
|
-
invocationKind: options.invocationKind,
|
|
30
|
-
...(own(options, "conversation") ? { conversation: options.conversation } : {}),
|
|
31
|
-
...(own(options, "persona") ? { persona: options.persona } : {}),
|
|
32
|
-
commandLayer: { id: "inline-command", values: {} },
|
|
33
|
-
...(options.invocationDefaults ? { invocationDefaults: options.invocationDefaults } : {}),
|
|
34
|
-
...(options.current ? { current: options.current } : {}),
|
|
35
|
-
...(options.modelMap ? { modelMap: options.modelMap } : {}),
|
|
36
|
-
...(options.authorizeTools ? { authorizeTools: options.authorizeTools } : {}),
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Prepare anonymous work from an already-resolved runner without reading live
|
|
41
|
-
* config or interpreting aliases. Used by resume-safe workflow/judge and by
|
|
42
|
-
* improve/proposal calls that already froze runner material.
|
|
43
|
-
*/
|
|
44
|
-
export function prepareInlineExecutionWithRunner(options) {
|
|
45
|
-
const command = createInlineResolvedCommand({
|
|
46
|
-
template: options.content,
|
|
47
|
-
...(own(options, "argumentInput") ? { argumentInput: options.argumentInput } : {}),
|
|
48
|
-
content: options.content,
|
|
49
|
-
});
|
|
50
|
-
const material = executionEngineDefinitionFromRunner(options.runner, own(options, "sdkFallbackModelFromRequest")
|
|
51
|
-
? { sdkFallbackModelFromRequest: options.sdkFallbackModelFromRequest === true }
|
|
52
|
-
: {});
|
|
53
|
-
const engines = Object.create(null);
|
|
54
|
-
Object.defineProperty(engines, material.engineName, {
|
|
55
|
-
value: material.definition,
|
|
56
|
-
enumerable: true,
|
|
57
|
-
configurable: false,
|
|
58
|
-
writable: false,
|
|
59
|
-
});
|
|
60
|
-
const plan = planPreparedExecution({
|
|
61
|
-
command,
|
|
62
|
-
...(own(options, "conversation") ? { conversation: options.conversation } : {}),
|
|
63
|
-
...(own(options, "persona") ? { persona: options.persona } : {}),
|
|
64
|
-
installationEngine: material.engineName,
|
|
65
|
-
commandLayer: { id: "inline-command", values: {} },
|
|
66
|
-
...(options.invocationDefaults ? { invocationDefaults: options.invocationDefaults } : {}),
|
|
67
|
-
...(options.current ? { current: options.current } : {}),
|
|
68
|
-
engines: Object.freeze(engines),
|
|
69
|
-
modelMap: options.modelMap ?? EMPTY_EXACT_MODEL_MAP,
|
|
70
|
-
invocationKind: options.invocationKind,
|
|
71
|
-
...(options.authorizeTools ? { authorizeTools: options.authorizeTools } : {}),
|
|
72
|
-
});
|
|
73
|
-
return Object.freeze({ plan, request: plan.request, runner: material.runner });
|
|
74
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
-
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
-
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
-
/**
|
|
5
|
-
* Generic factory-map utility.
|
|
6
|
-
*
|
|
7
|
-
* Creates a lightweight registry that maps string keys to factory functions.
|
|
8
|
-
* Both registry/factory.ts (registry discovery) and sources/provider-factory.ts
|
|
9
|
-
* (source providers) are built on this utility.
|
|
10
|
-
*/
|
|
11
|
-
export function createProviderRegistry() {
|
|
12
|
-
const map = new Map();
|
|
13
|
-
return {
|
|
14
|
-
register(type, factory) {
|
|
15
|
-
map.set(type, factory);
|
|
16
|
-
},
|
|
17
|
-
resolve(type) {
|
|
18
|
-
return map.get(type) ?? null;
|
|
19
|
-
},
|
|
20
|
-
/** Removes a registration. No-op if `type` was never registered. */
|
|
21
|
-
unregister(type) {
|
|
22
|
-
map.delete(type);
|
|
23
|
-
},
|
|
24
|
-
/** Snapshot of all registered keys. Iteration order matches insertion order. */
|
|
25
|
-
list() {
|
|
26
|
-
return [...map.keys()];
|
|
27
|
-
},
|
|
28
|
-
};
|
|
29
|
-
}
|
|
@@ -1,247 +0,0 @@
|
|
|
1
|
-
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
-
// License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
-
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
4
|
-
/** Parse and validate the private stdin request before any socket is opened. */
|
|
5
|
-
async function readNodePinnedHelperRequest(isIP) {
|
|
6
|
-
const MAX_PRELUDE_BYTES = 64 * 1024;
|
|
7
|
-
const iterator = process.stdin[Symbol.asyncIterator]();
|
|
8
|
-
let buffered = Buffer.alloc(0);
|
|
9
|
-
const readExact = async (length) => {
|
|
10
|
-
while (buffered.byteLength < length) {
|
|
11
|
-
const next = await iterator.next();
|
|
12
|
-
if (next.done)
|
|
13
|
-
throw new Error("Registry helper input ended before the request prelude was complete");
|
|
14
|
-
buffered = Buffer.concat([buffered, Buffer.from(next.value)]);
|
|
15
|
-
}
|
|
16
|
-
const result = buffered.subarray(0, length);
|
|
17
|
-
buffered = buffered.subarray(length);
|
|
18
|
-
return result;
|
|
19
|
-
};
|
|
20
|
-
const preludeLength = (await readExact(4)).readUInt32BE(0);
|
|
21
|
-
if (preludeLength === 0 || preludeLength > MAX_PRELUDE_BYTES) {
|
|
22
|
-
throw new Error("Registry helper request prelude exceeds its protocol limit");
|
|
23
|
-
}
|
|
24
|
-
const raw = JSON.parse((await readExact(preludeLength)).toString("utf8"));
|
|
25
|
-
if (typeof raw.url !== "string" || typeof raw.address !== "string") {
|
|
26
|
-
throw new Error("Registry helper request prelude is invalid");
|
|
27
|
-
}
|
|
28
|
-
const url = new URL(raw.url);
|
|
29
|
-
if ((url.protocol !== "http:" && url.protocol !== "https:") || url.username || url.password) {
|
|
30
|
-
throw new Error("Registry helper accepts only credential-free HTTP(S) URLs");
|
|
31
|
-
}
|
|
32
|
-
const addressFamily = isIP(raw.address);
|
|
33
|
-
if (addressFamily === 0)
|
|
34
|
-
throw new Error("Registry helper requires a numeric pinned address");
|
|
35
|
-
if (typeof raw.timeoutMs !== "number" || !Number.isSafeInteger(raw.timeoutMs) || raw.timeoutMs <= 0) {
|
|
36
|
-
throw new Error("Registry helper timeout is invalid");
|
|
37
|
-
}
|
|
38
|
-
if (!Array.isArray(raw.headers) || raw.headers.length > 256) {
|
|
39
|
-
throw new Error("Registry helper headers are invalid");
|
|
40
|
-
}
|
|
41
|
-
const headers = {};
|
|
42
|
-
for (const pair of raw.headers) {
|
|
43
|
-
if (!Array.isArray(pair) ||
|
|
44
|
-
pair.length !== 2 ||
|
|
45
|
-
typeof pair[0] !== "string" ||
|
|
46
|
-
typeof pair[1] !== "string" ||
|
|
47
|
-
pair[0].length > 256 ||
|
|
48
|
-
pair[1].length > 16_384) {
|
|
49
|
-
throw new Error("Registry helper header entry is invalid");
|
|
50
|
-
}
|
|
51
|
-
headers[pair[0].toLowerCase()] = pair[1];
|
|
52
|
-
}
|
|
53
|
-
for (const name of [
|
|
54
|
-
"connection",
|
|
55
|
-
"keep-alive",
|
|
56
|
-
"proxy-authorization",
|
|
57
|
-
"proxy-connection",
|
|
58
|
-
"te",
|
|
59
|
-
"trailer",
|
|
60
|
-
"transfer-encoding",
|
|
61
|
-
"upgrade",
|
|
62
|
-
]) {
|
|
63
|
-
delete headers[name];
|
|
64
|
-
}
|
|
65
|
-
headers.host = url.host;
|
|
66
|
-
return {
|
|
67
|
-
addressFamily: addressFamily,
|
|
68
|
-
bodyPresent: raw.bodyPresent === true,
|
|
69
|
-
headers,
|
|
70
|
-
initialBody: buffered,
|
|
71
|
-
iterator,
|
|
72
|
-
method: typeof raw.method === "string" ? raw.method.toUpperCase() : "GET",
|
|
73
|
-
pinnedAddress: raw.address,
|
|
74
|
-
timeoutMs: raw.timeoutMs,
|
|
75
|
-
url,
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* The body of the one-request Node helper used by Bun's registry transport.
|
|
80
|
-
* Its parser is passed explicitly when the parent serializes both functions.
|
|
81
|
-
*/
|
|
82
|
-
export async function nodePinnedRequestHelperMain(readRequest, http, https, isIP) {
|
|
83
|
-
const MAX_FRAME_BYTES = 1024 * 1024;
|
|
84
|
-
const FRAME_PRELUDE = 0;
|
|
85
|
-
const FRAME_BODY = 1;
|
|
86
|
-
const FRAME_END = 2;
|
|
87
|
-
const FRAME_ERROR = 3;
|
|
88
|
-
const writeBuffer = async (value) => {
|
|
89
|
-
await new Promise((resolve, reject) => {
|
|
90
|
-
process.stdout.write(value, (error) => (error ? reject(error) : resolve()));
|
|
91
|
-
});
|
|
92
|
-
};
|
|
93
|
-
const writeFrame = async (type, payload = new Uint8Array()) => {
|
|
94
|
-
if (payload.byteLength > MAX_FRAME_BYTES && type !== FRAME_BODY) {
|
|
95
|
-
throw new Error("Registry helper frame exceeds its protocol limit");
|
|
96
|
-
}
|
|
97
|
-
if (type === FRAME_BODY && payload.byteLength > MAX_FRAME_BYTES) {
|
|
98
|
-
for (let offset = 0; offset < payload.byteLength; offset += MAX_FRAME_BYTES) {
|
|
99
|
-
await writeFrame(type, payload.subarray(offset, Math.min(payload.byteLength, offset + MAX_FRAME_BYTES)));
|
|
100
|
-
}
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
const header = Buffer.allocUnsafe(5);
|
|
104
|
-
header[0] = type;
|
|
105
|
-
header.writeUInt32BE(payload.byteLength, 1);
|
|
106
|
-
await writeBuffer(header);
|
|
107
|
-
if (payload.byteLength > 0)
|
|
108
|
-
await writeBuffer(payload);
|
|
109
|
-
};
|
|
110
|
-
const errorPayload = (error) => {
|
|
111
|
-
const candidate = error;
|
|
112
|
-
return Buffer.from(JSON.stringify({
|
|
113
|
-
name: typeof candidate?.name === "string" ? candidate.name.slice(0, 128) : "Error",
|
|
114
|
-
message: typeof candidate?.message === "string" ? candidate.message.slice(0, 8_192) : String(error).slice(0, 8_192),
|
|
115
|
-
code: typeof candidate?.code === "string" ? candidate.code.slice(0, 128) : undefined,
|
|
116
|
-
}));
|
|
117
|
-
};
|
|
118
|
-
try {
|
|
119
|
-
const nodeMajor = Number.parseInt(process.versions.node.split(".")[0] ?? "0", 10);
|
|
120
|
-
if (!Number.isInteger(nodeMajor) || nodeMajor < 22) {
|
|
121
|
-
throw new Error(`The pinned registry helper requires Node.js >= 22; found ${process.versions.node}`);
|
|
122
|
-
}
|
|
123
|
-
const { addressFamily, bodyPresent, headers, initialBody, iterator, method, pinnedAddress, timeoutMs, url } = await readRequest(isIP);
|
|
124
|
-
const hostname = url.hostname.startsWith("[") && url.hostname.endsWith("]") ? url.hostname.slice(1, -1) : url.hostname;
|
|
125
|
-
const lookup = (_hostname, options, callback) => {
|
|
126
|
-
if (typeof options === "object" && options !== null && "all" in options && options.all === true) {
|
|
127
|
-
callback(null, [{ address: pinnedAddress, family: addressFamily }]);
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
callback(null, pinnedAddress, addressFamily);
|
|
131
|
-
}
|
|
132
|
-
};
|
|
133
|
-
const requestOptions = {
|
|
134
|
-
protocol: url.protocol,
|
|
135
|
-
hostname,
|
|
136
|
-
port: url.port || undefined,
|
|
137
|
-
path: `${url.pathname}${url.search}`,
|
|
138
|
-
method,
|
|
139
|
-
headers,
|
|
140
|
-
lookup,
|
|
141
|
-
// One helper owns exactly one fresh connection. It never pools a socket
|
|
142
|
-
// selected for an earlier DNS answer.
|
|
143
|
-
agent: false,
|
|
144
|
-
...(url.protocol === "https:" && isIP(hostname) === 0 ? { servername: hostname } : {}),
|
|
145
|
-
};
|
|
146
|
-
let responseStarted = false;
|
|
147
|
-
let requestFinished = false;
|
|
148
|
-
let request;
|
|
149
|
-
const responseDone = new Promise((resolve, reject) => {
|
|
150
|
-
const requestFn = url.protocol === "https:" ? https.request : http.request;
|
|
151
|
-
request = requestFn(requestOptions, async (response) => {
|
|
152
|
-
responseStarted = true;
|
|
153
|
-
try {
|
|
154
|
-
await writeFrame(FRAME_PRELUDE, Buffer.from(JSON.stringify({
|
|
155
|
-
status: response.statusCode ?? 500,
|
|
156
|
-
statusText: response.statusMessage ?? "",
|
|
157
|
-
rawHeaders: response.rawHeaders,
|
|
158
|
-
})));
|
|
159
|
-
for await (const chunk of response) {
|
|
160
|
-
await writeFrame(FRAME_BODY, Buffer.from(chunk));
|
|
161
|
-
}
|
|
162
|
-
await writeFrame(FRAME_END);
|
|
163
|
-
resolve();
|
|
164
|
-
}
|
|
165
|
-
catch (error) {
|
|
166
|
-
reject(error);
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
const headerTimer = setTimeout(() => {
|
|
170
|
-
request?.destroy(new Error(`Registry request timed out after ${timeoutMs}ms while awaiting response headers`));
|
|
171
|
-
}, timeoutMs);
|
|
172
|
-
request.once("response", () => clearTimeout(headerTimer));
|
|
173
|
-
request.once("error", (error) => {
|
|
174
|
-
clearTimeout(headerTimer);
|
|
175
|
-
if (!responseStarted)
|
|
176
|
-
reject(error);
|
|
177
|
-
});
|
|
178
|
-
});
|
|
179
|
-
const writeRequestChunk = async (chunk) => {
|
|
180
|
-
if (!request || request.destroyed)
|
|
181
|
-
throw new Error("Registry helper request closed while streaming its body");
|
|
182
|
-
const activeRequest = request;
|
|
183
|
-
if (activeRequest.write(chunk))
|
|
184
|
-
return;
|
|
185
|
-
await new Promise((resolve, reject) => {
|
|
186
|
-
const onDrain = () => {
|
|
187
|
-
cleanup();
|
|
188
|
-
resolve();
|
|
189
|
-
};
|
|
190
|
-
const onError = (error) => {
|
|
191
|
-
cleanup();
|
|
192
|
-
reject(error);
|
|
193
|
-
};
|
|
194
|
-
const cleanup = () => {
|
|
195
|
-
activeRequest.off("drain", onDrain);
|
|
196
|
-
activeRequest.off("error", onError);
|
|
197
|
-
};
|
|
198
|
-
activeRequest.once("drain", onDrain);
|
|
199
|
-
activeRequest.once("error", onError);
|
|
200
|
-
});
|
|
201
|
-
};
|
|
202
|
-
const bodyDone = (async () => {
|
|
203
|
-
if (!request)
|
|
204
|
-
throw new Error("Registry helper request was not initialized");
|
|
205
|
-
if (bodyPresent) {
|
|
206
|
-
if (initialBody.byteLength > 0) {
|
|
207
|
-
await writeRequestChunk(initialBody);
|
|
208
|
-
}
|
|
209
|
-
while (true) {
|
|
210
|
-
const next = await iterator.next();
|
|
211
|
-
if (next.done)
|
|
212
|
-
break;
|
|
213
|
-
await writeRequestChunk(Buffer.from(next.value));
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
requestFinished = true;
|
|
217
|
-
request.end();
|
|
218
|
-
})();
|
|
219
|
-
try {
|
|
220
|
-
await Promise.all([responseDone, bodyDone]);
|
|
221
|
-
}
|
|
222
|
-
catch (error) {
|
|
223
|
-
if (!requestFinished && !responseStarted)
|
|
224
|
-
request?.destroy(error);
|
|
225
|
-
throw error;
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
catch (error) {
|
|
229
|
-
try {
|
|
230
|
-
await writeFrame(FRAME_ERROR, errorPayload(error));
|
|
231
|
-
}
|
|
232
|
-
catch {
|
|
233
|
-
// The parent also treats an unframed EOF as a transport failure.
|
|
234
|
-
}
|
|
235
|
-
process.exitCode = 1;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
/** Materialize both self-contained passes into a one-request Node program. */
|
|
239
|
-
export function nodePinnedRequestHelperSource() {
|
|
240
|
-
return (`import * as http from "node:http";\n` +
|
|
241
|
-
`import * as https from "node:https";\n` +
|
|
242
|
-
`import { isIP } from "node:net";\n` +
|
|
243
|
-
`(${nodePinnedRequestHelperMain.toString()})(${readNodePinnedHelperRequest.toString()}, http, https, isIP).catch((error) => {\n` +
|
|
244
|
-
` console.error(error instanceof Error ? error.message : String(error));\n` +
|
|
245
|
-
` process.exitCode = 1;\n` +
|
|
246
|
-
`});\n`);
|
|
247
|
-
}
|