@salesforce/sfdx-agent-harness-claude 0.1.0
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/LICENSE.txt +21 -0
- package/README.md +72 -0
- package/dist/claude-event-adapter.d.ts +19 -0
- package/dist/claude-event-adapter.js +206 -0
- package/dist/claude-event-adapter.js.map +1 -0
- package/dist/claude-harness-factory.d.ts +16 -0
- package/dist/claude-harness-factory.js +27 -0
- package/dist/claude-harness-factory.js.map +1 -0
- package/dist/claude-harness.d.ts +38 -0
- package/dist/claude-harness.js +196 -0
- package/dist/claude-harness.js.map +1 -0
- package/dist/claude-query-env-builder.d.ts +20 -0
- package/dist/claude-query-env-builder.js +37 -0
- package/dist/claude-query-env-builder.js.map +1 -0
- package/dist/claude-query-options-builder.d.ts +26 -0
- package/dist/claude-query-options-builder.js +40 -0
- package/dist/claude-query-options-builder.js.map +1 -0
- package/dist/claude-transport-resolver.d.ts +21 -0
- package/dist/claude-transport-resolver.js +6 -0
- package/dist/claude-transport-resolver.js.map +1 -0
- package/dist/direct-claude-transport-resolver.d.ts +13 -0
- package/dist/direct-claude-transport-resolver.js +23 -0
- package/dist/direct-claude-transport-resolver.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/test/tsconfig.tsbuildinfo +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { JSONWebToken } from '@salesforce/llm-gateway-sdk';
|
|
2
|
+
import type { ClaudeTransportResolver } from './claude-transport-resolver.js';
|
|
3
|
+
export interface ClaudeQueryEnvBuildResult {
|
|
4
|
+
env: Record<string, string | undefined>;
|
|
5
|
+
nativeModelId: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Assembles the environment variable map for a Claude subprocess spawn.
|
|
9
|
+
*
|
|
10
|
+
* Layering order (last wins):
|
|
11
|
+
* 1. Inherited process env (with dangerous vars stripped)
|
|
12
|
+
* 2. Resolver-provided vars (auth, transport flags, endpoint config)
|
|
13
|
+
*/
|
|
14
|
+
export declare class ClaudeQueryEnvBuilder {
|
|
15
|
+
private readonly resolver;
|
|
16
|
+
private readonly storageRootFolder?;
|
|
17
|
+
private readonly processEnv;
|
|
18
|
+
constructor(resolver: ClaudeTransportResolver, storageRootFolder?: string | undefined, processEnv?: Record<string, string | undefined>);
|
|
19
|
+
build(orgJwt: JSONWebToken, modelId: string): Promise<ClaudeQueryEnvBuildResult>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026, Salesforce, Inc. All rights reserved.
|
|
3
|
+
* See LICENSE.txt for license terms.
|
|
4
|
+
*/
|
|
5
|
+
const STRIPPED_ENV_VARS = ['ANTHROPIC_API_KEY', 'ANTHROPIC_AUTH_TOKEN', 'ANTHROPIC_BASE_URL'];
|
|
6
|
+
/**
|
|
7
|
+
* Assembles the environment variable map for a Claude subprocess spawn.
|
|
8
|
+
*
|
|
9
|
+
* Layering order (last wins):
|
|
10
|
+
* 1. Inherited process env (with dangerous vars stripped)
|
|
11
|
+
* 2. Resolver-provided vars (auth, transport flags, endpoint config)
|
|
12
|
+
*/
|
|
13
|
+
export class ClaudeQueryEnvBuilder {
|
|
14
|
+
resolver;
|
|
15
|
+
storageRootFolder;
|
|
16
|
+
processEnv;
|
|
17
|
+
constructor(resolver, storageRootFolder, processEnv = process.env) {
|
|
18
|
+
this.resolver = resolver;
|
|
19
|
+
this.storageRootFolder = storageRootFolder;
|
|
20
|
+
this.processEnv = processEnv;
|
|
21
|
+
}
|
|
22
|
+
async build(orgJwt, modelId) {
|
|
23
|
+
const resolved = await this.resolver.resolve(orgJwt, modelId);
|
|
24
|
+
const env = { ...this.processEnv };
|
|
25
|
+
for (const key of STRIPPED_ENV_VARS)
|
|
26
|
+
delete env[key];
|
|
27
|
+
return {
|
|
28
|
+
env: {
|
|
29
|
+
...env,
|
|
30
|
+
...resolved.env,
|
|
31
|
+
...(this.storageRootFolder ? { CLAUDE_CONFIG_DIR: this.storageRootFolder } : {}),
|
|
32
|
+
},
|
|
33
|
+
nativeModelId: resolved.nativeModelId,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=claude-query-env-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-query-env-builder.js","sourceRoot":"","sources":["../src/claude-query-env-builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,iBAAiB,GAAG,CAAC,mBAAmB,EAAE,sBAAsB,EAAE,oBAAoB,CAAU,CAAC;AAOvG;;;;;;GAMG;AACH,MAAM,OAAO,qBAAqB;IAET;IACA;IACA;IAHrB,YACqB,QAAiC,EACjC,iBAA0B,EAC1B,aAAiD,OAAO,CAAC,GAAG;QAF5D,aAAQ,GAAR,QAAQ,CAAyB;QACjC,sBAAiB,GAAjB,iBAAiB,CAAS;QAC1B,eAAU,GAAV,UAAU,CAAkD;IAC9E,CAAC;IAEJ,KAAK,CAAC,KAAK,CAAC,MAAoB,EAAE,OAAe;QAC7C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAE9D,MAAM,GAAG,GAAuC,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACvE,KAAK,MAAM,GAAG,IAAI,iBAAiB;YAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;QAErD,OAAO;YACH,GAAG,EAAE;gBACD,GAAG,GAAG;gBACN,GAAG,QAAQ,CAAC,GAAG;gBACf,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACnF;YACD,aAAa,EAAE,QAAQ,CAAC,aAAa;SACxC,CAAC;IACN,CAAC;CACJ"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Options } from '@anthropic-ai/claude-agent-sdk';
|
|
2
|
+
import type { HarnessAgentConfig, StreamOptions } from '@salesforce/sfdx-agent-sdk';
|
|
3
|
+
/**
|
|
4
|
+
* Consumer-facing query defaults. Excludes fields the harness must control.
|
|
5
|
+
*/
|
|
6
|
+
export type ClaudeQueryDefaults = Partial<Omit<Options, 'env' | 'includePartialMessages' | 'prompt' | 'model' | 'permissionMode' | 'allowDangerouslySkipPermissions'>>;
|
|
7
|
+
export type SessionOptions = {
|
|
8
|
+
sessionId?: string;
|
|
9
|
+
resume?: string;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Assembles the query() options from layered sources.
|
|
13
|
+
*
|
|
14
|
+
* Precedence (last wins):
|
|
15
|
+
* 1. queryDefaults (factory-level, AFV-provided)
|
|
16
|
+
* 2. Per-agent options (mapped from HarnessAgentConfig/StreamOptions)
|
|
17
|
+
* 3. Session options (sessionId or resume for continuity)
|
|
18
|
+
* 4. Harness-required options (non-overridable operational concerns)
|
|
19
|
+
*/
|
|
20
|
+
export declare class ClaudeQueryOptionsBuilder {
|
|
21
|
+
private readonly queryDefaults;
|
|
22
|
+
constructor(queryDefaults?: ClaudeQueryDefaults);
|
|
23
|
+
build(projectRoot: string, config: HarnessAgentConfig, streamOptions: StreamOptions | undefined, env: Record<string, string | undefined>, sessionOptions?: SessionOptions, nativeModelId?: string): Options & {
|
|
24
|
+
env: Record<string, string | undefined>;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026, Salesforce, Inc. All rights reserved.
|
|
3
|
+
* See LICENSE.txt for license terms.
|
|
4
|
+
*/
|
|
5
|
+
const HARNESS_REQUIRED_OPTIONS = {
|
|
6
|
+
includePartialMessages: true,
|
|
7
|
+
settingSources: [],
|
|
8
|
+
persistSession: true,
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Assembles the query() options from layered sources.
|
|
12
|
+
*
|
|
13
|
+
* Precedence (last wins):
|
|
14
|
+
* 1. queryDefaults (factory-level, AFV-provided)
|
|
15
|
+
* 2. Per-agent options (mapped from HarnessAgentConfig/StreamOptions)
|
|
16
|
+
* 3. Session options (sessionId or resume for continuity)
|
|
17
|
+
* 4. Harness-required options (non-overridable operational concerns)
|
|
18
|
+
*/
|
|
19
|
+
export class ClaudeQueryOptionsBuilder {
|
|
20
|
+
queryDefaults;
|
|
21
|
+
constructor(queryDefaults = {}) {
|
|
22
|
+
this.queryDefaults = queryDefaults;
|
|
23
|
+
}
|
|
24
|
+
build(projectRoot, config, streamOptions, env, sessionOptions, nativeModelId) {
|
|
25
|
+
const perAgentOptions = {
|
|
26
|
+
cwd: projectRoot,
|
|
27
|
+
...(nativeModelId ? { model: nativeModelId } : {}),
|
|
28
|
+
...(config.instructions ? { systemPrompt: config.instructions } : {}),
|
|
29
|
+
...(streamOptions?.maxSteps ? { maxTurns: streamOptions.maxSteps } : {}),
|
|
30
|
+
};
|
|
31
|
+
return {
|
|
32
|
+
...this.queryDefaults,
|
|
33
|
+
...perAgentOptions,
|
|
34
|
+
...sessionOptions,
|
|
35
|
+
...HARNESS_REQUIRED_OPTIONS,
|
|
36
|
+
env,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=claude-query-options-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-query-options-builder.js","sourceRoot":"","sources":["../src/claude-query-options-builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,MAAM,wBAAwB,GAAqB;IAC/C,sBAAsB,EAAE,IAAI;IAC5B,cAAc,EAAE,EAAE;IAClB,cAAc,EAAE,IAAI;CACvB,CAAC;AAIF;;;;;;;;GAQG;AACH,MAAM,OAAO,yBAAyB;IACL;IAA7B,YAA6B,gBAAqC,EAAE;QAAvC,kBAAa,GAAb,aAAa,CAA0B;IAAG,CAAC;IAExE,KAAK,CACD,WAAmB,EACnB,MAA0B,EAC1B,aAAwC,EACxC,GAAuC,EACvC,cAA+B,EAC/B,aAAsB;QAEtB,MAAM,eAAe,GAAqB;YACtC,GAAG,EAAE,WAAW;YAChB,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,GAAG,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3E,CAAC;QAEF,OAAO;YACH,GAAG,IAAI,CAAC,aAAa;YACrB,GAAG,eAAe;YAClB,GAAG,cAAc;YACjB,GAAG,wBAAwB;YAC3B,GAAG;SACN,CAAC;IACN,CAAC;CACJ"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { JSONWebToken } from '@salesforce/llm-gateway-sdk';
|
|
2
|
+
/**
|
|
3
|
+
* Result of resolving transport configuration for a Claude subprocess.
|
|
4
|
+
*/
|
|
5
|
+
export interface ClaudeTransportResolverResult {
|
|
6
|
+
/** Environment variables for authenticated communication with the model endpoint. */
|
|
7
|
+
env: Record<string, string>;
|
|
8
|
+
/** The native model identifier the subprocess should use (e.g., `'anthropic.claude-sonnet-4-6'`). */
|
|
9
|
+
nativeModelId: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Resolves all deployment-transport concerns for a Claude subprocess: environment
|
|
13
|
+
* variables (auth, endpoint, transport flags) and the native model identifier.
|
|
14
|
+
*
|
|
15
|
+
* Implementations own transport-specific knowledge: URL derivation, header
|
|
16
|
+
* serialization, Bedrock vs direct API flags, and the gateway-to-native model
|
|
17
|
+
* name mapping. The harness treats the result as opaque configuration.
|
|
18
|
+
*/
|
|
19
|
+
export interface ClaudeTransportResolver {
|
|
20
|
+
resolve(orgJwt: JSONWebToken, modelId: string): Promise<ClaudeTransportResolverResult>;
|
|
21
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-transport-resolver.js","sourceRoot":"","sources":["../src/claude-transport-resolver.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { JSONWebToken } from '@salesforce/llm-gateway-sdk';
|
|
2
|
+
import type { ClaudeTransportResolver, ClaudeTransportResolverResult } from './claude-transport-resolver.js';
|
|
3
|
+
/**
|
|
4
|
+
* Resolver for direct Anthropic API access (no gateway, no Bedrock shim).
|
|
5
|
+
* Intended for local development and testing without a Salesforce org.
|
|
6
|
+
*
|
|
7
|
+
* Analogous to `LLMGExpressMastraModelConfigFactory` in the Mastra harness.
|
|
8
|
+
*/
|
|
9
|
+
export declare class DirectClaudeTransportResolver implements ClaudeTransportResolver {
|
|
10
|
+
private readonly getApiKey;
|
|
11
|
+
constructor(getApiKey: () => string);
|
|
12
|
+
resolve(_orgJwt: JSONWebToken, modelId: string): Promise<ClaudeTransportResolverResult>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026, Salesforce, Inc. All rights reserved.
|
|
3
|
+
* See LICENSE.txt for license terms.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Resolver for direct Anthropic API access (no gateway, no Bedrock shim).
|
|
7
|
+
* Intended for local development and testing without a Salesforce org.
|
|
8
|
+
*
|
|
9
|
+
* Analogous to `LLMGExpressMastraModelConfigFactory` in the Mastra harness.
|
|
10
|
+
*/
|
|
11
|
+
export class DirectClaudeTransportResolver {
|
|
12
|
+
getApiKey;
|
|
13
|
+
constructor(getApiKey) {
|
|
14
|
+
this.getApiKey = getApiKey;
|
|
15
|
+
}
|
|
16
|
+
async resolve(_orgJwt, modelId) {
|
|
17
|
+
return {
|
|
18
|
+
env: { ANTHROPIC_API_KEY: this.getApiKey() },
|
|
19
|
+
nativeModelId: modelId,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=direct-claude-transport-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direct-claude-transport-resolver.js","sourceRoot":"","sources":["../src/direct-claude-transport-resolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;;;;GAKG;AACH,MAAM,OAAO,6BAA6B;IACT;IAA7B,YAA6B,SAAuB;QAAvB,cAAS,GAAT,SAAS,CAAc;IAAG,CAAC;IAExD,KAAK,CAAC,OAAO,CAAC,OAAqB,EAAE,OAAe;QAChD,OAAO;YACH,GAAG,EAAE,EAAE,iBAAiB,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE;YAC5C,aAAa,EAAE,OAAO;SACzB,CAAC;IACN,CAAC;CACJ"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { ClaudeHarnessFactory, type ClaudeHarnessFactoryConfig } from './claude-harness-factory.js';
|
|
2
|
+
export { type ClaudeTransportResolver, type ClaudeTransportResolverResult } from './claude-transport-resolver.js';
|
|
3
|
+
export { type ClaudeQueryDefaults } from './claude-query-options-builder.js';
|
|
4
|
+
export { DirectClaudeTransportResolver } from './direct-claude-transport-resolver.js';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026, Salesforce, Inc. All rights reserved.
|
|
3
|
+
* See LICENSE.txt for license terms.
|
|
4
|
+
*/
|
|
5
|
+
export { ClaudeHarnessFactory } from './claude-harness-factory.js';
|
|
6
|
+
export {} from './claude-transport-resolver.js';
|
|
7
|
+
export {} from './claude-query-options-builder.js';
|
|
8
|
+
export { DirectClaudeTransportResolver } from './direct-claude-transport-resolver.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,oBAAoB,EAAmC,MAAM,6BAA6B,CAAC;AACpG,OAAO,EAAoE,MAAM,gCAAgC,CAAC;AAClH,OAAO,EAA4B,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,6BAA6B,EAAE,MAAM,uCAAuC,CAAC"}
|