@caupulican/pi-adaptative 0.80.22 → 0.80.25

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.
Files changed (111) hide show
  1. package/CHANGELOG.md +38 -1
  2. package/README.md +16 -2
  3. package/dist/cli/args.d.ts +2 -0
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +14 -0
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/cli/file-processor.d.ts.map +1 -1
  8. package/dist/cli/file-processor.js +28 -1
  9. package/dist/cli/file-processor.js.map +1 -1
  10. package/dist/core/agent-session-services.d.ts +4 -0
  11. package/dist/core/agent-session-services.d.ts.map +1 -1
  12. package/dist/core/agent-session-services.js +22 -0
  13. package/dist/core/agent-session-services.js.map +1 -1
  14. package/dist/core/agent-session.d.ts +4 -1
  15. package/dist/core/agent-session.d.ts.map +1 -1
  16. package/dist/core/agent-session.js +32 -78
  17. package/dist/core/agent-session.js.map +1 -1
  18. package/dist/core/bash-executor.d.ts.map +1 -1
  19. package/dist/core/bash-executor.js +16 -7
  20. package/dist/core/bash-executor.js.map +1 -1
  21. package/dist/core/exec.d.ts +20 -1
  22. package/dist/core/exec.d.ts.map +1 -1
  23. package/dist/core/exec.js +52 -19
  24. package/dist/core/exec.js.map +1 -1
  25. package/dist/core/extensions/loader.d.ts +6 -0
  26. package/dist/core/extensions/loader.d.ts.map +1 -1
  27. package/dist/core/extensions/loader.js +33 -1
  28. package/dist/core/extensions/loader.js.map +1 -1
  29. package/dist/core/extensions/types.d.ts +2 -0
  30. package/dist/core/extensions/types.d.ts.map +1 -1
  31. package/dist/core/extensions/types.js.map +1 -1
  32. package/dist/core/message-retention.d.ts +26 -0
  33. package/dist/core/message-retention.d.ts.map +1 -0
  34. package/dist/core/message-retention.js +95 -0
  35. package/dist/core/message-retention.js.map +1 -0
  36. package/dist/core/package-manager.d.ts +3 -0
  37. package/dist/core/package-manager.d.ts.map +1 -1
  38. package/dist/core/package-manager.js +72 -6
  39. package/dist/core/package-manager.js.map +1 -1
  40. package/dist/core/prompt-templates.d.ts.map +1 -1
  41. package/dist/core/prompt-templates.js +3 -1
  42. package/dist/core/prompt-templates.js.map +1 -1
  43. package/dist/core/resource-loader.d.ts.map +1 -1
  44. package/dist/core/resource-loader.js +39 -11
  45. package/dist/core/resource-loader.js.map +1 -1
  46. package/dist/core/resource-profile-blocks.d.ts +16 -0
  47. package/dist/core/resource-profile-blocks.d.ts.map +1 -0
  48. package/dist/core/resource-profile-blocks.js +120 -0
  49. package/dist/core/resource-profile-blocks.js.map +1 -0
  50. package/dist/core/sdk.d.ts +9 -0
  51. package/dist/core/sdk.d.ts.map +1 -1
  52. package/dist/core/sdk.js +17 -0
  53. package/dist/core/sdk.js.map +1 -1
  54. package/dist/core/session-manager.d.ts +3 -1
  55. package/dist/core/session-manager.d.ts.map +1 -1
  56. package/dist/core/session-manager.js +45 -9
  57. package/dist/core/session-manager.js.map +1 -1
  58. package/dist/core/settings-manager.d.ts +45 -1
  59. package/dist/core/settings-manager.d.ts.map +1 -1
  60. package/dist/core/settings-manager.js +218 -10
  61. package/dist/core/settings-manager.js.map +1 -1
  62. package/dist/core/skills.d.ts.map +1 -1
  63. package/dist/core/skills.js +15 -0
  64. package/dist/core/skills.js.map +1 -1
  65. package/dist/core/tools/git-filter.d.ts +9 -1
  66. package/dist/core/tools/git-filter.d.ts.map +1 -1
  67. package/dist/core/tools/git-filter.js +94 -8
  68. package/dist/core/tools/git-filter.js.map +1 -1
  69. package/dist/core/tools/read.d.ts +31 -0
  70. package/dist/core/tools/read.d.ts.map +1 -1
  71. package/dist/core/tools/read.js +164 -33
  72. package/dist/core/tools/read.js.map +1 -1
  73. package/dist/index.d.ts +2 -1
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +2 -1
  76. package/dist/index.js.map +1 -1
  77. package/dist/main.d.ts.map +1 -1
  78. package/dist/main.js +17 -0
  79. package/dist/main.js.map +1 -1
  80. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  81. package/dist/modes/interactive/components/tool-execution.js +37 -4
  82. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  83. package/dist/modes/interactive/interactive-mode.d.ts +2 -1
  84. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  85. package/dist/modes/interactive/interactive-mode.js +54 -18
  86. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  87. package/dist/modes/rpc/jsonl.d.ts +0 -7
  88. package/dist/modes/rpc/jsonl.d.ts.map +1 -1
  89. package/dist/modes/rpc/jsonl.js +17 -0
  90. package/dist/modes/rpc/jsonl.js.map +1 -1
  91. package/dist/utils/safe-write-stream.d.ts +10 -0
  92. package/dist/utils/safe-write-stream.d.ts.map +1 -0
  93. package/dist/utils/safe-write-stream.js +16 -0
  94. package/dist/utils/safe-write-stream.js.map +1 -0
  95. package/dist/utils/sleep.d.ts +3 -1
  96. package/dist/utils/sleep.d.ts.map +1 -1
  97. package/dist/utils/sleep.js +10 -4
  98. package/dist/utils/sleep.js.map +1 -1
  99. package/docs/extensions.md +18 -1
  100. package/docs/prompt-templates.md +1 -0
  101. package/docs/settings.md +43 -1
  102. package/docs/skills.md +12 -0
  103. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  104. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  105. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  106. package/examples/extensions/sandbox/package-lock.json +2 -2
  107. package/examples/extensions/sandbox/package.json +1 -1
  108. package/examples/extensions/with-deps/package-lock.json +2 -2
  109. package/examples/extensions/with-deps/package.json +1 -1
  110. package/npm-shrinkwrap.json +12 -12
  111. package/package.json +4 -4
@@ -27,85 +27,16 @@ import { exportSessionToHtml } from "./export-html/index.js";
27
27
  import { createToolHtmlRenderer } from "./export-html/tool-renderer.js";
28
28
  import { ExtensionRunner, wrapRegisteredTools, } from "./extensions/index.js";
29
29
  import { emitSessionShutdownEvent } from "./extensions/runner.js";
30
+ import { compactToolResultDetailsForRetention } from "./message-retention.js";
30
31
  import { expandPromptTemplate } from "./prompt-templates.js";
32
+ import { stripResourceProfileBlocks } from "./resource-profile-blocks.js";
31
33
  import { CURRENT_SESSION_VERSION, getLatestCompactionEntry } from "./session-manager.js";
34
+ import { matchesResourceProfilePattern, } from "./settings-manager.js";
32
35
  import { createSyntheticSourceInfo } from "./source-info.js";
33
36
  import { buildSystemPrompt } from "./system-prompt.js";
34
37
  import { createLocalBashOperations } from "./tools/bash.js";
35
38
  import { createAllToolDefinitions } from "./tools/index.js";
36
39
  import { createToolDefinitionFromAgentTool } from "./tools/tool-definition-wrapper.js";
37
- const MAX_RETAINED_TOOL_RESULT_DETAILS_BYTES = 32 * 1024;
38
- function estimateJsonLikeBytes(value, maxBytes) {
39
- const seen = new WeakSet();
40
- let bytes = 0;
41
- const add = (amount) => {
42
- bytes += amount;
43
- return bytes <= maxBytes;
44
- };
45
- const visit = (current) => {
46
- if (bytes > maxBytes)
47
- return false;
48
- if (current === null)
49
- return add(4);
50
- if (current === undefined)
51
- return add(9);
52
- if (typeof current === "string")
53
- return add(current.length * 4 + 2);
54
- if (typeof current === "number")
55
- return add(24);
56
- if (typeof current === "boolean")
57
- return add(current ? 4 : 5);
58
- if (typeof current === "bigint")
59
- return add(current.toString().length + 2);
60
- if (typeof current === "symbol" || typeof current === "function")
61
- return add(12);
62
- if (typeof current !== "object")
63
- return add(8);
64
- const objectValue = current;
65
- if (seen.has(objectValue))
66
- return add(20);
67
- seen.add(objectValue);
68
- if (Array.isArray(objectValue)) {
69
- if (!add(2))
70
- return false;
71
- for (let index = 0; index < objectValue.length; index++) {
72
- if (!add(index === 0 ? 0 : 1))
73
- return false;
74
- if (!visit(objectValue[index]))
75
- return false;
76
- }
77
- return bytes <= maxBytes;
78
- }
79
- if (!add(2))
80
- return false;
81
- let first = true;
82
- for (const key in objectValue) {
83
- if (!Object.hasOwn(objectValue, key))
84
- continue;
85
- if (!add((first ? 0 : 1) + key.length * 4 + 3))
86
- return false;
87
- first = false;
88
- if (!visit(objectValue[key]))
89
- return false;
90
- }
91
- return bytes <= maxBytes;
92
- };
93
- visit(value);
94
- return { bytes, exceeded: bytes > maxBytes };
95
- }
96
- function compactToolResultDetailsForRetention(message) {
97
- if (message.role !== "toolResult" || message.details === undefined)
98
- return;
99
- const estimate = estimateJsonLikeBytes(message.details, MAX_RETAINED_TOOL_RESULT_DETAILS_BYTES);
100
- if (!estimate.exceeded)
101
- return;
102
- message.details = {
103
- piToolResultDetailsTruncated: true,
104
- reason: "Tool result details exceeded retention budget; model-visible content was retained.",
105
- minimumBytes: estimate.bytes,
106
- maxRetainedBytes: MAX_RETAINED_TOOL_RESULT_DETAILS_BYTES,
107
- };
108
- }
109
40
  /**
110
41
  * Parse a skill block from message text.
111
42
  * Returns null if the text doesn't contain a skill block.
@@ -170,6 +101,7 @@ export class AgentSession {
170
101
  _initialActiveToolNames;
171
102
  _allowedToolNames;
172
103
  _excludedToolNames;
104
+ _toolProfileFilter;
173
105
  _baseToolsOverride;
174
106
  _sessionStartEvent;
175
107
  _extensionUIContext;
@@ -202,6 +134,9 @@ export class AgentSession {
202
134
  this._initialActiveToolNames = config.initialActiveToolNames;
203
135
  this._allowedToolNames = config.allowedToolNames ? new Set(config.allowedToolNames) : undefined;
204
136
  this._excludedToolNames = config.excludedToolNames ? new Set(config.excludedToolNames) : undefined;
137
+ this._toolProfileFilter = config.toolProfileFilter
138
+ ? { allow: config.toolProfileFilter.allow ?? [], block: config.toolProfileFilter.block ?? [] }
139
+ : undefined;
205
140
  this._baseToolsOverride = config.baseToolsOverride;
206
141
  this._sessionStartEvent = config.sessionStartEvent ?? { type: "session_start", reason: "startup" };
207
142
  // Always subscribe to agent events for internal handling
@@ -913,7 +848,7 @@ export class AgentSession {
913
848
  * @throws Error if no model selected or no API key available (when not streaming)
914
849
  */
915
850
  async prompt(text, options) {
916
- if (this.isStreaming && options?.streamingBehavior) {
851
+ if ((this.isStreaming || this.isRetrying) && options?.streamingBehavior) {
917
852
  const run = this._streamingPromptSubmissionTail.then(() => this._promptUnserialized(text, options), () => this._promptUnserialized(text, options));
918
853
  this._streamingPromptSubmissionTail = run.catch(() => { });
919
854
  return run;
@@ -965,8 +900,10 @@ export class AgentSession {
965
900
  expandedText = this._expandSkillCommand(expandedText);
966
901
  expandedText = expandPromptTemplate(expandedText, [...this.promptTemplates]);
967
902
  }
968
- // If streaming, queue via steer() or followUp() based on option
969
- if (this.isStreaming) {
903
+ // If streaming or waiting out a retry backoff, which is still an active
904
+ // operation — queue via steer() or followUp() instead of starting a
905
+ // concurrent run that would race the pending retry continuation.
906
+ if (this.isStreaming || this.isRetrying) {
970
907
  if (!options?.streamingBehavior) {
971
908
  throw new Error("Agent is already processing. Specify streamingBehavior ('steer' or 'followUp') to queue the message.");
972
909
  }
@@ -1099,7 +1036,7 @@ export class AgentSession {
1099
1036
  return text; // Unknown skill, pass through
1100
1037
  try {
1101
1038
  const content = readFileSync(skill.filePath, "utf-8");
1102
- const body = stripFrontmatter(content).trim();
1039
+ const body = stripResourceProfileBlocks(stripFrontmatter(content)).trim();
1103
1040
  const skillBlock = `<skill name="${skill.name}" location="${skill.filePath}">\nReferences are relative to ${skill.baseDir}.\n\n${body}\n</skill>`;
1104
1041
  return args ? `${skillBlock}\n\n${args}` : skillBlock;
1105
1042
  }
@@ -2090,7 +2027,21 @@ export class AgentSession {
2090
2027
  const previousActiveToolNames = this.getActiveToolNames();
2091
2028
  const allowedToolNames = this._allowedToolNames;
2092
2029
  const excludedToolNames = this._excludedToolNames;
2093
- const isAllowedTool = (name) => (!allowedToolNames || allowedToolNames.has(name)) && !excludedToolNames?.has(name);
2030
+ const toolProfileFilter = this._toolProfileFilter;
2031
+ const isAllowedTool = (name) => {
2032
+ if (allowedToolNames && !allowedToolNames.has(name))
2033
+ return false;
2034
+ if (excludedToolNames?.has(name))
2035
+ return false;
2036
+ if (!toolProfileFilter)
2037
+ return true;
2038
+ if (toolProfileFilter.allow.length > 0 && !matchesResourceProfilePattern(name, toolProfileFilter.allow)) {
2039
+ return false;
2040
+ }
2041
+ if (matchesResourceProfilePattern(name, toolProfileFilter.block))
2042
+ return false;
2043
+ return true;
2044
+ };
2094
2045
  const registeredTools = this._extensionRunner.getAllRegisteredTools();
2095
2046
  const allCustomTools = [
2096
2047
  ...registeredTools,
@@ -2256,6 +2207,10 @@ export class AgentSession {
2256
2207
  return false;
2257
2208
  }
2258
2209
  const delayMs = settings.baseDelayMs * 2 ** (this._retryAttempt - 1);
2210
+ // The retry window counts as active work from the instant listeners hear
2211
+ // about it: isRetrying must already be true inside auto_retry_start handlers
2212
+ // so prompts arriving there queue as steering instead of racing the retry.
2213
+ this._retryAbortController = new AbortController();
2259
2214
  this._emit({
2260
2215
  type: "auto_retry_start",
2261
2216
  attempt: this._retryAttempt,
@@ -2269,7 +2224,6 @@ export class AgentSession {
2269
2224
  this.agent.state.messages = messages.slice(0, -1);
2270
2225
  }
2271
2226
  // Wait with exponential backoff (abortable)
2272
- this._retryAbortController = new AbortController();
2273
2227
  try {
2274
2228
  await sleep(delayMs, this._retryAbortController.signal);
2275
2229
  }