@lesliechan721/aw 0.1.0-beta.64 → 0.1.0-beta.66
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/dist/authoring/assets/aw-runtime-config.mjs +3 -3
- package/dist/authoring/assets/aw-runtime-config.mjs.map +1 -1
- package/dist/authoring/scripts/add-skill.mjs +3 -17
- package/dist/authoring/scripts/add-skill.mjs.map +1 -1
- package/dist/authoring/scripts/init-plugin.mjs +1 -0
- package/dist/authoring/scripts/init-plugin.mjs.map +1 -1
- package/dist/authoring/scripts/lib/plugin-version-check.mjs +1 -1
- package/dist/authoring/scripts/lib/skill-scaffold.d.mts +2 -0
- package/dist/authoring/scripts/lib/skill-scaffold.mjs +2 -0
- package/dist/authoring/scripts/lib/skill-scaffold.mjs.map +1 -1
- package/dist/authoring/scripts/validate-plugin.mjs +95 -698
- package/dist/authoring/scripts/validate-plugin.mjs.map +1 -1
- package/dist/scripts/aw-skill-eval-materializer.d.ts +2 -0
- package/dist/scripts/aw-skill-eval-materializer.js +74 -44
- package/dist/scripts/aw-skill-eval-materializer.js.map +1 -1
- package/dist/scripts/bundle-plugins.js +10 -2
- package/dist/scripts/bundle-plugins.js.map +1 -1
- package/dist/scripts/plugin-staging.d.ts +1 -1
- package/dist/scripts/plugin-staging.js +1 -1
- package/dist/scripts/plugin-staging.js.map +1 -1
- package/dist/scripts/test-plugin-scripts.js +31 -31
- package/dist/scripts/test-plugin-scripts.js.map +1 -1
- package/dist/src/commands/aw-capabilities.d.ts +1 -1
- package/dist/src/commands/aw-capabilities.js +2 -0
- package/dist/src/commands/aw-capabilities.js.map +1 -1
- package/dist/src/commands/catalog-publication-inspection.js +2 -2
- package/dist/src/commands/catalog-publication-inspection.js.map +1 -1
- package/dist/src/commands/console.js +4 -3
- package/dist/src/commands/console.js.map +1 -1
- package/dist/src/commands/intent-command.d.ts +30 -0
- package/dist/src/commands/intent-command.js +164 -0
- package/dist/src/commands/intent-command.js.map +1 -0
- package/dist/src/commands/operation-plan.d.ts +2 -0
- package/dist/src/commands/operation-plan.js +2 -1
- package/dist/src/commands/operation-plan.js.map +1 -1
- package/dist/src/commands/options.d.ts +3 -11
- package/dist/src/commands/options.js +11 -17
- package/dist/src/commands/options.js.map +1 -1
- package/dist/src/commands/plugin-capabilities.js +27 -33
- package/dist/src/commands/plugin-capabilities.js.map +1 -1
- package/dist/src/commands/rebuild-command.d.ts +108 -6
- package/dist/src/commands/rebuild-command.js +617 -1549
- package/dist/src/commands/rebuild-command.js.map +1 -1
- package/dist/src/commands/rebuild-integration.d.ts +19 -3
- package/dist/src/commands/rebuild-integration.js +500 -459
- package/dist/src/commands/rebuild-integration.js.map +1 -1
- package/dist/src/commands/rebuild-operations.js +1 -2
- package/dist/src/commands/rebuild-operations.js.map +1 -1
- package/dist/src/commands/review-inspection.d.ts +2 -2
- package/dist/src/commands/review-inspection.js +30 -86
- package/dist/src/commands/review-inspection.js.map +1 -1
- package/dist/src/commands/review-preparation.js +16 -7
- package/dist/src/commands/review-preparation.js.map +1 -1
- package/dist/src/commands/skill-eval.d.ts +2 -0
- package/dist/src/commands/skill-eval.js +15 -9
- package/dist/src/commands/skill-eval.js.map +1 -1
- package/dist/src/commands/status-v6.d.ts +38 -5
- package/dist/src/commands/status-v6.js +269 -102
- package/dist/src/commands/status-v6.js.map +1 -1
- package/dist/src/commands/targets-command.d.ts +27 -0
- package/dist/src/commands/targets-command.js +77 -0
- package/dist/src/commands/targets-command.js.map +1 -0
- package/dist/src/commands/write-commands.js +5 -5
- package/dist/src/commands/write-commands.js.map +1 -1
- package/dist/src/eval/manifest-v1.d.ts +2 -0
- package/dist/src/eval/manifest-v1.js +7 -2
- package/dist/src/eval/manifest-v1.js.map +1 -1
- package/dist/src/generators/local-plugin.d.ts +2 -1
- package/dist/src/generators/local-plugin.js +111 -108
- package/dist/src/generators/local-plugin.js.map +1 -1
- package/dist/src/index.d.ts +10 -17
- package/dist/src/index.js +585 -1349
- package/dist/src/index.js.map +1 -1
- package/dist/src/intent/deployment-preferences.d.ts +63 -0
- package/dist/src/intent/deployment-preferences.js +170 -0
- package/dist/src/intent/deployment-preferences.js.map +1 -0
- package/dist/src/intent/diagnostics.d.ts +11 -0
- package/dist/src/intent/diagnostics.js +14 -0
- package/dist/src/intent/diagnostics.js.map +1 -0
- package/dist/src/intent/intent-codec.d.ts +19 -0
- package/dist/src/intent/intent-codec.js +117 -0
- package/dist/src/intent/intent-codec.js.map +1 -0
- package/dist/src/intent/intent-store.d.ts +43 -0
- package/dist/src/intent/intent-store.js +118 -0
- package/dist/src/intent/intent-store.js.map +1 -0
- package/dist/src/intent/scope-context.d.ts +33 -0
- package/dist/src/intent/scope-context.js +145 -0
- package/dist/src/intent/scope-context.js.map +1 -0
- package/dist/src/intent/work-context.d.ts +13 -0
- package/dist/src/intent/work-context.js +22 -0
- package/dist/src/intent/work-context.js.map +1 -0
- package/dist/src/output/command-receipt.js +16 -9
- package/dist/src/output/command-receipt.js.map +1 -1
- package/dist/src/portable/commands.d.ts +18 -8
- package/dist/src/portable/commands.js +46 -562
- package/dist/src/portable/commands.js.map +1 -1
- package/dist/src/portable/historical-materialization.d.ts +22 -0
- package/dist/src/portable/historical-materialization.js +124 -0
- package/dist/src/portable/historical-materialization.js.map +1 -0
- package/dist/src/portable/materializer.d.ts +8 -0
- package/dist/src/portable/materializer.js +75 -44
- package/dist/src/portable/materializer.js.map +1 -1
- package/dist/src/portable/recovery-layout.d.ts +17 -0
- package/dist/src/portable/recovery-layout.js +55 -0
- package/dist/src/portable/recovery-layout.js.map +1 -0
- package/dist/src/portable/recovery.d.ts +143 -0
- package/dist/src/portable/recovery.js +339 -0
- package/dist/src/portable/recovery.js.map +1 -0
- package/dist/src/portable/writer.d.ts +64 -0
- package/dist/src/portable/writer.js +316 -0
- package/dist/src/portable/writer.js.map +1 -0
- package/dist/src/recovery/coordinator.d.ts +137 -0
- package/dist/src/recovery/coordinator.js +1198 -0
- package/dist/src/recovery/coordinator.js.map +1 -0
- package/dist/src/recovery/demand.d.ts +44 -0
- package/dist/src/recovery/demand.js +178 -0
- package/dist/src/recovery/demand.js.map +1 -0
- package/dist/src/recovery/joint-coordinator.d.ts +24 -0
- package/dist/src/recovery/joint-coordinator.js +770 -0
- package/dist/src/recovery/joint-coordinator.js.map +1 -0
- package/dist/src/recovery/joint-demand.d.ts +68 -0
- package/dist/src/recovery/joint-demand.js +166 -0
- package/dist/src/recovery/joint-demand.js.map +1 -0
- package/dist/src/recovery/receipt.d.ts +81 -0
- package/dist/src/recovery/receipt.js +2 -0
- package/dist/src/recovery/receipt.js.map +1 -0
- package/dist/src/recovery/retirement.d.ts +45 -0
- package/dist/src/recovery/retirement.js +366 -0
- package/dist/src/recovery/retirement.js.map +1 -0
- package/dist/src/recovery/status.d.ts +108 -0
- package/dist/src/recovery/status.js +417 -0
- package/dist/src/recovery/status.js.map +1 -0
- package/dist/src/recovery/types.d.ts +86 -0
- package/dist/src/recovery/types.js +2 -0
- package/dist/src/recovery/types.js.map +1 -0
- package/dist/src/review/review-profile.d.ts +2 -1
- package/dist/src/review/review-profile.js +15 -15
- package/dist/src/review/review-profile.js.map +1 -1
- package/dist/src/review/review-selection.d.ts +1 -2
- package/dist/src/review/review-selection.js +40 -114
- package/dist/src/review/review-selection.js.map +1 -1
- package/dist/src/review/review-types.d.ts +4 -4
- package/dist/src/review/review-types.js.map +1 -1
- package/dist/src/review/skill-materialization.js +15 -6
- package/dist/src/review/skill-materialization.js.map +1 -1
- package/dist/src/review/source-binding.d.ts +14 -4
- package/dist/src/review/source-binding.js +62 -117
- package/dist/src/review/source-binding.js.map +1 -1
- package/dist/src/tui/agent-management.d.ts +23 -0
- package/dist/src/tui/agent-management.js +217 -0
- package/dist/src/tui/agent-management.js.map +1 -0
- package/dist/src/tui/agent-settings.d.ts +44 -0
- package/dist/src/tui/agent-settings.js +98 -0
- package/dist/src/tui/agent-settings.js.map +1 -0
- package/dist/src/tui/components.d.ts +3 -0
- package/dist/src/tui/components.js +10 -1
- package/dist/src/tui/components.js.map +1 -1
- package/dist/src/tui/config-references.d.ts +6 -3
- package/dist/src/tui/config-references.js +17 -12
- package/dist/src/tui/config-references.js.map +1 -1
- package/dist/src/tui/console-app-v4.d.ts +1 -2
- package/dist/src/tui/console-app-v4.js +1533 -1047
- package/dist/src/tui/console-app-v4.js.map +1 -1
- package/dist/src/tui/controller-runtime.d.ts +2 -1
- package/dist/src/tui/controller-runtime.js +405 -1626
- package/dist/src/tui/controller-runtime.js.map +1 -1
- package/dist/src/tui/controller.d.ts +131 -81
- package/dist/src/tui/controller.js +307 -227
- package/dist/src/tui/controller.js.map +1 -1
- package/dist/src/tui/entity-cards.d.ts +2 -2
- package/dist/src/tui/entity-cards.js +98 -20
- package/dist/src/tui/entity-cards.js.map +1 -1
- package/dist/src/tui/glossary.d.ts +2 -0
- package/dist/src/tui/glossary.js +20 -0
- package/dist/src/tui/glossary.js.map +1 -1
- package/dist/src/tui/model.d.ts +28 -10
- package/dist/src/tui/model.js +41 -41
- package/dist/src/tui/model.js.map +1 -1
- package/dist/src/tui/operation-review-planner.d.ts +2 -0
- package/dist/src/tui/operation-review-planner.js +58 -122
- package/dist/src/tui/operation-review-planner.js.map +1 -1
- package/dist/src/tui/plugin-content.js +7 -4
- package/dist/src/tui/plugin-content.js.map +1 -1
- package/dist/src/tui/plugin-detail.d.ts +22 -3
- package/dist/src/tui/plugin-detail.js +113 -26
- package/dist/src/tui/plugin-detail.js.map +1 -1
- package/dist/src/tui/reader.d.ts +1 -0
- package/dist/src/tui/reader.js +3 -1
- package/dist/src/tui/reader.js.map +1 -1
- package/dist/src/tui/router.d.ts +23 -33
- package/dist/src/tui/router.js.map +1 -1
- package/dist/src/tui/scoped-flow.d.ts +45 -0
- package/dist/src/tui/scoped-flow.js +96 -0
- package/dist/src/tui/scoped-flow.js.map +1 -0
- package/dist/src/tui/scoped-inventory.d.ts +122 -0
- package/dist/src/tui/scoped-inventory.js +225 -0
- package/dist/src/tui/scoped-inventory.js.map +1 -0
- package/dist/src/tui/screen-registry.d.ts +25 -25
- package/dist/src/tui/screen-registry.js +3 -7
- package/dist/src/tui/screen-registry.js.map +1 -1
- package/dist/src/tui/session-console-app.js +1 -1
- package/dist/src/tui/session-console-app.js.map +1 -1
- package/dist/src/tui/session-host.js +12 -2
- package/dist/src/tui/session-host.js.map +1 -1
- package/dist/src/types.d.ts +15 -12
- package/dist/src/types.js.map +1 -1
- package/dist/src/utils/agent-version.js +2 -0
- package/dist/src/utils/agent-version.js.map +1 -1
- package/dist/src/utils/artifact-plan.js +13 -6
- package/dist/src/utils/artifact-plan.js.map +1 -1
- package/dist/src/utils/artifact-renderer.d.ts +6 -3
- package/dist/src/utils/artifact-renderer.js +27 -32
- package/dist/src/utils/artifact-renderer.js.map +1 -1
- package/dist/src/utils/artifact-request.d.ts +1 -0
- package/dist/src/utils/artifact-request.js +22 -12
- package/dist/src/utils/artifact-request.js.map +1 -1
- package/dist/src/utils/artifact-sources.d.ts +2 -2
- package/dist/src/utils/bundle-layout.js +18 -16
- package/dist/src/utils/bundle-layout.js.map +1 -1
- package/dist/src/utils/catalog-digests.js +2 -0
- package/dist/src/utils/catalog-digests.js.map +1 -1
- package/dist/src/utils/catalog-runtime-projection.d.ts +4 -3
- package/dist/src/utils/catalog-runtime-projection.js.map +1 -1
- package/dist/src/utils/catalog-source-references.d.ts +5 -0
- package/dist/src/utils/catalog-source-references.js +42 -57
- package/dist/src/utils/catalog-source-references.js.map +1 -1
- package/dist/src/utils/claude-native-render-receipt.d.ts +14 -0
- package/dist/src/utils/claude-native-render-receipt.js +26 -0
- package/dist/src/utils/claude-native-render-receipt.js.map +1 -0
- package/dist/src/utils/claude-skills-root.js +14 -3
- package/dist/src/utils/claude-skills-root.js.map +1 -1
- package/dist/src/utils/codex-manager.js +6 -12
- package/dist/src/utils/codex-manager.js.map +1 -1
- package/dist/src/utils/codex-native-observation.js +29 -13
- package/dist/src/utils/codex-native-observation.js.map +1 -1
- package/dist/src/utils/codex-reconciler.d.ts +2 -5
- package/dist/src/utils/codex-reconciler.js +25 -1
- package/dist/src/utils/codex-reconciler.js.map +1 -1
- package/dist/src/utils/codex-surface-analysis.js +5 -3
- package/dist/src/utils/codex-surface-analysis.js.map +1 -1
- package/dist/src/utils/local-marketplace.d.ts +14 -2
- package/dist/src/utils/local-marketplace.js +209 -42
- package/dist/src/utils/local-marketplace.js.map +1 -1
- package/dist/src/utils/managed-command-evidence.js +1 -1
- package/dist/src/utils/managed-command-evidence.js.map +1 -1
- package/dist/src/utils/managed-command-materialization.d.ts +4 -0
- package/dist/src/utils/managed-command-materialization.js +15 -6
- package/dist/src/utils/managed-command-materialization.js.map +1 -1
- package/dist/src/utils/managed-command-store.d.ts +15 -0
- package/dist/src/utils/managed-command-store.js +73 -8
- package/dist/src/utils/managed-command-store.js.map +1 -1
- package/dist/src/utils/native-cli.d.ts +2 -0
- package/dist/src/utils/native-cli.js +22 -0
- package/dist/src/utils/native-cli.js.map +1 -1
- package/dist/src/utils/native-demand.d.ts +10 -0
- package/dist/src/utils/native-demand.js +4 -0
- package/dist/src/utils/native-demand.js.map +1 -0
- package/dist/src/utils/ownership.js +2 -0
- package/dist/src/utils/ownership.js.map +1 -1
- package/dist/src/utils/paths.js +1 -1
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/src/utils/platform-support.d.ts +1 -1
- package/dist/src/utils/platform-support.js +1 -1
- package/dist/src/utils/platform-support.js.map +1 -1
- package/dist/src/utils/plugin-config-impact.d.ts +3 -0
- package/dist/src/utils/plugin-config-impact.js +115 -273
- package/dist/src/utils/plugin-config-impact.js.map +1 -1
- package/dist/src/utils/plugin-config-references.d.ts +9 -2
- package/dist/src/utils/plugin-config-references.js +75 -85
- package/dist/src/utils/plugin-config-references.js.map +1 -1
- package/dist/src/utils/plugin-config-write.d.ts +58 -1
- package/dist/src/utils/plugin-config-write.js +756 -809
- package/dist/src/utils/plugin-config-write.js.map +1 -1
- package/dist/src/utils/plugin-config.d.ts +47 -46
- package/dist/src/utils/plugin-config.js +292 -833
- package/dist/src/utils/plugin-config.js.map +1 -1
- package/dist/src/utils/plugin-scripts.d.ts +11 -6
- package/dist/src/utils/plugin-scripts.js +52 -35
- package/dist/src/utils/plugin-scripts.js.map +1 -1
- package/dist/src/utils/runtime-config.js +5 -4
- package/dist/src/utils/runtime-config.js.map +1 -1
- package/dist/src/utils/runtime-skill-closure.d.ts +2 -2
- package/dist/src/utils/runtime-skill-closure.js.map +1 -1
- package/dist/src/utils/state-paths.d.ts +8 -3
- package/dist/src/utils/state-paths.js +53 -16
- package/dist/src/utils/state-paths.js.map +1 -1
- package/dist/src/utils/windows-npm-shim.d.ts +2 -0
- package/dist/src/utils/windows-npm-shim.js +5 -7
- package/dist/src/utils/windows-npm-shim.js.map +1 -1
- package/dist/vitest.config.js +1 -0
- package/dist/vitest.config.js.map +1 -1
- package/package.json +3 -3
- package/dist/src/commands/sync-command.d.ts +0 -40
- package/dist/src/commands/sync-command.js +0 -254
- package/dist/src/commands/sync-command.js.map +0 -1
- package/dist/src/portable/skills-cli.d.ts +0 -51
- package/dist/src/portable/skills-cli.js +0 -202
- package/dist/src/portable/skills-cli.js.map +0 -1
- package/dist/src/tui/project-inventory.d.ts +0 -68
- package/dist/src/tui/project-inventory.js +0 -203
- package/dist/src/tui/project-inventory.js.map +0 -1
- package/dist/src/utils/plugin-intent-state.d.ts +0 -49
- package/dist/src/utils/plugin-intent-state.js +0 -320
- package/dist/src/utils/plugin-intent-state.js.map +0 -1
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { PlatformTarget, Scope } from '../types.js';
|
|
2
|
+
import { type AwHomeMutationToken } from '../utils/aw-home-mutation-lock.js';
|
|
3
|
+
export type AgentId = PlatformTarget;
|
|
4
|
+
export interface DeploymentExclusion {
|
|
5
|
+
plugin: string;
|
|
6
|
+
target: AgentId;
|
|
7
|
+
}
|
|
8
|
+
export interface DeploymentPreferences {
|
|
9
|
+
schemaVersion: 2;
|
|
10
|
+
kind: 'aw-deployment-preferences';
|
|
11
|
+
targets: AgentId[];
|
|
12
|
+
exclusions: DeploymentExclusion[];
|
|
13
|
+
}
|
|
14
|
+
export interface PreferencesLocation {
|
|
15
|
+
scope: Scope;
|
|
16
|
+
cwd: string;
|
|
17
|
+
env?: NodeJS.ProcessEnv;
|
|
18
|
+
token?: AwHomeMutationToken;
|
|
19
|
+
}
|
|
20
|
+
export type PreferencesObservation = {
|
|
21
|
+
state: 'absent';
|
|
22
|
+
} | {
|
|
23
|
+
state: 'valid';
|
|
24
|
+
value: DeploymentPreferences;
|
|
25
|
+
digest: string;
|
|
26
|
+
rawBytes: Buffer;
|
|
27
|
+
rawDigest: string;
|
|
28
|
+
} | {
|
|
29
|
+
state: 'invalid';
|
|
30
|
+
code: 'deploymentPreferencesInvalid';
|
|
31
|
+
digest?: string;
|
|
32
|
+
rawBytes?: Buffer;
|
|
33
|
+
rawDigest?: string;
|
|
34
|
+
} | {
|
|
35
|
+
state: 'unreadable';
|
|
36
|
+
code: 'deploymentPreferencesUnavailable';
|
|
37
|
+
};
|
|
38
|
+
export interface PreferencesWriteResult {
|
|
39
|
+
value: DeploymentPreferences;
|
|
40
|
+
changed: boolean;
|
|
41
|
+
}
|
|
42
|
+
export interface AgentSelection {
|
|
43
|
+
agents: AgentId[];
|
|
44
|
+
origin: 'argument' | 'preference' | 'none';
|
|
45
|
+
preferences: PreferencesObservation['state'];
|
|
46
|
+
}
|
|
47
|
+
export declare function normalizeAgents(values: readonly string[]): AgentId[];
|
|
48
|
+
export declare function normalizeExclusions(value: unknown): DeploymentExclusion[];
|
|
49
|
+
export declare function createEmptyPreferences(): DeploymentPreferences;
|
|
50
|
+
export declare function parsePreferences(value: unknown, _scope?: Scope): DeploymentPreferences;
|
|
51
|
+
export declare function serializePreferences(value: DeploymentPreferences, scope: Scope): string;
|
|
52
|
+
export declare function resolvePreferencesPath(location: PreferencesLocation): Promise<string>;
|
|
53
|
+
export declare function observePreferences(location: PreferencesLocation): Promise<PreferencesObservation>;
|
|
54
|
+
export declare function writePreferences(location: PreferencesLocation, value: DeploymentPreferences): Promise<PreferencesWriteResult>;
|
|
55
|
+
export declare function setAgents(location: PreferencesLocation, agents: readonly string[]): Promise<PreferencesWriteResult>;
|
|
56
|
+
export declare function resetTargets(location: PreferencesLocation): Promise<PreferencesWriteResult>;
|
|
57
|
+
export declare function selectAgents(options: {
|
|
58
|
+
preferences: PreferencesObservation;
|
|
59
|
+
targets?: readonly string[];
|
|
60
|
+
}): AgentSelection;
|
|
61
|
+
export declare const setTargets: typeof setAgents;
|
|
62
|
+
/** The caller supplies a complete joint-demand check; it runs under the same write lock. */
|
|
63
|
+
export declare function setExclusions(location: PreferencesLocation, exclusions: readonly DeploymentExclusion[], validate: (draft: DeploymentPreferences) => Promise<void>): Promise<PreferencesWriteResult>;
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import { isPlatformTarget } from '@lesliechan721/aw-plugin-core';
|
|
5
|
+
import { parsePluginId } from '../utils/multi-source-catalog.js';
|
|
6
|
+
import { withAwHomeMutationLock } from '../utils/aw-home-mutation-lock.js';
|
|
7
|
+
import { atomicReplaceConfigFile } from '../utils/plugin-config.js';
|
|
8
|
+
import { assertSafeFileMutationPath } from '../utils/safe-fs.js';
|
|
9
|
+
import { resolveAbsoluteAwHome, } from '../utils/state-paths.js';
|
|
10
|
+
import { assertTestReadablePath, assertTestWritablePath } from '../utils/test-path-fence.js';
|
|
11
|
+
import { describeStrongStateProblem } from './diagnostics.js';
|
|
12
|
+
const compareText = (a, b) => a < b ? -1 : a > b ? 1 : 0;
|
|
13
|
+
const digestBytes = (bytes) => `sha256:${crypto.createHash('sha256').update(bytes).digest('hex')}`;
|
|
14
|
+
function isRecord(value) {
|
|
15
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
16
|
+
}
|
|
17
|
+
function assertKeys(value, expected, label) {
|
|
18
|
+
if (Object.keys(value).length !== expected.length
|
|
19
|
+
|| Object.keys(value).some((key) => !expected.includes(key))) {
|
|
20
|
+
throw new Error(`Invalid ${label} fields.`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export function normalizeAgents(values) {
|
|
24
|
+
return [...new Set(values.map((value) => {
|
|
25
|
+
if (isPlatformTarget(value))
|
|
26
|
+
return value;
|
|
27
|
+
throw new Error('Invalid Agent ID.');
|
|
28
|
+
}))].sort(compareText);
|
|
29
|
+
}
|
|
30
|
+
export function normalizeExclusions(value) {
|
|
31
|
+
if (!Array.isArray(value))
|
|
32
|
+
throw new Error('Invalid deployment exclusions.');
|
|
33
|
+
const result = value.map((entry) => {
|
|
34
|
+
if (!isRecord(entry))
|
|
35
|
+
throw new Error('Invalid deployment exclusion.');
|
|
36
|
+
assertKeys(entry, ['plugin', 'target'], 'deployment exclusion');
|
|
37
|
+
if (typeof entry.plugin !== 'string' || typeof entry.target !== 'string')
|
|
38
|
+
throw new Error('Invalid deployment exclusion.');
|
|
39
|
+
const parsed = parsePluginId(entry.plugin);
|
|
40
|
+
if (!parsed.sourceId)
|
|
41
|
+
throw new Error('Deployment exclusion requires source/plugin.');
|
|
42
|
+
return { plugin: `${parsed.sourceId}/${parsed.pluginName}`, target: normalizeAgents([entry.target])[0] };
|
|
43
|
+
});
|
|
44
|
+
const keys = result.map((entry) => `${entry.plugin}\0${entry.target}`);
|
|
45
|
+
if (new Set(keys).size !== keys.length)
|
|
46
|
+
throw new Error('Duplicate deployment exclusion.');
|
|
47
|
+
return result.sort((a, b) => compareText(`${a.plugin}\0${a.target}`, `${b.plugin}\0${b.target}`));
|
|
48
|
+
}
|
|
49
|
+
export function createEmptyPreferences() {
|
|
50
|
+
return { schemaVersion: 2, kind: 'aw-deployment-preferences', targets: [], exclusions: [] };
|
|
51
|
+
}
|
|
52
|
+
export function parsePreferences(value, _scope) {
|
|
53
|
+
if (!isRecord(value))
|
|
54
|
+
throw new Error('Invalid deployment preferences.');
|
|
55
|
+
assertKeys(value, ['schemaVersion', 'kind', 'targets', 'exclusions'], 'deployment preferences');
|
|
56
|
+
if (value.schemaVersion !== 2 || value.kind !== 'aw-deployment-preferences') {
|
|
57
|
+
throw new Error('Invalid deployment preferences version or kind.');
|
|
58
|
+
}
|
|
59
|
+
if (!Array.isArray(value.targets))
|
|
60
|
+
throw new Error('Invalid deployment Agents.');
|
|
61
|
+
return {
|
|
62
|
+
schemaVersion: 2, kind: 'aw-deployment-preferences',
|
|
63
|
+
targets: normalizeAgents(value.targets),
|
|
64
|
+
exclusions: normalizeExclusions(value.exclusions),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export function serializePreferences(value, scope) {
|
|
68
|
+
return `${JSON.stringify(parsePreferences(value, scope), null, 2)}\n`;
|
|
69
|
+
}
|
|
70
|
+
export async function resolvePreferencesPath(location) {
|
|
71
|
+
const awHome = resolveAbsoluteAwHome(location.env);
|
|
72
|
+
return path.join(awHome, 'deployment-preferences.json');
|
|
73
|
+
}
|
|
74
|
+
function invalidPath(error) {
|
|
75
|
+
return error instanceof Error && /(?:symbolic link|regular (?:directory|file)|escapes its allowed root)/iu
|
|
76
|
+
.test(error.message);
|
|
77
|
+
}
|
|
78
|
+
export async function observePreferences(location) {
|
|
79
|
+
try {
|
|
80
|
+
const allowedRoot = resolveAbsoluteAwHome(location.env);
|
|
81
|
+
const filePath = await resolvePreferencesPath(location);
|
|
82
|
+
assertTestReadablePath(filePath, 'deployment preferences', '用隔离 AW_HOME 登记可读路径。');
|
|
83
|
+
await assertSafeFileMutationPath({ filePath, allowedRoot, label: 'Deployment preferences' });
|
|
84
|
+
let rawBytes;
|
|
85
|
+
try {
|
|
86
|
+
rawBytes = await fs.readFile(filePath);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
if (error.code === 'ENOENT')
|
|
90
|
+
return { state: 'absent' };
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
const rawDigest = digestBytes(rawBytes);
|
|
94
|
+
try {
|
|
95
|
+
const value = parsePreferences(JSON.parse(rawBytes.toString('utf8')), location.scope);
|
|
96
|
+
return { state: 'valid', value, digest: rawDigest, rawBytes, rawDigest };
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return { state: 'invalid', code: 'deploymentPreferencesInvalid', digest: rawDigest,
|
|
100
|
+
rawBytes, rawDigest };
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
if (error instanceof Error && error.name === 'AbortError')
|
|
105
|
+
throw error;
|
|
106
|
+
return invalidPath(error)
|
|
107
|
+
? { state: 'invalid', code: 'deploymentPreferencesInvalid' }
|
|
108
|
+
: { state: 'unreadable', code: 'deploymentPreferencesUnavailable' };
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async function mutatePreferences(location, update, allowInvalid = false) {
|
|
112
|
+
return withAwHomeMutationLock({ env: location.env, token: location.token, action: async () => {
|
|
113
|
+
const observation = await observePreferences(location);
|
|
114
|
+
if (observation.state === 'unreadable') {
|
|
115
|
+
const diagnostic = describeStrongStateProblem({ kind: 'preferences', scope: 'user',
|
|
116
|
+
state: observation.state, filePath: await resolvePreferencesPath(location) });
|
|
117
|
+
throw new Error(`${diagnostic.code}: ${diagnostic.message}`);
|
|
118
|
+
}
|
|
119
|
+
if (observation.state === 'invalid' && !allowInvalid) {
|
|
120
|
+
const diagnostic = describeStrongStateProblem({ kind: 'preferences', scope: 'user',
|
|
121
|
+
state: observation.state, filePath: await resolvePreferencesPath(location) });
|
|
122
|
+
throw new Error(`${diagnostic.code}: ${diagnostic.message}`);
|
|
123
|
+
}
|
|
124
|
+
const current = observation.state === 'valid' ? observation.value : createEmptyPreferences();
|
|
125
|
+
const next = parsePreferences(update(current), location.scope);
|
|
126
|
+
if (observation.state !== 'invalid' && JSON.stringify(next) === JSON.stringify(current)) {
|
|
127
|
+
return { value: current, changed: false };
|
|
128
|
+
}
|
|
129
|
+
const allowedRoot = resolveAbsoluteAwHome(location.env);
|
|
130
|
+
const filePath = await resolvePreferencesPath(location);
|
|
131
|
+
assertTestWritablePath(filePath, 'deployment preferences', '用隔离 AW_HOME 登记可写路径。');
|
|
132
|
+
await atomicReplaceConfigFile({ filePath, allowedRoot, content: serializePreferences(next, location.scope) });
|
|
133
|
+
return { value: next, changed: true };
|
|
134
|
+
} });
|
|
135
|
+
}
|
|
136
|
+
export function writePreferences(location, value) {
|
|
137
|
+
return mutatePreferences(location, () => value);
|
|
138
|
+
}
|
|
139
|
+
export function setAgents(location, agents) {
|
|
140
|
+
const normalized = normalizeAgents(agents);
|
|
141
|
+
return mutatePreferences(location, (current) => ({ ...current, targets: normalized }));
|
|
142
|
+
}
|
|
143
|
+
export function resetTargets(location) {
|
|
144
|
+
return mutatePreferences(location, createEmptyPreferences, true);
|
|
145
|
+
}
|
|
146
|
+
export function selectAgents(options) {
|
|
147
|
+
const { preferences, targets } = options;
|
|
148
|
+
if (preferences.state === 'invalid' || preferences.state === 'unreadable') {
|
|
149
|
+
throw new Error(`Cannot select Agents with ${preferences.state} preferences.`);
|
|
150
|
+
}
|
|
151
|
+
if (targets !== undefined) {
|
|
152
|
+
return { agents: normalizeAgents(targets), origin: 'argument', preferences: preferences.state };
|
|
153
|
+
}
|
|
154
|
+
const agents = preferences.state === 'valid' ? preferences.value.targets : [];
|
|
155
|
+
return { agents, origin: agents.length > 0 ? 'preference' : 'none', preferences: preferences.state };
|
|
156
|
+
}
|
|
157
|
+
export const setTargets = setAgents;
|
|
158
|
+
/** The caller supplies a complete joint-demand check; it runs under the same write lock. */
|
|
159
|
+
export async function setExclusions(location, exclusions, validate) {
|
|
160
|
+
const normalized = normalizeExclusions(exclusions);
|
|
161
|
+
return withAwHomeMutationLock({ env: location.env, token: location.token, action: async (token) => {
|
|
162
|
+
const observed = await observePreferences(location);
|
|
163
|
+
if (observed.state !== 'valid' && observed.state !== 'absent')
|
|
164
|
+
throw new Error('deploymentPreferencesInvalid');
|
|
165
|
+
const next = { ...(observed.state === 'valid' ? observed.value : createEmptyPreferences()), exclusions: normalized };
|
|
166
|
+
await validate(next);
|
|
167
|
+
return writePreferences({ ...location, token }, next);
|
|
168
|
+
} });
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=deployment-preferences.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployment-preferences.js","sourceRoot":"","sources":["../../../src/intent/deployment-preferences.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Scope } from '../types.js';
|
|
2
|
+
export interface StrongStateDiagnostic {
|
|
3
|
+
code: string;
|
|
4
|
+
message: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function describeStrongStateProblem(options: {
|
|
7
|
+
kind: 'intent' | 'preferences';
|
|
8
|
+
scope: Scope;
|
|
9
|
+
state: 'unsupported-version' | 'invalid' | 'unreadable';
|
|
10
|
+
filePath: string;
|
|
11
|
+
}): StrongStateDiagnostic;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function describeStrongStateProblem(options) {
|
|
2
|
+
const { kind, scope, state, filePath } = options;
|
|
3
|
+
const code = kind === 'intent' ? 'pluginIntentStateInvalid' : 'deploymentPreferencesInvalid';
|
|
4
|
+
const status = state === 'unsupported-version' ? '版本不受支持'
|
|
5
|
+
: state === 'invalid' ? '格式无效' : '无法读取';
|
|
6
|
+
const action = kind === 'intent'
|
|
7
|
+
? `修复路径或移走旧文件,再用 aw plugin intent add <source/plugin> --scope ${scope} 逐项重建。`
|
|
8
|
+
: `修复路径,再用 aw plugin targets reset 显式重建部署偏好。`;
|
|
9
|
+
return {
|
|
10
|
+
code,
|
|
11
|
+
message: `${scope} ${kind === 'intent' ? '插件声明' : '部署偏好'}${status}:${filePath}。先备份此文件的原始内容,再${action}`,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../../src/intent/diagnostics.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,0BAA0B,CAAC,OAK1C;IACC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACjD,MAAM,IAAI,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,8BAA8B,CAAC;IAC7F,MAAM,MAAM,GAAG,KAAK,KAAK,qBAAqB,CAAC,CAAC,CAAC,QAAQ;QACvD,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,KAAK,QAAQ;QAC9B,CAAC,CAAC,8DAA8D,KAAK,QAAQ;QAC7E,CAAC,CAAC,2CAA2C,CAAC;IAChD,OAAO;QACL,IAAI;QACJ,OAAO,EAAE,GAAG,KAAK,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM,IAAI,QAAQ,iBAAiB,MAAM,EAAE;KACvG,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface PluginIntent {
|
|
2
|
+
schemaVersion: 3;
|
|
3
|
+
kind: 'aw-plugin-intents';
|
|
4
|
+
sources: Record<string, {
|
|
5
|
+
logicalIdentity: string;
|
|
6
|
+
}>;
|
|
7
|
+
roots: Array<{
|
|
8
|
+
pluginId: string;
|
|
9
|
+
}>;
|
|
10
|
+
}
|
|
11
|
+
export declare const INTENT_SCHEMA_VERSION = 3;
|
|
12
|
+
export declare const INTENT_KIND = "aw-plugin-intents";
|
|
13
|
+
export declare function canonicalPluginId(value: unknown): string;
|
|
14
|
+
export declare function createEmptyIntent(): PluginIntent;
|
|
15
|
+
export declare function parseIntent(value: unknown): PluginIntent;
|
|
16
|
+
export declare function serializeIntent(value: PluginIntent): string;
|
|
17
|
+
export declare function calculateIntentDigest(value: PluginIntent): string;
|
|
18
|
+
export declare function addIntentRoot(value: PluginIntent, pluginId: string, logicalIdentity: string): PluginIntent;
|
|
19
|
+
export declare function removeIntentRoot(value: PluginIntent, pluginId: string): PluginIntent;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
2
|
+
import { parsePluginId } from '../utils/multi-source-catalog.js';
|
|
3
|
+
export const INTENT_SCHEMA_VERSION = 3;
|
|
4
|
+
export const INTENT_KIND = 'aw-plugin-intents';
|
|
5
|
+
const compareText = (a, b) => a < b ? -1 : a > b ? 1 : 0;
|
|
6
|
+
function isRecord(value) {
|
|
7
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
8
|
+
}
|
|
9
|
+
function assertKeys(value, expected, label) {
|
|
10
|
+
if (Object.keys(value).length !== expected.length
|
|
11
|
+
|| Object.keys(value).some((key) => !expected.includes(key))) {
|
|
12
|
+
throw new Error(`Invalid ${label} fields.`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function canonicalPluginId(value) {
|
|
16
|
+
if (typeof value !== 'string')
|
|
17
|
+
throw new Error('Invalid plugin ID.');
|
|
18
|
+
const parsed = parsePluginId(value);
|
|
19
|
+
if (!parsed.sourceId)
|
|
20
|
+
throw new Error('Invalid plugin ID: source required.');
|
|
21
|
+
return `${parsed.sourceId}/${parsed.pluginName}`;
|
|
22
|
+
}
|
|
23
|
+
function canonicalSources(value) {
|
|
24
|
+
if (!isRecord(value))
|
|
25
|
+
throw new Error('Invalid intent sources.');
|
|
26
|
+
const result = {};
|
|
27
|
+
for (const sourceId of Object.keys(value).sort(compareText)) {
|
|
28
|
+
const parsed = parsePluginId(`${sourceId}/placeholder`);
|
|
29
|
+
if (parsed.sourceId !== sourceId)
|
|
30
|
+
throw new Error('Invalid intent source ID.');
|
|
31
|
+
const binding = value[sourceId];
|
|
32
|
+
if (!isRecord(binding))
|
|
33
|
+
throw new Error('Invalid intent source binding.');
|
|
34
|
+
assertKeys(binding, ['logicalIdentity'], 'intent source binding');
|
|
35
|
+
if (typeof binding.logicalIdentity !== 'string'
|
|
36
|
+
|| binding.logicalIdentity.trim() === ''
|
|
37
|
+
|| binding.logicalIdentity !== binding.logicalIdentity.trim()) {
|
|
38
|
+
throw new Error('Invalid intent source logical identity.');
|
|
39
|
+
}
|
|
40
|
+
result[sourceId] = { logicalIdentity: binding.logicalIdentity };
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
export function createEmptyIntent() {
|
|
45
|
+
return { schemaVersion: INTENT_SCHEMA_VERSION, kind: INTENT_KIND, sources: {}, roots: [] };
|
|
46
|
+
}
|
|
47
|
+
export function parseIntent(value) {
|
|
48
|
+
if (!isRecord(value))
|
|
49
|
+
throw new Error('Invalid plugin intent.');
|
|
50
|
+
assertKeys(value, ['schemaVersion', 'kind', 'sources', 'roots'], 'plugin intent');
|
|
51
|
+
if (value.schemaVersion !== INTENT_SCHEMA_VERSION || value.kind !== INTENT_KIND) {
|
|
52
|
+
throw new Error('Invalid plugin intent version or kind.');
|
|
53
|
+
}
|
|
54
|
+
const sources = canonicalSources(value.sources);
|
|
55
|
+
if (!Array.isArray(value.roots))
|
|
56
|
+
throw new Error('Invalid intent roots.');
|
|
57
|
+
const roots = value.roots.map((root) => {
|
|
58
|
+
if (!isRecord(root))
|
|
59
|
+
throw new Error('Invalid intent root.');
|
|
60
|
+
assertKeys(root, ['pluginId'], 'intent root');
|
|
61
|
+
return { pluginId: canonicalPluginId(root.pluginId) };
|
|
62
|
+
});
|
|
63
|
+
const ids = roots.map((root) => root.pluginId);
|
|
64
|
+
if (new Set(ids).size !== ids.length)
|
|
65
|
+
throw new Error('Invalid intent roots: duplicate plugin ID.');
|
|
66
|
+
for (const root of roots) {
|
|
67
|
+
if (!sources[root.pluginId.split('/')[0]]) {
|
|
68
|
+
throw new Error('Invalid intent roots: source binding missing.');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
schemaVersion: INTENT_SCHEMA_VERSION,
|
|
73
|
+
kind: INTENT_KIND,
|
|
74
|
+
sources,
|
|
75
|
+
roots: roots.sort((a, b) => compareText(a.pluginId, b.pluginId)),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export function serializeIntent(value) {
|
|
79
|
+
return `${JSON.stringify(parseIntent(value), null, 2)}\n`;
|
|
80
|
+
}
|
|
81
|
+
export function calculateIntentDigest(value) {
|
|
82
|
+
return `sha256:${crypto.createHash('sha256').update(JSON.stringify(parseIntent(value))).digest('hex')}`;
|
|
83
|
+
}
|
|
84
|
+
export function addIntentRoot(value, pluginId, logicalIdentity) {
|
|
85
|
+
const current = parseIntent(value);
|
|
86
|
+
const canonicalId = canonicalPluginId(pluginId);
|
|
87
|
+
const sourceId = canonicalId.split('/')[0];
|
|
88
|
+
if (typeof logicalIdentity !== 'string' || logicalIdentity.trim() !== logicalIdentity
|
|
89
|
+
|| logicalIdentity === '')
|
|
90
|
+
throw new Error('Invalid source logical identity.');
|
|
91
|
+
const existing = current.sources[sourceId];
|
|
92
|
+
if (existing && existing.logicalIdentity !== logicalIdentity) {
|
|
93
|
+
throw new Error('sourceIdentityConflict: source alias has another logical identity.');
|
|
94
|
+
}
|
|
95
|
+
if (current.roots.some((root) => root.pluginId === canonicalId))
|
|
96
|
+
return current;
|
|
97
|
+
return parseIntent({
|
|
98
|
+
...current,
|
|
99
|
+
sources: { ...current.sources, [sourceId]: { logicalIdentity } },
|
|
100
|
+
roots: [...current.roots, { pluginId: canonicalId }],
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
export function removeIntentRoot(value, pluginId) {
|
|
104
|
+
const current = parseIntent(value);
|
|
105
|
+
const canonicalId = canonicalPluginId(pluginId);
|
|
106
|
+
const roots = current.roots.filter((root) => root.pluginId !== canonicalId);
|
|
107
|
+
if (roots.length === current.roots.length)
|
|
108
|
+
return current;
|
|
109
|
+
const removedSource = canonicalId.split('/')[0];
|
|
110
|
+
const sourceStillUsed = roots.some((root) => root.pluginId.split('/')[0] === removedSource);
|
|
111
|
+
return parseIntent({
|
|
112
|
+
...current,
|
|
113
|
+
sources: Object.fromEntries(Object.entries(current.sources).filter(([id]) => id !== removedSource || sourceStillUsed)),
|
|
114
|
+
roots,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=intent-codec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intent-codec.js","sourceRoot":"","sources":["../../../src/intent/intent-codec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Scope } from '../types.js';
|
|
2
|
+
import { type AwHomeMutationToken } from '../utils/aw-home-mutation-lock.js';
|
|
3
|
+
import { type ProjectSharedConfigVisibility } from '../utils/project-boundary.js';
|
|
4
|
+
import { type PluginIntent } from './intent-codec.js';
|
|
5
|
+
export interface IntentLocation {
|
|
6
|
+
scope: Scope;
|
|
7
|
+
cwd: string;
|
|
8
|
+
env?: NodeJS.ProcessEnv;
|
|
9
|
+
token?: AwHomeMutationToken;
|
|
10
|
+
}
|
|
11
|
+
interface ReadEvidence {
|
|
12
|
+
rawBytes: Buffer;
|
|
13
|
+
rawDigest: string;
|
|
14
|
+
}
|
|
15
|
+
export type IntentObservation = {
|
|
16
|
+
state: 'absent';
|
|
17
|
+
} | ({
|
|
18
|
+
state: 'valid';
|
|
19
|
+
value: PluginIntent;
|
|
20
|
+
digest: string;
|
|
21
|
+
} & ReadEvidence) | ({
|
|
22
|
+
state: 'unsupported-version';
|
|
23
|
+
schemaVersion: number;
|
|
24
|
+
digest: string;
|
|
25
|
+
} & ReadEvidence) | ({
|
|
26
|
+
state: 'invalid';
|
|
27
|
+
code: 'pluginIntentStateInvalid';
|
|
28
|
+
digest?: string;
|
|
29
|
+
} & Partial<ReadEvidence>) | {
|
|
30
|
+
state: 'unreadable';
|
|
31
|
+
code: 'pluginIntentStateUnavailable';
|
|
32
|
+
};
|
|
33
|
+
export interface IntentWriteResult {
|
|
34
|
+
value: PluginIntent;
|
|
35
|
+
changed: boolean;
|
|
36
|
+
visibility?: ProjectSharedConfigVisibility;
|
|
37
|
+
}
|
|
38
|
+
export declare function resolveIntentPath(location: IntentLocation): Promise<string>;
|
|
39
|
+
export declare function observeIntent(location: IntentLocation): Promise<IntentObservation>;
|
|
40
|
+
export declare function writeIntent(location: IntentLocation, value: PluginIntent): Promise<IntentWriteResult>;
|
|
41
|
+
export declare function addRoot(location: IntentLocation, pluginId: string, logicalIdentity: string): Promise<IntentWriteResult>;
|
|
42
|
+
export declare function removeRoot(location: IntentLocation, pluginId: string): Promise<IntentWriteResult>;
|
|
43
|
+
export {};
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import { withAwHomeMutationLock } from '../utils/aw-home-mutation-lock.js';
|
|
5
|
+
import { atomicReplaceConfigFile } from '../utils/plugin-config.js';
|
|
6
|
+
import { assertCanonicalProjectManagedRoots, assertProjectSharedConfigPathVisible, } from '../utils/project-boundary.js';
|
|
7
|
+
import { assertSafeFileMutationPath } from '../utils/safe-fs.js';
|
|
8
|
+
import { resolveAbsoluteAwHome, resolveRequiredCanonicalRepoRoot } from '../utils/state-paths.js';
|
|
9
|
+
import { assertTestReadablePath, assertTestWritablePath } from '../utils/test-path-fence.js';
|
|
10
|
+
import { addIntentRoot, calculateIntentDigest, createEmptyIntent, parseIntent, removeIntentRoot, serializeIntent, } from './intent-codec.js';
|
|
11
|
+
import { describeStrongStateProblem } from './diagnostics.js';
|
|
12
|
+
const digestBytes = (bytes) => `sha256:${crypto.createHash('sha256').update(bytes).digest('hex')}`;
|
|
13
|
+
function isRecord(value) {
|
|
14
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
15
|
+
}
|
|
16
|
+
function invalidPath(error) {
|
|
17
|
+
return error instanceof Error && /(?:symbolic link|regular (?:directory|file)|escapes its allowed root|符号链接|realpath 越界|必须位于 repo 内)/iu
|
|
18
|
+
.test(error.message);
|
|
19
|
+
}
|
|
20
|
+
async function intentPath(location, access) {
|
|
21
|
+
const allowedRoot = location.scope === 'user'
|
|
22
|
+
? resolveAbsoluteAwHome(location.env)
|
|
23
|
+
: await assertCanonicalProjectManagedRoots({
|
|
24
|
+
cwd: await resolveRequiredCanonicalRepoRoot(location.cwd),
|
|
25
|
+
rootNames: [], managedPaths: ['.agent-workflows'],
|
|
26
|
+
});
|
|
27
|
+
const filePath = location.scope === 'user'
|
|
28
|
+
? path.join(allowedRoot, 'plugin-intents.json')
|
|
29
|
+
: path.join(allowedRoot, '.agent-workflows', 'plugin-intents.json');
|
|
30
|
+
const message = '用隔离 AW_HOME 或 project 根登记可读写路径。';
|
|
31
|
+
if (access === 'read')
|
|
32
|
+
assertTestReadablePath(filePath, 'plugin intent', message);
|
|
33
|
+
else
|
|
34
|
+
assertTestWritablePath(filePath, 'plugin intent', message);
|
|
35
|
+
return { allowedRoot, filePath };
|
|
36
|
+
}
|
|
37
|
+
export async function resolveIntentPath(location) {
|
|
38
|
+
if (location.scope === 'user')
|
|
39
|
+
return path.join(resolveAbsoluteAwHome(location.env), 'plugin-intents.json');
|
|
40
|
+
return path.join(await resolveRequiredCanonicalRepoRoot(location.cwd), '.agent-workflows', 'plugin-intents.json');
|
|
41
|
+
}
|
|
42
|
+
export async function observeIntent(location) {
|
|
43
|
+
try {
|
|
44
|
+
const { allowedRoot, filePath } = await intentPath(location, 'read');
|
|
45
|
+
await assertSafeFileMutationPath({ filePath, allowedRoot, label: 'Plugin intent' });
|
|
46
|
+
let rawBytes;
|
|
47
|
+
try {
|
|
48
|
+
rawBytes = await fs.readFile(filePath);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
if (error.code === 'ENOENT')
|
|
52
|
+
return { state: 'absent' };
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
const rawDigest = digestBytes(rawBytes);
|
|
56
|
+
let parsed;
|
|
57
|
+
try {
|
|
58
|
+
parsed = JSON.parse(rawBytes.toString('utf8'));
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return { state: 'invalid', code: 'pluginIntentStateInvalid', digest: rawDigest, rawBytes, rawDigest };
|
|
62
|
+
}
|
|
63
|
+
if (!isRecord(parsed) || parsed.kind !== 'aw-plugin-intents'
|
|
64
|
+
|| !Number.isInteger(parsed.schemaVersion)) {
|
|
65
|
+
return { state: 'invalid', code: 'pluginIntentStateInvalid', digest: rawDigest, rawBytes, rawDigest };
|
|
66
|
+
}
|
|
67
|
+
if (parsed.schemaVersion !== 3) {
|
|
68
|
+
return { state: 'unsupported-version', schemaVersion: parsed.schemaVersion,
|
|
69
|
+
digest: rawDigest, rawBytes, rawDigest };
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
return { state: 'valid', value: parseIntent(parsed), digest: rawDigest, rawBytes, rawDigest };
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return { state: 'invalid', code: 'pluginIntentStateInvalid', digest: rawDigest, rawBytes, rawDigest };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
if (error instanceof Error && error.name === 'AbortError')
|
|
80
|
+
throw error;
|
|
81
|
+
return invalidPath(error)
|
|
82
|
+
? { state: 'invalid', code: 'pluginIntentStateInvalid' }
|
|
83
|
+
: { state: 'unreadable', code: 'pluginIntentStateUnavailable' };
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async function mutateIntent(location, update) {
|
|
87
|
+
return withAwHomeMutationLock({ env: location.env, token: location.token, action: async () => {
|
|
88
|
+
const observation = await observeIntent(location);
|
|
89
|
+
if (observation.state !== 'absent' && observation.state !== 'valid') {
|
|
90
|
+
const diagnostic = describeStrongStateProblem({
|
|
91
|
+
kind: 'intent', scope: location.scope, state: observation.state,
|
|
92
|
+
filePath: await resolveIntentPath(location),
|
|
93
|
+
});
|
|
94
|
+
throw new Error(`${diagnostic.code}: ${diagnostic.message}`);
|
|
95
|
+
}
|
|
96
|
+
const current = observation.state === 'valid' ? observation.value : createEmptyIntent();
|
|
97
|
+
const next = parseIntent(update(current));
|
|
98
|
+
if (calculateIntentDigest(next) === calculateIntentDigest(current)) {
|
|
99
|
+
return { value: current, changed: false };
|
|
100
|
+
}
|
|
101
|
+
const { allowedRoot, filePath } = await intentPath(location, 'write');
|
|
102
|
+
const visibility = location.scope === 'project'
|
|
103
|
+
? await assertProjectSharedConfigPathVisible({ cwd: allowedRoot, targetPath: filePath, env: location.env })
|
|
104
|
+
: undefined;
|
|
105
|
+
await atomicReplaceConfigFile({ filePath, allowedRoot, content: serializeIntent(next) });
|
|
106
|
+
return { value: next, changed: true, ...(visibility ? { visibility } : {}) };
|
|
107
|
+
} });
|
|
108
|
+
}
|
|
109
|
+
export function writeIntent(location, value) {
|
|
110
|
+
return mutateIntent(location, () => value);
|
|
111
|
+
}
|
|
112
|
+
export function addRoot(location, pluginId, logicalIdentity) {
|
|
113
|
+
return mutateIntent(location, (current) => addIntentRoot(current, pluginId, logicalIdentity));
|
|
114
|
+
}
|
|
115
|
+
export function removeRoot(location, pluginId) {
|
|
116
|
+
return mutateIntent(location, (current) => removeIntentRoot(current, pluginId));
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=intent-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intent-store.js","sourceRoot":"","sources":["../../../src/intent/intent-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Scope } from '../types.js';
|
|
2
|
+
export interface ScopeContext {
|
|
3
|
+
scope: Scope;
|
|
4
|
+
callerCwd: string;
|
|
5
|
+
executionCwd: string;
|
|
6
|
+
projectRoot?: string;
|
|
7
|
+
projectKey?: string;
|
|
8
|
+
configProfile: 'user' | 'project';
|
|
9
|
+
generationRoot: string;
|
|
10
|
+
awHome: string;
|
|
11
|
+
targetHomes: {
|
|
12
|
+
home: string;
|
|
13
|
+
codex: string;
|
|
14
|
+
claude: string;
|
|
15
|
+
cursor: string;
|
|
16
|
+
xdgState: string;
|
|
17
|
+
};
|
|
18
|
+
env: NodeJS.ProcessEnv;
|
|
19
|
+
dispose(): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
export interface ScopeContextOptions {
|
|
22
|
+
scope: Scope;
|
|
23
|
+
cwd: string;
|
|
24
|
+
env?: NodeJS.ProcessEnv;
|
|
25
|
+
readOnly?: boolean;
|
|
26
|
+
}
|
|
27
|
+
export declare function assertNeutralAncestorChain(candidate: string): Promise<string>;
|
|
28
|
+
export declare function createSafeNeutralCwd(env: NodeJS.ProcessEnv): Promise<{
|
|
29
|
+
executionCwd: string;
|
|
30
|
+
dispose(): Promise<void>;
|
|
31
|
+
}>;
|
|
32
|
+
export declare function createScopeContext(options: ScopeContextOptions): Promise<ScopeContext>;
|
|
33
|
+
export declare function withScopeContext<T>(options: ScopeContextOptions, action: (context: ScopeContext) => Promise<T>): Promise<T>;
|