```ts
export function addDecimalStrings(a: string, b: string): string {
  // Validate inputs
  if (typeof a !== 'string' || typeof b !== 'string') {
    throw new Error('Both arguments must be strings');
  }
  
  if (a.length === 0 || b.length === 0) {
    throw new Error('Arguments cannot be empty');
  }
  
  // Check for valid digit characters
  const validDigitRegex = /^[0-9]+$/;
  if (!validDigitRegex.test(a) || !validDigitRegex.test(b)) {
    throw new Error('Arguments must contain only digits 0-9');
  }
  
  // Handle the case where one or both strings are just "0"
  if (a === "0" && b === "0") return "0";
  
  // Reverse both strings to process from least significant digit
  const aDigits = a.split('').reverse();
  const bDigits = b.split('').reverse();
  
  const result: number[] = [];
  let carry = 0;
  const maxLength = Math.max(aDigits.length, bDigits.length);
  
  for (let i = 0; i < maxLength; i++) {
    const digitA = i < aDigits.length ? parseInt(aDigits[i], 10) : 0;
    const digitB = i < bDigits.length ? parseInt(bDigits[i], 10) : 0;
    
    const sum = digitA + digitB + carry;
    result.push(sum % 10);
    carry = Math.floor(sum / 10);
  }
  
  // If there's a final carry, add it
  if (carry > 0) {
    result.push(carry);
  }
  
  // Convert back to string and reverse to get the correct order
  let resultStr = result.reverse().join('');
  
  // Remove leading zeros but ensure at least one digit remains
  resultStr = resultStr.replace(/^0+/, '') || '0';
  
  return resultStr;
}
```