@javargasm/pi-kiro 0.4.8 → 0.4.9

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/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.4.9
4
+
5
+ ### Patch Changes
6
+
7
+ - 8a547ef: fix: sanitize history to prevent Bedrock TOOL_DUPLICATE and TOOL_USE_RESULT_MISMATCH errors
8
+
9
+ Added `sanitizeHistory` defense-in-depth pass that runs after `collapseAgenticLoops`:
10
+
11
+ - Deduplicates toolUseIds within each assistant message (prevents TOOL_DUPLICATE)
12
+ - Removes orphan toolUses without matching toolResults (prevents TOOL_USE_RESULT_MISMATCH)
13
+ - Removes orphan toolResults without matching toolUses
14
+
15
+ These errors surfaced during retry loops where the same assistant message
16
+ with tool calls could be re-injected into the history.
17
+
18
+ - refactor: define `TestCase` type in smoke-live test to fix `TS2304` compilation error
3
19
  ## 0.4.8
4
20
 
5
21
  ### Patch Changes
package/dist/core.js CHANGED
@@ -2566,7 +2566,38 @@ Tool results provided.`;
2566
2566
  });
2567
2567
  }
2568
2568
  }
2569
- return { history: collapseAgenticLoops(history), systemPrepended, currentMsgStartIdx };
2569
+ return { history: sanitizeHistory(collapseAgenticLoops(history)), systemPrepended, currentMsgStartIdx };
2570
+ }
2571
+ function sanitizeHistory(history) {
2572
+ for (let i = 0;i < history.length; i++) {
2573
+ const entry = history[i];
2574
+ const arm = entry?.assistantResponseMessage;
2575
+ if (!arm?.toolUses || arm.toolUses.length === 0)
2576
+ continue;
2577
+ const seen = new Set;
2578
+ arm.toolUses = arm.toolUses.filter((tu) => {
2579
+ if (seen.has(tu.toolUseId))
2580
+ return false;
2581
+ seen.add(tu.toolUseId);
2582
+ return true;
2583
+ });
2584
+ const next = i + 1 < history.length ? history[i + 1] : undefined;
2585
+ const toolResults = next?.userInputMessage?.userInputMessageContext?.toolResults;
2586
+ if (!toolResults) {
2587
+ delete arm.toolUses;
2588
+ continue;
2589
+ }
2590
+ const resultIdSet = new Set(toolResults.map((tr) => tr.toolUseId));
2591
+ const useIdSet = new Set(arm.toolUses.map((tu) => tu.toolUseId));
2592
+ arm.toolUses = arm.toolUses.filter((tu) => resultIdSet.has(tu.toolUseId));
2593
+ if (arm.toolUses.length === 0)
2594
+ delete arm.toolUses;
2595
+ const ctx = next.userInputMessage.userInputMessageContext;
2596
+ ctx.toolResults = toolResults.filter((tr) => useIdSet.has(tr.toolUseId));
2597
+ if (ctx.toolResults.length === 0)
2598
+ delete ctx.toolResults;
2599
+ }
2600
+ return history;
2570
2601
  }
2571
2602
  function collapseAgenticLoops(history) {
2572
2603
  if (history.length < 4)
package/dist/extension.js CHANGED
@@ -2570,7 +2570,38 @@ Tool results provided.`;
2570
2570
  });
2571
2571
  }
2572
2572
  }
2573
- return { history: collapseAgenticLoops(history), systemPrepended, currentMsgStartIdx };
2573
+ return { history: sanitizeHistory(collapseAgenticLoops(history)), systemPrepended, currentMsgStartIdx };
2574
+ }
2575
+ function sanitizeHistory(history) {
2576
+ for (let i = 0;i < history.length; i++) {
2577
+ const entry = history[i];
2578
+ const arm = entry?.assistantResponseMessage;
2579
+ if (!arm?.toolUses || arm.toolUses.length === 0)
2580
+ continue;
2581
+ const seen = new Set;
2582
+ arm.toolUses = arm.toolUses.filter((tu) => {
2583
+ if (seen.has(tu.toolUseId))
2584
+ return false;
2585
+ seen.add(tu.toolUseId);
2586
+ return true;
2587
+ });
2588
+ const next = i + 1 < history.length ? history[i + 1] : undefined;
2589
+ const toolResults = next?.userInputMessage?.userInputMessageContext?.toolResults;
2590
+ if (!toolResults) {
2591
+ delete arm.toolUses;
2592
+ continue;
2593
+ }
2594
+ const resultIdSet = new Set(toolResults.map((tr) => tr.toolUseId));
2595
+ const useIdSet = new Set(arm.toolUses.map((tu) => tu.toolUseId));
2596
+ arm.toolUses = arm.toolUses.filter((tu) => resultIdSet.has(tu.toolUseId));
2597
+ if (arm.toolUses.length === 0)
2598
+ delete arm.toolUses;
2599
+ const ctx = next.userInputMessage.userInputMessageContext;
2600
+ ctx.toolResults = toolResults.filter((tr) => useIdSet.has(tr.toolUseId));
2601
+ if (ctx.toolResults.length === 0)
2602
+ delete ctx.toolResults;
2603
+ }
2604
+ return history;
2574
2605
  }
2575
2606
  function collapseAgenticLoops(history) {
2576
2607
  if (history.length < 4)
@@ -107,6 +107,24 @@ export declare function buildHistory(messages: Message[], _modelId: string, syst
107
107
  systemPrepended: boolean;
108
108
  currentMsgStartIdx: number;
109
109
  };
110
+ /**
111
+ * Sanitize the Kiro history to prevent Bedrock validation errors:
112
+ *
113
+ * 1. **TOOL_DUPLICATE**: Deduplicate toolUseIds within each assistant
114
+ * message — keep the first occurrence, drop subsequent ones.
115
+ *
116
+ * 2. **TOOL_USE_RESULT_MISMATCH**: Every ASST with toolUses must be
117
+ * followed by a USER with toolResults whose IDs match. Remove
118
+ * orphan toolUses that have no matching toolResult in the next
119
+ * message, and remove orphan toolResults whose toolUse doesn't
120
+ * exist in the preceding assistant.
121
+ *
122
+ * This runs as a defensive last pass — upstream logic (buildHistory,
123
+ * stream.ts current-turn assembly) should produce correct output, but
124
+ * edge cases in retry / cross-provider handoff can violate the
125
+ * invariants Bedrock enforces.
126
+ */
127
+ export declare function sanitizeHistory(history: KiroHistoryEntry[]): KiroHistoryEntry[];
110
128
  /**
111
129
  * Collapse consecutive tool-use loops in history. When the agent calls
112
130
  * tools N times in sequence (ASST(toolUses) → USER(toolResults) pairs),
@@ -1 +1 @@
1
- {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../src/transform.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../src/transform.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@javargasm/pi-kiro",
3
- "version": "0.4.8",
3
+ "version": "0.4.9",
4
4
  "description": "Kiro provider for the pi coding agent: AWS Builder ID / IAM Identity Center login and the CodeWhisperer streaming API, exposing the Kiro Claude model family.",
5
5
  "type": "module",
6
6
  "license": "MIT",