tubeless 0.3.2 → 0.3.4
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 +7 -7
- package/dist/agent/anthropic-protocol.d.ts +48 -0
- package/dist/agent/anthropic-protocol.js +180 -0
- package/dist/agent/anthropic-protocol.js.map +1 -0
- package/dist/agent/anthropic.d.ts +38 -0
- package/dist/agent/anthropic.js +208 -0
- package/dist/agent/anthropic.js.map +1 -0
- package/dist/agent/compile-agent.js +1 -0
- package/dist/agent/compile-agent.js.map +1 -1
- package/dist/agent/default-tool-files.js +58 -38
- package/dist/agent/default-tool-files.js.map +1 -1
- package/dist/agent/default-tools.js +38 -13
- package/dist/agent/default-tools.js.map +1 -1
- package/dist/agent/model-types.d.ts +2 -2
- package/dist/agent/model-types.js.map +1 -1
- package/dist/agent/openai-http.d.ts +1 -2
- package/dist/agent/openai-http.js +32 -44
- package/dist/agent/openai-http.js.map +1 -1
- package/dist/agent/openai-protocol.d.ts +2 -3
- package/dist/agent/openai-protocol.js +6 -75
- package/dist/agent/openai-protocol.js.map +1 -1
- package/dist/agent/openai-tool-outputs.js +3 -52
- package/dist/agent/openai-tool-outputs.js.map +1 -1
- package/dist/agent/openai.d.ts +10 -2
- package/dist/agent/openai.js +37 -13
- package/dist/agent/openai.js.map +1 -1
- package/dist/agent/provider-http.d.ts +11 -0
- package/dist/agent/provider-http.js +73 -0
- package/dist/agent/provider-http.js.map +1 -0
- package/dist/agent/provider-schema.d.ts +18 -0
- package/dist/agent/provider-schema.js +83 -0
- package/dist/agent/provider-schema.js.map +1 -0
- package/dist/agent/provider-tool-outputs.d.ts +8 -0
- package/dist/agent/provider-tool-outputs.js +57 -0
- package/dist/agent/provider-tool-outputs.js.map +1 -0
- package/dist/agent/tool-progress.d.ts +13 -0
- package/dist/agent/tool-progress.js +18 -0
- package/dist/agent/tool-progress.js.map +1 -0
- package/dist/agent/tools.d.ts +4 -0
- package/dist/agent/tools.js +16 -4
- package/dist/agent/tools.js.map +1 -1
- package/dist/agent/turn.js +35 -8
- package/dist/agent/turn.js.map +1 -1
- package/dist/cli/cli-parser.js +11 -2
- package/dist/cli/cli-parser.js.map +1 -1
- package/dist/cloudflare/cloudflare-access.d.ts +14 -0
- package/dist/cloudflare/cloudflare-access.js +178 -0
- package/dist/cloudflare/cloudflare-access.js.map +1 -0
- package/dist/cloudflare/cloudflare-cache.d.ts +23 -0
- package/dist/cloudflare/cloudflare-cache.js +112 -0
- package/dist/cloudflare/cloudflare-cache.js.map +1 -0
- package/dist/cloudflare/cloudflare-launches.d.ts +45 -0
- package/dist/cloudflare/cloudflare-launches.js +179 -0
- package/dist/cloudflare/cloudflare-launches.js.map +1 -0
- package/dist/cloudflare/cloudflare-run-store.d.ts +9 -0
- package/dist/cloudflare/cloudflare-run-store.js +33 -0
- package/dist/cloudflare/cloudflare-run-store.js.map +1 -0
- package/dist/cloudflare/cloudflare-run.d.ts +60 -0
- package/dist/cloudflare/cloudflare-run.js +225 -0
- package/dist/cloudflare/cloudflare-run.js.map +1 -0
- package/dist/cloudflare/cloudflare-storage.d.ts +17 -0
- package/dist/cloudflare/cloudflare-storage.js +2 -0
- package/dist/cloudflare/cloudflare-storage.js.map +1 -0
- package/dist/cloudflare/cloudflare-studio-client.d.ts +1 -0
- package/dist/cloudflare/cloudflare-studio-client.js +1 -0
- package/dist/cloudflare/cloudflare-studio.d.ts +32 -0
- package/dist/cloudflare/cloudflare-studio.js +165 -0
- package/dist/cloudflare/cloudflare-studio.js.map +1 -0
- package/dist/cloudflare/cloudflare.d.ts +25 -0
- package/dist/cloudflare/cloudflare.js +119 -0
- package/dist/cloudflare/cloudflare.js.map +1 -0
- package/dist/core/child-execution.js +1 -1
- package/dist/core/child-execution.js.map +1 -1
- package/dist/core/child-progress.d.ts +1 -1
- package/dist/core/child-progress.js +6 -2
- package/dist/core/child-progress.js.map +1 -1
- package/dist/core/iteration.js +3 -2
- package/dist/core/iteration.js.map +1 -1
- package/dist/core/lifecycle.js +19 -7
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core/pipeline-diagnostics.d.ts +14 -1
- package/dist/core/pipeline-diagnostics.js +39 -0
- package/dist/core/pipeline-diagnostics.js.map +1 -1
- package/dist/core/pipeline-finalizer.js +2 -1
- package/dist/core/pipeline-finalizer.js.map +1 -1
- package/dist/core/pipeline-step-builders.d.ts +69 -0
- package/dist/core/pipeline-step-builders.js +159 -0
- package/dist/core/pipeline-step-builders.js.map +1 -0
- package/dist/core/pipeline-step-types.d.ts +160 -0
- package/dist/core/pipeline-step-types.js +2 -0
- package/dist/core/pipeline-step-types.js.map +1 -0
- package/dist/core/pipeline-steps.d.ts +21 -164
- package/dist/core/pipeline-steps.js +12 -137
- package/dist/core/pipeline-steps.js.map +1 -1
- package/dist/core/step-log-scope.d.ts +12 -0
- package/dist/core/step-log-scope.js +14 -0
- package/dist/core/step-log-scope.js.map +1 -0
- package/dist/hosting/hosting-commands.d.ts +49 -0
- package/dist/hosting/hosting-commands.js +138 -0
- package/dist/hosting/hosting-commands.js.map +1 -0
- package/dist/hosting/hosting-studio.d.ts +13 -0
- package/dist/hosting/hosting-studio.js +24 -0
- package/dist/hosting/hosting-studio.js.map +1 -0
- package/dist/reporter/interactive-reporter.js +126 -18
- package/dist/reporter/interactive-reporter.js.map +1 -1
- package/dist/reporter/live-ticker-frame.d.ts +10 -2
- package/dist/reporter/live-ticker-frame.js +49 -28
- package/dist/reporter/live-ticker-frame.js.map +1 -1
- package/dist/reporter/live-ticker-worker.js +3 -5
- package/dist/reporter/live-ticker-worker.js.map +1 -1
- package/dist/reporter/live-ticker.js +3 -4
- package/dist/reporter/live-ticker.js.map +1 -1
- package/dist/run-store/run-store-sql.d.ts +59 -0
- package/dist/run-store/run-store-sql.js +150 -0
- package/dist/run-store/run-store-sql.js.map +1 -0
- package/dist/run-store/run-store-sqlite.js +18 -144
- package/dist/run-store/run-store-sqlite.js.map +1 -1
- package/dist/studio/run-store-ui-api.d.ts +1 -2
- package/dist/studio/run-store-ui-api.js +72 -92
- package/dist/studio/run-store-ui-api.js.map +1 -1
- package/dist/studio/run-store-ui-children.d.ts +12 -0
- package/dist/studio/run-store-ui-children.js +38 -0
- package/dist/studio/run-store-ui-children.js.map +1 -0
- package/dist/studio/run-store-ui-client-browser.js +4 -4
- package/dist/studio/run-store-ui-client-transport.d.ts +3 -2
- package/dist/studio/run-store-ui-client-transport.js +13 -1
- package/dist/studio/run-store-ui-client-transport.js.map +1 -1
- package/dist/studio/run-store-ui-client.d.ts +0 -53
- package/dist/studio/run-store-ui-client.js +5 -393
- package/dist/studio/run-store-ui-client.js.map +1 -1
- package/dist/studio/run-store-ui-common.d.ts +7 -0
- package/dist/studio/run-store-ui-common.js +11 -0
- package/dist/studio/run-store-ui-common.js.map +1 -0
- package/dist/studio/run-store-ui-graph.d.ts +12 -1
- package/dist/studio/run-store-ui-graph.js +62 -22
- package/dist/studio/run-store-ui-graph.js.map +1 -1
- package/dist/studio/run-store-ui-handler.d.ts +23 -0
- package/dist/studio/run-store-ui-handler.js +56 -0
- package/dist/studio/run-store-ui-handler.js.map +1 -0
- package/dist/studio/run-store-ui-hosting.d.ts +3 -3
- package/dist/studio/run-store-ui-hosting.js +20 -15
- package/dist/studio/run-store-ui-hosting.js.map +1 -1
- package/dist/studio/run-store-ui-http.d.ts +5 -6
- package/dist/studio/run-store-ui-http.js +45 -38
- package/dist/studio/run-store-ui-http.js.map +1 -1
- package/dist/studio/run-store-ui-launch.d.ts +27 -0
- package/dist/studio/run-store-ui-launch.js +230 -0
- package/dist/studio/run-store-ui-launch.js.map +1 -0
- package/dist/studio/run-store-ui-node.d.ts +10 -0
- package/dist/studio/run-store-ui-node.js +44 -0
- package/dist/studio/run-store-ui-node.js.map +1 -0
- package/dist/studio/run-store-ui-page-node.d.ts +2 -0
- package/dist/studio/run-store-ui-page-node.js +8 -0
- package/dist/studio/run-store-ui-page-node.js.map +1 -0
- package/dist/studio/run-store-ui-page.d.ts +6 -8
- package/dist/studio/run-store-ui-page.js +32 -23
- package/dist/studio/run-store-ui-page.js.map +1 -1
- package/dist/studio/run-store-ui-pipelines.d.ts +9 -0
- package/dist/studio/run-store-ui-pipelines.js +93 -0
- package/dist/studio/run-store-ui-pipelines.js.map +1 -0
- package/dist/studio/run-store-ui-runs.d.ts +29 -0
- package/dist/studio/run-store-ui-runs.js +121 -0
- package/dist/studio/run-store-ui-runs.js.map +1 -0
- package/dist/studio/run-store-ui-schema.d.ts +20 -0
- package/dist/studio/run-store-ui-schema.js +13 -0
- package/dist/studio/run-store-ui-schema.js.map +1 -1
- package/dist/studio/run-store-ui-state.d.ts +7 -1
- package/dist/studio/run-store-ui-state.js +60 -10
- package/dist/studio/run-store-ui-state.js.map +1 -1
- package/dist/studio/run-store-ui.d.ts +4 -2
- package/dist/studio/run-store-ui.js +58 -53
- package/dist/studio/run-store-ui.js.map +1 -1
- package/dist/utilities/abort.d.ts +2 -0
- package/dist/utilities/abort.js +21 -0
- package/dist/utilities/abort.js.map +1 -1
- package/dist/utilities/cache-key.js +2 -14
- package/dist/utilities/cache-key.js.map +1 -1
- package/dist/workbench/cloud-client.d.ts +28 -0
- package/dist/workbench/cloud-client.js +264 -0
- package/dist/workbench/cloud-client.js.map +1 -0
- package/dist/workbench/cloud-config.d.ts +3 -0
- package/dist/workbench/cloud-config.js +30 -0
- package/dist/workbench/cloud-config.js.map +1 -0
- package/dist/workbench/cloud-credentials.d.ts +22 -0
- package/dist/workbench/cloud-credentials.js +121 -0
- package/dist/workbench/cloud-credentials.js.map +1 -0
- package/dist/workbench/cloud-protocol.d.ts +112 -0
- package/dist/workbench/cloud-protocol.js +183 -0
- package/dist/workbench/cloud-protocol.js.map +1 -0
- package/dist/workbench/pipeline-module.d.ts +1 -3
- package/dist/workbench/pipeline-module.js.map +1 -1
- package/dist/workbench/workbench-agent-commands.d.ts +8 -0
- package/dist/workbench/workbench-agent-commands.js +27 -0
- package/dist/workbench/workbench-agent-commands.js.map +1 -0
- package/dist/workbench/workbench-agent-environment.d.ts +7 -0
- package/dist/workbench/workbench-agent-environment.js +26 -0
- package/dist/workbench/workbench-agent-environment.js.map +1 -0
- package/dist/workbench/workbench-agent-history.d.ts +0 -1
- package/dist/workbench/workbench-agent-history.js +1 -3
- package/dist/workbench/workbench-agent-history.js.map +1 -1
- package/dist/workbench/workbench-agent-input.d.ts +14 -0
- package/dist/workbench/workbench-agent-input.js +72 -0
- package/dist/workbench/workbench-agent-input.js.map +1 -0
- package/dist/workbench/workbench-agent-prompt.d.ts +19 -0
- package/dist/workbench/workbench-agent-prompt.js +92 -0
- package/dist/workbench/workbench-agent-prompt.js.map +1 -0
- package/dist/workbench/workbench-agent-session.d.ts +6 -0
- package/dist/workbench/workbench-agent-session.js +96 -0
- package/dist/workbench/workbench-agent-session.js.map +1 -0
- package/dist/workbench/workbench-agent.d.ts +2 -0
- package/dist/workbench/workbench-agent.js +110 -0
- package/dist/workbench/workbench-agent.js.map +1 -0
- package/dist/workbench/workbench-auth.d.ts +3 -0
- package/dist/workbench/workbench-auth.js +165 -0
- package/dist/workbench/workbench-auth.js.map +1 -0
- package/dist/workbench/workbench-bin.js +1 -0
- package/dist/workbench/workbench-bin.js.map +1 -1
- package/dist/workbench/workbench-cloud-shared.d.ts +18 -0
- package/dist/workbench/workbench-cloud-shared.js +28 -0
- package/dist/workbench/workbench-cloud-shared.js.map +1 -0
- package/dist/workbench/workbench-cloud.d.ts +3 -0
- package/dist/workbench/workbench-cloud.js +306 -0
- package/dist/workbench/workbench-cloud.js.map +1 -0
- package/dist/workbench/workbench-command-execution.d.ts +2 -2
- package/dist/workbench/workbench-command-execution.js +4 -43
- package/dist/workbench/workbench-command-execution.js.map +1 -1
- package/dist/workbench/workbench-commands.js +7 -28
- package/dist/workbench/workbench-commands.js.map +1 -1
- package/dist/workbench/workbench-history.js +10 -18
- package/dist/workbench/workbench-history.js.map +1 -1
- package/dist/workbench/workbench-init-cloudflare.d.ts +11 -0
- package/dist/workbench/workbench-init-cloudflare.js +145 -0
- package/dist/workbench/workbench-init-cloudflare.js.map +1 -0
- package/dist/workbench/workbench-init.d.ts +30 -0
- package/dist/workbench/workbench-init.js +114 -0
- package/dist/workbench/workbench-init.js.map +1 -0
- package/dist/workbench/workbench-project-loader.d.ts +2 -0
- package/dist/workbench/workbench-project-loader.js +4 -19
- package/dist/workbench/workbench-project-loader.js.map +1 -1
- package/dist/workbench/workbench-run.js +27 -39
- package/dist/workbench/workbench-run.js.map +1 -1
- package/dist/workbench/workbench-shared.d.ts +10 -3
- package/dist/workbench/workbench-shared.js +5 -18
- package/dist/workbench/workbench-shared.js.map +1 -1
- package/dist/workbench/workbench-subcommand.d.ts +67 -0
- package/dist/workbench/workbench-subcommand.js +28 -0
- package/dist/workbench/workbench-subcommand.js.map +1 -1
- package/dist/workbench/workbench-ui.js +15 -27
- package/dist/workbench/workbench-ui.js.map +1 -1
- package/dist/workbench/workbench.js +20 -0
- package/dist/workbench/workbench.js.map +1 -1
- package/docs/README.md +1 -0
- package/docs/agent-guide.md +273 -143
- package/docs/agents.md +208 -3
- package/docs/api-reference.md +62 -29
- package/docs/api-report.json +35 -7
- package/docs/child-pipeline-composition.md +5 -1
- package/docs/cli.md +290 -3
- package/docs/concepts.md +31 -0
- package/docs/declarative-pipelines.md +92 -0
- package/docs/deploy-cloudflare.md +269 -0
- package/docs/llms.txt +8 -1
- package/docs/recipes.md +64 -55
- package/docs/studio.md +7 -2
- package/examples/agent-model-anthropic.ts +11 -0
- package/examples/agent-repl-model.ts +16 -0
- package/examples/cloudflare/cloudflare/worker.ts +7 -0
- package/examples/cloudflare/cloudflare.config.ts +38 -0
- package/examples/cloudflare/tubeless.project.ts +2 -0
- package/examples/cloudflare/vite.config.ts +4 -0
- package/examples/declarative/user-input.yaml +30 -0
- package/examples/project/tubeless.project.ts +2 -0
- package/examples/user-input.ts +24 -0
- package/examples/yaml-user-input.ts +98 -0
- package/package.json +36 -11
- package/skills/tubeless/SKILL.md +36 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile-agent.js","sourceRoot":"","sources":["../../src/agent/compile-agent.ts"],"names":[],"mappings":"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","sourcesContent":["import { createSteps, definePipeline } from \"../core/pipeline.js\";\nimport { STEP_AGENT } from \"../core/pipeline-step-metadata.js\";\nimport type {\n Pipeline,\n PipelineDefinitionSnapshot,\n StandardSchemaV1,\n} from \"../core/pipeline-types.js\";\nimport type { AnyStep } from \"../core/pipeline-steps.js\";\nimport { agentError, checkSchema, descriptorFingerprint, jsonDescriptor } from \"./agent-state.js\";\nimport { compileTool } from \"./tools.js\";\nimport { defaultTools } from \"./default-tools.js\";\nimport { resolvedLimits, agentScope } from \"./execution-scope.js\";\nimport { createAgentTurn, type TurnState } from \"./turn.js\";\nimport { initialAgentExecution, runAgentInvocation } from \"./invocation.js\";\nimport { markAgent } from \"./agent-identity.js\";\nimport type {\n AgentDefinition,\n AgentDecisionContext,\n AgentState,\n Awaitable,\n Input,\n Output,\n Tools,\n} from \"./agent-types.js\";\n\n/** Accept raw or already-owned pending state; the turn snapshots it before tools run. */\nexport type RuntimeAgentDefinition<\n Id extends string,\n Options extends StandardSchemaV1<object, object>,\n Result extends StandardSchemaV1,\n State,\n Registry extends Tools,\n> = Omit<AgentDefinition<Id, Options, Result, State, Registry>, \"decide\" | \"dryRun\"> & {\n decide(\n state: AgentState<State>,\n context: AgentDecisionContext<Output<Options>>\n ): Awaitable<{\n decision: unknown;\n state: State | AgentState<State>;\n }>;\n dryRun?(\n state: AgentState<State>,\n context: AgentDecisionContext<Output<Options>>\n ): Awaitable<{\n decision: unknown;\n state: State | AgentState<State>;\n }>;\n};\n\nexport function compileAgent<\n const Id extends string,\n const Options extends StandardSchemaV1<object, object>,\n const Result extends StandardSchemaV1,\n State,\n const Registry extends Tools = {},\n>(\n definition: RuntimeAgentDefinition<Id, Options, Result, State, Registry>,\n resolveCwd = false\n): Pipeline<Input<Options>, Output<Result>, \"agent\", \"agent\", Id> & {\n readonly optionsSchema: Options;\n readonly definition: PipelineDefinitionSnapshot;\n} {\n const config = { ...definition };\n if (\n config.durability &&\n (typeof config.implementationVersion !== \"string\" || !config.implementationVersion.trim())\n )\n throw agentError(\n \"TUBELESS_AGENT_INVALID_DEFINITION\",\n \"Durable agents require an explicit implementationVersion\"\n );\n checkSchema(config.inputSchema, \"Agent input\");\n if (\n typeof config.initialState !== \"function\" ||\n typeof config.decide !== \"function\" ||\n (config.reduce !== undefined && typeof config.reduce !== \"function\") ||\n (config.dryRun !== undefined && typeof config.dryRun !== \"function\")\n )\n throw agentError(\n \"TUBELESS_AGENT_INVALID_DEFINITION\",\n \"Agent requires initialState and decide callbacks, and callable reduce/dryRun when supplied\"\n );\n const limits = resolvedLimits(config.limits);\n const resultJsonSchema = jsonDescriptor(\n config.resultSchema,\n config.resultJsonSchema,\n \"Agent result\"\n );\n const entries = Object.entries({ ...defaultTools, ...config.tools }).sort(([a], [b]) =>\n a < b ? -1 : a > b ? 1 : 0\n );\n if (entries.length > 4096)\n throw agentError(\n \"TUBELESS_AGENT_INVALID_DEFINITION\",\n \"Agent capability inventory exceeds 4096 tools\"\n );\n const registry = new Map(\n entries.map(([name, tool]) => {\n if (!/^[A-Za-z][A-Za-z0-9_-]{0,127}$/.test(name))\n throw agentError(\"TUBELESS_AGENT_INVALID_DEFINITION\", `Invalid tool name: ${name}`);\n return [name, compileTool(config.id, name, tool)];\n })\n );\n const capabilities = Object.freeze(\n [...registry.values()].map(({ name, description, inputJsonSchema }) =>\n Object.freeze({ name, description, inputJsonSchema })\n )\n );\n const turn = createAgentTurn(config, registry, limits, { capabilities, resultJsonSchema });\n const { iteratePipeline } = createSteps(config.inputSchema);\n const agent = iteratePipeline(\"agent\", {\n pipeline: turn,\n maxIterations: limits.maxTurns,\n dryRun: config.dryRun ? undefined : \"skip\",\n initialState: (_inputs, context): TurnState<State> => {\n const scope = agentScope(context)!;\n return initialAgentExecution(\n () => config.initialState(context.options),\n scope.journal?.agent(scope.agentKey)?.execution\n );\n },\n mapOptions: (execution, _inputs, context) => ({\n execution,\n options: context.options,\n agentRunId: context.runId,\n }),\n transition: (result) => result,\n });\n const compiledAgent: AnyStep<Output<Options>> = agent;\n const run = compiledAgent.run;\n compiledAgent.run = (inputs, context) =>\n runAgentInvocation(\n { ...config, limits, resolveCwd, definition: pipeline.definition },\n context,\n (scoped) => run(inputs, scoped)\n );\n Object.defineProperty(agent, STEP_AGENT, {\n value: Object.freeze({\n limits,\n resultSchemaFingerprint: descriptorFingerprint(resultJsonSchema),\n capabilities: Object.freeze(\n [...registry.values()].map((tool) =>\n Object.freeze({\n name: tool.name,\n description: tool.description,\n inputSchemaFingerprint: descriptorFingerprint(tool.inputJsonSchema),\n identity: tool.pipeline.definition.identity,\n })\n )\n ),\n }),\n });\n const pipeline = definePipeline({\n id: config.id,\n name: config.name,\n description: config.description,\n implementationVersion: config.implementationVersion,\n steps: [compiledAgent],\n finalize: compiledAgent,\n });\n markAgent(pipeline);\n // SAFETY: the sole iteration step inherits Options, publishes the once-validated Result,\n // and is the only target. This restores deferred generic inference at the factory boundary.\n return pipeline as unknown as Pipeline<Input<Options>, Output<Result>, \"agent\", \"agent\", Id> & {\n readonly optionsSchema: Options;\n readonly definition: PipelineDefinitionSnapshot;\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"compile-agent.js","sourceRoot":"","sources":["../../src/agent/compile-agent.ts"],"names":[],"mappings":"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","sourcesContent":["import { createSteps, definePipeline } from \"../core/pipeline.js\";\nimport { STEP_AGENT } from \"../core/pipeline-step-metadata.js\";\nimport type {\n Pipeline,\n PipelineDefinitionSnapshot,\n StandardSchemaV1,\n} from \"../core/pipeline-types.js\";\nimport type { AnyStep } from \"../core/pipeline-steps.js\";\nimport { agentError, checkSchema, descriptorFingerprint, jsonDescriptor } from \"./agent-state.js\";\nimport { compileTool } from \"./tools.js\";\nimport { defaultTools } from \"./default-tools.js\";\nimport { resolvedLimits, agentScope } from \"./execution-scope.js\";\nimport { createAgentTurn, type TurnState } from \"./turn.js\";\nimport { initialAgentExecution, runAgentInvocation } from \"./invocation.js\";\nimport { markAgent } from \"./agent-identity.js\";\nimport type {\n AgentDefinition,\n AgentDecisionContext,\n AgentState,\n Awaitable,\n Input,\n Output,\n Tools,\n} from \"./agent-types.js\";\n\n/** Accept raw or already-owned pending state; the turn snapshots it before tools run. */\nexport type RuntimeAgentDefinition<\n Id extends string,\n Options extends StandardSchemaV1<object, object>,\n Result extends StandardSchemaV1,\n State,\n Registry extends Tools,\n> = Omit<AgentDefinition<Id, Options, Result, State, Registry>, \"decide\" | \"dryRun\"> & {\n decide(\n state: AgentState<State>,\n context: AgentDecisionContext<Output<Options>>\n ): Awaitable<{\n decision: unknown;\n state: State | AgentState<State>;\n }>;\n dryRun?(\n state: AgentState<State>,\n context: AgentDecisionContext<Output<Options>>\n ): Awaitable<{\n decision: unknown;\n state: State | AgentState<State>;\n }>;\n};\n\nexport function compileAgent<\n const Id extends string,\n const Options extends StandardSchemaV1<object, object>,\n const Result extends StandardSchemaV1,\n State,\n const Registry extends Tools = {},\n>(\n definition: RuntimeAgentDefinition<Id, Options, Result, State, Registry>,\n resolveCwd = false\n): Pipeline<Input<Options>, Output<Result>, \"agent\", \"agent\", Id> & {\n readonly optionsSchema: Options;\n readonly definition: PipelineDefinitionSnapshot;\n} {\n const config = { ...definition };\n if (\n config.durability &&\n (typeof config.implementationVersion !== \"string\" || !config.implementationVersion.trim())\n )\n throw agentError(\n \"TUBELESS_AGENT_INVALID_DEFINITION\",\n \"Durable agents require an explicit implementationVersion\"\n );\n checkSchema(config.inputSchema, \"Agent input\");\n if (\n typeof config.initialState !== \"function\" ||\n typeof config.decide !== \"function\" ||\n (config.reduce !== undefined && typeof config.reduce !== \"function\") ||\n (config.dryRun !== undefined && typeof config.dryRun !== \"function\")\n )\n throw agentError(\n \"TUBELESS_AGENT_INVALID_DEFINITION\",\n \"Agent requires initialState and decide callbacks, and callable reduce/dryRun when supplied\"\n );\n const limits = resolvedLimits(config.limits);\n const resultJsonSchema = jsonDescriptor(\n config.resultSchema,\n config.resultJsonSchema,\n \"Agent result\"\n );\n const entries = Object.entries({ ...defaultTools, ...config.tools }).sort(([a], [b]) =>\n a < b ? -1 : a > b ? 1 : 0\n );\n if (entries.length > 4096)\n throw agentError(\n \"TUBELESS_AGENT_INVALID_DEFINITION\",\n \"Agent capability inventory exceeds 4096 tools\"\n );\n const registry = new Map(\n entries.map(([name, tool]) => {\n if (!/^[A-Za-z][A-Za-z0-9_-]{0,127}$/.test(name))\n throw agentError(\"TUBELESS_AGENT_INVALID_DEFINITION\", `Invalid tool name: ${name}`);\n return [name, compileTool(config.id, name, tool)];\n })\n );\n const capabilities = Object.freeze(\n [...registry.values()].map(({ name, description, inputJsonSchema }) =>\n Object.freeze({ name, description, inputJsonSchema })\n )\n );\n const turn = createAgentTurn(config, registry, limits, { capabilities, resultJsonSchema });\n const { iteratePipeline } = createSteps(config.inputSchema);\n const agent = iteratePipeline(\"agent\", {\n name: \"Agent\",\n pipeline: turn,\n maxIterations: limits.maxTurns,\n dryRun: config.dryRun ? undefined : \"skip\",\n initialState: (_inputs, context): TurnState<State> => {\n const scope = agentScope(context)!;\n return initialAgentExecution(\n () => config.initialState(context.options),\n scope.journal?.agent(scope.agentKey)?.execution\n );\n },\n mapOptions: (execution, _inputs, context) => ({\n execution,\n options: context.options,\n agentRunId: context.runId,\n }),\n transition: (result) => result,\n });\n const compiledAgent: AnyStep<Output<Options>> = agent;\n const run = compiledAgent.run;\n compiledAgent.run = (inputs, context) =>\n runAgentInvocation(\n { ...config, limits, resolveCwd, definition: pipeline.definition },\n context,\n (scoped) => run(inputs, scoped)\n );\n Object.defineProperty(agent, STEP_AGENT, {\n value: Object.freeze({\n limits,\n resultSchemaFingerprint: descriptorFingerprint(resultJsonSchema),\n capabilities: Object.freeze(\n [...registry.values()].map((tool) =>\n Object.freeze({\n name: tool.name,\n description: tool.description,\n inputSchemaFingerprint: descriptorFingerprint(tool.inputJsonSchema),\n identity: tool.pipeline.definition.identity,\n })\n )\n ),\n }),\n });\n const pipeline = definePipeline({\n id: config.id,\n name: config.name,\n description: config.description,\n implementationVersion: config.implementationVersion,\n steps: [compiledAgent],\n finalize: compiledAgent,\n });\n markAgent(pipeline);\n // SAFETY: the sole iteration step inherits Options, publishes the once-validated Result,\n // and is the only target. This restores deferred generic inference at the factory boundary.\n return pipeline as unknown as Pipeline<Input<Options>, Output<Result>, \"agent\", \"agent\", Id> & {\n readonly optionsSchema: Options;\n readonly definition: PipelineDefinitionSnapshot;\n };\n}\n"]}
|
|
@@ -116,54 +116,74 @@ async function writeDestination(path, signal) {
|
|
|
116
116
|
path = isAbsolute(target) ? target : `${dirname(path)}${sep}${target}`;
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
119
|
+
// Serialize writes per file within this process so concurrent edits in one tool batch
|
|
120
|
+
// cannot read the same original text and silently overwrite each other.
|
|
121
|
+
const pathLocks = new Map();
|
|
122
|
+
async function withPathLock(path, work) {
|
|
123
|
+
const key = await realpath(path).catch(() => path);
|
|
124
|
+
const previous = pathLocks.get(key) ?? Promise.resolve();
|
|
125
|
+
const current = previous.then(work);
|
|
126
|
+
const settled = current.then(() => undefined, () => undefined);
|
|
127
|
+
pathLocks.set(key, settled);
|
|
128
|
+
try {
|
|
129
|
+
return await current;
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
if (pathLocks.get(key) === settled)
|
|
133
|
+
pathLocks.delete(key);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async function writeContent(path, content, context) {
|
|
137
|
+
const bytes = Buffer.byteLength(content);
|
|
138
|
+
if (bytes > MAX_FILE_BYTES)
|
|
139
|
+
throw new ToolError("FILE_TOO_LARGE", "Content exceeds 1 MiB");
|
|
140
|
+
const { destination, info } = await writeDestination(path, context.signal);
|
|
141
|
+
if (info && !info.isFile())
|
|
142
|
+
throw new ToolError("NOT_FILE", "Expected a regular file");
|
|
143
|
+
if (info)
|
|
144
|
+
await access(destination, constants.W_OK);
|
|
145
|
+
const staging = await mkdtemp(join(dirname(destination), ".tubeless-write-"));
|
|
146
|
+
try {
|
|
147
|
+
const temporary = join(staging, "content");
|
|
148
|
+
const file = await open(temporary, "wx", info ? info.mode & 0o7777 : 0o666);
|
|
131
149
|
try {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
await file.chown(info.uid, info.gid);
|
|
138
|
-
// Creation and ownership changes can alter mode bits; restore them last.
|
|
139
|
-
await file.chmod(info.mode & 0o7777);
|
|
140
|
-
}
|
|
150
|
+
await file.writeFile(content, { encoding: "utf8", signal: context.signal });
|
|
151
|
+
if (info) {
|
|
152
|
+
await file.chown(info.uid, info.gid);
|
|
153
|
+
// Creation and ownership changes can alter mode bits; restore them last.
|
|
154
|
+
await file.chmod(info.mode & 0o7777);
|
|
141
155
|
}
|
|
142
|
-
finally {
|
|
143
|
-
await file.close();
|
|
144
|
-
}
|
|
145
|
-
throwIfAborted(context.signal, "Write file");
|
|
146
|
-
await rename(temporary, destination);
|
|
147
156
|
}
|
|
148
157
|
finally {
|
|
149
|
-
await
|
|
158
|
+
await file.close();
|
|
150
159
|
}
|
|
151
|
-
|
|
160
|
+
throwIfAborted(context.signal, "Write file");
|
|
161
|
+
await rename(temporary, destination);
|
|
162
|
+
}
|
|
163
|
+
finally {
|
|
164
|
+
await rm(staging, { recursive: true, force: true });
|
|
165
|
+
}
|
|
166
|
+
return { path, bytes };
|
|
167
|
+
}
|
|
168
|
+
export async function writeTool(input, context) {
|
|
169
|
+
return fileOperation(context, async () => {
|
|
170
|
+
const path = resolve(context.cwd, input.path);
|
|
171
|
+
return withPathLock(path, () => writeContent(path, input.content, context));
|
|
152
172
|
});
|
|
153
173
|
}
|
|
154
174
|
export async function editTool(input, context) {
|
|
155
175
|
return fileOperation(context, async () => {
|
|
156
176
|
const path = resolve(context.cwd, input.path);
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
}
|
|
177
|
+
return withPathLock(path, async () => {
|
|
178
|
+
const text = await readText(path, context.signal);
|
|
179
|
+
const index = text.indexOf(input.oldText);
|
|
180
|
+
if (index < 0)
|
|
181
|
+
throw new ToolError("EDIT_NOT_FOUND", "oldText does not occur in the file");
|
|
182
|
+
if (text.indexOf(input.oldText, index + 1) >= 0)
|
|
183
|
+
throw new ToolError("EDIT_AMBIGUOUS", "oldText occurs more than once; include more context");
|
|
184
|
+
const content = text.slice(0, index) + input.newText + text.slice(index + input.oldText.length);
|
|
185
|
+
return writeContent(path, content, context);
|
|
186
|
+
});
|
|
167
187
|
});
|
|
168
188
|
}
|
|
169
189
|
export async function listTool(input, context) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-tool-files.js","sourceRoot":"","sources":["../../src/agent/default-tool-files.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,KAAK,EACL,KAAK,EACL,OAAO,EACP,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,EAAE,EACF,IAAI,GACL,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAE9E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,0BAA0B,CAAC;AAIlC,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,QAAQ,GAAG,gBAAgB;IACnE,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO;QACL,IAAI,EAAE,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE;YACtF,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,QAAQ;SAChC,CAAC;QACF,SAAS,EAAE,KAAK,CAAC,MAAM,GAAG,QAAQ;KACnC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,MAAoB;IAC7D,cAAc,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,cAAc,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACrC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,CACL,KAAK,YAAY,KAAK;QACtB,MAAM,IAAI,KAAK;QACf,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAC9D,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,aAAa,CAAI,OAAgB,EAAE,IAAsB;IACtE,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;QAC5B,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAC7C,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAC7C,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YAC7E,MAAM,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QACzE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,MAAoB;IACxD,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;IACzE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE,MAAM,IAAI,SAAS,CAAC,UAAU,EAAE,yBAAyB,CAAC,CAAC;QAC/E,IAAI,IAAI,CAAC,IAAI,GAAG,cAAc;YAAE,MAAM,IAAI,SAAS,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;QAC5F,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;QAChD,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,OAAO,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YAC9B,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YACpC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,CAAC;YACpF,IAAI,SAAS,KAAK,CAAC;gBAAE,MAAM;YAC3B,MAAM,IAAI,SAAS,CAAC;QACtB,CAAC;QACD,IAAI,MAAM,GAAG,cAAc;YAAE,MAAM,IAAI,SAAS,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;QACzF,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACzC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,UAAU,EAAE,4BAA4B,CAAC,CAAC;QACrF,IAAI,CAAC;YACH,OAAO,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAClF,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,SAAS,CAAC,UAAU,EAAE,4BAA4B,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,KAA4E,EAC5E,OAAgB;IAEhB,OAAO,aAAa,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAClD,+EAA+E;QAC/E,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAC1B,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,EACnB,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAClD,CAAC;QACF,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/C,IAAI,OAAO,GACT,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAC1F,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC;QAChE,OAAO;YACL,IAAI;YACJ,OAAO,EAAE,OAAO,CAAC,IAAI;YACrB,SAAS;YACT,OAAO;YACP,UAAU;YACV,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,OAAO,GAAG,UAAU;SACrD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,MAAoB;IAChE,KAAK,IAAI,KAAK,GAAG,CAAC,GAAI,KAAK,EAAE,EAAE,CAAC;QAC9B,cAAc,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACrC,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,iBAAiB,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,IAAI,GAAG,IAAI,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,iBAAiB,CAAC;QAC/E,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACtD,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAC;YAC3F,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE;YAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAChE,IAAI,KAAK,KAAK,EAAE;YAAE,MAAM,IAAI,SAAS,CAAC,OAAO,EAAE,yBAAyB,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;QACpC,8EAA8E;QAC9E,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,MAAM,EAAE,CAAC;IACzE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAwC,EAAE,OAAgB;IACxF,OAAO,aAAa,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,KAAK,GAAG,cAAc;YAAE,MAAM,IAAI,SAAS,CAAC,gBAAgB,EAAE,uBAAuB,CAAC,CAAC;QAC3F,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3E,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE,MAAM,IAAI,SAAS,CAAC,UAAU,EAAE,yBAAyB,CAAC,CAAC;QACvF,IAAI,IAAI;YAAE,MAAM,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC;QAC9E,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC5E,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;gBAClF,IAAI,IAAI,EAAE,CAAC;oBACT,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;oBACrC,yEAAyE;oBACzE,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC;YACD,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;YAC7C,MAAM,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QACvC,CAAC;gBAAS,CAAC;YACT,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,KAAyD,EACzD,OAAgB;IAEhB,OAAO,aAAa,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,KAAK,GAAG,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,gBAAgB,EAAE,oCAAoC,CAAC,CAAC;QAC3F,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;YAC7C,MAAM,IAAI,SAAS,CAAC,gBAAgB,EAAE,qDAAqD,CAAC,CAAC;QAC/F,OAAO,SAAS,CACd;YACE,IAAI;YACJ,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;SACzF,EACD,OAAO,CACR,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,KAA+B,EAAE,OAAgB;IAC9E,OAAO,aAAa,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;QACrD,MAAM,OAAO,GAAyE,EAAE,CAAC;QACzF,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,KAAK,IAAI,MAAM,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9D,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;YAC7C,KAAK,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,IAAI,KAAK,GAAG,gBAAgB,EAAE,CAAC;gBACvD,SAAS,GAAG,IAAI,CAAC;gBACjB,MAAM;YACR,CAAC;YACD,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI,EAAE,KAAK,CAAC,cAAc,EAAE;oBAC1B,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE;wBACnB,CAAC,CAAC,WAAW;wBACb,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE;4BACd,CAAC,CAAC,MAAM;4BACR,CAAC,CAAC,OAAO;aAChB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAA8C,EAAE,OAAgB;IAC/F,OAAO,aAAa,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;QACrD,MAAM,OAAO,GAAmD,EAAE,CAAC;QACnE,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,KAAK,UAAU,UAAU,CAAC,IAAY;YACpC,IAAI,IAAY,CAAC;YACjB,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YAC9C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;gBAC/C,IACE,KAAK,YAAY,SAAS;oBAC1B,CAAC,gBAAgB,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAC/D,CAAC;oBACD,YAAY,EAAE,CAAC;oBACf,OAAO;gBACT,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAClC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;gBAClD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAE,CAAC;gBAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC1C,IAAI,KAAK,GAAG,CAAC;oBAAE,SAAS;gBACxB,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;gBAC3D,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;oBACpD,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,wBAAwB,CAAC,CAAC,IAAI,CAAC;gBAC9E,KAAK,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChE,IAAI,OAAO,CAAC,MAAM,KAAK,EAAE,IAAI,KAAK,GAAG,gBAAgB,EAAE,CAAC;oBACtD,SAAS,GAAG,IAAI,CAAC;oBACjB,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACzD,IAAI,IAAI,CAAC,SAAS;oBAAE,SAAS,GAAG,IAAI,CAAC;YACvC,CAAC;QACH,CAAC;QACD,KAAK,UAAU,IAAI,CAAC,IAAY,EAAE,KAAa;YAC7C,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;gBACf,SAAS,GAAG,IAAI,CAAC;gBACjB,OAAO;YACT,CAAC;YACD,KAAK,MAAM,KAAK,IAAI,MAAM,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC9D,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;gBAC/C,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE,IAAI,KAAK,GAAG,gBAAgB,EAAE,CAAC;oBACzE,SAAS,GAAG,IAAI,CAAC;oBACjB,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC;oBACH,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;wBAC/E,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;yBAC3C,IAAI,KAAK,CAAC,MAAM,EAAE;wBAAE,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;yBAC7D,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;wBAAE,YAAY,EAAE,CAAC;gBAC3E,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;oBAC/C,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;wBAAE,MAAM,KAAK,CAAC;oBAC1C,YAAY,EAAE,CAAC;gBACjB,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE;YAAE,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;;YACnD,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACzB,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import {\n access,\n lstat,\n mkdir,\n mkdtemp,\n open,\n readdir,\n readlink,\n realpath,\n rename,\n rm,\n stat,\n} from \"node:fs/promises\";\nimport { constants } from \"node:fs\";\nimport { basename, dirname, isAbsolute, join, resolve, sep } from \"node:path\";\nimport type { PipelineStepContext } from \"../core/pipeline-types.js\";\nimport { throwIfAborted } from \"../utilities/abort.js\";\nimport { ToolError } from \"./tools.js\";\nimport {\n MAX_FILE_BYTES,\n MAX_OUTPUT_BYTES,\n MAX_SEARCH_SNIPPET_BYTES,\n} from \"./default-tool-limits.js\";\n\ntype Context = Pick<PipelineStepContext<object>, \"cwd\" | \"signal\">;\n\nexport function clippedText(text: string, maxBytes = MAX_OUTPUT_BYTES) {\n const bytes = Buffer.from(text);\n return {\n text: new TextDecoder(\"utf-8\", { ignoreBOM: true }).decode(bytes.subarray(0, maxBytes), {\n stream: bytes.length > maxBytes,\n }),\n truncated: bytes.length > maxBytes,\n };\n}\n\nasync function sortedEntries(path: string, signal?: AbortSignal) {\n throwIfAborted(signal, \"List files\");\n const entries = await readdir(path, { withFileTypes: true });\n throwIfAborted(signal, \"List files\");\n return entries.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));\n}\n\nfunction unavailableEntry(error: unknown) {\n return (\n error instanceof Error &&\n \"code\" in error &&\n typeof error.code === \"string\" &&\n [\"EACCES\", \"EPERM\", \"ENOENT\", \"ENOTDIR\"].includes(error.code)\n );\n}\n\nasync function fileOperation<T>(context: Context, work: () => Promise<T>): Promise<T> {\n throwIfAborted(context.signal, \"Agent tool\");\n try {\n const result = await work();\n throwIfAborted(context.signal, \"Agent tool\");\n return result;\n } catch (error) {\n throwIfAborted(context.signal, \"Agent tool\");\n if (error instanceof Error && \"code\" in error && typeof error.code === \"string\")\n throw new ToolError(error.code, clippedText(error.message, 4096).text);\n throw error;\n }\n}\n\nasync function readText(path: string, signal?: AbortSignal): Promise<string> {\n throwIfAborted(signal, \"Read file\");\n const file = await open(path, constants.O_RDONLY | constants.O_NONBLOCK);\n try {\n const info = await file.stat();\n if (!info.isFile()) throw new ToolError(\"NOT_FILE\", \"Expected a regular file\");\n if (info.size > MAX_FILE_BYTES) throw new ToolError(\"FILE_TOO_LARGE\", \"File exceeds 1 MiB\");\n const buffer = Buffer.alloc(MAX_FILE_BYTES + 1);\n let length = 0;\n while (length < buffer.length) {\n throwIfAborted(signal, \"Read file\");\n const { bytesRead } = await file.read(buffer, length, buffer.length - length, null);\n if (bytesRead === 0) break;\n length += bytesRead;\n }\n if (length > MAX_FILE_BYTES) throw new ToolError(\"FILE_TOO_LARGE\", \"File exceeds 1 MiB\");\n const bytes = buffer.subarray(0, length);\n if (bytes.includes(0)) throw new ToolError(\"NOT_TEXT\", \"Expected a UTF-8 text file\");\n try {\n return new TextDecoder(\"utf-8\", { fatal: true, ignoreBOM: true }).decode(bytes);\n } catch {\n throw new ToolError(\"NOT_TEXT\", \"Expected a UTF-8 text file\");\n }\n } finally {\n await file.close();\n }\n}\n\nexport async function readTool(\n input: { path: string; startLine?: number | null; maxLines?: number | null },\n context: Context\n) {\n return fileOperation(context, async () => {\n const path = resolve(context.cwd, input.path);\n const text = await readText(path, context.signal);\n // Retain separators so each selected window is an exact substring of the file.\n const parts = text.length === 0 ? [] : text.split(/(\\r?\\n)/);\n const totalLines = Math.ceil(parts.length / 2);\n const startLine = input.startLine ?? 1;\n const selected = parts.slice(\n (startLine - 1) * 2,\n (startLine - 1 + (input.maxLines ?? 200)) * 2 - 1\n );\n const content = clippedText(selected.join(\"\"));\n let endLine =\n selected.length === 0 ? startLine - 1 : startLine + content.text.split(\"\\n\").length - 1;\n if (content.truncated && content.text.endsWith(\"\\n\")) endLine--;\n return {\n path,\n content: content.text,\n startLine,\n endLine,\n totalLines,\n truncated: content.truncated || endLine < totalLines,\n };\n });\n}\n\nasync function writeDestination(path: string, signal?: AbortSignal) {\n for (let links = 0; ; links++) {\n throwIfAborted(signal, \"Write file\");\n await mkdir(dirname(path), { recursive: true });\n const trailingSeparator = path.endsWith(sep) || path.endsWith(\"/\") ? sep : \"\";\n path = join(await realpath(dirname(path)), basename(path)) + trailingSeparator;\n const info = await lstat(path).catch((error: unknown) => {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") return undefined;\n throw error;\n });\n if (!info?.isSymbolicLink()) return { destination: path, info };\n if (links === 40) throw new ToolError(\"ELOOP\", \"Too many symbolic links\");\n const target = await readlink(path);\n // Let the filesystem resolve directory symlinks before interpreting any '..'.\n path = isAbsolute(target) ? target : `${dirname(path)}${sep}${target}`;\n }\n}\n\nexport async function writeTool(input: { path: string; content: string }, context: Context) {\n return fileOperation(context, async () => {\n const path = resolve(context.cwd, input.path);\n const bytes = Buffer.byteLength(input.content);\n if (bytes > MAX_FILE_BYTES) throw new ToolError(\"FILE_TOO_LARGE\", \"Content exceeds 1 MiB\");\n const { destination, info } = await writeDestination(path, context.signal);\n if (info && !info.isFile()) throw new ToolError(\"NOT_FILE\", \"Expected a regular file\");\n if (info) await access(destination, constants.W_OK);\n const staging = await mkdtemp(join(dirname(destination), \".tubeless-write-\"));\n try {\n const temporary = join(staging, \"content\");\n const file = await open(temporary, \"wx\", info ? info.mode & 0o7777 : 0o666);\n try {\n await file.writeFile(input.content, { encoding: \"utf8\", signal: context.signal });\n if (info) {\n await file.chown(info.uid, info.gid);\n // Creation and ownership changes can alter mode bits; restore them last.\n await file.chmod(info.mode & 0o7777);\n }\n } finally {\n await file.close();\n }\n throwIfAborted(context.signal, \"Write file\");\n await rename(temporary, destination);\n } finally {\n await rm(staging, { recursive: true, force: true });\n }\n return { path, bytes };\n });\n}\n\nexport async function editTool(\n input: { path: string; oldText: string; newText: string },\n context: Context\n) {\n return fileOperation(context, async () => {\n const path = resolve(context.cwd, input.path);\n const text = await readText(path, context.signal);\n const index = text.indexOf(input.oldText);\n if (index < 0) throw new ToolError(\"EDIT_NOT_FOUND\", \"oldText does not occur in the file\");\n if (text.indexOf(input.oldText, index + 1) >= 0)\n throw new ToolError(\"EDIT_AMBIGUOUS\", \"oldText occurs more than once; include more context\");\n return writeTool(\n {\n path,\n content: text.slice(0, index) + input.newText + text.slice(index + input.oldText.length),\n },\n context\n );\n });\n}\n\nexport async function listTool(input: { path?: string | null }, context: Context) {\n return fileOperation(context, async () => {\n const path = resolve(context.cwd, input.path ?? \".\");\n const entries: { name: string; kind: \"file\" | \"directory\" | \"symlink\" | \"other\" }[] = [];\n let truncated = false;\n let bytes = 0;\n for (const entry of await sortedEntries(path, context.signal)) {\n throwIfAborted(context.signal, \"List files\");\n bytes += Buffer.byteLength(entry.name);\n if (entries.length === 200 || bytes > MAX_OUTPUT_BYTES) {\n truncated = true;\n break;\n }\n entries.push({\n name: entry.name,\n kind: entry.isSymbolicLink()\n ? \"symlink\"\n : entry.isDirectory()\n ? \"directory\"\n : entry.isFile()\n ? \"file\"\n : \"other\",\n });\n }\n return { path, entries, truncated };\n });\n}\n\nexport async function searchTool(input: { query: string; path?: string | null }, context: Context) {\n return fileOperation(context, async () => {\n const root = resolve(context.cwd, input.path ?? \".\");\n const matches: { path: string; line: number; text: string }[] = [];\n let entries = 0;\n let bytes = 0;\n let truncated = false;\n let skippedFiles = 0;\n async function searchFile(path: string) {\n let text: string;\n try {\n text = await readText(path, context.signal);\n } catch (error) {\n throwIfAborted(context.signal, \"Search files\");\n if (\n error instanceof ToolError &&\n [\"FILE_TOO_LARGE\", \"NOT_TEXT\", \"NOT_FILE\"].includes(error.code)\n ) {\n skippedFiles++;\n return;\n }\n throw error;\n }\n const lines = text.split(/\\r?\\n/);\n for (let index = 0; index < lines.length; index++) {\n const source = lines[index]!;\n const match = source.indexOf(input.query);\n if (match < 0) continue;\n const line = clippedText(source, MAX_SEARCH_SNIPPET_BYTES);\n if (line.truncated && !line.text.includes(input.query))\n line.text = clippedText(source.slice(match), MAX_SEARCH_SNIPPET_BYTES).text;\n bytes += Buffer.byteLength(path) + Buffer.byteLength(line.text);\n if (matches.length === 50 || bytes > MAX_OUTPUT_BYTES) {\n truncated = true;\n return;\n }\n matches.push({ path, line: index + 1, text: line.text });\n if (line.truncated) truncated = true;\n }\n }\n async function walk(path: string, depth: number): Promise<void> {\n if (depth > 32) {\n truncated = true;\n return;\n }\n for (const entry of await sortedEntries(path, context.signal)) {\n throwIfAborted(context.signal, \"Search files\");\n if (++entries > 2000 || matches.length >= 50 || bytes > MAX_OUTPUT_BYTES) {\n truncated = true;\n return;\n }\n try {\n if (entry.isDirectory() && entry.name !== \".git\" && entry.name !== \"node_modules\")\n await walk(join(path, entry.name), depth + 1);\n else if (entry.isFile()) await searchFile(join(path, entry.name));\n else if (!entry.isDirectory() && !entry.isSymbolicLink()) skippedFiles++;\n } catch (error) {\n throwIfAborted(context.signal, \"Search files\");\n if (!unavailableEntry(error)) throw error;\n skippedFiles++;\n }\n }\n }\n if ((await stat(root)).isFile()) await searchFile(root);\n else await walk(root, 0);\n return { matches, truncated, skippedFiles };\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"default-tool-files.js","sourceRoot":"","sources":["../../src/agent/default-tool-files.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n access,\n lstat,\n mkdir,\n mkdtemp,\n open,\n readdir,\n readlink,\n realpath,\n rename,\n rm,\n stat,\n} from \"node:fs/promises\";\nimport { constants } from \"node:fs\";\nimport { basename, dirname, isAbsolute, join, resolve, sep } from \"node:path\";\nimport type { PipelineStepContext } from \"../core/pipeline-types.js\";\nimport { throwIfAborted } from \"../utilities/abort.js\";\nimport { ToolError } from \"./tools.js\";\nimport {\n MAX_FILE_BYTES,\n MAX_OUTPUT_BYTES,\n MAX_SEARCH_SNIPPET_BYTES,\n} from \"./default-tool-limits.js\";\n\ntype Context = Pick<PipelineStepContext<object>, \"cwd\" | \"signal\">;\n\nexport function clippedText(text: string, maxBytes = MAX_OUTPUT_BYTES) {\n const bytes = Buffer.from(text);\n return {\n text: new TextDecoder(\"utf-8\", { ignoreBOM: true }).decode(bytes.subarray(0, maxBytes), {\n stream: bytes.length > maxBytes,\n }),\n truncated: bytes.length > maxBytes,\n };\n}\n\nasync function sortedEntries(path: string, signal?: AbortSignal) {\n throwIfAborted(signal, \"List files\");\n const entries = await readdir(path, { withFileTypes: true });\n throwIfAborted(signal, \"List files\");\n return entries.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));\n}\n\nfunction unavailableEntry(error: unknown) {\n return (\n error instanceof Error &&\n \"code\" in error &&\n typeof error.code === \"string\" &&\n [\"EACCES\", \"EPERM\", \"ENOENT\", \"ENOTDIR\"].includes(error.code)\n );\n}\n\nasync function fileOperation<T>(context: Context, work: () => Promise<T>): Promise<T> {\n throwIfAborted(context.signal, \"Agent tool\");\n try {\n const result = await work();\n throwIfAborted(context.signal, \"Agent tool\");\n return result;\n } catch (error) {\n throwIfAborted(context.signal, \"Agent tool\");\n if (error instanceof Error && \"code\" in error && typeof error.code === \"string\")\n throw new ToolError(error.code, clippedText(error.message, 4096).text);\n throw error;\n }\n}\n\nasync function readText(path: string, signal?: AbortSignal): Promise<string> {\n throwIfAborted(signal, \"Read file\");\n const file = await open(path, constants.O_RDONLY | constants.O_NONBLOCK);\n try {\n const info = await file.stat();\n if (!info.isFile()) throw new ToolError(\"NOT_FILE\", \"Expected a regular file\");\n if (info.size > MAX_FILE_BYTES) throw new ToolError(\"FILE_TOO_LARGE\", \"File exceeds 1 MiB\");\n const buffer = Buffer.alloc(MAX_FILE_BYTES + 1);\n let length = 0;\n while (length < buffer.length) {\n throwIfAborted(signal, \"Read file\");\n const { bytesRead } = await file.read(buffer, length, buffer.length - length, null);\n if (bytesRead === 0) break;\n length += bytesRead;\n }\n if (length > MAX_FILE_BYTES) throw new ToolError(\"FILE_TOO_LARGE\", \"File exceeds 1 MiB\");\n const bytes = buffer.subarray(0, length);\n if (bytes.includes(0)) throw new ToolError(\"NOT_TEXT\", \"Expected a UTF-8 text file\");\n try {\n return new TextDecoder(\"utf-8\", { fatal: true, ignoreBOM: true }).decode(bytes);\n } catch {\n throw new ToolError(\"NOT_TEXT\", \"Expected a UTF-8 text file\");\n }\n } finally {\n await file.close();\n }\n}\n\nexport async function readTool(\n input: { path: string; startLine?: number | null; maxLines?: number | null },\n context: Context\n) {\n return fileOperation(context, async () => {\n const path = resolve(context.cwd, input.path);\n const text = await readText(path, context.signal);\n // Retain separators so each selected window is an exact substring of the file.\n const parts = text.length === 0 ? [] : text.split(/(\\r?\\n)/);\n const totalLines = Math.ceil(parts.length / 2);\n const startLine = input.startLine ?? 1;\n const selected = parts.slice(\n (startLine - 1) * 2,\n (startLine - 1 + (input.maxLines ?? 200)) * 2 - 1\n );\n const content = clippedText(selected.join(\"\"));\n let endLine =\n selected.length === 0 ? startLine - 1 : startLine + content.text.split(\"\\n\").length - 1;\n if (content.truncated && content.text.endsWith(\"\\n\")) endLine--;\n return {\n path,\n content: content.text,\n startLine,\n endLine,\n totalLines,\n truncated: content.truncated || endLine < totalLines,\n };\n });\n}\n\nasync function writeDestination(path: string, signal?: AbortSignal) {\n for (let links = 0; ; links++) {\n throwIfAborted(signal, \"Write file\");\n await mkdir(dirname(path), { recursive: true });\n const trailingSeparator = path.endsWith(sep) || path.endsWith(\"/\") ? sep : \"\";\n path = join(await realpath(dirname(path)), basename(path)) + trailingSeparator;\n const info = await lstat(path).catch((error: unknown) => {\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") return undefined;\n throw error;\n });\n if (!info?.isSymbolicLink()) return { destination: path, info };\n if (links === 40) throw new ToolError(\"ELOOP\", \"Too many symbolic links\");\n const target = await readlink(path);\n // Let the filesystem resolve directory symlinks before interpreting any '..'.\n path = isAbsolute(target) ? target : `${dirname(path)}${sep}${target}`;\n }\n}\n\n// Serialize writes per file within this process so concurrent edits in one tool batch\n// cannot read the same original text and silently overwrite each other.\nconst pathLocks = new Map<string, Promise<void>>();\n\nasync function withPathLock<T>(path: string, work: () => Promise<T>): Promise<T> {\n const key = await realpath(path).catch(() => path);\n const previous = pathLocks.get(key) ?? Promise.resolve();\n const current = previous.then(work);\n const settled = current.then(\n () => undefined,\n () => undefined\n );\n pathLocks.set(key, settled);\n try {\n return await current;\n } finally {\n if (pathLocks.get(key) === settled) pathLocks.delete(key);\n }\n}\n\nasync function writeContent(path: string, content: string, context: Context) {\n const bytes = Buffer.byteLength(content);\n if (bytes > MAX_FILE_BYTES) throw new ToolError(\"FILE_TOO_LARGE\", \"Content exceeds 1 MiB\");\n const { destination, info } = await writeDestination(path, context.signal);\n if (info && !info.isFile()) throw new ToolError(\"NOT_FILE\", \"Expected a regular file\");\n if (info) await access(destination, constants.W_OK);\n const staging = await mkdtemp(join(dirname(destination), \".tubeless-write-\"));\n try {\n const temporary = join(staging, \"content\");\n const file = await open(temporary, \"wx\", info ? info.mode & 0o7777 : 0o666);\n try {\n await file.writeFile(content, { encoding: \"utf8\", signal: context.signal });\n if (info) {\n await file.chown(info.uid, info.gid);\n // Creation and ownership changes can alter mode bits; restore them last.\n await file.chmod(info.mode & 0o7777);\n }\n } finally {\n await file.close();\n }\n throwIfAborted(context.signal, \"Write file\");\n await rename(temporary, destination);\n } finally {\n await rm(staging, { recursive: true, force: true });\n }\n return { path, bytes };\n}\n\nexport async function writeTool(input: { path: string; content: string }, context: Context) {\n return fileOperation(context, async () => {\n const path = resolve(context.cwd, input.path);\n return withPathLock(path, () => writeContent(path, input.content, context));\n });\n}\n\nexport async function editTool(\n input: { path: string; oldText: string; newText: string },\n context: Context\n) {\n return fileOperation(context, async () => {\n const path = resolve(context.cwd, input.path);\n return withPathLock(path, async () => {\n const text = await readText(path, context.signal);\n const index = text.indexOf(input.oldText);\n if (index < 0) throw new ToolError(\"EDIT_NOT_FOUND\", \"oldText does not occur in the file\");\n if (text.indexOf(input.oldText, index + 1) >= 0)\n throw new ToolError(\n \"EDIT_AMBIGUOUS\",\n \"oldText occurs more than once; include more context\"\n );\n const content =\n text.slice(0, index) + input.newText + text.slice(index + input.oldText.length);\n return writeContent(path, content, context);\n });\n });\n}\n\nexport async function listTool(input: { path?: string | null }, context: Context) {\n return fileOperation(context, async () => {\n const path = resolve(context.cwd, input.path ?? \".\");\n const entries: { name: string; kind: \"file\" | \"directory\" | \"symlink\" | \"other\" }[] = [];\n let truncated = false;\n let bytes = 0;\n for (const entry of await sortedEntries(path, context.signal)) {\n throwIfAborted(context.signal, \"List files\");\n bytes += Buffer.byteLength(entry.name);\n if (entries.length === 200 || bytes > MAX_OUTPUT_BYTES) {\n truncated = true;\n break;\n }\n entries.push({\n name: entry.name,\n kind: entry.isSymbolicLink()\n ? \"symlink\"\n : entry.isDirectory()\n ? \"directory\"\n : entry.isFile()\n ? \"file\"\n : \"other\",\n });\n }\n return { path, entries, truncated };\n });\n}\n\nexport async function searchTool(input: { query: string; path?: string | null }, context: Context) {\n return fileOperation(context, async () => {\n const root = resolve(context.cwd, input.path ?? \".\");\n const matches: { path: string; line: number; text: string }[] = [];\n let entries = 0;\n let bytes = 0;\n let truncated = false;\n let skippedFiles = 0;\n async function searchFile(path: string) {\n let text: string;\n try {\n text = await readText(path, context.signal);\n } catch (error) {\n throwIfAborted(context.signal, \"Search files\");\n if (\n error instanceof ToolError &&\n [\"FILE_TOO_LARGE\", \"NOT_TEXT\", \"NOT_FILE\"].includes(error.code)\n ) {\n skippedFiles++;\n return;\n }\n throw error;\n }\n const lines = text.split(/\\r?\\n/);\n for (let index = 0; index < lines.length; index++) {\n const source = lines[index]!;\n const match = source.indexOf(input.query);\n if (match < 0) continue;\n const line = clippedText(source, MAX_SEARCH_SNIPPET_BYTES);\n if (line.truncated && !line.text.includes(input.query))\n line.text = clippedText(source.slice(match), MAX_SEARCH_SNIPPET_BYTES).text;\n bytes += Buffer.byteLength(path) + Buffer.byteLength(line.text);\n if (matches.length === 50 || bytes > MAX_OUTPUT_BYTES) {\n truncated = true;\n return;\n }\n matches.push({ path, line: index + 1, text: line.text });\n if (line.truncated) truncated = true;\n }\n }\n async function walk(path: string, depth: number): Promise<void> {\n if (depth > 32) {\n truncated = true;\n return;\n }\n for (const entry of await sortedEntries(path, context.signal)) {\n throwIfAborted(context.signal, \"Search files\");\n if (++entries > 2000 || matches.length >= 50 || bytes > MAX_OUTPUT_BYTES) {\n truncated = true;\n return;\n }\n try {\n if (entry.isDirectory() && entry.name !== \".git\" && entry.name !== \"node_modules\")\n await walk(join(path, entry.name), depth + 1);\n else if (entry.isFile()) await searchFile(join(path, entry.name));\n else if (!entry.isDirectory() && !entry.isSymbolicLink()) skippedFiles++;\n } catch (error) {\n throwIfAborted(context.signal, \"Search files\");\n if (!unavailableEntry(error)) throw error;\n skippedFiles++;\n }\n }\n }\n if ((await stat(root)).isFile()) await searchFile(root);\n else await walk(root, 0);\n return { matches, truncated, skippedFiles };\n });\n}\n"]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { wireArray, wireBoolean, wireCustom, wireEnum, wireNumber, wireObject, wireRefine, wireString, wireUnion, } from "../tracing/wire-schema.js";
|
|
2
2
|
import { optionalToolField, toolObject } from "./default-tool-schema.js";
|
|
3
|
-
import {
|
|
3
|
+
import { defineToolWithActivity } from "./tools.js";
|
|
4
4
|
import { environmentOperation } from "./environment.js";
|
|
5
|
+
import { toolPreview } from "./tool-progress.js";
|
|
5
6
|
import { MAX_FILE_BYTES, MAX_OUTPUT_BYTES, MAX_SEARCH_SNIPPET_BYTES, } from "./default-tool-limits.js";
|
|
6
7
|
const path = wireString({ maxLength: 4096 });
|
|
7
8
|
function utf8Text(maxBytes, allowEmpty = true) {
|
|
@@ -41,8 +42,18 @@ const listEntries = wireRefine(wireArray(wireObject({
|
|
|
41
42
|
const searchMatches = wireRefine(wireArray(wireObject({ path, line: count, text: utf8Text(MAX_SEARCH_SNIPPET_BYTES) }), {
|
|
42
43
|
maxItems: 50,
|
|
43
44
|
}), (matches) => checkOutputBytes(matches.flatMap(({ path, text }) => [path, text])));
|
|
45
|
+
// Read-only handlers run identically in live executions and previews.
|
|
46
|
+
function read(input, context) {
|
|
47
|
+
return environmentOperation(context, () => context.environment.read(input, context));
|
|
48
|
+
}
|
|
49
|
+
function list(input, context) {
|
|
50
|
+
return environmentOperation(context, () => context.environment.list(input, context));
|
|
51
|
+
}
|
|
52
|
+
function search(input, context) {
|
|
53
|
+
return environmentOperation(context, () => context.environment.search(input, context));
|
|
54
|
+
}
|
|
44
55
|
export const defaultTools = Object.freeze({
|
|
45
|
-
read:
|
|
56
|
+
read: defineToolWithActivity({
|
|
46
57
|
replay: "safe",
|
|
47
58
|
description: "Read a UTF-8 file up to 1 MiB. Paths resolve from the run cwd. startLine is 1-based (default 1); maxLines defaults to 200. Output is capped at 16 KiB. Use null for defaults.",
|
|
48
59
|
inputSchema: toolObject({
|
|
@@ -58,16 +69,22 @@ export const defaultTools = Object.freeze({
|
|
|
58
69
|
totalLines: count,
|
|
59
70
|
truncated: wireBoolean(),
|
|
60
71
|
}),
|
|
61
|
-
run:
|
|
62
|
-
dryRun:
|
|
72
|
+
run: read,
|
|
73
|
+
dryRun: read,
|
|
74
|
+
action: (input) => `Read ${toolPreview(input.path)}`,
|
|
75
|
+
summarize: (result) => result.totalLines === 0
|
|
76
|
+
? "empty file"
|
|
77
|
+
: `lines ${result.startLine}-${result.endLine} of ${result.totalLines}${result.truncated ? ", truncated" : ""}`,
|
|
63
78
|
}),
|
|
64
|
-
write:
|
|
79
|
+
write: defineToolWithActivity({
|
|
65
80
|
description: "Create or replace a UTF-8 file (up to 1 MiB), creating parent directories and following symlinks, including missing targets. Paths resolve from the run cwd. Atomic replacement requires a writable parent directory and permission to preserve existing ownership. Skipped in dry runs.",
|
|
66
81
|
inputSchema: toolObject({ path, content: text }),
|
|
67
82
|
outputSchema: written,
|
|
68
83
|
run: (input, context) => environmentOperation(context, () => context.environment.write(input, context)),
|
|
84
|
+
action: (input) => `Write ${toolPreview(input.path)}`,
|
|
85
|
+
summarize: (result) => `${result.bytes} bytes`,
|
|
69
86
|
}),
|
|
70
|
-
edit:
|
|
87
|
+
edit: defineToolWithActivity({
|
|
71
88
|
description: "Replace one exact occurrence of oldText with newText in a UTF-8 file up to 1 MiB. Missing or ambiguous matches fail without writing. Atomic replacement requires a writable parent directory and permission to preserve existing ownership. Skipped in dry runs.",
|
|
72
89
|
inputSchema: toolObject({
|
|
73
90
|
path,
|
|
@@ -76,8 +93,10 @@ export const defaultTools = Object.freeze({
|
|
|
76
93
|
}),
|
|
77
94
|
outputSchema: written,
|
|
78
95
|
run: (input, context) => environmentOperation(context, () => context.environment.edit(input, context)),
|
|
96
|
+
action: (input) => `Edit ${toolPreview(input.path)}`,
|
|
97
|
+
summarize: (result) => `${result.bytes} bytes`,
|
|
79
98
|
}),
|
|
80
|
-
bash:
|
|
99
|
+
bash: defineToolWithActivity({
|
|
81
100
|
description: "Run bash in the run cwd or a supplied cwd. Return stdout, stderr, exitCode, signal, timedOut and truncated. timeoutMs defaults to 30000 (maximum 300000); combined output is capped at 16 KiB. Use null for defaults. Skipped in dry runs.",
|
|
82
101
|
inputSchema: toolObject({
|
|
83
102
|
command: wireString({ maxLength: 32_768 }),
|
|
@@ -94,8 +113,10 @@ export const defaultTools = Object.freeze({
|
|
|
94
113
|
truncated: wireBoolean(),
|
|
95
114
|
}, ({ stdout, stderr }) => checkOutputBytes([stdout, stderr])),
|
|
96
115
|
run: (input, context) => environmentOperation(context, () => context.environment.bash(input, context)),
|
|
116
|
+
action: (input) => `Run bash ${toolPreview(input.command)}${input.cwd ? ` in ${toolPreview(input.cwd)}` : ""}`,
|
|
117
|
+
summarize: (result) => `exit ${result.exitCode ?? result.signal ?? "unknown"}${result.timedOut ? ", timed out" : ""}${result.truncated ? ", output truncated" : ""}`,
|
|
97
118
|
}),
|
|
98
|
-
list:
|
|
119
|
+
list: defineToolWithActivity({
|
|
99
120
|
replay: "safe",
|
|
100
121
|
description: "List up to 200 entries in filename order, defaulting to the run cwd. Retained names are capped at 16 KiB. Return names and file/directory/symlink kinds. Use null for the default path.",
|
|
101
122
|
inputSchema: toolObject({ path: optionalToolField(path) }),
|
|
@@ -104,10 +125,12 @@ export const defaultTools = Object.freeze({
|
|
|
104
125
|
entries: listEntries,
|
|
105
126
|
truncated: wireBoolean(),
|
|
106
127
|
}),
|
|
107
|
-
run:
|
|
108
|
-
dryRun:
|
|
128
|
+
run: list,
|
|
129
|
+
dryRun: list,
|
|
130
|
+
action: (input) => `List ${toolPreview(input.path ?? ".")}`,
|
|
131
|
+
summarize: (result) => `${result.entries.length} ${result.entries.length === 1 ? "entry" : "entries"}${result.truncated ? ", truncated" : ""}`,
|
|
109
132
|
}),
|
|
110
|
-
search:
|
|
133
|
+
search: defineToolWithActivity({
|
|
111
134
|
replay: "safe",
|
|
112
135
|
description: "Search for literal, case-sensitive text in a file or directory (default run cwd), traversing entries in filename order. Skip .git, node_modules and nested symlinks. Count binary/oversized files (over 1 MiB) and unavailable descendants in skippedFiles. Examine at most 2000 entries and 32 directory levels; return up to 50 matching lines and 16 KiB. Long-line snippets shift to the match and cap at 1024 bytes. Use null for the default path.",
|
|
113
136
|
inputSchema: toolObject({
|
|
@@ -119,8 +142,10 @@ export const defaultTools = Object.freeze({
|
|
|
119
142
|
truncated: wireBoolean(),
|
|
120
143
|
skippedFiles: count,
|
|
121
144
|
}),
|
|
122
|
-
run:
|
|
123
|
-
dryRun:
|
|
145
|
+
run: search,
|
|
146
|
+
dryRun: search,
|
|
147
|
+
action: (input) => `Search ${toolPreview(input.query)} in ${toolPreview(input.path ?? ".")}`,
|
|
148
|
+
summarize: (result) => `${result.matches.length} ${result.matches.length === 1 ? "match" : "matches"}${result.truncated ? ", truncated" : ""}, ${result.skippedFiles} files skipped`,
|
|
124
149
|
}),
|
|
125
150
|
});
|
|
126
151
|
//# sourceMappingURL=default-tools.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-tools.js","sourceRoot":"","sources":["../../src/agent/default-tools.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n wireArray,\n wireBoolean,\n wireCustom,\n wireEnum,\n wireNumber,\n wireObject,\n wireRefine,\n wireString,\n wireUnion,\n type WireSchema,\n} from \"../tracing/wire-schema.js\";\nimport { optionalToolField, toolObject } from \"./default-tool-schema.js\";\nimport { defineTool } from \"./tools.js\";\nimport { environmentOperation, type AgentEnvironment } from \"./environment.js\";\nimport {\n MAX_FILE_BYTES,\n MAX_OUTPUT_BYTES,\n MAX_SEARCH_SNIPPET_BYTES,\n} from \"./default-tool-limits.js\";\n\nconst path = wireString({ maxLength: 4096 });\nfunction utf8Text(maxBytes: number, allowEmpty = true) {\n return wireRefine(wireString({ allowEmpty, maxLength: maxBytes }), (value) => {\n if (new TextEncoder().encode(value).length > maxBytes)\n throw new Error(`Text exceeds ${maxBytes} UTF-8 bytes`);\n });\n}\n\nfunction checkOutputBytes(parts: readonly string[]) {\n const encoder = new TextEncoder();\n let bytes = 0;\n for (const part of parts) {\n bytes += encoder.encode(part).length;\n if (bytes > MAX_OUTPUT_BYTES)\n throw new Error(`Tool output content exceeds ${MAX_OUTPUT_BYTES} UTF-8 bytes`);\n }\n}\n\nconst text = utf8Text(MAX_FILE_BYTES);\nconst count = wireNumber({ integer: true, minimum: 0 });\nfunction positive(maximum: number) {\n const number = wireNumber({ integer: true, minimum: 1 });\n return wireRefine(\n number,\n (value) => {\n if (value > maximum) throw new Error(`Expected a value at most ${maximum}`);\n },\n { ...number.jsonSchema, maximum }\n );\n}\nconst nullValue = wireCustom<null>({ type: \"null\" }, (value) => {\n if (value !== null) throw new Error(\"Expected null\");\n return null;\n});\nconst written = toolObject({ path, bytes: count });\nconst listEntries: WireSchema<Readonly<Awaited<ReturnType<AgentEnvironment[\"list\"]>>[\"entries\"]>> =\n wireRefine(\n wireArray(\n wireObject({\n name: path,\n kind: wireEnum([\"file\", \"directory\", \"symlink\", \"other\"] as const),\n }),\n { maxItems: 200 }\n ),\n (entries) => checkOutputBytes(entries.map(({ name }) => name))\n );\nconst searchMatches: WireSchema<\n Readonly<Awaited<ReturnType<AgentEnvironment[\"search\"]>>[\"matches\"]>\n> = wireRefine(\n wireArray(wireObject({ path, line: count, text: utf8Text(MAX_SEARCH_SNIPPET_BYTES) }), {\n maxItems: 50,\n }),\n (matches) => checkOutputBytes(matches.flatMap(({ path, text }) => [path, text]))\n);\n\nexport const defaultTools = Object.freeze({\n read: defineTool({\n replay: \"safe\",\n description:\n \"Read a UTF-8 file up to 1 MiB. Paths resolve from the run cwd. startLine is 1-based (default 1); maxLines defaults to 200. Output is capped at 16 KiB. Use null for defaults.\",\n inputSchema: toolObject({\n path,\n startLine: optionalToolField(positive(Number.MAX_SAFE_INTEGER)),\n maxLines: optionalToolField(positive(2000)),\n }),\n outputSchema: toolObject({\n path,\n content: utf8Text(MAX_OUTPUT_BYTES),\n startLine: count,\n endLine: count,\n totalLines: count,\n truncated: wireBoolean(),\n }),\n run: (input, context) =>\n environmentOperation(context, () => context.environment.read(input, context)),\n dryRun: (input, context) =>\n environmentOperation(context, () => context.environment.read(input, context)),\n }),\n write: defineTool({\n description:\n \"Create or replace a UTF-8 file (up to 1 MiB), creating parent directories and following symlinks, including missing targets. Paths resolve from the run cwd. Atomic replacement requires a writable parent directory and permission to preserve existing ownership. Skipped in dry runs.\",\n inputSchema: toolObject({ path, content: text }),\n outputSchema: written,\n run: (input, context) =>\n environmentOperation(context, () => context.environment.write(input, context)),\n }),\n edit: defineTool({\n description:\n \"Replace one exact occurrence of oldText with newText in a UTF-8 file up to 1 MiB. Missing or ambiguous matches fail without writing. Atomic replacement requires a writable parent directory and permission to preserve existing ownership. Skipped in dry runs.\",\n inputSchema: toolObject({\n path,\n oldText: utf8Text(MAX_FILE_BYTES, false),\n newText: text,\n }),\n outputSchema: written,\n run: (input, context) =>\n environmentOperation(context, () => context.environment.edit(input, context)),\n }),\n bash: defineTool({\n description:\n \"Run bash in the run cwd or a supplied cwd. Return stdout, stderr, exitCode, signal, timedOut and truncated. timeoutMs defaults to 30000 (maximum 300000); combined output is capped at 16 KiB. Use null for defaults. Skipped in dry runs.\",\n inputSchema: toolObject({\n command: wireString({ maxLength: 32_768 }),\n cwd: optionalToolField(path),\n timeoutMs: optionalToolField(positive(300_000)),\n }),\n outputSchema: toolObject(\n {\n cwd: path,\n stdout: utf8Text(MAX_OUTPUT_BYTES),\n stderr: utf8Text(MAX_OUTPUT_BYTES),\n exitCode: wireUnion([count, nullValue]),\n signal: wireUnion([path, nullValue]),\n timedOut: wireBoolean(),\n truncated: wireBoolean(),\n },\n ({ stdout, stderr }) => checkOutputBytes([stdout, stderr])\n ),\n run: (input, context) =>\n environmentOperation(context, () => context.environment.bash(input, context)),\n }),\n list: defineTool({\n replay: \"safe\",\n description:\n \"List up to 200 entries in filename order, defaulting to the run cwd. Retained names are capped at 16 KiB. Return names and file/directory/symlink kinds. Use null for the default path.\",\n inputSchema: toolObject({ path: optionalToolField(path) }),\n outputSchema: toolObject({\n path,\n entries: listEntries,\n truncated: wireBoolean(),\n }),\n run: (input, context) =>\n environmentOperation(context, () => context.environment.list(input, context)),\n dryRun: (input, context) =>\n environmentOperation(context, () => context.environment.list(input, context)),\n }),\n search: defineTool({\n replay: \"safe\",\n description:\n \"Search for literal, case-sensitive text in a file or directory (default run cwd), traversing entries in filename order. Skip .git, node_modules and nested symlinks. Count binary/oversized files (over 1 MiB) and unavailable descendants in skippedFiles. Examine at most 2000 entries and 32 directory levels; return up to 50 matching lines and 16 KiB. Long-line snippets shift to the match and cap at 1024 bytes. Use null for the default path.\",\n inputSchema: toolObject({\n query: wireString({ maxLength: 4096 }),\n path: optionalToolField(path),\n }),\n outputSchema: toolObject({\n matches: searchMatches,\n truncated: wireBoolean(),\n skippedFiles: count,\n }),\n run: (input, context) =>\n environmentOperation(context, () => context.environment.search(input, context)),\n dryRun: (input, context) =>\n environmentOperation(context, () => context.environment.search(input, context)),\n }),\n});\n\n/** The read, write, edit, bash, list and search tools included in every agent. */\nexport type DefaultAgentTools = typeof defaultTools;\n"]}
|
|
1
|
+
{"version":3,"file":"default-tools.js","sourceRoot":"","sources":["../../src/agent/default-tools.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n wireArray,\n wireBoolean,\n wireCustom,\n wireEnum,\n wireNumber,\n wireObject,\n wireRefine,\n wireString,\n wireUnion,\n type WireSchema,\n} from \"../tracing/wire-schema.js\";\nimport { optionalToolField, toolObject } from \"./default-tool-schema.js\";\nimport { defineToolWithActivity } from \"./tools.js\";\nimport { environmentOperation, type AgentEnvironment } from \"./environment.js\";\nimport { toolPreview } from \"./tool-progress.js\";\nimport type { AgentToolContext } from \"./agent-types.js\";\nimport {\n MAX_FILE_BYTES,\n MAX_OUTPUT_BYTES,\n MAX_SEARCH_SNIPPET_BYTES,\n} from \"./default-tool-limits.js\";\n\nconst path = wireString({ maxLength: 4096 });\nfunction utf8Text(maxBytes: number, allowEmpty = true) {\n return wireRefine(wireString({ allowEmpty, maxLength: maxBytes }), (value) => {\n if (new TextEncoder().encode(value).length > maxBytes)\n throw new Error(`Text exceeds ${maxBytes} UTF-8 bytes`);\n });\n}\n\nfunction checkOutputBytes(parts: readonly string[]) {\n const encoder = new TextEncoder();\n let bytes = 0;\n for (const part of parts) {\n bytes += encoder.encode(part).length;\n if (bytes > MAX_OUTPUT_BYTES)\n throw new Error(`Tool output content exceeds ${MAX_OUTPUT_BYTES} UTF-8 bytes`);\n }\n}\n\nconst text = utf8Text(MAX_FILE_BYTES);\nconst count = wireNumber({ integer: true, minimum: 0 });\nfunction positive(maximum: number) {\n const number = wireNumber({ integer: true, minimum: 1 });\n return wireRefine(\n number,\n (value) => {\n if (value > maximum) throw new Error(`Expected a value at most ${maximum}`);\n },\n { ...number.jsonSchema, maximum }\n );\n}\nconst nullValue = wireCustom<null>({ type: \"null\" }, (value) => {\n if (value !== null) throw new Error(\"Expected null\");\n return null;\n});\nconst written = toolObject({ path, bytes: count });\nconst listEntries: WireSchema<Readonly<Awaited<ReturnType<AgentEnvironment[\"list\"]>>[\"entries\"]>> =\n wireRefine(\n wireArray(\n wireObject({\n name: path,\n kind: wireEnum([\"file\", \"directory\", \"symlink\", \"other\"] as const),\n }),\n { maxItems: 200 }\n ),\n (entries) => checkOutputBytes(entries.map(({ name }) => name))\n );\nconst searchMatches: WireSchema<\n Readonly<Awaited<ReturnType<AgentEnvironment[\"search\"]>>[\"matches\"]>\n> = wireRefine(\n wireArray(wireObject({ path, line: count, text: utf8Text(MAX_SEARCH_SNIPPET_BYTES) }), {\n maxItems: 50,\n }),\n (matches) => checkOutputBytes(matches.flatMap(({ path, text }) => [path, text]))\n);\n\n// Read-only handlers run identically in live executions and previews.\nfunction read(input: Parameters<AgentEnvironment[\"read\"]>[0], context: AgentToolContext) {\n return environmentOperation(context, () => context.environment.read(input, context));\n}\n\nfunction list(input: Parameters<AgentEnvironment[\"list\"]>[0], context: AgentToolContext) {\n return environmentOperation(context, () => context.environment.list(input, context));\n}\n\nfunction search(input: Parameters<AgentEnvironment[\"search\"]>[0], context: AgentToolContext) {\n return environmentOperation(context, () => context.environment.search(input, context));\n}\n\nexport const defaultTools = Object.freeze({\n read: defineToolWithActivity({\n replay: \"safe\",\n description:\n \"Read a UTF-8 file up to 1 MiB. Paths resolve from the run cwd. startLine is 1-based (default 1); maxLines defaults to 200. Output is capped at 16 KiB. Use null for defaults.\",\n inputSchema: toolObject({\n path,\n startLine: optionalToolField(positive(Number.MAX_SAFE_INTEGER)),\n maxLines: optionalToolField(positive(2000)),\n }),\n outputSchema: toolObject({\n path,\n content: utf8Text(MAX_OUTPUT_BYTES),\n startLine: count,\n endLine: count,\n totalLines: count,\n truncated: wireBoolean(),\n }),\n run: read,\n dryRun: read,\n action: (input) => `Read ${toolPreview(input.path)}`,\n summarize: (result) =>\n result.totalLines === 0\n ? \"empty file\"\n : `lines ${result.startLine}-${result.endLine} of ${result.totalLines}${result.truncated ? \", truncated\" : \"\"}`,\n }),\n write: defineToolWithActivity({\n description:\n \"Create or replace a UTF-8 file (up to 1 MiB), creating parent directories and following symlinks, including missing targets. Paths resolve from the run cwd. Atomic replacement requires a writable parent directory and permission to preserve existing ownership. Skipped in dry runs.\",\n inputSchema: toolObject({ path, content: text }),\n outputSchema: written,\n run: (input, context) =>\n environmentOperation(context, () => context.environment.write(input, context)),\n action: (input) => `Write ${toolPreview(input.path)}`,\n summarize: (result) => `${result.bytes} bytes`,\n }),\n edit: defineToolWithActivity({\n description:\n \"Replace one exact occurrence of oldText with newText in a UTF-8 file up to 1 MiB. Missing or ambiguous matches fail without writing. Atomic replacement requires a writable parent directory and permission to preserve existing ownership. Skipped in dry runs.\",\n inputSchema: toolObject({\n path,\n oldText: utf8Text(MAX_FILE_BYTES, false),\n newText: text,\n }),\n outputSchema: written,\n run: (input, context) =>\n environmentOperation(context, () => context.environment.edit(input, context)),\n action: (input) => `Edit ${toolPreview(input.path)}`,\n summarize: (result) => `${result.bytes} bytes`,\n }),\n bash: defineToolWithActivity({\n description:\n \"Run bash in the run cwd or a supplied cwd. Return stdout, stderr, exitCode, signal, timedOut and truncated. timeoutMs defaults to 30000 (maximum 300000); combined output is capped at 16 KiB. Use null for defaults. Skipped in dry runs.\",\n inputSchema: toolObject({\n command: wireString({ maxLength: 32_768 }),\n cwd: optionalToolField(path),\n timeoutMs: optionalToolField(positive(300_000)),\n }),\n outputSchema: toolObject(\n {\n cwd: path,\n stdout: utf8Text(MAX_OUTPUT_BYTES),\n stderr: utf8Text(MAX_OUTPUT_BYTES),\n exitCode: wireUnion([count, nullValue]),\n signal: wireUnion([path, nullValue]),\n timedOut: wireBoolean(),\n truncated: wireBoolean(),\n },\n ({ stdout, stderr }) => checkOutputBytes([stdout, stderr])\n ),\n run: (input, context) =>\n environmentOperation(context, () => context.environment.bash(input, context)),\n action: (input) =>\n `Run bash ${toolPreview(input.command)}${input.cwd ? ` in ${toolPreview(input.cwd)}` : \"\"}`,\n summarize: (result) =>\n `exit ${result.exitCode ?? result.signal ?? \"unknown\"}${result.timedOut ? \", timed out\" : \"\"}${result.truncated ? \", output truncated\" : \"\"}`,\n }),\n list: defineToolWithActivity({\n replay: \"safe\",\n description:\n \"List up to 200 entries in filename order, defaulting to the run cwd. Retained names are capped at 16 KiB. Return names and file/directory/symlink kinds. Use null for the default path.\",\n inputSchema: toolObject({ path: optionalToolField(path) }),\n outputSchema: toolObject({\n path,\n entries: listEntries,\n truncated: wireBoolean(),\n }),\n run: list,\n dryRun: list,\n action: (input) => `List ${toolPreview(input.path ?? \".\")}`,\n summarize: (result) =>\n `${result.entries.length} ${result.entries.length === 1 ? \"entry\" : \"entries\"}${result.truncated ? \", truncated\" : \"\"}`,\n }),\n search: defineToolWithActivity({\n replay: \"safe\",\n description:\n \"Search for literal, case-sensitive text in a file or directory (default run cwd), traversing entries in filename order. Skip .git, node_modules and nested symlinks. Count binary/oversized files (over 1 MiB) and unavailable descendants in skippedFiles. Examine at most 2000 entries and 32 directory levels; return up to 50 matching lines and 16 KiB. Long-line snippets shift to the match and cap at 1024 bytes. Use null for the default path.\",\n inputSchema: toolObject({\n query: wireString({ maxLength: 4096 }),\n path: optionalToolField(path),\n }),\n outputSchema: toolObject({\n matches: searchMatches,\n truncated: wireBoolean(),\n skippedFiles: count,\n }),\n run: search,\n dryRun: search,\n action: (input) => `Search ${toolPreview(input.query)} in ${toolPreview(input.path ?? \".\")}`,\n summarize: (result) =>\n `${result.matches.length} ${result.matches.length === 1 ? \"match\" : \"matches\"}${result.truncated ? \", truncated\" : \"\"}, ${result.skippedFiles} files skipped`,\n }),\n});\n\n/** The read, write, edit, bash, list and search tools included in every agent. */\nexport type DefaultAgentTools = typeof defaultTools;\n"]}
|
|
@@ -3,11 +3,11 @@ import type { AgentDecisionContext, AgentOutcome, Awaitable, Tools } from "./age
|
|
|
3
3
|
export interface AgentModelRequest {
|
|
4
4
|
readonly instructions: string;
|
|
5
5
|
readonly task: string;
|
|
6
|
-
/** Provider-owned plain data; null
|
|
6
|
+
/** Provider-owned plain data; null at the start of a fresh conversation. */
|
|
7
7
|
readonly conversation: unknown;
|
|
8
8
|
readonly outcomes: readonly AgentOutcome<Tools>[];
|
|
9
9
|
}
|
|
10
|
-
/** An untrusted
|
|
10
|
+
/** An untrusted decision and complete plain-data conversation, including any final answer. */
|
|
11
11
|
export interface AgentModelResponse {
|
|
12
12
|
readonly decision: unknown;
|
|
13
13
|
readonly conversation: unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-types.js","sourceRoot":"","sources":["../../src/agent/model-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { AgentDecisionContext, AgentOutcome, Awaitable, Tools } from \"./agent-types.js\";\n\n/** Per-run provider context and the latest ordered tool outcomes, never executable handlers. */\nexport interface AgentModelRequest {\n readonly instructions: string;\n readonly task: string;\n /** Provider-owned plain data; null
|
|
1
|
+
{"version":3,"file":"model-types.js","sourceRoot":"","sources":["../../src/agent/model-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { AgentDecisionContext, AgentOutcome, Awaitable, Tools } from \"./agent-types.js\";\n\n/** Per-run provider context and the latest ordered tool outcomes, never executable handlers. */\nexport interface AgentModelRequest {\n readonly instructions: string;\n readonly task: string;\n /** Provider-owned plain data; null at the start of a fresh conversation. */\n readonly conversation: unknown;\n readonly outcomes: readonly AgentOutcome<Tools>[];\n}\n\n/** An untrusted decision and complete plain-data conversation, including any final answer. */\nexport interface AgentModelResponse {\n readonly decision: unknown;\n readonly conversation: unknown;\n}\n\n/** Pluggable model transport; the harness owns and isolates its returned conversation per run. */\nexport type AgentModel = (\n request: AgentModelRequest,\n context: AgentDecisionContext<{ task: string }>\n) => Awaitable<AgentModelResponse>;\n"]}
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
export declare
|
|
2
|
-
export declare function openaiRequest(endpoint: "responses" | "responses/compact", payload: object, apiKey: string | undefined, signal: AbortSignal): Promise<unknown>;
|
|
1
|
+
export declare function openaiRequest(endpoint: "responses" | "responses/compact", payload: object, apiKey: string | undefined, signal: AbortSignal, baseUrl?: string): Promise<unknown>;
|
|
@@ -1,51 +1,39 @@
|
|
|
1
1
|
import { throwIfAborted } from "../utilities/abort.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
throwIfAborted(signal, "OpenAI request");
|
|
9
|
-
const key = (apiKey ?? process.env.OPENAI_API_KEY)?.trim();
|
|
10
|
-
if (!key)
|
|
11
|
-
throw new Error("OPENAI_API_KEY is required for live model execution");
|
|
12
|
-
const response = await fetch(`https://api.openai.com/v1/${endpoint}`, {
|
|
13
|
-
method: "POST",
|
|
14
|
-
headers: { Authorization: `Bearer ${key}`, "Content-Type": "application/json" },
|
|
15
|
-
signal,
|
|
16
|
-
body,
|
|
17
|
-
});
|
|
18
|
-
if (!response.ok) {
|
|
19
|
-
await response.body?.cancel().catch(() => { });
|
|
20
|
-
throw new Error(`OpenAI ${endpoint} failed (HTTP ${response.status})`);
|
|
21
|
-
}
|
|
22
|
-
if (!response.body)
|
|
23
|
-
throw new Error("OpenAI returned an empty response");
|
|
24
|
-
const reader = response.body.getReader();
|
|
25
|
-
const chunks = [];
|
|
26
|
-
let bytes = 0;
|
|
2
|
+
import { record } from "./provider-schema.js";
|
|
3
|
+
import { providerBaseUrl, providerRequest, readProviderJson } from "./provider-http.js";
|
|
4
|
+
const DEFAULT_BASE_URL = "https://api.openai.com/v1";
|
|
5
|
+
const MAX_ERROR_RESPONSE_BYTES = 16_384;
|
|
6
|
+
async function authenticationFailure(response, signal) {
|
|
7
|
+
let body;
|
|
27
8
|
try {
|
|
28
|
-
|
|
29
|
-
throwIfAborted(signal, "OpenAI response");
|
|
30
|
-
const chunk = await reader.read();
|
|
31
|
-
if (chunk.done)
|
|
32
|
-
break;
|
|
33
|
-
bytes += chunk.value.byteLength;
|
|
34
|
-
if (bytes > MAX_RESPONSE_BYTES)
|
|
35
|
-
throw new Error("OpenAI response exceeds 2 MiB");
|
|
36
|
-
chunks.push(chunk.value);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
finally {
|
|
40
|
-
await reader.cancel().catch(() => { });
|
|
41
|
-
reader.releaseLock();
|
|
42
|
-
}
|
|
43
|
-
throwIfAborted(signal, "OpenAI response");
|
|
44
|
-
try {
|
|
45
|
-
return JSON.parse(Buffer.concat(chunks).toString("utf8"));
|
|
9
|
+
body = await readProviderJson(response, signal, MAX_ERROR_RESPONSE_BYTES, "OpenAI");
|
|
46
10
|
}
|
|
47
11
|
catch {
|
|
48
|
-
|
|
12
|
+
throwIfAborted(signal, "OpenAI response");
|
|
13
|
+
// A missing, malformed, oversized or unreadable error body does not hide the HTTP status.
|
|
49
14
|
}
|
|
15
|
+
const code = record(body) && record(body.error) ? body.error.code : undefined;
|
|
16
|
+
// Never print raw error.message or unknown codes: providers may echo API keys in them.
|
|
17
|
+
if (code === "invalid_api_key")
|
|
18
|
+
return "[invalid_api_key] The API key was rejected. Use an active API key from the correct OpenAI project.";
|
|
19
|
+
if (code === "ip_not_authorized")
|
|
20
|
+
return "[ip_not_authorized] Your IP is not on the project's or organization's allowlist. Use an allowed network or update the OpenAI IP allowlist.";
|
|
21
|
+
return "Authentication was rejected. Check that the API key is active, its project and organization are accessible, and your IP is allowed.";
|
|
22
|
+
}
|
|
23
|
+
export async function openaiRequest(endpoint, payload, apiKey, signal, baseUrl) {
|
|
24
|
+
const key = (apiKey ?? process.env.OPENAI_API_KEY)?.trim();
|
|
25
|
+
if (!key)
|
|
26
|
+
throw new Error("OPENAI_API_KEY is required for live model execution");
|
|
27
|
+
const base = providerBaseUrl("OpenAI", baseUrl ?? (process.env.OPENAI_BASE_URL?.trim() || DEFAULT_BASE_URL));
|
|
28
|
+
return providerRequest("OpenAI", endpoint, `${base}/${endpoint}`, { Authorization: `Bearer ${key}` }, payload, signal, async (response) => {
|
|
29
|
+
const advice = response.status === 401 ? await authenticationFailure(response, signal) : "";
|
|
30
|
+
if (response.status !== 401)
|
|
31
|
+
await response.body?.cancel().catch(() => { });
|
|
32
|
+
const requestId = response.headers.get("x-request-id");
|
|
33
|
+
const request = requestId && /^req_[A-Za-z0-9_-]{1,128}$/.test(requestId) && !requestId.includes(key)
|
|
34
|
+
? ` Request ID: ${requestId}.`
|
|
35
|
+
: "";
|
|
36
|
+
return `${advice ? `: ${advice}` : ""}${request}`;
|
|
37
|
+
});
|
|
50
38
|
}
|
|
51
39
|
//# sourceMappingURL=openai-http.js.map
|