thumbgate 1.26.0 → 1.26.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.
@@ -895,6 +895,56 @@ const TOOLS = [
895
895
  },
896
896
  },
897
897
  }),
898
+ destructiveTool({
899
+ name: 'detect_noop',
900
+ title: 'Detect No-op Action',
901
+ description: 'Detect whether a tool call was a no-op (state unchanged) or identical to a prior attempt in the session — a cheap repeat-loop signal. Records the action attempt state for repeat detection.',
902
+ inputSchema: {
903
+ type: 'object',
904
+ required: ['actionId'],
905
+ properties: {
906
+ actionId: { type: 'string', description: 'Stable identifier for the action being checked (e.g. the file path or command being attempted)' },
907
+ kind: { type: 'string', enum: ['file', 'command'], description: 'Action kind: file edit/write or command execution' },
908
+ filePath: { type: 'string', description: 'Path of the file the action targets (file kind)' },
909
+ beforeContent: { type: 'string', description: 'File content before the action (file kind)' },
910
+ afterContent: { type: 'string', description: 'File content after the action (file kind)' },
911
+ exitCode: { type: 'number', description: 'Command exit code (command kind)' },
912
+ stdout: { type: 'string', description: 'Command stdout (command kind)' },
913
+ stderr: { type: 'string', description: 'Command stderr (command kind)' },
914
+ sessionId: { type: 'string', description: 'Optional session id used to scope repeat-attempt detection' },
915
+ },
916
+ },
917
+ }),
918
+ destructiveTool({
919
+ name: 'record_action_receipt',
920
+ title: 'Record Action Receipt',
921
+ description: 'Pair a tracked tool call with its outcome (diff, exit code, test result) so a promoted lesson encodes "this action -> this outcome", not just a thumbs signal. Appends to the action-receipts log.',
922
+ inputSchema: {
923
+ type: 'object',
924
+ required: ['actionId'],
925
+ properties: {
926
+ actionId: { type: 'string', description: 'Identifier of the tracked action this receipt pairs with' },
927
+ toolName: { type: 'string', description: 'Name of the tool that was invoked' },
928
+ toolInput: { type: 'object', description: 'Structured input the tool was called with' },
929
+ diff: { type: 'string', description: 'Optional unified diff or change summary produced by the action' },
930
+ exitCode: { type: 'number', description: 'Optional command exit code outcome' },
931
+ testOutcome: { type: 'string', description: 'Optional test outcome (e.g. passed, failed, 12/12)' },
932
+ stateHash: { type: 'string', description: 'Optional post-action state hash (from detect_noop)' },
933
+ },
934
+ },
935
+ }),
936
+ readOnlyTool({
937
+ name: 'get_action_receipts',
938
+ title: 'Get Action Receipts',
939
+ description: 'Read outcome-paired action receipts. Returns the receipt for a specific actionId, or the most recent receipts when no actionId is given.',
940
+ inputSchema: {
941
+ type: 'object',
942
+ properties: {
943
+ actionId: { type: 'string', description: 'Optional action id to fetch the matching receipt for' },
944
+ limit: { type: 'number', description: 'Max number of recent receipts to return when no actionId is given (default 20)' },
945
+ },
946
+ },
947
+ }),
898
948
  readOnlyTool({
899
949
  name: 'verify_claim',
900
950
  description: 'Check whether a claim has enough tracked evidence before the agent asserts it.',