@dharma-ai-labs/agent-fabric 0.2.14 → 0.2.16
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 +8 -0
- package/dist/index.d.ts +65 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +216 -19
- package/dist/index.js.map +1 -1
- package/dist/index.test.js +154 -4
- package/dist/index.test.js.map +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -40,6 +40,14 @@ Current provider adapters are Codex, Claude Code, and Agy. Run
|
|
|
40
40
|
`dharma providers list` because evidence, task, continuation, Skill installation,
|
|
41
41
|
activation, and usage capabilities are reported independently.
|
|
42
42
|
|
|
43
|
+
Agy 1.1.15 Skill activation uses only its supported plugin and sandboxed print
|
|
44
|
+
interfaces. During onboarding, Dharma adds the narrow read-only
|
|
45
|
+
`command(git status)` preflight to Agy's permission allowlist. It never uses
|
|
46
|
+
`--dangerously-skip-permissions`. A signed remediation Skill contains a
|
|
47
|
+
content-bound activation token; Agy must return that token with a fresh nonce
|
|
48
|
+
before the device signs an active installation receipt. A mismatch restores the
|
|
49
|
+
previous bundle before the receipt is posted.
|
|
50
|
+
|
|
43
51
|
Signed workspace registration returns the organization-admin-approved evidence
|
|
44
52
|
policy from Dharma HQ. The CLI applies that server revision to
|
|
45
53
|
`.dharma/approved-policy.json` automatically. Without an active content grant,
|
package/dist/index.d.ts
CHANGED
|
@@ -161,11 +161,23 @@ export declare function verifyAgentFabricSkillInstallation(input: {
|
|
|
161
161
|
workspace: string;
|
|
162
162
|
env?: NodeJS.ProcessEnv;
|
|
163
163
|
home?: string;
|
|
164
|
+
listAgyPlugins?: (executable: string, argv: string[], options: {
|
|
165
|
+
timeout: number;
|
|
166
|
+
env: NodeJS.ProcessEnv;
|
|
167
|
+
}) => Promise<{
|
|
168
|
+
stdout: string | Buffer;
|
|
169
|
+
}>;
|
|
164
170
|
}): Promise<{
|
|
165
171
|
provider: ProviderId;
|
|
166
172
|
ready: boolean;
|
|
173
|
+
verificationScope: string;
|
|
174
|
+
bootstrapReady: boolean;
|
|
175
|
+
signedLifecycleReady: boolean;
|
|
167
176
|
repositoryInstalled: boolean;
|
|
168
177
|
nativeInstalled: boolean;
|
|
178
|
+
nativeManaged: boolean;
|
|
179
|
+
nativeDiscovered: boolean;
|
|
180
|
+
activationAttested: boolean;
|
|
169
181
|
repositorySkillPath: string;
|
|
170
182
|
connectionPath: string;
|
|
171
183
|
nativeSkillPath: string;
|
|
@@ -176,12 +188,65 @@ export declare function verifyAgentFabricSkillInstallation(input: {
|
|
|
176
188
|
}>;
|
|
177
189
|
type AgyPluginExecutor = (executable: string, argv: string[], options: {
|
|
178
190
|
timeout: number;
|
|
191
|
+
env: NodeJS.ProcessEnv;
|
|
179
192
|
}) => Promise<unknown>;
|
|
180
193
|
export declare function activateAgyPlugin(input?: {
|
|
181
194
|
env?: NodeJS.ProcessEnv;
|
|
182
195
|
home?: string;
|
|
183
196
|
execute?: AgyPluginExecutor;
|
|
184
197
|
}): Promise<void>;
|
|
198
|
+
export declare function ensureAgyReadOnlyAttestationPermission(input?: {
|
|
199
|
+
env?: NodeJS.ProcessEnv;
|
|
200
|
+
home?: string;
|
|
201
|
+
}): Promise<{
|
|
202
|
+
changed: boolean;
|
|
203
|
+
settingsPath: string;
|
|
204
|
+
permission: string;
|
|
205
|
+
}>;
|
|
206
|
+
type AgyAttestationExecutor = (executable: string, argv: string[], options: {
|
|
207
|
+
timeout: number;
|
|
208
|
+
env: NodeJS.ProcessEnv;
|
|
209
|
+
cwd: string;
|
|
210
|
+
}) => Promise<{
|
|
211
|
+
stdout: string | Buffer;
|
|
212
|
+
}>;
|
|
213
|
+
export declare function attestAgySkillActivation(input: {
|
|
214
|
+
skillId: string;
|
|
215
|
+
skillPath: string;
|
|
216
|
+
workspace: string;
|
|
217
|
+
challenge?: string;
|
|
218
|
+
env?: NodeJS.ProcessEnv;
|
|
219
|
+
execute?: AgyAttestationExecutor;
|
|
220
|
+
}): Promise<{
|
|
221
|
+
name: string;
|
|
222
|
+
status: "unavailable";
|
|
223
|
+
details: string;
|
|
224
|
+
} | {
|
|
225
|
+
name: string;
|
|
226
|
+
status: "fail";
|
|
227
|
+
details: string;
|
|
228
|
+
} | {
|
|
229
|
+
name: string;
|
|
230
|
+
status: "pass";
|
|
231
|
+
details: string;
|
|
232
|
+
}>;
|
|
233
|
+
export declare function attestAgySkillBundleActivation(input: {
|
|
234
|
+
bundle: SkillBundle;
|
|
235
|
+
nativeSkillDirectory: string;
|
|
236
|
+
workspace: string;
|
|
237
|
+
}): Promise<{
|
|
238
|
+
name: string;
|
|
239
|
+
status: "unavailable";
|
|
240
|
+
details: string;
|
|
241
|
+
} | {
|
|
242
|
+
name: string;
|
|
243
|
+
status: "fail";
|
|
244
|
+
details: string;
|
|
245
|
+
} | {
|
|
246
|
+
name: string;
|
|
247
|
+
status: "pass";
|
|
248
|
+
details: string;
|
|
249
|
+
}>;
|
|
185
250
|
export declare function materializeInlineSkillFiles(bundle: SkillBundle, sourceRoot: string): Promise<boolean>;
|
|
186
251
|
export declare function recoverLegacySkillBundleIdAfterAuthorizationFailure(input: {
|
|
187
252
|
nativeSkillDirectory: string;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AASA,OAAO,EAGL,KAAK,kBAAkB,EAAE,KAAK,UAAU,EAAE,KAAK,0BAA0B,EAC1E,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAA2G,KAAK,iBAAiB,EAAE,MAAM,iDAAiD,CAAC;AAClM,OAAO,EAAsE,KAAK,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAClJ,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -10,13 +10,13 @@ import { promisify } from 'node:util';
|
|
|
10
10
|
import { canonicalize, createActionDecisionPublicKeyResolver, sha256, validateContract, validateTrustedServerSigningKeysetContract, verifyCanonicalObject, verifyInitialServerSigningKeyset, } from '@dharma-ai-labs/agent-fabric-contracts';
|
|
11
11
|
import { buildTrajectoryCapsule, redactValue, referencesExcludedPath, trajectoryCapsuleHash } from '@dharma-ai-labs/agent-fabric-evidence-reduction';
|
|
12
12
|
import { assertPolicy, loadOrganizationPolicy, verifyServerAuthorizedPolicy } from '@dharma-ai-labs/agent-fabric-policy';
|
|
13
|
-
import { agyAdapter, claudeAdapter, codexAdapter, providerAdapters, providerExecutionRecords } from '@dharma-ai-labs/agent-fabric-provider-adapters';
|
|
13
|
+
import { agyAdapter, claudeAdapter, codexAdapter, providerAdapters, providerExecutionRecords, providerProcessEnvironment } from '@dharma-ai-labs/agent-fabric-provider-adapters';
|
|
14
14
|
import { AgentFabricClient, beginEnrollment, loadOrCreateDeviceIdentity, normalizeHqUrl, pollEnrollment, deleteActiveSkillAuthorizationAnchor, loadActiveSkillAuthorizationAnchor, loadDeviceEnrollmentAnchor, saveActiveSkillAuthorizationAnchor, isDefinitiveAgentFabricRejection, recoverDeviceEnrollmentConsistency, saveDeviceConfig, saveDeviceEnrollmentAnchor, } from '@dharma-ai-labs/agent-fabric-relay-client';
|
|
15
15
|
import { AgentFabricClient as AgentFabricApiClient } from '@dharma-ai-labs/agent-fabric-sdk';
|
|
16
16
|
import { getActiveSkillBundleAuthorization, getExpiredSkillBundleAuthorizationForReplacement, getLegacySkillBundleIdForUpgrade, installSkillBundle, rollbackUnconfirmedSkillBundle, verifySkillBundle } from '@dharma-ai-labs/agent-fabric-skill-manager';
|
|
17
17
|
import { executeTask, FileActionExecutionJournal, FileTaskReceiptStore, providerInstructionsForTask, } from '@dharma-ai-labs/agent-fabric-task-runner';
|
|
18
18
|
import { CLI_USAGE } from './usage.js';
|
|
19
|
-
const VERSION = '0.2.
|
|
19
|
+
const VERSION = '0.2.16';
|
|
20
20
|
const USAGE = CLI_USAGE;
|
|
21
21
|
const execFileAsync = promisify(execFile);
|
|
22
22
|
export function parseCliOptions(args) {
|
|
@@ -2932,12 +2932,9 @@ The repository-local skill and connection manifest are authoritative for the act
|
|
|
2932
2932
|
await mkdir(skillRoot, { recursive: true, mode: 0o700 });
|
|
2933
2933
|
await writeFile(resolve(skillRoot, 'SKILL.md'), skill, { mode: 0o600 });
|
|
2934
2934
|
await writeFile(marker, `${JSON.stringify({
|
|
2935
|
-
schema: 'dharma.native-skill-bootstrap/
|
|
2935
|
+
schema: 'dharma.native-skill-bootstrap/v2',
|
|
2936
2936
|
managedBy: 'dharma-agent-fabric',
|
|
2937
2937
|
provider: input.provider,
|
|
2938
|
-
organizationId: input.organizationId,
|
|
2939
|
-
workspaceId: input.workspaceId,
|
|
2940
|
-
workspaceRouteHash: sha256(resolve(input.workspace)),
|
|
2941
2938
|
hqUrl: input.hqUrl,
|
|
2942
2939
|
installedAt: new Date().toISOString(),
|
|
2943
2940
|
}, null, 2)}\n`, { mode: 0o600 });
|
|
@@ -2947,7 +2944,7 @@ The repository-local skill and connection manifest are authoritative for the act
|
|
|
2947
2944
|
provider: input.provider,
|
|
2948
2945
|
nativeSkillDirectory: root,
|
|
2949
2946
|
skillPath: resolve(skillRoot, 'SKILL.md'),
|
|
2950
|
-
activation: 'next_session',
|
|
2947
|
+
activation: input.provider === 'agy' ? 'manual_invocation_required' : 'next_session',
|
|
2951
2948
|
verified: await pathExists(resolve(skillRoot, 'SKILL.md')) && await pathExists(marker),
|
|
2952
2949
|
};
|
|
2953
2950
|
}
|
|
@@ -2956,7 +2953,7 @@ export async function installAvailableNativeAgentFabricBootstraps(input) {
|
|
|
2956
2953
|
const installed = [];
|
|
2957
2954
|
const failures = [];
|
|
2958
2955
|
for (const capability of input.providers) {
|
|
2959
|
-
if (capability.skillInstall
|
|
2956
|
+
if (capability.skillInstall === 'unavailable')
|
|
2960
2957
|
continue;
|
|
2961
2958
|
try {
|
|
2962
2959
|
installed.push(await install({
|
|
@@ -2985,7 +2982,39 @@ export async function verifyAgentFabricSkillInstallation(input) {
|
|
|
2985
2982
|
const nativeSkillPath = resolve(nativeRoot, 'dharma-agent-fabric', 'SKILL.md');
|
|
2986
2983
|
const nativeMarkerPath = resolve(nativeRoot, 'dharma-agent-fabric', '.dharma-agent-fabric-bootstrap.json');
|
|
2987
2984
|
const repositoryInstalled = await pathExists(repositorySkillPath) && await pathExists(connectionPath);
|
|
2988
|
-
|
|
2985
|
+
let nativeManaged = false;
|
|
2986
|
+
if (await pathExists(nativeSkillPath) && await pathExists(nativeMarkerPath)) {
|
|
2987
|
+
try {
|
|
2988
|
+
const marker = JSON.parse(await readFile(nativeMarkerPath, 'utf8'));
|
|
2989
|
+
nativeManaged = marker.managedBy === 'dharma-agent-fabric'
|
|
2990
|
+
&& marker.provider === input.provider
|
|
2991
|
+
&& ['dharma.native-skill-bootstrap/v1', 'dharma.native-skill-bootstrap/v2'].includes(String(marker.schema));
|
|
2992
|
+
}
|
|
2993
|
+
catch { }
|
|
2994
|
+
}
|
|
2995
|
+
const nativeInstalled = nativeManaged;
|
|
2996
|
+
let nativeDiscovered = input.provider === 'agy' ? false : nativeInstalled;
|
|
2997
|
+
if (input.provider === 'agy' && nativeInstalled) {
|
|
2998
|
+
try {
|
|
2999
|
+
const listAgyPlugins = input.listAgyPlugins
|
|
3000
|
+
|| ((executable, argv, options) => (execFileAsync(executable, argv, options)));
|
|
3001
|
+
const { stdout } = await listAgyPlugins('agy', ['plugin', 'list'], {
|
|
3002
|
+
timeout: 30_000,
|
|
3003
|
+
env: providerProcessEnvironment(input.env),
|
|
3004
|
+
});
|
|
3005
|
+
const list = JSON.parse(String(stdout));
|
|
3006
|
+
nativeDiscovered = Array.isArray(list.imports) && list.imports.some((item) => {
|
|
3007
|
+
if (!item || typeof item !== 'object')
|
|
3008
|
+
return false;
|
|
3009
|
+
const plugin = item;
|
|
3010
|
+
return plugin.name === 'dharma-agent-fabric'
|
|
3011
|
+
&& Array.isArray(plugin.components)
|
|
3012
|
+
&& plugin.components.includes('skills');
|
|
3013
|
+
});
|
|
3014
|
+
}
|
|
3015
|
+
catch { }
|
|
3016
|
+
}
|
|
3017
|
+
const bootstrapReady = repositoryInstalled && nativeInstalled && nativeDiscovered;
|
|
2989
3018
|
let workspaceId;
|
|
2990
3019
|
let organizationAgentId;
|
|
2991
3020
|
try {
|
|
@@ -3000,25 +3029,46 @@ export async function verifyAgentFabricSkillInstallation(input) {
|
|
|
3000
3029
|
const activeBundleId = workspaceId && organizationAgentId && config
|
|
3001
3030
|
? (await activeSkillAuthorization(input.provider, workspaceId, organizationAgentId, config))?.bundleId ?? null
|
|
3002
3031
|
: null;
|
|
3032
|
+
let activationAttested = input.provider !== 'agy' ? nativeInstalled : false;
|
|
3033
|
+
if (input.provider === 'agy' && activeBundleId && workspaceId) {
|
|
3034
|
+
try {
|
|
3035
|
+
const receipt = JSON.parse(await readFile(resolve(nativeRoot, '.dharma-managed', 'workspaces', workspaceId, 'active', 'INSTALL_RECEIPT.json'), 'utf8'));
|
|
3036
|
+
activationAttested = Array.isArray(receipt.checks) && receipt.checks.some((item) => (item && typeof item === 'object'
|
|
3037
|
+
&& item.name === 'provider:agy:activation'
|
|
3038
|
+
&& item.status === 'pass'));
|
|
3039
|
+
}
|
|
3040
|
+
catch { }
|
|
3041
|
+
}
|
|
3042
|
+
const signedLifecycleReady = bootstrapReady && activationAttested && Boolean(activeBundleId);
|
|
3003
3043
|
return {
|
|
3004
3044
|
provider: input.provider,
|
|
3005
|
-
ready:
|
|
3045
|
+
ready: bootstrapReady,
|
|
3046
|
+
verificationScope: 'generic_bootstrap',
|
|
3047
|
+
bootstrapReady,
|
|
3048
|
+
signedLifecycleReady,
|
|
3006
3049
|
repositoryInstalled,
|
|
3007
3050
|
nativeInstalled,
|
|
3051
|
+
nativeManaged,
|
|
3052
|
+
nativeDiscovered,
|
|
3053
|
+
activationAttested,
|
|
3008
3054
|
repositorySkillPath,
|
|
3009
3055
|
connectionPath,
|
|
3010
3056
|
nativeSkillPath,
|
|
3011
3057
|
workspaceId: workspaceId || null,
|
|
3012
3058
|
activeBundleId,
|
|
3013
|
-
activation: 'next_session',
|
|
3014
|
-
nextAction:
|
|
3015
|
-
?
|
|
3016
|
-
:
|
|
3059
|
+
activation: input.provider === 'agy' ? (activationAttested ? 'attested' : 'manual_invocation_required') : 'next_session',
|
|
3060
|
+
nextAction: input.provider === 'agy' && bootstrapReady && !activationAttested
|
|
3061
|
+
? 'The Agy bootstrap is installed and discoverable. A signed remediation bundle must include and pass the content-bound activation challenge before full lifecycle support is reported.'
|
|
3062
|
+
: bootstrapReady
|
|
3063
|
+
? `Start a new ${input.provider} session from ${workspace} and invoke the dharma-agent-fabric skill.`
|
|
3064
|
+
: 'Run dharma onboard again from the repository root.',
|
|
3017
3065
|
};
|
|
3018
3066
|
}
|
|
3019
3067
|
export async function activateAgyPlugin(input = {}) {
|
|
3068
|
+
await ensureAgyReadOnlyAttestationPermission({ env: input.env, home: input.home });
|
|
3020
3069
|
const root = resolve(nativeSkillDirectory('agy', input.env, input.home), '..');
|
|
3021
3070
|
const execute = input.execute || ((executable, argv, options) => execFileAsync(executable, argv, options));
|
|
3071
|
+
const options = { timeout: 30_000, env: providerProcessEnvironment(input.env) };
|
|
3022
3072
|
await mkdir(root, { recursive: true, mode: 0o700 });
|
|
3023
3073
|
const manifest = resolve(root, 'plugin.json');
|
|
3024
3074
|
try {
|
|
@@ -3027,9 +3077,151 @@ export async function activateAgyPlugin(input = {}) {
|
|
|
3027
3077
|
catch {
|
|
3028
3078
|
await writeFile(manifest, `${JSON.stringify({ name: 'dharma-agent-fabric' }, null, 2)}\n`, { mode: 0o600 });
|
|
3029
3079
|
}
|
|
3030
|
-
await execute('agy', ['plugin', 'validate', root],
|
|
3031
|
-
await execute('agy', ['plugin', 'install', root],
|
|
3032
|
-
await execute('agy', ['plugin', 'enable', 'dharma-agent-fabric'],
|
|
3080
|
+
await execute('agy', ['plugin', 'validate', root], options);
|
|
3081
|
+
await execute('agy', ['plugin', 'install', root], options);
|
|
3082
|
+
await execute('agy', ['plugin', 'enable', 'dharma-agent-fabric'], options);
|
|
3083
|
+
}
|
|
3084
|
+
const AGY_ATTESTATION_PERMISSION = 'command(git status)';
|
|
3085
|
+
const AGY_ACTIVATION_TOKEN = /^Dharma activation token: `(sha256:[a-f0-9]{64})`$/m;
|
|
3086
|
+
export async function ensureAgyReadOnlyAttestationPermission(input = {}) {
|
|
3087
|
+
const configRoot = resolve(input.env?.AGY_CONFIG_DIR || resolve(input.home || homedir(), '.gemini', 'antigravity-cli'));
|
|
3088
|
+
const settingsPath = resolve(configRoot, 'settings.json');
|
|
3089
|
+
await mkdir(configRoot, { recursive: true, mode: 0o700 });
|
|
3090
|
+
let settings = {};
|
|
3091
|
+
if (await pathExists(settingsPath)) {
|
|
3092
|
+
const parsed = JSON.parse(await readFile(settingsPath, 'utf8'));
|
|
3093
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
3094
|
+
throw new Error('Agy settings must be a JSON object before Dharma can add its read-only preflight permission.');
|
|
3095
|
+
}
|
|
3096
|
+
settings = parsed;
|
|
3097
|
+
}
|
|
3098
|
+
const permissions = settings.permissions && typeof settings.permissions === 'object' && !Array.isArray(settings.permissions)
|
|
3099
|
+
? settings.permissions
|
|
3100
|
+
: {};
|
|
3101
|
+
const current = permissions.allow;
|
|
3102
|
+
if (current !== undefined && (!Array.isArray(current) || current.some((item) => typeof item !== 'string'))) {
|
|
3103
|
+
throw new Error('Agy permissions.allow must be a string array.');
|
|
3104
|
+
}
|
|
3105
|
+
const allow = [...new Set([...(Array.isArray(current) ? current : []), AGY_ATTESTATION_PERMISSION])];
|
|
3106
|
+
if (Array.isArray(current) && current.length === allow.length) {
|
|
3107
|
+
return { changed: false, settingsPath, permission: AGY_ATTESTATION_PERMISSION };
|
|
3108
|
+
}
|
|
3109
|
+
const updated = { ...settings, permissions: { ...permissions, allow } };
|
|
3110
|
+
const temporary = resolve(configRoot, `.settings.${randomUUID()}.tmp`);
|
|
3111
|
+
await writeFile(temporary, `${JSON.stringify(updated, null, 2)}\n`, { mode: 0o600 });
|
|
3112
|
+
await rename(temporary, settingsPath);
|
|
3113
|
+
return { changed: true, settingsPath, permission: AGY_ATTESTATION_PERMISSION };
|
|
3114
|
+
}
|
|
3115
|
+
function parseAgyStructuredResponse(stdout) {
|
|
3116
|
+
try {
|
|
3117
|
+
const outer = JSON.parse(String(stdout));
|
|
3118
|
+
if (outer.status !== 'SUCCESS' || typeof outer.response !== 'string')
|
|
3119
|
+
return null;
|
|
3120
|
+
const match = outer.response.match(/\{[\s\S]*\}/);
|
|
3121
|
+
if (!match)
|
|
3122
|
+
return null;
|
|
3123
|
+
const value = JSON.parse(match[0]);
|
|
3124
|
+
return value && typeof value === 'object' && !Array.isArray(value) ? value : null;
|
|
3125
|
+
}
|
|
3126
|
+
catch {
|
|
3127
|
+
return null;
|
|
3128
|
+
}
|
|
3129
|
+
}
|
|
3130
|
+
export async function attestAgySkillActivation(input) {
|
|
3131
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(input.skillId)) {
|
|
3132
|
+
throw new Error('Agy activation skill identifier is invalid.');
|
|
3133
|
+
}
|
|
3134
|
+
const skill = await readFile(input.skillPath, 'utf8');
|
|
3135
|
+
const token = skill.match(AGY_ACTIVATION_TOKEN)?.[1];
|
|
3136
|
+
if (!token) {
|
|
3137
|
+
return {
|
|
3138
|
+
name: 'provider:agy:activation',
|
|
3139
|
+
status: 'unavailable',
|
|
3140
|
+
details: `Signed skill ${input.skillId} does not contain a Dharma activation token.`,
|
|
3141
|
+
};
|
|
3142
|
+
}
|
|
3143
|
+
const challenge = input.challenge || randomUUID();
|
|
3144
|
+
if (!/^[A-Za-z0-9_-]{8,128}$/.test(challenge))
|
|
3145
|
+
throw new Error('Agy activation challenge is invalid.');
|
|
3146
|
+
const schema = JSON.stringify({
|
|
3147
|
+
type: 'object',
|
|
3148
|
+
additionalProperties: false,
|
|
3149
|
+
required: ['challenge', 'activationToken'],
|
|
3150
|
+
properties: {
|
|
3151
|
+
challenge: { type: 'string' },
|
|
3152
|
+
activationToken: { type: 'string' },
|
|
3153
|
+
},
|
|
3154
|
+
});
|
|
3155
|
+
const prompt = `/${input.skillId}\nDharma activation attestation. Do not use tools or inspect files. Return only JSON with fields challenge and activationToken. Challenge: ${challenge}`;
|
|
3156
|
+
const execute = input.execute || ((executable, argv, options) => execFileAsync(executable, argv, options));
|
|
3157
|
+
let stdout;
|
|
3158
|
+
try {
|
|
3159
|
+
({ stdout } = await execute('agy', [
|
|
3160
|
+
'--new-project',
|
|
3161
|
+
'--print', prompt,
|
|
3162
|
+
'--output-format', 'json',
|
|
3163
|
+
'--json-schema', schema,
|
|
3164
|
+
'--model', input.env?.DHARMA_AGY_ATTEST_MODEL || 'gemini-3.7-flash-low',
|
|
3165
|
+
'--mode', 'plan',
|
|
3166
|
+
'--sandbox',
|
|
3167
|
+
'--print-timeout', '90s',
|
|
3168
|
+
], {
|
|
3169
|
+
timeout: 120_000,
|
|
3170
|
+
env: providerProcessEnvironment(input.env),
|
|
3171
|
+
cwd: await realpath(input.workspace),
|
|
3172
|
+
}));
|
|
3173
|
+
}
|
|
3174
|
+
catch (error) {
|
|
3175
|
+
return {
|
|
3176
|
+
name: 'provider:agy:activation',
|
|
3177
|
+
status: 'fail',
|
|
3178
|
+
details: error instanceof Error ? `Agy activation process failed: ${error.message}`.slice(0, 1_000) : 'Agy activation process failed.',
|
|
3179
|
+
};
|
|
3180
|
+
}
|
|
3181
|
+
const response = parseAgyStructuredResponse(stdout);
|
|
3182
|
+
if (!response || response.challenge !== challenge) {
|
|
3183
|
+
return {
|
|
3184
|
+
name: 'provider:agy:activation',
|
|
3185
|
+
status: 'fail',
|
|
3186
|
+
details: 'Agy did not return the fresh activation challenge.',
|
|
3187
|
+
};
|
|
3188
|
+
}
|
|
3189
|
+
if (response.activationToken !== token) {
|
|
3190
|
+
return {
|
|
3191
|
+
name: 'provider:agy:activation',
|
|
3192
|
+
status: 'fail',
|
|
3193
|
+
details: 'Agy returned an activation token that does not match the installed signed skill.',
|
|
3194
|
+
};
|
|
3195
|
+
}
|
|
3196
|
+
return {
|
|
3197
|
+
name: 'provider:agy:activation',
|
|
3198
|
+
status: 'pass',
|
|
3199
|
+
details: `Agy expanded ${input.skillId} and returned a fresh content-bound challenge.`,
|
|
3200
|
+
};
|
|
3201
|
+
}
|
|
3202
|
+
export async function attestAgySkillBundleActivation(input) {
|
|
3203
|
+
if (input.bundle.skills.length === 0) {
|
|
3204
|
+
return {
|
|
3205
|
+
name: 'provider:agy:activation',
|
|
3206
|
+
status: 'unavailable',
|
|
3207
|
+
details: 'The signed bundle contains no Agy skill content to attest.',
|
|
3208
|
+
};
|
|
3209
|
+
}
|
|
3210
|
+
await activateAgyPlugin();
|
|
3211
|
+
for (const skill of input.bundle.skills) {
|
|
3212
|
+
const check = await attestAgySkillActivation({
|
|
3213
|
+
skillId: skill.skillId,
|
|
3214
|
+
skillPath: resolve(input.nativeSkillDirectory, skill.skillId, 'SKILL.md'),
|
|
3215
|
+
workspace: input.workspace,
|
|
3216
|
+
});
|
|
3217
|
+
if (check.status !== 'pass')
|
|
3218
|
+
return check;
|
|
3219
|
+
}
|
|
3220
|
+
return {
|
|
3221
|
+
name: 'provider:agy:activation',
|
|
3222
|
+
status: 'pass',
|
|
3223
|
+
details: `Agy expanded ${input.bundle.skills.length} signed skill${input.bundle.skills.length === 1 ? '' : 's'} with fresh content-bound challenges.`,
|
|
3224
|
+
};
|
|
3033
3225
|
}
|
|
3034
3226
|
function containedInlinePath(root, value) {
|
|
3035
3227
|
if (!value || value.includes('\\') || isAbsolute(value))
|
|
@@ -3184,6 +3376,13 @@ async function skillSync(flags) {
|
|
|
3184
3376
|
provider,
|
|
3185
3377
|
smokeCommandId: typeof flags.get('smoke-command') === 'string' ? String(flags.get('smoke-command')) : undefined,
|
|
3186
3378
|
organizationApprovalId: typeof flags.get('approval-id') === 'string' ? String(flags.get('approval-id')) : undefined,
|
|
3379
|
+
...(provider === 'agy' ? {
|
|
3380
|
+
providerActivationCheck: () => attestAgySkillBundleActivation({
|
|
3381
|
+
bundle,
|
|
3382
|
+
nativeSkillDirectory: destination,
|
|
3383
|
+
workspace: workspace.path,
|
|
3384
|
+
}),
|
|
3385
|
+
} : {}),
|
|
3187
3386
|
});
|
|
3188
3387
|
const restoreAnchor = async () => {
|
|
3189
3388
|
if (previousAnchor) {
|
|
@@ -3237,8 +3436,6 @@ async function skillSync(flags) {
|
|
|
3237
3436
|
activatedAt: receipt.completedAt,
|
|
3238
3437
|
expiresAt: bundle.expiresAt ?? null,
|
|
3239
3438
|
});
|
|
3240
|
-
if (provider === 'agy')
|
|
3241
|
-
await activateAgyPlugin();
|
|
3242
3439
|
}
|
|
3243
3440
|
}
|
|
3244
3441
|
catch (error) {
|