hoomanjs 1.40.2 → 1.41.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -655
- package/dist/acp/acp-agent.d.ts +16 -3
- package/dist/acp/acp-agent.js +369 -172
- package/dist/acp/acp-agent.js.map +1 -1
- package/dist/acp/commands.d.ts +6 -3
- package/dist/acp/commands.js +6 -24
- package/dist/acp/commands.js.map +1 -1
- package/dist/acp/meta/vscode.d.ts +10 -0
- package/dist/acp/meta/vscode.js +16 -0
- package/dist/acp/meta/vscode.js.map +1 -0
- package/dist/acp/questions.d.ts +18 -0
- package/dist/acp/questions.js +80 -0
- package/dist/acp/questions.js.map +1 -0
- package/dist/acp/session-config.d.ts +3 -1
- package/dist/acp/session-config.js +20 -8
- package/dist/acp/session-config.js.map +1 -1
- package/dist/acp/sessions/replay.js +117 -1
- package/dist/acp/sessions/replay.js.map +1 -1
- package/dist/acp/sessions/store.d.ts +55 -16
- package/dist/acp/sessions/store.js +174 -71
- package/dist/acp/sessions/store.js.map +1 -1
- package/dist/acp/utils/tool-kind.js +1 -0
- package/dist/acp/utils/tool-kind.js.map +1 -1
- package/dist/acp/utils/tool-result-content.d.ts +1 -0
- package/dist/acp/utils/tool-result-content.js +28 -1
- package/dist/acp/utils/tool-result-content.js.map +1 -1
- package/dist/chat/app.d.ts +3 -1
- package/dist/chat/app.js +84 -43
- package/dist/chat/app.js.map +1 -1
- package/dist/chat/components/BottomChrome.d.ts +12 -3
- package/dist/chat/components/BottomChrome.js +2 -2
- package/dist/chat/components/BottomChrome.js.map +1 -1
- package/dist/chat/components/ChromePicker.d.ts +5 -1
- package/dist/chat/components/ChromePicker.js +6 -2
- package/dist/chat/components/ChromePicker.js.map +1 -1
- package/dist/chat/components/QuestionPrompt.d.ts +8 -0
- package/dist/chat/components/QuestionPrompt.js +41 -0
- package/dist/chat/components/QuestionPrompt.js.map +1 -0
- package/dist/chat/components/StatusBar.d.ts +8 -3
- package/dist/chat/components/StatusBar.js +55 -26
- package/dist/chat/components/StatusBar.js.map +1 -1
- package/dist/chat/index.d.ts +2 -0
- package/dist/chat/index.js +1 -1
- package/dist/chat/index.js.map +1 -1
- package/dist/chat/questions.d.ts +24 -0
- package/dist/chat/questions.js +71 -0
- package/dist/chat/questions.js.map +1 -0
- package/dist/cli.js +11 -0
- package/dist/cli.js.map +1 -1
- package/dist/core/agent/index.d.ts +3 -0
- package/dist/core/agent/index.js +11 -11
- package/dist/core/agent/index.js.map +1 -1
- package/dist/core/agent/prompt-cache-plugin.d.ts +1 -1
- package/dist/core/agent/prompt-cache-plugin.js +1 -1
- package/dist/core/agent/session-title-plugin.d.ts +27 -0
- package/dist/core/agent/session-title-plugin.js +77 -0
- package/dist/core/agent/session-title-plugin.js.map +1 -0
- package/dist/core/config.d.ts +33 -1
- package/dist/core/config.js +2 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/index.d.ts +12 -0
- package/dist/core/index.js +7 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/mcp/index.d.ts +3 -3
- package/dist/core/mcp/index.js +2 -2
- package/dist/core/mcp/index.js.map +1 -1
- package/dist/core/mcp/manager.d.ts +28 -0
- package/dist/core/mcp/manager.js +171 -2
- package/dist/core/mcp/manager.js.map +1 -1
- package/dist/core/models/anthropic.d.ts +4 -3
- package/dist/core/models/anthropic.js.map +1 -1
- package/dist/core/models/azure.js +5 -1
- package/dist/core/models/azure.js.map +1 -1
- package/dist/core/models/groq.js +5 -1
- package/dist/core/models/groq.js.map +1 -1
- package/dist/core/models/minimax.d.ts +2 -1
- package/dist/core/models/minimax.js +49 -7
- package/dist/core/models/minimax.js.map +1 -1
- package/dist/core/models/moonshot.js +5 -1
- package/dist/core/models/moonshot.js.map +1 -1
- package/dist/core/models/openai.js +6 -1
- package/dist/core/models/openai.js.map +1 -1
- package/dist/core/models/openrouter.js +5 -1
- package/dist/core/models/openrouter.js.map +1 -1
- package/dist/core/models/types.d.ts +54 -6
- package/dist/core/models/types.js +18 -2
- package/dist/core/models/types.js.map +1 -1
- package/dist/core/models/usage.d.ts +10 -0
- package/dist/core/models/usage.js +45 -0
- package/dist/core/models/usage.js.map +1 -0
- package/dist/core/models/xai.js +5 -1
- package/dist/core/models/xai.js.map +1 -1
- package/dist/core/modes/definitions.js +2 -0
- package/dist/core/modes/definitions.js.map +1 -1
- package/dist/core/prompts/environment.d.ts +10 -1
- package/dist/core/prompts/environment.js +15 -1
- package/dist/core/prompts/environment.js.map +1 -1
- package/dist/core/prompts/static/ask-user.md +7 -0
- package/dist/core/prompts/static/environment.md +2 -1
- package/dist/core/prompts/static/filesystem.md +1 -1
- package/dist/core/prompts/static/web-search.md +1 -1
- package/dist/core/prompts/system.d.ts +6 -0
- package/dist/core/prompts/system.js +12 -1
- package/dist/core/prompts/system.js.map +1 -1
- package/dist/core/sessions/generate-title.d.ts +10 -0
- package/dist/core/sessions/generate-title.js +113 -0
- package/dist/core/sessions/generate-title.js.map +1 -0
- package/dist/core/sessions/list-cli-sessions.js +13 -1
- package/dist/core/sessions/list-cli-sessions.js.map +1 -1
- package/dist/core/skills/built-in/hooman-config/providers.md +17 -0
- package/dist/core/skills/built-in/hooman-mcp/SKILL.md +20 -0
- package/dist/core/skills/built-in/hooman-skills/SKILL.md +1 -1
- package/dist/core/state/session-title.d.ts +17 -0
- package/dist/core/state/session-title.js +15 -0
- package/dist/core/state/session-title.js.map +1 -0
- package/dist/core/state/tool-approvals.js +3 -0
- package/dist/core/state/tool-approvals.js.map +1 -1
- package/dist/core/tools/ask-user.d.ts +46 -0
- package/dist/core/tools/ask-user.js +66 -0
- package/dist/core/tools/ask-user.js.map +1 -0
- package/dist/core/tools/filesystem.d.ts +26 -1
- package/dist/core/tools/filesystem.js +44 -23
- package/dist/core/tools/filesystem.js.map +1 -1
- package/dist/core/tools/index.d.ts +1 -0
- package/dist/core/tools/index.js +1 -0
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/shell.d.ts +41 -0
- package/dist/core/tools/shell.js +8 -1
- package/dist/core/tools/shell.js.map +1 -1
- package/dist/core/tools/time.js +1 -1
- package/dist/core/tools/time.js.map +1 -1
- package/dist/core/utils/billing.d.ts +49 -0
- package/dist/core/utils/billing.js +295 -0
- package/dist/core/utils/billing.js.map +1 -0
- package/dist/core/utils/edit-replace.d.ts +6 -0
- package/dist/core/utils/edit-replace.js +88 -6
- package/dist/core/utils/edit-replace.js.map +1 -1
- package/dist/core/utils/paths.d.ts +1 -0
- package/dist/core/utils/paths.js +1 -0
- package/dist/core/utils/paths.js.map +1 -1
- package/dist/core/{models → utils}/reasoning-effort.d.ts +9 -0
- package/dist/core/utils/reasoning-effort.js.map +1 -0
- package/dist/daemon/questions.d.ts +18 -0
- package/dist/daemon/questions.js +44 -0
- package/dist/daemon/questions.js.map +1 -0
- package/dist/exec/questions.d.ts +9 -0
- package/dist/exec/questions.js +50 -0
- package/dist/exec/questions.js.map +1 -0
- package/dist/index.d.ts +7 -6
- package/dist/index.js +6 -5
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
- package/dist/core/models/reasoning-effort.js.map +0 -1
- package/dist/core/tools/terminal-backend.d.ts +0 -41
- package/dist/core/tools/terminal-backend.js +0 -9
- package/dist/core/tools/terminal-backend.js.map +0 -1
- package/dist/core/tools/text-fs-backend.d.ts +0 -25
- package/dist/core/tools/text-fs-backend.js +0 -9
- package/dist/core/tools/text-fs-backend.js.map +0 -1
- /package/dist/core/{models → utils}/reasoning-effort.js +0 -0
|
@@ -40,8 +40,8 @@ export type ReasoningOptions = {
|
|
|
40
40
|
};
|
|
41
41
|
/**
|
|
42
42
|
* Effort -> `budget_tokens` for providers that take an explicit thinking budget
|
|
43
|
-
* (
|
|
44
|
-
*
|
|
43
|
+
* (the native Anthropic API, Bedrock Converse). We always send a budget rather
|
|
44
|
+
* than omitting it; `medium` is the default when no effort is set.
|
|
45
45
|
*/
|
|
46
46
|
export declare const REASONING_BUDGET_TOKENS: Record<ReasoningEffort, number>;
|
|
47
47
|
export type LlmOptions = {
|
|
@@ -49,6 +49,27 @@ export type LlmOptions = {
|
|
|
49
49
|
temperature?: number;
|
|
50
50
|
maxTokens?: number;
|
|
51
51
|
};
|
|
52
|
+
/**
|
|
53
|
+
* Per-million-token USD prices for a model. `cache/m` is the cached-input
|
|
54
|
+
* (cache read) price; cache writes are billed at the `input/m` rate when only
|
|
55
|
+
* these config-provided prices are available.
|
|
56
|
+
*/
|
|
57
|
+
export type LlmBillingCosts = {
|
|
58
|
+
"input/m": number;
|
|
59
|
+
"cache/m"?: number;
|
|
60
|
+
"output/m": number;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Optional billing metadata on a named LLM. `name` is the model identifier
|
|
64
|
+
* used to look the model up on models.dev (defaults to `options.model` when
|
|
65
|
+
* `billing` is omitted entirely); `context`/`costs` override whatever the
|
|
66
|
+
* models.dev catalog resolves.
|
|
67
|
+
*/
|
|
68
|
+
export type LlmBilling = {
|
|
69
|
+
name: string;
|
|
70
|
+
context?: number;
|
|
71
|
+
costs?: LlmBillingCosts;
|
|
72
|
+
};
|
|
52
73
|
export type AnthropicProviderOptions = {
|
|
53
74
|
apiKey?: string;
|
|
54
75
|
baseURL?: string;
|
|
@@ -111,12 +132,13 @@ export type GroqProviderOptions = {
|
|
|
111
132
|
};
|
|
112
133
|
export type MinimaxProviderOptions = {
|
|
113
134
|
apiKey?: string;
|
|
135
|
+
baseURL?: string;
|
|
114
136
|
headers?: Record<string, string>;
|
|
115
137
|
/**
|
|
116
|
-
* Reasoning controls. Providing `reasoning` enables
|
|
117
|
-
*
|
|
118
|
-
* to leave thinking
|
|
119
|
-
* `
|
|
138
|
+
* Reasoning controls. Providing `reasoning` enables MiniMax's adaptive
|
|
139
|
+
* thinking (`thinking: { type: "adaptive" }` with `output_config.effort`);
|
|
140
|
+
* omit `reasoning` to leave thinking at the model default. `effort` defaults
|
|
141
|
+
* to `medium` (`minimal` maps to `low`); `display` is forwarded when set.
|
|
120
142
|
*/
|
|
121
143
|
reasoning?: ReasoningOptions;
|
|
122
144
|
};
|
|
@@ -233,6 +255,20 @@ export declare const LlmOptionsSchema: z.ZodObject<{
|
|
|
233
255
|
temperature: z.ZodOptional<z.ZodNumber>;
|
|
234
256
|
maxTokens: z.ZodOptional<z.ZodNumber>;
|
|
235
257
|
}, z.core.$strict>;
|
|
258
|
+
export declare const LlmBillingCostsSchema: z.ZodObject<{
|
|
259
|
+
"input/m": z.ZodNumber;
|
|
260
|
+
"cache/m": z.ZodOptional<z.ZodNumber>;
|
|
261
|
+
"output/m": z.ZodNumber;
|
|
262
|
+
}, z.core.$strict>;
|
|
263
|
+
export declare const LlmBillingSchema: z.ZodObject<{
|
|
264
|
+
name: z.ZodString;
|
|
265
|
+
context: z.ZodOptional<z.ZodNumber>;
|
|
266
|
+
costs: z.ZodOptional<z.ZodObject<{
|
|
267
|
+
"input/m": z.ZodNumber;
|
|
268
|
+
"cache/m": z.ZodOptional<z.ZodNumber>;
|
|
269
|
+
"output/m": z.ZodNumber;
|
|
270
|
+
}, z.core.$strict>>;
|
|
271
|
+
}, z.core.$strict>;
|
|
236
272
|
export declare const AnthropicProviderOptionsSchema: z.ZodObject<{
|
|
237
273
|
apiKey: z.ZodOptional<z.ZodString>;
|
|
238
274
|
baseURL: z.ZodOptional<z.ZodString>;
|
|
@@ -353,6 +389,7 @@ export declare const GroqProviderOptionsSchema: z.ZodObject<{
|
|
|
353
389
|
}, z.core.$strict>;
|
|
354
390
|
export declare const MinimaxProviderOptionsSchema: z.ZodObject<{
|
|
355
391
|
apiKey: z.ZodOptional<z.ZodString>;
|
|
392
|
+
baseURL: z.ZodOptional<z.ZodString>;
|
|
356
393
|
headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
357
394
|
reasoning: z.ZodOptional<z.ZodObject<{
|
|
358
395
|
effort: z.ZodOptional<z.ZodEnum<{
|
|
@@ -611,6 +648,7 @@ export declare const ProviderOptionsSchemas: {
|
|
|
611
648
|
}, z.core.$strict>;
|
|
612
649
|
readonly minimax: z.ZodObject<{
|
|
613
650
|
apiKey: z.ZodOptional<z.ZodString>;
|
|
651
|
+
baseURL: z.ZodOptional<z.ZodString>;
|
|
614
652
|
headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
615
653
|
reasoning: z.ZodOptional<z.ZodObject<{
|
|
616
654
|
effort: z.ZodOptional<z.ZodEnum<{
|
|
@@ -887,6 +925,7 @@ export declare const NamedProviderConfigSchema: z.ZodDiscriminatedUnion<[z.ZodOb
|
|
|
887
925
|
provider: z.ZodLiteral<LlmProvider.Minimax>;
|
|
888
926
|
options: z.ZodObject<{
|
|
889
927
|
apiKey: z.ZodOptional<z.ZodString>;
|
|
928
|
+
baseURL: z.ZodOptional<z.ZodString>;
|
|
890
929
|
headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
891
930
|
reasoning: z.ZodOptional<z.ZodObject<{
|
|
892
931
|
effort: z.ZodOptional<z.ZodEnum<{
|
|
@@ -1048,6 +1087,15 @@ export declare const NamedLlmConfigSchema: z.ZodObject<{
|
|
|
1048
1087
|
temperature: z.ZodOptional<z.ZodNumber>;
|
|
1049
1088
|
maxTokens: z.ZodOptional<z.ZodNumber>;
|
|
1050
1089
|
}, z.core.$strict>;
|
|
1090
|
+
billing: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
1091
|
+
name: z.ZodString;
|
|
1092
|
+
context: z.ZodOptional<z.ZodNumber>;
|
|
1093
|
+
costs: z.ZodOptional<z.ZodObject<{
|
|
1094
|
+
"input/m": z.ZodNumber;
|
|
1095
|
+
"cache/m": z.ZodOptional<z.ZodNumber>;
|
|
1096
|
+
"output/m": z.ZodNumber;
|
|
1097
|
+
}, z.core.$strict>>;
|
|
1098
|
+
}, z.core.$strict>>>;
|
|
1051
1099
|
default: z.ZodDefault<z.ZodBoolean>;
|
|
1052
1100
|
}, z.core.$strict>;
|
|
1053
1101
|
export type NamedProviderConfig = z.infer<typeof NamedProviderConfigSchema>;
|
|
@@ -15,8 +15,8 @@ export var LlmProvider;
|
|
|
15
15
|
})(LlmProvider || (LlmProvider = {}));
|
|
16
16
|
/**
|
|
17
17
|
* Effort -> `budget_tokens` for providers that take an explicit thinking budget
|
|
18
|
-
* (
|
|
19
|
-
*
|
|
18
|
+
* (the native Anthropic API, Bedrock Converse). We always send a budget rather
|
|
19
|
+
* than omitting it; `medium` is the default when no effort is set.
|
|
20
20
|
*/
|
|
21
21
|
export const REASONING_BUDGET_TOKENS = {
|
|
22
22
|
minimal: 1024,
|
|
@@ -54,6 +54,20 @@ export const LlmOptionsSchema = z
|
|
|
54
54
|
maxTokens: z.number().int().positive().optional(),
|
|
55
55
|
})
|
|
56
56
|
.strict();
|
|
57
|
+
export const LlmBillingCostsSchema = z
|
|
58
|
+
.object({
|
|
59
|
+
"input/m": z.number().nonnegative(),
|
|
60
|
+
"cache/m": z.number().nonnegative().optional(),
|
|
61
|
+
"output/m": z.number().nonnegative(),
|
|
62
|
+
})
|
|
63
|
+
.strict();
|
|
64
|
+
export const LlmBillingSchema = z
|
|
65
|
+
.object({
|
|
66
|
+
name: NonEmptyStringSchema,
|
|
67
|
+
context: z.number().int().positive().optional(),
|
|
68
|
+
costs: LlmBillingCostsSchema.optional(),
|
|
69
|
+
})
|
|
70
|
+
.strict();
|
|
57
71
|
export const AnthropicProviderOptionsSchema = z
|
|
58
72
|
.object({
|
|
59
73
|
apiKey: NonEmptyStringSchema.optional(),
|
|
@@ -110,6 +124,7 @@ export const GroqProviderOptionsSchema = z
|
|
|
110
124
|
export const MinimaxProviderOptionsSchema = z
|
|
111
125
|
.object({
|
|
112
126
|
apiKey: NonEmptyStringSchema.optional(),
|
|
127
|
+
baseURL: NonEmptyStringSchema.optional(),
|
|
113
128
|
headers: HeadersSchema,
|
|
114
129
|
reasoning: ReasoningOptionsSchema.optional(),
|
|
115
130
|
})
|
|
@@ -250,6 +265,7 @@ export const NamedLlmConfigSchema = z
|
|
|
250
265
|
name: NonEmptyStringSchema,
|
|
251
266
|
provider: NonEmptyStringSchema,
|
|
252
267
|
options: LlmOptionsSchema,
|
|
268
|
+
billing: LlmBillingSchema.nullish(),
|
|
253
269
|
default: z.boolean().default(false),
|
|
254
270
|
})
|
|
255
271
|
.strict();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/models/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAN,IAAY,WAYX;AAZD,WAAY,WAAW;IACrB,sCAAuB,CAAA;IACvB,8BAAe,CAAA;IACf,kCAAmB,CAAA;IACnB,gCAAiB,CAAA;IACjB,4BAAa,CAAA;IACb,kCAAmB,CAAA;IACnB,oCAAqB,CAAA;IACrB,gCAAiB,CAAA;IACjB,gCAAiB,CAAA;IACjB,wCAAyB,CAAA;IACzB,0BAAW,CAAA;AACb,CAAC,EAZW,WAAW,KAAX,WAAW,QAYtB;AA8BD;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAoC;IACtE,OAAO,EAAE,IAAI;IACb,GAAG,EAAE,IAAI;IACT,MAAM,EAAE,IAAI;IACZ,IAAI,EAAE,IAAI;CACX,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/models/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Usage } from "@strands-agents/sdk";
|
|
2
|
+
/** Mark a model whose `usage.inputTokens` already includes cache reads. */
|
|
3
|
+
export declare function markTotalInclusiveInputUsage(model: object): void;
|
|
4
|
+
/**
|
|
5
|
+
* Convert a usage report to the additive (Anthropic-style) shape: when the
|
|
6
|
+
* model reports total-inclusive input, subtract cache reads from
|
|
7
|
+
* `inputTokens`/`totalTokens` so `input + cacheRead + cacheWrite` is the true
|
|
8
|
+
* prompt total regardless of provider. No-op for additive models.
|
|
9
|
+
*/
|
|
10
|
+
export declare function toAdditiveUsage<T extends Partial<Usage>>(usage: T, model: object | null | undefined): T;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Providers disagree on what `usage.inputTokens` means:
|
|
3
|
+
*
|
|
4
|
+
* - Anthropic-style (Anthropic, Bedrock): `inputTokens` is only the uncached
|
|
5
|
+
* portion of the prompt; cache reads/writes are reported separately and are
|
|
6
|
+
* *additive* (total prompt = input + cacheRead + cacheWrite).
|
|
7
|
+
* - Total-inclusive (OpenAI, and every Vercel AI SDK adapter): `inputTokens`
|
|
8
|
+
* is the full prompt and `cacheReadInputTokens` is a *subset* of it.
|
|
9
|
+
*
|
|
10
|
+
* Model factories register total-inclusive instances here so billing meters
|
|
11
|
+
* can convert their usage to the additive shape before summing. This is done
|
|
12
|
+
* only at the meter feed points — the raw usage must stay untouched for the
|
|
13
|
+
* Strands agent loop, which uses `usage.inputTokens` as the context size for
|
|
14
|
+
* proactive compaction estimates.
|
|
15
|
+
*/
|
|
16
|
+
const totalInclusiveInputModels = new WeakSet();
|
|
17
|
+
/** Mark a model whose `usage.inputTokens` already includes cache reads. */
|
|
18
|
+
export function markTotalInclusiveInputUsage(model) {
|
|
19
|
+
totalInclusiveInputModels.add(model);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Convert a usage report to the additive (Anthropic-style) shape: when the
|
|
23
|
+
* model reports total-inclusive input, subtract cache reads from
|
|
24
|
+
* `inputTokens`/`totalTokens` so `input + cacheRead + cacheWrite` is the true
|
|
25
|
+
* prompt total regardless of provider. No-op for additive models.
|
|
26
|
+
*/
|
|
27
|
+
export function toAdditiveUsage(usage, model) {
|
|
28
|
+
if (!model || !totalInclusiveInputModels.has(model)) {
|
|
29
|
+
return usage;
|
|
30
|
+
}
|
|
31
|
+
const cacheRead = usage.cacheReadInputTokens ?? 0;
|
|
32
|
+
if (cacheRead <= 0) {
|
|
33
|
+
return usage;
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
...usage,
|
|
37
|
+
...(usage.inputTokens !== undefined && {
|
|
38
|
+
inputTokens: Math.max(0, usage.inputTokens - cacheRead),
|
|
39
|
+
}),
|
|
40
|
+
...(usage.totalTokens !== undefined && {
|
|
41
|
+
totalTokens: Math.max(0, usage.totalTokens - cacheRead),
|
|
42
|
+
}),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../../src/core/models/usage.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AACH,MAAM,yBAAyB,GAAG,IAAI,OAAO,EAAU,CAAC;AAExD,2EAA2E;AAC3E,MAAM,UAAU,4BAA4B,CAAC,KAAa;IACxD,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,KAAQ,EACR,KAAgC;IAEhC,IAAI,CAAC,KAAK,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,SAAS,GAAG,KAAK,CAAC,oBAAoB,IAAI,CAAC,CAAC;IAClD,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO;QACL,GAAG,KAAK;QACR,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI;YACrC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC;SACxD,CAAC;QACF,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,IAAI;YACrC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC;SACxD,CAAC;KACH,CAAC;AACJ,CAAC"}
|
package/dist/core/models/xai.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createXai, xai } from "@ai-sdk/xai";
|
|
2
2
|
import { VercelModel } from "@strands-agents/sdk/models/vercel";
|
|
3
|
+
import { markTotalInclusiveInputUsage } from "./usage.js";
|
|
3
4
|
export function create(providerOptions, llmOptions) {
|
|
4
5
|
const settings = Object.fromEntries(Object.entries({
|
|
5
6
|
apiKey: providerOptions.apiKey,
|
|
@@ -27,9 +28,12 @@ export function create(providerOptions, llmOptions) {
|
|
|
27
28
|
? { providerOptions: { xai: { reasoningEffort } } }
|
|
28
29
|
: {}),
|
|
29
30
|
};
|
|
30
|
-
|
|
31
|
+
const model = new VercelModel({
|
|
31
32
|
provider: provider(llmOptions.model),
|
|
32
33
|
...config,
|
|
33
34
|
});
|
|
35
|
+
// xAI reports `prompt_tokens` inclusive of `cached_tokens`.
|
|
36
|
+
markTotalInclusiveInputUsage(model);
|
|
37
|
+
return model;
|
|
34
38
|
}
|
|
35
39
|
//# sourceMappingURL=xai.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xai.js","sourceRoot":"","sources":["../../../src/core/models/xai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"xai.js","sourceRoot":"","sources":["../../../src/core/models/xai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAIhE,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAE1D,MAAM,UAAU,MAAM,CACpB,eAAmC,EACnC,UAAsB;IAEtB,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CACjC,MAAM,CAAC,OAAO,CAAC;QACb,MAAM,EAAE,eAAe,CAAC,MAAM;QAC9B,OAAO,EAAE,eAAe,CAAC,OAAO;QAChC,OAAO,EAAE,eAAe,CAAC,OAAO;KACjC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CACtB,CAAC;IACzB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9E,qEAAqE;IACrE,+EAA+E;IAC/E,6DAA6D;IAC7D,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC;IACjD,MAAM,eAAe,GACnB,MAAM,KAAK,SAAS;QAClB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK;YACxC,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,MAAM,CAAC;IACf,MAAM,MAAM,GAA+B;QACzC,GAAG,CAAC,UAAU,CAAC,WAAW,KAAK,SAAS;YACtC,CAAC,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,EAAE;YACzC,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,UAAU,CAAC,SAAS,KAAK,SAAS;YACpC,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE;YACrC,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,eAAe;YACjB,CAAC,CAAC,EAAE,eAAe,EAAE,EAAE,GAAG,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE;YACnD,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IACF,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC;QAC5B,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC;QACpC,GAAG,MAAM;KACV,CAAC,CAAC;IACH,4DAA4D;IAC5D,4BAA4B,CAAC,KAAK,CAAC,CAAC;IACpC,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -34,6 +34,7 @@ export const MODE_DEFINITIONS = [
|
|
|
34
34
|
"read_multiple_files",
|
|
35
35
|
"write_file",
|
|
36
36
|
"edit_file",
|
|
37
|
+
"ask_user",
|
|
37
38
|
"enter_plan_mode",
|
|
38
39
|
"exit_plan_mode",
|
|
39
40
|
],
|
|
@@ -66,6 +67,7 @@ export const MODE_DEFINITIONS = [
|
|
|
66
67
|
"read_multiple_files",
|
|
67
68
|
"write_file",
|
|
68
69
|
"edit_file",
|
|
70
|
+
"ask_user",
|
|
69
71
|
],
|
|
70
72
|
},
|
|
71
73
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../../src/core/modes/definitions.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,gBAAgB,GAA8B;IACzD;QACE,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,OAAO;QACb,YAAY,EAAE,gBAAgB;QAC9B,WAAW,EAAE,6BAA6B;QAC1C,KAAK,EAAE,GAAG;KACX;IACD;QACE,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,MAAM;QACZ,YAAY,EAAE,eAAe;QAC7B,WAAW,EAAE,8CAA8C;QAC3D,KAAK,EAAE;YACL,OAAO;YACP,YAAY;YACZ,QAAQ;YACR,4BAA4B;YAC5B,eAAe;YACf,2BAA2B;YAC3B,cAAc;YACd,OAAO;YACP,mBAAmB;YACnB,iBAAiB;YACjB,4BAA4B;YAC5B,OAAO;YACP,cAAc;YACd,kBAAkB;YAClB,gBAAgB;YAChB,eAAe;YACf,gBAAgB;YAChB,MAAM;YACN,WAAW;YACX,qBAAqB;YACrB,YAAY;YACZ,WAAW;YACX,iBAAiB;YACjB,gBAAgB;SACjB;KACF;IACD;QACE,EAAE,EAAE,KAAK;QACT,IAAI,EAAE,KAAK;QACX,YAAY,EAAE,cAAc;QAC5B,WAAW,EAAE,kDAAkD;QAC/D,KAAK,EAAE;YACL,OAAO;YACP,YAAY;YACZ,QAAQ;YACR,4BAA4B;YAC5B,eAAe;YACf,2BAA2B;YAC3B,cAAc;YACd,OAAO;YACP,mBAAmB;YACnB,iBAAiB;YACjB,4BAA4B;YAC5B,OAAO;YACP,cAAc;YACd,kBAAkB;YAClB,gBAAgB;YAChB,eAAe;YACf,gBAAgB;YAChB,MAAM;YACN,WAAW;YACX,qBAAqB;YACrB,YAAY;YACZ,WAAW;
|
|
1
|
+
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../../src/core/modes/definitions.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,15 @@ type EnvironmentPromptContext = {
|
|
|
5
5
|
shell: string;
|
|
6
6
|
isGitRepo: boolean;
|
|
7
7
|
timeZone: string;
|
|
8
|
+
datetime: string;
|
|
8
9
|
};
|
|
9
|
-
|
|
10
|
+
/** Human-readable local date & time, e.g. "Saturday, July 4, 2026, 2:25 PM". */
|
|
11
|
+
export declare function formatPromptDateTime(date: Date): string;
|
|
12
|
+
/**
|
|
13
|
+
* Environment facts rendered into the system prompt. `at` is the moment the
|
|
14
|
+
* prompt is considered built; callers that rebuild the prompt during a session
|
|
15
|
+
* must pass a stable value so the rendered prefix stays byte-identical across
|
|
16
|
+
* turns (a changing prefix defeats provider prompt caching).
|
|
17
|
+
*/
|
|
18
|
+
export declare function getEnvironmentPromptContext(at?: Date): EnvironmentPromptContext;
|
|
10
19
|
export {};
|
|
@@ -35,7 +35,20 @@ function detectGitRepo(startDir) {
|
|
|
35
35
|
function detectTimeZone() {
|
|
36
36
|
return Intl.DateTimeFormat().resolvedOptions().timeZone || "unknown";
|
|
37
37
|
}
|
|
38
|
-
|
|
38
|
+
/** Human-readable local date & time, e.g. "Saturday, July 4, 2026, 2:25 PM". */
|
|
39
|
+
export function formatPromptDateTime(date) {
|
|
40
|
+
return new Intl.DateTimeFormat("en-US", {
|
|
41
|
+
dateStyle: "full",
|
|
42
|
+
timeStyle: "short",
|
|
43
|
+
}).format(date);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Environment facts rendered into the system prompt. `at` is the moment the
|
|
47
|
+
* prompt is considered built; callers that rebuild the prompt during a session
|
|
48
|
+
* must pass a stable value so the rendered prefix stays byte-identical across
|
|
49
|
+
* turns (a changing prefix defeats provider prompt caching).
|
|
50
|
+
*/
|
|
51
|
+
export function getEnvironmentPromptContext(at = new Date()) {
|
|
39
52
|
const cwd = process.cwd();
|
|
40
53
|
return {
|
|
41
54
|
cwd,
|
|
@@ -44,6 +57,7 @@ export function getEnvironmentPromptContext() {
|
|
|
44
57
|
shell: detectShell(),
|
|
45
58
|
isGitRepo: detectGitRepo(cwd),
|
|
46
59
|
timeZone: detectTimeZone(),
|
|
60
|
+
datetime: formatPromptDateTime(at),
|
|
47
61
|
};
|
|
48
62
|
}
|
|
49
63
|
//# sourceMappingURL=environment.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../../src/core/prompts/environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EACL,OAAO,IAAI,SAAS,EACpB,IAAI,IAAI,MAAM,EACd,OAAO,IAAI,SAAS,GACrB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../../src/core/prompts/environment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EACL,OAAO,IAAI,SAAS,EACpB,IAAI,IAAI,MAAM,EACd,OAAO,IAAI,SAAS,GACrB,MAAM,SAAS,CAAC;AAYjB,SAAS,cAAc;IACrB,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC;QAC5D,CAAC,CAAC,OAAO,CAAC,QAAQ;QAClB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;AACvB,CAAC;AAED,SAAS,eAAe;IACtB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,GAAG,SAAS,EAAE,IAAI,SAAS,EAAE,EAAE,CAAC;IACzC,CAAC;IACD,OAAO,GAAG,MAAM,EAAE,IAAI,SAAS,EAAE,EAAE,CAAC;AACtC,CAAC;AAED,SAAS,WAAW;IAClB,MAAM,KAAK,GACT,OAAO,CAAC,GAAG,CAAC,KAAK;QACjB,OAAO,CAAC,GAAG,CAAC,OAAO;QACnB,OAAO,CAAC,GAAG,CAAC,OAAO;QACnB,SAAS,CAAC;IACZ,OAAO,KAAK,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;AACnC,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB;IACrC,IAAI,OAAO,GAAG,QAAQ,CAAC;IACvB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAC,QAAQ,IAAI,SAAS,CAAC;AACvE,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,oBAAoB,CAAC,IAAU;IAC7C,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;QACtC,SAAS,EAAE,MAAM;QACjB,SAAS,EAAE,OAAO;KACnB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CACzC,KAAW,IAAI,IAAI,EAAE;IAErB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,OAAO;QACL,GAAG;QACH,QAAQ,EAAE,cAAc,EAAE;QAC1B,SAAS,EAAE,eAAe,EAAE;QAC5B,KAAK,EAAE,WAAW,EAAE;QACpB,SAAS,EAAE,aAAa,CAAC,GAAG,CAAC;QAC7B,QAAQ,EAAE,cAAc,EAAE;QAC1B,QAAQ,EAAE,oBAAoB,CAAC,EAAE,CAAC;KACnC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
## Asking the User
|
|
2
|
+
|
|
3
|
+
You have an `ask_user` tool for asking the user one multiple-choice question and waiting for the answer.
|
|
4
|
+
|
|
5
|
+
- Use it only when blocked on a decision that is genuinely the user's: ambiguous requirements, mutually exclusive approaches, or information no other tool can discover. Never for things you can find yourself, for permission to proceed, or to confirm finished work.
|
|
6
|
+
- One focused question per call, 2–5 concise options, recommended option first.
|
|
7
|
+
- On `dismissed` or `no_user_available`, do not re-ask: proceed on your best judgement and state the assumption.
|
|
@@ -8,5 +8,6 @@ Runtime environment captured when this prompt was built:
|
|
|
8
8
|
- OS version: `{{ environment.osVersion }}`
|
|
9
9
|
- Is git repository: `{{ environment.isGitRepo }}`
|
|
10
10
|
- Time zone: `{{ environment.timeZone }}`
|
|
11
|
+
- Date & time at session start: `{{ environment.datetime }}`
|
|
11
12
|
|
|
12
|
-
Use this to choose correct path handling, shell syntax, and platform-specific behavior.
|
|
13
|
+
Use this to choose correct path handling, shell syntax, and platform-specific behavior. The date & time above is from session start and goes stale in long sessions; use `get_current_time` whenever the precise current time matters.
|
|
@@ -5,6 +5,6 @@ You have access to filesystem tools for reading, writing, editing, moving, listi
|
|
|
5
5
|
- Prefer filesystem tools over `shell` when the task is mainly about file contents, directory structure, or metadata.
|
|
6
6
|
- Use `read_file` for one known file, `read_multiple_files` for several known files, `grep` for exact text or symbols, and `list_directory` or `directory_tree` for structure discovery.
|
|
7
7
|
- Use `write_file`, `edit_file`, `create_directory`, `move_file`, and `get_file_info` for the corresponding focused operations.
|
|
8
|
-
- `read_file` and `read_multiple_files`
|
|
8
|
+
- `read_file` and `read_multiple_files` return file content verbatim as plain text. Bracketed `[...]` lines carry metadata: a leading line for partial reads (line range and how to read more) and a trailing `[AGENTS.md instructions ...]` block with file-scoped project instructions; treat the latter as additional project instructions when relevant. Everything else is the file's own text — reproduce it exactly (no added escaping) in `edit_file` targets.
|
|
9
9
|
- Prefer bounded reads for long files, and batch independent file reads or searches when supported.
|
|
10
10
|
- Prefer the narrowest operation that solves the task, read before editing when that reduces risk, and be careful with overwrites, renames, and broad recursive changes.
|
|
@@ -7,5 +7,5 @@ You have access to a `web_search` tool for finding relevant webpages and snippet
|
|
|
7
7
|
- Use only supported inputs: `query`, optional `count`, `freshness`, `start_date`, `end_date`, `country`, and `safe_search`.
|
|
8
8
|
- Keep `query` focused on the topic, entity, source, and search operators. Do not invent provider-specific parameters.
|
|
9
9
|
- For relative-time requests such as "latest" or "this week", prefer `freshness` or a date range over stuffing date words into `query`.
|
|
10
|
-
-
|
|
10
|
+
- To interpret relative dates, start from the session-start date & time in the Environment section, and call `get_current_time` when the precise current time or a specific timezone matters.
|
|
11
11
|
- `web_search` returns result pages and snippets, not full article bodies.
|
|
@@ -9,6 +9,12 @@ export declare class System {
|
|
|
9
9
|
private readonly path;
|
|
10
10
|
private readonly config;
|
|
11
11
|
private readonly mode;
|
|
12
|
+
/**
|
|
13
|
+
* Captured once per instance so every `reload()` in a session renders the
|
|
14
|
+
* same date/time — a per-turn timestamp would change the prompt prefix on
|
|
15
|
+
* every request and defeat provider prompt caching.
|
|
16
|
+
*/
|
|
17
|
+
private readonly builtAt;
|
|
12
18
|
private data;
|
|
13
19
|
private sourceFingerprint;
|
|
14
20
|
private compiledTemplate;
|
|
@@ -10,6 +10,7 @@ const STATIC_PROMPT_FILES = [
|
|
|
10
10
|
"environment.md",
|
|
11
11
|
"todo.md",
|
|
12
12
|
"thinking.md",
|
|
13
|
+
"ask-user.md",
|
|
13
14
|
"filesystem.md",
|
|
14
15
|
"fetch.md",
|
|
15
16
|
"web-search.md",
|
|
@@ -35,6 +36,12 @@ export class System {
|
|
|
35
36
|
path;
|
|
36
37
|
config;
|
|
37
38
|
mode;
|
|
39
|
+
/**
|
|
40
|
+
* Captured once per instance so every `reload()` in a session renders the
|
|
41
|
+
* same date/time — a per-turn timestamp would change the prompt prefix on
|
|
42
|
+
* every request and defeat provider prompt caching.
|
|
43
|
+
*/
|
|
44
|
+
builtAt = new Date();
|
|
38
45
|
data = "";
|
|
39
46
|
sourceFingerprint = "";
|
|
40
47
|
compiledTemplate = null;
|
|
@@ -60,6 +67,10 @@ export class System {
|
|
|
60
67
|
return this.config.tools.subagents.enabled;
|
|
61
68
|
case "daemon.md":
|
|
62
69
|
return this.mode === "daemon";
|
|
70
|
+
// Daemon jobs have no interactive user; the tool would only report
|
|
71
|
+
// "no user available", so don't advertise it in the prompt.
|
|
72
|
+
case "ask-user.md":
|
|
73
|
+
return this.mode !== "daemon";
|
|
63
74
|
default:
|
|
64
75
|
return true;
|
|
65
76
|
}
|
|
@@ -152,7 +163,7 @@ export class System {
|
|
|
152
163
|
return {
|
|
153
164
|
name: this.config.name,
|
|
154
165
|
llm: this.config.llm,
|
|
155
|
-
environment: getEnvironmentPromptContext(),
|
|
166
|
+
environment: getEnvironmentPromptContext(this.builtAt),
|
|
156
167
|
compaction: this.config.compaction,
|
|
157
168
|
mode: this.mode,
|
|
158
169
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system.js","sourceRoot":"","sources":["../../../src/core/prompts/system.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EACL,8BAA8B,EAC9B,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAEtB,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC;AAE/B,gEAAgE;AAChE,MAAM,mBAAmB,GAAG;IAC1B,aAAa;IACb,gBAAgB;IAChB,SAAS;IACT,aAAa;IACb,eAAe;IACf,UAAU;IACV,eAAe;IACf,UAAU;IACV,WAAW;IACX,WAAW;IACX,cAAc;IACd,aAAa;CACL,CAAC;AAEX,MAAM,oBAAoB,GAAG;IAC3B,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE;IAC1C,EAAE,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,kBAAkB,EAAE;IAClD,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE;IAC1C,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE;CACpC,CAAC;AAIX,MAAM,aAAa,GAAG,aAAa,CAAC;AAEpC;;;;GAIG;AACH,MAAM,OAAO,MAAM;IACA,IAAI,CAAS;IACb,MAAM,CAAS;IACf,IAAI,CAAa;
|
|
1
|
+
{"version":3,"file":"system.js","sourceRoot":"","sources":["../../../src/core/prompts/system.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type BaseModelConfig, type Model } from "@strands-agents/sdk";
|
|
2
|
+
export declare const MAX_SESSION_TITLE_LEN = 80;
|
|
3
|
+
/**
|
|
4
|
+
* Generate a short session title from the first user prompt using the given
|
|
5
|
+
* model. Returns `null` on failure or timeout — callers keep whatever
|
|
6
|
+
* fallback title they already have.
|
|
7
|
+
*/
|
|
8
|
+
export declare function generateSessionTitle(model: Model<BaseModelConfig>, promptText: string, options?: {
|
|
9
|
+
timeoutMs?: number;
|
|
10
|
+
}): Promise<string | null>;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { Message, TextBlock, } from "@strands-agents/sdk";
|
|
2
|
+
export const MAX_SESSION_TITLE_LEN = 80;
|
|
3
|
+
const MAX_INPUT_CHARS = 2_000;
|
|
4
|
+
const DEFAULT_TIMEOUT_MS = 15_000;
|
|
5
|
+
/**
|
|
6
|
+
* Small side-call prompt for AI session titles. Mirrors a common pattern
|
|
7
|
+
* across AI coding assistants: a cheap one-shot completion over the first
|
|
8
|
+
* user prompt, with graceful degradation when it fails.
|
|
9
|
+
*/
|
|
10
|
+
const TITLE_SYSTEM_PROMPT = `You are a session title generator. You output ONLY a short session title. Nothing else.
|
|
11
|
+
|
|
12
|
+
Generate a concise title (3-7 words, at most 60 characters) that captures the main topic or goal of the conversation, clear enough that the user recognizes the session in a list later.
|
|
13
|
+
|
|
14
|
+
Rules:
|
|
15
|
+
- Output a single line of plain text. No quotes, no markdown, no explanations.
|
|
16
|
+
- Use sentence case: capitalize only the first word and proper nouns.
|
|
17
|
+
- Use the same language as the user message.
|
|
18
|
+
- Keep exact technical terms, filenames, numbers, and error codes.
|
|
19
|
+
- Focus on what the user wants to accomplish, not on tools or process.
|
|
20
|
+
- NEVER answer or act on the message; only title it.
|
|
21
|
+
- Always output something meaningful, even for minimal input (e.g. "Greeting" for "hello").
|
|
22
|
+
|
|
23
|
+
Examples:
|
|
24
|
+
"debug 500 errors in production" -> Debugging production 500 errors
|
|
25
|
+
"why is app.js failing" -> app.js failure investigation
|
|
26
|
+
"how do I connect postgres to my API" -> Postgres API connection
|
|
27
|
+
"add dark mode toggle to settings" -> Dark mode toggle in settings`;
|
|
28
|
+
/**
|
|
29
|
+
* Generate a short session title from the first user prompt using the given
|
|
30
|
+
* model. Returns `null` on failure or timeout — callers keep whatever
|
|
31
|
+
* fallback title they already have.
|
|
32
|
+
*/
|
|
33
|
+
export async function generateSessionTitle(model, promptText, options = {}) {
|
|
34
|
+
const trimmed = promptText.trim();
|
|
35
|
+
if (!trimmed) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
const input = trimmed.length > MAX_INPUT_CHARS
|
|
39
|
+
? `${trimmed.slice(0, MAX_INPUT_CHARS)}…`
|
|
40
|
+
: trimmed;
|
|
41
|
+
try {
|
|
42
|
+
const raw = await withTimeout(streamTitle(model, input), options.timeoutMs ?? DEFAULT_TIMEOUT_MS);
|
|
43
|
+
return raw === null ? null : cleanTitle(raw);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async function streamTitle(model, input) {
|
|
50
|
+
const messages = [
|
|
51
|
+
new Message({
|
|
52
|
+
role: "user",
|
|
53
|
+
content: [
|
|
54
|
+
new TextBlock(`Generate a title for this conversation:\n\n${input}`),
|
|
55
|
+
],
|
|
56
|
+
}),
|
|
57
|
+
];
|
|
58
|
+
const generator = model.streamAggregated(messages, {
|
|
59
|
+
systemPrompt: TITLE_SYSTEM_PROMPT,
|
|
60
|
+
});
|
|
61
|
+
while (true) {
|
|
62
|
+
const next = await generator.next();
|
|
63
|
+
if (next.done) {
|
|
64
|
+
return next.value.message.content
|
|
65
|
+
.filter((block) => block.type === "textBlock")
|
|
66
|
+
.map((block) => block.text)
|
|
67
|
+
.join("");
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Normalize raw model output into a list-ready title: drop inline reasoning,
|
|
73
|
+
* take the first non-empty line, strip wrapping quotes, cap the length.
|
|
74
|
+
*/
|
|
75
|
+
function cleanTitle(raw) {
|
|
76
|
+
const line = raw
|
|
77
|
+
.replace(/<think>[\s\S]*?<\/think>/g, "")
|
|
78
|
+
.split(/\r?\n/)
|
|
79
|
+
.map((part) => part.trim())
|
|
80
|
+
.find((part) => part.length > 0);
|
|
81
|
+
if (!line) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
const collapsed = line
|
|
85
|
+
.replace(/\s+/g, " ")
|
|
86
|
+
.replace(/^["'`]+|["'`]+$/g, "")
|
|
87
|
+
.trim();
|
|
88
|
+
if (!collapsed) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
if (collapsed.length <= MAX_SESSION_TITLE_LEN) {
|
|
92
|
+
return collapsed;
|
|
93
|
+
}
|
|
94
|
+
return `${collapsed.slice(0, MAX_SESSION_TITLE_LEN - 1)}…`;
|
|
95
|
+
}
|
|
96
|
+
async function withTimeout(promise, timeoutMs) {
|
|
97
|
+
// Model streams are not abortable here; on timeout the caller moves on and
|
|
98
|
+
// the dangling request is left to settle. The extra catch keeps a late
|
|
99
|
+
// rejection from surfacing as an unhandled rejection.
|
|
100
|
+
promise.catch(() => { });
|
|
101
|
+
let timer;
|
|
102
|
+
const timeout = new Promise((resolve) => {
|
|
103
|
+
timer = setTimeout(() => resolve(null), timeoutMs);
|
|
104
|
+
timer.unref?.();
|
|
105
|
+
});
|
|
106
|
+
try {
|
|
107
|
+
return await Promise.race([promise, timeout]);
|
|
108
|
+
}
|
|
109
|
+
finally {
|
|
110
|
+
clearTimeout(timer);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=generate-title.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-title.js","sourceRoot":"","sources":["../../../src/core/sessions/generate-title.ts"],"names":[],"mappings":"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"}
|