@kmugalkhod/lightcode 0.18.5 → 0.19.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.
@@ -7,7 +7,7 @@
7
7
  <meta name="theme-color" content="#0B0B0C" />
8
8
  <title>Lightcode</title>
9
9
 
10
- <link rel="stylesheet" crossorigin href="./index-5dh9c5av.css"><script type="module" crossorigin src="./index-89rgdkry.js"></script></head>
10
+ <link rel="stylesheet" crossorigin href="./index-5dh9c5av.css"><script type="module" crossorigin src="./index-1cpyqcg4.js"></script></head>
11
11
  <body>
12
12
  <!--
13
13
  THESIS: One local coding workspace shared with the CLI; this surface rejects dashboard-card clutter and keeps the project conversation central.
package/cli.js CHANGED
@@ -124,7 +124,7 @@ var init_logger = __esm(() => {
124
124
  });
125
125
 
126
126
  // packages/shared/src/version.ts
127
- var lightcodeVersion = "0.18.5";
127
+ var lightcodeVersion = "0.19.0";
128
128
 
129
129
  // packages/shared/src/index.ts
130
130
  var productName = "Lightcode";
@@ -1110,7 +1110,7 @@ var init_route_registry = __esm(() => {
1110
1110
  });
1111
1111
 
1112
1112
  // packages/ai/src/constants.ts
1113
- var MAX_TOOL_TEXT_OUTPUT_CHARS = 12000, DEFAULT_TOOL_TEXT_OUTPUT_CHARS = 6000, MAX_TOOL_LIST_ENTRIES = 200, MAX_TOOL_SEARCH_RESULTS = 200, ANTHROPIC_TOOL_OPTIONAL_PARAMETER_BUDGET = 24, TODO_CONTENT_MAX_CHARS = 200, TODO_ACTIVE_FORM_MAX_CHARS = 80, PROGRESS_NOTE_PRUNE_MIN_CHARS = 200;
1113
+ var MAX_TOOL_TEXT_OUTPUT_CHARS = 12000, DEFAULT_TOOL_TEXT_OUTPUT_CHARS = 6000, READ_FILE_OUTPUT_CHARS = 24000, MAX_TOOL_LIST_ENTRIES = 200, MAX_TOOL_SEARCH_RESULTS = 200, ANTHROPIC_TOOL_OPTIONAL_PARAMETER_BUDGET = 24, TODO_CONTENT_MAX_CHARS = 200, TODO_ACTIVE_FORM_MAX_CHARS = 80, PROGRESS_NOTE_PRUNE_MIN_CHARS = 200;
1114
1114
 
1115
1115
  // packages/ai/src/coding-agent-modes.ts
1116
1116
  import { z } from "zod";
@@ -2485,14 +2485,15 @@ var init_schema8 = __esm(() => {
2485
2485
 
2486
2486
  // packages/ai/src/read-file/schema.ts
2487
2487
  import { z as z18 } from "zod";
2488
- var readFileDescription = "Read file content from the working directory. Each call returns about 6,000 characters (roughly 150 lines); longer content is truncated head+tail. Small files: read them whole. Long files: find the spot with grep first, then read a startLine/endLine range of about 100-150 lines around it.", readFileInputSchema, readFileProviderInputSchema, readFileOutputSchema;
2488
+ var readFileDescription, readFileInputSchema, readFileProviderInputSchema, readFileOutputSchema;
2489
2489
  var init_schema9 = __esm(() => {
2490
2490
  init_base_schemas();
2491
+ readFileDescription = "Read file content from the working directory. Returns whole lines, up to about 24,000 characters (roughly 600 lines) per call, so read a file in one call instead of in slices. " + "If the file is longer, the result stops at endLine and nextStartLine says where to continue. " + "To inspect one spot in a large file, grep for it first, then read a generous startLine/endLine range around it.";
2491
2492
  readFileInputSchema = z18.object({
2492
2493
  path: boundedPathSchema,
2493
2494
  startLine: positiveLineSchema.optional(),
2494
2495
  endLine: positiveLineSchema.optional(),
2495
- maxChars: integerRangeSchema(1, MAX_TOOL_TEXT_OUTPUT_CHARS, "maxChars").optional()
2496
+ maxChars: integerRangeSchema(1, READ_FILE_OUTPUT_CHARS, "maxChars").optional()
2496
2497
  }).superRefine((value, ctx) => {
2497
2498
  if (value.startLine !== undefined && value.endLine !== undefined && value.endLine < value.startLine) {
2498
2499
  ctx.addIssue({
@@ -2513,7 +2514,8 @@ var init_schema9 = __esm(() => {
2513
2514
  endLine: z18.number().int().min(1),
2514
2515
  content: z18.string(),
2515
2516
  totalLines: z18.number().int().nonnegative(),
2516
- truncated: z18.boolean()
2517
+ truncated: z18.boolean(),
2518
+ nextStartLine: z18.number().int().min(1).optional()
2517
2519
  });
2518
2520
  });
2519
2521
 
@@ -2833,7 +2835,7 @@ var init_tool_registry = __esm(() => {
2833
2835
  permissionMode: "read-only",
2834
2836
  execution: "server",
2835
2837
  availability: "git-workspace",
2836
- activation: "specialized",
2838
+ activation: "core",
2837
2839
  outputPolicy: "artifact-if-large"
2838
2840
  },
2839
2841
  git_diff: {
@@ -2846,7 +2848,7 @@ var init_tool_registry = __esm(() => {
2846
2848
  permissionMode: "read-only",
2847
2849
  execution: "server",
2848
2850
  availability: "git-workspace",
2849
- activation: "specialized",
2851
+ activation: "core",
2850
2852
  outputPolicy: "artifact-if-large"
2851
2853
  },
2852
2854
  git_log: {
@@ -2859,7 +2861,7 @@ var init_tool_registry = __esm(() => {
2859
2861
  permissionMode: "read-only",
2860
2862
  execution: "server",
2861
2863
  availability: "git-workspace",
2862
- activation: "specialized",
2864
+ activation: "core",
2863
2865
  outputPolicy: "artifact-if-large"
2864
2866
  },
2865
2867
  git_show: {
@@ -2872,7 +2874,7 @@ var init_tool_registry = __esm(() => {
2872
2874
  permissionMode: "read-only",
2873
2875
  execution: "server",
2874
2876
  availability: "git-workspace",
2875
- activation: "specialized",
2877
+ activation: "core",
2876
2878
  outputPolicy: "artifact-if-large"
2877
2879
  },
2878
2880
  tool_search: {
@@ -3279,6 +3281,7 @@ var init_agent_tools = __esm(() => {
3279
3281
  contextWindow: z26.number().int().positive().optional(),
3280
3282
  preserveRecentTokens: z26.number().int().nonnegative().optional(),
3281
3283
  originalInputTokens: z26.number().int().nonnegative().optional(),
3284
+ promptCacheActive: z26.boolean().optional(),
3282
3285
  assemblyAbortSignal: z26.custom().optional(),
3283
3286
  turnKey: z26.string().min(1).max(200).optional()
3284
3287
  });
@@ -3608,10 +3611,10 @@ ${environmentContext.trim()}` : "");
3608
3611
  var cwdPromptPlaceholder = "{cwd}", defaultCodingAgentSystemPrompt, toolCallingDisciplineAddendum;
3609
3612
  var init_coding_agent_prompt = __esm(() => {
3610
3613
  init_coding_agent_modes();
3611
- defaultCodingAgentSystemPrompt = "You are a coding agent working inside the user's project at this working directory: {cwd}. " + 'You can already see the project \u2014 proactively read it. When the user asks you to review, explain, or work on "my code"/"this", inspect the working directory yourself with list_files, glob_search, grep, and read_file; NEVER ask the user to paste or share code that lives in this directory \u2014 open it. ' + "Use tools for filesystem and codebase tasks instead of guessing, and only interact with files under the working directory. " + "Prefer dedicated tools \u2014 glob_search for paths, grep for text search, structured git tools for repository inspection \u2014 and bash only when those are not enough. " + "Gather context efficiently \u2014 every tool round trip costs the user seconds. Locate before you read: use grep or glob_search to find the relevant files and line numbers, then read those regions in generous ranges (about 100-150 lines) instead of many small slices or re-reading the same file. When several reads or searches do not depend on each other, request them together in one step. Skip generated output (dist/, build/, minified bundles, node_modules) unless the task is about it. Stop exploring once you have enough evidence to act or answer. " + "Check the available skill descriptions for every task. When a skill is explicitly named or clearly matches the task, load it with the skill tool before acting and follow its instructions within the user's scope and tool permissions. Skill files may be installed outside the workspace; use the skill tool to read their relative supporting resources. Never claim to have used a skill you have not loaded. " + `Inspect context before risky operations. Progress notes: before a major tool action you may emit ONE short note (one sentence, ~15 words) saying what you are about to do. After a tool returns, mention a finding only if it changes your plan, and state it as fact grounded in what the tool actually returned \u2014 cite the file/line/symbol. NEVER claim you found, changed, or fixed something before a tool result confirms it. Skip notes for routine reads, and do not restate the todo list in prose.
3614
+ defaultCodingAgentSystemPrompt = "You are a coding agent working inside the user's project at this working directory: {cwd}. " + 'You can already see the project \u2014 proactively read it. When the user asks you to review, explain, or work on "my code"/"this", inspect the working directory yourself with list_files, glob_search, grep, and read_file; NEVER ask the user to paste or share code that lives in this directory \u2014 open it. ' + "Use tools for filesystem and codebase tasks instead of guessing, and only interact with files under the working directory. " + "Prefer dedicated tools \u2014 glob_search for paths, grep for text search, structured git tools for repository inspection \u2014 and bash only when those are not enough. " + "Gather context efficiently \u2014 every tool round trip costs the user seconds. The environment section maps the repository's files: use it to go straight to the right paths instead of listing directories. Locate before you read: use grep or glob_search to find the relevant files and line numbers, then read whole files (read_file returns up to about 600 lines per call) or, in larger files, a range of a few hundred lines around the spot \u2014 never many small slices, and never re-read content you already have. When several reads or searches do not depend on each other, request them together in one step. Skip generated output (dist/, build/, minified bundles, node_modules) unless the task is about it. Stop exploring once you have enough evidence to act or answer. " + "Check the available skill descriptions for every task. When a skill is explicitly named or clearly matches the task, load it with the skill tool before acting and follow its instructions within the user's scope and tool permissions. Skill files may be installed outside the workspace; use the skill tool to read their relative supporting resources. Never claim to have used a skill you have not loaded. " + `Inspect context before risky operations. Progress notes: before a major tool action you may emit ONE short note (one sentence, ~15 words) saying what you are about to do. After a tool returns, mention a finding only if it changes your plan, and state it as fact grounded in what the tool actually returned \u2014 cite the file/line/symbol. NEVER claim you found, changed, or fixed something before a tool result confirms it. Skip notes for routine reads, and do not restate the todo list in prose.
3612
3615
 
3613
3616
  ` + `Task list discipline \u2014 use the todo_write tool to keep a visible, evolving checklist:
3614
- ` + `- Create the list FIRST. For any task with roughly three or more distinct steps, or any multi-file or multi-stage work, call todo_write as your very first action \u2014 before reading or editing \u2014 with every step listed and all of them set to pending.
3617
+ ` + `- Create the list in your first step. For any task with roughly three or more distinct steps, or any multi-file or multi-stage work, call todo_write in your first response with every step listed and all of them set to pending \u2014 request it together with your first reads or searches, not as a separate step, and always before any edit.
3615
3618
  ` + `- Keep exactly ONE item in_progress at a time. Mark an item in_progress immediately before you start it; never have two items in_progress at once.
3616
3619
  ` + `- Mark an item completed only after a tool result confirms it is actually done (test passed, file written, build clean) \u2014 not on intent. Do this the MOMENT it is confirmed; do not batch completions or wait until the end of the turn.
3617
3620
  ` + `- Completions are monotonic: once a task is completed, do not silently move it back to pending or in_progress. Reopen it only if it genuinely regressed.
@@ -4021,20 +4024,26 @@ function collectTextFromUnknown(value) {
4021
4024
  }
4022
4025
  return "";
4023
4026
  }
4024
- function getLastUserText(messages, prompt) {
4027
+ function getUserTexts(messages, prompt) {
4028
+ const texts = [];
4025
4029
  if (Array.isArray(messages)) {
4026
- for (let index = messages.length - 1;index >= 0; index -= 1) {
4027
- const message = messages[index];
4030
+ for (const message of messages) {
4028
4031
  if (!isRecord4(message) || message.role !== "user") {
4029
4032
  continue;
4030
4033
  }
4031
4034
  const text = collectTextFromUnknown(message).trim();
4032
4035
  if (text) {
4033
- return text;
4036
+ texts.push(text);
4034
4037
  }
4035
4038
  }
4036
4039
  }
4037
- return collectTextFromUnknown(prompt).trim();
4040
+ if (texts.length === 0) {
4041
+ const promptText = collectTextFromUnknown(prompt).trim();
4042
+ if (promptText) {
4043
+ texts.push(promptText);
4044
+ }
4045
+ }
4046
+ return texts;
4038
4047
  }
4039
4048
  function escapeRegExp(value) {
4040
4049
  return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
@@ -4060,23 +4069,20 @@ function selectCodingAgentIntentTools({
4060
4069
  messages,
4061
4070
  availableSkillNames = []
4062
4071
  }) {
4063
- const userText = getLastUserText(messages, prompt);
4064
- const normalizedText = userText.toLowerCase();
4065
- if (!normalizedText || casualPromptPattern.test(normalizedText)) {
4072
+ const userTexts = getUserTexts(messages, prompt);
4073
+ if (userTexts.every((text) => casualPromptPattern.test(text))) {
4066
4074
  return [];
4067
4075
  }
4076
+ const latestText = userTexts.at(-1) ?? "";
4068
4077
  const modeTools = getRegistryToolsForMode(mode);
4069
4078
  const selected = new Set(modeTools.filter((toolName) => codingToolRegistry[toolName].activation === "core"));
4070
- if (gitIntentPattern.test(userText)) {
4071
- addTools(selected, gitToolNames);
4072
- }
4073
- if (webIntentPattern.test(userText)) {
4079
+ if (webIntentPattern.test(latestText)) {
4074
4080
  addTools(selected, webToolNames);
4075
4081
  }
4076
- if (mcpIntentPattern.test(userText)) {
4082
+ if (userTexts.some((text) => mcpIntentPattern.test(text))) {
4077
4083
  addTools(selected, mcpToolNames);
4078
4084
  }
4079
- if (skillIntentPattern.test(userText) || requestsAvailableSkill(userText, availableSkillNames)) {
4085
+ if (userTexts.some((text) => skillIntentPattern.test(text) || requestsAvailableSkill(text, availableSkillNames))) {
4080
4086
  selected.add("skill");
4081
4087
  }
4082
4088
  return modeTools.filter((toolName) => selected.has(toolName));
@@ -4156,21 +4162,14 @@ function limitProviderActiveTools(tools, maxTools = maxProviderActiveTools) {
4156
4162
  const toolSet = new Set(tools);
4157
4163
  return providerToolPriority.filter((toolName) => toolSet.has(toolName)).slice(0, maxTools);
4158
4164
  }
4159
- var casualPromptPattern, gitIntentPattern, webIntentPattern, mcpIntentPattern, skillIntentPattern, gitToolNames, webToolNames, mcpToolNames, maxProviderActiveTools = 24, providerToolPriority;
4165
+ var casualPromptPattern, webIntentPattern, mcpIntentPattern, skillIntentPattern, webToolNames, mcpToolNames, maxProviderActiveTools = 24, providerToolPriority;
4160
4166
  var init_intent_tool_selection = __esm(() => {
4161
4167
  init_coding_agent_modes();
4162
4168
  init_tool_registry();
4163
4169
  casualPromptPattern = /^(hi|hello|hey|how are you|how r you|what'?s up|whats up|sup|thanks|thank you|ok|okay|yes|no|nice|cool|great)[\s?!.,]*$/i;
4164
- gitIntentPattern = /(?:\bgit\b|\bcommits?\b|\bstaged?\b|\bunstaged\b|\buntracked\b|\bworking tree\b|\brepositor(?:y|ies)\s+(?:status|diff|history|changes))/i;
4165
4170
  webIntentPattern = /(?:\bhttps?:\/\/|\bwww\.|\bweb(?:site|page)?\b|\binternet\b|\bonline\b|\burl\b|\bbrowser\b|\bsearch\s+(?:the\s+)?web\b|\bbrowse\s+(?:the\s+web|online|for)\b|\blook\s+up\b|\b(?:latest|current|recent|today'?s)\s+(?:news|price|weather|docs?|documentation|release|version)\b)/i;
4166
4171
  mcpIntentPattern = /(?:\bmcp\b|\bmodel context protocol\b)/i;
4167
4172
  skillIntentPattern = /\bskills?\b/i;
4168
- gitToolNames = [
4169
- "git_status",
4170
- "git_diff",
4171
- "git_log",
4172
- "git_show"
4173
- ];
4174
4173
  webToolNames = [
4175
4174
  "web_fetch",
4176
4175
  "web_search"
@@ -5733,19 +5732,44 @@ async function executeReadFile(input, workspaceContext = getDefaultWorkspaceCont
5733
5732
  const fileContent = await fs4.readFile(resolvedPath, "utf8");
5734
5733
  const lines = fileContent.split(/\r?\n/);
5735
5734
  const { start, end } = clampLineRange(lines.length, parsedInput.startLine, parsedInput.endLine);
5736
- const selectedContent = lines.slice(start - 1, end).join(`
5737
- `);
5738
- const maxChars = parsedInput.maxChars ?? DEFAULT_TOOL_TEXT_OUTPUT_CHARS;
5739
- const truncated = truncateText(selectedContent, maxChars);
5735
+ const maxChars = parsedInput.maxChars ?? READ_FILE_OUTPUT_CHARS;
5736
+ const taken = takeWholeLines(lines.slice(start - 1, end), maxChars);
5737
+ const lastLine = start + taken.lineCount - 1;
5740
5738
  return readFileOutputSchema.parse({
5741
5739
  path: relativePath,
5742
5740
  startLine: start,
5743
- endLine: end,
5744
- content: truncated.text,
5741
+ endLine: lastLine,
5742
+ content: taken.text,
5745
5743
  totalLines: lines.length,
5746
- truncated: truncated.truncated
5744
+ truncated: taken.truncated,
5745
+ ...lastLine < end ? { nextStartLine: lastLine + 1 } : {}
5747
5746
  });
5748
5747
  }
5748
+ function takeWholeLines(lines, maxChars) {
5749
+ let used = 0;
5750
+ let lineCount = 0;
5751
+ for (const line of lines) {
5752
+ const cost = line.length + (lineCount > 0 ? 1 : 0);
5753
+ if (used + cost > maxChars) {
5754
+ break;
5755
+ }
5756
+ used += cost;
5757
+ lineCount += 1;
5758
+ }
5759
+ if (lineCount === 0 && lines.length > 0) {
5760
+ return {
5761
+ text: truncateText(lines[0] ?? "", maxChars).text,
5762
+ lineCount: 1,
5763
+ truncated: true
5764
+ };
5765
+ }
5766
+ return {
5767
+ text: lines.slice(0, lineCount).join(`
5768
+ `),
5769
+ lineCount,
5770
+ truncated: lineCount < lines.length
5771
+ };
5772
+ }
5749
5773
  var init_runtime8 = __esm(() => {
5750
5774
  init_resolve_within_workspace();
5751
5775
  init_output_utils();
@@ -7049,10 +7073,12 @@ function buildProviderView(options) {
7049
7073
  }
7050
7074
  const tokenBoundedCutoffIndex = computeTokenBoundedCompactionCutoffIndex(messages, preserveRecentTokens, afterAnchorIndex);
7051
7075
  const userIndicesAfterAnchor = messages.map((message, index) => ({ message, index })).filter(({ message, index }) => index >= afterAnchorIndex && message.role === "user").map(({ index }) => index);
7052
- const rollingTurnCutoffIndex = userIndicesAfterAnchor.length > config.uncachedRollingCompactionUserTurns ? userIndicesAfterAnchor[userIndicesAfterAnchor.length - config.uncachedRollingCompactionUserTurns] ?? afterAnchorIndex : afterAnchorIndex;
7076
+ const rollingKeepUserTurns = Math.max(1, Math.ceil(config.uncachedRollingCompactionUserTurns / 2));
7077
+ const rollingTurnCutoffIndex = userIndicesAfterAnchor.length > rollingKeepUserTurns ? userIndicesAfterAnchor[userIndicesAfterAnchor.length - rollingKeepUserTurns] ?? afterAnchorIndex : afterAnchorIndex;
7053
7078
  const overCompactThreshold = triggerTokens(estimate.tokens) > config.compactAtFraction * inputBudgetTokens;
7079
+ const rollingActive = (options.rollingCompaction ?? options.cacheActive === false) && config.aggressivePruneWhenUncached;
7054
7080
  const userTurnsAfterAnchor = messages.slice(afterAnchorIndex).filter((message) => message.role === "user").length;
7055
- const rollingThresholdReached = uncachedActive && userTurnsAfterAnchor > config.uncachedRollingCompactionUserTurns;
7081
+ const rollingThresholdReached = rollingActive && userTurnsAfterAnchor > (options.continueRolling ? rollingKeepUserTurns : config.uncachedRollingCompactionUserTurns);
7056
7082
  const compactionCutoffIndex = rollingThresholdReached ? Math.max(tokenBoundedCutoffIndex, rollingTurnCutoffIndex) : tokenBoundedCutoffIndex;
7057
7083
  const coveredMessages = capCoverageToTokenBudget(messages.slice(afterAnchorIndex, compactionCutoffIndex), config.maxCoverageTokensPerCompaction);
7058
7084
  let compactionBlockedReason = null;
@@ -7509,6 +7535,14 @@ import path12 from "path";
7509
7535
  import {
7510
7536
  toolModelMessageSchema
7511
7537
  } from "ai";
7538
+ function resolveToolOutputArtifactThresholds({
7539
+ promptCacheActive
7540
+ }) {
7541
+ return {
7542
+ thresholdCharacters: promptCacheActive ? DEFAULT_CURRENT_TURN_TOOL_OUTPUT_THRESHOLD_CHARACTERS : DEFAULT_TOOL_OUTPUT_ARTIFACT_THRESHOLD_CHARACTERS,
7543
+ currentTurnThresholdCharacters: DEFAULT_CURRENT_TURN_TOOL_OUTPUT_THRESHOLD_CHARACTERS
7544
+ };
7545
+ }
7512
7546
  function isRecord10(value) {
7513
7547
  return typeof value === "object" && value !== null;
7514
7548
  }
@@ -7798,7 +7832,7 @@ async function toolOutputArtifactExists(handleOrDigest, dataDir = getLightcodeDa
7798
7832
  throw error;
7799
7833
  }
7800
7834
  }
7801
- var TOOL_OUTPUT_ARTIFACT_HANDLE_PREFIX = "lightcode-artifact://tool-output/sha256/", DEFAULT_TOOL_OUTPUT_ARTIFACT_THRESHOLD_CHARACTERS, DEFAULT_CURRENT_TURN_TOOL_OUTPUT_THRESHOLD_CHARACTERS = 16000, DEFAULT_TOOL_OUTPUT_ARTIFACT_PREVIEW_CHARACTERS = 2400, MIN_TOOL_OUTPUT_ARTIFACT_PREVIEW_CHARACTERS = 512, SHA256_PATTERN, ARTIFACT_PREVIEW_MARKER = "[Lightcode tool-output artifact]";
7835
+ var TOOL_OUTPUT_ARTIFACT_HANDLE_PREFIX = "lightcode-artifact://tool-output/sha256/", DEFAULT_TOOL_OUTPUT_ARTIFACT_THRESHOLD_CHARACTERS, DEFAULT_CURRENT_TURN_TOOL_OUTPUT_THRESHOLD_CHARACTERS = 32000, DEFAULT_TOOL_OUTPUT_ARTIFACT_PREVIEW_CHARACTERS = 2400, MIN_TOOL_OUTPUT_ARTIFACT_PREVIEW_CHARACTERS = 512, SHA256_PATTERN, ARTIFACT_PREVIEW_MARKER = "[Lightcode tool-output artifact]";
7802
7836
  var init_tool_output_artifacts = __esm(() => {
7803
7837
  init_src();
7804
7838
  DEFAULT_TOOL_OUTPUT_ARTIFACT_THRESHOLD_CHARACTERS = DEFAULT_TOOL_TEXT_OUTPUT_CHARS;
@@ -9218,7 +9252,9 @@ function createCodingAgent({
9218
9252
  });
9219
9253
  const artifactized = await artifactizeLargeToolOutputs(messages, {
9220
9254
  signal: context.assemblyAbortSignal,
9221
- currentTurnThresholdCharacters: DEFAULT_CURRENT_TURN_TOOL_OUTPUT_THRESHOLD_CHARACTERS
9255
+ ...resolveToolOutputArtifactThresholds({
9256
+ promptCacheActive: context.promptCacheActive ?? false
9257
+ })
9222
9258
  });
9223
9259
  const assembled = assembler.assembleModelMessages(artifactized.messages, {
9224
9260
  preserveRecentTokens: context.preserveRecentTokens
@@ -9284,6 +9320,7 @@ function createCodingAgent({
9284
9320
  reservedOutputTokens: options.maxOutputTokens,
9285
9321
  preserveRecentTokens: options.preserveRecentTokens,
9286
9322
  originalInputTokens: options.originalInputTokens,
9323
+ promptCacheActive: options.promptCacheActive,
9287
9324
  assemblyAbortSignal: options.assemblyAbortSignal
9288
9325
  },
9289
9326
  instructions
@@ -16568,6 +16605,7 @@ __export(exports_runtime, {
16568
16605
  resolveWithinWorkspace: () => resolveWithinWorkspace,
16569
16606
  resolveWebSearchCapability: () => resolveWebSearchCapability,
16570
16607
  resolveWebSearchApiKeys: () => resolveWebSearchApiKeys,
16608
+ resolveToolOutputArtifactThresholds: () => resolveToolOutputArtifactThresholds,
16571
16609
  resolveProviderWebSearchAccess: () => resolveProviderWebSearchAccess,
16572
16610
  resolvePreserveRecentTokens: () => resolvePreserveRecentTokens,
16573
16611
  resolveMaxOutputTokens: () => resolveMaxOutputTokens,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kmugalkhod/lightcode",
3
- "version": "0.18.5",
3
+ "version": "0.19.0",
4
4
  "description": "Lightcode — a local AI coding agent with terminal and browser interfaces.",
5
5
  "type": "module",
6
6
  "license": "MIT",