@adonis-agora/agent 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/configure.d.ts +18 -0
- package/dist/configure.d.ts.map +1 -0
- package/dist/configure.js +29 -0
- package/dist/configure.js.map +1 -0
- package/dist/providers/agent_provider.d.ts +25 -0
- package/dist/providers/agent_provider.d.ts.map +1 -0
- package/dist/providers/agent_provider.js +511 -0
- package/dist/providers/agent_provider.js.map +1 -0
- package/dist/src/actor-resolver.d.ts +41 -0
- package/dist/src/actor-resolver.d.ts.map +1 -0
- package/dist/src/agent-deps-factory.d.ts +59 -0
- package/dist/src/agent-deps-factory.d.ts.map +1 -0
- package/dist/src/agent-deps-factory.js +111 -0
- package/dist/src/agent-deps-factory.js.map +1 -0
- package/dist/src/agent-deps.d.ts +42 -0
- package/dist/src/agent-deps.d.ts.map +1 -0
- package/dist/src/agent-deps.js +5 -0
- package/dist/src/agent-deps.js.map +1 -0
- package/dist/src/agent-loop.d.ts +101 -0
- package/dist/src/agent-loop.d.ts.map +1 -0
- package/dist/src/agent-loop.js +396 -0
- package/dist/src/agent-loop.js.map +1 -0
- package/dist/src/agent-registry.d.ts +10 -0
- package/dist/src/agent-registry.d.ts.map +1 -0
- package/dist/src/agent-service.d.ts +50 -0
- package/dist/src/agent-service.d.ts.map +1 -0
- package/dist/src/agent-service.js +82 -0
- package/dist/src/agent-service.js.map +1 -0
- package/dist/src/ai-sdk/ai-sdk-model.d.ts +17 -0
- package/dist/src/ai-sdk/ai-sdk-model.d.ts.map +1 -0
- package/dist/src/ai-sdk/ai-sdk-model.js +263 -0
- package/dist/src/ai-sdk/ai-sdk-model.js.map +1 -0
- package/dist/src/ai-sdk/index.d.ts +2 -0
- package/dist/src/ai-sdk/index.d.ts.map +1 -0
- package/dist/src/ai-tool-ref.d.ts +79 -0
- package/dist/src/ai-tool-ref.d.ts.map +1 -0
- package/dist/src/ai-tool-ref.js +81 -0
- package/dist/src/ai-tool-ref.js.map +1 -0
- package/dist/src/authorizer.d.ts +18 -0
- package/dist/src/authorizer.d.ts.map +1 -0
- package/dist/src/authz/authz-tool-authorizer.d.ts +85 -0
- package/dist/src/authz/authz-tool-authorizer.d.ts.map +1 -0
- package/dist/src/authz/authz-tool-authorizer.js +63 -0
- package/dist/src/authz/authz-tool-authorizer.js.map +1 -0
- package/dist/src/authz/index.d.ts +3 -0
- package/dist/src/authz/index.d.ts.map +1 -0
- package/dist/src/authz/index.js +2 -0
- package/dist/src/authz/index.js.map +1 -0
- package/dist/src/data/data-tool.d.ts +64 -0
- package/dist/src/data/data-tool.d.ts.map +1 -0
- package/dist/src/data/data-tool.js +146 -0
- package/dist/src/data/data-tool.js.map +1 -0
- package/dist/src/data/index.d.ts +7 -0
- package/dist/src/data/index.d.ts.map +1 -0
- package/dist/src/data/index.js +7 -0
- package/dist/src/data/index.js.map +1 -0
- package/dist/src/data/limit.d.ts +12 -0
- package/dist/src/data/limit.d.ts.map +1 -0
- package/dist/src/data/limit.js +29 -0
- package/dist/src/data/limit.js.map +1 -0
- package/dist/src/data/parser.d.ts +27 -0
- package/dist/src/data/parser.d.ts.map +1 -0
- package/dist/src/data/parser.js +18 -0
- package/dist/src/data/parser.js.map +1 -0
- package/dist/src/data/sql-validator.d.ts +37 -0
- package/dist/src/data/sql-validator.d.ts.map +1 -0
- package/dist/src/data/sql-validator.js +92 -0
- package/dist/src/data/sql-validator.js.map +1 -0
- package/dist/src/data/table-access.d.ts +40 -0
- package/dist/src/data/table-access.d.ts.map +1 -0
- package/dist/src/data/table-access.js +41 -0
- package/dist/src/data/table-access.js.map +1 -0
- package/dist/src/data/tenant-scope.d.ts +39 -0
- package/dist/src/data/tenant-scope.d.ts.map +1 -0
- package/dist/src/data/tenant-scope.js +126 -0
- package/dist/src/data/tenant-scope.js.map +1 -0
- package/dist/src/define_config.d.ts +153 -0
- package/dist/src/define_config.d.ts.map +1 -0
- package/dist/src/define_config.js +7 -0
- package/dist/src/define_config.js.map +1 -0
- package/dist/src/diagnostics.d.ts +82 -0
- package/dist/src/diagnostics.d.ts.map +1 -0
- package/dist/src/diagnostics.js +50 -0
- package/dist/src/diagnostics.js.map +1 -0
- package/dist/src/durable/agent-run-context.d.ts +24 -0
- package/dist/src/durable/agent-run-context.d.ts.map +1 -0
- package/dist/src/durable/agent-run-context.js +17 -0
- package/dist/src/durable/agent-run-context.js.map +1 -0
- package/dist/src/durable/agent-run-workflow.d.ts +37 -0
- package/dist/src/durable/agent-run-workflow.d.ts.map +1 -0
- package/dist/src/durable/agent-run-workflow.js +128 -0
- package/dist/src/durable/agent-run-workflow.js.map +1 -0
- package/dist/src/durable/durable-agent-runner.d.ts +25 -0
- package/dist/src/durable/durable-agent-runner.d.ts.map +1 -0
- package/dist/src/durable/durable-agent-runner.js +59 -0
- package/dist/src/durable/durable-agent-runner.js.map +1 -0
- package/dist/src/durable/index.d.ts +17 -0
- package/dist/src/durable/index.d.ts.map +1 -0
- package/dist/src/durable/index.js +20 -0
- package/dist/src/durable/index.js.map +1 -0
- package/dist/src/index.d.ts +55 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +45 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/personas.d.ts +7 -0
- package/dist/src/personas.d.ts.map +1 -0
- package/dist/src/rag/chunk.d.ts +14 -0
- package/dist/src/rag/chunk.d.ts.map +1 -0
- package/dist/src/rag/chunk.js +42 -0
- package/dist/src/rag/chunk.js.map +1 -0
- package/dist/src/rag/embedding-retriever.d.ts +15 -0
- package/dist/src/rag/embedding-retriever.d.ts.map +1 -0
- package/dist/src/rag/embedding-retriever.js +24 -0
- package/dist/src/rag/embedding-retriever.js.map +1 -0
- package/dist/src/rag/filter.d.ts +6 -0
- package/dist/src/rag/filter.d.ts.map +1 -0
- package/dist/src/rag/filter.js +11 -0
- package/dist/src/rag/filter.js.map +1 -0
- package/dist/src/rag/index.d.ts +8 -0
- package/dist/src/rag/index.d.ts.map +1 -0
- package/dist/src/rag/index.js +8 -0
- package/dist/src/rag/index.js.map +1 -0
- package/dist/src/rag/ingest.d.ts +33 -0
- package/dist/src/rag/ingest.d.ts.map +1 -0
- package/dist/src/rag/ingest.js +37 -0
- package/dist/src/rag/ingest.js.map +1 -0
- package/dist/src/rag/memory-vector-store.d.ts +16 -0
- package/dist/src/rag/memory-vector-store.d.ts.map +1 -0
- package/dist/src/rag/memory-vector-store.js +70 -0
- package/dist/src/rag/memory-vector-store.js.map +1 -0
- package/dist/src/rag/pg-vector-store.d.ts +84 -0
- package/dist/src/rag/pg-vector-store.d.ts.map +1 -0
- package/dist/src/rag/pg-vector-store.js +220 -0
- package/dist/src/rag/pg-vector-store.js.map +1 -0
- package/dist/src/rag/vector-store.d.ts +47 -0
- package/dist/src/rag/vector-store.d.ts.map +1 -0
- package/dist/src/rag/vector-store.js +5 -0
- package/dist/src/rag/vector-store.js.map +1 -0
- package/dist/src/rag-media/diagnostics.d.ts +43 -0
- package/dist/src/rag-media/diagnostics.d.ts.map +1 -0
- package/dist/src/rag-media/diagnostics.js +36 -0
- package/dist/src/rag-media/diagnostics.js.map +1 -0
- package/dist/src/rag-media/index.d.ts +5 -0
- package/dist/src/rag-media/index.d.ts.map +1 -0
- package/dist/src/rag-media/index.js +5 -0
- package/dist/src/rag-media/index.js.map +1 -0
- package/dist/src/rag-media/media-events.d.ts +23 -0
- package/dist/src/rag-media/media-events.d.ts.map +1 -0
- package/dist/src/rag-media/media-events.js +28 -0
- package/dist/src/rag-media/media-events.js.map +1 -0
- package/dist/src/rag-media/media-rag-ingestion.d.ts +155 -0
- package/dist/src/rag-media/media-rag-ingestion.d.ts.map +1 -0
- package/dist/src/rag-media/media-rag-ingestion.js +204 -0
- package/dist/src/rag-media/media-rag-ingestion.js.map +1 -0
- package/dist/src/rag-media/text-extractor.d.ts +46 -0
- package/dist/src/rag-media/text-extractor.d.ts.map +1 -0
- package/dist/src/rag-media/text-extractor.js +92 -0
- package/dist/src/rag-media/text-extractor.js.map +1 -0
- package/dist/src/redis-stream-client.d.ts +29 -0
- package/dist/src/redis-stream-client.d.ts.map +1 -0
- package/dist/src/redis-stream-client.js +2 -0
- package/dist/src/redis-stream-client.js.map +1 -0
- package/dist/src/redis-token-stream-sink.d.ts +36 -0
- package/dist/src/redis-token-stream-sink.d.ts.map +1 -0
- package/dist/src/redis-token-stream-sink.js +94 -0
- package/dist/src/redis-token-stream-sink.js.map +1 -0
- package/dist/src/runners/inline-agent-runner.d.ts +26 -0
- package/dist/src/runners/inline-agent-runner.d.ts.map +1 -0
- package/dist/src/runners/inline-agent-runner.js +85 -0
- package/dist/src/runners/inline-agent-runner.js.map +1 -0
- package/dist/src/spi/actor-directory.d.ts +23 -0
- package/dist/src/spi/actor-directory.d.ts.map +1 -0
- package/dist/src/spi/actor-directory.js +2 -0
- package/dist/src/spi/actor-directory.js.map +1 -0
- package/dist/src/spi/actor-resolver.d.ts +18 -0
- package/dist/src/spi/actor-resolver.d.ts.map +1 -0
- package/dist/src/spi/agent-runner.d.ts +20 -0
- package/dist/src/spi/agent-runner.d.ts.map +1 -0
- package/dist/src/spi/agent-store.d.ts +104 -0
- package/dist/src/spi/agent-store.d.ts.map +1 -0
- package/dist/src/spi/agent-store.js +2 -0
- package/dist/src/spi/agent-store.js.map +1 -0
- package/dist/src/spi/attachment-staging.d.ts +27 -0
- package/dist/src/spi/attachment-staging.d.ts.map +1 -0
- package/dist/src/spi/attachment-staging.js +2 -0
- package/dist/src/spi/attachment-staging.js.map +1 -0
- package/dist/src/spi/embedding-provider.d.ts +12 -0
- package/dist/src/spi/embedding-provider.d.ts.map +1 -0
- package/dist/src/spi/embedding-provider.js +2 -0
- package/dist/src/spi/embedding-provider.js.map +1 -0
- package/dist/src/spi/governance-queries.d.ts +215 -0
- package/dist/src/spi/governance-queries.d.ts.map +1 -0
- package/dist/src/spi/governance-queries.js +15 -0
- package/dist/src/spi/governance-queries.js.map +1 -0
- package/dist/src/spi/model-provider.d.ts +41 -0
- package/dist/src/spi/model-provider.d.ts.map +1 -0
- package/dist/src/spi/pricing-store.d.ts +45 -0
- package/dist/src/spi/pricing-store.d.ts.map +1 -0
- package/dist/src/spi/pricing-store.js +24 -0
- package/dist/src/spi/pricing-store.js.map +1 -0
- package/dist/src/spi/quota-store.d.ts +7 -0
- package/dist/src/spi/quota-store.d.ts.map +1 -0
- package/dist/src/spi/reranker.d.ts +17 -0
- package/dist/src/spi/reranker.d.ts.map +1 -0
- package/dist/src/spi/reranker.js +2 -0
- package/dist/src/spi/reranker.js.map +1 -0
- package/dist/src/spi/retriever.d.ts +28 -0
- package/dist/src/spi/retriever.d.ts.map +1 -0
- package/dist/src/spi/retriever.js +11 -0
- package/dist/src/spi/retriever.js.map +1 -0
- package/dist/src/spi/roles-policy.d.ts +11 -0
- package/dist/src/spi/roles-policy.d.ts.map +1 -0
- package/dist/src/spi/tool.d.ts +21 -0
- package/dist/src/spi/tool.d.ts.map +1 -0
- package/dist/src/stores/factory.d.ts +363 -0
- package/dist/src/stores/factory.d.ts.map +1 -0
- package/dist/src/stores/factory.js +341 -0
- package/dist/src/stores/factory.js.map +1 -0
- package/dist/src/stores/ledger-quota.d.ts +23 -0
- package/dist/src/stores/ledger-quota.d.ts.map +1 -0
- package/dist/src/stores/ledger-quota.js +32 -0
- package/dist/src/stores/ledger-quota.js.map +1 -0
- package/dist/src/stores/lucid-governance-queries.d.ts +73 -0
- package/dist/src/stores/lucid-governance-queries.d.ts.map +1 -0
- package/dist/src/stores/lucid-governance-queries.js +510 -0
- package/dist/src/stores/lucid-governance-queries.js.map +1 -0
- package/dist/src/stores/lucid-pricing.d.ts +20 -0
- package/dist/src/stores/lucid-pricing.d.ts.map +1 -0
- package/dist/src/stores/lucid-pricing.js +67 -0
- package/dist/src/stores/lucid-pricing.js.map +1 -0
- package/dist/src/stores/lucid-schema.d.ts +37 -0
- package/dist/src/stores/lucid-schema.d.ts.map +1 -0
- package/dist/src/stores/lucid-schema.js +139 -0
- package/dist/src/stores/lucid-schema.js.map +1 -0
- package/dist/src/stores/lucid.d.ts +73 -0
- package/dist/src/stores/lucid.d.ts.map +1 -0
- package/dist/src/stores/lucid.js +400 -0
- package/dist/src/stores/lucid.js.map +1 -0
- package/dist/src/telescope/dashboard.d.ts +21 -0
- package/dist/src/telescope/dashboard.d.ts.map +1 -0
- package/dist/src/telescope/dashboard.js +140 -0
- package/dist/src/telescope/dashboard.js.map +1 -0
- package/dist/src/telescope/data-providers.d.ts +39 -0
- package/dist/src/telescope/data-providers.d.ts.map +1 -0
- package/dist/src/telescope/data-providers.js +345 -0
- package/dist/src/telescope/data-providers.js.map +1 -0
- package/dist/src/telescope/extension.d.ts +27 -0
- package/dist/src/telescope/extension.d.ts.map +1 -0
- package/dist/src/telescope/extension.js +45 -0
- package/dist/src/telescope/extension.js.map +1 -0
- package/dist/src/telescope/index.d.ts +5 -0
- package/dist/src/telescope/index.d.ts.map +1 -0
- package/dist/src/telescope/index.js +4 -0
- package/dist/src/telescope/index.js.map +1 -0
- package/dist/src/telescope/telescope-sdk.d.ts +126 -0
- package/dist/src/telescope/telescope-sdk.d.ts.map +1 -0
- package/dist/src/telescope/telescope-sdk.js +15 -0
- package/dist/src/telescope/telescope-sdk.js.map +1 -0
- package/dist/src/testing/fake-embedding-provider.d.ts +37 -0
- package/dist/src/testing/fake-embedding-provider.d.ts.map +1 -0
- package/dist/src/testing/fake-embedding-provider.js +67 -0
- package/dist/src/testing/fake-embedding-provider.js.map +1 -0
- package/dist/src/testing/fake-media.d.ts +44 -0
- package/dist/src/testing/fake-media.d.ts.map +1 -0
- package/dist/src/testing/fake-media.js +69 -0
- package/dist/src/testing/fake-media.js.map +1 -0
- package/dist/src/testing/fake-model-provider.d.ts +29 -0
- package/dist/src/testing/fake-model-provider.d.ts.map +1 -0
- package/dist/src/testing/in-memory-actor-directory.d.ts +14 -0
- package/dist/src/testing/in-memory-actor-directory.d.ts.map +1 -0
- package/dist/src/testing/in-memory-actor-directory.js +27 -0
- package/dist/src/testing/in-memory-actor-directory.js.map +1 -0
- package/dist/src/testing/in-memory-attachment-staging.d.ts +22 -0
- package/dist/src/testing/in-memory-attachment-staging.d.ts.map +1 -0
- package/dist/src/testing/in-memory-attachment-staging.js +28 -0
- package/dist/src/testing/in-memory-attachment-staging.js.map +1 -0
- package/dist/src/testing/in-memory-governance-queries.d.ts +34 -0
- package/dist/src/testing/in-memory-governance-queries.d.ts.map +1 -0
- package/dist/src/testing/in-memory-governance-queries.js +373 -0
- package/dist/src/testing/in-memory-governance-queries.js.map +1 -0
- package/dist/src/testing/in-memory-pricing.d.ts +13 -0
- package/dist/src/testing/in-memory-pricing.d.ts.map +1 -0
- package/dist/src/testing/in-memory-pricing.js +27 -0
- package/dist/src/testing/in-memory-pricing.js.map +1 -0
- package/dist/src/testing/in-memory-quota.d.ts +11 -0
- package/dist/src/testing/in-memory-quota.d.ts.map +1 -0
- package/dist/src/testing/in-memory-sink.d.ts +14 -0
- package/dist/src/testing/in-memory-sink.d.ts.map +1 -0
- package/dist/src/testing/in-memory-store.d.ts +119 -0
- package/dist/src/testing/in-memory-store.d.ts.map +1 -0
- package/dist/src/testing/in-memory-store.js +317 -0
- package/dist/src/testing/in-memory-store.js.map +1 -0
- package/dist/src/testing/index.d.ts +11 -0
- package/dist/src/testing/index.d.ts.map +1 -0
- package/dist/src/testing/index.js +11 -0
- package/dist/src/testing/index.js.map +1 -0
- package/dist/src/tool-discovery.d.ts +35 -0
- package/dist/src/tool-discovery.d.ts.map +1 -0
- package/dist/src/tool-registry.d.ts +45 -0
- package/dist/src/tool-registry.d.ts.map +1 -0
- package/dist/src/tool-retry.d.ts +56 -0
- package/dist/src/tool-retry.d.ts.map +1 -0
- package/dist/src/tool-retry.js +95 -0
- package/dist/src/tool-retry.js.map +1 -0
- package/dist/src/types.d.ts +222 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/stubs/config/agent.stub +55 -0
- package/dist/stubs/database/migrations/create_agent_rag_chunks.stub +41 -0
- package/dist/stubs/database/migrations/create_agent_run_tracking.stub +80 -0
- package/dist/stubs/database/migrations/create_agent_tables.stub +113 -0
- package/package.json +174 -0
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
import { publishAgentDelegated, publishAgentMessage, publishAgentRetrieved, publishAgentRunFinished, publishAgentRunStarted, publishAgentToolCall, publishAgentToolRetry, } from './diagnostics.js';
|
|
2
|
+
import { estimateCost, } from './spi/pricing-store.js';
|
|
3
|
+
import { invokeWithTransientRetry } from './tool-retry.js';
|
|
4
|
+
/** Renders retrieved passages as a numbered, citable context block appended to the system prompt. */
|
|
5
|
+
function buildContextBlock(passages) {
|
|
6
|
+
const items = passages
|
|
7
|
+
.map((passage, index) => {
|
|
8
|
+
const label = passage.source !== undefined ? ` (${passage.source})` : '';
|
|
9
|
+
return `[${index + 1}]${label} ${passage.text}`;
|
|
10
|
+
})
|
|
11
|
+
.join('\n\n');
|
|
12
|
+
return `<retrieved_context>\n${items}\n</retrieved_context>\nUse the retrieved context above to answer when relevant, and cite sources by their bracket number.`;
|
|
13
|
+
}
|
|
14
|
+
/** Intersect two allow-lists where `undefined` means "no restriction". */
|
|
15
|
+
function intersectAllow(a, b) {
|
|
16
|
+
if (a === undefined) {
|
|
17
|
+
return b;
|
|
18
|
+
}
|
|
19
|
+
if (b === undefined) {
|
|
20
|
+
return a;
|
|
21
|
+
}
|
|
22
|
+
const second = new Set(b);
|
|
23
|
+
return a.filter((name) => second.has(name));
|
|
24
|
+
}
|
|
25
|
+
export class QuotaExceededError extends Error {
|
|
26
|
+
constructor() {
|
|
27
|
+
super('Daily token quota exceeded');
|
|
28
|
+
this.name = 'QuotaExceededError';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** Resolve a prompt that may be a flat string or a {@link PromptBuilder}. */
|
|
32
|
+
async function resolvePrompt(prompt, ctx) {
|
|
33
|
+
return typeof prompt === 'function' ? prompt(ctx) : prompt;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The effective system prompt for a turn: resolve the agent's base prompt first, then — if the
|
|
37
|
+
* request selected a persona — resolve the persona prompt with that base as `basePrompt`, so a
|
|
38
|
+
* persona builder can wrap the agent's base rather than discard it.
|
|
39
|
+
*/
|
|
40
|
+
async function resolveSystemPrompt(deps, input) {
|
|
41
|
+
const base = {
|
|
42
|
+
actor: input.actor,
|
|
43
|
+
...(input.persona !== undefined ? { persona: input.persona } : {}),
|
|
44
|
+
...(input.pageContext !== undefined ? { pageContext: input.pageContext } : {}),
|
|
45
|
+
};
|
|
46
|
+
const basePrompt = await resolvePrompt(deps.systemPrompt, { ...base, basePrompt: '' });
|
|
47
|
+
if (input.persona === undefined) {
|
|
48
|
+
return basePrompt;
|
|
49
|
+
}
|
|
50
|
+
return resolvePrompt(input.persona.systemPrompt, { ...base, basePrompt });
|
|
51
|
+
}
|
|
52
|
+
/** An `agent`-kind tool's input is `{ task }` by convention; fall back to a JSON dump. */
|
|
53
|
+
function extractTask(input) {
|
|
54
|
+
if (typeof input === 'object' && input !== null && 'task' in input) {
|
|
55
|
+
const task = input.task;
|
|
56
|
+
if (typeof task === 'string') {
|
|
57
|
+
return task;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return JSON.stringify(input);
|
|
61
|
+
}
|
|
62
|
+
function deriveTitle(userText) {
|
|
63
|
+
const trimmed = userText.trim().replace(/\s+/g, ' ');
|
|
64
|
+
return trimmed.length > 60 ? `${trimmed.slice(0, 57)}...` : trimmed || 'New chat';
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* A step's cost: the provider's own reported figure when it has one (a gateway), else an estimate
|
|
68
|
+
* from `price` when the model has a current price row, else `null` — never a fabricated `0` for
|
|
69
|
+
* "we don't know". Mirrors the reference resolution order exactly.
|
|
70
|
+
*/
|
|
71
|
+
function resolveCostUsd(usage, reportedCostUsd, price) {
|
|
72
|
+
if (reportedCostUsd !== undefined) {
|
|
73
|
+
return reportedCostUsd;
|
|
74
|
+
}
|
|
75
|
+
return price === undefined ? null : estimateCost(usage, price);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* The provider-agnostic agent turn, reused by both the inline and durable runners.
|
|
79
|
+
* It drives the model→tools→model iteration; the runner supplies the `step`/`awaitApproval`
|
|
80
|
+
* hooks that make the same loop body either in-process or a replay-safe durable workflow.
|
|
81
|
+
*/
|
|
82
|
+
export async function runAgentLoop(deps, input, hooks) {
|
|
83
|
+
const maxSteps = deps.maxSteps ?? 8;
|
|
84
|
+
const persona = input.persona;
|
|
85
|
+
let system = await resolveSystemPrompt(deps, input);
|
|
86
|
+
// Open the run (turn) row FIRST — before the quota gate — so even a quota-rejected run is tracked
|
|
87
|
+
// (the runner settles it `failed`). A checkpointed step so a durable replay reuses the ONE row (no
|
|
88
|
+
// duplicate on resume); `run_id` is then stamped onto every message / tool call / usage row below.
|
|
89
|
+
await hooks.step('persist:run:start', () => deps.store.recordRunStart({
|
|
90
|
+
runId: hooks.runId,
|
|
91
|
+
threadId: input.threadId,
|
|
92
|
+
actor: input.actor,
|
|
93
|
+
durable: hooks.durable ?? false,
|
|
94
|
+
...(input.agentName !== undefined ? { agentName: input.agentName } : {}),
|
|
95
|
+
}));
|
|
96
|
+
if (deps.quota !== undefined) {
|
|
97
|
+
const quota = deps.quota;
|
|
98
|
+
const state = await hooks.step('quota:check', () => quota.check(input.actor.id, deps.day));
|
|
99
|
+
if (!state.withinLimit) {
|
|
100
|
+
throw new QuotaExceededError();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Attachments arrive already staged (the upload route + AttachmentStagingStore turned bytes into a
|
|
104
|
+
// model-fetchable url), so persisting them here is a plain field write — no IO to wrap in a step.
|
|
105
|
+
// The multimodal content parts are built by the model adapter at turn time from the url.
|
|
106
|
+
await hooks.step('persist:user', () => deps.store.appendMessage({
|
|
107
|
+
threadId: input.threadId,
|
|
108
|
+
role: 'user',
|
|
109
|
+
content: input.userText,
|
|
110
|
+
runId: hooks.runId,
|
|
111
|
+
...(persona !== undefined ? { persona: persona.id } : {}),
|
|
112
|
+
...(input.attachments !== undefined ? { attachments: input.attachments } : {}),
|
|
113
|
+
}));
|
|
114
|
+
const thread = await hooks.step('load:thread', () => deps.store.getThread(input.threadId));
|
|
115
|
+
const modelMessages = (thread?.messages ?? []).map((message) => ({
|
|
116
|
+
role: message.role,
|
|
117
|
+
content: message.content,
|
|
118
|
+
...(message.toolCalls !== undefined ? { toolCalls: message.toolCalls } : {}),
|
|
119
|
+
...(message.toolResults !== undefined ? { toolResults: message.toolResults } : {}),
|
|
120
|
+
...(message.attachments !== undefined ? { attachments: message.attachments } : {}),
|
|
121
|
+
}));
|
|
122
|
+
const writer = await hooks.openSink();
|
|
123
|
+
let lastText = '';
|
|
124
|
+
let steps = 0;
|
|
125
|
+
let totalInput = 0;
|
|
126
|
+
let totalOutput = 0;
|
|
127
|
+
// Run-level cost rollup: sum only the steps whose cost we actually know (provider-reported or
|
|
128
|
+
// priced). If NO step had a cost, the run's `cost_usd` stays `null` — never a fabricated `0`.
|
|
129
|
+
let totalCost = 0;
|
|
130
|
+
let hasCost = false;
|
|
131
|
+
publishAgentRunStarted({
|
|
132
|
+
runId: hooks.runId,
|
|
133
|
+
threadId: input.threadId,
|
|
134
|
+
actorId: input.actor.id,
|
|
135
|
+
...(persona !== undefined ? { persona: persona.id } : {}),
|
|
136
|
+
});
|
|
137
|
+
// Inject-mode RAG: retrieve once for the user message and fold the passages into the system prompt.
|
|
138
|
+
// Wrapped in `hooks.step` so a durable replay reuses the SAME passages (no re-query, deterministic
|
|
139
|
+
// prompt). Recorded below as a synthetic auto-executed `retrieve` tool call on the first assistant
|
|
140
|
+
// message, so citations surface through the same machinery as an agentic search would.
|
|
141
|
+
let injectedPassages;
|
|
142
|
+
if (deps.retriever !== undefined) {
|
|
143
|
+
const retriever = deps.retriever;
|
|
144
|
+
const topK = deps.retrievalTopK ?? 5;
|
|
145
|
+
const passages = await hooks.step('retrieve', () => retriever.retrieve(input.userText, { topK }));
|
|
146
|
+
if (passages.length > 0) {
|
|
147
|
+
injectedPassages = passages;
|
|
148
|
+
system = `${system}\n\n${buildContextBlock(passages)}`;
|
|
149
|
+
}
|
|
150
|
+
publishAgentRetrieved({
|
|
151
|
+
runId: hooks.runId,
|
|
152
|
+
queryLength: input.userText.length,
|
|
153
|
+
count: passages.length,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
// Fetched ONCE per run (not per step) and reused for every step's cost estimate below. Returned as
|
|
157
|
+
// a plain array (not the Map built from it) so a durable runner can JSON-cache the step's result.
|
|
158
|
+
let prices = [];
|
|
159
|
+
if (deps.pricingStore !== undefined) {
|
|
160
|
+
const pricingStore = deps.pricingStore;
|
|
161
|
+
prices = await hooks.step('pricing:list', () => pricingStore.listCurrentPrices());
|
|
162
|
+
}
|
|
163
|
+
const priceByModel = new Map(prices.map((price) => [price.modelId, price]));
|
|
164
|
+
// NOTE: no try/finally around this loop. A durable runner suspends by THROWING through the stack
|
|
165
|
+
// at `awaitApproval` (ctx.waitForSignal); a finally would then call writer.end() on every suspend
|
|
166
|
+
// and prematurely close the live stream. We only end on normal completion — the throw propagates
|
|
167
|
+
// to the engine, and the resumed replay reaches the writer.end() below.
|
|
168
|
+
for (let i = 0; i < maxSteps; i += 1) {
|
|
169
|
+
const tools = await deps.registry.definitionsFor(input.actor, deps.rolesPolicy, intersectAllow(persona?.allowedTools, deps.toolAllowList));
|
|
170
|
+
const turn = await hooks.step(`llm:${i}`, () => deps.model.runTurn({ system, messages: modelMessages, tools, sink: writer }));
|
|
171
|
+
// provider-reported model wins over the configured fallback, so cost can't misattribute
|
|
172
|
+
const resolvedModelId = turn.modelId ?? deps.modelId ?? 'unknown';
|
|
173
|
+
// Provider-reported spend wins; else an estimate from the (once-per-run cached) price list; else
|
|
174
|
+
// `null` — stamped onto the persisted assistant message's `usage.costUsd` below.
|
|
175
|
+
const costUsd = resolveCostUsd(turn.usage, turn.costUsd, priceByModel.get(resolvedModelId));
|
|
176
|
+
await hooks.step(`persist:usage:${i}`, () => deps.store.recordUsage({
|
|
177
|
+
threadId: input.threadId,
|
|
178
|
+
actorRef: input.actor.id,
|
|
179
|
+
runId: hooks.runId,
|
|
180
|
+
modelId: resolvedModelId,
|
|
181
|
+
purpose: 'chat',
|
|
182
|
+
usage: turn.usage,
|
|
183
|
+
// persist the provider's actual cost when reported; the read-model prefers it over pricing
|
|
184
|
+
...(turn.costUsd !== undefined ? { costUsd: turn.costUsd } : {}),
|
|
185
|
+
}));
|
|
186
|
+
if (costUsd !== null) {
|
|
187
|
+
totalCost += costUsd;
|
|
188
|
+
hasCost = true;
|
|
189
|
+
}
|
|
190
|
+
if (deps.quota !== undefined) {
|
|
191
|
+
const quota = deps.quota;
|
|
192
|
+
await hooks.step(`quota:bump:${i}`, () => quota.bump(input.actor.id, deps.day, turn.usage.inputTokens + turn.usage.outputTokens));
|
|
193
|
+
}
|
|
194
|
+
steps += 1;
|
|
195
|
+
totalInput += turn.usage.inputTokens;
|
|
196
|
+
totalOutput += turn.usage.outputTokens;
|
|
197
|
+
lastText = turn.text;
|
|
198
|
+
publishAgentMessage({
|
|
199
|
+
runId: hooks.runId,
|
|
200
|
+
threadId: input.threadId,
|
|
201
|
+
role: 'assistant',
|
|
202
|
+
textLength: turn.text.length,
|
|
203
|
+
});
|
|
204
|
+
const assistant = await hooks.step(`persist:assistant:${i}`, () => deps.store.appendMessage({
|
|
205
|
+
threadId: input.threadId,
|
|
206
|
+
role: 'assistant',
|
|
207
|
+
content: turn.text,
|
|
208
|
+
runId: hooks.runId,
|
|
209
|
+
usage: { ...turn.usage, costUsd },
|
|
210
|
+
...(persona !== undefined ? { persona: persona.id } : {}),
|
|
211
|
+
...(turn.toolCalls.length > 0 ? { toolCalls: turn.toolCalls } : {}),
|
|
212
|
+
}));
|
|
213
|
+
modelMessages.push({
|
|
214
|
+
role: 'assistant',
|
|
215
|
+
content: turn.text,
|
|
216
|
+
...(turn.toolCalls.length > 0 ? { toolCalls: turn.toolCalls } : {}),
|
|
217
|
+
});
|
|
218
|
+
// Record inject-mode retrieval as a synthetic auto-executed `retrieve` tool call on the assistant
|
|
219
|
+
// message it informed — so its passages persist and render as citations exactly like an agentic
|
|
220
|
+
// search would, without a new message field. One durable step keeps replay from re-writing it.
|
|
221
|
+
if (i === 0 && injectedPassages !== undefined) {
|
|
222
|
+
const passages = injectedPassages;
|
|
223
|
+
const toolCallId = `retrieve-${assistant.id}`;
|
|
224
|
+
await hooks.step(`persist:retrieval:${assistant.id}`, async () => {
|
|
225
|
+
await deps.store.recordToolCall({
|
|
226
|
+
toolCallId,
|
|
227
|
+
messageId: assistant.id,
|
|
228
|
+
toolName: 'retrieve',
|
|
229
|
+
toolType: 'read',
|
|
230
|
+
input: { query: input.userText },
|
|
231
|
+
status: 'auto_executed',
|
|
232
|
+
runId: hooks.runId,
|
|
233
|
+
});
|
|
234
|
+
await deps.store.updateToolCall({ toolCallId, status: 'executed', output: { passages } });
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
if (turn.toolCalls.length === 0) {
|
|
238
|
+
break;
|
|
239
|
+
}
|
|
240
|
+
const results = [];
|
|
241
|
+
for (const call of turn.toolCalls) {
|
|
242
|
+
const spec = deps.registry.spec(call.name);
|
|
243
|
+
const toolType = spec?.kind ?? 'read';
|
|
244
|
+
const ctx = {
|
|
245
|
+
actor: input.actor,
|
|
246
|
+
threadId: input.threadId,
|
|
247
|
+
runId: hooks.runId,
|
|
248
|
+
requestId: hooks.runId,
|
|
249
|
+
...(persona !== undefined ? { persona } : {}),
|
|
250
|
+
...(input.pageContext !== undefined ? { pageContext: input.pageContext } : {}),
|
|
251
|
+
...(deps.host !== undefined ? { host: deps.host } : {}),
|
|
252
|
+
};
|
|
253
|
+
// Delegation: an `agent`-kind tool runs another agent. Handled at the LOOP level (not in a
|
|
254
|
+
// step) because the durable runner maps it to `ctx.child`, a ctx-level suspend point.
|
|
255
|
+
if (toolType === 'agent') {
|
|
256
|
+
const targetAgent = spec?.targetAgent ?? call.name;
|
|
257
|
+
const task = extractTask(call.input);
|
|
258
|
+
await hooks.step(`persist:toolcall:${call.id}`, () => deps.store.recordToolCall({
|
|
259
|
+
toolCallId: call.id,
|
|
260
|
+
messageId: assistant.id,
|
|
261
|
+
toolName: call.name,
|
|
262
|
+
toolType: 'read',
|
|
263
|
+
input: call.input,
|
|
264
|
+
status: 'auto_executed',
|
|
265
|
+
runId: hooks.runId,
|
|
266
|
+
}));
|
|
267
|
+
publishAgentDelegated({
|
|
268
|
+
runId: hooks.runId,
|
|
269
|
+
toAgent: targetAgent,
|
|
270
|
+
...(input.agentName !== undefined ? { fromAgent: input.agentName } : {}),
|
|
271
|
+
});
|
|
272
|
+
const sub = hooks.runAgent
|
|
273
|
+
? await hooks.runAgent(targetAgent, task)
|
|
274
|
+
: { text: `(no multi-agent support wired; cannot reach "${targetAgent}")` };
|
|
275
|
+
await hooks.step(`persist:toolexec:${call.id}`, () => deps.store.updateToolCall({ toolCallId: call.id, status: 'executed', output: sub }));
|
|
276
|
+
results.push({ id: call.id, name: call.name, output: sub });
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
if (toolType === 'action') {
|
|
280
|
+
await hooks.step(`persist:toolcall:${call.id}`, () => deps.store.recordToolCall({
|
|
281
|
+
toolCallId: call.id,
|
|
282
|
+
messageId: assistant.id,
|
|
283
|
+
toolName: call.name,
|
|
284
|
+
toolType: 'action',
|
|
285
|
+
input: call.input,
|
|
286
|
+
status: 'pending_approval',
|
|
287
|
+
runId: hooks.runId,
|
|
288
|
+
}));
|
|
289
|
+
const decision = await hooks.awaitApproval(call, ctx);
|
|
290
|
+
if (!decision.approved) {
|
|
291
|
+
await hooks.step(`persist:toolreject:${call.id}`, () => deps.store.updateToolCall({
|
|
292
|
+
toolCallId: call.id,
|
|
293
|
+
status: 'rejected',
|
|
294
|
+
...(decision.reason !== undefined ? { error: decision.reason } : {}),
|
|
295
|
+
}));
|
|
296
|
+
results.push({
|
|
297
|
+
id: call.id,
|
|
298
|
+
name: call.name,
|
|
299
|
+
output: { rejected: true, reason: decision.reason ?? 'rejected by user' },
|
|
300
|
+
error: 'rejected',
|
|
301
|
+
});
|
|
302
|
+
publishAgentToolCall({
|
|
303
|
+
runId: hooks.runId,
|
|
304
|
+
toolName: call.name,
|
|
305
|
+
toolType,
|
|
306
|
+
status: 'rejected',
|
|
307
|
+
});
|
|
308
|
+
continue;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
await hooks.step(`persist:toolcall:${call.id}`, () => deps.store.recordToolCall({
|
|
313
|
+
toolCallId: call.id,
|
|
314
|
+
messageId: assistant.id,
|
|
315
|
+
toolName: call.name,
|
|
316
|
+
toolType: 'read',
|
|
317
|
+
input: call.input,
|
|
318
|
+
status: 'auto_executed',
|
|
319
|
+
runId: hooks.runId,
|
|
320
|
+
}));
|
|
321
|
+
}
|
|
322
|
+
try {
|
|
323
|
+
// The retry loop runs INSIDE the `tool:<call.id>` step so it stays replay-safe: a durable
|
|
324
|
+
// step memoizes only its successful result, so on replay the whole step returns cached and
|
|
325
|
+
// the retries never re-run (side effects happen exactly once). A classified-transient error
|
|
326
|
+
// (DB deadlock / lock-wait timeout / serialization failure) is retried in place; any other
|
|
327
|
+
// failure surfaces immediately as before. `false` disables retry entirely.
|
|
328
|
+
const output = await hooks.step(`tool:${call.id}`, () => invokeWithTransientRetry(() => deps.registry.invoke(call.name, call.input, ctx, deps.rolesPolicy), deps.toolTransientRetry ?? {}, {
|
|
329
|
+
...(hooks.isControlFlowError !== undefined
|
|
330
|
+
? { isControlFlowError: hooks.isControlFlowError }
|
|
331
|
+
: {}),
|
|
332
|
+
onRetry: (attempt, retryError) => {
|
|
333
|
+
publishAgentToolRetry({
|
|
334
|
+
runId: hooks.runId,
|
|
335
|
+
toolName: call.name,
|
|
336
|
+
toolCallId: call.id,
|
|
337
|
+
attempt,
|
|
338
|
+
message: retryError instanceof Error ? retryError.message : String(retryError),
|
|
339
|
+
});
|
|
340
|
+
},
|
|
341
|
+
}));
|
|
342
|
+
await hooks.step(`persist:toolexec:${call.id}`, () => deps.store.updateToolCall({
|
|
343
|
+
toolCallId: call.id,
|
|
344
|
+
status: 'executed',
|
|
345
|
+
output,
|
|
346
|
+
...(toolType === 'action' ? { executedByRef: input.actor.id } : {}),
|
|
347
|
+
}));
|
|
348
|
+
results.push({ id: call.id, name: call.name, output });
|
|
349
|
+
publishAgentToolCall({
|
|
350
|
+
runId: hooks.runId,
|
|
351
|
+
toolName: call.name,
|
|
352
|
+
toolType,
|
|
353
|
+
status: 'executed',
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
catch (error) {
|
|
357
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
358
|
+
await hooks.step(`persist:toolfail:${call.id}`, () => deps.store.updateToolCall({ toolCallId: call.id, status: 'failed', error: message }));
|
|
359
|
+
results.push({ id: call.id, name: call.name, output: null, error: message });
|
|
360
|
+
publishAgentToolCall({
|
|
361
|
+
runId: hooks.runId,
|
|
362
|
+
toolName: call.name,
|
|
363
|
+
toolType,
|
|
364
|
+
status: 'failed',
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
modelMessages.push({ role: 'user', content: '', toolResults: results });
|
|
369
|
+
}
|
|
370
|
+
if (thread !== null && (thread.title === '' || thread.title === 'New chat')) {
|
|
371
|
+
await hooks.step('persist:title', () => deps.store.setTitle(input.threadId, deriveTitle(input.userText)));
|
|
372
|
+
}
|
|
373
|
+
// Settle the run `completed` with its rollup. Normal completion only — the loop never records a
|
|
374
|
+
// failure (it doesn't catch its own crash; that's the runner's job). A checkpointed step so a
|
|
375
|
+
// resumed durable replay settles the ONE row exactly once, and `recordRunEnd` is first-terminal so
|
|
376
|
+
// this can never overwrite a `failed`/`cancelled` a concurrent cancel already wrote.
|
|
377
|
+
await hooks.step('persist:run:end', () => deps.store.recordRunEnd({
|
|
378
|
+
runId: hooks.runId,
|
|
379
|
+
status: 'completed',
|
|
380
|
+
finishedAt: Date.now(),
|
|
381
|
+
stepCount: steps,
|
|
382
|
+
inputTokens: totalInput,
|
|
383
|
+
outputTokens: totalOutput,
|
|
384
|
+
...(hasCost ? { costUsd: totalCost } : {}),
|
|
385
|
+
}));
|
|
386
|
+
await writer.end();
|
|
387
|
+
publishAgentRunFinished({
|
|
388
|
+
runId: hooks.runId,
|
|
389
|
+
threadId: input.threadId,
|
|
390
|
+
steps,
|
|
391
|
+
inputTokens: totalInput,
|
|
392
|
+
outputTokens: totalOutput,
|
|
393
|
+
});
|
|
394
|
+
return { text: lastText };
|
|
395
|
+
}
|
|
396
|
+
//# sourceMappingURL=agent-loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-loop.js","sourceRoot":"","sources":["../../src/agent-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AgentDefinition } from './types.js';
|
|
2
|
+
/** Holds the named agent definitions registered via `AgentModule.forFeature([...])`. */
|
|
3
|
+
export declare class AgentRegistry {
|
|
4
|
+
private readonly definitions;
|
|
5
|
+
register(definition: AgentDefinition): void;
|
|
6
|
+
get(name: string): AgentDefinition | undefined;
|
|
7
|
+
has(name: string): boolean;
|
|
8
|
+
list(): AgentDefinition[];
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=agent-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-registry.d.ts","sourceRoot":"","sources":["../../src/agent-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,wFAAwF;AACxF,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;IAElE,QAAQ,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI;IAI3C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAI9C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,IAAI,IAAI,eAAe,EAAE;CAG1B"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { AgentDepsFactory } from './agent-deps-factory.js';
|
|
2
|
+
import type { AgentRunner } from './spi/agent-runner.js';
|
|
3
|
+
import type { AgentStore } from './spi/agent-store.js';
|
|
4
|
+
import type { Actor, MessageAttachment, PageContext, Persona, ThreadDetail, ThreadSummary } from './types.js';
|
|
5
|
+
export interface ChatParams {
|
|
6
|
+
actor: Actor;
|
|
7
|
+
message: string;
|
|
8
|
+
threadId?: string;
|
|
9
|
+
agentName?: string;
|
|
10
|
+
personaId?: string;
|
|
11
|
+
pageContext?: PageContext;
|
|
12
|
+
/**
|
|
13
|
+
* Already-staged attachments (image/PDF) for this message — each an `{ mediaId, url, contentType,
|
|
14
|
+
* name }` produced by the `POST /agent/attachments` upload route (or the host's own staging). The
|
|
15
|
+
* lib never fetches bytes; the model adapter renders them as native content parts from `url`.
|
|
16
|
+
*/
|
|
17
|
+
attachments?: MessageAttachment[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The framework-agnostic orchestration facade the `/agent` routes call: start a run, subscribe to
|
|
21
|
+
* its live token stream, deliver HITL decisions, and read/mutate threads. It owns no HTTP — the
|
|
22
|
+
* provider's route handlers resolve the actor and pipe the SSE, then delegate here.
|
|
23
|
+
*/
|
|
24
|
+
export declare class AgentService {
|
|
25
|
+
private readonly runner;
|
|
26
|
+
private readonly store;
|
|
27
|
+
private readonly deps;
|
|
28
|
+
constructor(runner: AgentRunner, store: AgentStore, deps: AgentDepsFactory);
|
|
29
|
+
chat(params: ChatParams): Promise<{
|
|
30
|
+
runId: string;
|
|
31
|
+
threadId: string;
|
|
32
|
+
}>;
|
|
33
|
+
subscribe(runId: string): AsyncIterable<Uint8Array>;
|
|
34
|
+
approve(runId: string, toolCallId: string): Promise<void>;
|
|
35
|
+
reject(runId: string, toolCallId: string, reason?: string): Promise<void>;
|
|
36
|
+
cancel(runId: string): Promise<void>;
|
|
37
|
+
resolvePersona(agentName?: string, id?: string): Persona | undefined;
|
|
38
|
+
personaCatalog(agentName?: string): {
|
|
39
|
+
id: string;
|
|
40
|
+
label: string;
|
|
41
|
+
}[];
|
|
42
|
+
listThreads(actorRef: string): Promise<ThreadSummary[]>;
|
|
43
|
+
getThread(threadId: string): Promise<ThreadDetail | null>;
|
|
44
|
+
deleteThread(threadId: string): Promise<void>;
|
|
45
|
+
forkThread(threadId: string, fromMessageId: string): Promise<ThreadSummary>;
|
|
46
|
+
quotaToday(actorRef: string): Promise<{
|
|
47
|
+
usedTokens: number;
|
|
48
|
+
}>;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=agent-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-service.d.ts","sourceRoot":"","sources":["../../src/agent-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EACV,KAAK,EAEL,iBAAiB,EACjB,WAAW,EACX,OAAO,EACP,YAAY,EACZ,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;;OAIG;IACH,WAAW,CAAC,EAAE,iBAAiB,EAAE,CAAC;CACnC;AAED;;;;GAIG;AACH,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAFJ,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,gBAAgB;IAGnC,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IA4B5E,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC;IAInD,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzE,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpC,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAKpE,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE;IAOnE,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAIvD,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAIzD,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAIrE,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CAGpE"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { utcDay } from './agent-deps.js';
|
|
2
|
+
/**
|
|
3
|
+
* The framework-agnostic orchestration facade the `/agent` routes call: start a run, subscribe to
|
|
4
|
+
* its live token stream, deliver HITL decisions, and read/mutate threads. It owns no HTTP — the
|
|
5
|
+
* provider's route handlers resolve the actor and pipe the SSE, then delegate here.
|
|
6
|
+
*/
|
|
7
|
+
export class AgentService {
|
|
8
|
+
runner;
|
|
9
|
+
store;
|
|
10
|
+
deps;
|
|
11
|
+
constructor(runner, store, deps) {
|
|
12
|
+
this.runner = runner;
|
|
13
|
+
this.store = store;
|
|
14
|
+
this.deps = deps;
|
|
15
|
+
}
|
|
16
|
+
async chat(params) {
|
|
17
|
+
const agentName = params.agentName ?? this.deps.defaultAgentName();
|
|
18
|
+
let threadId = params.threadId;
|
|
19
|
+
if (threadId === undefined) {
|
|
20
|
+
const created = await this.store.createThread({
|
|
21
|
+
actor: params.actor,
|
|
22
|
+
persona: params.personaId ?? this.deps.forAgent(agentName).defaultPersona,
|
|
23
|
+
});
|
|
24
|
+
threadId = created.id;
|
|
25
|
+
}
|
|
26
|
+
const persona = this.resolvePersona(agentName, params.personaId);
|
|
27
|
+
const input = {
|
|
28
|
+
threadId,
|
|
29
|
+
actor: params.actor,
|
|
30
|
+
userText: params.message,
|
|
31
|
+
day: utcDay(),
|
|
32
|
+
agentName,
|
|
33
|
+
...(persona !== undefined ? { persona } : {}),
|
|
34
|
+
...(params.pageContext !== undefined ? { pageContext: params.pageContext } : {}),
|
|
35
|
+
...(params.attachments !== undefined ? { attachments: params.attachments } : {}),
|
|
36
|
+
};
|
|
37
|
+
const { runId } = await this.runner.start(input);
|
|
38
|
+
await this.store.setActiveStream(threadId, runId);
|
|
39
|
+
return { runId, threadId };
|
|
40
|
+
}
|
|
41
|
+
subscribe(runId) {
|
|
42
|
+
return this.deps.forAgent().sink.subscribe(runId);
|
|
43
|
+
}
|
|
44
|
+
approve(runId, toolCallId) {
|
|
45
|
+
return this.runner.signal(runId, toolCallId, { approved: true });
|
|
46
|
+
}
|
|
47
|
+
reject(runId, toolCallId, reason) {
|
|
48
|
+
return this.runner.signal(runId, toolCallId, {
|
|
49
|
+
approved: false,
|
|
50
|
+
...(reason !== undefined ? { reason } : {}),
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
cancel(runId) {
|
|
54
|
+
return this.runner.cancel(runId);
|
|
55
|
+
}
|
|
56
|
+
resolvePersona(agentName, id) {
|
|
57
|
+
const deps = this.deps.forAgent(agentName);
|
|
58
|
+
return deps.personas.get(id ?? deps.defaultPersona);
|
|
59
|
+
}
|
|
60
|
+
personaCatalog(agentName) {
|
|
61
|
+
return [...this.deps.forAgent(agentName).personas.values()].map((persona) => ({
|
|
62
|
+
id: persona.id,
|
|
63
|
+
label: persona.label,
|
|
64
|
+
}));
|
|
65
|
+
}
|
|
66
|
+
listThreads(actorRef) {
|
|
67
|
+
return this.store.listThreads(actorRef);
|
|
68
|
+
}
|
|
69
|
+
getThread(threadId) {
|
|
70
|
+
return this.store.getThread(threadId);
|
|
71
|
+
}
|
|
72
|
+
deleteThread(threadId) {
|
|
73
|
+
return this.store.softDeleteThread(threadId);
|
|
74
|
+
}
|
|
75
|
+
forkThread(threadId, fromMessageId) {
|
|
76
|
+
return this.store.forkThread(threadId, fromMessageId);
|
|
77
|
+
}
|
|
78
|
+
async quotaToday(actorRef) {
|
|
79
|
+
return this.store.quotaToday(actorRef, utcDay());
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=agent-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-service.js","sourceRoot":"","sources":["../../src/agent-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type CallSettings, type LanguageModel } from 'ai';
|
|
2
|
+
import type { ModelProvider } from '../index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Pass-through settings forwarded to the AI SDK `streamText` call (headers, temperature,
|
|
5
|
+
* `maxOutputTokens`, `providerOptions`, …). `model`, `instructions`, `messages`, `tools`, and
|
|
6
|
+
* `abortSignal` are owned by the adapter and always win over anything set here.
|
|
7
|
+
*/
|
|
8
|
+
export type AiSdkModelOptions = CallSettings;
|
|
9
|
+
/**
|
|
10
|
+
* Adapt a Vercel AI SDK v7 `LanguageModel` to the core `ModelProvider` SPI so a host app writes
|
|
11
|
+
* zero provider code. Streams text deltas to `args.sink`, returns the assembled text, requested
|
|
12
|
+
* tool calls, usage, and (when a gateway reports it) the real USD cost. It never executes tools —
|
|
13
|
+
* tools are handed to the SDK WITHOUT an `execute` fn, so the SDK returns tool-calls for the agent
|
|
14
|
+
* loop to run as its own (replay-safe) steps.
|
|
15
|
+
*/
|
|
16
|
+
export declare function aiSdkModel(model: LanguageModel, opts?: AiSdkModelOptions): ModelProvider;
|
|
17
|
+
//# sourceMappingURL=ai-sdk-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-sdk-model.d.ts","sourceRoot":"","sources":["../../../src/ai-sdk/ai-sdk-model.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,YAAY,EAKjB,KAAK,aAAa,EAYnB,MAAM,IAAI,CAAC;AAEZ,OAAO,KAAK,EAIV,aAAa,EAMd,MAAM,aAAa,CAAC;AAErB;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAE7C;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,iBAAiB,GAAG,aAAa,CA0CxF"}
|