@studio-foundation/runner 0.13.0 → 0.15.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/dist/generated/bundled-assets.d.ts +1 -1
- package/dist/generated/bundled-assets.js +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -4
- package/dist/index.js.map +1 -1
- package/dist/prompt-builder.d.ts +2 -0
- package/dist/prompt-builder.d.ts.map +1 -1
- package/dist/prompt-builder.js +12 -5
- package/dist/prompt-builder.js.map +1 -1
- package/dist/prompt-builder.test.js +43 -0
- package/dist/prompt-builder.test.js.map +1 -1
- package/dist/prompt-cache.d.ts +33 -0
- package/dist/prompt-cache.d.ts.map +1 -0
- package/dist/prompt-cache.js +46 -0
- package/dist/prompt-cache.js.map +1 -0
- package/dist/prompt-cache.test.d.ts +2 -0
- package/dist/prompt-cache.test.d.ts.map +1 -0
- package/dist/prompt-cache.test.js +53 -0
- package/dist/prompt-cache.test.js.map +1 -0
- package/dist/providers/anthropic-batch.test.d.ts +2 -0
- package/dist/providers/anthropic-batch.test.d.ts.map +1 -0
- package/dist/providers/anthropic-batch.test.js +178 -0
- package/dist/providers/anthropic-batch.test.js.map +1 -0
- package/dist/providers/anthropic.d.ts +17 -1
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +126 -12
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/anthropic.test.js +69 -0
- package/dist/providers/anthropic.test.js.map +1 -1
- package/dist/providers/batch-window.d.ts +89 -0
- package/dist/providers/batch-window.d.ts.map +1 -0
- package/dist/providers/batch-window.js +309 -0
- package/dist/providers/batch-window.js.map +1 -0
- package/dist/providers/batch-window.test.d.ts +2 -0
- package/dist/providers/batch-window.test.d.ts.map +1 -0
- package/dist/providers/batch-window.test.js +317 -0
- package/dist/providers/batch-window.test.js.map +1 -0
- package/dist/providers/batch.d.ts +55 -0
- package/dist/providers/batch.d.ts.map +1 -0
- package/dist/providers/batch.js +35 -0
- package/dist/providers/batch.js.map +1 -0
- package/dist/providers/claude-code.d.ts.map +1 -1
- package/dist/providers/claude-code.js +72 -1
- package/dist/providers/claude-code.js.map +1 -1
- package/dist/providers/claude-code.test.js +95 -0
- package/dist/providers/claude-code.test.js.map +1 -1
- package/dist/providers/ollama.d.ts.map +1 -1
- package/dist/providers/ollama.js +4 -2
- package/dist/providers/ollama.js.map +1 -1
- package/dist/providers/openai-responses.d.ts.map +1 -1
- package/dist/providers/openai-responses.js +24 -18
- package/dist/providers/openai-responses.js.map +1 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +26 -10
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/provider.d.ts +3 -6
- package/dist/providers/provider.d.ts.map +1 -1
- package/dist/providers/provider.js.map +1 -1
- package/dist/runner.d.ts +14 -6
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +20 -8
- package/dist/runner.js.map +1 -1
- package/dist/runner.test.js +137 -0
- package/dist/runner.test.js.map +1 -1
- package/package.json +3 -3
- package/dist/integrations/integration-loader.d.ts +0 -7
- package/dist/integrations/integration-loader.d.ts.map +0 -1
- package/dist/integrations/integration-loader.js +0 -33
- package/dist/integrations/integration-loader.js.map +0 -1
- package/dist/integrations/integration-loader.test.d.ts +0 -2
- package/dist/integrations/integration-loader.test.d.ts.map +0 -1
- package/dist/integrations/integration-loader.test.js +0 -50
- package/dist/integrations/integration-loader.test.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const PACKAGE_VERSION = "0.
|
|
1
|
+
export declare const PACKAGE_VERSION = "0.15.0";
|
|
2
2
|
/** Contents of runner/templates/, keyed by path relative to that directory. */
|
|
3
3
|
export declare const BUNDLED_ASSETS: Record<string, string>;
|
|
4
4
|
//# sourceMappingURL=bundled-assets.d.ts.map
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Generated by scripts/gen-bundled-assets.mjs — do not edit.
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
exports.BUNDLED_ASSETS = exports.PACKAGE_VERSION = void 0;
|
|
5
|
-
exports.PACKAGE_VERSION = "0.
|
|
5
|
+
exports.PACKAGE_VERSION = "0.15.0";
|
|
6
6
|
/** Contents of runner/templates/, keyed by path relative to that directory. */
|
|
7
7
|
exports.BUNDLED_ASSETS = {
|
|
8
8
|
"tools/repo-manager.tool.yaml": "name: repo_manager\ndescription: Read and write files in the workspace\nversion: 1\n\ncommands:\n - name: repo_manager-read_file\n description: Read a file from the workspace\n parameters:\n path:\n type: string\n required: true\n description: File path relative to the workspace root\n execute:\n type: builtin\n parse_output: json\n\n - name: repo_manager-write_file\n description: Write or create a file in the workspace\n parameters:\n path:\n type: string\n required: true\n description: File path relative to the workspace root\n content:\n type: string\n required: true\n description: Full content to write to the file\n execute:\n type: builtin\n parse_output: json\n\n - name: repo_manager-list_files\n description: List files in the workspace\n parameters:\n path:\n type: string\n required: false\n description: Directory to list (default is workspace root)\n recursive:\n type: boolean\n required: false\n description: Whether to list recursively\n execute:\n type: builtin\n parse_output: json\n\n - name: repo_manager-apply_patch\n description: Apply a unified diff patch to a file\n parameters:\n path:\n type: string\n required: true\n description: File path to patch\n patch:\n type: string\n required: true\n description: Unified diff patch content\n execute:\n type: builtin\n parse_output: json\n\nprompt_snippet: |\n You have access to file management tools. Read files before modifying them.\n Use repo_manager-write_file to create or update files — provide the full file content.\n",
|
package/dist/index.d.ts
CHANGED
|
@@ -15,6 +15,10 @@ export { AnthropicProvider } from './providers/anthropic.js';
|
|
|
15
15
|
export { OllamaProvider } from './providers/ollama.js';
|
|
16
16
|
export { ClaudeCodeProvider } from './providers/claude-code.js';
|
|
17
17
|
export { ProviderRegistry, createDefaultRegistry } from './providers/registry.js';
|
|
18
|
+
export { isBatchProvider, assertValidBatch, CUSTOM_ID_PATTERN } from './providers/batch.js';
|
|
19
|
+
export type { BatchProvider, BatchRequestItem, BatchResultItem, BatchProgress, BatchDispatchOptions, } from './providers/batch.js';
|
|
20
|
+
export { BatchWindow, BatchingProviderRegistry, DEFAULT_MAX_BATCH_SIZE, DEFAULT_FLUSH_AFTER_MS, } from './providers/batch-window.js';
|
|
21
|
+
export type { BatchTicket, BatchWindowOptions, BatchDispatchInfo, BatchSettledInfo, } from './providers/batch-window.js';
|
|
18
22
|
export { MockProvider } from './providers/mock.js';
|
|
19
23
|
export type { MockStageConfig } from './providers/mock.js';
|
|
20
24
|
export { ToolRegistry } from './tools/tool-registry.js';
|
|
@@ -32,5 +36,4 @@ export { loadPlugins, MCPClient, StudioOAuthProvider } from './plugins/index.js'
|
|
|
32
36
|
export type { PluginManifest, MCPServerDef, SkillContent } from './plugins/index.js';
|
|
33
37
|
export { loadSkills, loadSkill, validateSkillManifest } from './tools/skills/skill-loader.js';
|
|
34
38
|
export type { SkillManifest } from './tools/skills/skill-loader.js';
|
|
35
|
-
export { loadProjectIntegrations } from './integrations/integration-loader.js';
|
|
36
39
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAGjE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,YAAY,EACV,SAAS,EACT,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,qBAAqB,CAAC;AAG7B,YAAY,EAAE,QAAQ,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC5F,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAGjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAE/F,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACpI,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,YAAY,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAGvE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACjF,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGrF,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC9F,YAAY,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAGjE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,YAAY,EACV,SAAS,EACT,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,qBAAqB,CAAC;AAG7B,YAAY,EAAE,QAAQ,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC5F,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC5F,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,WAAW,EACX,wBAAwB,EACxB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,6BAA6B,CAAC;AACrC,YAAY,EACV,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAGjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAE/F,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACpI,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,YAAY,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAGvE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACjF,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGrF,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC9F,YAAY,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* @studio/runner - Multi-provider LLM agent runner with tool execution
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.validateSkillManifest = exports.loadSkill = exports.loadSkills = exports.StudioOAuthProvider = exports.MCPClient = exports.loadPlugins = exports.AnonymizationMiddleware = exports.BUILTIN_TOOL_NAMES = exports.getBundledToolTemplate = exports.listAvailableToolTemplates = exports.loadProjectTools = exports.STUDIO_RUN_PROMPT_SNIPPET = exports.createStudioRunTool = exports.createPatchTools = exports.createShellTools = exports.createRepoManagerTools = exports.ToolExecutor = exports.ToolRegistry = exports.MockProvider = exports.DEFAULT_FLUSH_AFTER_MS = exports.DEFAULT_MAX_BATCH_SIZE = exports.BatchingProviderRegistry = exports.BatchWindow = exports.CUSTOM_ID_PATTERN = exports.assertValidBatch = exports.isBatchProvider = exports.createDefaultRegistry = exports.ProviderRegistry = exports.ClaudeCodeProvider = exports.OllamaProvider = exports.AnthropicProvider = exports.OpenAIResponsesProvider = exports.OpenAIProvider = exports.isAgentLoopProvider = exports.buildPrompt = exports.runScript = exports.runAgent = void 0;
|
|
7
7
|
// Main runner function
|
|
8
8
|
var runner_js_1 = require("./runner.js");
|
|
9
9
|
Object.defineProperty(exports, "runAgent", { enumerable: true, get: function () { return runner_js_1.runAgent; } });
|
|
@@ -28,6 +28,15 @@ Object.defineProperty(exports, "ClaudeCodeProvider", { enumerable: true, get: fu
|
|
|
28
28
|
var registry_js_1 = require("./providers/registry.js");
|
|
29
29
|
Object.defineProperty(exports, "ProviderRegistry", { enumerable: true, get: function () { return registry_js_1.ProviderRegistry; } });
|
|
30
30
|
Object.defineProperty(exports, "createDefaultRegistry", { enumerable: true, get: function () { return registry_js_1.createDefaultRegistry; } });
|
|
31
|
+
var batch_js_1 = require("./providers/batch.js");
|
|
32
|
+
Object.defineProperty(exports, "isBatchProvider", { enumerable: true, get: function () { return batch_js_1.isBatchProvider; } });
|
|
33
|
+
Object.defineProperty(exports, "assertValidBatch", { enumerable: true, get: function () { return batch_js_1.assertValidBatch; } });
|
|
34
|
+
Object.defineProperty(exports, "CUSTOM_ID_PATTERN", { enumerable: true, get: function () { return batch_js_1.CUSTOM_ID_PATTERN; } });
|
|
35
|
+
var batch_window_js_1 = require("./providers/batch-window.js");
|
|
36
|
+
Object.defineProperty(exports, "BatchWindow", { enumerable: true, get: function () { return batch_window_js_1.BatchWindow; } });
|
|
37
|
+
Object.defineProperty(exports, "BatchingProviderRegistry", { enumerable: true, get: function () { return batch_window_js_1.BatchingProviderRegistry; } });
|
|
38
|
+
Object.defineProperty(exports, "DEFAULT_MAX_BATCH_SIZE", { enumerable: true, get: function () { return batch_window_js_1.DEFAULT_MAX_BATCH_SIZE; } });
|
|
39
|
+
Object.defineProperty(exports, "DEFAULT_FLUSH_AFTER_MS", { enumerable: true, get: function () { return batch_window_js_1.DEFAULT_FLUSH_AFTER_MS; } });
|
|
31
40
|
var mock_js_1 = require("./providers/mock.js");
|
|
32
41
|
Object.defineProperty(exports, "MockProvider", { enumerable: true, get: function () { return mock_js_1.MockProvider; } });
|
|
33
42
|
// Tools
|
|
@@ -63,7 +72,4 @@ var skill_loader_js_1 = require("./tools/skills/skill-loader.js");
|
|
|
63
72
|
Object.defineProperty(exports, "loadSkills", { enumerable: true, get: function () { return skill_loader_js_1.loadSkills; } });
|
|
64
73
|
Object.defineProperty(exports, "loadSkill", { enumerable: true, get: function () { return skill_loader_js_1.loadSkill; } });
|
|
65
74
|
Object.defineProperty(exports, "validateSkillManifest", { enumerable: true, get: function () { return skill_loader_js_1.validateSkillManifest; } });
|
|
66
|
-
// Integration plugin system
|
|
67
|
-
var integration_loader_js_1 = require("./integrations/integration-loader.js");
|
|
68
|
-
Object.defineProperty(exports, "loadProjectIntegrations", { enumerable: true, get: function () { return integration_loader_js_1.loadProjectIntegrations; } });
|
|
69
75
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,uBAAuB;AACvB,yCAAuC;AAA9B,qGAAA,QAAQ,OAAA;AAGjB,kBAAkB;AAClB,2DAAiD;AAAxC,+GAAA,SAAS,OAAA;AAGlB,iBAAiB;AACjB,yDAAkD;AAAzC,gHAAA,WAAW,OAAA;AAWpB,uDAA8D;AAArD,kHAAA,mBAAmB,OAAA;AAC5B,mDAAuD;AAA9C,2GAAA,cAAc,OAAA;AACvB,uEAA0E;AAAjE,8HAAA,uBAAuB,OAAA;AAChC,yDAA6D;AAApD,iHAAA,iBAAiB,OAAA;AAC1B,mDAAuD;AAA9C,2GAAA,cAAc,OAAA;AACvB,6DAAgE;AAAvD,oHAAA,kBAAkB,OAAA;AAC3B,uDAAkF;AAAzE,+GAAA,gBAAgB,OAAA;AAAE,oHAAA,qBAAqB,OAAA;AAChD,+CAAmD;AAA1C,uGAAA,YAAY,OAAA;AAGrB,QAAQ;AACR,6DAAwD;AAA/C,gHAAA,YAAY,OAAA;AACrB,6DAAwD;AAA/C,gHAAA,YAAY,OAAA;AAGrB,gBAAgB;AAChB,mEAAyE;AAAhE,yHAAA,sBAAsB,OAAA;AAC/B,qDAA4D;AAAnD,4GAAA,gBAAgB,OAAA;AACzB,qDAA4D;AAAnD,4GAAA,gBAAgB,OAAA;AACzB,+DAA+F;AAAtF,oHAAA,mBAAmB,OAAA;AAAE,0HAAA,yBAAyB,OAAA;AAEvD,6DAAoI;AAA3H,oHAAA,gBAAgB,OAAA;AAAE,8HAAA,0BAA0B,OAAA;AAAE,0HAAA,sBAAsB,OAAA;AAAE,sHAAA,kBAAkB,OAAA;AAGjG,2BAA2B;AAC3B,kEAAwE;AAA/D,2HAAA,uBAAuB,OAAA;AAGhC,mDAAmD;AACnD,+CAAiF;AAAxE,uGAAA,WAAW,OAAA;AAAE,qGAAA,SAAS,OAAA;AAAE,+GAAA,mBAAmB,OAAA;AAGpD,eAAe;AACf,kEAA8F;AAArF,6GAAA,UAAU,OAAA;AAAE,4GAAA,SAAS,OAAA;AAAE,wHAAA,qBAAqB,OAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,uBAAuB;AACvB,yCAAuC;AAA9B,qGAAA,QAAQ,OAAA;AAGjB,kBAAkB;AAClB,2DAAiD;AAAxC,+GAAA,SAAS,OAAA;AAGlB,iBAAiB;AACjB,yDAAkD;AAAzC,gHAAA,WAAW,OAAA;AAWpB,uDAA8D;AAArD,kHAAA,mBAAmB,OAAA;AAC5B,mDAAuD;AAA9C,2GAAA,cAAc,OAAA;AACvB,uEAA0E;AAAjE,8HAAA,uBAAuB,OAAA;AAChC,yDAA6D;AAApD,iHAAA,iBAAiB,OAAA;AAC1B,mDAAuD;AAA9C,2GAAA,cAAc,OAAA;AACvB,6DAAgE;AAAvD,oHAAA,kBAAkB,OAAA;AAC3B,uDAAkF;AAAzE,+GAAA,gBAAgB,OAAA;AAAE,oHAAA,qBAAqB,OAAA;AAChD,iDAA4F;AAAnF,2GAAA,eAAe,OAAA;AAAE,4GAAA,gBAAgB,OAAA;AAAE,6GAAA,iBAAiB,OAAA;AAQ7D,+DAKqC;AAJnC,8GAAA,WAAW,OAAA;AACX,2HAAA,wBAAwB,OAAA;AACxB,yHAAA,sBAAsB,OAAA;AACtB,yHAAA,sBAAsB,OAAA;AAQxB,+CAAmD;AAA1C,uGAAA,YAAY,OAAA;AAGrB,QAAQ;AACR,6DAAwD;AAA/C,gHAAA,YAAY,OAAA;AACrB,6DAAwD;AAA/C,gHAAA,YAAY,OAAA;AAGrB,gBAAgB;AAChB,mEAAyE;AAAhE,yHAAA,sBAAsB,OAAA;AAC/B,qDAA4D;AAAnD,4GAAA,gBAAgB,OAAA;AACzB,qDAA4D;AAAnD,4GAAA,gBAAgB,OAAA;AACzB,+DAA+F;AAAtF,oHAAA,mBAAmB,OAAA;AAAE,0HAAA,yBAAyB,OAAA;AAEvD,6DAAoI;AAA3H,oHAAA,gBAAgB,OAAA;AAAE,8HAAA,0BAA0B,OAAA;AAAE,0HAAA,sBAAsB,OAAA;AAAE,sHAAA,kBAAkB,OAAA;AAGjG,2BAA2B;AAC3B,kEAAwE;AAA/D,2HAAA,uBAAuB,OAAA;AAGhC,mDAAmD;AACnD,+CAAiF;AAAxE,uGAAA,WAAW,OAAA;AAAE,qGAAA,SAAS,OAAA;AAAE,+GAAA,mBAAmB,OAAA;AAGpD,eAAe;AACf,kEAA8F;AAArF,6GAAA,UAAU,OAAA;AAAE,4GAAA,SAAS,OAAA;AAAE,wHAAA,qBAAqB,OAAA"}
|
package/dist/prompt-builder.d.ts
CHANGED
|
@@ -42,7 +42,9 @@ export interface PromptBuildConfig {
|
|
|
42
42
|
executionContext?: ExecutionContext;
|
|
43
43
|
outputContract?: OutputContract;
|
|
44
44
|
promptSnippets?: string[];
|
|
45
|
+
pluginSkills?: string[];
|
|
45
46
|
skills?: SkillContent[];
|
|
47
|
+
projectInvariants?: string;
|
|
46
48
|
}
|
|
47
49
|
/**
|
|
48
50
|
* Build prompt messages with retry escalation support
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../src/prompt-builder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,mBAAmB,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACnI,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAKnE,YAAY,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAE9D;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAElD;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,KAAK,CAAC;QACxB,KAAK,EAAE,MAAM,CAAC;QACd,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACnD,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,aAAa,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC;IACtB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../src/prompt-builder.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,mBAAmB,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACnI,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAKnE,YAAY,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAE9D;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAElD;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,KAAK,CAAC;QACxB,KAAK,EAAE,MAAM,CAAC;QACd,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACnD,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,aAAa,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC;IACtB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,EAAE,CAwJhE"}
|
package/dist/prompt-builder.js
CHANGED
|
@@ -23,6 +23,18 @@ function buildPrompt(config) {
|
|
|
23
23
|
const messages = [];
|
|
24
24
|
// Build system message
|
|
25
25
|
let systemContent = agent.system_prompt || 'You are a helpful AI assistant.';
|
|
26
|
+
// Assembled here and nowhere else (INV-06) — callers hand over loaded
|
|
27
|
+
// content, never a pre-concatenated system prompt.
|
|
28
|
+
if (config.pluginSkills?.length) {
|
|
29
|
+
systemContent += '\n\n' + config.pluginSkills.join('\n\n---\n\n');
|
|
30
|
+
}
|
|
31
|
+
if (config.skills?.length) {
|
|
32
|
+
const skillChunks = config.skills.map(s => `## Skill: ${s.name}\n\n${s.content}`);
|
|
33
|
+
systemContent += '\n\n' + skillChunks.join('\n\n---\n\n');
|
|
34
|
+
}
|
|
35
|
+
if (config.projectInvariants) {
|
|
36
|
+
systemContent += `\n\n---\n\n## Project Invariants\n\n${config.projectInvariants}`;
|
|
37
|
+
}
|
|
26
38
|
// Add output format with concrete schema when available
|
|
27
39
|
const contract = config.outputContract;
|
|
28
40
|
if (contract?.schema?.required_fields?.length) {
|
|
@@ -65,11 +77,6 @@ ${task.expected_output || `Provide your response according to the ${task.contrac
|
|
|
65
77
|
if (config.promptSnippets && config.promptSnippets.length > 0) {
|
|
66
78
|
systemContent += '\n\n' + config.promptSnippets.join('\n\n');
|
|
67
79
|
}
|
|
68
|
-
// Inject skills (.studio/skills/*.skill.md) declared by the agent
|
|
69
|
-
if (config.skills && config.skills.length > 0) {
|
|
70
|
-
const skillChunks = config.skills.map(s => `## Skill: ${s.name}\n\n${s.content}`);
|
|
71
|
-
systemContent += '\n\n' + skillChunks.join('\n\n---\n\n');
|
|
72
|
-
}
|
|
73
80
|
messages.push({
|
|
74
81
|
role: 'system',
|
|
75
82
|
content: systemContent
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../src/prompt-builder.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAiBH,8BAEC;
|
|
1
|
+
{"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../src/prompt-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -151,4 +151,47 @@ const TASK = { description: 'Do the thing.' };
|
|
|
151
151
|
(0, vitest_1.expect)(userMsg).not.toContain('## Stage Name');
|
|
152
152
|
});
|
|
153
153
|
});
|
|
154
|
+
(0, vitest_1.describe)('buildPrompt — plugin skills and project invariants', () => {
|
|
155
|
+
(0, vitest_1.it)('injects plugin skill chunks separated by ---', () => {
|
|
156
|
+
const messages = (0, prompt_builder_js_1.buildPrompt)({
|
|
157
|
+
agent: AGENT,
|
|
158
|
+
task: TASK,
|
|
159
|
+
context: {},
|
|
160
|
+
pluginSkills: ['# Plugin A', '# Plugin B'],
|
|
161
|
+
});
|
|
162
|
+
const sysMsg = messages.find(m => m.role === 'system').content;
|
|
163
|
+
(0, vitest_1.expect)(sysMsg).toContain('# Plugin A\n\n---\n\n# Plugin B');
|
|
164
|
+
});
|
|
165
|
+
(0, vitest_1.it)('injects project invariants under a Project Invariants heading', () => {
|
|
166
|
+
const messages = (0, prompt_builder_js_1.buildPrompt)({
|
|
167
|
+
agent: AGENT,
|
|
168
|
+
task: TASK,
|
|
169
|
+
context: {},
|
|
170
|
+
projectInvariants: 'Never delete the audit log.',
|
|
171
|
+
});
|
|
172
|
+
const sysMsg = messages.find(m => m.role === 'system').content;
|
|
173
|
+
(0, vitest_1.expect)(sysMsg).toContain('## Project Invariants\n\nNever delete the audit log.');
|
|
174
|
+
});
|
|
175
|
+
(0, vitest_1.it)('orders the identity block ahead of the output format section', () => {
|
|
176
|
+
const skills = [{ name: 'commit-conventions', content: 'Use conventional commits.' }];
|
|
177
|
+
const messages = (0, prompt_builder_js_1.buildPrompt)({
|
|
178
|
+
agent: AGENT,
|
|
179
|
+
task: TASK,
|
|
180
|
+
context: {},
|
|
181
|
+
pluginSkills: ['# Plugin A'],
|
|
182
|
+
skills,
|
|
183
|
+
projectInvariants: 'Never delete the audit log.',
|
|
184
|
+
outputContract: { name: 'c', version: 1, schema: { required_fields: ['summary'] } },
|
|
185
|
+
});
|
|
186
|
+
const sysMsg = messages.find(m => m.role === 'system').content;
|
|
187
|
+
(0, vitest_1.expect)(sysMsg.indexOf('# Plugin A')).toBeLessThan(sysMsg.indexOf('## Skill: commit-conventions'));
|
|
188
|
+
(0, vitest_1.expect)(sysMsg.indexOf('## Skill: commit-conventions')).toBeLessThan(sysMsg.indexOf('## Project Invariants'));
|
|
189
|
+
(0, vitest_1.expect)(sysMsg.indexOf('## Project Invariants')).toBeLessThan(sysMsg.indexOf('## REQUIRED OUTPUT FORMAT'));
|
|
190
|
+
});
|
|
191
|
+
(0, vitest_1.it)('omits every section when nothing is provided', () => {
|
|
192
|
+
const messages = (0, prompt_builder_js_1.buildPrompt)({ agent: AGENT, task: TASK, context: {} });
|
|
193
|
+
const sysMsg = messages.find(m => m.role === 'system').content;
|
|
194
|
+
(0, vitest_1.expect)(sysMsg).toBe('You are a helpful assistant.');
|
|
195
|
+
});
|
|
196
|
+
});
|
|
154
197
|
//# sourceMappingURL=prompt-builder.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-builder.test.js","sourceRoot":"","sources":["../src/prompt-builder.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"prompt-builder.test.js","sourceRoot":"","sources":["../src/prompt-builder.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* When a call's stable prefix is worth caching.
|
|
3
|
+
*
|
|
4
|
+
* A prompt cache is not free storage: the write is billed above the plain input
|
|
5
|
+
* rate and only earns that back when a later call reads the same prefix. So the
|
|
6
|
+
* question is never "is this prefix big?" but "will anything read it back?".
|
|
7
|
+
*
|
|
8
|
+
* A stage that answers in one turn — a fan-out item, a verdict — never issues a
|
|
9
|
+
* second request, so caching it is a pure surcharge on every token of the prefix.
|
|
10
|
+
* A stage that must call tools comes back through the loop with the same system
|
|
11
|
+
* prompt and the same tool definitions in front of it, and every turn after the
|
|
12
|
+
* first reads what the first one wrote.
|
|
13
|
+
*
|
|
14
|
+
* Hence the `auto` rule: cache when the stage's own contract says it has to use
|
|
15
|
+
* tools. That is the one declaration in `.studio/` that predicts a second turn
|
|
16
|
+
* before the first one has happened — tools merely being *available* does not,
|
|
17
|
+
* which is exactly the case that was paying for caches nothing ever read.
|
|
18
|
+
*/
|
|
19
|
+
import type { OutputContract, PromptCacheMode } from '@studio-foundation/contracts';
|
|
20
|
+
export interface PromptCacheDecision {
|
|
21
|
+
/** Whether the stage's contract obliges it to call tools (so the loop will run again). */
|
|
22
|
+
hasTools: boolean;
|
|
23
|
+
contract?: OutputContract;
|
|
24
|
+
mode?: PromptCacheMode;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* True when the contract cannot be satisfied without at least one tool call —
|
|
28
|
+
* a floor on `minimum`, or a named tool/tool group the agent has to reach for.
|
|
29
|
+
*/
|
|
30
|
+
export declare function contractRequiresToolCalls(contract?: OutputContract): boolean;
|
|
31
|
+
/** Resolve the agent's `prompt_cache` setting against what the stage actually looks like. */
|
|
32
|
+
export declare function shouldCachePrompt({ hasTools, contract, mode }: PromptCacheDecision): boolean;
|
|
33
|
+
//# sourceMappingURL=prompt-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-cache.d.ts","sourceRoot":"","sources":["../src/prompt-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpF,MAAM,WAAW,mBAAmB;IAClC,0FAA0F;IAC1F,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,IAAI,CAAC,EAAE,eAAe,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,CAAC,EAAE,cAAc,GAAG,OAAO,CAM5E;AAED,6FAA6F;AAC7F,wBAAgB,iBAAiB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAK5F"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* When a call's stable prefix is worth caching.
|
|
4
|
+
*
|
|
5
|
+
* A prompt cache is not free storage: the write is billed above the plain input
|
|
6
|
+
* rate and only earns that back when a later call reads the same prefix. So the
|
|
7
|
+
* question is never "is this prefix big?" but "will anything read it back?".
|
|
8
|
+
*
|
|
9
|
+
* A stage that answers in one turn — a fan-out item, a verdict — never issues a
|
|
10
|
+
* second request, so caching it is a pure surcharge on every token of the prefix.
|
|
11
|
+
* A stage that must call tools comes back through the loop with the same system
|
|
12
|
+
* prompt and the same tool definitions in front of it, and every turn after the
|
|
13
|
+
* first reads what the first one wrote.
|
|
14
|
+
*
|
|
15
|
+
* Hence the `auto` rule: cache when the stage's own contract says it has to use
|
|
16
|
+
* tools. That is the one declaration in `.studio/` that predicts a second turn
|
|
17
|
+
* before the first one has happened — tools merely being *available* does not,
|
|
18
|
+
* which is exactly the case that was paying for caches nothing ever read.
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.contractRequiresToolCalls = contractRequiresToolCalls;
|
|
22
|
+
exports.shouldCachePrompt = shouldCachePrompt;
|
|
23
|
+
/**
|
|
24
|
+
* True when the contract cannot be satisfied without at least one tool call —
|
|
25
|
+
* a floor on `minimum`, or a named tool/tool group the agent has to reach for.
|
|
26
|
+
*/
|
|
27
|
+
function contractRequiresToolCalls(contract) {
|
|
28
|
+
const requirements = contract?.tool_calls;
|
|
29
|
+
if (!requirements)
|
|
30
|
+
return false;
|
|
31
|
+
if ((requirements.minimum ?? 0) > 0)
|
|
32
|
+
return true;
|
|
33
|
+
if ((requirements.required_tools?.length ?? 0) > 0)
|
|
34
|
+
return true;
|
|
35
|
+
return (requirements.required_tool_groups?.length ?? 0) > 0;
|
|
36
|
+
}
|
|
37
|
+
/** Resolve the agent's `prompt_cache` setting against what the stage actually looks like. */
|
|
38
|
+
function shouldCachePrompt({ hasTools, contract, mode }) {
|
|
39
|
+
if (mode === 'on')
|
|
40
|
+
return true;
|
|
41
|
+
if (mode === 'off')
|
|
42
|
+
return false;
|
|
43
|
+
// auto (and anything unset): a prefix no second turn can read is not worth writing.
|
|
44
|
+
return hasTools && contractRequiresToolCalls(contract);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=prompt-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-cache.js","sourceRoot":"","sources":["../src/prompt-cache.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;AAeH,8DAMC;AAGD,8CAKC;AAlBD;;;GAGG;AACH,SAAgB,yBAAyB,CAAC,QAAyB;IACjE,MAAM,YAAY,GAAG,QAAQ,EAAE,UAAU,CAAC;IAC1C,IAAI,CAAC,YAAY;QAAE,OAAO,KAAK,CAAC;IAChC,IAAI,CAAC,YAAY,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAChE,OAAO,CAAC,YAAY,CAAC,oBAAoB,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED,6FAA6F;AAC7F,SAAgB,iBAAiB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAuB;IACjF,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACjC,oFAAoF;IACpF,OAAO,QAAQ,IAAI,yBAAyB,CAAC,QAAQ,CAAC,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-cache.test.d.ts","sourceRoot":"","sources":["../src/prompt-cache.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const prompt_cache_js_1 = require("./prompt-cache.js");
|
|
5
|
+
const contract = (tool_calls) => ({
|
|
6
|
+
name: 'c',
|
|
7
|
+
version: 1,
|
|
8
|
+
...(tool_calls ? { tool_calls } : {}),
|
|
9
|
+
});
|
|
10
|
+
(0, vitest_1.describe)('contractRequiresToolCalls', () => {
|
|
11
|
+
(0, vitest_1.it)('is false without a contract, or without tool requirements', () => {
|
|
12
|
+
(0, vitest_1.expect)((0, prompt_cache_js_1.contractRequiresToolCalls)(undefined)).toBe(false);
|
|
13
|
+
(0, vitest_1.expect)((0, prompt_cache_js_1.contractRequiresToolCalls)(contract())).toBe(false);
|
|
14
|
+
});
|
|
15
|
+
(0, vitest_1.it)('is false when the contract only caps tool calls', () => {
|
|
16
|
+
// A maximum permits zero — it predicts nothing about a second turn.
|
|
17
|
+
(0, vitest_1.expect)((0, prompt_cache_js_1.contractRequiresToolCalls)(contract({ maximum: 5 }))).toBe(false);
|
|
18
|
+
(0, vitest_1.expect)((0, prompt_cache_js_1.contractRequiresToolCalls)(contract({ minimum: 0 }))).toBe(false);
|
|
19
|
+
});
|
|
20
|
+
(0, vitest_1.it)('is true for a floor, a named tool, or a tool group', () => {
|
|
21
|
+
(0, vitest_1.expect)((0, prompt_cache_js_1.contractRequiresToolCalls)(contract({ minimum: 1 }))).toBe(true);
|
|
22
|
+
(0, vitest_1.expect)((0, prompt_cache_js_1.contractRequiresToolCalls)(contract({ required_tools: ['repo_manager.write_file'] }))).toBe(true);
|
|
23
|
+
(0, vitest_1.expect)((0, prompt_cache_js_1.contractRequiresToolCalls)(contract({ required_tool_groups: [['a', 'b']] }))).toBe(true);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
(0, vitest_1.describe)('shouldCachePrompt', () => {
|
|
27
|
+
(0, vitest_1.it)('does not cache a single-shot call — the case that was overpaying', () => {
|
|
28
|
+
// A map item or a verdict: tools may be on the table, nothing obliges a
|
|
29
|
+
// second turn, so the cache write would never be read back.
|
|
30
|
+
(0, vitest_1.expect)((0, prompt_cache_js_1.shouldCachePrompt)({ hasTools: true, contract: contract() })).toBe(false);
|
|
31
|
+
(0, vitest_1.expect)((0, prompt_cache_js_1.shouldCachePrompt)({ hasTools: false, contract: undefined })).toBe(false);
|
|
32
|
+
});
|
|
33
|
+
(0, vitest_1.it)('caches when the contract obliges the stage to call tools', () => {
|
|
34
|
+
(0, vitest_1.expect)((0, prompt_cache_js_1.shouldCachePrompt)({ hasTools: true, contract: contract({ minimum: 1 }) })).toBe(true);
|
|
35
|
+
});
|
|
36
|
+
(0, vitest_1.it)('does not cache a tool-requiring contract when the agent has no tools', () => {
|
|
37
|
+
// Misconfigured stage — it will fail validation, not loop.
|
|
38
|
+
(0, vitest_1.expect)((0, prompt_cache_js_1.shouldCachePrompt)({ hasTools: false, contract: contract({ minimum: 1 }) })).toBe(false);
|
|
39
|
+
});
|
|
40
|
+
(0, vitest_1.it)('lets an agent force caching on for a measured shared prefix', () => {
|
|
41
|
+
(0, vitest_1.expect)((0, prompt_cache_js_1.shouldCachePrompt)({ hasTools: false, contract: undefined, mode: 'on' })).toBe(true);
|
|
42
|
+
});
|
|
43
|
+
(0, vitest_1.it)('lets an agent force caching off even where auto would cache', () => {
|
|
44
|
+
(0, vitest_1.expect)((0, prompt_cache_js_1.shouldCachePrompt)({ hasTools: true, contract: contract({ minimum: 1 }), mode: 'off' })).toBe(false);
|
|
45
|
+
});
|
|
46
|
+
(0, vitest_1.it)('treats an explicit auto exactly as an absent setting', () => {
|
|
47
|
+
for (const c of [contract(), contract({ minimum: 1 })]) {
|
|
48
|
+
(0, vitest_1.expect)((0, prompt_cache_js_1.shouldCachePrompt)({ hasTools: true, contract: c, mode: 'auto' }))
|
|
49
|
+
.toBe((0, prompt_cache_js_1.shouldCachePrompt)({ hasTools: true, contract: c }));
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=prompt-cache.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-cache.test.js","sourceRoot":"","sources":["../src/prompt-cache.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic-batch.test.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic-batch.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const anthropic_js_1 = require("./anthropic.js");
|
|
5
|
+
// A scriptable stand-in for client.messages.batches. Every test drives it by
|
|
6
|
+
// setting `statuses` (one processing_status per retrieve) and `results`.
|
|
7
|
+
const state = {
|
|
8
|
+
created: [],
|
|
9
|
+
statuses: [],
|
|
10
|
+
results: [],
|
|
11
|
+
cancelled: [],
|
|
12
|
+
retrieves: 0,
|
|
13
|
+
};
|
|
14
|
+
const createMock = vitest_1.vi.fn(async (body) => {
|
|
15
|
+
state.created.push(body);
|
|
16
|
+
return {
|
|
17
|
+
id: 'msgbatch_test',
|
|
18
|
+
processing_status: state.statuses.shift() ?? 'ended',
|
|
19
|
+
request_counts: { succeeded: 0, errored: 0, processing: 0, canceled: 0, expired: 0 },
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
vitest_1.vi.mock('@anthropic-ai/sdk', () => ({
|
|
23
|
+
default: class FakeAnthropic {
|
|
24
|
+
messages = {
|
|
25
|
+
batches: {
|
|
26
|
+
create: createMock,
|
|
27
|
+
retrieve: async (id) => {
|
|
28
|
+
state.retrieves++;
|
|
29
|
+
return {
|
|
30
|
+
id,
|
|
31
|
+
processing_status: state.statuses.shift() ?? 'ended',
|
|
32
|
+
request_counts: { succeeded: 1, errored: 0, processing: 1, canceled: 0, expired: 0 },
|
|
33
|
+
};
|
|
34
|
+
},
|
|
35
|
+
results: async () => ({
|
|
36
|
+
async *[Symbol.asyncIterator]() {
|
|
37
|
+
for (const entry of state.results)
|
|
38
|
+
yield entry;
|
|
39
|
+
},
|
|
40
|
+
}),
|
|
41
|
+
cancel: async (id) => {
|
|
42
|
+
state.cancelled.push(id);
|
|
43
|
+
return { id };
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
},
|
|
48
|
+
}));
|
|
49
|
+
function message(text) {
|
|
50
|
+
return {
|
|
51
|
+
content: [{ type: 'text', text }],
|
|
52
|
+
stop_reason: 'end_turn',
|
|
53
|
+
model: 'claude-haiku-4-5-20251001',
|
|
54
|
+
usage: { input_tokens: 10, output_tokens: 5, cache_read_input_tokens: 3, cache_creation_input_tokens: 2 },
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function req(text) {
|
|
58
|
+
return { model: 'claude-haiku-4-5-20251001', messages: [{ role: 'user', content: text }], max_tokens: 256 };
|
|
59
|
+
}
|
|
60
|
+
(0, vitest_1.beforeEach)(() => {
|
|
61
|
+
vitest_1.vi.clearAllMocks();
|
|
62
|
+
state.created = [];
|
|
63
|
+
state.statuses = [];
|
|
64
|
+
state.results = [];
|
|
65
|
+
state.cancelled = [];
|
|
66
|
+
state.retrieves = 0;
|
|
67
|
+
});
|
|
68
|
+
(0, vitest_1.describe)('AnthropicProvider.submitBatch', () => {
|
|
69
|
+
(0, vitest_1.it)('advertises the batch capability', () => {
|
|
70
|
+
const provider = new anthropic_js_1.AnthropicProvider('key');
|
|
71
|
+
(0, vitest_1.expect)(typeof provider.submitBatch).toBe('function');
|
|
72
|
+
(0, vitest_1.expect)(provider.maxBatchSize).toBe(100_000);
|
|
73
|
+
});
|
|
74
|
+
(0, vitest_1.it)('submits one job and matches results back by custom_id, whatever their order', async () => {
|
|
75
|
+
state.results = [
|
|
76
|
+
// Deliberately reversed: the API makes no ordering promise.
|
|
77
|
+
{ custom_id: 'b', result: { type: 'succeeded', message: message('second') } },
|
|
78
|
+
{ custom_id: 'a', result: { type: 'succeeded', message: message('first') } },
|
|
79
|
+
];
|
|
80
|
+
const provider = new anthropic_js_1.AnthropicProvider('key');
|
|
81
|
+
const results = await provider.submitBatch([
|
|
82
|
+
{ custom_id: 'a', request: req('one') },
|
|
83
|
+
{ custom_id: 'b', request: req('two') },
|
|
84
|
+
]);
|
|
85
|
+
(0, vitest_1.expect)(createMock).toHaveBeenCalledTimes(1);
|
|
86
|
+
const body = state.created[0];
|
|
87
|
+
(0, vitest_1.expect)(body.requests.map(r => r.custom_id)).toEqual(['a', 'b']);
|
|
88
|
+
(0, vitest_1.expect)(body.requests[0].params).toMatchObject({ model: 'claude-haiku-4-5-20251001', max_tokens: 256 });
|
|
89
|
+
(0, vitest_1.expect)(results.map(r => r.custom_id)).toEqual(['a', 'b']);
|
|
90
|
+
(0, vitest_1.expect)(results[0].response?.content).toBe('first');
|
|
91
|
+
(0, vitest_1.expect)(results[1].response?.content).toBe('second');
|
|
92
|
+
});
|
|
93
|
+
(0, vitest_1.it)('reports batch-billed token usage per request', async () => {
|
|
94
|
+
state.results = [{ custom_id: 'a', result: { type: 'succeeded', message: message('hi') } }];
|
|
95
|
+
const provider = new anthropic_js_1.AnthropicProvider('key');
|
|
96
|
+
const [result] = await provider.submitBatch([{ custom_id: 'a', request: req('one') }]);
|
|
97
|
+
// Batched results come back through the same normalization as a live call:
|
|
98
|
+
// the total counts the cache tokens too, and the model that answered is named
|
|
99
|
+
// — a batched fan-out is exactly where a per-model cost breakdown is wanted.
|
|
100
|
+
(0, vitest_1.expect)(result.response?.usage).toEqual({
|
|
101
|
+
prompt_tokens: 10,
|
|
102
|
+
completion_tokens: 5,
|
|
103
|
+
total_tokens: 20,
|
|
104
|
+
cached_input_tokens: 3,
|
|
105
|
+
cache_creation_tokens: 2,
|
|
106
|
+
by_model: {
|
|
107
|
+
'claude-haiku-4-5-20251001': {
|
|
108
|
+
prompt_tokens: 10,
|
|
109
|
+
completion_tokens: 5,
|
|
110
|
+
total_tokens: 20,
|
|
111
|
+
cached_input_tokens: 3,
|
|
112
|
+
cache_creation_tokens: 2,
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
(0, vitest_1.it)('polls until the batch has ended', async () => {
|
|
118
|
+
state.statuses = ['in_progress', 'in_progress', 'ended'];
|
|
119
|
+
state.results = [{ custom_id: 'a', result: { type: 'succeeded', message: message('done') } }];
|
|
120
|
+
const onProgress = vitest_1.vi.fn();
|
|
121
|
+
const provider = new anthropic_js_1.AnthropicProvider('key');
|
|
122
|
+
const results = await provider.submitBatch([{ custom_id: 'a', request: req('one') }], {
|
|
123
|
+
poll_interval_ms: 1,
|
|
124
|
+
onProgress,
|
|
125
|
+
});
|
|
126
|
+
// create returned 'in_progress', then two retrieves ('in_progress', 'ended').
|
|
127
|
+
(0, vitest_1.expect)(state.retrieves).toBe(2);
|
|
128
|
+
(0, vitest_1.expect)(onProgress).toHaveBeenCalledTimes(2);
|
|
129
|
+
(0, vitest_1.expect)(results[0].response?.content).toBe('done');
|
|
130
|
+
});
|
|
131
|
+
(0, vitest_1.it)('reports a per-request failure as an error, not a rejection', async () => {
|
|
132
|
+
state.results = [
|
|
133
|
+
{ custom_id: 'ok', result: { type: 'succeeded', message: message('fine') } },
|
|
134
|
+
{ custom_id: 'err', result: { type: 'errored', error: { type: 'invalid_request_error' } } },
|
|
135
|
+
{ custom_id: 'gone', result: { type: 'expired' } },
|
|
136
|
+
{ custom_id: 'stop', result: { type: 'canceled' } },
|
|
137
|
+
];
|
|
138
|
+
const provider = new anthropic_js_1.AnthropicProvider('key');
|
|
139
|
+
const results = await provider.submitBatch([
|
|
140
|
+
{ custom_id: 'ok', request: req('a') },
|
|
141
|
+
{ custom_id: 'err', request: req('b') },
|
|
142
|
+
{ custom_id: 'gone', request: req('c') },
|
|
143
|
+
{ custom_id: 'stop', request: req('d') },
|
|
144
|
+
]);
|
|
145
|
+
(0, vitest_1.expect)(results[0].response).toBeDefined();
|
|
146
|
+
(0, vitest_1.expect)(results[1].error).toMatch(/invalid_request_error/);
|
|
147
|
+
(0, vitest_1.expect)(results[2].error).toMatch(/expired/);
|
|
148
|
+
(0, vitest_1.expect)(results[3].error).toMatch(/canceled/i);
|
|
149
|
+
});
|
|
150
|
+
(0, vitest_1.it)('answers for a request the API never reported', async () => {
|
|
151
|
+
state.results = [{ custom_id: 'a', result: { type: 'succeeded', message: message('fine') } }];
|
|
152
|
+
const provider = new anthropic_js_1.AnthropicProvider('key');
|
|
153
|
+
const results = await provider.submitBatch([
|
|
154
|
+
{ custom_id: 'a', request: req('a') },
|
|
155
|
+
{ custom_id: 'ghost', request: req('b') },
|
|
156
|
+
]);
|
|
157
|
+
(0, vitest_1.expect)(results).toHaveLength(2);
|
|
158
|
+
(0, vitest_1.expect)(results[1]).toMatchObject({ custom_id: 'ghost' });
|
|
159
|
+
(0, vitest_1.expect)(results[1].error).toMatch(/no result/);
|
|
160
|
+
});
|
|
161
|
+
(0, vitest_1.it)('gives up on the wait budget and cancels the batch so it stops billing', async () => {
|
|
162
|
+
state.statuses = ['in_progress', 'in_progress', 'in_progress', 'in_progress'];
|
|
163
|
+
const provider = new anthropic_js_1.AnthropicProvider('key');
|
|
164
|
+
await (0, vitest_1.expect)(provider.submitBatch([{ custom_id: 'a', request: req('a') }], { poll_interval_ms: 5, max_wait_ms: 1 })).rejects.toThrow(/did not end within/);
|
|
165
|
+
(0, vitest_1.expect)(state.cancelled).toEqual(['msgbatch_test']);
|
|
166
|
+
});
|
|
167
|
+
(0, vitest_1.it)('never calls the API for an empty batch', async () => {
|
|
168
|
+
const provider = new anthropic_js_1.AnthropicProvider('key');
|
|
169
|
+
await (0, vitest_1.expect)(provider.submitBatch([])).resolves.toEqual([]);
|
|
170
|
+
(0, vitest_1.expect)(createMock).not.toHaveBeenCalled();
|
|
171
|
+
});
|
|
172
|
+
(0, vitest_1.it)('refuses ids the API would reject, before submitting anything', async () => {
|
|
173
|
+
const provider = new anthropic_js_1.AnthropicProvider('key');
|
|
174
|
+
await (0, vitest_1.expect)(provider.submitBatch([{ custom_id: 'not valid', request: req('a') }])).rejects.toThrow(/custom_id/);
|
|
175
|
+
(0, vitest_1.expect)(createMock).not.toHaveBeenCalled();
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
//# sourceMappingURL=anthropic-batch.test.js.map
|