@salesforce/sfdx-agent-harness-claude 0.65.0 → 0.67.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/CHANGELOG.md +10 -0
- package/dist/claude-harness.d.ts +0 -9
- package/dist/claude-harness.js +121 -75
- package/dist/claude-harness.js.map +1 -1
- package/dist/claude-query-options-builder.d.ts +19 -2
- package/dist/claude-query-options-builder.js +63 -5
- package/dist/claude-query-options-builder.js.map +1 -1
- package/dist/test/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
|
@@ -33,7 +33,7 @@ export class ClaudeQueryOptionsBuilder {
|
|
|
33
33
|
this.queryDefaults = queryDefaults;
|
|
34
34
|
this.approvalHookTimeoutMs = approvalHookTimeoutMs;
|
|
35
35
|
}
|
|
36
|
-
build(projectRoot, config, streamOptions, env, sessionOptions, nativeModelId, brokerPreToolUseHook, mcpServers, rulesAppend, postToolUseRedactionHook, skillDirectories, thinkingMode) {
|
|
36
|
+
build(projectRoot, config, streamOptions, env, sessionOptions, nativeModelId, brokerPreToolUseHook, mcpServers, rulesAppend, postToolUseRedactionHook, skillDirectories, thinkingMode, sessionContext) {
|
|
37
37
|
const hasMcpServers = mcpServers !== undefined && Object.keys(mcpServers).length > 0;
|
|
38
38
|
// The harness decides whether to gate (its opt-in policy predicate) and
|
|
39
39
|
// passes `brokerPreToolUseHook` only when gating is active; the presence
|
|
@@ -44,7 +44,7 @@ export class ClaudeQueryOptionsBuilder {
|
|
|
44
44
|
// settled via the parker path, never gated) — see `buildPolicyMatcher`.
|
|
45
45
|
const approvalGated = brokerPreToolUseHook !== undefined;
|
|
46
46
|
// See ARCHITECTURE.md → "Rule Composition" for the systemPrompt shape selection.
|
|
47
|
-
const systemPrompt = buildSystemPrompt(config.instructions, rulesAppend);
|
|
47
|
+
const systemPrompt = buildSystemPrompt(config.instructions, rulesAppend, renderSessionContextBlock(sessionContext));
|
|
48
48
|
// Auto-allow every MCP server's tool surface via the `mcp__<server>`
|
|
49
49
|
// wildcard. The Claude CLI's MDM/policy layer overrides
|
|
50
50
|
// `bypassPermissions` when `settingSources: []` is set
|
|
@@ -193,6 +193,52 @@ function mergeAdditionalDirectories(fromDefaults, fromSkills) {
|
|
|
193
193
|
const merged = [...new Set([...(fromDefaults ?? []), ...(fromSkills ?? [])])];
|
|
194
194
|
return merged.length > 0 ? merged : undefined;
|
|
195
195
|
}
|
|
196
|
+
/**
|
|
197
|
+
* Render a `SessionContext` into the turn's system-level block, or `undefined`
|
|
198
|
+
* when unset/empty (which contributes nothing). Keys are recursively sorted so
|
|
199
|
+
* equal objects render byte-identical regardless of insertion order — the
|
|
200
|
+
* deterministic-rendering guarantee the contract requires (CONTRACT-SPEC §10).
|
|
201
|
+
*
|
|
202
|
+
* The JSON payload has `<`/`>` unicode-escaped (`\u003c` / `\u003e`) so a
|
|
203
|
+
* consumer value can't forge the `</session-context>` delimiter mid-block — this
|
|
204
|
+
* lands in the model's system prompt. Escaping the RENDERED form only; the stored
|
|
205
|
+
* object's round-trip fidelity is untouched. Mirrors the Mastra harness's
|
|
206
|
+
* `renderSessionContextSystemText` so the delimiter-hardening posture is
|
|
207
|
+
* identical across harnesses.
|
|
208
|
+
*
|
|
209
|
+
* Exported so the conformance `renderSystemContext` seam exercises this real
|
|
210
|
+
* production renderer rather than re-implementing it.
|
|
211
|
+
*/
|
|
212
|
+
export function renderSessionContextBlock(sessionContext) {
|
|
213
|
+
if (sessionContext === undefined || Object.keys(sessionContext).length === 0) {
|
|
214
|
+
return undefined;
|
|
215
|
+
}
|
|
216
|
+
const canonical = JSON.stringify(sortJsonKeys(sessionContext)).replace(/</g, '\\u003c').replace(/>/g, '\\u003e');
|
|
217
|
+
return `<session-context>\n${canonical}\n</session-context>`;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Recursively sort object keys so `JSON.stringify` output is stable regardless
|
|
221
|
+
* of insertion order. Arrays keep their order (order is semantic in a list);
|
|
222
|
+
* primitives pass through untouched.
|
|
223
|
+
*/
|
|
224
|
+
function sortJsonKeys(value) {
|
|
225
|
+
if (Array.isArray(value)) {
|
|
226
|
+
return value.map(sortJsonKeys);
|
|
227
|
+
}
|
|
228
|
+
if (value !== null && typeof value === 'object') {
|
|
229
|
+
// Null-prototype, not `{}`: assigning a `"__proto__"` key (legal in JSON,
|
|
230
|
+
// and preserved by `getSessionContext`'s JSON round-trip) on a plain
|
|
231
|
+
// object hits the prototype setter and silently DROPS the key, so the
|
|
232
|
+
// rendered block would diverge from what `getSessionContext` returns.
|
|
233
|
+
// Mirrors the Mastra harness's `sortJsonValue` (session-context-store.ts).
|
|
234
|
+
const sorted = Object.create(null);
|
|
235
|
+
for (const key of Object.keys(value).sort()) {
|
|
236
|
+
sorted[key] = sortJsonKeys(value[key]);
|
|
237
|
+
}
|
|
238
|
+
return sorted;
|
|
239
|
+
}
|
|
240
|
+
return value;
|
|
241
|
+
}
|
|
196
242
|
/**
|
|
197
243
|
* The two return shapes here (bare string and preset+append) are mirrored by
|
|
198
244
|
* `extractSystemPromptBody` in `claude-harness.ts`, which reads the assembled
|
|
@@ -201,13 +247,25 @@ function mergeAdditionalDirectories(fromDefaults, fromSkills) {
|
|
|
201
247
|
* harness's debug log silently goes empty for streams that hit the new
|
|
202
248
|
* shape, and the dual-harness rules-composition e2e (#493) hangs / fails
|
|
203
249
|
* with no record collected.
|
|
250
|
+
*
|
|
251
|
+
* `sessionContextBlock` is a third append segment alongside `instructions` /
|
|
252
|
+
* `rules`. Like `rules`, it forces the preset+append shape (the bare string
|
|
253
|
+
* can't compose multiple segments), but stays INSIDE `append` rather than a new
|
|
254
|
+
* shape — so `extractSystemPromptBody` needs no update.
|
|
204
255
|
*/
|
|
205
|
-
function buildSystemPrompt(instructions, rulesAppend) {
|
|
256
|
+
function buildSystemPrompt(instructions, rulesAppend, sessionContextBlock) {
|
|
206
257
|
const rules = rulesAppend ?? '';
|
|
207
258
|
const hasRules = rules.length > 0;
|
|
208
259
|
const hasInstructions = instructions !== undefined && instructions.length > 0;
|
|
209
|
-
|
|
210
|
-
|
|
260
|
+
const hasSessionContext = sessionContextBlock !== undefined && sessionContextBlock.length > 0;
|
|
261
|
+
if (hasRules || hasSessionContext) {
|
|
262
|
+
const append = [
|
|
263
|
+
hasInstructions ? instructions : undefined,
|
|
264
|
+
hasRules ? rules : undefined,
|
|
265
|
+
hasSessionContext ? sessionContextBlock : undefined,
|
|
266
|
+
]
|
|
267
|
+
.filter((part) => part !== undefined)
|
|
268
|
+
.join('\n\n');
|
|
211
269
|
return { type: 'preset', preset: 'claude_code', append, excludeDynamicSections: true };
|
|
212
270
|
}
|
|
213
271
|
return hasInstructions ? instructions : undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-query-options-builder.js","sourceRoot":"","sources":["../src/claude-query-options-builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"claude-query-options-builder.js","sourceRoot":"","sources":["../src/claude-query-options-builder.ts"],"names":[],"mappings":"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"}
|