@cat-factory/agents 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/agents/AiAgentExecutor.d.ts +72 -0
- package/dist/agents/AiAgentExecutor.d.ts.map +1 -0
- package/dist/agents/AiAgentExecutor.js +125 -0
- package/dist/agents/AiAgentExecutor.js.map +1 -0
- package/dist/agents/acceptance-prompts.d.ts +29 -0
- package/dist/agents/acceptance-prompts.d.ts.map +1 -0
- package/dist/agents/acceptance-prompts.js +112 -0
- package/dist/agents/acceptance-prompts.js.map +1 -0
- package/dist/agents/agent-catalog.d.ts +6 -0
- package/dist/agents/agent-catalog.d.ts.map +1 -0
- package/dist/agents/agent-catalog.js +197 -0
- package/dist/agents/agent-catalog.js.map +1 -0
- package/dist/agents/agent-configs.d.ts +17 -0
- package/dist/agents/agent-configs.d.ts.map +1 -0
- package/dist/agents/agent-configs.js +66 -0
- package/dist/agents/agent-configs.js.map +1 -0
- package/dist/agents/agent-routing.d.ts +57 -0
- package/dist/agents/agent-routing.d.ts.map +1 -0
- package/dist/agents/agent-routing.js +41 -0
- package/dist/agents/agent-routing.js.map +1 -0
- package/dist/agents/business-logic-prompts.d.ts +28 -0
- package/dist/agents/business-logic-prompts.d.ts.map +1 -0
- package/dist/agents/business-logic-prompts.js +96 -0
- package/dist/agents/business-logic-prompts.js.map +1 -0
- package/dist/agents/catalog.d.ts +6 -0
- package/dist/agents/catalog.d.ts.map +1 -0
- package/dist/agents/catalog.js +168 -0
- package/dist/agents/catalog.js.map +1 -0
- package/dist/agents/ci-gate.d.ts +2 -0
- package/dist/agents/ci-gate.d.ts.map +1 -0
- package/dist/agents/ci-gate.js +33 -0
- package/dist/agents/ci-gate.js.map +1 -0
- package/dist/agents/companion-prompts.d.ts +4 -0
- package/dist/agents/companion-prompts.d.ts.map +1 -0
- package/dist/agents/companion-prompts.js +27 -0
- package/dist/agents/companion-prompts.js.map +1 -0
- package/dist/agents/companions.d.ts +20 -0
- package/dist/agents/companions.d.ts.map +1 -0
- package/dist/agents/companions.js +38 -0
- package/dist/agents/companions.js.map +1 -0
- package/dist/agents/kinds/companions.d.ts +20 -0
- package/dist/agents/kinds/companions.d.ts.map +1 -0
- package/dist/agents/kinds/companions.js +39 -0
- package/dist/agents/kinds/companions.js.map +1 -0
- package/dist/agents/kinds/configs.d.ts +17 -0
- package/dist/agents/kinds/configs.d.ts.map +1 -0
- package/dist/agents/kinds/configs.js +66 -0
- package/dist/agents/kinds/configs.js.map +1 -0
- package/dist/agents/kinds/read-only.d.ts +13 -0
- package/dist/agents/kinds/read-only.d.ts.map +1 -0
- package/dist/agents/kinds/read-only.js +32 -0
- package/dist/agents/kinds/read-only.js.map +1 -0
- package/dist/agents/kinds/registry.d.ts +70 -0
- package/dist/agents/kinds/registry.d.ts.map +1 -0
- package/dist/agents/kinds/registry.js +51 -0
- package/dist/agents/kinds/registry.js.map +1 -0
- package/dist/agents/kinds/traits.d.ts +60 -0
- package/dist/agents/kinds/traits.d.ts.map +1 -0
- package/dist/agents/kinds/traits.js +123 -0
- package/dist/agents/kinds/traits.js.map +1 -0
- package/dist/agents/kinds/versions.d.ts +46 -0
- package/dist/agents/kinds/versions.d.ts.map +1 -0
- package/dist/agents/kinds/versions.js +22 -0
- package/dist/agents/kinds/versions.js.map +1 -0
- package/dist/agents/mock-prompts.d.ts +12 -0
- package/dist/agents/mock-prompts.d.ts.map +1 -0
- package/dist/agents/mock-prompts.js +61 -0
- package/dist/agents/mock-prompts.js.map +1 -0
- package/dist/agents/prompt-fragments.d.ts +17 -0
- package/dist/agents/prompt-fragments.d.ts.map +1 -0
- package/dist/agents/prompt-fragments.js +33 -0
- package/dist/agents/prompt-fragments.js.map +1 -0
- package/dist/agents/prompt-shared.d.ts +7 -0
- package/dist/agents/prompt-shared.d.ts.map +1 -0
- package/dist/agents/prompt-shared.js +10 -0
- package/dist/agents/prompt-shared.js.map +1 -0
- package/dist/agents/prompt-versions.d.ts +48 -0
- package/dist/agents/prompt-versions.d.ts.map +1 -0
- package/dist/agents/prompt-versions.js +55 -0
- package/dist/agents/prompt-versions.js.map +1 -0
- package/dist/agents/prompts/acceptance.d.ts +29 -0
- package/dist/agents/prompts/acceptance.d.ts.map +1 -0
- package/dist/agents/prompts/acceptance.js +112 -0
- package/dist/agents/prompts/acceptance.js.map +1 -0
- package/dist/agents/prompts/business-logic.d.ts +28 -0
- package/dist/agents/prompts/business-logic.d.ts.map +1 -0
- package/dist/agents/prompts/business-logic.js +98 -0
- package/dist/agents/prompts/business-logic.js.map +1 -0
- package/dist/agents/prompts/clarity.d.ts +10 -0
- package/dist/agents/prompts/clarity.d.ts.map +1 -0
- package/dist/agents/prompts/clarity.js +40 -0
- package/dist/agents/prompts/clarity.js.map +1 -0
- package/dist/agents/prompts/companion.d.ts +4 -0
- package/dist/agents/prompts/companion.d.ts.map +1 -0
- package/dist/agents/prompts/companion.js +61 -0
- package/dist/agents/prompts/companion.js.map +1 -0
- package/dist/agents/prompts/delivery-contract.d.ts +2 -0
- package/dist/agents/prompts/delivery-contract.d.ts.map +1 -0
- package/dist/agents/prompts/delivery-contract.js +33 -0
- package/dist/agents/prompts/delivery-contract.js.map +1 -0
- package/dist/agents/prompts/mock.d.ts +12 -0
- package/dist/agents/prompts/mock.d.ts.map +1 -0
- package/dist/agents/prompts/mock.js +61 -0
- package/dist/agents/prompts/mock.js.map +1 -0
- package/dist/agents/prompts/requirements.d.ts +13 -0
- package/dist/agents/prompts/requirements.d.ts.map +1 -0
- package/dist/agents/prompts/requirements.js +45 -0
- package/dist/agents/prompts/requirements.js.map +1 -0
- package/dist/agents/prompts/roles.d.ts +16 -0
- package/dist/agents/prompts/roles.d.ts.map +1 -0
- package/dist/agents/prompts/roles.js +74 -0
- package/dist/agents/prompts/roles.js.map +1 -0
- package/dist/agents/prompts/shared.d.ts +19 -0
- package/dist/agents/prompts/shared.d.ts.map +1 -0
- package/dist/agents/prompts/shared.js +25 -0
- package/dist/agents/prompts/shared.js.map +1 -0
- package/dist/agents/prompts/standard-templates.generated.d.ts +36 -0
- package/dist/agents/prompts/standard-templates.generated.d.ts.map +1 -0
- package/dist/agents/prompts/standard-templates.generated.js +122 -0
- package/dist/agents/prompts/standard-templates.generated.js.map +1 -0
- package/dist/agents/prompts/standard.d.ts +36 -0
- package/dist/agents/prompts/standard.d.ts.map +1 -0
- package/dist/agents/prompts/standard.js +208 -0
- package/dist/agents/prompts/standard.js.map +1 -0
- package/dist/agents/prompts/testing.d.ts +12 -0
- package/dist/agents/prompts/testing.d.ts.map +1 -0
- package/dist/agents/prompts/testing.js +94 -0
- package/dist/agents/prompts/testing.js.map +1 -0
- package/dist/agents/read-only.d.ts +13 -0
- package/dist/agents/read-only.d.ts.map +1 -0
- package/dist/agents/read-only.js +29 -0
- package/dist/agents/read-only.js.map +1 -0
- package/dist/agents/registry.d.ts +70 -0
- package/dist/agents/registry.d.ts.map +1 -0
- package/dist/agents/registry.js +51 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/agents/runtime/executor.d.ts +72 -0
- package/dist/agents/runtime/executor.d.ts.map +1 -0
- package/dist/agents/runtime/executor.js +125 -0
- package/dist/agents/runtime/executor.js.map +1 -0
- package/dist/agents/runtime/fragments.d.ts +17 -0
- package/dist/agents/runtime/fragments.d.ts.map +1 -0
- package/dist/agents/runtime/fragments.js +33 -0
- package/dist/agents/runtime/fragments.js.map +1 -0
- package/dist/agents/runtime/routing.d.ts +57 -0
- package/dist/agents/runtime/routing.d.ts.map +1 -0
- package/dist/agents/runtime/routing.js +41 -0
- package/dist/agents/runtime/routing.js.map +1 -0
- package/dist/agents/runtime/web-search.d.ts +43 -0
- package/dist/agents/runtime/web-search.d.ts.map +1 -0
- package/dist/agents/runtime/web-search.js +102 -0
- package/dist/agents/runtime/web-search.js.map +1 -0
- package/dist/agents/standard-prompt-templates.generated.d.ts +36 -0
- package/dist/agents/standard-prompt-templates.generated.d.ts.map +1 -0
- package/dist/agents/standard-prompt-templates.generated.js +122 -0
- package/dist/agents/standard-prompt-templates.generated.js.map +1 -0
- package/dist/agents/standard-prompts.d.ts +36 -0
- package/dist/agents/standard-prompts.d.ts.map +1 -0
- package/dist/agents/standard-prompts.js +202 -0
- package/dist/agents/standard-prompts.js.map +1 -0
- package/dist/agents/test-prompts.d.ts +12 -0
- package/dist/agents/test-prompts.d.ts.map +1 -0
- package/dist/agents/test-prompts.js +92 -0
- package/dist/agents/test-prompts.js.map +1 -0
- package/dist/agents/traits.d.ts +56 -0
- package/dist/agents/traits.d.ts.map +1 -0
- package/dist/agents/traits.js +100 -0
- package/dist/agents/traits.js.map +1 -0
- package/dist/agents/web-search.d.ts +43 -0
- package/dist/agents/web-search.d.ts.map +1 -0
- package/dist/agents/web-search.js +102 -0
- package/dist/agents/web-search.js.map +1 -0
- package/dist/fragmentLibrary/DeterministicFragmentSelector.d.ts +10 -0
- package/dist/fragmentLibrary/DeterministicFragmentSelector.d.ts.map +1 -0
- package/dist/fragmentLibrary/DeterministicFragmentSelector.js +12 -0
- package/dist/fragmentLibrary/DeterministicFragmentSelector.js.map +1 -0
- package/dist/fragmentLibrary/FragmentLibraryService.d.ts +55 -0
- package/dist/fragmentLibrary/FragmentLibraryService.d.ts.map +1 -0
- package/dist/fragmentLibrary/FragmentLibraryService.js +203 -0
- package/dist/fragmentLibrary/FragmentLibraryService.js.map +1 -0
- package/dist/fragmentLibrary/FragmentSourceService.d.ts +51 -0
- package/dist/fragmentLibrary/FragmentSourceService.d.ts.map +1 -0
- package/dist/fragmentLibrary/FragmentSourceService.js +181 -0
- package/dist/fragmentLibrary/FragmentSourceService.js.map +1 -0
- package/dist/fragmentLibrary/LlmFragmentSelector.d.ts +21 -0
- package/dist/fragmentLibrary/LlmFragmentSelector.d.ts.map +1 -0
- package/dist/fragmentLibrary/LlmFragmentSelector.js +87 -0
- package/dist/fragmentLibrary/LlmFragmentSelector.js.map +1 -0
- package/dist/fragmentLibrary/fragment-catalog.d.ts +43 -0
- package/dist/fragmentLibrary/fragment-catalog.d.ts.map +1 -0
- package/dist/fragmentLibrary/fragment-catalog.js +129 -0
- package/dist/fragmentLibrary/fragment-catalog.js.map +1 -0
- package/dist/fragmentLibrary/fragment-source.logic.d.ts +34 -0
- package/dist/fragmentLibrary/fragment-source.logic.d.ts.map +1 -0
- package/dist/fragmentLibrary/fragment-source.logic.js +172 -0
- package/dist/fragmentLibrary/fragment-source.logic.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/cache.d.ts +22 -0
- package/dist/providers/cache.d.ts.map +1 -0
- package/dist/providers/cache.js +64 -0
- package/dist/providers/cache.js.map +1 -0
- package/dist/providers/endpoints.d.ts +8 -0
- package/dist/providers/endpoints.d.ts.map +1 -0
- package/dist/providers/endpoints.js +23 -0
- package/dist/providers/endpoints.js.map +1 -0
- package/dist/providers/index.d.ts +6 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +6 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/instrumented.d.ts +28 -0
- package/dist/providers/instrumented.d.ts.map +1 -0
- package/dist/providers/instrumented.js +147 -0
- package/dist/providers/instrumented.js.map +1 -0
- package/dist/providers/registry.d.ts +26 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +32 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/resolvers.d.ts +58 -0
- package/dist/providers/resolvers.d.ts.map +1 -0
- package/dist/providers/resolvers.js +78 -0
- package/dist/providers/resolvers.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-only.d.ts","sourceRoot":"","sources":["../../src/agents/read-only.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAepD,4FAA4F;AAC5F,eAAO,MAAM,qBAAqB,aAA6C,CAAA;AAE/E,wFAAwF;AACxF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAE5D;AAED;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,QAIiB,CAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Read-only container agents. Some agent kinds need a real checkout to do their
|
|
2
|
+
// work but only ever READ it: they clone the repo, explore it, and return a prose
|
|
3
|
+
// report/proposal — making no edits, no commits and opening no pull request. They
|
|
4
|
+
// run through the harness `/explore` endpoint (not `/run`), where an edit-free run
|
|
5
|
+
// is the expected, correct outcome rather than an "implementation produced no
|
|
6
|
+
// changes" failure, and where no work branch or PR is created.
|
|
7
|
+
//
|
|
8
|
+
// Today that is the `architect` (proposes a design after reading the existing code,
|
|
9
|
+
// whose prose proposal feeds the human gate / architect-companion) and the tech-debt
|
|
10
|
+
// `analysis` agent (audits the repo and emits a prioritized report). Both share the
|
|
11
|
+
// single reusable read-only execution path (see ContainerAgentExecutor's explore
|
|
12
|
+
// body + the harness `handleExplore`).
|
|
13
|
+
/** Container agent kinds that operate read-only (explore + report; no edits/commits/PR). */
|
|
14
|
+
export const READ_ONLY_AGENT_KINDS = new Set(['architect', 'analysis']);
|
|
15
|
+
/** Whether `kind` is a read-only container agent (runs the harness `/explore` path). */
|
|
16
|
+
export function isReadOnlyAgentKind(kind) {
|
|
17
|
+
return READ_ONLY_AGENT_KINDS.has(kind);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Appended to a read-only agent's system prompt so it never tries to edit, commit or
|
|
21
|
+
* open a PR — the prose report it returns is its sole deliverable. Centralised here
|
|
22
|
+
* (rather than repeated in each role prompt) so every read-only kind states the same
|
|
23
|
+
* guardrail exactly once.
|
|
24
|
+
*/
|
|
25
|
+
export const READ_ONLY_GUARDRAIL = 'IMPORTANT — this is a READ-ONLY exploration: you may read and inspect any file in ' +
|
|
26
|
+
'the repository, but you MUST NOT modify, create or delete files, run commands that ' +
|
|
27
|
+
'change the repository, commit, or open a pull request. Your written report is the ' +
|
|
28
|
+
'only deliverable; return it as your response.';
|
|
29
|
+
//# sourceMappingURL=read-only.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-only.js","sourceRoot":"","sources":["../../src/agents/read-only.ts"],"names":[],"mappings":"AAEA,gFAAgF;AAChF,kFAAkF;AAClF,kFAAkF;AAClF,mFAAmF;AACnF,8EAA8E;AAC9E,+DAA+D;AAC/D,EAAE;AACF,oFAAoF;AACpF,qFAAqF;AACrF,oFAAoF;AACpF,iFAAiF;AACjF,uCAAuC;AAEvC,4FAA4F;AAC5F,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAS,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAA;AAE/E,wFAAwF;AACxF,MAAM,UAAU,mBAAmB,CAAC,IAAe;IACjD,OAAO,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AACxC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAC9B,oFAAoF;IACpF,qFAAqF;IACrF,oFAAoF;IACpF,+CAA+C,CAAA"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { AgentConfigDescriptor, AgentKind, AgentRunContext } from '@cat-factory/kernel';
|
|
2
|
+
import type { AgentTrait } from './traits.js';
|
|
3
|
+
export interface AgentKindDefinition {
|
|
4
|
+
/** The free-form agent-kind id used in pipelines and steps (e.g. `security-auditor`). */
|
|
5
|
+
kind: AgentKind;
|
|
6
|
+
/**
|
|
7
|
+
* The system prompt (role) for this kind. A function form receives the kind id so a
|
|
8
|
+
* single definition object can serve a family of related kinds.
|
|
9
|
+
*/
|
|
10
|
+
systemPrompt: string | ((kind: AgentKind) => string);
|
|
11
|
+
/**
|
|
12
|
+
* Optional custom user-prompt builder. When omitted the kind uses the generic user
|
|
13
|
+
* prompt (block context + prior pipeline outputs), exactly like any other
|
|
14
|
+
* non-standard-phase kind. Human revision feedback is appended automatically.
|
|
15
|
+
*/
|
|
16
|
+
userPrompt?: (context: AgentRunContext) => string;
|
|
17
|
+
/**
|
|
18
|
+
* When true this kind needs a real checkout (clone/edit/commit/PR) and must run in a
|
|
19
|
+
* container rather than as a one-shot inline LLM call — see the Worker's
|
|
20
|
+
* `CompositeAgentExecutor`. Defaults to false (an inline LLM agent). NOTE: a container
|
|
21
|
+
* kind ALSO needs harness support for its dispatch endpoint; inline kinds work
|
|
22
|
+
* end-to-end with no harness changes.
|
|
23
|
+
*/
|
|
24
|
+
requiresContainer?: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Optional one-clause reason this kind should reach for web search, phrased to
|
|
27
|
+
* complete "Use it mainly to …" (e.g. "verify the vendor's current API contract
|
|
28
|
+
* before generating a client"). When web search is enabled for the deployment, this
|
|
29
|
+
* is folded into the kind's web-search guidance so a proprietary kind gets a nudge
|
|
30
|
+
* tailored to its job — without the shared library needing to know the kind exists.
|
|
31
|
+
* Omitted ⇒ the generic "verify a fact that changes" hint. See `webResearchGuidanceFor`.
|
|
32
|
+
*/
|
|
33
|
+
webResearchHint?: string;
|
|
34
|
+
/**
|
|
35
|
+
* Task-level configuration parameters this kind contributes (see the agent-config
|
|
36
|
+
* contracts). When a pipeline that includes this kind is selected for a task, these
|
|
37
|
+
* descriptors are surfaced on task creation + the inspector, editable until the
|
|
38
|
+
* kind's step starts. Each descriptor's `agentKind` should match this `kind` so the
|
|
39
|
+
* freeze targets the right step. Omitted ⇒ the kind contributes no config.
|
|
40
|
+
*/
|
|
41
|
+
configContributions?: AgentConfigDescriptor[];
|
|
42
|
+
/**
|
|
43
|
+
* Capability traits this kind carries (see ./traits). `code-aware` makes the engine
|
|
44
|
+
* fold the running service's selected best-practice fragments into the agent's prompt;
|
|
45
|
+
* `spec-aware` appends the in-repo-spec reading guidance. Deployments can also assign
|
|
46
|
+
* their own traits registered via `registerAgentTrait`. Omitted ⇒ no traits.
|
|
47
|
+
*/
|
|
48
|
+
traits?: AgentTrait[];
|
|
49
|
+
}
|
|
50
|
+
/** Register a custom agent kind. A later registration of the same id replaces the earlier one. */
|
|
51
|
+
export declare function registerAgentKind(definition: AgentKindDefinition): void;
|
|
52
|
+
/** Register several custom agent kinds at once. */
|
|
53
|
+
export declare function registerAgentKinds(definitions: Iterable<AgentKindDefinition>): void;
|
|
54
|
+
/** The registered definition for a kind, or undefined for built-in / unregistered kinds. */
|
|
55
|
+
export declare function registeredAgentKind(kind: AgentKind): AgentKindDefinition | undefined;
|
|
56
|
+
/** All registered custom agent kinds (registration order). */
|
|
57
|
+
export declare function registeredAgentKinds(): AgentKindDefinition[];
|
|
58
|
+
/** Whether a registered kind asked to run in a container. False for built-in / unregistered kinds. */
|
|
59
|
+
export declare function registeredKindRequiresContainer(kind: AgentKind): boolean;
|
|
60
|
+
/** Drop all registered kinds. Intended for tests that exercise registration. */
|
|
61
|
+
export declare function clearRegisteredAgentKinds(): void;
|
|
62
|
+
/** A registered kind's system prompt, or undefined when the kind is not registered. */
|
|
63
|
+
export declare function registeredSystemPrompt(kind: AgentKind): string | undefined;
|
|
64
|
+
/** A registered kind's user prompt, or undefined when the kind is not registered / has no builder. */
|
|
65
|
+
export declare function registeredUserPrompt(context: AgentRunContext): string | undefined;
|
|
66
|
+
/** A registered kind's web-research hint, or undefined when unregistered / not supplied. */
|
|
67
|
+
export declare function registeredWebResearchHint(kind: AgentKind): string | undefined;
|
|
68
|
+
/** A registered kind's contributed config descriptors, or an empty array when none. */
|
|
69
|
+
export declare function registeredConfigContributions(kind: AgentKind): AgentConfigDescriptor[];
|
|
70
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/agents/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAC5F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAY7C,MAAM,WAAW,mBAAmB;IAClC,yFAAyF;IACzF,IAAI,EAAE,SAAS,CAAA;IACf;;;OAGG;IACH,YAAY,EAAE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,SAAS,KAAK,MAAM,CAAC,CAAA;IACpD;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,MAAM,CAAA;IACjD;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;;;;;OAMG;IACH,mBAAmB,CAAC,EAAE,qBAAqB,EAAE,CAAA;IAC7C;;;;;OAKG;IACH,MAAM,CAAC,EAAE,UAAU,EAAE,CAAA;CACtB;AAOD,kGAAkG;AAClG,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,mBAAmB,GAAG,IAAI,CAEvE;AAED,mDAAmD;AACnD,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,QAAQ,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAEnF;AAED,4FAA4F;AAC5F,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,GAAG,mBAAmB,GAAG,SAAS,CAEpF;AAED,8DAA8D;AAC9D,wBAAgB,oBAAoB,IAAI,mBAAmB,EAAE,CAE5D;AAED,sGAAsG;AACtG,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAExE;AAED,gFAAgF;AAChF,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAED,uFAAuF;AACvF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAM1E;AAED,sGAAsG;AACtG,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,GAAG,SAAS,CAEjF;AAED,4FAA4F;AAC5F,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAE7E;AAED,uFAAuF;AACvF,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,SAAS,GAAG,qBAAqB,EAAE,CAEtF"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// Process-wide registry, mirroring the Worker's model-provider registry. Registration
|
|
2
|
+
// is a startup side effect read by every prompt build / routing decision, so the extra
|
|
3
|
+
// kinds reach all paths — HTTP requests, the durable driver and the cron sweeper.
|
|
4
|
+
const registry = new Map();
|
|
5
|
+
/** Register a custom agent kind. A later registration of the same id replaces the earlier one. */
|
|
6
|
+
export function registerAgentKind(definition) {
|
|
7
|
+
registry.set(definition.kind, definition);
|
|
8
|
+
}
|
|
9
|
+
/** Register several custom agent kinds at once. */
|
|
10
|
+
export function registerAgentKinds(definitions) {
|
|
11
|
+
for (const definition of definitions)
|
|
12
|
+
registerAgentKind(definition);
|
|
13
|
+
}
|
|
14
|
+
/** The registered definition for a kind, or undefined for built-in / unregistered kinds. */
|
|
15
|
+
export function registeredAgentKind(kind) {
|
|
16
|
+
return registry.get(kind);
|
|
17
|
+
}
|
|
18
|
+
/** All registered custom agent kinds (registration order). */
|
|
19
|
+
export function registeredAgentKinds() {
|
|
20
|
+
return [...registry.values()];
|
|
21
|
+
}
|
|
22
|
+
/** Whether a registered kind asked to run in a container. False for built-in / unregistered kinds. */
|
|
23
|
+
export function registeredKindRequiresContainer(kind) {
|
|
24
|
+
return registry.get(kind)?.requiresContainer === true;
|
|
25
|
+
}
|
|
26
|
+
/** Drop all registered kinds. Intended for tests that exercise registration. */
|
|
27
|
+
export function clearRegisteredAgentKinds() {
|
|
28
|
+
registry.clear();
|
|
29
|
+
}
|
|
30
|
+
/** A registered kind's system prompt, or undefined when the kind is not registered. */
|
|
31
|
+
export function registeredSystemPrompt(kind) {
|
|
32
|
+
const definition = registry.get(kind);
|
|
33
|
+
if (!definition)
|
|
34
|
+
return undefined;
|
|
35
|
+
return typeof definition.systemPrompt === 'function'
|
|
36
|
+
? definition.systemPrompt(kind)
|
|
37
|
+
: definition.systemPrompt;
|
|
38
|
+
}
|
|
39
|
+
/** A registered kind's user prompt, or undefined when the kind is not registered / has no builder. */
|
|
40
|
+
export function registeredUserPrompt(context) {
|
|
41
|
+
return registry.get(context.agentKind)?.userPrompt?.(context);
|
|
42
|
+
}
|
|
43
|
+
/** A registered kind's web-research hint, or undefined when unregistered / not supplied. */
|
|
44
|
+
export function registeredWebResearchHint(kind) {
|
|
45
|
+
return registry.get(kind)?.webResearchHint;
|
|
46
|
+
}
|
|
47
|
+
/** A registered kind's contributed config descriptors, or an empty array when none. */
|
|
48
|
+
export function registeredConfigContributions(kind) {
|
|
49
|
+
return registry.get(kind)?.configContributions ?? [];
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/agents/registry.ts"],"names":[],"mappings":"AA6DA,sFAAsF;AACtF,uFAAuF;AACvF,kFAAkF;AAClF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA+B,CAAA;AAEvD,kGAAkG;AAClG,MAAM,UAAU,iBAAiB,CAAC,UAA+B;IAC/D,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;AAC3C,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,kBAAkB,CAAC,WAA0C;IAC3E,KAAK,MAAM,UAAU,IAAI,WAAW;QAAE,iBAAiB,CAAC,UAAU,CAAC,CAAA;AACrE,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,mBAAmB,CAAC,IAAe;IACjD,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AAC3B,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,oBAAoB;IAClC,OAAO,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;AAC/B,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,+BAA+B,CAAC,IAAe;IAC7D,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,iBAAiB,KAAK,IAAI,CAAA;AACvD,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,yBAAyB;IACvC,QAAQ,CAAC,KAAK,EAAE,CAAA;AAClB,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,sBAAsB,CAAC,IAAe;IACpD,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACrC,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAA;IACjC,OAAO,OAAO,UAAU,CAAC,YAAY,KAAK,UAAU;QAClD,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC;QAC/B,CAAC,CAAC,UAAU,CAAC,YAAY,CAAA;AAC7B,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,oBAAoB,CAAC,OAAwB;IAC3D,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC,OAAO,CAAC,CAAA;AAC/D,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,yBAAyB,CAAC,IAAe;IACvD,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,eAAe,CAAA;AAC5C,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,6BAA6B,CAAC,IAAe;IAC3D,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,mBAAmB,IAAI,EAAE,CAAA;AACtD,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { AgentExecutor, AgentRunContext, AgentRunResult } from '@cat-factory/kernel';
|
|
2
|
+
import type { ModelProvider, ModelProviderResolver, ModelRef } from '@cat-factory/kernel';
|
|
3
|
+
import { type AgentRouting } from './routing.js';
|
|
4
|
+
import { type InlineWebSearchOptions } from './web-search.js';
|
|
5
|
+
export interface AiAgentExecutorDependencies {
|
|
6
|
+
/**
|
|
7
|
+
* Resolve a {@link ModelProvider} for a run's credential scope (workspace + owning
|
|
8
|
+
* account + initiator), leasing the DB-backed API keys for that scope. Preferred over
|
|
9
|
+
* the static `modelProvider`; the facades supply it so inline calls use the same
|
|
10
|
+
* per-scope pool the container proxy does.
|
|
11
|
+
*/
|
|
12
|
+
modelProviderResolver?: ModelProviderResolver;
|
|
13
|
+
/**
|
|
14
|
+
* A static {@link ModelProvider} (e.g. a fake in tests). Used only when no
|
|
15
|
+
* `modelProviderResolver` is supplied. One of the two MUST be present.
|
|
16
|
+
*/
|
|
17
|
+
modelProvider?: ModelProvider;
|
|
18
|
+
agentRouting: AgentRouting;
|
|
19
|
+
/**
|
|
20
|
+
* Resolve a block's selected model id to a concrete ref. Deployment-aware (it
|
|
21
|
+
* honours the direct/Cloudflare fallback based on configured keys), so the
|
|
22
|
+
* worker supplies it; absent/unknown ids return undefined to fall back to the
|
|
23
|
+
* agent routing. Defaults to "no per-block override".
|
|
24
|
+
*/
|
|
25
|
+
resolveBlockModel?: (modelId: string | undefined) => ModelRef | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* Resolve the workspace's per-agent-kind default model id, consulted when the
|
|
28
|
+
* block pins no usable model. Optional: absent → the env routing for the kind is
|
|
29
|
+
* used. Supplying it makes the inline kinds honour the workspace defaults exactly
|
|
30
|
+
* like the container executor (block-pinned > workspace default > env routing).
|
|
31
|
+
*/
|
|
32
|
+
resolveWorkspaceModelDefault?: (workspaceId: string, agentKind: string) => Promise<string | undefined>;
|
|
33
|
+
/**
|
|
34
|
+
* Opt-in provider-hosted web search for the design/research inline kinds. When
|
|
35
|
+
* supplied (and the resolved model's provider has a hosted search — Anthropic /
|
|
36
|
+
* OpenAI), the allow-listed kinds get a `web_search` tool plus a usage nudge.
|
|
37
|
+
* Absent ⇒ inline agents make a plain one-shot completion, exactly as before.
|
|
38
|
+
*/
|
|
39
|
+
webSearch?: InlineWebSearchOptions;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The real agent: performs each pipeline step by calling an LLM through the
|
|
43
|
+
* Vercel AI SDK. The model and generation settings come from the {@link
|
|
44
|
+
* AgentRouting} (configurable per agent kind), and the concrete model is
|
|
45
|
+
* resolved through the {@link ModelProvider} port — so this class never imports
|
|
46
|
+
* a provider SDK or an API key directly.
|
|
47
|
+
*/
|
|
48
|
+
export declare class AiAgentExecutor implements AgentExecutor {
|
|
49
|
+
private readonly modelProviderResolver?;
|
|
50
|
+
private readonly modelProvider?;
|
|
51
|
+
private readonly agentRouting;
|
|
52
|
+
private readonly resolveBlockModel;
|
|
53
|
+
private readonly resolveWorkspaceModelDefault?;
|
|
54
|
+
private readonly webSearch?;
|
|
55
|
+
constructor({ modelProviderResolver, modelProvider, agentRouting, resolveBlockModel, resolveWorkspaceModelDefault, webSearch, }: AiAgentExecutorDependencies);
|
|
56
|
+
/** Resolve the model provider for a run's scope (per-scope DB pool, else the static one). */
|
|
57
|
+
private providerFor;
|
|
58
|
+
/**
|
|
59
|
+
* Resolve the step's model ref with the shared step precedence: a block's pinned
|
|
60
|
+
* model wins, else the workspace's per-kind default, else the env routing for the
|
|
61
|
+
* kind. A pinned subscription model (Claude Code / Codex), which can run only in
|
|
62
|
+
* the container harness, is degraded to the kind's env-routing default here — this
|
|
63
|
+
* is an inline executor — via the shared `resolveInlineModelRef` seam. Side-effect-
|
|
64
|
+
* free, so it backs both `run` and the up-front `resolveModel` (which thus reports
|
|
65
|
+
* the model that will actually run, not the un-servable subscription ref).
|
|
66
|
+
*/
|
|
67
|
+
private resolveRef;
|
|
68
|
+
/** Preview the model this step will run, without making the LLM call. */
|
|
69
|
+
resolveModel(context: AgentRunContext): Promise<string>;
|
|
70
|
+
run(context: AgentRunContext): Promise<AgentRunResult>;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/agents/runtime/executor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACzF,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAGzF,OAAO,EAAE,KAAK,YAAY,EAA6C,MAAM,cAAc,CAAA;AAE3F,OAAO,EACL,KAAK,sBAAsB,EAG5B,MAAM,iBAAiB,CAAA;AAExB,MAAM,WAAW,2BAA2B;IAC1C;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,qBAAqB,CAAA;IAC7C;;;OAGG;IACH,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,YAAY,EAAE,YAAY,CAAA;IAC1B;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,KAAK,QAAQ,GAAG,SAAS,CAAA;IACzE;;;;;OAKG;IACH,4BAA4B,CAAC,EAAE,CAC7B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,KACd,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAChC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,sBAAsB,CAAA;CACnC;AAED;;;;;;GAMG;AACH,qBAAa,eAAgB,YAAW,aAAa;IACnD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAuB;IAC9D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAe;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAuD;IACzF,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAGd;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAwB;IAEnD,YAAY,EACV,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,4BAA4B,EAC5B,SAAS,GACV,EAAE,2BAA2B,EAU7B;IAED,6FAA6F;YAC/E,WAAW;IAgBzB;;;;;;;;OAQG;IACH,OAAO,CAAC,UAAU;IAelB,yEAAyE;IACnE,YAAY,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAG5D;IAEK,GAAG,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAsD3D;CACF"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { generateText } from 'ai';
|
|
2
|
+
import { systemPromptFor, userPromptFor } from '../catalog.js';
|
|
3
|
+
import { catFactoryObservability } from '../../providers/instrumented.js';
|
|
4
|
+
import { resolveAgentConfig, resolveInlineModelRef } from './routing.js';
|
|
5
|
+
import { composeBlockSystemPrompt } from './fragments.js';
|
|
6
|
+
import { providerWebSearchTools, webResearchGuidanceFor, } from './web-search.js';
|
|
7
|
+
/**
|
|
8
|
+
* The real agent: performs each pipeline step by calling an LLM through the
|
|
9
|
+
* Vercel AI SDK. The model and generation settings come from the {@link
|
|
10
|
+
* AgentRouting} (configurable per agent kind), and the concrete model is
|
|
11
|
+
* resolved through the {@link ModelProvider} port — so this class never imports
|
|
12
|
+
* a provider SDK or an API key directly.
|
|
13
|
+
*/
|
|
14
|
+
export class AiAgentExecutor {
|
|
15
|
+
modelProviderResolver;
|
|
16
|
+
modelProvider;
|
|
17
|
+
agentRouting;
|
|
18
|
+
resolveBlockModel;
|
|
19
|
+
resolveWorkspaceModelDefault;
|
|
20
|
+
webSearch;
|
|
21
|
+
constructor({ modelProviderResolver, modelProvider, agentRouting, resolveBlockModel, resolveWorkspaceModelDefault, webSearch, }) {
|
|
22
|
+
if (!modelProviderResolver && !modelProvider) {
|
|
23
|
+
throw new Error('AiAgentExecutor requires a modelProviderResolver or a modelProvider');
|
|
24
|
+
}
|
|
25
|
+
this.modelProviderResolver = modelProviderResolver;
|
|
26
|
+
this.modelProvider = modelProvider;
|
|
27
|
+
this.agentRouting = agentRouting;
|
|
28
|
+
this.resolveBlockModel = resolveBlockModel ?? (() => undefined);
|
|
29
|
+
this.resolveWorkspaceModelDefault = resolveWorkspaceModelDefault;
|
|
30
|
+
this.webSearch = webSearch;
|
|
31
|
+
}
|
|
32
|
+
/** Resolve the model provider for a run's scope (per-scope DB pool, else the static one). */
|
|
33
|
+
async providerFor(context) {
|
|
34
|
+
if (this.modelProviderResolver && context.workspaceId) {
|
|
35
|
+
return this.modelProviderResolver.forScope({
|
|
36
|
+
workspaceId: context.workspaceId,
|
|
37
|
+
userId: context.initiatedByUserId,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
if (this.modelProvider)
|
|
41
|
+
return this.modelProvider;
|
|
42
|
+
if (this.modelProviderResolver) {
|
|
43
|
+
// No workspace scope (rare): lease from no scope — only the opt-in registries
|
|
44
|
+
// (Cloudflare/Bedrock) can resolve.
|
|
45
|
+
return this.modelProviderResolver.forScope({ workspaceId: context.workspaceId ?? '' });
|
|
46
|
+
}
|
|
47
|
+
throw new Error('AiAgentExecutor: no model provider available');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Resolve the step's model ref with the shared step precedence: a block's pinned
|
|
51
|
+
* model wins, else the workspace's per-kind default, else the env routing for the
|
|
52
|
+
* kind. A pinned subscription model (Claude Code / Codex), which can run only in
|
|
53
|
+
* the container harness, is degraded to the kind's env-routing default here — this
|
|
54
|
+
* is an inline executor — via the shared `resolveInlineModelRef` seam. Side-effect-
|
|
55
|
+
* free, so it backs both `run` and the up-front `resolveModel` (which thus reports
|
|
56
|
+
* the model that will actually run, not the un-servable subscription ref).
|
|
57
|
+
*/
|
|
58
|
+
resolveRef(context) {
|
|
59
|
+
return resolveInlineModelRef({
|
|
60
|
+
agentRouting: this.agentRouting,
|
|
61
|
+
resolveBlockModel: this.resolveBlockModel,
|
|
62
|
+
resolveWorkspaceModelDefault: this.resolveWorkspaceModelDefault,
|
|
63
|
+
}, {
|
|
64
|
+
agentKind: context.agentKind,
|
|
65
|
+
blockModelId: context.block.modelId,
|
|
66
|
+
workspaceId: context.workspaceId,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/** Preview the model this step will run, without making the LLM call. */
|
|
70
|
+
async resolveModel(context) {
|
|
71
|
+
const ref = await this.resolveRef(context);
|
|
72
|
+
return `${ref.provider}:${ref.model}`;
|
|
73
|
+
}
|
|
74
|
+
async run(context) {
|
|
75
|
+
const config = resolveAgentConfig(this.agentRouting, context.agentKind);
|
|
76
|
+
// `resolveRef` already degrades a pinned subscription model (Claude Code / Codex,
|
|
77
|
+
// which run only in the container harness and have no provider key here) to this
|
|
78
|
+
// kind's env-routing default, so the ModelProvider always gets a servable ref.
|
|
79
|
+
const ref = await this.resolveRef(context);
|
|
80
|
+
const provider = await this.providerFor(context);
|
|
81
|
+
const model = provider.resolve(ref);
|
|
82
|
+
// Base role prompt, then fold in the best-practice fragments selected for the
|
|
83
|
+
// block — the engine-resolved tenant catalog when present, else the manual ids.
|
|
84
|
+
const baseSystem = config.system ?? systemPromptFor(context.agentKind);
|
|
85
|
+
const composed = composeBlockSystemPrompt(baseSystem, context.block);
|
|
86
|
+
// Provider-hosted web search for the allow-listed design/research kinds, when
|
|
87
|
+
// enabled AND the resolved provider has one. The usage nudge is appended only
|
|
88
|
+
// when the tool is actually attached, so the model is never told about a tool
|
|
89
|
+
// it lacks (mirrors the harness's AGENTS.md guidance gating).
|
|
90
|
+
const tools = this.webSearch && this.webSearch.kinds.has(context.agentKind)
|
|
91
|
+
? providerWebSearchTools(ref.provider, this.webSearch.maxUses)
|
|
92
|
+
: undefined;
|
|
93
|
+
// Inline tool is web_search only (no web_fetch); the per-kind hint is resolved
|
|
94
|
+
// from the registry/catalog so a custom kind gets its own nudge.
|
|
95
|
+
const system = tools
|
|
96
|
+
? `${composed}${webResearchGuidanceFor(context.agentKind, { fetch: false })}`
|
|
97
|
+
: composed;
|
|
98
|
+
const { text, usage } = await generateText({
|
|
99
|
+
model,
|
|
100
|
+
system,
|
|
101
|
+
prompt: userPromptFor(context),
|
|
102
|
+
temperature: config.temperature,
|
|
103
|
+
maxOutputTokens: config.maxOutputTokens,
|
|
104
|
+
...(tools ? { tools } : {}),
|
|
105
|
+
// Tag the call so an instrumented provider can group it under its run's trace
|
|
106
|
+
// (a no-op when no trace sink is wired; ignored by every model provider).
|
|
107
|
+
providerOptions: catFactoryObservability({
|
|
108
|
+
agentKind: context.agentKind,
|
|
109
|
+
workspaceId: context.workspaceId,
|
|
110
|
+
executionId: context.executionId,
|
|
111
|
+
}),
|
|
112
|
+
});
|
|
113
|
+
return {
|
|
114
|
+
output: text.trim(),
|
|
115
|
+
model: `${ref.provider}:${ref.model}`,
|
|
116
|
+
// Report metered tokens so the spend safeguard can price this call. The
|
|
117
|
+
// AI SDK leaves either field undefined when a provider omits it.
|
|
118
|
+
usage: {
|
|
119
|
+
inputTokens: usage.inputTokens ?? 0,
|
|
120
|
+
outputTokens: usage.outputTokens ?? 0,
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/agents/runtime/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** A block's fragment selection, as the prompt composer needs it. */
|
|
2
|
+
export interface ComposableBlock {
|
|
3
|
+
fragmentIds?: string[];
|
|
4
|
+
resolvedFragments?: {
|
|
5
|
+
id: string;
|
|
6
|
+
body: string;
|
|
7
|
+
}[];
|
|
8
|
+
}
|
|
9
|
+
export declare function composeSystemPrompt(baseSystem: string, fragmentIds?: string[]): string;
|
|
10
|
+
/**
|
|
11
|
+
* Compose the system prompt for a block, preferring the engine-resolved tenant
|
|
12
|
+
* catalog bodies when present and otherwise falling back to static id resolution.
|
|
13
|
+
* Both inline and container executors use this so the fragment-library feature
|
|
14
|
+
* applies uniformly to every agent kind, not just the reviewer.
|
|
15
|
+
*/
|
|
16
|
+
export declare function composeBlockSystemPrompt(baseSystem: string, block: ComposableBlock): string;
|
|
17
|
+
//# sourceMappingURL=fragments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fragments.d.ts","sourceRoot":"","sources":["../../../src/agents/runtime/fragments.ts"],"names":[],"mappings":"AAgBA,qEAAqE;AACrE,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,iBAAiB,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CACnD;AAcD,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,GAAE,MAAM,EAAO,GAAG,MAAM,CAM1F;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,MAAM,CAQ3F"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { getFragment } from '@cat-factory/prompt-fragments';
|
|
2
|
+
/** Fold a set of fragment bodies into the base system prompt under a header. */
|
|
3
|
+
function foldStandards(baseSystem, bodies) {
|
|
4
|
+
if (bodies.length === 0)
|
|
5
|
+
return baseSystem;
|
|
6
|
+
return [
|
|
7
|
+
baseSystem,
|
|
8
|
+
'',
|
|
9
|
+
'Follow these standards while doing the work:',
|
|
10
|
+
'',
|
|
11
|
+
bodies.join('\n\n'),
|
|
12
|
+
].join('\n');
|
|
13
|
+
}
|
|
14
|
+
export function composeSystemPrompt(baseSystem, fragmentIds = []) {
|
|
15
|
+
const bodies = fragmentIds
|
|
16
|
+
.map((id) => getFragment(id))
|
|
17
|
+
.filter((fragment) => fragment !== undefined)
|
|
18
|
+
.map((fragment) => fragment.body);
|
|
19
|
+
return foldStandards(baseSystem, bodies);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Compose the system prompt for a block, preferring the engine-resolved tenant
|
|
23
|
+
* catalog bodies when present and otherwise falling back to static id resolution.
|
|
24
|
+
* Both inline and container executors use this so the fragment-library feature
|
|
25
|
+
* applies uniformly to every agent kind, not just the reviewer.
|
|
26
|
+
*/
|
|
27
|
+
export function composeBlockSystemPrompt(baseSystem, block) {
|
|
28
|
+
if (block.resolvedFragments && block.resolvedFragments.length > 0) {
|
|
29
|
+
return foldStandards(baseSystem, block.resolvedFragments.map((f) => f.body));
|
|
30
|
+
}
|
|
31
|
+
return composeSystemPrompt(baseSystem, block.fragmentIds);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=fragments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fragments.js","sourceRoot":"","sources":["../../../src/agents/runtime/fragments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAsB3D,gFAAgF;AAChF,SAAS,aAAa,CAAC,UAAkB,EAAE,MAAgB;IACzD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,UAAU,CAAA;IAC1C,OAAO;QACL,UAAU;QACV,EAAE;QACF,8CAA8C;QAC9C,EAAE;QACF,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;KACpB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,UAAkB,EAAE,WAAW,GAAa,EAAE;IAChF,MAAM,MAAM,GAAG,WAAW;SACvB,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;SAC5B,MAAM,CAAC,CAAC,QAAQ,EAA4C,EAAE,CAAC,QAAQ,KAAK,SAAS,CAAC;SACtF,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IACnC,OAAO,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;AAC1C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,UAAkB,EAAE,KAAsB;IACjF,IAAI,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClE,OAAO,aAAa,CAClB,UAAU,EACV,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAC3C,CAAA;IACH,CAAC;IACD,OAAO,mBAAmB,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,CAAA;AAC3D,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { AgentKind } from '@cat-factory/kernel';
|
|
2
|
+
import type { ModelRef } from '@cat-factory/kernel';
|
|
3
|
+
export interface AgentModelConfig {
|
|
4
|
+
ref: ModelRef;
|
|
5
|
+
temperature?: number;
|
|
6
|
+
maxOutputTokens?: number;
|
|
7
|
+
/** Overrides the built-in role system prompt for this agent kind. */
|
|
8
|
+
system?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface AgentRouting {
|
|
11
|
+
/** Used for any agent kind without a specific entry (incl. custom agents). */
|
|
12
|
+
default: AgentModelConfig;
|
|
13
|
+
byKind: Partial<Record<AgentKind, AgentModelConfig>>;
|
|
14
|
+
}
|
|
15
|
+
/** Resolve the effective config for an agent kind, falling back to the default. */
|
|
16
|
+
export declare function resolveAgentConfig(routing: AgentRouting, kind: AgentKind): AgentModelConfig;
|
|
17
|
+
/** The resolvers a caller supplies so a step's model is picked the same way everywhere. */
|
|
18
|
+
export interface StepModelResolvers {
|
|
19
|
+
agentRouting: AgentRouting;
|
|
20
|
+
/** Resolve a model catalog id to a concrete ref; unknown/absent ids return undefined. */
|
|
21
|
+
resolveBlockModel: (modelId: string | undefined) => ModelRef | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Resolve a workspace's per-agent-kind default model id, consulted when the block
|
|
24
|
+
* pins no usable model. Optional: absent → the env routing for the kind is used.
|
|
25
|
+
*/
|
|
26
|
+
resolveWorkspaceModelDefault?: (workspaceId: string, agentKind: string) => Promise<string | undefined>;
|
|
27
|
+
}
|
|
28
|
+
/** What a step needs to resolve its model: which kind, the block's pin, the workspace. */
|
|
29
|
+
export interface StepModelInputs {
|
|
30
|
+
agentKind: string;
|
|
31
|
+
/** The model catalog id pinned on the block, if any. */
|
|
32
|
+
blockModelId: string | undefined;
|
|
33
|
+
/** The workspace the step runs in; required to consult a per-kind default. */
|
|
34
|
+
workspaceId?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Resolve the concrete model ref for a pipeline step with the ONE canonical
|
|
38
|
+
* precedence used across every executor (the inline LLM executor, the container
|
|
39
|
+
* executor and the requirements reviewer): a block's pinned model wins, else the
|
|
40
|
+
* workspace's per-agent-kind default, else the env routing for the kind. Each
|
|
41
|
+
* candidate id is run through {@link StepModelResolvers.resolveBlockModel}, so an
|
|
42
|
+
* unresolvable pin (e.g. a stale id) falls through to the next source rather than
|
|
43
|
+
* silently skipping the workspace default.
|
|
44
|
+
*/
|
|
45
|
+
export declare function resolveStepModelRef(resolvers: StepModelResolvers, inputs: StepModelInputs): Promise<ModelRef>;
|
|
46
|
+
/**
|
|
47
|
+
* Resolve the model ref for an INLINE LLM call (one that runs through the
|
|
48
|
+
* {@link ModelProvider}, not a container harness). Identical precedence to
|
|
49
|
+
* {@link resolveStepModelRef}, but a pinned subscription model — one whose ref
|
|
50
|
+
* carries a container-only `claude-code` / `codex` harness, for which no provider
|
|
51
|
+
* key exists — is degraded to the kind's env-routing default (a provider model the
|
|
52
|
+
* ModelProvider can serve). This is the single place every inline executor routes a
|
|
53
|
+
* block's model through, so a task pinned to a subscription model for its container
|
|
54
|
+
* steps still runs its inline steps instead of hard-failing. See {@link inlineModelRef}.
|
|
55
|
+
*/
|
|
56
|
+
export declare function resolveInlineModelRef(resolvers: StepModelResolvers, inputs: StepModelInputs): Promise<ModelRef>;
|
|
57
|
+
//# sourceMappingURL=routing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../../src/agents/runtime/routing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AASnD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,QAAQ,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,8EAA8E;IAC9E,OAAO,EAAE,gBAAgB,CAAA;IACzB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAA;CACrD;AAED,mFAAmF;AACnF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,GAAG,gBAAgB,CAE3F;AAED,2FAA2F;AAC3F,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,YAAY,CAAA;IAC1B,yFAAyF;IACzF,iBAAiB,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,KAAK,QAAQ,GAAG,SAAS,CAAA;IACxE;;;OAGG;IACH,4BAA4B,CAAC,EAAE,CAC7B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,KACd,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;CACjC;AAED,0FAA0F;AAC1F,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,wDAAwD;IACxD,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,kBAAkB,EAC7B,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,QAAQ,CAAC,CAYnB;AAED;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,kBAAkB,EAC7B,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,QAAQ,CAAC,CAGnB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { inlineModelRef } from '@cat-factory/kernel';
|
|
2
|
+
/** Resolve the effective config for an agent kind, falling back to the default. */
|
|
3
|
+
export function resolveAgentConfig(routing, kind) {
|
|
4
|
+
return routing.byKind[kind] ?? routing.default;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Resolve the concrete model ref for a pipeline step with the ONE canonical
|
|
8
|
+
* precedence used across every executor (the inline LLM executor, the container
|
|
9
|
+
* executor and the requirements reviewer): a block's pinned model wins, else the
|
|
10
|
+
* workspace's per-agent-kind default, else the env routing for the kind. Each
|
|
11
|
+
* candidate id is run through {@link StepModelResolvers.resolveBlockModel}, so an
|
|
12
|
+
* unresolvable pin (e.g. a stale id) falls through to the next source rather than
|
|
13
|
+
* silently skipping the workspace default.
|
|
14
|
+
*/
|
|
15
|
+
export async function resolveStepModelRef(resolvers, inputs) {
|
|
16
|
+
const fromBlock = resolvers.resolveBlockModel(inputs.blockModelId);
|
|
17
|
+
if (fromBlock)
|
|
18
|
+
return fromBlock;
|
|
19
|
+
if (resolvers.resolveWorkspaceModelDefault && inputs.workspaceId) {
|
|
20
|
+
const defaultId = await resolvers.resolveWorkspaceModelDefault(inputs.workspaceId, inputs.agentKind);
|
|
21
|
+
const fromDefault = resolvers.resolveBlockModel(defaultId);
|
|
22
|
+
if (fromDefault)
|
|
23
|
+
return fromDefault;
|
|
24
|
+
}
|
|
25
|
+
return resolveAgentConfig(resolvers.agentRouting, inputs.agentKind).ref;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Resolve the model ref for an INLINE LLM call (one that runs through the
|
|
29
|
+
* {@link ModelProvider}, not a container harness). Identical precedence to
|
|
30
|
+
* {@link resolveStepModelRef}, but a pinned subscription model — one whose ref
|
|
31
|
+
* carries a container-only `claude-code` / `codex` harness, for which no provider
|
|
32
|
+
* key exists — is degraded to the kind's env-routing default (a provider model the
|
|
33
|
+
* ModelProvider can serve). This is the single place every inline executor routes a
|
|
34
|
+
* block's model through, so a task pinned to a subscription model for its container
|
|
35
|
+
* steps still runs its inline steps instead of hard-failing. See {@link inlineModelRef}.
|
|
36
|
+
*/
|
|
37
|
+
export async function resolveInlineModelRef(resolvers, inputs) {
|
|
38
|
+
const ref = await resolveStepModelRef(resolvers, inputs);
|
|
39
|
+
return inlineModelRef(ref, resolveAgentConfig(resolvers.agentRouting, inputs.agentKind).ref);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=routing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing.js","sourceRoot":"","sources":["../../../src/agents/runtime/routing.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAsBpD,mFAAmF;AACnF,MAAM,UAAU,kBAAkB,CAAC,OAAqB,EAAE,IAAe;IACvE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,OAAO,CAAA;AAChD,CAAC;AA0BD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,SAA6B,EAC7B,MAAuB;IAEvB,MAAM,SAAS,GAAG,SAAS,CAAC,iBAAiB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;IAClE,IAAI,SAAS;QAAE,OAAO,SAAS,CAAA;IAC/B,IAAI,SAAS,CAAC,4BAA4B,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACjE,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,4BAA4B,CAC5D,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,SAAS,CACjB,CAAA;QACD,MAAM,WAAW,GAAG,SAAS,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;QAC1D,IAAI,WAAW;YAAE,OAAO,WAAW,CAAA;IACrC,CAAC;IACD,OAAO,kBAAkB,CAAC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAA;AACzE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,SAA6B,EAC7B,MAAuB;IAEvB,MAAM,GAAG,GAAG,MAAM,mBAAmB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IACxD,OAAO,cAAc,CAAC,GAAG,EAAE,kBAAkB,CAAC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAA;AAC9F,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { ToolSet } from 'ai';
|
|
2
|
+
/** Default inline kinds allowed to search the web — the design/research steps. */
|
|
3
|
+
export declare const DEFAULT_INLINE_WEB_SEARCH_KINDS: ReadonlySet<string>;
|
|
4
|
+
/** Default ceiling on provider web searches per inline run (Anthropic `maxUses`). */
|
|
5
|
+
export declare const DEFAULT_INLINE_WEB_SEARCH_MAX_USES = 5;
|
|
6
|
+
/** How inline web search is configured for a deployment (off unless built). */
|
|
7
|
+
export interface InlineWebSearchOptions {
|
|
8
|
+
/** Agent kinds permitted to use provider web search. */
|
|
9
|
+
kinds: ReadonlySet<string>;
|
|
10
|
+
/** Max provider web searches per run (Anthropic `maxUses`; OpenAI manages its own). */
|
|
11
|
+
maxUses: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The web-search guidance appended to an agent's context ONLY when the tools are
|
|
15
|
+
* actually available, so the model is never told about a tool it lacks. The hint is
|
|
16
|
+
* tailored to `kind`; `fetch` controls whether the companion `web_fetch` tool (the Pi
|
|
17
|
+
* container path has it; the inline provider tool does not) is mentioned. Mirrors the
|
|
18
|
+
* harness's own conservative framing: search is for things that change or that the
|
|
19
|
+
* agent is unsure of, not a reflex, and never a substitute for reading the code.
|
|
20
|
+
*/
|
|
21
|
+
export declare function webResearchGuidanceFor(kind: string, opts?: {
|
|
22
|
+
fetch?: boolean;
|
|
23
|
+
}): string;
|
|
24
|
+
/**
|
|
25
|
+
* The provider-hosted web_search tool set for a provider, or undefined when the
|
|
26
|
+
* provider has no server-executed web search the AI SDK can run inline. Only the
|
|
27
|
+
* provider id is consulted — the actual search runs under the model request's own
|
|
28
|
+
* credentials, so this just selects the right provider-defined tool spec.
|
|
29
|
+
*/
|
|
30
|
+
export declare function providerWebSearchTools(provider: string, maxUses?: number): ToolSet | undefined;
|
|
31
|
+
/**
|
|
32
|
+
* Read inline web-search configuration from a deployment's environment, or
|
|
33
|
+
* undefined when it is not enabled. `INLINE_WEB_SEARCH_ENABLED` (truthy) is the
|
|
34
|
+
* single opt-in switch; `INLINE_WEB_SEARCH_KINDS` (comma-separated) overrides the
|
|
35
|
+
* default architect/researcher allow-list, and `INLINE_WEB_SEARCH_MAX_USES` caps
|
|
36
|
+
* searches per run. Off ⇒ the inline agents run exactly as before.
|
|
37
|
+
*/
|
|
38
|
+
export declare function inlineWebSearchOptionsFromEnv(env: {
|
|
39
|
+
INLINE_WEB_SEARCH_ENABLED?: string;
|
|
40
|
+
INLINE_WEB_SEARCH_KINDS?: string;
|
|
41
|
+
INLINE_WEB_SEARCH_MAX_USES?: string;
|
|
42
|
+
}): InlineWebSearchOptions | undefined;
|
|
43
|
+
//# sourceMappingURL=web-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-search.d.ts","sourceRoot":"","sources":["../../../src/agents/runtime/web-search.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAWjC,kFAAkF;AAClF,eAAO,MAAM,+BAA+B,EAAE,WAAW,CAAC,MAAM,CAG9D,CAAA;AAEF,qFAAqF;AACrF,eAAO,MAAM,kCAAkC,IAAI,CAAA;AAEnD,+EAA+E;AAC/E,MAAM,WAAW,sBAAsB;IACrC,wDAAwD;IACxD,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IAC1B,uFAAuF;IACvF,OAAO,EAAE,MAAM,CAAA;CAChB;AA8BD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,MAAM,CAiB3F;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,MAA2C,GACnD,OAAO,GAAG,SAAS,CAYrB;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,GAAG,EAAE;IACjD,yBAAyB,CAAC,EAAE,MAAM,CAAA;IAClC,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,0BAA0B,CAAC,EAAE,MAAM,CAAA;CACpC,GAAG,sBAAsB,GAAG,SAAS,CAerC"}
|